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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: search_opts.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/16 17:12:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ALGO_BLAST_API_DEMO___SEARCH_OPTS__HPP
  10. #define ALGO_BLAST_API_DEMO___SEARCH_OPTS__HPP
  11. /*  $Id: search_opts.hpp,v 1000.1 2004/04/16 17:12:31 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.  * Author:  Kevin Bealer
  37.  *
  38.  */
  39. /// @file search_opts.hpp
  40. /// Encapsulates optional netblast search parameters.
  41. ///
  42. /// The Netblast protocol provides a long list of optional search
  43. /// parameters.  Some of these are already supported here - more will
  44. /// be supported in the future.  This code takes responsibility for
  45. /// this aspect of the remote_blast program.  Adding a new search
  46. /// parameter should require modifications to ONLY this file.  This
  47. /// works toward the OOP goal of designing interfaces and
  48. /// encapsulation in such a way as to isolate parts of the program
  49. /// that will change.
  50. #include "optional.hpp"
  51. #include <corelib/ncbiargs.hpp>
  52. #include <algo/blast/api/remote_blast.hpp>
  53. #include <objects/blast/Blast4_cutoff.hpp>
  54. BEGIN_NCBI_SCOPE
  55. USING_SCOPE(ncbi::blast);
  56. class CStringLit
  57. {
  58. public:
  59.     explicit CStringLit(const char * x)
  60.         : m_ptr(x)
  61.     {
  62.     }
  63.     
  64.     operator const char *(void)
  65.     {
  66.         return m_ptr;
  67.     }
  68.     
  69.     operator string(void)
  70.     {
  71.         return string(m_ptr);
  72.     }
  73. private:
  74.     const char * m_ptr;
  75. };
  76. class CUserOpt : public CStringLit
  77. {
  78. public:
  79.     explicit CUserOpt(const char * x)
  80.         : CStringLit(x)
  81.     {
  82.     }
  83. };
  84. class CNetName : public CStringLit
  85. {
  86. public:
  87.     explicit CNetName(const char * x)
  88.         : CStringLit(x)
  89.     {
  90.     }
  91. };
  92. class CArgKey : public CStringLit
  93. {
  94. public:
  95.     explicit CArgKey(const char * x)
  96.         : CStringLit(x)
  97.     {
  98.     }
  99. };
  100. class COptDesc : public CStringLit
  101. {
  102. public:
  103.     explicit COptDesc(const char * x)
  104.         : CStringLit(x)
  105.     {
  106.     }
  107. };
  108. /// This is base class for classes that operate on the option set.
  109. ///
  110. /// Functors that operate on the set of options in NetblastSearchOpts
  111. /// are derived from this class; it provides a set of handy methods
  112. /// for reading options (from the CArgs object, to the field) and
  113. /// adding options (to the CArgDescriptions, based on a field object
  114. /// and key name).  Note that the AddOpt() code does not actually modify the
  115. /// field -- it merely uses C++ overloading to select the correct
  116. /// CArgDescription parse type based on each field type.  Because of
  117. /// this mechanism, changing the type of a field (from OptInteger to
  118. /// OptDouble for example), makes all the necessary network protocol
  119. /// and CArgs interface adjustments.
  120. /// @sa NetblastSearchOpts - see also.
  121. class COptionWalker
  122. {
  123. public:
  124.     /// Read a boolean field.
  125.     void ReadOpt(const CArgs & args,
  126.                  TOptBool    & field,
  127.                  const char  * key);
  128.     
  129.     /// Read a double field.
  130.     void ReadOpt(const CArgs & args,
  131.                  TOptDouble  & field,
  132.                  const char  * key);
  133.     
  134.     /// Read an integer field.
  135.     void ReadOpt(const CArgs & args,
  136.                  TOptInteger & field,
  137.                  const char  * key);
  138.     
  139.     /// Read a string field.
  140.     void ReadOpt(const CArgs & args,
  141.                  TOptString  & field,
  142.                  const char  * key);
  143.     
  144.     
  145.     /// Build the CArgDescription for a boolean field.
  146.     void AddOpt(CArgDescriptions & ui,
  147.                 TOptBool         & field,
  148.                 const char       * name,
  149.                 const char       * synop,
  150.                 const char       * comment);
  151.     
  152.     /// Build the CArgDescription for a double field.
  153.     void AddOpt(CArgDescriptions & ui,
  154.                 TOptDouble       & field,
  155.                 const char       * name,
  156.                 const char       * synop,
  157.                 const char       * comment);
  158.     
  159.     /// Build the CArgDescription for an integer field.
  160.     void AddOpt(CArgDescriptions & ui,
  161.                 TOptInteger      & field,
  162.                 const char       * name,
  163.                 const char       * synop,
  164.                 const char       * comment);
  165.     
  166.     /// Build the CArgDescription for a string field.
  167.     void AddOpt(CArgDescriptions & ui,
  168.                 TOptString       & field,
  169.                 const char       * name,
  170.                 const char       * synop,
  171.                 const char       * comment);
  172.     /// Require this boolean function
  173.     virtual bool NeedRemote(void) = 0;
  174. };
  175. /// This class stores search options for remote_blast.
  176. ///
  177. /// This class stores optional search parameters for remote_blast.
  178. /// The heart of this class is the Apply() method, which takes an
  179. /// object as an input parameter and applies that object to each
  180. /// search option field.  There are three types of fields: Local,
  181. /// Remote(), and Same().  The Local fields represent blastcl4
  182. /// options.  The Remote() fields represent netblast (socket protocol)
  183. /// options.  The Same() fields are fields which are both Remote() and
  184. /// Local; the value is passed directly through as a netblast
  185. /// parameter.  Most fields fall into the Same() category.  The
  186. /// objects passed to Apply() are called with the appropriate one of
  187. /// the Local(), Remote(), or Same() methods for each field.  To add a
  188. /// new field, create a new TOpt* type object in the private section,
  189. /// and call Same(), Local() or Remote() with the properties of that
  190. /// field in the Apply() method.
  191. /*
  192. Solution 1: Scrap all this, writing seperate code bases for N, P, TX,
  193.    etc.  Problem: this was time consuming to write, even in the
  194.    current, "good programmers try not to do something twice, insane
  195.    programmers try not to do something once" code configuration.
  196.    
  197. Solution 2: Create a traitsy solution.  The Set(...) methods will use
  198.    nucleotide, protein, and so on specialized types.  Each COptHandler
  199.    will be derived from whatever types are appropriate for its pieces.
  200.    Thus, there is a generic Set() for throwing, and a SetValue() for
  201.    setting.  The Set() is overridden to call SetValue for the right
  202.    cases.
  203. */
  204. extern bool trace_blast_api;
  205. #define WRITE_API_IDENT(NAME)                                
  206.     if (trace_blast_api) {                                   
  207.         cerr << "BlastAPI call: Set" # NAME "(...)" << endl; 
  208.     }
  209. #define OPT_HANDLER_START(NAMESEG, EXPR)       
  210. template <class BlOptTp>                       
  211. class COptHandler_ ## NAMESEG {                
  212. public:                                        
  213.     template<class ValT, class OptsT>          
  214.     void SetValue(OptsT & opts, ValT & V)      
  215.     {                                          
  216.         WRITE_API_IDENT(NAMESEG);              
  217.         opts->Set ## NAMESEG (EXPR);           
  218.     }                                          
  219.                                                
  220.     template<class ValT, class OptsT>          
  221.     void Set(OptsT &, ValT &)             
  222.     {                                          
  223.         /*cerr << "In ["              */       
  224.         /*     << __PRETTY_FUNCTION__ */       
  225.         /*     << "]:n";             */       
  226.         throw runtime_error                    
  227.             ("program / parm mismatch");       
  228.     }
  229. #define OPT_HANDLER_SUPPORT(OPTIONTYPE) 
  230.     template<class ValT>                
  231.     void Set(CRef<OPTIONTYPE> opts,     
  232.              ValT & V)                  
  233.     {                                   
  234.         SetValue(opts, V);              
  235.     }
  236. #define OPT_HANDLER_END() }
  237. // Helper and Shortcut Handler Sets
  238. #define OPT_HANDLER_SUPPORT_ALL(NAME)               
  239. OPT_HANDLER_START(NAME, V)                          
  240. OPT_HANDLER_SUPPORT(CBlastxOptionsHandle)           
  241. OPT_HANDLER_SUPPORT(CTBlastnOptionsHandle)          
  242. OPT_HANDLER_SUPPORT(CTBlastxOptionsHandle)          
  243. OPT_HANDLER_SUPPORT(CBlastProteinOptionsHandle)     
  244. OPT_HANDLER_SUPPORT(CBlastNucleotideOptionsHandle)  
  245. OPT_HANDLER_END()
  246. #define OPT_HANDLER_EXPR_ALL(NAME, EXPR)            
  247. OPT_HANDLER_START(NAME, EXPR)                       
  248. OPT_HANDLER_SUPPORT(CBlastxOptionsHandle)           
  249. OPT_HANDLER_SUPPORT(CTBlastnOptionsHandle)          
  250. OPT_HANDLER_SUPPORT(CTBlastxOptionsHandle)          
  251. OPT_HANDLER_SUPPORT(CBlastProteinOptionsHandle)     
  252. OPT_HANDLER_SUPPORT(CBlastNucleotideOptionsHandle)  
  253. OPT_HANDLER_END()
  254. #define OPT_HANDLER_SUPPORT_NUCL(NAME)              
  255. OPT_HANDLER_START(NAME, V)                          
  256. OPT_HANDLER_SUPPORT(CBlastNucleotideOptionsHandle)  
  257. OPT_HANDLER_END()
  258. // Translated Query (blastx, tblastx)
  259. #define OPT_HANDLER_SUPPORT_TRQ(NAME)       
  260. OPT_HANDLER_START(NAME, V)                  
  261. OPT_HANDLER_SUPPORT(CBlastxOptionsHandle)   
  262. OPT_HANDLER_SUPPORT(CTBlastxOptionsHandle)  
  263. OPT_HANDLER_END()
  264. // Translated DB (tblastx, tblastn)
  265. #define OPT_HANDLER_SUPPORT_TRD(NAME)       
  266. OPT_HANDLER_START(NAME, V)                  
  267. OPT_HANDLER_SUPPORT(CTBlastnOptionsHandle)  
  268. OPT_HANDLER_SUPPORT(CTBlastxOptionsHandle)  
  269. OPT_HANDLER_END()
  270. // CRemoteBlast option .. i.e. a program option rather than an
  271. // algorithmic option.  Because it is sent to CRemoteBlast, it does
  272. // not need to deal with Protein vs. Nucleot; rather, it needs to
  273. // support only the CRemoteBlast type.  Only EXPR type is defined.
  274. #define OPT_HANDLER_RB_EXPR(NAME,EXPR) 
  275. OPT_HANDLER_START(NAME, EXPR)          
  276. OPT_HANDLER_SUPPORT(CRemoteBlast)      
  277. OPT_HANDLER_END()
  278. // CBlastOptions based handlers
  279. OPT_HANDLER_SUPPORT_ALL(GapOpeningCost);
  280. OPT_HANDLER_SUPPORT_ALL(GapExtensionCost);
  281. OPT_HANDLER_SUPPORT_ALL(WordSize);
  282. OPT_HANDLER_EXPR_ALL   (MatrixName, V.c_str());
  283. OPT_HANDLER_SUPPORT_TRQ(QueryGeneticCode);
  284. OPT_HANDLER_SUPPORT_TRD(DbGeneticCode);
  285. OPT_HANDLER_EXPR_ALL   (EffectiveSearchSpace, (long long) V);
  286. OPT_HANDLER_EXPR_ALL   (FilterString, V.c_str());
  287. OPT_HANDLER_SUPPORT_ALL(GappedMode);
  288. OPT_HANDLER_SUPPORT_ALL(HitlistSize);
  289. OPT_HANDLER_SUPPORT_ALL(EvalueThreshold);
  290. // Nucleotide only
  291. OPT_HANDLER_SUPPORT_NUCL(MismatchPenalty);
  292. OPT_HANDLER_SUPPORT_NUCL(MatchReward);
  293. // CBlast4Options based handlers
  294. OPT_HANDLER_RB_EXPR(EntrezQuery, V.c_str());
  295. class CNetblastSearchOpts
  296. {
  297. public:
  298.     /// Default constructor - used by CreateInterface().
  299.     CNetblastSearchOpts(void)
  300.     {
  301.     }
  302.     
  303.     /// CArgs constructor - reads the values from the provided CArgs object.
  304.     CNetblastSearchOpts(const CArgs & a);
  305.     
  306.     /// Create an interface for the program based on parameters in Apply().
  307.     static void CreateInterface(CArgDescriptions & ui);
  308.     
  309.     /// Apply the operation specified by "op" to each search option.
  310.     ///
  311.     
  312.     /// This will apply the operation specified by "op" (which is
  313.     /// probably derived from OptionWalker) to each search option.
  314.     /// The object should have methods Local(), Remote(), and Same(),
  315.     /// which take 4, 2, and 5 parameters) respectively.  To add a new
  316.     /// option, you should another op.xxx() line here (or for remote
  317.     /// options, calculate the field's value (possibly from local
  318.     /// options) in the section marked "Computations & Remote values").
  319.     /// @param op Object defining an operation over the search options.
  320.     /// @sa OptionWalker, InterfaceBuilder, OptionReader, SearchParamBuilder.
  321.     
  322.     // Non-remote versions don't need to know about the algo/blast/api
  323.     // class objects, so we send null CRef<>s here.
  324.     
  325.     template <class OpWlkTp>
  326.     void Apply(OpWlkTp & op)
  327.     {
  328.         // This could perhaps be done better..
  329.         CRef<CRemoteBlast> cb4o;
  330.         Apply(op, cb4o, cb4o);
  331.     }
  332.     
  333.     template <class OpWlkTp, class BlOptTp>
  334.     void Apply(OpWlkTp            & op,
  335.                CRef<BlOptTp>        cboh,
  336.                CRef<CRemoteBlast>   cb4o)
  337.     {
  338.         // Local values
  339.         
  340.         op.Local(m_Evalue,
  341.                  CUserOpt("E"),
  342.                  CArgKey ("ExpectValue"),
  343.                  COptDesc("Expect value (cutoff)."));
  344.         
  345.         op.Same(m_GapOpen,
  346.                 CUserOpt("gap_open"),
  347.                 COptHandler_GapOpeningCost<BlOptTp>(),
  348.                 CArgKey ("GapOpenCost"),
  349.                 COptDesc("Gap-open cost."),
  350.                 cboh);
  351.         
  352.         op.Same(m_GapExtend,
  353.                 CUserOpt("gap_extend"),
  354.                 COptHandler_GapExtensionCost<BlOptTp>(),
  355.                 CArgKey ("GapExtendCost"),
  356.                 COptDesc("Gap-extend cost."),
  357.                 cboh);
  358.         
  359.         op.Same(m_WordSize,
  360.                 CUserOpt("wordsize"),
  361.                 COptHandler_WordSize<BlOptTp>(),
  362.                 CArgKey ("WordSize"),
  363.                 COptDesc("Word size."),
  364.                 cboh);
  365.         
  366.         op.Same(m_MatrixName,
  367.                 CUserOpt("matrixname"),
  368.                 COptHandler_MatrixName<BlOptTp>(),
  369.                 CArgKey ("MatrixName"),
  370.                 COptDesc("Search frequency matrix (name of matrix)."),
  371.                 cboh);
  372.         
  373.         op.Same(m_NucPenalty,
  374.                 CUserOpt("nucpenalty"),
  375.                 COptHandler_MismatchPenalty<BlOptTp>(),
  376.                 CArgKey ("NucPenalty"),
  377.                 COptDesc("Penalty for a nucleotide mismatch (blastn only)."),
  378.                 cboh);
  379.         
  380.         op.Same(m_NucReward,
  381.                 CUserOpt("nucreward"),
  382.                 COptHandler_MatchReward<BlOptTp>(),
  383.                 CArgKey ("NucReward"),
  384.                 COptDesc("Reward for a nucleotide match (blastn only)."),
  385.                 cboh);
  386.         
  387.         op.Local(m_NumDesc,
  388.                  CUserOpt("numdesc"),
  389.                  CArgKey ("NumDesc"),
  390.                  COptDesc("Number of one line database sequence descriptions to show."));
  391.         
  392.         op.Local(m_NumAlgn,
  393.                  CUserOpt("numalign"),
  394.                  CArgKey ("NumAligns"),
  395.                  COptDesc("Number of database sequence alignments to show."));
  396.         
  397.         op.Local(m_Gapped,
  398.                  CUserOpt("gapped"),
  399.                  CArgKey ("GappedAlign"),   
  400.                  COptDesc("Perform gapped alignment."));
  401.         
  402.         op.Same(m_QuGenCode,
  403.                 CUserOpt("qugencode"),
  404.                 COptHandler_QueryGeneticCode<BlOptTp>(),    
  405.                 CArgKey ("QuGenCode"),     
  406.                 COptDesc("Query Genetic code to use."),
  407.                 cboh);
  408.         
  409.         op.Same(m_DbGenCode,
  410.                 CUserOpt("dbgencode"),
  411.                 COptHandler_DbGeneticCode<BlOptTp>(), 
  412.                 CArgKey ("DbGenCode"),     
  413.                 COptDesc("DB Genetic code to use."),
  414.                 cboh);
  415.         
  416.         op.Same(m_Searchspc,
  417.                 CUserOpt("searchspc"),
  418.                 COptHandler_EffectiveSearchSpace<BlOptTp>(),
  419.                 CArgKey ("SearchSpc"),
  420.                 COptDesc("Effective length of the search space."),
  421.                 cboh);
  422.         
  423. #if 0
  424.         op.Same(m_PhiQuery,
  425.                 CUserOpt("phi_query"),
  426.                 COptHandler_PHIPattern<BlOptTp>(),
  427.                 CArgKey ("PhiQuery"),
  428.                 COptDesc("Pattern Hit Initiated search expression."),
  429.                 cboh);
  430. #endif
  431.         
  432.         op.Same(m_FilterString,
  433.                 CUserOpt("filter_string"),
  434.                 COptHandler_FilterString<BlOptTp>(),
  435.                 CArgKey ("FilterString"),
  436.                 COptDesc("Specifies the types of filtering to do."),
  437.                 cboh);
  438.         
  439.         op.Same(m_EntrezQuery,
  440.                 CUserOpt("entrez_query"),
  441.                 COptHandler_EntrezQuery<BlOptTp>(),
  442.                 CArgKey ("EntrezQuery"),
  443.                 COptDesc("Search only in entries matching this Entrez query."),
  444.                 cb4o);
  445.         
  446.         // Computations & Remote values
  447.         
  448.         if (op.NeedRemote()) {
  449.             // Gapped is the default ---- Note that BlastAPI and netblast
  450.             // disagree on this point.. may one day erupt in violence.
  451.             
  452.             op.Remote(m_Gapped,
  453.                       COptHandler_GappedMode<BlOptTp>(),
  454.                       cboh);
  455.             
  456.             // Network only needs max
  457.             TOptInteger num_hits = TOptInteger::Max(m_NumAlgn, m_NumDesc);
  458.             op.Remote(num_hits,
  459.                       COptHandler_HitlistSize<BlOptTp>(),
  460.                       cboh);
  461.             
  462.             if (m_Evalue.Exists()) {
  463.                 typedef objects::CBlast4_cutoff TCutoff;
  464.                 CRef<TCutoff> cutoff(new TCutoff);
  465.                 cutoff->SetE_value(m_Evalue.GetValue());
  466.                 
  467.                 COptional< CRef<TCutoff> > cutoff_opt(cutoff);
  468.                 
  469.                 op.Remote(cutoff_opt,
  470.                           COptHandler_EvalueThreshold<BlOptTp>(),
  471.                           cboh);
  472.             }
  473.         }
  474.     }
  475.     
  476.     /// Get the number of alignments to display.
  477.     TOptInteger NumAligns(void)
  478.     {
  479.         return m_NumAlgn;
  480.     }
  481.     
  482.     /// Returns gapped alignment flag.
  483.     TOptBool Gapped(void)
  484.     {
  485.         return m_Gapped;
  486.     }
  487.     
  488. private:
  489.     // Optional search parameters
  490.     
  491.     TOptDouble  m_Evalue;
  492.     TOptInteger m_GapOpen;
  493.     TOptInteger m_GapExtend;
  494.     TOptInteger m_WordSize;
  495.     TOptString  m_MatrixName;
  496.     TOptInteger m_NucPenalty;
  497.     TOptInteger m_NucReward;
  498.     TOptInteger m_NumDesc;
  499.     TOptInteger m_NumAlgn;
  500.     TOptInteger m_Thresh;
  501.     TOptBool    m_Gapped;
  502.     TOptInteger m_QuGenCode;
  503.     TOptInteger m_DbGenCode;
  504.     TOptBool    m_BelieveDef;
  505.     TOptDouble  m_Searchspc;
  506.     TOptString  m_PhiQuery;
  507.     TOptString  m_FilterString;
  508.     TOptString  m_EntrezQuery;
  509.         
  510.     /// Internal method used by CreateInterface.
  511.     void x_CreateInterface2(CArgDescriptions & ui);
  512. };
  513. /*
  514.  * ===========================================================================
  515.  *
  516.  * $Log: search_opts.hpp,v $
  517.  * Revision 1000.1  2004/04/16 17:12:31  gouriano
  518.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  519.  *
  520.  * Revision 1.5  2004/04/16 14:30:03  bealer
  521.  * - Fix compiler warnings.
  522.  *
  523.  * Revision 1.4  2004/04/15 21:18:56  bealer
  524.  * - Remove semi-colons so that solaris compiler will not choke.
  525.  *
  526.  * Revision 1.3  2004/03/16 19:41:56  vasilche
  527.  * Namespace qualifier is invalid in extern declaration. Removed extra semicolons
  528.  *
  529.  * Revision 1.2  2004/02/18 18:29:59  bealer
  530.  * - Fix entrez query and add support (to Apply) for Remote Blast program
  531.  *   options.
  532.  *
  533.  * Revision 1.1  2004/02/18 17:04:43  bealer
  534.  * - Adapt blast_client code for Remote Blast API, merging code into the
  535.  *   remote_blast demo application.
  536.  *
  537.  * ===========================================================================
  538.  */
  539. END_NCBI_SCOPE
  540. #endif // ALGO_BLAST_API_DEMO___SEARCH_OPTS__HPP