001 package calhoun.analysis.crf.features.interval13;
002
003 import calhoun.analysis.crf.CacheStrategySpec;
004 import calhoun.analysis.crf.FeatureManagerNodeBoundaries;
005 import calhoun.analysis.crf.CacheStrategySpec.CacheStrategy;
006
007
008 public class ReferenceBasePredictorInterval13 extends ReferenceBasePredictorInterval13Base implements FeatureManagerNodeBoundaries<Character> {
009
010 private static final long serialVersionUID = -8460452348450096338L;
011
012 public ReferenceBasePredictorInterval13() {
013 }
014
015 @Override
016 public CacheStrategySpec getCacheStrategy() {
017
018 CacheStrategySpec css = new CacheStrategySpec(CacheStrategy.DENSE_NODE_BOUNDARY);
019 CacheStrategySpec.DenseBoundaryCachingDetails details = new CacheStrategySpec.DenseBoundaryCachingDetails(9); // we will use 9 tables
020
021
022 // If you want to predict for real and mesh with a PWM, then set pads, for example, as below:
023 // donor[j] = new PWMLookup(3,6,pseudoCounts); // donor signal xxx|GTxxxx
024 // acceptor[j] = new PWMLookup(9,6,pseudoCounts); // acceptor signal xxxxxxxAG|xxxxxx
025 // start = new PWMLookup(9,6,pseudoCounts); // start signal xxxxxxxxx|ATGxxx
026 // stop = new PWMLookup(3,9,pseudoCounts); // stop signal xxx|TAGxxxxxx
027
028 // IDEALLY HAVE SOME ASSERTIONS TYING THESE PADS TO THE PWM SIZES
029 details.add(0,0,startIx + (multipleFeatures ? 0 : 0),Interval13Model.getPadIntergenic(),Interval13Model.getPadIntergenic()); // minlength 18
030 details.add(1,1,startIx + (multipleFeatures ? 1 : 0),Interval13Model.getPadExon3prime(),Interval13Model.getPadExon5prime()); // minlength 9
031 details.add(2,2,startIx + (multipleFeatures ? 1 : 0),Interval13Model.getPadExon3prime(),Interval13Model.getPadExon5prime());
032 details.add(3,3,startIx + (multipleFeatures ? 1 : 0),Interval13Model.getPadExon3prime(),Interval13Model.getPadExon5prime());
033 details.add(4,4,startIx + (multipleFeatures ? 2 : 0),Interval13Model.getPadIntron3prime(),Interval13Model.getPadIntron5prime()); // minlength 15
034 details.add(5,4,startIx + (multipleFeatures ? 2 : 0),Interval13Model.getPadIntron3prime(),Interval13Model.getPadIntron5prime());
035 details.add(6,4,startIx + (multipleFeatures ? 2 : 0),Interval13Model.getPadIntron3prime(),Interval13Model.getPadIntron5prime());
036 details.add(7,5,startIx + (multipleFeatures ? 3 : 0),Interval13Model.getPadExon5prime(),Interval13Model.getPadExon3prime()); // minlength 9
037 details.add(8,6,startIx + (multipleFeatures ? 3 : 0),Interval13Model.getPadExon5prime(),Interval13Model.getPadExon3prime());
038 details.add(9,7,startIx + (multipleFeatures ? 3 : 0),Interval13Model.getPadExon5prime(),Interval13Model.getPadExon3prime());
039 details.add(10,8,startIx + (multipleFeatures ? 4 : 0),Interval13Model.getPadIntron5prime(),Interval13Model.getPadIntron3prime()); // minlength 15
040 details.add(11,8,startIx + (multipleFeatures ? 4 : 0),Interval13Model.getPadIntron5prime(),Interval13Model.getPadIntron3prime());
041 details.add(12,8,startIx + (multipleFeatures ? 4 : 0),Interval13Model.getPadIntron5prime(),Interval13Model.getPadIntron3prime());
042
043 // NOTE: The minimum lengths of the Semi-Markov training and inference for each state must be AT least as big as the sum of the two pads at either end.
044
045 details.check();
046
047 css.details = details;
048
049 return css;
050 }
051 }