/* * GTR.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.oldevomodel.substmodel; import dr.oldevomodelxml.substmodel.GTRParser; import dr.inference.model.Parameter; import dr.inference.model.Variable; import dr.util.Author; import dr.util.Citable; import dr.util.Citation; import java.util.Collections; import java.util.List; /** * General Time Reversible model of nucleotide evolution * This is really just a place-holder because all the implementation * already exists in NucleotideModel and GeneralModel, its base classes. * * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: GTR.java,v 1.19 2005/05/24 20:25:58 rambaut Exp $ */ public class GTR extends AbstractNucleotideModel implements Citable { private Variable<Double> rateACValue = null; private Variable<Double> rateAGValue = null; private Variable<Double> rateATValue = null; private Variable<Double> rateCGValue = null; private Variable<Double> rateCTValue = null; private Variable<Double> rateGTValue = null; /** * @param rateACValue rate of A<->C substitutions * @param rateAGValue rate of A<->G substitutions * @param rateATValue rate of A<->T substitutions * @param rateCGValue rate of C<->G substitutions * @param rateCTValue rate of C<->T substitutions * @param rateGTValue rate of G<->T substitutions * @param freqModel frequencies */ public GTR( Variable rateACValue, Variable rateAGValue, Variable rateATValue, Variable rateCGValue, Variable rateCTValue, Variable rateGTValue, FrequencyModel freqModel) { super(GTRParser.GTR_MODEL, freqModel); if (rateACValue != null) { addVariable(rateACValue); rateACValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateACValue = rateACValue; } if (rateAGValue != null) { addVariable(rateAGValue); rateAGValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateAGValue = rateAGValue; } if (rateATValue != null) { addVariable(rateATValue); rateATValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateATValue = rateATValue; } if (rateCGValue != null) { addVariable(rateCGValue); rateCGValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateCGValue = rateCGValue; } if (rateCTValue != null) { addVariable(rateCTValue); rateCTValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateCTValue = rateCTValue; } if (rateGTValue != null) { addVariable(rateGTValue); rateGTValue.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1)); this.rateGTValue = rateGTValue; } } public void setAbsoluteRates(double[] rates, int relativeTo) { for (int i = 0; i < relativeRates.length; i++) { relativeRates[i] = rates[i] / rates[relativeTo]; } updateMatrix = true; fireModelChanged(); } public void setRelativeRates(double[] rates) { System.arraycopy(rates, 0, relativeRates, 0, relativeRates.length); updateMatrix = true; fireModelChanged(); } protected void setupRelativeRates() { if (rateACValue != null) { relativeRates[0] = rateACValue.getValue(0); } if (rateAGValue != null) { relativeRates[1] = rateAGValue.getValue(0); } if (rateATValue != null) { relativeRates[2] = rateATValue.getValue(0); } if (rateCGValue != null) { relativeRates[3] = rateCGValue.getValue(0); } if (rateCTValue != null) { relativeRates[4] = rateCTValue.getValue(0); } if (rateGTValue != null) { relativeRates[5] = rateGTValue.getValue(0); } } // ************************************************************** // XHTMLable IMPLEMENTATION // ************************************************************** public String toXHTML() { StringBuffer buffer = new StringBuffer(); buffer.append("<em>GTR Model</em> Instantaneous Rate Matrix = <table><tr><td></td><td>A</td><td>C</td><td>G</td><td>T</td></tr>"); buffer.append("<tr><td>A</td><td></td><td>"); buffer.append(relativeRates[0]); buffer.append("</td><td>"); buffer.append(relativeRates[1]); buffer.append("</td><td>"); buffer.append(relativeRates[2]); buffer.append("</td></tr>"); buffer.append("<tr><td>C</td><td></td><td></td><td>"); buffer.append(relativeRates[3]); buffer.append("</td><td>"); buffer.append(relativeRates[4]); buffer.append("</td></tr>"); buffer.append("<tr><td>G</td><td></td><td></td><td></td><td>"); buffer.append(relativeRates[5]); buffer.append("</td></tr>"); buffer.append("<tr><td>G</td><td></td><td></td><td></td><td></td></tr></table>"); return buffer.toString(); } @Override public Citation.Category getCategory() { return Citation.Category.SUBSTITUTION_MODELS; } @Override public String getDescription() { return "GTR nucleotide substitution model"; } @Override public List<Citation> getCitations() { return Collections.singletonList(CITATION); } public static Citation CITATION = new Citation( new Author[]{ new Author("S", "Tavaré") }, "Some probabilistic and statistical problems in the analysis of DNA sequences", 1985, "In: Miura R. M., editor. Lectures on mathematics in the life sciences.", 17, 57, 86 ); }