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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objmgr_sample.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:31:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: objmgr_sample.cpp,v 1000.2 2004/06/01 18:31:58 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
  35.  *
  36.  * File Description:
  37.  *   Demo of using the C++ Object Manager (OM)
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbiargs.hpp>
  45. #include <connect/ncbi_core_cxx.hpp>
  46. // Objects includes
  47. #include <objects/seq/Bioseq.hpp>
  48. #include <objects/seqloc/Seq_id.hpp>
  49. #include <objects/seqloc/Seq_loc.hpp>
  50. #include <objects/seqloc/Seq_interval.hpp>
  51. #include <objects/seq/Seq_inst.hpp>
  52. // Object Manager includes
  53. #include <objmgr/object_manager.hpp>
  54. #include <objmgr/scope.hpp>
  55. #include <objmgr/seq_vector.hpp>
  56. #include <objmgr/seq_descr_ci.hpp>
  57. #include <objmgr/feat_ci.hpp>
  58. #include <objmgr/align_ci.hpp>
  59. #include <objtools/data_loaders/genbank/gbloader.hpp>
  60. using namespace ncbi;
  61. using namespace objects;
  62. /////////////////////////////////////////////////////////////////////////////
  63. //
  64. //  Demo application
  65. //
  66. class CSampleObjmgrApplication : public CNcbiApplication
  67. {
  68. public:
  69.     virtual void Init(void);
  70.     virtual int  Run (void);
  71. };
  72. void CSampleObjmgrApplication::Init(void)
  73. {
  74.     // Prepare command line descriptions
  75.     //
  76.     // Create
  77.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  78.     // GI to fetch
  79.     arg_desc->AddKey("gi", "SeqEntryID", "GI id of the Seq-Entry to fetch",
  80.                      CArgDescriptions::eInteger);
  81.     arg_desc->SetConstraint
  82.         ("gi", new CArgAllow_Integers(2, 40000000));
  83.     // Program description
  84.     string prog_description = "Example of the C++ Object Manager usagen";
  85.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  86.                               prog_description, false);
  87.     // Pass argument descriptions to the application
  88.     //
  89.     SetupArgDescriptions(arg_desc.release());
  90. }
  91. int CSampleObjmgrApplication::Run(void)
  92. {
  93.     // Setup application registry, error log, and MT-lock for CONNECT library
  94.     CONNECT_Init(&GetConfig());
  95.     // Process command line args:  get GI to load
  96.     const CArgs& args = GetArgs();
  97.     int gi = args["gi"].AsInteger();
  98.     // Create object manager
  99.     // * We use CRef<> here to automatically delete the OM on exit.
  100.     CRef<CObjectManager> object_manager(new CObjectManager);
  101.     // Create GenBank data loader and register it with the OM.
  102.     // * The last argument "eDefault" informs the OM that the loader must
  103.     // * be included in scopes during the CScope::AddDefaults() call.
  104.     object_manager->RegisterDataLoader(*new CGBDataLoader("ID", 0, 2),
  105.                                        CObjectManager::eDefault);
  106.     // Create a new scope ("attached" to our OM).
  107.     CScope scope(*object_manager);
  108.     // Add default loaders (GB loader in this demo) to the scope.
  109.     scope.AddDefaults();
  110.     // Create Seq-id, set it to the GI specified on the command line
  111.     CSeq_id seq_id;
  112.     seq_id.SetGi(gi);
  113.     // Get Bioseq handle for the Seq-id.
  114.     // * Most of requests will use this handle.
  115.     CBioseq_Handle bioseq_handle = scope.GetBioseqHandle(seq_id);
  116.     // Terminate the program if the GI cannot be resolved to a Bioseq.
  117.     if ( !bioseq_handle ) {
  118.         ERR_POST(Fatal << "Bioseq not found, with GI=" << gi);
  119.     }
  120.     // Get the Bioseq object.
  121.     CConstRef<CBioseq> bioseq(&bioseq_handle.GetBioseq());
  122.     // Printout each Seq-id from the Bioseq.
  123.     cout << "ID: ";
  124.     // "iterate" is the same as:
  125.     // for (CBioseq::TId::const_iterator id_it = bioseq->GetId().begin();
  126.     //      id_it != bioseq->GetId().end(); ++id_it)
  127.     ITERATE (CBioseq::TId, id_it, bioseq->GetId()) {
  128.         if (id_it != bioseq->GetId().begin())
  129.             cout << " + "; // print id separator
  130.         cout << (*id_it)->DumpAsFasta();
  131.     }
  132.     cout << endl;
  133.     // Get the sequence using CSeqVector.
  134.     // Use default encoding:  CSeq_data::e_Iupacna or CSeq_data::e_Iupacaa.
  135.     CSeqVector seq_vect = bioseq_handle.GetSeqVector();
  136.     // Printout the length and the first 10 symbols of the sequence.
  137.     cout << "Sequence:  length=" << seq_vect.size();
  138.     cout << ",  data=";
  139.     string str;
  140.     for (TSeqPos i = 0;  i < seq_vect.size()  &&  i < 10;  i++) {
  141.         str += seq_vect[i];
  142.     }
  143.     cout << NStr::PrintableString(str) << endl;
  144.     // Use CSeq_descr iterator.
  145.     // Iterate through all descriptors -- starting from the Bioseq, go
  146.     // all the way up the Seq-entries tree, to the top-level Seq-entry (TSE).
  147.     unsigned desc_count = 0;
  148.     for (CSeq_descr_CI desc_it(bioseq_handle);
  149.          desc_it;  ++desc_it) {
  150.         desc_count++;
  151.     }
  152.     cout << "# of descriptions:  " << desc_count << endl;
  153.     // Use CSeq_feat iterator.
  154.     // Iterate through all features which can be found for the given Bioseq
  155.     // in the current scope, including features from all TSEs.
  156.     // Construct Seq-loc to get features for.
  157.     CSeq_loc seq_loc;
  158.     cout << "# of features:" << endl;
  159.     // No region restrictions -- use the whole Bioseq
  160.     seq_loc.SetWhole().SetGi(gi);
  161.     unsigned feat_count = 0;
  162.     // Create CFeat_CI using the current scope and location.
  163.     // The 3rd arg value specifies that no feature type restriction is applied.
  164.     for (CFeat_CI feat_it(scope, seq_loc, CSeqFeatData::e_not_set);
  165.          feat_it;  ++feat_it) {
  166.         feat_count++;
  167.         // Get Seq-annot containing the feature
  168.         CConstRef<CSeq_annot> annot(&feat_it.GetSeq_annot());
  169.     }
  170.     cout << "   [whole]           Any:    " << feat_count << endl;
  171.     // The same region (whole sequence), but restricted feature type:
  172.     // searching for e_Gene features only.
  173.     unsigned gene_count = 0;
  174.     for (CFeat_CI feat_it(scope, seq_loc, CSeqFeatData::e_Gene);
  175.          feat_it;  ++feat_it) {
  176.         gene_count++;
  177.     }
  178.     cout << "   [whole]           Genes:  " << gene_count << endl;
  179.     // Region set to interval 0..9 on the Bioseq.
  180.     // Any feature intersecting with the region should be selected.
  181.     seq_loc.SetInt().SetId().SetGi(gi);
  182.     seq_loc.SetInt().SetFrom(0);
  183.     seq_loc.SetInt().SetTo(9);
  184.     unsigned ranged_feat_count = 0;
  185.     // No feature type restrictions applied.
  186.     for (CFeat_CI feat_it(scope, seq_loc, CSeqFeatData::e_not_set);
  187.          feat_it;  ++feat_it) {
  188.         ranged_feat_count++;
  189.     }
  190.     cout << "   [0..9]            Any:    " << ranged_feat_count << endl;
  191.     // Search features only in the TSE containing the target Bioseq.
  192.     // Since only one Seq-id can be used as the target Bioseq, the iterator
  193.     // is constructed not from a Seq-loc, but from a Bioseq handle and the
  194.     // start/stop points on the Bioseq. If both start and stop are 0, then the
  195.     // whole Bioseq is used. The last parameter may be used for type filtering.
  196.     unsigned ranged_tse_feat_count = 0;
  197.     for (CFeat_CI feat_it(bioseq_handle, 0, 999, CSeqFeatData::e_not_set);
  198.          feat_it;  ++feat_it) {
  199.         ranged_tse_feat_count++;
  200.     }
  201.     cout << "   [0..9, TSE-only]  Any:    " << ranged_tse_feat_count << endl;
  202.     // The same method can be used to iterate through alignments and graphs,
  203.     // except that there is no type filtering for these two.
  204.     cout << "# of alignments:" << endl;
  205.     seq_loc.SetWhole().SetGi(gi);
  206.     unsigned align_count = 0;
  207.     for (CAlign_CI align_it(scope, seq_loc);  align_it;  ++align_it) {
  208.         align_count++;
  209.     }
  210.     cout << "   [whole]           Any:    " << align_count << endl;
  211.     // Done
  212.     cout << "Done" << endl;
  213.     return 0;
  214. }
  215. /////////////////////////////////////////////////////////////////////////////
  216. //  MAIN
  217. int main(int argc, const char* argv[])
  218. {
  219.     return CSampleObjmgrApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  220. }
  221. /*
  222.  * ===========================================================================
  223.  *
  224.  * $Log: objmgr_sample.cpp,v $
  225.  * Revision 1000.2  2004/06/01 18:31:58  gouriano
  226.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  227.  *
  228.  * Revision 1.15  2004/05/21 21:41:42  gorelenk
  229.  * Added PCH ncbi_pch.hpp
  230.  *
  231.  * Revision 1.14  2004/02/09 19:18:51  grichenk
  232.  * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  233.  * and CSeqdesc_CI to avoid using data directly.
  234.  *
  235.  * Revision 1.13  2004/01/07 17:38:03  vasilche
  236.  * Fixed include path to genbank loader.
  237.  *
  238.  * Revision 1.12  2003/06/02 16:06:17  dicuccio
  239.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  240.  *     - src/objects/asn2asn --> arc/app/asn2asn
  241.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  242.  *     - src/objects/objmgr --> src/objmgr
  243.  *     - src/objects/util --> src/objmgr/util
  244.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  245.  *     - src/objects/flat --> src/objtools/flat
  246.  *     - src/objects/validator --> src/objtools/validator
  247.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  248.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  249.  * replaces the three libmmdb? libs.
  250.  *
  251.  * Revision 1.11  2003/04/24 16:17:10  vasilche
  252.  * Added '-repeat' option.
  253.  * Updated includes.
  254.  *
  255.  * Revision 1.10  2003/04/15 14:25:06  vasilche
  256.  * Added missing includes.
  257.  *
  258.  * Revision 1.9  2003/03/10 18:48:48  kuznets
  259.  * iterate->ITERATE
  260.  *
  261.  * Revision 1.8  2002/11/08 19:43:34  grichenk
  262.  * CConstRef<> constructor made explicit
  263.  *
  264.  * Revision 1.7  2002/11/04 21:29:01  grichenk
  265.  * Fixed usage of const CRef<> and CRef<> constructor
  266.  *
  267.  * Revision 1.6  2002/08/30 18:10:20  ucko
  268.  * Let CGBDataLoader pick a driver automatically rather than forcing it
  269.  * to use ID1.
  270.  *
  271.  * Revision 1.5  2002/06/12 18:35:16  ucko
  272.  * Take advantage of new CONNECT_Init() function.
  273.  *
  274.  * Revision 1.4  2002/05/31 13:51:31  grichenk
  275.  * Added comment about iterate()
  276.  *
  277.  * Revision 1.3  2002/05/22 14:29:25  grichenk
  278.  * +registry and logs setup; +iterating over CRef<> container
  279.  *
  280.  * Revision 1.2  2002/05/10 16:57:10  kimelman
  281.  * upper gi bound increased twice
  282.  *
  283.  * Revision 1.1  2002/05/08 14:33:53  ucko
  284.  * Added sample object manager application from stock objmgr_lab code.
  285.  *
  286.  *
  287.  * ---------------------------------------------------------------------------
  288.  * Log for previous incarnation (c++/src/internal/objmgr_lab/sample/demo.cpp):
  289.  *
  290.  * Revision 1.5  2002/05/06 03:46:18  vakatov
  291.  * OM/OM1 renaming
  292.  *
  293.  * Revision 1.4  2002/04/16 15:48:37  gouriano
  294.  * correct gi limits
  295.  *
  296.  * Revision 1.3  2002/04/11 16:33:48  vakatov
  297.  * Get rid of the extraneous USING_NCBI_SCOPE
  298.  *
  299.  * Revision 1.2  2002/04/11 02:32:20  vakatov
  300.  * Prepare for public demo:  revamp names and comments, change output format
  301.  *
  302.  * Revision 1.1  2002/04/09 19:40:16  gouriano
  303.  * ObjMgr sample project
  304.  *
  305.  * ===========================================================================
  306.  */