shi_loader.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: shi_loader.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:14:05  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: shi_loader.cpp,v 1000.1 2004/06/01 21:14:05 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Vladimir Tereshkov
  35.  *
  36.  * File Description:  
  37.  *   Shi file reader. Code ported from shipr.c CGI.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <corelib/ncbi_bswap.hpp>
  42. #include <gui/widgets/taxplot3d/shi_loader.hpp>
  43. USING_NCBI_SCOPE;
  44. #define BIT32 0x80000000
  45. #define BIT31 0x40000000
  46. #define THREE 0x7
  47. #define THIRTEEN 0x1FFF
  48. #define EIGHTEEN 0x3FFFF
  49. #define TWENTYSEVEN 0x7FFFFFF
  50. #define THIRTYONE 0x7FFFFFFF
  51. #define TAX0   0
  52. #define TAX1   1
  53. #define TAX2   2
  54. #define CUT    3
  55. #define XX    4
  56. #define YY    5
  57. #define LOG    6
  58. #define QUERY 7
  59. #define COGCLR 8
  60. #define XMIN 9
  61. #define XMAX 10
  62. #define YMIN 11
  63. #define YMAX 12
  64. #define RADIUS_A 13
  65. #define RADIUS_B 14
  66. #define NAME0 15
  67. #define NAME1 16
  68. #define NAME2 17
  69. #define NOTTAX1 0x80000000
  70. #define NOTTAX2 0x40000000
  71. #define TAXMASK 0x3FFFFFFF
  72. void CShiFile::openFile(const string name)
  73. {
  74.     //m_FileStream.fastopen(name.c_str(), ios::binary);    
  75.     m_FileStream.open(name.c_str(), ios::binary);    
  76.     m_FileStream.seekg(0, ios::end);
  77.     m_FileSize    = m_FileStream.tellg();
  78.     m_FileStream.seekg(0, ios::beg);  
  79.     CT_OFF_TYPE sz = m_FileSize - CT_POS_TYPE(0);
  80.     m_Buff.reset(new unsigned char[sz]);
  81.     m_FileStream.read((char*)m_Buff.get(), sz);
  82.     no_more = 0; last_gi = 1;
  83.     m_FileCursor = 0;
  84.     nshi =  getNextInt();
  85.     value = getNextInt();
  86. }
  87. int CShiFile::getNextRecord(SShiRecord & rec)
  88. {  
  89.     // no more records
  90.     if (isEof())  return 0;
  91.     // building rec. structure
  92.     if (last_gi) {
  93.     m_Record.m_Nqugi = THIRTYONE & value;
  94.         m_FileCursor +=1;
  95.     m_Record.m_Chromosome = getNextInt(); 
  96.     m_Record.m_Pdb        = getNextInt(); 
  97.     value                 = getNextInt(); 
  98.     }
  99.     m_Record.m_Symmet   = BIT31 & value;
  100.     m_Record.m_Orgclass = THREE & (value>>27);
  101.     m_Record.m_Dagi     = TWENTYSEVEN & value; 
  102.     value = getNextInt();
  103.     m_Record.m_Taxid = (BIT32&value)?((THIRTYONE & value)>>13):value;
  104.     m_Record.m_Score = (BIT32&value)?(THIRTEEN & value):getNextInt(); 
  105. if(!isEof()) {
  106. value = getNextInt();
  107. last_gi = (BIT32&value);
  108. }
  109.     else last_gi = 1;       
  110.     rec = m_Record;
  111.     return 1;
  112. }
  113. int ShiLoader::loadFileNew(const char * file)
  114. {
  115.     auto_ptr<CShiFile>  shFile(new CShiFile);
  116.     shFile->openFile(file);
  117.     int cutoff  = 2000;
  118.     SShiRecord rec;  
  119.     map <int, int> taxMap;
  120.         
  121.     while  (shFile->getNextRecord(rec)){
  122.         if ((rec.m_Score > cutoff) && (taxMap.insert(pair<int,int>(rec.m_Taxid, rec.m_Score)).second==false)){       
  123.             if (taxMap[rec.m_Taxid] < rec.m_Score) taxMap[rec.m_Taxid] = rec.m_Score;      // already present      
  124.         }  
  125.         if (shFile->isLastGi()) {
  126.             m_Cache.push_back(taxMap);
  127.             taxMap.clear();    
  128.             if (m_Handle && !shFile->isEof()){
  129.                 int value = 1 + (static_cast<Uint8>(shFile->getFileCursor())*400)/(shFile->getFileSize() - CT_POS_TYPE(0));
  130.                 if (!(value%10)) m_Handle->fireEvent(IShiLoaderEvents::eProgress, &value);
  131.             }          
  132.         }    
  133.     }  
  134.     if (m_Handle) m_Handle->fireEvent(IShiLoaderEvents::eLoaded, NULL);  
  135.     return 0;
  136. }
  137. CTaxplot3dDataSource * ShiLoader::getData(int tax1, int tax2, int tax3)
  138. {
  139.     m_DS->clear();
  140.     for (GIVECTOR::iterator it=m_Cache.begin(); it!=m_Cache.end(); it++){
  141.         TSMAP::iterator itm;
  142.         int score1 = ((itm=it->find(tax1))!=it->end()) ? itm->second : 0;
  143.         int score2 = ((itm=it->find(tax2))!=it->end()) ? itm->second : 0;
  144.         int score3 = ((itm=it->find(tax3))!=it->end()) ? itm->second : 0;
  145.         if ((score1!=score2!=score3) && ((score1!=0 && score2!=0) || (score1!=0 && score3!=0) || (score2!=0 && score3!=0))){
  146.           auto_ptr<CTaxplot3dDataSource::TVertex> newVertex(new CGraph3DVertex<float, float>(score1, score2, score3));      
  147.           m_DS->addVertex(newVertex.get());       
  148.   
  149.         }
  150.     }
  151.     return m_DS->normalizeAll();
  152. }
  153. /*
  154.  * ===========================================================================
  155.  * $Log: shi_loader.cpp,v $
  156.  * Revision 1000.1  2004/06/01 21:14:05  gouriano
  157.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  158.  *
  159.  * Revision 1.4  2004/05/21 22:27:56  gorelenk
  160.  * Added PCH ncbi_pch.hpp
  161.  *
  162.  * Revision 1.3  2004/02/20 20:03:28  ucko
  163.  * Fix to compile with stricter implementations of CT_POS_TYPE
  164.  *
  165.  * Revision 1.2  2004/01/14 20:49:14  tereshko
  166.  * Removed debugging code
  167.  *
  168.  * Revision 1.1  2004/01/05 16:21:24  tereshko
  169.  * Initial revision
  170.  *
  171.  * ===========================================================================
  172.  */