package org.biojava.bio.dp; import java.io.Serializable; import org.biojava.bio.BioException; import org.biojava.bio.SimpleAnnotation; import org.biojava.bio.seq.Feature; import org.biojava.bio.seq.Sequence; import org.biojava.bio.seq.SequenceAnnotator; import org.biojava.bio.seq.impl.ViewSequence; import org.biojava.bio.symbol.IllegalAlphabetException; import org.biojava.bio.symbol.RangeLocation; import org.biojava.utils.ChangeVetoException; /** * Annotates a sequence with hits to a weight-matrix. * *

* This SequenceAnnotator implementation returns a new * ViewSequence wrapping the underlying Sequence *

* * @author Matthew Pocock * @author Thomas Down * @author Tanya Vavouri */ public class WeightMatrixAnnotator implements SequenceAnnotator, Serializable { private WeightMatrix matrix; private double threshold; private final ScoreType scoreType; private String wmID; public Sequence annotate(Sequence seq) throws IllegalAlphabetException, BioException, ChangeVetoException { seq = new ViewSequence(seq); int cols = matrix.columns(); Feature.Template template = new Feature.Template(); template.source = "WeightMatrixAnnotator"; template.type = wmID; for (int offset = 1; offset <= seq.length() - cols + 1; offset++) { double score = DP.scoreWeightMatrix(matrix, seq, scoreType, offset); double q = Math.exp(score); if (q >= threshold) { template.location = new RangeLocation(offset, offset + cols - 1); SimpleAnnotation ann = new SimpleAnnotation(); ann.setProperty("score", new Double(q)); ann.setProperty("weightMatrix", matrix); template.annotation = ann; seq.createFeature(template); } } return seq; } /** * Create a new annotator that uses the PROBABILITY score type and an ID for the weight matrix. * * @param wm the weight matrix * @param threshold the threshold * @param wmID the weight matrix ID */ public WeightMatrixAnnotator(WeightMatrix wm, ScoreType scoreType, double threshold, String wmID) { this.matrix = wm; this.threshold = threshold; this.scoreType = ScoreType.PROBABILITY; this.wmID = wmID; } /** * Create a new annotator that uses PROBABILITY score type. * * @param wm a WeightMatrix value * @param threshold a double value */ public WeightMatrixAnnotator(WeightMatrix wm, double threshold) { this(wm, ScoreType.PROBABILITY, threshold, "hit"); } /** * Create a new annotator that uses a specific score type. * * @param wm the weigth matrix * @param scoreType the score type * @param threshold the threshold * @since 1.4 */ public WeightMatrixAnnotator(WeightMatrix wm, ScoreType scoreType, double threshold) { this.matrix = wm; this.scoreType = scoreType; this.threshold = threshold; this.wmID = "hit"; } /** * Get the value of the weight matrix id. * @return value of the weight matrix id. */ public String getWeightMatrixID() { return wmID; } /** * Set the weight matrix id. * @param id Value to assign to the weight matrix id. */ public void setWeightMatrixID(String id) { this.wmID = id; } }