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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gbseq_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:44:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: gbseq_formatter.cpp,v 1000.1 2004/06/01 19:44:34 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. * Author:  Aaron Ucko, NCBI
  35. *          Mati Shomrat
  36. *
  37. * File Description:
  38. *   GBseq formatting        
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <serial/objostr.hpp>
  43. #include <objects/gbseq/GBSet.hpp>
  44. #include <objects/gbseq/GBSeq.hpp>
  45. #include <objects/gbseq/GBReference.hpp>
  46. #include <objects/gbseq/GBKeyword.hpp>
  47. #include <objects/gbseq/GBSeqid.hpp>
  48. #include <objects/gbseq/GBFeature.hpp>
  49. #include <objects/gbseq/GBInterval.hpp>
  50. #include <objects/gbseq/GBQualifier.hpp>
  51. #include <objects/seq/Seqdesc.hpp>
  52. #include <objmgr/scope.hpp>
  53. #include <objmgr/impl/scope_info.hpp>
  54. #include <objmgr/seqdesc_ci.hpp>
  55. #include <objmgr/util/sequence.hpp>
  56. #include <objmgr/impl/synonyms.hpp>
  57. #include <objtools/format/text_ostream.hpp>
  58. #include <objtools/format/gbseq_formatter.hpp>
  59. #include <objtools/format/items/locus_item.hpp>
  60. #include <objtools/format/items/defline_item.hpp>
  61. #include <objtools/format/items/accession_item.hpp>
  62. #include <objtools/format/items/version_item.hpp>
  63. #include <objtools/format/items/keywords_item.hpp>
  64. #include <objtools/format/items/source_item.hpp>
  65. #include <objtools/format/items/reference_item.hpp>
  66. #include <objtools/format/items/comment_item.hpp>
  67. #include <objtools/format/items/feature_item.hpp>
  68. #include <objtools/format/items/sequence_item.hpp>
  69. #include <objtools/format/items/segment_item.hpp>
  70. #include <objtools/format/items/contig_item.hpp>
  71. #include "utils.hpp"
  72. BEGIN_NCBI_SCOPE
  73. BEGIN_SCOPE(objects)
  74. /////////////////////////////////////////////////////////////////////////////
  75. // static functions
  76. static void s_GBSeqStringCleanup(string& str, bool location = false)
  77. {
  78.     list<string> l;
  79.     NStr::Split(str, " nrtb", l);
  80.     str = NStr::Join(l, " ");
  81.     if ( location ) {
  82.         str = NStr::Replace(str, ", ", ",");
  83.     }
  84.     str = NStr::TruncateSpaces(str);
  85. }
  86. static void s_GBSeqQualCleanup(string& val)
  87. {
  88.     
  89.     val = NStr::Replace(val, """, " ");
  90.     s_GBSeqStringCleanup(val);
  91.     /*
  92.     if ( NStr::EndsWith(val, ".") ) {
  93.         val.erase(val.length() - 1);
  94.     }
  95.     */
  96. }
  97. /////////////////////////////////////////////////////////////////////////////
  98. // Public
  99. // constructor
  100. CGBSeqFormatter::CGBSeqFormatter(void)
  101. {
  102. }
  103. // detructor
  104. CGBSeqFormatter::~CGBSeqFormatter(void) 
  105. {
  106. }
  107. void CGBSeqFormatter::Start(IFlatTextOStream& text_os)
  108. {
  109.     x_WriteFileHeader(text_os);
  110.         
  111.     x_StartWriteGBSet(text_os);
  112. }
  113. void CGBSeqFormatter::StartSection(const CStartSectionItem&, IFlatTextOStream&)
  114. {
  115.     m_GBSeq.Reset(new CGBSeq);
  116.     _ASSERT(m_GBSeq);
  117. }
  118. void CGBSeqFormatter::EndSection(const CEndSectionItem&, IFlatTextOStream& text_os)
  119. {
  120.     x_WriteGBSeq(text_os);
  121.     m_GBSeq.Reset();
  122.     _ASSERT(!m_GBSeq);
  123. }
  124. void CGBSeqFormatter::End(IFlatTextOStream& text_os)
  125. {
  126.     x_EndWriteGBSet(text_os);
  127. }
  128. ///////////////////////////////////////////////////////////////////////////
  129. //
  130. // Locus
  131. //
  132. CGBSeq::TStrandedness s_GBSeqStrandedness(CSeq_inst::TStrand strand)
  133. {
  134.     switch ( strand ) {
  135.     case CSeq_inst::eStrand_ss:
  136.         return CGBSeq::eStrandedness_single_stranded;
  137.     case CSeq_inst::eStrand_ds:
  138.         return CGBSeq::eStrandedness_double_stranded;
  139.     case CSeq_inst::eStrand_mixed:
  140.         return CGBSeq::eStrandedness_mixed_stranded;
  141.     case CSeq_inst::eStrand_other:
  142.     case CSeq_inst::eStrand_not_set:
  143.     default:
  144.         break;
  145.     }
  146.     return CGBSeq::eStrandedness_not_set;
  147. }
  148. CGBSeq::TMoltype s_GBSeqMoltype(CMolInfo::TBiomol biomol)
  149. {
  150.     switch ( biomol ) {
  151.     case CMolInfo::eBiomol_unknown:
  152.         return CGBSeq::eMoltype_nucleic_acid;
  153.     case CMolInfo::eBiomol_genomic:
  154.     case CMolInfo::eBiomol_other_genetic:
  155.     case CMolInfo::eBiomol_genomic_mRNA:
  156.         return CGBSeq::eMoltype_dna;
  157.     case CMolInfo::eBiomol_pre_RNA:
  158.     case CMolInfo::eBiomol_cRNA:
  159.     case CMolInfo::eBiomol_transcribed_RNA:
  160.         return CGBSeq::eMoltype_rna;
  161.     case CMolInfo::eBiomol_mRNA:
  162.         return CGBSeq::eMoltype_mrna;
  163.     case CMolInfo::eBiomol_rRNA:
  164.         return CGBSeq::eMoltype_rrna;
  165.     case CMolInfo::eBiomol_tRNA:
  166.         return CGBSeq::eMoltype_trna;
  167.     case CMolInfo::eBiomol_snRNA:
  168.         return CGBSeq::eMoltype_urna;
  169.     case CMolInfo::eBiomol_scRNA:
  170.         return CGBSeq::eMoltype_snrna;
  171.     case CMolInfo::eBiomol_peptide:
  172.         return CGBSeq::eMoltype_peptide;
  173.     case CMolInfo::eBiomol_snoRNA:
  174.         return CGBSeq::eMoltype_snorna;
  175.     default:
  176.         break;
  177.     }
  178.     return CGBSeq::eMoltype_nucleic_acid;
  179. }
  180. CGBSeq::TTopology s_GBSeqTopology(CSeq_inst::TTopology topology)
  181. {
  182.     if ( topology == CSeq_inst::eTopology_circular ) {
  183.         return CGBSeq::eTopology_circular;
  184.     }
  185.     return CGBSeq::eTopology_linear;
  186. }
  187. string s_GetDate(const CBioseq_Handle& bsh, CSeqdesc::E_Choice choice)
  188. {
  189.     _ASSERT(choice == CSeqdesc::e_Update_date  ||
  190.             choice == CSeqdesc::e_Create_date);
  191.     CSeqdesc_CI desc(bsh, choice);
  192.     if ( desc ) {
  193.         string result;
  194.         if ( desc->IsUpdate_date() ) {
  195.             DateToString(desc->GetUpdate_date(), result);
  196.         } else {
  197.             DateToString(desc->GetCreate_date(), result);
  198.         }
  199.         return result;
  200.     }
  201.     return "01-JAN-1900";
  202. }
  203. void CGBSeqFormatter::FormatLocus
  204. (const CLocusItem& locus, 
  205.  IFlatTextOStream&)
  206. {
  207.     _ASSERT(m_GBSeq);
  208.     CBioseqContext& ctx = *locus.GetContext();
  209.     m_GBSeq->SetLocus(locus.GetName());
  210.     m_GBSeq->SetLength(locus.GetLength());
  211.     m_GBSeq->SetStrandedness(s_GBSeqStrandedness(locus.GetStrand()));
  212.     m_GBSeq->SetMoltype(s_GBSeqMoltype(locus.GetBiomol()));
  213.     m_GBSeq->SetTopology(s_GBSeqTopology(locus.GetTopology()));
  214.     m_GBSeq->SetDivision(locus.GetDivision());
  215.     m_GBSeq->SetUpdate_date(s_GetDate(ctx.GetHandle(), CSeqdesc::e_Update_date));
  216.     m_GBSeq->SetCreate_date(s_GetDate(ctx.GetHandle(), CSeqdesc::e_Create_date));
  217.     ITERATE (CBioseq::TId, it, ctx.GetBioseqIds()) {
  218.         m_GBSeq->SetOther_seqids().push_back(CGBSeqid((*it)->AsFastaString()));
  219.     }
  220. }
  221. ///////////////////////////////////////////////////////////////////////////
  222. //
  223. // Definition
  224. void CGBSeqFormatter::FormatDefline
  225. (const CDeflineItem& defline,
  226.  IFlatTextOStream&)
  227. {
  228.     _ASSERT(m_GBSeq);
  229.     m_GBSeq->SetDefinition(defline.GetDefline());
  230.     if ( NStr::EndsWith(m_GBSeq->GetDefinition(), ".") ) {
  231.         m_GBSeq->SetDefinition().resize(m_GBSeq->GetDefinition().length() - 1);
  232.     }
  233. }
  234. ///////////////////////////////////////////////////////////////////////////
  235. //
  236. // Accession
  237. void CGBSeqFormatter::FormatAccession
  238. (const CAccessionItem& acc, 
  239.  IFlatTextOStream&)
  240. {
  241.     m_GBSeq->SetPrimary_accession(acc.GetAccession());
  242.     ITERATE (CAccessionItem::TExtra_accessions, it, acc.GetExtraAccessions()) {
  243.         m_GBSeq->SetSecondary_accessions().push_back(CGBSecondary_accn(*it));
  244.     }
  245. }
  246. ///////////////////////////////////////////////////////////////////////////
  247. //
  248. // Version
  249. void CGBSeqFormatter::FormatVersion
  250. (const CVersionItem& version,
  251.  IFlatTextOStream&)
  252. {
  253.     m_GBSeq->SetAccession_version(version.GetAccession());
  254. }
  255. ///////////////////////////////////////////////////////////////////////////
  256. //
  257. // Segment
  258. void CGBSeqFormatter::FormatSegment
  259. (const CSegmentItem& seg,
  260.  IFlatTextOStream&)
  261. {
  262.     CNcbiOstrstream segment_line;
  263.     segment_line << seg.GetNum() << " of " << seg.GetCount();
  264.     m_GBSeq->SetSegment(CNcbiOstrstreamToString(segment_line));
  265. }
  266. ///////////////////////////////////////////////////////////////////////////
  267. //
  268. // Source
  269. void CGBSeqFormatter::FormatSource
  270. (const CSourceItem& source,
  271.  IFlatTextOStream&)
  272. {
  273.     _ASSERT(m_GBSeq);
  274.     CNcbiOstrstream source_line;
  275.     source_line << source.GetOrganelle() << source.GetTaxname();
  276.     if ( !source.GetCommon().empty() ) {
  277.         source_line << (source.IsUsingAnamorph() ? " (anamorph: " : " (") 
  278.                     << source.GetCommon() << ")";
  279.     }
  280.     m_GBSeq->SetSource(CNcbiOstrstreamToString(source_line));
  281.     m_GBSeq->SetOrganism(source.GetTaxname());
  282.     m_GBSeq->SetTaxonomy(source.GetLineage());
  283. }
  284. ///////////////////////////////////////////////////////////////////////////
  285. //
  286. // Keywords
  287. void CGBSeqFormatter::FormatKeywords
  288. (const CKeywordsItem& keys,
  289.  IFlatTextOStream&)
  290. {
  291.     ITERATE (CKeywordsItem::TKeywords, it, keys.GetKeywords()) {
  292.         m_GBSeq->SetKeywords().push_back(CGBKeyword(*it));
  293.     }
  294. }
  295. ///////////////////////////////////////////////////////////////////////////
  296. //
  297. // REFERENCE
  298. void CGBSeqFormatter::FormatReference
  299. (const CReferenceItem& ref,
  300.  IFlatTextOStream&)
  301. {
  302.     _ASSERT(m_GBSeq);
  303.     CBioseqContext& ctx = *ref.GetContext();
  304.     CRef<CGBReference> gbref(new CGBReference);
  305.     const CSeq_loc* loc = (ref.GetLoc() != 0) ?
  306.         ref.GetLoc() : &ctx.GetLocation();
  307.     CNcbiOstrstream refstr;
  308.     refstr << ref.GetSerial() << ' ';
  309.     x_FormatRefLocation(refstr, *loc, " to ", "; ", ctx);
  310.     gbref->SetReference(CNcbiOstrstreamToString(refstr));
  311.     list<string> authors;
  312.     CReferenceItem::GetAuthNames(authors, ref.GetAuthors());
  313.     ITERATE (list<string>, it, authors) {
  314.         CGBAuthor author(*it);
  315.         gbref->SetAuthors().push_back(author);
  316.     }
  317.     if ( !ref.GetConsortium().empty() ) {
  318.         gbref->SetConsortium(ref.GetConsortium());
  319.     }
  320.     if ( !ref.GetTitle().empty() ) {
  321.         if ( NStr::EndsWith(ref.GetTitle(), ".") ) {
  322.             string title = ref.GetTitle();
  323.             title.resize(title.length() - 1);
  324.             gbref->SetTitle(title);
  325.         } else {
  326.             gbref->SetTitle(ref.GetTitle());
  327.         }
  328.     }
  329.     string journal;
  330.     x_FormatRefJournal(journal, ref);
  331.     NON_CONST_ITERATE (string, it, journal) {
  332.         if ( (*it == 'n')  ||  (*it == 't')  ||  (*it == 'r') ) {
  333.             *it = ' ';
  334.         }
  335.     }
  336.     if ( !journal.empty() ) {
  337.         gbref->SetJournal(journal);
  338.     }
  339.     if ( ref.GetMUID() != 0 ) {
  340.         gbref->SetMedline(ref.GetMUID());
  341.     }
  342.     if ( ref.GetPMID() != 0 ) {
  343.         gbref->SetPubmed(ref.GetPMID());
  344.     }
  345.     if ( !ref.GetRemark().empty() ) {
  346.         gbref->SetRemark(ref.GetRemark());
  347.     }
  348.     m_GBSeq->SetReferences().push_back(gbref);
  349. }
  350. ///////////////////////////////////////////////////////////////////////////
  351. //
  352. // COMMENT
  353. void CGBSeqFormatter::FormatComment
  354. (const CCommentItem& comment,
  355.  IFlatTextOStream&)
  356. {
  357.     string str = comment.GetComment();
  358.     s_GBSeqStringCleanup(str);
  359.     
  360.     if ( !m_GBSeq->IsSetComment() ) {
  361.         m_GBSeq->SetComment(str);
  362.     } else {    
  363.         m_GBSeq->SetComment() += "; ";
  364.         m_GBSeq->SetComment() += str;
  365.     }
  366. }
  367. ///////////////////////////////////////////////////////////////////////////
  368. //
  369. // FEATURES
  370. static void s_SetIntervals(CGBFeature::TIntervals& intervals,
  371.                     const CSeq_loc& loc,
  372.                     CScope& scope)
  373. {
  374.     for (CSeq_loc_CI it(loc); it; ++it) {
  375.         CRef<CGBInterval> ival(new CGBInterval);
  376.         CSeq_loc_CI::TRange range = it.GetRange();
  377.         CConstRef<CSeq_id> best(&it.GetSeq_id());
  378.         if ( best->IsGi() ) {
  379.             CConstRef<CSynonymsSet> syns = scope.GetSynonyms(*best);
  380.             vector< CRef<CSeq_id> > ids;
  381.             ITERATE (CSynonymsSet, id_iter, *syns) {
  382.                 CConstRef<CSeq_id> id = (*id_iter)->first.GetSeqId();
  383.                 CRef<CSeq_id> sip(const_cast<CSeq_id*>(id.GetPointerOrNull()));
  384.                 ids.push_back(sip);
  385.             }
  386.             best.Reset(FindBestChoice(ids, CSeq_id::Score));
  387.         }
  388.         ival->SetAccession(best->GetSeqIdString(true));  
  389.         if ( range.GetLength() == 1 ) {  // point
  390.             ival->SetPoint(range.GetFrom() + 1);
  391.         } else {
  392.             TSeqPos from, to;
  393.             if ( range.IsWhole() ) {
  394.                 from = 1;
  395.                 to = sequence::GetLength(it.GetSeq_loc(), &scope);
  396.             } else {
  397.                 from = range.GetFrom() + 1;
  398.                 to = range.GetTo() + 1;
  399.             }
  400.             if ( it.GetStrand() == eNa_strand_minus ) {
  401.                 swap(from, to);
  402.             }
  403.             ival->SetFrom(from);
  404.             ival->SetTo(to);
  405.         }
  406.         
  407.         intervals.push_back(ival);
  408.     }
  409. }
  410. static void s_SetQuals(CGBFeature::TQuals& gbquals,
  411.                        const CFlatFeature::TQuals& quals)
  412. {
  413.     ITERATE (CFlatFeature::TQuals, it, quals) {
  414.         CRef<CGBQualifier> qual(new CGBQualifier);
  415.         qual->SetName((*it)->GetName());
  416.         if ((*it)->GetStyle() != CFormatQual::eEmpty) {
  417.             qual->SetValue((*it)->GetValue());
  418.             s_GBSeqQualCleanup(qual->SetValue());
  419.         }
  420.         gbquals.push_back(qual);
  421.     }
  422. }
  423. void CGBSeqFormatter::FormatFeature
  424. (const CFeatureItemBase& f,
  425.  IFlatTextOStream&)
  426. {
  427.     CConstRef<CFlatFeature> feat = f.Format();
  428.     CRef<CGBFeature>    gbfeat(new CGBFeature);
  429.     gbfeat->SetKey(feat->GetKey());
  430.     
  431.     string location = feat->GetLoc().GetString();
  432.     s_GBSeqStringCleanup(location, true);
  433.     gbfeat->SetLocation(location);
  434.     if ( feat->GetKey() != "source" ) {
  435.         s_SetIntervals(gbfeat->SetIntervals(), f.GetLoc(), 
  436.             f.GetContext()->GetScope());
  437.     }
  438.     if ( !feat->GetQuals().empty() ) {
  439.         s_SetQuals(gbfeat->SetQuals(), feat->GetQuals());
  440.     }
  441.     
  442.     m_GBSeq->SetFeature_table().push_back(gbfeat);
  443. }
  444. ///////////////////////////////////////////////////////////////////////////
  445. //
  446. // SEQUENCE
  447. void CGBSeqFormatter::FormatSequence
  448. (const CSequenceItem& seq,
  449.  IFlatTextOStream&)
  450. {
  451.     string data;
  452.     CSeqVector_CI vec_ci(seq.GetSequence());
  453.     vec_ci.GetSeqData(data, seq.GetSequence().size());
  454.     if ( !m_GBSeq->IsSetSequence() ) {
  455.         m_GBSeq->SetSequence(kEmptyStr);
  456.     }
  457.     m_GBSeq->SetSequence() += data;
  458. }
  459. ///////////////////////////////////////////////////////////////////////////
  460. //
  461. // CONTIG
  462. void CGBSeqFormatter::FormatContig
  463. (const CContigItem& contig,
  464.  IFlatTextOStream&)
  465. {
  466.     string assembly = CFlatSeqLoc(contig.GetLoc(), *contig.GetContext(), 
  467.         CFlatSeqLoc::eType_assembly).GetString();
  468.     s_GBSeqStringCleanup(assembly, true);
  469.     m_GBSeq->SetContig(assembly);
  470. }
  471. //=========================================================================//
  472. //                                Private                                  //
  473. //=========================================================================//
  474. void CGBSeqFormatter::x_WriteFileHeader(IFlatTextOStream& text_os)
  475. {
  476.     m_Out.reset(CObjectOStream::Open(eSerial_Xml, m_StrStream));
  477.     const CClassTypeInfo* gbset_info
  478.         = dynamic_cast<const CClassTypeInfo*>(CGBSet::GetTypeInfo());
  479.     m_Out->WriteFileHeader(gbset_info);
  480.     x_StrOStreamToTextOStream(text_os);
  481. }
  482. void CGBSeqFormatter::x_StartWriteGBSet(IFlatTextOStream& text_os)
  483. {
  484.     m_Cont.reset(new SOStreamContainer(*m_Out, CGBSet::GetTypeInfo()));
  485.     x_StrOStreamToTextOStream(text_os);
  486. }
  487. void CGBSeqFormatter::x_WriteGBSeq(IFlatTextOStream& text_os)
  488. {
  489.     m_Cont->WriteElement(ConstObjectInfo(*m_GBSeq));
  490.     x_StrOStreamToTextOStream(text_os);
  491. }
  492. void CGBSeqFormatter::x_EndWriteGBSet(IFlatTextOStream& text_os)
  493. {
  494.     m_Cont.reset();
  495.     x_StrOStreamToTextOStream(text_os);
  496. }
  497. void CGBSeqFormatter::x_StrOStreamToTextOStream(IFlatTextOStream& text_os)
  498. {
  499.     list<string> l;
  500.     // flush ObjectOutputStream to underlying strstream
  501.     m_Out->Flush();
  502.     // read text from strstream
  503.     NStr::Split(CNcbiOstrstreamToString(m_StrStream), "n", l);
  504.     // add text to TextOStream
  505.     text_os.AddParagraph(l);
  506.     // reset strstream
  507.     m_StrStream.seekp(0);
  508. }
  509. END_SCOPE(objects)
  510. END_NCBI_SCOPE
  511. /*
  512. * ===========================================================================
  513. *
  514. * $Log: gbseq_formatter.cpp,v $
  515. * Revision 1000.1  2004/06/01 19:44:34  gouriano
  516. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  517. *
  518. * Revision 1.4  2004/05/21 21:42:54  gorelenk
  519. * Added PCH ncbi_pch.hpp
  520. *
  521. * Revision 1.3  2004/05/06 17:52:53  shomrat
  522. * CFlatQual -> CFormatQual
  523. *
  524. * Revision 1.2  2004/04/22 15:53:26  shomrat
  525. * Changes in context
  526. *
  527. * Revision 1.1  2004/04/13 16:49:54  shomrat
  528. * Initial revision
  529. *
  530. *
  531. * ===========================================================================
  532. */