/* * SequenceErrorModelComponentOptions.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.app.beauti.components.sequenceerror; import dr.app.beauti.options.*; import dr.app.beauti.types.OperatorType; import dr.app.beauti.types.PriorScaleType; import dr.app.beauti.types.SequenceErrorType; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Andrew Rambaut * @version $Id$ */ public class SequenceErrorModelComponentOptions implements ComponentOptions { static public final String ERROR_MODEL = "errorModel"; static public final String AGE_RATE = "ageRelatedErrorRate"; static public final String BASE_RATE = "baseErrorRate"; static public final String AGE_RATE_PARAMETER = ERROR_MODEL + "." + AGE_RATE; static public final String BASE_RATE_PARAMETER = ERROR_MODEL + "." + BASE_RATE; static public final String HYPERMUTION_RATE_PARAMETER = "hypermutation.rate"; static public final String HYPERMUTANT_INDICATOR_PARAMETER = "hypermutant.indicator"; static public final String HYPERMUTANT_COUNT_STATISTIC = "hypermutation.count"; SequenceErrorModelComponentOptions() { } public void createParameters(final ModelOptions modelOptions) { for (AbstractPartitionData partition : sequenceErrorTypeMap.keySet()) { String prefix = partition.getPrefix();//partition.getName() + "."; modelOptions.createNonNegativeParameterInfinitePrior(prefix + AGE_RATE_PARAMETER,"age dependent sequence error rate", PriorScaleType.SUBSTITUTION_RATE_SCALE, 1.0E-8); modelOptions.createZeroOneParameterUniformPrior(prefix + BASE_RATE_PARAMETER,"base sequence error rate", 1.0E-8); modelOptions.createZeroOneParameterUniformPrior(prefix + HYPERMUTION_RATE_PARAMETER,"APOBEC editing rate per context", 1.0E-8); modelOptions.createParameter(prefix + HYPERMUTANT_INDICATOR_PARAMETER, "indicator parameter reflecting which sequences are hypermutated", 0.0); modelOptions.createDiscreteStatistic(prefix + HYPERMUTANT_COUNT_STATISTIC, "count of the number of hypermutated sequences"); modelOptions.createScaleOperator(prefix + AGE_RATE_PARAMETER, modelOptions.demoTuning, 3.0); modelOptions.createOperator(prefix + BASE_RATE_PARAMETER, OperatorType.RANDOM_WALK_REFLECTING, 0.05, 3.0); modelOptions.createOperator(prefix + HYPERMUTION_RATE_PARAMETER, OperatorType.RANDOM_WALK_REFLECTING, 0.05, 3.0); modelOptions.createOperator(prefix + HYPERMUTANT_INDICATOR_PARAMETER, OperatorType.BITFLIP, -1.0, 10); } } public void selectParameters(final ModelOptions modelOptions, final List<Parameter> params) { for (AbstractPartitionData partition : sequenceErrorTypeMap.keySet()) { String prefix = partition.getPrefix();//partition.getName() + "."; if (isHypermutation(partition)) { params.add(modelOptions.getParameter(prefix + HYPERMUTION_RATE_PARAMETER)); params.add(modelOptions.getParameter(prefix + HYPERMUTANT_INDICATOR_PARAMETER)); params.add(modelOptions.getParameter(prefix + HYPERMUTANT_COUNT_STATISTIC)); } if (hasAgeDependentRate(partition)) { params.add(modelOptions.getParameter(prefix + AGE_RATE_PARAMETER)); } if (hasBaseRate(partition)) { params.add(modelOptions.getParameter(prefix + BASE_RATE_PARAMETER)); } } } public void selectStatistics(final ModelOptions modelOptions, final List<Parameter> stats) { // no statistics required } public void selectOperators(final ModelOptions modelOptions, final List<Operator> ops) { for (AbstractPartitionData partition : sequenceErrorTypeMap.keySet()) { String prefix = partition.getPrefix();//partition.getName() + "."; if (isHypermutation(partition)) { ops.add(modelOptions.getOperator(prefix + HYPERMUTION_RATE_PARAMETER)); ops.add(modelOptions.getOperator(prefix + HYPERMUTANT_INDICATOR_PARAMETER)); } if (hasAgeDependentRate(partition)) { ops.add(modelOptions.getOperator(prefix + AGE_RATE_PARAMETER)); } if (hasBaseRate(partition)) { ops.add(modelOptions.getOperator(prefix + BASE_RATE_PARAMETER)); } } } public boolean usingSequenceErrorModel() { for (AbstractPartitionData partition : sequenceErrorTypeMap.keySet()) { if (sequenceErrorTypeMap.get(partition) != SequenceErrorType.NO_ERROR) { return true; } } return false; } public boolean usingSequenceErrorModel(AbstractPartitionData partition) { return (getSequenceErrorType(partition) != SequenceErrorType.NO_ERROR); } public boolean hasAgeDependentRate(final AbstractPartitionData partition) { SequenceErrorType errorModelType = getSequenceErrorType(partition); return (errorModelType == SequenceErrorType.AGE_ALL) || (errorModelType == SequenceErrorType.AGE_TRANSITIONS); } public boolean hasBaseRate(final AbstractPartitionData partition) { SequenceErrorType errorModelType = getSequenceErrorType(partition); return (errorModelType == SequenceErrorType.BASE_ALL) || (errorModelType == SequenceErrorType.BASE_TRANSITIONS); } public boolean isHypermutation(final AbstractPartitionData partition) { SequenceErrorType errorModelType = getSequenceErrorType(partition); return (errorModelType == SequenceErrorType.HYPERMUTATION_ALL) || (errorModelType == SequenceErrorType.HYPERMUTATION_BOTH) || (errorModelType == SequenceErrorType.HYPERMUTATION_HA3G) || (errorModelType == SequenceErrorType.HYPERMUTATION_HA3F); } public SequenceErrorType getSequenceErrorType(final AbstractPartitionData partition) { SequenceErrorType type = sequenceErrorTypeMap.get(partition); if (type == null) { type = SequenceErrorType.NO_ERROR; sequenceErrorTypeMap.put(partition, type); } return type; } public void setSequenceErrorType(final AbstractPartitionData partition, SequenceErrorType sequenceErrorType) { sequenceErrorTypeMap.put(partition, sequenceErrorType); } private final Map<AbstractPartitionData, SequenceErrorType> sequenceErrorTypeMap = new HashMap<AbstractPartitionData, SequenceErrorType>(); }