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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_map_ext.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:24:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seq_map_ext.cpp,v 1000.3 2004/06/01 19:24:22 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. * Authors:
  35. *           Eugene Vasilchenko
  36. *
  37. * File Description:
  38. *   Sequence map for the Object Manager. Describes sequence as a set of
  39. *   segments of different types (data, reference, gap or end).
  40. *
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <objmgr/seq_map_ext.hpp>
  44. #include <objects/seq/Delta_ext.hpp>
  45. #include <objects/seq/Delta_seq.hpp>
  46. #include <objects/seq/Seg_ext.hpp>
  47. #include <objects/seq/Seq_literal.hpp>
  48. #include <objects/seq/Seq_data.hpp>
  49. #include <objects/seqloc/Seq_id.hpp>
  50. #include <objects/seqloc/Seq_loc_equiv.hpp>
  51. #include <objects/seqloc/Seq_loc_mix.hpp>
  52. #include <objects/seqloc/Packed_seqint.hpp>
  53. #include <objects/seqloc/Packed_seqpnt.hpp>
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(objects)
  56. ////////////////////////////////////////////////////////////////////
  57. //  CSeqMap
  58. CSeqMap_Delta_seqs::CSeqMap_Delta_seqs(const TObject& obj)
  59.     : CSeqMap(),
  60.       m_Object(&obj),
  61.       m_List(&obj.Get())
  62. {
  63.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  64.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  65.                    "Cannot store CDelta_seq iterator: too big");
  66.     }
  67.     x_IndexAll(obj.Get());
  68. }
  69. CSeqMap_Delta_seqs::~CSeqMap_Delta_seqs(void)
  70. {
  71. }
  72. void CSeqMap_Delta_seqs::x_Index(const TList& seq)
  73. {
  74.     ITERATE ( TList, iter, seq ) {
  75.         x_SetSegmentList_I(x_Add(**iter), iter);
  76.     }
  77. }
  78. void CSeqMap_Delta_seqs::x_IndexAll(const TList& seq)
  79. {
  80.     x_AddEnd();
  81.     x_Index(seq);
  82.     x_AddEnd();
  83. }
  84. void CSeqMap_Delta_seqs::x_IndexUnloadedSubMap(TSeqPos len)
  85. {
  86.     x_SetSegmentList_I(x_AddUnloadedSubMap(len), m_List->end());
  87. }
  88. CSeqMap_Delta_seqs::TList_I
  89. CSeqMap_Delta_seqs::x_FindInsertList_I(size_t index) const
  90. {
  91.     // find insertion point in sequence
  92.     TList_I ins = m_List->end();
  93.     _ASSERT(x_GetSegmentList_I(index) == ins);
  94.     for ( size_t i = index+1; i < x_GetSegmentsCount(); ++i ) {
  95.         TList_I it = x_GetSegmentList_I(i);
  96.         if ( it != ins ) {
  97.             ins = it;
  98.             break;
  99.         }
  100.     }
  101.     return ins;
  102. }
  103. void CSeqMap_Delta_seqs::x_SetSeq_data(size_t index, CSeq_data& data)
  104. {
  105.     // check segment type
  106.     CSegment& segment = x_SetSegment(index);
  107.     if ( segment.m_SegType != eSeqData ) {
  108.         NCBI_THROW(CSeqMapException, eSegmentTypeError,
  109.                    "Invalid segment type");
  110.     }
  111.     // lock for object modification
  112.     CFastMutexGuard guard(m_SeqMap_Mtx);
  113.     // check for object
  114.     if ( segment.m_RefObject ) {
  115.         NCBI_THROW(CSeqMapException, eDataError,
  116.                      "CSeq_data already set");
  117.     }
  118.     // do insertion
  119.     // set object
  120.     segment.m_RefObject.Reset(&data);
  121.     // update sequence
  122.     const_cast<CDelta_seq&>(**x_GetSegmentList_I(index)).SetLiteral().SetSeq_data(data);
  123. }
  124. void CSeqMap_Delta_seqs::x_SetSubSeqMap(size_t /*index*/,
  125.                                         CSeqMap_Delta_seqs* /*subMap*/)
  126. {
  127. /*
  128.     // check segment type
  129.     CSegment& segment = x_SetSegment(index);
  130.     if ( segment.m_SegType != eSeqSubMap ) {
  131.         NCBI_THROW(CSeqMapException, eSegmentTypeError,
  132.                    "Invalid segment type");
  133.     }
  134.     // lock for object modification
  135.     CFastMutexGuard guard(m_SeqMap_Mtx);
  136.     // check for object
  137.     if ( segment.m_RefObject ) {
  138.         NCBI_THROW(CSeqMapException, eDataError,
  139.                    "Submap already set");
  140.     }
  141.     // do insertion
  142.     // set object
  143.     segment.m_RefObject.Reset(subMap);
  144.     // set index
  145.     x_SetSegmentList_I(segment, subMap->m_List->begin());
  146.     // insert sequence
  147.     m_List->splice(x_FindInsertList_I(index), *subMap->m_List);
  148.     // update submap
  149.     subMap->m_List = m_List;
  150.     subMap->m_Object = m_Object;
  151. */
  152. }
  153. CSeqMap_Seq_locs::CSeqMap_Seq_locs(const CSeg_ext& obj, const TList& seq)
  154.     : CSeqMap(),
  155.       m_Object(&obj),
  156.       m_List(&seq)
  157. {
  158.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  159.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  160.                    "Cannot store CSeq_loc list iterator: too big");
  161.     }
  162.     x_IndexAll();
  163. }
  164. CSeqMap_Seq_locs::CSeqMap_Seq_locs(const CSeq_loc_mix& obj, const TList& seq)
  165.     : CSeqMap(),
  166.       m_Object(&obj),
  167.       m_List(&seq)
  168. {
  169.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  170.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  171.                    "Cannot store CSeq_loc list iterator: too big");
  172.     }
  173.     x_IndexAll();
  174. }
  175. CSeqMap_Seq_locs::CSeqMap_Seq_locs(const CSeq_loc_equiv& obj, const TList& seq)
  176.     : CSeqMap(),
  177.       m_Object(&obj),
  178.       m_List(&seq)
  179. {
  180.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  181.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  182.                    "Cannot store CSeq_loc list iterator: too big");
  183.     }
  184.     x_IndexAll();
  185. }
  186. CSeqMap_Seq_locs::~CSeqMap_Seq_locs(void)
  187. {
  188. }
  189. void CSeqMap_Seq_locs::x_IndexAll(void)
  190. {
  191.     x_AddEnd();
  192.     const TList& seq = *m_List;
  193.     ITERATE ( TList, iter, seq ) {
  194.         x_SetSegmentList_I(x_Add(**iter), iter);
  195.     }
  196.     x_AddEnd();
  197. }
  198. CSeqMap_Seq_intervals::CSeqMap_Seq_intervals(const TObject& obj)
  199.     : CSeqMap(),
  200.       m_Object(&obj),
  201.       m_List(&obj.Get())
  202. {
  203.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  204.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  205.                    "Cannot store CSeq_interval list iterator: too big");
  206.     }
  207.     x_IndexAll();
  208. }
  209. CSeqMap_Seq_intervals::CSeqMap_Seq_intervals(const TObject& obj,
  210.                                              CSeqMap* parent, size_t index)
  211.     : CSeqMap(parent, index),
  212.       m_Object(&obj),
  213.       m_List(&obj.Get())
  214. {
  215.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  216.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  217.                    "Cannot store CSeq_interval list iterator: too big");
  218.     }
  219.     x_IndexAll();
  220. }
  221. CSeqMap_Seq_intervals::~CSeqMap_Seq_intervals(void)
  222. {
  223. }
  224. void CSeqMap_Seq_intervals::x_IndexAll(void)
  225. {
  226.     x_AddEnd();
  227.     const TList& seq = *m_List;
  228.     ITERATE ( TList, iter, seq ) {
  229.         x_SetSegmentList_I(x_Add(**iter), iter);
  230.     }
  231.     x_AddEnd();
  232. }
  233. CSeqMap_SeqPoss::CSeqMap_SeqPoss(const TObject& obj)
  234.     : CSeqMap(),
  235.       m_Object(&obj),
  236.       m_List(&obj.GetPoints())
  237. {
  238.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  239.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  240.                    "Cannot store TSeqPos list iterator: too big");
  241.     }
  242.     x_IndexAll();
  243. }
  244. CSeqMap_SeqPoss::CSeqMap_SeqPoss(const TObject& obj, CSeqMap* parent, size_t index)
  245.     : CSeqMap(parent, index),
  246.       m_Object(&obj),
  247.       m_List(&obj.GetPoints())
  248. {
  249.     if ( sizeof(TList_I) > sizeof(CSegment::TList0_I) ) {
  250.         NCBI_THROW(CSeqMapException, eIteratorTooBig,
  251.                    "Cannot store TSeqPos list iterator: too big");
  252.     }
  253.     x_IndexAll();
  254. }
  255. CSeqMap_SeqPoss::~CSeqMap_SeqPoss(void)
  256. {
  257. }
  258. inline
  259. CSeqMap::CSegment& CSeqMap_SeqPoss::x_AddPos(const CSeq_id* id, TSeqPos pos, ENa_strand strand)
  260. {
  261.     return x_AddSegment(eSeqRef, id, pos, 1, strand);
  262. }
  263. void CSeqMap_SeqPoss::x_IndexAll(void)
  264. {
  265.     x_AddEnd();
  266.     const TList& seq = *m_List;
  267.     const CSeq_id* id = &m_Object->GetId();
  268.     ENa_strand strand =
  269.         m_Object->IsSetStrand()? m_Object->GetStrand(): eNa_strand_unknown;
  270.     ITERATE ( TList, iter, seq ) {
  271.         x_SetSegmentList_I(x_AddPos(id, *iter, strand), iter);
  272.     }
  273.     x_AddEnd();
  274. }
  275. END_SCOPE(objects)
  276. END_NCBI_SCOPE
  277. /*
  278. * ---------------------------------------------------------------------------
  279. * $Log: seq_map_ext.cpp,v $
  280. * Revision 1000.3  2004/06/01 19:24:22  gouriano
  281. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  282. *
  283. * Revision 1.12  2004/05/21 21:42:13  gorelenk
  284. * Added PCH ncbi_pch.hpp
  285. *
  286. * Revision 1.11  2004/02/19 17:19:35  vasilche
  287. * Removed 'unused argument' warning.
  288. *
  289. * Revision 1.10  2003/11/12 16:53:17  grichenk
  290. * Modified CSeqMap to work with const objects (CBioseq, CSeq_loc etc.)
  291. *
  292. * Revision 1.9  2003/09/30 16:22:04  vasilche
  293. * Updated internal object manager classes to be able to load ID2 data.
  294. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  295. * Scope caches results of requests for data to data loaders.
  296. * Optimized CSeq_id_Handle for gis.
  297. * Optimized bioseq lookup in scope.
  298. * Reduced object allocations in annotation iterators.
  299. * CScope is allowed to be destroyed before other objects using this scope are
  300. * deleted (feature iterators, bioseq handles etc).
  301. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  302. * Added 'adaptive' option to objmgr_demo application.
  303. *
  304. * Revision 1.8  2003/09/05 17:29:40  grichenk
  305. * Structurized Object Manager exceptions
  306. *
  307. * Revision 1.7  2003/06/02 16:06:38  dicuccio
  308. * Rearranged src/objects/ subtree.  This includes the following shifts:
  309. *     - src/objects/asn2asn --> arc/app/asn2asn
  310. *     - src/objects/testmedline --> src/objects/ncbimime/test
  311. *     - src/objects/objmgr --> src/objmgr
  312. *     - src/objects/util --> src/objmgr/util
  313. *     - src/objects/alnmgr --> src/objtools/alnmgr
  314. *     - src/objects/flat --> src/objtools/flat
  315. *     - src/objects/validator --> src/objtools/validator
  316. *     - src/objects/cddalignview --> src/objtools/cddalignview
  317. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  318. * replaces the three libmmdb? libs.
  319. *
  320. * Revision 1.6  2003/05/21 16:03:08  vasilche
  321. * Fixed access to uninitialized optional members.
  322. * Added initialization of mandatory members.
  323. *
  324. * Revision 1.5  2003/04/24 16:12:38  vasilche
  325. * Object manager internal structures are splitted more straightforward.
  326. * Removed excessive header dependencies.
  327. *
  328. * Revision 1.4  2003/03/11 15:51:06  kuznets
  329. * iterate -> ITERATE
  330. *
  331. * Revision 1.3  2003/02/05 20:59:12  vasilche
  332. * Added eSeqEnd segment at the beginning of seq map.
  333. * Added flags to CSeqMap_CI to stop on data, gap, or references.
  334. *
  335. * Revision 1.2  2003/01/22 20:11:54  vasilche
  336. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  337. * CSeqMap_CI now supports resolution and iteration over sequence range.
  338. * Added several caches to CScope.
  339. * Optimized CSeqVector().
  340. * Added serveral variants of CBioseqHandle::GetSeqVector().
  341. * Tried to optimize annotations iterator (not much success).
  342. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  343. *
  344. * Revision 1.1  2002/12/26 16:39:24  vasilche
  345. * Object manager class CSeqMap rewritten.
  346. *
  347. *
  348. * ===========================================================================
  349. */