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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_vector.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:28:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.50
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_VECTOR__HPP
  10. #define SEQ_VECTOR__HPP
  11. /*  $Id: seq_vector.hpp,v 1000.2 2004/04/12 17:28:00 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. *   Sequence data container for object manager
  40. *
  41. */
  42. #include <objmgr/bioseq_handle.hpp>
  43. #include <objmgr/scope.hpp>
  44. #include <objmgr/seq_map.hpp>
  45. #include <objmgr/seq_vector_ci.hpp>
  46. #include <objects/seq/Seq_data.hpp>
  47. #include <vector>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(objects)
  50. class CScope;
  51. class CSeq_loc;
  52. class CSeqMap;
  53. class CSeq_data;
  54. class CSeqVector_CI;
  55. // Sequence data
  56. struct NCBI_XOBJMGR_EXPORT SSeqData {
  57.     TSeqPos              length;      /// Length of the sequence data piece
  58.     TSeqPos              dest_start;  /// Starting pos in the dest. Bioseq
  59.     TSeqPos              src_start;   /// Starting pos in the source Bioseq
  60.     CConstRef<CSeq_data> src_data;    /// Source sequence data
  61. };
  62. class NCBI_XOBJMGR_EXPORT CSeqVector : public CObject
  63. {
  64. public:
  65.     typedef CSeqVector_CI::TResidue TResidue;
  66.     typedef CSeqVector_CI::TCoding  TCoding;
  67.     typedef CBioseq_Handle::EVectorCoding EVectorCoding;
  68.     typedef CSeqVector_CI const_iterator;
  69.     typedef TResidue value_type;
  70.     typedef TSeqPos size_type;
  71.     typedef TSignedSeqPos difference_type;
  72.     CSeqVector(void);
  73.     CSeqVector(const CSeqMap& seqMap, CScope& scope,
  74.                EVectorCoding coding = CBioseq_Handle::eCoding_Ncbi,
  75.                ENa_strand strand = eNa_strand_unknown);
  76.     CSeqVector(CConstRef<CSeqMap> seqMap, CScope& scope,
  77.                EVectorCoding coding = CBioseq_Handle::eCoding_Ncbi,
  78.                ENa_strand strand = eNa_strand_unknown);
  79.     CSeqVector(const CSeq_loc& loc, CScope& scope,
  80.                EVectorCoding coding = CBioseq_Handle::eCoding_Ncbi,
  81.                ENa_strand strand = eNa_strand_unknown);
  82.     CSeqVector(const CSeqVector& vec);
  83.     virtual ~CSeqVector(void);
  84.     CSeqVector& operator= (const CSeqVector& vec);
  85.     bool empty(void) const;
  86.     TSeqPos size(void) const;
  87.     // 0-based array of residues
  88.     TResidue operator[] (TSeqPos pos) const;
  89.     // Fill the buffer string with the sequence data for the interval
  90.     // [start, stop).
  91.     void GetSeqData(TSeqPos start, TSeqPos stop, string& buffer) const;
  92.     void GetSeqData(const const_iterator& start,
  93.                     const const_iterator& stop,
  94.                     string& buffer) const;
  95.     typedef CSeq_inst::TMol TMol;
  96.     TMol GetSequenceType(void) const;
  97.     bool IsProtein(void) const;
  98.     bool IsNucleotide(void) const;
  99.     CScope& GetScope(void) const;
  100.     const CSeqMap& GetSeqMap(void) const;
  101.     ENa_strand GetStrand(void) const;
  102.     // Target sequence coding. CSeq_data::e_not_set -- do not
  103.     // convert sequence (use GetCoding() to check the real coding).
  104.     TCoding GetCoding(void) const;
  105.     void SetCoding(TCoding coding);
  106.     // Set coding to either Iupacaa or Iupacna depending on molecule type
  107.     void SetIupacCoding(void);
  108.     // Set coding to either Ncbi8aa or Ncbi8na depending on molecule type
  109.     void SetNcbiCoding(void);
  110.     // Set coding to either Iupac or Ncbi8xx
  111.     void SetCoding(EVectorCoding coding);
  112.     // Return gap symbol corresponding to the selected coding
  113.     TResidue GetGapChar(void) const;
  114.     bool CanGetRange(TSeqPos from, TSeqPos to) const;
  115.     bool CanGetRange(const const_iterator& from,
  116.                      const const_iterator& to) const;
  117.     const_iterator begin(void) const;
  118.     const_iterator end(void) const;
  119. private:
  120.     friend class CBioseq_Handle;
  121.     friend class CSeqVector_CI;
  122.     void x_InitSequenceType(void);
  123.     static TResidue x_GetGapChar(TCoding coding);
  124.     CSeqVector_CI& x_GetIterator(TSeqPos pos) const;
  125.     CSeqVector_CI* x_CreateIterator(TSeqPos pos) const;
  126.     static const char* sx_GetConvertTable(TCoding src, TCoding dst,
  127.                                           bool reverse);
  128.     CConstRef<CSeqMap>    m_SeqMap;
  129.     CHeapScope            m_Scope;
  130.     TSeqPos               m_Size;
  131.     TMol                  m_Mol;
  132.     ENa_strand            m_Strand;
  133.     TCoding               m_Coding;
  134.     mutable CSeqVector_CI m_Iterator;
  135. };
  136. /////////////////////////////////////////////////////////////////////
  137. //
  138. //  Inline methods
  139. //
  140. /////////////////////////////////////////////////////////////////////
  141. inline
  142. CSeqVector::TResidue CSeqVector::operator[] (TSeqPos pos) const
  143. {
  144.     return *m_Iterator.SetPos(pos);
  145. }
  146. inline
  147. bool CSeqVector::empty(void) const
  148. {
  149.     return m_Size == 0;
  150. }
  151. inline
  152. TSeqPos CSeqVector::size(void) const
  153. {
  154.     return m_Size;
  155. }
  156. inline
  157. CSeqVector_CI CSeqVector::begin(void) const
  158. {
  159.     return CSeqVector_CI(*this, 0);
  160. }
  161. inline
  162. CSeqVector_CI CSeqVector::end(void) const
  163. {
  164.     return CSeqVector_CI(*this, size());
  165. }
  166. inline
  167. CSeqVector::TCoding CSeqVector::GetCoding(void) const
  168. {
  169.     return m_Coding;
  170. }
  171. inline
  172. CSeqVector::TResidue CSeqVector::GetGapChar(void) const
  173. {
  174.     return x_GetGapChar(GetCoding());
  175. }
  176. inline
  177. const CSeqMap& CSeqVector::GetSeqMap(void) const
  178. {
  179.     return *m_SeqMap;
  180. }
  181. inline
  182. CScope& CSeqVector::GetScope(void) const
  183. {
  184.     return m_Scope;
  185. }
  186. inline
  187. ENa_strand CSeqVector::GetStrand(void) const
  188. {
  189.     return m_Strand;
  190. }
  191. inline
  192. bool CSeqVector::CanGetRange(const const_iterator& from,
  193.                              const const_iterator& to) const
  194. {
  195.     return CanGetRange(from.GetPos(), to.GetPos());
  196. }
  197. inline
  198. CSeqVector::TMol CSeqVector::GetSequenceType(void) const
  199. {
  200.     return m_Mol;
  201. }
  202. inline
  203. bool CSeqVector::IsProtein(void) const
  204. {
  205.     return m_Mol == CSeq_inst::eMol_aa;
  206. }
  207. inline
  208. bool CSeqVector::IsNucleotide(void) const
  209. {
  210.     return m_Mol != CSeq_inst::eMol_aa;
  211. }
  212. inline
  213. void CSeqVector::GetSeqData(TSeqPos start, TSeqPos stop, string& buffer) const
  214. {
  215.     m_Iterator.GetSeqData(start, stop, buffer);
  216. }
  217. inline
  218. void CSeqVector::GetSeqData(const const_iterator& start,
  219.                             const const_iterator& stop,
  220.                             string& buffer) const
  221. {
  222.     m_Iterator.GetSeqData(start.GetPos(), stop.GetPos(), buffer);
  223. }
  224. END_SCOPE(objects)
  225. END_NCBI_SCOPE
  226. /*
  227. * ---------------------------------------------------------------------------
  228. * $Log: seq_vector.hpp,v $
  229. * Revision 1000.2  2004/04/12 17:28:00  gouriano
  230. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.50
  231. *
  232. * Revision 1.50  2004/04/12 16:49:16  vasilche
  233. * Allow null scope in CSeqMap_CI and CSeqVector.
  234. *
  235. * Revision 1.49  2004/02/25 18:58:17  shomrat
  236. * Added a new construtor based on Seq-loc in scope
  237. *
  238. * Revision 1.48  2003/12/02 18:28:07  grichenk
  239. * Pass const_iterator to GetSeqData by reference.
  240. *
  241. * Revision 1.47  2003/12/02 16:42:49  grichenk
  242. * Fixed GetSeqData to return empty string if start > stop.
  243. * Added GetSeqData(const_iterator, const_iterator, string).
  244. *
  245. * Revision 1.46  2003/10/24 19:28:12  vasilche
  246. * Added implementation of CSeqVector::empty().
  247. *
  248. * Revision 1.45  2003/10/08 14:16:54  vasilche
  249. * Removed circular reference CSeqVector <-> CSeqVector_CI.
  250. *
  251. * Revision 1.44  2003/09/30 16:21:59  vasilche
  252. * Updated internal object manager classes to be able to load ID2 data.
  253. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  254. * Scope caches results of requests for data to data loaders.
  255. * Optimized CSeq_id_Handle for gis.
  256. * Optimized bioseq lookup in scope.
  257. * Reduced object allocations in annotation iterators.
  258. * CScope is allowed to be destroyed before other objects using this scope are
  259. * deleted (feature iterators, bioseq handles etc).
  260. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  261. * Added 'adaptive' option to objmgr_demo application.
  262. *
  263. * Revision 1.43  2003/08/29 13:34:47  vasilche
  264. * Rewrote CSeqVector/CSeqVector_CI code to allow better inlining.
  265. * CSeqVector::operator[] made significantly faster.
  266. * Added possibility to have platform dependent byte unpacking functions.
  267. *
  268. * Revision 1.42  2003/08/21 18:43:29  vasilche
  269. * Added CSeqVector::IsProtein() and CSeqVector::IsNucleotide() methods.
  270. *
  271. * Revision 1.41  2003/08/21 13:32:04  vasilche
  272. * Optimized CSeqVector iteration.
  273. * Set some CSeqVector values (mol type, coding) in constructor instead of detecting them while iteration.
  274. * Remove unsafe bit manipulations with coding.
  275. *
  276. * Revision 1.40  2003/07/17 19:10:27  grichenk
  277. * Added methods for seq-map and seq-vector validation,
  278. * updated demo.
  279. *
  280. * Revision 1.39  2003/06/24 19:46:41  grichenk
  281. * Changed cache from vector<char> to char*. Made
  282. * CSeqVector::operator[] inline.
  283. *
  284. * Revision 1.38  2003/06/13 19:40:14  grichenk
  285. * Removed _ASSERT() from x_GetSeqMap()
  286. *
  287. * Revision 1.37  2003/06/13 17:22:26  grichenk
  288. * Check if seq-map is not null before using it
  289. *
  290. * Revision 1.36  2003/06/12 18:38:47  vasilche
  291. * Added default constructor of CSeqVector.
  292. *
  293. * Revision 1.35  2003/06/11 19:32:53  grichenk
  294. * Added molecule type caching to CSeqMap, simplified
  295. * coding and sequence type calculations in CSeqVector.
  296. *
  297. * Revision 1.34  2003/06/02 16:01:36  dicuccio
  298. * Rearranged include/objects/ subtree.  This includes the following shifts:
  299. *     - include/objects/alnmgr --> include/objtools/alnmgr
  300. *     - include/objects/cddalignview --> include/objtools/cddalignview
  301. *     - include/objects/flat --> include/objtools/flat
  302. *     - include/objects/objmgr/ --> include/objmgr/
  303. *     - include/objects/util/ --> include/objmgr/util/
  304. *     - include/objects/validator --> include/objtools/validator
  305. *
  306. * Revision 1.33  2003/05/27 19:44:04  grichenk
  307. * Added CSeqVector_CI class
  308. *
  309. * Revision 1.32  2003/05/20 15:44:37  vasilche
  310. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  311. * Fixed some warnings on WorkShop.
  312. * Added workaround for memory leak on WorkShop.
  313. *
  314. * Revision 1.31  2003/05/05 21:00:27  vasilche
  315. * Fix assignment of empty CSeqVector.
  316. *
  317. * Revision 1.30  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.29  2003/04/24 16:12:37  vasilche
  322. * Object manager internal structures are splitted more straightforward.
  323. * Removed excessive header dependencies.
  324. *
  325. * Revision 1.28  2003/02/27 20:56:03  vasilche
  326. * kTypeUnknown bit made fitting in 8 bit integer.
  327. *
  328. * Revision 1.27  2003/02/25 14:48:06  vasilche
  329. * Added Win32 export modifier to object manager classes.
  330. *
  331. * Revision 1.26  2003/02/20 17:01:20  vasilche
  332. * Changed value of kTypeUnknown to fit in 16 bit enums on Mac.
  333. *
  334. * Revision 1.25  2003/02/06 19:05:39  vasilche
  335. * Fixed old cache data copying.
  336. * Delayed sequence type (protein/dna) resolution.
  337. *
  338. * Revision 1.24  2003/01/23 19:33:57  vasilche
  339. * Commented out obsolete methods.
  340. * Use strand argument of CSeqVector instead of creation reversed seqmap.
  341. * Fixed ordering operators of CBioseqHandle to be consistent.
  342. *
  343. * Revision 1.23  2003/01/22 20:11:53  vasilche
  344. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  345. * CSeqMap_CI now supports resolution and iteration over sequence range.
  346. * Added several caches to CScope.
  347. * Optimized CSeqVector().
  348. * Added serveral variants of CBioseqHandle::GetSeqVector().
  349. * Tried to optimize annotations iterator (not much success).
  350. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  351. *
  352. * Revision 1.22  2003/01/03 19:45:44  dicuccio
  353. * Replaced kPosUnknwon with kInvalidSeqPos (non-static variable; work-around for
  354. * MSVC)
  355. *
  356. * Revision 1.21  2002/12/26 20:51:36  dicuccio
  357. * Added Win32 export specifier
  358. *
  359. * Revision 1.20  2002/12/26 16:39:22  vasilche
  360. * Object manager class CSeqMap rewritten.
  361. *
  362. * Revision 1.19  2002/10/03 13:45:37  grichenk
  363. * CSeqVector::size() made const
  364. *
  365. * Revision 1.18  2002/09/03 21:26:58  grichenk
  366. * Replaced bool arguments in CSeqVector constructor and getters
  367. * with enums.
  368. *
  369. * Revision 1.17  2002/07/08 20:50:56  grichenk
  370. * Moved log to the end of file
  371. * Replaced static mutex (in CScope, CDataSource) with the mutex
  372. * pool. Redesigned CDataSource data locking.
  373. *
  374. * Revision 1.16  2002/05/31 17:52:58  grichenk
  375. * Optimized for better performance (CTSE_Info uses atomic counter,
  376. * delayed annotations indexing, no location convertions in
  377. * CAnnot_Types_CI if no references resolution is required etc.)
  378. *
  379. * Revision 1.15  2002/05/17 17:14:50  grichenk
  380. * +GetSeqData() for getting a range of characters from a seq-vector
  381. *
  382. * Revision 1.14  2002/05/09 14:16:29  grichenk
  383. * sm_SizeUnknown -> kPosUnknown, minor fixes for unsigned positions
  384. *
  385. * Revision 1.13  2002/05/06 03:30:36  vakatov
  386. * OM/OM1 renaming
  387. *
  388. * Revision 1.12  2002/05/03 21:28:02  ucko
  389. * Introduce T(Signed)SeqPos.
  390. *
  391. * Revision 1.11  2002/05/03 18:36:13  grichenk
  392. * Fixed members initialization
  393. *
  394. * Revision 1.10  2002/04/30 14:32:51  ucko
  395. * Have size() return int in keeping with its actual behavior; should cut
  396. * down on warnings about truncation of 64-bit integers.
  397. *
  398. * Revision 1.9  2002/04/29 16:23:25  grichenk
  399. * GetSequenceView() reimplemented in CSeqVector.
  400. * CSeqVector optimized for better performance.
  401. *
  402. * Revision 1.8  2002/04/25 16:37:19  grichenk
  403. * Fixed gap coding, added GetGapChar() function
  404. *
  405. * Revision 1.7  2002/04/23 19:01:06  grichenk
  406. * Added optional flag to GetSeqVector() and GetSequenceView()
  407. * for switching to IUPAC encoding.
  408. *
  409. * Revision 1.6  2002/02/21 19:27:00  grichenk
  410. * Rearranged includes. Added scope history. Added searching for the
  411. * best seq-id match in data sources and scopes. Updated tests.
  412. *
  413. * Revision 1.5  2002/02/15 20:36:29  gouriano
  414. * changed implementation of HandleRangeMap
  415. *
  416. * Revision 1.4  2002/01/28 19:45:34  gouriano
  417. * changed the interface of BioseqHandle: two functions moved from Scope
  418. *
  419. * Revision 1.3  2002/01/23 21:59:29  grichenk
  420. * Redesigned seq-id handles and mapper
  421. *
  422. * Revision 1.2  2002/01/16 16:26:36  gouriano
  423. * restructured objmgr
  424. *
  425. * Revision 1.1  2002/01/11 19:04:04  gouriano
  426. * restructured objmgr
  427. *
  428. *
  429. * ===========================================================================
  430. */
  431. #endif  // SEQ_VECTOR__HPP