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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: data_source.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:23:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.133
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: data_source.cpp,v 1000.4 2004/06/01 19:23:11 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. *   DataSource for object manager
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/impl/data_source.hpp>
  42. #include <objmgr/impl/annot_object.hpp>
  43. #include <objmgr/impl/handle_range_map.hpp>
  44. #include <objmgr/impl/seq_entry_info.hpp>
  45. #include <objmgr/impl/seq_annot_info.hpp>
  46. #include <objmgr/impl/bioseq_info.hpp>
  47. #include <objmgr/impl/bioseq_set_info.hpp>
  48. #include <objmgr/impl/tse_info.hpp>
  49. #include <objmgr/seqmatch_info.hpp>
  50. #include <objmgr/data_loader.hpp>
  51. #include <objmgr/seq_map.hpp>
  52. #include <objmgr/objmgr_exception.hpp>
  53. #include <objmgr/bioseq_ci.hpp> // for CBioseq_CI_Base
  54. #include <objects/seqloc/Seq_loc.hpp>
  55. #include <objects/seqloc/Seq_interval.hpp>
  56. #include <objects/seqloc/Seq_point.hpp>
  57. #include <objects/seqloc/Seq_loc_equiv.hpp>
  58. #include <objects/seq/Bioseq.hpp>
  59. #include <objects/seq/seqport_util.hpp>
  60. #include <objects/seqset/Seq_entry.hpp>
  61. #include <objects/seqset/Bioseq_set.hpp>
  62. #include <objects/seqalign/Seq_align.hpp>
  63. #include <objects/seqfeat/Seq_feat.hpp>
  64. #include <objects/seqres/Seq_graph.hpp>
  65. #include <objmgr/impl/prefetch_impl.hpp>
  66. #include <corelib/ncbimtx.hpp>
  67. BEGIN_NCBI_SCOPE
  68. BEGIN_SCOPE(objects)
  69. CTSE_LockingSet::CTSE_LockingSet(void)
  70.     : m_LockCount(0)
  71. {
  72. }
  73. CTSE_LockingSet::CTSE_LockingSet(const CTSE_LockingSet& tse_set)
  74.     : m_LockCount(0), m_TSE_set(tse_set.m_TSE_set)
  75. {
  76. }
  77. CTSE_LockingSet::~CTSE_LockingSet(void)
  78. {
  79.     _ASSERT(!x_Locked());
  80. }
  81. DEFINE_CLASS_STATIC_FAST_MUTEX(CTSE_LockingSet::sm_Mutex);
  82. CTSE_LockingSet& CTSE_LockingSet::operator=(const CTSE_LockingSet& tse_set)
  83. {
  84.     CFastMutexGuard guard(sm_Mutex);
  85.     _ASSERT(!x_Locked());
  86.     m_TSE_set = tse_set.m_TSE_set;
  87.     return *this;
  88. }
  89. bool CTSE_LockingSet::insert(CTSE_Info* tse)
  90. {
  91.     CFastMutexGuard guard(sm_Mutex);
  92.     bool ins = m_TSE_set.insert(tse).second;
  93.     if ( ins && x_Locked() ) {
  94.         tse->AddReference();
  95.     }
  96.     return ins;
  97. }
  98. bool CTSE_LockingSet::erase(CTSE_Info* tse)
  99. {
  100.     CFastMutexGuard guard(sm_Mutex);
  101.     if ( m_TSE_set.erase(tse) ) {
  102.         if ( x_Locked() ) {
  103.             tse->RemoveReference();
  104.         }
  105.         return true;
  106.     }
  107.     return false;
  108. }
  109. void CTSE_LockingSet::x_Lock(void)
  110. {
  111.     CFastMutexGuard guard(sm_Mutex);
  112.     if ( m_LockCount++ == 0 ) {
  113.         NON_CONST_ITERATE( TTSESet, it, m_TSE_set ) {
  114.             (*it)->AddReference();
  115.         }
  116.     }
  117.     _ASSERT(m_LockCount > 0);
  118. }
  119. void CTSE_LockingSet::x_Unlock(void)
  120. {
  121.     CFastMutexGuard guard(sm_Mutex);
  122.     _ASSERT(m_LockCount > 0);
  123.     if ( --m_LockCount == 0 ) {
  124.         NON_CONST_ITERATE( TTSESet, it, m_TSE_set ) {
  125.             (*it)->RemoveReference();
  126.         }
  127.     }
  128. }
  129. CDataSource::CDataSource(CDataLoader& loader, CObjectManager& objmgr)
  130.     : m_Loader(&loader),
  131.       m_ObjMgr(&objmgr),
  132.       m_DefaultPriority(99)
  133. {
  134.     m_Loader->SetTargetDataSource(*this);
  135. }
  136. CDataSource::CDataSource(CSeq_entry& entry, CObjectManager& objmgr)
  137.     : m_Loader(0),
  138.       m_pTopEntry(&entry),
  139.       m_ObjMgr(&objmgr),
  140.       m_DefaultPriority(9)
  141. {
  142.     AddTSE(entry, false);
  143. }
  144. CDataSource::~CDataSource(void)
  145. {
  146.     if (m_PrefetchThread) {
  147.         // Wait for the prefetch thread to stop
  148.         m_PrefetchThread->Terminate();
  149.         m_PrefetchThread->Join();
  150.     }
  151.     DropAllTSEs();
  152.     m_Loader.Reset();
  153. }
  154. CConstRef<CTSE_Info> CDataSource::GetTopEntry_Info(void)
  155. {
  156.     CConstRef<CTSE_Info> ret;
  157.     {{
  158.         TMainReadLockGuard guard(m_DSMainLock);    
  159.         ITERATE ( TTSE_Set, it, m_TSE_Set ) {
  160.             if ( (*it)->GetSeq_entryCore() == m_pTopEntry ) {
  161.                 ret = *it;
  162.                 break;
  163.             }
  164.         }
  165.     }}
  166.     return ret;
  167. }
  168. void CDataSource::DropAllTSEs(void)
  169. {
  170.     // Lock indexes
  171.     TMainWriteLockGuard guard(m_DSMainLock);    
  172.     ITERATE ( TTSE_Set, it, m_TSE_Set ) {
  173.         if ( (*it)->Locked() ) {
  174.             ERR_POST("CDataSource::DropAllTSEs: tse is locked");
  175.             NCBI_THROW(CObjMgrException, eOtherError,
  176.                        "CDataSource::DropAllTSEs: tse is locked");
  177.         }
  178.     }
  179.     if ( m_Loader ) {
  180.         NON_CONST_ITERATE ( TTSE_Set, it, m_TSE_Set ) {
  181.             m_Loader->DropTSE(**it);
  182.         }
  183.     }
  184.     //m_Bioseq_InfoMap.clear();
  185.     //m_Seq_annot_InfoMap.clear();
  186.     //m_Seq_entry_InfoMap.clear();
  187.     //m_TSE_InfoMap.clear();
  188.     m_TSE_Set.clear();
  189.     m_pTopEntry.Reset();
  190.     m_TSE_seq.clear();
  191.     {{
  192.         TAnnotWriteLockGuard guard2(m_DSAnnotLock);
  193.         m_TSE_annot.clear();
  194.         m_DirtyAnnot_TSEs.clear();
  195.     }}
  196. }
  197. TTSE_Lock CDataSource::x_FindBestTSE(const CSeq_id_Handle& handle) const
  198. {
  199.     TTSE_LockSet all_tse;
  200.     size_t all_count = 0;
  201.     {{
  202.         TMainReadLockGuard guard(m_DSMainLock);
  203.         TTSEMap::const_iterator tse_set = m_TSE_seq.find(handle);
  204.         if ( tse_set == m_TSE_seq.end() ) {
  205.             return TTSE_Lock();
  206.         }
  207.         ITERATE ( CTSE_LockingSet, it, tse_set->second ) {
  208.             if ( all_tse.insert(TTSE_Lock(*it)).second )
  209.                 ++all_count;
  210.         }
  211.         if ( all_count == 0 ) {
  212.             return TTSE_Lock();
  213.         }
  214.     }}
  215.     if ( all_count == 1 ) {
  216.         // There is only one TSE, no matter live or dead
  217.         return TTSE_Lock(*all_tse.begin());
  218.     }
  219.     // The map should not contain empty entries
  220.     _ASSERT(!all_tse.empty());
  221.     TTSE_LockSet live_tse;
  222.     size_t live_count = 0;
  223.     ITERATE ( TTSE_LockSet, tse, all_tse ) {
  224.         // Find live TSEs
  225.         if ( !(*tse)->IsDead() ) {
  226.             live_tse.insert(*tse);
  227.             ++live_count;
  228.         }
  229.     }
  230.     // Check live
  231.     if ( live_count == 1 ) {
  232.         // There is only one live TSE -- ok to use it
  233.         return *live_tse.begin();
  234.     }
  235.     else if ( live_count == 0 ) {
  236.         if ( m_Loader ) {
  237.             TTSE_Lock best(GetDataLoader()->ResolveConflict(handle, all_tse));
  238.             if ( best ) {
  239.                 return best;
  240.             }
  241.         }
  242.         // No live TSEs -- try to select the best dead TSE
  243.         NCBI_THROW(CObjMgrException, eFindConflict,
  244.                    "Multiple seq-id matches found");
  245.     }
  246.     if ( m_Loader ) {
  247.         // Multiple live TSEs - try to resolve the conflict (the status of some
  248.         // TSEs may change)
  249.         TTSE_Lock best(GetDataLoader()->ResolveConflict(handle, live_tse));
  250.         if ( best ) {
  251.             return best;
  252.         }
  253.     }
  254.     NCBI_THROW(CObjMgrException, eFindConflict,
  255.                "Multiple live entries found");
  256. }
  257. TTSE_Lock CDataSource::GetBlobById(const CSeq_id_Handle& idh)
  258. {
  259.     TMainReadLockGuard guard(m_DSMainLock);
  260.     TTSEMap::iterator tse_set = m_TSE_seq.find(idh);
  261.     if (tse_set == m_TSE_seq.end()) {
  262.         // Request TSE-info from loader if any
  263.         if ( m_Loader ) {
  264.             //
  265.         }
  266.         else {
  267.             // No such blob, no loader to call
  268.             return TTSE_Lock();
  269.         }
  270. //###
  271.     }
  272. //###
  273.     return TTSE_Lock();
  274. }
  275. CConstRef<CBioseq_Info> CDataSource::GetBioseq_Info(const CSeqMatch_Info& info)
  276. {
  277.     CRef<CBioseq_Info> ret;
  278.     // The TSE is locked by the scope, so, it can not be deleted.
  279.     CTSE_Info::TBioseqs::const_iterator found =
  280.         info.GetTSE_Info().m_Bioseqs.find(info.GetIdHandle());
  281.     if ( found != info.GetTSE_Info().m_Bioseqs.end() ) {
  282.         ret = found->second;
  283.     }
  284.     return ret;
  285. }
  286. CRef<CTSE_Info> CDataSource::AddTSE(CSeq_entry& tse,
  287.                                     bool dead,
  288.                                     const CObject* blob_id)
  289. {
  290.     CRef<CTSE_Info> info(new CTSE_Info(tse, dead, blob_id));
  291.     AddTSE(info);
  292.     return info;
  293. }
  294. void CDataSource::AddTSE(CRef<CTSE_Info> info)
  295. {
  296.     TMainWriteLockGuard guard(m_DSMainLock);
  297.     _VERIFY(m_TSE_Set.insert(info).second);
  298.     info->x_DSAttach(*this);
  299. }
  300. bool CDataSource::DropTSE(CTSE_Info& info)
  301. {
  302.     TMainWriteLockGuard guard(m_DSMainLock);
  303.     if ( info.Locked() ) {
  304.         _TRACE("DropTSE: DS="<<this<<" TSE_Info="<<&info<<" - locked");
  305.         return false; // Not really dropped, although found
  306.     }
  307.     CRef<CTSE_Info> info_lock(&info);
  308.     x_DropTSE(info);
  309.     return true;
  310. }
  311. void CDataSource::x_DropTSE(CTSE_Info& info)
  312. {
  313.     if ( m_Loader ) {
  314.         m_Loader->DropTSE(info);
  315.     }
  316.     info.x_DSDetach(*this);
  317.     _VERIFY(m_TSE_Set.erase(Ref(&info)));
  318.     {{
  319.         TAnnotWriteLockGuard guard2(m_DSAnnotLock);
  320.         m_DirtyAnnot_TSEs.erase(&info);
  321.     }}
  322. }
  323. template<class Map, class Ref, class Info>
  324. inline
  325. void x_MapObject(Map& info_map, const Ref& ref, const Info& info)
  326. {
  327.     typedef typename Map::value_type value_type;
  328.     if ( !info_map.insert(value_type(ref, info)).second ) {
  329.         NCBI_THROW(CObjMgrException, eOtherError,
  330.                    "CDataSource::x_Map(): object already mapped");
  331.     }
  332. }
  333. template<class Map, class Ref, class Info>
  334. inline
  335. void x_UnmapObject(Map& info_map, const Ref& ref, const Info& _DEBUG_ARG(info))
  336. {
  337.     typename Map::iterator iter = info_map.lower_bound(ref);
  338.     if ( iter != info_map.end() && iter->first == ref ) {
  339.         _ASSERT(iter->second == info);
  340.         info_map.erase(iter);
  341.     }
  342. }
  343. void CDataSource::x_Map(CConstRef<CSeq_entry> obj, CTSE_Info* info)
  344. {
  345.     x_MapObject(m_TSE_InfoMap, obj, info);
  346. }
  347. void CDataSource::x_Unmap(CConstRef<CSeq_entry> obj, CTSE_Info* info)
  348. {
  349.     x_UnmapObject(m_TSE_InfoMap, obj, info);
  350. }
  351. void CDataSource::x_Map(CConstRef<CSeq_entry> obj, CSeq_entry_Info* info)
  352. {
  353.     x_MapObject(m_Seq_entry_InfoMap, obj, info);
  354. }
  355. void CDataSource::x_Unmap(CConstRef<CSeq_entry> obj, CSeq_entry_Info* info)
  356. {
  357.     x_UnmapObject(m_Seq_entry_InfoMap, obj, info);
  358. }
  359. void CDataSource::x_Map(CConstRef<CSeq_annot> obj, CSeq_annot_Info* info)
  360. {
  361.     x_MapObject(m_Seq_annot_InfoMap, obj, info);
  362. }
  363. void CDataSource::x_Unmap(CConstRef<CSeq_annot> obj, CSeq_annot_Info* info)
  364. {
  365.     x_UnmapObject(m_Seq_annot_InfoMap, obj, info);
  366. }
  367. void CDataSource::x_Map(CConstRef<CBioseq> obj, CBioseq_Info* info)
  368. {
  369.     x_MapObject(m_Bioseq_InfoMap, obj, info);
  370. }
  371. void CDataSource::x_Unmap(CConstRef<CBioseq> obj, CBioseq_Info* info)
  372. {
  373.     x_UnmapObject(m_Bioseq_InfoMap, obj, info);
  374. }
  375. /////////////////////////////////////////////////////////////////////////////
  376. //   mapping of various XXX_Info
  377. // CDataSource must be guarded by mutex
  378. /////////////////////////////////////////////////////////////////////////////
  379. CConstRef<CTSE_Info>
  380. CDataSource::FindTSEInfo(const CSeq_entry& tse)
  381. {
  382.     TMainReadLockGuard guard(m_DSMainLock);
  383.     return x_FindTSE_Info(tse);
  384. }
  385. CConstRef<CSeq_entry_Info>
  386. CDataSource::FindSeq_entry_Info(const CSeq_entry& entry)
  387. {
  388.     TMainReadLockGuard guard(m_DSMainLock);
  389.     return x_FindSeq_entry_Info(entry);
  390. }
  391. CConstRef<CSeq_annot_Info>
  392. CDataSource::FindSeq_annot_Info(const CSeq_annot& annot)
  393. {
  394.     TMainReadLockGuard guard(m_DSMainLock);
  395.     return x_FindSeq_annot_Info(annot);
  396. }
  397. CConstRef<CBioseq_Info>
  398. CDataSource::FindBioseq_Info(const CBioseq& bioseq)
  399. {
  400.     TMainReadLockGuard guard(m_DSMainLock);
  401.     return x_FindBioseq_Info(bioseq);
  402. }
  403. CConstRef<CTSE_Info>
  404. CDataSource::x_FindTSE_Info(const CSeq_entry& obj)
  405. {
  406.     CConstRef<CTSE_Info> ret;
  407.     TTSE_InfoMap::iterator found = m_TSE_InfoMap.find(ConstRef(&obj));
  408.     if ( found != m_TSE_InfoMap.end() ) {
  409.         ret.Reset(found->second);
  410.     }
  411.     return ret;
  412. }
  413. CConstRef<CSeq_entry_Info>
  414. CDataSource::x_FindSeq_entry_Info(const CSeq_entry& obj)
  415. {
  416.     CConstRef<CSeq_entry_Info> ret;
  417.     TSeq_entry_InfoMap::iterator found =
  418.         m_Seq_entry_InfoMap.find(ConstRef(&obj));
  419.     if ( found != m_Seq_entry_InfoMap.end() ) {
  420.         ret.Reset(found->second);
  421.     }
  422.     return ret;
  423. }
  424. CConstRef<CSeq_annot_Info>
  425. CDataSource::x_FindSeq_annot_Info(const CSeq_annot& obj)
  426. {
  427.     CConstRef<CSeq_annot_Info> ret;
  428.     TSeq_annot_InfoMap::iterator found =
  429.         m_Seq_annot_InfoMap.find(ConstRef(&obj));
  430.     if ( found != m_Seq_annot_InfoMap.end() ) {
  431.         ret.Reset(found->second);
  432.     }
  433.     return ret;
  434. }
  435. CConstRef<CBioseq_Info>
  436. CDataSource::x_FindBioseq_Info(const CBioseq& obj)
  437. {
  438.     CConstRef<CBioseq_Info> ret;
  439.     TBioseq_InfoMap::iterator found =
  440.         m_Bioseq_InfoMap.find(ConstRef(&obj));
  441.     if ( found != m_Bioseq_InfoMap.end() ) {
  442.         ret.Reset(found->second);
  443.     }
  444.     return ret;
  445. }
  446. /////////////////////////////////////////////////////////////////////////////
  447. CRef<CSeq_entry_Info> CDataSource::AttachEntry(CBioseq_set_Info& parent,
  448.                                                CSeq_entry& entry,
  449.                                                int index)
  450. {
  451.     if ( m_Loader ) {
  452.         NCBI_THROW(CObjMgrException, eModifyDataError,
  453.                    "Can not remove a loaded entry");
  454.     }
  455.     TMainWriteLockGuard guard(m_DSMainLock);
  456.     return parent.AddEntry(entry, index);
  457. }
  458. void CDataSource::RemoveEntry(CSeq_entry_Info& entry)
  459. {
  460.     if ( m_Loader ) {
  461.         NCBI_THROW(CObjMgrException, eModifyDataError,
  462.                    "Can not remove a loaded entry");
  463.     }
  464.     if ( !entry.HasParent_Info() ) {
  465.         // Top level entry
  466.         NCBI_THROW(CObjMgrException, eModifyDataError,
  467.                    "Can not remove top level seq-entry from a data source");
  468.     }
  469.     TMainWriteLockGuard guard(m_DSMainLock);
  470.     CBioseq_set_Info& parent = entry.GetParentBioseq_set_Info();
  471.     parent.RemoveEntry(Ref(&entry));
  472. }
  473. CRef<CSeq_annot_Info> CDataSource::AttachAnnot(CSeq_entry_Info& entry_info,
  474.                                                const CSeq_annot& annot)
  475. {
  476.     if ( m_Loader ) {
  477.         NCBI_THROW(CObjMgrException, eModifyDataError,
  478.                    "Can not modify a loaded entry");
  479.     }
  480.     TMainWriteLockGuard guard(m_DSMainLock);
  481.     return entry_info.AddAnnot(annot);
  482. }
  483. CRef<CSeq_annot_Info> CDataSource::AttachAnnot(CBioseq_Base_Info& parent,
  484.                                                const CSeq_annot& annot)
  485. {
  486.     if ( m_Loader ) {
  487.         NCBI_THROW(CObjMgrException, eModifyDataError,
  488.                    "Can not modify a loaded entry");
  489.     }
  490.     TMainWriteLockGuard guard(m_DSMainLock);
  491.     return parent.AddAnnot(annot);
  492. }
  493. void CDataSource::RemoveAnnot(CSeq_annot_Info& annot)
  494. {
  495.     if ( m_Loader ) {
  496.         NCBI_THROW(CObjMgrException, eModifyDataError,
  497.                    "Can not modify a loaded entry");
  498.     }
  499.     TMainWriteLockGuard guard(m_DSMainLock);
  500.     CBioseq_Base_Info& parent = annot.GetParentBioseq_Base_Info();
  501.     parent.RemoveAnnot(Ref(&annot));
  502. }
  503. CRef<CSeq_annot_Info> CDataSource::ReplaceAnnot(CSeq_annot_Info& old_annot,
  504.                                                 const CSeq_annot& new_annot)
  505. {
  506.     if ( m_Loader ) {
  507.         NCBI_THROW(CObjMgrException, eModifyDataError,
  508.                    "Can not modify a loaded entry");
  509.     }
  510.     TMainWriteLockGuard guard(m_DSMainLock);
  511.     CBioseq_Base_Info& parent = old_annot.GetParentBioseq_Base_Info();
  512.     parent.RemoveAnnot(Ref(&old_annot));
  513.     return parent.AddAnnot(new_annot);
  514. }
  515. void PrintSeqMap(const string& /*id*/, const CSeqMap& /*smap*/)
  516. {
  517. #if _DEBUG && 0
  518.     _TRACE("CSeqMap("<<id<<"):");
  519.     ITERATE ( CSeqMap, it, smap ) {
  520.         switch ( it.GetType() ) {
  521.         case CSeqMap::eSeqGap:
  522.             _TRACE("    gap: "<<it.GetLength());
  523.             break;
  524.         case CSeqMap::eSeqData:
  525.             _TRACE("    data: "<<it.GetLength());
  526.             break;
  527.         case CSeqMap::eSeqRef:
  528.             _TRACE("    ref: "<<it.GetRefSeqid().AsString()<<' '<<
  529.                    it.GetRefPosition()<<' '<<it.GetLength()<<' '<<
  530.                    it.GetRefMinusStrand());
  531.             break;
  532.         default:
  533.             _TRACE("    bad: "<<it.GetType()<<' '<<it.GetLength());
  534.             break;
  535.         }
  536.     }
  537.     _TRACE("end of CSeqMap "<<id);
  538. #endif
  539. }
  540. void CDataSource::x_SetDirtyAnnotIndex(CTSE_Info& tse)
  541. {
  542.     _ASSERT(tse.x_DirtyAnnotIndex());
  543.     TAnnotWriteLockGuard guard(m_DSAnnotLock);
  544.     _VERIFY(m_DirtyAnnot_TSEs.insert(&tse).second);
  545. }
  546. void CDataSource::x_ResetDirtyAnnotIndex(CTSE_Info& tse)
  547. {
  548.     _ASSERT(!tse.x_DirtyAnnotIndex());
  549.     _VERIFY(m_DirtyAnnot_TSEs.erase(&tse));
  550. }
  551. void CDataSource::UpdateAnnotIndex(void)
  552. {
  553.     TMainWriteLockGuard guard(m_DSMainLock);
  554.     while ( !m_DirtyAnnot_TSEs.empty() ) {
  555.         CTSE_Info* tse_info = *m_DirtyAnnot_TSEs.begin();
  556.         tse_info->UpdateAnnotIndex();
  557.         _ASSERT(m_DirtyAnnot_TSEs.empty() ||
  558.                 *m_DirtyAnnot_TSEs.begin() != tse_info);
  559.     }
  560. }
  561. void CDataSource::UpdateAnnotIndex(const CSeq_entry_Info& entry_info)
  562. {
  563.     TMainWriteLockGuard guard(m_DSMainLock);
  564.     entry_info.UpdateAnnotIndex();
  565. }
  566. void CDataSource::UpdateAnnotIndex(const CSeq_annot_Info& annot_info)
  567. {
  568.     TMainWriteLockGuard guard(m_DSMainLock);
  569.     annot_info.UpdateAnnotIndex();
  570. }
  571. void CDataSource::GetTSESetWithAnnots(const CSeq_id_Handle& idh,
  572.                                       TTSE_LockSet& with_ref)
  573. {
  574.     // load all relevant TSEs
  575.     if ( m_Loader ) {
  576.         m_Loader->GetRecords(idh, CDataLoader::eAnnot);
  577.     }
  578.     UpdateAnnotIndex();
  579.     // collect all relevant TSEs
  580.     TTSEMap::const_iterator rtse_it = m_TSE_annot.find(idh);
  581.     if ( rtse_it != m_TSE_annot.end() ) {
  582.         ITERATE(CTSE_LockingSet::TTSESet, tse, rtse_it->second) {
  583.             if ( (*tse)->ContainsSeqid(idh) ) {
  584.                 // skip TSE containing sequence
  585.                 continue;
  586.             }
  587.             with_ref.insert(TTSE_Lock(*tse));
  588.         }
  589.     }
  590. }
  591. void CDataSource::GetSynonyms(const CSeq_id_Handle& main_idh,
  592.                               set<CSeq_id_Handle>& syns)
  593. {
  594.     //### The TSE returns locked, unlock it
  595.     CSeq_id_Handle idh = main_idh;
  596.     TTSE_Lock tse_info(x_FindBestTSE(main_idh));
  597.     if ( !tse_info ) {
  598.         // Try to find the best matching id (not exactly equal)
  599.         CSeq_id_Mapper& mapper = CSeq_id_Mapper::GetSeq_id_Mapper();
  600.         if ( mapper.HaveMatchingHandles(idh) ) {
  601.             TSeq_id_HandleSet hset;
  602.             mapper.GetMatchingHandles(idh, hset);
  603.             ITERATE(TSeq_id_HandleSet, hit, hset) {
  604.                 if ( *hit == main_idh ) // already checked
  605.                     continue;
  606.                 if ( bool(tse_info)  &&  idh.IsBetter(*hit) ) // worse hit
  607.                     continue;
  608.                 TTSE_Lock tmp_tse(x_FindBestTSE(*hit));
  609.                 if ( tmp_tse ) {
  610.                     tse_info = tmp_tse;
  611.                     idh = *hit;
  612.                 }
  613.             }
  614.         }
  615.     }
  616.     // At this point the tse_info (if not null) should be locked
  617.     if ( tse_info ) {
  618.         CTSE_Info::TBioseqs::const_iterator info =
  619.             tse_info->m_Bioseqs.find(idh);
  620.         if (info == tse_info->m_Bioseqs.end()) {
  621.             // Just copy the existing id
  622.             syns.insert(main_idh);
  623.         }
  624.         else {
  625.             // Create range list for each synonym of a seq_id
  626.             const CBioseq_Info::TId& syn = info->second->GetId();
  627.             ITERATE ( CBioseq_Info::TId, syn_it, syn ) {
  628.                 syns.insert(*syn_it);
  629.             }
  630.         }
  631.     }
  632.     else {
  633.         // Just copy the existing range map
  634.         syns.insert(main_idh);
  635.     }
  636. }
  637. void CDataSource::x_IndexTSE(TTSEMap& tse_map,
  638.                              const CSeq_id_Handle& id,
  639.                              CTSE_Info* tse_info)
  640. {
  641.     TTSEMap::iterator it = tse_map.lower_bound(id);
  642.     if ( it == tse_map.end() || it->first != id ) {
  643.         it = tse_map.insert(it, TTSEMap::value_type(id, CTSE_LockingSet()));
  644.     }
  645.     _ASSERT(it != tse_map.end() && it->first == id);
  646.     it->second.insert(tse_info);
  647. }
  648. void CDataSource::x_UnindexTSE(TTSEMap& tse_map,
  649.                                const CSeq_id_Handle& id,
  650.                                CTSE_Info* tse_info)
  651. {
  652.     TTSEMap::iterator it = tse_map.find(id);
  653.     _ASSERT(it != tse_map.end() && it->first == id);
  654.     it->second.erase(tse_info);
  655.     if ( it->second.empty() ) {
  656.         tse_map.erase(it);
  657.     }
  658. }
  659. void CDataSource::x_IndexSeqTSE(const CSeq_id_Handle& id,
  660.                                 CTSE_Info* tse_info)
  661. {
  662.     // no need to lock as it's locked by callers
  663.     x_IndexTSE(m_TSE_seq, id, tse_info);
  664. }
  665. void CDataSource::x_UnindexSeqTSE(const CSeq_id_Handle& id,
  666.                                   CTSE_Info* tse_info)
  667. {
  668.     // no need to lock as it's locked by callers
  669.     x_UnindexTSE(m_TSE_seq, id, tse_info);
  670. }
  671. void CDataSource::x_IndexAnnotTSE(const CSeq_id_Handle& id,
  672.                                   CTSE_Info* tse_info)
  673. {
  674.     TAnnotWriteLockGuard guard(m_DSAnnotLock);
  675.     x_IndexTSE(m_TSE_annot, id, tse_info);
  676. }
  677. void CDataSource::x_UnindexAnnotTSE(const CSeq_id_Handle& id,
  678.                                     CTSE_Info* tse_info)
  679. {
  680.     TAnnotWriteLockGuard guard(m_DSAnnotLock);
  681.     x_UnindexTSE(m_TSE_annot, id, tse_info);
  682. }
  683. void CDataSource::x_IndexAnnotTSEs(CTSE_Info* tse_info)
  684. {
  685.     TAnnotWriteLockGuard guard(m_DSAnnotLock);
  686.     ITERATE ( CTSE_Info::TSeqIdToNames, it, tse_info->m_SeqIdToNames ) {
  687.         x_IndexTSE(m_TSE_annot, it->first, tse_info);
  688.     }
  689.     if ( tse_info->x_DirtyAnnotIndex() ) {
  690.         _VERIFY(m_DirtyAnnot_TSEs.insert(tse_info).second);
  691.     }
  692. }
  693. void CDataSource::x_UnindexAnnotTSEs(CTSE_Info* tse_info)
  694. {
  695.     TAnnotWriteLockGuard guard(m_DSAnnotLock);
  696.     ITERATE ( CTSE_Info::TSeqIdToNames, it, tse_info->m_SeqIdToNames ) {
  697.         x_UnindexTSE(m_TSE_annot, it->first, tse_info);
  698.     }
  699. }
  700. void CDataSource::x_CleanupUnusedEntries(void)
  701. {
  702.     // Lock indexes
  703.     TMainWriteLockGuard guard(m_DSMainLock);    
  704.     bool broken = true;
  705.     while ( broken ) {
  706.         broken = false;
  707.         NON_CONST_ITERATE( TTSE_Set, it, m_TSE_Set ) {
  708.             if ( !(*it)->Locked() ) {
  709.                 //### Lock the entry and check again
  710.                 x_DropTSE(const_cast<CTSE_Info&>(**it));
  711.                 broken = true;
  712.                 break;
  713.             }
  714.         }
  715.     }
  716. }
  717. void CDataSource::x_UpdateTSEStatus(CTSE_Info& tse, bool dead)
  718. {
  719.     tse.m_Dead = dead;
  720. }
  721. CSeqMatch_Info CDataSource::BestResolve(CSeq_id_Handle idh)
  722. {
  723.     //### Lock all TSEs found, unlock all filtered out in the end.
  724.     CTSE_LockingSetLock lock;
  725.     {{
  726.         TMainWriteLockGuard guard(m_DSMainLock);
  727.         lock.Lock(m_TSE_seq[idh]);
  728.     }}
  729.     if ( m_Loader ) {
  730.         // Send request to the loader
  731.         m_Loader->GetRecords(idh, CDataLoader::eBioseqCore);
  732.     }
  733.     CSeqMatch_Info match;
  734.     TTSE_Lock tse(x_FindBestTSE(idh));
  735.     if ( !tse ) {
  736.         // Try to find the best matching id (not exactly equal)
  737.         CSeq_id_Mapper& mapper = CSeq_id_Mapper::GetSeq_id_Mapper();
  738.         if ( mapper.HaveMatchingHandles(idh) ) {
  739.             TSeq_id_HandleSet hset;
  740.             mapper.GetMatchingHandles(idh, hset);
  741.             ITERATE(TSeq_id_HandleSet, hit, hset) {
  742.                 if ( *hit == idh ) // already checked
  743.                     continue;
  744.                 if ( bool(tse)  &&  idh.IsBetter(*hit) ) // worse hit
  745.                     continue;
  746.                 TTSE_Lock tmp_tse(x_FindBestTSE(*hit));
  747.                 if ( tmp_tse ) {
  748.                     tse = tmp_tse;
  749.                     idh = *hit;
  750.                 }
  751.             }
  752.         }
  753.     }
  754.     if ( tse ) {
  755.         match = CSeqMatch_Info(idh, *tse);
  756.     }
  757.     return match;
  758. }
  759. CSeqMatch_Info CDataSource::HistoryResolve(CSeq_id_Handle idh,
  760.                                            const TTSE_LockSet& history)
  761. {
  762.     CSeqMatch_Info match;
  763.     {{
  764.         TMainReadLockGuard guard(m_DSMainLock);
  765.         TTSEMap::const_iterator tse_set = m_TSE_seq.find(idh);
  766.         if ( tse_set != m_TSE_seq.end() ) {
  767.             ITERATE ( CTSE_LockingSet, it, tse_set->second ) {
  768.                 if ( history.find(TTSE_Lock(*it)) == history.end() ) {
  769.                     continue;
  770.                 }
  771.                 
  772.                 CSeqMatch_Info new_match(idh, **it);
  773.                 _ASSERT(new_match.GetBioseq_Info());
  774.                 if ( !match ) {
  775.                     match = new_match;
  776.                     continue;
  777.                 }
  778.                 CNcbiOstrstream s;
  779.                 s << "CDataSource("<<GetName()<<"): "
  780.                     "multiple history matches: Seq-id="<<idh.AsString()<<
  781.                     ": seq1=["<<match.GetBioseq_Info()->IdString()<<
  782.                     "] seq2=["<<new_match.GetBioseq_Info()->IdString()<<"]";
  783.                 string msg = CNcbiOstrstreamToString(s);
  784.                 NCBI_THROW(CObjMgrException, eFindConflict, msg);
  785.             }
  786.         }
  787.     }}
  788.     return match;
  789. }
  790. CSeqMatch_Info* CDataSource::ResolveConflict(const CSeq_id_Handle& id,
  791.                                              CSeqMatch_Info& info1,
  792.                                              CSeqMatch_Info& info2)
  793. {
  794.     if (&info1.GetDataSource() != this  ||
  795.         &info2.GetDataSource() != this) {
  796.         // Can not compare TSEs from different data sources or
  797.         // without a loader.
  798.         return 0;
  799.     }
  800.     if (!m_Loader) {
  801.         if ( info1.GetIdHandle().IsBetter(info2.GetIdHandle()) ) {
  802.             return &info1;
  803.         }
  804.         if ( info2.GetIdHandle().IsBetter(info1.GetIdHandle()) ) {
  805.             return &info2;
  806.         }
  807.         return 0;
  808.     }
  809.     TTSE_LockSet tse_set;
  810.     tse_set.insert(TTSE_Lock(&info1.GetTSE_Info()));
  811.     tse_set.insert(TTSE_Lock(&info2.GetTSE_Info()));
  812.     CConstRef<CTSE_Info> tse = m_Loader->ResolveConflict(id, tse_set);
  813.     if (tse == &info1.GetTSE_Info()) {
  814.         return &info1;
  815.     }
  816.     if (tse == &info2.GetTSE_Info()) {
  817.         return &info2;
  818.     }
  819.     return 0;
  820. }
  821. string CDataSource::GetName(void) const
  822. {
  823.     if ( m_Loader )
  824.         return m_Loader->GetName();
  825.     else
  826.         return kEmptyStr;
  827. }
  828. void CDataSource::GetBioseqs(const CSeq_entry_Info& entry,
  829.                              TBioseq_InfoSet& bioseqs,
  830.                              CSeq_inst::EMol filter,
  831.                              TBioseqLevelFlag level)
  832. {
  833.     // Find TSE_Info
  834.     x_CollectBioseqs(entry, bioseqs, filter, level);
  835. }
  836. void CDataSource::x_CollectBioseqs(const CSeq_entry_Info& info,
  837.                                    TBioseq_InfoSet& bioseqs,
  838.                                    CSeq_inst::EMol filter,
  839.                                    TBioseqLevelFlag level)
  840. {
  841.     // parts should be changed to all before adding bioseqs to the list
  842.     if ( info.IsSeq() ) {
  843.         const CBioseq_Info& seq = info.GetSeq();
  844.         if ( level != CBioseq_CI_Base::eLevel_Parts &&
  845.              (filter == CSeq_inst::eMol_not_set ||
  846.               seq.GetInst_Mol() == filter) ) {
  847.             bioseqs.push_back(ConstRef(&seq));
  848.         }
  849.     }
  850.     else {
  851.         const CBioseq_set_Info& set = info.GetSet();
  852.         ITERATE( CBioseq_set_Info::TSeq_set, it, set.GetSeq_set() ) {
  853.             const CSeq_entry_Info& sub_info = **it;
  854.             TBioseqLevelFlag local_level = level;
  855.             if ( sub_info.IsSet() &&
  856.                  sub_info.GetSet().GetClass() == CBioseq_set::eClass_parts ) {
  857.                 switch (level) {
  858.                 case CBioseq_CI_Base::eLevel_Mains:
  859.                     // Skip parts
  860.                     continue;
  861.                 case CBioseq_CI_Base::eLevel_Parts:
  862.                     // Allow adding bioseqs from lower levels
  863.                     local_level = CBioseq_CI_Base::eLevel_All;
  864.                     break;
  865.                 default:
  866.                     break;
  867.                 }
  868.             }
  869.             x_CollectBioseqs(sub_info, bioseqs, filter, local_level);
  870.         }
  871.     }
  872. }
  873. void CDataSource::Prefetch(CPrefetchToken_Impl& token)
  874. {
  875. #if !defined(NCBI_NO_THREADS)
  876.     if (!m_PrefetchThread) {
  877.         CFastMutexGuard guard(m_PrefetchLock);
  878.         // Check againi
  879.         if (!m_PrefetchThread) {
  880.             m_PrefetchThread.Reset(new CPrefetchThread(*this));
  881.             m_PrefetchThread->Run();
  882.         }
  883.     }
  884.     _ASSERT(m_PrefetchThread);
  885.     m_PrefetchThread->AddRequest(token);
  886. #endif
  887. }
  888. void CDataSource::DebugDump(CDebugDumpContext /*ddc*/,
  889.                             unsigned int /*depth*/) const
  890. {
  891. }
  892. END_SCOPE(objects)
  893. END_NCBI_SCOPE
  894. /*
  895. * ---------------------------------------------------------------------------
  896. * $Log: data_source.cpp,v $
  897. * Revision 1000.4  2004/06/01 19:23:11  gouriano
  898. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.133
  899. *
  900. * Revision 1.133  2004/05/21 21:42:12  gorelenk
  901. * Added PCH ncbi_pch.hpp
  902. *
  903. * Revision 1.132  2004/04/16 13:31:47  grichenk
  904. * Added data pre-fetching functions.
  905. *
  906. * Revision 1.131  2004/03/31 17:08:07  vasilche
  907. * Implemented ConvertSeqToSet and ConvertSetToSeq.
  908. *
  909. * Revision 1.130  2004/03/24 18:30:29  vasilche
  910. * Fixed edit API.
  911. * Every *_Info object has its own shallow copy of original object.
  912. *
  913. * Revision 1.129  2004/03/16 15:47:27  vasilche
  914. * Added CBioseq_set_Handle and set of EditHandles
  915. *
  916. * Revision 1.128  2004/02/25 19:23:46  shomrat
  917. * Use of entry_info instead of tse_info to allow collection of bioseqs on non-tse entries
  918. *
  919. * Revision 1.127  2004/02/03 19:02:17  vasilche
  920. * Fixed broken 'dirty annot index' state after RemoveEntry().
  921. *
  922. * Revision 1.126  2004/02/02 15:27:20  dicuccio
  923. * +<algorithm> for find
  924. *
  925. * Revision 1.125  2004/02/02 14:46:43  vasilche
  926. * Several performance fixed - do not iterate whole tse set in CDataSource.
  927. *
  928. * Revision 1.124  2003/12/18 16:38:06  grichenk
  929. * Added CScope::RemoveEntry()
  930. *
  931. * Revision 1.123  2003/11/26 17:55:57  vasilche
  932. * Implemented ID2 split in ID1 cache.
  933. * Fixed loading of splitted annotations.
  934. *
  935. * Revision 1.122  2003/10/27 16:47:12  vasilche
  936. * Fixed error:
  937. * src/objmgr/data_source.cpp", line 913: Fatal: Assertion failed: (it != tse_map.end() && it->first == id)
  938. *
  939. * Revision 1.121  2003/10/07 13:43:23  vasilche
  940. * Added proper handling of named Seq-annots.
  941. * Added feature search from named Seq-annots.
  942. * Added configurable adaptive annotation search (default: gene, cds, mrna).
  943. * Fixed selection of blobs for loading from GenBank.
  944. * Added debug checks to CSeq_id_Mapper for easier finding lost CSeq_id_Handles.
  945. * Fixed leaked split chunks annotation stubs.
  946. * Moved some classes definitions in separate *.cpp files.
  947. *
  948. * Revision 1.120  2003/09/30 16:22:02  vasilche
  949. * Updated internal object manager classes to be able to load ID2 data.
  950. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  951. * Scope caches results of requests for data to data loaders.
  952. * Optimized CSeq_id_Handle for gis.
  953. * Optimized bioseq lookup in scope.
  954. * Reduced object allocations in annotation iterators.
  955. * CScope is allowed to be destroyed before other objects using this scope are
  956. * deleted (feature iterators, bioseq handles etc).
  957. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  958. * Added 'adaptive' option to objmgr_demo application.
  959. *
  960. * Revision 1.119  2003/09/05 17:29:40  grichenk
  961. * Structurized Object Manager exceptions
  962. *
  963. * Revision 1.118  2003/09/03 20:00:02  grichenk
  964. * Added sequence filtering by level (mains/parts/all)
  965. *
  966. * Revision 1.117  2003/08/14 20:05:19  vasilche
  967. * Simple SNP features are stored as table internally.
  968. * They are recreated when needed using CFeat_CI.
  969. *
  970. * Revision 1.116  2003/08/04 17:04:31  grichenk
  971. * Added default data-source priority assignment.
  972. * Added support for iterating all annotations from a
  973. * seq-entry or seq-annot.
  974. *
  975. * Revision 1.115  2003/07/17 22:51:31  vasilche
  976. * Fixed unused variables warnings.
  977. *
  978. * Revision 1.114  2003/07/17 20:07:56  vasilche
  979. * Reduced memory usage by feature indexes.
  980. * SNP data is loaded separately through PUBSEQ_OS.
  981. * String compression for SNP data.
  982. *
  983. * Revision 1.113  2003/07/09 17:54:29  dicuccio
  984. * Fixed uninitialized variables in CDataSource and CSeq_annot_Info
  985. *
  986. * Revision 1.112  2003/07/01 18:01:08  vasilche
  987. * Added check for null m_SeqMap pointer.
  988. *
  989. * Revision 1.111  2003/06/24 14:35:01  vasilche
  990. * Fixed compilation in debug mode.
  991. *
  992. * Revision 1.110  2003/06/24 14:25:18  vasilche
  993. * Removed obsolete CTSE_Guard class.
  994. * Used separate mutexes for bioseq and annot maps.
  995. *
  996. * Revision 1.109  2003/06/19 18:23:45  vasilche
  997. * Added several CXxx_ScopeInfo classes for CScope related information.
  998. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  999. * Some fine tuning of locking in CScope.
  1000. *
  1001. * Revision 1.104  2003/05/20 15:44:37  vasilche
  1002. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  1003. * Fixed some warnings on WorkShop.
  1004. * Added workaround for memory leak on WorkShop.
  1005. *
  1006. * Revision 1.103  2003/05/14 18:39:28  grichenk
  1007. * Simplified TSE caching and filtering in CScope, removed
  1008. * some obsolete members and functions.
  1009. *
  1010. * Revision 1.102  2003/05/12 19:18:29  vasilche
  1011. * Fixed locking of object manager classes in multi-threaded application.
  1012. *
  1013. * Revision 1.101  2003/05/06 18:54:09  grichenk
  1014. * Moved TSE filtering from CDataSource to CScope, changed
  1015. * some filtering rules (e.g. priority is now more important
  1016. * than scope history). Added more caches to CScope.
  1017. *
  1018. * Revision 1.100  2003/05/05 20:59:47  vasilche
  1019. * Use one static mutex for all instances of CTSE_LockingSet.
  1020. *
  1021. * Revision 1.99  2003/04/29 19:51:13  vasilche
  1022. * Fixed interaction of Data Loader garbage collector and TSE locking mechanism.
  1023. * Made some typedefs more consistent.
  1024. *
  1025. * Revision 1.98  2003/04/24 16:12:38  vasilche
  1026. * Object manager internal structures are splitted more straightforward.
  1027. * Removed excessive header dependencies.
  1028. *
  1029. * Revision 1.97  2003/04/14 21:32:18  grichenk
  1030. * Avoid passing CScope as an argument to CDataSource methods
  1031. *
  1032. * Revision 1.96  2003/03/24 21:26:45  grichenk
  1033. * Added support for CTSE_CI
  1034. *
  1035. * Revision 1.95  2003/03/21 21:08:53  grichenk
  1036. * Fixed TTSE_Lock initialization
  1037. *
  1038. * Revision 1.93  2003/03/21 19:22:51  grichenk
  1039. * Redesigned TSE locking, replaced CTSE_Lock with CRef<CTSE_Info>.
  1040. *
  1041. * Revision 1.92  2003/03/18 14:52:59  grichenk
  1042. * Removed obsolete methods, replaced seq-id with seq-id handle
  1043. * where possible. Added argument to limit annotations update to
  1044. * a single seq-entry.
  1045. *
  1046. * Revision 1.91  2003/03/12 20:09:34  grichenk
  1047. * Redistributed members between CBioseq_Handle, CBioseq_Info and CTSE_Info
  1048. *
  1049. * Revision 1.90  2003/03/11 15:51:06  kuznets
  1050. * iterate -> ITERATE
  1051. *
  1052. * Revision 1.89  2003/03/11 14:15:52  grichenk
  1053. * +Data-source priority
  1054. *
  1055. * Revision 1.88  2003/03/10 16:55:17  vasilche
  1056. * Cleaned SAnnotSelector structure.
  1057. * Added shortcut when features are limited to one TSE.
  1058. *
  1059. * Revision 1.87  2003/03/05 20:56:43  vasilche
  1060. * SAnnotSelector now holds all parameters of annotation iterators.
  1061. *
  1062. * Revision 1.86  2003/03/03 20:31:08  vasilche
  1063. * Removed obsolete method PopulateTSESet().
  1064. *
  1065. * Revision 1.85  2003/02/27 14:35:31  vasilche
  1066. * Splitted PopulateTSESet() by logically independent parts.
  1067. *
  1068. * Revision 1.84  2003/02/25 20:10:40  grichenk
  1069. * Reverted to single total-range index for annotations
  1070. *
  1071. * Revision 1.83  2003/02/24 18:57:22  vasilche
  1072. * Make feature gathering in one linear pass using CSeqMap iterator.
  1073. * Do not use feture index by sub locations.
  1074. * Sort features at the end of gathering in one vector.
  1075. * Extracted some internal structures and classes in separate header.
  1076. * Delay creation of mapped features.
  1077. *
  1078. * Revision 1.82  2003/02/24 14:51:11  grichenk
  1079. * Minor improvements in annot indexing
  1080. *
  1081. * Revision 1.81  2003/02/13 14:34:34  grichenk
  1082. * Renamed CAnnotObject -> CAnnotObject_Info
  1083. * + CSeq_annot_Info and CAnnotObject_Ref
  1084. * Moved some members of CAnnotObject to CSeq_annot_Info
  1085. * and CAnnotObject_Ref.
  1086. * Added feat/align/graph to CAnnotObject_Info map
  1087. * to CDataSource.
  1088. *
  1089. * Revision 1.80  2003/02/05 17:59:17  dicuccio
  1090. * Moved formerly private headers into include/objects/objmgr/impl
  1091. *
  1092. * Revision 1.79  2003/02/04 22:01:26  grichenk
  1093. * Fixed annotations loading/indexing order
  1094. *
  1095. * Revision 1.78  2003/02/04 21:46:32  grichenk
  1096. * Added map of annotations by intervals (the old one was
  1097. * by total ranges)
  1098. *
  1099. * Revision 1.77  2003/01/29 22:03:46  grichenk
  1100. * Use single static CSeq_id_Mapper instead of per-OM model.
  1101. *
  1102. * Revision 1.76  2003/01/29 17:45:02  vasilche
  1103. * Annotaions index is split by annotation/feature type.
  1104. *
  1105. * Revision 1.75  2003/01/22 20:11:54  vasilche
  1106. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  1107. * CSeqMap_CI now supports resolution and iteration over sequence range.
  1108. * Added several caches to CScope.
  1109. * Optimized CSeqVector().
  1110. * Added serveral variants of CBioseqHandle::GetSeqVector().
  1111. * Tried to optimize annotations iterator (not much success).
  1112. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  1113. *
  1114. * Revision 1.74  2002/12/26 16:39:24  vasilche
  1115. * Object manager class CSeqMap rewritten.
  1116. *
  1117. * Revision 1.73  2002/12/20 20:54:24  grichenk
  1118. * Added optional location/product switch to CFeat_CI
  1119. *
  1120. * Revision 1.72  2002/12/19 20:16:39  grichenk
  1121. * Fixed locations on minus strand
  1122. *
  1123. * Revision 1.71  2002/12/06 15:36:00  grichenk
  1124. * Added overlap type for annot-iterators
  1125. *
  1126. * Revision 1.70  2002/11/08 22:15:51  grichenk
  1127. * Added methods for removing/replacing annotations
  1128. *
  1129. * Revision 1.69  2002/11/08 21:03:30  ucko
  1130. * CConstRef<> now requires an explicit constructor.
  1131. *
  1132. * Revision 1.68  2002/11/04 21:29:12  grichenk
  1133. * Fixed usage of const CRef<> and CRef<> constructor
  1134. *
  1135. * Revision 1.67  2002/10/18 19:12:40  grichenk
  1136. * Removed mutex pools, converted most static mutexes to non-static.
  1137. * Protected CSeqMap::x_Resolve() with mutex. Modified code to prevent
  1138. * dead-locks.
  1139. *
  1140. * Revision 1.66  2002/10/16 20:44:16  ucko
  1141. * MIPSpro: use #pragma instantiate rather than template<>, as the latter
  1142. * ended up giving rld errors for CMutexPool_Base<*>::sm_Pool.  (Sigh.)
  1143. *
  1144. * Revision 1.65  2002/10/02 17:58:23  grichenk
  1145. * Added sequence type filter to CBioseq_CI
  1146. *
  1147. * Revision 1.64  2002/09/30 20:01:19  grichenk
  1148. * Added methods to support CBioseq_CI
  1149. *
  1150. * Revision 1.63  2002/09/16 19:59:36  grichenk
  1151. * Fixed getting reference to a gap on minus strand
  1152. *
  1153. * Revision 1.62  2002/09/10 19:55:49  grichenk
  1154. * Throw exception when unable to create resolved seq-map
  1155. *
  1156. * Revision 1.61  2002/08/09 14:58:50  ucko
  1157. * Restrict template <> to MIPSpro for now, as it also leads to link
  1158. * errors with Compaq's compiler.  (Sigh.)
  1159. *
  1160. * Revision 1.60  2002/08/08 19:51:16  ucko
  1161. * Omit EMPTY_TEMPLATE for GCC and KCC, as it evidently leads to link errors(!)
  1162. *
  1163. * Revision 1.59  2002/08/08 14:28:00  ucko
  1164. * Add EMPTY_TEMPLATE to explicit instantiations.
  1165. *
  1166. * Revision 1.58  2002/08/07 18:22:48  ucko
  1167. * Explicitly instantiate CMutexPool_Base<{CDataSource,TTSESet}>::sm_Pool
  1168. *
  1169. * Revision 1.57  2002/07/25 15:01:51  grichenk
  1170. * Replaced non-const GetXXX() with SetXXX()
  1171. *
  1172. * Revision 1.56  2002/07/08 20:51:01  grichenk
  1173. * Moved log to the end of file
  1174. * Replaced static mutex (in CScope, CDataSource) with the mutex
  1175. * pool. Redesigned CDataSource data locking.
  1176. *
  1177. * Revision 1.55  2002/07/01 15:44:51  grichenk
  1178. * Fixed typos
  1179. *
  1180. * Revision 1.54  2002/07/01 15:40:58  grichenk
  1181. * Fixed 'tse_set' warning.
  1182. * Removed duplicate call to tse_set.begin().
  1183. * Fixed version resolving for annotation iterators.
  1184. * Fixed strstream bug in KCC.
  1185. *
  1186. * Revision 1.53  2002/06/28 17:30:42  grichenk
  1187. * Duplicate seq-id: ERR_POST() -> THROW1_TRACE() with the seq-id
  1188. * list.
  1189. * Fixed x_CleanupUnusedEntries().
  1190. * Fixed a bug with not found sequences.
  1191. * Do not copy bioseq data in GetBioseqCore().
  1192. *
  1193. * Revision 1.52  2002/06/21 15:12:15  grichenk
  1194. * Added resolving seq-id to the best version
  1195. *
  1196. * Revision 1.51  2002/06/12 14:39:53  grichenk
  1197. * Performance improvements
  1198. *
  1199. * Revision 1.50  2002/06/04 17:18:33  kimelman
  1200. * memory cleanup :  new/delete/Cref rearrangements
  1201. *
  1202. * Revision 1.49  2002/05/31 17:53:00  grichenk
  1203. * Optimized for better performance (CTSE_Info uses atomic counter,
  1204. * delayed annotations indexing, no location convertions in
  1205. * CAnnot_Types_CI if no references resolution is required etc.)
  1206. *
  1207. * Revision 1.48  2002/05/29 21:21:13  gouriano
  1208. * added debug dump
  1209. *
  1210. * Revision 1.47  2002/05/28 18:00:43  gouriano
  1211. * DebugDump added
  1212. *
  1213. * Revision 1.46  2002/05/24 14:57:12  grichenk
  1214. * SerialAssign<>() -> CSerialObject::Assign()
  1215. *
  1216. * Revision 1.45  2002/05/21 18:57:25  grichenk
  1217. * Fixed annotations dropping
  1218. *
  1219. * Revision 1.44  2002/05/21 18:40:50  grichenk
  1220. * Fixed annotations droppping
  1221. *
  1222. * Revision 1.43  2002/05/14 20:06:25  grichenk
  1223. * Improved CTSE_Info locking by CDataSource and CDataLoader
  1224. *
  1225. * Revision 1.42  2002/05/13 15:28:27  grichenk
  1226. * Fixed seqmap for virtual sequences
  1227. *
  1228. * Revision 1.41  2002/05/09 14:18:15  grichenk
  1229. * More TSE conflict resolving rules for annotations
  1230. *
  1231. * Revision 1.40  2002/05/06 03:28:46  vakatov
  1232. * OM/OM1 renaming
  1233. *
  1234. * Revision 1.39  2002/05/03 21:28:09  ucko
  1235. * Introduce T(Signed)SeqPos.
  1236. *
  1237. * Revision 1.38  2002/05/02 20:42:37  grichenk
  1238. * throw -> THROW1_TRACE
  1239. *
  1240. * Revision 1.37  2002/04/22 20:05:08  grichenk
  1241. * Fixed minor bug in GetSequence()
  1242. *
  1243. * Revision 1.36  2002/04/19 18:02:47  kimelman
  1244. * add verify to catch coredump
  1245. *
  1246. * Revision 1.35  2002/04/17 21:09:14  grichenk
  1247. * Fixed annotations loading
  1248. * +IsSynonym()
  1249. *
  1250. * Revision 1.34  2002/04/11 18:45:39  ucko
  1251. * Pull in extra headers to make KCC happy.
  1252. *
  1253. * Revision 1.33  2002/04/11 12:08:21  grichenk
  1254. * Fixed GetResolvedSeqMap() implementation
  1255. *
  1256. * Revision 1.32  2002/04/05 21:23:08  grichenk
  1257. * More duplicate id warnings fixed
  1258. *
  1259. * Revision 1.31  2002/04/05 20:27:52  grichenk
  1260. * Fixed duplicate identifier warning
  1261. *
  1262. * Revision 1.30  2002/04/04 21:33:13  grichenk
  1263. * Fixed GetSequence() for sequences with unresolved segments
  1264. *
  1265. * Revision 1.29  2002/04/03 18:06:47  grichenk
  1266. * Fixed segmented sequence bugs (invalid positioning of literals
  1267. * and gaps). Improved CSeqVector performance.
  1268. *
  1269. * Revision 1.27  2002/03/28 14:02:31  grichenk
  1270. * Added scope history checks to CDataSource::x_FindBestTSE()
  1271. *
  1272. * Revision 1.26  2002/03/22 17:24:12  gouriano
  1273. * loader-related fix in DropTSE()
  1274. *
  1275. * Revision 1.25  2002/03/21 21:39:48  grichenk
  1276. * garbage collector bugfix
  1277. *
  1278. * Revision 1.24  2002/03/20 21:24:59  gouriano
  1279. * *** empty log message ***
  1280. *
  1281. * Revision 1.23  2002/03/15 18:10:08  grichenk
  1282. * Removed CRef<CSeq_id> from CSeq_id_Handle, added
  1283. * key to seq-id map th CSeq_id_Mapper
  1284. *
  1285. * Revision 1.22  2002/03/11 21:10:13  grichenk
  1286. * +CDataLoader::ResolveConflict()
  1287. *
  1288. * Revision 1.21  2002/03/07 21:25:33  grichenk
  1289. * +GetSeq_annot() in annotation iterators
  1290. *
  1291. * Revision 1.20  2002/03/06 19:37:19  grichenk
  1292. * Fixed minor bugs and comments
  1293. *
  1294. * Revision 1.19  2002/03/05 18:44:55  grichenk
  1295. * +x_UpdateTSEStatus()
  1296. *
  1297. * Revision 1.18  2002/03/05 16:09:10  grichenk
  1298. * Added x_CleanupUnusedEntries()
  1299. *
  1300. * Revision 1.17  2002/03/04 15:09:27  grichenk
  1301. * Improved MT-safety. Added live/dead flag to CDataSource methods.
  1302. *
  1303. * Revision 1.16  2002/02/28 20:53:31  grichenk
  1304. * Implemented attaching segmented sequence data. Fixed minor bugs.
  1305. *
  1306. * Revision 1.15  2002/02/25 21:05:29  grichenk
  1307. * Removed seq-data references caching. Increased MT-safety. Fixed typos.
  1308. *
  1309. * Revision 1.14  2002/02/21 19:27:05  grichenk
  1310. * Rearranged includes. Added scope history. Added searching for the
  1311. * best seq-id match in data sources and scopes. Updated tests.
  1312. *
  1313. * Revision 1.13  2002/02/20 20:23:27  gouriano
  1314. * corrected FilterSeqid()
  1315. *
  1316. * Revision 1.12  2002/02/15 20:35:38  gouriano
  1317. * changed implementation of HandleRangeMap
  1318. *
  1319. * Revision 1.11  2002/02/12 19:41:42  grichenk
  1320. * Seq-id handles lock/unlock moved to CSeq_id_Handle 'ctors.
  1321. *
  1322. * Revision 1.10  2002/02/07 21:27:35  grichenk
  1323. * Redesigned CDataSource indexing: seq-id handle -> TSE -> seq/annot
  1324. *
  1325. * Revision 1.9  2002/02/06 21:46:11  gouriano
  1326. * *** empty log message ***
  1327. *
  1328. * Revision 1.8  2002/02/05 21:46:28  gouriano
  1329. * added FindSeqid function, minor tuneup in CSeq_id_mapper
  1330. *
  1331. * Revision 1.7  2002/01/30 22:09:28  gouriano
  1332. * changed CSeqMap interface
  1333. *
  1334. * Revision 1.6  2002/01/29 17:45:00  grichenk
  1335. * Added seq-id handles locking
  1336. *
  1337. * Revision 1.5  2002/01/28 19:44:49  gouriano
  1338. * changed the interface of BioseqHandle: two functions moved from Scope
  1339. *
  1340. * Revision 1.4  2002/01/23 21:59:31  grichenk
  1341. * Redesigned seq-id handles and mapper
  1342. *
  1343. * Revision 1.3  2002/01/18 15:56:23  gouriano
  1344. * changed TSeqMaps definition
  1345. *
  1346. * Revision 1.2  2002/01/16 16:25:57  gouriano
  1347. * restructured objmgr
  1348. *
  1349. * Revision 1.1  2002/01/11 19:06:18  gouriano
  1350. * restructured objmgr
  1351. *
  1352. *
  1353. * ===========================================================================
  1354. */