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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: feat_ci.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:21:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef FEAT_CI__HPP
  10. #define FEAT_CI__HPP
  11. /*  $Id: feat_ci.hpp,v 1000.3 2004/06/01 19:21:22 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. *   Object manager iterators
  40. *
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <objmgr/annot_types_ci.hpp>
  44. #include <objmgr/seq_annot_handle.hpp>
  45. #include <objmgr/seq_entry_handle.hpp>
  46. #include <objects/seqfeat/Seq_feat.hpp>
  47. #include <objects/seqloc/Seq_loc.hpp>
  48. #include <objmgr/seq_feat_handle.hpp>
  49. BEGIN_NCBI_SCOPE
  50. BEGIN_SCOPE(objects)
  51. class NCBI_XOBJMGR_EXPORT CMappedFeat
  52. {
  53. public:
  54.     CMappedFeat(void);
  55.     CMappedFeat(const CMappedFeat& feat);
  56.     CMappedFeat& operator=(const CMappedFeat& feat);
  57.     ~CMappedFeat(void);
  58.     // Original feature with unmapped location/product
  59.     const CSeq_feat& GetOriginalFeature(void) const;
  60.     // Original feature handle
  61.     CSeq_feat_Handle GetSeq_feat_Handle(void) const;
  62.     // Feature mapped to the master sequence.
  63.     // WARNING! The function is rather slow and should be used with care.
  64.     const CSeq_feat& GetMappedFeature(void) const;
  65.     bool IsSetId(void) const
  66.         { return GetOriginalFeature().IsSetId(); }
  67.     const CFeat_id& GetId(void) const
  68.         { return GetOriginalFeature().GetId(); }
  69.     const CSeqFeatData& GetData(void) const
  70.         { return GetOriginalFeature().GetData(); }
  71.     bool IsSetPartial(void) const
  72.         { return m_FeatRef->IsPartial(); }
  73.     bool GetPartial(void) const
  74.         { return m_FeatRef->IsPartial(); }
  75.     bool IsSetExcept(void) const
  76.         { return GetOriginalFeature().IsSetExcept(); }
  77.     bool GetExcept(void) const
  78.         { return GetOriginalFeature().GetExcept(); }
  79.     bool IsSetComment(void) const
  80.         { return GetOriginalFeature().IsSetComment(); }
  81.     const string& GetComment(void) const
  82.         { return GetOriginalFeature().GetComment(); }
  83.     bool IsSetProduct(void) const
  84.         { return GetOriginalFeature().IsSetProduct(); }
  85.     const CSeq_loc& GetProduct(void) const
  86.         {
  87.             return m_FeatRef->IsMappedProduct()?
  88.                 GetMappedLocation(): GetOriginalFeature().GetProduct();
  89.         }
  90.     const CSeq_loc& GetLocation(void) const
  91.         {
  92.             return m_FeatRef->IsMappedLocation()?
  93.                 GetMappedLocation(): GetOriginalFeature().GetLocation();
  94.         }
  95.     bool IsSetQual(void) const
  96.         { return GetOriginalFeature().IsSetQual(); }
  97.     const CSeq_feat::TQual& GetQual(void) const
  98.         { return GetOriginalFeature().GetQual(); }
  99.     bool IsSetTitle(void) const
  100.         { return GetOriginalFeature().IsSetTitle(); }
  101.     const string& GetTitle(void) const
  102.         { return GetOriginalFeature().GetTitle(); }
  103.     bool IsSetExt(void) const
  104.         { return GetOriginalFeature().IsSetExt(); }
  105.     const CUser_object& GetExt(void) const
  106.         { return GetOriginalFeature().GetExt(); }
  107.     bool IsSetCit(void) const
  108.         { return GetOriginalFeature().IsSetCit(); }
  109.     const CPub_set& GetCit(void) const
  110.         { return GetOriginalFeature().GetCit(); }
  111.     bool IsSetExp_ev(void) const
  112.         { return GetOriginalFeature().IsSetExp_ev(); }
  113.     CSeq_feat::EExp_ev GetExp_ev(void) const
  114.         { return GetOriginalFeature().GetExp_ev(); }
  115.     bool IsSetXref(void) const
  116.         { return GetOriginalFeature().IsSetXref(); }
  117.     const CSeq_feat::TXref& GetXref(void) const
  118.         { return GetOriginalFeature().GetXref(); }
  119.     bool IsSetDbxref(void) const
  120.         { return GetOriginalFeature().IsSetDbxref(); }
  121.     const CSeq_feat::TDbxref& GetDbxref(void) const
  122.         { return GetOriginalFeature().GetDbxref(); }
  123.     bool IsSetPseudo(void) const
  124.         { return GetOriginalFeature().IsSetPseudo(); }
  125.     bool GetPseudo(void) const
  126.         { return GetOriginalFeature().GetPseudo(); }
  127.     bool IsSetExcept_text(void) const
  128.         { return GetOriginalFeature().IsSetExcept_text(); }
  129.     const string& GetExcept_text(void) const
  130.         { return GetOriginalFeature().GetExcept_text(); }
  131.     CSeq_annot_Handle GetAnnot(void) const;
  132.     const CSeq_annot& GetSeq_annot(void) const;
  133. private:
  134.     friend class CFeat_CI;
  135.     friend class CAnnot_CI;
  136.     typedef CAnnot_Collector::TAnnotSet TAnnotSet;
  137.     typedef TAnnotSet::const_iterator   TIterator;
  138.     CMappedFeat& Set(CAnnot_Collector& collector,
  139.                      const TIterator& annot);
  140.     void Reset(void);
  141.     const CSeq_feat& x_MakeOriginalFeature(void) const;
  142.     const CSeq_feat& x_MakeMappedFeature(void) const;
  143.     const CSeq_loc& x_MakeMappedLocation(void) const;
  144.     const CSeq_loc& GetMappedLocation(void) const;
  145.     mutable CRef<CAnnot_Collector> m_Collector;
  146.     TIterator                      m_FeatRef;
  147.     mutable CConstRef<CSeq_feat> m_OriginalSeq_feat;
  148.     mutable CConstRef<CSeq_feat> m_MappedSeq_feat;
  149.     mutable CConstRef<CSeq_loc>  m_MappedSeq_loc;
  150. };
  151. class CSeq_annot_Handle;
  152. class NCBI_XOBJMGR_EXPORT CFeat_CI : public CAnnotTypes_CI
  153. {
  154. public:
  155.     enum EFeat_Location {
  156.         e_Location,
  157.         e_Product
  158.     };
  159.     CFeat_CI(void);
  160.     CFeat_CI(CScope& scope,
  161.              const CSeq_loc& loc);
  162.     CFeat_CI(const CBioseq_Handle& bioseq,
  163.              TSeqPos start, TSeqPos stop);
  164.     CFeat_CI(CScope& scope,
  165.              const CSeq_loc& loc,
  166.              const SAnnotSelector& sel);
  167.     CFeat_CI(const CBioseq_Handle& bioseq,
  168.              TSeqPos start, TSeqPos stop,
  169.              const SAnnotSelector& sel);
  170.     // Iterate all features from the object regardless of their location
  171.     CFeat_CI(CScope& scope, const CSeq_annot& annot);
  172.     CFeat_CI(CScope& scope, const CSeq_annot& annot,
  173.              const SAnnotSelector& sel);
  174.     CFeat_CI(const CSeq_annot_Handle& annot);
  175.     CFeat_CI(const CSeq_annot_Handle& annot,
  176.              const SAnnotSelector& sel);
  177.     CFeat_CI(CScope& scope, const CSeq_entry& entry);
  178.     CFeat_CI(CScope& scope, const CSeq_entry& entry,
  179.              const SAnnotSelector& sel);
  180.     CFeat_CI(const CSeq_entry_Handle& entry);
  181.     CFeat_CI(const CSeq_entry_Handle& entry,
  182.              const SAnnotSelector& sel);
  183.     typedef SAnnotSelector::TFeatType TFeatType;
  184.     // Search all TSEs in all datasources. By default search sequence segments
  185.     // (for constructed sequences) only if the referenced sequence is in the
  186.     // same TSE as the master one. Use CFeat_CI::eResolve_All flag to search
  187.     // features on all referenced sequences or CFeat_CI::eResolve_None to
  188.     // disable references resolving.
  189.     CFeat_CI(CScope& scope,
  190.              const CSeq_loc& loc,
  191.              TFeatType feat_type,
  192.              SAnnotSelector::EOverlapType overlap_type
  193.              = SAnnotSelector::eOverlap_Intervals,
  194.              SAnnotSelector::EResolveMethod resolve
  195.              = SAnnotSelector::eResolve_TSE,
  196.              EFeat_Location loc_type = e_Location);
  197.     // Search only in TSE, containing the bioseq. If both start & stop are 0,
  198.     // the whole bioseq is searched. References are resolved depending on the
  199.     // "resolve" flag (see above).
  200.     // If "entry" is set, search only features from the seq-entry specified
  201.     // (but no its sub-entries or parent entry).
  202.     CFeat_CI(const CBioseq_Handle& bioseq,
  203.              TSeqPos start, TSeqPos stop,
  204.              TFeatType feat_type,
  205.              SAnnotSelector::EOverlapType overlap_type
  206.              = SAnnotSelector::eOverlap_Intervals,
  207.              SAnnotSelector::EResolveMethod resolve
  208.              = SAnnotSelector::eResolve_TSE,
  209.              EFeat_Location loc_type = e_Location);
  210.     CFeat_CI(const CBioseq_Handle& bioseq,
  211.              TSeqPos start, TSeqPos stop,
  212.              TFeatType feat_type,
  213.              SAnnotSelector::EOverlapType overlap_type,
  214.              SAnnotSelector::EResolveMethod resolve,
  215.              EFeat_Location loc_type,
  216.              const CSeq_entry_Handle& limitEntry);
  217.     CFeat_CI(const CBioseq_Handle& bioseq,
  218.              TSeqPos start, TSeqPos stop,
  219.              TFeatType feat_type,
  220.              SAnnotSelector::EOverlapType overlap_type,
  221.              SAnnotSelector::EResolveMethod resolve,
  222.              EFeat_Location loc_type,
  223.              const CSeq_entry* limitEntry);
  224.     CFeat_CI(const CFeat_CI& iter);
  225.     virtual ~CFeat_CI(void);
  226.     CFeat_CI& operator= (const CFeat_CI& iter);
  227.     CFeat_CI& operator++(void);
  228.     CFeat_CI& operator--(void);
  229.     operator bool (void) const;
  230.     void Update(void);
  231.     void Rewind(void);
  232.     const CMappedFeat& operator* (void) const;
  233.     const CMappedFeat* operator-> (void) const;
  234. private:
  235.     CFeat_CI& operator++ (int);
  236.     CFeat_CI& operator-- (int);
  237.     mutable CMappedFeat m_OriginalSeq_feat; // current feature object returned by operator->()
  238. };
  239. inline
  240. void CFeat_CI::Update(void)
  241. {
  242.     if ( IsValid() ) {
  243.         m_OriginalSeq_feat.Set(GetCollector(), GetIterator());
  244.     }
  245.     else {
  246.         m_OriginalSeq_feat.Reset();
  247.     }
  248. }
  249. inline
  250. CFeat_CI::operator bool (void) const
  251. {
  252.     return IsValid();
  253. }
  254. inline
  255. CFeat_CI& CFeat_CI::operator++ (void)
  256. {
  257.     Next();
  258.     Update();
  259.     return *this;
  260. }
  261. inline
  262. CFeat_CI& CFeat_CI::operator-- (void)
  263. {
  264.     Prev();
  265.     Update();
  266.     return *this;
  267. }
  268. inline
  269. void CFeat_CI::Rewind(void)
  270. {
  271.     CAnnotTypes_CI::Rewind();
  272.     Update();
  273. }
  274. inline
  275. const CMappedFeat& CFeat_CI::operator* (void) const
  276. {
  277.     return m_OriginalSeq_feat;
  278. }
  279. inline
  280. const CMappedFeat* CFeat_CI::operator-> (void) const
  281. {
  282.     return &**this;
  283. }
  284. inline
  285. const CSeq_feat& CMappedFeat::GetOriginalFeature(void) const
  286. {
  287.     return m_OriginalSeq_feat? *m_OriginalSeq_feat: x_MakeOriginalFeature();
  288. }
  289. inline
  290. const CSeq_feat& CMappedFeat::GetMappedFeature(void) const
  291. {
  292.     return m_MappedSeq_feat? *m_MappedSeq_feat: x_MakeMappedFeature();
  293. }
  294. inline
  295. const CSeq_loc& CMappedFeat::GetMappedLocation(void) const
  296. {
  297.     return m_MappedSeq_loc? *m_MappedSeq_loc: x_MakeMappedLocation();
  298. }
  299. END_SCOPE(objects)
  300. END_NCBI_SCOPE
  301. /*
  302. * ---------------------------------------------------------------------------
  303. * $Log: feat_ci.hpp,v $
  304. * Revision 1000.3  2004/06/01 19:21:22  gouriano
  305. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  306. *
  307. * Revision 1.41  2004/05/04 18:08:47  grichenk
  308. * Added CSeq_feat_Handle, CSeq_align_Handle and CSeq_graph_Handle
  309. *
  310. * Revision 1.40  2004/04/07 13:20:17  grichenk
  311. * Moved more data from iterators to CAnnot_Collector
  312. *
  313. * Revision 1.39  2004/04/05 15:56:13  grichenk
  314. * Redesigned CAnnotTypes_CI: moved all data and data collecting
  315. * functions to CAnnotDataCollector. CAnnotTypes_CI is no more
  316. * inherited from SAnnotSelector.
  317. *
  318. * Revision 1.38  2004/03/16 15:47:26  vasilche
  319. * Added CBioseq_set_Handle and set of EditHandles
  320. *
  321. * Revision 1.37  2004/02/04 18:05:32  grichenk
  322. * Added annotation filtering by set of types/subtypes.
  323. * Renamed *Choice to *Type in SAnnotSelector.
  324. *
  325. * Revision 1.36  2004/01/28 20:54:34  vasilche
  326. * Fixed mapping of annotations.
  327. *
  328. * Revision 1.35  2004/01/23 16:14:46  grichenk
  329. * Implemented alignment mapping
  330. *
  331. * Revision 1.34  2003/11/07 16:01:26  vasilche
  332. * Added CMappedFeat::GetSeq_annot().
  333. *
  334. * Revision 1.33  2003/08/27 14:28:50  vasilche
  335. * Reduce amount of object allocations in feature iteration.
  336. *
  337. * Revision 1.32  2003/08/15 19:19:15  vasilche
  338. * Fixed memory leak in string packing hooks.
  339. * Fixed processing of 'partial' flag of features.
  340. * Allow table packing of non-point SNP.
  341. * Allow table packing of SNP with long alleles.
  342. *
  343. * Revision 1.31  2003/08/15 15:22:41  grichenk
  344. * +CAnnot_CI
  345. *
  346. * Revision 1.30  2003/08/14 20:05:18  vasilche
  347. * Simple SNP features are stored as table internally.
  348. * They are recreated when needed using CFeat_CI.
  349. *
  350. * Revision 1.29  2003/08/04 17:02:57  grichenk
  351. * Added constructors to iterate all annotations from a
  352. * seq-entry or seq-annot.
  353. *
  354. * Revision 1.28  2003/07/22 21:48:02  vasilche
  355. * Use typedef for member access.
  356. *
  357. * Revision 1.27  2003/06/02 16:01:36  dicuccio
  358. * Rearranged include/objects/ subtree.  This includes the following shifts:
  359. *     - include/objects/alnmgr --> include/objtools/alnmgr
  360. *     - include/objects/cddalignview --> include/objtools/cddalignview
  361. *     - include/objects/flat --> include/objtools/flat
  362. *     - include/objects/objmgr/ --> include/objmgr/
  363. *     - include/objects/util/ --> include/objmgr/util/
  364. *     - include/objects/validator --> include/objtools/validator
  365. *
  366. * Revision 1.26  2003/04/24 16:12:37  vasilche
  367. * Object manager internal structures are splitted more straightforward.
  368. * Removed excessive header dependencies.
  369. *
  370. * Revision 1.25  2003/03/26 14:55:57  vasilche
  371. * Removed redundant 'const' from methods returning 'const bool'.
  372. *
  373. * Revision 1.24  2003/03/05 20:56:42  vasilche
  374. * SAnnotSelector now holds all parameters of annotation iterators.
  375. *
  376. * Revision 1.23  2003/02/25 14:24:19  dicuccio
  377. * Added Win32 export specifier to CMappedFeat
  378. *
  379. * Revision 1.22  2003/02/24 18:57:20  vasilche
  380. * Make feature gathering in one linear pass using CSeqMap iterator.
  381. * Do not use feture index by sub locations.
  382. * Sort features at the end of gathering in one vector.
  383. * Extracted some internal structures and classes in separate header.
  384. * Delay creation of mapped features.
  385. *
  386. * Revision 1.21  2003/02/13 14:57:36  dicuccio
  387. * Changed interface to match new 'dataool'-generated code (built-in types
  388. * returned by value, not reference).
  389. *
  390. * Revision 1.20  2003/02/13 14:34:31  grichenk
  391. * Renamed CAnnotObject -> CAnnotObject_Info
  392. * + CSeq_annot_Info and CAnnotObject_Ref
  393. * Moved some members of CAnnotObject to CSeq_annot_Info
  394. * and CAnnotObject_Ref.
  395. * Added feat/align/graph to CAnnotObject_Info map
  396. * to CDataSource.
  397. *
  398. * Revision 1.19  2003/02/10 22:03:55  grichenk
  399. * operator++(int) made private
  400. *
  401. * Revision 1.18  2003/02/10 15:50:44  grichenk
  402. * + CMappedFeat, CFeat_CI resolves to CMappedFeat
  403. *
  404. * Revision 1.17  2002/12/26 20:50:18  dicuccio
  405. * Added Win32 export specifier.  Removed unimplemented (private) operator++(int)
  406. *
  407. * Revision 1.16  2002/12/24 15:42:44  grichenk
  408. * CBioseqHandle argument to annotation iterators made const
  409. *
  410. * Revision 1.15  2002/12/20 20:54:23  grichenk
  411. * Added optional location/product switch to CFeat_CI
  412. *
  413. * Revision 1.14  2002/12/06 15:35:57  grichenk
  414. * Added overlap type for annot-iterators
  415. *
  416. * Revision 1.13  2002/12/05 19:28:30  grichenk
  417. * Prohibited postfix operator ++()
  418. *
  419. * Revision 1.12  2002/07/08 20:50:56  grichenk
  420. * Moved log to the end of file
  421. * Replaced static mutex (in CScope, CDataSource) with the mutex
  422. * pool. Redesigned CDataSource data locking.
  423. *
  424. * Revision 1.11  2002/05/06 03:30:35  vakatov
  425. * OM/OM1 renaming
  426. *
  427. * Revision 1.10  2002/05/03 21:28:01  ucko
  428. * Introduce T(Signed)SeqPos.
  429. *
  430. * Revision 1.9  2002/04/30 14:30:42  grichenk
  431. * Added eResolve_TSE flag in CAnnot_Types_CI, made it default
  432. *
  433. * Revision 1.8  2002/04/17 20:57:50  grichenk
  434. * Added full type for "resolve" argument
  435. *
  436. * Revision 1.7  2002/04/16 19:59:45  grichenk
  437. * Updated comments
  438. *
  439. * Revision 1.6  2002/04/05 21:26:16  grichenk
  440. * Enabled iteration over annotations defined on segments of a
  441. * delta-sequence.
  442. *
  443. * Revision 1.5  2002/03/05 16:08:12  grichenk
  444. * Moved TSE-restriction to new constructors
  445. *
  446. * Revision 1.4  2002/03/04 15:07:46  grichenk
  447. * Added "bioseq" argument to CAnnotTypes_CI constructor to iterate
  448. * annotations from a single TSE.
  449. *
  450. * Revision 1.3  2002/02/21 19:27:00  grichenk
  451. * Rearranged includes. Added scope history. Added searching for the
  452. * best seq-id match in data sources and scopes. Updated tests.
  453. *
  454. * Revision 1.2  2002/01/16 16:26:35  gouriano
  455. * restructured objmgr
  456. *
  457. * Revision 1.1  2002/01/11 19:04:02  gouriano
  458. * restructured objmgr
  459. *
  460. *
  461. * ===========================================================================
  462. */
  463. #endif  // FEAT_CI__HPP