/** * this is the function that the inheriting class can expect to have called when the command line * system has initialized. * * @return the return code to exit the program with */ protected int execute() throws Exception { engine.setParser(parser); argumentSources.add(this); Walker<?, ?> walker = engine.getWalkerByName(getAnalysisName()); try { // Make sure a valid GATK user key is present, if required. authorizeGATKRun(); engine.setArguments(getArgumentCollection()); // File lists can require a bit of additional expansion. Set these explicitly by the engine. engine.setSAMFileIDs( ListFileUtils.unpackBAMFileList(getArgumentCollection().samFiles, parser)); engine.setWalker(walker); walker.setToolkit(engine); Collection<ReadFilter> filters = engine.createFilters(); engine.setFilters(filters); // load the arguments into the walker / filters. // TODO: The fact that this extra load call exists here when all the parsing happens at the // engine // TODO: level indicates that we're doing something wrong. Turn this around so that the GATK // can drive // TODO: argument processing. loadArgumentsIntoObject(walker); argumentSources.add(walker); Collection<RMDTriplet> rodBindings = ListFileUtils.unpackRODBindings(parser.getRodBindings(), parser); engine.setReferenceMetaDataFiles(rodBindings); for (ReadFilter filter : filters) { loadArgumentsIntoObject(filter); argumentSources.add(filter); } engine.execute(); generateGATKRunReport(walker); } catch (Exception e) { generateGATKRunReport(walker, e); throw e; } // always return 0 return 0; }
/** * GATK provides the walker as an argument source. * * @return List of walkers to load dynamically. */ @Override protected Class[] getArgumentSources() { // No walker info? No plugins. if (getAnalysisName() == null) return new Class[] {}; Collection<Class> argumentSources = new ArrayList<Class>(); Walker walker = engine.getWalkerByName(getAnalysisName()); engine.setArguments(getArgumentCollection()); engine.setWalker(walker); walker.setToolkit(engine); argumentSources.add(walker.getClass()); Collection<ReadFilter> filters = engine.createFilters(); for (ReadFilter filter : filters) argumentSources.add(filter.getClass()); Class[] argumentSourcesAsArray = new Class[argumentSources.size()]; return argumentSources.toArray(argumentSourcesAsArray); }
/** Collect relevant information from each variant in the supplied VCFs */ @Override public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { for (NewEvaluationContext nec : evaluationContexts.values()) { synchronized (nec) { nec.update0(tracker, ref, context); } } if (tracker != null) { String aastr = (ancestralAlignments == null) ? null : new String( ancestralAlignments .getSubsequenceAt( ref.getLocus().getContig(), ref.getLocus().getStart(), ref.getLocus().getStop()) .getBases()); // --------- track --------- sample - VariantContexts - HashMap<RodBinding<VariantContext>, HashMap<String, Collection<VariantContext>>> evalVCs = variantEvalUtils.bindVariantContexts( tracker, ref, evals, byFilterIsEnabled, true, perSampleIsEnabled, mergeEvals); HashMap<RodBinding<VariantContext>, HashMap<String, Collection<VariantContext>>> compVCs = variantEvalUtils.bindVariantContexts( tracker, ref, comps, byFilterIsEnabled, false, false, false); // for each eval track for (final RodBinding<VariantContext> evalRod : evals) { final Map<String, Collection<VariantContext>> emptyEvalMap = Collections.emptyMap(); final Map<String, Collection<VariantContext>> evalSet = evalVCs.containsKey(evalRod) ? evalVCs.get(evalRod) : emptyEvalMap; // for each sample stratifier for (final String sampleName : sampleNamesForStratification) { Collection<VariantContext> evalSetBySample = evalSet.get(sampleName); if (evalSetBySample == null) { evalSetBySample = new HashSet<VariantContext>(1); evalSetBySample.add(null); } // for each eval in the track for (VariantContext eval : evalSetBySample) { // deal with ancestral alleles if requested if (eval != null && aastr != null) { eval = new VariantContextBuilder(eval).attribute("ANCESTRALALLELE", aastr).make(); } // for each comp track for (final RodBinding<VariantContext> compRod : comps) { // no sample stratification for comps final HashMap<String, Collection<VariantContext>> compSetHash = compVCs.get(compRod); final Collection<VariantContext> compSet = (compSetHash == null || compSetHash.size() == 0) ? Collections.<VariantContext>emptyList() : compVCs.get(compRod).values().iterator().next(); // find the comp final VariantContext comp = findMatchingComp(eval, compSet); HashMap<VariantStratifier, List<String>> stateMap = new HashMap<VariantStratifier, List<String>>(); for (VariantStratifier vs : stratificationObjects) { List<String> states = vs.getRelevantStates( ref, tracker, comp, compRod.getName(), eval, evalRod.getName(), sampleName); stateMap.put(vs, states); } ArrayList<StateKey> stateKeys = new ArrayList<StateKey>(); variantEvalUtils.initializeStateKeys(stateMap, null, null, stateKeys); HashSet<StateKey> stateKeysHash = new HashSet<StateKey>(stateKeys); for (StateKey stateKey : stateKeysHash) { NewEvaluationContext nec = evaluationContexts.get(stateKey); // eval against the comp synchronized (nec) { nec.apply(tracker, ref, context, comp, eval); } // eval=null against all comps of different type that aren't bound to another eval for (VariantContext otherComp : compSet) { if (otherComp != comp && !compHasMatchingEval(otherComp, evalSetBySample)) { synchronized (nec) { nec.apply(tracker, ref, context, otherComp, null); } } } } } } } if (mergeEvals) break; // stop processing the eval tracks } } return null; }
/** Collect relevant information from each variant in the supplied VCFs */ @Override public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { // we track the processed bp and expose this for modules instead of wasting CPU power on // calculating // the same thing over and over in evals that want the processed bp synchronized (this) { nProcessedLoci += context.getSkippedBases() + (ref == null ? 0 : 1); } if (tracker != null) { String aastr = (ancestralAlignments == null) ? null : new String( ancestralAlignments .getSubsequenceAt( ref.getLocus().getContig(), ref.getLocus().getStart(), ref.getLocus().getStop()) .getBases()); // // update the dynamic stratifications // for (final VariantContext vc : tracker.getValues(evals, ref.getLocus())) { // // don't worry -- DynamicStratification only work with one eval object // for ( final DynamicStratification ds : dynamicStratifications ) { // ds.update(vc); // } // } // --------- track --------- sample - VariantContexts - HashMap<RodBinding<VariantContext>, HashMap<String, Collection<VariantContext>>> evalVCs = variantEvalUtils.bindVariantContexts( tracker, ref, evals, byFilterIsEnabled, true, perSampleIsEnabled, mergeEvals); HashMap<RodBinding<VariantContext>, HashMap<String, Collection<VariantContext>>> compVCs = variantEvalUtils.bindVariantContexts( tracker, ref, comps, byFilterIsEnabled, false, false, false); // for each eval track for (final RodBinding<VariantContext> evalRod : evals) { final Map<String, Collection<VariantContext>> emptyEvalMap = Collections.emptyMap(); final Map<String, Collection<VariantContext>> evalSet = evalVCs.containsKey(evalRod) ? evalVCs.get(evalRod) : emptyEvalMap; // for each sample stratifier for (final String sampleName : sampleNamesForStratification) { Collection<VariantContext> evalSetBySample = evalSet.get(sampleName); if (evalSetBySample == null) { evalSetBySample = new HashSet<VariantContext>(1); evalSetBySample.add(null); } // for each eval in the track for (VariantContext eval : evalSetBySample) { // deal with ancestral alleles if requested if (eval != null && aastr != null) { eval = new VariantContextBuilder(eval).attribute("ANCESTRALALLELE", aastr).make(); } // for each comp track for (final RodBinding<VariantContext> compRod : comps) { // no sample stratification for comps final HashMap<String, Collection<VariantContext>> compSetHash = compVCs.get(compRod); final Collection<VariantContext> compSet = (compSetHash == null || compSetHash.size() == 0) ? Collections.<VariantContext>emptyList() : compVCs.get(compRod).values().iterator().next(); // find the comp final VariantContext comp = findMatchingComp(eval, compSet); for (EvaluationContext nec : getEvaluationContexts( tracker, ref, eval, evalRod.getName(), comp, compRod.getName(), sampleName)) { // eval against the comp synchronized (nec) { nec.apply(tracker, ref, context, comp, eval); } // eval=null against all comps of different type that aren't bound to another eval for (VariantContext otherComp : compSet) { if (otherComp != comp && !compHasMatchingEval(otherComp, evalSetBySample)) { synchronized (nec) { nec.apply(tracker, ref, context, otherComp, null); } } } } } } } if (mergeEvals) break; // stop processing the eval tracks } } return null; }