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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: states.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:08:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: states.cpp,v 1000.2 2004/06/01 18:08:40 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 "gene_finder.hpp"
  41. BEGIN_NCBI_SCOPE
  42. const SeqScores* HMM_State::seqscr = 0;
  43. bool Lorentz::Init(CNcbiIstream& from, const string& label)
  44. {
  45.     string s;
  46.     from >> s;
  47.     if (s != label) {
  48.         return false;
  49.     }
  50.     from >> s;
  51.     if (s != "A:") {
  52.         return false;
  53.     }
  54.     if ( !(from >> A) ) {
  55.         return false;
  56.     }
  57.     from >> s;
  58.     if (s != "L:") {
  59.         return false;
  60.     }
  61.     if ( !(from >> L) ) {
  62.         return false;
  63.     }
  64.     from >> s;
  65.     if (s != "MinL:") {
  66.         return false;
  67.     }
  68.     if ( !(from >> minl) ) {
  69.         return false;
  70.     }
  71.     from >> s;
  72.     if (s != "MaxL:") {
  73.         return false;
  74.     }
  75.     if ( !(from >> maxl) ) {
  76.         return false;
  77.     }
  78.     from >> s;
  79.     if (s != "Step:") {
  80.         return false;
  81.     }
  82.     if ( !(from >> step) ) {
  83.         return false;
  84.     }
  85.     int num = (maxl - 1) / step + 1;
  86.     try {
  87.         score.resize(num,0);
  88.         clscore.resize(num,0);
  89.     }
  90.     catch(bad_alloc&) {
  91.         NCBI_THROW(CGnomonException, eGenericError,
  92.                    "GNOMON: out of memory in Lorentz");
  93.     }
  94.     int i = 0;
  95.     while (from >> score[i]) {
  96.         if ((i + 1) * step < minl) {
  97.             score[i] = 0;
  98.         }
  99.         i++;
  100.     }
  101.     from.clear();
  102.     while (i < num) {
  103.         score[i] = A / (L * L+pow((i + 0.5) * step,2));
  104.         i++;
  105.     }
  106.     double sum = 0;
  107.     avlen = 0;
  108.     for (int l = minl;  l <= maxl;  ++l) {
  109.         double scr = score[(l - 1) / step];
  110.         sum += scr;
  111.         avlen += l * scr;
  112.     }
  113.     avlen /= sum;
  114.     for (int i = 0;  i < num;  ++i) {
  115.         score[i] /= sum;
  116.     }
  117.     clscore[num - 1] = 0;
  118.     for (int i = num - 2;  i >= 0;  --i) {
  119.         clscore[i] = clscore[i + 1]+score[i + 1]*step;
  120.     }
  121.     for (int i = 0;  i < num;  ++i) {
  122.         score[i] = (score[i] == 0) ? BadScore : log(score[i]);
  123.     }
  124.     return true;
  125. }
  126. double Lorentz::Through(int seqlen) const
  127. {
  128.     double through = 0;
  129.     for (int l = seqlen + 1;  l <= MaxLen();  ++l) {
  130.         int i = (l - 1) / step;
  131.         int delx = min((i + 1) * step,MaxLen()) - l;
  132.         double dely = (i == 0 ? 1 : clscore[i - 1]) - clscore[i];
  133.         through += dely / step * delx + clscore[i];
  134.     }
  135.     return through;
  136. }
  137. double Exon::firstphase[3], Exon::internalphase[3][3];
  138. Lorentz Exon::firstlen, Exon::internallen, Exon::lastlen, Exon::singlelen; 
  139. bool Exon::initialised = false;
  140. void Exon::Init(const string& file, int cgcontent)
  141. {
  142.     string label = "[Exon]";
  143.     CNcbiIfstream from(file.c_str());
  144.     pair<int,int> cgrange = FindContent(from,label,cgcontent);
  145.     if (cgrange.first < 0) {
  146.         Error(label+" 1");
  147.     }
  148.     string str;
  149.     from >> str;
  150.     if (str != "FirstExonPhase:") {
  151.         Error(label+" 2");
  152.     }
  153.     for (int i = 0;  i < 3;  ++i) {
  154.         from >> firstphase[i];
  155.         if ( !from ) {
  156.             Error(label);
  157.         }
  158.         firstphase[i] = log(firstphase[i]);
  159.     }
  160.     from >> str;
  161.     if (str != "InternalExonPhase:") {
  162.         Error(label+" 3");
  163.     }
  164.     for (int i = 0;  i < 3;  ++i) {
  165.         for (int j = 0;  j < 3;  ++j) {
  166.             from >> internalphase[i][j];
  167.             if ( !from ) {
  168.                 Error(label+" 4");
  169.             }
  170.             internalphase[i][j] = log(internalphase[i][j]);
  171.         }
  172.     }
  173.     if ( !firstlen.Init(from,"FirstExonDistribution:") ) {
  174.         Error(label+" 5");
  175.     }
  176.     if ( !internallen.Init(from,"InternalExonDistribution:") ) {
  177.         Error(label+" 6");
  178.     }
  179.     if ( !lastlen.Init(from,"LastExonDistribution:") ) {
  180.         Error(label+" 7");
  181.     }
  182.     if ( !singlelen.Init(from,"SingleExonDistribution:") ) {
  183.         Error(label+" 8");
  184.     }
  185.     initialised = true;
  186. }
  187. double Intron::lnThrough[3], Intron::lnDen[3];
  188. double Intron::lnTerminal, Intron::lnInternal;
  189. Lorentz Intron::intronlen;
  190. bool Intron::initialised = false;
  191. void Intron::Init(const string& file, int cgcontent, int seqlen)
  192. {
  193.     string label = "[Intron]";
  194.     CNcbiIfstream from(file.c_str());
  195.     pair<int,int> cgrange = FindContent(from,label,cgcontent);
  196.     if (cgrange.first < 0) {
  197.         Error(label);
  198.     }
  199.     string str;
  200.     from >> str;
  201.     if (str != "InitP:") {
  202.         Error(label);
  203.     }
  204.     double initp, phasep[3];
  205.     from >> initp >> phasep[0] >> phasep[1] >> phasep[2];
  206.     if ( !from ) {
  207.         Error(label);
  208.     }
  209.     initp = initp / 2;      // two strands
  210.     from >> str;
  211.     if (str != "toTerm:") {
  212.         Error(label);
  213.     }
  214.     double toterm;
  215.     from >> toterm;
  216.     if ( !from ) {
  217.         Error(label);
  218.     }
  219.     lnTerminal = log(toterm);
  220.     lnInternal = log(1 - toterm);
  221.     if ( !intronlen.Init(from,"IntronDistribution:") ) {
  222.         Error(label);
  223.     }
  224.     double lnthrough = intronlen.Through(seqlen);
  225.     lnthrough = (lnthrough == 0) ? BadScore : log(lnthrough);
  226.     for (int i = 0;  i < 3;  ++i) {
  227.         lnDen[i] = log(initp * phasep[i]/intronlen.AvLen());
  228.         lnThrough[i] = (lnthrough == BadScore) ? BadScore : lnDen[i]+lnthrough;
  229.     }
  230.     initialised = true;
  231. }
  232. double Intergenic::lnThrough;
  233. double Intergenic::lnDen;
  234. double Intergenic::lnSingle, Intergenic::lnMulti;
  235. Lorentz Intergenic::intergeniclen;
  236. bool Intergenic::initialised = false;
  237. void Intergenic::Init(const string& file, int cgcontent, int seqlen)
  238. {
  239.     string label = "[Intergenic]";
  240.     CNcbiIfstream from(file.c_str());
  241.     pair<int,int> cgrange = FindContent(from,label,cgcontent);
  242.     if (cgrange.first < 0) {
  243.         Error(label);
  244.     }
  245.     string str;
  246.     from >> str;
  247.     if (str != "InitP:") {
  248.         Error(label);
  249.     }
  250.     double initp;
  251.     from >> initp;
  252.     if ( !from ) {
  253.         Error(label);
  254.     }
  255.     initp = initp / 2;      // two strands
  256.     from >> str;
  257.     if (str != "toSingle:") {
  258.         Error(label);
  259.     }
  260.     double tosingle;
  261.     from >> tosingle;
  262.     if ( !from ) {
  263.         Error(label);
  264.     }
  265.     lnSingle = log(tosingle);
  266.     lnMulti = log(1 - tosingle);
  267.     if ( !intergeniclen.Init(from,"IntergenicDistribution:") ) {
  268.         Error(label);
  269.     }
  270.     double lnthrough = intergeniclen.Through(seqlen);
  271.     lnthrough = (lnthrough == 0) ? BadScore : log(lnthrough);
  272.     lnDen = log(initp / intergeniclen.AvLen());
  273.     lnThrough = (lnthrough == BadScore) ? BadScore : lnDen + lnthrough;
  274.     initialised = true;
  275. }
  276. END_NCBI_SCOPE
  277. /*
  278.  * ===========================================================================
  279.  * $Log: states.cpp,v $
  280.  * Revision 1000.2  2004/06/01 18:08:40  gouriano
  281.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  282.  *
  283.  * Revision 1.3  2004/05/21 21:41:03  gorelenk
  284.  * Added PCH ncbi_pch.hpp
  285.  *
  286.  * Revision 1.2  2003/11/06 15:02:21  ucko
  287.  * Use iostream interface from ncbistre.hpp for GCC 2.95 compatibility.
  288.  *
  289.  * Revision 1.1  2003/10/24 15:07:25  dicuccio
  290.  * Initial revision
  291.  *
  292.  * ===========================================================================
  293.  */