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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast2seq.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 18:06:32  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.46
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast2seq.cpp,v 1000.5 2004/06/01 18:06:32 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:  Christiam Camacho
  35.  *
  36.  */
  37. /** @file blast2seq.cpp
  38.  * Main driver for blast2sequences C++ interface
  39.  */
  40. static char const rcsid[] = 
  41.     "$Id: blast2seq.cpp,v 1000.5 2004/06/01 18:06:32 gouriano Exp $";
  42. #include <ncbi_pch.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <corelib/ncbienv.hpp>
  45. #include <corelib/ncbiargs.hpp>
  46. #include <serial/iterator.hpp>
  47. #include <objmgr/object_manager.hpp>
  48. #include <objmgr/scope.hpp>
  49. #include <objmgr/seq_vector.hpp>
  50. #include <objtools/data_loaders/genbank/gbloader.hpp>
  51. #include <objmgr/util/sequence.hpp>
  52. #include <corelib/ncbitime.hpp>
  53. #include <objtools/readers/fasta.hpp>
  54. #include <algo/blast/api/bl2seq.hpp>
  55. #include <algo/blast/api/blast_options.hpp>
  56. #include <algo/blast/api/blast_nucl_options.hpp>
  57. #include "blast_input.hpp"
  58. #include <objects/seqalign/Seq_align_set.hpp>
  59. USING_NCBI_SCOPE;
  60. USING_SCOPE(blast);
  61. USING_SCOPE(objects);
  62. /////////////////////////////////////////////////////////////////////////////
  63. /// CBlast2seqApplication: command line blast2sequences application
  64. /// @todo Implement formatting
  65. /// @todo refactor command line options, so that only those relevant to a
  66. /// particular program are shown (e.g: cvs -H command). This should be
  67. /// reusable by all BLAST command line clients
  68. class CBlast2seqApplication : public CNcbiApplication
  69. {
  70. private:
  71.     virtual void Init(void);
  72.     virtual int  Run(void);
  73.     virtual void Exit(void);
  74.     void InitObjMgr(void);
  75.     EProgram GetBlastProgramNum(const string& prog);
  76.     CBlastOptionsHandle* ProcessCommandLineArgs() THROWS((CBlastException));
  77. #ifndef NDEBUG
  78.     FILE* GetOutputFilePtr(void); // needed for debugging only
  79. #endif
  80.     CRef<CObjectManager>    m_ObjMgr;
  81.     CRef<CScope>            m_Scope;
  82. };
  83. void CBlast2seqApplication::Init(void)
  84. {
  85.     HideStdArgs(fHideLogfile | fHideConffile | fHideVersion);
  86.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  87.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  88.                               "Compares 2 sequence using the BLAST algorithm");
  89.     // Program type
  90.     arg_desc->AddKey("program", "p", "Type of BLAST program",
  91.             CArgDescriptions::eString);
  92.     arg_desc->SetConstraint
  93.         ("program", &(*new CArgAllow_Strings, 
  94.                 "blastp", "blastn", "blastx", "tblastn", "tblastx"));
  95.     // Query sequence
  96.     arg_desc->AddDefaultKey("query", "q", "Query file name",
  97.             CArgDescriptions::eInputFile, "-", CArgDescriptions::fPreOpen);
  98.     // Subject(s) sequence(s)
  99.     arg_desc->AddKey("subject", "s", "Subject(s) file name",
  100.             CArgDescriptions::eInputFile, CArgDescriptions::fPreOpen);
  101.     // Copied from blast_app
  102.     arg_desc->AddDefaultKey("strand", "strand", 
  103.         "Query strands to search: 1 forward, 2 reverse, 0,3 both",
  104.         CArgDescriptions::eInteger, "0");
  105.     arg_desc->SetConstraint("strand", new CArgAllow_Integers(0,3));
  106.     arg_desc->AddDefaultKey("filter", "filter", "Filtering option",
  107.                             CArgDescriptions::eString, "T");
  108.     arg_desc->AddDefaultKey("lcase", "lcase", "Should lower case be masked?",
  109.                             CArgDescriptions::eBoolean, "F");
  110.     arg_desc->AddDefaultKey("lookup", "lookup", 
  111.         "Type of lookup table: 0 default, 1 megablast",
  112.         CArgDescriptions::eInteger, "0");
  113.     arg_desc->AddDefaultKey("matrix", "matrix", "Scoring matrix name",
  114.                             CArgDescriptions::eString, "BLOSUM62");
  115.     arg_desc->AddDefaultKey("mismatch", "penalty", "Penalty score for a mismatch",
  116.                             CArgDescriptions::eInteger, "0");
  117.     arg_desc->AddDefaultKey("match", "reward", "Reward score for a match",
  118.                             CArgDescriptions::eInteger, "0");
  119.     arg_desc->AddDefaultKey("word", "wordsize", "Word size",
  120.                             CArgDescriptions::eInteger, "0");
  121.     arg_desc->AddDefaultKey("templen", "templen", 
  122.         "Discontiguous word template length",
  123.         CArgDescriptions::eInteger, "0");
  124.     arg_desc->SetConstraint("templen", 
  125.                             &(*new CArgAllow_Strings, "0", "16", "18", "21"));
  126.     arg_desc->AddDefaultKey("templtype", "templtype", 
  127.         "Discontiguous word template type",
  128.         CArgDescriptions::eInteger, "0");
  129.     arg_desc->SetConstraint("templtype", new CArgAllow_Integers(0,2));
  130.     arg_desc->AddDefaultKey("thresh", "threshold", 
  131.         "Score threshold for neighboring words",
  132.         CArgDescriptions::eInteger, "0");
  133.     arg_desc->AddDefaultKey("window","window", "Window size for two-hit extension",
  134.                             CArgDescriptions::eInteger, "0");
  135.     arg_desc->AddDefaultKey("scantype", "scantype", 
  136.         "Method for scanning the database: 0 traditional, 1 AG",
  137.         CArgDescriptions::eInteger, "1");
  138.     arg_desc->SetConstraint("scantype", new CArgAllow_Integers(0,1));
  139.     arg_desc->AddDefaultKey("varword", "varword", 
  140.         "Should variable word size be used?",
  141.         CArgDescriptions::eBoolean, "F");
  142.     arg_desc->AddDefaultKey("stride","stride", "Database scanning stride",
  143.                             CArgDescriptions::eInteger, "0");
  144.     arg_desc->AddDefaultKey("xungap", "xungapped", 
  145.         "X-dropoff value for ungapped extensions",
  146.         CArgDescriptions::eDouble, "0");
  147.     arg_desc->AddDefaultKey("ungapped", "ungapped", 
  148.         "Perform only an ungapped alignment search?",
  149.         CArgDescriptions::eBoolean, "F");
  150.     arg_desc->AddDefaultKey("greedy", "greedy", 
  151.         "Use greedy algorithm for gapped extensions: 0 no, 1 one-step, 2 two-step, 3 two-step with ungapped",
  152.         CArgDescriptions::eInteger, "0");
  153.     arg_desc->AddDefaultKey("gopen", "gapopen", "Penalty for opening a gap",
  154.                             CArgDescriptions::eInteger, "0");
  155.     arg_desc->AddDefaultKey("gext", "gapext", "Penalty for extending a gap",
  156.                             CArgDescriptions::eInteger, "0");
  157.     arg_desc->AddDefaultKey("xgap", "xdrop", 
  158.         "X-dropoff value for preliminary gapped extensions",
  159.         CArgDescriptions::eDouble, "0");
  160.     arg_desc->AddDefaultKey("xfinal", "xfinal", 
  161.         "X-dropoff value for final gapped extensions with traceback",
  162.         CArgDescriptions::eDouble, "0");
  163.     arg_desc->AddDefaultKey("evalue", "evalue", 
  164.         "E-value threshold for saving hits",
  165.         CArgDescriptions::eDouble, "0");
  166.     arg_desc->AddDefaultKey("searchsp", "searchsp", 
  167.         "Virtual search space to be used for statistical calculations",
  168.         CArgDescriptions::eDouble, "0");
  169.     arg_desc->AddDefaultKey("perc", "percident", 
  170.         "Percentage of identities cutoff for saving hits",
  171.         CArgDescriptions::eDouble, "0");
  172.     arg_desc->AddDefaultKey("descr", "descriptions",
  173.         "How many matching sequence descriptions to show?",
  174.         CArgDescriptions::eInteger, "500");
  175.     arg_desc->AddDefaultKey("align", "alignments", 
  176.         "How many matching sequence alignments to show?",
  177.         CArgDescriptions::eInteger, "250");
  178.     arg_desc->AddDefaultKey("out", "out", "File name for writing output",
  179.         CArgDescriptions::eOutputFile, "-", CArgDescriptions::fPreOpen);
  180.     arg_desc->AddDefaultKey("format", "format", 
  181.         "How to format the results?",
  182.         CArgDescriptions::eInteger, "0");
  183.     arg_desc->AddDefaultKey("html", "html", "Produce HTML output?",
  184.                             CArgDescriptions::eBoolean, "F");
  185.     arg_desc->AddDefaultKey("gencode", "gencode", "Query genetic code",
  186.                             CArgDescriptions::eInteger, "0");
  187.     arg_desc->AddDefaultKey("dbgencode", "dbgencode", "Database genetic code",
  188.                             CArgDescriptions::eInteger, "0");
  189.     arg_desc->AddDefaultKey("maxintron", "maxintron", 
  190.                             "Longest allowed intron length for linking HSPs",
  191.                             CArgDescriptions::eInteger, "0");
  192.     arg_desc->AddDefaultKey("frameshift", "frameshift",
  193.                             "Frame shift penalty (blastx only)",
  194.                             CArgDescriptions::eInteger, "0");
  195.     arg_desc->AddOptionalKey("asnout", "seqalignasn", 
  196.         "File name for writing the seqalign results in ASN.1 form",
  197.         CArgDescriptions::eOutputFile);
  198.     // Debug parameters
  199.     arg_desc->AddFlag("trace", "Tracing enabled?", true);
  200.     SetupArgDescriptions(arg_desc.release());
  201. }
  202. void 
  203. CBlast2seqApplication::InitObjMgr(void)
  204. {
  205.     m_ObjMgr.Reset(new CObjectManager);
  206.     m_ObjMgr->RegisterDataLoader(*new CGBDataLoader, CObjectManager::eDefault);
  207. }
  208. EProgram
  209. CBlast2seqApplication::GetBlastProgramNum(const string& prog)
  210. {
  211.     if (prog == "blastp")
  212.         return eBlastp;
  213.     if (prog == "blastn")
  214.         return eBlastn;
  215.     if (prog == "blastx")
  216.         return eBlastx;
  217.     if (prog == "tblastn")
  218.         return eTblastn;
  219.     if (prog == "tblastx")
  220.         return eTblastx;
  221.     return eBlastProgramMax;
  222. }
  223. CBlastOptionsHandle*
  224. CBlast2seqApplication::ProcessCommandLineArgs() THROWS((CBlastException))
  225. {
  226.     CArgs args = GetArgs();
  227.     EProgram prog = GetBlastProgramNum(args["program"].AsString());
  228.     CBlastOptionsHandle* retval = CBlastOptionsFactory::Create(prog);
  229.     if ( !retval ) {
  230.         NCBI_THROW(CBlastException, eOutOfMemory, "");
  231.     }
  232.     CBlastOptions& opt = retval->SetOptions();
  233.     if (args["strand"].AsInteger()) {
  234.         switch (args["strand"].AsInteger()) {
  235.         case 1: opt.SetStrandOption(eNa_strand_plus); break;
  236.         case 2: opt.SetStrandOption(eNa_strand_minus); break;
  237.         case 3: opt.SetStrandOption(eNa_strand_both); break;
  238.         default: abort();
  239.         }
  240.     }
  241.     opt.SetFilterString(args["filter"].AsString().c_str());
  242.     // FIXME: Handle lcase masking
  243.     if (args["lookup"].AsInteger()) {
  244.         opt.SetLookupTableType(args["lookup"].AsInteger());
  245.     }
  246.     if (args["matrix"]) {
  247.         opt.SetMatrixName(args["matrix"].AsString().c_str());
  248.     }
  249.     if (args["mismatch"].AsInteger()) {
  250.         opt.SetMismatchPenalty(args["mismatch"].AsInteger());
  251.     }
  252.     if (args["match"].AsInteger()) {
  253.         opt.SetMatchReward(args["match"].AsInteger());
  254.     }
  255.     if (args["word"].AsInteger()) {
  256.         opt.SetWordSize(args["word"].AsInteger());
  257.     }
  258.     if (args["templen"].AsInteger()) {
  259.         opt.SetMBTemplateLength(args["templen"].AsInteger());
  260.     }
  261.     if (args["templtype"].AsInteger()) {
  262.         opt.SetMBTemplateType(args["templtype"].AsInteger());
  263.     }
  264.     if (args["thresh"].AsInteger()) {
  265.         opt.SetWordThreshold(args["thresh"].AsInteger());
  266.     }
  267.     if (args["window"].AsInteger()) {
  268.         opt.SetWindowSize(args["window"].AsInteger());
  269.     }
  270.     // The next 3 apply to nucleotide searches only
  271.     string program = args["program"].AsString();
  272.     if (program == "blastn") {
  273.         // Setting seed extension method involves changing the scanning 
  274.         // stride as well, which is handled in the derived 
  275.         // CBlastNucleotideOptionsHandle class, but not in the base
  276.         // CBlastOptionsHandle class.
  277.         CBlastNucleotideOptionsHandle* opts_handle = 
  278.             dynamic_cast<CBlastNucleotideOptionsHandle*>(retval);
  279.         if (!args["templen"].AsInteger()) {
  280.             opt.SetVariableWordSize(args["varword"].AsBoolean());
  281.             switch(args["scantype"].AsInteger()) {
  282.             case 1:
  283.                 opts_handle->SetSeedExtensionMethod(eRightAndLeft);
  284.                 break;
  285.             default:
  286.                 opts_handle->SetSeedExtensionMethod(eRight);
  287.                 break;
  288.             }
  289.         } else {
  290.             // Discontiguous Mega BLAST: only one extension method.
  291.             opts_handle->SetSeedExtensionMethod(eRight); 
  292.         }
  293.         // Override the scan step value if it is set by user
  294.         if (args["stride"].AsInteger()) {
  295.             opt.SetScanStep(args["stride"].AsInteger());
  296.         }
  297.     }
  298.     if (args["xungap"].AsDouble()) {
  299.         opt.SetXDropoff(args["xungap"].AsDouble());
  300.     }
  301.     if (args["ungapped"].AsBoolean()) {
  302.         opt.SetGappedMode(false);
  303.     }
  304.     if (args["gopen"].AsInteger()) {
  305.         opt.SetGapOpeningCost(args["gopen"].AsInteger());
  306.     }
  307.     if (args["gext"].AsInteger()) {
  308.         opt.SetGapExtensionCost(args["gext"].AsInteger());
  309.     }
  310.     switch (args["greedy"].AsInteger()) {
  311.     case 1: /* Immediate greedy gapped extension with traceback */
  312.         opt.SetGapExtnAlgorithm(eGreedyWithTracebackExt);
  313.         opt.SetUngappedExtension(false);
  314.         break;
  315.     case 2: /* Two-step greedy extension, no ungapped extension */
  316.         opt.SetGapExtnAlgorithm(eGreedyExt);
  317.         opt.SetUngappedExtension(false);
  318.         break;
  319.     case 3: /* Two-step greedy extension after ungapped extension*/
  320.         opt.SetGapExtnAlgorithm(eGreedyExt);
  321.         break;
  322.     default: break;
  323.     }
  324.     if (args["xgap"].AsDouble()) {
  325.         opt.SetGapXDropoff(args["xgap"].AsDouble());
  326.     }
  327.     if (args["xfinal"].AsDouble()) {
  328.         opt.SetGapXDropoffFinal(args["xfinal"].AsDouble());
  329.     }
  330.     if (args["evalue"].AsDouble()) {
  331.         opt.SetEvalueThreshold(args["evalue"].AsDouble());
  332.     }
  333.     if (args["searchsp"].AsDouble()) {
  334.         opt.SetEffectiveSearchSpace((Int8) args["searchsp"].AsDouble());
  335.     }
  336.     if (args["perc"].AsDouble()) {
  337.         opt.SetPercentIdentity(args["perc"].AsDouble());
  338.     }
  339.     if (args["gencode"].AsInteger()) {
  340.         opt.SetQueryGeneticCode(args["gencode"].AsInteger());
  341.     }
  342.     if (args["dbgencode"].AsInteger()) {
  343.         opt.SetDbGeneticCode(args["dbgencode"].AsInteger());
  344.     }
  345.     if (args["maxintron"].AsInteger()) {
  346.         opt.SetLongestIntronLength(args["maxintron"].AsInteger());
  347.     }
  348.     if (args["frameshift"].AsInteger()) {
  349.         opt.SetFrameShiftPenalty(args["frameshift"].AsInteger());
  350.         opt.SetOutOfFrameMode();
  351.     }
  352.     return retval;
  353. }
  354. #ifndef NDEBUG
  355. FILE*
  356. CBlast2seqApplication::GetOutputFilePtr(void)
  357. {
  358.     FILE *retval = NULL;
  359.     if (GetArgs()["out"].AsString() == "-")
  360.         retval = stdout;    
  361.     else
  362.         retval = fopen((char *)GetArgs()["out"].AsString().c_str(), "a");
  363.     ASSERT(retval);
  364.     return retval;
  365. }
  366. #endif
  367. /*****************************************************************************/
  368. int CBlast2seqApplication::Run(void)
  369. {
  370.     try {
  371.         InitObjMgr();
  372.         int counter = 0;
  373.         const CArgs args = GetArgs();
  374.         Uint1 program_number;
  375.         if (args["trace"])
  376.             SetDiagTrace(eDT_Enable);
  377.         BlastProgram2Number(args["program"].AsString().c_str(), 
  378.                             &program_number);
  379.         EProgram program = static_cast<EProgram>(program_number);
  380.         ENa_strand query_strand = eNa_strand_unknown;
  381.         ENa_strand subject_strand = eNa_strand_unknown;
  382.         if (program == eBlastn || program == eBlastx) { 
  383.             int cmdline_strand = args["strand"].AsInteger();
  384.             if (cmdline_strand == 1)
  385.                 query_strand = eNa_strand_plus;
  386.             else if (cmdline_strand == 2)
  387.                 query_strand = eNa_strand_minus;
  388.             else
  389.                 query_strand = eNa_strand_both;
  390.          }
  391.         if (program == eBlastn ||
  392.             program == eTblastn ||
  393.             program == eTblastx)
  394.             subject_strand = eNa_strand_plus;
  395.         // Retrieve input sequences
  396.         TSeqLocVector query_loc = 
  397.             BLASTGetSeqLocFromStream(args["query"].AsInputFile(), *m_ObjMgr,
  398.               query_strand, 0, 0, &counter, args["lcase"].AsBoolean());
  399.         TSeqLocVector subject_loc = 
  400.             BLASTGetSeqLocFromStream(args["subject"].AsInputFile(), *m_ObjMgr,
  401.               subject_strand, 0, 0, &counter);
  402.         CBlastOptionsHandle& opt_handle = *ProcessCommandLineArgs();
  403. #ifndef NDEBUG
  404.         CStopWatch sw;
  405.         sw.Start();
  406. #endif
  407.         CBl2Seq blaster(query_loc, subject_loc, opt_handle);
  408.         TSeqAlignVector seqalignv = blaster.Run();
  409. #ifndef NDEBUG
  410.         double t = sw.Elapsed();
  411.         cerr << "CBl2seq run took " << t << " seconds" << endl;
  412.         if (seqalignv.size() == 0) {
  413.             cerr << "Returned NULL SeqAlign!" << endl;
  414.             exit(1);
  415.         }
  416. #endif
  417.         // Our poor man's formatting ...  
  418.         if (args["asnout"]) {
  419.             auto_ptr<CObjectOStream> asnout(
  420.                 CObjectOStream::Open(args["asnout"].AsString(), eSerial_AsnText));
  421.             for (unsigned int index = 0; index < seqalignv.size(); ++index)
  422.                 *asnout << *seqalignv[index];
  423.         }
  424.     } catch (const CException& e) {
  425.         cerr << e.what() << endl;
  426.     }
  427.     return 0;
  428. }
  429. void CBlast2seqApplication::Exit(void)
  430. {
  431.     SetDiagStream(0);
  432. }
  433. int main(int argc, const char* argv[])
  434. {
  435.     return CBlast2seqApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  436. }
  437. /*
  438.  * ===========================================================================
  439.  * $Log: blast2seq.cpp,v $
  440.  * Revision 1000.5  2004/06/01 18:06:32  gouriano
  441.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.46
  442.  *
  443.  * Revision 1.46  2004/05/21 21:41:02  gorelenk
  444.  * Added PCH ncbi_pch.hpp
  445.  *
  446.  * Revision 1.45  2004/05/19 14:52:02  camacho
  447.  * 1. Added doxygen tags to enable doxygen processing of algo/blast/core
  448.  * 2. Standardized copyright, CVS $Id string, $Log and rcsid formatting and i
  449.  *    location
  450.  * 3. Added use of @todo doxygen keyword
  451.  *
  452.  * Revision 1.44  2004/05/17 15:33:57  madden
  453.  * Int algorithm_type replaced with enum EBlastPrelimGapExt
  454.  *
  455.  * Revision 1.43  2004/04/30 15:56:31  papadopo
  456.  * Plus/minus/both strands are acceptable for any blast program
  457.  * that takes a nucleotide query
  458.  *
  459.  * Revision 1.42  2004/04/23 13:51:56  papadopo
  460.  * handle strands for blastx correctly
  461.  *
  462.  * Revision 1.41  2004/04/19 21:35:23  papadopo
  463.  * explicitly calculate strands for input sequences
  464.  *
  465.  * Revision 1.40  2004/03/26 18:50:32  camacho
  466.  * Use CException::what() in catch block
  467.  *
  468.  * Revision 1.39  2004/03/17 20:09:08  dondosha
  469.  * Use CBlastNucleotideOptionsHandle method to set both extension method and scan step, instead of directly calling CalculateBestStride
  470.  *
  471.  * Revision 1.38  2004/03/11 17:27:41  camacho
  472.  * Minor change to avoid confusing doxygen
  473.  *
  474.  * Revision 1.37  2004/03/09 18:55:34  dondosha
  475.  * Fix: set out-of-frame mode boolean option in addition to the frame shift penalty
  476.  *
  477.  * Revision 1.36  2004/02/13 03:31:51  camacho
  478.  * 1. Use CBlastOptionsHandle class (still needs some work)
  479.  * 2. Remove dead code, clean up, add @todo doxygen tags
  480.  *
  481.  * Revision 1.35  2004/01/05 18:50:27  vasilche
  482.  * Fixed path to include files.
  483.  *
  484.  * Revision 1.34  2003/12/31 20:05:58  dondosha
  485.  * For discontiguous megablast, set extension method and scanning stride correctly
  486.  *
  487.  * Revision 1.33  2003/12/09 15:13:58  camacho
  488.  * Use difference scopes for queries and subjects
  489.  *
  490.  * Revision 1.32  2003/12/04 17:07:51  camacho
  491.  * Remove yet another unused variable
  492.  *
  493.  * Revision 1.31  2003/11/26 18:36:45  camacho
  494.  * Renaming blast_option*pp -> blast_options*pp
  495.  *
  496.  * Revision 1.30  2003/11/26 18:24:32  camacho
  497.  * +Blast Option Handle classes
  498.  *
  499.  * Revision 1.29  2003/11/03 15:20:39  camacho
  500.  * Make multiple query processing the default for Run().
  501.  *
  502.  * Revision 1.28  2003/10/27 20:52:29  dondosha
  503.  * Made greedy option an integer, to specify number of extension stages
  504.  *
  505.  * Revision 1.27  2003/10/24 20:55:30  camacho
  506.  * Rename GetDefaultStride
  507.  *
  508.  * Revision 1.26  2003/10/22 16:48:09  dondosha
  509.  * Changed "ag" option to "scantype";
  510.  * Use function from core library to calculate default value of stride if AG
  511.  * scanning method is used.
  512.  *
  513.  * Revision 1.25  2003/10/21 22:15:33  camacho
  514.  * Rearranging of C options structures, fix seed extension method
  515.  *
  516.  * Revision 1.24  2003/10/21 17:34:34  camacho
  517.  * Renaming of gap open/extension accessors/mutators
  518.  *
  519.  * Revision 1.23  2003/10/17 18:22:28  dondosha
  520.  * Use separate variables for different initial word extension options
  521.  *
  522.  * Revision 1.22  2003/10/08 15:27:02  camacho
  523.  * Remove unnecessary conditional
  524.  *
  525.  * Revision 1.21  2003/10/07 17:37:10  dondosha
  526.  * Lower case mask is now a boolean argument in call to BLASTGetSeqLocFromStream
  527.  *
  528.  * Revision 1.20  2003/09/26 21:36:29  dondosha
  529.  * Show results for all queries in multi-query case
  530.  *
  531.  * Revision 1.19  2003/09/26 15:42:23  dondosha
  532.  * Added second argument to SetExtendWordMethod, so bit can be set or unset
  533.  *
  534.  * Revision 1.18  2003/09/11 17:46:16  camacho
  535.  * Changed CBlastOption -> CBlastOptions
  536.  *
  537.  * Revision 1.17  2003/09/09 15:43:43  ucko
  538.  * Fix #include directive for blast_input.hpp.
  539.  *
  540.  * Revision 1.16  2003/09/05 18:24:28  camacho
  541.  * Restoring printing of SeqAlign, fix setting of default word extension method
  542.  *
  543.  * Revision 1.15  2003/08/28 23:17:20  camacho
  544.  * Add processing of command-line options
  545.  *
  546.  * Revision 1.14  2003/08/19 20:36:44  dondosha
  547.  * EProgram enum type is no longer part of CBlastOptions class
  548.  *
  549.  * Revision 1.13  2003/08/18 20:58:57  camacho
  550.  * Added blast namespace, removed *__.hpp includes
  551.  *
  552.  * Revision 1.12  2003/08/18 17:07:42  camacho
  553.  * Introduce new SSeqLoc structure (replaces pair<CSeq_loc, CScope>).
  554.  * Change in function to read seqlocs from files.
  555.  *
  556.  * Revision 1.11  2003/08/15 16:03:00  dondosha
  557.  * TSeqLoc and TSeqLocVector types no longer belong to class CBl2Seq, but are common to all BLAST applications
  558.  *
  559.  * Revision 1.10  2003/08/11 20:16:43  camacho
  560.  * Change return type of BLASTGetSeqLocFromStream and fix namespaces
  561.  *
  562.  * Revision 1.9  2003/08/11 15:26:30  dondosha
  563.  * BLASTGetSeqLocFromStream function moved to blast_input.cpp
  564.  *
  565.  * Revision 1.8  2003/08/08 20:46:08  camacho
  566.  * Fix to use new ReadFasta arguments
  567.  *
  568.  * Revision 1.7  2003/08/08 20:24:31  dicuccio
  569.  * Adjustments for Unix build: rename 'ncmimath' -> 'ncbi_math'; fix #include in demo app
  570.  *
  571.  * Revision 1.6  2003/08/01 22:38:31  camacho
  572.  * Added conditional compilation to write seqaligns
  573.  *
  574.  * Revision 1.5  2003/07/30 16:33:31  madden
  575.  * Remove C toolkit dependencies
  576.  *
  577.  * Revision 1.4  2003/07/16 20:25:34  camacho
  578.  * Added dummy features argument to C formatter
  579.  *
  580.  * Revision 1.3  2003/07/14 21:53:32  camacho
  581.  * Minor
  582.  *
  583.  * Revision 1.2  2003/07/11 21:22:57  camacho
  584.  * Use same command line option as blast to display seqalign
  585.  *
  586.  * Revision 1.1  2003/07/10 18:35:58  camacho
  587.  * Initial revision
  588.  *
  589.  * ===========================================================================
  590.  */