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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: nwa.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:05:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: nwa.cpp,v 1000.2 2004/06/01 18:05:08 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.  * Author:  Yuri Kapustin
  35.  *
  36.  * File Description:  xalgoalign application
  37.  *                   
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <algo/align/mm_aligner.hpp>
  41. #include <algo/align/nw_spliced_aligner16.hpp>
  42. #include <algo/align/nw_spliced_aligner32.hpp>
  43. #include <algo/align/nw_formatter.hpp>
  44. #include "nwa.hpp"
  45. #define SPLALIGNER CSplicedAligner32
  46. BEGIN_NCBI_SCOPE
  47. void CAppNWA::Init()
  48. {
  49.     HideStdArgs(fHideLogfile | fHideConffile | fHideVersion);
  50.     auto_ptr<CArgDescriptions> argdescr(new CArgDescriptions);
  51.     argdescr->SetUsageContext(GetArguments().GetProgramName(),
  52.                               "Demo application using xalgoalign library");
  53.     argdescr->AddDefaultKey
  54.         ("matrix", "matrix", "scoring matrix",
  55.          CArgDescriptions::eString, "nucl");
  56.     argdescr->AddFlag("spliced",
  57.                       "Spliced mRna/EST-to-Genomic alignment "
  58.                       "(consider specifying -esf zzxx)" );
  59.     argdescr->AddOptionalKey("pattern", "pattern",
  60.                              "Use HSPs to guide spliced alignment",
  61.                              CArgDescriptions::eInteger);
  62.     argdescr->AddKey
  63.         ("seq1", "seq1",
  64.          "the first input sequence in fasta file",
  65.          CArgDescriptions::eString);
  66.     argdescr->AddKey
  67.         ("seq2", "seq2",
  68.          "the second input sequence in fasta file",
  69.          CArgDescriptions::eString);
  70.     argdescr->AddDefaultKey
  71.         ("esf", "esf",
  72.          "End-space free alignment. Format: lrLR where each character "
  73.          "can be z (free end) or x (regular end) representing "
  74.          "left and right ends. First sequence's ends are specified first.", 
  75.          CArgDescriptions::eString,
  76.          "xxxx");
  77.     argdescr->AddDefaultKey
  78.         ("Wm", "match", "match bonus (nucleotide sequences)",
  79.          CArgDescriptions::eInteger,
  80.          NStr::IntToString(CNWAligner::GetDefaultWm()).c_str());
  81.     argdescr->AddDefaultKey
  82.         ("Wms", "mismatch", "mismatch penalty (nucleotide sequences)",
  83.          CArgDescriptions::eInteger,
  84.          NStr::IntToString(CNWAligner::GetDefaultWms()).c_str());
  85.     argdescr->AddDefaultKey
  86.         ("Wg", "gap", "gap opening penalty",
  87.          CArgDescriptions::eInteger,
  88.          NStr::IntToString(CNWAligner::GetDefaultWg()).c_str());
  89.     argdescr->AddDefaultKey
  90.         ("Ws", "space", "gap extension (space) penalty",
  91.          CArgDescriptions::eInteger,
  92.          NStr::IntToString(CNWAligner::GetDefaultWs()).c_str());
  93.     argdescr->AddDefaultKey
  94.         ("Wi0", "intron0", "type 0 (GT/AG) intron weight",
  95.          CArgDescriptions::eInteger,
  96.          NStr::IntToString(SPLALIGNER::GetDefaultWi(0)).c_str());
  97.     argdescr->AddDefaultKey
  98.         ("Wi1", "intron1", "type 1 (GC/AG) intron weight",
  99.          CArgDescriptions::eInteger,
  100.          NStr::IntToString(SPLALIGNER::GetDefaultWi(1)).c_str());
  101.     argdescr->AddDefaultKey
  102.         ("Wi2", "intron2", "type 2 (AT/AC) intron weight",
  103.          CArgDescriptions::eInteger,
  104.          NStr::IntToString(SPLALIGNER::GetDefaultWi(2)).c_str());
  105.     int intron_min_size = SPLALIGNER::GetDefaultIntronMinSize();
  106.     argdescr->AddDefaultKey
  107.         ("IntronMinSize", "IntronMinSize", "intron minimum size",
  108.          CArgDescriptions::eInteger,
  109.          NStr::IntToString(intron_min_size).c_str());
  110.     argdescr->AddFlag("mm",
  111.                       "Limit memory use to linear (Myers and Miller method)");
  112.     argdescr->AddFlag("mt", "Use multiple threads");
  113.     // supported output formats
  114.     argdescr->AddOptionalKey
  115.         ("o1", "o1", "Filename for type 1 output", CArgDescriptions::eString);
  116.     argdescr->AddOptionalKey
  117.         ("o2", "o2", "Filename for type 2 output", CArgDescriptions::eString);
  118.     argdescr->AddOptionalKey
  119.         ("ofasta", "ofasta",
  120.          "Generate gapped FastA output for the aligner sequences",
  121.          CArgDescriptions::eString);
  122.     argdescr->AddOptionalKey
  123.         ("oasn", "oasn", "ASN.1 output filename", CArgDescriptions::eString);
  124.     argdescr->AddOptionalKey
  125.         ("oexons", "exons",
  126.          "Exon table output filename (spliced alignments only)",
  127.          CArgDescriptions::eString);
  128.     
  129.     CArgAllow_Strings* paa_st = new CArgAllow_Strings;
  130.     paa_st->Allow("nucl")->Allow("blosum62");
  131.     argdescr->SetConstraint("matrix", paa_st);
  132.     CArgAllow_Strings* paa_esf = new CArgAllow_Strings;
  133.     paa_esf->Allow("xxxx")->Allow("xxxz")->Allow("xxzx")->Allow("xxzz");
  134.     paa_esf->Allow("xzxx")->Allow("xzxz")->Allow("xzzx")->Allow("xzzz");
  135.     paa_esf->Allow("zxxx")->Allow("zxxz")->Allow("zxzx")->Allow("zxzz");
  136.     paa_esf->Allow("zzxx")->Allow("zzxz")->Allow("zzzx")->Allow("zzzz");
  137.     argdescr->SetConstraint("esf", paa_esf);
  138.     CArgAllow* paa0 = new CArgAllow_Integers(5,1000);
  139.     argdescr->SetConstraint("pattern", paa0);
  140.     SetupArgDescriptions(argdescr.release());
  141. }
  142. int CAppNWA::Run()
  143.     x_RunOnPair();
  144.     return 0;
  145. }
  146. auto_ptr<ofstream> open_ofstream (const string& filename) {
  147.     auto_ptr<ofstream> pofs0 ( new ofstream (filename.c_str()) );
  148.     if(*pofs0) {
  149.         return pofs0;
  150.     }
  151.     else {
  152.         NCBI_THROW(CAppNWAException,
  153.                    eCannotWriteFile,
  154.                    "Cannot write to file" + filename);
  155.     }
  156. }
  157. void CAppNWA::x_RunOnPair() const
  158.     THROWS((CAppNWAException, CAlgoAlignException))
  159. {
  160.     const CArgs& args = GetArgs();
  161.     // analyze parameters
  162.     const bool bMM = args["mm"];
  163.     const bool bMT = args["mt"];
  164.     const bool bMrna2Dna = args["spliced"];
  165.     const bool bGuides = args["pattern"];
  166.     bool   output_type1  ( args["o1"] );
  167.     bool   output_type2  ( args["o2"] );
  168.     bool   output_asn    ( args["oasn"] );
  169.     bool   output_fasta  ( args["ofasta"] );
  170.     bool   output_exons  ( args["oexons"] );
  171.     if(bMrna2Dna && args["matrix"].AsString() != "nucl") {
  172.         NCBI_THROW(CAppNWAException,
  173.                    eInconsistentParameters,
  174.                    "Spliced alignment assumes nucleotide sequences "
  175.                    "(matrix = nucl)");
  176.     }
  177.     if(output_exons && !bMrna2Dna) {
  178.         NCBI_THROW(CAppNWAException,
  179.                    eInconsistentParameters,
  180.                    "Exon output can only be requested in mRna2Dna mode");
  181.     }
  182.      
  183.     if(bMrna2Dna && bMM) {
  184.         NCBI_THROW(CAppNWAException,
  185.                    eInconsistentParameters,
  186.                    "Linear memory approach is not yet supported for the "
  187.                    "spliced alignment algorithm");
  188.     }
  189.      
  190.     if(!bMrna2Dna && bGuides) {
  191.         NCBI_THROW(CAppNWAException,
  192.                    eInconsistentParameters,
  193.                    "Guides are only supported in spliced mode" );
  194.     }
  195.      
  196.     if(bMT && !bMM) {
  197.         NCBI_THROW(CAppNWAException,
  198.                    eInconsistentParameters,
  199.                    "Mutliple thread mode is currently supported "
  200.                    "for Myers-Miller method only (-mm flag)");
  201.     }
  202. #ifndef NCBI_THREADS
  203.     if(bMT) {
  204.         NCBI_THROW(CAppNWAException,
  205.    eNotSupported,
  206.                    "This application was built without multithreading support. "
  207.    "To run in multiple threads, please re-configure and rebuild"
  208.    " with proper option.");
  209.     }
  210.     
  211. #endif
  212.     // read input sequences
  213.     vector<char> v1, v2;
  214.     string seqname1, seqname2;
  215.     if ( !x_ReadFastaFile(args["seq1"].AsString(), &seqname1, &v1)) {
  216.         NCBI_THROW(CAppNWAException,
  217.                    eCannotReadFile,
  218.                    "Cannot read file " + args["seq1"].AsString());
  219.     }
  220.     if ( !x_ReadFastaFile(args["seq2"].AsString(), &seqname2, &v2)) {
  221.         NCBI_THROW(CAppNWAException,
  222.                    eCannotReadFile,
  223.                    "Cannot read file" + args["seq2"].AsString());
  224.     }
  225.     // determine sequence/score matrix type
  226.     const SNCBIPackedScoreMatrix* psm = 
  227.       (args["matrix"].AsString() == "blosum62")?
  228.       &NCBISM_Blosum62:
  229.       0;
  230.     auto_ptr<CNWAligner> aligner (
  231.         bMrna2Dna? 
  232.         new SPLALIGNER (&v1[0], v1.size(), &v2[0], v2.size()):
  233.         (bMM?
  234.          new CMMAligner (&v1[0], v1.size(), &v2[0], v2.size(), psm):
  235.          new CNWAligner (&v1[0], v1.size(), &v2[0], v2.size(), psm))
  236.         );
  237.     aligner->SetWm  (args["Wm"]. AsInteger());
  238.     aligner->SetWms (args["Wms"].AsInteger());
  239.     aligner->SetWg  (args["Wg"]. AsInteger());
  240.     aligner->SetWs  (args["Ws"]. AsInteger());
  241.     if( bMrna2Dna ) {
  242.         SPLALIGNER *aligner_mrna2dna = 
  243.             static_cast<SPLALIGNER*> (aligner.get());
  244.         aligner_mrna2dna->SetWi (0, args["Wi0"]. AsInteger());
  245.         aligner_mrna2dna->SetWi (1, args["Wi1"]. AsInteger());
  246.         aligner_mrna2dna->SetWi (2, args["Wi2"]. AsInteger());
  247.         //        aligner_mrna2dna->SetWi (3, args["Wi3"]. AsInteger());
  248.         aligner_mrna2dna->SetIntronMinSize(args["IntronMinSize"]. AsInteger());
  249.         if(bGuides) {
  250.             aligner_mrna2dna->MakePattern(args["pattern"].AsInteger());
  251.         }
  252.     }
  253.     if(bMT && bMM) {
  254.         CMMAligner* pmma = static_cast<CMMAligner*> (aligner.get());
  255.         pmma -> EnableMultipleThreads();
  256.     }
  257.     
  258.     auto_ptr<ofstream> pofs1 (0);
  259.     auto_ptr<ofstream> pofs2 (0);
  260.     auto_ptr<ofstream> pofsAsn (0);
  261.     auto_ptr<ofstream> pofsFastA (0);
  262.     auto_ptr<ofstream> pofsExons (0);
  263.     if(output_type1) {
  264.         pofs1.reset(open_ofstream (args["o1"].AsString()).release());
  265.     }
  266.     if(output_type2) {
  267.         pofs2.reset(open_ofstream (args["o2"].AsString()).release());
  268.     }
  269.     if(output_asn) {
  270.         pofsAsn.reset(open_ofstream (args["oasn"].AsString()).release());
  271.     }
  272.     if(output_fasta) {
  273.         pofsFastA.reset(open_ofstream (args["ofasta"].AsString()).release());
  274.     }
  275.     if(output_exons) {
  276.         pofsExons.reset(open_ofstream (args["oexons"].AsString()).release());
  277.     }
  278.     {{  // setup end penalties
  279.         string ends = args["esf"].AsString();
  280.         bool L1 = ends[0] == 'z';
  281.         bool R1 = ends[1] == 'z';
  282.         bool L2 = ends[2] == 'z';
  283.         bool R2 = ends[3] == 'z';
  284.         aligner->SetEndSpaceFree(L1, R1, L2, R2);
  285.     }}
  286.     int score = aligner->Run();
  287.     cerr << "Score = " << score << endl;
  288.     CNWFormatter formatter (*aligner);
  289.     formatter.SetSeqIds(seqname1, seqname2);
  290.     const size_t line_width = 50;
  291.     string s;
  292.     if(pofs1.get()) {
  293.         formatter.AsText(&s, CNWFormatter::eFormatType1, line_width);
  294.         *pofs1 << s;
  295.     }
  296.     if(pofs2.get()) {
  297.         formatter.AsText(&s, CNWFormatter::eFormatType2, line_width);
  298.         *pofs2 << s;
  299.     }
  300.     if(pofsAsn.get()) {
  301.         formatter.AsText(&s, CNWFormatter::eFormatAsn, line_width);
  302.         *pofsAsn << s;
  303.     }
  304.     if(pofsFastA.get()) {
  305.         formatter.AsText(&s, CNWFormatter::eFormatFastA, line_width);
  306.         *pofsFastA << s;
  307.     }
  308.     if(pofsExons.get()) {
  309.         formatter.AsText(&s, CNWFormatter::eFormatExonTableEx, line_width);
  310.         *pofsExons << s;
  311.     }
  312.     
  313.     if(!output_type1 && !output_type2
  314.        && !output_asn && !output_fasta
  315.        && !output_exons) {
  316.         formatter.AsText(&s, CNWFormatter::eFormatType2, line_width);
  317.         cout << s;
  318.     }
  319. }
  320. void CAppNWA::Exit()
  321. {
  322.     return;
  323. }
  324. bool CAppNWA::x_ReadFastaFile (const string& filename, string* seqname,
  325.                                vector<char>* sequence) const
  326. {
  327.     vector<char>& vOut = *sequence;
  328.     vOut.clear();
  329.     ifstream ifs(filename.c_str());
  330.     // read sequence's name
  331.     string str;
  332.     getline(ifs, str);
  333.     if(!ifs)
  334.         return false;
  335.     istrstream iss (str.c_str());
  336.     char c;
  337.     iss >> c >> *seqname;
  338.     if(!iss)
  339.         return false;
  340.     // read the sequence
  341.     while ( ifs ) {
  342.         string s;
  343.         ifs >> s;
  344.         NStr::ToUpper(s);
  345.         copy(s.begin(), s.end(), back_inserter(vOut));
  346.     }
  347.     return true;
  348. }
  349. END_NCBI_SCOPE
  350. /*
  351.  * ===========================================================================
  352.  * $Log: nwa.cpp,v $
  353.  * Revision 1000.2  2004/06/01 18:05:08  gouriano
  354.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  355.  *
  356.  * Revision 1.27  2004/05/21 21:41:02  gorelenk
  357.  * Added PCH ncbi_pch.hpp
  358.  *
  359.  * Revision 1.26  2004/04/30 13:01:33  kuznets
  360.  * throw -> THROWS
  361.  *
  362.  * Revision 1.25  2003/11/07 18:30:17  kapustin
  363.  * mRna2Dna --> Spliced
  364.  *
  365.  * Revision 1.24  2003/09/30 19:50:28  kapustin
  366.  * Adjust for standard score matrix interface
  367.  *
  368.  * Revision 1.23  2003/09/10 19:11:50  kapustin
  369.  * Add eNotSupported exception for multithreading availability checking
  370.  *
  371.  * Revision 1.22  2003/09/02 22:38:52  kapustin
  372.  * Adjust for the library's changes
  373.  *
  374.  * Revision 1.21  2003/06/17 17:20:44  kapustin
  375.  * CNWAlignerException -> CAlgoAlignException
  376.  *
  377.  * Revision 1.20  2003/06/17 14:51:04  dicuccio
  378.  * Fixed after algo/ rearragnement
  379.  *
  380.  * Revision 1.19  2003/05/23 18:28:27  kapustin
  381.  * Introduce new (generic) splice type
  382.  *
  383.  * Revision 1.18  2003/05/06 20:27:30  kapustin
  384.  * Specify guide size in command line argument
  385.  *
  386.  * Revision 1.17  2003/04/14 19:00:55  kapustin
  387.  * Add guide creation facility.  x_Run() -> x_Align()
  388.  *
  389.  * Revision 1.16  2003/04/02 20:53:31  kapustin
  390.  * Add exon table output format
  391.  *
  392.  * Revision 1.15  2003/03/25 22:06:02  kapustin
  393.  * Support non-canonical splice signals
  394.  *
  395.  * Revision 1.14  2003/03/18 15:14:54  kapustin
  396.  * Allow separate free end gap specification
  397.  *
  398.  * Revision 1.13  2003/03/17 15:32:28  kapustin
  399.  * Enabled end-space free alignments for all currently supported methods
  400.  *
  401.  * Revision 1.12  2003/03/07 13:52:57  kapustin
  402.  * Add a temporary check that -mm is not used with -esf
  403.  *
  404.  * Revision 1.11  2003/03/05 20:13:53  kapustin
  405.  * Simplify FormatAsText(). Fix FormatAsSeqAlign(). Convert sequence alphabets
  406.  * to capitals
  407.  *
  408.  * Revision 1.10  2003/02/11 16:06:55  kapustin
  409.  * Add end-space free alignment support
  410.  *
  411.  * Revision 1.9  2003/01/28 12:46:27  kapustin
  412.  * Format() --> FormatAsText(). Fix the flag spelling forcing ASN output.
  413.  *
  414.  * Revision 1.8  2003/01/24 19:43:03  ucko
  415.  * Change auto_ptr assignment to use release and reset rather than =,
  416.  * which not all compilers support.
  417.  *
  418.  * Revision 1.7  2003/01/24 16:49:59  kapustin
  419.  * Support different output formats
  420.  *
  421.  * Revision 1.6  2003/01/21 16:34:22  kapustin
  422.  * 
  423.  *
  424.  * Revision 1.5  2003/01/21 12:42:02  kapustin
  425.  * Add mm parameter
  426.  *
  427.  * Revision 1.4  2003/01/08 15:58:32  kapustin
  428.  * Read offset parameter from fasta reading routine
  429.  *
  430.  * Revision 1.3  2002/12/17 21:50:24  kapustin
  431.  * Remove unnecesary seq type parameter from the mrna2dna constructor
  432.  *
  433.  * Revision 1.2  2002/12/12 17:59:30  kapustin
  434.  * Enable spliced alignments
  435.  *
  436.  * Revision 1.1  2002/12/06 17:44:25  ivanov
  437.  * Initial revision
  438.  *
  439.  * ===========================================================================
  440.  */