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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbsource_item.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:44:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dbsource_item.cpp,v 1000.1 2004/06/01 19:44:02 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:  Mati Shomrat, NCBI
  35. *
  36. * File Description:
  37. *
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <corelib/ncbiutil.hpp>
  42. #include <objects/general/Dbtag.hpp>
  43. #include <objects/general/Date.hpp>
  44. #include <objects/general/Object_id.hpp>
  45. #include <objects/seqblock/PIR_block.hpp>
  46. #include <objects/seqblock/PRF_block.hpp>
  47. #include <objects/seqblock/PRF_ExtraSrc.hpp>
  48. #include <objects/seqblock/PDB_block.hpp>
  49. #include <objects/seqblock/PDB_replace.hpp>
  50. #include <objects/seqblock/SP_block.hpp>
  51. #include <objects/seqloc/PDB_seq_id.hpp>
  52. #include <objects/seqloc/Textseq_id.hpp>
  53. #include <objects/seq/Bioseq.hpp>
  54. #include <objmgr/feat_ci.hpp>
  55. #include <objmgr/seqdesc_ci.hpp>
  56. #include <objmgr/util/sequence.hpp>
  57. #include <objtools/format/formatter.hpp>
  58. #include <objtools/format/text_ostream.hpp>
  59. #include <objtools/format/items/dbsource_item.hpp>
  60. #include <objtools/format/context.hpp>
  61. #include "utils.hpp"
  62. BEGIN_NCBI_SCOPE
  63. BEGIN_SCOPE(objects)
  64. USING_SCOPE(sequence);
  65. CDBSourceItem::CDBSourceItem(CBioseqContext& ctx) :
  66.     CFlatItem(&ctx)
  67. {
  68.     x_GatherInfo(ctx);
  69. }
  70. void CDBSourceItem::Format
  71. (IFormatter& formatter,
  72.  IFlatTextOStream& text_os) const
  73. {
  74.     formatter.FormatDBSource(*this, text_os);
  75. }
  76. inline
  77. static int s_ScoreForDBSource(const CRef<CSeq_id>& x) {
  78.     switch (x->Which()) {
  79.     case CSeq_id::e_not_set:                        return kMax_Int;
  80.     case CSeq_id::e_Gi:                             return 31;
  81.     case CSeq_id::e_Giim:                           return 30;
  82.     case CSeq_id::e_Local: case CSeq_id::e_General: return 20;
  83.     case CSeq_id::e_Other:                          return 18;
  84.     case CSeq_id::e_Gibbmt:                         return 16;
  85.     case CSeq_id::e_Gibbsq: case CSeq_id::e_Patent: return 15;
  86.     case CSeq_id::e_Pdb:                            return 12;
  87.     default:                                        return 10;
  88.     }
  89. }
  90. void CDBSourceItem::x_GatherInfo(CBioseqContext& ctx)
  91. {
  92.     const CBioseq::TId& ids = ctx.GetBioseqIds();
  93.     CConstRef<CSeq_id> id = FindBestChoice(ids, s_ScoreForDBSource);
  94.     if ( !id ) {
  95.         m_DBSource.push_back("UNKNOWN");
  96.         return;
  97.     }
  98.     switch ( id->Which() ) {
  99.     case CSeq_id::e_Pir:
  100.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  101.         x_AddPIRBlock(ctx);
  102.         break;
  103.     case CSeq_id::e_Swissprot:
  104.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  105.         x_AddSPBlock(ctx);
  106.         break;
  107.     case CSeq_id::e_Prf:
  108.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  109.         x_AddPRFBlock(ctx);
  110.         break;
  111.     case CSeq_id::e_Pdb:
  112.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  113.         x_AddPDBBlock(ctx);
  114.         break;
  115.     case CSeq_id::e_General:
  116.         if ( !NStr::StartsWith(id->GetGeneral().GetDb(), "PID") ) {
  117.             m_DBSource.push_back("UNKNOWN");
  118.             break;
  119.         }
  120.         // otherwise, fall through
  121.     case CSeq_id::e_Gibbsq: case CSeq_id::e_Gibbmt: case CSeq_id::e_Giim:
  122.     case CSeq_id::e_Genbank: case CSeq_id::e_Embl: case CSeq_id::e_Other:
  123.     case CSeq_id::e_Gi: case CSeq_id::e_Ddbj:
  124.     case CSeq_id::e_Tpg: case CSeq_id::e_Tpe: case CSeq_id::e_Tpd:
  125.     {
  126.         set<CBioseq_Handle> sources;
  127.         CScope& scope = ctx.GetScope();
  128.         const CSeq_feat* feat = GetCDSForProduct(ctx.GetHandle());
  129.         if ( feat == 0 ) {
  130.             // may also be protein product of mature peptide feature
  131.             feat = GetPROTForProduct(ctx.GetHandle());
  132.         }
  133.         if ( feat != 0 ) {
  134.             const CSeq_loc& loc = feat->GetLocation();
  135.             CBioseq_Handle nuc = scope.GetBioseqHandle(loc);
  136.             if ( nuc ) {
  137.                 for ( CSeq_loc_CI li(loc); li; ++li ) {
  138.                     CBioseq_Handle bsh = scope.GetBioseqHandle(li.GetSeq_id());
  139.                     if ( bsh ) {
  140.                         sources.insert(bsh);
  141.                     }
  142.                 }
  143.             }
  144.         }
  145.         ITERATE (set<CBioseq_Handle>, it, sources) {
  146.             CConstRef<CSeq_id> id2 = FindBestChoice(it->GetBioseqCore()->GetId(),
  147.                 s_ScoreForDBSource);
  148.             if ( id2 != 0 ) {
  149.                 string str = x_FormatDBSourceID(*id2);
  150.                 if ( !str.empty() ) {
  151.                     m_DBSource.push_back(str);
  152.                 }
  153.             }
  154.         }
  155.         if ( sources.empty() ) {
  156.             m_DBSource.push_back(x_FormatDBSourceID(*id));
  157.         }
  158.         break;
  159.     }
  160.     default:
  161.         m_DBSource.push_back("UNKNOWN");
  162.     }
  163. }
  164. void CDBSourceItem::x_AddPIRBlock(CBioseqContext& ctx)
  165. {
  166.     CSeqdesc_CI dsc(ctx.GetHandle(), CSeqdesc::e_Pir);
  167.     if ( !dsc ) {
  168.         return;
  169.     }
  170.     x_SetObject(*dsc);
  171.     const CPIR_block& pir = dsc->GetPir();
  172.     if (pir.CanGetHost()) {
  173.         m_DBSource.push_back("host: " + pir.GetHost());
  174.     }
  175.     if (pir.CanGetSource()) {
  176.         m_DBSource.push_back("source: " + pir.GetSource());
  177.     }
  178.     if (pir.CanGetSummary()) {
  179.         m_DBSource.push_back("summary: " + pir.GetSummary());
  180.     }
  181.     if (pir.CanGetGenetic()) {
  182.         m_DBSource.push_back("genetic: " + pir.GetGenetic());
  183.     }
  184.     if (pir.CanGetIncludes()) {
  185.         m_DBSource.push_back("includes: " + pir.GetIncludes());
  186.     }
  187.     if (pir.CanGetPlacement()) {
  188.         m_DBSource.push_back("placement: " + pir.GetPlacement());
  189.     }
  190.     if (pir.CanGetSuperfamily()) {
  191.         m_DBSource.push_back("superfamily: " + pir.GetSuperfamily());
  192.     }
  193.     if (pir.CanGetCross_reference()) {
  194.         m_DBSource.push_back("xref: " + pir.GetCross_reference());
  195.     }
  196.     if (pir.CanGetDate()) {
  197.         m_DBSource.push_back("PIR dates: " + pir.GetDate());
  198.     }
  199.     if (pir.GetHad_punct()) {
  200.         m_DBSource.push_back("punctuation in sequence");
  201.     }
  202.     if (pir.CanGetSeqref()) {
  203.         list<string> xrefs;
  204.         ITERATE (CPIR_block::TSeqref, it, pir.GetSeqref()) {
  205.             const char* type = 0;
  206.             switch ((*it)->Which()) {
  207.             case CSeq_id::e_Genbank:    type = "genbank ";    break;
  208.             case CSeq_id::e_Embl:       type = "embl ";       break;
  209.             case CSeq_id::e_Pir:        type = "pir ";        break;
  210.             case CSeq_id::e_Swissprot:  type = "swissprot ";  break;
  211.             case CSeq_id::e_Gi:         type = "gi: ";        break;
  212.             case CSeq_id::e_Ddbj:       type = "ddbj ";       break;
  213.             case CSeq_id::e_Prf:        type = "prf ";        break;
  214.             default:                    break;
  215.             }
  216.             if (type) {
  217.                 xrefs.push_back(type + (*it)->GetSeqIdString(true));
  218.             }
  219.         }
  220.         if ( !xrefs.empty() ) {
  221.             m_DBSource.push_back("xrefs: " + NStr::Join(xrefs, ", "));
  222.         }
  223.     }
  224.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  225.         // The C version puts newlines before these for some reason
  226.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  227.     }
  228. }
  229. void CDBSourceItem::x_AddSPBlock(CBioseqContext& ctx)
  230. {
  231.     CSeqdesc_CI dsc(ctx.GetHandle(), CSeqdesc::e_Sp);
  232.     if ( !dsc ) {
  233.         return;
  234.     }
  235.     x_SetObject(*dsc);
  236.     const CSP_block& sp = dsc->GetSp();
  237.     switch (sp.GetClass()) {
  238.     case CSP_block::eClass_standard:
  239.         m_DBSource.push_back("class: standard.");
  240.         break;
  241.     case CSP_block::eClass_prelim:
  242.         m_DBSource.push_back("class: preliminary.");
  243.         break;
  244.     default:
  245.         break;
  246.     }
  247.     // laid out slightly differently from the C version, but I think that's
  248.     // a bug in the latter (which runs some things together)
  249.     if (sp.CanGetExtra_acc()  &&  !sp.GetExtra_acc().empty() ) {
  250.         m_DBSource.push_back("extra_accessions:"
  251.                              + NStr::Join(sp.GetExtra_acc(), ","));
  252.     }
  253.     if (sp.GetImeth()) {
  254.         m_DBSource.push_back("seq starts with Met");
  255.     }
  256.     if (sp.CanGetPlasnm()  &&  !sp.GetPlasnm().empty() ) {
  257.         m_DBSource.push_back("plasmid:" + NStr::Join(sp.GetPlasnm(), ","));
  258.     }
  259.     if (sp.CanGetCreated()) {
  260.         string s("created: ");
  261.         sp.GetCreated().GetDate(&s, "%3N %D %Y");
  262.         m_DBSource.push_back(s + '.');
  263.     }
  264.     if (sp.CanGetSequpd()) {
  265.         string s("sequence updated: ");
  266.         sp.GetSequpd().GetDate(&s, "%3N %D %Y");
  267.         m_DBSource.push_back(s + '.');
  268.     }
  269.     if (sp.CanGetAnnotupd()) {
  270.         string s("annotation updated: ");
  271.         sp.GetAnnotupd().GetDate(&s, "%3N %D %Y");
  272.         m_DBSource.push_back(s + '.');
  273.     }
  274.     if (sp.CanGetSeqref()  &&  !sp.GetSeqref().empty() ) {
  275.         list<string> xrefs;
  276.         ITERATE (CSP_block::TSeqref, it, sp.GetSeqref()) {
  277.             const char* s = 0;
  278.             switch ((*it)->Which()) {
  279.             case CSeq_id::e_Genbank:  s = "genbank accession ";          break;
  280.             case CSeq_id::e_Embl:     s = "embl accession ";             break;
  281.             case CSeq_id::e_Pir:      s = "pir locus ";                  break;
  282.             case CSeq_id::e_Swissprot: s = "swissprot accession ";       break;
  283.             case CSeq_id::e_Gi:       s = "gi: ";                        break;
  284.             case CSeq_id::e_Ddbj:     s = "ddbj accession ";             break;
  285.             case CSeq_id::e_Prf:      s = "prf accession ";              break;
  286.             case CSeq_id::e_Pdb:      s = "pdb accession ";              break;
  287.             case CSeq_id::e_Tpg:   s = "genbank third party accession "; break;
  288.             case CSeq_id::e_Tpe:      s = "embl third party accession "; break;
  289.             case CSeq_id::e_Tpd:      s = "ddbj third party accession "; break;
  290.             default:                  break;
  291.             }
  292.             if ( s ) {
  293.                 string acc = (*it)->GetSeqIdString(true);
  294.                 xrefs.push_back(s + acc);
  295.             }
  296.         }
  297.         if ( !xrefs.empty() ) {
  298.             m_DBSource.push_back("xrefs: " + NStr::Join(xrefs, ", "));
  299.         }
  300.     }
  301.     if (sp.CanGetDbref()  &&  !sp.GetDbref().empty() ) {
  302.         list<string> xrefs;
  303.         ITERATE (CSP_block::TDbref, it, sp.GetDbref()) {
  304.             const CObject_id& tag = (*it)->GetTag();
  305.             string id = (tag.IsStr() ? tag.GetStr()
  306.                                      : NStr::IntToString(tag.GetId()));
  307.             if ((*it)->GetDb() == "MIM") {
  308.                 xrefs.push_back
  309.                     ("MIM <a href=""
  310.                      "http://www.ncbi.nlm.nih.gov/entrez/dispomim.cgi?id=" + id
  311.                      + "">" + id + "</a>");
  312.             } else {
  313.                 xrefs.push_back((*it)->GetDb() + id); // no space(!)
  314.             }
  315.         }
  316.         m_DBSource.push_back
  317.             ("xrefs (non-sequence databases): " + NStr::Join(xrefs, ", "));
  318.     }
  319. }
  320. void CDBSourceItem::x_AddPRFBlock(CBioseqContext& ctx)
  321. {
  322.     CSeqdesc_CI dsc(ctx.GetHandle(), CSeqdesc::e_Prf);
  323.     if ( !dsc ) {
  324.         return;
  325.     }
  326.     x_SetObject(*dsc);
  327.     const CPRF_block& prf = dsc->GetPrf();
  328.     if (prf.CanGetExtra_src()) {
  329.         const CPRF_ExtraSrc& es = prf.GetExtra_src();
  330.         if (es.CanGetHost()) {
  331.             m_DBSource.push_back("host: " + es.GetHost());
  332.         }
  333.         if (es.CanGetPart()) {
  334.             m_DBSource.push_back("part: " + es.GetPart());
  335.         }
  336.         if (es.CanGetState()) {
  337.             m_DBSource.push_back("state: " + es.GetState());
  338.         }
  339.         if (es.CanGetStrain()) {
  340.             m_DBSource.push_back("strain: " + es.GetStrain());
  341.         }
  342.         if (es.CanGetTaxon()) {
  343.             m_DBSource.push_back("taxonomy: " + es.GetTaxon());
  344.         }
  345.     }
  346.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  347.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  348.     }
  349. }
  350. void CDBSourceItem::x_AddPDBBlock(CBioseqContext& ctx)
  351. {
  352.     CSeqdesc_CI dsc(ctx.GetHandle(), CSeqdesc::e_Pdb);
  353.     if ( !dsc ) {
  354.         return;
  355.     }
  356.     x_SetObject(*dsc);
  357.     const CPDB_block& pdb = dsc->GetPdb();
  358.     {{
  359.         string s("deposition: ");
  360.         DateToString(pdb.GetDeposition(), s);
  361.         m_DBSource.push_back(s);
  362.     }}
  363.     m_DBSource.push_back("class: " + pdb.GetClass());
  364.     if (!pdb.GetSource().empty() ) {
  365.         m_DBSource.push_back("source: " + NStr::Join(pdb.GetSource(), ", "));
  366.     }
  367.     if (pdb.CanGetExp_method()) {
  368.         m_DBSource.push_back("Exp. method: " + pdb.GetExp_method());
  369.     }
  370.     if (pdb.CanGetReplace()) {
  371.         const CPDB_replace& rep = pdb.GetReplace();
  372.         if ( !rep.GetIds().empty() ) {
  373.             m_DBSource.push_back
  374.                 ("ids replaced: " + NStr::Join(pdb.GetSource(), ", "));
  375.         }
  376.         string s("replacement date: ");
  377.         DateToString(rep.GetDate(), s);
  378.         m_DBSource.push_back(s);
  379.     }
  380.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  381.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  382.     }
  383. }
  384. string CDBSourceItem::x_FormatDBSourceID(const CSeq_id& id) {
  385.     switch ( id.Which() ) {
  386.     case CSeq_id::e_Local:
  387.         {{
  388.             const CObject_id& oi = id.GetLocal();
  389.             return (oi.IsStr() ? oi.GetStr() : NStr::IntToString(oi.GetId()));
  390.         }}
  391.     case CSeq_id::e_Gi:
  392.         {{
  393.             return "gi: " + NStr::IntToString(id.GetGi());
  394.         }}
  395.     case CSeq_id::e_Pdb:
  396.         {{
  397.             const CPDB_seq_id& pdb = id.GetPdb();
  398.             string s("pdb: "), sep;
  399.             if ( !pdb.GetMol().Get().empty() ) {
  400.                 s += "molecule " + pdb.GetMol().Get();
  401.                 sep = ",";
  402.             }
  403.             if (pdb.GetChain() > 0) {
  404.                 s += sep + "chain " + NStr::IntToString(pdb.GetChain());
  405.                 sep = ",";
  406.             }
  407.             if (pdb.CanGetRel()) {
  408.                 s += sep + "release ";
  409.                 DateToString(pdb.GetRel(), s);
  410.                 sep = ",";
  411.             }
  412.             return s;
  413.         }}
  414.     default:
  415.         {{
  416.             const CTextseq_id* tsid = id.GetTextseq_Id();
  417.             if ( !tsid ) {
  418.                 return kEmptyStr;
  419.             }
  420.             string s, sep, comma;
  421.             switch (id.Which()) {
  422.             case CSeq_id::e_Embl:       s = "embl ";        comma = ",";  break;
  423.             case CSeq_id::e_Other:      s = "REFSEQ: ";                   break;
  424.             case CSeq_id::e_Swissprot:  s = "swissprot: ";  comma = ",";  break;
  425.             case CSeq_id::e_Pir:        s = "pir: ";                      break;
  426.             case CSeq_id::e_Prf:        s = "prf: ";                      break;
  427.             default:                    break;
  428.             }
  429.             if ( tsid->CanGetName() ) {
  430.                 s += "locus " + tsid->GetName();
  431.                 sep = " ";
  432.             } else {
  433.                 comma.erase();
  434.             }
  435.             if (tsid->CanGetAccession()) {
  436.                 string acc = tsid->GetAccession();
  437.                 if (tsid->CanGetVersion()) {
  438.                     acc += '.' + NStr::IntToString(tsid->GetVersion());
  439.                 }
  440.                 s += comma + sep + "accession " + acc;
  441.                 sep = " ";
  442.             }
  443.             if (tsid->CanGetRelease()) {
  444.                 s += sep + "release " + tsid->GetRelease();
  445.             }
  446.             if (id.IsSwissprot()) {
  447.                 s += ';';
  448.             }
  449.             return s;
  450.         }}
  451.     }
  452. }
  453. END_SCOPE(objects)
  454. END_NCBI_SCOPE
  455. /*
  456. * ===========================================================================
  457. *
  458. * $Log: dbsource_item.cpp,v $
  459. * Revision 1000.1  2004/06/01 19:44:02  gouriano
  460. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  461. *
  462. * Revision 1.6  2004/05/21 21:42:54  gorelenk
  463. * Added PCH ncbi_pch.hpp
  464. *
  465. * Revision 1.5  2004/04/22 15:55:04  shomrat
  466. * Changes in context
  467. *
  468. * Revision 1.4  2004/03/25 20:36:31  shomrat
  469. * Use handles
  470. *
  471. * Revision 1.3  2004/03/16 19:07:25  vasilche
  472. * Use CConstRef<CSeq_id> to store returned CConstRef<CSeq_id>.
  473. *
  474. * Revision 1.2  2003/12/18 17:43:32  shomrat
  475. * context.hpp moved
  476. *
  477. * Revision 1.1  2003/12/17 20:19:33  shomrat
  478. * Initial Revision (adapted from flat lib)
  479. *
  480. *
  481. * ===========================================================================
  482. */