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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: entrez_db.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:26:30  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: entrez_db.cpp,v 1000.0 2004/06/01 21:26:30 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    CDataPlugin_EntrezSearch - load sequence information form Genbank.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "entrez_db.hpp"
  41. #include <objects/entrez2/Entrez2_id_list.hpp>
  42. #include <objects/entrez2/Entrez2_info.hpp>
  43. #include <objects/entrez2/Entrez2_eval_boolean.hpp>
  44. #include <objects/entrez2/Entrez2_boolean_reply.hpp>
  45. #include <objects/entrez2/Entrez2_boolean_exp.hpp>
  46. #include <objects/entrez2/Entrez2_boolean_element.hpp>
  47. #include <objects/entrez2/Entrez2_docsum.hpp>
  48. #include <objects/entrez2/Entrez2_docsum_list.hpp>
  49. #include <objects/entrez2/Entrez2_docsum_data.hpp>
  50. #include <objects/entrez2/Entrez2_db_id.hpp>
  51. #include <objects/entrez2/Entrez2_limits.hpp>
  52. #include <gui/core/version.hpp>
  53. BEGIN_NCBI_SCOPE
  54. USING_SCOPE(objects);
  55. //
  56. // db=nucleotide or db=protein
  57. //
  58. class CEntrezDB_NucProt : public CEntrezDBHandler
  59. {
  60. public:
  61.     CEntrezDB_NucProt(const string& db, const string& visible_db)
  62.         : m_DB(db),
  63.           m_VisibleDB(visible_db) {}
  64.     string GetDbName() const
  65.     {
  66.         return m_DB;
  67.     }
  68.     string GetVisibleDbName() const
  69.     {
  70.         return m_VisibleDB;
  71.     }
  72.     void GetHeaders(vector<SHeaderInfo>& headers) const
  73.     {
  74.         headers.push_back(SHeaderInfo("ID", 1.0));
  75.         headers.push_back(SHeaderInfo("Description", 4.0));
  76.     }
  77.     void Format(const CEntrez2_docsum& ds,
  78.                 vector<string>& cols) const
  79.     {
  80.         cols.push_back(ds.GetValue("Caption"));
  81.         cols.push_back(ds.GetValue("Title"));
  82.     }
  83.     // retrieve seq-ids for a given set of docsums
  84.     TIds GetSeqIds(const CEntrez2_docsum_list& ds_list,
  85.                    TSeqIdFlags flags = fDefaults)
  86.     {
  87.         TIds ids;
  88.         ITERATE (CEntrez2_docsum_list::TList, iter, ds_list.GetList()) {
  89.             const CEntrez2_docsum& ds = **iter;
  90.             CRef<CSeq_id> id(new CSeq_id());
  91.             id->SetGi(ds.GetUid());
  92.             ids.push_back(id);
  93.         }
  94.         return ids;
  95.     }
  96.     TIds GetSeqIds(const CEntrez2_docsum& ds,
  97.                    TSeqIdFlags flags = fDefaults)
  98.     {
  99.         TIds ids;
  100.         CRef<CSeq_id> id(new CSeq_id());
  101.         id->SetGi(ds.GetUid());
  102.         ids.push_back(id);
  103.         return ids;
  104.     }
  105. private:
  106.     string m_DB;
  107.     string m_VisibleDB;
  108. };
  109. class CEntrezDB_Genome : public CEntrezDBHandler
  110. {
  111. public:
  112.     string GetDbName() const
  113.     {
  114.         return "genome";
  115.     }
  116.     string GetVisibleDbName() const
  117.     {
  118.         return "Genome";
  119.     }
  120.     void GetHeaders(vector<SHeaderInfo>& headers) const
  121.     {
  122.         headers.push_back(SHeaderInfo("ID", 1.0));
  123.         headers.push_back(SHeaderInfo("Description", 4.0));
  124.     }
  125.     void Format(const CEntrez2_docsum& ds,
  126.                 vector<string>& cols) const
  127.     {
  128.         cols.push_back(ds.GetValue("Caption"));
  129.         cols.push_back(ds.GetValue("Title"));
  130.     }
  131.     // retrieve seq-ids for a given set of docsums
  132.     TIds GetSeqIds(const CEntrez2_docsum_list& ds_list,
  133.                    TSeqIdFlags flags = fDefaults)
  134.     {
  135.         TIds ids;
  136.         ITERATE (CEntrez2_docsum_list::TList, iter, ds_list.GetList()) {
  137.             string str = (*iter)->GetValue("Extra");
  138.             CRef<CSeq_id> id(new CSeq_id(str));
  139.             if (id->Which() != CSeq_id::e_not_set) {
  140.                 ids.push_back(id);
  141.             }
  142.         }
  143.         return ids;
  144.     }
  145.     TIds GetSeqIds(const CEntrez2_docsum& ds,
  146.                    TSeqIdFlags flags = fDefaults)
  147.     {
  148.         TIds ids;
  149.         string str = ds.GetValue("Extra");
  150.         CRef<CSeq_id> id(new CSeq_id(str));
  151.         if (id->Which() != CSeq_id::e_not_set) {
  152.             ids.push_back(id);
  153.         }
  154.         return ids;
  155.     }
  156. };
  157. class CEntrezDB_Gene : public CEntrezDBHandler
  158. {
  159. public:
  160.     string GetDbName() const
  161.     {
  162.         return "gene";
  163.     }
  164.     string GetVisibleDbName() const
  165.     {
  166.         return "Entrez Gene";
  167.     }
  168.     void GetHeaders(vector<SHeaderInfo>& headers) const
  169.     {
  170.         headers.push_back(SHeaderInfo("Symbol", 1.0));
  171.         headers.push_back(SHeaderInfo("Description", 3.0));
  172.         headers.push_back(SHeaderInfo("Organism", 3.0));
  173.     }
  174.     void Format(const CEntrez2_docsum& ds,
  175.                 vector<string>& cols) const
  176.     {
  177.         cols.push_back(ds.GetValue("Name"));
  178.         cols.push_back(ds.GetValue("Description"));
  179.         cols.push_back(ds.GetValue("Orgname"));
  180.     }
  181.     // retrieve seq-ids for a given set of docsums
  182.     TIds GetSeqIds(const CEntrez2_docsum_list& ds_list,
  183.                    TSeqIdFlags flags = fDefaults)
  184.     {
  185.         TIds ids;
  186.         return ids;
  187.     }
  188.     TIds GetSeqIds(const CEntrez2_docsum& ds,
  189.                    TSeqIdFlags flags = fDefaults)
  190.     {
  191.         TIds ids;
  192.         return ids;
  193.     }
  194. };
  195. class CEntrezDB_HomoloGene : public CEntrezDBHandler
  196. {
  197. public:
  198.     string GetDbName() const
  199.     {
  200.         return "homologene";
  201.     }
  202.     string GetVisibleDbName() const
  203.     {
  204.         return "HomoloGene";
  205.     }
  206.     void GetHeaders(vector<SHeaderInfo>& headers) const
  207.     {
  208.         headers.push_back(SHeaderInfo("ID", 1.0));
  209.         headers.push_back(SHeaderInfo("Symbol", 3.0));
  210.         headers.push_back(SHeaderInfo("Name", 3.0));
  211.         headers.push_back(SHeaderInfo("Organism", 3.0));
  212.     }
  213.     void Format(const CEntrez2_docsum& ds,
  214.                 vector<string>& cols) const
  215.     {
  216.         cols.push_back(ds.GetValue("GeneID"));
  217.         cols.push_back(ds.GetValue("Symbol"));
  218.         cols.push_back(ds.GetValue("Name"));
  219.         cols.push_back(ds.GetValue("OrgName"));
  220.     }
  221.     // retrieve seq-ids for a given set of docsums
  222.     TIds GetSeqIds(const CEntrez2_docsum_list& ds_list,
  223.                    TSeqIdFlags flags = fDefaults)
  224.     {
  225.         TIds ids;
  226.         return ids;
  227.     }
  228.     TIds GetSeqIds(const CEntrez2_docsum& ds,
  229.                    TSeqIdFlags flags = fDefaults)
  230.     {
  231.         TIds ids;
  232.         return ids;
  233.     }
  234. };
  235. CRef<CEntrez2_docsum_list>
  236. CEntrezDBHandler::Query(const string& terms,
  237.                         size_t& total_uids,
  238.                         size_t start, size_t count)
  239. {
  240.     try {
  241.         CEntrez2Client& client = x_GetClient();
  242.         CEntrez2_eval_boolean req;
  243.         CEntrez2_boolean_exp& exp = req.SetQuery();
  244.         // set the database we're querying
  245.         exp.SetDb().Set(GetDbName());
  246.         // set the query
  247.         CRef<CEntrez2_boolean_element> elem(new CEntrez2_boolean_element());
  248.         elem->SetStr(terms);
  249.         exp.SetExp().push_back(elem);
  250.         // get UIDs first, then get the docsums
  251.         // set some limits - if num > 0, we assume it's correct
  252.         if (start > 0) {
  253.             exp.SetLimits().SetOffset_UIDs(start);
  254.         }
  255.         if (count > 0) {
  256.             exp.SetLimits().SetMax_UIDs(count);
  257.         }
  258.         req.SetReturn_UIDs(true);
  259.         CRef<CEntrez2_boolean_reply> query_res =
  260.             x_GetClient().AskEval_boolean(req);
  261.         if (query_res) {
  262.             total_uids = query_res->GetCount();
  263.             return client.AskGet_docsum(query_res->GetUids());
  264.         }
  265.     }
  266.     catch (...) {
  267.     }
  268.     return CRef<CEntrez2_docsum_list>();
  269. }
  270. CEntrez2Client& CEntrezDBHandler::x_GetClient()
  271. {
  272.     if ( !m_Client ) {
  273.         m_Client.Reset(new CEntrez2Client());
  274.         string tool = "Genome Workbench v.";
  275.         tool += NStr::IntToString(CPluginVersion::eMajor);
  276.         tool += ".";
  277.         tool += NStr::IntToString(CPluginVersion::eMinor);
  278.         m_Client->SetDefaultRequest().SetTool(tool);
  279.     }
  280.     return *m_Client;
  281. }
  282. CEntrezDBManager::CEntrezDBManager()
  283. {
  284.     RegisterHandler(*new CEntrezDB_NucProt("nucleotide", "Nucleotide"));
  285.     RegisterHandler(*new CEntrezDB_NucProt("protein", "Protein"));
  286.     RegisterHandler(*new CEntrezDB_Gene());
  287.     RegisterHandler(*new CEntrezDB_Genome());
  288.     /*RegisterHandler(*new CEntrezDB_HomoloGene());*/
  289. }
  290. void CEntrezDBManager::RegisterHandler(CEntrezDBHandler& handler)
  291. {
  292.     m_Handlers[handler.GetVisibleDbName()] = CRef<CEntrezDBHandler>(&handler);
  293. }
  294. IEntrezDBHandler& CEntrezDBManager::GetHandler(const string& db) const
  295. {
  296.     THandlers::const_iterator iter = m_Handlers.find(db);
  297.     if (iter != m_Handlers.end()) {
  298.         CRef<CEntrezDBHandler> ref = iter->second;
  299.         return *ref;
  300.     }
  301.     throw runtime_error(string("database not found: ") + db);
  302. }
  303. void CEntrezDBManager::GetDatabases(list<SDbEntry>& entries)
  304. {
  305.     ITERATE (THandlers, iter, m_Handlers) {
  306.         SDbEntry entry;
  307.         entry.db_name = iter->second->GetDbName();
  308.         entry.visible_db_name = iter->second->GetVisibleDbName();
  309.         entries.push_back(entry);
  310.     }
  311. }
  312. END_NCBI_SCOPE
  313. /*
  314.  * ===========================================================================
  315.  * $Log: entrez_db.cpp,v $
  316.  * Revision 1000.0  2004/06/01 21:26:30  gouriano
  317.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.1
  318.  *
  319.  * Revision 1.1  2004/05/25 17:15:38  dicuccio
  320.  * Initial revision - moved over from old GenBank search
  321.  *
  322.  * ===========================================================================
  323.  */