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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: remote_blast.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:03:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ALGO_BLAST_API___REMOTE_BLAST__HPP
  10. #define ALGO_BLAST_API___REMOTE_BLAST__HPP
  11. /*  $Id: remote_blast.hpp,v 1000.1 2004/06/01 18:03:04 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Kevin Bealer
  37.  *
  38.  */
  39. /// @file remote_blast.hpp
  40. /// Declares the CRemoteBlast class.
  41. #include <algo/blast/api/blast_options_handle.hpp>
  42. #include <algo/blast/api/blastx_options.hpp>
  43. #include <algo/blast/api/tblastn_options.hpp>
  44. #include <algo/blast/api/tblastx_options.hpp>
  45. #include <algo/blast/api/disc_nucl_options.hpp>
  46. #include <algo/blast/api/psiblast_options.hpp>
  47. #include <objects/seqset/Bioseq_set.hpp>
  48. #include <objects/blast/blast__.hpp>
  49. #include <objects/scoremat/Score_matrix_parameters.hpp>
  50. /** @addtogroup AlgoBlast
  51.  *
  52.  * @{
  53.  */
  54. BEGIN_NCBI_SCOPE
  55. BEGIN_SCOPE(blast)
  56. /// API for Remote Blast Requests
  57. ///
  58. /// API Class to facilitate submission of Remote Blast requests.
  59. /// Provides an interface to build a Remote Blast request given an
  60. /// object of a subclass of CBlastOptionsHandle.
  61. class NCBI_XBLAST_EXPORT CRemoteBlast : public CObject
  62. {
  63. public:
  64.     // Protein = blastp/plain
  65.     CRemoteBlast(const string & RID)
  66.     {
  67.         x_Init(RID);
  68.     }
  69.     
  70.     // Protein = blastp/plain
  71.     CRemoteBlast(CBlastProteinOptionsHandle * algo_opts)
  72.     {
  73.         x_Init(algo_opts, "blastp", "plain");
  74.     }
  75.     
  76.     // Nucleotide = blastn/plain
  77.     CRemoteBlast(CBlastNucleotideOptionsHandle * algo_opts)
  78.     {
  79.         x_Init(algo_opts, "blastn", "plain");
  80.     }
  81.     
  82. //     // Nucleotide = blastn/plain
  83. //     CRemoteBlast(CMegaNucleotideOptionsHandle * algo_opts)
  84. //     {
  85. //         x_Init(algo_opts, "blastn", "megablast");
  86. //     }
  87.     
  88.     // Blastx = blastx/plain
  89.     CRemoteBlast(CBlastxOptionsHandle * algo_opts)
  90.     {
  91.         x_Init(algo_opts, "blastx", "plain");
  92.     }
  93.     
  94.     // TBlastn = tblastn/plain
  95.     CRemoteBlast(CTBlastnOptionsHandle * algo_opts)
  96.     {
  97.         x_Init(algo_opts, "tblastn", "plain");
  98.     }
  99.     
  100.     // TBlastx = tblastx/plain
  101.     CRemoteBlast(CTBlastxOptionsHandle * algo_opts)
  102.     {
  103.         x_Init(algo_opts, "tblastx", "plain");
  104.     }
  105.     
  106.     // DiscNucl = blastn/plain
  107.     CRemoteBlast(CDiscNucleotideOptionsHandle * algo_opts)
  108.     {
  109.         x_Init(algo_opts, "blastn", "megablast");
  110.     }
  111.     
  112.     // PSIBlast = blastp/psi
  113.     CRemoteBlast(CPSIBlastOptionsHandle * algo_opts)
  114.     {
  115.         x_Init(algo_opts, "blastp", "psi");
  116.     }
  117.     
  118. //     // Prot PHI = blastp/phi
  119. //     CRemoteBlast(CBlastPHINucleotideOptionsHandle * algo_opts)
  120. //     { x_Init(algo_opts, "blastn", "phi"); }
  121.     
  122. //     // Nucl PHI = blastn/phi
  123. //     CRemoteBlast(CBlastPHIProteinOptionsHandle * algo_opts)
  124. //     { x_Init(algo_opts, "blastp", "phi"); }
  125.     
  126.     ~CRemoteBlast()
  127.     {
  128.     }
  129.     
  130.     /******************* GI List ***********************/
  131.     void SetGIList(list<Int4> & gi_list)
  132.     {
  133.         if (gi_list.empty()) {
  134.             NCBI_THROW(CBlastException, eBadParameter,
  135.                        "Empty gi_list specified.");
  136.         }
  137.         x_SetOneParam("GiList", & gi_list);
  138.     }
  139.     
  140.     /******************* DB/subject *******************/
  141.     void SetDatabase(const string & x)
  142.     {
  143.         if (x.empty()) {
  144.             NCBI_THROW(CBlastException, eBadParameter,
  145.                        "Empty string specified for database.");
  146.         }
  147.         SetDatabase(x.c_str());
  148.     }
  149.     
  150.     void SetDatabase(const char * x);
  151.     
  152.     /******************* Entrez Query *******************/
  153.     void SetEntrezQuery(const char * x)
  154.     {
  155.         if (!x) {
  156.             NCBI_THROW(CBlastException, eBadParameter,
  157.                        "NULL specified for entrez query.");
  158.         }
  159.         x_SetOneParam("EntrezQuery", &x);
  160.     }
  161.     
  162.     /******************* Queries *******************/
  163.     void SetQueries(CRef<objects::CBioseq_set>                bioseqs);
  164.     void SetQueries(list< CRef<objects::CSeq_loc> >         & seqlocs);
  165.     void SetQueries(CRef<objects::CScore_matrix_parameters>   pssm);
  166.     
  167.     /******************* Queries *******************/
  168.     void SetMatrixTable(CRef<objects::CScore_matrix_parameters> matrix)
  169.     {
  170.         if (matrix.Empty()) {
  171.             NCBI_THROW(CBlastException, eBadParameter,
  172.                        "Empty reference for matrix.");
  173.         }
  174.         x_SetOneParam("MatrixTable", matrix);
  175.     }
  176.     
  177.     /******************* Getting Results *******************/
  178.     
  179.     // Submit and poll results until a completion (or error) state is
  180.     // reached.  This sleeps 10 seconds the after the submission, 13
  181.     // seconds after the first check, increasing by 30% after each
  182.     // check to a maximum of 300 seconds per sleep.
  183.     
  184.     // Returns true if the search was _submitted_ (there may be
  185.     // errors, call CheckErrors).
  186.     
  187.     bool SubmitSync(void)
  188.     {
  189.         return SubmitSync( DefaultTimeout() );
  190.     }
  191.     
  192.     bool SubmitSync(int);
  193.     
  194.     
  195.     // Submit and return immediately; returns true if request was
  196.     // submitted (true iff an RID was returned).
  197.     
  198.     bool Submit(void);
  199.     
  200.     
  201.     // This returns true if the search is done; it does a network
  202.     // operation, so it should not be called in a loop without a
  203.     // few seconds of delay.
  204.     
  205.     bool CheckDone(void);
  206.     
  207.     // This returns any errors encountered as a string (the empty
  208.     // string implies that everything is running smoothly).
  209.     
  210.     string GetErrors(void);
  211.     
  212.     // This returns any warnings encountered as a string.  These do
  213.     // not necessarily indicate an error or potential error; some
  214.     // warnings are always returned from certain types of searches.
  215.     // (This is more of a debugging feature rather than something to
  216.     // return to the end-user.)
  217.     
  218.     string GetWarnings(void);
  219.     
  220.     /******************* Getting Results *******************/
  221.     
  222.     // This is valid if submit returns true.
  223.     
  224.     const string & GetRID(void)
  225.     {
  226.         return m_RID;
  227.     }
  228.     
  229.     // This is valid if CheckDone returns true.  If CheckErrors
  230.     // returns errors, the rest of these will return nulls.
  231.     
  232.     CRef<objects::CSeq_align_set>            GetAlignments(void);
  233.     CRef<objects::CBlast4_phi_alignments>    GetPhiAlignments(void);
  234.     CRef<objects::CBlast4_mask>              GetMask(void);
  235.     list< CRef<objects::CBlast4_ka_block > > GetKABlocks(void);
  236.     list< string >                           GetSearchStats(void);
  237.     CRef<objects::CScore_matrix_parameters>  GetPSSM(void);
  238.     
  239.     // Verbose mode
  240.     enum EDebugMode {
  241.         eDebug = 0,
  242.         eSilent
  243.     };
  244.     
  245.     // Debugging method: set to true to output progress info to stdout.
  246.     void SetVerbose(EDebugMode verb = eDebug)
  247.     {
  248.         m_Verbose = verb;
  249.     }
  250.     
  251. private:
  252.     typedef objects::CBlast4_get_search_results_reply TGSRR;
  253.     
  254.     // State helpers (for readability)
  255.     enum EState {
  256.         eStart = 0,
  257.         eFailed,
  258.         eWait,
  259.         eDone
  260.     };
  261.     
  262.     // Immediacy flag
  263.     enum EImmediacy {
  264.         ePollAsync = 0,
  265.         ePollImmed
  266.     };
  267.     
  268.     // Required Parameters
  269.     enum ENeedConfig {
  270.         eNoConfig = 0x0,
  271.         eProgram  = 0x1,
  272.         eService  = 0x2,
  273.         eQueries  = 0x4,
  274.         eSubject  = 0x8,
  275.         eNeedAll  = 0xF
  276.     };
  277.     
  278.     // Initialize request (called by constructors)
  279.     
  280.     const int DefaultTimeout(void)
  281.     {
  282.         return int(3600*3.5);
  283.     }
  284.     
  285.     void x_Init(CBlastOptionsHandle * algo_opts,
  286.                 const char          * program,
  287.                 const char          * service);
  288.     
  289.     void x_Init(const string & RID);
  290.     void x_SetAlgoOpts(void);
  291.     
  292.     // Parameter setting
  293.     void x_SetOneParam(const char * name, const int * x); // not used (yet)
  294.     void x_SetOneParam(const char * name, const list<int> * x);
  295.     void x_SetOneParam(const char * name, const char ** x);
  296.     void x_SetOneParam(const char * name, 
  297.                        objects::CScore_matrix_parameters * matrix);
  298.     
  299.     int x_GetState(void);
  300.     
  301.     TGSRR * x_GetGSRR(void);
  302.     
  303.     // Submission/Result progression
  304.     CRef<objects::CBlast4_reply>
  305.     x_SendRequest(CRef<objects::CBlast4_request_body> body);
  306.     
  307.     CRef<objects::CBlast4_reply>
  308.     x_GetSearchResults(void);
  309.     
  310.     void x_CheckConfig(void);
  311.     void x_SubmitSearch(void);
  312.     void x_CheckResults(void);
  313.     void x_SearchErrors(CRef<objects::CBlast4_reply> reply);
  314.     void x_PollUntilDone(EImmediacy poll_immed, int seconds);
  315.     
  316.     
  317.     // Data
  318.     
  319.     CRef<blast::CBlastOptionsHandle>            m_CBOH;
  320.     CRef<objects::CBlast4_queue_search_request> m_QSR;
  321.     CRef<objects::CBlast4_reply>                m_Reply;
  322.     
  323.     vector<string> m_Errs;
  324.     vector<string> m_Warn;
  325.     string m_RID;
  326.     
  327.     int         m_ErrIgn;
  328.     bool        m_Pending;
  329.     EDebugMode  m_Verbose;
  330.     ENeedConfig m_NeedConfig;
  331. };
  332. END_SCOPE(blast)
  333. END_NCBI_SCOPE
  334. /* @} */
  335. /*
  336.  * ===========================================================================
  337.  * $Log: remote_blast.hpp,v $
  338.  * Revision 1000.1  2004/06/01 18:03:04  gouriano
  339.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  340.  *
  341.  * Revision 1.6  2004/05/17 18:07:19  bealer
  342.  * - Add PSI Blast support.
  343.  *
  344.  * Revision 1.5  2004/05/05 15:28:19  bealer
  345.  * - Add GetWarnings() mechanism.
  346.  * - Add PSSM queries (for PSI-Blast).
  347.  * - Add seq-loc-list queries (allows multiple identifier base queries, or
  348.  *   one query based on identifier plus interval.
  349.  * - Add GetPSSM() to retrieve results of PSI-Blast run.
  350.  *
  351.  * Revision 1.4  2004/04/12 16:36:37  bealer
  352.  * - More parameter checking.
  353.  *
  354.  * Revision 1.3  2004/03/23 22:30:27  bealer
  355.  * - Verify that CRemoteBlast objects are configured properly.
  356.  *
  357.  * Revision 1.2  2004/03/19 18:56:17  camacho
  358.  * Correct use of namespaces
  359.  *
  360.  * Revision 1.1  2004/02/18 17:30:22  bealer
  361.  * - Rename of blast4_options, plus changes:
  362.  *   - Add timeout for SubmitSync
  363.  *   - Change bools to enums
  364.  *
  365.  * Revision 1.7  2004/02/09 22:36:06  bealer
  366.  * - Delay examination of CBlastOptionsHandle object until Submit() action.
  367.  *
  368.  * Revision 1.6  2004/02/06 00:15:39  bealer
  369.  * - Add RID capability.
  370.  *
  371.  * Revision 1.5  2004/02/05 19:21:05  bealer
  372.  * - Add retry capability to API code.
  373.  *
  374.  * Revision 1.4  2004/02/05 00:38:07  bealer
  375.  * - Polling optimization.
  376.  *
  377.  * Revision 1.3  2004/02/04 22:31:24  bealer
  378.  * - Add async interface to Blast4 API.
  379.  * - Clean up, simplify code and interfaces.
  380.  * - Add state-based logic to promote robustness.
  381.  *
  382.  * Revision 1.2  2004/01/17 04:28:25  ucko
  383.  * Call x_SetOneParam directly rather than via x_SetParam, which was
  384.  * giving GCC 2.95 trouble.
  385.  *
  386.  * Revision 1.1  2004/01/16 20:40:21  bealer
  387.  * - Add CBlast4Options class (Blast 4 API)
  388.  *
  389.  *
  390.  * ===========================================================================
  391.  */
  392. #endif  /* ALGO_BLAST_API___REMOTE_BLAST__HPP */