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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: scope.hpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/04/16 16:59:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.78
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJMGR_SCOPE__HPP
  10. #define OBJMGR_SCOPE__HPP
  11. /*  $Id: scope.hpp,v 1000.6 2004/04/16 16:59:56 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. * Authors:
  37. *           Andrei Gourianov
  38. *           Aleksey Grichenko
  39. *           Michael Kimelman
  40. *           Denis Vakatov
  41. *           Eugene Vasilchenko
  42. *
  43. * File Description:
  44. *           Scope is top-level object available to a client.
  45. *           Its purpose is to define a scope of visibility and reference
  46. *           resolution and provide access to the bio sequence data
  47. *
  48. */
  49. #include <corelib/ncbiobj.hpp>
  50. #include <objmgr/seq_id_handle.hpp>
  51. #include <objmgr/seq_entry_handle.hpp>
  52. #include <objmgr/bioseq_set_handle.hpp>
  53. #include <objmgr/bioseq_handle.hpp>
  54. #include <objmgr/seq_annot_handle.hpp>
  55. BEGIN_NCBI_SCOPE
  56. BEGIN_SCOPE(objects)
  57. // fwd decl
  58. // objects
  59. class CSeq_entry;
  60. class CBioseq_set;
  61. class CBioseq;
  62. class CSeq_annot;
  63. class CSeq_id;
  64. class CSeq_loc;
  65. // objmgr
  66. class CSeq_id_Handle;
  67. class CObjectManager;
  68. class CScope_Impl;
  69. class CSynonymsSet;
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CScope
  72. /////////////////////////////////////////////////////////////////////////////
  73. class NCBI_XOBJMGR_EXPORT CScope : public CObject
  74. {
  75. public:
  76.     explicit CScope(CObjectManager& objmgr);
  77.     virtual ~CScope(void);
  78.     // CBioseq_Handle methods:
  79.     // Get bioseq handle by seq-id
  80.     CBioseq_Handle GetBioseqHandle(const CSeq_id& id);
  81.     CBioseq_Handle GetBioseqHandle(const CSeq_id_Handle& id);
  82.     CBioseq_Handle GetBioseqHandle(const CSeq_loc& loc);
  83.     // Get bioseq handle without loading new data
  84.     enum EGetBioseqFlag {
  85.         eGetBioseq_Resolved, // Search only in already resolved ids
  86.         eGetBioseq_Loaded,   // Search in all loaded TSEs in the scope
  87.         eGetBioseq_All       // Search bioseq, load if not loaded yet
  88.     };
  89.     CBioseq_Handle GetBioseqHandle(const CSeq_id& id,
  90.                                    EGetBioseqFlag get_flag);
  91.     CBioseq_Handle GetBioseqHandle(const CSeq_id_Handle& id,
  92.                                    EGetBioseqFlag get_flag);
  93.     // Deprecated interface
  94.     CBioseq_Handle GetBioseqHandle(const CBioseq& bioseq);
  95.     CSeq_entry_Handle GetSeq_entryHandle(const CSeq_entry& entry);
  96.     CSeq_annot_Handle GetSeq_annotHandle(const CSeq_annot& annot);
  97.     // Get bioseq handle for sequence withing one TSE
  98.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id& id,
  99.                                           const CBioseq_Handle& bh);
  100.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id& id,
  101.                                           const CSeq_entry_Handle& seh);
  102.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id_Handle& id,
  103.                                           const CBioseq_Handle& bh);
  104.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id_Handle& id,
  105.                                           const CSeq_entry_Handle& seh);
  106.     // CScope contents modification methods
  107.     typedef int TPriority;
  108.     enum EPriority {
  109.         kPriority_NotSet = -1
  110.     };
  111.     // Add default data loaders from object manager
  112.     void AddDefaults(TPriority pri = kPriority_NotSet);
  113.     // Add data loader by name.
  114.     // The loader (or its factory) must be known to Object Manager.
  115.     void AddDataLoader(const string& loader_name,
  116.                        TPriority pri = kPriority_NotSet);
  117.     // Add the scope's datasources as a single group with the given priority
  118.     void AddScope(CScope& scope,
  119.                   TPriority pri = kPriority_NotSet);
  120.     // Add seq_entry, default priority is higher than for defaults or loaders
  121.     CSeq_entry_Handle AddTopLevelSeqEntry(CSeq_entry& top_entry,
  122.                                           TPriority pri = kPriority_NotSet);
  123.     // Add bioseq, return bioseq handle. Try to use unresolved seq-id
  124.     // from the bioseq, fail if all ids are already resolved to
  125.     // other sequences.
  126.     CBioseq_Handle AddBioseq(CBioseq& bioseq,
  127.                              TPriority pri = kPriority_NotSet);
  128.     // Add Seq-annot
  129.     CSeq_annot_Handle AddSeq_annot(const CSeq_annot& annot,
  130.                                    TPriority pri = kPriority_NotSet);
  131.     CBioseq_EditHandle GetEditHandle(const CBioseq_Handle& seq);
  132.     CSeq_entry_EditHandle GetEditHandle(const CSeq_entry_Handle& entry);
  133.     CSeq_annot_EditHandle GetEditHandle(const CSeq_annot_Handle& annot);
  134.     CBioseq_set_EditHandle GetEditHandle(const CBioseq_set_Handle& seqset);
  135.     void ResetHistory(void);
  136.     CConstRef<CSynonymsSet> GetSynonyms(const CSeq_id& id);
  137.     CConstRef<CSynonymsSet> GetSynonyms(const CSeq_id_Handle& id);
  138.     CConstRef<CSynonymsSet> GetSynonyms(const CBioseq_Handle& bh);
  139.     // deprecated interface
  140.     void AttachEntry(CSeq_entry& parent, CSeq_entry& entry);
  141.     void RemoveEntry(CSeq_entry& entry);
  142.     void AttachAnnot(CSeq_entry& parent, CSeq_annot& annot);
  143.     void RemoveAnnot(CSeq_entry& parent, CSeq_annot& annot);
  144.     void ReplaceAnnot(CSeq_entry& entry,
  145.                       CSeq_annot& old_annot, CSeq_annot& new_annot);
  146.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id& id,
  147.                                           const CSeq_entry& tse);
  148.     CBioseq_Handle GetBioseqHandleFromTSE(const CSeq_id_Handle& id,
  149.                                           const CSeq_entry& tse);
  150.     enum ETSEKind {
  151.         eManualTSEs,
  152.         eAllTSEs
  153.     };
  154.     typedef vector<CSeq_entry_Handle> TTSE_Handles;
  155.     void GetAllTSEs(TTSE_Handles& tses, enum ETSEKind kind = eManualTSEs);
  156. protected:
  157.     CScope_Impl& GetImpl(void);
  158. private:
  159.     // to prevent copying
  160.     CScope(const CScope&);
  161.     CScope& operator=(const CScope&);
  162.     friend class CSeqMap_CI;
  163.     friend class CSeq_annot_CI;
  164.     friend class CAnnot_Collector;
  165.     friend class CBioseq_CI;
  166.     friend class CHeapScope;
  167.     friend class CPrefetchToken_Impl;
  168.     CRef<CScope>      m_HeapScope;
  169.     CRef<CScope_Impl> m_Impl;
  170. };
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CScope inline methods
  173. /////////////////////////////////////////////////////////////////////////////
  174. inline
  175. CScope_Impl& CScope::GetImpl(void)
  176. {
  177.     return *m_Impl;
  178. }
  179. END_SCOPE(objects)
  180. END_NCBI_SCOPE
  181. /*
  182. * ---------------------------------------------------------------------------
  183. * $Log: scope.hpp,v $
  184. * Revision 1000.6  2004/04/16 16:59:56  gouriano
  185. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.78
  186. *
  187. * Revision 1.78  2004/04/16 13:31:46  grichenk
  188. * Added data pre-fetching functions.
  189. *
  190. * Revision 1.77  2004/04/13 16:39:36  grichenk
  191. * Corrected comments
  192. *
  193. * Revision 1.76  2004/04/13 15:59:35  grichenk
  194. * Added CScope::GetBioseqHandle() with id resolving flag.
  195. *
  196. * Revision 1.75  2004/04/12 18:40:24  grichenk
  197. * Added GetAllTSEs()
  198. *
  199. * Revision 1.74  2004/04/05 15:56:13  grichenk
  200. * Redesigned CAnnotTypes_CI: moved all data and data collecting
  201. * functions to CAnnotDataCollector. CAnnotTypes_CI is no more
  202. * inherited from SAnnotSelector.
  203. *
  204. * Revision 1.73  2004/03/24 18:30:28  vasilche
  205. * Fixed edit API.
  206. * Every *_Info object has its own shallow copy of original object.
  207. *
  208. * Revision 1.72  2004/03/16 15:47:26  vasilche
  209. * Added CBioseq_set_Handle and set of EditHandles
  210. *
  211. * Revision 1.71  2004/02/19 17:23:00  vasilche
  212. * Changed order of deletion of heap scope and scope impl objects.
  213. * Reduce number of calls to x_ResetHistory().
  214. *
  215. * Revision 1.70  2004/02/02 14:46:42  vasilche
  216. * Several performance fixed - do not iterate whole tse set in CDataSource.
  217. *
  218. * Revision 1.69  2004/01/29 20:33:27  vasilche
  219. * Do not resolve any Seq-ids in CScope::GetSynonyms() -
  220. * assume all not resolved Seq-id as synonym.
  221. * Seq-id conflict messages made clearer.
  222. *
  223. * Revision 1.68  2004/01/27 17:11:13  ucko
  224. * Remove redundant forward declaration of CTSE_Info
  225. *
  226. * Revision 1.67  2003/12/29 20:04:52  grichenk
  227. * CHeapScope can be initialized with null pointer.
  228. *
  229. * Revision 1.66  2003/12/18 16:38:05  grichenk
  230. * Added CScope::RemoveEntry()
  231. *
  232. * Revision 1.65  2003/11/28 15:13:24  grichenk
  233. * Added CSeq_entry_Handle
  234. *
  235. * Revision 1.64  2003/11/21 20:33:03  grichenk
  236. * Added GetBioseqHandleFromTSE(CSeq_id, CSeq_entry)
  237. *
  238. * Revision 1.63  2003/11/12 15:49:48  vasilche
  239. * Added loading annotations on non gi Seq-id.
  240. *
  241. * Revision 1.62  2003/10/07 13:43:22  vasilche
  242. * Added proper handling of named Seq-annots.
  243. * Added feature search from named Seq-annots.
  244. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  245. * Fixed selection of blobs for loading from GenBank.
  246. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  247. * Fixed leaked split chunks annotation stubs.
  248. * Moved some classes definitions in separate *.cpp files.
  249. *
  250. * Revision 1.61  2003/09/30 16:21:59  vasilche
  251. * Updated internal object manager classes to be able to load ID2 data.
  252. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  253. * Scope caches results of requests for data to data loaders.
  254. * Optimized CSeq_id_Handle for gis.
  255. * Optimized bioseq lookup in scope.
  256. * Reduced object allocations in annotation iterators.
  257. * CScope is allowed to be destroyed before other objects using this scope are
  258. * deleted (feature iterators, bioseq handles etc).
  259. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  260. * Added 'adaptive' option to objmgr_demo application.
  261. *
  262. * Revision 1.60  2003/09/05 20:50:24  grichenk
  263. * +AddBioseq(CBioseq&)
  264. *
  265. * Revision 1.59  2003/09/03 19:59:59  grichenk
  266. * Added sequence filtering by level (mains/parts/all)
  267. *
  268. * Revision 1.58  2003/08/12 18:25:39  grichenk
  269. * Fixed default priorities
  270. *
  271. * Revision 1.57  2003/08/06 20:51:14  grichenk
  272. * Removed declarations of non-existent methods
  273. *
  274. * Revision 1.56  2003/08/04 17:02:57  grichenk
  275. * Added constructors to iterate all annotations from a
  276. * seq-entry or seq-annot.
  277. *
  278. * Revision 1.55  2003/07/25 15:25:22  grichenk
  279. * Added CSeq_annot_CI class
  280. *
  281. * Revision 1.54  2003/07/17 20:07:55  vasilche
  282. * Reduced memory usage by feature indexes.
  283. * SNP data is loaded separately through PUBSEQ_OS.
  284. * String compression for SNP data.
  285. *
  286. * Revision 1.53  2003/06/30 18:42:09  vasilche
  287. * CPriority_I made to use less memory allocations/deallocations.
  288. *
  289. * Revision 1.52  2003/06/19 18:34:07  vasilche
  290. * Fixed compilation on Windows.
  291. *
  292. * Revision 1.51  2003/06/19 18:23:44  vasilche
  293. * Added several CXxx_ScopeInfo classes for CScope related information.
  294. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  295. * Some fine tuning of locking in CScope.
  296. *
  297. * Revision 1.49  2003/05/27 19:44:04  grichenk
  298. * Added CSeqVector_CI class
  299. *
  300. * Revision 1.48  2003/05/20 15:44:37  vasilche
  301. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  302. * Fixed some warnings on WorkShop.
  303. * Added workaround for memory leak on WorkShop.
  304. *
  305. * Revision 1.47  2003/05/14 18:39:25  grichenk
  306. * Simplified TSE caching and filtering in CScope, removed
  307. * some obsolete members and functions.
  308. *
  309. * Revision 1.46  2003/05/12 19:18:28  vasilche
  310. * Fixed locking of object manager classes in multi-threaded application.
  311. *
  312. * Revision 1.45  2003/05/06 18:54:06  grichenk
  313. * Moved TSE filtering from CDataSource to CScope, changed
  314. * some filtering rules (e.g. priority is now more important
  315. * than scope history). Added more caches to CScope.
  316. *
  317. * Revision 1.44  2003/04/29 19:51:12  vasilche
  318. * Fixed interaction of Data Loader garbage collector and TSE locking mechanism.
  319. * Made some typedefs more consistent.
  320. *
  321. * Revision 1.43  2003/04/24 17:24:57  vasilche
  322. * SAnnotSelector is struct.
  323. * Added include required by MS VC.
  324. *
  325. * Revision 1.42  2003/04/24 16:12:37  vasilche
  326. * Object manager internal structures are splitted more straightforward.
  327. * Removed excessive header dependencies.
  328. *
  329. * Revision 1.41  2003/04/09 16:04:29  grichenk
  330. * SDataSourceRec replaced with CPriorityNode
  331. * Added CScope::AddScope(scope, priority) to allow scope nesting
  332. *
  333. * Revision 1.40  2003/04/03 14:18:08  vasilche
  334. * Added public GetSynonyms() method.
  335. *
  336. * Revision 1.39  2003/03/26 21:00:07  grichenk
  337. * Added seq-id -> tse with annotation cache to CScope
  338. *
  339. * Revision 1.38  2003/03/24 21:26:42  grichenk
  340. * Added support for CTSE_CI
  341. *
  342. * Revision 1.37  2003/03/21 19:22:48  grichenk
  343. * Redesigned TSE locking, replaced CTSE_Lock with CRef<CTSE_Info>.
  344. *
  345. * Revision 1.36  2003/03/18 14:46:36  grichenk
  346. * Set limit object type to "none" if the object is null.
  347. *
  348. * Revision 1.35  2003/03/12 20:09:30  grichenk
  349. * Redistributed members between CBioseq_Handle, CBioseq_Info and CTSE_Info
  350. *
  351. * Revision 1.34  2003/03/11 14:15:49  grichenk
  352. * +Data-source priority
  353. *
  354. * Revision 1.33  2003/03/10 16:55:16  vasilche
  355. * Cleaned SAnnotSelector structure.
  356. * Added shortcut when features are limited to one TSE.
  357. *
  358. * Revision 1.32  2003/03/03 20:32:47  vasilche
  359. * Removed obsolete method GetSynonyms().
  360. *
  361. * Revision 1.31  2003/02/28 20:02:35  grichenk
  362. * Added synonyms cache and x_GetSynonyms()
  363. *
  364. * Revision 1.30  2003/02/27 14:35:32  vasilche
  365. * Splitted PopulateTSESet() by logically independent parts.
  366. *
  367. * Revision 1.29  2003/02/24 18:57:21  vasilche
  368. * Make feature gathering in one linear pass using CSeqMap iterator.
  369. * Do not use feture index by sub locations.
  370. * Sort features at the end of gathering in one vector.
  371. * Extracted some internal structures and classes in separate header.
  372. * Delay creation of mapped features.
  373. *
  374. * Revision 1.28  2003/01/22 20:11:53  vasilche
  375. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  376. * CSeqMap_CI now supports resolution and iteration over sequence range.
  377. * Added several caches to CScope.
  378. * Optimized CSeqVector().
  379. * Added serveral variants of CBioseqHandle::GetSeqVector().
  380. * Tried to optimize annotations iterator (not much success).
  381. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  382. *
  383. * Revision 1.27  2002/12/26 20:51:36  dicuccio
  384. * Added Win32 export specifier
  385. *
  386. * Revision 1.26  2002/12/26 16:39:21  vasilche
  387. * Object manager class CSeqMap rewritten.
  388. *
  389. * Revision 1.25  2002/11/08 22:15:50  grichenk
  390. * Added methods for removing/replacing annotations
  391. *
  392. * Revision 1.24  2002/11/01 05:34:06  kans
  393. * added GetBioseqHandle taking CBioseq parameter
  394. *
  395. * Revision 1.23  2002/10/31 22:25:09  kans
  396. * added GetBioseqHandle taking CSeq_loc parameter
  397. *
  398. * Revision 1.22  2002/10/18 19:12:39  grichenk
  399. * Removed mutex pools, converted most static mutexes to non-static.
  400. * Protected CSeqMap::x_Resolve() with mutex. Modified code to prevent
  401. * dead-locks.
  402. *
  403. * Revision 1.21  2002/10/02 17:58:21  grichenk
  404. * Added sequence type filter to CBioseq_CI
  405. *
  406. * Revision 1.20  2002/09/30 20:01:17  grichenk
  407. * Added methods to support CBioseq_CI
  408. *
  409. * Revision 1.19  2002/07/08 20:50:56  grichenk
  410. * Moved log to the end of file
  411. * Replaced static mutex (in CScope, CDataSource) with the mutex
  412. * pool. Redesigned CDataSource data locking.
  413. *
  414. * Revision 1.18  2002/06/04 17:18:32  kimelman
  415. * memory cleanup :  new/delete/Cref rearrangements
  416. *
  417. * Revision 1.17  2002/05/28 18:01:11  gouriano
  418. * DebugDump added
  419. *
  420. * Revision 1.16  2002/05/14 20:06:23  grichenk
  421. * Improved CTSE_Info locking by CDataSource and CDataLoader
  422. *
  423. * Revision 1.15  2002/05/06 03:30:36  vakatov
  424. * OM/OM1 renaming
  425. *
  426. * Revision 1.14  2002/05/03 21:28:02  ucko
  427. * Introduce T(Signed)SeqPos.
  428. *
  429. * Revision 1.13  2002/04/17 21:09:38  grichenk
  430. * Fixed annotations loading
  431. *
  432. * Revision 1.12  2002/04/08 19:14:15  gouriano
  433. * corrected comment to AddDefaults()
  434. *
  435. * Revision 1.11  2002/03/27 18:46:26  gouriano
  436. * three functions made public
  437. *
  438. * Revision 1.10  2002/03/20 21:20:38  grichenk
  439. * +CScope::ResetHistory()
  440. *
  441. * Revision 1.9  2002/02/21 19:27:00  grichenk
  442. * Rearranged includes. Added scope history. Added searching for the
  443. * best seq-id match in data sources and scopes. Updated tests.
  444. *
  445. * Revision 1.8  2002/02/07 21:27:33  grichenk
  446. * Redesigned CDataSource indexing: seq-id handle -> TSE -> seq/annot
  447. *
  448. * Revision 1.7  2002/02/06 21:46:43  gouriano
  449. * *** empty log message ***
  450. *
  451. * Revision 1.6  2002/02/05 21:47:21  gouriano
  452. * added FindSeqid function, minor tuneup in CSeq_id_mapper
  453. *
  454. * Revision 1.5  2002/01/28 19:45:33  gouriano
  455. * changed the interface of BioseqHandle: two functions moved from Scope
  456. *
  457. * Revision 1.4  2002/01/23 21:59:29  grichenk
  458. * Redesigned seq-id handles and mapper
  459. *
  460. * Revision 1.3  2002/01/18 17:07:12  gouriano
  461. * renamed GetSequence to GetSeqVector
  462. *
  463. * Revision 1.2  2002/01/16 16:26:35  gouriano
  464. * restructured objmgr
  465. *
  466. * Revision 1.1  2002/01/11 19:04:03  gouriano
  467. * restructured objmgr
  468. *
  469. *
  470. * ===========================================================================
  471. */
  472. #endif//OBJMGR_SCOPE__HPP