001    package calhoun.analysis.crf.features.interval13;
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 BlastInterval13 extends AbstractFeatureManager<CompositeInput> implements FeatureManagerNode<CompositeInput> {
019            private static final long serialVersionUID = -7659288739348604129L;
020            private static final Log log = LogFactory.getLog(BlastInterval13.class);
021            boolean debug = log.isDebugEnabled();
022            
023            int startIx;  // The index of the first feature managed by this FeatureManager
024            ModelManager model;
025            
026            boolean[] intergenicState;
027            boolean[] plusExonState;
028            boolean[] minusExonState;
029            boolean[] plusIntronState;
030            boolean[] minusIntronState;     
031            
032            public BlastInterval13() {
033            }
034    
035            public int getNumFeatures() {
036                    return 3;
037            }       
038            
039            public String getFeatureName(int featureIndex) {
040                    String[] types = new String[] {"exon", "intron", "Intergenic","a"};
041                    return "Blast "+types[featureIndex-startIx];
042            }
043    
044            public void evaluateNode(InputSequence<? extends CompositeInput> seq, int pos, int state, FeatureList result) {
045                    if(pos == seq.length()-1) {
046                            return;
047                    }               
048    
049                    InputSequence<Integer>  pblast = (InputSequence<Integer>) seq.getComponent("pblast");
050                    InputSequence<Integer>  mblast = (InputSequence<Integer>) seq.getComponent("mblast");
051    
052                    int plusEst  = pblast.getX(pos+1);
053                    int minusEst = mblast.getX(pos+1);
054                    // 0 - no data
055                    // 1 - blast cluster hit here on this strand
056    
057                    if ((plusExonState[state] && (plusEst==1)) || (minusExonState[state] && (minusEst==1))) { 
058                            result.addFeature(startIx, 1); 
059                    }
060                    
061                    if ((plusIntronState[state] && (plusEst==1)) || (minusIntronState[state] && (minusEst==1))) { 
062                            result.addFeature(startIx+1, 1); 
063                    }
064    
065                    if (intergenicState[state] && (plusEst==1 || minusEst==1)) { 
066                            result.addFeature(startIx+2, 1); 
067                    }
068    }
069                    
070            public void train(int startingIndex, ModelManager modelInfo, List<? extends TrainingSequence<? extends CompositeInput>> data) {
071                    startIx = startingIndex;
072                    model = modelInfo;
073    
074                    int nStates = model.getNumStates();
075                    
076                    plusExonState = new boolean[nStates];
077                    plusExonState[model.getStateIndex("exon0")] = true;
078                    plusExonState[model.getStateIndex("exon1")] = true;
079                    plusExonState[model.getStateIndex("exon2")] = true;
080                    
081                    minusExonState = new boolean[nStates]; 
082                    minusExonState[model.getStateIndex("exon0m")] = true;
083                    minusExonState[model.getStateIndex("exon1m")] = true;
084                    minusExonState[model.getStateIndex("exon2m")] = true;           
085                    
086                    plusIntronState = new boolean[nStates];
087                    plusIntronState[model.getStateIndex("intron0")] = true;
088                    plusIntronState[model.getStateIndex("intron1")] = true;
089                    plusIntronState[model.getStateIndex("intron2")] = true;
090                    
091                    minusIntronState = new boolean[nStates]; 
092                    minusIntronState[model.getStateIndex("intron0m")] = true;
093                    minusIntronState[model.getStateIndex("intron1m")] = true;
094                    minusIntronState[model.getStateIndex("intron2m")] = true;       
095    
096                    intergenicState = new boolean[nStates];
097                    intergenicState[model.getStateIndex("intergenic")] = true;
098            }
099    
100            @Override
101            public CacheStrategySpec getCacheStrategy() {
102                    return new CacheStrategySpec(CacheStrategy.DENSE);
103            }
104    }
105