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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_base.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:54:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_base.cpp,v 1000.5 2004/06/01 20:54:12 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.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "blast_base.hpp"
  41. #include "blast_util.hpp"
  42. #include <gui/core/doc_manager.hpp>
  43. #include <gui/plugin/PluginInfo.hpp>
  44. #include <gui/plugin/PluginCommandSet.hpp>
  45. #include <gui/plugin/PluginCommand.hpp>
  46. #include <gui/plugin/PluginRequest.hpp>
  47. #include <gui/plugin/PluginArgSet.hpp>
  48. #include <gui/core/version.hpp>
  49. #include <gui/utils/message_box.hpp>
  50. #include <gui/core/plugin_utils.hpp>
  51. #include <algo/blast/api/bl2seq.hpp>
  52. #include <algo/blast/api/blast_options.hpp>
  53. #include <objects/seq/Bioseq.hpp>
  54. #include <objects/seq/Seq_inst.hpp>
  55. #include <objects/seqalign/Seq_align_set.hpp>
  56. #include <objects/seqalign/Seq_align.hpp>
  57. #include <serial/serial.hpp>
  58. #include <serial/objostrasn.hpp>
  59. BEGIN_NCBI_SCOPE
  60. USING_SCOPE(objects);
  61. //
  62. // utility function for translating between plugin arg loc-lists
  63. // and BLAST loc vectors
  64. //
  65. inline
  66. blast::TSeqLocVector x_ToBlastVec(const plugin_args::TLocList& locs)
  67. {
  68.     blast::SSeqLoc loc;
  69.     blast::TSeqLocVector vec;
  70.     vec.reserve(locs.size());
  71.     ITERATE (plugin_args::TLocList, iter, locs) {
  72.         loc.seqloc = iter->second;
  73.         loc.scope = &(iter->first->GetScope());
  74.         vec.push_back(loc);
  75.     }
  76.     return vec;
  77. }
  78. // standard info boilerplate
  79. void CAlgoBlast_Base::x_AddStandardArgs(CPluginCommand& command)
  80. {
  81. }
  82. void CAlgoBlast_Base::RunCommand(CPluginMessage& msg)
  83. {
  84.     const CPluginCommand& cmd   = msg.GetRequest().GetCommand();
  85.     CPluginReply&         reply = msg.SetReply();
  86.     //
  87.     // retrieve our query sequences
  88.     //
  89.     plugin_args::TLocList query;
  90.     GetArgValue(cmd["query"], query);
  91.     //
  92.     // retrieve our target sequences
  93.     //
  94.     plugin_args::TLocList targets;
  95.     GetArgValue(cmd["targets"], targets);
  96.     //
  97.     // compose the query and target sequences into BLAST forms
  98.     //
  99.     blast::TSeqLocVector query_vec  = x_ToBlastVec(query);
  100.     blast::TSeqLocVector target_vec = x_ToBlastVec(targets);
  101.     //
  102.     // retrieve the program type we're running
  103.     //
  104.     string prog_name = cmd["prog"].AsString();
  105.     //
  106.     // switch based on the program
  107.     //
  108.     CRef<CSeq_annot> annot(new CSeq_annot());
  109.     if ( !annot ) {
  110.         reply.SetStatus(eMessageStatus_failed);
  111.         return;
  112.     }
  113.     blast::EProgram prog = blast::eBlastn;
  114.     if (prog_name == "blastn") {
  115.         annot->AddTitle("BLASTn Output");
  116.         prog = blast::eBlastn;
  117.     } else if (prog_name == "blastp") {
  118.         annot->AddTitle("BLASTp Output");
  119.         prog = blast::eBlastp;
  120.     } else if (prog_name == "blastx") {
  121.         annot->AddTitle("BLASTx Output");
  122.         prog = blast::eBlastx;
  123.     } else {
  124.         annot->AddTitle("tBLASTx Output");
  125.         prog = blast::eTblastx;
  126.     }
  127.     //
  128.     // parse our options
  129.     //
  130.     blast::CBl2Seq blaster(query_vec, target_vec, prog);
  131.     CBlastUtils::ArgsToBlastOptions(cmd, blaster.SetOptions());
  132.     //
  133.     // blast!
  134.     //
  135.     // run blast
  136. blast::TSeqAlignVector aligns = blaster.Run();
  137.     // make an annotation
  138. ITERATE (blast::TSeqAlignVector, iter, aligns) {
  139.         ITERATE (CSeq_align_set::Tdata, align_iter, (*iter)->Get()) {
  140.             if ((*align_iter)->GetSegs().IsDisc()) {
  141.                 annot->SetData().SetAlign()
  142.                     .insert(annot->SetData().SetAlign().end(),
  143.                             (*align_iter)->GetSegs().GetDisc().Get().begin(),
  144.                             (*align_iter)->GetSegs().GetDisc().Get().end());
  145.             } else {
  146.                 annot->SetData().SetAlign().push_back(*align_iter);
  147.             }
  148.         }
  149. }
  150.     _TRACE("CAlgoBlastBase: found " << annot->GetData().GetAlign().size()
  151.            << " alignments");
  152.     if (annot->GetData().GetAlign().size() == 0) {
  153.         NcbiMessageBox("No alignments found.");
  154.         return;
  155.     }
  156.     //
  157.     // pass back to the system.  We may use the same scope and just attach,
  158.     // if that is appropriate
  159.     //
  160.     CConstRef<IDocument> doc_ref;
  161.     ITERATE (plugin_args::TLocList, iter, query) {
  162.         if ( !doc_ref ) {
  163.             doc_ref.Reset(iter->first);
  164.         } else if (iter->first != doc_ref) {
  165.             doc_ref.Reset();
  166.             break;
  167.         }
  168.     }
  169.     if (doc_ref) {
  170.         ITERATE (plugin_args::TLocList, iter, targets) {
  171.             if (iter->second != doc_ref) {
  172.                 doc_ref.Reset();
  173.                 break;
  174.             }
  175.         }
  176.     }
  177.     //
  178.     // create a new document and launch a viewer for our alignment
  179.     //
  180.     if ( !doc_ref ) {
  181.         //
  182.         // query and targets come from different documents
  183.         // create a new one to handle the results
  184.         //
  185.         CRef<CScope> new_scope(new CScope(CDocManager::GetObjectManager()));
  186.         ITERATE (plugin_args::TLocList, iter, query) {
  187.             new_scope->AddScope(iter->first->GetScope());
  188.         }
  189.         ITERATE (plugin_args::TLocList, iter, targets) {
  190.             new_scope->AddScope(iter->first->GetScope());
  191.         }
  192.         doc_ref.Reset(CDocManager::CreateDocument(*new_scope, *annot));
  193.     }
  194.     CRef<CSelectionBuffer> buf(new CSelectionBuffer());
  195.     buf->AddSelection(doc_ref, *annot);
  196.     CPluginUtils::CallPlugin("CAlnMultiView",
  197.                              eViewCommand_new_view, *buf);
  198.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  199.     reply.AddObject(*doc_ref, *annot);
  200.     reply.SetStatus(eMessageStatus_success);
  201. }
  202. END_NCBI_SCOPE
  203. /*
  204.  * ===========================================================================
  205.  * $Log: blast_base.cpp,v $
  206.  * Revision 1000.5  2004/06/01 20:54:12  gouriano
  207.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  208.  *
  209.  * Revision 1.10  2004/05/21 22:27:46  gorelenk
  210.  * Added PCH ncbi_pch.hpp
  211.  *
  212.  * Revision 1.9  2004/04/07 12:51:48  dicuccio
  213.  * Removed dead code
  214.  *
  215.  * Revision 1.8  2004/01/27 18:40:04  dicuccio
  216.  * Code clean-up.  Renamed plugin classes to follow standard pattern
  217.  *
  218.  * Revision 1.7  2004/01/13 20:36:30  dicuccio
  219.  * Use CBlastUtils for standard argument processing.  Make sure to pass the new
  220.  * objects back to the framework with the appropriate action set (add to the
  221.  * document specified)
  222.  *
  223.  * Revision 1.6  2003/12/22 19:25:56  dicuccio
  224.  * Added check to see if no alignments were produced
  225.  *
  226.  * Revision 1.5  2003/11/26 21:08:07  ucko
  227.  * Adjust for current CBlastOptions location and API.
  228.  *
  229.  * Revision 1.4  2003/11/06 20:12:12  dicuccio
  230.  * Cleaned up handling of USING_SCOPE - removed from all headers
  231.  *
  232.  * Revision 1.3  2003/11/04 17:49:22  dicuccio
  233.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  234.  * CPluginCommand/CPluginReply
  235.  *
  236.  * Revision 1.2  2003/11/03 17:41:19  dicuccio
  237.  * Fixed to match changes in BLAST API
  238.  *
  239.  * Revision 1.1  2003/10/23 16:23:04  dicuccio
  240.  * Moved code from algo/blast to algo/align
  241.  *
  242.  * Revision 1.3  2003/09/29 20:01:37  dicuccio
  243.  * Fixed null dereference - must allocate annot.  Cleaned up access to parameters
  244.  *
  245.  * Revision 1.2  2003/09/29 19:28:01  dicuccio
  246.  * Implemented variants of BLAST
  247.  *
  248.  * Revision 1.1  2003/09/25 17:41:10  dicuccio
  249.  * Split BLAST plugin into three plugins, one each for BLASTn, BLASTp, and tBLASTn
  250.  *
  251.  * Revision 1.5  2003/09/04 18:36:23  dicuccio
  252.  * Changed to use plugin_args namespace
  253.  *
  254.  * Revision 1.4  2003/09/04 14:05:24  dicuccio
  255.  * Use IDocument instead of CDocument
  256.  *
  257.  * Revision 1.3  2003/08/21 12:03:08  dicuccio
  258.  * Make use of new typedef in plugin_utils.hpp for argument values.
  259.  *
  260.  * Revision 1.2  2003/08/18 14:44:00  dicuccio
  261.  * Partial fix for compilation issues
  262.  *
  263.  * Revision 1.1  2003/08/15 18:59:14  dicuccio
  264.  * Initial revision
  265.  *
  266.  * ===========================================================================
  267.  */