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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_embl_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:01  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_embl_formatter.cpp,v 1000.1 2004/06/01 19:43:01 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 -- EMBL(PEPT) output class
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objtools/flat/flat_embl_formatter.hpp>
  43. #include <objtools/flat/flat_items.hpp>
  44. #include <objects/seq/Seq_ext.hpp>
  45. #include <objects/seq/Seq_hist.hpp>
  46. #include <objects/seqloc/Textseq_id.hpp>
  47. #include <objmgr/seq_vector.hpp>
  48. #include <algorithm>
  49. BEGIN_NCBI_SCOPE
  50. BEGIN_SCOPE(objects)
  51. inline
  52. list<string>& CFlatEMBLFormatter::Wrap(list<string>& l, const string& tag,
  53.                                        const string& body, EPadContext where)
  54. {
  55.     NStr::TWrapFlags flags = DoHTML() ? NStr::fWrap_HTMLPre : 0;
  56.     string tag2;
  57.     Pad(tag, tag2, where);
  58.     NStr::Wrap(body, m_Stream->GetWidth(), l, flags, tag2);
  59.     return l;
  60. }
  61. inline
  62. void CFlatEMBLFormatter::x_AddXX(void)
  63. {
  64.     if (m_XX.empty()) {
  65.         string tmp;
  66.         m_XX.push_back(Pad("XX", tmp, ePara));
  67.     }
  68.     m_Stream->AddParagraph(m_XX);
  69. }
  70. void CFlatEMBLFormatter::FormatHead(const CFlatHead& head)
  71. {
  72.     list<string> l;
  73.     {{
  74.         CNcbiOstrstream id_line;
  75.         string          locus;
  76.         TParent::Pad(head.GetLocus(), locus, 9);
  77.         id_line << locus << " standard; ";
  78.         if (head.GetTopology() == CSeq_inst::eTopology_circular) {
  79.             id_line << "circular ";
  80.         }
  81.         id_line << head.GetMolString() << "; "
  82.                 << Upcase(head.GetDivision()) << "; "
  83.                 << m_Context->GetLength() << ' '
  84.                 << Upcase(m_Context->GetUnits()) << '.';
  85.         Wrap(l, "ID", CNcbiOstrstreamToString(id_line));
  86.         m_Stream->AddParagraph(l, &head);
  87.         l.clear();
  88.     }}
  89.     x_AddXX();
  90.     {{
  91.         string acc = m_Context->GetPrimaryID().GetSeqIdString(false);
  92.         ITERATE (list<string>, it, head.GetSecondaryIDs()) {
  93.             acc += "; " + *it;
  94.         }
  95.         Wrap(l, "AC", acc + ';');
  96.         l.push_back("XX   ");
  97.         Wrap(l, "SV", m_Context->GetAccession());
  98.         m_Stream->AddParagraph(l, &head, &m_Context->GetPrimaryID());
  99.         l.clear();
  100.     }}
  101.     x_AddXX();
  102.     {{
  103.         string date;
  104.         FormatDate(head.GetUpdateDate(), date);
  105.         Wrap(l, "DT", date);
  106.         m_Stream->AddParagraph(l, &head, &head.GetUpdateDate());
  107.         l.clear();
  108.         date.erase();
  109.         FormatDate(head.GetCreateDate(), date);
  110.         Wrap(l, "DT", date);
  111.         m_Stream->AddParagraph(l, &head, &head.GetCreateDate());
  112.         l.clear();
  113.     }}
  114.     x_AddXX();
  115.     Wrap(l, "DE", head.GetDefinition());
  116.     m_Stream->AddParagraph(l, &head);
  117.     // DBSOURCE for EMBLPEPT?
  118. }
  119. void CFlatEMBLFormatter::FormatKeywords(const CFlatKeywords& keys)
  120. {
  121.     x_AddXX();
  122.     list<string>   l, kw;
  123.     vector<string> v;
  124.     ITERATE (list<string>, it, keys.GetKeywords()) {
  125.         v.push_back(*it);
  126.     }
  127.     sort(v.begin(), v.end());
  128.     ITERATE (vector<string>, it, v) {
  129.         kw.push_back(*it + (&*it == &v.back() ? '.' : ';'));
  130.     }
  131.     if (kw.empty()) {
  132.         kw.push_back(".");
  133.     }
  134.     string tag;
  135.     NStr::WrapList(kw, m_Stream->GetWidth(), " ", l, 0, Pad("KW", tag, ePara));
  136.     m_Stream->AddParagraph(l, &keys);
  137. }
  138. void CFlatEMBLFormatter::FormatSegment(const CFlatSegment& seg)
  139. {
  140.     x_AddXX();
  141.     list<string> l;
  142.     // Done as comment (no corresponding line type)
  143.     Wrap(l, "CC", "SEGMENT " + NStr::IntToString(seg.GetNum()) + " of "
  144.          + NStr::IntToString(seg.GetCount()));
  145.     m_Stream->AddParagraph(l, &seg);
  146. }
  147. void CFlatEMBLFormatter::FormatSource(const CFlatSource& source)
  148. {
  149.     x_AddXX();
  150.     list<string> l;
  151.     {{
  152.         string name = source.GetFormalName();
  153.         if ( !source.GetCommonName().empty() ) {
  154.             name += " (" + source.GetCommonName() + ')';
  155.         }
  156.         Wrap(l, "OS", name);
  157.     }}
  158.     Wrap(l, "OC", source.GetLineage() + '.');
  159.     m_Stream->AddParagraph(l, &source, &source.GetDescriptor());
  160.     // XXX -- OG (Organelle)?
  161. }
  162. void CFlatEMBLFormatter::FormatReference(const CFlatReference& ref)
  163. {
  164.     x_AddXX();
  165.     list<string> l;
  166.     Wrap(l, "RN", '[' + NStr::IntToString(ref.GetSerial()) + ']');
  167.     Wrap(l, "RC", ref.GetRemark(), eSubp);
  168.     // Wrap(l, "RC", "CONSORTIUM: " + ref.GetConsortium(), eSubp);
  169.     Wrap(l, "RP", ref.GetRange(*m_Context), eSubp);
  170.     ITERATE (set<int>, it, ref.GetMUIDs()) {
  171.         if (DoHTML()) {
  172.             Wrap(l, "RX",
  173.                  "MEDLINE; <a href="" + ref.GetMedlineURL(*it) + "">"
  174.                  + NStr::IntToString(*it) + "</a>.",
  175.                  eSubp);
  176.         } else {
  177.             Wrap(l, "RX", "MEDLINE; " + NStr::IntToString(*it) + '.', eSubp);
  178.         }
  179.     }
  180.     
  181.     {{
  182.         const list<string>& raw_authors = ref.GetAuthors();
  183.         list<string> authors;
  184.         ITERATE (list<string>, it, raw_authors) {
  185.             authors.push_back(NStr::Replace(*it, ",", " ")
  186.                               + (&*it == &raw_authors.back() ? ';' : ','));
  187.         }
  188.         string tag;
  189.         NStr::WrapList(authors, m_Stream->GetWidth(), " ", l, 0,
  190.                        Pad("RA", tag, ePara));
  191.     }}
  192.     {{
  193.         string title, journal;
  194.         ref.GetTitles(title, journal, *m_Context);
  195.         Wrap(l, "RT", title + ';', eSubp);
  196.         Wrap(l, "RL", journal,     eSubp);
  197.     }}
  198.     m_Stream->AddParagraph(l, &ref, &ref.GetPubdesc());
  199. }
  200. void CFlatEMBLFormatter::FormatComment(const CFlatComment& comment)
  201. {
  202.     if (comment.GetComment().empty()) {
  203.         return;
  204.     }
  205.     x_AddXX();
  206.     string comment2 = ExpandTildes(comment.GetComment(), eTilde_newline);
  207.     if ( !NStr::EndsWith(comment2, ".") ) {
  208.         comment2 += '.';
  209.     }
  210.     list<string> l;
  211.     Wrap(l, "CC", comment2);
  212.     m_Stream->AddParagraph(l, &comment);
  213. }
  214. void CFlatEMBLFormatter::FormatPrimary(const CFlatPrimary& primary)
  215. {
  216.     x_AddXX();
  217.     list<string> l;
  218.     Wrap(l, "AH", primary.GetHeader());
  219.     ITERATE (CFlatPrimary::TPieces, it, primary.GetPieces()) {
  220.         string s;        
  221.         Wrap(l, "AS", it->Format(s));
  222.     }
  223.     m_Stream->AddParagraph
  224.         (l, &primary,
  225.          &m_Context->GetHandle().GetBioseqCore()->GetInst().GetHist());
  226. }
  227. void CFlatEMBLFormatter::FormatFeatHeader(const CFlatFeatHeader& fh)
  228. {
  229.     list<string> l;
  230.     x_AddXX();
  231.     Wrap(l, "Key", "Location/Qualifiers", eFeatHead);
  232.     l.push_back("FH   ");
  233.     m_Stream->AddParagraph(l, &fh);
  234. }
  235. void CFlatEMBLFormatter::FormatDataHeader(const CFlatDataHeader& dh)
  236. {
  237.     x_AddXX();
  238.     list<string> l;
  239.     CNcbiOstrstream oss;
  240.     oss << "Sequence " << m_Context->GetLength() << ' '
  241.         << Upcase(m_Context->GetUnits()) << ';';
  242.     if ( !m_Context->IsProt() ) {
  243.         TSeqPos a, c, g, t, other;
  244.         dh.GetCounts(a, c, g, t, other);
  245.         oss << ' ' << a << " A; " << c << " C; " << g << " G; " << t << " T; "
  246.             << other << " other;";
  247.     }
  248.     Wrap(l, "SQ", CNcbiOstrstreamToString(oss));
  249.     m_Stream->AddParagraph(l, &dh);
  250. }
  251. void CFlatEMBLFormatter::FormatData(const CFlatData& data)
  252. {
  253.     static const TSeqPos kChunkSize = 1200; // 20 lines
  254.     string     buf;
  255.     CSeqVector v = m_Context->GetHandle().GetSequenceView
  256.         (data.GetLoc(), CBioseq_Handle::eViewConstructed,
  257.          CBioseq_Handle::eCoding_Iupac);
  258.     for (TSeqPos pos = 0;  pos < v.size();  pos += kChunkSize) {
  259.         list<string>    lines;
  260.         CNcbiOstrstream oss;
  261.         TSeqPos l = min(kChunkSize, v.size() - pos);
  262.         v.GetSeqData(pos, pos + l, buf);
  263.         oss << "    ";
  264.         for (TSeqPos i = 0;  i < l;  ++i) {
  265.             if (i > 0  &&  i % 60 == 0) {
  266.                 oss << ' ' << setw(9) << pos + i << "n    ";
  267.             }
  268.             if (i % 10 == 0) {
  269.                 oss << ' ';
  270.             }
  271.             oss.put(tolower(buf[i]));
  272.         }
  273.         if (l % 60) {
  274.             oss << string((60 - (l % 60)) * 11 / 10 + 1, ' ')
  275.                 << setw(9) << pos + l;
  276.         }
  277.         NStr::Split(CNcbiOstrstreamToString(oss), "n", lines);
  278.         // should use narrower location
  279.         m_Stream->AddParagraph(lines, &data, &data.GetLoc());
  280.     }
  281. }
  282. void CFlatEMBLFormatter::FormatContig(const CFlatContig& contig)
  283. {
  284.     x_AddXX();
  285.     list<string> l;
  286.     Wrap(l, "CO", CFlatLoc(contig.GetLoc(), *m_Context).GetString());
  287.     m_Stream->AddParagraph
  288.         (l, &contig,
  289.          &m_Context->GetHandle().GetBioseqCore()->GetInst().GetExt());
  290. }
  291. void CFlatEMBLFormatter::FormatWGSRange(const CFlatWGSRange& range)
  292. {
  293.     // Done as comment (no corresponding line type)
  294.     x_AddXX();
  295.     list<string> l;
  296.     if (DoHTML()) {
  297.         Wrap(l, "CC",
  298.              "WGS: <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?"
  299.              "db=Nucleotide&cmd=Search&term=" + range.GetFirstID() + ':'
  300.              + range.GetLastID() + "[ACCN]">"
  301.              + range.GetFirstID() + "-" + range.GetLastID() + "</a>");
  302.     } else {
  303.         Wrap(l, "CC", "WGS: " + range.GetFirstID() + "-" + range.GetLastID());
  304.     }
  305.     m_Stream->AddParagraph(l, &range, &range.GetUserObject());
  306. }
  307. void CFlatEMBLFormatter::FormatGenomeInfo(const CFlatGenomeInfo& g)
  308. {
  309.     // Done as comment (no corresponding line type)
  310.     x_AddXX();
  311.     list<string> l;
  312.     string s = "GENOME: " + g.GetAccession();
  313.     if ( !g.GetMoltype().empty()) {
  314.         s += " (" + g.GetMoltype() + ')';
  315.     }
  316.     Wrap(l, "CC", s);
  317.     m_Stream->AddParagraph(l, &g, &g.GetUserObject());
  318. }
  319. string& CFlatEMBLFormatter::Pad(const string& s, string& out,
  320.                                 EPadContext where)
  321. {
  322.     switch (where) {
  323.     case ePara:  case eSubp:  return TParent::Pad(s, out, 5);
  324.     case eFeatHead:           return TParent::Pad(s, out, 21, "FH   ");
  325.     case eFeat:               return TParent::Pad(s, out, 21, "FT   ");
  326.     default:                  return out;
  327.     }
  328. }
  329. END_SCOPE(objects)
  330. END_NCBI_SCOPE
  331. /*
  332. * ===========================================================================
  333. *
  334. * $Log: flat_embl_formatter.cpp,v $
  335. * Revision 1000.1  2004/06/01 19:43:01  gouriano
  336. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  337. *
  338. * Revision 1.10  2004/05/21 21:42:53  gorelenk
  339. * Added PCH ncbi_pch.hpp
  340. *
  341. * Revision 1.9  2003/10/11 19:29:02  ucko
  342. * Made the XX paragraph a normal member to avoid trouble when statically
  343. * linked into multiple plugins.  (The old code wasn't threadsafe anyway.)
  344. *
  345. * Revision 1.8  2003/06/02 16:06:42  dicuccio
  346. * Rearranged src/objects/ subtree.  This includes the following shifts:
  347. *     - src/objects/asn2asn --> arc/app/asn2asn
  348. *     - src/objects/testmedline --> src/objects/ncbimime/test
  349. *     - src/objects/objmgr --> src/objmgr
  350. *     - src/objects/util --> src/objmgr/util
  351. *     - src/objects/alnmgr --> src/objtools/alnmgr
  352. *     - src/objects/flat --> src/objtools/flat
  353. *     - src/objects/validator --> src/objtools/validator
  354. *     - src/objects/cddalignview --> src/objtools/cddalignview
  355. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  356. * replaces the three libmmdb? libs.
  357. *
  358. * Revision 1.7  2003/04/10 20:08:22  ucko
  359. * Arrange to pass the item as an argument to IFlatTextOStream::AddParagraph
  360. *
  361. * Revision 1.6  2003/03/31 19:52:06  ucko
  362. * Fixed typo that made last commit ineffective.
  363. *
  364. * Revision 1.5  2003/03/31 16:25:14  ucko
  365. * Kludge: move the static "XX" paragraph to file scope, as it otherwise
  366. * becomes a common symbol on Darwin, preventing inclusion in shared libs.
  367. *
  368. * Revision 1.4  2003/03/29 04:14:23  ucko
  369. * Move private inline methods from .hpp to .cpp.
  370. *
  371. * Revision 1.3  2003/03/21 18:49:17  ucko
  372. * Turn most structs into (accessor-requiring) classes; replace some
  373. * formerly copied fields with pointers to the original data.
  374. *
  375. * Revision 1.2  2003/03/11 15:37:51  kuznets
  376. * iterate -> ITERATE
  377. *
  378. * Revision 1.1  2003/03/10 16:39:09  ucko
  379. * Initial check-in of new flat-file generator
  380. *
  381. *
  382. * ===========================================================================
  383. */