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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tse_info.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:24:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: tse_info.cpp,v 1000.4 2004/06/01 19:24:36 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. *   TSE info -- entry for data source seq-id to TSE map
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/tse_info.hpp>
  42. #include <objmgr/impl/annot_type_index.hpp>
  43. #include <objmgr/impl/tse_chunk_info.hpp>
  44. #include <objmgr/impl/bioseq_info.hpp>
  45. #include <objmgr/impl/annot_object.hpp>
  46. #include <objmgr/impl/seq_annot_info.hpp>
  47. #include <objmgr/impl/snp_annot_info.hpp>
  48. #include <objmgr/impl/data_source.hpp>
  49. #include <objmgr/impl/handle_range.hpp>
  50. #include <objects/seqset/Seq_entry.hpp>
  51. #include <objmgr/objmgr_exception.hpp>
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_SCOPE(objects)
  54. SIdAnnotObjs::SIdAnnotObjs(void)
  55. {
  56. }
  57. SIdAnnotObjs::~SIdAnnotObjs(void)
  58. {
  59. }
  60. SIdAnnotObjs::SIdAnnotObjs(const SIdAnnotObjs& _DEBUG_ARG(objs))
  61. {
  62.     _ASSERT(objs.m_AnnotSet.empty());
  63.     _ASSERT(objs.m_SNPSet.empty());
  64. }
  65. ////////////////////////////////////////////////////////////////////
  66. //
  67. //  CTSE_Info::
  68. //
  69. //    General information and indexes for top level seq-entries
  70. //
  71. CTSE_Info::CTSE_Info(CSeq_entry& entry,
  72.                      bool dead,
  73.                      const CObject* blob_id)
  74.     : m_DataSource(0),
  75.       m_Dead(dead),
  76.       m_Blob_ID(blob_id)
  77. {
  78.     entry.Parentize();
  79.     x_SetObject(entry);
  80.     x_TSEAttach(*this);
  81. }
  82. CTSE_Info::CTSE_Info(const CTSE_Info& info)
  83.     : TParent(info),
  84.       m_DataSource(0),
  85.       m_Dead(false),
  86.       m_Name(info.m_Name)
  87. {
  88.     x_TSEAttach(*this);
  89. }
  90. CTSE_Info::~CTSE_Info(void)
  91. {
  92. }
  93. void CTSE_Info::SetBlobId(const CObject* blob_id)
  94. {
  95.     m_Blob_ID.Reset(blob_id);
  96. }
  97. void CTSE_Info::SetName(const CAnnotName& name)
  98. {
  99.     m_Name = name;
  100. }
  101. bool CTSE_Info::HasAnnot(const CAnnotName& name) const
  102. {
  103.     _ASSERT(!x_DirtyAnnotIndex());
  104.     return m_NamedAnnotObjs.find(name) != m_NamedAnnotObjs.end();
  105. }
  106. bool CTSE_Info::HasNamedAnnot(const string& name) const
  107. {
  108.     return HasAnnot(CAnnotName(name));
  109. }
  110. bool CTSE_Info::HasUnnamedAnnot(void) const
  111. {
  112.     return HasAnnot(CAnnotName());
  113. }
  114. CConstRef<CSeq_entry> CTSE_Info::GetCompleteTSE(void) const
  115. {
  116.     return GetCompleteSeq_entry();
  117. }
  118. CConstRef<CSeq_entry> CTSE_Info::GetTSECore(void) const
  119. {
  120.     return GetSeq_entryCore();
  121. }
  122. void CTSE_Info::x_DSAttachContents(CDataSource& ds)
  123. {
  124.     _ASSERT(!m_DataSource);
  125.     m_DataSource = &ds;
  126.     TParent::x_DSAttachContents(ds);
  127.     ITERATE ( TBioseqs, it, m_Bioseqs ) {
  128.         ds.x_IndexSeqTSE(it->first, this);
  129.     }
  130.     ds.x_IndexAnnotTSEs(this);
  131. }
  132. void CTSE_Info::x_DSDetachContents(CDataSource& ds)
  133. {
  134.     _ASSERT(m_DataSource == &ds);
  135.     ITERATE ( TBioseqs, it, m_Bioseqs ) {
  136.         ds.x_UnindexSeqTSE(it->first, this);
  137.     }
  138.     ds.x_UnindexAnnotTSEs(this);
  139.     TParent::x_DSDetachContents(ds);
  140.     m_DataSource = 0;
  141. }
  142. void CTSE_Info::x_DSMapObject(CConstRef<TObject> obj, CDataSource& ds)
  143. {
  144.     ds.x_Map(obj, this);
  145.     TParent::x_DSMapObject(obj, ds);
  146. }
  147. void CTSE_Info::x_DSUnmapObject(CConstRef<TObject> obj, CDataSource& ds)
  148. {
  149.     ds.x_Unmap(obj, this);
  150.     TParent::x_DSUnmapObject(obj, ds);
  151. }
  152. inline
  153. void CTSE_Info::x_IndexSeqTSE(const CSeq_id_Handle& id)
  154. {
  155.     if ( HasDataSource() ) {
  156.         GetDataSource().x_IndexSeqTSE(id, this);
  157.     }
  158. }
  159. inline
  160. void CTSE_Info::x_UnindexSeqTSE(const CSeq_id_Handle& id)
  161. {
  162.     if ( HasDataSource() ) {
  163.         GetDataSource().x_UnindexSeqTSE(id, this);
  164.     }
  165. }
  166. void CTSE_Info::x_IndexAnnotTSE(const CAnnotName& name,
  167.                                 const CSeq_id_Handle& id)
  168. {
  169.     TSeqIdToNames::iterator iter = m_SeqIdToNames.lower_bound(id);
  170.     if ( iter == m_SeqIdToNames.end() || iter->first != id ) {
  171.         iter = m_SeqIdToNames.insert(iter,
  172.                                      TSeqIdToNames::value_type(id, TNames()));
  173.         if ( HasDataSource() ) {
  174.             GetDataSource().x_IndexAnnotTSE(id, this);
  175.         }
  176.     }
  177.     _VERIFY(iter->second.insert(name).second);
  178. }
  179. void CTSE_Info::x_UnindexAnnotTSE(const CAnnotName& name,
  180.                                   const CSeq_id_Handle& id)
  181. {
  182.     TSeqIdToNames::iterator iter = m_SeqIdToNames.lower_bound(id);
  183.     _ASSERT(iter != m_SeqIdToNames.end() && iter->first == id);
  184.     _VERIFY(iter->second.erase(name) == 1);
  185.     if ( iter->second.empty() ) {
  186.         m_SeqIdToNames.erase(iter);
  187.         if ( HasDataSource() ) {
  188.             GetDataSource().x_UnindexAnnotTSE(id, this);
  189.         }
  190.     }
  191. }
  192. CConstRef<CBioseq_Info> CTSE_Info::FindBioseq(const CSeq_id_Handle& id) const
  193. {
  194.     CConstRef<CBioseq_Info> ret;
  195.     //CFastMutexGuard guard(m_BioseqsLock);
  196.     TBioseqs::const_iterator it = m_Bioseqs.find(id);
  197.     if ( it != m_Bioseqs.end() ) {
  198.         ret = it->second;
  199.     }
  200.     return ret;
  201. }
  202. bool CTSE_Info::ContainsSeqid(const CSeq_id_Handle& id) const
  203. {
  204.     //CFastMutexGuard guard(m_BioseqsLock);
  205.     return m_Bioseqs.find(id) != m_Bioseqs.end();
  206. }
  207. void CTSE_Info::x_SetBioseqId(const CSeq_id_Handle& key,
  208.                               CBioseq_Info* info)
  209. {
  210.     //CFastMutexGuard guard(m_BioseqsLock);
  211.     pair<TBioseqs::iterator, bool> ins =
  212.         m_Bioseqs.insert(TBioseqs::value_type(key, info));
  213.     if ( ins.second ) {
  214.         // register this TSE in data source as containing the sequence
  215.         x_IndexSeqTSE(key);
  216.     }
  217.     else {
  218.         // No duplicate bioseqs in the same TSE
  219.         NCBI_THROW(CObjMgrException, eAddDataError,
  220.                    " duplicate Bioseq id '"+key.AsString()+"' present in"+
  221.                    "n  seq1: " + ins.first->second->IdString() +
  222.                    "n  seq2: " + info->IdString());
  223.     }
  224. }
  225. void CTSE_Info::x_ResetBioseqId(const CSeq_id_Handle& key,
  226.                                 CBioseq_Info* _DEBUG_ARG(info))
  227. {
  228.     //CFastMutexGuard guard(m_BioseqsLock);
  229.     TBioseqs::iterator iter = m_Bioseqs.lower_bound(key);
  230.     if ( iter != m_Bioseqs.end() && iter->first == key ) {
  231.         _ASSERT(iter->second == info);
  232.         m_Bioseqs.erase(iter);
  233.         x_UnindexSeqTSE(key);
  234.     }
  235. }
  236. void CTSE_Info::x_SetBioseq_setId(int key,
  237.                                   CBioseq_set_Info* info)
  238. {
  239.     //CFastMutexGuard guard(m_BioseqsLock);
  240.     pair<TBioseq_sets::iterator, bool> ins =
  241.         m_Bioseq_sets.insert(TBioseq_sets::value_type(key, info));
  242.     if ( ins.second ) {
  243.         // everything is fine
  244.     }
  245.     else {
  246.         // No duplicate bioseqs in the same TSE
  247.         NCBI_THROW(CObjMgrException, eAddDataError,
  248.                    " duplicate Bioseq_set id '"+NStr::IntToString(key));
  249.     }
  250. }
  251. void CTSE_Info::x_ResetBioseq_setId(int key,
  252.                                     CBioseq_set_Info* _DEBUG_ARG(info))
  253. {
  254.     //CFastMutexGuard guard(m_BioseqsLock);
  255.     TBioseq_sets::iterator iter = m_Bioseq_sets.lower_bound(key);
  256.     if ( iter != m_Bioseq_sets.end() && iter->first == key ) {
  257.         _ASSERT(iter->second == info);
  258.         m_Bioseq_sets.erase(iter);
  259.     }
  260. }
  261. void CTSE_Info::x_SetDirtyAnnotIndexNoParent(void)
  262. {
  263.     if ( HasDataSource() ) {
  264.         GetDataSource().x_SetDirtyAnnotIndex(*this);
  265.     }
  266. }
  267. void CTSE_Info::x_ResetDirtyAnnotIndexNoParent(void)
  268. {
  269.     if ( HasDataSource() ) {
  270.         GetDataSource().x_ResetDirtyAnnotIndex(*this);
  271.     }
  272. }
  273. void CTSE_Info::UpdateAnnotIndex(void) const
  274. {
  275.     const_cast<CTSE_Info*>(this)->UpdateAnnotIndex();
  276.     _ASSERT(!x_DirtyAnnotIndex());
  277. }
  278. void CTSE_Info::UpdateAnnotIndex(const CTSE_Info_Object& object) const
  279. {
  280.     const_cast<CTSE_Info*>(this)->
  281.         UpdateAnnotIndex(const_cast<CTSE_Info_Object&>(object));
  282.     _ASSERT(!object.x_DirtyAnnotIndex());
  283. }
  284. void CTSE_Info::UpdateAnnotIndex(void)
  285. {
  286.     UpdateAnnotIndex(*this);
  287. }
  288. void CTSE_Info::UpdateAnnotIndex(CTSE_Info_Object& object)
  289. {
  290.     _ASSERT(&object.GetTSE_Info() == this);
  291.     CTSE_Info::TAnnotWriteLockGuard guard(m_AnnotObjsLock);
  292.     NON_CONST_ITERATE ( TChunks, it, m_Chunks ) {
  293.         it->second->x_UpdateAnnotIndex(*this);
  294.     }
  295.     object.x_UpdateAnnotIndex(*this);
  296.     _ASSERT(!object.x_DirtyAnnotIndex());
  297. }
  298. CRef<CTSE_Chunk_Info> CTSE_Info::GetNotLoadedChunk(void)
  299. {
  300.     NON_CONST_ITERATE ( TChunks, it, m_Chunks ) {
  301.         if ( it->second->NotLoaded() ) {
  302.             return it->second;
  303.         }
  304.     }
  305.     return CRef<CTSE_Chunk_Info>();
  306. }
  307. void CTSE_Info::LoadAllChunks(void)
  308. {
  309.     NON_CONST_ITERATE ( TChunks, it, m_Chunks ) {
  310.         it->second->Load();
  311.     }
  312. }
  313. CTSE_Info::TAnnotObjs& CTSE_Info::x_SetAnnotObjs(const CAnnotName& name)
  314. {
  315.     TNamedAnnotObjs::iterator iter = m_NamedAnnotObjs.lower_bound(name);
  316.     if ( iter == m_NamedAnnotObjs.end() || iter->first != name ) {
  317.         typedef TNamedAnnotObjs::value_type value_type;
  318.         iter = m_NamedAnnotObjs.insert(iter, value_type(name, TAnnotObjs()));
  319.     }
  320.     return iter->second;
  321. }
  322. void CTSE_Info::x_RemoveAnnotObjs(const CAnnotName& name)
  323. {
  324.     m_NamedAnnotObjs.erase(name);
  325. }
  326. const CTSE_Info::TAnnotObjs*
  327. CTSE_Info::x_GetAnnotObjs(const CAnnotName& name) const
  328. {
  329.     TNamedAnnotObjs::const_iterator iter = m_NamedAnnotObjs.lower_bound(name);
  330.     if ( iter == m_NamedAnnotObjs.end() || iter->first != name ) {
  331.         return 0;
  332.     }
  333.     return &iter->second;
  334. }
  335. const CTSE_Info::TAnnotObjs*
  336. CTSE_Info::x_GetUnnamedAnnotObjs(void) const
  337. {
  338.     TNamedAnnotObjs::const_iterator iter = m_NamedAnnotObjs.begin();
  339.     if ( iter == m_NamedAnnotObjs.end() || iter->first.IsNamed() ) {
  340.         return 0;
  341.     }
  342.     return &iter->second;
  343. }
  344. SIdAnnotObjs& CTSE_Info::x_SetIdObjects(TAnnotObjs& objs,
  345.                                         const CAnnotName& name,
  346.                                         const CSeq_id_Handle& id)
  347. {
  348.     // repeat for more generic types of selector
  349.     TAnnotObjs::iterator it = objs.lower_bound(id);
  350.     if ( it == objs.end() || it->first != id ) {
  351.         // new id
  352.         it = objs.insert(it, TAnnotObjs::value_type(id, SIdAnnotObjs()));
  353.         x_IndexAnnotTSE(name, id);
  354.     }
  355.     _ASSERT(it != objs.end() && it->first == id);
  356.     return it->second;
  357. }
  358. SIdAnnotObjs& CTSE_Info::x_SetIdObjects(const CAnnotName& name,
  359.                                         const CSeq_id_Handle& id)
  360. {
  361.     return x_SetIdObjects(x_SetAnnotObjs(name), name, id);
  362. }
  363. const SIdAnnotObjs* CTSE_Info::x_GetIdObjects(const TAnnotObjs& objs,
  364.                                               const CSeq_id_Handle& idh) const
  365. {
  366.     TAnnotObjs::const_iterator it = objs.lower_bound(idh);
  367.     if ( it == objs.end() || it->first != idh ) {
  368.         return 0;
  369.     }
  370.     return &it->second;
  371. }
  372. const SIdAnnotObjs* CTSE_Info::x_GetIdObjects(const CAnnotName& name,
  373.                                               const CSeq_id_Handle& idh) const
  374. {
  375.     const TAnnotObjs* objs = x_GetAnnotObjs(name);
  376.     if ( !objs ) {
  377.         return 0;
  378.     }
  379.     return x_GetIdObjects(*objs, idh);
  380. }
  381. const SIdAnnotObjs*
  382. CTSE_Info::x_GetUnnamedIdObjects(const CSeq_id_Handle& idh) const
  383. {
  384.     const TAnnotObjs* objs = x_GetUnnamedAnnotObjs();
  385.     if ( !objs ) {
  386.         return 0;
  387.     }
  388.     return x_GetIdObjects(*objs, idh);
  389. }
  390. inline
  391. void CTSE_Info::x_MapAnnotObject(TRangeMap& rangeMap,
  392.                                  const SAnnotObject_Key& key,
  393.                                  const SAnnotObject_Index& annotRef)
  394. {
  395.     _ASSERT(annotRef.m_AnnotObject_Info == key.m_AnnotObject_Info);
  396.     rangeMap.insert(TRangeMap::value_type(key.m_Range, annotRef));
  397. }
  398. inline
  399. bool CTSE_Info::x_UnmapAnnotObject(TRangeMap& rangeMap,
  400.                                    const SAnnotObject_Key& key)
  401. {
  402.     for ( TRangeMap::iterator it = rangeMap.find(key.m_Range);
  403.           it && it->first == key.m_Range; ++it ) {
  404.         if ( it->second.m_AnnotObject_Info == key.m_AnnotObject_Info ) {
  405.             rangeMap.erase(it);
  406.             return rangeMap.empty();
  407.         }
  408.     }
  409.     _ASSERT(0);
  410.     return rangeMap.empty();
  411. }
  412. void CTSE_Info::x_MapAnnotObject(SIdAnnotObjs& objs,
  413.                                  const SAnnotObject_Key& key,
  414.                                  const SAnnotObject_Index& annotRef)
  415. {
  416.     size_t index = CAnnotType_Index::GetTypeIndex(key);
  417.     if ( index >= objs.m_AnnotSet.size() ) {
  418.         objs.m_AnnotSet.resize(index+1);
  419.     }
  420.     x_MapAnnotObject(objs.m_AnnotSet[index], key, annotRef);
  421. }
  422. bool CTSE_Info::x_UnmapAnnotObject(SIdAnnotObjs& objs,
  423.                                    const SAnnotObject_Key& key)
  424. {
  425.     size_t index = CAnnotType_Index::GetTypeIndex(key);
  426.     _ASSERT(index < objs.m_AnnotSet.size());
  427.     if ( x_UnmapAnnotObject(objs.m_AnnotSet[index], key) ) {
  428.         while ( objs.m_AnnotSet.back().empty() ) {
  429.             objs.m_AnnotSet.pop_back();
  430.             if ( objs.m_AnnotSet.empty() ) {
  431.                 return objs.m_SNPSet.empty();
  432.             }
  433.         }
  434.     }
  435.     return false;
  436. }
  437. void CTSE_Info::x_MapAnnotObject(TAnnotObjs& objs,
  438.                                  const CAnnotName& name,
  439.                                  const SAnnotObject_Key& key,
  440.                                  const SAnnotObject_Index& annotRef)
  441. {
  442.     x_MapAnnotObject(x_SetIdObjects(objs, name, key.m_Handle), key, annotRef);
  443. }
  444. bool CTSE_Info::x_UnmapAnnotObject(TAnnotObjs& objs,
  445.                                    const CAnnotName& name,
  446.                                    const SAnnotObject_Key& key)
  447. {
  448.     TAnnotObjs::iterator it = objs.find(key.m_Handle);
  449.     _ASSERT(it != objs.end() && it->first == key.m_Handle);
  450.     if ( x_UnmapAnnotObject(it->second, key) ) {
  451.         x_UnindexAnnotTSE(name, key.m_Handle);
  452.         objs.erase(it);
  453.         return objs.empty();
  454.     }
  455.     return false;
  456. }
  457. void CTSE_Info::x_MapSNP_Table(const CAnnotName& name,
  458.                                const CSeq_id_Handle& key,
  459.                                const CSeq_annot_SNP_Info& snp_info)
  460. {
  461.     SIdAnnotObjs& objs = x_SetIdObjects(name, key);
  462.     objs.m_SNPSet.push_back(ConstRef(&snp_info));
  463. }
  464. void CTSE_Info::x_UnmapSNP_Table(const CAnnotName& name,
  465.                                  const CSeq_id_Handle& key,
  466.                                  const CSeq_annot_SNP_Info& snp_info)
  467. {
  468.     SIdAnnotObjs& objs = x_SetIdObjects(name, key);
  469.     TSNPSet::iterator iter = find(objs.m_SNPSet.begin(),
  470.                                   objs.m_SNPSet.end(),
  471.                                   ConstRef(&snp_info));
  472.     if ( iter != objs.m_SNPSet.end() ) {
  473.         objs.m_SNPSet.erase(iter);
  474.     }
  475. }
  476. void CTSE_Info::x_MapAnnotObject(TAnnotObjs& index,
  477.                                  const SAnnotObject_Key& key,
  478.                                  const SAnnotObject_Index& annotRef,
  479.                                  SAnnotObjects_Info& infos)
  480. {
  481.     _ASSERT(&index == x_GetAnnotObjs(infos.GetName()));
  482.     infos.AddKey(key);
  483.     x_MapAnnotObject(index, infos.GetName(), key, annotRef);
  484. }
  485. void CTSE_Info::x_MapAnnotObject(const SAnnotObject_Key& key,
  486.                                  const SAnnotObject_Index& annotRef,
  487.                                  SAnnotObjects_Info& infos)
  488. {
  489.     x_MapAnnotObject(x_SetAnnotObjs(infos.GetName()), key, annotRef, infos);
  490. }
  491. void CTSE_Info::x_UnmapAnnotObjects(SAnnotObjects_Info& infos)
  492. {
  493.     TAnnotObjs& index = x_SetAnnotObjs(infos.GetName());
  494.     ITERATE( SAnnotObjects_Info::TObjectKeys, it, infos.GetKeys() ) {
  495.         x_UnmapAnnotObject(index, infos.GetName(), *it);
  496.     }
  497.     if ( index.empty() ) {
  498.         x_RemoveAnnotObjs(infos.GetName());
  499.     }
  500.     infos.Clear();
  501. }
  502. CBioseq_set_Info& CTSE_Info::GetBioseq_set(int id)
  503. {
  504.     TBioseq_sets::iterator iter = m_Bioseq_sets.find(id);
  505.     if ( iter == m_Bioseq_sets.end() ) {
  506.         NCBI_THROW(CObjMgrException, eRegisterError,
  507.                    "cannot find Bioseq-set by local id");
  508.     }
  509.     return *iter->second;
  510. }
  511. CBioseq_Info& CTSE_Info::GetBioseq(int gi)
  512. {
  513.     TBioseqs::iterator iter = m_Bioseqs.find(CSeq_id_Handle::GetGiHandle(gi));
  514.     if ( iter == m_Bioseqs.end() ) {
  515.         NCBI_THROW(CObjMgrException, eRegisterError,
  516.                    "cannot find Bioseq by gi");
  517.     }
  518.     return *iter->second;
  519. }
  520. void CTSE_Info::DebugDump(CDebugDumpContext /*ddc*/, unsigned int /*depth*/) const
  521. {
  522. #if 0
  523.     ddc.SetFrame("CTSE_Info");
  524.     CObject::DebugDump( ddc, depth);
  525.     ddc.Log("m_TSE", m_Seq_entry.GetPointer(),0);
  526.     ddc.Log("m_Dead", m_Dead);
  527.     if (depth == 0) {
  528.         DebugDumpValue(ddc, "m_Bioseqs.size()", m_Bioseqs.size());
  529.         DebugDumpValue(ddc, "m_AnnotObjs.size()",  m_AnnotObjs.size());
  530.     } else {
  531.         unsigned int depth2 = depth-1;
  532.         { //--- m_Bioseqs
  533.             DebugDumpValue(ddc, "m_Bioseqs.type",
  534.                 "map<CSeq_id_Handle, CRef<CBioseq_Info>>");
  535.             CDebugDumpContext ddc2(ddc,"m_Bioseqs");
  536.             TBioseqs::const_iterator it;
  537.             for (it=m_Bioseqs.begin(); it!=m_Bioseqs.end(); ++it) {
  538.                 string member_name = "m_Bioseqs[ " +
  539.                     (it->first).AsString() +" ]";
  540.                 ddc2.Log(member_name, (it->second).GetPointer(),depth2);
  541.             }
  542.         }
  543.         { //--- m_AnnotObjs_ByInt
  544.             DebugDumpValue(ddc, "m_AnnotObjs_ByInt.type",
  545.                 "map<CSeq_id_Handle, CRangeMultimap<CRef<CAnnotObject>,"
  546.                 "CRange<TSeqPos>::position_type>>");
  547.             CDebugDumpContext ddc2(ddc,"m_AnnotObjs_ByInt");
  548.             TAnnotObjs::const_iterator it;
  549.             for (it=m_AnnotObjs.begin(); it!=m_AnnotObjs.end(); ++it) {
  550.                 string member_name = "m_AnnotObjs[ " +
  551.                     (it->first).AsString() +" ]";
  552.                 if (depth2 == 0) {
  553. /*
  554.                     member_name += "size()";
  555.                     DebugDumpValue(ddc2, member_name, (it->second).size());
  556. */
  557.                 } else {
  558. /*
  559.                     // CRangeMultimap
  560.                     CDebugDumpContext ddc3(ddc2, member_name);
  561.                     ITERATE( TRangeMap, itrm, it->second ) {
  562.                         // CRange as string
  563.                         string rg;
  564.                         if (itrm->first.Empty()) {
  565.                             rg += "empty";
  566.                         } else if (itrm->first.IsWhole()) {
  567.                             rg += "whole";
  568.                         } else if (itrm->first.IsWholeTo()) {
  569.                             rg += "unknown";
  570.                         } else {
  571.                             rg +=
  572.                                 NStr::UIntToString(itrm->first.GetFrom()) +
  573.                                 "..." +
  574.                                 NStr::UIntToString(itrm->first.GetTo());
  575.                         }
  576.                         string rm_name = member_name + "[ " + rg + " ]";
  577.                         // CAnnotObject
  578.                         ddc3.Log(rm_name, itrm->second, depth2-1);
  579.                     }
  580. */
  581.                 }
  582.             }
  583.         }
  584.     }
  585.     // DebugDumpValue(ddc, "CMutableAtomicCounter::Get()", Get());
  586. #endif
  587. }
  588. END_SCOPE(objects)
  589. END_NCBI_SCOPE
  590. /*
  591. * ---------------------------------------------------------------------------
  592. * $Log: tse_info.cpp,v $
  593. * Revision 1000.4  2004/06/01 19:24:36  gouriano
  594. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  595. *
  596. * Revision 1.44  2004/05/21 21:42:13  gorelenk
  597. * Added PCH ncbi_pch.hpp
  598. *
  599. * Revision 1.43  2004/03/24 18:30:30  vasilche
  600. * Fixed edit API.
  601. * Every *_Info object has its own shallow copy of original object.
  602. *
  603. * Revision 1.42  2004/03/23 15:14:00  vasilche
  604. * Restored automatic call to Parentize() for Seq-entries in object manager.
  605. *
  606. * Revision 1.41  2004/03/16 15:47:28  vasilche
  607. * Added CBioseq_set_Handle and set of EditHandles
  608. *
  609. * Revision 1.40  2004/02/19 17:13:42  vasilche
  610. * Removed 'unused argument' warnings.
  611. *
  612. * Revision 1.39  2004/02/04 18:05:39  grichenk
  613. * Added annotation filtering by set of types/subtypes.
  614. * Renamed *Choice to *Type in SAnnotSelector.
  615. *
  616. * Revision 1.38  2004/02/03 19:02:19  vasilche
  617. * Fixed broken 'dirty annot index' state after RemoveEntry().
  618. *
  619. * Revision 1.37  2004/01/22 20:10:41  vasilche
  620. * 1. Splitted ID2 specs to two parts.
  621. * ID2 now specifies only protocol.
  622. * Specification of ID2 split data is moved to seqsplit ASN module.
  623. * For now they are still reside in one resulting library as before - libid2.
  624. * As the result split specific headers are now in objects/seqsplit.
  625. * 2. Moved ID2 and ID1 specific code out of object manager.
  626. * Protocol is processed by corresponding readers.
  627. * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  628. * 3. Updated OBJMGR_LIBS correspondingly.
  629. *
  630. * Revision 1.36  2003/11/26 17:56:00  vasilche
  631. * Implemented ID2 split in ID1 cache.
  632. * Fixed loading of splitted annotations.
  633. *
  634. * Revision 1.35  2003/11/19 22:18:04  grichenk
  635. * All exceptions are now CException-derived. Catch "exception" rather
  636. * than "runtime_error".
  637. *
  638. * Revision 1.34  2003/10/27 16:47:12  vasilche
  639. * Fixed error:
  640. * src/objmgr/data_source.cpp", line 913: Fatal: Assertion failed: (it != tse_map.end() && it->first == id)
  641. *
  642. * Revision 1.33  2003/10/09 20:20:58  vasilche
  643. * Added possibility to include and exclude Seq-annot names to annot iterator.
  644. * Fixed adaptive search. It looked only on selected set of annot names before.
  645. *
  646. * Revision 1.32  2003/10/07 13:43:23  vasilche
  647. * Added proper handling of named Seq-annots.
  648. * Added feature search from named Seq-annots.
  649. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  650. * Fixed selection of blobs for loading from GenBank.
  651. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  652. * Fixed leaked split chunks annotation stubs.
  653. * Moved some classes definitions in separate *.cpp files.
  654. *
  655. * Revision 1.31  2003/09/30 16:22:04  vasilche
  656. * Updated internal object manager classes to be able to load ID2 data.
  657. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  658. * Scope caches results of requests for data to data loaders.
  659. * Optimized CSeq_id_Handle for gis.
  660. * Optimized bioseq lookup in scope.
  661. * Reduced object allocations in annotation iterators.
  662. * CScope is allowed to be destroyed before other objects using this scope are
  663. * deleted (feature iterators, bioseq handles etc).
  664. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  665. * Added 'adaptive' option to objmgr_demo application.
  666. *
  667. * Revision 1.30  2003/09/16 14:21:48  grichenk
  668. * Added feature indexing and searching by subtype.
  669. *
  670. * Revision 1.29  2003/08/14 20:05:19  vasilche
  671. * Simple SNP features are stored as table internally.
  672. * They are recreated when needed using CFeat_CI.
  673. *
  674. * Revision 1.28  2003/07/17 20:07:56  vasilche
  675. * Reduced memory usage by feature indexes.
  676. * SNP data is loaded separately through PUBSEQ_OS.
  677. * String compression for SNP data.
  678. *
  679. * Revision 1.27  2003/06/24 14:25:18  vasilche
  680. * Removed obsolete CTSE_Guard class.
  681. * Used separate mutexes for bioseq and annot maps.
  682. *
  683. * Revision 1.26  2003/06/02 16:06:38  dicuccio
  684. * Rearranged src/objects/ subtree.  This includes the following shifts:
  685. *     - src/objects/asn2asn --> arc/app/asn2asn
  686. *     - src/objects/testmedline --> src/objects/ncbimime/test
  687. *     - src/objects/objmgr --> src/objmgr
  688. *     - src/objects/util --> src/objmgr/util
  689. *     - src/objects/alnmgr --> src/objtools/alnmgr
  690. *     - src/objects/flat --> src/objtools/flat
  691. *     - src/objects/validator --> src/objtools/validator
  692. *     - src/objects/cddalignview --> src/objtools/cddalignview
  693. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  694. * replaces the three libmmdb? libs.
  695. *
  696. * Revision 1.25  2003/05/20 15:44:38  vasilche
  697. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  698. * Fixed some warnings on WorkShop.
  699. * Added workaround for memory leak on WorkShop.
  700. *
  701. * Revision 1.24  2003/04/25 14:23:26  vasilche
  702. * Added explicit constructors, destructor and assignment operator to make it compilable on MSVC DLL.
  703. *
  704. * Revision 1.23  2003/04/24 16:12:38  vasilche
  705. * Object manager internal structures are splitted more straightforward.
  706. * Removed excessive header dependencies.
  707. *
  708. * Revision 1.22  2003/03/21 19:22:51  grichenk
  709. * Redesigned TSE locking, replaced CTSE_Lock with CRef<CTSE_Info>.
  710. *
  711. * Revision 1.21  2003/03/12 20:09:34  grichenk
  712. * Redistributed members between CBioseq_Handle, CBioseq_Info and CTSE_Info
  713. *
  714. * Revision 1.20  2003/03/11 15:51:06  kuznets
  715. * iterate -> ITERATE
  716. *
  717. * Revision 1.19  2003/03/10 16:55:17  vasilche
  718. * Cleaned SAnnotSelector structure.
  719. * Added shortcut when features are limited to one TSE.
  720. *
  721. * Revision 1.18  2003/03/05 20:56:43  vasilche
  722. * SAnnotSelector now holds all parameters of annotation iterators.
  723. *
  724. * Revision 1.17  2003/02/25 20:10:40  grichenk
  725. * Reverted to single total-range index for annotations
  726. *
  727. * Revision 1.16  2003/02/24 18:57:22  vasilche
  728. * Make feature gathering in one linear pass using CSeqMap iterator.
  729. * Do not use feture index by sub locations.
  730. * Sort features at the end of gathering in one vector.
  731. * Extracted some internal structures and classes in separate header.
  732. * Delay creation of mapped features.
  733. *
  734. * Revision 1.15  2003/02/05 17:59:17  dicuccio
  735. * Moved formerly private headers into include/objects/objmgr/impl
  736. *
  737. * Revision 1.14  2003/02/04 21:46:32  grichenk
  738. * Added map of annotations by intervals (the old one was
  739. * by total ranges)
  740. *
  741. * Revision 1.13  2003/01/29 17:45:03  vasilche
  742. * Annotaions index is split by annotation/feature type.
  743. *
  744. * Revision 1.12  2003/01/22 20:11:54  vasilche
  745. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  746. * CSeqMap_CI now supports resolution and iteration over sequence range.
  747. * Added several caches to CScope.
  748. * Optimized CSeqVector().
  749. * Added serveral variants of CBioseqHandle::GetSeqVector().
  750. * Tried to optimize annotations iterator (not much success).
  751. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  752. *
  753. * Revision 1.11  2002/12/26 20:55:18  dicuccio
  754. * Moved seq_id_mapper.hpp, tse_info.hpp, and bioseq_info.hpp -> include/ tree
  755. *
  756. * Revision 1.10  2002/12/26 16:39:24  vasilche
  757. * Object manager class CSeqMap rewritten.
  758. *
  759. * Revision 1.9  2002/10/18 19:12:40  grichenk
  760. * Removed mutex pools, converted most static mutexes to non-static.
  761. * Protected CSeqMap::x_Resolve() with mutex. Modified code to prevent
  762. * dead-locks.
  763. *
  764. * Revision 1.8  2002/07/10 16:50:33  grichenk
  765. * Fixed bug with duplicate and uninitialized atomic counters
  766. *
  767. * Revision 1.7  2002/07/08 20:51:02  grichenk
  768. * Moved log to the end of file
  769. * Replaced static mutex (in CScope, CDataSource) with the mutex
  770. * pool. Redesigned CDataSource data locking.
  771. *
  772. * Revision 1.6  2002/07/01 15:32:30  grichenk
  773. * Fixed 'unused variable depth3' warning
  774. *
  775. * Revision 1.5  2002/05/31 17:53:00  grichenk
  776. * Optimized for better performance (CTSE_Info uses atomic counter,
  777. * delayed annotations indexing, no location convertions in
  778. * CAnnot_Types_CI if no references resolution is required etc.)
  779. *
  780. * Revision 1.4  2002/05/29 21:21:13  gouriano
  781. * added debug dump
  782. *
  783. * Revision 1.3  2002/03/14 18:39:13  gouriano
  784. * added mutex for MT protection
  785. *
  786. * Revision 1.2  2002/02/21 19:27:06  grichenk
  787. * Rearranged includes. Added scope history. Added searching for the
  788. * best seq-id match in data sources and scopes. Updated tests.
  789. *
  790. * Revision 1.1  2002/02/07 21:25:05  grichenk
  791. * Initial revision
  792. *
  793. *
  794. * ===========================================================================
  795. */