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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: search_opts.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/12 17:30:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef APP_BLAST_CLIENT___SEARCH_OPTS__HPP
  10. #define APP_BLAST_CLIENT___SEARCH_OPTS__HPP
  11. /*  $Id: search_opts.hpp,v 1000.3 2004/04/12 17:30:16 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 blast_client.  Adding a new search parameter
  46. /// should require modifications to ONLY this file.  This works toward
  47. /// the OOP goal of designing interfaces and encapsulation in such a
  48. /// way as to isolate parts of the program that will change.
  49. #include "optional.hpp"
  50. #include <objects/blast/Blast4_cutoff.hpp>
  51. BEGIN_NCBI_SCOPE
  52. class CStringLit
  53. {
  54. public:
  55.     explicit CStringLit(const char * x)
  56.         : m_ptr(x)
  57.     {
  58.     }
  59.     
  60.     operator const char *(void)
  61.     {
  62.         return m_ptr;
  63.     }
  64.     
  65.     operator string(void)
  66.     {
  67.         return string(m_ptr);
  68.     }
  69. private:
  70.     const char * m_ptr;
  71. };
  72. class CUserOpt : public CStringLit
  73. {
  74. public:
  75.     explicit CUserOpt(const char * x)
  76.         : CStringLit(x)
  77.     {
  78.     }
  79. };
  80. class CNetName : public CStringLit
  81. {
  82. public:
  83.     explicit CNetName(const char * x)
  84.         : CStringLit(x)
  85.     {
  86.     }
  87. };
  88. class CArgKey : public CStringLit
  89. {
  90. public:
  91.     explicit CArgKey(const char * x)
  92.         : CStringLit(x)
  93.     {
  94.     }
  95. };
  96. class COptDesc : public CStringLit
  97. {
  98. public:
  99.     explicit COptDesc(const char * x)
  100.         : CStringLit(x)
  101.     {
  102.     }
  103. };
  104. enum EListPick {
  105.     EListAlgo = 1,
  106.     EListProg
  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 blast_client.
  176. ///
  177. /// This class stores optional search parameters for blast_client.
  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. class CNetblastSearchOpts
  192. {
  193. public:
  194.     /// Default constructor - used by CreateInterface().
  195.     CNetblastSearchOpts(void)
  196.     {
  197.     }
  198.     
  199.     /// CArgs constructor - reads the values from the provided CArgs object.
  200.     CNetblastSearchOpts(const CArgs & a);
  201.     
  202.     /// Create an interface for the program based on parameters in Apply().
  203.     static void CreateInterface(CArgDescriptions & ui);
  204.     
  205.     /// Apply the operation specified by "op" to each search option.
  206.     ///
  207.     /// This will apply the operation specified by "op" (which is
  208.     /// probably derived from OptionWalker) to each search option.
  209.     /// The object should have methods Local(), Remote(), and Same(),
  210.     /// which take 4, 2, and 5 parameters) respectively.  To add a new
  211.     /// option, you should another op.xxx() line here (or for remote
  212.     /// options, calculate the field's value (possibly from local
  213.     /// options) in the section marked "Computations & Remote values").
  214.     /// @param op Object defining an operation over the search options.
  215.     /// @sa OptionWalker, InterfaceBuilder, OptionReader, SearchParamBuilder.
  216.     template <class T>
  217.     void Apply(T & op)
  218.     {
  219.         // Local values
  220.         
  221.         op.Local(m_Evalue,
  222.                  CUserOpt("E"),
  223.                  CArgKey ("ExpectValue"),
  224.                  COptDesc("Expect value (cutoff)."));
  225.         
  226.         op.Same (m_GapOpen,
  227.                  CUserOpt("gap_open"),
  228.                  CNetName("gap-open"),
  229.                  CArgKey ("GapOpenCost"),
  230.                  COptDesc("Gap-open cost."),
  231.                  EListAlgo);
  232.         
  233.         op.Same (m_GapExtend,
  234.                  CUserOpt("gap_extend"),
  235.                  CNetName("gap-extend"),
  236.                  CArgKey ("GapExtendCost"),
  237.                  COptDesc("Gap-extend cost."),
  238.                  EListAlgo);
  239.         
  240.         op.Same (m_WordSize,
  241.                  CUserOpt("wordsize"),
  242.                  CNetName("word-size"),
  243.                  CArgKey ("WordSize"),
  244.                  COptDesc("Word size."),
  245.                  EListAlgo);
  246.         
  247.         op.Same (m_Matrix,
  248.                  CUserOpt("matrix"),
  249.                  CNetName("matrix"),
  250.                  CArgKey ("Matrix"),
  251.                  COptDesc("Search frequency matrix."),
  252.                  EListAlgo);
  253.         
  254.         op.Same (m_NucPenalty,
  255.                  CUserOpt("nucpenalty"),
  256.                  CNetName("nucl-penalty"),
  257.                  CArgKey ("NucPenalty"),
  258.                  COptDesc("Penalty for a nucleotide mismatch (blastn only)."),
  259.                  EListAlgo);
  260.         
  261.         op.Same (m_NucReward,
  262.                  CUserOpt("nucreward"),
  263.                  CNetName("nucl-reward"),
  264.                  CArgKey ("NucReward"),
  265.                  COptDesc("Reward for a nucleotide match (blastn only)."),
  266.                  EListAlgo);
  267.         
  268.         op.Local(m_NumDesc,
  269.                  CUserOpt("numdesc"),
  270.                  CArgKey ("NumDesc"),
  271.                  COptDesc("Number of one line database sequence descriptions to show."));
  272.         
  273.         op.Local(m_NumAlgn,
  274.                  CUserOpt("numalign"),
  275.                  CArgKey ("NumAligns"),
  276.                  COptDesc("Number of database sequence alignments to show."));
  277.         
  278.         op.Local(m_Gapped,
  279.                  CUserOpt("gapped"),
  280.                  CArgKey ("GappedAlign"),   
  281.                  COptDesc("Perform gapped alignment."));
  282.         
  283.         op.Same (m_QuGenCode,
  284.                  CUserOpt("qugencode"),
  285.                  CNetName("genetic-code"),    
  286.                  CArgKey ("QuGenCode"),     
  287.                  COptDesc("Query Genetic code to use."),
  288.                  EListAlgo);
  289.         
  290.         op.Same (m_DbGenCode,
  291.                  CUserOpt("dbgencode"),
  292.                  CNetName("db-genetic-code"), 
  293.                  CArgKey ("DbGenCode"),     
  294.                  COptDesc("DB Genetic code to use."),
  295.                  EListAlgo);
  296.         
  297.         op.Same (m_Searchspc,
  298.                  CUserOpt("searchspc"),
  299.                  CNetName("searchsp-eff"),    
  300.                  CArgKey ("SearchSpc"),     
  301.                  COptDesc("Effective length of the search space."),
  302.                  EListProg);
  303.         
  304.         op.Same (m_PhiQuery,
  305.                  CUserOpt("phi_query"),
  306.                  CNetName("phi-pattern"),     
  307.                  CArgKey ("PhiQuery"),      
  308.                  COptDesc("Pattern Hit Initiated search expression."),
  309.                  EListAlgo);
  310.         
  311.         op.Same (m_FilterString,
  312.                  CUserOpt("filter_string"),
  313.                  CNetName("filter"),
  314.                  CArgKey ("FilterString"),
  315.                  COptDesc("Specifies the types of filtering to do."),
  316.                  EListAlgo);
  317.         
  318.         op.Same (m_EntrezQuery,
  319.                  CUserOpt("entrez_query"),
  320.                  CNetName("entrez-query"),
  321.                  CArgKey ("EntrezQuery"),
  322.                  COptDesc("Search only in entries matching this Entrez query."),
  323.                  EListProg);
  324.         
  325.         // Computations & Remote values
  326.         
  327.         if (op.NeedRemote()) {
  328.             // Gapped is the default
  329.             TOptBool ungapped = TOptBool::Invert(m_Gapped);
  330.             op.Remote(ungapped, CNetName("ungapped-alignment"), EListAlgo);
  331.             
  332.             // Network only needs max
  333.             TOptInteger num_hits = TOptInteger::Max(m_NumAlgn, m_NumDesc);
  334.             op.Remote(num_hits, CNetName("hitlist-size"), EListProg);
  335.             
  336.             if (m_Evalue.Exists()) {
  337.                 typedef objects::CBlast4_cutoff TCutoff;
  338.                 CRef<TCutoff> cutoff(new TCutoff);
  339.                 cutoff->SetE_value(m_Evalue.GetValue());
  340.                 
  341.                 COptional< CRef<TCutoff> > cutoff_opt(cutoff);
  342.                 
  343.                 op.Remote(cutoff_opt, CNetName("cutoff"), EListAlgo);
  344.             }
  345.         }
  346.     }
  347.     
  348.     /// Get the number of alignments to display.
  349.     TOptInteger NumAligns(void)
  350.     {
  351.         return m_NumAlgn;
  352.     }
  353.     
  354.     /// Returns gapped alignment flag.
  355.     TOptBool Gapped(void)
  356.     {
  357.         return m_Gapped;
  358.     }
  359.     
  360. private:
  361.     // Optional search parameters
  362.     
  363.     TOptDouble  m_Evalue;
  364.     TOptInteger m_GapOpen;
  365.     TOptInteger m_GapExtend;
  366.     TOptInteger m_WordSize;
  367.     TOptString  m_Matrix;
  368.     TOptInteger m_NucPenalty;
  369.     TOptInteger m_NucReward;
  370.     TOptInteger m_NumDesc;
  371.     TOptInteger m_NumAlgn;
  372.     TOptInteger m_Thresh;
  373.     TOptBool    m_Gapped;
  374.     TOptInteger m_QuGenCode;
  375.     TOptInteger m_DbGenCode;
  376.     TOptBool    m_BelieveDef;
  377.     TOptDouble  m_Searchspc;
  378.     TOptString  m_PhiQuery;
  379.     TOptString  m_FilterString;
  380.     TOptString  m_EntrezQuery;
  381.         
  382.     /// Internal method used by CreateInterface.
  383.     void x_CreateInterface2(CArgDescriptions & ui);
  384. };
  385. /*
  386.  * ===========================================================================
  387.  *
  388.  * $Log: search_opts.hpp,v $
  389.  * Revision 1000.3  2004/04/12 17:30:16  gouriano
  390.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  391.  *
  392.  * Revision 1.5  2003/12/29 19:48:30  bealer
  393.  * - Change code to accomodate first half of new ASN changes.
  394.  *
  395.  * Revision 1.4  2003/11/21 20:42:13  bealer
  396.  * - Add entrez_query option to blast_client
  397.  *
  398.  * Revision 1.3  2003/11/13 22:59:18  bealer
  399.  * - Remove 'default' handling from filter string option - convert into a
  400.  *   type 'Same' parameter.
  401.  *
  402.  * Revision 1.2  2003/11/10 23:10:10  bealer
  403.  * - Add filter_string option w/ default to "L;"
  404.  *
  405.  * Revision 1.1  2003/09/26 16:53:49  bealer
  406.  * - Add blast_client project for netblast protocol, initial code commit.
  407.  *
  408.  * ===========================================================================
  409.  */
  410. END_NCBI_SCOPE
  411. #endif // APP_BLAST_CLIENT___SEARCH_OPTS__HPP