package org.broadinstitute.sting.gatk; import org.broadinstitute.sting.utils.StingException; import org.broadinstitute.sting.utils.cmdLine.Argument; import org.simpleframework.xml.*; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.stream.Format; import org.simpleframework.xml.stream.HyphenStyle; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * User: aaron * Date: May 7, 2009 * Time: 11:46:21 AM * * The Broad Institute * SOFTWARE COPYRIGHT NOTICE AGREEMENT * This software and its documentation are copyright 2009 by the * Broad Institute/Massachusetts Institute of Technology. All rights are reserved. * * This software is supplied without any warranty or guaranteed support whatsoever. Neither * the Broad Institute nor MIT can be responsible for its use, misuse, or functionality. * */ /** * @author aaron * @version 1.0 * @date May 7, 2009 *

* Class ArgumentObject *

* Encapsolute the massively large list of possible parameters we take in the Genome Analysis tool */ @Root public class GATKArgumentCollection { /* our version number */ private float versionNumber = 1; private String description = "GATK Arguments"; /** the constructor */ public GATKArgumentCollection() { } @Element(required=false) public String analysisName = null; @ElementMap(entry = "analysis_argument", key = "key", attribute = true, inline = true, required=false) public Map walkerArgs = new HashMap(); // parameters and their defaults @ElementList(required=false) @Argument(fullName = "input_file", shortName = "I", doc = "SAM or BAM file(s)", required = false) public List samFiles = new ArrayList(); @Element(required=false) @Argument(fullName = "intervals", shortName = "L", doc = "A list of genomic intervals over which to operate. Can be explicitly specified on the command line or in a file.", required = false) public String intervals = null; @Element(required=false) @Argument(fullName = "reference_sequence", shortName = "R", doc = "Reference sequence file", required = false) public File referenceFile = null; @ElementList(required=false) @Argument(fullName = "rodBind", shortName = "B", doc = "Bindings for reference-ordered data, in the form ,,", required = false) public ArrayList RODBindings = new ArrayList(); @Element(required=false) @Argument(fullName = "DBSNP", shortName = "D", doc = "DBSNP file", required = false) public String DBSNPFile = null; @Element(required=false) @Argument(fullName = "hapmap", shortName = "H", doc = "Hapmap file", required = false) public String HAPMAPFile = null; @Element(required=false) @Argument(fullName = "hapmap_chip", shortName = "hc", doc = "Hapmap chip file", required = false) public String HAPMAPChipFile = null; /** An output file presented to the walker. */ @Element(required=false) @Argument(fullName = "out", shortName = "o", doc = "An output file presented to the walker. Will overwrite contents if file exists.", required = false) public String outFileName = null; /** An error output file presented to the walker. */ @Element(required=false) @Argument(fullName = "err", shortName = "e", doc = "An error output file presented to the walker. Will overwrite contents if file exists.", required = false) public String errFileName = null; /** A joint file for both 'normal' and error output presented to the walker. */ @Element(required=false) @Argument(fullName = "outerr", shortName = "oe", doc = "A joint file for 'normal' and error output presented to the walker. Will overwrite contents if file exists.", required = false) public String outErrFileName = null; @Element(required=false) @Argument(fullName = "all_loci", shortName = "A", doc = "Should we process all loci, not just those covered by reads", required = false) public Boolean walkAllLoci = false; @Element(required=false) @Argument(fullName = "maximum_reads", shortName = "M", doc = "Maximum number of iterations to process before exiting, the lower bound is zero. Intended only for testing", required = false) public Integer maximumEngineIterations = -1; @Element(required=false) @Argument(fullName = "sort_on_the_fly", shortName = "sort", doc = "Maximum number of reads to sort on the fly", required = false) public Integer maximumReadSorts = null; @Element(required=false) @Argument(fullName = "bam_compression", shortName = "compress", doc = "Compression level to use for writing BAM files", required = false) public Integer BAMcompression = null; @Element(required=false) @Argument(fullName = "filterZeroMappingQualityReads", shortName = "fmq0", doc = "If true, mapping quality zero reads will be filtered at the lowest GATK level. Vastly improves performance at areas with abnormal depth due to mapping Q0 reads", required = false) public Boolean filterZeroMappingQualityReads = false; @Element(required=false) @Argument(fullName = "downsample_to_fraction", shortName = "dfrac", doc = "Fraction [0.0-1.0] of reads to downsample to", required = false) public Double downsampleFraction = null; @Element(required=false) @Argument(fullName = "downsample_to_coverage", shortName = "dcov", doc = "Coverage [integer] to downsample to", required = false) public Integer downsampleCoverage = null; @Element(required=false) @Argument(fullName = "validation_strictness", shortName = "S", doc = "How strict should we be with validation (LENIENT|SILENT|STRICT)", required = false) public String strictnessLevel = "silent"; @Element(required=false) @Argument(fullName = "unsafe", shortName = "U", doc = "If set, enables unsafe operations, nothing will be checked at runtime.", required = false) public Boolean unsafe = false; @Element(required=false) @Argument(fullName = "threaded_IO", shortName = "P", doc = "If set, enables threaded I/O operations", required = false) public Boolean enabledThreadedIO = false; @Element(required=false) @Argument(fullName = "disablethreading", shortName = "dt", doc = "Disable experimental threading support.", required = false) public Boolean disableThreading = false; /** How many threads should be allocated to this analysis. */ @Element(required=false) @Argument(fullName = "numthreads", shortName = "nt", doc = "How many threads should be allocated to running this analysis.", required = false) public int numberOfThreads = 1; /** * marshal the data out to a object * * @param collection the GATKArgumentCollection to load into * @param outputFile the file to write to */ public static void marshal(GATKArgumentCollection collection, String outputFile) { Serializer serializer = new Persister(new Format(new HyphenStyle())); File result = new File(outputFile); try { serializer.write(collection, result); } catch (Exception e) { throw new StingException("Failed to marshal the data from the file " + outputFile, e); } } /** * unmashall the object from a configuration file * * @param filename the filename to marshal from */ public static GATKArgumentCollection unmarshal(String filename) { Serializer serializer = new Persister(new Format(new HyphenStyle())); File source = new File(filename); try { GATKArgumentCollection example = serializer.read(GATKArgumentCollection.class, source); return example; } catch (Exception e) { throw new StingException("Failed to marshal the data to file " + filename, e); } } /** * test equality between two arg collections. This function defines the statement: * "not fun to write" * @param other the other collection * @return true if they're equal */ public boolean equals(GATKArgumentCollection other) { if (other.samFiles.size() != samFiles.size()) { return false; } for (int x = 0; x < samFiles.size(); x++) { if (!samFiles.get(x).equals(other.samFiles.get(x))) { return false; } } if (other.walkerArgs.size() != walkerArgs.size()) { return false; } for (String s : walkerArgs.keySet()) { if (!other.walkerArgs.containsKey(s)) { return false; } } if (other.RODBindings.size() != RODBindings.size()) { return false; } for (int x = 0; x < RODBindings.size(); x++) { if (!RODBindings.get(x).equals(other.RODBindings.get(x))) { return false; } } if (!other.samFiles.equals(this.samFiles)) { return false; } if (!other.maximumEngineIterations.equals(this.maximumEngineIterations)) { return false; } if (!other.strictnessLevel.equals(this.strictnessLevel)) { return false; } if (!other.referenceFile.equals(this.referenceFile)) { return false; } if (!other.intervals.equals(this.intervals)) { return false; } if (!other.analysisName.equals(this.analysisName)) { return false; } if (!other.DBSNPFile.equals(this.DBSNPFile)) { return false; } if (!other.HAPMAPFile.equals(this.HAPMAPFile)) { return false; } if (!other.HAPMAPChipFile.equals(this.HAPMAPChipFile)) { return false; } if (!other.enabledThreadedIO.equals(this.enabledThreadedIO)) { return false; } if (!other.unsafe.equals(this.unsafe)) { return false; } if ((other.maximumReadSorts == null && this.maximumReadSorts != null) || (other.maximumReadSorts != null && !other.maximumReadSorts.equals(this.maximumReadSorts))) { return false; } if ((other.BAMcompression == null && this.BAMcompression != null) || (other.BAMcompression != null && !other.BAMcompression.equals(this.BAMcompression))) { return false; } if ((other.filterZeroMappingQualityReads == null && this.filterZeroMappingQualityReads != null) || (other.filterZeroMappingQualityReads != null && !other.filterZeroMappingQualityReads.equals(this.filterZeroMappingQualityReads))) { return false; } if ((other.downsampleFraction == null && this.downsampleFraction != null) || (other.downsampleFraction != null && !other.downsampleFraction.equals(this.downsampleFraction))) { return false; } if ((other.downsampleCoverage == null && this.downsampleCoverage != null) || (other.downsampleCoverage != null && !other.downsampleCoverage.equals(this.downsampleCoverage))) { return false; } if (!other.walkAllLoci.equals(this.walkAllLoci)) { return false; } if (!other.outFileName.equals(this.outFileName)) { return false; } if (!other.errFileName.equals(this.errFileName)) { return false; } if (!other.outErrFileName.equals(this.outErrFileName)) { return false; } if (other.numberOfThreads != this.numberOfThreads) { return false; } return true; } }