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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: shi_reader.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:01:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: shi_reader.cpp,v 1000.1 2004/06/01 21:01:49 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.  *    CShiReader - taxplot file format loader
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "shi_reader.hpp"
  41. #include <gui/core/doc_exception.hpp>
  42. #include <gui/core/doc_manager.hpp>
  43. #include <gui/core/idocument.hpp>
  44. #include <gui/core/plugin_utils.hpp>
  45. #include <gui/core/version.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginValue.hpp>
  49. #include <gui/utils/message_box.hpp>
  50. #include <gui/objutils/utils.hpp>
  51. #include <gui/dialogs/file_browser.hpp>
  52. #include <objects/general/Object_id.hpp>
  53. #include <objects/seq/Seqdesc.hpp>
  54. #include <objects/seq/Seq_descr.hpp>
  55. #define BIT32 0x80000000
  56. #define BIT31 0x40000000
  57. #define THREE 0x7
  58. #define THIRTEEN 0x1FFF
  59. #define EIGHTEEN 0x3FFFF
  60. #define TWENTYSEVEN 0x7FFFFFF
  61. #define THIRTYONE 0x7FFFFFFF
  62. BEGIN_NCBI_SCOPE
  63. USING_SCOPE(objects);
  64. //
  65. // factory implementations
  66. //
  67. void CShiReader::GetInfo(CPluginInfo& info)
  68. {
  69.     info.Reset();
  70.     // version info macro
  71.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  72.                  string(__DATE__) + " " + string(__TIME__),
  73.                  "CShiReader",
  74.                  "Taxplot File", "Read a Taxplot file format",
  75.                  "http://graceland.ncbi.nlm.nih.gov:6224"
  76.                  "/staff/tereshko/plugin_help/shi.html");
  77.     // command info
  78.     CPluginCommandSet& cmds     = info.SetCommands();
  79.     CPluginCommand& load_args   = cmds.AddDataCommand(eDataCommand_load);    
  80.     load_args.AddArgument("file", "File name", CPluginArg::eFile);
  81. }
  82. //
  83. // Default ctor
  84. //
  85. CShiReader::CShiReader()
  86. {
  87. }
  88. //
  89. // One and only dtor
  90. //
  91. CShiReader::~CShiReader()
  92. {
  93. }
  94. //
  95. // Load()
  96. // This is a pure virtual requirement and is the main plugin hook.
  97. //
  98. void CShiReader::Load(CPluginMessage& msg)
  99. {
  100.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  101.     CPluginReply& reply = msg.SetReply();
  102.     string fname = args["file"].AsString();
  103.     if ( fname.empty() ) {
  104.         reply.SetStatus(eMessageStatus_ignored);
  105.         return;
  106.     }
  107.     try {            
  108.         CNcbiIfstream istr(fname.c_str(), ios::binary);
  109.         CRef<CShiReaderCache> dataCache(new CShiReaderCache(fname));
  110.         dataCache->CreateCache(istr);
  111.         CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));            
  112.         scope->AddDefaults();
  113.         IDocument* doc = CDocManager::CreateDocument(*scope, *dataCache);            
  114.         reply.AddObject(*doc);
  115.     }
  116.     catch (exception& e) {
  117.         _TRACE("failed to read shi: " << e.what());
  118.     }
  119.     catch (...) {
  120.         _TRACE("failed to read shi: unknown error");
  121.     }
  122. }
  123. inline Int4 CShiReaderCache::x_GetNextInt(Uchar * buff, CT_OFF_TYPE & pos)
  124. {
  125.     Uchar * ptr =  buff + pos * 4;    
  126.     Int4 ret = (Int4(ptr[3]) << 24) | 
  127.         (Int4(ptr[2]) << 16) | 
  128.         (Int4(ptr[1]) << 8)  | 
  129.         (Int4(ptr[0]));
  130.     pos += 1;
  131.     return ret;
  132. }
  133. void CShiReaderCache::CreateCache(CNcbiIfstream & fileStream)
  134. {
  135.     SOneShiRecord   shiRecord;
  136.     vector<Uchar>   buff;
  137.     Int4            value,no_more,last_gi,nshi;
  138.     const Int4      cutoff = 1000;
  139.     map<Int4, Int4> taxMap;
  140.     fileStream.seekg(0, ios::end);
  141.     CT_POS_TYPE fileSize = fileStream.tellg();
  142.     CT_OFF_TYPE sz = fileSize - CT_POS_TYPE(0);
  143.     fileStream.seekg(0, ios::beg);  
  144.     buff.resize(sz);
  145.     fileStream.read(((char*)&buff[0]), sz);
  146.     no_more = 0; last_gi = 1; 
  147.     shiRecord.m_Gi = 0;
  148.     CT_OFF_TYPE fileCursor = 0;
  149.     m_Cache.clear();
  150.     nshi =  x_GetNextInt(&buff[0], fileCursor);
  151.     value = x_GetNextInt(&buff[0], fileCursor);
  152.     while ((fileCursor * 4) < sz){
  153.         // building rec. structure
  154.         if (last_gi) {
  155.             shiRecord.m_Nqugi = THIRTYONE & value;
  156.             fileCursor +=1;
  157.             shiRecord.m_Chromosome = x_GetNextInt(&buff[0], fileCursor);
  158.             shiRecord.m_Pdb        = x_GetNextInt(&buff[0], fileCursor);
  159.             value                  = x_GetNextInt(&buff[0], fileCursor);            
  160.             shiRecord.m_Gi         = 0;
  161.         }
  162.         else {
  163.             // first gi after last_gi
  164.             if (shiRecord.m_Gi == 0) shiRecord.m_Gi = TWENTYSEVEN & value;
  165.         }
  166.         shiRecord.m_Symmet   = BIT31 & value;
  167.         shiRecord.m_Orgclass = THREE & (value>>27);
  168.         shiRecord.m_Dagi     = TWENTYSEVEN & value; 
  169.         value =  x_GetNextInt(&buff[0], fileCursor);
  170.         shiRecord.m_Taxid = (BIT32&value)?((THIRTYONE & value)>>13):value;
  171.         shiRecord.m_Score = (BIT32&value)?(THIRTEEN & value):x_GetNextInt(&buff[0], fileCursor); 
  172.         if ((fileCursor * 4) < sz) {
  173.             value   = x_GetNextInt(&buff[0], fileCursor);
  174.             last_gi = (BIT32&value);
  175.         }
  176.         else last_gi = 1;
  177.         // checking and adding        
  178.         if ((shiRecord.m_Score > cutoff) && (taxMap.insert(pair<Int4, Int4>(shiRecord.m_Taxid, shiRecord.m_Score)).second==false)){       
  179.             if (taxMap[shiRecord.m_Taxid] < shiRecord.m_Score) taxMap[shiRecord.m_Taxid] = shiRecord.m_Score;      // already present, updating     
  180.         }         
  181.         // taxMap contains only valuable data right here
  182.         if (last_gi) { 
  183.             taxMap.insert(pair<Int4, Int4>(0, shiRecord.m_Gi)); // adding current gi as 0 position
  184.             m_Cache.push_back(taxMap);              
  185.             taxMap.clear();   
  186.         }    
  187.     } 
  188. }
  189. END_NCBI_SCOPE
  190. /*
  191.  * ===========================================================================
  192.  * $Log: shi_reader.cpp,v $
  193.  * Revision 1000.1  2004/06/01 21:01:49  gouriano
  194.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  195.  *
  196.  * Revision 1.9  2004/06/01 18:10:55  dicuccio
  197.  * Use plugin args instead of internal file browser dialog
  198.  *
  199.  * Revision 1.8  2004/05/21 22:27:49  gorelenk
  200.  * Added PCH ncbi_pch.hpp
  201.  *
  202.  * Revision 1.7  2004/05/20 20:34:39  tereshko
  203.  * Changed initial Gi value to zero
  204.  *
  205.  * Revision 1.6  2004/05/03 13:31:33  dicuccio
  206.  * gui/utils --> gui/objutils where needed
  207.  *
  208.  * Revision 1.5  2004/03/11 17:47:51  dicuccio
  209.  * Code formatting changes.  Use new file open dialog
  210.  *
  211.  * Revision 1.4  2004/02/20 20:03:27  ucko
  212.  * Fix to compile with stricter implementations of CT_POS_TYPE
  213.  *
  214.  * Revision 1.3  2004/01/28 16:00:56  tereshko
  215.  * Added current gi extraction, loosen filter criteria
  216.  *
  217.  * Revision 1.2  2004/01/21 16:33:34  tereshko
  218.  * +Changes for CodeWarrior in this folder
  219.  *
  220.  * Revision 1.4  2004/01/21 16:09:43  rsmith
  221.  * change stream position types for picky compiler (Codewarrior).
  222.  *
  223.  * Revision 1.3  2004/01/21 14:16:28  dicuccio
  224.  * Adjusted API to be more coding standard compliant.
  225.  *
  226.  * Revision 1.2  2004/01/15 18:08:05  tereshko
  227.  * Fixed for GCC_295
  228.  *
  229.  * Revision 1.1  2004/01/14 16:35:59  tereshko
  230.  * CShiReader data plugin
  231.  *
  232.  * Revision 1.3  2003/12/10 15:09:32  dicuccio
  233.  * Changed menu item - capitalize AGP
  234.  *
  235.  * Revision 1.2  2003/12/09 21:33:54  jcherry
  236.  * Added url for help
  237.  *
  238.  * Revision 1.1  2003/12/09 00:20:09  jcherry
  239.  * Initial version
  240.  *
  241.  * ===========================================================================
  242.  */