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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: locus_item.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:45:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: locus_item.cpp,v 1000.2 2004/06/01 19:45:04 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. *   flat-file generator -- locus item implementation
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <objects/general/Date.hpp>
  43. #include <objects/seq/Bioseq.hpp>
  44. #include <objects/seq/MolInfo.hpp>
  45. #include <objects/seqloc/Textseq_id.hpp>
  46. #include <objects/seqblock/GB_block.hpp>
  47. #include <objects/seqblock/EMBL_block.hpp>
  48. #include <objects/seqblock/SP_block.hpp>
  49. #include <objects/seqblock/PDB_block.hpp>
  50. #include <objects/seqblock/PDB_replace.hpp>
  51. #include <objects/seqfeat/BioSource.hpp>
  52. #include <objects/seqfeat/Org_ref.hpp>
  53. #include <objects/seqfeat/OrgName.hpp>
  54. #include <objects/seqfeat/SubSource.hpp>
  55. #include <objmgr/scope.hpp>
  56. #include <objmgr/seqdesc_ci.hpp>
  57. #include <objmgr/feat_ci.hpp>
  58. #include <objmgr/bioseq_handle.hpp>
  59. #include <objmgr/util/sequence.hpp>
  60. #include <objtools/format/formatter.hpp>
  61. #include <objtools/format/text_ostream.hpp>
  62. #include <objtools/format/items/locus_item.hpp>
  63. #include <objtools/format/context.hpp>
  64. #include "utils.hpp"
  65. BEGIN_NCBI_SCOPE
  66. BEGIN_SCOPE(objects)
  67. USING_SCOPE(sequence);
  68. CLocusItem::CLocusItem(CBioseqContext& ctx) :
  69.     CFlatItem(&ctx),
  70.     m_Length(0), m_Biomol(CMolInfo::eBiomol_unknown), m_Date("01-JAN-1900")
  71. {
  72.    x_GatherInfo(ctx);
  73. }
  74. void CLocusItem::Format
  75. (IFormatter& formatter,
  76.  IFlatTextOStream& text_os) const
  77. {
  78.     formatter.FormatLocus(*this, text_os); 
  79. }
  80. const string& CLocusItem::GetName(void) const
  81. {
  82.     return m_Name;
  83. }
  84. size_t CLocusItem::GetLength(void) const
  85. {
  86.     return m_Length;
  87. }
  88. CLocusItem::TStrand CLocusItem::GetStrand(void) const
  89. {
  90.     return m_Strand;
  91. }
  92. CLocusItem::TBiomol CLocusItem::GetBiomol(void) const
  93. {
  94.     return m_Biomol;
  95. }
  96. CLocusItem::TTopology CLocusItem::GetTopology (void) const
  97. {
  98.     return m_Topology;
  99. }
  100. const string& CLocusItem::GetDivision(void) const
  101. {
  102.     return m_Division;
  103. }
  104. const string& CLocusItem::GetDate(void) const
  105. {
  106.     return m_Date;
  107. }
  108. /***************************************************************************/
  109. /*                                  PRIVATE                                */
  110. /***************************************************************************/
  111. void CLocusItem::x_GatherInfo(CBioseqContext& ctx)
  112. {
  113.     CSeqdesc_CI mi_desc(ctx.GetHandle(), CSeqdesc::e_Molinfo);
  114.     if ( mi_desc ) {
  115.         x_SetObject(mi_desc->GetMolinfo());
  116.     }
  117.     // NB: order of execution is important, as some values depend on others
  118.     x_SetName(ctx);
  119.     x_SetLength(ctx);
  120.     x_SetBiomol(ctx);   // must come befoer x_SetStrand
  121.     x_SetStrand(ctx);
  122.     x_SetTopology(ctx);
  123.     x_SetDivision(ctx);
  124.     x_SetDate(ctx);
  125. }
  126. // Name
  127. void CLocusItem::x_SetName(CBioseqContext& ctx)
  128. {
  129.     CBioseq_Handle::TBioseqCore seq  = ctx.GetHandle().GetBioseqCore();
  130.     CConstRef<CSeq_id> id = FindBestChoice(seq->GetId(), CSeq_id::Score);
  131.     const CTextseq_id* tsid = id->GetTextseq_Id();
  132.     if ( tsid  &&  tsid->CanGetName() ) {
  133.         m_Name = tsid->GetName();
  134.     }
  135.     if ( m_Name.empty()  ||  x_NameHasBadChars(m_Name) ) {
  136.         m_Name = id->GetSeqIdString();
  137.     }
  138. }
  139. bool CLocusItem::x_NameHasBadChars(const string& name) const
  140. {
  141.     ITERATE(string, iter, name) {
  142.         if ( !isalnum(*iter) ) {
  143.             return true;
  144.         }
  145.     }
  146.     return false;
  147. }
  148. // Length
  149. void CLocusItem::x_SetLength(CBioseqContext& ctx)
  150. {
  151.     m_Length = sequence::GetLength(ctx.GetLocation(), &ctx.GetScope());
  152. }
  153. // Strand
  154. void CLocusItem::x_SetStrand(CBioseqContext& ctx)
  155. {
  156.     const CBioseq_Handle& bsh = ctx.GetHandle();
  157.     
  158.     CSeq_inst::TMol bmol = bsh.IsSetInst_Mol() ?
  159.         bsh.GetInst_Mol() : CSeq_inst::eMol_not_set;
  160.     m_Strand = bsh.IsSetInst_Strand() ?
  161.         bsh.GetInst_Strand() : CSeq_inst::eStrand_not_set;
  162.     if ( m_Strand == CSeq_inst::eStrand_other ) {
  163.         m_Strand = CSeq_inst::eStrand_not_set;
  164.     }
  165.     // cleanup for formats other than GBSeq
  166.     if ( !ctx.Config().IsFormatGBSeq() ) {
  167.         // if ds-DNA don't show ds
  168.         if ( bmol == CSeq_inst::eMol_dna  &&  m_Strand == CSeq_inst::eStrand_ds ) {
  169.             m_Strand = CSeq_inst::eStrand_not_set;
  170.         }
  171.         
  172.         // ss-any RNA don't show ss
  173.         if ( (bmol > CSeq_inst::eMol_rna  ||  
  174.             (m_Biomol >= CMolInfo::eBiomol_mRNA     &&
  175.             m_Biomol <= CMolInfo::eBiomol_peptide))  &&
  176.             m_Strand == CSeq_inst::eStrand_ss ) {
  177.             m_Strand = CSeq_inst::eStrand_not_set;
  178.         }
  179.     }
  180. }
  181. // Biomol
  182. void CLocusItem::x_SetBiomol(CBioseqContext& ctx)
  183. {
  184.     if ( ctx.IsProt() ) {
  185.         return;
  186.     }
  187.     CSeq_inst::TMol bmol = ctx.GetHandle().GetBioseqMolType();
  188.     
  189.     if ( bmol > CSeq_inst::eMol_aa ) {
  190.         bmol = CSeq_inst::eMol_not_set;
  191.     }
  192.     const CMolInfo* molinfo = dynamic_cast<const CMolInfo*>(GetObject());
  193.     if ( molinfo  &&  molinfo->GetBiomol() <= CMolInfo::eBiomol_transcribed_RNA ) {
  194.         m_Biomol = molinfo->GetBiomol();
  195.     }
  196.     if ( m_Biomol <= CMolInfo::eBiomol_genomic ) {
  197.         if ( bmol == CSeq_inst::eMol_aa ) {
  198.             m_Biomol = CMolInfo::eBiomol_peptide;
  199.         } else if ( bmol == CSeq_inst::eMol_na ) {
  200.             m_Biomol = CMolInfo::eBiomol_unknown;
  201.         } else if ( bmol == CSeq_inst::eMol_rna ) {
  202.             m_Biomol = CMolInfo::eBiomol_pre_RNA;
  203.         } else {
  204.             m_Biomol = CMolInfo::eBiomol_genomic;
  205.         }
  206.     } else if ( m_Biomol == CMolInfo::eBiomol_other_genetic ) {
  207.         if ( bmol == CSeq_inst::eMol_rna ) {
  208.             m_Biomol = CMolInfo::eBiomol_pre_RNA;
  209.         }
  210.     }
  211. }
  212. // Topology
  213. void CLocusItem::x_SetTopology(CBioseqContext& ctx)
  214. {
  215.     const CBioseq_Handle& bsh = ctx.GetHandle();
  216.     
  217.     m_Topology = bsh.GetInst_Topology();
  218.     // an interval is always linear
  219.     if ( !ctx.GetLocation().IsWhole() ) {
  220.         m_Topology = CSeq_inst::eTopology_linear;
  221.     }
  222. }
  223. // Division
  224. void CLocusItem::x_SetDivision(CBioseqContext& ctx)
  225. {
  226.     // contig style (old genome_view flag) forces CON division
  227.     if ( ctx.DoContigStyle() ) {
  228.         m_Division = "CON";
  229.         return;
  230.     }
  231.     // "genome view" forces CON division
  232.     if ( (ctx.IsSegmented()  &&  !ctx.HasParts())  ||
  233.          (ctx.IsDelta()  &&  !ctx.IsDeltaLitOnly()) ) {
  234.         m_Division = "CON";
  235.         return;
  236.     }
  237.     const CBioseq_Handle& bsh = ctx.GetHandle();
  238.     const CBioSource* bsrc = 0;
  239.     // Find the BioSource object for this sequnece.
  240.     CSeqdesc_CI src_desc(bsh, CSeqdesc::e_Source);
  241.     if ( src_desc ) {
  242.         bsrc = &(src_desc->GetSource());
  243.     } else {
  244.         CFeat_CI feat(bsh, 0, 0, CSeqFeatData::e_Biosrc);
  245.         if ( feat ) {
  246.             bsrc = &(feat->GetData().GetBiosrc());
  247.         } else if ( ctx.IsProt() ) {
  248.             // if protein with no sources, get sources applicable to 
  249.             // DNA location of CDS
  250.             const CSeq_feat* cds = GetCDSForProduct(bsh);
  251.             if ( cds ) {
  252.                 CConstRef<CSeq_feat> nuc_fsrc = GetBestOverlappingFeat(
  253.                     cds->GetLocation(),
  254.                     CSeqFeatData::e_Biosrc,
  255.                     eOverlap_Contains,
  256.                     bsh.GetScope());
  257.                 if ( nuc_fsrc ) {
  258.                     bsrc = &(nuc_fsrc->GetData().GetBiosrc());
  259.                 } else {
  260.                     CBioseq_Handle nuc = 
  261.                         bsh.GetScope().GetBioseqHandle(cds->GetLocation());
  262.                     CSeqdesc_CI nuc_dsrc(nuc, CSeqdesc::e_Source);
  263.                     if ( nuc_dsrc ) {
  264.                         bsrc = &(nuc_dsrc->GetSource());
  265.                     }
  266.                 }
  267.             }
  268.         }
  269.     }
  270.     bool is_transgenic = false;
  271.     if ( bsrc ) {
  272.         CBioSource::TOrigin origin = bsrc->GetOrigin();
  273.         if ( bsrc->CanGetOrg() ) {
  274.             const COrg_ref& org = bsrc->GetOrg();
  275.             if ( org.CanGetOrgname()  &&  org.GetOrgname().CanGetDiv() ) {
  276.                 m_Division = org.GetOrgname().GetDiv();
  277.             }
  278.         }
  279.         ITERATE(CBioSource::TSubtype, subsource, bsrc->GetSubtype() ) {
  280.             if ( (*subsource)->CanGetSubtype()  &&
  281.                 (*subsource)->GetSubtype() == CSubSource::eSubtype_transgenic ) {
  282.                 is_transgenic = true;
  283.             }
  284.         }
  285.         
  286.         switch ( ctx.GetTech() ) {
  287.         case CMolInfo::eTech_est:
  288.             m_Division = "EST";
  289.             break;
  290.         case CMolInfo::eTech_sts:
  291.             m_Division = "STS";
  292.             break;
  293.         case CMolInfo::eTech_survey:
  294.             m_Division = "GSS";
  295.             break;
  296.         case CMolInfo::eTech_htgs_0:
  297.         case CMolInfo::eTech_htgs_1:
  298.         case CMolInfo::eTech_htgs_2:
  299.             m_Division = "HTG";
  300.             break;
  301.         case CMolInfo::eTech_htc:
  302.             m_Division = "HTC";
  303.             break;
  304.         default:
  305.             break;
  306.         }
  307.         if ( origin == CBioSource::eOrigin_synthetic  ||  is_transgenic ) {
  308.             m_Division = "SYN";
  309.         }
  310.         ITERATE( CBioseq::TId, id, bsh.GetBioseqCore()->GetId() ) {
  311.             if ( (*id)->IdentifyAccession() == CSeq_id::eAcc_patent ) {
  312.                 m_Division = "PAT";
  313.                 break;
  314.             }
  315.         }
  316.         // more complicated code for division, if necessary, goes here
  317.         
  318.         for ( CSeqdesc_CI gb_desc(bsh, CSeqdesc::e_Genbank); gb_desc; ++gb_desc ) {
  319.             const CGB_block& gb = gb_desc->GetGenbank();
  320.             if ( gb.CanGetDiv() ) {
  321.                 if ( m_Division.empty()    ||
  322.                      gb.GetDiv() == "SYN"  ||
  323.                      gb.GetDiv() == "PAT" ) {
  324.                     m_Division = gb.GetDiv();
  325.                 }
  326.             }
  327.         }
  328.         const CMolInfo* molinfo = dynamic_cast<const CMolInfo*>(GetObject());
  329.         if ( ctx.Config().IsFormatEMBL() ) {
  330.             for ( CSeqdesc_CI embl_desc(bsh, CSeqdesc::e_Embl); 
  331.                   embl_desc; 
  332.                   ++embl_desc ) {
  333.                 const CEMBL_block& embl = embl_desc->GetEmbl();
  334.                 if ( embl.CanGetDiv() ) {
  335.                     if ( embl.GetDiv() == CEMBL_block::eDiv_other  &&
  336.                          molinfo == 0 ) {
  337.                         m_Division = "HUM";
  338.                     } else {
  339.                         m_Division = embl.GetDiv();
  340.                     }
  341.                 }
  342.             }
  343.         }
  344.     }
  345.     // Set a default value (3 spaces)
  346.     if ( m_Division.empty() ) {
  347.         m_Division = "   ";
  348.     }
  349. }
  350. // Date
  351. void CLocusItem::x_SetDate(CBioseqContext& ctx)
  352. {
  353.     const CBioseq_Handle& bsh = ctx.GetHandle();
  354.     const CDate* date = x_GetDateForBioseq(bsh);
  355.     if ( date == 0 ) {
  356.         // if bioseq is product of CDS or mRNA feature, get 
  357.         // date from parent bioseq.
  358.         CBioseq_Handle parent = GetNucleotideParent(bsh);
  359.         if ( parent ) {
  360.             date = x_GetDateForBioseq(parent);
  361.         }
  362.     }
  363.     if ( date ) {
  364.         m_Date.erase();
  365.         DateToString(*date, m_Date);
  366.     }
  367. }
  368. const CDate* CLocusItem::x_GetDateForBioseq(const CBioseq_Handle& bsh) const
  369. {
  370.     const CDate* result = 0;
  371.     {{
  372.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Update_date);
  373.         if ( desc ) {
  374.             result = &(desc->GetUpdate_date());
  375.         }
  376.     }}
  377.     {{
  378.         // temporarily (???) also look at genbank block entry date 
  379.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Genbank);
  380.         if ( desc ) {
  381.             const CGB_block& gb = desc->GetGenbank();
  382.             if ( gb.CanGetEntry_date() ) {
  383.                 result = x_GetLaterDate(result, &gb.GetEntry_date());
  384.             }
  385.         }
  386.     }}
  387.     {{
  388.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Embl);
  389.         if ( desc ) {
  390.             const CEMBL_block& embl = desc->GetEmbl();
  391.             if ( embl.CanGetCreation_date() ) {
  392.                 result = x_GetLaterDate(result, &embl.GetCreation_date());
  393.             }
  394.             if ( embl.CanGetUpdate_date() ) {
  395.                 result = x_GetLaterDate(result, &embl.GetUpdate_date());
  396.             }
  397.         }
  398.     }}
  399.     {{
  400.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Sp);
  401.         if ( desc ) {
  402.             const CSP_block& sp = desc->GetSp();
  403.             if ( sp.CanGetCreated()  &&  sp.GetCreated().IsStd() ) {
  404.                 result = x_GetLaterDate(result, &sp.GetCreated());
  405.             }
  406.             if ( sp.CanGetSequpd()  &&  sp.GetSequpd().IsStd() ) {
  407.                 result = x_GetLaterDate(result, &sp.GetSequpd());
  408.             }
  409.             if ( sp.CanGetAnnotupd()  &&  sp.GetAnnotupd().IsStd() ) {
  410.                 result = x_GetLaterDate(result, &sp.GetAnnotupd());
  411.             }
  412.         }
  413.     }}
  414.     {{
  415.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Pdb);
  416.         if ( desc ) {
  417.             const CPDB_block& pdb = desc->GetPdb();
  418.             if ( pdb.CanGetDeposition()  &&  pdb.GetDeposition().IsStd() ) {
  419.                 result = x_GetLaterDate(result, &pdb.GetDeposition());
  420.             }
  421.             if ( pdb.CanGetReplace() ) {
  422.                 const CPDB_replace& replace = pdb.GetReplace();
  423.                 if ( replace.CanGetDate()  &&   replace.GetDate().IsStd() ) {
  424.                     result = x_GetLaterDate(result, &replace.GetDate());
  425.                 }
  426.             }
  427.         }
  428.     }}
  429.     {{
  430.         CSeqdesc_CI desc(bsh, CSeqdesc::e_Create_date);
  431.         if ( desc ) {
  432.             result = x_GetLaterDate(result, &(desc->GetCreate_date()));
  433.         }
  434.     }}
  435.     return result;
  436. }
  437. const CDate* CLocusItem::x_GetLaterDate(const CDate* d1, const CDate* d2) const
  438. {
  439.     if ( d1 == 0 ) {
  440.         return d2;
  441.     }
  442.     if ( d2 == 0 ) {
  443.         return d1;
  444.     }
  445.     return (d1->Compare(*d2) == CDate::eCompare_after) ? d1 : d2;
  446. }
  447. END_SCOPE(objects)
  448. END_NCBI_SCOPE
  449. /*
  450. * ===========================================================================
  451. *
  452. * $Log: locus_item.cpp,v $
  453. * Revision 1000.2  2004/06/01 19:45:04  gouriano
  454. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  455. *
  456. * Revision 1.9  2004/05/21 21:42:54  gorelenk
  457. * Added PCH ncbi_pch.hpp
  458. *
  459. * Revision 1.8  2004/04/22 15:58:51  shomrat
  460. * Changes in context
  461. *
  462. * Revision 1.7  2004/04/13 16:49:01  shomrat
  463. * GBSeq format changes
  464. *
  465. * Revision 1.6  2004/03/25 20:45:05  shomrat
  466. * Use handles
  467. *
  468. * Revision 1.5  2004/03/05 18:41:14  shomrat
  469. * bug fix
  470. *
  471. * Revision 1.4  2004/02/13 14:23:08  shomrat
  472. * force CON division for contig style and genome view
  473. *
  474. * Revision 1.3  2004/02/11 22:55:12  shomrat
  475. * use IsFormatEMBL method
  476. *
  477. * Revision 1.2  2003/12/18 17:43:35  shomrat
  478. * context.hpp moved
  479. *
  480. * Revision 1.1  2003/12/17 20:23:35  shomrat
  481. * Initial Revision (adapted from flat lib)
  482. *
  483. *
  484. * ===========================================================================
  485. */