|
bpp-phyl
2.1.0
|
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