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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_gbseq_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:43:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_gbseq_formatter.cpp,v 1000.2 2004/06/01 19:43:10 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. *
  36. * File Description:
  37. *   new (early 2003) flat-file generator -- GBSeq output
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objtools/flat/flat_gbseq_formatter.hpp>
  43. #include <objtools/flat/flat_items.hpp>
  44. #include <serial/classinfo.hpp>
  45. #include <objects/gbseq/gbseq__.hpp>
  46. #include <objmgr/seq_vector.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. CFlatGBSeqFormatter::CFlatGBSeqFormatter(CObjectOStream& out, CScope& scope,
  50.                                          IFlatFormatter::EMode mode,
  51.                                          IFlatFormatter::EStyle style,
  52.                                          IFlatFormatter::TFlags flags)
  53.     : IFlatFormatter(scope, mode, style, flags), m_Set(new CGBSet), m_Out(&out)
  54. {
  55.     const CClassTypeInfo* gbset_info
  56.         = dynamic_cast<const CClassTypeInfo*>(CGBSet::GetTypeInfo());
  57.     const CMemberInfo* member = gbset_info->GetMemberInfo(kEmptyStr);
  58.     out.WriteFileHeader(gbset_info);
  59.     // We have to manage the stack ourselves, since BeginXxx() doesn't. :-/
  60.     out.PushFrame(CObjectStackFrame::eFrameClass, gbset_info);
  61.     out.BeginClass(gbset_info);
  62.     // out.PushFrame(CObjectStackFrame::eFrameClassMember, member->GetId());
  63.     // out.BeginClassMember(member->GetId());
  64.     out.PushFrame(CObjectStackFrame::eFrameArray, member->GetTypeInfo());
  65.     const CContainerTypeInfo* cont_info
  66.         = dynamic_cast<const CContainerTypeInfo*>(member->GetTypeInfo());
  67.     out.BeginContainer(cont_info);
  68.     out.PushFrame(CObjectStackFrame::eFrameArrayElement,
  69.                   cont_info->GetElementType());
  70.     out.Flush();
  71. }
  72. CFlatGBSeqFormatter::~CFlatGBSeqFormatter()
  73. {
  74.     if (m_Out) {
  75.         // We have to manage the stack ourselves, since EndXxx() doesn't. :-/
  76.         m_Out->PopFrame();
  77.         m_Out->EndContainer();
  78.         m_Out->PopFrame();
  79.         // m_Out->EndClassMember();
  80.         // m_Out->PopFrame();
  81.         m_Out->EndClass();
  82.         m_Out->PopFrame();
  83.         m_Out->EndOfWrite();
  84.     }
  85. }
  86. void CFlatGBSeqFormatter::BeginSequence(CFlatContext& context)
  87. {
  88.     IFlatFormatter::BeginSequence(context);
  89.     m_Seq.Reset(new CGBSeq);
  90. }
  91. void CFlatGBSeqFormatter::FormatHead(const CFlatHead& head)
  92. {
  93.     m_Seq->SetLocus (head.GetLocus());
  94.     m_Seq->SetLength(m_Context->GetLength());
  95.     switch (head.GetStrandedness()) {
  96.     case CSeq_inst::eStrand_ss:
  97.         m_Seq->SetStrandedness(CGBSeq::eStrandedness_single_stranded);
  98.         break;
  99.     case CSeq_inst::eStrand_ds:
  100.         m_Seq->SetStrandedness(CGBSeq::eStrandedness_double_stranded);
  101.         break;
  102.     case CSeq_inst::eStrand_mixed:
  103.         m_Seq->SetStrandedness(CGBSeq::eStrandedness_mixed_stranded);
  104.         break;
  105.     default:
  106.         break;
  107.     }
  108.     {{
  109.         CGBSeq::TMoltype mt = CGBSeq::eMoltype_nucleic_acid;
  110.         switch (m_Context->GetBiomol()) {
  111.         case CMolInfo::eBiomol_genomic:
  112.         case CMolInfo::eBiomol_other_genetic:
  113.         case CMolInfo::eBiomol_genomic_mRNA:
  114.             mt = CGBSeq::eMoltype_dna;
  115.             break;
  116.         case CMolInfo::eBiomol_pre_RNA:
  117.         case CMolInfo::eBiomol_cRNA:
  118.         case CMolInfo::eBiomol_transcribed_RNA:
  119.             mt = CGBSeq::eMoltype_rna;
  120.             break;
  121.         case CMolInfo::eBiomol_mRNA:     mt = CGBSeq::eMoltype_mrna;     break;
  122.         case CMolInfo::eBiomol_rRNA:     mt = CGBSeq::eMoltype_rrna;     break;
  123.         case CMolInfo::eBiomol_tRNA:     mt = CGBSeq::eMoltype_trna;     break;
  124.         case CMolInfo::eBiomol_snRNA:    mt = CGBSeq::eMoltype_urna;     break;
  125.         case CMolInfo::eBiomol_scRNA:    mt = CGBSeq::eMoltype_snrna;    break;
  126.         case CMolInfo::eBiomol_peptide:  mt = CGBSeq::eMoltype_peptide;  break;
  127.         case CMolInfo::eBiomol_snoRNA:   mt = CGBSeq::eMoltype_snorna;   break;
  128.         default:
  129.             switch (m_Context->GetMol()) {
  130.             case CSeq_inst::eMol_dna:  mt = CGBSeq::eMoltype_dna;      break;
  131.             case CSeq_inst::eMol_rna:  mt = CGBSeq::eMoltype_rna;      break;
  132.             case CSeq_inst::eMol_aa:   mt = CGBSeq::eMoltype_peptide;  break;
  133.             default:                   break; // already nucleic-acid
  134.             }
  135.         }
  136.         m_Seq->SetMoltype(mt);
  137.     }}
  138.     if (head.GetTopology() == CSeq_inst::eTopology_circular) {
  139.         m_Seq->SetTopology(CGBSeq::eTopology_circular);
  140.         // otherwise, stays at linear (default)
  141.     }
  142.     m_Seq->SetDivision(head.GetDivision());
  143.     FormatDate(head.GetUpdateDate(), m_Seq->SetUpdate_date());
  144.     FormatDate(head.GetCreateDate(), m_Seq->SetCreate_date());
  145.     m_Seq->SetDefinition(head.GetDefinition());
  146.     if (m_Context->GetPrimaryID().GetTextseq_Id()) {
  147.         m_Seq->SetPrimary_accession
  148.             (m_Context->GetPrimaryID().GetSeqIdString(false));
  149.         m_Seq->SetAccession_version(m_Context->GetAccession());
  150.     }
  151.     {{
  152.         // why "other", then?
  153.         CGBSeqid id(m_Context->GetPrimaryID().AsFastaString());
  154.         m_Seq->SetOther_seqids().push_back(id);
  155.     }}
  156.     ITERATE (CBioseq::TId, it, head.GetOtherIDs()) {
  157.         CGBSeqid id((*it)->AsFastaString());
  158.         m_Seq->SetOther_seqids().push_back(id);
  159.     }
  160.     ITERATE (list<string>, it, head.GetSecondaryIDs()) {
  161.         CGBSecondary_accn accn(*it);
  162.         m_Seq->SetSecondary_accessions().push_back(accn);
  163.     }
  164.     if ( !head.GetDBSource().empty() ) {
  165.         m_Seq->SetSource_db(NStr::Join(head.GetDBSource(), " "));
  166.     }
  167. }
  168. void CFlatGBSeqFormatter::FormatKeywords(const CFlatKeywords& keys)
  169. {
  170.     ITERATE (list<string>, it, keys.GetKeywords()) {
  171.         CGBKeyword key(*it);
  172.         m_Seq->SetKeywords().push_back(key);
  173.     }
  174. }
  175. void CFlatGBSeqFormatter::FormatSegment(const CFlatSegment& segment)
  176. {
  177.     m_Seq->SetSegment(NStr::IntToString(segment.GetNum()) + " of "
  178.                       + NStr::IntToString(segment.GetCount()));
  179. }
  180. void CFlatGBSeqFormatter::FormatSource(const CFlatSource& source)
  181. {
  182.     {{
  183.         string name = source.GetFormalName();
  184.         if ( !source.GetCommonName().empty() ) {
  185.             name += " (" + source.GetCommonName() + ")";
  186.         }
  187.         m_Seq->SetSource(name);
  188.     }}
  189.     m_Seq->SetOrganism(source.GetFormalName());
  190.     m_Seq->SetTaxonomy(source.GetLineage());
  191. }
  192. void CFlatGBSeqFormatter::FormatReference(const CFlatReference& ref)
  193. {
  194.     CRef<CGBReference> gbref(new CGBReference);
  195.     gbref->SetReference(NStr::IntToString(ref.GetSerial())
  196.                         + ref.GetRange(*m_Context));
  197.     ITERATE (list<string>, it, ref.GetAuthors()) {
  198.         CGBAuthor author(*it);
  199.         gbref->SetAuthors().push_back(author);
  200.     }
  201.     if ( !ref.GetConsortium().empty() ) {
  202.         gbref->SetConsortium(ref.GetConsortium());
  203.     }
  204.     ref.GetTitles(gbref->SetTitle(), gbref->SetJournal(), *m_Context);
  205.     if ( gbref->GetTitle().empty() ) {
  206.         gbref->ResetTitle();
  207.     }
  208.     if ( !ref.GetMUIDs().empty() ) {
  209.         gbref->SetMedline(*ref.GetMUIDs().begin());
  210.     }
  211.     if ( !ref.GetPMIDs().empty() ) {
  212.         gbref->SetPubmed(*ref.GetPMIDs().begin());
  213.     }
  214.     if ( !ref.GetRemark().empty() ) {
  215.         gbref->SetRemark(ref.GetRemark());
  216.     }
  217.     m_Seq->SetReferences().push_back(gbref);
  218. }
  219. void CFlatGBSeqFormatter::FormatComment(const CFlatComment& comment)
  220. {
  221.     if ( !comment.GetComment().empty() ) {
  222.         m_Seq->SetComment(comment.GetComment());
  223.     }
  224. }
  225. void CFlatGBSeqFormatter::FormatPrimary(const CFlatPrimary& primary)
  226. {
  227.     m_Seq->SetPrimary(primary.GetHeader());
  228.     ITERATE (CFlatPrimary::TPieces, it, primary.GetPieces()) {
  229.         m_Seq->SetPrimary() += '~';
  230.         it->Format(m_Seq->SetPrimary());
  231.     }
  232. }
  233. void CFlatGBSeqFormatter::FormatFeature(const IFlattishFeature& f)
  234. {
  235.     const CFlatFeature& feat = *f.Format();
  236.     CRef<CGBFeature>    gbfeat(new CGBFeature);
  237.     gbfeat->SetKey(feat.GetKey());
  238.     gbfeat->SetLocation(feat.GetLoc().GetString());
  239.     ITERATE (vector<CFlatLoc::SInterval>, it, feat.GetLoc().GetIntervals()) {
  240.         CRef<CGBInterval> ival(new CGBInterval);
  241.         if (it->m_Range.GetLength() == 1) {
  242.             ival->SetPoint(it->m_Range.GetFrom());
  243.         } else {
  244.             ival->SetFrom(it->m_Range.GetFrom());
  245.             ival->SetTo  (it->m_Range.GetTo());
  246.         }
  247.         ival->SetAccession(it->m_Accession);
  248.         gbfeat->SetIntervals().push_back(ival);
  249.     }
  250.     ITERATE (vector<CRef<CFlatQual> >, it, feat.GetQuals()) {
  251.         CRef<CGBQualifier> qual(new CGBQualifier);
  252.         qual->SetName((*it)->GetName());
  253.         if ((*it)->GetStyle() != CFlatQual::eEmpty) {
  254.             NStr::Replace((*it)->GetValue(), " b", kEmptyStr,
  255.                           qual->SetValue());
  256.         }
  257.         gbfeat->SetQuals().push_back(qual);
  258.     }
  259.     m_Seq->SetFeature_table().push_back(gbfeat);
  260. }
  261. void CFlatGBSeqFormatter::FormatData(const CFlatData& data)
  262. {
  263.     CSeqVector v = m_Context->GetHandle().GetSequenceView
  264.         (data.GetLoc(), CBioseq_Handle::eViewConstructed,
  265.          CBioseq_Handle::eCoding_Iupac);
  266.     v.GetSeqData(0, v.size(), m_Seq->SetSequence());
  267. }
  268. void CFlatGBSeqFormatter::FormatContig(const CFlatContig& contig)
  269. {
  270.     m_Seq->SetContig(CFlatLoc(contig.GetLoc(), *m_Context).GetString());
  271. }
  272. void CFlatGBSeqFormatter::EndSequence(void)
  273. {
  274.     m_Set->Set().push_back(m_Seq);
  275.     if (m_Out) {
  276.         m_Out->WriteContainerElement(ObjectInfo(*m_Seq));
  277.         m_Out->Flush();
  278.     }
  279. }
  280. END_SCOPE(objects)
  281. END_NCBI_SCOPE
  282. /*
  283. * ===========================================================================
  284. *
  285. * $Log: flat_gbseq_formatter.cpp,v $
  286. * Revision 1000.2  2004/06/01 19:43:10  gouriano
  287. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  288. *
  289. * Revision 1.8  2004/05/21 21:42:53  gorelenk
  290. * Added PCH ncbi_pch.hpp
  291. *
  292. * Revision 1.7  2003/11/04 20:00:28  ucko
  293. * Edit " b" sequences (used as hints for wrapping) out from qualifier values
  294. *
  295. * Revision 1.6  2003/10/21 13:48:50  grichenk
  296. * Redesigned type aliases in serialization library.
  297. * Fixed the code (removed CRef-s, added explicit
  298. * initializers etc.)
  299. *
  300. * Revision 1.5  2003/06/02 16:06:42  dicuccio
  301. * Rearranged src/objects/ subtree.  This includes the following shifts:
  302. *     - src/objects/asn2asn --> arc/app/asn2asn
  303. *     - src/objects/testmedline --> src/objects/ncbimime/test
  304. *     - src/objects/objmgr --> src/objmgr
  305. *     - src/objects/util --> src/objmgr/util
  306. *     - src/objects/alnmgr --> src/objtools/alnmgr
  307. *     - src/objects/flat --> src/objtools/flat
  308. *     - src/objects/validator --> src/objtools/validator
  309. *     - src/objects/cddalignview --> src/objtools/cddalignview
  310. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  311. * replaces the three libmmdb? libs.
  312. *
  313. * Revision 1.4  2003/04/10 20:08:22  ucko
  314. * Arrange to pass the item as an argument to IFlatTextOStream::AddParagraph
  315. *
  316. * Revision 1.3  2003/03/21 18:49:17  ucko
  317. * Turn most structs into (accessor-requiring) classes; replace some
  318. * formerly copied fields with pointers to the original data.
  319. *
  320. * Revision 1.2  2003/03/11 15:37:51  kuznets
  321. * iterate -> ITERATE
  322. *
  323. * Revision 1.1  2003/03/10 16:39:09  ucko
  324. * Initial check-in of new flat-file generator
  325. *
  326. *
  327. * ===========================================================================
  328. */