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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gene_finder.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/11/21 21:31:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GENE_FINDER__HPP
  10. #define __GENE_FINDER__HPP
  11. /*  $Id: gene_finder.hpp,v 1000.1 2003/11/21 21:31:53 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 <corelib/ncbi_limits.hpp>
  43. #include <algo/gnomon/gnomon_exception.hpp>
  44. #include <string>
  45. #include <vector>
  46. #include <list>
  47. #include <set>
  48. #include <algorithm>
  49. #include <math.h>
  50. BEGIN_NCBI_SCOPE
  51. typedef vector<char> CVec;
  52. typedef vector<int> IVec;
  53. typedef vector<double> DVec;
  54. struct IPair : pair<int,int> 
  55. {
  56.     IPair(int f, int s) : pair<int,int>(f,s) {}
  57.     bool operator<(const IPair& p) const { return second < p.first; }
  58.     bool operator>(const IPair& p) const { return first > p.second; }
  59.     bool Intersect(const IPair& p) const { return !(*this < p || *this > p); }
  60.     bool Include(int i) const { return (i >= first && i <= second); }
  61. };
  62. enum Nucleotides { nA, nC, nG, nT, nN };
  63. enum { Plus, Minus };
  64. extern const double BadScore;
  65. extern const double LnHalf;
  66. extern const double LnThree;
  67. extern const int toMinus[5];
  68. extern const int TooFarLen;
  69. extern const char* aa_table;
  70. template<int order> class MarkovChain
  71. {
  72. public:
  73.     void InitScore(CNcbiIfstream& from);
  74.     double Score(const int* seq) const { return next[*(seq-order)].Score(seq); }
  75. private:
  76.     typedef MarkovChain<order> Type;
  77.     friend class MarkovChain<order+1>;
  78.     void Init(CNcbiIfstream& from);
  79.     void Average(Type& mc0, Type& mc1, Type& mc2, Type& mc3);
  80.     void toScore();
  81.     MarkovChain<order-1> next[5];
  82. };
  83. template<> class MarkovChain<0>
  84. {
  85. public:
  86.     void InitScore(CNcbiIfstream& from);
  87.     double Score(const int* seq) const { return score[*seq]; }
  88. private:
  89.     typedef MarkovChain<0> Type;
  90.     friend class MarkovChain<1>;
  91.     void Init(CNcbiIfstream& from);
  92.     void Average(Type& mc0, Type& mc1, Type& mc2, Type& mc3);
  93.     void toScore();
  94.     double score[5];
  95. };
  96. template<int order> class MarkovChainArray
  97. {
  98. public:
  99.     void InitScore(int l, CNcbiIfstream& from);
  100.     double Score(const int* seq) const;
  101. private:
  102.     int length;
  103.     vector< MarkovChain<order> > mc;
  104. };
  105. class InputModel
  106. {
  107. public:
  108.     virtual ~InputModel() = 0;
  109. protected:
  110.     static void Error(const string& label) {
  111.         NCBI_THROW(CGnomonException, eGenericError, label);
  112.     }
  113.     static pair<int,int> FindContent(CNcbiIfstream& from, const string& label, int cgcontent);
  114. };
  115. //Terminal's score is located on the last position of the left state
  116. class Terminal : public InputModel
  117. {
  118. public:
  119.     int InExon() const { return inexon; }
  120.     int InIntron() const { return inintron; }
  121.     int Left() const { return left; }
  122.     int Right() const { return right; }
  123.     virtual double Score(const IVec& seq, int i) const = 0;
  124.     ~Terminal() {}
  125. protected:
  126.     int inexon, inintron, left, right;
  127. };
  128. class MDD_Donor : public Terminal
  129. {
  130. public:
  131.     MDD_Donor(const string& file, int cgcontent);
  132.     double Score(const IVec& seq, int i) const;
  133. private:
  134.     IVec position, consensus;
  135.     vector< MarkovChainArray<0> > matrix;
  136. };
  137. template<int order> class WAM_Donor : public Terminal
  138. {
  139. public:
  140.     WAM_Donor(const string& file, int cgcontent);
  141.     double Score(const IVec& seq, int i) const;
  142. private:
  143.     MarkovChainArray<order> matrix;
  144. };
  145. template<int order> class WAM_Acceptor : public Terminal
  146. {
  147. public:
  148.     WAM_Acceptor(const string& file, int cgcontent);
  149.     double Score(const IVec& seq, int i) const;
  150. private:
  151.     MarkovChainArray<order> matrix;
  152. };
  153. class WMM_Start : public Terminal
  154. {
  155. public:
  156.     WMM_Start(const string& file, int cgcontent);
  157.     double Score(const IVec& seq, int i) const;
  158. private:
  159.     MarkovChainArray<0> matrix;
  160. };
  161. class WAM_Stop : public Terminal
  162. {
  163. public:
  164.     WAM_Stop(const string& file, int cgcontent);
  165.     double Score(const IVec& seq, int i) const;
  166. private:
  167.     MarkovChainArray<1> matrix;
  168. };
  169. class CodingRegion : public InputModel
  170. {
  171. public:
  172.     virtual double Score(const IVec& seq, int i, int codonshift) const = 0;
  173.     ~CodingRegion() {}
  174. };
  175. template<int order> class MC3_CodingRegion : public CodingRegion
  176. {
  177. public:
  178.     MC3_CodingRegion(const string& file, int cgcontent);
  179.     double Score(const IVec& seq, int i, int codonshift) const;
  180. private:
  181.     MarkovChain<order> matrix[3];
  182. };
  183. class NonCodingRegion : public InputModel
  184. {
  185. public:
  186.     virtual double Score(const IVec& seq, int i) const = 0;
  187.     ~NonCodingRegion() {}
  188. };
  189. template<int order> class MC_NonCodingRegion : public NonCodingRegion
  190. {
  191. public:
  192.     MC_NonCodingRegion(const string& file, int cgcontent);
  193.     double Score(const IVec& seq, int i) const;
  194. private:
  195.     MarkovChain<order> matrix;
  196. };
  197. class NullRegion : public NonCodingRegion
  198. {
  199. public:
  200.     double Score(const IVec& seq, int i) const { return 0; };
  201. };
  202. class AlignVec : public vector<IPair>
  203. {
  204. public:
  205.     typedef vector<IPair>::iterator It;
  206.     typedef vector<IPair>::const_iterator ConstIt;
  207.     enum { Prot, EST, mRNA, RefSeq, RefSeqBest, Wall};
  208.     AlignVec(int s = Plus, int i = 0, int t = EST, IPair cdl = IPair(-1,-1)) : type(t), strand(s), id(i), 
  209.     limits(numeric_limits<int>::max(),0), cds_limits(cdl), score(BadScore) {}
  210.     void Insert(IPair p);
  211.     void Erase(int i);
  212.     IPair Limits() const { return limits; }
  213.     IPair CdsLimits() const { return cds_limits; }
  214.     void SetCdsLimits(IPair p) { cds_limits = p; }
  215.     bool Intersect(const AlignVec& a) const 
  216.     {
  217.         return limits.Intersect(a.limits); 
  218.     }
  219.     void SetStrand(int s) { strand = s; }
  220.     int Strand() const { return strand; }
  221.     void SetType(int t) { type = t; }
  222.     int Type() const { return type; }
  223.     void SetID(int i) { id = i; }
  224.     int ID() const { return id; }
  225.     bool operator<(const AlignVec& a) const { return limits < a.limits; }
  226.     void Init();
  227.     void SetScore(double s) { score = s; }
  228.     double Score() const { return score; }
  229.     void Extend(const AlignVec& a); 
  230. private:
  231.     int type, strand, id;
  232.     IPair limits, cds_limits;
  233.     double score;
  234. };
  235. CNcbiIstream& operator>>(CNcbiIstream& s, AlignVec& a);
  236. CNcbiOstream& operator<<(CNcbiOstream& s, const AlignVec& a);
  237. class CCluster : public list<AlignVec>
  238. {
  239. public:
  240.     typedef list<AlignVec>::iterator It;
  241.     typedef list<AlignVec>::const_iterator ConstIt;
  242.     CCluster(int f = numeric_limits<int>::max(), int s = 0, int t = AlignVec::Prot) : limits(f,s), type(t) {}
  243.     void Insert(const AlignVec& a);
  244.     void Insert(const CCluster& c);
  245.     IPair Limits() const { return limits; }
  246.     int Type() const { return type; }
  247.     bool operator<(const CCluster& c) const { return limits < c.limits; }
  248.     void Init(int first, int second, int t);
  249. private:
  250.     IPair limits;
  251.     int type;
  252. };
  253. CNcbiIstream& operator>>(CNcbiIstream& s, CCluster& c);
  254. CNcbiOstream& operator<<(CNcbiOstream& s, const CCluster& c);
  255. class CClusterSet : public set<CCluster>
  256. {
  257. public:
  258.     typedef set<CCluster>::iterator It;
  259.     typedef set<CCluster>::const_iterator ConstIt;
  260.     CClusterSet() {}
  261.     CClusterSet(string c) : contig(c) {}
  262.     void InsertAlignment(const AlignVec& a);
  263.     void InsertCluster(CCluster c);
  264.     string Contig() const { return contig; }
  265.     void Init(string cnt);
  266. private:
  267.     string contig;
  268. };
  269. CNcbiIstream& operator>>(CNcbiIstream& s, CClusterSet& cls);
  270. CNcbiOstream& operator<<(CNcbiOstream& s, const CClusterSet& cls);
  271. class CFrameShiftInfo
  272. {
  273. public:
  274.     CFrameShiftInfo(int l, bool is_i, char i_v = 0) : loc(l), is_insert(is_i), insert_value(i_v) {}
  275.     int Loc() const { return loc; }
  276.     bool IsInsertion() const { return is_insert; }
  277.     bool IsDeletion() const { return !is_insert; }
  278.     char InsertValue() const { return insert_value; }
  279.     bool operator<(const CFrameShiftInfo& fsi) const { return loc < fsi.loc; }
  280. private:
  281.     int loc;  // location for deletion, insertion before location
  282.     // incertion - when I INCERT a new base in sequence
  283.     bool is_insert;
  284.     char insert_value;
  285. };
  286. typedef vector<CFrameShiftInfo> TFrameShifts;
  287. class SeqScores
  288. {
  289. public:
  290.     SeqScores (Terminal& a, Terminal& d, Terminal& stt, Terminal& stp, 
  291.                CodingRegion& cr, NonCodingRegion& ncr, NonCodingRegion& ing, 
  292.                CVec& sequence, int from, int to, const CClusterSet& cls, 
  293.                const TFrameShifts& initial_fshifts, bool repeats, bool leftwall, 
  294.                bool rightwall, string cntg);
  295.     int Shift() const { return shift; }
  296.     int AcceptorNumber(int strand) const { return anum[strand]; }
  297.     int DonorNumber(int strand) const { return dnum[strand]; }
  298.     int StartNumber(int strand) const { return sttnum[strand]; }
  299.     int StopNumber(int strand) const { return stpnum[strand]; }
  300.     double AcceptorScore(int i, int strand) const { return ascr[strand][i]; }
  301.     double DonorScore(int i, int strand) const { return dscr[strand][i]; }
  302.     double StartScore(int i, int strand) const { return sttscr[strand][i]; }
  303.     double StopScore(int i, int strand) const { return stpscr[strand][i]; }
  304.     Terminal& Acceptor() const { return acceptor; }
  305.     Terminal& Donor() const { return donor; }
  306.     Terminal& Start() const { return start; }
  307.     Terminal& Stop() const { return stop; }
  308.     const CClusterSet& Alignments() const { return cluster_set; }
  309.     const TFrameShifts& SeqFrameShifts() const { return fshifts; }
  310.     string Contig() const { return contig; }
  311.     bool StopInside(int a, int b, int strand, int frame) const;
  312.     bool OpenCodingRegion(int a, int b, int strand, int frame) const;
  313.     double CodingScore(int a, int b, int strand, int frame) const;
  314.     bool OpenNonCodingRegion(int a, int b, int strand) const;
  315.     double NonCodingScore(int a, int b, int strand) const;
  316.     bool OpenIntergenicRegion(int a, int b) const;
  317.     bool InAlignment(int a, int b) const;
  318.     double IntergenicScore(int a, int b, int strand) const;
  319.     int SeqLen() const { return seq[0].size(); }
  320.     bool SplittedStop(int id, int ia, int strand, int ph) const 
  321.     { return (dsplit[strand][ph][id]&asplit[strand][ph][ia]) ? true : false; }
  322.     bool isStart(int i, int strand) const;
  323.     bool isStop(int i, int strand) const;
  324.     bool isAG(int i, int strand) const;
  325.     bool isGT(int i, int strand) const;
  326.     bool isConsensusIntron(int i, int j, int strand) const;
  327.     const int* SeqPtr(int i, int strand) const;
  328.     int SeqMap(int i, bool forwrd) const;  // maps new coordinates to old coordinates,
  329.     // if insertion gives next or previous point
  330.     // depending on forwrd
  331.     int RevSeqMap(int i, bool forwrd) const; // maps old coordinates to new coordinates, 
  332.     // if deletion gives next or previous point
  333.     // depending on forwrd
  334. private:
  335.     Terminal &acceptor, &donor, &start, &stop;
  336.     CodingRegion &cdr;
  337.     NonCodingRegion &ncdr, &intrg;
  338.     const CClusterSet& cluster_set;
  339.     TFrameShifts fshifts;
  340.     IVec seq[2], laststop[2][3], notinexon[2][3], notinintron[2], notining;
  341.     IVec seq_map, rev_seq_map;
  342.     DVec ascr[2], dscr[2], sttscr[2], stpscr[2], ncdrscr[2], ingscr[2], cdrscr[2][3];
  343.     IVec asplit[2][2], dsplit[2][2];
  344.     IVec inalign;
  345.     int anum[2], dnum[2], sttnum[2], stpnum[2];
  346.     int shift;
  347.     string contig;
  348. };
  349. struct StateScores
  350. {
  351.     double score,branch,length,region,term;
  352. };
  353. template<class State> StateScores CalcStateScores(const State& st)
  354. {
  355.     StateScores sc;
  356.     if(st.NoLeftEnd())
  357.     {
  358.         if(st.NoRightEnd()) sc.length = st.ThroughLengthScore();
  359.         else sc.length = st.InitialLengthScore();
  360.     }
  361.     else
  362.     {
  363.         if(st.NoRightEnd()) sc.length = st.ClosingLengthScore();
  364.         else sc.length = st.LengthScore();
  365.     }
  366.     sc.region = st.RgnScore();
  367.     sc.term = st.TermScore();
  368.     if(sc.term == BadScore) sc.term = 0;
  369.     sc.score = st.Score();
  370.     if(st.LeftState()) sc.score -= st.LeftState()->Score();
  371.     sc.branch = sc.score-sc.length-sc.region-sc.term;
  372.     return sc;
  373. }
  374. class Lorentz
  375. {
  376. public:
  377.     bool Init(CNcbiIstream& from, const string& label);
  378.     double Score(int l) const { return score[(l-1)/step]; }
  379.     double ClosingScore(int l) const;
  380.     int MinLen() const { return minl; }
  381.     int MaxLen() const { return maxl; }
  382.     double AvLen() const { return avlen; }
  383.     double Through(int seqlen) const;
  384. private:
  385.     int minl, maxl, step;
  386.     double A, L, avlen, lnthrough;
  387.     DVec score, clscore;
  388. };
  389. class HMM_State : public InputModel
  390. {
  391. public:
  392.     HMM_State(int strn, int point);
  393.     const HMM_State* LeftState() const { return leftstate; }
  394.     const Terminal* TerminalPtr() const { return terminal; }
  395.     void UpdateLeftState(const HMM_State& left) { leftstate = &left; }
  396.     void UpdateScore(double scr) { score = scr; }
  397.     int MaxLen() const { return numeric_limits<int>::max(); };
  398.     int MinLen() const;
  399.     bool StopInside() const { return false; }
  400.     bool InAlignment() const { return false; }
  401.     int Strand() const { return strand; }
  402.     bool isPlus() const { return (strand == Plus); }
  403.     bool isMinus() const { return (strand == Minus); }
  404.     double Score() const { return score; }
  405.     int Start() const { return leftstate ? leftstate->stop+1 : 0; }
  406.     bool NoRightEnd() const { return stop < 0; }
  407.     bool NoLeftEnd() const { return leftstate == 0; }
  408.     int Stop() const  { return NoRightEnd() ? seqscr->SeqLen()-1 : stop; }
  409.     int RegionStart() const;
  410.     int RegionStop() const;
  411.     virtual StateScores GetStateScores() const = 0;
  412.     virtual string GetStateName() const = 0;
  413.     static void SetSeqScores(const SeqScores& s) { seqscr = &s; }
  414. protected:
  415.     int stop, strand;
  416.     double score;
  417.     const HMM_State* leftstate;
  418.     const Terminal* terminal;
  419.     static const SeqScores* seqscr;
  420. };
  421. class Intron; 
  422. class Intergenic;
  423. class Exon : public HMM_State
  424. {
  425. public:
  426.     static void Init(const string& file, int cgcontent);
  427.     Exon(int strn, int point, int ph) : HMM_State(strn,point), phase(ph), 
  428.     prevexon(0), mscore(BadScore) {}
  429.     int Phase() const { return phase; }
  430.     bool StopInside() const;
  431.     bool OpenRgn() const;
  432.     double RgnScore() const;
  433.     double DenScore() const { return 0; }
  434.     double ThroughLengthScore() const { return BadScore; } 
  435.     double InitialLengthScore() const { return BadScore; }
  436.     double ClosingLengthScore() const { return BadScore; }
  437.     void UpdatePrevExon(const Exon& e);
  438.     double MScore() const { return mscore; }
  439. protected:
  440.     int phase;
  441.     const Exon* prevexon;
  442.     double mscore;
  443.     static double firstphase[3], internalphase[3][3];
  444.     static Lorentz firstlen, internallen, lastlen, singlelen; 
  445.     static bool initialised;
  446. };
  447. class SingleExon : public Exon
  448. {
  449. public:
  450.     ~SingleExon() {}
  451.     SingleExon(int strn, int point);
  452.     int MaxLen() const { return singlelen.MaxLen(); }
  453.     int MinLen() const { return singlelen.MinLen(); }
  454.     const SingleExon* PrevExon() const { return static_cast<const SingleExon*>(prevexon); }
  455.     double LengthScore() const; 
  456.     double TermScore() const;
  457.     double BranchScore(const HMM_State& next) const { return BadScore; }
  458.     double BranchScore(const Intergenic& next) const;
  459.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  460.     string GetStateName() const { return "SingleExon"; }
  461. };
  462. class FirstExon : public Exon
  463. {
  464. public:
  465.     ~FirstExon() {}
  466.     FirstExon(int strn, int ph, int point);
  467.     int MaxLen() const { return firstlen.MaxLen(); }
  468.     int MinLen() const { return firstlen.MinLen(); }
  469.     const FirstExon* PrevExon() const { return static_cast<const FirstExon*>(prevexon); }
  470.     double LengthScore() const;
  471.     double TermScore() const;
  472.     double BranchScore(const HMM_State& next) const { return BadScore; }
  473.     double BranchScore(const Intron& next) const;
  474.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  475.     string GetStateName() const { return "FirstExon"; }
  476. };
  477. class InternalExon : public Exon
  478. {
  479. public:
  480.     ~InternalExon() {}
  481.     InternalExon(int strn, int ph, int point);
  482.     int MaxLen() const { return internallen.MaxLen(); }
  483.     int MinLen() const { return internallen.MinLen(); }
  484.     const InternalExon* PrevExon() const { return static_cast<const InternalExon*>(prevexon); }
  485.     double LengthScore() const; 
  486.     double TermScore() const;
  487.     double BranchScore(const HMM_State& next) const { return BadScore; }
  488.     double BranchScore(const Intron& next) const;
  489.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  490.     string GetStateName() const { return "InternalExon"; }
  491. };
  492. class LastExon : public Exon
  493. {
  494. public:
  495.     ~LastExon() {}
  496.     LastExon(int strn, int ph, int point);
  497.     int MaxLen() const { return lastlen.MaxLen(); }
  498.     int MinLen() const { return lastlen.MinLen(); }
  499.     const LastExon* PrevExon() const { return static_cast<const LastExon*>(prevexon); }
  500.     double LengthScore() const; 
  501.     double TermScore() const;
  502.     double BranchScore(const HMM_State& next) const { return BadScore; }
  503.     double BranchScore(const Intergenic& next) const;
  504.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  505.     string GetStateName() const { return "LastExon"; }
  506. };
  507. class Intron : public HMM_State
  508. {
  509. public:
  510.     static void Init(const string& file, int cgcontent, int seqlen);
  511.     ~Intron() {}
  512.     Intron(int strn, int ph, int point);
  513.     static int MinIntron() { return intronlen.MinLen(); }   // used for introducing frameshifts
  514.     int MinLen() const { return intronlen.MinLen(); }
  515.     int MaxLen() const { return intronlen.MaxLen(); }
  516.     int Phase() const { return phase; }
  517.     bool OpenRgn() const;
  518.     double RgnScore() const { return 0; }   // Intron scores are substructed from all others
  519.     double TermScore() const;
  520.     double DenScore() const { return lnDen[Phase()]; }
  521.     double LengthScore() const;
  522.     double ClosingLengthScore() const;
  523.     double ThroughLengthScore() const  { return lnThrough[Phase()]; }
  524.     double InitialLengthScore() const;
  525.     double BranchScore(const HMM_State& next) const { return BadScore; }
  526.     double BranchScore(const LastExon& next) const;
  527.     double BranchScore(const InternalExon& next) const;
  528.     bool SplittedStop() const;
  529.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  530.     string GetStateName() const { return "Intron"; }
  531. protected:
  532.     int phase;
  533.     static double lnThrough[3], lnDen[3];
  534.     static double lnTerminal, lnInternal;
  535.     static Lorentz intronlen;
  536.     static bool initialised;
  537. };
  538. class Intergenic : public HMM_State
  539. {
  540. public:
  541.     static void Init(const string& file, int cgcontent, int seqlen);
  542.     ~Intergenic() {}
  543.     Intergenic(int strn, int point);
  544.     bool OpenRgn() const;
  545.     double RgnScore() const;
  546.     double TermScore() const;
  547.     double DenScore() const { return lnDen; }
  548.     double LengthScore() const { return intergeniclen.Score(Stop()-Start()+1); }
  549.     double ClosingLengthScore() const { return intergeniclen.ClosingScore(Stop()-Start()+1); }
  550.     double ThroughLengthScore() const { return lnThrough; }
  551.     double InitialLengthScore() const { return lnDen+ClosingLengthScore(); }
  552.     double BranchScore(const HMM_State& next) const { return BadScore; }
  553.     double BranchScore(const FirstExon& next) const; 
  554.     double BranchScore(const SingleExon& next) const;
  555.     bool InAlignment() const; 
  556.     StateScores GetStateScores() const { return CalcStateScores(*this); }
  557.     string GetStateName() const { return "Intergenic"; }
  558. protected:
  559.     static double lnThrough, lnDen;
  560.     static double lnSingle, lnMulti;
  561.     static Lorentz intergeniclen;
  562.     static bool initialised;
  563. };
  564. template<class T> class ParseVec : public vector<T>
  565. {
  566. public:
  567.     ParseVec() : num(-1) {}
  568.     int num;
  569. };
  570. class Gene;
  571. class Parse
  572. {
  573. public:
  574.     Parse(const SeqScores& ss);
  575.     const HMM_State* Path() const { return path; }
  576.     int PrintGenes(CNcbiOstream& to = cout, CNcbiOstream& toprot = cout,
  577.                    bool complete = false) const;
  578.     void PrintInfo() const;
  579.     list<Gene> GetGenes() const;
  580.     //typedef list<Gene>::iterator GenIt;
  581. private:
  582.     const SeqScores& seqscr;
  583.     const HMM_State* path;
  584.     ParseVec<Intergenic> igplus, igminus;
  585.     ParseVec<Intron> inplus[3], inminus[3];
  586.     ParseVec<FirstExon> feplus[3], feminus;
  587.     ParseVec<InternalExon> ieplus[3], ieminus[3];
  588.     ParseVec<LastExon> leplus, leminus[3];
  589.     ParseVec<SingleExon> seplus, seminus;
  590. };
  591. class ExonData
  592. {
  593.     friend list<Gene> Parse::GetGenes() const;
  594. public:
  595.     ExonData(int stt, int stp, int tp) : start(stt), stop(stp), type(tp) {} 
  596.     int Start() const { return start; }
  597.     int Stop() const { return stop; }
  598.     int Type() const { return type; }
  599.     const set<int>& ChainID() const { return chain_id; }
  600.     const set<int>& ProtID() const { return prot_id; }
  601.     const TFrameShifts& ExonFrameShifts() const { return fshifts; }
  602.     bool Identical(const ExonData& ed) const { return (ed.start == start && ed.stop == stop); }
  603.     bool operator<(const ExonData& ed) const { return (stop < ed.start); }
  604.     enum {Cds, Utr};
  605. private:
  606.     int start, stop, type;
  607.     set<int> chain_id, prot_id;
  608.     TFrameShifts fshifts;
  609. };
  610. class Gene : public vector<ExonData>
  611. {
  612.     friend list<Gene> Parse::GetGenes() const;
  613. public:
  614.     Gene(int s, bool l = true, bool r = true, int csf = 0) : 
  615.         strand(s), leftend(l), rightend(r), cds_shift(csf) {}
  616.     int Strand() const { return strand; }
  617.     int CDS_Shift() const { return cds_shift; }
  618.     const IVec& CDS() const { return cds; }
  619.     bool LeftComplete() const { return leftend; }
  620.     bool RightComplete() const { return rightend; }
  621.     bool Complete() const { return (leftend && rightend); }
  622. private:
  623.     int strand, cds_shift;
  624.     bool leftend, rightend;
  625.     IVec cds;
  626. };
  627. void LogicalCheck(const HMM_State& st, const SeqScores& ss);
  628. END_NCBI_SCOPE
  629. #include "models.hpp"
  630. #include "states.hpp"
  631. /*
  632.  * ===========================================================================
  633.  * $Log: gene_finder.hpp,v $
  634.  * Revision 1000.1  2003/11/21 21:31:53  gouriano
  635.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.2
  636.  *
  637.  * Revision 1.2  2003/11/06 15:02:21  ucko
  638.  * Use iostream interface from ncbistre.hpp for GCC 2.95 compatibility.
  639.  *
  640.  * Revision 1.1  2003/10/24 15:07:25  dicuccio
  641.  * Initial revision
  642.  *
  643.  * ===========================================================================
  644.  */
  645. #endif  // __GENE_FINDER__HPP