3
// Created by: Julien Dutheil
4
// Created on: Thu Jan 22 16:17:39 2004
8
Copyright or Ā© or Copr. CNRS, (November 16, 2004)
10
This software is a computer program whose purpose is to provide classes
11
for phylogenetic data analysis.
13
This software is governed by the CeCILL license under French law and
14
abiding by the rules of distribution of free software. You can use,
15
modify and/ or redistribute the software under the terms of the CeCILL
16
license as circulated by CEA, CNRS and INRIA at the following URL
17
"http://www.cecill.info".
19
As a counterpart to the access to the source code and rights to copy,
20
modify and redistribute granted by the license, users are provided only
21
with a limited warranty and the software's author, the holder of the
22
economic rights, and the successive licensors have only limited
25
In this respect, the user's attention is drawn to the risks associated
26
with loading, using, modifying and/or developing or reproducing the
27
software by the user in light of its specific status of free software,
28
that may mean that it is complicated to manipulate, and that also
29
therefore means that it is reserved for developers and experienced
30
professionals having in-depth computer knowledge. Users are therefore
31
encouraged to load and test the software's suitability as regards their
32
requirements in conditions enabling the security of their systems and/or
33
data to be ensured and, more generally, to use and operate it in the
34
same conditions as regards security.
36
The fact that you are presently reading this means that you have had
37
knowledge of the CeCILL license and that you accept its terms.
42
#include <Bpp/Numeric/Matrix/MatrixTools.h>
45
#include <Bpp/Seq/Container/SequenceContainerTools.h>
54
/******************************************************************************/
57
const NucleicAlphabet* alpha,
63
AbstractReversibleSubstitutionModel(alpha, "HKY85."),
64
kappa_(kappa), k1_(), k2_(), r_(),
65
piA_(piA), piC_(piC), piG_(piG), piT_(piT), piY_(), piR_(),
66
theta_(piG + piC), theta1_(piA / (1. - theta_)), theta2_(piG / theta_),
67
exp1_(), exp21_(), exp22_(), l_(), p_(size_, size_)
69
Parameter kappaP("HKY85.kappa", kappa, &Parameter::R_PLUS_STAR);
70
addParameter_(kappaP);
71
Parameter thetaP("HKY85.theta" , theta_, new IncludingInterval(0.001, 0.999), true);
72
addParameter_(thetaP);
73
Parameter theta1P("HKY85.theta1", theta1_, new IncludingInterval(0.001, 0.999), true);
74
addParameter_(theta1P);
75
Parameter theta2P("HKY85.theta2", theta2_, new IncludingInterval(0.001, 0.999), true);
76
addParameter_(theta2P);
80
/******************************************************************************/
82
void HKY85::updateMatrices()
84
kappa_ = getParameterValue("kappa");
85
theta_ = getParameterValue("theta");
86
theta1_ = getParameterValue("theta1");
87
theta2_ = getParameterValue("theta2");
88
piA_ = theta1_ * (1. - theta_);
89
piC_ = (1. - theta2_) * theta_;
90
piG_ = theta2_ * theta_;
91
piT_ = (1. - theta1_) * (1. - theta_);
94
k1_ = kappa_ * piY_ + piR_;
95
k2_ = kappa_ * piR_ + piY_;
102
generator_(0, 0) = -( piC_ + kappa_*piG_ + piT_);
103
generator_(1, 1) = -( piA_ + piG_ + kappa_*piT_);
104
generator_(2, 2) = -(kappa_*piA_ + piC_ + piT_);
105
generator_(3, 3) = -( piA_ + kappa_*piC_ + piG_ );
107
generator_(1, 0) = piA_;
108
generator_(3, 0) = piA_;
109
generator_(0, 1) = piC_;
110
generator_(2, 1) = piC_;
111
generator_(1, 2) = piG_;
112
generator_(3, 2) = piG_;
113
generator_(0, 3) = piT_;
114
generator_(2, 3) = piT_;
116
generator_(2, 0) = kappa_ * piA_;
117
generator_(3, 1) = kappa_ * piC_;
118
generator_(0, 2) = kappa_ * piG_;
119
generator_(1, 3) = kappa_ * piT_;
122
r_ = 1. / (2. * (piA_ * piC_ + piC_ * piG_ + piA_ * piT_ + piG_ * piT_ + kappa_ * (piC_ * piT_ + piA_ * piG_)));
123
MatrixTools::scale(generator_, r_);
126
exchangeability_(0,0) = generator_(0,0) / piA_;
127
exchangeability_(0,1) = generator_(0,1) / piC_;
128
exchangeability_(0,2) = generator_(0,2) / piG_;
129
exchangeability_(0,3) = generator_(0,3) / piT_;
131
exchangeability_(1,0) = generator_(1,0) / piA_;
132
exchangeability_(1,1) = generator_(1,1) / piC_;
133
exchangeability_(1,2) = generator_(1,2) / piG_;
134
exchangeability_(1,3) = generator_(1,3) / piT_;
136
exchangeability_(2,0) = generator_(2,0) / piA_;
137
exchangeability_(2,1) = generator_(2,1) / piC_;
138
exchangeability_(2,2) = generator_(2,2) / piG_;
139
exchangeability_(2,3) = generator_(2,3) / piT_;
141
exchangeability_(3,0) = generator_(3,0) / piA_;
142
exchangeability_(3,1) = generator_(3,1) / piC_;
143
exchangeability_(3,2) = generator_(3,2) / piG_;
144
exchangeability_(3,3) = generator_(3,3) / piT_;
148
eigenValues_[1] = -r_ * (kappa_ * piY_ + piR_);
149
eigenValues_[2] = -r_ * (kappa_ * piR_ + piY_);
150
eigenValues_[3] = -r_;
153
leftEigenVectors_(0,0) = piA_;
154
leftEigenVectors_(0,1) = piC_;
155
leftEigenVectors_(0,2) = piG_;
156
leftEigenVectors_(0,3) = piT_;
158
leftEigenVectors_(1,0) = 0.;
159
leftEigenVectors_(1,1) = piT_ / piY_;
160
leftEigenVectors_(1,2) = 0.;
161
leftEigenVectors_(1,3) = -piT_ / piY_;
163
leftEigenVectors_(2,0) = piG_ / piR_;
164
leftEigenVectors_(2,1) = 0.;
165
leftEigenVectors_(2,2) = -piG_ / piR_;
166
leftEigenVectors_(2,3) = 0.;
168
leftEigenVectors_(3,0) = piA_*piY_ / piR_;
169
leftEigenVectors_(3,1) = -piC_;
170
leftEigenVectors_(3,2) = piG_*piY_ / piR_;
171
leftEigenVectors_(3,3) = -piT_;
173
rightEigenVectors_(0,0) = 1.;
174
rightEigenVectors_(0,1) = 0.;
175
rightEigenVectors_(0,2) = 1.;
176
rightEigenVectors_(0,3) = 1.;
178
rightEigenVectors_(1,0) = 1.;
179
rightEigenVectors_(1,1) = 1.;
180
rightEigenVectors_(1,2) = 0.;;
181
rightEigenVectors_(1,3) = -piR_ / piY_;
183
rightEigenVectors_(2,0) = 1.;
184
rightEigenVectors_(2,1) = 0.;
185
rightEigenVectors_(2,2) = -piA_ / piG_;
186
rightEigenVectors_(2,3) = 1.;
188
rightEigenVectors_(3,0) = 1.;
189
rightEigenVectors_(3,1) = -piC_ / piT_;
190
rightEigenVectors_(3,2) = 0.;
191
rightEigenVectors_(3,3) = -piR_ / piY_;
194
/******************************************************************************/
196
double HKY85::Pij_t(int i, int j, double d) const
200
exp22_ = exp(-k2_ * l_);
201
exp21_ = exp(-k1_ * l_);
208
case 0 : return piA_ * (1. + (piY_/piR_) * exp1_) + (piG_/piR_) * exp22_; //A
209
case 1 : return piC_ * (1. - exp1_); //C
210
case 2 : return piG_ * (1. + (piY_/piR_) * exp1_) - (piG_/piR_) * exp22_; //G
211
case 3 : return piT_ * (1. - exp1_); //T, U
217
case 0 : return piA_ * (1. - exp1_); //A
218
case 1 : return piC_ * (1. + (piR_/piY_) * exp1_) + (piT_/piY_) * exp21_; //C
219
case 2 : return piG_ * (1. - exp1_); //G
220
case 3 : return piT_ * (1. + (piR_/piY_) * exp1_) - (piT_/piY_) * exp21_; //T, U
226
case 0 : return piA_ * (1. + (piY_/piR_) * exp1_) - (piA_/piR_) * exp22_; //A
227
case 1 : return piC_ * (1. - exp1_); //C
228
case 2 : return piG_ * (1. + (piY_/piR_) * exp1_) + (piA_/piR_) * exp22_; //G
229
case 3 : return piT_ * (1. - exp1_); //T, U
235
case 0 : return piA_ * (1. - exp1_); //A
236
case 1 : return piC_ * (1. + (piR_/piY_) * exp1_) - (piC_/piY_) * exp21_; //C
237
case 2 : return piG_ * (1. - exp1_); //G
238
case 3 : return piT_ * (1. + (piR_/piY_) * exp1_) + (piC_/piY_) * exp21_; //T, U
245
/******************************************************************************/
247
double HKY85::dPij_dt(int i, int j, double d) const
251
exp22_ = exp(-k2_ * l_);
252
exp21_ = exp(-k1_ * l_);
259
case 0 : return rate_ * r_ * (piA_ * -(piY_/piR_) * exp1_ - (piG_/piR_) * k2_ * exp22_); //A
260
case 1 : return rate_ * r_ * (piC_ * exp1_); //C
261
case 2 : return rate_ * r_ * (piG_ * -(piY_/piR_) * exp1_ + (piG_/piR_) * k2_ * exp22_); //G
262
case 3 : return rate_ * r_ * (piT_ * exp1_); //T, U
268
case 0 : return rate_ * r_ * (piA_ * exp1_); //A
269
case 1 : return rate_ * r_ * (piC_ * -(piR_/piY_) * exp1_ - (piT_/piY_) * k1_ * exp21_); //C
270
case 2 : return rate_ * r_ * (piG_ * exp1_); //G
271
case 3 : return rate_ * r_ * (piT_ * -(piR_/piY_) * exp1_ + (piT_/piY_) * k1_ * exp21_); //T, U
277
case 0 : return rate_ * r_ * (piA_ * -(piY_/piR_) * exp1_ + (piA_/piR_) * k2_ * exp22_); //A
278
case 1 : return rate_ * r_ * (piC_ * exp1_); //C
279
case 2 : return rate_ * r_ * (piG_ * -(piY_/piR_) * exp1_ - (piA_/piR_) * k2_ * exp22_); //G
280
case 3 : return rate_ * r_ * (piT_ * exp1_); //T, U
286
case 0 : return rate_ * r_ * (piA_ * exp1_); //A
287
case 1 : return rate_ * r_ * (piC_ * -(piR_/piY_) * exp1_ + (piC_/piY_) * k1_ * exp21_); //C
288
case 2 : return rate_ * r_ * (piG_ * exp1_); //G
289
case 3 : return rate_ * r_ * (piT_ * -(piR_/piY_) * exp1_ - (piC_/piY_) * k1_ * exp21_); //T, U
296
/******************************************************************************/
298
double HKY85::d2Pij_dt2(int i, int j, double d) const
300
double r_2 = rate_ * rate_ * r_ * r_;
302
double k1_2 = k1_ * k1_;
303
double k2_2 = k2_ * k2_;
305
exp22_ = exp(-k2_ * l_);
306
exp21_ = exp(-k1_ * l_);
313
case 0 : return r_2 * (piA_ * (piY_/piR_) * exp1_ + (piG_/piR_) * k2_2 * exp22_); //A
314
case 1 : return r_2 * (piC_ * - exp1_); //C
315
case 2 : return r_2 * (piG_ * (piY_/piR_) * exp1_ - (piG_/piR_) * k2_2 * exp22_); //G
316
case 3 : return r_2 * (piT_ * - exp1_); //T, U
322
case 0 : return r_2 * (piA_ * - exp1_); //A
323
case 1 : return r_2 * (piC_ * (piR_/piY_) * exp1_ + (piT_/piY_) * k1_2 * exp21_); //C
324
case 2 : return r_2 * (piG_ * - exp1_); //G
325
case 3 : return r_2 * (piT_ * (piR_/piY_) * exp1_ - (piT_/piY_) * k1_2 * exp21_); //T, U
331
case 0 : return r_2 * (piA_ * (piY_/piR_) * exp1_ - (piA_/piR_) * k2_2 * exp22_); //A
332
case 1 : return r_2 * (piC_ * - exp1_); //C
333
case 2 : return r_2 * (piG_ * (piY_/piR_) * exp1_ + (piA_/piR_) * k2_2 * exp22_); //G
334
case 3 : return r_2 * (piT_ * - exp1_); //T, U
340
case 0 : return r_2 * (piA_ * - exp1_); //A
341
case 1 : return r_2 * (piC_ * (piR_/piY_) * exp1_ - (piC_/piY_) * k1_2 * exp21_); //C
342
case 2 : return r_2 * (piG_ * - exp1_); //G
343
case 3 : return r_2 * (piT_ * (piR_/piY_) * exp1_ + (piC_/piY_) * k1_2 * exp21_); //T, U
350
/******************************************************************************/
352
const Matrix<double> & HKY85::getPij_t(double d) const
356
exp22_ = exp(-k2_ * l_);
357
exp21_ = exp(-k1_ * l_);
360
p_(0, 0) = piA_ * (1. + (piY_/piR_) * exp1_) + (piG_/piR_) * exp22_; //A
361
p_(0, 1) = piC_ * (1. - exp1_); //C
362
p_(0, 2) = piG_ * (1. + (piY_/piR_) * exp1_) - (piG_/piR_) * exp22_; //G
363
p_(0, 3) = piT_ * (1. - exp1_); //T, U
366
p_(1, 0) = piA_ * (1. - exp1_); //A
367
p_(1, 1) = piC_ * (1. + (piR_/piY_) * exp1_) + (piT_/piY_) * exp21_; //C
368
p_(1, 2) = piG_ * (1. - exp1_); //G
369
p_(1, 3) = piT_ * (1. + (piR_/piY_) * exp1_) - (piT_/piY_) * exp21_; //T, U
372
p_(2, 0) = piA_ * (1. + (piY_/piR_) * exp1_) - (piA_/piR_) * exp22_; //A
373
p_(2, 1) = piC_ * (1. - exp1_); //C
374
p_(2, 2) = piG_ * (1. + (piY_/piR_) * exp1_) + (piA_/piR_) * exp22_; //G
375
p_(2, 3) = piT_ * (1. - exp1_); //T, U
378
p_(3, 0) = piA_ * (1. - exp1_); //A
379
p_(3, 1) = piC_ * (1. + (piR_/piY_) * exp1_) - (piC_/piY_) * exp21_; //C
380
p_(3, 2) = piG_ * (1. - exp1_); //G
381
p_(3, 3) = piT_ * (1. + (piR_/piY_) * exp1_) + (piC_/piY_) * exp21_; //T, U
386
const Matrix<double> & HKY85::getdPij_dt(double d) const
390
exp22_ = exp(-k2_ * l_);
391
exp21_ = exp(-k1_ * l_);
394
p_(0, 0) = rate_ * r_ * (piA_ * -(piY_/piR_) * exp1_ - (piG_/piR_) * k2_ * exp22_); //A
395
p_(0, 1) = rate_ * r_ * (piC_ * exp1_); //C
396
p_(0, 2) = rate_ * r_ * (piG_ * -(piY_/piR_) * exp1_ + (piG_/piR_) * k2_ * exp22_); //G
397
p_(0, 3) = rate_ * r_ * (piT_ * exp1_); //T, U
400
p_(1, 0) = rate_ * r_ * (piA_ * exp1_); //A
401
p_(1, 1) = rate_ * r_ * (piC_ * -(piR_/piY_) * exp1_ - (piT_/piY_) * k1_ * exp21_); //C
402
p_(1, 2) = rate_ * r_ * (piG_ * exp1_); //G
403
p_(1, 3) = rate_ * r_ * (piT_ * -(piR_/piY_) * exp1_ + (piT_/piY_) * k1_ * exp21_); //T, U
406
p_(2, 0) = rate_ * r_ * (piA_ * -(piY_/piR_) * exp1_ + (piA_/piR_) * k2_ * exp22_); //A
407
p_(2, 1) = rate_ * r_ * (piC_ * exp1_); //C
408
p_(2, 2) = rate_ * r_ * (piG_ * -(piY_/piR_) * exp1_ - (piA_/piR_) * k2_ * exp22_); //G
409
p_(2, 3) = rate_ * r_ * (piT_ * exp1_); //T, U
412
p_(3, 0) = rate_ * r_ * (piA_ * exp1_); //A
413
p_(3, 1) = rate_ * r_ * (piC_ * -(piR_/piY_) * exp1_ + (piC_/piY_) * k1_ * exp21_); //C
414
p_(3, 2) = rate_ * r_ * (piG_ * exp1_); //G
415
p_(3, 3) = rate_ * r_ * (piT_ * -(piR_/piY_) * exp1_ - (piC_/piY_) * k1_ * exp21_); //T, U
420
const Matrix<double> & HKY85::getd2Pij_dt2(double d) const
422
double r_2 = rate_ * rate_ * r_ * r_;
424
double k1_2 = k1_ * k1_;
425
double k2_2 = k2_ * k2_;
427
exp22_ = exp(-k2_ * l_);
428
exp21_ = exp(-k1_ * l_);
431
p_(0, 0) = r_2 * (piA_ * (piY_/piR_) * exp1_ + (piG_/piR_) * k2_2 * exp22_); //A
432
p_(0, 1) = r_2 * (piC_ * - exp1_); //C
433
p_(0, 2) = r_2 * (piG_ * (piY_/piR_) * exp1_ - (piG_/piR_) * k2_2 * exp22_); //G
434
p_(0, 3) = r_2 * (piT_ * - exp1_); //T, U
437
p_(1, 0) = r_2 * (piA_ * - exp1_); //A
438
p_(1, 1) = r_2 * (piC_ * (piR_/piY_) * exp1_ + (piT_/piY_) * k1_2 * exp21_); //C
439
p_(1, 2) = r_2 * (piG_ * - exp1_); //G
440
p_(1, 3) = r_2 * (piT_ * (piR_/piY_) * exp1_ - (piT_/piY_) * k1_2 * exp21_); //T, U
443
p_(2, 0) = r_2 * (piA_ * (piY_/piR_) * exp1_ - (piA_/piR_) * k2_2 * exp22_); //A
444
p_(2, 1) = r_2 * (piC_ * - exp1_); //C
445
p_(2, 2) = r_2 * (piG_ * (piY_/piR_) * exp1_ + (piA_/piR_) * k2_2 * exp22_); //G
446
p_(2, 3) = r_2 * (piT_ * - exp1_); //T, U
449
p_(3, 0) = r_2 * (piA_ * - exp1_); //A
450
p_(3, 1) = r_2 * (piC_ * (piR_/piY_) * exp1_ - (piC_/piY_) * k1_2 * exp21_); //C
451
p_(3, 2) = r_2 * (piG_ * - exp1_); //G
452
p_(3, 3) = r_2 * (piT_ * (piR_/piY_) * exp1_ + (piC_/piY_) * k1_2 * exp21_); //T, U
457
/******************************************************************************/
459
void HKY85::setFreq(std::map<int, double>& freqs)
465
vector<string> thetas(3);
466
thetas[0] = getNamespace() + "theta";
467
thetas[1] = getNamespace() + "theta1";
468
thetas[2] = getNamespace() + "theta2";
469
ParameterList pl = getParameters().subList(thetas);
470
pl[0].setValue(piC_ + piG_);
471
pl[1].setValue(piA_ / (piA_ + piT_));
472
pl[2].setValue(piG_ / (piC_ + piG_));
473
setParametersValues(pl);
476
/******************************************************************************/