package dr.evomodel.substmodel;
import dr.evolution.datatype.HiddenNucleotides;
import dr.evomodelxml.substmodel.CovarionGTRParser;
import dr.inference.model.Parameter;
/**
* A general time reversible model of nucleotide evolution with
* covarion hidden rate categories.
*
* @author Alexei Drummond
* @version $Id$
*/
public class CovarionGTR extends AbstractCovarionDNAModel {
/**
* constructor
*
* @param dataType the data type
* @param freqModel the equlibrium frequencies
* @param hiddenRates the relative rates of the hidden categories
* (first hidden category has rate 1.0 so this parameter
* has dimension one less than number of hidden categories.
* @param rateACParameter the relative rate of A<->C substitutions
* @param rateAGParameter the relative rate of A<->G substitutions
* @param rateATParameter the relative rate of A<->T substitutions
* @param rateCGParameter the relative rate of C<->G substitutions
* @param rateCTParameter the relative rate of C<->T substitutions
* @param rateGTParameter the relative rate of G<->T substitutions
* each hidden category.
* @param switchingRates rates of switching between hidden rate classes
*/
public CovarionGTR(
HiddenNucleotides dataType,
Parameter hiddenRates,
Parameter switchingRates,
Parameter rateACParameter,
Parameter rateAGParameter,
Parameter rateATParameter,
Parameter rateCGParameter,
Parameter rateCTParameter,
Parameter rateGTParameter,
FrequencyModel freqModel) {
super(CovarionGTRParser.GTR_COVARION_MODEL, dataType, hiddenRates, switchingRates, freqModel);
if (rateACParameter != null) {
addVariable(rateACParameter);
rateACParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateACParameter = rateACParameter;
}
if (rateAGParameter != null) {
addVariable(rateAGParameter);
rateAGParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateAGParameter = rateAGParameter;
}
if (rateATParameter != null) {
addVariable(rateATParameter);
rateATParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateATParameter = rateATParameter;
}
if (rateCGParameter != null) {
addVariable(rateCGParameter);
rateCGParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateCGParameter = rateCGParameter;
}
if (rateCTParameter != null) {
addVariable(rateCTParameter);
rateCTParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateCTParameter = rateCTParameter;
}
if (rateGTParameter != null) {
addVariable(rateGTParameter);
rateGTParameter.addBounds(new Parameter.DefaultBounds(Double.POSITIVE_INFINITY, 0.0, 1));
this.rateGTParameter = rateGTParameter;
}
}
double[] getRelativeDNARates() {
double[] rr = new double[6];
for (int i = 0; i < rr.length; i++) {
rr[i] = 1.0;
}
if (rateACParameter != null) {
rr[0] = rateACParameter.getParameterValue(0);
}
if (rateAGParameter != null) {
rr[1] = rateAGParameter.getParameterValue(0);
}
if (rateATParameter != null) {
rr[2] = rateATParameter.getParameterValue(0);
}
if (rateCGParameter != null) {
rr[3] = rateCGParameter.getParameterValue(0);
}
if (rateCTParameter != null) {
rr[4] = rateCTParameter.getParameterValue(0);
}
if (rateGTParameter != null) {
rr[5] = rateGTParameter.getParameterValue(0);
}
return rr;
}
private Parameter rateACParameter = null;
private Parameter rateAGParameter = null;
private Parameter rateATParameter = null;
private Parameter rateCGParameter = null;
private Parameter rateCTParameter = null;
private Parameter rateGTParameter = null;
}