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.CompositeInput;
013    import calhoun.analysis.crf.io.InputSequence;
014    import calhoun.analysis.crf.io.TrainingSequence;
015    
016    public class ESTExon extends AbstractFeatureManager<CompositeInput> implements FeatureManagerNode<CompositeInput> {
017            private static final long serialVersionUID = -7659288739348604129L;
018            private static final Log log = LogFactory.getLog(ESTExon.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 ESTExon() {
032            }
033    
034            public int getNumFeatures() {
035                    return 4;
036            }       
037            
038            public String getFeatureName(int featureIndex) {
039                    return "ESTExon";
040            }
041            
042            public void evaluateNode(InputSequence<? extends CompositeInput> seq, int pos, int state, FeatureList result) {
043                    if(pos == seq.length()-1) {
044                            return;
045                    }               
046    
047                    InputSequence<Integer>  pest = (InputSequence<Integer>) seq.getComponent("pest");           
048                    InputSequence<Integer>  mest = (InputSequence<Integer>) seq.getComponent("mest");
049                    
050                    int plusEst  = pest.getX(pos+1);
051                    int minusEst = mest.getX(pos+1);
052                    // 0 - no data
053                    // 1 - exon only
054                    // 2 - intron only
055                    // 3 - mixed
056    
057                    if (plusExonState[state] && (plusEst==1)) { result.addFeature(startIx, 1); }
058                    if (minusExonState[state] && (minusEst==1)) { result.addFeature(startIx, 1); }
059    
060                    if (plusExonState[state] && (plusEst==3)) { result.addFeature(startIx+1, 1); }
061                    if (minusExonState[state] && (minusEst==3)) { result.addFeature(startIx+1, 1); }
062                    
063                    if (plusIntronState[state] && (plusEst==2)) { result.addFeature(startIx+2, 1); }
064                    if (minusIntronState[state] && (minusEst==2)) { result.addFeature(startIx+2, 1); }
065    
066                    if (plusIntronState[state] && (plusEst==3)) { result.addFeature(startIx+3, 1); }
067                    if (minusIntronState[state] && (minusEst==3)) { result.addFeature(startIx+3, 1); }              
068                    
069            }
070    
071    
072            public void train(int startingIndex, ModelManager modelInfo, List<? extends TrainingSequence<? extends CompositeInput>> data) {
073                    startIx = startingIndex;
074                    model = modelInfo;
075    
076                    int nStates = model.getNumStates();
077                    
078                    plusExonState = new boolean[nStates];
079                    for (int j=0; j<nStates; j++) { plusExonState[j] = false; }
080                    plusExonState[model.getStateIndex("exon1")] = true;
081                    plusExonState[model.getStateIndex("exon2")] = true;
082                    plusExonState[model.getStateIndex("exon3")] = true;
083                    
084                    minusExonState = new boolean[nStates]; 
085                    for (int j=0; j<nStates; j++) { minusExonState[j] = false; }         
086                    minusExonState[model.getStateIndex("exon1m")] = true;
087                    minusExonState[model.getStateIndex("exon2m")] = true;
088                    minusExonState[model.getStateIndex("exon3m")] = true;           
089                    
090                    plusIntronState = new boolean[nStates];
091                    for (int j=0; j<nStates; j++) { plusIntronState[j] = false; }
092                    plusIntronState[model.getStateIndex("intron1")] = true;
093                    plusIntronState[model.getStateIndex("intron2")] = true;
094                    plusIntronState[model.getStateIndex("intron3")] = true;
095                    
096                    minusIntronState = new boolean[nStates]; 
097                    for (int j=0; j<nStates; j++) { minusIntronState[j] = false; }               
098                    minusIntronState[model.getStateIndex("intron1m")] = true;
099                    minusIntronState[model.getStateIndex("intron2m")] = true;
100                    minusIntronState[model.getStateIndex("intron3m")] = true;       
101            }
102    }
103