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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blastcli.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:31:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* ===========================================================================
  10.  *
  11.  *                            PUBLIC DOMAIN NOTICE
  12.  *               National Center for Biotechnology Information
  13.  *
  14.  *  This software/database is a "United States Government Work" under the
  15.  *  terms of the United States Copyright Act.  It was written as part of
  16.  *  the author's official duties as a United States Government employee and
  17.  *  thus cannot be copyrighted.  This software/database is freely available
  18.  *  to the public for use. The National Library of Medicine and the U.S.
  19.  *  Government have not placed any restriction on its use or reproduction.
  20.  *
  21.  *  Although all reasonable efforts have been taken to ensure the accuracy
  22.  *  and reliability of the software and data, the NLM and the U.S.
  23.  *  Government do not and cannot warrant the performance or results that
  24.  *  may be obtained by using this software or data. The NLM and the U.S.
  25.  *  Government disclaim all warranties, express or implied, including
  26.  *  warranties of performance, merchantability or fitness for any particular
  27.  *  purpose.
  28.  *
  29.  *  Please cite the author in any work or product based on this material.
  30.  *
  31.  * ===========================================================================
  32.  *
  33.  *  Author: Tim Boemker
  34.  *
  35.  *  Demonstration of ASN interface to BLAST.
  36.  *
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <corelib/ncbiapp.hpp>
  40. #include <corelib/ncbienv.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbi_system.hpp>
  44. #include <serial/serial.hpp>
  45. #include <serial/objistr.hpp>
  46. #include <serial/objostr.hpp>
  47. #include <objects/blast/blast__.hpp>
  48. #include <objects/scoremat/scoremat__.hpp>
  49. #include <objects/blast/blastclient.hpp>
  50. #include <objects/general/general__.hpp>
  51. #include <objects/seqloc/seqloc__.hpp>
  52. #include <objects/seqset/seqset__.hpp>
  53. #include <objects/seq/seq__.hpp>
  54. #include <objects/seqloc/seqloc__.hpp>
  55. #include <objmgr/object_manager.hpp>
  56. #include <objmgr/scope.hpp>
  57. #include <objmgr/gbloader.hpp>
  58. #include <objmgr/bioseq_handle.hpp>
  59. using namespace ncbi;
  60. using namespace objects;
  61. //  ==========================================================================
  62. //
  63. //  write prints requests and replies.
  64. //
  65. //  ==========================================================================
  66. template<class T>
  67. void write(ostream& os, CRef<T> t)
  68. {
  69.     auto_ptr<CObjectOStream> x(
  70.         CObjectOStream::Open(eSerial_AsnText, os));
  71.     *x << *t;
  72. }
  73. template<class T>
  74. void write(ostream& os, const list<CRef<T> >& t)
  75. {
  76.     auto_ptr<CObjectOStream> x(
  77.         CObjectOStream::Open(eSerial_AsnText, os));
  78.     for(list<CRef<T> >::const_iterator i = t.begin(); i != t.end(); ++i)
  79.         *x << **i;
  80. }
  81. //  ==========================================================================
  82. //
  83. //  submit a request & return the reply
  84. //
  85. //  ==========================================================================
  86. static CRef<CBlast4_reply>
  87. submit(CRef<CBlast4_request_body> body, bool echo = true)
  88. {
  89.     // create a request and, if echoing is enabled, print it to stdout
  90.     // to show what a request object looks like.
  91.     CRef<CBlast4_request> request(new CBlast4_request);
  92.     request->SetBody(*body);
  93.     if(echo)
  94.         write(cout, request);
  95.     // submit the request to the server & get the reply.  if echoing is
  96.     // enabled, print the reply to stdout to show what a reply object
  97.     // looks like.
  98.     CRef<CBlast4_reply> reply(new CBlast4_reply);
  99.     CBlast4Client().Ask(*request, *reply);
  100.     if(echo)
  101.         write(cout, reply);
  102.     return reply;
  103. }
  104. //  ==========================================================================
  105. //
  106. //  sample "get-databases" command
  107. //
  108. //  ==========================================================================
  109. static void
  110. get_databases()
  111. {
  112.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  113.     body->SetGet_databases();
  114.     submit(body);
  115. }
  116. //  ==========================================================================
  117. //
  118. //  sample "get-matrices" command
  119. //
  120. //  ==========================================================================
  121. static void
  122. get_matrices()
  123. {
  124.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  125.     body->SetGet_matrices();
  126.     submit(body);
  127. }
  128. //  ==========================================================================
  129. //
  130. //  sample "get-parameters" command
  131. //
  132. //  ==========================================================================
  133. static void
  134. get_parameters()
  135. {
  136.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  137.     body->SetGet_parameters();
  138.     submit(body);
  139. }
  140. //  ==========================================================================
  141. //
  142. //  sample "get-paramsets" command
  143. //
  144. //  ==========================================================================
  145. static void
  146. get_paramsets()
  147. {
  148.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  149.     body->SetGet_paramsets();
  150.     submit(body);
  151. }
  152. //  ==========================================================================
  153. //
  154. //  sample "get-programs" command
  155. //
  156. //  ==========================================================================
  157. static void
  158. get_programs()
  159. {
  160.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  161.     body->SetGet_programs();
  162.     submit(body);
  163. }
  164. //  ==========================================================================
  165. //
  166. //  sample "get-search-results" command
  167. //
  168. //  ==========================================================================
  169. static CRef<CBlast4_reply>
  170. get_search_results(string id, bool echo = true)
  171. {
  172.     CRef<CBlast4_get_search_results_request> gsr(
  173.         new CBlast4_get_search_results_request);
  174.     gsr->SetRequest_id(id);
  175.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  176.     body->SetGet_search_results(*gsr);
  177.     return submit(body, echo);
  178. }
  179. //  ==========================================================================
  180. //
  181. //  sample "get-sequences" command
  182. //
  183. //  ==========================================================================
  184. static void
  185. get_sequences()
  186. {
  187.     CRef<CSeq_id> id(new CSeq_id);
  188.     id->SetGi(3091);
  189.     CRef<CBlast4_database> db(new CBlast4_database);
  190.     db->SetName("nr");
  191.     db->SetType(eBlast4_residue_type_protein);
  192.     CRef<CBlast4_get_sequences_request> gsr(new CBlast4_get_sequences_request);
  193.     gsr->SetDatabase(*db);
  194.     gsr->SetSeq_ids().push_back(id);
  195.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  196.     body->SetGet_sequences(*gsr);
  197.     submit(CRef<CBlast4_request_body>(body));
  198. }
  199. //  ==========================================================================
  200. //
  201. //  sample "finish-params" and "queue-search" commands
  202. //
  203. //  ==========================================================================
  204. static void
  205. setp(list<CRef<CBlast4_parameter> >& l, string n, int x)
  206. {
  207.     CRef<CBlast4_value> v(new CBlast4_value);
  208.     v->SetInteger(x);
  209.     CRef<CBlast4_parameter> p(new CBlast4_parameter);
  210.     p->SetName(n);
  211.     p->SetValue(*v);
  212.     l.push_back(p);
  213. }
  214. static void
  215. setp(list<CRef<CBlast4_parameter> >& l, string n, string x)
  216. {
  217.     CRef<CBlast4_value> v(new CBlast4_value);
  218.     v->SetString(x);
  219.     CRef<CBlast4_parameter> p(new CBlast4_parameter);
  220.     p->SetName(n);
  221.     p->SetValue(*v);
  222.     l.push_back(p);
  223. }
  224. static void
  225. setp(list<CRef<CBlast4_parameter> >& l, string n, const char* x)
  226. {
  227.     setp(l, n, string(x));
  228. }
  229. static void
  230. setp(list<CRef<CBlast4_parameter> >& l, string n,
  231.     CRef<CBlast4_cutoff> x)
  232. {
  233.     CRef<CBlast4_value> v(new CBlast4_value);
  234.     v->SetCutoff(*x);
  235.     CRef<CBlast4_parameter> p(new CBlast4_parameter);
  236.     p->SetName(n);
  237.     p->SetValue(*v);
  238.     l.push_back(p);
  239. }
  240. static void
  241. setp(list<CRef<CBlast4_parameter> >& l, string n,
  242.      CRef<CScore_matrix_parameters> x)
  243. {
  244.     CRef<CBlast4_value> v(new CBlast4_value);
  245.     v->SetMatrix(*x);
  246.     CRef<CBlast4_parameter> p(new CBlast4_parameter);
  247.     p->SetName(n);
  248.     p->SetValue(*v);
  249.     l.push_back(p);
  250. }
  251. static void
  252. finish_params()
  253. {
  254.     CRef<CBlast4_finish_params_request> q(new CBlast4_finish_params_request);
  255.     q->SetProgram("blastn");
  256.     q->SetService("plain");
  257.     CRef<CBlast4_cutoff> cutoff(new CBlast4_cutoff);
  258.     cutoff->SetE_value(10);
  259.     
  260.     CRef<CScore_matrix_parameters> smp(new CScore_matrix_parameters);
  261.     CRef<CScore_matrix> matrix(new CScore_matrix);
  262.     matrix->SetIs_protein(false);
  263.     
  264.     CRef<CObject_id> objid(new CObject_id);
  265.     objid->SetId(42);
  266.     
  267.     matrix->SetIdentifier(*objid);
  268.     matrix->SetComments().push_back("This is unknown DNA");
  269.     matrix->SetComments().push_back("Das is nicht fur das dumkoffen.");
  270.     matrix->SetNrows(10);
  271.     matrix->SetNcolumns(20);
  272.     matrix->SetRow_labels().push_back("To err is etc.");
  273.     matrix->SetRow_labels().push_back("Row label");
  274.     
  275.     int i = 1;
  276.     matrix->SetScores().push_back(i += 17);
  277.     matrix->SetScores().push_back(i += 17);
  278.     matrix->SetScores().push_back(i += 17);
  279.     matrix->SetScores().push_back(i += 17);
  280.     matrix->SetScores().push_back(i += 17);
  281.     
  282.     matrix->SetPosFreqs().push_back(1200);
  283.     matrix->SetPosFreqs().push_back(1300);
  284.     matrix->SetPosFreqs().push_back(1400);
  285.     matrix->SetPosFreqs().push_back(1500);
  286.     
  287.     smp->SetMatrix(*matrix);
  288.     
  289.     list<CRef<CBlast4_parameter> > & l = q->SetParams();
  290.     
  291.     setp(l, "matrix", smp);
  292.     
  293.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  294.     body->SetFinish_params(*q);
  295.     submit(body);
  296. }
  297. static CRef<CBioseq>
  298. get_seq(int gi)
  299. {
  300.     CObjectManager objmgr;
  301.     CScope scope(objmgr);
  302.     objmgr.RegisterDataLoader(*new CGBDataLoader, CObjectManager::eDefault);
  303.     scope.AddDefaults();
  304.     CRef<CSeq_id> id(new CSeq_id);
  305.     id->SetGi(gi);
  306.     CBioseq* s =
  307.         const_cast<CBioseq*>(&scope.GetBioseqHandle(*id).GetBioseq());
  308.     return CRef<CBioseq>(s);
  309. }
  310. static string
  311. queue_search()
  312. {
  313.     CRef<CBioseq> seq(get_seq(3091));
  314.     CRef<CSeq_entry> seqentry(new CSeq_entry);
  315.     seqentry->SetSeq(*seq);
  316.     CRef<CBioseq_set> seqset(new CBioseq_set);
  317.     seqset->SetSeq_set().push_back(seqentry);
  318.     CRef<CBlast4_subject> subject(new CBlast4_subject);
  319.     subject->SetDatabase("nr");
  320.     CRef<CBlast4_queue_search_request> q(new CBlast4_queue_search_request);
  321.     q->SetProgram("blastp");
  322.     q->SetService("plain");
  323.     q->SetQueries(*seqset);
  324.     q->SetSubject(*subject);
  325.     CRef<CBlast4_cutoff> cutoff(new CBlast4_cutoff);
  326.     cutoff->SetE_value(2e4);
  327.     list<CRef<CBlast4_parameter> >& l = q->SetParams();
  328.     setp(l, "cutoff", cutoff);
  329.     setp(l, "filter", "L;");
  330.     setp(l, "gap-open", 9);
  331.     setp(l, "gap-extend", 1);
  332.     setp(l, "word-size", 2);
  333.     setp(l, "matrix", "PAM30");
  334.     CRef<CBlast4_request_body> body(new CBlast4_request_body);
  335.     body->SetQueue_search(*q);
  336.     CRef<CBlast4_reply> reply = submit(body);
  337.     return reply->GetBody().GetQueue_search().GetRequest_id();
  338. }
  339. static bool
  340. search_pending(CRef<CBlast4_reply> reply)
  341. {
  342.     const list<CRef<CBlast4_error> >& errors = reply->GetErrors();
  343.     for(list<CRef<CBlast4_error> >::const_iterator i = errors.begin();
  344.             i != errors.end(); ++i)
  345.         if((*i)->GetCode() == eBlast4_error_code_search_pending)
  346.             return true;
  347.     return false;
  348. }
  349. static void
  350. queue_search_and_poll_for_results()
  351. {
  352.     string request_id = queue_search();
  353.     // the request is virtually certain not to be ready yet; we check
  354.     // now because we want to show the reply that indicates that the
  355.     // search is still pending.
  356.     get_search_results(request_id, true);
  357.     // NCBI requests that clients wait 30 seconds before the first check
  358.     // and between subsequent checks.
  359.     bool ready = false;
  360.     while(!ready) {
  361.         SleepSec(30);
  362.         ready = !search_pending(get_search_results(request_id, false));
  363.     }
  364.     // since the initial get_search_results is virtually certain not
  365.     // to have succeeded, and since the subsequent get_search_results
  366.     // calls had echoing suppressed, we can be pretty sure that we
  367.     // have not echoed the search results.  make the call once more
  368.     // just for the echo.  (a real client would not do this.)
  369.     get_search_results(request_id, true);
  370. }
  371. //  ==========================================================================
  372. //
  373. //  CBlastcliApplication
  374. //
  375. //  ==========================================================================
  376. class CBlastcliApplication : public CNcbiApplication {
  377. private:
  378.     virtual void Init(void);
  379.     virtual int  Run(void);
  380.     virtual void Exit(void);
  381.     string usage;
  382. };
  383. void
  384. CBlastcliApplication::Init(void)
  385. {
  386.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  387.     arg_desc->SetUsageContext(
  388.         GetArguments().GetProgramBasename(),
  389.         "ASN.1 interface to BLAST 1.0 demonstration client");
  390.     arg_desc->AddExtra(1, 1,
  391.         "get-databases | get-matrices | get-sequences |n"
  392.         "queue-search | get-search-results RID",
  393.         CArgDescriptions::eString);
  394.     arg_desc->PrintUsage(usage);
  395.     SetupArgDescriptions(arg_desc.release());
  396. }
  397. int
  398. CBlastcliApplication::Run(void)
  399. {
  400.     CArgs args = GetArgs();
  401.     string a = args[1].AsString();
  402.     if(a == "finish-params")
  403.         finish_params();
  404.     else if(a == "get-databases")
  405.         get_databases();
  406.     else if(a == "get-matrices")
  407.         get_matrices();
  408.     else if(a == "get-parameters")
  409.         get_parameters();
  410.     else if(a == "get-paramsets")
  411.         get_paramsets();
  412.     else if(a == "get-programs")
  413.         get_programs();
  414.     else if(a == "get-sequences")
  415.         get_sequences();
  416.     else if(a == "queue-search")
  417.         queue_search_and_poll_for_results();
  418.     else if(a == "get-search-results")
  419.         get_search_results(args[2].AsString());
  420.     else {
  421.         cerr << usage << endl;
  422.         exit(-1);
  423.     }
  424.     return 0;
  425. }
  426. void
  427. CBlastcliApplication::Exit()
  428. {
  429.     SetDiagStream(0);
  430. }
  431. int
  432. main(int argc, const char* argv[])
  433. {
  434.     return CBlastcliApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  435. }