VariantEval now uses the "standard" modules only by default. You can add other modules with the -E argument and not use all of the standard ones with -noStandard (they can be added back individually with -E).

Generalized some of the packaging code from VariantAnnotator.  Matt might want to take a look to make this nicer...?



git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3925 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
ebanks 2010-08-03 16:51:10 +00:00
parent a7ff9caf54
commit 2307bed742
11 changed files with 112 additions and 126 deletions

View File

@ -63,7 +63,7 @@ public class VariantAnnotator extends RodWalker<Integer, Integer> {
protected String[] annotationsToUse = {};
@Argument(fullName="group", shortName="G", doc="One or more classes/groups of annotations to apply to variant calls", required=false)
protected String[] annotationClassesToUse = { };
protected String[] annotationGroupsToUse = {};
@Argument(fullName="useAllAnnotations", shortName="all", doc="Use all possible annotations (not for the faint of heart)", required=false)
protected Boolean USE_ALL_ANNOTATIONS = false;
@ -131,7 +131,7 @@ public class VariantAnnotator extends RodWalker<Integer, Integer> {
if ( USE_ALL_ANNOTATIONS )
engine = new VariantAnnotatorEngine(getToolkit());
else
engine = new VariantAnnotatorEngine(getToolkit(), annotationClassesToUse, annotationsToUse);
engine = new VariantAnnotatorEngine(getToolkit(), annotationGroupsToUse, annotationsToUse);
// setup the header fields
Set<VCFHeaderLine> hInfo = new HashSet<VCFHeaderLine>();

View File

@ -60,8 +60,8 @@ public class VariantAnnotatorEngine {
public static final String dbPrefix = "comp";
private ArrayList<InfoFieldAnnotation> requestedInfoAnnotations;
private ArrayList<GenotypeAnnotation> requestedGenotypeAnnotations;
private List<InfoFieldAnnotation> requestedInfoAnnotations;
private List<GenotypeAnnotation> requestedGenotypeAnnotations;
private HashMap<String, String> dbAnnotations = new HashMap<String, String>();
@ -82,16 +82,14 @@ public class VariantAnnotatorEngine {
// use this constructor if you want all possible annotations
public VariantAnnotatorEngine(GenomeAnalysisEngine engine) {
List<Class<? extends InfoFieldAnnotation>> infoAnnotationClasses = PackageUtils.getClassesImplementingInterface(InfoFieldAnnotation.class);
requestedInfoAnnotations = getInstances(infoAnnotationClasses);
List<Class<? extends GenotypeAnnotation>> genotypeAnnotationClasses = PackageUtils.getClassesImplementingInterface(GenotypeAnnotation.class);
requestedGenotypeAnnotations = getInstances(genotypeAnnotationClasses);
requestedInfoAnnotations = PackageUtils.getInstancesOfClassesImplementingInterface(InfoFieldAnnotation.class);
requestedGenotypeAnnotations = PackageUtils.getInstancesOfClassesImplementingInterface(GenotypeAnnotation.class);
initialize(engine);
}
// use this constructor if you want to select specific annotations (and/or interfaces)
public VariantAnnotatorEngine(GenomeAnalysisEngine engine, String[] annotationClassesToUse, String[] annotationsToUse) {
public VariantAnnotatorEngine(GenomeAnalysisEngine engine, String[] annotationGroupsToUse, String[] annotationsToUse) {
// create a map for all annotation classes which implement our top-level interfaces
HashMap<String, Class> classMap = new HashMap<String, Class>();
for ( Class c : PackageUtils.getClassesImplementingInterface(InfoFieldAnnotation.class) )
@ -103,7 +101,7 @@ public class VariantAnnotatorEngine {
HashSet<Class> classes = new HashSet<Class>();
// get the classes from the provided groups (interfaces)
for ( String group : annotationClassesToUse ) {
for ( String group : annotationGroupsToUse ) {
Class interfaceClass = classMap.get(group);
if ( interfaceClass == null )
interfaceClass = classMap.get(group + "Annotation");
@ -128,31 +126,14 @@ public class VariantAnnotatorEngine {
for ( Class c : classes ) {
// note that technically an annotation can work on both the INFO and FORMAT fields
if ( InfoFieldAnnotation.class.isAssignableFrom(c) )
requestedInfoAnnotations.add((InfoFieldAnnotation)getInstance(c));
requestedInfoAnnotations.add((InfoFieldAnnotation)PackageUtils.getSimpleInstance(c));
if ( GenotypeAnnotation.class.isAssignableFrom(c) )
requestedGenotypeAnnotations.add((GenotypeAnnotation)getInstance(c));
requestedGenotypeAnnotations.add((GenotypeAnnotation)PackageUtils.getSimpleInstance(c));
}
initialize(engine);
}
private static <T> ArrayList<T> getInstances(List<Class<? extends T>> classes) {
ArrayList<T> objects = new ArrayList<T>();
for ( Class c : classes )
objects.add((T)getInstance(c));
return objects;
}
private static <T> T getInstance(Class<T> c) {
try {
return c.newInstance();
} catch (InstantiationException e) {
throw new StingException(String.format("Cannot instantiate annotation class '%s': must be concrete class", c.getSimpleName()));
} catch (IllegalAccessException e) {
throw new StingException(String.format("Cannot instantiate annotation class '%s': must have no-arg constructor", c.getSimpleName()));
}
}
private void initialize(GenomeAnalysisEngine engine) {
// check to see whether comp rods were included
@ -181,15 +162,8 @@ public class VariantAnnotatorEngine {
return descriptions;
}
/**
* A slightly simplified interface for when you don't have any reads, so the stratifiedContexts aren't necessary, and
* you only permit a single return value
*
* @param tracker
* @param ref
* @param vc
* @return
*/
// A slightly simplified interface for when you don't have any reads, so the stratifiedContexts aren't necessary, and
// you only permit a single return value
public VariantContext annotateContext(RefMetaDataTracker tracker, ReferenceContext ref, VariantContext vc) {
Collection<VariantContext> results = this.annotateContext(tracker, ref, EMPTY_STRATIFIED_ALIGNMENT_CONTEXT, vc);
@ -278,13 +252,7 @@ public class VariantAnnotatorEngine {
return returnValue;
}
/**
* Finish processing data from GenomicAnnotation.
*
* @param infoAnnotationOutputsList
* @param annotationsForCurrentLocusFromAllAnnotatorInputTables
* @return
*/
// Finish processing data from GenomicAnnotation.
private List<Map<String, Object>> processGenomicAnnotation( List<Map<String, Object>> infoAnnotationOutputsList, Map<String, Object> annotationsForCurrentLocusFromAllAnnotatorInputTables)
{
@ -330,15 +298,8 @@ public class VariantAnnotatorEngine {
return infoAnnotationOutputsList;
}
/**
* Performs a join between the an info field record represented by outputRecordInfoField and the infoAnnotationOutputsList.
*
* @param infoAnnotationOutputsList
* @param outputRecordInfoField
* @param joinTable
* @return
*/
private List<Map<String, Object>> performJoin( List<Map<String, Object>> infoAnnotationOutputsList, Map<String, Object> outputRecordInfoField, JoinTable joinTable)
// Performs a join between the an info field record represented by outputRecordInfoField and the infoAnnotationOutputsList.
private List<Map<String, Object>> performJoin( List<Map<String, Object>> infoAnnotationOutputsList, Map<String, Object> outputRecordInfoField, JoinTable joinTable)
{
//System.err.println("Looking at: " + joinTable.getLocalBindingName()+ "- join to " + joinTable.getExternalBindingName() + "." + joinTable.getExternalColumnName() );
//for the current joinTable, for each output line, find the externalJoinColumnValue and see if it matches the joinColumnValue of any record(s) in this joinTable.
@ -413,16 +374,10 @@ public class VariantAnnotatorEngine {
}
/**
* Implements not-oneToMany mode, where the output lines have a one-to-one relationship
* with the input variants, and all multiple-match records are collapsed into the single info field.
* The collapsing is done by appending an _i to each key name (where 'i' is a record counter), as well
* as a special bindingName.numMatchingRecords=n key-value pair which specifies the upper limit of the counter.
*
* @param infoAnnotationOutputsList
* @param matchingRecords
* @param bindingName
*/
// Implements not-oneToMany mode, where the output lines have a one-to-one relationship
// with the input variants, and all multiple-match records are collapsed into the single info field.
// The collapsing is done by appending an _i to each key name (where 'i' is a record counter), as well
// as a special bindingName.numMatchingRecords=n key-value pair which specifies the upper limit of the counter.
private void addToExistingAnnotationOutputs(
final List<Map<String, Object>> infoAnnotationOutputsList,
final List<Map<String, String>> matchingRecords,
@ -470,19 +425,12 @@ public class VariantAnnotatorEngine {
}
}
/**
* Implements oneToMany mode. Takes the current infoAnnotationOutputsList
* (where each element represents a line in the output VCF file), and
* generates a new infoAnnotationOutputsList which contains one copy of the current
* infoAnnotationOutputs for each record matchingRecords.
* The returned list will have size:
* infoAnnotationOutputsList.size() * matchingRecords.size()
*
* @param infoAnnotationOutputsList
* @param matchingRecords
* @param bindingName
* @return
*/
// Implements oneToMany mode. Takes the current infoAnnotationOutputsList
// (where each element represents a line in the output VCF file), and
// generates a new infoAnnotationOutputsList which contains one copy of the current
// infoAnnotationOutputs for each record matchingRecords.
// The returned list will have size:
// infoAnnotationOutputsList.size() * matchingRecords.size()
private List<Map<String, Object>> explodeInfoAnnotationOutputsList(
final List<Map<String, Object>> infoAnnotationOutputsList,
final List<Map<String, String>> matchingRecords,
@ -515,8 +463,8 @@ public class VariantAnnotatorEngine {
* Records statistics for the explodeInfoAnnotationOutputsList(..) calculation.
* @param bindingName The table from which annotations were gotten
* @param numNewVCFRecordsAnnotatedWithBindingNameData The number of new output VCF records created with annotations from this table
* @param infoAnnotationOutputsList
* @parma matchingRecordsSize
* @param infoAnnotationOutputsList output list
* @param matchingRecordsSize matching records size
*/
private void recordStats( final String bindingName, int numNewVCFRecordsAnnotatedWithBindingNameData, final List<Map<String, Object>> infoAnnotationOutputsList, int matchingRecordsSize ) {
@ -549,13 +497,7 @@ public class VariantAnnotatorEngine {
}
/**
* Applies the -S arg to the results
*
* @param infoAnnotationOutputsList
* @return The new newInfoAnnotationOutputList with -S arg applied.
*/
// Applies the -S arg to the results
private List<Map<String, Object>> applySelectArg( final List<Map<String, Object>> infoAnnotationOutputsList )
{
final List<Map<String, Object>> newInfoAnnotationOutputList = new LinkedList<Map<String, Object>>();
@ -614,7 +556,7 @@ public class VariantAnnotatorEngine {
*
* See class-level comments for more details.
*
* @param oneToMany
* @param oneToMany true if we should break out from one to many
*/
public void setOneToMany(boolean oneToMany) {
this.oneToMany = oneToMany;
@ -694,9 +636,7 @@ public class VariantAnnotatorEngine {
}
/**
* Returns a map containing stats on how many output vcf records were annotated from each database
*/
//Returns a map containing stats on how many output vcf records were annotated from each database
public Map<String, Integer> getInputTableHitCounter() {
return Collections.unmodifiableMap(inputTableHitCounter);
}

View File

@ -18,7 +18,7 @@ import org.broadinstitute.sting.playground.utils.report.tags.DataPoint;
* the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
*/
@Analysis(name = "Comp Overlap", description = "the overlap between eval and comp sites")
public class CompOverlap extends VariantEvaluator {
public class CompOverlap extends VariantEvaluator implements StandardEval {
@DataPoint(name = "eval sites", description = "number of eval SNP sites")
long nEvalSNPs = 0;

View File

@ -11,7 +11,7 @@ import org.broadinstitute.sting.utils.StingException;
@Analysis(name = "Count Variants", description = "Counts different classes of variants in the sample")
public class CountVariants extends VariantEvaluator {
public class CountVariants extends VariantEvaluator implements StandardEval {
// the following fields are in output order:

View File

@ -37,7 +37,7 @@ import java.util.*;
*/
@Analysis(name = "Genotype Concordance", description = "Determine the genotype concordance between the genotypes in difference tracks")
public class GenotypeConcordance extends VariantEvaluator {
public class GenotypeConcordance extends VariantEvaluator implements StandardEval {
private static final boolean PRINT_INTERESTING_SITES = true;
protected final static Logger logger = Logger.getLogger(GenotypeConcordance.class);

View File

@ -8,7 +8,6 @@ import org.broadinstitute.sting.playground.utils.report.tags.Analysis;
import org.broadinstitute.sting.playground.utils.report.tags.DataPoint;
import org.broadinstitute.sting.playground.utils.report.utils.TableType;
import org.broadinstitute.sting.utils.StingException;
import org.broad.tribble.vcf.VCFGenotypeRecord;
import java.util.ArrayList;
@ -43,7 +42,7 @@ import java.util.ArrayList;
*/
@Analysis(name = "Quality Metrics by allele count", description = "Shows various stats binned by allele count")
public class SimpleMetricsByAC extends VariantEvaluator {
public class SimpleMetricsByAC extends VariantEvaluator implements StandardEval {
// a mapping from quality score histogram bin to Ti/Tv ratio
@DataPoint(name="TiTv by AC", description = "TiTv by allele count")
MetricsByAc metrics = null;

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 2010.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.broadinstitute.sting.gatk.walkers.varianteval;
public interface StandardEval {}

View File

@ -8,7 +8,7 @@ import org.broadinstitute.sting.playground.utils.report.tags.Analysis;
import org.broadinstitute.sting.playground.utils.report.tags.DataPoint;
@Analysis(name = "Ti/Tv Variant Evaluator", description = "Ti/Tv Variant Evaluator")
public class TiTvVariantEvaluator extends VariantEvaluator {
public class TiTvVariantEvaluator extends VariantEvaluator implements StandardEval {
@DataPoint(name = "ti_count", description = "number of transition loci")
long nTi = 0;

View File

@ -136,11 +136,11 @@ public class VariantEvalWalker extends RodWalker<Integer, Integer> {
//
// Arguments for choosing which modules to run
//
@Argument(fullName="evalModule", shortName="E", doc="One or more specific eval modules to apply to the eval track(s)", required=false)
@Argument(fullName="evalModule", shortName="E", doc="One or more specific eval modules to apply to the eval track(s) (in addition to the standard modules, unless -noStandard is specified)", required=false)
protected String[] modulesToUse = {};
@Argument(fullName="useNoModules", shortName="none", doc="Use no eval modules", required=false)
protected Boolean USE_NO_MODULES = false;
@Argument(fullName="doNotUseAllStandardModules", shortName="noStandard", doc="Do not use the standard modules by default (instead, only those that are specified with the -E option)")
protected Boolean NO_STANDARD = false;
@Argument(fullName="list", shortName="ls", doc="List the available eval modules and exit")
protected Boolean LIST = false;
@ -272,7 +272,7 @@ public class VariantEvalWalker extends RodWalker<Integer, Integer> {
}
// Dynamically determined variantEvaluation classes
private List<Class<? extends VariantEvaluator>> evaluationClasses = null;
private Set<Class<? extends VariantEvaluator>> evaluationClasses = null;
/** output writer for interesting sites */
private VCFWriter writer = null;
@ -392,21 +392,23 @@ public class VariantEvalWalker extends RodWalker<Integer, Integer> {
for ( Class<? extends VariantEvaluator> c : PackageUtils.getClassesImplementingInterface(VariantEvaluator.class) )
classMap.put(c.getSimpleName(), c);
if ( USE_NO_MODULES ) {
evaluationClasses = new ArrayList<Class<? extends VariantEvaluator>>(0);
} else if ( modulesToUse.length == 0 ) {
evaluationClasses = new ArrayList<Class<? extends VariantEvaluator>>(classMap.values());
} else {
// get the specific classes provided
evaluationClasses = new ArrayList<Class<? extends VariantEvaluator>>(modulesToUse.length);
for ( String module : modulesToUse ) {
Class<? extends VariantEvaluator> moduleClass = classMap.get(module);
if ( moduleClass == null )
throw new StingException("Class " + module + " is not found; please check that you have specified the class name correctly");
evaluationClasses.add(moduleClass);
evaluationClasses = new HashSet<Class<? extends VariantEvaluator>>();
// by default, use standard eval modules
if ( !NO_STANDARD ) {
for ( Class<? extends StandardEval> myClass : PackageUtils.getClassesImplementingInterface(StandardEval.class) ) {
if ( classMap.containsKey(myClass.getSimpleName()) )
evaluationClasses.add(classMap.get(myClass.getSimpleName()));
}
}
// get the specific classes provided
for ( String module : modulesToUse ) {
if ( !classMap.containsKey(module) )
throw new StingException("Class " + module + " is not found; please check that you have specified the class name correctly");
evaluationClasses.add(classMap.get(module));
}
for ( VariantEvaluator e : instantiateEvalationsSet() ) {
// for collecting purposes
variantEvaluationNames.add(e.getName());

View File

@ -28,10 +28,9 @@ package org.broadinstitute.sting.utils.classloader;
import org.reflections.Reflections;
import org.reflections.scanners.ResourcesScanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.ManifestAwareClasspathHelper;
import org.slf4j.LoggerFactory;
import org.broadinstitute.sting.utils.StingException;
import java.net.URL;
import java.util.Set;
@ -81,6 +80,24 @@ public class PackageUtils {
return concreteTypes;
}
public static <T> List<T> getInstancesOfClassesImplementingInterface(Class<T> iface) {
List<Class<? extends T>> classes = PackageUtils.getClassesImplementingInterface(iface);
List<T> instances = new ArrayList<T>();
for ( Class<? extends T> c : classes )
instances.add(getSimpleInstance(c));
return instances;
}
public static <T> T getSimpleInstance(Class<T> c) {
try {
return c.newInstance();
} catch (InstantiationException e) {
throw new StingException(String.format("Cannot instantiate class '%s': must be concrete class", c.getSimpleName()));
} catch (IllegalAccessException e) {
throw new StingException(String.format("Cannot instantiate class '%s': must have no-arg constructor", c.getSimpleName()));
}
}
/**
* Return the interface classes that extend the specified interface.
*

View File

@ -29,7 +29,7 @@ public class
String extraArgs = "-L 1:1-10,000,000";
for (String tests : testsEnumerations) {
WalkerTestSpec spec = new WalkerTestSpec(withSelect(tests, "DP < 50", "DP50") + " " + extraArgs + " -o %s",
1, Arrays.asList("119601d7e9e67a1053663b2e546250ed"));
1, Arrays.asList("a12bd969ca3bc676752e078d205c730a"));
executeTest("testSelect1", spec);
}
}
@ -38,7 +38,7 @@ public class
public void testSelect2() {
String extraArgs = "-L 1:1-10,000,000";
WalkerTestSpec spec = new WalkerTestSpec( withSelect(withSelect(root, "DP < 50", "DP50"), "set==\"Intersection\"", "intersection") + " " + extraArgs + " -o %s",
1, Arrays.asList("06d495ab8169a2570eebdc54ecdffe10"));
1, Arrays.asList("2c1a99b225b55dcf605410ba5e6be789"));
executeTest("testSelect2", spec);
}
@ -46,7 +46,7 @@ public class
public void testVEGenotypeConcordance() {
String vcfFiles[] = {"GenotypeConcordanceEval.vcf", "GenotypeConcordanceEval.vcf.gz"};
for (String vcfFile : vcfFiles) {
WalkerTestSpec spec = new WalkerTestSpec(cmdRoot + " -B eval,VCF," + validationDataLocation + vcfFile + " -B comp,VCF," + validationDataLocation + "GenotypeConcordanceComp.vcf -E GenotypeConcordance -reportType CSV -o %s",
WalkerTestSpec spec = new WalkerTestSpec(cmdRoot + " -B eval,VCF," + validationDataLocation + vcfFile + " -B comp,VCF," + validationDataLocation + "GenotypeConcordanceComp.vcf -noStandard -E GenotypeConcordance -reportType CSV -o %s",
1,
Arrays.asList("15d1075d384da2bb7445f7493f2b6a07"));
executeTest("testVEGenotypeConcordance" + vcfFile, spec);
@ -57,8 +57,8 @@ public class
@Test
public void testVESimple() {
HashMap<String, String> expectations = new HashMap<String, String>();
expectations.put("-L 1:1-10,000,000", "629b8b124306435ff56b66357354dfbc");
expectations.put("-L 1:1-10,000,000 -family NA19238+NA19239=NA19240 -MVQ 0", "f51c299d500b347d098c7ab25f54a436");
expectations.put("-L 1:1-10,000,000", "a48e4ca3a019bf46eb3a178a6a80822f");
expectations.put("-L 1:1-10,000,000 -family NA19238+NA19239=NA19240 -MVQ 0 -E MendelianViolationEvaluator", "bc35dfefce72899d4c673bfc37c9a7f3");
for ( Map.Entry<String, String> entry : expectations.entrySet() ) {
String extraArgs = entry.getKey();
@ -75,15 +75,15 @@ public class
@Test
public void testVEComplex() {
HashMap<String, String> expectations = new HashMap<String, String>();
String extraArgs1 = "-L " + validationDataLocation + "chr1_b36_pilot3.interval_list -family NA19238+NA19239=NA19240 -MVQ 30" +
String extraArgs1 = "-L " + validationDataLocation + "chr1_b36_pilot3.interval_list -family NA19238+NA19239=NA19240 -MVQ 30 -E MendelianViolationEvaluator" +
" -B dbsnp_130,dbSNP," + GATKDataLocation + "dbsnp_130_b36.rod" +
" -B comp_hapmap,VCF," + validationDataLocation + "CEU_hapmap_nogt_23.vcf";
String matchingMD5 = "d01725ce4e46c8fea0855a923c1598fd";
String matchingMD5 = "38c8906cc364d04ba39a437d93d752d3";
expectations.put("", matchingMD5);
expectations.put(" -known comp_hapmap -known dbsnp", matchingMD5);
expectations.put(" -known comp_hapmap", "a50be9240f6c90503fb6333d8a78b974");
expectations.put(" -known comp_hapmap", "b839c8e9f26b01281899f86362b5323c");
for (String tests : testsEnumerations) {
for (Map.Entry<String, String> entry : expectations.entrySet()) {
String extraArgs2 = entry.getKey();
@ -103,7 +103,7 @@ public class
"-R " + oneKGLocation + "reference/human_b36_both.fasta " +
"-L 21 " +
"-D " + GATKDataLocation + "dbsnp_129_b36.rod " +
"-E CountFunctionalClasses " +
"-E CountFunctionalClasses -noStandard " +
"-B eval,VCF," + validationDataLocation + "test.filtered.maf_annotated.vcf " +
"-o %s";
String md5 = "d41d8cd98f00b204e9800998ecf8427e";
@ -114,11 +114,11 @@ public class
@Test
public void testVEWriteVCF() {
String extraArgs = "-L 1:1-10,000,000 -family NA19238+NA19239=NA19240 -MVQ 30";
String extraArgs = "-L 1:1-10,000,000 -family NA19238+NA19239=NA19240 -MVQ 30 -E MendelianViolationEvaluator";
for (String tests : testsEnumerations) {
WalkerTestSpec spec = new WalkerTestSpec(tests + " " + extraArgs + " -o %s -outputVCF %s",
2,
Arrays.asList("483f821ce96f4cf571e9bba356c9f325", "989bc30dea6c8a4cf771cd1b9fdab488"));
Arrays.asList("8059c6b53ba15598bf89d65c79742566", "989bc30dea6c8a4cf771cd1b9fdab488"));
executeTest("testVEWriteVCF", spec);
}
}