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

生物技术

开发平台:

C/C++

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