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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gnomon_app.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:08:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: gnomon_app.cpp,v 1000.1 2004/06/01 18:08:43 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbienv.hpp>
  42. #include <corelib/ncbiargs.hpp>
  43. #include "GeneFinder.hpp"
  44. USING_SCOPE(ncbi);
  45. class CGnomonApp : public CNcbiApplication
  46. {
  47. public:
  48.     void Init(void);
  49.     int Run(void);
  50. };
  51. void CGnomonApp::Init(void)
  52. {
  53.     // Prepare command line descriptions
  54.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  55.     arg_desc->AddKey("file", "File",
  56.                      "File",
  57.                      CArgDescriptions::eString);
  58.     arg_desc->AddDefaultKey("from", "From",
  59.                             "From",
  60.                             CArgDescriptions::eInteger,
  61.                             "0");
  62.     arg_desc->AddDefaultKey("to", "To",
  63.                             "To",
  64.                             CArgDescriptions::eInteger,
  65.                             "1000000000");
  66.     arg_desc->AddDefaultKey("model", "ModelData",
  67.                             "Model Data",
  68.                             CArgDescriptions::eString,
  69.                             "Human.inp");
  70.     arg_desc->AddDefaultKey("ap", "AprioriInfo",
  71.                             "A priori info",
  72.                             CArgDescriptions::eString,
  73.                             "");
  74.     arg_desc->AddOptionalKey("fs", "FrameShifts",
  75.                              "Frame Shifts",
  76.                              CArgDescriptions::eString);
  77.     arg_desc->AddFlag("rep", "Repeats");
  78.     arg_desc->AddFlag("debug", "Debug");
  79.     // Pass argument descriptions to the application
  80.     //
  81.     SetupArgDescriptions(arg_desc.release());
  82. }
  83. int CGnomonApp::Run(void)
  84. {
  85.     CArgs myargs = GetArgs();
  86.     string file         = myargs["file"].AsString();
  87.     int left            = myargs["from"].AsInteger();
  88.     int right           = myargs["to"].AsInteger();
  89.     string modeldata    = myargs["model"].AsString();
  90.     string apriorifile  = myargs["ap"].AsString();
  91.     string shifts       = myargs["fs"].AsString();
  92.     bool repeats        = myargs["rep"].AsBoolean();
  93.     bool debug          = myargs["debug"].AsBoolean();
  94.     CStopWatch sw;
  95.     sw.Start();
  96.     ClusterSet cls;
  97.     if(!apriorifile.empty())
  98.     {
  99.         CNcbiIfstream from(apriorifile.c_str());
  100.         if(!from)
  101.         {
  102.             cerr << "Can't find alignments " << apriorifile << 'n';
  103.             exit(1);
  104.         }
  105.         from >> cls;
  106.     }
  107.     FrameShifts fshifts;
  108.     if(!shifts.empty())
  109.     {
  110.         CNcbiIfstream from(shifts.c_str());
  111.         if(!from)
  112.         {
  113.             cerr << "Can't find frameshifts " << shifts << 'n';
  114.             exit(1);
  115.         }
  116.         int loc;
  117.         while(from >> loc)
  118.         {
  119.             char is_i, c = 'N';
  120.             from >> is_i;
  121.             if(is_i == '+') from >> c;
  122.             fshifts.push_back(FrameShiftInfo(loc,is_i == '+',c));
  123.         }
  124.     }
  125.     CNcbiIfstream from(file.c_str());
  126.     CVec seq;
  127.     string line;
  128.     char c;
  129.     getline(from,line);
  130.     while(from >> c) seq.push_back(c);
  131.     int cgcontent = 0;
  132.     int len = seq.size();
  133.     right = min(right,len-1);
  134.     for(int i = left; i <= right; ++i)
  135.     {
  136.         int c = toupper(seq[i]);
  137.         if(c == 'C' || c == 'G') ++cgcontent;
  138.     }
  139.     cgcontent = cgcontent*100./(right-left+1)+0.5;
  140.     cout << "CG-content: " << cgcontent << endl;
  141.     double e1 = sw.Elapsed();
  142.     if(debug) cerr << "Input time: " << e1 << 'n';
  143.     sw.Start();
  144.     Terminal* donorp;
  145.     if(modeldata == "Human.inp")
  146.     {
  147.         donorp = new MDD_Donor(modeldata,cgcontent);
  148.     }
  149.     else
  150.     {
  151.         donorp = new WAM_Donor<2>(modeldata,cgcontent);
  152.     }
  153.     WAM_Acceptor<2> acceptor(modeldata,cgcontent);
  154.     WMM_Start start(modeldata,cgcontent);
  155.     WAM_Stop stop(modeldata,cgcontent);
  156.     MC3_CodingRegion<5> cdr(modeldata,cgcontent);
  157.     MC_NonCodingRegion<5> intron_reg(modeldata,cgcontent), intergenic_reg(modeldata,cgcontent);
  158.     Intron::Init(modeldata,cgcontent,right-left+1);
  159.     Intergenic::Init(modeldata,cgcontent,right-left+1);
  160.     Exon::Init(modeldata,cgcontent);
  161.     double e2 = sw.Elapsed();
  162.     if(debug) cerr << "Init time: " << e2 << 'n';
  163.     sw.Start();
  164.     bool leftwall = true, rightwall = true;
  165.     SeqScores ss(acceptor, *donorp, start, stop, cdr, intron_reg, 
  166.                  intergenic_reg, seq, left, right, cls, fshifts, repeats, 
  167.                  leftwall, rightwall, file);
  168.     HMM_State::SetSeqScores(ss);
  169.     double e3 = sw.Elapsed();
  170.     if(debug) cerr << "Scoring time: " << e3 << 'n';
  171.     sw.Start();
  172.     Parse parse(ss);
  173.     double e4 = sw.Elapsed();
  174.     if(debug) cerr << "Parse time: " << e4 << 'n';
  175.     sw.Start();
  176.     parse.PrintGenes();
  177.     delete donorp;
  178.     return 0;
  179. }
  180. /////////////////////////////////////////////////////////////////////////////
  181. //  MAIN
  182. int main(int argc, const char* argv[])
  183. {
  184.     return CGnomonApp().AppMain(argc, argv, 0, eDS_Default, 0);
  185. }
  186. #if 0
  187. double diff(struct timeval t2, struct timeval t1)
  188. {  double t;
  189.     t = t2.tv_sec-t1.tv_sec+0.000001*(t2.tv_usec-t1.tv_usec);
  190.     return t;
  191. }     
  192. Int2 Main()
  193. {
  194.     struct timeval t1,t2;
  195.     Args myargs[] = 
  196.     {
  197.         {"File",NULL,NULL,NULL,FALSE,'i',ARG_STRING,0.0,0,NULL},
  198.         {"From","0",NULL,NULL,TRUE,'f',ARG_INT,0.0,0,NULL},
  199.         {"To","1000000000",NULL,NULL,TRUE,'t',ARG_INT,0.0,0,NULL},
  200.         {"Model data","Human.inp",NULL,NULL,TRUE,'m',ARG_STRING,0.0,0,NULL},
  201.         {"Apriori info","",NULL,NULL,TRUE,'a',ARG_STRING,0.0,0,NULL},
  202.         {"Frame shifts","",NULL,NULL,TRUE,'s',ARG_STRING,0.0,0,NULL},
  203.         {"Repeats","0",NULL,NULL,TRUE,'r',ARG_INT,0.0,0,NULL},
  204.         {"Debug","0",NULL,NULL,TRUE,'d',ARG_INT,0.0,0,NULL},
  205.     };
  206.     if(!GetArgs("GeneFinder",sizeof(myargs)/sizeof(myargs[0]), myargs)) exit(1);
  207.     enum {Input, From, To, Model, Apriori, Shifts, Repeats, Debug};
  208.     string file(myargs[Input].strvalue);
  209.     int left = myargs[From].intvalue, right = myargs[To].intvalue;
  210.     string modeldata(myargs[Model].strvalue);
  211.     string apriorifile(myargs[Apriori].strvalue);
  212.     string shifts(myargs[Shifts].strvalue);
  213.     bool repeats(myargs[Repeats].intvalue);
  214.     bool debug(myargs[Debug].intvalue);
  215.     gettimeofday(&t1, NULL);
  216.     ClusterSet cls;
  217.     if(!apriorifile.empty())
  218.     {
  219.         CNcbiIfstream from(apriorifile.c_str());
  220.         if(!from)
  221.         {
  222.             cerr << "Can't find alignments " << apriorifile << 'n';
  223.             exit(1);
  224.         }
  225.         from >> cls;
  226.     }
  227.     FrameShifts fshifts;
  228.     if(!shifts.empty())
  229.     {
  230.         CNcbiIfstream from(shifts.c_str());
  231.         if(!from)
  232.         {
  233.             cerr << "Can't find frameshifts " << shifts << 'n';
  234.             exit(1);
  235.         }
  236.         int loc;
  237.         while(from >> loc)
  238.         {
  239.             char is_i, c = 'N';
  240.             from >> is_i;
  241.             if(is_i == '+') from >> c;
  242.             fshifts.push_back(FrameShiftInfo(loc,is_i == '+',c));
  243.         }
  244.     }
  245.     CNcbiIfstream from(file.c_str());
  246.     CVec seq;
  247.     string line;
  248.     char c;
  249.     getline(from,line);
  250.     while(from >> c) seq.push_back(c);
  251.     int cgcontent = 0;
  252.     int len = seq.size();
  253.     right = min(right,len-1);
  254.     for(int i = left; i <= right; ++i)
  255.     {
  256.         int c = toupper(seq[i]);
  257.         if(c == 'C' || c == 'G') ++cgcontent;
  258.     }
  259.     cgcontent = cgcontent*100./(right-left+1)+0.5;
  260.     cout << "CG-content: " << cgcontent << endl;
  261.     gettimeofday(&t2, NULL);
  262.     if(debug) cerr << "Input time: " << diff(t2,t1) << 'n';
  263.     gettimeofday(&t1, NULL);
  264.     Terminal* donorp;
  265.     if(modeldata == "Human.inp")
  266.     {
  267.         donorp = new MDD_Donor(modeldata,cgcontent);
  268.     }
  269.     else
  270.     {
  271.         donorp = new WAM_Donor<2>(modeldata,cgcontent);
  272.     }
  273.     WAM_Acceptor<2> acceptor(modeldata,cgcontent);
  274.     WMM_Start start(modeldata,cgcontent);
  275.     WAM_Stop stop(modeldata,cgcontent);
  276.     MC3_CodingRegion<5> cdr(modeldata,cgcontent);
  277.     MC_NonCodingRegion<5> intron_reg(modeldata,cgcontent), intergenic_reg(modeldata,cgcontent);
  278.     Intron::Init(modeldata,cgcontent,right-left+1);
  279.     Intergenic::Init(modeldata,cgcontent,right-left+1);
  280.     Exon::Init(modeldata,cgcontent);
  281.     gettimeofday(&t2, NULL);
  282.     if(debug) cerr << "Init time: " << diff(t2,t1) << 'n';
  283.     gettimeofday(&t1, NULL);
  284.     bool leftwall = true, rightwall = true;
  285.     SeqScores ss(acceptor, *donorp, start, stop, cdr, intron_reg, 
  286.                  intergenic_reg, seq, left, right, cls, fshifts, repeats, 
  287.                  leftwall, rightwall, file);
  288.     HMM_State::SetSeqScores(ss);
  289.     gettimeofday(&t2, NULL);
  290.     if(debug) cerr << "Scoring time: " << diff(t2,t1) << 'n';
  291.     gettimeofday(&t1, NULL);
  292.     Parse parse(ss);
  293.     gettimeofday(&t2, NULL);
  294.     if(debug) cerr << "Parse time: " << diff(t2,t1) << 'n';
  295.     gettimeofday(&t1, NULL);
  296.     parse.PrintGenes();
  297.     /*
  298.        cout << "nn";
  299.        parse.PrintInfo();
  300.        gettimeofday(&t2, NULL);
  301.        if(debug) cerr << "Print time: " << diff(t2,t1) << 'n';
  302.        list<Gene> genes = parse.GetGenes();
  303.        for(list<Gene>::iterator it = genes.begin(); it != genes.end(); ++it)
  304.        {
  305.        const Gene& igene = *it;
  306.        for(int j = 0; j < igene.size(); ++j)
  307.        {
  308.        int a = igene[j].Start();
  309.        int b = igene[j].Stop();
  310.        if(j == igene.size()-1 && igene.Strand() == Plus) b += 3;
  311.        if(j == 0 && igene.Strand() == Minus) a -= 3;
  312.        cout << a+1 << ' ' << b+1 << 'n';
  313.        }
  314.        }
  315.        */
  316.     delete donorp;
  317.     return 0;
  318. }
  319. #endif
  320. /*
  321.  * ===========================================================================
  322.  * $Log: gnomon_app.cpp,v $
  323.  * Revision 1000.1  2004/06/01 18:08:43  gouriano
  324.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  325.  *
  326.  * Revision 1.2  2004/05/21 21:41:03  gorelenk
  327.  * Added PCH ncbi_pch.hpp
  328.  *
  329.  * Revision 1.1  2003/10/24 15:07:25  dicuccio
  330.  * Initial revision
  331.  *
  332.  * ===========================================================================
  333.  */