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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bioseq_info.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:22:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bioseq_info.cpp,v 1000.4 2004/06/01 19:22:57 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. *   Bioseq info for data source
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/bioseq_info.hpp>
  42. #include <objmgr/impl/seq_entry_info.hpp>
  43. #include <objmgr/impl/tse_info.hpp>
  44. #include <objmgr/impl/data_source.hpp>
  45. #include <objmgr/seq_id_handle.hpp>
  46. #include <objmgr/seq_id_mapper.hpp>
  47. #include <objmgr/seq_map.hpp>
  48. #include <objects/seq/Bioseq.hpp>
  49. #include <objects/seq/Seq_inst.hpp>
  50. #include <objects/seq/Seq_data.hpp>
  51. #include <objects/seq/Seq_hist.hpp>
  52. #include <objects/seq/Seq_ext.hpp>
  53. #include <objects/seq/Seg_ext.hpp>
  54. #include <objects/seq/Delta_ext.hpp>
  55. #include <objects/seq/Delta_seq.hpp>
  56. #include <objects/seq/Seq_literal.hpp>
  57. #include <objects/seq/Ref_ext.hpp>
  58. #include <objects/seqloc/Seq_id.hpp>
  59. #include <objects/seqloc/Packed_seqint.hpp>
  60. #include <objects/seqloc/Seq_loc.hpp>
  61. #include <objects/seqloc/Seq_interval.hpp>
  62. #include <objects/seqloc/Seq_loc_mix.hpp>
  63. #include <objects/seqloc/Seq_loc_equiv.hpp>
  64. #include <objects/general/Int_fuzz.hpp>
  65. #include <algorithm>
  66. BEGIN_NCBI_SCOPE
  67. BEGIN_SCOPE(objects)
  68. ////////////////////////////////////////////////////////////////////
  69. //
  70. //  CBioseq_Info::
  71. //
  72. //    Structure to keep bioseq's parent seq-entry along with the list
  73. //    of seq-id synonyms for the bioseq.
  74. //
  75. CBioseq_Info::CBioseq_Info(CBioseq& seq)
  76. {
  77.     x_SetObject(seq);
  78. }
  79. CBioseq_Info::CBioseq_Info(const CBioseq_Info& info)
  80. {
  81.     x_SetObject(info);
  82. }
  83. CBioseq_Info::~CBioseq_Info(void)
  84. {
  85. }
  86. CConstRef<CBioseq> CBioseq_Info::GetCompleteBioseq(void) const
  87. {
  88.     return m_Object;
  89. }
  90. CConstRef<CBioseq> CBioseq_Info::GetBioseqCore(void) const
  91. {
  92.     x_UpdateObject();
  93.     return m_Object;
  94. }
  95. void CBioseq_Info::x_DSAttachContents(CDataSource& ds)
  96. {
  97.     TParent::x_DSAttachContents(ds);
  98.     x_DSMapObject(m_Object, ds);
  99. }
  100. void CBioseq_Info::x_DSDetachContents(CDataSource& ds)
  101. {
  102.     x_DSUnmapObject(m_Object, ds);
  103.     TParent::x_DSDetachContents(ds);
  104. }
  105. void CBioseq_Info::x_DSMapObject(CConstRef<TObject> obj, CDataSource& ds)
  106. {
  107.     ds.x_Map(obj, this);
  108. }
  109. void CBioseq_Info::x_DSUnmapObject(CConstRef<TObject> obj, CDataSource& ds)
  110. {
  111.     ds.x_Unmap(obj, this);
  112. }
  113. void CBioseq_Info::x_TSEAttachContents(CTSE_Info& tse)
  114. {
  115.     TParent::x_TSEAttachContents(tse);
  116.     ITERATE ( TId, it, m_Id ) {
  117.         tse.x_SetBioseqId(*it, this);
  118.     }
  119. }
  120. void CBioseq_Info::x_TSEDetachContents(CTSE_Info& tse)
  121. {
  122.     ITERATE ( TId, it, m_Id ) {
  123.         tse.x_ResetBioseqId(*it, this);
  124.     }
  125.     TParent::x_TSEDetachContents(tse);
  126. }
  127. void CBioseq_Info::x_ParentAttach(CSeq_entry_Info& parent)
  128. {
  129.     TParent::x_ParentAttach(parent);
  130.     CSeq_entry& entry = parent.x_GetObject();
  131.     entry.ParentizeOneLevel();
  132. #ifdef _DEBUG
  133.     _ASSERT(&entry.GetSeq() == m_Object);
  134.     _ASSERT(m_Object->GetParentEntry() == &entry);
  135. #endif
  136. }
  137. void CBioseq_Info::x_ParentDetach(CSeq_entry_Info& parent)
  138. {
  139.     //m_Object->ResetParentEntry();
  140.     TParent::x_ParentDetach(parent);
  141. }
  142. void CBioseq_Info::x_SetObject(TObject& obj)
  143. {
  144.     _ASSERT(!m_Object);
  145.     m_Object.Reset(&obj);
  146.     if ( obj.IsSetId() ) {
  147.         ITERATE ( TObject::TId, it, obj.GetId() ) {
  148.             m_Id.push_back(CSeq_id_Handle::GetHandle(**it));
  149.         }
  150.     }
  151.     if ( obj.IsSetAnnot() ) {
  152.         x_SetAnnot();
  153.     }
  154. }
  155. void CBioseq_Info::x_SetObject(const CBioseq_Info& info)
  156. {
  157.     _ASSERT(!m_Object);
  158.     m_Object = sx_ShallowCopy(*info.m_Object);
  159.     m_Id = info.m_Id;
  160.     m_SeqMap = info.m_SeqMap;
  161.     if ( info.IsSetAnnot() ) {
  162.         x_SetAnnot(info);
  163.     }
  164. }
  165. CRef<CBioseq> CBioseq_Info::sx_ShallowCopy(const TObject& src)
  166. {        
  167.     CRef<TObject> obj(new TObject);
  168.     if ( src.IsSetId() ) {
  169.         obj->SetId() = src.GetId();
  170.     }
  171.     if ( src.IsSetDescr() ) {
  172.         obj->SetDescr(const_cast<TDescr&>(src.GetDescr()));
  173.     }
  174.     if ( src.IsSetInst() ) {
  175.         CRef<TInst> inst = sx_ShallowCopy(src.GetInst());
  176.         obj->SetInst(*inst);
  177.     }
  178.     if ( src.IsSetAnnot() ) {
  179.         obj->SetAnnot() = src.GetAnnot();
  180.     }
  181.     return obj;
  182. }
  183. CRef<CSeq_inst> CBioseq_Info::sx_ShallowCopy(const TInst& src)
  184. {
  185.     CRef<TInst> obj(new TInst);
  186.     if ( src.IsSetRepr() ) {
  187.         obj->SetRepr(src.GetRepr());
  188.     }
  189.     if ( src.IsSetMol() ) {
  190.         obj->SetMol(src.GetMol());
  191.     }
  192.     if ( src.IsSetLength() ) {
  193.         obj->SetLength(src.GetLength());
  194.     }
  195.     if ( src.IsSetFuzz() ) {
  196.         obj->SetFuzz(const_cast<TInst_Fuzz&>(src.GetFuzz()));
  197.     }
  198.     if ( src.IsSetTopology() ) {
  199.         obj->SetTopology(src.GetTopology());
  200.     }
  201.     if ( src.IsSetStrand() ) {
  202.         obj->SetStrand(src.GetStrand());
  203.     }
  204.     if ( src.IsSetSeq_data() ) {
  205.         obj->SetSeq_data(const_cast<TInst_Seq_data&>(src.GetSeq_data()));
  206.     }
  207.     if ( src.IsSetExt() ) {
  208.         obj->SetExt(const_cast<TInst_Ext&>(src.GetExt()));
  209.     }
  210.     if ( src.IsSetHist() ) {
  211.         obj->SetHist(const_cast<TInst_Hist&>(src.GetHist()));
  212.     }
  213.     return obj;
  214. }
  215. bool CBioseq_Info::IsSetId(void) const
  216. {
  217.     return m_Object->IsSetId();
  218. }
  219. bool CBioseq_Info::CanGetId(void) const
  220. {
  221.     return bool(m_Object)  &&  m_Object->CanGetId();
  222. }
  223. const CBioseq_Info::TId& CBioseq_Info::GetId(void) const
  224. {
  225.     return m_Id;
  226. }
  227. bool CBioseq_Info::HasId(const CSeq_id_Handle& id) const
  228. {
  229.     return find(m_Id.begin(), m_Id.end(), id) != m_Id.end();
  230. }
  231. void CBioseq_Info::AddId(const CSeq_id_Handle& id)
  232. {
  233.     m_Id.push_back(id);
  234. }
  235. void CBioseq_Info::RemoveId(const CSeq_id_Handle& id)
  236. {
  237.     TId::iterator found = find(m_Id.begin(), m_Id.end(), id);
  238.     if(found != m_Id.end()) {
  239.         m_Id.erase(found);
  240.     }
  241. }
  242. bool CBioseq_Info::IsSetDescr(void) const
  243. {
  244.     return m_Object->IsSetDescr();
  245. }
  246. bool CBioseq_Info::CanGetDescr(void) const
  247. {
  248.     return bool(m_Object)  &&  m_Object->CanGetDescr();
  249. }
  250. const CSeq_descr& CBioseq_Info::GetDescr(void) const
  251. {
  252.     return m_Object->GetDescr();
  253. }
  254. void CBioseq_Info::SetDescr(TDescr& v)
  255. {
  256.     m_Object->SetDescr(v);
  257. }
  258. CSeq_descr& CBioseq_Info::x_SetDescr(void)
  259. {
  260.     return m_Object->SetDescr();
  261. }
  262. void CBioseq_Info::ResetDescr(void)
  263. {
  264.     m_Object->ResetDescr();
  265. }
  266. CBioseq::TAnnot& CBioseq_Info::x_SetObjAnnot(void)
  267. {
  268.     return m_Object->SetAnnot();
  269. }
  270. void CBioseq_Info::x_ResetObjAnnot(void)
  271. {
  272.     m_Object->ResetAnnot();
  273. }
  274. bool CBioseq_Info::IsSetInst(void) const
  275. {
  276.     return m_Object->IsSetInst();
  277. }
  278. bool CBioseq_Info::CanGetInst(void) const
  279. {
  280.     return bool(m_Object)  &&  m_Object->CanGetInst();
  281. }
  282. const CBioseq_Info::TInst& CBioseq_Info::GetInst(void) const
  283. {
  284.     return m_Object->GetInst();
  285. }
  286. bool CBioseq_Info::IsSetInst_Repr(void) const
  287. {
  288.     return IsSetInst() && GetInst().IsSetRepr();
  289. }
  290. bool CBioseq_Info::CanGetInst_Repr(void) const
  291. {
  292.     return CanGetInst() && GetInst().CanGetRepr();
  293. }
  294. CBioseq_Info::TInst_Repr CBioseq_Info::GetInst_Repr(void) const
  295. {
  296.     return GetInst().GetRepr();
  297. }
  298. bool CBioseq_Info::IsSetInst_Mol(void) const
  299. {
  300.     return IsSetInst() && GetInst().IsSetMol();
  301. }
  302. bool CBioseq_Info::CanGetInst_Mol(void) const
  303. {
  304.     return CanGetInst() && GetInst().CanGetMol();
  305. }
  306. CBioseq_Info::TInst_Mol CBioseq_Info::GetInst_Mol(void) const
  307. {
  308.     return GetInst().GetMol();
  309. }
  310. bool CBioseq_Info::IsSetInst_Length(void) const
  311. {
  312.     return IsSetInst() && GetInst().IsSetLength();
  313. }
  314. bool CBioseq_Info::CanGetInst_Length(void) const
  315. {
  316.     return CanGetInst() && GetInst().CanGetLength();
  317. }
  318. CBioseq_Info::TInst_Length CBioseq_Info::GetInst_Length(void) const
  319. {
  320.     return GetInst().GetLength();
  321. }
  322. CBioseq_Info::TInst_Length CBioseq_Info::GetBioseqLength(void) const
  323. {
  324.     if ( IsSetInst_Length() ) {
  325.         return GetInst_Length();
  326.     }
  327.     else {
  328.         return x_CalcBioseqLength();
  329.     }
  330. }
  331. bool CBioseq_Info::IsSetInst_Fuzz(void) const
  332. {
  333.     return IsSetInst() && GetInst().IsSetFuzz();
  334. }
  335. bool CBioseq_Info::CanGetInst_Fuzz(void) const
  336. {
  337.     return CanGetInst() && GetInst().CanGetFuzz();
  338. }
  339. const CBioseq_Info::TInst_Fuzz& CBioseq_Info::GetInst_Fuzz(void) const
  340. {
  341.     return GetInst().GetFuzz();
  342. }
  343. bool CBioseq_Info::IsSetInst_Topology(void) const
  344. {
  345.     return IsSetInst() && GetInst().IsSetTopology();
  346. }
  347. bool CBioseq_Info::CanGetInst_Topology(void) const
  348. {
  349.     return CanGetInst() && GetInst().CanGetTopology();
  350. }
  351. CBioseq_Info::TInst_Topology CBioseq_Info::GetInst_Topology(void) const
  352. {
  353.     return GetInst().GetTopology();
  354. }
  355. bool CBioseq_Info::IsSetInst_Strand(void) const
  356. {
  357.     return IsSetInst() && GetInst().IsSetStrand();
  358. }
  359. bool CBioseq_Info::CanGetInst_Strand(void) const
  360. {
  361.     return CanGetInst() && GetInst().CanGetStrand();
  362. }
  363. CBioseq_Info::TInst_Strand CBioseq_Info::GetInst_Strand(void) const
  364. {
  365.     return GetInst().GetStrand();
  366. }
  367. bool CBioseq_Info::IsSetInst_Seq_data(void) const
  368. {
  369.     return IsSetInst() && GetInst().IsSetSeq_data();
  370. }
  371. bool CBioseq_Info::CanGetInst_Seq_data(void) const
  372. {
  373.     return CanGetInst() && GetInst().CanGetSeq_data();
  374. }
  375. const CBioseq_Info::TInst_Seq_data& CBioseq_Info::GetInst_Seq_data(void) const
  376. {
  377.     return GetInst().GetSeq_data();
  378. }
  379. bool CBioseq_Info::IsSetInst_Ext(void) const
  380. {
  381.     return IsSetInst() && GetInst().IsSetExt();
  382. }
  383. bool CBioseq_Info::CanGetInst_Ext(void) const
  384. {
  385.     return CanGetInst() && GetInst().CanGetExt();
  386. }
  387. const CBioseq_Info::TInst_Ext& CBioseq_Info::GetInst_Ext(void) const
  388. {
  389.     return GetInst().GetExt();
  390. }
  391. bool CBioseq_Info::IsSetInst_Hist(void) const
  392. {
  393.     return IsSetInst() && GetInst().IsSetHist();
  394. }
  395. bool CBioseq_Info::CanGetInst_Hist(void) const
  396. {
  397.     return CanGetInst() && GetInst().CanGetHist();
  398. }
  399. const CBioseq_Info::TInst_Hist& CBioseq_Info::GetInst_Hist(void) const
  400. {
  401.     return GetInst().GetHist();
  402. }
  403. void CBioseq_Info::SetInst(TInst& v)
  404. {
  405.     m_Object->SetInst(v);
  406. }
  407. void CBioseq_Info::SetInst_Repr(TInst_Repr v)
  408. {
  409.     m_Object->SetInst().SetRepr(v);;
  410. }
  411. void CBioseq_Info::SetInst_Mol(TInst_Mol v)
  412. {
  413.     m_Object->SetInst().SetMol(v);;
  414. }
  415. void CBioseq_Info::SetInst_Length(TInst_Length v)
  416. {
  417.     m_Object->SetInst().SetLength(v);;
  418. }
  419. void CBioseq_Info::SetInst_Fuzz(TInst_Fuzz& v)
  420. {
  421.     m_Object->SetInst().SetFuzz(v);;
  422. }
  423. void CBioseq_Info::SetInst_Topology(TInst_Topology v)
  424. {
  425.     m_Object->SetInst().SetTopology(v);;
  426. }
  427. void CBioseq_Info::SetInst_Strand(TInst_Strand v)
  428. {
  429.     m_Object->SetInst().SetStrand(v);;
  430. }
  431. void CBioseq_Info::SetInst_Seq_data(TInst_Seq_data& v)
  432. {
  433.     m_Object->SetInst().SetSeq_data(v);;
  434. }
  435. void CBioseq_Info::SetInst_Ext(TInst_Ext& v)
  436. {
  437.     m_Object->SetInst().SetExt(v);
  438. }
  439. void CBioseq_Info::SetInst_Hist(TInst_Hist& v)
  440. {
  441.     m_Object->SetInst().SetHist(v);;
  442. }
  443. TSeqPos CBioseq_Info::x_CalcBioseqLength(void) const
  444. {
  445.     return x_CalcBioseqLength(GetInst());
  446. }
  447. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeq_inst& inst) const
  448. {
  449.     if ( !inst.IsSetExt() ) {
  450.         NCBI_THROW(CObjMgrException, eOtherError,
  451.                    "CBioseq_Info::x_CalcBioseqLength: "
  452.                    "failed: Seq-inst.ext is not set");
  453.     }
  454.     switch ( inst.GetExt().Which() ) {
  455.     case CSeq_ext::e_Seg:
  456.         return x_CalcBioseqLength(inst.GetExt().GetSeg());
  457.     case CSeq_ext::e_Ref:
  458.         return x_CalcBioseqLength(inst.GetExt().GetRef().Get());
  459.     case CSeq_ext::e_Delta:
  460.         return x_CalcBioseqLength(inst.GetExt().GetDelta());
  461.     default:
  462.         NCBI_THROW(CObjMgrException, eOtherError,
  463.                    "CBioseq_Info::x_CalcBioseqLength: "
  464.                    "failed: bad Seg-ext type");
  465.     }
  466. }
  467. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeq_id& whole) const
  468. {
  469.     CConstRef<CBioseq_Info> ref =
  470.         GetTSE_Info().FindBioseq(CSeq_id_Handle::GetHandle(whole));
  471.     if ( !ref ) {
  472.         NCBI_THROW(CObjMgrException, eOtherError,
  473.                    "CBioseq_Info::x_CalcBioseqLength: "
  474.                    "failed: external whole reference");
  475.     }
  476.     return ref->GetBioseqLength();
  477. }
  478. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CPacked_seqint& ints) const
  479. {
  480.     TSeqPos ret = 0;
  481.     ITERATE ( CPacked_seqint::Tdata, it, ints.Get() ) {
  482.         ret += (*it)->GetLength();
  483.     }
  484.     return ret;
  485. }
  486. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeq_loc& seq_loc) const
  487. {
  488.     switch ( seq_loc.Which() ) {
  489.     case CSeq_loc::e_not_set:
  490.     case CSeq_loc::e_Null:
  491.     case CSeq_loc::e_Empty:
  492.         return 0;
  493.     case CSeq_loc::e_Whole:
  494.         return x_CalcBioseqLength(seq_loc.GetWhole());
  495.     case CSeq_loc::e_Int:
  496.         return seq_loc.GetInt().GetLength();
  497.     case CSeq_loc::e_Pnt:
  498.         return 1;
  499.     case CSeq_loc::e_Packed_int:
  500.         return x_CalcBioseqLength(seq_loc.GetPacked_int());
  501.     case CSeq_loc::e_Packed_pnt:
  502.         return seq_loc.GetPacked_pnt().GetPoints().size();
  503.     case CSeq_loc::e_Mix:
  504.         return x_CalcBioseqLength(seq_loc.GetMix());
  505.     case CSeq_loc::e_Equiv:
  506.         return x_CalcBioseqLength(seq_loc.GetEquiv());
  507.     default:
  508.         NCBI_THROW(CObjMgrException, eOtherError,
  509.                    "CBioseq_Info::x_CalcBioseqLength: "
  510.                    "failed: bad Seq-loc type");
  511.     }
  512. }
  513. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeq_loc_mix& seq_mix) const
  514. {
  515.     TSeqPos ret = 0;
  516.     ITERATE ( CSeq_loc_mix::Tdata, it, seq_mix.Get() ) {
  517.         ret += x_CalcBioseqLength(**it);
  518.     }
  519.     return ret;
  520. }
  521. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeq_loc_equiv& seq_equiv) const
  522. {
  523.     TSeqPos ret = 0;
  524.     ITERATE ( CSeq_loc_equiv::Tdata, it, seq_equiv.Get() ) {
  525.         ret += x_CalcBioseqLength(**it);
  526.     }
  527.     return ret;
  528. }
  529. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CSeg_ext& seg_ext) const
  530. {
  531.     TSeqPos ret = 0;
  532.     ITERATE ( CSeg_ext::Tdata, it, seg_ext.Get() ) {
  533.         ret += x_CalcBioseqLength(**it);
  534.     }
  535.     return ret;
  536. }
  537. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CDelta_ext& delta) const
  538. {
  539.     TSeqPos ret = 0;
  540.     ITERATE ( CDelta_ext::Tdata, it, delta.Get() ) {
  541.         ret += x_CalcBioseqLength(**it);
  542.     }
  543.     return ret;
  544. }
  545. TSeqPos CBioseq_Info::x_CalcBioseqLength(const CDelta_seq& delta_seq) const
  546. {
  547.     switch ( delta_seq.Which() ) {
  548.     case CDelta_seq::e_Loc:
  549.         return x_CalcBioseqLength(delta_seq.GetLoc());
  550.     case CDelta_seq::e_Literal:
  551.         return delta_seq.GetLiteral().GetLength();
  552.     default:
  553.         NCBI_THROW(CObjMgrException, eOtherError,
  554.                    "CBioseq_Info::x_CalcBioseqLength: "
  555.                    "failed: bad Delta-seq type");
  556.     }
  557. }
  558. string CBioseq_Info::IdString(void) const
  559. {
  560.     CNcbiOstrstream os;
  561.     ITERATE ( TId, it, m_Id ) {
  562.         if ( it != m_Id.begin() )
  563.             os << " | ";
  564.         os << it->AsString();
  565.     }
  566.     return CNcbiOstrstreamToString(os);
  567. }
  568. void CBioseq_Info::x_AttachMap(CSeqMap& seq_map)
  569. {
  570.     CFastMutexGuard guard(m_SeqMap_Mtx);
  571.     if ( m_SeqMap ) {
  572.         NCBI_THROW(CObjMgrException, eAddDataError,
  573.                      "CBioseq_Info::AttachMap: bioseq already has SeqMap");
  574.     }
  575.     m_SeqMap.Reset(&seq_map);
  576. }
  577. const CSeqMap& CBioseq_Info::GetSeqMap(void) const
  578. {
  579.     const CSeqMap* ret = m_SeqMap.GetPointer();
  580.     if ( !ret ) {
  581.         CFastMutexGuard guard(m_SeqMap_Mtx);
  582.         ret = m_SeqMap.GetPointer();
  583.         if ( !ret ) {
  584.             m_SeqMap = CSeqMap::CreateSeqMapForBioseq(*m_Object);
  585.             ret = m_SeqMap.GetPointer();
  586.             _ASSERT(ret);
  587.         }
  588.     }
  589.     return *ret;
  590. }
  591. END_SCOPE(objects)
  592. END_NCBI_SCOPE
  593. /*
  594. * ---------------------------------------------------------------------------
  595. * $Log: bioseq_info.cpp,v $
  596. * Revision 1000.4  2004/06/01 19:22:57  gouriano
  597. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  598. *
  599. * Revision 1.22  2004/05/21 21:42:12  gorelenk
  600. * Added PCH ncbi_pch.hpp
  601. *
  602. * Revision 1.21  2004/05/11 18:05:03  grichenk
  603. * include algorithm
  604. *
  605. * Revision 1.20  2004/05/11 17:45:51  grichenk
  606. * Implemented HasId(), AddId() and RemoveId()
  607. *
  608. * Revision 1.19  2004/05/06 17:32:37  grichenk
  609. * Added CanGetXXXX() methods
  610. *
  611. * Revision 1.18  2004/03/31 17:08:07  vasilche
  612. * Implemented ConvertSeqToSet and ConvertSetToSeq.
  613. *
  614. * Revision 1.17  2004/03/24 18:30:29  vasilche
  615. * Fixed edit API.
  616. * Every *_Info object has its own shallow copy of original object.
  617. *
  618. * Revision 1.16  2004/03/16 15:47:27  vasilche
  619. * Added CBioseq_set_Handle and set of EditHandles
  620. *
  621. * Revision 1.15  2003/12/11 17:02:50  grichenk
  622. * Fixed CRef resetting in constructors.
  623. *
  624. * Revision 1.14  2003/11/19 22:18:02  grichenk
  625. * All exceptions are now CException-derived. Catch "exception" rather
  626. * than "runtime_error".
  627. *
  628. * Revision 1.13  2003/11/12 16:53:17  grichenk
  629. * Modified CSeqMap to work with const objects (CBioseq, CSeq_loc etc.)
  630. *
  631. * Revision 1.12  2003/09/30 16:22:02  vasilche
  632. * Updated internal object manager classes to be able to load ID2 data.
  633. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  634. * Scope caches results of requests for data to data loaders.
  635. * Optimized CSeq_id_Handle for gis.
  636. * Optimized bioseq lookup in scope.
  637. * Reduced object allocations in annotation iterators.
  638. * CScope is allowed to be destroyed before other objects using this scope are
  639. * deleted (feature iterators, bioseq handles etc).
  640. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  641. * Added 'adaptive' option to objmgr_demo application.
  642. *
  643. * Revision 1.11  2003/06/02 16:06:37  dicuccio
  644. * Rearranged src/objects/ subtree.  This includes the following shifts:
  645. *     - src/objects/asn2asn --> arc/app/asn2asn
  646. *     - src/objects/testmedline --> src/objects/ncbimime/test
  647. *     - src/objects/objmgr --> src/objmgr
  648. *     - src/objects/util --> src/objmgr/util
  649. *     - src/objects/alnmgr --> src/objtools/alnmgr
  650. *     - src/objects/flat --> src/objtools/flat
  651. *     - src/objects/validator --> src/objtools/validator
  652. *     - src/objects/cddalignview --> src/objtools/cddalignview
  653. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  654. * replaces the three libmmdb? libs.
  655. *
  656. * Revision 1.10  2003/04/24 16:12:38  vasilche
  657. * Object manager internal structures are splitted more straightforward.
  658. * Removed excessive header dependencies.
  659. *
  660. * Revision 1.9  2003/03/14 19:10:41  grichenk
  661. * + SAnnotSelector::EIdResolving; fixed operator=() for several classes
  662. *
  663. * Revision 1.8  2003/03/11 15:51:06  kuznets
  664. * iterate -> ITERATE
  665. *
  666. * Revision 1.7  2003/02/05 17:59:17  dicuccio
  667. * Moved formerly private headers into include/objects/objmgr/impl
  668. *
  669. * Revision 1.6  2002/12/26 20:55:17  dicuccio
  670. * Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree
  671. *
  672. * Revision 1.5  2002/11/04 21:29:12  grichenk
  673. * Fixed usage of const CRef<> and CRef<> constructor
  674. *
  675. * Revision 1.4  2002/07/08 20:51:01  grichenk
  676. * Moved log to the end of file
  677. * Replaced static mutex (in CScope, CDataSource) with the mutex
  678. * pool. Redesigned CDataSource data locking.
  679. *
  680. * Revision 1.3  2002/05/29 21:21:13  gouriano
  681. * added debug dump
  682. *
  683. * Revision 1.2  2002/02/21 19:27:05  grichenk
  684. * Rearranged includes. Added scope history. Added searching for the
  685. * best seq-id match in data sources and scopes. Updated tests.
  686. *
  687. * Revision 1.1  2002/02/07 21:25:05  grichenk
  688. * Initial revision
  689. *
  690. *
  691. * ===========================================================================
  692. */