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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: annot_collector.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:21:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ANNOT_COLLECTOR__HPP
  10. #define ANNOT_COLLECTOR__HPP
  11. /*  $Id: annot_collector.hpp,v 1000.2 2004/06/01 19:21:50 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: Aleksey Grichenko, Michael Kimelman, Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Annotation collector for annot iterators
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <objmgr/scope.hpp>
  44. #include <objmgr/annot_selector.hpp>
  45. #include <objects/seqloc/Seq_loc.hpp>
  46. #include <set>
  47. #include <vector>
  48. #include <memory>
  49. BEGIN_NCBI_SCOPE
  50. class CReadLockGuard;
  51. BEGIN_SCOPE(objects)
  52. class CHandleRangeMap;
  53. class CHandleRange;
  54. struct SAnnotObject_Index;
  55. class CSeq_annot_SNP_Info;
  56. struct SSNP_Info;
  57. struct SIdAnnotObjs;
  58. class CSeq_loc_Conversion;
  59. class CSeq_loc_Conversion_Set;
  60. // class CSeq_align_Mapper;
  61. class NCBI_XOBJMGR_EXPORT CAnnotObject_Ref
  62. {
  63. public:
  64.     typedef CRange<TSeqPos> TRange;
  65.     CAnnotObject_Ref(void);
  66.     CAnnotObject_Ref(const CAnnotObject_Info& object);
  67.     CAnnotObject_Ref(const CSeq_annot_SNP_Info& snp_info, TSeqPos index);
  68.     ~CAnnotObject_Ref(void);
  69.     enum EObjectType {
  70.         eType_null,
  71.         eType_Seq_annot_Info,
  72.         eType_Seq_annot_SNP_Info
  73.     };
  74.     enum FMappedFlags {
  75.         fMapped_Partial   = 1<<0,
  76.         fMapped_Product   = 1<<1,
  77.         fMapped_Seq_point = 1<<2
  78.     };
  79.     enum EMappedObjectType {
  80.         eMappedObjType_not_set,
  81.         eMappedObjType_Seq_loc,
  82.         eMappedObjType_Seq_id,
  83.         eMappedObjType_Seq_align,
  84.         eMappedObjType_Seq_loc_Conv_Set
  85.     };
  86.     EObjectType GetObjectType(void) const;
  87.     const CSeq_annot_Info& GetSeq_annot_Info(void) const;
  88.     const CSeq_annot_SNP_Info& GetSeq_annot_SNP_Info(void) const;
  89.     const CAnnotObject_Info& GetAnnotObject_Info(void) const;
  90.     const SSNP_Info& GetSNP_Info(void) const;
  91.     EMappedObjectType GetMappedObjectType(void) const;
  92.     TSeqPos GetFrom(void) const;
  93.     TSeqPos GetToOpen(void) const;
  94.     const TRange& GetTotalRange(void) const;
  95.     bool IsPartial(void) const;
  96.     bool IsProduct(void) const;
  97.     bool IsMappedPoint(void) const;
  98.     void SetProduct(bool product);
  99.     ENa_strand GetMappedStrand(void) const;
  100.     bool IsFeat(void) const;
  101.     bool IsSNPFeat(void) const;
  102.     bool IsGraph(void) const;
  103.     bool IsAlign(void) const;
  104.     const CSeq_feat& GetFeat(void) const;
  105.     const CSeq_graph& GetGraph(void) const;
  106.     const CSeq_align& GetAlign(void) const;
  107.     bool IsMapped(void) const;
  108.     bool IsMappedLocation(void) const;
  109.     bool IsMappedProduct(void) const;
  110.     bool MappedSeq_locNeedsUpdate(void) const;
  111.     const CSeq_loc& GetMappedSeq_loc(void) const;
  112.     const CSeq_id& GetMappedSeq_id(void) const;
  113.     const CSeq_align& GetMappedSeq_align(void) const;
  114.     unsigned int GetAnnotObjectIndex(void) const;
  115.     void UpdateMappedSeq_loc(CRef<CSeq_loc>& loc) const;
  116.     void UpdateMappedSeq_loc(CRef<CSeq_loc>&      loc,
  117.                              CRef<CSeq_point>&    pnt_ref,
  118.                              CRef<CSeq_interval>& int_ref) const;
  119.     void SetAnnotObjectRange(const TRange& range, bool product);
  120.     void SetSNP_Point(const SSNP_Info& snp, CSeq_loc_Conversion* cvt);
  121.     void SetPartial(bool value);
  122.     void SetMappedSeq_loc(CSeq_loc& loc);
  123.     void SetMappedSeq_loc(CSeq_loc* loc);
  124.     void SetMappedSeq_id(CSeq_id& id);
  125.     void SetMappedPoint(bool point);
  126.     void SetMappedSeq_id(CSeq_id& id, bool point);
  127.     void SetMappedSeq_align(CSeq_align* align);
  128.     void SetMappedSeq_align_Cvts(CSeq_loc_Conversion_Set& cvts);
  129.     void SetTotalRange(const TRange& range);
  130.     void SetMappedStrand(ENa_strand strand);
  131.     void ResetLocation(void);
  132.     bool operator<(const CAnnotObject_Ref& ref) const; // sort by object
  133. private:
  134.     CConstRef<CObject>      m_Object;
  135.     CRef<CObject>           m_MappedObject; // master sequence coordinates
  136.     TRange                  m_TotalRange;
  137.     unsigned int            m_AnnotObject_Index;
  138.     Int1                    m_ObjectType; // EObjectType
  139.     Int1                    m_MappedFlags; // partial, product
  140.     Int1                    m_MappedObjectType;
  141.     Int1                    m_MappedStrand;
  142. };
  143. class CSeq_annot_Handle;
  144. class CAnnotMappingCollector;
  145. class CAnnot_Collector : public CObject
  146. {
  147. public:
  148.     CAnnot_Collector(const SAnnotSelector& selector,
  149.                         CScope&               scope);
  150.     ~CAnnot_Collector(void);
  151. private:
  152.     CAnnot_Collector(const CAnnot_Collector&);
  153.     CAnnot_Collector& operator= (const CAnnot_Collector&);
  154.     typedef CConstRef<CTSE_Info> TTSE_Lock;
  155.     typedef set<TTSE_Lock>       TTSE_LockSet;
  156.     typedef vector<CAnnotObject_Ref> TAnnotSet;
  157.     const TAnnotSet& GetAnnotSet(void) const;
  158.     CScope& GetScope(void) const;
  159.     SAnnotSelector& GetSelector(void);
  160.     void x_Clear(void);
  161.     void x_Initialize(const CBioseq_Handle& bioseq,
  162.                       TSeqPos start, TSeqPos stop);
  163.     void x_Initialize(const CHandleRangeMap& master_loc);
  164.     void x_Initialize(void);
  165.     void x_GetTSE_Info(void);
  166.     bool x_SearchMapped(const CSeqMap_CI& seg,
  167.                         CSeq_loc& master_loc_empty,
  168.                         const CSeq_id_Handle& master_id,
  169.                         const CHandleRange& master_hr);
  170.     bool x_Search(const CHandleRangeMap& loc,
  171.                   CSeq_loc_Conversion* cvt);
  172.     bool x_Search(const CSeq_id_Handle& id,
  173.                   const CBioseq_Handle& bh,
  174.                   const CHandleRange& hr,
  175.                   CSeq_loc_Conversion* cvt);
  176.     bool x_Search(const TTSE_LockSet& tse_set,
  177.                   const CSeq_id_Handle& id,
  178.                   const CHandleRange& hr,
  179.                   CSeq_loc_Conversion* cvt);
  180.     void x_Search(const CTSE_Info& tse_info,
  181.                   const SIdAnnotObjs* objs,
  182.                   CReadLockGuard& guard,
  183.                   const CAnnotName& name,
  184.                   const CSeq_id_Handle& id,
  185.                   const CHandleRange& hr,
  186.                   CSeq_loc_Conversion* cvt);
  187.     void x_SearchRange(const CTSE_Info& tse_info,
  188.                        const SIdAnnotObjs* objs,
  189.                        CReadLockGuard& guard,
  190.                        const CAnnotName& name,
  191.                        const CSeq_id_Handle& id,
  192.                        const CHandleRange& hr,
  193.                        CSeq_loc_Conversion* cvt,
  194.                        size_t from_idx, size_t to_idx);
  195.     void x_SearchAll(void);
  196.     void x_SearchAll(const CSeq_entry_Info& entry_info);
  197.     void x_SearchAll(const CSeq_annot_Info& annot_info);
  198.     void x_Sort(void);
  199.     
  200.     bool x_AddObjectMapping(CAnnotObject_Ref& object_ref,
  201.                             CSeq_loc_Conversion* cvt,
  202.                             unsigned int loc_index);
  203.     bool x_AddObject(CAnnotObject_Ref& object_ref);
  204.     bool x_AddObject(CAnnotObject_Ref& object_ref,
  205.                      CSeq_loc_Conversion* cvt,
  206.                      unsigned int loc_index);
  207.     // Release all locked resources TSE etc
  208.     void x_ReleaseAll(void);
  209.     bool x_NeedSNPs(void) const;
  210.     bool x_MatchLimitObject(const CAnnotObject_Info& annot_info) const;
  211.     bool x_MatchRange(const CHandleRange& hr,
  212.                       const CRange<TSeqPos>& range,
  213.                       const SAnnotObject_Index& index) const;
  214.     bool x_MatchLocIndex(const SAnnotObject_Index& index) const;
  215.     size_t x_GetAnnotCount(void) const;
  216.     SAnnotSelector                   m_Selector;
  217.     CHeapScope                       m_Scope;
  218.     // TSE set to keep all the TSEs locked
  219.     TTSE_LockSet                     m_TSE_LockSet;
  220.     auto_ptr<CAnnotMappingCollector> m_MappingCollector;
  221.     // Set of all the annotations found
  222.     TAnnotSet                        m_AnnotSet;
  223.     // Temporary objects to be re-used by iterators
  224.     CRef<CSeq_feat>      m_CreatedOriginalSeq_feat;
  225.     CRef<CSeq_point>     m_CreatedOriginalSeq_point;
  226.     CRef<CSeq_interval>  m_CreatedOriginalSeq_interval;
  227.     CRef<CSeq_feat>      m_CreatedMappedSeq_feat;
  228.     CRef<CSeq_loc>       m_CreatedMappedSeq_loc;
  229.     CRef<CSeq_point>     m_CreatedMappedSeq_point;
  230.     CRef<CSeq_interval>  m_CreatedMappedSeq_interval;
  231.     friend class CAnnotTypes_CI;
  232.     friend class CMappedFeat;
  233.     friend class CMappedGraph;
  234. };
  235. /////////////////////////////////////////////////////////////////////////////
  236. // CAnnotObject_Ref
  237. /////////////////////////////////////////////////////////////////////////////
  238. inline
  239. CAnnotObject_Ref::CAnnotObject_Ref(void)
  240.     : m_AnnotObject_Index(0),
  241.       m_ObjectType(eType_null),
  242.       m_MappedFlags(0),
  243.       m_MappedObjectType(CSeq_loc::e_not_set),
  244.       m_MappedStrand(eNa_strand_unknown)
  245. {
  246. }
  247. inline
  248. CAnnotObject_Ref::~CAnnotObject_Ref(void)
  249. {
  250. }
  251. inline
  252. CAnnotObject_Ref::EObjectType CAnnotObject_Ref::GetObjectType(void) const
  253. {
  254.     return EObjectType(m_ObjectType);
  255. }
  256. inline
  257. TSeqPos CAnnotObject_Ref::GetFrom(void) const
  258. {
  259.     return m_TotalRange.GetFrom();
  260. }
  261. inline
  262. TSeqPos CAnnotObject_Ref::GetToOpen(void) const
  263. {
  264.     return m_TotalRange.GetToOpen();
  265. }
  266. inline
  267. const CAnnotObject_Ref::TRange& CAnnotObject_Ref::GetTotalRange(void) const
  268. {
  269.     return m_TotalRange;
  270. }
  271. inline
  272. void CAnnotObject_Ref::SetTotalRange(const TRange& range)
  273. {
  274.     m_TotalRange = range;
  275. }
  276. inline
  277. unsigned int CAnnotObject_Ref::GetAnnotObjectIndex(void) const
  278. {
  279.     return m_AnnotObject_Index;
  280. }
  281. inline
  282. const CSeq_annot_Info& CAnnotObject_Ref::GetSeq_annot_Info(void) const
  283. {
  284.     _ASSERT(GetObjectType() == eType_Seq_annot_Info);
  285.     return reinterpret_cast<const CSeq_annot_Info&>(*m_Object);
  286. }
  287. inline
  288. const CSeq_annot_SNP_Info& CAnnotObject_Ref::GetSeq_annot_SNP_Info(void) const
  289. {
  290.     _ASSERT(GetObjectType() == eType_Seq_annot_SNP_Info);
  291.     return reinterpret_cast<const CSeq_annot_SNP_Info&>(*m_Object);
  292. }
  293. inline
  294. bool CAnnotObject_Ref::IsPartial(void) const
  295. {
  296.     return (m_MappedFlags & fMapped_Partial) != 0;
  297. }
  298. inline
  299. bool CAnnotObject_Ref::IsProduct(void) const
  300. {
  301.     return (m_MappedFlags & fMapped_Product) != 0;
  302. }
  303. inline
  304. ENa_strand CAnnotObject_Ref::GetMappedStrand(void) const
  305. {
  306.     return ENa_strand(m_MappedStrand);
  307. }
  308. inline
  309. void CAnnotObject_Ref::SetMappedStrand(ENa_strand strand)
  310. {
  311.     _ASSERT(IsMapped());
  312.     m_MappedStrand = strand;
  313. }
  314. inline
  315. CAnnotObject_Ref::EMappedObjectType
  316. CAnnotObject_Ref::GetMappedObjectType(void) const
  317. {
  318.     return EMappedObjectType(m_MappedObjectType);
  319. }
  320. inline
  321. bool CAnnotObject_Ref::IsMapped(void) const
  322. {
  323.     _ASSERT((GetMappedObjectType() == eMappedObjType_not_set) ==
  324.             !m_MappedObject);
  325.     return GetMappedObjectType() != eMappedObjType_not_set;
  326. }
  327. inline
  328. bool CAnnotObject_Ref::MappedSeq_locNeedsUpdate(void) const
  329. {
  330.     return GetMappedObjectType() == eMappedObjType_Seq_id;
  331. }
  332. inline
  333. bool CAnnotObject_Ref::IsMappedLocation(void) const
  334. {
  335.     return IsMapped() && !IsProduct();
  336. }
  337. inline
  338. bool CAnnotObject_Ref::IsMappedProduct(void) const
  339. {
  340.     return IsMapped() && IsProduct();
  341. }
  342. inline
  343. const CSeq_loc& CAnnotObject_Ref::GetMappedSeq_loc(void) const
  344. {
  345.     _ASSERT(GetMappedObjectType() == eMappedObjType_Seq_loc);
  346.     return static_cast<const CSeq_loc&>(*m_MappedObject);
  347. }
  348. inline
  349. const CSeq_id& CAnnotObject_Ref::GetMappedSeq_id(void) const
  350. {
  351.     _ASSERT(GetMappedObjectType() == eMappedObjType_Seq_id);
  352.     return static_cast<const CSeq_id&>(*m_MappedObject);
  353. }
  354. inline
  355. void CAnnotObject_Ref::SetMappedSeq_loc(CSeq_loc* loc)
  356. {
  357.     _ASSERT(!IsMapped());
  358.     m_MappedObject.Reset(loc);
  359.     m_MappedObjectType = loc? eMappedObjType_Seq_loc: eMappedObjType_not_set;
  360. }
  361. inline
  362. void CAnnotObject_Ref::SetMappedSeq_loc(CSeq_loc& loc)
  363. {
  364.     _ASSERT(!IsMapped());
  365.     m_MappedObject.Reset(&loc);
  366.     m_MappedObjectType = eMappedObjType_Seq_loc;
  367. }
  368. inline
  369. void CAnnotObject_Ref::SetMappedSeq_id(CSeq_id& id)
  370. {
  371.     _ASSERT(!IsMapped());
  372.     m_MappedObject.Reset(&id);
  373.     m_MappedObjectType = eMappedObjType_Seq_id;
  374. }
  375. inline
  376. void CAnnotObject_Ref::SetMappedPoint(bool point)
  377. {
  378.     _ASSERT(GetMappedObjectType() == eMappedObjType_Seq_id);
  379.     if ( point ) {
  380.         m_MappedFlags |= fMapped_Seq_point;
  381.     }
  382.     else {
  383.         m_MappedFlags &= ~fMapped_Seq_point;
  384.     }
  385. }
  386. inline
  387. bool CAnnotObject_Ref::IsMappedPoint(void) const
  388. {
  389.     _ASSERT(GetMappedObjectType() == eMappedObjType_Seq_id);
  390.     return (m_MappedFlags & fMapped_Seq_point) != 0;
  391. }
  392. inline
  393. void CAnnotObject_Ref::SetMappedSeq_id(CSeq_id& id, bool point)
  394. {
  395.     SetMappedSeq_id(id);
  396.     SetMappedPoint(point);
  397. }
  398. inline
  399. bool CAnnotObject_Ref::IsSNPFeat(void) const
  400. {
  401.     return GetObjectType() == eType_Seq_annot_SNP_Info;
  402. }
  403. inline
  404. void CAnnotObject_Ref::SetPartial(bool partial)
  405. {
  406.     if ( partial ) {
  407.         m_MappedFlags |= fMapped_Partial;
  408.     }
  409.     else {
  410.         m_MappedFlags &= ~fMapped_Partial;
  411.     }
  412. }
  413. inline
  414. void CAnnotObject_Ref::SetProduct(bool product)
  415. {
  416.     if ( product ) {
  417.         m_MappedFlags |= fMapped_Product;
  418.     }
  419.     else {
  420.         m_MappedFlags &= ~fMapped_Product;
  421.     }
  422. }
  423. inline
  424. void CAnnotObject_Ref::SetAnnotObjectRange(const TRange& range, bool product)
  425. {
  426.     m_TotalRange = range;
  427.     SetProduct(product);
  428. }
  429. inline
  430. void CAnnotObject_Ref::ResetLocation(void)
  431. {
  432.     m_TotalRange = TRange::GetEmpty();
  433.     m_MappedObject.Reset();
  434.     m_MappedObjectType = eMappedObjType_not_set;
  435.     m_MappedStrand = eNa_strand_unknown;
  436. }
  437. /////////////////////////////////////////////////////////////////////////////
  438. // CAnnot_Collector
  439. /////////////////////////////////////////////////////////////////////////////
  440. inline
  441. const CAnnot_Collector::TAnnotSet&
  442. CAnnot_Collector::GetAnnotSet(void) const
  443. {
  444.     return m_AnnotSet;
  445. }
  446. inline
  447. CScope& CAnnot_Collector::GetScope(void) const
  448. {
  449.     return m_Scope;
  450. }
  451. inline
  452. SAnnotSelector& CAnnot_Collector::GetSelector(void)
  453. {
  454.     return m_Selector;
  455. }
  456. END_SCOPE(objects)
  457. END_NCBI_SCOPE
  458. /*
  459. * ---------------------------------------------------------------------------
  460. * $Log: annot_collector.hpp,v $
  461. * Revision 1000.2  2004/06/01 19:21:50  gouriano
  462. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  463. *
  464. * Revision 1.6  2004/05/26 14:29:20  grichenk
  465. * Redesigned CSeq_align_Mapper: preserve non-mapping intervals,
  466. * fixed strands handling, improved performance.
  467. *
  468. * Revision 1.5  2004/05/11 17:45:24  grichenk
  469. * Removed declarations for SetMappedIndex() and SetMappedSeq_align_Mapper()
  470. *
  471. * Revision 1.4  2004/05/10 18:26:37  grichenk
  472. * Fixed 'not used' warnings
  473. *
  474. * Revision 1.3  2004/04/13 21:14:27  vasilche
  475. * Fixed wrong order of object deletion causing "tse is locked" error.
  476. *
  477. * Revision 1.2  2004/04/07 13:20:17  grichenk
  478. * Moved more data from iterators to CAnnot_Collector
  479. *
  480. * Revision 1.1  2004/04/05 15:54:25  grichenk
  481. * Initial revision
  482. *
  483. *
  484. * ===========================================================================
  485. */
  486. #endif  // ANNOT_COLLECTOR__HPP