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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: embl_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:44:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: embl_formatter.cpp,v 1000.2 2004/06/01 19:44:07 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. *           
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <objtools/format/text_ostream.hpp>
  44. #include <objtools/format/items/locus_item.hpp>
  45. #include <objtools/format/items/defline_item.hpp>
  46. #include <objtools/format/items/version_item.hpp>
  47. #include <objtools/format/items/date_item.hpp>
  48. #include <objtools/format/items/keywords_item.hpp>
  49. #include <objtools/format/items/source_item.hpp>
  50. #include <objtools/format/embl_formatter.hpp>
  51. #include <objtools/format/context.hpp>
  52. #include "utils.hpp"
  53. BEGIN_NCBI_SCOPE
  54. BEGIN_SCOPE(objects)
  55. // NB: For more complete documentation on the EMBL format see EMBL's user 
  56. // manual (http://www.ebi.ac.uk/embl/Documentation/User_manual/usrman.html)
  57. CEmblFormatter::CEmblFormatter(void) 
  58. {
  59.     SetIndent(string(5, ' '));
  60.     //SetFeatIndent(string(21, ' '));
  61.     string tmp;
  62.     m_XX.push_back(Pad("XX", tmp, ePara));
  63. }
  64. ///////////////////////////////////////////////////////////////////////////
  65. //
  66. // END SECTION
  67. void CEmblFormatter::EndSection(const CEndSectionItem&, IFlatTextOStream& text_os)
  68. {
  69.     list<string> l;
  70.     l.push_back("//");
  71.     text_os.AddParagraph(l);
  72. }
  73. ///////////////////////////////////////////////////////////////////////////
  74. //
  75. // ID (EMBL's locus line)
  76. //
  77. // General format:
  78. //      ID   entryname  dataclass; molecule; division; sequencelength BP.
  79. //
  80. // Entryname: stable identifier.
  81. // Dataclass: The second item on the ID line indicates the data class of the entry.
  82. // Molecule Type: The third item on the line is the type of molecule as stored.
  83. // Database division: This indicates to which division the entry belongs.
  84. // Sequence length: The last item on the ID line is the length of the sequence.
  85. void CEmblFormatter::FormatLocus
  86. (const CLocusItem& locus, 
  87.  IFlatTextOStream& text_os)
  88. {
  89.     static string embl_mol [14] = {
  90.         "xxx", "DNA", "RNA", "RNA", "RNA", "RNA", "RNA",
  91.         "RNA", "AA ", "DNA", "DNA", "RNA", "RNA", "RNA"
  92.     };
  93.     const CBioseqContext& ctx = *locus.GetContext();
  94.     list<string> l;
  95.     CNcbiOstrstream id_line;
  96.     string hup = ctx.IsHup() ? " confidential" : " standard";
  97.     string topology = (locus.GetTopology() == CSeq_inst::eTopology_circular) ?
  98.                 "circular" : kEmptyStr;
  99.     const string& mol = ctx.Config().UseEmblMolType() ? 
  100.         embl_mol[locus.GetBiomol()] : s_GenbankMol[locus.GetBiomol()];
  101.             
  102.     id_line.setf(IOS_BASE::left, IOS_BASE::adjustfield);
  103.     id_line 
  104.         << setw(9) << locus.GetName()
  105.         << hup << "; "
  106.         << topology << mol << "; "
  107.         << locus.GetDivision() << "; "
  108.         << locus.GetLength() << " BP.";
  109.     Wrap(l, GetWidth(), "ID", CNcbiOstrstreamToString(id_line));
  110.     text_os.AddParagraph(l);
  111. }
  112. ///////////////////////////////////////////////////////////////////////////
  113. //
  114. // AC
  115. void CEmblFormatter::FormatAccession
  116. (const CAccessionItem& acc, 
  117.  IFlatTextOStream& text_os)
  118. {
  119.     string acc_line = x_FormatAccession(acc, ';');
  120.     x_AddXX(text_os);
  121.     list<string> l;
  122.     Wrap(l, "AC", acc_line);
  123.     text_os.AddParagraph(l);
  124. }
  125. ///////////////////////////////////////////////////////////////////////////
  126. //
  127. // SV
  128. void CEmblFormatter::FormatVersion
  129. (const CVersionItem& version,
  130.  IFlatTextOStream& text_os)
  131. {
  132.     if ( version.Skip() ) {
  133.         return;
  134.     }
  135.     x_AddXX(text_os);
  136.     list<string> l;
  137.     CNcbiOstrstream version_line;
  138.     if ( version.GetGi() > 0 ) {
  139.         version_line << "g" << version.GetGi();
  140.     }
  141.     Wrap(l, "SV", CNcbiOstrstreamToString(version_line));
  142.     text_os.AddParagraph(l);
  143. }
  144. ///////////////////////////////////////////////////////////////////////////
  145. //
  146. // DT
  147. void CEmblFormatter::FormatDate
  148. (const CDateItem& date,
  149.  IFlatTextOStream& text_os)
  150. {
  151.     string date_str;
  152.     list<string> l;
  153.     x_AddXX(text_os);
  154.     // Create Date
  155.     const CDate* dp = date.GetCreateDate();
  156.     if ( dp != 0 ) {
  157.         DateToString(*dp, date_str);
  158.     }
  159.     
  160.     if ( date_str.empty() ) {
  161.         date_str = "01-JAN-1900";
  162.     }
  163.     Wrap(l, "DT", date_str);
  164.     // Update Date
  165.     dp = date.GetUpdateDate();
  166.     if ( dp != 0 ) {
  167.         date_str.erase();
  168.         DateToString(*dp, date_str);
  169.     }
  170.     Wrap(l, "DT", date_str);
  171.     text_os.AddParagraph(l);
  172. }
  173. ///////////////////////////////////////////////////////////////////////////
  174. //
  175. // DE
  176. void CEmblFormatter::FormatDefline
  177. (const CDeflineItem& defline,
  178.  IFlatTextOStream& text_os)
  179. {
  180.     if ( defline.Skip() ) {
  181.         return;
  182.     }
  183.     x_AddXX(text_os);
  184.     list<string> l;
  185.     Wrap(l, "DE", defline.GetDefline());
  186.     text_os.AddParagraph(l);
  187. }
  188. ///////////////////////////////////////////////////////////////////////////
  189. //
  190. // KW
  191. void CEmblFormatter::FormatKeywords
  192. (const CKeywordsItem& keys,
  193.  IFlatTextOStream& text_os)
  194. {
  195.     if ( keys.Skip() ) {
  196.         return;
  197.     }
  198.     x_AddXX(text_os);
  199.     list<string> l;
  200.     x_GetKeywords(keys, "KW", l);
  201.     text_os.AddParagraph(l);
  202. }
  203. ///////////////////////////////////////////////////////////////////////////
  204. //
  205. // Source
  206. // SOURCE + ORGANISM
  207. void CEmblFormatter::FormatSource
  208. (const CSourceItem& source,
  209.  IFlatTextOStream& text_os)
  210. {
  211.     if ( source.Skip() ) {
  212.         return;
  213.     }
  214.     list<string> l;
  215.     x_OrganismSource(l, source);
  216.     x_OrganisClassification(l, source);
  217.     x_Organelle(l, source);
  218.     text_os.AddParagraph(l); 
  219. }
  220. void CEmblFormatter::x_OrganismSource
  221. (list<string>& l,
  222.  const CSourceItem& source) const
  223. {
  224.     /*
  225.     CNcbiOstrstream source_line;
  226.     
  227.     string prefix = source.IsUsingAnamorph() ? " (anamorph: " : " (";
  228.     
  229.     source_line << source.GetTaxname();
  230.     if ( !source.GetCommon().empty() ) {
  231.         source_line << prefix << source.GetCommon() << ")";
  232.     }
  233.     
  234.     Wrap(l, GetWidth(), "SOURCE", CNcbiOstrstreamToString(source_line));
  235.     */
  236. }
  237. void CEmblFormatter::x_OrganisClassification
  238. (list<string>& l,
  239.  const CSourceItem& source) const
  240. {
  241.     //Wrap(l, GetWidth(), "ORGANISM", source.GetTaxname(), eSubp);
  242.     //Wrap(l, GetWidth(), kEmptyStr, source.GetLineage() + '.', eSubp);
  243. }
  244. void CEmblFormatter::x_Organelle
  245. (list<string>& l,
  246.  const CSourceItem& source) const
  247. {
  248. }
  249. ///////////////////////////////////////////////////////////////////////////
  250. //
  251. // REFERENCE
  252. // The REFERENCE field consists of five parts: the keyword REFERENCE, and
  253. // the subkeywords AUTHORS, TITLE (optional), JOURNAL, MEDLINE (optional),
  254. // PUBMED (optional), and REMARK (optional).
  255. void CEmblFormatter::FormatReference
  256. (const CReferenceItem& ref,
  257.  IFlatTextOStream& text_os)
  258. {
  259.     /*
  260.     CFlatContext& ctx = const_cast<CFlatContext&>(ref.GetContext()); // !!!
  261.     list<string> l;
  262.     x_Reference(l, ref, ctx);
  263.     x_Authors(l, ref, ctx);
  264.     x_Consortium(l, ref, ctx);
  265.     x_Title(l, ref, ctx);
  266.     x_Journal(l, ref, ctx);
  267.     x_Medline(l, ref, ctx);
  268.     x_Pubmed(l, ref, ctx);
  269.     x_Remark(l, ref, ctx);
  270.     text_os.AddParagraph(l);
  271.     */
  272. }
  273. /*
  274. // The REFERENCE line contains the number of the particular reference and
  275. // (in parentheses) the range of bases in the sequence entry reported in
  276. // this citation.
  277. void CEmblFormatter::x_Reference
  278. (list<string>& l,
  279.  const CReferenceItem& ref,
  280.  CFlatContext& ctx)
  281. {
  282.     CNcbiOstrstream ref_line;
  283.     // print serial number
  284.     ref_line << ref.GetSerial() << (ref.GetSerial() < 10 ? "  " : " ");
  285.     // print sites or range
  286.     CPubdesc::TReftype reftype = ref.GetReftype();
  287.     if ( reftype == CPubdesc::eReftype_sites  ||
  288.          reftype == CPubdesc::eReftype_feats ) {
  289.         ref_line << "(sites)";
  290.     } else if ( reftype == CPubdesc::eReftype_no_target ) {
  291.     } else {
  292.         const CSeq_loc* loc = ref.GetLoc() != 0 ? ref.GetLoc() : ctx.GetLocation();
  293.         x_FormatRefLocation(ref_line, *loc, " to ", "; ",
  294.             ctx.IsProt(), ctx.GetScope());
  295.     }
  296.     Wrap(l, GetWidth(), "REFERENCE", CNcbiOstrstreamToString(ref_line));
  297. }
  298. void CEmblFormatter::x_Authors
  299. (list<string>& l,
  300.  const CReferenceItem& ref,
  301.  CFlatContext& ctx) const
  302. {
  303.     Wrap(l, "AUTHORS", CReferenceItem::GetAuthString(ref.GetAuthors()), eSubp);
  304. }
  305. void CEmblFormatter::x_Consortium
  306. (list<string>& l,
  307.  const CReferenceItem& ref,
  308.  CFlatContext& ctx) const
  309. {
  310.     Wrap(l, GetWidth(), "CONSRTM", ref.GetConsortium(), eSubp);
  311. }
  312. void CEmblFormatter::x_Title
  313. (list<string>& l,
  314.  const CReferenceItem& ref,
  315.  CFlatContext& ctx) const
  316. {
  317.     // !!! kludge - fix it
  318.     string title, journal;
  319.     ref.GetTitles(title, journal, ctx);
  320.     Wrap(l, "TITLE",   title,   eSubp);
  321. }
  322. void CEmblFormatter::x_Journal
  323. (list<string>& l,
  324.  const CReferenceItem& ref,
  325.  CFlatContext& ctx) const
  326. {
  327.     // !!! kludge - fix it
  328.     string title, journal;
  329.     ref.GetTitles(title, journal, ctx);
  330.     Wrap(l, "JOURNAL", journal, eSubp);
  331. }
  332. void CEmblFormatter::x_Medline
  333. (list<string>& l,
  334.  const CReferenceItem& ref,
  335.  CFlatContext& ctx) const
  336. {
  337.     Wrap(l, GetWidth(), "MEDLINE", NStr::IntToString(ref.GetMUID()), eSubp);
  338. }
  339. void CEmblFormatter::x_Pubmed
  340. (list<string>& l,
  341.  const CReferenceItem& ref,
  342.  CFlatContext& ctx) const
  343. {
  344.     Wrap(l, GetWidth(), " PUBMED", NStr::IntToString(ref.GetPMID()), eSubp);
  345. }
  346. void CEmblFormatter::x_Remark
  347. (list<string>& l,
  348.  const CReferenceItem& ref,
  349.  CFlatContext& ctx) const
  350. {
  351.     Wrap(l, GetWidth(), "REMARK", ref.GetRemark(), eSubp);
  352. }
  353. */
  354. ///////////////////////////////////////////////////////////////////////////
  355. //
  356. // COMMENT
  357. void CEmblFormatter::FormatComment
  358. (const CCommentItem& comment,
  359.  IFlatTextOStream& text_os)
  360. {
  361.     /*
  362.     list<string> l;
  363.     if ( !comment.IsFirst() ) {
  364.         Wrap(l, kEmptyStr, comment.GetComment(), eSubp);
  365.     } else {
  366.         Wrap(l, "COMMENT", comment.GetComment());
  367.     }
  368.     text_os.AddParagraph(l);
  369.     */
  370. }
  371. ///////////////////////////////////////////////////////////////////////////
  372. //
  373. // FEATURES
  374. // Fetures Header
  375. void CEmblFormatter::FormatFeatHeader
  376. (const CFeatHeaderItem& fh,
  377.  IFlatTextOStream& text_os)
  378. {
  379.     /*
  380.     list<string> l;
  381.     Wrap(l, "FEATURES", "Location/Qualifiers", eFeatHead);
  382.     text_os.AddParagraph(l);
  383.     */
  384. }
  385. void CEmblFormatter::FormatFeature
  386. (const CFeatureItemBase& f,
  387.  IFlatTextOStream& text_os)
  388.     /*
  389.     const CFlatFeature& feat = *f.Format();
  390.     list<string>        l;
  391.     Wrap(l, feat.GetKey(), feat.GetLoc().GetString(), eFeat);
  392.     ITERATE (vector<CRef<CFlatQual> >, it, feat.GetQuals()) {
  393.         string qual = '/' + (*it)->GetName(), value = (*it)->GetValue();
  394.         switch ((*it)->GetStyle()) {
  395.         case CFlatQual::eEmpty:                    value.erase();  break;
  396.         case CFlatQual::eQuoted:   qual += "="";  value += '"';   break;
  397.         case CFlatQual::eUnquoted: qual += '=';                    break;
  398.         }
  399.         // Call NStr::Wrap directly to avoid unwanted line breaks right
  400.         // before the start of the value (in /translation, e.g.)
  401.         NStr::Wrap(value, GetWidth(), l,
  402.                    / *DoHTML() ? NStr::fWrap_HTMLPre : * /0, GetFeatIndent(),
  403.                    GetFeatIndent() + qual);
  404.     }
  405.     text_os.AddParagraph(l);
  406.     */
  407. }
  408. ///////////////////////////////////////////////////////////////////////////
  409. //
  410. // BASE COUNT
  411. void CEmblFormatter::FormatBasecount
  412. (const CBaseCountItem& bc,
  413.  IFlatTextOStream& text_os)
  414. {
  415.     /*
  416.     list<string> l;
  417.     CNcbiOstrstream bc_line;
  418.     bc_line 
  419.         << right << setw(7) << bc.GetA() << " a"
  420.         << right << setw(7) << bc.GetC() << " c"
  421.         << right << setw(7) << bc.GetG() << " g"
  422.         << right << setw(7) << bc.GetT() << " t";
  423.     if ( bc.GetOther() > 0 ) {
  424.         bc_line << right << setw(7) << bc.GetOther() << " others";
  425.     }
  426.     Wrap(l, "BASE COUNT", CNcbiOstrstreamToString(bc_line));
  427.     text_os.AddParagraph(l);
  428.     */
  429. }
  430. ///////////////////////////////////////////////////////////////////////////
  431. //
  432. // SEQUENCE
  433. void CEmblFormatter::FormatSequence
  434. (const CSequenceItem& seq,
  435.  IFlatTextOStream& text_os)
  436. {
  437.     /*
  438.     list<string> l;
  439.     CNcbiOstrstream seq_line;
  440.     const CSeqVector& vec = seq.GetSequence();
  441.     TSeqPos base_count = seq.GetFrom();
  442.     CSeqVector::const_iterator iter = vec.begin();
  443.     while ( iter ) {
  444.         seq_line << setw(9) << right << base_count;
  445.         for ( TSeqPos count = 0; count < 60  &&  iter; ++count, ++iter, ++base_count ) {
  446.             if ( count % 10 == 0 ) {
  447.                 seq_line << ' ';
  448.             }
  449.             seq_line << (char)tolower(*iter);
  450.         }
  451.         seq_line << 'n';
  452.     }
  453.     if ( seq.IsFirst() ) {
  454.         l.push_back("ORIGIN      ");
  455.     }
  456.     NStr::Split(CNcbiOstrstreamToString(seq_line), "n", l);
  457.     text_os.AddParagraph(l);
  458.     */
  459. }
  460. string& CEmblFormatter::Pad(const string& s, string& out,
  461.                                 EPadContext where) const
  462. {
  463.     switch (where) {
  464.     case ePara:  case eSubp:  return x_Pad(s, out, 5);
  465.     case eFeatHead:           return x_Pad(s, out, 21, "FH   ");
  466.     case eFeat:               return x_Pad(s, out, 21, "FT   ");
  467.     default:                  return out;
  468.     }
  469. }
  470. void CEmblFormatter::x_AddXX(IFlatTextOStream& text_os) const
  471. {
  472.     text_os.AddParagraph(m_XX);
  473. }
  474. END_SCOPE(objects)
  475. END_NCBI_SCOPE