diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java index f12e5b548..04b44a841 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java @@ -21,6 +21,8 @@ import org.broadinstitute.sting.gatk.walkers.Window; import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.VariantEvaluator; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.IntervalStratification; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; +import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.manager.SetOfStates; +import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.manager.StratificationManager; import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; @@ -199,10 +201,7 @@ public class VariantEvalWalker extends RodWalker implements Tr private int numSamples = 0; // The list of stratifiers and evaluators to use - private TreeSet stratificationObjects = null; - - // The set of all possible evaluation contexts - private HashMap evaluationContexts = null; + private List stratificationObjects = null; // important stratifications private boolean byFilterIsEnabled = false; @@ -223,6 +222,9 @@ public class VariantEvalWalker extends RodWalker implements Tr // Ancestral alignments private IndexedFastaSequenceFile ancestralAlignments = null; + // The set of all possible evaluation contexts + StratificationManager stratManager; + /** * Initialize the stratifications, evaluations, evaluation contexts, and reporting object */ @@ -269,6 +271,7 @@ public class VariantEvalWalker extends RodWalker implements Tr // Initialize the set of stratifications and evaluations to use stratificationObjects = variantEvalUtils.initializeStratificationObjects(this, NO_STANDARD_STRATIFICATIONS, STRATIFICATIONS_TO_USE); Set> evaluationObjects = variantEvalUtils.initializeEvaluationObjects(NO_STANDARD_MODULES, MODULES_TO_USE); + for ( VariantStratifier vs : stratificationObjects ) { if ( vs.getName().equals("Filter") ) byFilterIsEnabled = true; @@ -287,7 +290,7 @@ public class VariantEvalWalker extends RodWalker implements Tr } // Initialize the evaluation contexts - evaluationContexts = variantEvalUtils.initializeEvaluationContexts(stratificationObjects, evaluationObjects, null, null); + createStratificationStates(stratificationObjects, evaluationObjects); // Initialize report table report = variantEvalUtils.initializeGATKReport(stratificationObjects, evaluationObjects); @@ -306,7 +309,6 @@ public class VariantEvalWalker extends RodWalker implements Tr knownCNVsByContig = createIntervalTreeByContig(knownCNVsFile); } - //createStratificationStates(stratificationObjects); } public final Map> createIntervalTreeByContig(final IntervalBinding intervals) { @@ -372,8 +374,7 @@ public class VariantEvalWalker extends RodWalker implements Tr // find the comp final VariantContext comp = findMatchingComp(eval, compSet); - for ( StateKey stateKey : getApplicableStates(tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), sampleName) ) { - NewEvaluationContext nec = evaluationContexts.get(stateKey); + for ( NewEvaluationContext nec : getEvaluationContexts(tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), sampleName) ) { // eval against the comp synchronized (nec) { @@ -400,37 +401,19 @@ public class VariantEvalWalker extends RodWalker implements Tr return null; } -// private Iterable getApplicableStates(final RefMetaDataTracker tracker, -// final ReferenceContext ref, -// final VariantContext eval, -// final String evalName, -// final VariantContext comp, -// final String compName, -// final String sampleName ) { -// Set oldKeys = new HashSet(Utils.makeCollection(getApplicableStatesOld(tracker, ref, eval, evalName, comp, compName, sampleName))); -// -// int n = 0; -// for ( final StateKey newKey : getApplicableStatesNew(tracker, ref, eval, evalName, comp, compName, sampleName) ) { -// n++; -// if ( ! oldKeys.contains(newKey) ) -// throw new ReviewedStingException("New key " + newKey + " missing from previous algorithm"); -// } -// -// if ( n != oldKeys.size() ) -// throw new ReviewedStingException("New keyset has " + n + " elements but previous algorithm had " + oldKeys.size()); -// -// return oldKeys; -// } + final void createStratificationStates(final List stratificationObjects, final Set> evaluationObjects) { + final List strats = new ArrayList(stratificationObjects); + stratManager = + new StratificationManager(strats); -// private Iterable getApplicableStatesNew(final RefMetaDataTracker tracker, -// final ReferenceContext ref, -// final VariantContext eval, -// final String evalName, -// final VariantContext comp, -// final String compName, -// final String sampleName ) { -// // todo -- implement optimized version -// } + logger.info("Creating " + stratManager.size() + " combinatorial stratification states"); + for ( int i = 0; i < stratManager.size(); i++ ) { + NewEvaluationContext ec = new NewEvaluationContext(); + ec.putAll(stratManager.getStateForKey(i)); + ec.addEvaluationClassList(this, null, evaluationObjects); + stratManager.set(i, ec); + } + } /** * Given specific eval and comp VCs and the sample name, return an iterable @@ -447,23 +430,19 @@ public class VariantEvalWalker extends RodWalker implements Tr * @param sampleName * @return */ - private Iterable getApplicableStates(final RefMetaDataTracker tracker, - final ReferenceContext ref, - final VariantContext eval, - final String evalName, - final VariantContext comp, - final String compName, - final String sampleName ) { - final HashMap> stateMap = new HashMap>(stratificationObjects.size()); + private Collection getEvaluationContexts(final RefMetaDataTracker tracker, + final ReferenceContext ref, + final VariantContext eval, + final String evalName, + final VariantContext comp, + final String compName, + final String sampleName ) { + final List> states = new LinkedList>(); for ( final VariantStratifier vs : stratificationObjects ) { - List states = vs.getRelevantStates(ref, tracker, comp, compName, eval, evalName, sampleName); - stateMap.put(vs, states); + states.add(vs.getRelevantStates(ref, tracker, comp, compName, eval, evalName, sampleName)); } - ArrayList stateKeys = new ArrayList(); - variantEvalUtils.initializeStateKeys(stateMap, null, null, stateKeys); - - return new HashSet(stateKeys); + return stratManager.values(states); } @@ -539,9 +518,14 @@ public class VariantEvalWalker extends RodWalker implements Tr public void onTraversalDone(Integer result) { logger.info("Finalizing variant report"); - for ( Map.Entry ecElt : evaluationContexts.entrySet() ) { - final StateKey stateKey = ecElt.getKey(); - final NewEvaluationContext nec = ecElt.getValue(); + // TODO -- clean up -- this is deeply unsafe + for ( int key = 0; key < stratManager.size(); key++ ) { + final Map stateValues = stratManager.getStateForKey(key); + final NewEvaluationContext nec = stratManager.get(key); + + final Map stateKey = new HashMap(stateValues.size()); + for ( Map.Entry elt : stateValues.entrySet() ) + stateKey.put(elt.getKey().getName(), elt.getValue()); for ( VariantEvaluator ve : nec.getEvaluationClassList().values() ) { ve.finalizeEvaluation(); @@ -626,7 +610,7 @@ public class VariantEvalWalker extends RodWalker implements Tr public double getMendelianViolationQualThreshold() { return MENDELIAN_VIOLATION_QUAL_THRESHOLD; } - public TreeSet getStratificationObjects() { return stratificationObjects; } + public List getStratificationObjects() { return stratificationObjects; } public static String getAllSampleName() { return ALL_SAMPLE_NAME; } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java index 2f342e120..1068b2cc8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java @@ -8,6 +8,7 @@ import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -32,15 +33,13 @@ public class AlleleCount extends VariantStratifier { // create an array containing each of the allele counts for( int ac = 0; ac <= nchrom; ac++ ) { - states.add(String.format("%d", ac)); + states.add(ac); } getVariantEvalWalker().getLogger().info("AlleleCount using " + nchrom + " chromosomes"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(1); - + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (eval != null) { int AC = -1; if ( eval.hasAttribute("AC") && eval.getAttribute("AC") instanceof Integer ) { @@ -51,9 +50,9 @@ public class AlleleCount extends VariantStratifier { } else // by default, the site is considered monomorphic AC = 0; - relevantStates.add(String.format("%d", AC)); + return Collections.singletonList((Object)AC); + } else { + return Collections.emptyList(); } - - return relevantStates; } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java index cd2b8e475..817663026 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java @@ -6,6 +6,7 @@ import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -17,23 +18,20 @@ import java.util.List; public class AlleleFrequency extends VariantStratifier { @Override public void initialize() { - states = new ArrayList(); for( double a = 0.000; a <= 1.005; a += 0.005 ) { states.add(String.format("%.3f", a)); } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); - + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (eval != null) { try { - relevantStates.add(String.format("%.3f", (5.0 * MathUtils.round(eval.getAttributeAsDouble("AF", 0.0) / 5.0, 3)))); + return Collections.singletonList((Object)String.format("%.3f", (5.0 * MathUtils.round(eval.getAttributeAsDouble("AF", 0.0) / 5.0, 3)))); } catch (Exception e) { - return relevantStates; + return Collections.emptyList(); } } - return relevantStates; + return Collections.emptyList(); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java index 1f31ebfa7..1274028d7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java @@ -6,6 +6,7 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @@ -15,16 +16,12 @@ import java.util.List; public class CompRod extends VariantStratifier implements RequiredStratification { @Override public void initialize() { - for ( RodBinding rod : getVariantEvalWalker().getComps() ) + for ( RodBinding rod : getVariantEvalWalker().getComps() ) { states.add(rod.getName()); + } } - - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); - - relevantStates.add(compName); - - return relevantStates; + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + return Collections.singletonList((Object)compName); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java index c45a73231..328bab1db 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java @@ -5,6 +5,8 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -17,14 +19,12 @@ public class Contig extends VariantStratifier { states.add("all"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); - + @Override + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (eval != null) { - relevantStates.add("all"); - relevantStates.add(eval.getChr()); + return Arrays.asList((Object)"all", eval.getChr()); + } else { + return Collections.emptyList(); } - - return relevantStates; } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java index 539cd21ef..7536b0237 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java @@ -27,7 +27,8 @@ public class CpG extends VariantStratifier { states.add("non_CpG"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + @Override + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { boolean isCpG = false; if (ref != null && ref.getBases() != null) { String fwRefBases = new String(ref.getBases()); @@ -41,7 +42,7 @@ public class CpG extends VariantStratifier { } } - ArrayList relevantStates = new ArrayList(); + ArrayList relevantStates = new ArrayList(2); relevantStates.add("all"); relevantStates.add(isCpG ? "CpG" : "non_CpG"); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java index 91c96e490..eab59864f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java @@ -17,7 +17,6 @@ public class Degeneracy extends VariantStratifier { @Override public void initialize() { - states = new ArrayList(); states.add("1-fold"); states.add("2-fold"); states.add("3-fold"); @@ -79,8 +78,8 @@ public class Degeneracy extends VariantStratifier { } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + ArrayList relevantStates = new ArrayList(); relevantStates.add("all"); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java index 3f8c32b5c..6328d6a51 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java @@ -6,6 +6,7 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -14,7 +15,6 @@ import java.util.List; public class EvalRod extends VariantStratifier implements RequiredStratification { @Override public void initialize() { - states = new ArrayList(); for ( RodBinding rod : getVariantEvalWalker().getEvals() ) { states.add(rod.getName()); if ( getVariantEvalWalker().mergeEvals ) @@ -22,11 +22,7 @@ public class EvalRod extends VariantStratifier implements RequiredStratification } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); - - relevantStates.add(evalName); - - return relevantStates; + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + return Arrays.asList((Object)evalName); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java index aacfae993..278ced713 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java @@ -18,8 +18,8 @@ public class Filter extends VariantStratifier { states.add("raw"); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + ArrayList relevantStates = new ArrayList(); relevantStates.add("raw"); if (eval != null) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java index f5dcf527a..330451fff 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java @@ -28,8 +28,8 @@ public class FunctionalClass extends VariantStratifier { } -public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + ArrayList relevantStates = new ArrayList(); relevantStates.add("all"); @@ -52,8 +52,8 @@ public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker t try { FunctionalType newType = FunctionalType.valueOf(newtypeStr); if ( type == null || - ( type == FunctionalType.silent && newType != FunctionalType.silent ) || - ( type == FunctionalType.missense && newType == FunctionalType.nonsense ) ) { + ( type == FunctionalType.silent && newType != FunctionalType.silent ) || + ( type == FunctionalType.missense && newType == FunctionalType.nonsense ) ) { type = newType; } } catch ( Exception e ) {} // don't error out if the type isn't supported @@ -71,7 +71,7 @@ public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker t type = FunctionalType.missense; else if ( snpEffFunctionalClass == SnpEff.EffectFunctionalClass.SILENT ) type = FunctionalType.silent; - } + } catch ( Exception e ) {} // don't error out if the type isn't supported } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IndelSize.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IndelSize.java index 361cc5fea..9c70ef00f 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IndelSize.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IndelSize.java @@ -5,6 +5,7 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -17,15 +18,12 @@ public class IndelSize extends VariantStratifier { static final int MAX_INDEL_SIZE = 100; @Override public void initialize() { - states = new ArrayList(); for( int a=-MAX_INDEL_SIZE; a <=MAX_INDEL_SIZE; a++ ) { - states.add(String.format("%d", a)); + states.add(a); } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); - + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (eval != null && eval.isIndel() && eval.isBiallelic()) { try { int eventLength = 0; @@ -40,12 +38,12 @@ public class IndelSize extends VariantStratifier { else if (eventLength < -MAX_INDEL_SIZE) eventLength = -MAX_INDEL_SIZE; - relevantStates.add(String.format("%d",eventLength)); + return Collections.singletonList((Object)eventLength); } catch (Exception e) { - return relevantStates; + return Collections.emptyList(); } } - return relevantStates; + return Collections.emptyList(); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IntervalStratification.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IntervalStratification.java index 879e6066f..7fe98ea21 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IntervalStratification.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/IntervalStratification.java @@ -70,20 +70,18 @@ public class IntervalStratification extends VariantStratifier { logger.info(String.format("Creating IntervalStratification %s containing %d intervals covering %d bp", getVariantEvalWalker().intervalsFile.getSource(), locs.size(), IntervalUtils.intervalSize(locs))); - states = new ArrayList(Arrays.asList("all", "overlaps.intervals", "outside.intervals")); + states.addAll(Arrays.asList("all", "overlaps.intervals", "outside.intervals")); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - final ArrayList relevantStates = new ArrayList(Arrays.asList("all")); - + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (eval != null) { final GenomeLoc loc = getVariantEvalWalker().getGenomeLocParser().createGenomeLoc(eval, true); IntervalTree intervalTree = intervalTreeByContig.get(loc.getContig()); IntervalTree.Node node = intervalTree.minOverlapper(loc.getStart(), loc.getStop()); //logger.info(String.format("Overlap %s found %s", loc, node)); - relevantStates.add( node != null ? "overlaps.intervals" : "outside.intervals"); + return Collections.singletonList((Object)(node != null ? "overlaps.intervals" : "outside.intervals")); } - return relevantStates; + return Collections.emptyList(); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java index c0cab4534..dc5438358 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java @@ -29,8 +29,8 @@ public class JexlExpression extends VariantStratifier implements StandardStratif } } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - ArrayList relevantStates = new ArrayList(); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + ArrayList relevantStates = new ArrayList(); relevantStates.add("none"); for ( SortableJexlVCMatchExp jexlExpression : jexlExpressions ) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java index 77d98d33b..693bdf198 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java @@ -14,24 +14,26 @@ public class Novelty extends VariantStratifier implements StandardStratification // needs the variant contexts and known names private List> knowns; + private final static List KNOWN_STATES = Arrays.asList((Object)"all", (Object)"known"); + private final static List NOVEL_STATES = Arrays.asList((Object)"all", (Object)"novel"); @Override public void initialize() { - states = new ArrayList(Arrays.asList("all", "known", "novel")); + states.addAll(Arrays.asList("all", "known", "novel")); knowns = getVariantEvalWalker().getKnowns(); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { if (tracker != null && eval != null) { final Collection knownComps = tracker.getValues(knowns, ref.getLocus()); for ( final VariantContext c : knownComps ) { // loop over sites, looking for something that matches the type eval if ( eval.getType() == c.getType() ) { - return Arrays.asList("all", "known"); + return KNOWN_STATES; } } - } - - return Arrays.asList("all", "novel"); + } + + return NOVEL_STATES; } -} +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java index c697b5b7a..d78a35b40 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java @@ -5,6 +5,7 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -20,7 +21,7 @@ public class Sample extends VariantStratifier { states.addAll(getVariantEvalWalker().getSampleNamesForStratification()); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - return Arrays.asList(sampleName); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + return Collections.singletonList((Object)sampleName); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java index 42d92ec01..2398605de 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java @@ -3,24 +3,41 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; +import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.manager.SetOfStates; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.List; -public abstract class VariantStratifier implements Comparable { +public abstract class VariantStratifier implements Comparable, SetOfStates { private VariantEvalWalker variantEvalWalker; final private String name; - protected ArrayList states = new ArrayList(); + final protected ArrayList states = new ArrayList(); protected VariantStratifier() { name = this.getClass().getSimpleName(); } + // ------------------------------------------------------------------------------------- + // + // to be overloaded + // + // ------------------------------------------------------------------------------------- + + public abstract void initialize(); + + public abstract List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName); + + // ------------------------------------------------------------------------------------- + // + // final capabilities + // + // ------------------------------------------------------------------------------------- + /** * @return a reference to the parent VariantEvalWalker running this stratification */ - public VariantEvalWalker getVariantEvalWalker() { + public final VariantEvalWalker getVariantEvalWalker() { return variantEvalWalker; } @@ -28,17 +45,11 @@ public abstract class VariantStratifier implements Comparable * Should only be called by VariantEvalWalker itself * @param variantEvalWalker */ - public void setVariantEvalWalker(VariantEvalWalker variantEvalWalker) { + public final void setVariantEvalWalker(VariantEvalWalker variantEvalWalker) { this.variantEvalWalker = variantEvalWalker; } - public abstract void initialize(); - - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - return null; - } - - public int compareTo(VariantStratifier o1) { + public final int compareTo(VariantStratifier o1) { return this.getName().compareTo(o1.getName()); } @@ -46,7 +57,7 @@ public abstract class VariantStratifier implements Comparable return name; } - public ArrayList getAllStates() { + public final ArrayList getAllStates() { return states; } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantType.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantType.java index 7d25498a5..a9be7c3c0 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantType.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantType.java @@ -38,12 +38,10 @@ import java.util.List; public class VariantType extends VariantStratifier { @Override public void initialize() { - for ( VariantContext.Type t : VariantContext.Type.values() ) { - states.add(t.toString()); - } + states.addAll(Arrays.asList(VariantContext.Type.values())); } - public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { - return eval == null ? Collections.emptyList() : Arrays.asList(eval.getType().toString()); + public List getRelevantStates(ReferenceContext ref, RefMetaDataTracker tracker, VariantContext comp, String compName, VariantContext eval, String evalName, String sampleName) { + return eval == null ? Collections.emptyList() : Collections.singletonList((Object)eval.getType()); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/manager/StratificationManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/manager/StratificationManager.java index 12bd0df57..9f5a29fdb 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/manager/StratificationManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/manager/StratificationManager.java @@ -39,7 +39,12 @@ import java.util.*; public class StratificationManager implements Map, V> { private final StratNode root; private final int size; - private final ArrayList values; + + private final ArrayList stratifiers; + + // values associated with each key + private final ArrayList valuesByKey; + private final ArrayList> stratifierValuesByKey; // ------------------------------------------------------------------------------------- // @@ -49,15 +54,21 @@ public class StratificationManager implements Map strats) { + stratifiers = new ArrayList(strats); this.root = buildStratificationTree(new LinkedList(strats)); assignKeys(root); + this.size = root.size(); if ( this.size == 0 ) throw new ReviewedStingException("Size == 0 in StratificationManager"); - this.values = new ArrayList(size()); - for ( int i = 0; i < size(); i++ ) - this.values().add(null); + this.valuesByKey = new ArrayList(size()); + this.stratifierValuesByKey = new ArrayList>(size()); + for ( int i = 0; i < size(); i++ ) { + this.valuesByKey.add(null); + this.stratifierValuesByKey.add(null); + } + assignStratifierValuesByKey(root); } private StratNode buildStratificationTree(final Queue strats) { @@ -91,6 +102,28 @@ public class StratificationManager implements Map root) { + assignStratifierValuesByKey(root, new LinkedList()); + + for ( List stateValues : stratifierValuesByKey ) + if ( stateValues == null ) + throw new ReviewedStingException("Found a null state value set that's null"); + } + + public void assignStratifierValuesByKey(final StratNode node, final LinkedList states) { + if ( node.isLeaf() ) { // we're here! + if ( states.isEmpty() ) + throw new ReviewedStingException("Found a leaf node with an empty state values vector"); + stratifierValuesByKey.set(node.getKey(), new ArrayList(states)); + } else { + for ( Map.Entry> entry : node.getSubnodes().entrySet() ) { + final LinkedList newStates = new LinkedList(states); + newStates.addLast(entry.getKey()); + assignStratifierValuesByKey(entry.getValue(), newStates); + } + } + } + // ------------------------------------------------------------------------------------- // // simple accessors @@ -127,27 +160,45 @@ public class StratificationManager implements Map getStateForKey(final int key) { + final Map states = new HashMap(stratifiers.size()); + for ( int i = 0; i < stratifiers.size(); i++ ) { + final K strat = stratifiers.get(i); + final Object stratValue = stratifierValuesByKey.get(key).get(i); + states.put(strat, stratValue); + } + return states; + } + // ------------------------------------------------------------------------------------- // - // values + // valuesByKey // // ------------------------------------------------------------------------------------- @Override @Ensures("result != null") public ArrayList values() { - return values; + return valuesByKey; + } + + public Collection values(List> states) { + // TODO -- SHOULD BE INLINE TO AVOID CREATING LIST OF KEYS JUST TO ITERATE OVER IT + Collection vals = new LinkedList(); + for ( int key : getKeys(states) ) + vals.add(get(key)); + return vals; } @Requires("key >= 0 && key <= size()") @Ensures("get(key) == value") public void set(final int key, final V value) { - values.set(key, value); + valuesByKey.set(key, value); } @Requires("key >= 0 && key <= size()") public V get(final int key) { - return values.get(key); + return valuesByKey.get(key); } @Requires("getKey(states) != -1") diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java index b5c6a1ecf..5dfc321a6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java @@ -12,7 +12,7 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; -public class NewEvaluationContext extends HashMap { +public class NewEvaluationContext extends HashMap { private Map evaluationInstances; public void addEvaluationClassList(VariantEvalWalker walker, StateKey stateKey, Set> evaluationClasses) { @@ -37,9 +37,9 @@ public class NewEvaluationContext extends HashMap { } public StateKey makeStateKey() { - Map map = new HashMap(size()); + Map map = new HashMap(size()); - for (Map.Entry elt : this.entrySet() ) { + for (Map.Entry elt : this.entrySet() ) { map.put(elt.getKey().getName(), elt.getValue()); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/StateKey.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/StateKey.java index f62de17a5..a52f68a6c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/StateKey.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/StateKey.java @@ -47,18 +47,18 @@ import java.util.TreeMap; public final class StateKey { /** High-performance cache of the toString operation for a constant class */ private final String string; - private final TreeMap states; + private final TreeMap states; - public StateKey(final Map states) { - this.states = new TreeMap(states); + public StateKey(final Map states) { + this.states = new TreeMap(states); this.string = formatString(); } - public StateKey(final StateKey toOverride, final String keyOverride, final String valueOverride) { + public StateKey(final StateKey toOverride, final String keyOverride, final Object valueOverride) { if ( toOverride == null ) { - this.states = new TreeMap(); + this.states = new TreeMap(); } else { - this.states = new TreeMap(toOverride.states); + this.states = new TreeMap(toOverride.states); } this.states.put(keyOverride, valueOverride); @@ -90,7 +90,7 @@ public final class StateKey { private final String formatString() { StringBuilder b = new StringBuilder(); - for ( Map.Entry entry : states.entrySet() ) { + for ( Map.Entry entry : states.entrySet() ) { b.append(String.format("%s:%s;", entry.getKey(), entry.getValue())); } @@ -98,7 +98,7 @@ public final class StateKey { } // TODO -- might be slow because of tree map - public String get(final String key) { + public Object get(final String key) { return states.get(key); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java index 9b4ae129a..81df7215a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java @@ -87,8 +87,8 @@ public class VariantEvalUtils { * @param modulesToUse the list of stratification modules to use * @return set of stratifications to use */ - public TreeSet initializeStratificationObjects(VariantEvalWalker variantEvalWalker, boolean noStandardStrats, String[] modulesToUse) { - TreeSet strats = new TreeSet(); + public List initializeStratificationObjects(VariantEvalWalker variantEvalWalker, boolean noStandardStrats, String[] modulesToUse) { + List strats = new ArrayList(); Set stratsToUse = new HashSet(); // Create a map for all stratification modules for easy lookup. @@ -181,47 +181,6 @@ public class VariantEvalUtils { return evals; } - /** - * Recursively initialize the evaluation contexts - * - * @param stratificationObjects the stratifications to use - * @param evaluationObjects the evaluations to use - * @param stratStack a stack of stratifications to apply - * @param ec evaluation context - * @return a map of all the evaluation contexts - */ - public HashMap initializeEvaluationContexts(Set stratificationObjects, Set> evaluationObjects, Stack stratStack, NewEvaluationContext ec) { - HashMap ecs = new LinkedHashMap(); - - if (stratStack == null) { - stratStack = new Stack(); - stratStack.addAll(stratificationObjects); - } - - if (!stratStack.isEmpty()) { - Stack newStratStack = new Stack(); - newStratStack.addAll(stratStack); - - VariantStratifier vs = newStratStack.pop(); - - for (String state : vs.getAllStates()) { - NewEvaluationContext nec = new NewEvaluationContext(); - if (ec != null) { - nec.putAll(ec); - } - nec.put(vs, state); - - ecs.putAll(initializeEvaluationContexts(stratificationObjects, evaluationObjects, newStratStack, nec)); - } - } else { - final StateKey stateKey = ec.makeStateKey(); - ec.addEvaluationClassList(variantEvalWalker, stateKey, evaluationObjects); - return new HashMap(Collections.singletonMap(stateKey, ec)); - } - - return ecs; - } - /** * Initialize the output report * @@ -229,7 +188,7 @@ public class VariantEvalUtils { * @param evaluationObjects the evaluations to use * @return an initialized report object */ - public GATKReport initializeGATKReport(Set stratificationObjects, Set> evaluationObjects) { + public GATKReport initializeGATKReport(Collection stratificationObjects, Set> evaluationObjects) { GATKReport report = new GATKReport(); for (Class ve : evaluationObjects) { @@ -387,44 +346,4 @@ public class VariantEvalUtils { mappings.put(sample, new ArrayList(1)); mappings.get(sample).add(vc); } - - /** - * Recursively initialize the state keys used to look up the right evaluation context based on the state of the - * variant context - * - * @param stateMap the map of allowable states - * @param stateStack a stack of the states - * @param stateKey a state key object - * @param stateKeys all the state keys - * @return a list of state keys - */ - public ArrayList initializeStateKeys(HashMap> stateMap, Stack>> stateStack, StateKey stateKey, ArrayList stateKeys) { - if (stateStack == null) { - stateStack = new Stack>>(); - - for (VariantStratifier vs : stateMap.keySet()) { - HashMap> oneSetOfStates = new HashMap>(); - oneSetOfStates.put(vs, stateMap.get(vs)); - - stateStack.add(oneSetOfStates); - } - } - - if (!stateStack.isEmpty()) { - Stack>> newStateStack = new Stack>>(); - newStateStack.addAll(stateStack); - - HashMap> oneSetOfStates = newStateStack.pop(); - VariantStratifier vs = oneSetOfStates.keySet().iterator().next(); - - for (final String state : oneSetOfStates.get(vs)) { - final StateKey newStateKey = new StateKey(stateKey, vs.getName(), state); - initializeStateKeys(stateMap, newStateStack, newStateKey, stateKeys); - } - } else { - stateKeys.add(stateKey); - } - - return stateKeys; - } } \ No newline at end of file