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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: states.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 19:39:22  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __STATES__HPP
  10. #define __STATES__HPP
  11. /*  $Id: states.hpp,v 1000.0 2003/10/29 19:39:22 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.  * Authors:  Alexandre Souvorov
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <algorithm>
  43. BEGIN_NCBI_SCOPE
  44. inline double AddProbabilities(double score1, double score2)
  45. {
  46.     if(score1 == BadScore) return score2;
  47.     else if(score2 == BadScore) return score1;
  48.     else if(score1 >= score2)  return score1+log(1+exp(score2-score1));
  49.     else return score2+log(1+exp(score1-score2));
  50. }
  51. inline double AddScores(double score1, double score2)
  52. {
  53.     if(score1 == BadScore || score2 == BadScore) return BadScore;
  54.     else return score1+score2;
  55. }
  56. template<class State> inline void EvaluateInitialScore(State& r)
  57. {
  58.     int len = r.Stop()-r.Start()+1;
  59.     if(len >= r.MaxLen() || r.StopInside()) return;   // >= makes sence here
  60.     int minlen = 1;
  61.     if(!r.NoRightEnd())
  62.     {
  63.         if(r.isPlus()) minlen += r.TerminalPtr()->Left();
  64.         else  minlen += r.TerminalPtr()->Right();
  65.     }
  66.     if(len < minlen) return;   // states can go beyon the start
  67.     // so we shouldn't enforce MinLen
  68.     double score;
  69.     if(r.NoRightEnd()) 
  70.     {
  71.         score = r.ThroughLengthScore();
  72.     }
  73.     else 
  74.     {
  75.         score = r.InitialLengthScore();
  76.     }
  77.     if(score == BadScore) return;
  78.     double scr;
  79.     scr = r.RgnScore();
  80.     if(scr == BadScore) return;
  81.     score += scr;
  82.     if(!r.NoRightEnd())
  83.     {
  84.         scr = r.TermScore();
  85.         if(scr == BadScore) return;
  86.         score += scr;
  87.     }
  88.     if(r.OpenRgn()) r.UpdateScore(score);
  89. }
  90. inline double Lorentz::ClosingScore(int l) const
  91. {
  92.     if(l == MaxLen()) return BadScore;
  93.     int i = (l-1)/step;
  94.     int delx = min((i+1)*step,MaxLen())-l;
  95.     double dely = (i == 0 ? 1 : clscore[i-1])-clscore[i];
  96.     return log(dely/step*delx+clscore[i]);
  97.     // return log(clscore[(l-1)/step]);
  98. }
  99. inline HMM_State::HMM_State(int strn, int point) : strand(strn), stop(point), 
  100. leftstate(0), score(BadScore), terminal(0) 
  101. {
  102.     if(seqscr == 0) {
  103.         NCBI_THROW(CGnomonException, eGenericError,
  104.                    "GNOMON: seqscr is not initialised in HMM_State");
  105.     }
  106. }
  107. inline int HMM_State::MinLen() const
  108. {
  109.     int minlen = 1;
  110.     if(!NoLeftEnd())
  111.     {
  112.         if(isPlus()) minlen += leftstate->terminal->Right();
  113.         else minlen += leftstate->terminal->Left();
  114.     }
  115.     if(!NoRightEnd())
  116.     {
  117.         if(isPlus()) minlen += terminal->Left();
  118.         else  minlen += terminal->Right();
  119.     }
  120.     return minlen;
  121. }
  122. inline int HMM_State::RegionStart() const
  123. {
  124.     if(NoLeftEnd())  return 0;
  125.     else
  126.     {
  127.         int a = leftstate->stop+1;
  128.         if(isPlus()) a += leftstate->terminal->Right();
  129.         else a += leftstate->terminal->Left();
  130.         return a;
  131.     }
  132. }
  133. inline int HMM_State::RegionStop() const
  134. {
  135.     if(NoRightEnd()) return seqscr->SeqLen()-1;
  136.     else 
  137.     {
  138.         int b = stop;
  139.         if(isPlus()) b -= terminal->Left();
  140.         else  b -= terminal->Right();
  141.         return b;
  142.     }
  143. }
  144. inline bool Exon::StopInside() const
  145. {
  146.     int frame;
  147.     if(isPlus())
  148.     {
  149.         frame = (Phase()-Stop())%3;    // Stop()-Phase() is left codon end
  150.         if(frame < 0) frame += 3;
  151.     }
  152.     else
  153.     {
  154.         frame = (Phase()+Stop())%3;    // Stop()+Phase() is right codon end
  155.     }
  156.     return seqscr->StopInside(Start(),Stop(),Strand(),frame);
  157. }
  158. inline bool Exon::OpenRgn() const
  159. {
  160.     int frame;
  161.     if(isPlus())
  162.     {
  163.         frame = (Phase()-Stop())%3;    // Stop()-Phase() is left codon end
  164.         if(frame < 0) frame += 3;
  165.     }
  166.     else
  167.     {
  168.         frame = (Phase()+Stop())%3;    // Stop()+Phase() is right codon end
  169.     }
  170.     return seqscr->OpenCodingRegion(Start(),Stop(),Strand(),frame);
  171. }
  172. inline double Exon::RgnScore() const
  173. {
  174.     int frame;
  175.     if(isPlus())
  176.     {
  177.         frame = (Phase()-Stop())%3;
  178.         if(frame < 0) frame += 3;
  179.     }
  180.     else
  181.     {
  182.         frame = (Phase()+Stop())%3;
  183.     }
  184.     return seqscr->CodingScore(RegionStart(),RegionStop(),Strand(),frame);
  185. }
  186. inline void Exon::UpdatePrevExon(const Exon& e)
  187. {
  188.     mscore = max(score,e.MScore());
  189.     prevexon = &e;
  190.     while(prevexon != 0 && prevexon->Score() <= Score()) prevexon = prevexon->prevexon;
  191. }
  192. inline SingleExon::SingleExon(int strn, int point) : Exon(strn,point,2)
  193. {
  194.     if(!initialised) Error("Exon is not initialisedn");
  195.     terminal = isPlus() ? &seqscr->Stop() : &seqscr->Start();
  196.     if(isMinus()) phase = 0;
  197.     EvaluateInitialScore(*this);
  198. }
  199. inline double SingleExon::LengthScore() const 
  200. {
  201.     return singlelen.Score(Stop()-Start()+1)+LnThree;
  202. }
  203. inline double SingleExon::TermScore() const
  204. {
  205.     if(isPlus()) return seqscr->StopScore(Stop(),Strand());
  206.     else return seqscr->StartScore(Stop(),Strand());
  207. }
  208. inline double SingleExon::BranchScore(const Intergenic& next) const 
  209.     if(isPlus() || (Stop()-Start())%3 == 2) return LnHalf;
  210.     else return BadScore;
  211. }
  212. inline FirstExon::FirstExon(int strn, int ph, int point) : Exon(strn,point,ph)
  213. {
  214.     if(!initialised) Error("Exon is not initialisedn");
  215.     if(isPlus())
  216.     {
  217.         terminal = &seqscr->Donor();
  218.     }
  219.     else
  220.     {
  221.         phase = 0;
  222.         terminal = &seqscr->Start();
  223.     }
  224.     EvaluateInitialScore(*this);
  225. }
  226. inline double FirstExon::LengthScore() const
  227. {
  228.     int last = Stop()-Start();
  229.     return firstlen.Score(last+1)+LnThree+firstphase[last%3];
  230. inline double FirstExon::TermScore() const
  231. {
  232.     if(isPlus()) return seqscr->DonorScore(Stop(),Strand());
  233.     else return seqscr->StartScore(Stop(),Strand());
  234. }
  235. inline double FirstExon::BranchScore(const Intron& next) const
  236. {
  237.     if(Strand() != next.Strand()) return BadScore;
  238.     int ph = isPlus() ? Phase() : Phase()+Stop()-Start();
  239.     if((ph+1)%3 == next.Phase()) return 0;
  240.     else return BadScore;
  241. }
  242. inline InternalExon::InternalExon(int strn, int ph, int point) : Exon(strn,point,ph)
  243. {
  244.     if(!initialised) Error("Exon is not initialisedn");
  245.     terminal = isPlus() ? &seqscr->Donor() : &seqscr->Acceptor();
  246.     EvaluateInitialScore(*this);
  247. }
  248. inline double InternalExon::LengthScore() const 
  249. {
  250.     int ph0,ph1;
  251.     int last = Stop()-Start();
  252.     if(isPlus())
  253.     {
  254.         ph1 = Phase();
  255.         ph0 = (ph1-last)%3;
  256.         if(ph0 < 0) ph0 += 3;
  257.     }
  258.     else
  259.     {
  260.         ph0 = Phase();
  261.         ph1 = (ph0+last)%3;
  262.     }
  263.     return internallen.Score(last+1)+LnThree+internalphase[ph0][ph1];
  264. }
  265. inline double InternalExon::TermScore() const
  266. {
  267.     if(isPlus()) return seqscr->DonorScore(Stop(),Strand());
  268.     else return seqscr->AcceptorScore(Stop(),Strand());
  269. }
  270. inline double InternalExon::BranchScore(const Intron& next) const
  271. {
  272.     if(Strand() != next.Strand()) return BadScore;
  273.     int ph = isPlus() ? Phase() : Phase()+Stop()-Start();
  274.     if((ph+1)%3 == next.Phase()) return 0;
  275.     else return BadScore;
  276. }
  277. inline LastExon::LastExon(int strn, int ph, int point) : Exon(strn,point,ph)
  278. {
  279.     if(!initialised) Error("Exon is not initialisedn");
  280.     if(isPlus())
  281.     {
  282.         phase = 2;
  283.         terminal = &seqscr->Stop();
  284.     }
  285.     else
  286.     {
  287.         terminal = &seqscr->Acceptor();
  288.     }
  289.     EvaluateInitialScore(*this);
  290. }
  291. inline double LastExon::LengthScore() const 
  292. {
  293.     int last = Stop()-Start();
  294.     return lastlen.Score(last+1)+LnThree;
  295. }
  296. inline double LastExon::TermScore() const
  297. {
  298.     if(isPlus()) return seqscr->StopScore(Stop(),Strand());
  299.     else return seqscr->AcceptorScore(Stop(),Strand());
  300. }
  301. inline double LastExon::BranchScore(const Intergenic& next) const 
  302.     if(isPlus() || (Phase()+Stop()-Start())%3 == 2) return LnHalf;
  303.     else return BadScore; 
  304. }
  305. inline Intron::Intron(int strn, int ph, int point) : HMM_State(strn,point), phase(ph)
  306. {
  307.     if(!initialised) Error("Intron is not initialisedn");
  308.     terminal = isPlus() ? &seqscr->Acceptor() : &seqscr->Donor();
  309.     EvaluateInitialScore(*this);
  310. }
  311. inline double Intron::LengthScore() const 
  312.     if(SplittedStop()) return BadScore;
  313.     else  return intronlen.Score(Stop()-Start()+1); 
  314. }
  315. inline double Intron::ClosingLengthScore() const 
  316.     return intronlen.ClosingScore(Stop()-Start()+1); 
  317. }
  318. inline double Intron::InitialLengthScore() const 
  319.     return lnDen[Phase()]+ClosingLengthScore(); 
  320. }
  321. inline bool Intron::OpenRgn() const
  322. {
  323.     return seqscr->OpenNonCodingRegion(Start(),Stop(),Strand());
  324. }
  325. inline double Intron::TermScore() const
  326. {
  327.     if(isPlus()) return seqscr->AcceptorScore(Stop(),Strand());
  328.     else return seqscr->DonorScore(Stop(),Strand());
  329. }
  330. inline double Intron::BranchScore(const LastExon& next) const
  331. {
  332.     if(Strand() != next.Strand()) return BadScore;
  333.     if(isPlus())
  334.     {
  335.         int shift = next.Stop()-next.Start();
  336.         if((Phase()+shift)%3 == next.Phase()) return lnTerminal;
  337.     }
  338.     else if(Phase() == next.Phase()) return lnTerminal;
  339.     return BadScore;
  340. }
  341. inline double Intron::BranchScore(const InternalExon& next) const
  342. {
  343.     if(Strand() != next.Strand()) return BadScore;
  344.     if(isPlus())
  345.     {
  346.         int shift = next.Stop()-next.Start();
  347.         if((Phase()+shift)%3 == next.Phase()) return lnInternal;
  348.     }
  349.     else if(Phase() == next.Phase()) return lnInternal;
  350.     return BadScore;
  351. }
  352. inline bool Intron::SplittedStop() const
  353. {
  354.     if(Phase() == 0 || NoLeftEnd() || NoRightEnd()) 
  355.     {
  356.         return false;
  357.     }
  358.     else if(isPlus()) 
  359.     {
  360.         return seqscr->SplittedStop(LeftState()->Stop(),Stop(),Strand(),Phase()-1);
  361.     }
  362.     else
  363.     {
  364.         return seqscr->SplittedStop(Stop(),LeftState()->Stop(),Strand(),Phase()-1);
  365.     }
  366. }
  367. inline Intergenic::Intergenic(int strn, int point) : HMM_State(strn,point)
  368. {
  369.     if(!initialised) Error("Intergenic is not initialisedn");
  370.     terminal = isPlus() ? &seqscr->Start() : &seqscr->Stop();
  371.     EvaluateInitialScore(*this);
  372. }
  373. inline bool Intergenic::OpenRgn() const
  374. {
  375.     return seqscr->OpenIntergenicRegion(Start(),Stop());
  376. }
  377. inline bool Intergenic::InAlignment() const
  378. {
  379.     if(NoRightEnd() || NoLeftEnd()) return false;     // takes care of alignment extending to the edge
  380.     else if(isPlus()) return seqscr->InAlignment(Start(),Stop()-3);   // start codon is included in intergenic
  381.     else return seqscr->InAlignment(Start()+3,Stop());   // start codon is included in intergenic
  382. }
  383. inline double Intergenic::RgnScore() const
  384. {
  385.     return seqscr->IntergenicScore(RegionStart(),RegionStop(),Strand());
  386. }
  387. inline double Intergenic::TermScore() const
  388. {
  389.     if(isPlus()) return seqscr->StartScore(Stop(),Strand());
  390.     else return seqscr->StopScore(Stop(),Strand());
  391. }
  392. inline double Intergenic::BranchScore(const FirstExon& next) const 
  393. {
  394.     if(&next == leftstate)
  395.     {
  396.         if(next.isMinus()) return lnMulti;
  397.         else return BadScore;
  398.     }
  399.     else if(isPlus() && next.isPlus()) 
  400.     {
  401.         if((next.Stop()-next.Start())%3 == next.Phase()) return lnMulti;
  402.         else return BadScore;
  403.     }
  404.     else return BadScore;
  405. }
  406. inline double Intergenic::BranchScore(const SingleExon& next) const 
  407. {
  408.     if(&next == leftstate)
  409.     {
  410.         if(next.isMinus()) return lnSingle;
  411.         else return BadScore;
  412.     }
  413.     else if(isPlus() && next.isPlus() && 
  414.             (next.Stop()-next.Start())%3 == 2) return lnSingle;
  415.     else return BadScore;
  416. }
  417. END_NCBI_SCOPE
  418. /*
  419.  * ===========================================================================
  420.  * $Log: states.hpp,v $
  421.  * Revision 1000.0  2003/10/29 19:39:22  gouriano
  422.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  423.  *
  424.  * Revision 1.1  2003/10/24 15:07:25  dicuccio
  425.  * Initial revision
  426.  *
  427.  * ===========================================================================
  428.  */
  429. #endif  // __STATES__HPP