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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_head.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:43:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_head.cpp,v 1000.2 2004/06/01 19:43:17 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 -- representation of "header"
  38. *   data, which translates into a format-dependent sequence of paragraphs.
  39. *
  40. * ===========================================================================
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <objtools/flat/flat_head.hpp>
  44. #include <corelib/ncbiutil.hpp>
  45. #include <serial/iterator.hpp>
  46. #include <objects/general/Dbtag.hpp>
  47. #include <objects/general/Object_id.hpp>
  48. #include <objects/seq/Bioseq.hpp>
  49. #include <objects/seqblock/GB_block.hpp>
  50. #include <objects/seqblock/PDB_block.hpp>
  51. #include <objects/seqblock/PDB_replace.hpp>
  52. #include <objects/seqblock/PIR_block.hpp>
  53. #include <objects/seqblock/PRF_ExtraSrc.hpp>
  54. #include <objects/seqblock/PRF_block.hpp>
  55. #include <objects/seqblock/SP_block.hpp>
  56. #include <objects/seqfeat/OrgName.hpp>
  57. #include <objects/seqloc/PDB_mol_id.hpp>
  58. #include <objects/seqloc/PDB_seq_id.hpp>
  59. #include <objects/seqloc/Textseq_id.hpp>
  60. #include <objmgr/bioseq_handle.hpp>
  61. #include <objmgr/feat_ci.hpp>
  62. #include <objmgr/scope.hpp>
  63. #include <objmgr/seqdesc_ci.hpp>
  64. #include <objmgr/util/sequence.hpp>
  65. BEGIN_NCBI_SCOPE
  66. BEGIN_SCOPE(objects)
  67. inline
  68. void CFlatHead::x_AddDate(const CDate& date)
  69. {
  70.     if (m_UpdateDate.Empty()
  71.         ||  date.Compare(*m_UpdateDate) == CDate::eCompare_after) {
  72.         m_UpdateDate = &date;
  73.     }
  74.     if (m_CreateDate.Empty()
  75.         ||  date.Compare(*m_CreateDate) == CDate::eCompare_before) {
  76.         m_CreateDate = &date;
  77.     }
  78. }
  79. CFlatHead::CFlatHead(CFlatContext& ctx)
  80.     : m_Strandedness(CSeq_inst::eStrand_not_set),
  81.       m_Topology    (CSeq_inst::eTopology_not_set),
  82.       m_GBDivision  (0),
  83.       m_Context     (&ctx)
  84. {
  85.     CScope&                     scope = ctx.GetHandle().GetScope();
  86.     CBioseq_Handle::TBioseqCore seq   = ctx.GetHandle().GetBioseqCore();
  87.     ctx.m_PrimaryID = FindBestChoice(seq->GetId(), CSeq_id::Score);
  88.     ctx.m_Accession = ctx.GetPrimaryID().GetSeqIdString(true);
  89.     {{
  90.         const CTextseq_id* tsid = ctx.GetPrimaryID().GetTextseq_Id();
  91.         if (tsid  &&  tsid->IsSetName()) {
  92.             m_Locus = tsid->GetName();
  93.         } else if (tsid  &&  tsid->IsSetAccession()) {
  94.             m_Locus = tsid->GetAccession();
  95.         } else {
  96.             // complain?
  97.             m_Locus = ctx.GetPrimaryID().GetSeqIdString(false);
  98.         }
  99.     }}
  100.     ITERATE (CBioseq::TId, it, seq->GetId()) {
  101.         if (*it != &ctx.GetPrimaryID()) {
  102.             m_OtherIDs.push_back(*it);
  103.         }
  104.         switch ((*it)->Which()) {
  105.         case CSeq_id::e_Gi:
  106.             ctx.m_GI = (*it)->GetGi();
  107.             break;
  108.         case CSeq_id::e_Other:
  109.             ctx.m_IsRefSeq = true;
  110.             break;
  111.         case CSeq_id::e_Tpg: case CSeq_id::e_Tpe: case CSeq_id::e_Tpd:
  112.             ctx.m_IsTPA = true;
  113.             break;
  114.         default:
  115.             break;
  116.         }
  117.         CSeq_id::EAccessionInfo ai = (*it)->IdentifyAccession();
  118.         if ((ai & CSeq_id::eAcc_division_mask) == CSeq_id::eAcc_wgs
  119.             &&  NStr::EndsWith((*it)->GetTextseq_Id()->GetAccession(),
  120.                                "000000")) {
  121.             ctx.m_IsWGSMaster = true;
  122.         } else if (ai == CSeq_id::eAcc_refseq_genome) {
  123.             ctx.m_IsRefSeqGenome = true;
  124.         }
  125.     }
  126.     {{
  127.         const CSeq_inst& inst = seq->GetInst();
  128.         if (inst.IsSetStrand()) {
  129.             m_Strandedness = inst.GetStrand();
  130.         }
  131.         m_Topology     = inst.GetTopology();
  132.     }}
  133.     ctx.m_Length = sequence::GetLength(ctx.GetLocation(), &scope);
  134.     m_Definition = sequence::GetTitle(ctx.GetHandle());
  135.     if ( !NStr::EndsWith(m_Definition, ".") ) {
  136.         m_Definition += '.';
  137.     }
  138.     if (ctx.IsProt()) { // populate m_SourceIDs
  139.         x_AddDBSource();
  140.     }
  141.     for (CSeqdesc_CI it(ctx.GetHandle());  it;  ++it) {
  142.         switch (it->Which()) {
  143.             // bother translating old GIBB-* data?
  144.         case CSeqdesc::e_Org:
  145.         case CSeqdesc::e_Source:
  146.             if ( !m_GBDivision ) {
  147.                 // iterate to deal with hybrids
  148.                 for (CTypeConstIterator<COrgName> orgn(*it);  orgn;  ++orgn) {
  149.                     if (orgn->IsSetDiv()) {
  150.                         m_GBDivision = &orgn->GetDiv();
  151.                         BREAK(orgn);
  152.                     }
  153.                 }
  154.             }
  155.             break;
  156.         case CSeqdesc::e_Genbank:
  157.         {
  158.             const CGB_block& gb = it->GetGenbank();
  159.             if (gb.IsSetExtra_accessions()) {
  160.                 m_SecondaryIDs.insert(m_SecondaryIDs.end(),
  161.                                       gb.GetExtra_accessions().begin(),
  162.                                       gb.GetExtra_accessions().end());
  163.             }
  164.             if (gb.IsSetEntry_date()) {
  165.                 x_AddDate(gb.GetEntry_date());
  166.             }
  167.             if (gb.IsSetDiv()) {
  168.                 m_GBDivision = &gb.GetDiv();
  169.             }
  170.             break;
  171.         }
  172.         case CSeqdesc::e_Sp:
  173.         {
  174.             const CSP_block& sp = it->GetSp();
  175.             if (sp.IsSetExtra_acc()) {
  176.                 m_SecondaryIDs.insert(m_SecondaryIDs.end(),
  177.                                       sp.GetExtra_acc().begin(),
  178.                                       sp.GetExtra_acc().end());
  179.             }
  180.             if (sp.IsSetCreated()) {
  181.                 x_AddDate(sp.GetCreated());
  182.             }
  183.             if (sp.IsSetSequpd()) {
  184.                 x_AddDate(sp.GetSequpd());
  185.             }
  186.             if (sp.IsSetAnnotupd()) {
  187.                 x_AddDate(sp.GetAnnotupd());
  188.             }
  189.             break;
  190.         }
  191.         case CSeqdesc::e_Embl:
  192.         {
  193.             const CEMBL_block& embl = it->GetEmbl();
  194.             if (embl.IsSetDiv()) {
  195.                 m_EMBLDivision = embl.GetDiv();
  196.             }
  197.             x_AddDate(embl.GetCreation_date()); // mandatory field
  198.             x_AddDate(embl.GetUpdate_date()); // mandatory field
  199.             if (embl.IsSetExtra_acc()) {
  200.                 m_SecondaryIDs.insert(m_SecondaryIDs.end(),
  201.                                       embl.GetExtra_acc().begin(),
  202.                                       embl.GetExtra_acc().end());
  203.             }
  204.             break;
  205.         }
  206.         case CSeqdesc::e_Create_date:
  207.             x_AddDate(it->GetCreate_date());
  208.             break;
  209.         case CSeqdesc::e_Update_date:
  210.             x_AddDate(it->GetUpdate_date());
  211.             break;
  212.         case CSeqdesc::e_Pdb:
  213.         {
  214.             const CPDB_block& pdb = it->GetPdb();
  215.             x_AddDate(pdb.GetDeposition()); // mandatory field
  216.             // replacement history -> secondary IDs?
  217.             break;
  218.         }
  219.         case CSeqdesc::e_Molinfo:
  220.         {
  221.             const CMolInfo& mi = it->GetMolinfo();
  222.             if (mi.IsSetBiomol()) {
  223.                 ctx.m_Biomol = mi.GetBiomol();
  224.             }
  225.         }
  226.         default:
  227.             break;
  228.         }
  229.     }
  230. }
  231. const char* CFlatHead::GetMolString(void) const
  232. {
  233.     const IFlatFormatter& f = m_Context->GetFormatter();
  234.     if (f.GetDatabase() == IFlatFormatter::eDB_EMBL
  235.         &&  f.GetMode() <= IFlatFormatter::eMode_Entrez) {
  236.         switch (m_Context->GetBiomol()) {
  237.         case CMolInfo::eBiomol_genomic:
  238.         case CMolInfo::eBiomol_other_genetic:
  239.         case CMolInfo::eBiomol_genomic_mRNA:
  240.             return "DNA";
  241.         case CMolInfo::eBiomol_pre_RNA:
  242.         case CMolInfo::eBiomol_mRNA:
  243.         case CMolInfo::eBiomol_rRNA:
  244.         case CMolInfo::eBiomol_tRNA:
  245.         case CMolInfo::eBiomol_snRNA:
  246.         case CMolInfo::eBiomol_scRNA:
  247.         case CMolInfo::eBiomol_cRNA:
  248.         case CMolInfo::eBiomol_snoRNA:
  249.         case CMolInfo::eBiomol_transcribed_RNA:
  250.             return "RNA";
  251.         case CMolInfo::eBiomol_peptide:
  252.             return "AA ";
  253.         default:
  254.             switch (m_Context->GetMol()) {
  255.             case CSeq_inst::eMol_dna: return "DNA";
  256.             case CSeq_inst::eMol_rna: return "RNA";
  257.             case CSeq_inst::eMol_aa:  return "AA ";
  258.             default:                  return "xxx";
  259.             }
  260.         }
  261.     } else {
  262.         switch (m_Context->GetBiomol()) {
  263.         case CMolInfo::eBiomol_genomic:          return "DNA";
  264.         case CMolInfo::eBiomol_pre_RNA:          return "RNA";
  265.         case CMolInfo::eBiomol_mRNA:             return "mRNA";
  266.         case CMolInfo::eBiomol_rRNA:             return "rRNA";
  267.         case CMolInfo::eBiomol_tRNA:             return "tRNA";
  268.         case CMolInfo::eBiomol_snRNA:            return "uRNA";
  269.         case CMolInfo::eBiomol_scRNA:            return "scRNA";
  270.         case CMolInfo::eBiomol_peptide:          return " AA";
  271.         case CMolInfo::eBiomol_other_genetic:    return "DNA";
  272.         case CMolInfo::eBiomol_genomic_mRNA:     return "DNA";
  273.         case CMolInfo::eBiomol_cRNA:             return "RNA";
  274.         case CMolInfo::eBiomol_snoRNA:           return "snoRNA";
  275.         case CMolInfo::eBiomol_transcribed_RNA:  return "RNA";
  276.         default:
  277.             switch (m_Context->GetMol()) {
  278.             case CSeq_inst::eMol_dna: return "DNA";
  279.             case CSeq_inst::eMol_rna: return "RNA";
  280.             case CSeq_inst::eMol_aa:  return " AA";
  281.             default:                  return "   ";
  282.             }
  283.         }
  284.     }
  285. }
  286. inline
  287. static int s_ScoreForDBSource(const CRef<CSeq_id>& x) {
  288.     switch (x->Which()) {
  289.     case CSeq_id::e_not_set:                        return kMax_Int;
  290.     case CSeq_id::e_Gi:                             return 31;
  291.     case CSeq_id::e_Giim:                           return 30;
  292.     case CSeq_id::e_Local: case CSeq_id::e_General: return 20;
  293.     case CSeq_id::e_Other:                          return 18;
  294.     case CSeq_id::e_Gibbmt:                         return 16;
  295.     case CSeq_id::e_Gibbsq: case CSeq_id::e_Patent: return 15;
  296.     case CSeq_id::e_Pdb:                            return 12;
  297.     default:                                        return 10;
  298.     }
  299. }
  300. void CFlatHead::x_AddDBSource(void)
  301. {
  302.     CBioseq_Handle::TBioseqCore seq = m_Context->GetHandle().GetBioseqCore();
  303.     const CSeq_id* id = FindBestChoice(seq->GetId(), s_ScoreForDBSource);
  304.     if ( !id ) {
  305.         m_DBSource.push_back("UNKNOWN");
  306.         return;
  307.     }
  308.     switch (id->Which()) {
  309.     case CSeq_id::e_Pir:
  310.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  311.         x_AddPIRBlock();
  312.         break;
  313.     case CSeq_id::e_Swissprot:
  314.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  315.         x_AddSPBlock();
  316.         break;
  317.     case CSeq_id::e_Prf:
  318.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  319.         x_AddPRFBlock();
  320.         break;
  321.     case CSeq_id::e_Pdb:
  322.         m_DBSource.push_back(x_FormatDBSourceID(*id));
  323.         x_AddPDBBlock();
  324.         break;
  325.     case CSeq_id::e_General:
  326.         if ( !NStr::StartsWith(id->GetGeneral().GetDb(), "PID") ) {
  327.             m_DBSource.push_back("UNKNOWN");
  328.             break;
  329.         }
  330.         // otherwise, fall through
  331.     case CSeq_id::e_Gibbsq: case CSeq_id::e_Gibbmt: case CSeq_id::e_Giim:
  332.     case CSeq_id::e_Genbank: case CSeq_id::e_Embl: case CSeq_id::e_Other:
  333.     case CSeq_id::e_Gi: case CSeq_id::e_Ddbj:
  334.     case CSeq_id::e_Tpg: case CSeq_id::e_Tpe: case CSeq_id::e_Tpd:
  335.     {
  336.         set<CBioseq_Handle> sources;
  337.         CScope&             scope = m_Context->GetHandle().GetScope();
  338.         for (CFeat_CI it(scope, m_Context->GetLocation(),
  339.                          CSeqFeatData::e_not_set,
  340.                          SAnnotSelector::eOverlap_Intervals,
  341.                          SAnnotSelector::eResolve_TSE, CFeat_CI::e_Product);
  342.              it;  ++it) {
  343.             for (CTypeConstIterator<CSeq_id> id2(it->GetLocation());
  344.                  id2;  ++id2) {
  345.                 sources.insert(scope.GetBioseqHandle(*id2));
  346.             }
  347.         }
  348.         ITERATE (set<CBioseq_Handle>, it, sources) {
  349.             m_DBSource.push_back(x_FormatDBSourceID
  350.                                  (*FindBestChoice(it->GetBioseqCore()->GetId(),
  351.                                                   s_ScoreForDBSource)));
  352.         }
  353.         if (sources.empty()) {
  354.             m_DBSource.push_back(x_FormatDBSourceID(*id));
  355.         }
  356.         break;
  357.     }
  358.     default:
  359.         m_DBSource.push_back("UNKNOWN");
  360.     }
  361. }
  362. string CFlatHead::x_FormatDBSourceID(const CSeq_id& id) {
  363.     switch (id.Which()) {
  364.     case CSeq_id::e_Local:
  365.     {
  366.         const CObject_id& oi = id.GetLocal();
  367.         return (oi.IsStr() ? oi.GetStr() : NStr::IntToString(oi.GetId()));
  368.     }
  369.     case CSeq_id::e_Gi:
  370.         return "gi: " + NStr::IntToString(id.GetGi());
  371.     case CSeq_id::e_Pdb:
  372.     {
  373.         const CPDB_seq_id& pdb = id.GetPdb();
  374.         string s("pdb: "), sep;
  375.         if ( !pdb.GetMol().Get().empty() ) {
  376.             s += "molecule " + pdb.GetMol().Get();
  377.             sep = ",";
  378.         }
  379.         if (pdb.GetChain() > 0) {
  380.             s += sep + "chain " + NStr::IntToString(pdb.GetChain());
  381.             sep = ",";
  382.         }
  383.         if (pdb.IsSetRel()) {
  384.             s += sep + "release ";
  385.             m_Context->GetFormatter().FormatDate(pdb.GetRel(), s);
  386.             sep = ",";
  387.         }
  388.         return s;
  389.     }
  390.     default:
  391.     {
  392.         const CTextseq_id* tsid = id.GetTextseq_Id();
  393.         if ( !tsid ) {
  394.             return kEmptyStr;
  395.         }
  396.         string s, sep, comma;
  397.         switch (id.Which()) {
  398.         case CSeq_id::e_Embl:       s = "embl ";        comma = ",";  break;
  399.         case CSeq_id::e_Other:      s = "REFSEQ: ";                   break;
  400.         case CSeq_id::e_Swissprot:  s = "swissprot: ";  comma = ",";  break;
  401.         case CSeq_id::e_Pir:        s = "pir: ";                      break;
  402.         case CSeq_id::e_Prf:        s = "prf: ";                      break;
  403.         default:                    break;
  404.         }
  405.         if (tsid->IsSetName()) {
  406.             s += "locus " + tsid->GetName();
  407.             sep = " ";
  408.         } else {
  409.             comma.erase();
  410.         }
  411.         if (tsid->IsSetAccession()) {
  412.             string acc = tsid->GetAccession();
  413.             if (tsid->IsSetVersion()) {
  414.                 acc += '.' + NStr::IntToString(tsid->GetVersion());
  415.             }
  416.             s += comma + sep + "accession "
  417.                 + m_Context->GetFormatter().GetAccnLink(acc);
  418.             sep = " ";
  419.         }
  420.         if (tsid->IsSetRelease()) {
  421.             s += sep + "release " + tsid->GetRelease();
  422.         }
  423.         if (id.IsSwissprot()) {
  424.             s += ';';
  425.         }
  426.         return s;
  427.     }
  428.     }
  429. }
  430. void CFlatHead::x_AddPIRBlock(void)
  431. {
  432.     for (CSeqdesc_CI dsc(m_Context->GetHandle(), CSeqdesc::e_Pir);
  433.          dsc;  ++dsc) {
  434.         m_ProteinBlock = &*dsc;
  435.         break;
  436.     }
  437.     if ( !m_ProteinBlock ) {
  438.         return;
  439.     }
  440.     const CPIR_block& pir = m_ProteinBlock->GetPir();
  441.     if (pir.IsSetHost()) {
  442.         m_DBSource.push_back("host: " + pir.GetHost());
  443.     }
  444.     if (pir.IsSetSource()) {
  445.         m_DBSource.push_back("source: " + pir.GetSource());
  446.     }
  447.     if (pir.IsSetSummary()) {
  448.         m_DBSource.push_back("summary: " + pir.GetSummary());
  449.     }
  450.     if (pir.IsSetGenetic()) {
  451.         m_DBSource.push_back("genetic: " + pir.GetGenetic());
  452.     }
  453.     if (pir.IsSetIncludes()) {
  454.         m_DBSource.push_back("includes: " + pir.GetIncludes());
  455.     }
  456.     if (pir.IsSetPlacement()) {
  457.         m_DBSource.push_back("placement: " + pir.GetPlacement());
  458.     }
  459.     if (pir.IsSetSuperfamily()) {
  460.         m_DBSource.push_back("superfamily: " + pir.GetSuperfamily());
  461.     }
  462.     if (pir.IsSetCross_reference()) {
  463.         m_DBSource.push_back("xref: " + pir.GetCross_reference());
  464.     }
  465.     if (pir.IsSetDate()) {
  466.         m_DBSource.push_back("PIR dates: " + pir.GetDate());
  467.     }
  468.     if (pir.GetHad_punct()) {
  469.         m_DBSource.push_back("punctuation in sequence");
  470.     }
  471.     if (pir.IsSetSeqref()) {
  472.         list<string> xrefs;
  473.         ITERATE (CPIR_block::TSeqref, it, pir.GetSeqref()) {
  474.             const char* type = 0;
  475.             switch ((*it)->Which()) {
  476.             case CSeq_id::e_Genbank:    type = "genbank ";    break;
  477.             case CSeq_id::e_Embl:       type = "embl ";       break;
  478.             case CSeq_id::e_Pir:        type = "pir ";        break;
  479.             case CSeq_id::e_Swissprot:  type = "swissprot ";  break;
  480.             case CSeq_id::e_Gi:         type = "gi: ";        break;
  481.             case CSeq_id::e_Ddbj:       type = "ddbj ";       break;
  482.             case CSeq_id::e_Prf:        type = "prf ";        break;
  483.             default:                    break;
  484.             }
  485.             if (type) {
  486.                 xrefs.push_back(type + (*it)->GetSeqIdString(true));
  487.             }
  488.         }
  489.         if ( !xrefs.empty() ) {
  490.             m_DBSource.push_back("xrefs: " + NStr::Join(xrefs, ", "));
  491.         }
  492.     }
  493.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  494.         // The C version puts newlines before these for some reason
  495.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  496.     }
  497. }
  498. void CFlatHead::x_AddSPBlock(void)
  499. {
  500.     for (CSeqdesc_CI dsc(m_Context->GetHandle(), CSeqdesc::e_Sp);
  501.          dsc;  ++dsc) {
  502.         m_ProteinBlock = &*dsc;
  503.         break;
  504.     }
  505.     if ( !m_ProteinBlock ) {
  506.         return;
  507.     }
  508.     const CSP_block& sp = m_ProteinBlock->GetSp();
  509.     switch (sp.GetClass()) {
  510.     case CSP_block::eClass_standard:
  511.         m_DBSource.push_back("class: standard.");
  512.         break;
  513.     case CSP_block::eClass_prelim:
  514.         m_DBSource.push_back("class: preliminary.");
  515.         break;
  516.     default:
  517.         break;
  518.     }
  519.     // laid out slightly differently from the C version, but I think that's
  520.     // a bug in the latter (which runs some things together)
  521.     if (sp.IsSetExtra_acc()  &&  !sp.GetExtra_acc().empty() ) {
  522.         m_DBSource.push_back("extra_accessions:"
  523.                              + NStr::Join(sp.GetExtra_acc(), ","));
  524.     }
  525.     if (sp.GetImeth()) {
  526.         m_DBSource.push_back("seq starts with Met");
  527.     }
  528.     if (sp.IsSetPlasnm()  &&  !sp.GetPlasnm().empty() ) {
  529.         m_DBSource.push_back("plasmid:" + NStr::Join(sp.GetPlasnm(), ","));
  530.     }
  531.     if (sp.IsSetCreated()) {
  532.         string s("created: ");
  533.         sp.GetCreated().GetDate(&s, "%3N %D %Y");
  534.         m_DBSource.push_back(s + '.');
  535.     }
  536.     if (sp.IsSetSequpd()) {
  537.         string s("sequence updated: ");
  538.         sp.GetSequpd().GetDate(&s, "%3N %D %Y");
  539.         m_DBSource.push_back(s + '.');
  540.     }
  541.     if (sp.IsSetAnnotupd()) {
  542.         string s("annotation updated: ");
  543.         sp.GetAnnotupd().GetDate(&s, "%3N %D %Y");
  544.         m_DBSource.push_back(s + '.');
  545.     }
  546.     if (sp.IsSetSeqref()  &&  !sp.GetSeqref().empty() ) {
  547.         list<string> xrefs;
  548.         ITERATE (CSP_block::TSeqref, it, sp.GetSeqref()) {
  549.             const char* s = 0;
  550.             switch ((*it)->Which()) {
  551.             case CSeq_id::e_Genbank:  s = "genbank accession ";          break;
  552.             case CSeq_id::e_Embl:     s = "embl accession ";             break;
  553.             case CSeq_id::e_Pir:      s = "pir locus ";                  break;
  554.             case CSeq_id::e_Swissprot: s = "swissprot accession ";       break;
  555.             case CSeq_id::e_Gi:       s = "gi: ";                        break;
  556.             case CSeq_id::e_Ddbj:     s = "ddbj accession ";             break;
  557.             case CSeq_id::e_Prf:      s = "prf accession ";              break;
  558.             case CSeq_id::e_Pdb:      s = "pdb accession ";              break;
  559.             case CSeq_id::e_Tpg:   s = "genbank third party accession "; break;
  560.             case CSeq_id::e_Tpe:      s = "embl third party accession "; break;
  561.             case CSeq_id::e_Tpd:      s = "ddbj third party accession "; break;
  562.             default:                  break;
  563.             }
  564.             if (s) {
  565.                 string acc = (*it)->GetSeqIdString(true);
  566.                 xrefs.push_back(s +m_Context->GetFormatter().GetAccnLink(acc));
  567.             }
  568.         }
  569.         if ( !xrefs.empty() ) {
  570.             m_DBSource.push_back("xrefs: " + NStr::Join(xrefs, ", "));
  571.         }
  572.     }
  573.     if (sp.IsSetDbref()  &&  !sp.GetDbref().empty() ) {
  574.         list<string> xrefs;
  575.         ITERATE (CSP_block::TDbref, it, sp.GetDbref()) {
  576.             const CObject_id& tag = (*it)->GetTag();
  577.             string            id  = (tag.IsStr() ? tag.GetStr()
  578.                                      : NStr::IntToString(tag.GetId()));
  579.             if ((*it)->GetDb() == "MIM") {
  580.                 xrefs.push_back
  581.                     ("MIM <a href=""
  582.                      "http://www.ncbi.nlm.nih.gov/entrez/dispomim.cgi?id=" + id
  583.                      + "">" + id + "</a>");
  584.             } else {
  585.                 xrefs.push_back((*it)->GetDb() + id); // no space(!)
  586.             }
  587.         }
  588.         m_DBSource.push_back
  589.             ("xrefs (non-sequence databases): " + NStr::Join(xrefs, ", "));
  590.     }
  591. }
  592. void CFlatHead::x_AddPRFBlock(void)
  593. {
  594.     for (CSeqdesc_CI dsc(m_Context->GetHandle(), CSeqdesc::e_Prf);
  595.          dsc;  ++dsc) {
  596.         m_ProteinBlock = &*dsc;
  597.         break;
  598.     }
  599.     if ( !m_ProteinBlock ) {
  600.         return;
  601.     }
  602.     const CPRF_block& prf = m_ProteinBlock->GetPrf();
  603.     if (prf.IsSetExtra_src()) {
  604.         const CPRF_ExtraSrc& es = prf.GetExtra_src();
  605.         if (es.IsSetHost()) {
  606.             m_DBSource.push_back("host: " + es.GetHost());
  607.         }
  608.         if (es.IsSetPart()) {
  609.             m_DBSource.push_back("part: " + es.GetPart());
  610.         }
  611.         if (es.IsSetState()) {
  612.             m_DBSource.push_back("state: " + es.GetState());
  613.         }
  614.         if (es.IsSetStrain()) {
  615.             m_DBSource.push_back("strain: " + es.GetStrain());
  616.         }
  617.         if (es.IsSetTaxon()) {
  618.             m_DBSource.push_back("taxonomy: " + es.GetTaxon());
  619.         }
  620.     }
  621.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  622.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  623.     }
  624. }
  625. void CFlatHead::x_AddPDBBlock(void)
  626. {
  627.     for (CSeqdesc_CI dsc(m_Context->GetHandle(), CSeqdesc::e_Pdb);
  628.          dsc;  ++dsc) {
  629.         m_ProteinBlock = &*dsc;
  630.         break;
  631.     }
  632.     if ( !m_ProteinBlock ) {
  633.         return;
  634.     }
  635.     const CPDB_block& pdb = m_ProteinBlock->GetPdb();
  636.     {{
  637.         string s("deposition: ");
  638.         m_Context->GetFormatter().FormatDate(pdb.GetDeposition(), s);
  639.         m_DBSource.push_back(s);
  640.     }}
  641.     m_DBSource.push_back("class: " + pdb.GetClass());
  642.     if (!pdb.GetSource().empty() ) {
  643.         m_DBSource.push_back("source: " + NStr::Join(pdb.GetSource(), ", "));
  644.     }
  645.     if (pdb.IsSetExp_method()) {
  646.         m_DBSource.push_back("Exp. method: " + pdb.GetExp_method());
  647.     }
  648.     if (pdb.IsSetReplace()) {
  649.         const CPDB_replace& rep = pdb.GetReplace();
  650.         if ( !rep.GetIds().empty() ) {
  651.             m_DBSource.push_back
  652.                 ("ids replaced: " + NStr::Join(pdb.GetSource(), ", "));
  653.         }
  654.         string s("replacement date: ");
  655.         m_Context->GetFormatter().FormatDate(rep.GetDate(), s);
  656.         m_DBSource.push_back(s);
  657.     }
  658.     NON_CONST_ITERATE (list<string>, it, m_DBSource) {
  659.         *it += (&*it == &m_DBSource.back() ? '.' : ';');
  660.     }
  661. }
  662. END_SCOPE(objects)
  663. END_NCBI_SCOPE
  664. /*
  665. * ===========================================================================
  666. *
  667. * $Log: flat_head.cpp,v $
  668. * Revision 1000.2  2004/06/01 19:43:17  gouriano
  669. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  670. *
  671. * Revision 1.8  2004/05/21 21:42:53  gorelenk
  672. * Added PCH ncbi_pch.hpp
  673. *
  674. * Revision 1.7  2004/04/05 15:56:15  grichenk
  675. * Redesigned CAnnotTypes_CI: moved all data and data collecting
  676. * functions to CAnnotDataCollector. CAnnotTypes_CI is no more
  677. * inherited from SAnnotSelector.
  678. *
  679. * Revision 1.6  2003/07/22 18:04:13  dicuccio
  680. * Fixed access of unset optional variables
  681. *
  682. * Revision 1.5  2003/06/02 16:06:42  dicuccio
  683. * Rearranged src/objects/ subtree.  This includes the following shifts:
  684. *     - src/objects/asn2asn --> arc/app/asn2asn
  685. *     - src/objects/testmedline --> src/objects/ncbimime/test
  686. *     - src/objects/objmgr --> src/objmgr
  687. *     - src/objects/util --> src/objmgr/util
  688. *     - src/objects/alnmgr --> src/objtools/alnmgr
  689. *     - src/objects/flat --> src/objtools/flat
  690. *     - src/objects/validator --> src/objtools/validator
  691. *     - src/objects/cddalignview --> src/objtools/cddalignview
  692. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  693. * replaces the three libmmdb? libs.
  694. *
  695. * Revision 1.4  2003/03/21 18:49:17  ucko
  696. * Turn most structs into (accessor-requiring) classes; replace some
  697. * formerly copied fields with pointers to the original data.
  698. *
  699. * Revision 1.3  2003/03/18 21:56:06  grichenk
  700. * Removed obsolete class CAnnot_CI
  701. *
  702. * Revision 1.2  2003/03/11 15:37:51  kuznets
  703. * iterate -> ITERATE
  704. *
  705. * Revision 1.1  2003/03/10 16:39:09  ucko
  706. * Initial check-in of new flat-file generator
  707. *
  708. *
  709. * ===========================================================================
  710. */