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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: net_blast_req_base.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 20:54:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: net_blast_req_base.cpp,v 1000.4 2004/06/01 20:54:39 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:  Clifford Clausen, Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "net_blast_req_base.hpp"
  41. #include "blast_util.hpp"
  42. #include <gui/objutils/label.hpp>
  43. #include <gui/core/doc_manager.hpp>
  44. #include <gui/core/version.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginCommand.hpp>
  48. #include <gui/plugin/PluginArgSet.hpp>
  49. #include <gui/plugin/PluginRequest.hpp>
  50. #include <gui/utils/message_box.hpp>
  51. #include <algo/blast/api/bl2seq.hpp>
  52. #include <algo/blast/api/blast_options.hpp>
  53. #include <objects/seq/seqport_util.hpp>
  54. #include <objects/seq/Bioseq.hpp>
  55. #include <objects/seq/IUPACaa.hpp>
  56. #include <objects/seq/IUPACna.hpp>
  57. #include <objects/seq/Seq_descr.hpp>
  58. #include <objects/seq/Seqdesc.hpp>
  59. #include <objects/seqset/Seq_entry.hpp>
  60. #include <objects/seqset/Bioseq_set.hpp>
  61. #include <objects/blast/Blast4_cutoff.hpp>
  62. #include <objects/blast/Blast4_error.hpp>
  63. #include <objects/blast/Blast4_database.hpp>
  64. #include <objects/blast/Blast4_parameter.hpp>
  65. #include <objects/blast/Blast4_parameters.hpp>
  66. #include <objects/blast/Blast4_queue_search_reply.hpp>
  67. #include <objects/blast/Blast4_queue_search_reques.hpp>
  68. #include <objects/blast/Blast4_reply.hpp>
  69. #include <objects/blast/Blast4_reply_body.hpp>
  70. #include <objects/blast/Blast4_request.hpp>
  71. #include <objects/blast/Blast4_request_body.hpp>
  72. #include <objects/blast/Blast4_subject.hpp>
  73. #include <objects/blast/Blast4_value.hpp>
  74. #include <objects/blast/blastclient.hpp>
  75. #include <objmgr/seq_vector.hpp>
  76. #include <algo/blast/api/blastx_options.hpp>
  77. #include <algo/blast/api/tblastn_options.hpp>
  78. #include <algo/blast/api/tblastx_options.hpp>
  79. #include <algo/blast/api/blast_nucl_options.hpp>
  80. #include <algo/blast/api/blast_prot_options.hpp>
  81. BEGIN_NCBI_SCOPE
  82. USING_SCOPE(objects);
  83. CRef<CPluginValueConstraint>      CNetBlastReq_Base::sm_DbConstraint_Nucs;
  84. CRef<CPluginValueConstraint>      CNetBlastReq_Base::sm_DbConstraint_Prots;
  85. CNetBlastReq_Base::TDbMap         CNetBlastReq_Base::sm_DbMap;
  86. CRef<CBlast4_get_databases_reply> CNetBlastReq_Base::sm_Databases;
  87. void CNetBlastReq_Base::RunCommand(CPluginMessage& msg)
  88. {
  89.     const CPluginCommand& args  = msg.GetRequest().GetCommand();
  90.     CPluginReply&         reply = msg.SetReply();
  91.     reply.SetStatus(eMessageStatus_failed);
  92.     //
  93.     // retrieve our locations
  94.     //
  95.     bool nuc = true;
  96.     plugin_args::TLocList locs;
  97.     if (args.HasArgument("nucleotide")) {
  98.         GetArgValue(args["nucleotide"], locs);
  99.     } else if (args.HasArgument("protein")){
  100.         GetArgValue(args["protein"],    locs);
  101.         nuc = false;
  102.     } else {
  103.         NcbiMessageBox("Plugin called without sequences set.");
  104.         return;
  105.     }
  106.     try {
  107.         blast::CBlastOptions opts;
  108.         CRef<blast::CRemoteBlast> cli(x_GetClient(args));
  109.         if (args.HasArgument("query")  &&
  110.             CPluginUtils::IsValid(args["query"])) {
  111.             cli->SetEntrezQuery(args["query"].AsString().c_str());
  112.         }
  113.         bool error = false;
  114.         string err_locs;
  115.         ITERATE (plugin_args::TLocList, iter, locs) {
  116.             const CSeq_loc&  loc = *iter->second;
  117.             const IDocument& doc = *iter->first;
  118.             // convert the location to a sequence
  119.             // this is a constructed bioseq containing only the covered sequence...
  120.             CRef<CBioseq> bioseq(x_SeqLocToBioseq(loc, doc.GetScope()));
  121.             if ( !bioseq ) {
  122.                 string str;
  123.                 CLabel::GetLabel(loc, &str, CLabel::eDefault, &doc.GetScope());
  124.                 LOG_POST(Error << "can't create bioseq for location: "
  125.                          << str);
  126.                 continue;
  127.             }
  128.             CObjectConverter::TObjList objs;
  129.             CObjectConverter::Convert(doc.GetScope(), *bioseq,
  130.                                       CBioseq_set::GetTypeInfo(), objs);
  131.             NON_CONST_ITERATE (CObjConverter::TObjList, bs_iter, objs) {
  132.                 const CBioseq_set& bs =
  133.                     dynamic_cast<const CBioseq_set&>(**bs_iter);
  134.                 CRef<CBioseq_set> ref(&const_cast<CBioseq_set&>(bs));
  135.                 cli->SetQueries(ref);
  136.                 if (cli->Submit()) {
  137.                     // Set up arguments for framework to call
  138.                     // CDataPlugin_BlastReply plugin
  139.                     CRef<CPluginMessage> msg(new CPluginMessage);
  140.                     msg->SetDestination("CDataPlugin_BlastReply");
  141.                     // we pass in our arguments verbatim
  142.                     CPluginCommand& data_cmd = msg->SetRequest().SetData();
  143.                     data_cmd.SetCommand(eDataCommand_load);
  144.                     data_cmd.SetArgs().Assign(args.GetArgs());
  145.                     // add the RID argument
  146.                     data_cmd.SetArgs().AddArgument("RID", "Request Id", 
  147.                                                    CPluginArg::eString);
  148.                     data_cmd.SetArgs()["RID"].SetString(cli->GetRID());
  149.                     // pass the query location separately
  150.                     data_cmd.SetArgs().AddArgument("query_loc", "Query Seq-loc",
  151.                                                    CSeq_loc::GetTypeInfo());
  152.                     data_cmd.SetArgs()["query_loc"].SetObject(doc, loc);
  153.                     // once done, fire off our message
  154.                     CPluginUtils::CallPlugin(*msg);
  155.                 } else {
  156.                     loc.GetLabel(&err_locs);
  157.                     err_locs += "n";
  158.                     error = true;
  159.                 }
  160.             }
  161.         }
  162.         if (error) {
  163.             NcbiMessageBox("Error submitting locations:n" + err_locs);
  164.         } else {
  165.             reply.SetStatus(eMessageStatus_success);
  166.         }
  167.         }
  168.     catch (CException& e) {
  169.         NcbiMessageBox("Failed to submit BLAST search:n" + e.GetMsg());
  170.     }
  171.     catch (std::exception& e) {
  172.         NcbiMessageBox(string("Failed to submit BLAST search:n") + e.what());
  173.     }
  174. }
  175. void CNetBlastReq_Base::FinalizeArgs(objects::CPluginMessage& msg)
  176. {
  177.     // determine which BLAST program we're looking at
  178.     // this will determine which set of constraints (if any) we impose
  179.     string program = msg.GetRequest().GetCommand()["prog"].AsString();
  180.     blast::EProgram prog = CBlastUtils::GetBlastProgram(program);
  181.     if (prog == blast::eBlastProgramMax) {
  182.         return;
  183.     }
  184.     if ( !sm_Databases ) {
  185.         CBlast4Client client;
  186.         sm_Databases = client.AskGet_databases();
  187.         if ( !sm_Databases ) {
  188.             NcbiMessageBox("Failed to contact BLAST server.n"
  189.                            "Network BLAST searches will be disabled.");
  190.             return;
  191.         }
  192.         /**
  193.         auto_ptr<CObjectOStream> os
  194.             (CObjectOStream::Open(eSerial_AsnText, "c:/temp/blast-dbs.asn"));
  195.         *os << *sm_Databases;
  196.         **/
  197.         sm_DbConstraint_Nucs.Reset(CPluginValueConstraint::CreateSet());
  198.         sm_DbConstraint_Prots.Reset(CPluginValueConstraint::CreateSet());
  199.         NON_CONST_ITERATE (CBlast4_get_databases_reply::Tdata, iter,
  200.                            sm_Databases->Set()) {
  201.             const CBlast4_database_info& info = **iter;
  202.             // map description -> name
  203.             string name = info.GetDatabase().GetName();
  204.             sm_DbMap[name] = *iter;
  205.             if (info.GetDatabase().GetType() == eBlast4_residue_type_protein) {
  206.                 *sm_DbConstraint_Prots, info.GetDatabase().GetName();
  207.             } else {
  208.                 *sm_DbConstraint_Nucs, info.GetDatabase().GetName();
  209.             }
  210.         }
  211.     }
  212.     switch (prog) {
  213.     case blast::eBlastn:
  214.     case blast::eTblastn:
  215.         msg.SetRequest().SetCommand()
  216.             .SetConstraint("subject", *sm_DbConstraint_Nucs);
  217.         break;
  218.     case blast::eBlastx:
  219.     case blast::eBlastp:
  220.     case blast::eTblastx:
  221.         msg.SetRequest().SetCommand()
  222.             .SetConstraint("subject", *sm_DbConstraint_Prots);
  223.         break;
  224.     default:
  225.         break;
  226.     }
  227. }
  228. CBioseq* CNetBlastReq_Base::x_SeqLocToBioseq(const CSeq_loc& loc,
  229.                                              CScope& scope)
  230. {
  231.     // Build a Seq-entry for the query Seq-loc
  232.     CBioseq_Handle handle = scope.GetBioseqHandle(loc);
  233.     if ( !handle ) {
  234.         return CRef<CBioseq>();
  235.     }
  236.     CSeqVector vec =
  237.         handle.GetSequenceView(loc,
  238.                                CBioseq_Handle::eViewConstructed,
  239.                                CBioseq_Handle::eCoding_Iupac);
  240.     string seq_string;
  241.     vec.GetSeqData(0, vec.size(), seq_string);
  242.     CRef<CBioseq> bioseq(new CBioseq());
  243.     // curate our inst
  244.     bioseq->SetInst().SetRepr(CSeq_inst::eRepr_raw);
  245.     bioseq->SetInst().SetLength(seq_string.size());
  246.     if (vec.IsProtein()) {
  247.         bioseq->SetInst().SetMol(CSeq_inst::eMol_aa);
  248.         bioseq->SetInst().SetSeq_data().SetIupacaa(*new CIUPACaa(seq_string));
  249.     } else {
  250.         bioseq->SetInst().SetMol(CSeq_inst::eMol_na);
  251.         bioseq->SetInst().SetSeq_data().SetIupacna(*new CIUPACna(seq_string));
  252.         CSeqportUtil::Pack(&bioseq->SetInst().SetSeq_data());
  253.     }
  254.     // add an ID for our sequence
  255.     CRef<CSeq_id> id(new CSeq_id());
  256.     id->Assign(*handle.GetSeqId());
  257.     bioseq->SetId().push_back(id);
  258.     // a title
  259.     CRef<CSeqdesc> title(new CSeqdesc);
  260.     string title_str;
  261.     id->GetLabel(&title_str);
  262.     title_str += ": ";
  263.     loc.GetLabel(&title_str);
  264.     title->SetTitle(title_str);
  265.     bioseq->SetDescr().Set().push_back(title);
  266.     return bioseq.Release();
  267. }
  268. blast::CRemoteBlast* CNetBlastReq_Base::x_GetClient(const CPluginCommand& args)
  269. {
  270.     string program = args["prog"].AsString();
  271.     blast::EProgram prog = CBlastUtils::GetBlastProgram(program);
  272.     if (prog == blast::eBlastProgramMax) {
  273.         return NULL;
  274.     }
  275.     CRef<blast::CRemoteBlast> rb;
  276.     switch (prog) {
  277.     case blast::eBlastn:
  278.         {{
  279.             CRef<blast::CBlastNucleotideOptionsHandle> opts
  280.                 (new blast::CBlastNucleotideOptionsHandle
  281.                  (blast::CBlastOptions::eRemote));
  282.             opts->SetWordSize       (args["word"].AsInteger());
  283.             opts->SetEvalueThreshold(args["expect"].AsDouble());
  284.             rb.Reset(new blast::CRemoteBlast(opts));
  285.         }}
  286.         break;
  287.     case blast::eBlastp:
  288.         {{
  289.             CRef<blast::CBlastProteinOptionsHandle> opts
  290.                 (new blast::CBlastProteinOptionsHandle
  291.                  (blast::CBlastOptions::eRemote));
  292.             opts->SetWordSize       (args["word"].AsInteger());
  293.             opts->SetEvalueThreshold(args["expect"].AsDouble());
  294.             rb.Reset(new blast::CRemoteBlast(opts));
  295.         }}
  296.         break;
  297.     case blast::eBlastx:
  298.         {{
  299.             CRef<blast::CBlastxOptionsHandle> opts
  300.                 (new blast::CBlastxOptionsHandle
  301.                  (blast::CBlastOptions::eRemote));
  302.             opts->SetWordSize       (args["word"].AsInteger());
  303.             opts->SetEvalueThreshold(args["expect"].AsDouble());
  304.             rb.Reset(new blast::CRemoteBlast(opts));
  305.         }}
  306.         break;
  307.     case blast::eTblastn:
  308.         {{
  309.             CRef<blast::CTBlastnOptionsHandle> opts
  310.                 (new blast::CTBlastnOptionsHandle
  311.                  (blast::CBlastOptions::eRemote));
  312.             opts->SetWordSize       (args["word"].AsInteger());
  313.             opts->SetEvalueThreshold(args["expect"].AsDouble());
  314.             rb.Reset(new blast::CRemoteBlast(opts));
  315.         }}
  316.         break;
  317.     case blast::eTblastx:
  318.         {{
  319.             CRef<blast::CTBlastxOptionsHandle> opts
  320.                 (new blast::CTBlastxOptionsHandle
  321.                  (blast::CBlastOptions::eRemote));
  322.             opts->SetWordSize       (args["word"].AsInteger());
  323.             opts->SetEvalueThreshold(args["expect"].AsDouble());
  324.             rb.Reset(new blast::CRemoteBlast(opts));
  325.         }}
  326.         break;
  327.     }
  328.     if ( !rb ) {
  329.         return NULL;
  330.     }
  331.     rb->SetDatabase(args["subject"].AsString().c_str());
  332.     return rb.Release();
  333. }
  334. END_NCBI_SCOPE
  335. /*
  336.  * ===========================================================================
  337.  * $Log: net_blast_req_base.cpp,v $
  338.  * Revision 1000.4  2004/06/01 20:54:39  gouriano
  339.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  340.  *
  341.  * Revision 1.16  2004/05/21 22:27:46  gorelenk
  342.  * Added PCH ncbi_pch.hpp
  343.  *
  344.  * Revision 1.15  2004/05/07 15:42:35  dicuccio
  345.  * Use CLabel instead of CSeqUtils::GetLabel()
  346.  *
  347.  * Revision 1.14  2004/05/03 13:05:42  dicuccio
  348.  * gui/utils --> gui/objutils where needed
  349.  *
  350.  * Revision 1.13  2004/04/22 12:22:08  dicuccio
  351.  * Added BLAST RID caching.  Added better formatting for BLAST results
  352.  *
  353.  * Revision 1.12  2004/04/16 14:43:02  dicuccio
  354.  * Code clean-up.  Separated databases into protein and nucleotide types, provided
  355.  * separate constraint objects for each.
  356.  *
  357.  * Revision 1.11  2004/04/07 20:58:01  ucko
  358.  * Qualify "exception" with std:: (otherwise ambiguous on some platforms)
  359.  *
  360.  * Revision 1.10  2004/04/07 12:54:44  dicuccio
  361.  * Rewrote submission interface to use CRemoteBlast.  Added FinalizeArgs() to
  362.  * ping the blast service for the available databases.
  363.  *
  364.  * ===========================================================================
  365.  */