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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: genemark_loader.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:58:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: genemark_loader.cpp,v 1000.5 2004/06/01 20:58:40 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: Dmitry Dernovoy
  35.  *
  36.  * File Description:
  37.  *   CGeneMarkLoader - Plugin to load GeneMark's predictions 
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "genemark_loader.hpp"
  41. #include <gui/core/idocument.hpp>
  42. #include <gui/core/version.hpp>
  43. #include <gui/dialogs/file_browser.hpp>
  44. #include <gui/plugin/PluginCommandSet.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginValue.hpp>
  47. #include <objects/general/Int_fuzz.hpp>
  48. #include <objects/general/Object_id.hpp>
  49. #include <objects/seqfeat/Cdregion.hpp>
  50. #include <objects/seqfeat/Feat_id.hpp>
  51. #include <objects/seqfeat/Genetic_code.hpp>
  52. #include <objects/seqfeat/SeqFeatData.hpp>
  53. #include <objects/seqfeat/Seq_feat.hpp>
  54. #include <objects/seqloc/Seq_interval.hpp>
  55. #include <objects/seqloc/Seq_loc.hpp>
  56. #define            GENEMARK_MAXLINE           200
  57. BEGIN_NCBI_SCOPE
  58. void CGeneMarkLoader::GetInfo(CPluginInfo& info)
  59. {
  60.     info.Reset();
  61.     // version info macro
  62.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  63.                  string(__DATE__) + " " + string(__TIME__),
  64.                  "CGeneMarkLoader",
  65.                  "GeneMark\/Glimmer output",
  66.                  "Load the results from a GeneMark/Glimmer run", "");
  67.     // command info
  68.     CPluginCommandSet& cmds     = info.SetCommands();
  69.     CPluginCommand& import_args = cmds.AddDataCommand(eDataCommand_import);
  70.     import_args.AddArgument("document", "Document", CPluginArg::eDocument);
  71. }
  72. CGeneMarkLoader::CGeneMarkLoader()
  73. {
  74. }
  75. CGeneMarkLoader::~CGeneMarkLoader()
  76. {
  77. }
  78. void CGeneMarkLoader::Import(CPluginMessage& msg)
  79. {
  80.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  81.     CPluginReply& reply = msg.SetReply();
  82.     reply.SetStatus(eMessageStatus_failed);
  83.     LOG_POST(Info << "CGeneMarkLoader::Load: start point.");
  84.     IDocument* doc = const_cast<IDocument*> (&args["document"].AsDocument());
  85.     if ( !doc ) {
  86.         reply.SetStatus(eMessageStatus_failed);
  87.         return;
  88.     }
  89.     try {
  90.         LOG_POST(Info << "CGeneMarkLoader::Load: reading file...");
  91.         CConstRef<CSeq_id> id(dynamic_cast<const CSeq_id*> (doc->GetObject()));
  92.         if ( !id ) {
  93.             _TRACE("CGeneMarkLoader::Load: can't get any reasonable seq_id");
  94.             return;
  95.         }
  96.         string acc_text = id->GetSeqIdString(false) ;
  97.         //   LOG_POST( Info << "CGeneMarkLoader:: accession: " << acc_text );
  98.         //  _TRACE("CGeneMarkLoader:: accession: " << acc_text );
  99.         string tmp_str =  string("(") + NStr::ToUpper(acc_text) + string(".fna.g*)");  //"(*.{gmHMM,gmark,glim_*})"
  100.         string fname =
  101.             NcbiFileBrowser("Open GeneMark/GeneMark.hmm/Glimmer output file...",
  102.                             tmp_str.c_str(),
  103. #if defined(NCBI_OS_MSWIN)
  104.                             "\\Atlas\b11\tatiana\Predictions\");
  105. #else
  106.                             "/net/atlas/b11/tatiana/Predictions/");
  107. #endif
  108.         if ( fname.empty() ) {
  109.             reply.SetStatus(eMessageStatus_ignored);
  110.             return;
  111.         }
  112.         CBioseq_Handle handle = doc->GetScope().GetBioseqHandle(*id);
  113.         if ( !handle ) {
  114.             _TRACE("CGeneMarkLoader::Load: can't get bioseq handle");
  115.             return;
  116.         }
  117.         CRef<CSeq_annot> annot;
  118.         switch(x_RecognizeFormat(fname))
  119.         {
  120.         case fGeneMark:
  121.             annot = x_LoadGeneMarkFile(fname, *id);
  122.             break;
  123.         case fGeneMarkHMM:
  124.             annot = x_LoadGeneMarkHmmFile(fname, *id);
  125.             break;
  126.         case fGlimmer2:
  127.             annot = x_LoadGlimmer2File(fname, *id);
  128.             break;
  129.         default:
  130.             _TRACE("Unknown return code");
  131.         case fUnknownFormat:
  132.             _TRACE("Unsupported file format, file: "<< fname); 
  133.             reply.SetStatus(eMessageStatus_failed);
  134.             return;
  135.         }
  136.         // save the object in the reply for framework processing
  137.         reply.AddObject(*doc, *annot);
  138.         reply.AddAction(CPluginReplyAction::e_Add_to_document);
  139.         reply.SetStatus(eMessageStatus_success);
  140.     }
  141.     catch (CException& e) {
  142.         LOG_POST(Info << "failed to read GeneMark file: " << e.what());
  143.         _TRACE("failed to read GeneMark file: " << e.what() );
  144.     }
  145. #ifndef _DEBUG
  146.     catch (...) {
  147.         _TRACE("failed to read GeneMark file: unknown error");
  148.     }
  149. #endif
  150. }
  151. CGeneMarkLoader::EFileFormat
  152. CGeneMarkLoader::x_RecognizeFormat(const string& fname)
  153. {
  154.     CNcbiIfstream istr( fname.c_str() );
  155.     char buf[ GENEMARK_MAXLINE +1 ];
  156.     istr.getline(buf, GENEMARK_MAXLINE);
  157.     if( strstr(buf,"r=-1.") || strstr(buf,"r=-0.") ) return fGlimmer2;
  158.     for(int i=1; (i < 30) && !istr.eof() ; ++i)
  159.     {
  160.         istr.getline(buf, GENEMARK_MAXLINE);
  161.         if(strstr(buf, "Strand"))
  162.         {
  163.             if(strstr(buf,"Frame"))    return fGeneMark;
  164.             if(strstr(buf,"RightEnd")) return fGeneMarkHMM;
  165.         }
  166.     }
  167.     return fUnknownFormat;
  168. }
  169. CRef<CSeq_annot>
  170. CGeneMarkLoader::x_LoadGlimmer2File(const string&  fname,
  171.                                     const CSeq_id& id)
  172. {
  173.     CNcbiIfstream istr(fname.c_str());
  174.     CRef<CSeq_annot> annot( new CSeq_annot() );
  175.     annot->AddName("Glimmer2 predictions");
  176.     list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable(); 
  177.     char buf[ GENEMARK_MAXLINE +1 ];
  178.     while( istr.getline(buf, GENEMARK_MAXLINE) )
  179.     {
  180.         CNcbiIstrstream Lstr( buf );
  181.         int     gene_number = 0, glim_from = 0, glim_to = 0;
  182.         Lstr >> gene_number;
  183.         Lstr >> glim_from;
  184.         Lstr >> glim_to;
  185.         char strand = 'U';
  186.         for( ; (strand != '-') && (strand != '+'); Lstr >> strand );
  187.         TSeqPos LeftEnd, RightEnd;
  188.         if(strand == '-')
  189.         {
  190.             LeftEnd  = glim_to - 3;
  191.             RightEnd = glim_from;
  192.         }else{                         // direct
  193.             LeftEnd  = glim_from;
  194.             RightEnd = glim_to + 3;
  195.         }
  196.         if(LeftEnd > RightEnd) // Glimmer prediction over zero-point
  197.         {
  198.             // can't handle yet
  199.             LOG_POST(Info << "CGeneMarkLoader::Can't handle Glimmer's prediction over zero-point, skipped.");
  200.             continue;
  201.         }
  202.         CRef<CSeq_feat> feat(new CSeq_feat());
  203.         feat->SetComment() = "Glimmer2 pred #" + NStr::IntToString(gene_number) ;
  204.         CSeq_interval& floc = feat->SetLocation().SetInt();
  205.         floc.SetFrom(LeftEnd- 1);
  206.         floc.SetTo(RightEnd - 1); 
  207.         floc.SetStrand((strand == '-') ? eNa_strand_minus : eNa_strand_plus);
  208.         floc.SetId().Assign(id);    // floc.SetId().SetGi( NStr::StringToInt(m_SeqId) );
  209.         CSeqFeatData& fdata = feat->SetData();
  210.         CCdregion& cdreg = fdata.SetCdregion();
  211.         cdreg.SetFrame(CCdregion::eFrame_one);
  212.         list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  213.         CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  214.         ce->SetId(11);                                        // TSE=1; seq=1; feat=1
  215.         gcode.push_back(ce);
  216.         ftable.push_back(feat);
  217.     }
  218.     return annot;
  219. }
  220. CRef<CSeq_annot>
  221. CGeneMarkLoader::x_LoadGeneMarkHmmFile(const string& fname,
  222.                                        const CSeq_id& id)
  223. {
  224.     CNcbiIfstream istr(fname.c_str());
  225.     CRef<CSeq_annot> annot( new CSeq_annot() );
  226.     annot->AddName("GeneMark.hmm predictions");
  227.     list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable(); 
  228.     char buf[ GENEMARK_MAXLINE +1 ];
  229.     while( istr.getline(buf, GENEMARK_MAXLINE) )  // find and skip file header
  230.     {
  231.         if(strstr(buf, "Strand") && strstr(buf,"RightEnd"))
  232.         {
  233.             istr.getline(buf, GENEMARK_MAXLINE); // skip another one line
  234.             break;
  235.         }
  236.     }
  237.     while( istr.getline(buf, GENEMARK_MAXLINE) )
  238.     {
  239.         CNcbiIstrstream Lstr( buf );      // LOG_POST(Info << "Parsing line:" << buf);
  240.         int     gene_number = 0;
  241.         Lstr >> gene_number;
  242.         char strand = 'U';
  243.         for(; (strand != '-') && (strand != '+'); Lstr >> strand);
  244.         string aLeftEnd;
  245.         TSeqPos LeftEnd, RightEnd;
  246.         Lstr >> aLeftEnd;
  247.         Lstr >>  RightEnd;
  248.         if(aLeftEnd[0] == '<') aLeftEnd[0] = ' '; 
  249.         LeftEnd = NStr::StringToInt(aLeftEnd);
  250.         //  _TRACE("parsed line: "<< gene_number <<" from: "<< LeftEnd <<" to: "<< RightEnd <<" starnd: "<< strand);
  251.         CRef<CSeq_feat> feat(new CSeq_feat);
  252.         feat->SetComment() = "GeneMark.hmm pred #" + NStr::IntToString(gene_number) ;
  253.         CSeq_interval& floc = feat->SetLocation().SetInt();
  254.         floc.SetFrom(LeftEnd- 1);
  255.         floc.SetTo(RightEnd - 1); 
  256.         floc.SetStrand((strand == '-') ? eNa_strand_minus : eNa_strand_plus);
  257.         floc.SetId().Assign(id);    // floc.SetId().SetGi( NStr::StringToInt(m_SeqId) );
  258.         CSeqFeatData& fdata = feat->SetData();
  259.         CCdregion& cdreg = fdata.SetCdregion();
  260.         cdreg.SetFrame(CCdregion::eFrame_one);
  261.         list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  262.         CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  263.         ce->SetId(11);                                        // TSE=1; seq=1; feat=1
  264.         gcode.push_back(ce);
  265.         ftable.push_back(feat);
  266.     }
  267.     return annot;
  268. }
  269. CRef<CSeq_annot>
  270. CGeneMarkLoader::x_LoadGeneMarkFile(const string& fname, const CSeq_id& id)
  271. {
  272.     char buf[ GENEMARK_MAXLINE +1 ];
  273.     CNcbiIfstream istr(fname.c_str());
  274.     while(istr.getline(buf, GENEMARK_MAXLINE))  // find and skip file header
  275.     {
  276.         if(strstr(buf, "Strand") && strstr(buf,"Frame"))
  277.         {
  278.             istr.getline(buf, GENEMARK_MAXLINE); // skip  ----- -----
  279.             // istr.getline(buf, GENEMARK_MAXLINE); // sometimes NOT empty !
  280.             break;
  281.         }
  282.     }
  283.     CRef<CSeq_annot> annot( new CSeq_annot() );
  284.     annot->AddName("GeneMark predictions");
  285.     list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  286.     TSeqPos prevStop = 0;
  287.     int gene_number  = 0;
  288.     CRef<CSeq_feat> feat;
  289.     CSeq_interval *floc;
  290.     while( istr.getline(buf, GENEMARK_MAXLINE) )
  291.     {
  292.         if(strstr(buf, "interest")) break; // we have reached "List of Regions of interest"
  293.         if(strlen(buf) < 10) continue;
  294.         // LOG_POST(Info << "CGeneMarkLoader::Load: parsing line: " << buf );
  295.         CNcbiIstrstream Lstr( buf );
  296.         string  strand;
  297.         TSeqPos LeftEnd, RightEnd, curStop;
  298.         Lstr >> LeftEnd;
  299.         Lstr >> RightEnd;
  300.         Lstr >> strand;
  301.         bool  is_complementary = (strand.find("complement") != string::npos);
  302.         curStop = is_complementary ? LeftEnd : RightEnd;
  303.         if(curStop != prevStop)  //  new lines-group
  304.         {
  305.             prevStop = curStop;
  306.             ++gene_number;
  307.             feat = new CSeq_feat();
  308.             feat->SetComment() = "GeneMark pred #" + NStr::IntToString(gene_number) ;
  309.             ftable.push_back(feat);
  310.             CSeqFeatData& fdata = feat->SetData();
  311.             CCdregion& cdreg = fdata.SetCdregion();
  312.             cdreg.SetFrame(CCdregion::eFrame_one);
  313.             list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  314.             CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  315.             ce->SetId(11);                                        // TSE=1; seq=1; feat=1
  316.             gcode.push_back(ce);
  317.             floc = & feat->SetLocation().SetInt();
  318.             floc->SetFrom(LeftEnd-1);
  319.             floc->SetTo(RightEnd -1); 
  320.             floc->SetStrand(is_complementary ? eNa_strand_minus : eNa_strand_plus);
  321.             floc->SetId().Assign(id);   // floc->SetId().SetGi( NStr::StringToInt(m_SeqId) );
  322.         }
  323.         else    // another start of previous gene
  324.         {    
  325.             if(is_complementary)
  326.             {
  327.                 floc->SetFuzz_to().SetAlt().push_back( RightEnd -1);
  328.             }
  329.             else
  330.             {
  331.                 floc->SetFuzz_from().SetAlt().push_back( LeftEnd -1); // LOG_POST(Info << "Left:"<<LeftEnd);
  332.             }  
  333.         }
  334.     }
  335.     return annot;
  336. }
  337. END_NCBI_SCOPE
  338. /*
  339.  * =====================================================================
  340.  * $Log: genemark_loader.cpp,v $
  341.  * Revision 1000.5  2004/06/01 20:58:40  gouriano
  342.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  343.  *
  344.  * Revision 1.35  2004/05/21 22:27:48  gorelenk
  345.  * Added PCH ncbi_pch.hpp
  346.  *
  347.  * Revision 1.34  2004/03/11 17:44:00  dicuccio
  348.  * Use new file loader dialog
  349.  *
  350.  * Revision 1.33  2003/12/22 20:29:47  dernovoy
  351.  * skip Glimmer's prediction over zero-point
  352.  *
  353.  * Revision 1.32  2003/12/16 20:24:55  dernovoy
  354.  * Path to precomputed predictions should work on both Windows and UNIX inside NCBI
  355.  *
  356.  * Revision 1.31  2003/12/10 22:53:24  dernovoy
  357.  * defaults directory and file extensions added
  358.  *
  359.  * Revision 1.30  2003/12/09 23:22:14  dernovoy
  360.  * menu string changed : coma instead of slash
  361.  *
  362.  * Revision 1.29  2003/12/09 21:46:00  dernovoy
  363.  * Glimmer2 output loader was added
  364.  *
  365.  * Revision 1.28  2003/11/24 15:45:40  dicuccio
  366.  * Renamed CVersion to CPluginVersion
  367.  *
  368.  * Revision 1.27  2003/11/18 17:49:26  dicuccio
  369.  * Added standard processing of return values
  370.  *
  371.  * Revision 1.26  2003/11/04 17:49:25  dicuccio
  372.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  373.  * CPluginCommand/CPluginReply
  374.  *
  375.  * Revision 1.25  2003/10/10 17:19:33  dicuccio
  376.  * Added Import() interface.  Removed dead Save() interfaces
  377.  *
  378.  * Revision 1.24  2003/10/07 13:47:06  dicuccio
  379.  * Renamed CPluginURL* to CPluginValue*
  380.  *
  381.  * Revision 1.23  2003/09/17 16:27:28  dicuccio
  382.  * Removed load command
  383.  *
  384.  * Revision 1.22  2003/09/04 14:51:59  dicuccio
  385.  * Use IDocument instead of CDocument
  386.  *
  387.  * Revision 1.21  2003/07/14 11:17:25  shomrat
  388.  * Plugin messageing system related changes
  389.  *
  390.  * Revision 1.20  2003/06/25 17:02:59  dicuccio
  391.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  392.  * implementation file.  Lots of #include file clean-ups.
  393.  *
  394.  * Revision 1.19  2003/06/20 14:52:58  dicuccio
  395.  * Revised plugin registration - moved GetInfo() into the plugin handler
  396.  *
  397.  * Revision 1.18  2003/05/19 13:40:45  dicuccio
  398.  * Moved gui/core/plugin/ -> gui/plugin/.  Merged core libraries into libgui_core.
  399.  * Removed old, unused dialog box.
  400.  *
  401.  * Revision 1.17  2003/04/24 16:39:29  dicuccio
  402.  * Updated to reflect changes in plugin API
  403.  *
  404.  * Revision 1.16  2003/02/24 13:03:16  dicuccio
  405.  * Renamed classes in plugin spec:
  406.  *     CArgSeg --> CPluginArgSet
  407.  *     CArgument --> CPluginArg
  408.  *     CPluginArgs --> CPluginCommand
  409.  *     CPluginCommands --> CPluginCommandSet
  410.  *
  411.  * Revision 1.15  2003/02/20 19:49:56  dicuccio
  412.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  413.  * over to use new plugin architecture.
  414.  *
  415.  * Revision 1.14  2003/02/06 18:48:36  dicuccio
  416.  * Made 'catch (...)' conditional for non-debug builds
  417.  *
  418.  * Revision 1.13  2003/01/15 19:47:37  dernovoy
  419. * accession can be used for seq_id in features (was: only gi).
  420. *
  421. * Revision 1.12  2003/01/13 13:10:07  dicuccio
  422. * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  423. * Moved all FLUID-generated code into namespace ncbi.
  424. *
  425. * Revision 1.11  2003/01/08 21:17:59  dernovoy
  426. * Feature's location fixed (from local to gi),
  427. * GeneMark coordinates translated to ncbi format (0 - (Len-1))
  428.     *
  429.     * Revision 1.10  2003/01/06 21:03:12  dernovoy
  430.     * Support for Alternative starts (fuzz-from/to) of GeneMark's output
  431.     *
  432.     * Revision 1.9  2003/01/02 21:41:37  dernovoy
  433.     * Load of genemark output added, the farthest starts taken for features
  434.     *
  435.     * Revision 1.8  2003/01/02 19:58:38  dernovoy
  436.     * fix comparing stream with int
  437.     *
  438.     * Revision 1.7  2002/12/31 19:45:20  dernovoy
  439.     * Addded support for genemarkHMM start positions started with symbol '<'
  440.     *
  441.     * Revision 1.6  2002/12/30 17:48:29  dicuccio
  442. * Added mechanism for data loader plugins to announce supported modes of
  443. * operation (load, import, save currently)
  444.     *
  445.     * Revision 1.5  2002/12/30 15:47:10  dernovoy
  446.     * TRACE outputs added, any doc's updates comments out
  447.     *
  448.     * Revision 1.4  2002/12/26 20:50:25  dernovoy
  449.     * *** empty log message ***
  450.     *
  451.     * Revision 1.3  2002/12/26 20:48:59  dernovoy
  452.     * Log output
  453.     *
  454. * Revision 1.2  2002/12/26 17:45:55  dicuccio
  455. * Reformatted code (reindent)
  456.     *
  457.     * Revision 1.1  2002/12/26 17:12:38  dernovoy
  458.     * Initial revision.
  459.     *
  460.     * =====================================================================
  461.     */