3
// (c) 1999-2001 PAL Development Core Team
5
// This package may be distributed under the
6
// terms of the Lesser GNU General Public License (LGPL)
9
package pal.substmodel;
17
* GTR (general time reversible) model of nucleotide evolution
19
* <i>Lanave, C., G. Preparata, C. Saccone, and G. Serio. 1984. A new method for calculating evolutionary substitution rates. J Mol Evol 20: 86-93. </i>
21
* @version $Id: GTR.java,v 1.13 2003/11/30 05:29:22 matt Exp $
25
* <li> A </li> <!-- 0 -->
26
* <li> B </li> <!-- 1 -->
27
* <li> C </li> <!-- 2 -->
28
* <li> D </li> <!-- 3 -->
29
* <li> E </li> <!-- 4 -->
33
* @author Korbinian Strimmer
35
public class GTR extends NucleotideModel implements Serializable, XMLConstants
42
private boolean showSE;
43
private double a, b, c, d, e;
44
private double aSE, bSE, cSE, dSE, eSE;
49
private static final long serialVersionUID= -8557884770092535699L;
51
//serialver -classpath ./classes pal.substmodel.GTR
52
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
53
out.writeByte(1); //Version number
54
out.writeBoolean(showSE);
67
private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException{
68
byte version = in.readByte();
71
showSE = in.readBoolean();
77
aSE = in.readDouble();
78
bSE = in.readDouble();
79
cSE = in.readDouble();
80
dSE = in.readDouble();
81
eSE = in.readDouble();
91
* @param a entry in rate matrix
92
* @param b entry in rate matrix
93
* @param c entry in rate matrix
94
* @param d entry in rate matrix
95
* @param e entry in rate matrix
96
* @param freq nucleotide frequencies
98
public GTR(double a, double b, double c, double d, double e, double[] freq) {
100
this.a = a; this.b = b; this.c = c; this.d = d; this.e = e;
101
setParameters(new double[] {a,b,c,d,e});
108
* @param params parameter list
109
* @param freq nucleotide frequencies
111
public GTR(double[] params, double[] freq) {
112
this(params[0], params[1], params[2],
113
params[3], params[4], freq);
116
public Object clone() {
117
return new GTR(this);
120
private GTR(GTR gtr) {
121
this(gtr.a, gtr.b, gtr.c, gtr.d, gtr.e, gtr.getEquilibriumFrequencies());
124
// Get numerical code describing the model type
125
public int getModelID() {
131
public void report(PrintWriter out)
133
out.println("Model of substitution: GTR (Lanave et al. 1984)");
135
out.print("Parameter a: ");
136
format.displayDecimal(out, a, 2);
139
out.print(" (S.E. ");
140
format.displayDecimal(out, aSE, 2);
145
out.print("Parameter b: ");
146
format.displayDecimal(out, b, 2);
149
out.print(" (S.E. ");
150
format.displayDecimal(out, bSE, 2);
155
out.print("Parameter c: ");
156
format.displayDecimal(out, c, 2);
159
out.print(" (S.E. ");
160
format.displayDecimal(out, cSE, 2);
165
out.print("Parameter d: ");
166
format.displayDecimal(out, d, 2);
169
out.print(" (S.E. ");
170
format.displayDecimal(out, dSE, 2);
175
out.print("Parameter e: ");
176
format.displayDecimal(out, e, 2);
179
out.print(" (S.E. ");
180
format.displayDecimal(out, eSE, 2);
185
out.println(" A C G T");
186
out.println("Corresponding rate matrix ----------------");
187
out.println("(shown without frequencies): A a b c");
188
out.println(" C d e");
192
printFrequencies(out);
196
// interface Parameterized
198
public int getNumParameters() {
202
public void setParameterSE(double paramSE, int n) {
204
case 0: aSE = paramSE; break;
205
case 1: bSE = paramSE; break;
206
case 2: cSE = paramSE; break;
207
case 3: dSE = paramSE; break;
208
case 4: eSE = paramSE; break;
210
default: throw new IllegalArgumentException();
215
public double getLowerLimit(int n) {
219
public double getUpperLimit(int n) {
223
public double getDefaultValue(int n) {
228
* @return the name of this rate matrix
230
public String getUniqueName() {
234
public String getParameterName(int i) {
236
case 0: return A_TO_C;
237
case 1: return A_TO_G;
238
case 2: return A_TO_T;
239
case 3: return C_TO_G;
240
case 4: return C_TO_T;
241
default: return UNKNOWN;
246
protected void rebuildRateMatrix(double[][] rate, double[] parameters){
247
this.a = parameters[0];
248
this.b = parameters[1];
249
this.c = parameters[2];
250
this.d = parameters[3];
251
this.e = parameters[4];
253
rate[0][1] = a; rate[0][2] = b; rate[0][3] = c;
254
rate[1][2] = d; rate[1][3] = e;