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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_id_mapper.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:24:05  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_id_mapper.cpp,v 1000.2 2004/06/01 19:24:05 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Aleksey Grichenko, Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Seq-id mapper for Object Manager
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/seq_id_mapper.hpp>
  42. #include <objmgr/impl/seq_id_tree.hpp>
  43. #include <objmgr/objmgr_exception.hpp>
  44. BEGIN_NCBI_SCOPE
  45. BEGIN_SCOPE(objects)
  46. ////////////////////////////////////////////////////////////////////
  47. //
  48. //  CSeq_id_Mapper::
  49. //
  50. CSafeStaticRef<CSeq_id_Mapper> CSeq_id_Mapper::s_Seq_id_Mapper;
  51. CSeq_id_Mapper& CSeq_id_Mapper::GetSeq_id_Mapper(void)
  52. {
  53.     return s_Seq_id_Mapper.Get();
  54. }
  55. CSeq_id_Mapper::CSeq_id_Mapper(void)
  56. {
  57.     CSeq_id_Which_Tree::Initialize(m_Trees);
  58. }
  59. CSeq_id_Mapper::~CSeq_id_Mapper(void)
  60. {
  61. #ifdef _DEBUG
  62.     CSeq_id_Handle::DumpRegister("~CSeq_id_Mapper");
  63. #endif
  64.     ITERATE ( TTrees, it, m_Trees ) {
  65.         _ASSERT((*it)->Empty());
  66.     }
  67. }
  68. inline
  69. CSeq_id_Which_Tree& CSeq_id_Mapper::x_GetTree(const CSeq_id& id)
  70. {
  71.     CSeq_id::E_Choice type = id.Which();
  72.     _ASSERT(size_t(type) < m_Trees.size());
  73.     return *m_Trees[type];
  74. }
  75. inline
  76. CSeq_id_Which_Tree& CSeq_id_Mapper::x_GetTree(const CSeq_id_Handle& idh)
  77. {
  78.     return idh? *idh.m_Info->GetTree(): *m_Trees[CSeq_id::e_not_set];
  79. }
  80. CSeq_id_Handle CSeq_id_Mapper::GetGiHandle(int gi)
  81. {
  82.     _ASSERT(size_t(CSeq_id::e_Gi) < m_Trees.size());
  83.     return m_Trees[CSeq_id::e_Gi]->GetGiHandle(gi);
  84. }
  85. CSeq_id_Handle CSeq_id_Mapper::GetHandle(const CSeq_id& id, bool do_not_create)
  86. {
  87.     CSeq_id_Which_Tree& tree = x_GetTree(id);
  88.     return do_not_create? tree.FindInfo(id): tree.FindOrCreate(id);
  89. }
  90. bool CSeq_id_Mapper::HaveMatchingHandles(const CSeq_id_Handle& idh)
  91. {
  92.     return x_GetTree(idh).HaveMatch(idh);
  93. }
  94. void CSeq_id_Mapper::GetMatchingHandles(const CSeq_id_Handle& idh,
  95.                                         TSeq_id_HandleSet& h_set)
  96. {
  97.     x_GetTree(idh).FindMatch(idh, h_set);
  98. }
  99. bool CSeq_id_Mapper::HaveReverseMatch(const CSeq_id_Handle& idh)
  100. {
  101.     return x_GetTree(idh).HaveReverseMatch(idh);
  102. }
  103. void CSeq_id_Mapper::GetReverseMatchingHandles(const CSeq_id_Handle& idh,
  104.                                                TSeq_id_HandleSet& h_set)
  105. {
  106.     x_GetTree(idh).FindReverseMatch(idh, h_set);
  107. }
  108. void CSeq_id_Mapper::GetMatchingHandlesStr(string sid,
  109.                                            TSeq_id_HandleSet& h_set)
  110. {
  111.     if (sid.find('|') != string::npos) {
  112.         NCBI_THROW(CObjMgrException, eIdMapperError,
  113.                    "Symbol '|' is not supported here");
  114.     }
  115.     ITERATE(TTrees, tree_it, m_Trees) {
  116.         (*tree_it)->FindMatchStr(sid, h_set);
  117.     }
  118. }
  119. bool CSeq_id_Mapper::x_IsBetter(const CSeq_id_Handle& h1, const CSeq_id_Handle& h2)
  120. {
  121.     CSeq_id_Which_Tree& tree1 = x_GetTree(h1);
  122.     CSeq_id_Which_Tree& tree2 = x_GetTree(h2);
  123.     if ( &tree1 != &tree2 )
  124.         return false;
  125.     // Compare versions if any
  126.     return tree1.IsBetterVersion(h1, h2);
  127. }
  128. END_SCOPE(objects)
  129. END_NCBI_SCOPE
  130. /*
  131. * ---------------------------------------------------------------------------
  132. * $Log: seq_id_mapper.cpp,v $
  133. * Revision 1000.2  2004/06/01 19:24:05  gouriano
  134. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  135. *
  136. * Revision 1.44  2004/05/21 21:42:13  gorelenk
  137. * Added PCH ncbi_pch.hpp
  138. *
  139. * Revision 1.43  2004/02/19 17:25:35  vasilche
  140. * Use CRef<> to safely hold pointer to CSeq_id_Info.
  141. * CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.
  142. * Reduce number of calls to CSeq_id_Handle.GetSeqId().
  143. *
  144. * Revision 1.42  2004/02/10 21:15:16  grichenk
  145. * Added reverse ID matching.
  146. *
  147. * Revision 1.41  2004/01/22 20:10:41  vasilche
  148. * 1. Splitted ID2 specs to two parts.
  149. * ID2 now specifies only protocol.
  150. * Specification of ID2 split data is moved to seqsplit ASN module.
  151. * For now they are still reside in one resulting library as before - libid2.
  152. * As the result split specific headers are now in objects/seqsplit.
  153. * 2. Moved ID2 and ID1 specific code out of object manager.
  154. * Protocol is processed by corresponding readers.
  155. * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  156. * 3. Updated OBJMGR_LIBS correspondingly.
  157. *
  158. * Revision 1.40  2003/10/07 13:43:23  vasilche
  159. * Added proper handling of named Seq-annots.
  160. * Added feature search from named Seq-annots.
  161. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  162. * Fixed selection of blobs for loading from GenBank.
  163. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  164. * Fixed leaked split chunks annotation stubs.
  165. * Moved some classes definitions in separate *.cpp files.
  166. *
  167. * Revision 1.39  2003/09/30 16:22:03  vasilche
  168. * Updated internal object manager classes to be able to load ID2 data.
  169. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  170. * Scope caches results of requests for data to data loaders.
  171. * Optimized CSeq_id_Handle for gis.
  172. * Optimized bioseq lookup in scope.
  173. * Reduced object allocations in annotation iterators.
  174. * CScope is allowed to be destroyed before other objects using this scope are
  175. * deleted (feature iterators, bioseq handles etc).
  176. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  177. * Added 'adaptive' option to objmgr_demo application.
  178. *
  179. * Revision 1.38  2003/09/05 17:29:40  grichenk
  180. * Structurized Object Manager exceptions
  181. *
  182. * Revision 1.37  2003/06/10 19:06:35  vasilche
  183. * Simplified CSeq_id_Mapper and CSeq_id_Handle.
  184. *
  185. * Revision 1.35  2003/05/20 15:44:38  vasilche
  186. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  187. * Fixed some warnings on WorkShop.
  188. * Added workaround for memory leak on WorkShop.
  189. *
  190. * Revision 1.34  2003/05/06 18:51:15  grichenk
  191. * Fixed minor bug in keys allocation
  192. *
  193. * Revision 1.33  2003/04/24 16:12:38  vasilche
  194. * Object manager internal structures are splitted more straightforward.
  195. * Removed excessive header dependencies.
  196. *
  197. * Revision 1.32  2003/04/18 13:45:48  grichenk
  198. * Fixed bug in CSeq_id_Mapper::IsBetter()
  199. *
  200. * Revision 1.31  2003/03/11 16:15:04  kuznets
  201. * Misprint corrected
  202. *
  203. * Revision 1.30  2003/03/11 15:51:06  kuznets
  204. * iterate -> ITERATE
  205. *
  206. * Revision 1.29  2003/03/10 16:31:30  vasilche
  207. * Moved implementation constant to .cpp file.
  208. *
  209. * Revision 1.28  2003/02/21 14:33:51  grichenk
  210. * Display warning but don't crash on uninitialized seq-ids.
  211. *
  212. * Revision 1.27  2003/01/29 22:03:46  grichenk
  213. * Use single static CSeq_id_Mapper instead of per-OM model.
  214. *
  215. * Revision 1.26  2003/01/22 20:11:54  vasilche
  216. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  217. * CSeqMap_CI now supports resolution and iteration over sequence range.
  218. * Added several caches to CScope.
  219. * Optimized CSeqVector().
  220. * Added serveral variants of CBioseqHandle::GetSeqVector().
  221. * Tried to optimize annotations iterator (not much success).
  222. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  223. *
  224. * Revision 1.25  2003/01/02 19:40:04  gouriano
  225. * added checking CSeq_id for validity
  226. *
  227. * Revision 1.24  2002/12/26 20:55:18  dicuccio
  228. * Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree
  229. *
  230. * Revision 1.23  2002/11/08 19:43:35  grichenk
  231. * CConstRef<> constructor made explicit
  232. *
  233. * Revision 1.22  2002/11/04 21:29:12  grichenk
  234. * Fixed usage of const CRef<> and CRef<> constructor
  235. *
  236. * Revision 1.21  2002/10/02 21:26:52  ivanov
  237. * A CSeq_id_Which_Tree class declaration moved from .cpp to .hpp to make
  238. * KCC happy
  239. *
  240. * Revision 1.20  2002/08/30 18:33:27  grichenk
  241. * Fixed bug in segment releasing code
  242. *
  243. * Revision 1.19  2002/08/20 14:27:22  grichenk
  244. * Fixed the problem with PDB ids
  245. *
  246. * Revision 1.18  2002/07/15 20:33:49  ucko
  247. * CExceptString is now CStringException.
  248. *
  249. * Revision 1.17  2002/07/12 19:32:10  grichenk
  250. * Fixed exception name
  251. *
  252. * Revision 1.16  2002/05/24 14:57:13  grichenk
  253. * SerialAssign<>() -> CSerialObject::Assign()
  254. *
  255. * Revision 1.15  2002/05/09 14:18:55  grichenk
  256. * Fixed "unused variable" warnings
  257. *
  258. * Revision 1.14  2002/05/03 13:18:44  grichenk
  259. * OM_THROW_TRACE -> THROW1_TRACE
  260. *
  261. * Revision 1.13  2002/05/03 03:15:24  vakatov
  262. * Temp. fix for the missing header <objects/objmgr1/om_defs.hpp>
  263. *
  264. * Revision 1.12  2002/05/02 20:42:37  grichenk
  265. * throw -> THROW1_TRACE
  266. *
  267. * Revision 1.11  2002/04/22 20:03:48  grichenk
  268. * Redesigned keys usage table to work in 64-bit mode
  269. *
  270. * Revision 1.10  2002/04/09 17:49:46  grichenk
  271. * Fixed signed/unsigned warnings
  272. *
  273. * Revision 1.9  2002/03/22 21:51:04  grichenk
  274. * Added indexing textseq-id without accession
  275. *
  276. * Revision 1.8  2002/03/15 18:10:09  grichenk
  277. * Removed CRef<CSeq_id> from CSeq_id_Handle, added
  278. * key to seq-id map th CSeq_id_Mapper
  279. *
  280. * Revision 1.7  2002/02/25 21:05:29  grichenk
  281. * Removed seq-data references caching. Increased MT-safety. Fixed typos.
  282. *
  283. * Revision 1.6  2002/02/21 19:27:06  grichenk
  284. * Rearranged includes. Added scope history. Added searching for the
  285. * best seq-id match in data sources and scopes. Updated tests.
  286. *
  287. * Revision 1.5  2002/02/12 19:41:42  grichenk
  288. * Seq-id handles lock/unlock moved to CSeq_id_Handle 'ctors.
  289. *
  290. * Revision 1.4  2002/02/06 21:46:11  gouriano
  291. * *** empty log message ***
  292. *
  293. * Revision 1.3  2002/02/05 21:46:28  gouriano
  294. * added FindSeqid function, minor tuneup in CSeq_id_mapper
  295. *
  296. * Revision 1.2  2002/02/01 21:49:51  gouriano
  297. * minor changes to make it compilable and run on Solaris Workshop
  298. *
  299. * Revision 1.1  2002/01/23 21:57:49  grichenk
  300. * Splitted id_handles.hpp
  301. *
  302. * ===========================================================================
  303. */