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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: id_range.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:25:01  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: id_range.cpp,v 1000.2 2004/06/01 19:25:01 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:  Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Utility class for collecting ranges of sequences
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objmgr/split/id_range.hpp>
  43. #include <objects/seqloc/seqloc__.hpp>
  44. #include <objects/seqfeat/Seq_feat.hpp>
  45. #include <objects/seqalign/Seq_align.hpp>
  46. #include <objects/seqalign/Std_seg.hpp>
  47. #include <objects/seqalign/Seq_align_set.hpp>
  48. #include <objects/seqalign/Dense_diag.hpp>
  49. #include <objects/seqalign/Dense_seg.hpp>
  50. #include <objects/seqalign/Packed_seg.hpp>
  51. #include <objects/seqres/Seq_graph.hpp>
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_SCOPE(objects)
  54. void COneSeqRange::Add(const COneSeqRange& range)
  55. {
  56.     Add(range.GetTotalRange());
  57. }
  58. void COneSeqRange::Add(const TRange& range)
  59. {
  60.     m_TotalRange += range;
  61. }
  62. void COneSeqRange::Add(TSeqPos start, TSeqPos stop_exclusive)
  63. {
  64.     Add(COpenRange<TSeqPos>(start, stop_exclusive));
  65. }
  66. CSeqsRange::CSeqsRange(void)
  67. {
  68. }
  69. CSeqsRange::~CSeqsRange(void)
  70. {
  71. }
  72. CNcbiOstream& CSeqsRange::Print(CNcbiOstream& out) const
  73. {
  74.     ITERATE ( TRanges, it, m_Ranges ) {
  75.         if ( it != m_Ranges.begin() ) {
  76.             out << ',';
  77.         }
  78.         TRange range = it->second.GetTotalRange();
  79.         out << it->first.AsString();
  80.         if ( range != TRange::GetWhole() ) {
  81.             out << "(" << range.GetFrom() << "-" << range.GetTo() << ")";
  82.         }
  83.     }
  84.     return out;
  85. }
  86. CSeq_id_Handle CSeqsRange::GetSingleId(void) const
  87. {
  88.     CSeq_id_Handle ret;
  89.     if ( m_Ranges.size() == 1 ) {
  90.         ret = m_Ranges.begin()->first;
  91.     }
  92.     return ret;
  93. }
  94. void CSeqsRange::Add(const CSeq_id_Handle& id, const COneSeqRange& loc)
  95. {
  96.     m_Ranges[id].Add(loc);
  97. }
  98. void CSeqsRange::Add(const CSeqsRange& range)
  99. {
  100.     ITERATE ( CSeqsRange, it, range ) {
  101.         m_Ranges[it->first].Add(it->second);
  102.     }
  103. }
  104. void CSeqsRange::Add(const CSeq_loc& loc)
  105. {
  106.     switch ( loc.Which() ) {
  107.     case CSeq_loc::e_Whole:
  108.         Add(loc.GetWhole());
  109.         break;
  110.     case CSeq_loc::e_Int:
  111.         Add(loc.GetInt());
  112.         break;
  113.     case CSeq_loc::e_Pnt:
  114.         Add(loc.GetPnt());
  115.         break;
  116.     case CSeq_loc::e_Packed_int:
  117.         ITERATE( CPacked_seqint::Tdata, ii, loc.GetPacked_int().Get() ) {
  118.             Add(**ii);
  119.         }
  120.         break;
  121.     case CSeq_loc::e_Packed_pnt:
  122.         Add(loc.GetPacked_pnt());
  123.         break;
  124.     case CSeq_loc::e_Mix:
  125.         // extract sub-locations
  126.         ITERATE ( CSeq_loc_mix::Tdata, li, loc.GetMix().Get() ) {
  127.             Add(**li);
  128.         }
  129.         break;
  130.     case CSeq_loc::e_Equiv:
  131.         // extract sub-locations
  132.         ITERATE ( CSeq_loc_equiv::Tdata, li, loc.GetEquiv().Get() ) {
  133.             Add(**li);
  134.         }
  135.         break;
  136.     case CSeq_loc::e_Bond:
  137.         Add(loc.GetBond().GetA());
  138.         if ( loc.GetBond().IsSetB() ) {
  139.             Add(loc.GetBond().GetB());
  140.         }
  141.         break;
  142.     }
  143. }
  144. void CSeqsRange::Add(const CSeq_id& id)
  145. {
  146.     CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(id);
  147.     m_Ranges[idh].Add(TRange::GetWhole());
  148. }
  149. void CSeqsRange::Add(const CSeq_point& p)
  150. {
  151.     CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(p.GetId());
  152.     m_Ranges[idh].Add(p.GetPoint(), p.GetPoint()+1);
  153. }
  154. void CSeqsRange::Add(const CSeq_interval& i)
  155. {
  156.     CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(i.GetId());
  157.     m_Ranges[idh].Add(i.GetFrom(), i.GetTo()+1);
  158. }
  159. void CSeqsRange::Add(const CPacked_seqpnt& pp)
  160. {
  161.     CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(pp.GetId());
  162.     COneSeqRange& range = m_Ranges[idh];
  163.     ITERATE ( CPacked_seqpnt::TPoints, pi, pp.GetPoints() ) {
  164.         range.Add(*pi, *pi+1);
  165.     }
  166. }
  167. void CSeqsRange::Add(const CSeq_feat& obj)
  168. {
  169.     Add(obj.GetLocation());
  170.     if ( obj.IsSetProduct() ) {
  171.         Add(obj.GetProduct());
  172.     }
  173. }
  174. void CSeqsRange::Add(const CSeq_align& obj)
  175. {
  176.     const CSeq_align::C_Segs& segs = obj.GetSegs();
  177.     switch ( segs.Which() ) {
  178.     case CSeq_align::C_Segs::e_Dendiag:
  179.         ITERATE ( CSeq_align::C_Segs::TDendiag, it, segs.GetDendiag() ) {
  180.             Add(**it);
  181.         }
  182.         break;
  183.     case CSeq_align::C_Segs::e_Denseg:
  184.         Add(segs.GetDenseg());
  185.         break;
  186.     case CSeq_align::C_Segs::e_Std:
  187.         ITERATE ( CSeq_align::C_Segs::TStd, it, segs.GetStd() ) {
  188.             ITERATE ( CStd_seg::TLoc, it_loc, (*it)->GetLoc() ) {
  189.                 Add(**it_loc);
  190.             }
  191.         }
  192.         break;
  193.     case CSeq_align::C_Segs::e_Packed:
  194.         Add(segs.GetPacked());
  195.         break;
  196.     case CSeq_align::C_Segs::e_Disc:
  197.         ITERATE ( CSeq_align_set::Tdata, it, segs.GetDisc().Get() ) {
  198.             Add(**it);
  199.         }
  200.         break;
  201.     }
  202. }
  203. void CSeqsRange::Add(const CDense_seg& denseg)
  204. {
  205.     size_t dim    = denseg.GetDim();
  206.     size_t numseg = denseg.GetNumseg();
  207.     // claimed dimension may not be accurate :-/
  208.     if ( numseg != denseg.GetLens().size() ) {
  209.         ERR_POST(Warning << "Invalid 'lens' size in denseg");
  210.         numseg = min(numseg, denseg.GetLens().size());
  211.     }
  212.     if ( dim != denseg.GetIds().size() ) {
  213.         ERR_POST(Warning << "Invalid 'ids' size in denseg");
  214.         dim = min(dim, denseg.GetIds().size());
  215.     }
  216.     if ( dim*numseg != denseg.GetStarts().size() ) {
  217.         ERR_POST(Warning << "Invalid 'starts' size in denseg");
  218.         dim = min(dim*numseg, denseg.GetStarts().size()) / numseg;
  219.     }
  220.     CDense_seg::TStarts::const_iterator it_start = denseg.GetStarts().begin();
  221.     CDense_seg::TLens::const_iterator it_len = denseg.GetLens().begin();
  222.     for ( size_t seg = 0;  seg < numseg;  seg++, ++it_len) {
  223.         CDense_seg::TIds::const_iterator it_id = denseg.GetIds().begin();
  224.         for ( size_t seq = 0;  seq < dim;  seq++, ++it_start, ++it_id) {
  225.             if ( *it_start >= 0 ) {
  226.                 CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);
  227.                 m_Ranges[idh].Add(*it_start, *it_start + *it_len);
  228.             }
  229.         }
  230.     }
  231. }
  232. void CSeqsRange::Add(const CDense_diag& diag)
  233. {
  234.     size_t dim = diag.GetDim();
  235.     if ( dim != diag.GetIds().size() ) {
  236.         ERR_POST(Warning << "Invalid 'ids' size in dendiag");
  237.         dim = min(dim, diag.GetIds().size());
  238.     }
  239.     if ( dim != diag.GetStarts().size() ) {
  240.         ERR_POST(Warning << "Invalid 'starts' size in dendiag");
  241.         dim = min(dim, diag.GetStarts().size());
  242.     }
  243.     TSeqPos len = diag.GetLen();
  244.     CDense_diag::TStarts::const_iterator it_start = diag.GetStarts().begin();
  245.     ITERATE ( CDense_diag::TIds, it_id, diag.GetIds() ) {
  246.         CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);
  247.         m_Ranges[idh].Add(*it_start, *it_start + len);
  248.         ++it_start;
  249.     }
  250. }
  251. void CSeqsRange::Add(const CPacked_seg& packed)
  252. {
  253.     size_t dim    = packed.GetDim();
  254.     size_t numseg = packed.GetNumseg();
  255.     // claimed dimension may not be accurate :-/
  256.     if ( dim * numseg > packed.GetStarts().size() ) {
  257.         dim = packed.GetStarts().size() / numseg;
  258.     }
  259.     if ( dim * numseg > packed.GetPresent().size() ) {
  260.         dim = packed.GetPresent().size() / numseg;
  261.     }
  262.     if ( dim > packed.GetLens().size() ) {
  263.         dim = packed.GetLens().size();
  264.     }
  265.     CPacked_seg::TStarts::const_iterator it_start = packed.GetStarts().begin();
  266.     CPacked_seg::TLens::const_iterator it_len = packed.GetLens().begin();
  267.     CPacked_seg::TPresent::const_iterator it_pres= packed.GetPresent().begin();
  268.     for ( size_t seg = 0;  seg < numseg;  seg++, ++it_len ) {
  269.         CPacked_seg::TIds::const_iterator it_id = packed.GetIds().begin();
  270.         for ( size_t seq = 0;  seq < dim;  seq++, ++it_pres) {
  271.             if ( *it_pres ) {
  272.                 CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);
  273.                 m_Ranges[idh].Add(*it_start, *it_start + *it_len);
  274.                 ++it_id;
  275.                 ++it_start;
  276.             }
  277.         }
  278.     }
  279. }
  280. void CSeqsRange::Add(const CSeq_graph& obj)
  281. {
  282.     Add(obj.GetLoc());
  283. }
  284. END_SCOPE(objects)
  285. END_NCBI_SCOPE
  286. /*
  287. * ---------------------------------------------------------------------------
  288. * $Log: id_range.cpp,v $
  289. * Revision 1000.2  2004/06/01 19:25:01  gouriano
  290. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  291. *
  292. * Revision 1.6  2004/05/21 21:42:14  gorelenk
  293. * Added PCH ncbi_pch.hpp
  294. *
  295. * Revision 1.5  2004/01/07 17:36:27  vasilche
  296. * Moved id2_split headers to include/objmgr/split.
  297. * Fixed include path to genbank.
  298. *
  299. * Revision 1.4  2003/12/01 18:37:10  vasilche
  300. * Separate different annotation types in split info to reduce memory usage.
  301. *
  302. * Revision 1.3  2003/11/26 23:04:59  vasilche
  303. * Removed extra semicolons after BEGIN_SCOPE and END_SCOPE.
  304. *
  305. * Revision 1.2  2003/11/26 17:56:02  vasilche
  306. * Implemented ID2 split in ID1 cache.
  307. * Fixed loading of splitted annotations.
  308. *
  309. * Revision 1.1  2003/11/12 16:18:30  vasilche
  310. * First implementation of ID2 blob splitter withing cache.
  311. *
  312. * ===========================================================================
  313. */