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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_id_mapper.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:27:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___SEQ_ID_MAPPER__HPP
  10. #define OBJECTS_OBJMGR___SEQ_ID_MAPPER__HPP
  11. /*  $Id: seq_id_mapper.hpp,v 1000.1 2004/04/12 17:27:46 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, Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Seq-id mapper for Object Manager
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <corelib/ncbi_limits.hpp>
  44. #include <corelib/ncbimtx.hpp>
  45. #include <corelib/ncbicntr.hpp>
  46. #include <corelib/ncbi_safe_static.hpp>
  47. #include <objects/seqloc/Seq_id.hpp>
  48. #include <objmgr/seq_id_handle.hpp>
  49. #include <set>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52. class CSeq_id;
  53. class CSeq_id_Which_Tree;
  54. ////////////////////////////////////////////////////////////////////
  55. //
  56. //  CSeq_id_Mapper::
  57. //
  58. //    Allows fast convertions between CSeq_id and CSeq_id_Handle,
  59. //    including searching for multiple matches for a given seq-id.
  60. //
  61. typedef set<CSeq_id_Handle>                     TSeq_id_HandleSet;
  62. class NCBI_XOBJMGR_EXPORT CSeq_id_Mapper : public CObject
  63. {
  64. public:
  65.     static CSeq_id_Mapper& GetSeq_id_Mapper(void);
  66.     
  67.     virtual ~CSeq_id_Mapper(void);
  68.     
  69.     // Get seq-id handle. Create new handle if not found and
  70.     // do_not_create is false. Get only the exactly equal seq-id handle.
  71.     CSeq_id_Handle GetGiHandle(int gi);
  72.     CSeq_id_Handle GetHandle(const CSeq_id& id, bool do_not_create = false);
  73.     // Get the list of matching handles, do not create new handles
  74.     bool HaveMatchingHandles(const CSeq_id_Handle& id);
  75.     void GetMatchingHandles(const CSeq_id_Handle& id,
  76.                             TSeq_id_HandleSet& h_set);
  77.     bool HaveReverseMatch(const CSeq_id_Handle& id);
  78.     void GetReverseMatchingHandles(const CSeq_id_Handle& id,
  79.                                    TSeq_id_HandleSet& h_set);
  80.     // Get the list of string-matching handles, do not create new handles
  81.     void GetMatchingHandlesStr(string sid,
  82.                                TSeq_id_HandleSet& h_set);
  83.     
  84.     // Get seq-id for the given handle
  85.     static CConstRef<CSeq_id> GetSeq_id(const CSeq_id_Handle& handle);
  86.     
  87. private:
  88.     CSeq_id_Mapper(void);
  89.     
  90.     friend class CSafeStaticRef<CSeq_id_Mapper>;
  91.     friend class CSeq_id_Handle;
  92.     friend class CSeq_id_Info;
  93.     // References to each handle must be tracked to re-use their values
  94.     // Each CSeq_id_Handle locks itself in the constructor and
  95.     // releases in the destructor.
  96.     bool x_IsBetter(const CSeq_id_Handle& h1, const CSeq_id_Handle& h2);
  97.     CSeq_id_Which_Tree& x_GetTree(const CSeq_id_Handle& idh);
  98.     CSeq_id_Which_Tree& x_GetTree(const CSeq_id& id);
  99.     // Hide copy constructor and operator
  100.     CSeq_id_Mapper(const CSeq_id_Mapper&);
  101.     CSeq_id_Mapper& operator= (const CSeq_id_Mapper&);
  102.     // Some map entries may point to the same subtree (e.g. gb, dbj, emb).
  103.     typedef vector<CRef<CSeq_id_Which_Tree> >                 TTrees;
  104.     TTrees          m_Trees;
  105.     mutable CMutex  m_IdMapMutex;
  106.     
  107.     static CSafeStaticRef<CSeq_id_Mapper> s_Seq_id_Mapper;
  108. };
  109. /////////////////////////////////////////////////////////////////////////////
  110. //
  111. // Inline methods
  112. //
  113. /////////////////////////////////////////////////////////////////////////////
  114. inline
  115. CConstRef<CSeq_id> CSeq_id_Mapper::GetSeq_id(const CSeq_id_Handle& h)
  116. {
  117.     return h.GetSeqId();
  118. }
  119. END_SCOPE(objects)
  120. END_NCBI_SCOPE
  121. /*
  122. * ---------------------------------------------------------------------------
  123. * $Log: seq_id_mapper.hpp,v $
  124. * Revision 1000.1  2004/04/12 17:27:46  gouriano
  125. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.23
  126. *
  127. * Revision 1.23  2004/02/19 17:25:33  vasilche
  128. * Use CRef<> to safely hold pointer to CSeq_id_Info.
  129. * CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.
  130. * Reduce number of calls to CSeq_id_Handle.GetSeqId().
  131. *
  132. * Revision 1.22  2004/02/10 21:15:14  grichenk
  133. * Added reverse ID matching.
  134. *
  135. * Revision 1.21  2004/01/22 20:10:38  vasilche
  136. * 1. Splitted ID2 specs to two parts.
  137. * ID2 now specifies only protocol.
  138. * Specification of ID2 split data is moved to seqsplit ASN module.
  139. * For now they are still reside in one resulting library as before - libid2.
  140. * As the result split specific headers are now in objects/seqsplit.
  141. * 2. Moved ID2 and ID1 specific code out of object manager.
  142. * Protocol is processed by corresponding readers.
  143. * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  144. * 3. Updated OBJMGR_LIBS correspondingly.
  145. *
  146. * Revision 1.20  2004/01/07 20:42:00  grichenk
  147. * Fixed matching of accession to accession.version
  148. *
  149. * Revision 1.19  2003/09/30 16:21:59  vasilche
  150. * Updated internal object manager classes to be able to load ID2 data.
  151. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  152. * Scope caches results of requests for data to data loaders.
  153. * Optimized CSeq_id_Handle for gis.
  154. * Optimized bioseq lookup in scope.
  155. * Reduced object allocations in annotation iterators.
  156. * CScope is allowed to be destroyed before other objects using this scope are
  157. * deleted (feature iterators, bioseq handles etc).
  158. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  159. * Added 'adaptive' option to objmgr_demo application.
  160. *
  161. * Revision 1.18  2003/06/10 19:06:34  vasilche
  162. * Simplified CSeq_id_Mapper and CSeq_id_Handle.
  163. *
  164. * Revision 1.16  2003/05/20 15:44:37  vasilche
  165. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  166. * Fixed some warnings on WorkShop.
  167. * Added workaround for memory leak on WorkShop.
  168. *
  169. * Revision 1.15  2003/04/24 16:12:37  vasilche
  170. * Object manager internal structures are splitted more straightforward.
  171. * Removed excessive header dependencies.
  172. *
  173. * Revision 1.14  2003/03/10 16:31:29  vasilche
  174. * Moved implementation constant to .cpp file.
  175. *
  176. * Revision 1.13  2003/02/25 14:48:06  vasilche
  177. * Added Win32 export modifier to object manager classes.
  178. *
  179. * Revision 1.12  2003/01/29 22:03:43  grichenk
  180. * Use single static CSeq_id_Mapper instead of per-OM model.
  181. *
  182. * Revision 1.11  2002/10/03 01:58:27  ucko
  183. * Move the definition of TSeq_id_Info above the declaration of
  184. * CSeq_id_Which_Tree, which uses it.
  185. *
  186. * Revision 1.10  2002/10/02 21:26:53  ivanov
  187. * A CSeq_id_Which_Tree class declaration moved from .cpp to .hpp to make
  188. * KCC happy
  189. *
  190. * Revision 1.9  2002/09/19 20:05:44  vasilche
  191. * Safe initialization of static mutexes
  192. *
  193. * Revision 1.8  2002/07/08 20:51:02  grichenk
  194. * Moved log to the end of file
  195. * Replaced static mutex (in CScope, CDataSource) with the mutex
  196. * pool. Redesigned CDataSource data locking.
  197. *
  198. * Revision 1.7  2002/05/06 03:28:47  vakatov
  199. * OM/OM1 renaming
  200. *
  201. * Revision 1.6  2002/04/22 20:03:48  grichenk
  202. * Redesigned keys usage table to work in 64-bit mode
  203. *
  204. * Revision 1.5  2002/03/15 18:10:09  grichenk
  205. * Removed CRef<CSeq_id> from CSeq_id_Handle, added
  206. * key to seq-id map th CSeq_id_Mapper
  207. *
  208. * Revision 1.4  2002/02/21 19:27:06  grichenk
  209. * Rearranged includes. Added scope history. Added searching for the
  210. * best seq-id match in data sources and scopes. Updated tests.
  211. *
  212. * Revision 1.3  2002/02/12 19:41:42  grichenk
  213. * Seq-id handles lock/unlock moved to CSeq_id_Handle 'ctors.
  214. *
  215. * Revision 1.2  2002/01/23 21:59:32  grichenk
  216. * Redesigned seq-id handles and mapper
  217. *
  218. *
  219. * ===========================================================================
  220. */
  221. #endif  /* OBJECTS_OBJMGR___SEQ_ID_MAPPER__HPP */