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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_items.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_items.cpp,v 1000.1 2004/06/01 19:43:20 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 -- most item types
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objtools/flat/flat_items.hpp>
  43. #include <serial/iterator.hpp>
  44. #include <objects/general/Dbtag.hpp>
  45. #include <objects/general/Object_id.hpp>
  46. #include <objects/general/User_field.hpp>
  47. #include <objects/seq/Bioseq.hpp>
  48. #include <objects/seq/Seq_hist.hpp>
  49. #include <objects/seqalign/Seq_align.hpp>
  50. #include <objects/seqblock/EMBL_block.hpp>
  51. #include <objects/seqblock/GB_block.hpp>
  52. #include <objects/seqblock/PIR_block.hpp>
  53. #include <objects/seqblock/PRF_block.hpp>
  54. #include <objects/seqblock/SP_block.hpp>
  55. #include <objects/seqfeat/BioSource.hpp>
  56. #include <objects/seqfeat/BinomialOrgName.hpp>
  57. #include <objects/seqfeat/OrgName.hpp>
  58. #include <objects/seqfeat/PartialOrgName.hpp>
  59. #include <objects/seqfeat/Org_ref.hpp>
  60. #include <objects/seqfeat/TaxElement.hpp>
  61. #include <objtools/alnmgr/alnmap.hpp>
  62. #include <objmgr/bioseq_handle.hpp>
  63. #include <objmgr/seqdesc_ci.hpp>
  64. #include <objmgr/seq_vector.hpp>
  65. BEGIN_NCBI_SCOPE
  66. BEGIN_SCOPE(objects)
  67. CFlatKeywords::CFlatKeywords(const CFlatContext& ctx)
  68. {
  69.     for (CSeqdesc_CI it(ctx.GetHandle());  it;  ++it) {
  70.         switch (it->Which()) {
  71.         // Grr, MSVC won't let me handle everything with a single template.
  72.         case CSeqdesc::e_Pir:
  73.           if (it->GetPir().IsSetKeywords()) {
  74.               m_Keywords.insert(m_Keywords.end(),
  75.                                 it->GetPir().GetKeywords().begin(),
  76.                                 it->GetPir().GetKeywords().end());
  77.           }
  78.   break;
  79.         case CSeqdesc::e_Genbank:
  80.           if (it->GetGenbank().IsSetKeywords()) {
  81.               m_Keywords.insert(m_Keywords.end(),
  82.                                 it->GetGenbank().GetKeywords().begin(),
  83.                                 it->GetGenbank().GetKeywords().end());
  84.           }
  85.   break;
  86.         case CSeqdesc::e_Sp:
  87.           if (it->GetSp().IsSetKeywords()) {
  88.               m_Keywords.insert(m_Keywords.end(),
  89.                                 it->GetSp().GetKeywords().begin(),
  90.                                 it->GetSp().GetKeywords().end());
  91.           }
  92.   break;
  93.         case CSeqdesc::e_Embl:
  94.           if (it->GetEmbl().IsSetKeywords()) {
  95.               m_Keywords.insert(m_Keywords.end(),
  96.                                 it->GetEmbl().GetKeywords().begin(),
  97.                                 it->GetEmbl().GetKeywords().end());
  98.           }
  99.   break;
  100.         case CSeqdesc::e_Prf:
  101.           if (it->GetPrf().IsSetKeywords()) {
  102.               m_Keywords.insert(m_Keywords.end(),
  103.                                 it->GetPrf().GetKeywords().begin(),
  104.                                 it->GetPrf().GetKeywords().end());
  105.           }
  106.   break;
  107.         default:
  108.             break;
  109.         }
  110.     }
  111. }
  112. CFlatSource::CFlatSource(const CFlatContext& ctx)
  113. {
  114.     for (CSeqdesc_CI it(ctx.GetHandle());  it;  ++it) {
  115.         switch (it->Which()) {
  116.         case CSeqdesc::e_Org:
  117.         case CSeqdesc::e_Source:
  118.         {
  119.             if ( !m_Descriptor ) {
  120.                 m_Descriptor.Reset(&*it);
  121.             }
  122.             const COrg_ref& org = (it->IsOrg() ? it->GetOrg()
  123.                                    : it->GetSource().GetOrg());
  124.             if (org.IsSetOrgname()) {
  125.                 // done first so taxname can override m_FormalName
  126.                 org.GetOrgname().GetFlatName(m_FormalName, &m_Lineage);
  127.             }
  128.             if (org.IsSetTaxname()) {
  129.                 m_FormalName = org.GetTaxname();
  130.             }
  131.             if (org.IsSetCommon()) {
  132.                 m_CommonName = org.GetCommon();
  133.             }
  134.             m_TaxID = org.GetTaxId();
  135.             break;
  136.         }
  137.         default:
  138.             break;
  139.         }
  140.     }
  141. }
  142. CFlatComment::CFlatComment(const CFlatContext& ctx)
  143. {
  144.     string delim;
  145.     for (CSeqdesc_CI it(ctx.GetHandle(), CSeqdesc::e_Comment);  it;  ++it) {
  146.         m_Comment += delim + it->GetComment();
  147.         delim = 'n';
  148.     }
  149.     for (CFeat_CI it(ctx.GetHandle().GetScope(), ctx.GetLocation(),
  150.                      CSeqFeatData::e_Comment);
  151.          it;  ++it) {
  152.         if (it->IsSetComment()) { // ought to be, but just in case...
  153.             m_Comment += delim + it->GetComment();
  154.             delim = 'n';
  155.         }
  156.     }    
  157. }
  158. CFlatPrimary::CFlatPrimary(const CFlatContext& ctx)
  159.     : m_IsRefSeq(ctx.IsRefSeq())
  160. {
  161.     const CSeq_inst& inst = ctx.GetHandle().GetBioseqCore()->GetInst();
  162.     if ( !inst.IsSetHist()  ||  !inst.GetHist().IsSetAssembly()) {
  163.         return;
  164.     }
  165.     ITERATE (CSeq_hist::TAssembly, it, inst.GetHist().GetAssembly()) {
  166.         if ( !(*it)->GetSegs().IsDenseg() ) {
  167.             // complain
  168.             continue;
  169.         }
  170.         CAlnMap aln((*it)->GetSegs().GetDenseg());
  171.         // XXX - more sanity checks (2 rows, first is seq, running forward)
  172.         // XXX - should honor m_Location
  173.         SPiece p;
  174.         p.m_Span         = aln.GetSeqRange(0);
  175.         p.m_PrimaryID    = &ctx.GetPreferredSynonym(aln.GetSeqId(1));
  176.         p.m_PrimarySpan  = aln.GetSeqRange(1);
  177.         p.m_Complemented = aln.IsNegativeStrand(1);
  178.         m_Pieces.push_back(p);
  179.     }
  180. }
  181. const char* CFlatPrimary::GetHeader(void) const
  182. {
  183.     if (m_IsRefSeq) {
  184.         return
  185.             "REFSEQ_SPAN         PRIMARY_IDENTIFIER PRIMARY_SPAN        COMP";
  186.     } else {
  187.         return
  188.             "TPA_SPAN            PRIMARY_IDENTIFIER PRIMARY_SPAN        COMP";
  189.     }
  190. }
  191. string& CFlatPrimary::SPiece::Format(string& s) const
  192. {
  193.     s += NStr::IntToString(m_Span.GetFrom()) + '-'
  194.         + NStr::IntToString(m_Span.GetTo());
  195.     s.resize(20, ' ');
  196.     s += m_PrimaryID->GetSeqIdString(true);
  197.     s.resize(39, ' ');
  198.     s += NStr::IntToString(m_PrimarySpan.GetFrom()) + '-'
  199.         + NStr::IntToString(m_PrimarySpan.GetTo());
  200.     s.resize(59, ' ');
  201.     s += m_Complemented ? 'c' : ' ';
  202.     return s;
  203. }
  204. void CFlatDataHeader::GetCounts(TSeqPos& a, TSeqPos& c, TSeqPos& g, TSeqPos& t,
  205.                                 TSeqPos& other) const
  206. {
  207.     if ( !m_IsProt
  208.         &&  !m_As  &&  !m_Cs  &&  !m_Gs  &&  !m_Ts  &&  !m_Others ) {
  209.         CSeqVector v = m_Handle.GetSequenceView
  210.             (*m_Loc, CBioseq_Handle::eViewConstructed);
  211.         // TSeqPos counts[numeric_limits<CSeqVector::TResidue>::max() + 1];
  212.         TSeqPos counts[256];
  213.         memset(counts, 0, sizeof(counts));
  214.         string buf; // avoids slow CSeqVector::operator[]
  215.         static const TSeqPos chunk_size = 4096;
  216.         for (TSeqPos start = 0;  start < v.size();  start += chunk_size) {
  217.             TSeqPos count = min(chunk_size, v.size() - start);
  218.             v.GetSeqData(start, start + count, buf);
  219.             for (TSeqPos i = 0;  i < count;  ++i) {
  220.                 ++counts[buf[i]];
  221.             }
  222.         }
  223.         m_As = counts[1];
  224.         m_Cs = counts[2];
  225.         m_Gs = counts[4];
  226.         m_Ts = counts[8];
  227.         m_Others = v.size() - m_As - m_Cs - m_Gs - m_Ts;
  228.     }
  229.     a     = m_As;
  230.     c     = m_Cs;
  231.     g     = m_Gs;
  232.     t     = m_Ts;
  233.     other = m_Others;
  234. }
  235. CFlatWGSRange::CFlatWGSRange(const CFlatContext& ctx)
  236. {
  237.     for (CSeqdesc_CI desc(ctx.GetHandle(), CSeqdesc::e_User);  desc;  ++desc) {
  238.         const CUser_object& uo = desc->GetUser();
  239.         if ( !uo.GetType().IsStr()
  240.             ||  NStr::CompareNocase(uo.GetType().GetStr(), "WGSProjects")) {
  241.             continue;
  242.         }
  243.         ITERATE (CUser_object::TData, it, uo.GetData()) {
  244.             if ( !(*it)->GetLabel().IsStr() ) {
  245.                 // complain?
  246.                 continue;
  247.             }
  248.             const string& label = (*it)->GetLabel().GetStr();
  249.             if        ( !NStr::CompareNocase(label, "WGS_accession_first") ) {
  250.                 // san-check
  251.                 m_First = (*it)->GetData().GetStr();
  252.             } else if ( !NStr::CompareNocase(label, "WGS_accession_last") ) {
  253.                 // san-check
  254.                 m_Last  = (*it)->GetData().GetStr();
  255.             }
  256.         }
  257.         if ( !m_UO ) {
  258.             m_UO.Reset(&uo);
  259.         }
  260.     }
  261.     if (m_First.empty()  ||  m_Last.empty()) {
  262.         // complain?
  263.         // reconstruct from other info
  264.         SIZE_TYPE digit_pos = ctx.GetAccession().find_first_of("0123456789");
  265.         string    prefix    = ctx.GetAccession().substr(0, digit_pos + 2);
  266.         m_First = prefix + "000001";
  267.         CNcbiOstrstream oss;
  268.         oss << prefix << setw(6) << setfill('0')
  269.             << ctx.GetHandle().GetBioseqCore()->GetInst().GetLength();
  270.         m_Last = CNcbiOstrstreamToString(oss);
  271.     }
  272. }
  273. CFlatGenomeInfo::CFlatGenomeInfo(const CFlatContext& ctx)
  274. {
  275.     for (CSeqdesc_CI desc(ctx.GetHandle(), CSeqdesc::e_User);  desc;  ++desc) {
  276.         const CUser_object& uo = desc->GetUser();
  277.         if ( !uo.GetType().IsStr()
  278.             ||  NStr::CompareNocase(uo.GetType().GetStr(), "GenomeProject")) {
  279.             continue;
  280.         }
  281.         ITERATE (CUser_object::TData, it, uo.GetData()) {
  282.             if ( !(*it)->GetLabel().IsStr() ) {
  283.                 // complain?
  284.                 continue;
  285.             }
  286.             const string& label = (*it)->GetLabel().GetStr();
  287.             if        ( !NStr::CompareNocase(label, "accession") ) {
  288.                 // san-check
  289.                 m_Accession = &(*it)->GetData().GetStr();
  290.             } else if ( !NStr::CompareNocase(label, "Moltype") ) {
  291.                 // san-check
  292.                 m_Moltype   = &(*it)->GetData().GetStr();
  293.             }
  294.         }
  295.         if ( !m_UO ) {
  296.             m_UO.Reset(&uo);
  297.         }
  298.     }
  299.     // complain if no accession found?  (moltype seems optional)
  300. }
  301. END_SCOPE(objects)
  302. END_NCBI_SCOPE
  303. /*
  304. * ===========================================================================
  305. *
  306. * $Log: flat_items.cpp,v $
  307. * Revision 1000.1  2004/06/01 19:43:20  gouriano
  308. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  309. *
  310. * Revision 1.6  2004/05/21 21:42:53  gorelenk
  311. * Added PCH ncbi_pch.hpp
  312. *
  313. * Revision 1.5  2003/06/02 16:06:42  dicuccio
  314. * Rearranged src/objects/ subtree.  This includes the following shifts:
  315. *     - src/objects/asn2asn --> arc/app/asn2asn
  316. *     - src/objects/testmedline --> src/objects/ncbimime/test
  317. *     - src/objects/objmgr --> src/objmgr
  318. *     - src/objects/util --> src/objmgr/util
  319. *     - src/objects/alnmgr --> src/objtools/alnmgr
  320. *     - src/objects/flat --> src/objtools/flat
  321. *     - src/objects/validator --> src/objtools/validator
  322. *     - src/objects/cddalignview --> src/objtools/cddalignview
  323. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  324. * replaces the three libmmdb? libs.
  325. *
  326. * Revision 1.4  2003/03/21 18:49:17  ucko
  327. * Turn most structs into (accessor-requiring) classes; replace some
  328. * formerly copied fields with pointers to the original data.
  329. *
  330. * Revision 1.3  2003/03/11 15:37:51  kuznets
  331. * iterate -> ITERATE
  332. *
  333. * Revision 1.2  2003/03/10 22:04:43  ucko
  334. * Expand out x_AddKeys manually because MSVC wouldn't.
  335. *
  336. * Revision 1.1  2003/03/10 16:39:09  ucko
  337. * Initial check-in of new flat-file generator
  338. *
  339. *
  340. * ===========================================================================
  341. */