001 package calhoun.analysis.crf.features.tricycle13;
002
003 import java.util.List;
004
005 import org.apache.commons.logging.Log;
006 import org.apache.commons.logging.LogFactory;
007
008 import calhoun.analysis.crf.AbstractFeatureManager;
009 import calhoun.analysis.crf.FeatureList;
010 import calhoun.analysis.crf.FeatureManagerNode;
011 import calhoun.analysis.crf.ModelManager;
012 import calhoun.analysis.crf.io.InputSequence;
013 import calhoun.analysis.crf.io.TrainingSequence;
014 import calhoun.analysis.crf.io.IntervalInputSequence.IntervalPosition;
015
016 public class IntervalPresenceFeatures extends AbstractFeatureManager<IntervalPosition> implements FeatureManagerNode<IntervalPosition> {
017 private static final long serialVersionUID = -7659288739348604129L;
018 private static final Log log = LogFactory.getLog(IntervalPresenceFeatures.class);
019 boolean debug = log.isDebugEnabled();
020
021
022
023 int startIx; // The index of the first feature managed by this FeatureManager
024 ModelManager model;
025
026 boolean[] plusExonState;
027 boolean[] minusExonState;
028 boolean[] plusIntronState;
029 boolean[] minusIntronState;
030
031 public IntervalPresenceFeatures() {
032 }
033
034 public int getNumFeatures() {
035 return 2;
036 }
037
038 public String getFeatureName(int featureIndex) {
039 return "IntervalPresenceFeatures";
040 }
041
042 public void evaluateNode(InputSequence<? extends IntervalPosition> seq, int pos, int state, FeatureList result) {
043 if(pos == seq.length()-1) {
044 return;
045 }
046
047 boolean plusInt = seq.getX(pos).queryPlus();
048 boolean minusInt = seq.getX(pos).queryMinus();
049
050 if (plusExonState[state] && plusInt ) { result.addFeature(startIx, 1); }
051 if (minusExonState[state] && minusInt ) { result.addFeature(startIx, 1); }
052
053 if (plusIntronState[state] && plusInt ) { result.addFeature(startIx+1, 1); }
054 if (minusIntronState[state] && minusInt ) { result.addFeature(startIx+1, 1); }
055 }
056
057 public void train(int startingIndex, ModelManager modelInfo, List<? extends TrainingSequence<? extends IntervalPosition>> data) {
058 startIx = startingIndex;
059 model = modelInfo;
060
061 int nStates = model.getNumStates();
062
063 plusExonState = new boolean[nStates];
064 for (int j=0; j<nStates; j++) { plusExonState[j] = false; }
065 plusExonState[model.getStateIndex("exon1")] = true;
066 plusExonState[model.getStateIndex("exon2")] = true;
067 plusExonState[model.getStateIndex("exon3")] = true;
068
069 minusExonState = new boolean[nStates];
070 for (int j=0; j<nStates; j++) { minusExonState[j] = false; }
071 minusExonState[model.getStateIndex("exon1m")] = true;
072 minusExonState[model.getStateIndex("exon2m")] = true;
073 minusExonState[model.getStateIndex("exon3m")] = true;
074
075 plusIntronState = new boolean[nStates];
076 for (int j=0; j<nStates; j++) { plusIntronState[j] = false; }
077 plusIntronState[model.getStateIndex("intron1")] = true;
078 plusIntronState[model.getStateIndex("intron2")] = true;
079 plusIntronState[model.getStateIndex("intron3")] = true;
080
081 minusIntronState = new boolean[nStates];
082 for (int j=0; j<nStates; j++) { minusIntronState[j] = false; }
083 minusIntronState[model.getStateIndex("intron1m")] = true;
084 minusIntronState[model.getStateIndex("intron2m")] = true;
085 minusIntronState[model.getStateIndex("intron3m")] = true;
086 }
087 }
088