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.CacheStrategySpec;
010 import calhoun.analysis.crf.FeatureList;
011 import calhoun.analysis.crf.FeatureManagerNode;
012 import calhoun.analysis.crf.ModelManager;
013 import calhoun.analysis.crf.CacheStrategySpec.CacheStrategy;
014 import calhoun.analysis.crf.io.CompositeInput;
015 import calhoun.analysis.crf.io.InputSequence;
016 import calhoun.analysis.crf.io.TrainingSequence;
017
018 public class ESTIntron extends AbstractFeatureManager<CompositeInput> implements FeatureManagerNode<CompositeInput> {
019 private static final long serialVersionUID = -7659288739348604129L;
020 private static final Log log = LogFactory.getLog(ESTIntron.class);
021 boolean debug = log.isDebugEnabled();
022
023 /* Contains 1 features:
024 * f returns 1 if either of two conditions below and 0 otherwise:
025 * a) y_i=intron1,intron2,intron3 and pest(i+1) = 2 [intron only]
026 * b) y_i= intron1m,intron2m,intron3m and mest(i+1) = 2 [intron only]
027 */
028
029 int startIx; // The index of the first feature managed by this FeatureManager
030 ModelManager model;
031
032 boolean[] plusIntronState;
033 boolean[] minusIntronState;
034
035
036 public ESTIntron() {
037 }
038
039 public int getNumFeatures() {
040 return 1;
041 }
042
043 public String getFeatureName(int featureIndex) {
044 return "ESTIntron";
045 }
046
047 public void evaluateNode(InputSequence<? extends CompositeInput> seq, int pos, int state, FeatureList result) {
048 if(pos == seq.length()-1) {
049 return;
050 }
051
052 InputSequence<Integer> pest = (InputSequence<Integer>) seq.getComponent("pest");
053 InputSequence<Integer> mest = (InputSequence<Integer>) seq.getComponent("mest");
054
055 boolean plusEstIntron = (pest.getX(pos+1) == 2);
056 boolean minusEstIntron = (mest.getX(pos+1) == 2);
057
058 if (plusIntronState[state] && plusEstIntron) { result.addFeature(startIx, 1); }
059 if (minusIntronState[state] && minusEstIntron) { result.addFeature(startIx, 1); }
060 }
061
062
063 public void train(int startingIndex, ModelManager modelInfo, List<? extends TrainingSequence<? extends CompositeInput>> data) {
064 startIx = startingIndex;
065 model = modelInfo;
066
067 int nStates = model.getNumStates();
068
069 plusIntronState = new boolean[nStates];
070 for (int j=0; j<nStates; j++) { plusIntronState[j] = false; }
071 plusIntronState[model.getStateIndex("intron1")] = true;
072 plusIntronState[model.getStateIndex("intron2")] = true;
073 plusIntronState[model.getStateIndex("intron3")] = true;
074
075 minusIntronState = new boolean[nStates];
076 for (int j=0; j<nStates; j++) { minusIntronState[j] = false; }
077 minusIntronState[model.getStateIndex("intron1m")] = true;
078 minusIntronState[model.getStateIndex("intron2m")] = true;
079 minusIntronState[model.getStateIndex("intron3m")] = true;
080 }
081 @Override
082 public CacheStrategySpec getCacheStrategy() {
083 return new CacheStrategySpec(CacheStrategy.UNSPECIFIED);
084 }
085 }
086