org.broadinstitute.hellbender.tools.walkers.mutect.M2ArgumentCollection Maven / Gradle / Ivy
package org.broadinstitute.hellbender.tools.walkers.mutect;
import htsjdk.variant.variantcontext.VariantContext;
import org.apache.commons.lang3.ArrayUtils;
import org.broadinstitute.barclay.argparser.Advanced;
import org.broadinstitute.barclay.argparser.Argument;
import org.broadinstitute.barclay.argparser.ArgumentCollection;
import org.broadinstitute.barclay.argparser.DeprecatedFeature;
import org.broadinstitute.hellbender.cmdline.ReadFilterArgumentDefinitions;
import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;
import org.broadinstitute.hellbender.engine.FeatureInput;
import org.broadinstitute.hellbender.tools.walkers.haplotypecaller.FlowBasedAlignmentArgumentCollection;
import org.broadinstitute.hellbender.tools.walkers.haplotypecaller.*;
import org.broadinstitute.hellbender.tools.walkers.mutect.filtering.FilterMutectCalls;
import org.broadinstitute.hellbender.tools.walkers.readorientation.CollectF1R2CountsArgumentCollection;
import org.broadinstitute.hellbender.utils.MathUtils;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class M2ArgumentCollection extends AssemblyBasedCallerArgumentCollection implements Serializable {
private static final long serialVersionUID = 9341L;
public static final String TUMOR_SAMPLE_LONG_NAME = "tumor-sample";
public static final String TUMOR_SAMPLE_SHORT_NAME = "tumor";
public static final String NORMAL_SAMPLE_LONG_NAME = "normal-sample";
public static final String NORMAL_SAMPLE_SHORT_NAME = "normal";
public static final String PANEL_OF_NORMALS_LONG_NAME = "panel-of-normals";
public static final String PANEL_OF_NORMALS_SHORT_NAME = "pon";
public static final String GENOTYPE_PON_SITES_LONG_NAME = "genotype-pon-sites";
public static final String GENOTYPE_GERMLINE_SITES_LONG_NAME = "genotype-germline-sites";
public static final String GENOTYPE_GERMLINE_SITES_FRACTION_LONG_NAME = "genotype-germline-sites-fraction";
public static final String GERMLINE_RESOURCE_LONG_NAME = "germline-resource";
public static final String DEFAULT_AF_LONG_NAME = "af-of-alleles-not-in-resource";
public static final String DEFAULT_AF_SHORT_NAME = "default-af";
public static final String EMISSION_LOD_LONG_NAME = "tumor-lod-to-emit";
public static final String EMISSION_LOG_SHORT_NAME = "emit-lod";
public static final String INITIAL_TUMOR_LOG_10_ODDS_LONG_NAME = "initial-tumor-lod";
public static final String INITIAL_TUMOR_LOG_10_ODDS_SHORT_NAME = "init-lod";
public static final String MAX_POPULATION_AF_LONG_NAME = "max-population-af";
public static final String MAX_POPULATION_AF_SHORT_NAME = "max-af";
public static final String DOWNSAMPLING_STRIDE_LONG_NAME = "downsampling-stride";
public static final String DOWNSAMPLING_STRIDE_SHORT_NAME = "stride";
public static final String MAX_SUSPICIOUS_READS_PER_ALIGNMENT_START_LONG_NAME = "max-suspicious-reads-per-alignment-start";
public static final String NORMAL_LOG_10_ODDS_LONG_NAME = "normal-lod";
public static final String IGNORE_ITR_ARTIFACTS_LONG_NAME = "ignore-itr-artifacts";
public static final String MITOCHONDRIA_MODE_LONG_NAME = "mitochondria-mode";
public static final String MICROBIAL_MODE_LONG_NAME = "microbial-mode";
public static final String CALLABLE_DEPTH_LONG_NAME = "callable-depth";
public static final String PCR_SNV_QUAL_LONG_NAME = "pcr-snv-qual";
public static final String PCR_INDEL_QUAL_LONG_NAME = "pcr-indel-qual";
public static final String MULTIPLE_SUBSTITUTION_BASE_QUAL_CORRECTION = "base-qual-correction-factor";
public static final String F1R2_TAR_GZ_NAME = "f1r2-tar-gz";
public static final double DEFAULT_AF_FOR_TUMOR_ONLY_CALLING = 5e-8;
public static final double DEFAULT_AF_FOR_TUMOR_NORMAL_CALLING = 1e-6;
public static final double DEFAULT_AF_FOR_MITO_CALLING = 4e-3;
public static final double DEFAULT_EMISSION_LOG_10_ODDS = 3.0;
public static final double DEFAULT_MITO_EMISSION_LOD = 0;
public static final double DEFAULT_INITIAL_LOG_10_ODDS = 2.0;
public static final double DEFAULT_NORMAL_LOG_10_ODDS = 2.2;
public static final double DEFAULT_MITO_INITIAL_LOG_10_ODDS = 0;
public static final double DEFAULT_GVCF_LOG_10_ODDS = Double.NEGATIVE_INFINITY;
public static final int DEFAULT_CALLABLE_DEPTH = 10;
public static final double DEFAULT_MITO_PRUNING_LOG_ODDS_THRESHOLD = MathUtils.log10ToLog(-4);
public static final String INDEPENDENT_MATES_LONG_NAME = "independent-mates";
public static final String MINIMUM_ALLELE_FRACTION_LONG_NAME = "minimum-allele-fraction";
public static final String MINIMUM_ALLELE_FRACTION_SHORT_NAME = "min-AF";
public static final String LOD_BAND_LONG_NAME = "gvcf-lod-band";
public static final String LOD_BAND_SHORT_NAME = "LODB";
public static final String FLOW_M2_MODE_LONG_NAME = "flow-mode";
/*
Permutect parameters
*/
public static final String PERMUTECT_TRAINING_NON_ARTIFACT_RATIO = "permutect-non-artifact-ratio";
public static final String PERMUTECT_REF_DOWNSAMPLE_LONG_NAME = "permutect-ref-downsample";
public static final String PERMUTECT_ALT_DOWNSAMPLE_LONG_NAME = "permutect-alt-downsample";
public static final String PERMUTECT_TRAINING_DATASET_LONG_NAME = "permutect-training-dataset";
public static final String PERMUTECT_TEST_DATASET_LONG_NAME = "permutect-test-dataset";
public static final String PERMUTECT_TRAINING_TRUTH_LONG_NAME = "permutect-training-truth";
public static final String PERMUTECT_TEST_TRUTH_LONG_NAME = "permutect-test-truth";
public static final String PERMUTECT_DATASET_MODE_LONG_NAME = "permutect-dataset-mode";
public static final int DEFAULT_PERMUTECT_REF_DOWNSAMPLE = 10;
public static final int DEFAULT_PERMUTECT_ALT_DOWNSAMPLE = 20;
public static final int DEFAULT_PERMUTECT_NON_ARTIFACT_RATIO = 1;
@Override
protected int getDefaultMaxMnpDistance() { return 1; }
@Override
protected ReadThreadingAssemblerArgumentCollection getReadThreadingAssemblerArgumentCollection(){
return new MutectReadThreadingAssemblerArgumentCollection();
}
@ArgumentCollection
public CollectF1R2CountsArgumentCollection f1r2Args = new CollectF1R2CountsArgumentCollection();
@ArgumentCollection
public FlowBasedAlignmentArgumentCollection fbargs = new FlowBasedAlignmentArgumentCollection();
@Argument(fullName = F1R2_TAR_GZ_NAME, doc = "If specified, collect F1R2 counts and output files into this tar.gz file", optional = true)
public File f1r2TarGz;
// As of GATK 4.1, any sample not specified as the normal is considered a tumor sample
@DeprecatedFeature
@Argument(fullName = TUMOR_SAMPLE_LONG_NAME, shortName = TUMOR_SAMPLE_SHORT_NAME, doc = "BAM sample name of tumor. May be URL-encoded as output by GetSampleName with -encode argument.", optional = true)
protected String tumorSample = null;
@Argument(fullName = NORMAL_SAMPLE_LONG_NAME, shortName = NORMAL_SAMPLE_SHORT_NAME, doc = "BAM sample name of normal(s), if any. May be URL-encoded as output by GetSampleName with -encode argument.", optional = true)
protected List normalSamples = new ArrayList<>();
/***************************************/
// Reference Metadata inputs
/***************************************/
/**
* A panel of normals can be a useful (optional) input to help filter out commonly seen sequencing noise that may appear as low allele-fraction somatic variants.
*/
@Argument(fullName= PANEL_OF_NORMALS_LONG_NAME, shortName = PANEL_OF_NORMALS_SHORT_NAME, doc="VCF file of sites observed in normal.", optional = true)
public FeatureInput pon;
/**
* Usually we exclude sites in the panel of normals from active region determination, which saves time. Setting this to true
* causes Mutect to produce a variant call at these sites. This call will still be filtered, but it shows up in the vcf.
*/
@Argument(fullName= GENOTYPE_PON_SITES_LONG_NAME, doc="Call sites in the PoN even though they will ultimately be filtered.", optional = true)
public boolean genotypePonSites = false;
/**
* Usually we exclude germline sites from active region determination to save runtime. Setting this to true
* causes Mutect to produce a variant call at these sites. This call will still be filtered, but it shows up in the vcf.
*/
@Argument(fullName= GENOTYPE_GERMLINE_SITES_LONG_NAME, doc="Call all apparent germline site even though they will ultimately be filtered.", optional = true)
public boolean genotypeGermlineSites = false;
/**
* For the purposes of learning some parameters in Permutect it may be useful to genotype *some* germline variants
* and emit them as Permutect tensors. When --genotypeGermlineSites is true, etting this parameter to a value less
* than the default of 1.0 causes only some germline sites to be genotyped. When --genotypeGermlineSites is false
* this argument has no effect and no germline sites are genotyped.
*/
@Argument(fullName= GENOTYPE_GERMLINE_SITES_FRACTION_LONG_NAME, doc="Fraction of germline sites to be genotyped randomly.", optional = true)
public double genotypeGermlineSitesFraction = 1.0;
/**
* A resource, such as gnomAD, containing population allele frequencies of common and rare variants.
*/
@Argument(fullName= GERMLINE_RESOURCE_LONG_NAME, doc="Population vcf of germline sequencing containing allele fractions.", optional = true)
public FeatureInput germlineResource;
/**
* Population allele fraction assigned to alleles not found in germline resource.
*/
@Argument(fullName= DEFAULT_AF_LONG_NAME, shortName = DEFAULT_AF_SHORT_NAME,
doc="Population allele fraction assigned to alleles not found in germline resource. Please see docs/mutect/mutect2.pdf for" +
"a derivation of the default value.", optional = true)
private double afOfAllelesNotInGermlineResource = -1;
public double getDefaultAlleleFrequency() {
return afOfAllelesNotInGermlineResource >= 0 ? afOfAllelesNotInGermlineResource :
(normalSamples.isEmpty() ? DEFAULT_AF_FOR_TUMOR_ONLY_CALLING : DEFAULT_AF_FOR_TUMOR_NORMAL_CALLING);
}
/**
* Mitochondria mode changes default values for --tumor-lod-to-emit and --initial-tumor-lod to 0 to increase sensitivity.
* --tumor-sample is also not explicitly required in mitochondria mode since a single sample bam is expected as input.
* Mitochondria mode is also required in FilterMutectCalls if used here.
*/
@Argument(fullName = MITOCHONDRIA_MODE_LONG_NAME, optional = true, doc="Mitochondria mode sets emission and initial LODs to 0.")
public Boolean mitochondria = false;
/**
* List of arguments to be set when a user specifies mitochondria mode. Each argument will be displayed in the help message.
*/
public String[] getMitochondriaModeNameValuePairs() {
return new String[]{
DEFAULT_AF_LONG_NAME, String.valueOf(DEFAULT_AF_FOR_MITO_CALLING),
EMISSION_LOD_LONG_NAME, String.valueOf(DEFAULT_MITO_EMISSION_LOD),
INITIAL_TUMOR_LOG_10_ODDS_LONG_NAME, String.valueOf(DEFAULT_MITO_INITIAL_LOG_10_ODDS),
ReadThreadingAssemblerArgumentCollection.RECOVER_ALL_DANGLING_BRANCHES_LONG_NAME, "true",
ReadThreadingAssemblerArgumentCollection.PRUNING_LOD_THRESHOLD_LONG_NAME, String.valueOf(DEFAULT_MITO_PRUNING_LOG_ODDS_THRESHOLD),
StandardArgumentDefinitions.ANNOTATION_LONG_NAME, "OriginalAlignment"
};
}
/**
* Downsample ref reads for Permutect data
*/
@Argument(fullName = PERMUTECT_REF_DOWNSAMPLE_LONG_NAME, optional = true, doc="Downsample ref reads to this count when generating a Permutect dataset.")
public int maxPermutectRefCount = DEFAULT_PERMUTECT_REF_DOWNSAMPLE;
/**
* Downsample alt reads for Permutect data
*/
@Argument(fullName = PERMUTECT_ALT_DOWNSAMPLE_LONG_NAME, optional = true, doc="Downsample alt reads to this count for Permutect training datasets.")
public int maxPermutectAltCount = DEFAULT_PERMUTECT_ALT_DOWNSAMPLE;
/**
* Number of non-artifact data per artifact datum in Permutect training
*/
@Argument(fullName = PERMUTECT_TRAINING_NON_ARTIFACT_RATIO, optional = true, doc="Number of non-artifact data per artifact datum in Permutect training.")
public int permutectNonArtifactRatio = DEFAULT_PERMUTECT_NON_ARTIFACT_RATIO;
/**
* Destination for Permutect data collection (test data)
*/
@Argument(fullName = PERMUTECT_TEST_DATASET_LONG_NAME, optional = true, doc="Destination for Permutect test data collection")
public File permutectTestDataset;
/**
* Destination for Permutect data collection (training data)
*/
@Argument(fullName = PERMUTECT_TRAINING_DATASET_LONG_NAME, optional = true, doc="Destination for Permutect training data collection")
public File permutectTrainingDataset;
@Advanced
@Argument(fullName = PERMUTECT_DATASET_MODE_LONG_NAME, optional = true, doc="The type of Permutect dataset. Depends on sequencing technology.")
public PermutectDatasetMode permutectDatasetMode = PermutectDatasetMode.ILLUMINA;
public enum PermutectDatasetMode {
ILLUMINA(9 + FeaturizedReadSets.NUM_RANGED_FEATURES),
ULTIMA(9 + FeaturizedReadSets.NUM_RANGED_FEATURES);
final private int numReadFeatures;
PermutectDatasetMode(final int numReadFeatures) {
this.numReadFeatures = numReadFeatures;
}
public int getNumReadFeatures() {
return numReadFeatures;
}
}
/**
* VCF of known calls for a sample used for generating a Permutect training dataset. Unfiltered variants (PASS or empty FILTER field)
* contained in this VCF are considered good; other variants (i.e. filtered in this VCF or absent from it) are considered errors.
* If this VCF is not given the dataset is generated with an weak-labelling strategy based on allele fractions.
*/
@Argument(fullName= PERMUTECT_TRAINING_TRUTH_LONG_NAME, doc="VCF file of known variants for labeling Permutect training data", optional = true)
public FeatureInput permutectTrainingTruth;
/**
* Like the above, but used when generating test data for making Permutect calls. In this case, the test data is
* labeled with truth from the VCF. Permutect makes filtered calls as usual and uses the labels to analyze the quality of its results.
*/
@Argument(fullName= PERMUTECT_TEST_TRUTH_LONG_NAME, doc="VCF file of known variants for labeling Permutect test data", optional = true)
public FeatureInput permutectTestTruth;
/**
* Only variants with tumor LODs exceeding this threshold will be written to the VCF, regardless of filter status.
* Set to less than or equal to tumor_lod. Increase argument value to reduce false positives in the callset.
* Default setting of 3 is permissive and will emit some amount of negative training data that
* {@link FilterMutectCalls} should then filter.
*/
@Argument(fullName = EMISSION_LOD_LONG_NAME, shortName = EMISSION_LOG_SHORT_NAME, optional = true, doc = "Log 10 odds threshold to emit variant to VCF.")
private double emissionLog10Odds = DEFAULT_EMISSION_LOG_10_ODDS;
public double getEmissionLogOdds() {
if (emitReferenceConfidence != ReferenceConfidenceMode.NONE) {
return MathUtils.log10ToLog(DEFAULT_GVCF_LOG_10_ODDS);
}
return MathUtils.log10ToLog(emissionLog10Odds);
}
/**
* Only variants with estimated tumor LODs exceeding this threshold will be considered active.
*/
@Argument(fullName = INITIAL_TUMOR_LOG_10_ODDS_LONG_NAME, shortName = INITIAL_TUMOR_LOG_10_ODDS_SHORT_NAME, optional = true, doc = "Log 10 odds threshold to consider pileup active.")
private double initialLog10Odds = DEFAULT_INITIAL_LOG_10_ODDS;
public double getInitialLogOdds() {
if (emitReferenceConfidence != ReferenceConfidenceMode.NONE) {
return MathUtils.log10ToLog(DEFAULT_GVCF_LOG_10_ODDS);
}
return MathUtils.log10ToLog(initialLog10Odds);
}
@Argument(fullName = PCR_SNV_QUAL_LONG_NAME, optional = true, doc = "Phred-scaled PCR SNV qual for overlapping fragments")
public int pcrSnvQual = 40;
@Argument(fullName = PCR_INDEL_QUAL_LONG_NAME, optional = true, doc = "Phred-scaled PCR indel qual for overlapping fragments")
public int pcrIndelQual = 40;
/**
* A scale factor to modify the base qualities reported by the sequencer and used in the Mutect2 substitution error model.
* Set to zero to turn off the error model changes included in GATK 4.1.9.0.
* Our pileup likelihoods models assume that the base quality (qual) corresponds to the probability that a ref base is misread
* as the *particular* alt base, whereas the qual actually means the probability of *any* substitution error.
* Since there are three possible substitutions for each ref base we must divide the error probability by three
* which corresponds to adding 10*log10(3) = 4.77 ~ 5 to the qual.
*/
@Advanced
@Argument(fullName = MULTIPLE_SUBSTITUTION_BASE_QUAL_CORRECTION, optional = true, doc = "Set to zero to turn off the error model changes included in GATK 4.1.9.0.")
public int activeRegionMultipleSubstitutionBaseQualCorrection = (int)Math.round(10 * Math.log10(3));
/**
* In tumor-only mode, we discard variants with population allele frequencies greater than this threshold.
*/
@Argument(fullName = MAX_POPULATION_AF_LONG_NAME, shortName = MAX_POPULATION_AF_SHORT_NAME, optional = true, doc = "Maximum population allele frequency in tumor-only mode.")
public double maxPopulationAlleleFrequency = 0.01;
/**
* Downsample a pool of reads starting within a range of one or more bases.
*/
@Argument(fullName = DOWNSAMPLING_STRIDE_LONG_NAME, shortName = DOWNSAMPLING_STRIDE_SHORT_NAME, optional = true, doc = "Downsample a pool of reads starting within a range of one or more bases.")
public int downsamplingStride = 1;
@Argument(fullName = CALLABLE_DEPTH_LONG_NAME, optional = true, doc = "Minimum depth to be considered callable for Mutect stats. Does not affect genotyping.")
public int callableDepth = DEFAULT_CALLABLE_DEPTH;
/**
* Maximum number of suspicious reads (mediocre mapping quality or too many substitutions) allowed in a downsampling stride.
*/
@Advanced
@Argument(fullName = MAX_SUSPICIOUS_READS_PER_ALIGNMENT_START_LONG_NAME, optional = true, doc = "Maximum number of suspicious reads (mediocre mapping quality or too many substitutions) allowed in a downsampling stride. Set to 0 to disable.")
public int maxSuspiciousReadsPerAlignmentStart = 0;
/**
* This is a measure of the minimum evidence to support that a variant observed in the tumor is not also present in the normal.
* Applies to normal data in a tumor with matched normal analysis. The default has been tuned for diploid somatic analyses.
* It is unlikely such analyses will require changing the default value. Increasing the parameter may increase the sensitivity of somatic calling,
* but may also increase calling false positive, i.e. germline, variants.
*/
@Argument(fullName = NORMAL_LOG_10_ODDS_LONG_NAME, optional = true, doc = "Log 10 odds threshold for calling normal variant non-germline.")
public double normalLog10Odds = DEFAULT_NORMAL_LOG_10_ODDS;
/**
* When opposite ends of a fragment are inverted tandem repeats of each other, the sequence past one end may be copied onto the other
* during library prep. By default, Mutect2 identifies and clips these artifacts, which are especially prevalent when
* DNA is damaged as in the case of FFPE samples and ancient DNA.
*/
@Argument(fullName= IGNORE_ITR_ARTIFACTS_LONG_NAME, doc="Turn off read transformer that clips artifacts associated with end repair insertions near inverted tandem repeats.", optional = true)
public boolean dontClipITRArtifacts = false;
/**
* When Mutect2 is run in reference confidence mode with banding compression enabled (-ERC GVCF), homozygous-reference
* sites are compressed into bands of similar tumor LOD (TLOD) that are emitted as a single VCF record. See
* the FAQ documentation for more details about the GVCF format.
*
* This argument allows you to set the TLOD bands. Mutect2 expects a list of strictly increasing TLOD values
* that will act as exclusive upper bounds for the TLOD bands. To pass multiple values,
* you provide them one by one with the argument, as in `-LODB -3.0 -LODB -2.0 -LODB -1.0`
* (this would set the TLOD bands to be `[-Inf, -3.0), [-3.0, -2.0), [-2.0, -1.0), [-1.0, Inf]`, for example).
*
* Note that, unlike the GQ used by HaplotypeCaller GVCFs, here the reference calls with the highest confidence are the most negative.
*/
@Advanced
@Argument(fullName = LOD_BAND_LONG_NAME, shortName = LOD_BAND_SHORT_NAME, doc = "Exclusive upper bounds for reference confidence LOD bands " +
"(must be specified in increasing order)", optional = true)
public List GVCFGQBands = new ArrayList<>(70);
{
for (double i = -2.5; i <= 1; i = i + 0.5) {
GVCFGQBands.add(i);
}
}
@Advanced
@Argument(fullName = MINIMUM_ALLELE_FRACTION_LONG_NAME, shortName = MINIMUM_ALLELE_FRACTION_SHORT_NAME, doc = "Lower bound of variant allele fractions to consider when calculating variant LOD", optional = true)
public double minAF = 0.00;
@Advanced
@Argument(fullName = INDEPENDENT_MATES_LONG_NAME, doc = "Allow paired reads to independently support different haplotypes. Useful for validations with ill-designed synthetic data.", optional = true)
public boolean independentMates = false;
@Advanced
@Argument(fullName = FLOW_M2_MODE_LONG_NAME, optional = true, doc="Single argument for enabling the bulk of Flow Based features. NOTE: THIS WILL OVERWRITE PROVIDED ARGUMENT CHECK TOOL INFO TO SEE WHICH ARGUMENTS ARE SET).")
public FlowMode flowMode = FlowMode.NONE;
/**
* the different flow modes, in terms of their parameters and their values
*
* NOTE: a parameter value ending with /o is optional - meaning it will not fail the process if it
* is not existent on the target parameters collection. This allows setting parameters which are
* specific to only a subset of the tools supporting flow-mode
*/
public enum FlowMode {
NONE(new String[]{}, null),
STANDARD(new String[]{
MIN_BASE_QUALITY_SCORE_SHORT_NAME, "0",
FILTER_ALLELES, "true",
FILTER_ALLELES_SOR_THRESHOLD, "3",
FLOW_ASSEMBLY_COLLAPSE_HMER_SIZE_LONG_NAME, String.valueOf(AssemblyBasedCallerUtils.DETERMINE_COLLAPSE_THRESHOLD),
OVERRIDE_FRAGMENT_SOFTCLIP_CHECK_LONG_NAME, "true",
FlowBasedAlignmentArgumentCollection.FLOW_LIKELIHOOD_PARALLEL_THREADS_LONG_NAME, "2",
FlowBasedAlignmentArgumentCollection.FLOW_LIKELIHOOD_OPTIMIZED_COMP_LONG_NAME, "true",
LikelihoodEngineArgumentCollection.LIKELIHOOD_CALCULATION_ENGINE_FULL_NAME, ReadLikelihoodCalculationEngine.Implementation.FlowBased.toString()
}, null),
ADVANCED(new String[]{
ReadThreadingAssemblerArgumentCollection.PRUNING_LOD_THRESHOLD_LONG_NAME, "3.0",
LikelihoodEngineArgumentCollection.ENABLE_DYNAMIC_READ_DISQUALIFICATION_FOR_GENOTYPING_LONG_NAME, "true",
LikelihoodEngineArgumentCollection.DYNAMIC_READ_DISQUALIFICATION_THRESHOLD_LONG_NAME, "10",
ReadFilterArgumentDefinitions.MINIMUM_MAPPING_QUALITY_NAME, "1"
}, STANDARD);
final private String[] nameValuePairs;
final private FlowMode parent;
FlowMode(final String[] nameValuePairs, final FlowMode parent) {
this.nameValuePairs = nameValuePairs;
this.parent = parent;
}
public String[] getNameValuePairs() {
if ( parent == null )
return nameValuePairs;
else
return ArrayUtils.addAll(nameValuePairs, parent.getNameValuePairs());
}
}
}