bpp-phyl  2.1.0
Bpp/Phyl/Model/Nucleotide/RN95s.cpp
Go to the documentation of this file.
00001 //
00002 // File: RN95s.cpp
00003 // Created by: Laurent Guéguen
00004 // Created on: jeudi 24 février 2011, à 20h 42
00005 //
00006 
00007 /*
00008    Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
00009 
00010    This software is a computer program whose purpose is to provide classes
00011    for phylogenetic data analysis.
00012 
00013    This software is governed by the CeCILL  license under French law and
00014    abiding by the rules of distribution of free software.  You can  use,
00015    modify and/ or redistribute the software under the terms of the CeCILL
00016    license as circulated by CEA, CNRS and INRIA at the following URL
00017    "http://www.cecill.info".
00018 
00019    As a counterpart to the access to the source code and  rights to copy,
00020    modify and redistribute granted by the license, users are provided only
00021    with a limited warranty  and the software's author,  the holder of the
00022    economic rights,  and the successive licensors  have only  limited
00023    liability.
00024 
00025    In this respect, the user's attention is drawn to the risks associated
00026    with loading,  using,  modifying and/or developing or reproducing the
00027    software by the user in light of its specific status of free software,
00028    that may mean  that it is complicated to manipulate,  and  that  also
00029    therefore means  that it is reserved for developers  and  experienced
00030    professionals having in-depth computer knowledge. Users are therefore
00031    encouraged to load and test the software's suitability as regards their
00032    requirements in conditions enabling the security of their systems and/or
00033    data to be ensured and,  more generally, to use and operate it in the
00034    same conditions as regards security.
00035 
00036    The fact that you are presently reading this means that you have had
00037    knowledge of the CeCILL license and that you accept its terms.
00038  */
00039 
00040 #include "RN95s.h"
00041 
00042 #include <Bpp/Numeric/Matrix/MatrixTools.h>
00043 
00044 // From SeqLib:
00045 #include <Bpp/Seq/Container/SequenceContainerTools.h>
00046 
00047 // From the STL:
00048 #include <cmath>
00049 
00050 using namespace bpp;
00051 using namespace std;
00052 
00053 /******************************************************************************/
00054 
00055 RN95s::RN95s(const NucleicAlphabet* alphabet,
00056              double alpha,
00057              double beta,
00058              double gamma,
00059              double delta) :
00060   AbstractParameterAliasable("RN95s."),
00061   AbstractSubstitutionModel(alphabet, "RN95s."),
00062   alpha_(),
00063   beta_(),
00064   gamma_(),
00065   delta_(),
00066   r_(),
00067   c3_(),
00068   c4_(),
00069   c8_(),
00070   p_(size_, size_),
00071   exp1_(),
00072   exp3_(),
00073   l_()
00074 {
00075   double f = 2 * (gamma + delta);
00076 
00077   alpha_ = alpha / f;
00078   beta_ = beta / f;
00079   gamma_ = gamma / f;
00080   delta_ = delta / f;
00081 
00082   double piA = 0.5 * (beta_ + delta_) / (alpha_ + beta_ + 0.5);
00083   double alphaP = (2 * alpha_ * piA + ((0.5 - piA < gamma_) ? 0.5 - piA : gamma_)) / (0.5 - piA);
00084   addParameter_(new Parameter("RN95s.thetaA", piA, new IntervalConstraint(0, 0.5, false, false), true));
00085   addParameter_(new Parameter("RN95s.gamma", gamma_, new IntervalConstraint(0, 0.5, false, false), true));
00086   addParameter_(new Parameter("RN95s.alphaP", alphaP, new IntervalConstraint(1, 1, false), true));
00087 
00088   updateMatrices();
00089 }
00090 
00091 /******************************************************************************/
00092 void RN95s::updateMatrices()
00093 {
00094   freq_[0]  = getParameterValue("thetaA");
00095   double alphaP  = getParameterValue("alphaP");
00096   gamma_  = getParameterValue("gamma");
00097   alpha_  = (alphaP * (0.5 - freq_[0]) - ((0.5 - freq_[0] < gamma_) ? 0.5 - freq_[0] : gamma_)) / (2 * freq_[0]);
00098   delta_  = 0.5 - gamma_;
00099   beta_   = (2 * freq_[0] * (alpha_ + 0.5) - delta_) / (1 - 2 * freq_[0]);
00100 
00101   // stationnary frequencies
00102 
00103   freq_[1] = 0.5 - freq_[0];
00104   freq_[2] = freq_[1];
00105   freq_[3] = freq_[0];
00106 
00107   // Generator matrix:
00108 
00109   generator_(0, 1) = gamma_;
00110   generator_(0, 2) = alpha_;
00111   generator_(0, 3) = delta_;
00112 
00113   generator_(0, 0) = -(gamma_ + alpha_ + delta_);
00114 
00115   generator_(1, 0) = delta_;
00116   generator_(1, 2) = gamma_;
00117   generator_(1, 3) = beta_;
00118 
00119   generator_(1, 1) = -(delta_ + beta_ + gamma_);
00120 
00121   generator_(2, 0) = beta_;
00122   generator_(2, 1) = gamma_;
00123   generator_(2, 3) = delta_;
00124 
00125   generator_(2, 2) = -(gamma_ + beta_ + delta_);
00126 
00127   generator_(3, 0) = delta_;
00128   generator_(3, 1) = alpha_;
00129   generator_(3, 2) = gamma_;
00130 
00131   generator_(3, 3) = -(delta_ + alpha_ + gamma_);
00132 
00133   // Normalization
00134 
00135   double x = 0;
00136   for (unsigned int i = 0; i < 4; i++)
00137   {
00138     x += generator_(i, i) * freq_[i];
00139   }
00140 
00141   r_ = -1 / x;
00142 
00143   MatrixTools::scale(generator_, r_);
00144 
00145   // variables for calculation purposes
00146 
00147   c3_ = alpha_ + gamma_ + beta_ + delta_;
00148   c4_ = gamma_ - alpha_;
00149   c8_ = delta_ - beta_;
00150 
00151 
00152   // eigen vectors and values
00153 
00154   eigenValues_[0] = 0;
00155   eigenValues_[1] = -r_;
00156   eigenValues_[2] = -c3_ * r_;
00157   eigenValues_[3] = -c3_ * r_;
00158 
00159   rightEigenVectors_(0, 0) = 1.;
00160   rightEigenVectors_(1, 0) = 1.;
00161   rightEigenVectors_(2, 0) = 1.;
00162   rightEigenVectors_(3, 0) = 1.;
00163 
00164   rightEigenVectors_(0, 1) = 1.;
00165   rightEigenVectors_(1, 1) = -1;
00166   rightEigenVectors_(2, 1) = 1.;
00167   rightEigenVectors_(3, 1) = -1;
00168 
00169   rightEigenVectors_(0, 2) = (alpha_ * (0.5 - c3_) + gamma_ * 0.5) / (delta_ * (c3_ - 0.5) - beta_ * 0.5);
00170   rightEigenVectors_(1, 2) = 1.;
00171   rightEigenVectors_(2, 2) = (-beta_ * (0.5 - c3_) - delta_ * 0.5) / (delta_ * (c3_ - 0.5) - beta_ * 0.5);
00172   rightEigenVectors_(3, 2) = 1.;
00173 
00174   rightEigenVectors_(0, 3) = 1.;
00175   rightEigenVectors_(1, 3) = (beta_ * (0.5 - c3_) + delta_ * 0.5) / (gamma_ * (c3_ - 0.5) - alpha_ * 0.5);
00176   rightEigenVectors_(2, 3) = 1;
00177   rightEigenVectors_(3, 3) = (-alpha_ * (0.5 - c3_) - gamma_ * 0.5) / (gamma_ * (c3_ - 0.5) - alpha_ * 0.5);
00178 
00179 // Need formula
00180 
00181   try
00182   {
00183     MatrixTools::inv(rightEigenVectors_, leftEigenVectors_);
00184     isNonSingular_ = true;
00185     isDiagonalizable_ = true;
00186     for (unsigned int i = 0; i < size_ && isDiagonalizable_; i++)
00187     {
00188       if (abs(iEigenValues_[i]) > NumConstants::TINY())
00189         isDiagonalizable_ = false;
00190     }
00191   }
00192   catch (ZeroDivisionException& e)
00193   {
00194     ApplicationTools::displayMessage("Singularity during  diagonalization. Taylor series used instead.");
00195 
00196     isNonSingular_ = false;
00197     isDiagonalizable_ = false;
00198     MatrixTools::Taylor(generator_, 30, vPowGen_);
00199   }
00200 
00201   // and the exchangeability_
00202   for (size_t i = 0; i < size_; i++)
00203     for (size_t j = 0; j < size_; j++)
00204       exchangeability_(i,j) = generator_(i,j) / freq_[j];
00205 
00206 }
00207 
00208 /******************************************************************************/
00209 double RN95s::Pij_t(int i, int j, double d) const
00210 {
00211   l_ = rate_ * r_ * d;
00212   exp1_ = exp(-l_);
00213   exp3_ = exp(-c3_ * l_);
00214 
00215   switch (i)
00216   {
00217     {
00218     // A
00219     case 0: {
00220       switch (j)
00221       {
00222       case 0: return freq_[0] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00223       case 1: return freq_[1] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00224       case 2: return freq_[2] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00225       case 3: return freq_[3] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00226       }
00227     }
00228     // C
00229     case 1: {
00230       switch (j)
00231       {
00232       case 0: return freq_[0] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00233       case 1: return freq_[1] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00234       case 2: return freq_[2] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00235       case 3: return freq_[3] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00236       }
00237     }
00238     // G
00239     case 2: {
00240       switch (j)
00241       {
00242       case 0: return freq_[0] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00243       case 1: return freq_[1] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00244       case 2: return freq_[2] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00245       case 3: return freq_[3] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00246       }
00247     }
00248     }
00249   // T, U
00250   case 3: {
00251     switch (j)
00252     {
00253     case 0: return freq_[0] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00254     case 1: return freq_[1] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00255     case 2: return freq_[2] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00256     case 3: return freq_[3] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00257     }
00258   }
00259   }
00260   return 0;
00261 }
00262 
00263 /******************************************************************************/
00264 double RN95s::dPij_dt(int i, int j, double d) const
00265 {
00266   l_ = rate_ * r_ * d;
00267   exp1_ = -1.* rate_* r_* exp(-1. * l_);
00268   exp3_ = -c3_* rate_* r_* exp(-c3_ * l_);
00269 
00270   switch (i)
00271   {
00272     {
00273     // A
00274     case 0: {
00275       switch (j)
00276       {
00277       case 0: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00278       case 1: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00279       case 2: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00280       case 3: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00281       }
00282     }
00283     // C
00284     case 1: {
00285       switch (j)
00286       {
00287       case 0: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00288       case 1: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00289       case 2: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00290       case 3: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00291       }
00292     }
00293     // G
00294     case 2: {
00295       switch (j)
00296       {
00297       case 0: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00298       case 1: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00299       case 2: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00300       case 3: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00301       }
00302     }
00303     }
00304   // T, U
00305   case 3: {
00306     switch (j)
00307     {
00308     case 0: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00309     case 1: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00310     case 2: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00311     case 3: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00312     }
00313   }
00314   }
00315   return 0;
00316 }
00317 
00318 /******************************************************************************/
00319 double RN95s::d2Pij_dt2(int i, int j, double d) const
00320 {
00321   l_ = rate_ * r_ * d;
00322   exp1_ = 1. * rate_ * r_ * 1.* rate_* r_* exp(-1. * l_);
00323   exp3_ = c3_ * rate_ * r_ * c3_ * rate_ * r_ * exp(-c3_ * l_);
00324 
00325   switch (i)
00326   {
00327     {
00328     // A
00329     case 0: {
00330       switch (j)
00331       {
00332       case 0: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00333       case 1: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00334       case 2: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00335       case 3: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00336       }
00337     }
00338     // C
00339     case 1: {
00340       switch (j)
00341       {
00342       case 0: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00343       case 1: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00344       case 2: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00345       case 3: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00346       }
00347     }
00348     // G
00349     case 2: {
00350       switch (j)
00351       {
00352       case 0: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00353       case 1: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00354       case 2: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00355       case 3: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00356       }
00357     }
00358     }
00359   // T, U
00360   case 3: {
00361     switch (j)
00362     {
00363     case 0: return 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00364     case 1: return -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00365     case 2: return 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00366     case 3: return -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00367     }
00368   }
00369   }
00370   return 0;
00371 }
00372 
00373 /******************************************************************************/
00374 
00375 const Matrix<double>& RN95s::getPij_t(double d) const
00376 {
00377   l_ = rate_ * r_ * d;
00378   exp1_ = exp(-1. * l_);
00379   exp3_ = exp(-c3_ * l_);
00380 
00381   // A
00382   p_(0, 0) = freq_[0] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00383   p_(0, 1) = freq_[1] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00384   p_(0, 2) = freq_[2] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00385   p_(0, 3) = freq_[3] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00386   // C
00387   p_(1, 0) = freq_[0] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00388   p_(1, 1) = freq_[1] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00389   p_(1, 2) = freq_[2] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00390   p_(1, 3) = freq_[3] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00391   // G
00392   p_(2, 0) = freq_[0] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00393   p_(2, 1) = freq_[1] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00394   p_(2, 2) = freq_[2] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00395   p_(2, 3) = freq_[3] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00396   // T, U
00397   p_(3, 0) = freq_[0] + 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00398   p_(3, 1) = freq_[1] - 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00399   p_(3, 2) = freq_[2] + 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00400   p_(3, 3) = freq_[3] - 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00401 
00402   return p_;
00403 }
00404 
00405 /******************************************************************************/
00406 
00407 const Matrix<double>&  RN95s::getdPij_dt(double d) const
00408 {
00409   l_ = rate_ * r_ * d;
00410   exp1_ = -1.* rate_* r_* exp(-1. * l_);
00411   exp3_ = -c3_* rate_* r_* exp(-c3_ * l_);
00412 
00413   // A
00414   p_(0, 0) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00415   p_(0, 1) =  0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00416   p_(0, 2) =  -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00417   p_(0, 3) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00418   // C
00419   p_(1, 0) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00420   p_(1, 1) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00421   p_(1, 2) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00422   p_(1, 3) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00423   // G
00424   p_(2, 0) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00425   p_(2, 1) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00426   p_(2, 2) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00427   p_(2, 3) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00428   // T, U
00429   p_(3, 0) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00430   p_(3, 1) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00431   p_(3, 2) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00432   p_(3, 3) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00433   return p_;
00434 }
00435 
00436 /******************************************************************************/
00437 
00438 const Matrix<double>&  RN95s::getd2Pij_dt2(double d) const
00439 {
00440   l_ = rate_ * r_ * d;
00441   exp1_ = 1. * rate_ * r_ * 1.* rate_* r_* exp(-1. * l_);
00442   exp3_ = c3_ * rate_ * r_ * c3_ * rate_ * r_ * exp(-c3_ * l_);
00443 
00444   // A
00445   p_(0, 0) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00446   p_(0, 1) =  0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00447   p_(0, 2) =  -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (alpha_ * (c3_ - 1.) - 0.5 * c4_) / (c3_ * (c3_ - 1.)) * exp3_;  // G
00448   p_(0, 3) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00449   // C
00450   p_(1, 0) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00451   p_(1, 1) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00452   p_(1, 2) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00453   p_(1, 3) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * (c3_ - 1.) - 0.5 * c8_) / (c3_ * (c3_ - 1.)) * exp3_;                  // T
00454   // G
00455   p_(2, 0) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_; // A
00456   p_(2, 1) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00457   p_(2, 2) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c8_ - beta_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;   // G
00458   p_(2, 3) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (delta_ * alpha_ - gamma_ * beta_) / (c3_ * (c3_ - 1.)) * exp3_;           // T, U
00459   // T, U
00460   p_(3, 0) = 0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ + (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // A
00461   p_(3, 1) = -0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ + (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;                  // C
00462   p_(3, 2) = 0.5 * c4_ / (1. * (c3_ - 1.)) * exp1_ - (beta_ * gamma_ - delta_ * alpha_) / (c3_ * (c3_ - 1.)) * exp3_; // G
00463   p_(3, 3) = -0.5 * c8_ / (1. * (c3_ - 1.)) * exp1_ - (0.5 * c4_ - alpha_ * (c3_ - 1.)) / (c3_ * (c3_ - 1.)) * exp3_;
00464 
00465   return p_;
00466 }
00467 
00468 /******************************************************************************/
00469 void RN95s::setFreq(map<int, double>& freqs)
00470 {
00471   setParameterValue("thetaA", (freqs[0] + freqs[3]) / 2);
00472 
00473   updateMatrices();
00474 }
00475 
00476 /******************************************************************************/
00477 
 All Classes Namespaces Files Functions Variables Typedefs Friends