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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: handle_range_map.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:23:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: handle_range_map.cpp,v 1000.1 2004/06/01 19:23: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. * Author: Aleksey Grichenko, Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   CHandle_Range_Map is a substitute for seq-loc to make searching
  38. *   over locations more effective.
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objmgr/impl/handle_range_map.hpp>
  43. #include <objmgr/seq_id_mapper.hpp>
  44. #include <objects/seqloc/Seq_loc.hpp>
  45. #include <objects/seqloc/Seq_interval.hpp>
  46. #include <objects/seqloc/Seq_point.hpp>
  47. #include <objects/seqloc/Seq_bond.hpp>
  48. #include <objects/seqloc/Seq_loc_equiv.hpp>
  49. BEGIN_NCBI_SCOPE
  50. BEGIN_SCOPE(objects)
  51. ////////////////////////////////////////////////////////////////////
  52. //
  53. //  CHandleRangeMap::
  54. //
  55. CHandleRangeMap::CHandleRangeMap(void)
  56. {
  57. }
  58. CHandleRangeMap::CHandleRangeMap(const CHandleRangeMap& rmap)
  59. {
  60.     *this = rmap;
  61. }
  62. CHandleRangeMap::~CHandleRangeMap(void)
  63. {
  64. }
  65. CHandleRangeMap& CHandleRangeMap::operator= (const CHandleRangeMap& rmap)
  66. {
  67.     if (this != &rmap) {
  68.         m_LocMap = rmap.m_LocMap;
  69.     }
  70.     return *this;
  71. }
  72. void CHandleRangeMap::clear(void)
  73. {
  74.     m_LocMap.clear();
  75. }
  76. void CHandleRangeMap::AddLocation(const CSeq_loc& loc)
  77. {
  78.     switch ( loc.Which() ) {
  79.     case CSeq_loc::e_not_set:
  80.     case CSeq_loc::e_Null:
  81.     case CSeq_loc::e_Empty:
  82.     {
  83.         return;
  84.     }
  85.     case CSeq_loc::e_Whole:
  86.     {
  87.         AddRange(loc.GetWhole(), CHandleRange::TRange::GetWhole());
  88.         return;
  89.     }
  90.     case CSeq_loc::e_Int:
  91.     {
  92.         const CSeq_interval& i = loc.GetInt();
  93.         AddRange(i.GetId(),
  94.                  i.GetFrom(),
  95.                  i.GetTo(),
  96.                  i.IsSetStrand()? i.GetStrand(): eNa_strand_unknown);
  97.         return;
  98.     }
  99.     case CSeq_loc::e_Pnt:
  100.     {
  101.         const CSeq_point& p = loc.GetPnt();
  102.         AddRange(p.GetId(),
  103.                  p.GetPoint(),
  104.                  p.GetPoint(),
  105.                  p.IsSetStrand()? p.GetStrand(): eNa_strand_unknown);
  106.         return;
  107.     }
  108.     case CSeq_loc::e_Packed_int:
  109.     {
  110.         // extract each range
  111.         const CPacked_seqint& pi = loc.GetPacked_int();
  112.         ITERATE( CPacked_seqint::Tdata, ii, pi.Get() ) {
  113.             const CSeq_interval& i = **ii;
  114.             AddRange(i.GetId(),
  115.                      i.GetFrom(),
  116.                      i.GetTo(),
  117.                      i.IsSetStrand()? i.GetStrand(): eNa_strand_unknown);
  118.         }
  119.         return;
  120.     }
  121.     case CSeq_loc::e_Packed_pnt:
  122.     {
  123.         // extract each point
  124.         const CPacked_seqpnt& pp = loc.GetPacked_pnt();
  125.         CSeq_id_Handle idh =
  126.             CSeq_id_Mapper::GetSeq_id_Mapper().GetHandle(pp.GetId());
  127.         CHandleRange& hr = m_LocMap[idh];
  128.         ENa_strand strand = pp.IsSetStrand()? pp.GetStrand(): eNa_strand_unknown;
  129.         ITERATE ( CPacked_seqpnt::TPoints, pi, pp.GetPoints() ) {
  130.             hr.AddRange(CHandleRange::TRange(*pi, *pi), strand);
  131.         }
  132.         return;
  133.     }
  134.     case CSeq_loc::e_Mix:
  135.     {
  136.         // extract sub-locations
  137.         ITERATE ( CSeq_loc_mix::Tdata, li, loc.GetMix().Get() ) {
  138.             AddLocation(**li);
  139.         }
  140.         return;
  141.     }
  142.     case CSeq_loc::e_Equiv:
  143.     {
  144.         // extract sub-locations
  145.         ITERATE ( CSeq_loc_equiv::Tdata, li, loc.GetEquiv().Get() ) {
  146.             AddLocation(**li);
  147.         }
  148.         return;
  149.     }
  150.     case CSeq_loc::e_Bond:
  151.     {
  152.         const CSeq_bond& bond = loc.GetBond();
  153.         const CSeq_point& pa = bond.GetA();
  154.         AddRange(pa.GetId(),
  155.                  pa.GetPoint(),
  156.                  pa.GetPoint(),
  157.                  pa.IsSetStrand()? pa.GetStrand(): eNa_strand_unknown);
  158.         if ( bond.IsSetB() ) {
  159.             const CSeq_point& pb = bond.GetB();
  160.             AddRange(pb.GetId(),
  161.                      pb.GetPoint(),
  162.                      pb.GetPoint(),
  163.                      pb.IsSetStrand()? pb.GetStrand(): eNa_strand_unknown);
  164.         }
  165.         return;
  166.     }
  167.     case CSeq_loc::e_Feat:
  168.     {
  169.         //### Not implemented (do we need it?)
  170.         return;
  171.     }
  172.     } // switch
  173. }
  174. void CHandleRangeMap::AddRange(const CSeq_id_Handle& h,
  175.                                CHandleRange::TRange range,
  176.                                ENa_strand strand)
  177. {
  178.     m_LocMap[h].AddRange(range, strand);
  179. }
  180. void CHandleRangeMap::AddRange(const CSeq_id& id,
  181.                                CHandleRange::TRange range,
  182.                                ENa_strand strand)
  183. {
  184.     AddRange(CSeq_id_Mapper::GetSeq_id_Mapper().GetHandle(id), range, strand);
  185. }
  186. void CHandleRangeMap::AddRanges(const CSeq_id_Handle& h,
  187.                                 const CHandleRange& hr)
  188. {
  189.     m_LocMap[h].AddRanges(hr);
  190. }
  191. CHandleRange& CHandleRangeMap::AddRanges(const CSeq_id_Handle& h)
  192. {
  193.     return m_LocMap[h];
  194. }
  195. bool CHandleRangeMap::IntersectingWithLoc(const CSeq_loc& loc) const
  196. {
  197.     CHandleRangeMap rmap;
  198.     rmap.AddLocation(loc);
  199.     return IntersectingWithMap(rmap);
  200. }
  201. bool CHandleRangeMap::IntersectingWithMap(const CHandleRangeMap& rmap) const
  202. {
  203.     if ( rmap.m_LocMap.size() > m_LocMap.size() ) {
  204.         return rmap.IntersectingWithMap(*this);
  205.     }
  206.     ITERATE ( CHandleRangeMap, it1, rmap ) {
  207.         const_iterator it2 = m_LocMap.find(it1->first);
  208.         if ( it2 != end() && it1->second.IntersectingWith(it2->second) ) {
  209.             return true;
  210.         }
  211.     }
  212.     return false;
  213. }
  214. bool CHandleRangeMap::TotalRangeIntersectingWith(const CHandleRangeMap& rmap) const
  215. {
  216.     if ( rmap.m_LocMap.size() > m_LocMap.size() ) {
  217.         return rmap.TotalRangeIntersectingWith(*this);
  218.     }
  219.     ITERATE ( CHandleRangeMap, it1, rmap ) {
  220.         TLocMap::const_iterator it2 = m_LocMap.find(it1->first);
  221.         if ( it2 != end() && it1->second.GetOverlappingRange()
  222.              .IntersectingWith(it2->second.GetOverlappingRange()) ) {
  223.             return true;
  224.         }
  225.     }
  226.     return false;
  227. }
  228. END_SCOPE(objects)
  229. END_NCBI_SCOPE
  230. /*
  231. * ---------------------------------------------------------------------------
  232. * $Log: handle_range_map.cpp,v $
  233. * Revision 1000.1  2004/06/01 19:23:22  gouriano
  234. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  235. *
  236. * Revision 1.19  2004/05/21 21:42:12  gorelenk
  237. * Added PCH ncbi_pch.hpp
  238. *
  239. * Revision 1.18  2003/07/17 20:07:56  vasilche
  240. * Reduced memory usage by feature indexes.
  241. * SNP data is loaded separately through PUBSEQ_OS.
  242. * String compression for SNP data.
  243. *
  244. * Revision 1.17  2003/06/02 16:06:38  dicuccio
  245. * Rearranged src/objects/ subtree.  This includes the following shifts:
  246. *     - src/objects/asn2asn --> arc/app/asn2asn
  247. *     - src/objects/testmedline --> src/objects/ncbimime/test
  248. *     - src/objects/objmgr --> src/objmgr
  249. *     - src/objects/util --> src/objmgr/util
  250. *     - src/objects/alnmgr --> src/objtools/alnmgr
  251. *     - src/objects/flat --> src/objtools/flat
  252. *     - src/objects/validator --> src/objtools/validator
  253. *     - src/objects/cddalignview --> src/objtools/cddalignview
  254. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  255. * replaces the three libmmdb? libs.
  256. *
  257. * Revision 1.16  2003/05/21 16:03:08  vasilche
  258. * Fixed access to uninitialized optional members.
  259. * Added initialization of mandatory members.
  260. *
  261. * Revision 1.15  2003/04/24 16:12:38  vasilche
  262. * Object manager internal structures are splitted more straightforward.
  263. * Removed excessive header dependencies.
  264. *
  265. * Revision 1.14  2003/03/14 19:10:41  grichenk
  266. * + SAnnotSelector::EIdResolving; fixed operator=() for several classes
  267. *
  268. * Revision 1.13  2003/03/11 15:51:06  kuznets
  269. * iterate -> ITERATE
  270. *
  271. * Revision 1.12  2003/02/24 18:57:22  vasilche
  272. * Make feature gathering in one linear pass using CSeqMap iterator.
  273. * Do not use feture index by sub locations.
  274. * Sort features at the end of gathering in one vector.
  275. * Extracted some internal structures and classes in separate header.
  276. * Delay creation of mapped features.
  277. *
  278. * Revision 1.11  2003/02/05 17:59:17  dicuccio
  279. * Moved formerly private headers into include/objects/objmgr/impl
  280. *
  281. * Revision 1.10  2003/01/29 22:03:46  grichenk
  282. * Use single static CSeq_id_Mapper instead of per-OM model.
  283. *
  284. * Revision 1.9  2003/01/22 20:11:54  vasilche
  285. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  286. * CSeqMap_CI now supports resolution and iteration over sequence range.
  287. * Added several caches to CScope.
  288. * Optimized CSeqVector().
  289. * Added serveral variants of CBioseqHandle::GetSeqVector().
  290. * Tried to optimize annotations iterator (not much success).
  291. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  292. *
  293. * Revision 1.8  2002/12/26 20:55:17  dicuccio
  294. * Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree
  295. *
  296. * Revision 1.7  2002/12/06 15:36:00  grichenk
  297. * Added overlap type for annot-iterators
  298. *
  299. * Revision 1.6  2002/07/08 20:51:01  grichenk
  300. * Moved log to the end of file
  301. * Replaced static mutex (in CScope, CDataSource) with the mutex
  302. * pool. Redesigned CDataSource data locking.
  303. *
  304. * Revision 1.5  2002/06/12 14:40:47  grichenk
  305. * Made some methods inline
  306. *
  307. * Revision 1.4  2002/02/21 19:27:06  grichenk
  308. * Rearranged includes. Added scope history. Added searching for the
  309. * best seq-id match in data sources and scopes. Updated tests.
  310. *
  311. * Revision 1.3  2002/02/15 20:35:38  gouriano
  312. * changed implementation of HandleRangeMap
  313. *
  314. * Revision 1.2  2002/01/23 21:59:31  grichenk
  315. * Redesigned seq-id handles and mapper
  316. *
  317. * Revision 1.1  2002/01/11 19:06:20  gouriano
  318. * restructured objmgr
  319. *
  320. *
  321. * ===========================================================================
  322. */