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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr_data.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:47:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_objmgr_data.cpp,v 1000.2 2004/06/01 19:47:10 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. * Authors:  Andrei Gourianov
  35. *
  36. * File Description:
  37. *   Object Manager test: multiple threads working with annotations
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: test_objmgr_data.cpp,v $
  41. * Revision 1000.2  2004/06/01 19:47:10  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  43. *
  44. * Revision 1.5  2004/05/21 21:42:55  gorelenk
  45. * Added PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.4  2004/04/19 14:53:31  grichenk
  48. * Added prefetching test (-prefetch argument)
  49. *
  50. * Revision 1.3  2004/04/16 13:31:47  grichenk
  51. * Added data pre-fetching functions.
  52. *
  53. * Revision 1.2  2004/04/05 17:00:55  grichenk
  54. * Fixed iterator flags
  55. *
  56. * Revision 1.1  2003/12/16 17:51:17  kuznets
  57. * Code reorganization
  58. *
  59. * Revision 1.12  2003/11/26 17:56:03  vasilche
  60. * Implemented ID2 split in ID1 cache.
  61. * Fixed loading of splitted annotations.
  62. *
  63. * Revision 1.11  2003/11/03 21:21:20  vasilche
  64. * Limit amount of exceptions to catch while testing.
  65. *
  66. * Revision 1.10  2003/10/22 17:58:10  vasilche
  67. * Do not catch CLoaderException::eNoConnection.
  68. *
  69. * Revision 1.9  2003/09/30 16:22:05  vasilche
  70. * Updated internal object manager classes to be able to load ID2 data.
  71. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  72. * Scope caches results of requests for data to data loaders.
  73. * Optimized CSeq_id_Handle for gis.
  74. * Optimized bioseq lookup in scope.
  75. * Reduced object allocations in annotation iterators.
  76. * CScope is allowed to be destroyed before other objects using this scope are
  77. * deleted (feature iterators, bioseq handles etc).
  78. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  79. * Added 'adaptive' option to objmgr_demo application.
  80. *
  81. * Revision 1.8  2003/06/02 16:06:39  dicuccio
  82. * Rearranged src/objects/ subtree.  This includes the following shifts:
  83. *     - src/objects/asn2asn --> arc/app/asn2asn
  84. *     - src/objects/testmedline --> src/objects/ncbimime/test
  85. *     - src/objects/objmgr --> src/objmgr
  86. *     - src/objects/util --> src/objmgr/util
  87. *     - src/objects/alnmgr --> src/objtools/alnmgr
  88. *     - src/objects/flat --> src/objtools/flat
  89. *     - src/objects/validator --> src/objtools/validator
  90. *     - src/objects/cddalignview --> src/objtools/cddalignview
  91. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  92. * replaces the three libmmdb? libs.
  93. *
  94. * Revision 1.7  2003/05/20 15:44:39  vasilche
  95. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  96. * Fixed some warnings on WorkShop.
  97. * Added workaround for memory leak on WorkShop.
  98. *
  99. * Revision 1.6  2003/05/06 16:52:55  vasilche
  100. * Added 'pause' argument.
  101. *
  102. * Revision 1.5  2003/04/24 16:12:39  vasilche
  103. * Object manager internal structures are splitted more straightforward.
  104. * Removed excessive header dependencies.
  105. *
  106. * Revision 1.4  2003/04/15 14:23:11  vasilche
  107. * Added missing includes.
  108. *
  109. * Revision 1.3  2003/03/18 21:48:33  grichenk
  110. * Removed obsolete class CAnnot_CI
  111. *
  112. * Revision 1.2  2003/01/29 17:34:18  vasilche
  113. * Added test code for negative strand CSeqVector.
  114. *
  115. * Revision 1.1  2002/12/26 16:39:24  vasilche
  116. * Object manager class CSeqMap rewritten.
  117. *
  118. * Revision 1.4  2002/12/06 15:36:03  grichenk
  119. * Added overlap type for annot-iterators
  120. *
  121. * Revision 1.3  2002/07/22 22:49:05  kimelman
  122. * test fixes for confidential data retrieval
  123. *
  124. * Revision 1.2  2002/05/06 03:28:53  vakatov
  125. * OM/OM1 renaming
  126. *
  127. * Revision 1.1  2002/04/30 19:04:05  gouriano
  128. * multi-threaded data retrieval test
  129. *
  130. *
  131. * ===========================================================================
  132. */
  133. #include <ncbi_pch.hpp>
  134. #include <corelib/ncbiapp.hpp>
  135. #include <corelib/ncbi_system.hpp>
  136. #include <connect/ncbi_util.h>
  137. #include <objects/seqloc/Seq_id.hpp>
  138. #include <objects/seqloc/Seq_loc.hpp>
  139. #include <objmgr/object_manager.hpp>
  140. #include <objmgr/objmgr_exception.hpp>
  141. #include <objmgr/scope.hpp>
  142. #include <objmgr/seq_vector.hpp>
  143. #include <objmgr/seqdesc_ci.hpp>
  144. #include <objmgr/feat_ci.hpp>
  145. #include <objmgr/align_ci.hpp>
  146. #include <objmgr/prefetch.hpp>
  147. #include <objtools/data_loaders/genbank/gbloader.hpp>
  148. #include <connect/ncbi_core_cxx.hpp>
  149. #include <connect/ncbi_util.h>
  150. #include <test/test_assert.h>  /* This header must go last */
  151. BEGIN_NCBI_SCOPE
  152. using namespace objects;
  153. static CFastMutex    s_GlobalLock;
  154. // GIs to process
  155. #if 0
  156.     const int g_gi_from = 156894;
  157.     const int g_gi_to   = 156896;
  158. #elif 0
  159.     const int g_gi_from = 156201;
  160.     const int g_gi_to   = 156203;
  161. #else
  162.     const int g_gi_from = 156000;
  163.     const int g_gi_to   = 157000;
  164. #endif
  165. /////////////////////////////////////////////////////////////////////////////
  166. //
  167. //  Test application
  168. //
  169. class CTestOM : public CNcbiApplication
  170. {
  171. protected:
  172.     virtual int Run(void);
  173.     virtual void Init(void);
  174.     virtual void Exit(void);
  175.     virtual bool Thread_Run(int idx);
  176.     virtual bool TestApp_Args( CArgDescriptions& args);
  177.     virtual bool TestApp_Init(void);
  178.     virtual bool TestApp_Exit(void);
  179.     CRef<CScope> m_Scope;
  180.     CRef<CObjectManager> m_ObjMgr;
  181.     map<int, int> m_mapGiToDesc;
  182.     map<int, int> m_mapGiToFeat0;
  183.     map<int, int> m_mapGiToFeat1;
  184.     int  m_gi_from;
  185.     int  m_gi_to;
  186.     int  m_pause;
  187.     bool m_prefetch;
  188. };
  189. /////////////////////////////////////////////////////////////////////////////
  190. int CTestOM::Run(void)
  191. {
  192.     if ( !Thread_Run(0) )
  193.         return 1;
  194.     else
  195.         return 0;
  196. }
  197. void CTestOM::Init(void)
  198. {
  199.     // Prepare command line descriptions
  200.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  201.     // Let test application add its own arguments
  202.     TestApp_Args(*arg_desc);
  203.     string prog_description =
  204.         "test";
  205.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  206.                               prog_description, false);
  207.     SetupArgDescriptions(arg_desc.release());
  208.     if ( !TestApp_Init() )
  209.         THROW1_TRACE(runtime_error, "Cannot init test application");
  210. }
  211. void CTestOM::Exit(void)
  212. {
  213.     if ( !TestApp_Exit() )
  214.         THROW1_TRACE(runtime_error, "Cannot exit test application");
  215. }
  216. bool CTestOM::Thread_Run(int idx)
  217. {
  218. // initialize scope
  219.     CScope scope(*m_ObjMgr);
  220.     scope.AddDefaults();
  221.     int from, to;
  222.     // make them go in opposite directions
  223.     if (idx % 2 == 0) {
  224.         from = m_gi_from;
  225.         to = m_gi_to;
  226.     } else {
  227.         from = m_gi_to;
  228.         to = m_gi_from;
  229.     }
  230.     int delta = (to > from) ? 1 : -1;
  231.     int pause = m_pause;
  232.     CPrefetchToken token;
  233.     if (m_prefetch) {
  234.         LOG_POST("Using prefetch");
  235.         // Initialize prefetch token;
  236.         CPrefetchToken::TIds ids;
  237.         for ( int i = from, end = to+delta; i != min(from+10, end); i += delta ) {
  238.             ids.push_back(CSeq_id_Handle::GetGiHandle(i));
  239.         }
  240.         token = CPrefetchToken(scope, ids);
  241.     }
  242.     bool ok = true;
  243.     const int kMaxErrorCount = 3;
  244.     int error_count = 0;
  245.     for ( int i = from, end = to+delta; i != end; i += delta ) {
  246.         if ( i != from && pause ) {
  247.             SleepSec(pause);
  248.         }
  249.         try {
  250. // load sequence
  251.             CSeq_id sid;
  252.             sid.SetGi(i);
  253.             CBioseq_Handle handle;
  254.             if (m_prefetch) {
  255.                 if (!token) {
  256.                     LOG_POST("T" << idx << ": gi = " << i
  257.                              << ": INVALID PREFETCH TOKEN");
  258.                     continue;
  259.                 }
  260.                 handle = token.NextBioseqHandle(scope);
  261.                 if ( !token ) {
  262.                     // Start next token
  263.                     CPrefetchToken::TIds ids;
  264.                     for ( int idx = i+1, end = to+delta; idx != min(i+10, end); idx += delta ) {
  265.                         ids.push_back(CSeq_id_Handle::GetGiHandle(idx));
  266.                     }
  267.                     token = CPrefetchToken(scope, ids);
  268.                 }
  269.             }
  270.             else {
  271.                 handle = scope.GetBioseqHandle(sid);
  272.             }
  273.             if (!handle) {
  274.                 LOG_POST("T" << idx << ": gi = " << i << ": INVALID HANDLE");
  275.                 continue;
  276.             }
  277.             int count = 0, count_prev;
  278. // check CSeqMap_CI
  279.             {{
  280.                 /*
  281.                 CSeqMap_CI it =
  282.                     handle.GetSeqMap().BeginResolved(&scope,
  283.                                                      kMax_Int,
  284.                                                      CSeqMap::fFindRef);
  285.                 */
  286.                 CSeqMap_CI it(ConstRef(&handle.GetSeqMap()),
  287.                               &scope,
  288.                               0,
  289.                               kMax_Int,
  290.                               CSeqMap::fFindRef);
  291.                 while ( it ) {
  292.                     _ASSERT(it.GetType() == CSeqMap::eSeqRef);
  293.                     ++it;
  294.                 }
  295.             }}
  296. // check seqvector
  297.             if ( 0 ) {{
  298.                 string buff;
  299.                 CSeqVector sv =
  300.                     handle.GetSeqVector(CBioseq_Handle::eCoding_Iupac, 
  301.                                         CBioseq_Handle::eStrand_Plus);
  302.                 int start = max(0, int(sv.size()-600000));
  303.                 int stop  = sv.size();
  304.                 sv.GetSeqData(start, stop, buff);
  305.                 //cout << "POS: " << buff << endl;
  306.                 sv = handle.GetSeqVector(CBioseq_Handle::eCoding_Iupac, 
  307.                                          CBioseq_Handle::eStrand_Minus);
  308.                 sv.GetSeqData(sv.size()-stop, sv.size()-start, buff);
  309.                 //cout << "NEG: " << buff << endl;
  310.             }}
  311. // enumerate descriptions
  312.             // Seqdesc iterator
  313.             for (CSeqdesc_CI desc_it(handle); desc_it;  ++desc_it) {
  314.                 count++;
  315.             }
  316. // verify result
  317.             {
  318.                 CFastMutexGuard guard(s_GlobalLock);
  319.                 if (m_mapGiToDesc.find(i) != m_mapGiToDesc.end()) {
  320.                     count_prev = m_mapGiToDesc[i];
  321.                     _ASSERT( m_mapGiToDesc[i] == count);
  322.                 } else {
  323.                     m_mapGiToDesc[i] = count;
  324.                 }
  325.             }
  326. // enumerate features
  327.             CSeq_loc loc;
  328.             loc.SetWhole(sid);
  329.             count = 0;
  330.             if ( idx%2 == 0 ) {
  331.                 for (CFeat_CI feat_it(scope, loc,
  332.                                       CSeqFeatData::e_not_set,
  333.                                       SAnnotSelector::eOverlap_Intervals,
  334.                                       SAnnotSelector::eResolve_All);
  335.                      feat_it;  ++feat_it) {
  336.                     count++;
  337.                 }
  338. // verify result
  339.                 {
  340.                     CFastMutexGuard guard(s_GlobalLock);
  341.                     if (m_mapGiToFeat0.find(i) != m_mapGiToFeat0.end()) {
  342.                         count_prev = m_mapGiToFeat0[i];
  343.                         _ASSERT( m_mapGiToFeat0[i] == count);
  344.                     } else {
  345.                         m_mapGiToFeat0[i] = count;
  346.                     }
  347.                 }
  348.             }
  349.             else {
  350.                 for (CFeat_CI feat_it(handle, 0, 0, CSeqFeatData::e_not_set);
  351.                      feat_it;  ++feat_it) {
  352.                     count++;
  353.                 }
  354. // verify result
  355.                 {
  356.                     CFastMutexGuard guard(s_GlobalLock);
  357.                     if (m_mapGiToFeat1.find(i) != m_mapGiToFeat1.end()) {
  358.                         count_prev = m_mapGiToFeat1[i];
  359.                         _ASSERT( m_mapGiToFeat1[i] == count);
  360.                     } else {
  361.                         m_mapGiToFeat1[i] = count;
  362.                     }
  363.                 }
  364.             }
  365.         }
  366.         catch (CLoaderException& e) {
  367.             LOG_POST("T" << idx << ": gi = " << i 
  368.                 << ": EXCEPTION = " << e.what());
  369.             ok = false;
  370.             if ( e.GetErrCode() == CLoaderException::eNoConnection ) {
  371.                 break;
  372.             }
  373.             if ( ++error_count > kMaxErrorCount ) {
  374.                 break;
  375.             }
  376.         }
  377.         catch (exception& e) {
  378.             LOG_POST("T" << idx << ": gi = " << i 
  379.                      << ": EXCEPTION = " << e.what());
  380.             ok = false;
  381.             if ( ++error_count > kMaxErrorCount ) {
  382.                 break;
  383.             }
  384.         }
  385.         scope.ResetHistory();
  386.     }
  387.     if ( ok ) {
  388.         NcbiCout << " Passed" << NcbiEndl << NcbiEndl;
  389.     }
  390.     else {
  391.         NcbiCout << " Failed" << NcbiEndl << NcbiEndl;
  392.     }
  393.     return ok;
  394. }
  395. bool CTestOM::TestApp_Args( CArgDescriptions& args)
  396. {
  397.     args.AddDefaultKey
  398.         ("fromgi", "FromGi",
  399.          "Process sequences in the interval FROM this Gi",
  400.          CArgDescriptions::eInteger, NStr::IntToString(g_gi_from));
  401.     args.AddDefaultKey
  402.         ("togi", "ToGi",
  403.          "Process sequences in the interval TO this Gi",
  404.          CArgDescriptions::eInteger, NStr::IntToString(g_gi_to));
  405.     args.AddDefaultKey
  406.         ("pause", "Pause",
  407.          "Pause between requests in seconds",
  408.          CArgDescriptions::eInteger, "0");
  409.     args.AddFlag("prefetch", "Use prefetching");
  410.     return true;
  411. }
  412. bool CTestOM::TestApp_Init(void)
  413. {
  414.     CORE_SetLOCK(MT_LOCK_cxx2c());
  415.     CORE_SetLOG(LOG_cxx2c());
  416.     const CArgs& args = GetArgs();
  417.     m_gi_from  = args["fromgi"].AsInteger();
  418.     m_gi_to    = args["togi"].AsInteger();
  419.     m_pause    = args["pause"].AsInteger();
  420.     m_prefetch = args["prefetch"];
  421.     NcbiCout << "Testing ObjectManager ("
  422.         << "gi from "
  423.         << m_gi_from << " to " << m_gi_to << ")..." << NcbiEndl;
  424.     m_ObjMgr = new CObjectManager;
  425.     m_ObjMgr->RegisterDataLoader(*new CGBDataLoader("ID"),CObjectManager::eDefault);
  426.     // Scope shared by all threads
  427. /*
  428.     m_Scope = new CScope(*m_ObjMgr);
  429.     m_Scope->AddDefaults();
  430. */
  431.     return true;
  432. }
  433. bool CTestOM::TestApp_Exit(void)
  434. {
  435. /*
  436.     map<int, int>::iterator it;
  437.     for (it = m_mapGiToDesc.begin(); it != m_mapGiToDesc.end(); ++it) {
  438.         LOG_POST(
  439.             "gi = "         << it->first
  440.             << ": desc = "  << it->second
  441.             << ", feat0 = " << m_mapGiToFeat0[it->first]
  442.             << ", feat1 = " << m_mapGiToFeat1[it->first]
  443.             );
  444.     }
  445. */
  446.     return true;
  447. }
  448. END_NCBI_SCOPE
  449. /////////////////////////////////////////////////////////////////////////////
  450. //  MAIN
  451. USING_NCBI_SCOPE;
  452. int main(int argc, const char* argv[])
  453. {
  454.     return CTestOM().AppMain(argc, argv, 0, eDS_Default, 0);
  455. }