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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: context.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:38:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_FORMAT___CONTEXT__HPP
  10. #define OBJTOOLS_FORMAT___CONTEXT__HPP
  11. /*  $Id: context.hpp,v 1000.1 2004/06/01 19:38:24 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author:  Aaron Ucko, Mati Shomrat
  37. *
  38. * File Description:
  39. *   new (early 2003) flat-file generator -- context needed when (pre)formatting
  40. *
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbiobj.hpp>
  44. #include <objects/seq/Bioseq.hpp>
  45. #include <objects/seq/Seq_inst.hpp>
  46. #include <objects/seq/MolInfo.hpp>
  47. #include <objects/seqloc/Seq_loc.hpp>
  48. #include <objects/seqloc/Seq_id.hpp>
  49. #include <objects/submit/Submit_block.hpp>
  50. #include <objmgr/bioseq_handle.hpp>
  51. #include <objmgr/seq_entry_handle.hpp>
  52. #include <objmgr/annot_selector.hpp>
  53. #include <objmgr/seq_loc_mapper.hpp>
  54. #include <util/range.hpp>
  55. #include <objtools/format/flat_file_config.hpp>
  56. #include <objtools/format/items/reference_item.hpp>
  57. #include <memory>
  58. BEGIN_NCBI_SCOPE
  59. BEGIN_SCOPE(objects)
  60. class CScope;
  61. class CMasterContext;
  62. class CFlatFileContext;
  63. /////////////////////////////////////////////////////////////////////////////
  64. //
  65. // CBioseqContext
  66. //
  67. // information on the bioseq being formatted
  68. class CBioseqContext : public CObject
  69. {
  70. public:
  71.     // types
  72.     typedef CRef<CReferenceItem>    TRef;
  73.     typedef vector<TRef>            TReferences;
  74.     typedef CRange<TSeqPos>         TRange;
  75.     // constructor
  76.     CBioseqContext(const CBioseq_Handle& seq, CFlatFileContext& ffctx,
  77.         CMasterContext* mctx = 0);
  78.     // destructor
  79.     ~CBioseqContext(void);
  80.     // Get the bioseq's handle
  81.     CBioseq_Handle& GetHandle(void) { return m_Handle; }
  82.     CScope& GetScope(void) { return m_Handle.GetScope(); }
  83.     // -- id information
  84.     CSeq_id* GetPrimaryId(void) { return m_PrimaryId; }
  85.     const CSeq_id& GetPreferredSynonym(const CSeq_id& id) const;
  86.     const string& GetAccession(void) const { return m_Accession; }
  87.     int  GetGI(void) const { return m_Gi; }
  88.     
  89.     // molecular type (nucleotide / protein)
  90.     bool IsProt(void) const { return m_IsProt;  }
  91.     bool IsNuc (void) const { return !m_IsProt; }
  92.     CSeq_inst::TRepr  GetRepr   (void) const { return m_Repr;    }
  93.     CSeq_inst::TMol   GetMol    (void) const { return m_Mol;     }
  94.     const CMolInfo*   GetMolinfo(void) const { return m_Molinfo; }
  95.     CMolInfo::TTech   GetTech   (void) const;
  96.     CMolInfo::TBiomol GetBiomol (void) const;
  97.     const CBioseq::TId& GetBioseqIds(void) const;
  98.     // segmented bioseq
  99.     bool IsSegmented(void) const { return m_Repr == CSeq_inst::eRepr_seg; }
  100.     bool HasParts(void) const { return m_HasParts; }
  101.     
  102.     // part of a segmented bioseq
  103.     bool IsPart(void) const { return m_IsPart; }
  104.     SIZE_TYPE GetPartNumber   (void) const { return m_PartNumber; }
  105.     SIZE_TYPE GetTotalNumParts(void) const;
  106.     CMasterContext& GetMaster (void) { return *m_Master; }
  107.     void SetMaster(CMasterContext& mctx);
  108.     // delta sequence
  109.     bool IsDelta(void) const { return m_Repr == CSeq_inst::eRepr_delta; }
  110.     bool IsDeltaLitOnly(void) const { return m_IsDeltaLitOnly; }
  111.     // Whole Genome Shotgun
  112.     bool IsWGS      (void) const { return m_IsWGS;       }
  113.     bool IsWGSMaster(void) const { return m_IsWGSMaster; }
  114.     const string& GetWGSMasterAccn(void) const { return m_WGSMasterAccn; }
  115.     const string& GetWGSMasterName(void) const { return m_WGSMasterName; }
  116.     TReferences& SetReferences(void) { return m_References; }
  117.     const TReferences& GetReferences(void) const { return m_References; }
  118.     // range on the bioseq to be formatted. the location is either
  119.     // whole or an interval (no complex locations allowed)
  120.     const CSeq_loc& GetLocation(void) const { return *m_Location; }
  121.     CSeq_loc_Mapper* GetMapper(void) { return m_Mapper; }
  122.     bool DoContigStyle(void) const;
  123.     bool ShowGBBSource(void) const { return m_ShowGBBSource; }
  124.     bool IsInGPS    (void) const { return m_IsInGPS;     }  // Is in a gene-prod set?
  125.     bool IsInNucProt(void) const { return m_IsInNucProt; }  // Is in a nuc-prot set?
  126.     // type of bioseq?
  127.     bool IsGED            (void) const { return m_IsGED;  }  // Genbank, EMBL or DDBJ
  128.     bool IsEMBL           (void) const { return m_IsEMBL; }  // EMBL
  129.     bool IsPDB            (void) const { return m_IsPDB;  }  // PDB
  130.     bool IsSP             (void) const { return m_IsSP;   }  // SwissProt
  131.     bool IsTPA            (void) const { return m_IsTPA;  }  // Third-Party Annotation
  132.     bool IsPatent         (void) const { return m_IsPatent; }
  133.     bool IsGbGenomeProject(void) const { return m_IsGbGenomeProject; } // AE
  134.     bool IsNcbiCONDiv     (void) const { return m_IsNcbiCONDiv; }      // CH
  135.     
  136.     // RefSeq ID queries
  137.     bool IsRefSeq(void) const { return m_IsRefSeq; }
  138.     bool IsRSCompleteGenomic  (void) const;  // NC_
  139.     bool IsRSIncompleteGenomic(void) const;  // NG_
  140.     bool IsRSMRna             (void) const;  // NM_
  141.     bool IsRSNonCodingRna     (void) const;  // NR_
  142.     bool IsRSProtein          (void) const;  // NP_
  143.     bool IsRSContig           (void) const;  // NT_
  144.     bool IsRSIntermedWGS      (void) const;  // NW_
  145.     bool IsRSPredictedMRna    (void) const;  // XM_
  146.     bool IsRSPredictedNCRna   (void) const;  // XR_
  147.     bool IsRSPredictedProtein (void) const;  // XP_
  148.     bool IsRSWGSNuc           (void) const;  // NZ_
  149.     bool IsRSWGSProt          (void) const;  // ZP_
  150.     
  151.     bool IsHup(void) const { return m_IsHup; }  // !!! should move to global?
  152.     // global data from CFlatFileContext
  153.     const CSubmit_block* GetSubmitBlock(void) const;
  154.     const CSeq_entry_Handle& GetEntry(void) const;
  155.     const CFlatFileConfig& Config(void) const;
  156.     const SAnnotSelector* GetAnnotSelector(void) const;
  157.     const CSeq_loc* GetMasterLocation(void) const;
  158.     bool IsGenbankFormat(void) const;
  159. private:
  160.     void x_Init(const CBioseq_Handle& seq, const CSeq_loc* user_loc);
  161.     void x_SetId(void);
  162.     bool x_HasParts(void) const;
  163.     bool x_IsDeltaLitOnly(void) const;
  164.     bool x_IsPart(void) const;
  165.     CBioseq_Handle x_GetMasterForPart(void) const;
  166.     SIZE_TYPE x_GetPartNumber(void);
  167.     bool x_IsInGPS(void) const;
  168.     bool x_IsInNucProt(void) const;
  169.     void x_SetLocation(const CSeq_loc* user_loc = 0);
  170.     
  171.     CSeq_inst::TRepr x_GetRepr(void) const;
  172.     const CMolInfo* x_GetMolInfo(void) const;
  173.     // data
  174.     CBioseq_Handle        m_Handle;
  175.     CRef<CSeq_id>         m_PrimaryId;
  176.     string                m_Accession;
  177.     string                m_WGSMasterAccn;
  178.     string                m_WGSMasterName;
  179.     CSeq_inst::TRepr      m_Repr;
  180.     CSeq_inst::TMol       m_Mol;
  181.     CConstRef<CMolInfo>   m_Molinfo; 
  182.     // segmented bioseq
  183.     bool        m_HasParts;
  184.     // part of a segmented bioseq
  185.     bool        m_IsPart;
  186.     SIZE_TYPE   m_PartNumber;
  187.     // delta bioseq
  188.     bool        m_IsDeltaLitOnly;
  189.     bool m_IsProt;      // Protein
  190.     bool m_IsInGPS;     // Gene-Prod Set
  191.     bool m_IsInNucProt; // Nuc-Prot Set
  192.     bool m_IsGED;       // Genbank, Embl or Ddbj
  193.     bool m_IsEMBL;      // EMBL
  194.     bool m_IsPDB;       // PDB
  195.     bool m_IsSP;        // SwissProt
  196.     bool m_IsTPA;       // Third Party Annotation
  197.     bool m_IsRefSeq;
  198.     unsigned int m_RefseqInfo;
  199.     bool m_IsGbGenomeProject;  // GenBank Genome project data
  200.     bool m_IsNcbiCONDiv;       // NCBI CON division
  201.     bool m_IsPatent;
  202.     bool m_IsGI;
  203.     bool m_IsWGS;
  204.     bool m_IsWGSMaster;
  205.     bool m_IsHup;
  206.     int  m_Gi;
  207.     bool m_ShowGBBSource;
  208.     
  209.     TReferences             m_References;
  210.     CConstRef<CSeq_loc>     m_Location;
  211.     CRef<CSeq_loc_Mapper>   m_Mapper;
  212.     CFlatFileContext&       m_FFCtx;
  213.     CRef<CMasterContext>    m_Master;
  214. };
  215. /////////////////////////////////////////////////////////////////////////////
  216. //
  217. // CMasterContext
  218. //
  219. // When formatting segmented bioseq CMasterContext holds information
  220. // on the Master bioseq.
  221. class CMasterContext : public CObject
  222. {
  223. public:
  224.     // constructor
  225.     CMasterContext(const CBioseq_Handle& master);
  226.     // destructor
  227.     ~CMasterContext(void);
  228.     // Get the segmented bioseq's handle
  229.     const CBioseq_Handle& GetHandle(void) const { return m_Handle;   }
  230.     // Get the number of parts
  231.     SIZE_TYPE GetNumParts          (void) const { return m_NumParts; }
  232.     // Get the base name
  233.     const string& GetBaseName      (void) const { return m_BaseName; }
  234.     // Find the serial number of a part in the segmented bioseq
  235.     SIZE_TYPE GetPartNumber(const CBioseq_Handle& part);
  236. private:
  237.     void x_SetBaseName(void);
  238.     void x_SetNumParts(void);
  239.     // data
  240.     CBioseq_Handle    m_Handle;
  241.     string            m_BaseName;
  242.     SIZE_TYPE         m_NumParts;
  243. };
  244. /////////////////////////////////////////////////////////////////////////////
  245. //
  246. // CFlatFileContext
  247. class CFlatFileContext : public CObject
  248. {
  249. public:
  250.     // types
  251.     typedef CRef<CBioseqContext>            TSection;
  252.     typedef vector< CRef<CBioseqContext> >  TSections;
  253.     // constructor
  254.     CFlatFileContext(const CFlatFileConfig& cfg) : m_Cfg(cfg) {}
  255.     // destructor
  256.     ~CFlatFileContext(void) {}
  257.     const CSeq_entry_Handle& GetEntry(void) const { return m_Entry;  }
  258.     void SetEntry(const CSeq_entry_Handle& entry) { m_Entry = entry; }
  259.     const CSubmit_block* GetSubmitBlock(void) const { return m_Submit; }
  260.     void SetSubmit(const CSubmit_block& sub) { m_Submit = &sub; }
  261.     const CFlatFileConfig& GetConfig(void) const { return m_Cfg; }
  262.     const SAnnotSelector* GetAnnotSelector(void) const;
  263.     SAnnotSelector& SetAnnotSelector(void);
  264.     void SetAnnotSelector(const SAnnotSelector&);
  265.     const CSeq_loc* GetLocation(void) const { return m_Loc; }
  266.     void SetLocation(const CSeq_loc* loc) { m_Loc.Reset(loc); }
  267.     void AddSection(TSection& section) { m_Sections.push_back(section); }
  268.     void Reset(void);
  269. private:
  270.     CFlatFileConfig             m_Cfg;
  271.     CSeq_entry_Handle           m_Entry;
  272.     TSections                   m_Sections;
  273.     CConstRef<CSubmit_block>    m_Submit;
  274.     auto_ptr<SAnnotSelector>    m_Selector;
  275.     CConstRef<CSeq_loc>         m_Loc;
  276. };
  277. /////////////////////////////////////////////////////////////////////////////
  278. // inline methods
  279. // -------- CBioseqContext
  280. inline
  281. const CBioseq::TId& CBioseqContext::GetBioseqIds(void) const
  282. {
  283.     return m_Handle.GetBioseqCore()->GetId();
  284. }
  285. inline
  286. SIZE_TYPE CBioseqContext::GetTotalNumParts(void) const
  287. {
  288.     return m_Master->GetNumParts();
  289. }
  290. inline
  291. void CBioseqContext::SetMaster(CMasterContext& mctx) {
  292.     m_Master.Reset(&mctx);
  293. }
  294. inline
  295. bool CBioseqContext::IsRSCompleteGenomic(void)  const
  296. {
  297.     return m_RefseqInfo == CSeq_id::eAcc_refseq_chromosome;  // NC_
  298. }
  299. inline
  300. bool CBioseqContext::IsRSIncompleteGenomic(void)  const
  301. {
  302.     return m_RefseqInfo == CSeq_id::eAcc_refseq_genomic;  // NG_
  303. }
  304. inline
  305. bool CBioseqContext::IsRSMRna(void)  const
  306. {
  307.     return m_RefseqInfo == CSeq_id::eAcc_refseq_mrna;  // NM_
  308. }
  309. inline
  310. bool CBioseqContext::IsRSNonCodingRna(void)  const
  311. {
  312.     return m_RefseqInfo == CSeq_id::eAcc_refseq_ncrna;  // NR_
  313. }
  314. inline
  315. bool CBioseqContext::IsRSProtein(void)  const
  316. {
  317.     return m_RefseqInfo == CSeq_id::eAcc_refseq_prot;  // NP_
  318. }
  319. inline
  320. bool CBioseqContext::IsRSContig(void)  const
  321. {
  322.     return m_RefseqInfo == CSeq_id::eAcc_refseq_contig;  // NT_
  323. }
  324. inline
  325. bool CBioseqContext::IsRSIntermedWGS(void)  const
  326. {
  327.     return m_RefseqInfo == CSeq_id::eAcc_refseq_wgs_intermed;  // NW_
  328. }
  329. inline
  330. bool CBioseqContext::IsRSPredictedMRna(void)  const
  331. {
  332.     return m_RefseqInfo == CSeq_id::eAcc_refseq_mrna_predicted;  // XM_
  333. }
  334. inline
  335. bool CBioseqContext::IsRSPredictedNCRna(void)  const
  336. {
  337.     return m_RefseqInfo == CSeq_id::eAcc_refseq_ncrna_predicted;  // XR_
  338. }
  339. inline
  340. bool CBioseqContext::IsRSPredictedProtein(void)  const
  341. {
  342.     return m_RefseqInfo == CSeq_id::eAcc_refseq_prot_predicted;  // XP_
  343. }
  344. inline
  345. bool CBioseqContext::IsRSWGSNuc(void)  const
  346. {
  347.     return m_RefseqInfo == CSeq_id::eAcc_refseq_wgs_nuc;  // NZ_
  348. }
  349. inline
  350. bool CBioseqContext::IsRSWGSProt(void)  const
  351. {
  352.     return m_RefseqInfo == CSeq_id::eAcc_refseq_wgs_prot;  // ZP_
  353. }
  354. inline
  355. const CFlatFileConfig& CBioseqContext::Config(void) const
  356. {
  357.     return m_FFCtx.GetConfig();
  358. }
  359. inline
  360. const CSubmit_block* CBioseqContext::GetSubmitBlock(void) const
  361. {
  362.     return m_FFCtx.GetSubmitBlock();
  363. }
  364. inline
  365. const CSeq_entry_Handle& CBioseqContext::GetEntry(void) const
  366. {
  367.     return m_FFCtx.GetEntry();
  368. }
  369. inline
  370. const SAnnotSelector* CBioseqContext::GetAnnotSelector(void) const
  371. {
  372.     return m_FFCtx.GetAnnotSelector();
  373. }
  374. inline
  375. const CSeq_loc* CBioseqContext::GetMasterLocation(void) const
  376. {
  377.     return m_FFCtx.GetLocation();
  378. }
  379. inline
  380. CMolInfo::TTech CBioseqContext::GetTech(void) const
  381. {
  382.     return m_Molinfo ? m_Molinfo->GetTech() : CMolInfo::eTech_unknown;
  383. }
  384. inline
  385. CMolInfo::TBiomol CBioseqContext::GetBiomol(void) const
  386. {
  387.     return m_Molinfo ? m_Molinfo->GetBiomol() : CMolInfo::eBiomol_unknown;
  388. }
  389. inline
  390. bool CBioseqContext::IsGenbankFormat(void) const
  391. {
  392.     return (Config().IsFormatGenbank()  ||
  393.             Config().IsFormatGBSeq()    ||
  394.             Config().IsFormatDDBJ());
  395. }
  396. // -------- CFlatFileContext
  397. inline
  398. const SAnnotSelector* CFlatFileContext::GetAnnotSelector(void) const
  399. {
  400.     return m_Selector.get();
  401. }
  402. inline
  403. SAnnotSelector& CFlatFileContext::SetAnnotSelector(void)
  404. {
  405.     if ( m_Selector.get() == 0 ) {
  406.         m_Selector.reset(new SAnnotSelector);
  407.     }
  408.     return *m_Selector;
  409. }
  410. inline
  411. void CFlatFileContext::SetAnnotSelector(const SAnnotSelector& sel)
  412. {
  413.     m_Selector.reset(new SAnnotSelector(sel));
  414. }
  415. inline
  416. void CFlatFileContext::Reset(void)
  417. {
  418.     m_Entry.Reset();
  419.     m_Sections.clear();
  420.     m_Submit.Reset();
  421.     m_Selector.reset();
  422.     m_Loc.Reset();
  423. }
  424. END_SCOPE(objects)
  425. END_NCBI_SCOPE
  426. /*
  427. * ===========================================================================
  428. *
  429. * $Log: context.hpp,v $
  430. * Revision 1000.1  2004/06/01 19:38:24  gouriano
  431. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  432. *
  433. * Revision 1.18  2004/05/19 14:45:50  shomrat
  434. * + CFlatFileContext::Reset
  435. *
  436. * Revision 1.17  2004/05/06 17:44:28  shomrat
  437. * + IsEMBL and IsInNucProt
  438. *
  439. * Revision 1.16  2004/04/27 15:09:31  shomrat
  440. * + IsGenbankFormat
  441. *
  442. * Revision 1.15  2004/04/22 16:11:24  ucko
  443. * Move CBioseqContext::SetMaster's body to the end of the file, as some
  444. * compilers insist on seeing CMasterContext's full definition first.
  445. *
  446. * Revision 1.14  2004/04/22 15:41:38  shomrat
  447. * Refactoring of context
  448. *
  449. * Revision 1.13  2004/03/31 17:14:00  shomrat
  450. * name changes
  451. *
  452. * Revision 1.12  2004/03/25 20:28:55  shomrat
  453. * Use handle objects
  454. *
  455. * Revision 1.11  2004/03/18 15:29:38  shomrat
  456. * + flag ShowFtableRefs
  457. *
  458. * Revision 1.10  2004/03/16 19:07:48  vasilche
  459. * Include <memory> for auto_ptr<>.
  460. *
  461. * Revision 1.9  2004/03/16 15:40:21  vasilche
  462. * Added required include
  463. *
  464. * Revision 1.8  2004/03/12 16:55:10  shomrat
  465. * + ViewNuc(), ViewProt()
  466. *
  467. * Revision 1.7  2004/03/10 21:38:01  shomrat
  468. * Fixed usage of m_RefseqInfo
  469. *
  470. * Revision 1.6  2004/03/05 18:53:34  shomrat
  471. * added customization flags
  472. *
  473. * Revision 1.5  2004/02/19 17:56:21  shomrat
  474. * add flag for skipping gathering of source features
  475. *
  476. * Revision 1.4  2004/02/11 22:47:41  shomrat
  477. * using types in flag file
  478. *
  479. * Revision 1.3  2004/02/11 16:39:49  shomrat
  480. * added more user customization flags
  481. *
  482. * Revision 1.2  2004/01/14 15:50:17  shomrat
  483. * multiple changes (work in progress)
  484. *
  485. * Revision 1.1  2003/12/18 17:41:20  shomrat
  486. * file was moved from src directory
  487. *
  488. * Revision 1.1  2003/12/17 20:18:54  shomrat
  489. * Initial Revision (adapted from flat lib)
  490. *
  491. * ===========================================================================
  492. */
  493. #endif  /* OBJTOOLS_FORMAT___CONTEXT__HPP */