From 2d41ba15a4da7943be033ff7e91ea3d53ee56861 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 10:31:32 -0400
Subject: [PATCH 01/18] Vastly better Tribble help message
Here's a new example:
##### ERROR ------------------------------------------------------------------------------------------
##### ERROR A USER ERROR has occurred (version 1.1-520-g76495cd):
##### ERROR The invalid arguments or inputs must be corrected before the GATK can proceed
##### ERROR Please do not post this error to the GATK forum
##### ERROR
##### ERROR See the documentation (rerun with -h) for this tool to view allowable command-line arguments.
##### ERROR Visit our wiki for extensive documentation http://www.broadinstitute.org/gsa/wiki
##### ERROR Visit our forum to view answers to commonly asked questions http://getsatisfaction.com/gsa
##### ERROR
##### ERROR MESSAGE: Invalid command line: Failed to parse value /humgen/gsa-hpprojects/GATK/data/refGene_b37.filtered.sorted.txt for argument refSeqRodBinding. Message: Invalid command line: No tribble type was provided on the command line and the type of the file could not be determined dynamically. Please add an explicit type tag :TYPE listing the correct type from among the supported types:
##### ERROR Name FeatureType Documentation
##### ERROR BEAGLE BeagleFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_beagle_BeagleCodec.html
##### ERROR BED BEDFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broad_tribble_bed_BEDCodec.html
##### ERROR BEDTABLE TableFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_table_BedTableCodec.html
##### ERROR CGVAR VariantContext http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_completegenomics_CGVarCodec.html
##### ERROR DBSNP DbSNPFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broad_tribble_dbsnp_DbSNPCodec.html
##### ERROR GELITEXT GeliTextFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broad_tribble_gelitext_GeliTextCodec.html
##### ERROR MAF MafFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_gatk_features_maf_MafCodec.html
##### ERROR MILLSDEVINE VariantContext http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_MillsDevineCodec.html
##### ERROR RAWHAPMAP RawHapMapFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_hapmap_RawHapMapCodec.html
##### ERROR REFSEQ RefSeqFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_refseq_RefSeqCodec.html
##### ERROR SAMPILEUP SAMPileupFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_sampileup_SAMPileupCodec.html
##### ERROR SAMREAD SAMReadFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_samread_SAMReadCodec.html
##### ERROR SNPEFF SnpEffFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_snpEff_SnpEffCodec.html
##### ERROR SOAPSNP VariantContext http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_soapsnp_SoapSNPCodec.html
##### ERROR TABLE TableFeature http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_table_TableCodec.html
##### ERROR VCF VariantContext http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_vcf_VCFCodec.html
##### ERROR VCF3 VariantContext http://www.broadinstitute.org/gsa/gatkdocs/release/org_broadinstitute_sting_utils_codecs_vcf_VCF3Codec.html
##### ERROR ------------------------------------------------------------------------------------------
---
.../commandline/ArgumentTypeDescriptor.java | 2 +-
.../sting/gatk/CommandLineGATK.java | 5 +++
.../gatk/refdata/tracks/FeatureManager.java | 40 +++++++++++++++----
.../sting/utils/help/HelpUtils.java | 6 +--
.../sting/utils/text/ListFileUtils.java | 2 +-
5 files changed, 42 insertions(+), 13 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
index 02af884a2..9f3eae610 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
@@ -376,7 +376,7 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
} else {
throw new UserException.CommandLineException(
String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
- "Please add an explicit type tag :TYPE listing the correct type from among the supported types: %s",
+ "Please add an explicit type tag :TYPE listing the correct type from among the supported types:%n%s",
manager.userFriendlyListOfAvailableFeatures()));
}
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
index 7c567f511..652dfd2fd 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
@@ -31,6 +31,7 @@ import org.broadinstitute.sting.commandline.ArgumentCollection;
import org.broadinstitute.sting.commandline.CommandLineProgram;
import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection;
import org.broadinstitute.sting.gatk.filters.ReadFilter;
+import org.broadinstitute.sting.gatk.refdata.tracks.FeatureManager;
import org.broadinstitute.sting.gatk.walkers.Attribution;
import org.broadinstitute.sting.gatk.walkers.Walker;
import org.broadinstitute.sting.utils.exceptions.UserException;
@@ -174,6 +175,10 @@ public class CommandLineGATK extends CommandLineExecutable {
StringBuilder additionalHelp = new StringBuilder();
Formatter formatter = new Formatter(additionalHelp);
+ formatter.format("Available Reference Ordered Data types:%n");
+ formatter.format(new FeatureManager().userFriendlyListOfAvailableFeatures());
+ formatter.format("%n");
+
formatter.format("For a full description of this walker, see its GATKdocs at:%n");
formatter.format("%s%n", HelpUtils.helpLinksToGATKDocs(walkerType));
diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
index 26a400071..7237f8bb5 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
@@ -36,7 +36,9 @@ import org.broadinstitute.sting.utils.GenomeLocParser;
import org.broadinstitute.sting.utils.Utils;
import org.broadinstitute.sting.utils.classloader.PluginManager;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
+import org.broadinstitute.sting.utils.help.HelpUtils;
+import javax.mail.Header;
import java.io.File;
import java.util.*;
@@ -50,7 +52,7 @@ import java.util.*;
* @author depristo
*/
public class FeatureManager {
- public static class FeatureDescriptor {
+ public static class FeatureDescriptor implements Comparable {
final String name;
final FeatureCodec codec;
@@ -62,6 +64,7 @@ public class FeatureManager {
public String getName() {
return name;
}
+ public String getSimpleFeatureName() { return getFeatureClass().getSimpleName(); }
public FeatureCodec getCodec() {
return codec;
}
@@ -70,13 +73,18 @@ public class FeatureManager {
@Override
public String toString() {
- return String.format("FeatureDescriptor name=%s codec=%s feature=%s", getName(), getCodecClass().getName(), getFeatureClass().getName());
+ return String.format("FeatureDescriptor name=%s codec=%s feature=%s",
+ getName(), getCodecClass().getName(), getFeatureClass().getName());
+ }
+
+ @Override
+ public int compareTo(FeatureDescriptor o) {
+ return getName().compareTo(o.getName());
}
}
private final PluginManager pluginManager;
- private final Collection featureDescriptors = new HashSet();
-
+ private final Collection featureDescriptors = new TreeSet();
/**
* Construct a FeatureManager
@@ -189,10 +197,26 @@ public class FeatureManager {
*/
@Ensures("result != null")
public String userFriendlyListOfAvailableFeatures() {
- List names = new ArrayList();
- for ( final FeatureDescriptor descriptor : featureDescriptors )
- names.add(descriptor.getName());
- return Utils.join(",", names);
+ final String nameHeader="Name", featureHeader = "FeatureType", docHeader="Documentation";
+
+ int maxNameLen = nameHeader.length(), maxFeatureNameLen = featureHeader.length();
+ for ( final FeatureDescriptor descriptor : featureDescriptors ) {
+ maxNameLen = Math.max(maxNameLen, descriptor.getName().length());
+ maxFeatureNameLen = Math.max(maxFeatureNameLen, descriptor.getSimpleFeatureName().length());
+ }
+
+ StringBuilder docs = new StringBuilder();
+ String format = "%" + maxNameLen + "s %" + maxFeatureNameLen + "s %s%n";
+ docs.append(String.format(format, nameHeader, featureHeader, docHeader));
+ for ( final FeatureDescriptor descriptor : featureDescriptors ) {
+ String oneDoc = String.format(format,
+ descriptor.getName(),
+ descriptor.getSimpleFeatureName(),
+ HelpUtils.helpLinksToGATKDocs(descriptor.getCodecClass()));
+ docs.append(oneDoc);
+ }
+
+ return docs.toString();
}
/**
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/HelpUtils.java b/public/java/src/org/broadinstitute/sting/utils/help/HelpUtils.java
index da4e7bdaf..ef6e19933 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/HelpUtils.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/HelpUtils.java
@@ -86,9 +86,9 @@ public class HelpUtils {
public static String helpLinksToGATKDocs(Class c) {
String classPath = htmlFilenameForClass(c);
StringBuilder b = new StringBuilder();
- b.append("release version: ").append(URL_ROOT_FOR_RELEASE_GATKDOCS).append(classPath).append("\n");
- b.append("stable version: ").append(URL_ROOT_FOR_STABLE_GATKDOCS).append(classPath).append("\n");
- b.append("unstable version: ").append(URL_ROOT_FOR_UNSTABLE_GATKDOCS).append(classPath).append("\n");
+ b.append(URL_ROOT_FOR_RELEASE_GATKDOCS).append(classPath);
+ //b.append("stable version: ").append(URL_ROOT_FOR_STABLE_GATKDOCS).append(classPath).append("\n");
+ //b.append("unstable version: ").append(URL_ROOT_FOR_UNSTABLE_GATKDOCS).append(classPath).append("\n");
return b.toString();
}
}
\ No newline at end of file
diff --git a/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java b/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
index b0e25e55b..8584ce3bb 100644
--- a/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
+++ b/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
@@ -161,7 +161,7 @@ public class ListFileUtils {
if ( ! rodBinding.getType().isAssignableFrom(descriptor.getFeatureClass()) )
throw new UserException.BadArgumentValue(rodBinding.getName(),
String.format("Field %s expected type %s, but the type of the input file provided on the command line was %s producing %s. Please make sure that you have provided the correct file type and/or that you are not binding your rod to a name matching one of the available types.",
- rodBinding.getName(), rodBinding.getType(), descriptor.getName(), descriptor.getFeatureClass()));
+ rodBinding.getName(), rodBinding.getType(), descriptor.getName(), descriptor.getSimpleFeatureName()));
rodBindings.add(triplet);
From 47bbddb7244c71ade9198e3f52126e20a9dff1d1 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 10:47:16 -0400
Subject: [PATCH 02/18] Now provides type-specific user feedback
For RodBinding error messages now list only the Tribble types that produce VariantContexts
---
.../commandline/ArgumentTypeDescriptor.java | 7 +++--
.../gatk/refdata/tracks/FeatureManager.java | 28 ++++++++++++++-----
.../sting/utils/text/ListFileUtils.java | 9 +++---
3 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
index 9f3eae610..dc32fcc16 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
@@ -338,6 +338,8 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
public Object parse(ParsingEngine parsingEngine, ArgumentSource source, Type type, ArgumentMatches matches) {
ArgumentDefinition defaultDefinition = createDefaultArgumentDefinition(source);
String value = getArgumentValue( defaultDefinition, matches );
+ Class extends Feature> parameterType = getParameterizedTypeClass(type);
+
try {
String name = defaultDefinition.fullName;
String tribbleType = null;
@@ -376,15 +378,14 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
} else {
throw new UserException.CommandLineException(
String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
- "Please add an explicit type tag :TYPE listing the correct type from among the supported types:%n%s",
- manager.userFriendlyListOfAvailableFeatures()));
+ "Please add an explicit type tag :NAME listing the correct type from among the supported types:%n%s",
+ manager.userFriendlyListOfAvailableFeatures(parameterType)));
}
}
}
}
Constructor ctor = (makeRawTypeIfNecessary(type)).getConstructor(Class.class, String.class, String.class, String.class, Tags.class);
- Class parameterType = getParameterizedTypeClass(type);
RodBinding result = (RodBinding)ctor.newInstance(parameterType, name, value, tribbleType, tags);
parsingEngine.addTags(result,tags);
parsingEngine.addRodBinding(result);
diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
index 7237f8bb5..9a565f1cb 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
@@ -197,23 +197,37 @@ public class FeatureManager {
*/
@Ensures("result != null")
public String userFriendlyListOfAvailableFeatures() {
+ return userFriendlyListOfAvailableFeatures(Feature.class);
+ }
+
+ /**
+ * Returns a list of the available tribble track names (vcf,dbsnp,etc) that we can load
+ * restricted to only Codecs producting Features consistent with the requiredFeatureType
+ * @return
+ */
+ @Ensures("result != null")
+ public String userFriendlyListOfAvailableFeatures(Class extends Feature> requiredFeatureType) {
final String nameHeader="Name", featureHeader = "FeatureType", docHeader="Documentation";
int maxNameLen = nameHeader.length(), maxFeatureNameLen = featureHeader.length();
for ( final FeatureDescriptor descriptor : featureDescriptors ) {
- maxNameLen = Math.max(maxNameLen, descriptor.getName().length());
- maxFeatureNameLen = Math.max(maxFeatureNameLen, descriptor.getSimpleFeatureName().length());
+ if ( requiredFeatureType.isAssignableFrom(descriptor.getFeatureClass()) ) {
+ maxNameLen = Math.max(maxNameLen, descriptor.getName().length());
+ maxFeatureNameLen = Math.max(maxFeatureNameLen, descriptor.getSimpleFeatureName().length());
+ }
}
StringBuilder docs = new StringBuilder();
String format = "%" + maxNameLen + "s %" + maxFeatureNameLen + "s %s%n";
docs.append(String.format(format, nameHeader, featureHeader, docHeader));
for ( final FeatureDescriptor descriptor : featureDescriptors ) {
- String oneDoc = String.format(format,
- descriptor.getName(),
- descriptor.getSimpleFeatureName(),
- HelpUtils.helpLinksToGATKDocs(descriptor.getCodecClass()));
- docs.append(oneDoc);
+ if ( requiredFeatureType.isAssignableFrom(descriptor.getFeatureClass()) ) {
+ String oneDoc = String.format(format,
+ descriptor.getName(),
+ descriptor.getSimpleFeatureName(),
+ HelpUtils.helpLinksToGATKDocs(descriptor.getCodecClass()));
+ docs.append(oneDoc);
+ }
}
return docs.toString();
diff --git a/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java b/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
index 8584ce3bb..9d4b23a8b 100644
--- a/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
+++ b/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java
@@ -156,12 +156,13 @@ public class ListFileUtils {
FeatureManager.FeatureDescriptor descriptor = builderForValidation.getByTriplet(triplet);
if ( descriptor == null )
throw new UserException.UnknownTribbleType(rodBinding.getTribbleType(),
- String.format("Field %s had provided type %s but there's no such Tribble type. Available types are %s",
- rodBinding.getName(), rodBinding.getTribbleType(), builderForValidation.userFriendlyListOfAvailableFeatures()));
+ String.format("Field %s had provided type %s but there's no such Tribble type. The compatible types are: %n%s",
+ rodBinding.getName(), rodBinding.getTribbleType(), builderForValidation.userFriendlyListOfAvailableFeatures(rodBinding.getType())));
if ( ! rodBinding.getType().isAssignableFrom(descriptor.getFeatureClass()) )
throw new UserException.BadArgumentValue(rodBinding.getName(),
- String.format("Field %s expected type %s, but the type of the input file provided on the command line was %s producing %s. Please make sure that you have provided the correct file type and/or that you are not binding your rod to a name matching one of the available types.",
- rodBinding.getName(), rodBinding.getType(), descriptor.getName(), descriptor.getSimpleFeatureName()));
+ String.format("Field %s expects Features of type %s, but the input file produces Features of type %s. The compatible types are: %n%s",
+ rodBinding.getName(), rodBinding.getType().getSimpleName(), descriptor.getSimpleFeatureName(),
+ builderForValidation.userFriendlyListOfAvailableFeatures(rodBinding.getType())));
rodBindings.add(triplet);
From e03db30ca0dc8f96a380aae85f63b2edf811d57c Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 12:31:04 -0400
Subject: [PATCH 03/18] New uses DocumentedGATKFeatureObject instead of
annotation directly
-- Step 1 on the way to creating a static list of additional classes that we want to document.
---
.../utils/help/DocumentedGATKFeature.java | 1 -
.../help/DocumentedGATKFeatureObject.java | 48 +++++++++++++++++++
.../sting/utils/help/GATKDocWorkUnit.java | 4 +-
.../sting/utils/help/GATKDoclet.java | 37 +++++++-------
4 files changed, 66 insertions(+), 24 deletions(-)
create mode 100644 public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeature.java b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeature.java
index 710503ca8..89163dfcb 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeature.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeature.java
@@ -39,6 +39,5 @@ public @interface DocumentedGATKFeature {
public boolean enable() default true;
public String groupName();
public String summary() default "";
- public Class extends DocumentedGATKFeatureHandler> handler() default GenericDocumentationHandler.class;
public Class[] extraDocs() default {};
}
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
new file mode 100644
index 000000000..9d198ee1a
--- /dev/null
+++ b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2011, The Broad Institute
+ *
+ * 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.utils.help;
+
+/**
+ * Documentation unit. Effectively a class version of the DocumentedGATKFeature
+ *
+ * @author depristo
+ */
+class DocumentedGATKFeatureObject {
+ final boolean enable;
+ final String groupName, summary;
+ final Class[] extraDocs;
+
+ public DocumentedGATKFeatureObject(final boolean enable, final String groupName, final String summary, final Class[] extraDocs) {
+ this.enable = enable;
+ this.groupName = groupName;
+ this.summary = summary;
+ this.extraDocs = extraDocs;
+ }
+
+ public boolean enable() { return enable; }
+ public String groupName() { return groupName; }
+ public String summary() { return summary; }
+ public Class[] extraDocs() { return extraDocs; }
+}
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GATKDocWorkUnit.java b/public/java/src/org/broadinstitute/sting/utils/help/GATKDocWorkUnit.java
index 1f6db2757..41c855329 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GATKDocWorkUnit.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GATKDocWorkUnit.java
@@ -51,7 +51,7 @@ class GATKDocWorkUnit implements Comparable {
/** The javadoc documentation for clazz */
final ClassDoc classDoc;
/** The annotation that lead to this Class being in GATKDoc */
- final DocumentedGATKFeature annotation;
+ final DocumentedGATKFeatureObject annotation;
/** When was this walker built, and what's the absolute version number */
final String buildTimestamp, absoluteVersion;
@@ -60,7 +60,7 @@ class GATKDocWorkUnit implements Comparable {
Map forTemplate;
public GATKDocWorkUnit(String name, String filename, String group,
- DocumentedGATKFeature annotation, DocumentedGATKFeatureHandler handler,
+ DocumentedGATKFeatureObject annotation, DocumentedGATKFeatureHandler handler,
ClassDoc classDoc, Class clazz,
String buildTimestamp, String absoluteVersion) {
this.annotation = annotation;
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java b/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
index 8f3ec293a..070663605 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
@@ -99,7 +99,7 @@ public class GATKDoclet {
//if ( clazz != null && clazz.getName().equals("org.broadinstitute.sting.gatk.walkers.annotator.AlleleBalance"))
// logger.debug("foo");
- DocumentedGATKFeature feature = getFeatureForClassDoc(doc);
+ DocumentedGATKFeatureObject feature = getFeatureForClassDoc(doc);
DocumentedGATKFeatureHandler handler = createHandler(doc, feature);
if ( handler != null && handler.includeInDocs(doc) ) {
logger.info("Generating documentation for class " + doc);
@@ -146,31 +146,26 @@ public class GATKDoclet {
}
}
- private DocumentedGATKFeatureHandler createHandler(ClassDoc doc, DocumentedGATKFeature feature) {
- try {
- if ( feature != null ) {
- if ( feature.enable() ) {
- DocumentedGATKFeatureHandler handler = feature.handler().newInstance();
- handler.setDoclet(this);
- return handler;
- } else {
- logger.info("Skipping disabled Documentation for " + doc);
- }
+ private DocumentedGATKFeatureHandler createHandler(ClassDoc doc, DocumentedGATKFeatureObject feature) {
+ if ( feature != null ) {
+ if ( feature.enable() ) {
+ DocumentedGATKFeatureHandler handler = new GenericDocumentationHandler();
+ handler.setDoclet(this);
+ return handler;
+ } else {
+ logger.info("Skipping disabled Documentation for " + doc);
}
- } catch ( IllegalAccessException e) {
- throw new RuntimeException(e); // the constructor is now private -- this is an error
- } catch ( InstantiationException e) {
- throw new RuntimeException(e); // the constructor is now private -- this is an error
}
return null;
}
- private DocumentedGATKFeature getFeatureForClassDoc(ClassDoc doc) {
- // todo -- what do I need the ? extends Object to pass the compiler?
+ private DocumentedGATKFeatureObject getFeatureForClassDoc(ClassDoc doc) {
Class extends Object> docClass = getClassForClassDoc(doc);
+ // todo -- add looked here to static TO DOC collection as well
if ( docClass != null && docClass.isAnnotationPresent(DocumentedGATKFeature.class) ) {
- return docClass.getAnnotation(DocumentedGATKFeature.class);
+ DocumentedGATKFeature f = docClass.getAnnotation(DocumentedGATKFeature.class);
+ return new DocumentedGATKFeatureObject(f.enable(), f.groupName(), f.summary(), f.extraDocs());
} else {
return null; // not annotated so it shouldn't be documented
}
@@ -217,7 +212,7 @@ public class GATKDoclet {
Collections.sort(indexData);
- Set docFeatures = new HashSet();
+ Set docFeatures = new HashSet();
List> data = new ArrayList>();
for ( GATKDocWorkUnit workUnit : indexData ) {
data.add(workUnit.indexDataMap());
@@ -225,7 +220,7 @@ public class GATKDoclet {
}
List> groups = new ArrayList>();
- for ( DocumentedGATKFeature feature : docFeatures ) {
+ for ( DocumentedGATKFeatureObject feature : docFeatures ) {
groups.add(toMap(feature));
}
@@ -237,7 +232,7 @@ public class GATKDoclet {
return root;
}
- private static final Map toMap(DocumentedGATKFeature annotation) {
+ private static final Map toMap(DocumentedGATKFeatureObject annotation) {
Map root = new HashMap();
root.put("name", annotation.groupName());
root.put("summary", annotation.summary());
From 5772766dd5605c92371e9b7e7011dc565b68f84f Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 14:00:09 -0400
Subject: [PATCH 04/18] Improvements to GATKDocs
-- Now supports a static list of root classes / interfaces that should receive docs. A complementary approach to documenting features to the DocumentedGATKFeature annotation
-- Tribble codecs are now documented!
-- No longer displayed sub and super classes
---
.../help/DocumentedGATKFeatureObject.java | 15 +++++--
.../sting/utils/help/GATKDoclet.java | 40 +++++++++++++------
.../help/GenericDocumentationHandler.java | 28 ++++++-------
3 files changed, 53 insertions(+), 30 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
index 9d198ee1a..66354202f 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/DocumentedGATKFeatureObject.java
@@ -30,17 +30,24 @@ package org.broadinstitute.sting.utils.help;
* @author depristo
*/
class DocumentedGATKFeatureObject {
- final boolean enable;
- final String groupName, summary;
- final Class[] extraDocs;
+ private final Class classToDoc;
+ private final boolean enable;
+ private final String groupName, summary;
+ private final Class[] extraDocs;
- public DocumentedGATKFeatureObject(final boolean enable, final String groupName, final String summary, final Class[] extraDocs) {
+ public DocumentedGATKFeatureObject(Class classToDoc, final boolean enable, final String groupName, final String summary, final Class[] extraDocs) {
+ this.classToDoc = classToDoc;
this.enable = enable;
this.groupName = groupName;
this.summary = summary;
this.extraDocs = extraDocs;
}
+ public DocumentedGATKFeatureObject(Class classToDoc, final String groupName, final String summary) {
+ this(classToDoc, true, groupName, summary, new Class[]{});
+ }
+
+ public Class getClassToDoc() { return classToDoc; }
public boolean enable() { return enable; }
public String groupName() { return groupName; }
public String summary() { return summary; }
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java b/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
index 070663605..5755d2b37 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GATKDoclet.java
@@ -33,6 +33,7 @@ import freemarker.template.TemplateException;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
+import org.broad.tribble.FeatureCodec;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
import java.io.*;
@@ -50,6 +51,14 @@ public class GATKDoclet {
RootDoc rootDoc;
+ final static Collection STATIC_DOCS = new ArrayList();
+ static {
+ STATIC_DOCS.add(new DocumentedGATKFeatureObject(FeatureCodec.class,
+ "Reference ordered data (ROD) codecs",
+ "Tribble codecs for reading reference ordered data such as VCF or BED files"));
+ }
+
+
/**
* Extracts the contents of certain types of javadoc and adds them to an XML file.
* @param rootDoc The documentation root.
@@ -162,12 +171,20 @@ public class GATKDoclet {
private DocumentedGATKFeatureObject getFeatureForClassDoc(ClassDoc doc) {
Class extends Object> docClass = getClassForClassDoc(doc);
- // todo -- add looked here to static TO DOC collection as well
- if ( docClass != null && docClass.isAnnotationPresent(DocumentedGATKFeature.class) ) {
- DocumentedGATKFeature f = docClass.getAnnotation(DocumentedGATKFeature.class);
- return new DocumentedGATKFeatureObject(f.enable(), f.groupName(), f.summary(), f.extraDocs());
- } else {
+
+ if ( docClass == null )
return null; // not annotated so it shouldn't be documented
+
+ if ( docClass.isAnnotationPresent(DocumentedGATKFeature.class) ) {
+ DocumentedGATKFeature f = docClass.getAnnotation(DocumentedGATKFeature.class);
+ return new DocumentedGATKFeatureObject(docClass, f.enable(), f.groupName(), f.summary(), f.extraDocs());
+ } else {
+ for ( DocumentedGATKFeatureObject staticDocs : STATIC_DOCS ) {
+ if ( staticDocs.getClassToDoc().isAssignableFrom(docClass) ) {
+ return new DocumentedGATKFeatureObject(docClass, staticDocs.enable(), staticDocs.groupName(), staticDocs.summary(), staticDocs.extraDocs());
+ }
+ }
+ return null;
}
}
@@ -212,16 +229,15 @@ public class GATKDoclet {
Collections.sort(indexData);
- Set docFeatures = new HashSet();
+ List> groups = new ArrayList>();
+ Set seenDocumentationFeatures = new HashSet();
List> data = new ArrayList>();
for ( GATKDocWorkUnit workUnit : indexData ) {
data.add(workUnit.indexDataMap());
- docFeatures.add(workUnit.annotation);
- }
-
- List> groups = new ArrayList>();
- for ( DocumentedGATKFeatureObject feature : docFeatures ) {
- groups.add(toMap(feature));
+ if ( ! seenDocumentationFeatures.contains(workUnit.annotation.groupName()) ) {
+ groups.add(toMap(workUnit.annotation));
+ seenDocumentationFeatures.add(workUnit.annotation.groupName());
+ }
}
root.put("data", data);
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index 6ddf8a157..b4d82f0e8 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -255,21 +255,21 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
put("name", otherUnit.name);}});
}
-
- List> hierarchyDocs = new ArrayList>();
- for (final GATKDocWorkUnit other : all ) {
- final String relation = classRelationship(toProcess.clazz, other.clazz);
- if ( relation != null )
- hierarchyDocs.add(
- new HashMap(){{
- put("filename", other.filename);
- put("relation", relation);
- put("name", other.name);}});
-
- }
-
- root.put("relatedDocs", hierarchyDocs);
root.put("extradocs", extraDocsData);
+
+
+// List> hierarchyDocs = new ArrayList>();
+// for (final GATKDocWorkUnit other : all ) {
+// final String relation = classRelationship(toProcess.clazz, other.clazz);
+// if ( relation != null )
+// hierarchyDocs.add(
+// new HashMap(){{
+// put("filename", other.filename);
+// put("relation", relation);
+// put("name", other.name);}});
+//
+// }
+// root.put("relatedDocs", hierarchyDocs);
}
private static final String classRelationship(Class me, Class other) {
From faa3f8b6f6b8305b21212dc733135b85066c9d78 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 14:04:47 -0400
Subject: [PATCH 05/18] Only concrete classes are now documented
---
.../sting/gatk/CommandLineGATK.java | 2 +-
.../help/GenericDocumentationHandler.java | 28 +++++--------------
2 files changed, 8 insertions(+), 22 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
index 60aea9928..b8488dc9a 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java
@@ -50,7 +50,7 @@ import java.util.*;
@DocumentedGATKFeature(
groupName = "GATK Engine",
summary = "Features and arguments for the GATK engine itself, available to all walkers.",
- extraDocs = { ReadFilter.class, UserException.class })
+ extraDocs = { UserException.class })
public class CommandLineGATK extends CommandLineExecutable {
@Argument(fullName = "analysis_type", shortName = "T", doc = "Type of analysis to run")
private String analysisName = null;
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index b4d82f0e8..5b358519e 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -52,13 +52,13 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
@Override
public boolean includeInDocs(ClassDoc doc) {
- return true;
-// try {
-// Class type = HelpUtils.getClassForDoc(doc);
-// return JVMUtils.isConcrete(type);
-// } catch ( ClassNotFoundException e ) {
-// return false;
-// }
+// return true;
+ try {
+ Class type = HelpUtils.getClassForDoc(doc);
+ return JVMUtils.isConcrete(type);
+ } catch ( ClassNotFoundException e ) {
+ return false;
+ }
}
@@ -256,20 +256,6 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
}
root.put("extradocs", extraDocsData);
-
-
-// List> hierarchyDocs = new ArrayList>();
-// for (final GATKDocWorkUnit other : all ) {
-// final String relation = classRelationship(toProcess.clazz, other.clazz);
-// if ( relation != null )
-// hierarchyDocs.add(
-// new HashMap(){{
-// put("filename", other.filename);
-// put("relation", relation);
-// put("name", other.name);}});
-//
-// }
-// root.put("relatedDocs", hierarchyDocs);
}
private static final String classRelationship(Class me, Class other) {
From ce009bd4a416457fbe457ff3fcd453fc277c9a97 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 14:05:09 -0400
Subject: [PATCH 06/18] Works without related data
---
settings/helpTemplates/generic.template.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/settings/helpTemplates/generic.template.html b/settings/helpTemplates/generic.template.html
index c11200121..0c938c343 100644
--- a/settings/helpTemplates/generic.template.html
+++ b/settings/helpTemplates/generic.template.html
@@ -98,7 +98,7 @@
#if>
<#-- This class is related to other documented classes via sub/super relationships -->
- <#if relatedDocs?size != 0>
+ <#if relatedDocs?? && relatedDocs?size != 0>
Related capabilities
<@relatedByType name="Superclasses" type="superclass"/>
From 09d099cadaa49b7eff1450ac1dd901e8a1ba6195 Mon Sep 17 00:00:00 2001
From: Ryan Poplin
Date: Thu, 18 Aug 2011 20:57:02 -0400
Subject: [PATCH 07/18] Added GATKDocs to the UnifiedGenotyper.
---
.../AlleleFrequencyCalculationModel.java | 2 +
.../GenotypeLikelihoodsCalculationModel.java | 2 +
.../genotyper/UnifiedArgumentCollection.java | 41 +++++++--
.../walkers/genotyper/UnifiedGenotyper.java | 83 +++++++++++++++++--
.../genotyper/UnifiedGenotyperEngine.java | 3 +
.../recalibration/CountCovariatesWalker.java | 6 ++
.../TableRecalibrationWalker.java | 2 +
.../VariantRecalibrator.java | 4 +
8 files changed, 129 insertions(+), 14 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/AlleleFrequencyCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/AlleleFrequencyCalculationModel.java
index 83a8ce7d7..70f3c6a1a 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/AlleleFrequencyCalculationModel.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/AlleleFrequencyCalculationModel.java
@@ -44,7 +44,9 @@ import java.util.Set;
public abstract class AlleleFrequencyCalculationModel implements Cloneable {
public enum Model {
+ /** The default model with the best performance in all cases */
EXACT,
+ /** For posterity we have kept around the older GRID_SEARCH model, but this gives inferior results and shouldn't be used. */
GRID_SEARCH
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GenotypeLikelihoodsCalculationModel.java
index 594c1dd28..60dfe4fe7 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GenotypeLikelihoodsCalculationModel.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GenotypeLikelihoodsCalculationModel.java
@@ -53,7 +53,9 @@ public abstract class GenotypeLikelihoodsCalculationModel implements Cloneable {
}
public enum GENOTYPING_MODE {
+ /** the default; the Unified Genotyper will choose the most likely alternate allele */
DISCOVERY,
+ /** only the alleles passed in from a VCF rod bound to the -alleles argument will be used for genotyping */
GENOTYPE_GIVEN_ALLELES
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedArgumentCollection.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedArgumentCollection.java
index 1a76bfd07..e7f89bf08 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedArgumentCollection.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedArgumentCollection.java
@@ -36,31 +36,54 @@ import java.io.File;
public class UnifiedArgumentCollection {
- // control the various models to be used
@Argument(fullName = "genotype_likelihoods_model", shortName = "glm", doc = "Genotype likelihoods calculation model to employ -- SNP is the default option, while INDEL is also available for calling indels and BOTH is available for calling both together", required = false)
public GenotypeLikelihoodsCalculationModel.Model GLmodel = GenotypeLikelihoodsCalculationModel.Model.SNP;
+ /**
+ * Controls the model used to calculate the probability that a site is variant plus the various sample genotypes in the data at a given locus.
+ */
@Argument(fullName = "p_nonref_model", shortName = "pnrm", doc = "Non-reference probability calculation model to employ -- EXACT is the default option, while GRID_SEARCH is also available.", required = false)
public AlleleFrequencyCalculationModel.Model AFmodel = AlleleFrequencyCalculationModel.Model.EXACT;
+ /**
+ * The expected heterozygosity value used to compute prior likelihoods for any locus. The default priors are:
+ * het = 1e-3, P(hom-ref genotype) = 1 - 3 * het / 2, P(het genotype) = het, P(hom-var genotype) = het / 2
+ */
@Argument(fullName = "heterozygosity", shortName = "hets", doc = "Heterozygosity value used to compute prior likelihoods for any locus", required = false)
public Double heterozygosity = DiploidSNPGenotypePriors.HUMAN_HETEROZYGOSITY;
@Argument(fullName = "pcr_error_rate", shortName = "pcr_error", doc = "The PCR error rate to be used for computing fragment-based likelihoods", required = false)
public Double PCR_error = DiploidSNPGenotypeLikelihoods.DEFAULT_PCR_ERROR_RATE;
+ /**
+ * Specifies how to determine the alternate allele to use for genotyping
+ */
@Argument(fullName = "genotyping_mode", shortName = "gt_mode", doc = "Should we output confident genotypes (i.e. including ref calls) or just the variants?", required = false)
public GenotypeLikelihoodsCalculationModel.GENOTYPING_MODE GenotypingMode = GenotypeLikelihoodsCalculationModel.GENOTYPING_MODE.DISCOVERY;
@Argument(fullName = "output_mode", shortName = "out_mode", doc = "Should we output confident genotypes (i.e. including ref calls) or just the variants?", required = false)
public UnifiedGenotyperEngine.OUTPUT_MODE OutputMode = UnifiedGenotyperEngine.OUTPUT_MODE.EMIT_VARIANTS_ONLY;
+ /**
+ * The minimum phred-scaled Qscore threshold to separate high confidence from low confidence calls. Only genotypes with
+ * confidence >= this threshold are emitted as called sites. A reasonable threshold is 30 for high-pass calling (this
+ * is the default). Note that the confidence (QUAL) values for multi-sample low-pass (e.g. 4x per sample) calling might
+ * be significantly smaller with the new EXACT model than with our older GRID_SEARCH model, as the latter tended to
+ * over-estimate the confidence; for low-pass calling we tend to use much smaller thresholds (e.g. 4).
+ */
@Argument(fullName = "standard_min_confidence_threshold_for_calling", shortName = "stand_call_conf", doc = "The minimum phred-scaled confidence threshold at which variants not at 'trigger' track sites should be called", required = false)
public double STANDARD_CONFIDENCE_FOR_CALLING = 30.0;
+ /**
+ * the minimum phred-scaled Qscore threshold to emit low confidence calls. Genotypes with confidence >= this but less
+ * than the calling threshold are emitted but marked as filtered.
+ */
@Argument(fullName = "standard_min_confidence_threshold_for_emitting", shortName = "stand_emit_conf", doc = "The minimum phred-scaled confidence threshold at which variants not at 'trigger' track sites should be emitted (and filtered if less than the calling threshold)", required = false)
public double STANDARD_CONFIDENCE_FOR_EMITTING = 30.0;
+ /**
+ * This argument is not enabled by default because it increases the runtime by an appreciable amount.
+ */
@Argument(fullName = "computeSLOD", shortName = "sl", doc = "If provided, we will calculate the SLOD", required = false)
public boolean COMPUTE_SLOD = false;
@@ -80,7 +103,6 @@ public class UnifiedArgumentCollection {
@Argument(fullName = "abort_at_too_much_coverage", doc = "Don't call a site if the downsampled coverage is greater than this value", required = false)
public int COVERAGE_AT_WHICH_TO_ABORT = -1;
-
// control the various parameters to be used
@Argument(fullName = "min_base_quality_score", shortName = "mbq", doc = "Minimum base quality required to consider a base for calling", required = false)
public int MIN_BASE_QUALTY_SCORE = 17;
@@ -91,11 +113,17 @@ public class UnifiedArgumentCollection {
@Argument(fullName = "max_deletion_fraction", shortName = "deletions", doc = "Maximum fraction of reads with deletions spanning this locus for it to be callable [to disable, set to < 0 or > 1; default:0.05]", required = false)
public Double MAX_DELETION_FRACTION = 0.05;
-
// indel-related arguments
+ /**
+ * A candidate indel is genotyped (and potentially called) if there are this number of reads with a consensus indel at a site.
+ * Decreasing this value will increase sensitivity but at the cost of larger calling time and a larger number of false positives.
+ */
@Argument(fullName = "min_indel_count_for_genotyping", shortName = "minIndelCnt", doc = "Minimum number of consensus indels required to trigger genotyping run", required = false)
public int MIN_INDEL_COUNT_FOR_GENOTYPING = 5;
+ /**
+ * This argument informs the prior probability of having an indel at a site.
+ */
@Argument(fullName = "indel_heterozygosity", shortName = "indelHeterozygosity", doc = "Heterozygosity for indel calling", required = false)
public double INDEL_HETEROZYGOSITY = 1.0/8000;
@@ -126,22 +154,23 @@ public class UnifiedArgumentCollection {
@Hidden
@Argument(fullName = "indelDebug", shortName = "indelDebug", doc = "Output indel debug info", required = false)
public boolean OUTPUT_DEBUG_INDEL_INFO = false;
+
@Hidden
@Argument(fullName = "dovit", shortName = "dovit", doc = "Output indel debug info", required = false)
public boolean dovit = false;
+
@Hidden
@Argument(fullName = "GSA_PRODUCTION_ONLY", shortName = "GSA_PRODUCTION_ONLY", doc = "don't ever use me", required = false)
public boolean GSA_PRODUCTION_ONLY = false;
+
@Hidden
-
@Argument(fullName = "exactCalculation", shortName = "exactCalculation", doc = "expt", required = false)
public ExactAFCalculationModel.ExactCalculation EXACT_CALCULATION_TYPE = ExactAFCalculationModel.ExactCalculation.LINEAR_EXPERIMENTAL;
@Hidden
- @Argument(fullName = "ignoreSNPAlleles", shortName = "ignoreSNPAlleles", doc = "expt", required = false)
+ @Argument(fullName = "ignoreSNPAlleles", shortName = "ignoreSNPAlleles", doc = "expt", required = false)
public boolean IGNORE_SNP_ALLELES = false;
-
@Deprecated
@Argument(fullName="output_all_callable_bases", shortName="all_bases", doc="Please use --output_mode EMIT_ALL_SITES instead" ,required=false)
private Boolean ALL_BASES_DEPRECATED = false;
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
index d31bb6fb9..8d2101d8f 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
@@ -45,11 +45,71 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContext;
import java.io.PrintStream;
import java.util.*;
-
/**
- * A variant caller which unifies the approaches of several disparate callers. Works for single-sample and
- * multi-sample data. The user can choose from several different incorporated calculation models.
+ * A variant caller which unifies the approaches of several disparate callers -- Works for single-sample and multi-sample data.
+ *
+ *
+ * The GATK Unified Genotyper is a multiple-sample, technology-aware SNP and indel caller. It uses a Bayesian genotype
+ * likelihood model to estimate simultaneously the most likely genotypes and allele frequency in a population of N samples,
+ * emitting an accurate posterior probability of there being a segregating variant allele at each locus as well as for the
+ * genotype of each sample. The system can either emit just the variant sites or complete genotypes (which includes
+ * homozygous reference calls) satisfying some phred-scaled confidence value. The genotyper can make accurate calls on
+ * both single sample data and multi-sample data.
+ *
+ *
Input
+ *
+ * The read data from which to make variant calls.
+ *
+ *
+ * Output
+ *
+ * A raw, unfiltered, highly specific callset in VCF format.
+ *
+ *
+ * Example generic command for multi-sample SNP calling
+ *
+ * java -jar GenomeAnalysisTK.jar \
+ * -R resources/Homo_sapiens_assembly18.fasta \
+ * -T UnifiedGenotyper \
+ * -I sample1.bam [-I sample2.bam ...] \
+ * --dbsnp dbSNP.vcf \
+ * -o snps.raw.vcf \
+ * -stand_call_conf [50.0] \
+ * -stand_emit_conf 10.0 \
+ * -dcov [50] \
+ * [-L targets.interval_list]
+ *
+ *
+ *
+ * The above command will call all of the samples in your provided BAM files [-I arguments] together and produce a VCF file
+ * with sites and genotypes for all samples. The easiest way to get the dbSNP file is from the GATK resource bundle. Several
+ * arguments have parameters that should be chosen based on the average coverage per sample in your data. See the detailed
+ * argument descriptions below.
+ *
+ *
+ * Example command for generating calls at all sites
+ *
+ * java -jar /path/to/GenomeAnalysisTK.jar \
+ * -l INFO \
+ * -R resources/Homo_sapiens_assembly18.fasta \
+ * -T UnifiedGenotyper \
+ * -I /DCC/ftp/pilot_data/data/NA12878/alignment/NA12878.SLX.maq.SRP000031.2009_08.bam \
+ * -o my.vcf \
+ * --output_mode EMIT_ALL_SITES
+ *
+ *
+ * Caveats
+ *
+ * The system is under active and continuous development. All outputs, the underlying likelihood model, arguments, and
+ * file formats are likely to change.
+ * The system can be very aggressive in calling variants. In the 1000 genomes project for pilot 2 (deep coverage of ~35x)
+ * we expect the raw Qscore > 50 variants to contain at least ~10% FP calls. We use extensive post-calling filters to eliminate
+ * most of these FPs. Variant Quality Score Recalibration is a tool to perform this filtering.
+ * We only handle diploid genotypes
+ *
+ *
*/
+
@BAQMode(QualityMode = BAQ.QualityMode.ADD_TAG, ApplicationTime = BAQ.ApplicationTime.ON_INPUT)
@ReadFilters( {BadMateFilter.class, MappingQualityUnavailableReadFilter.class} )
@Reference(window=@Window(start=-200,stop=200))
@@ -61,10 +121,9 @@ public class UnifiedGenotyper extends LocusWalker getDbsnpRodBinding() { return dbsnp.dbsnp; }
@@ -72,7 +131,9 @@ public class UnifiedGenotyper extends LocusWalker> getCompRodBindings() { return Collections.emptyList(); }
public List> getResourceRodBindings() { return Collections.emptyList(); }
- // control the output
+ /**
+ * A raw, unfiltered, highly specific callset in VCF format.
+ */
@Output(doc="File to which variants should be written",required=true)
protected VCFWriter writer = null;
@@ -82,9 +143,15 @@ public class UnifiedGenotyper extends LocusWalker annotationsToUse = new ArrayList();
+ /**
+ * Which groups of annotations to add to the output VCF file. See the VariantAnnotator -list argument to view available groups.
+ */
@Argument(fullName="group", shortName="G", doc="One or more classes/groups of annotations to apply to variant calls", required=false)
protected String[] annotationClassesToUse = { "Standard" };
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java
index b3f77fc06..06455df6d 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperEngine.java
@@ -51,8 +51,11 @@ public class UnifiedGenotyperEngine {
public static final String LOW_QUAL_FILTER_NAME = "LowQual";
public enum OUTPUT_MODE {
+ /** the default */
EMIT_VARIANTS_ONLY,
+ /** include confident reference sites */
EMIT_ALL_CONFIDENT_SITES,
+ /** any callable site regardless of confidence */
EMIT_ALL_SITES
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
index 5ffc61fe3..838842869 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
@@ -68,6 +68,8 @@ import java.util.Map;
*
* Input
*
+ * The input read data whose base quality scores need to be assessed.
+ *
* A database of known polymorphic sites to skip over.
*
*
@@ -134,6 +136,10 @@ public class CountCovariatesWalker extends LocusWalkerInput
*
+ * The input read data whose base quality scores need to be recalibrated.
+ *
* The recalibration table file in CSV format that was generated by the CountCovariates walker.
*
*
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrator.java
index d81a57aad..517c2362a 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrator.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrator.java
@@ -157,6 +157,10 @@ public class VariantRecalibrator extends RodWalker
Date: Thu, 18 Aug 2011 21:20:09 -0400
Subject: [PATCH 08/18] Improvements to GATKDocs
-- Allowed values for RodBinding are displayed in the GATKDocs
-- Longest name up to 30 characters is chosen for main argument list (suggested by Ryan/Mauricio)
-- Features are listed in alphabetical order
-- Moved useful getParameterizedType() function to JVMUtils
-- Tests of these features in the Documentation Test
---
.../commandline/ArgumentTypeDescriptor.java | 14 +---
.../gatk/refdata/tracks/FeatureManager.java | 2 +-
.../sting/utils/classloader/JVMUtils.java | 10 +++
.../help/GenericDocumentationHandler.java | 83 +++++++++++++++++--
4 files changed, 91 insertions(+), 18 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
index dc32fcc16..7353305f1 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
@@ -325,7 +325,7 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
@Override
public Object createTypeDefault(ParsingEngine parsingEngine, ArgumentSource source, Type type) {
- Class parameterType = getParameterizedTypeClass(type);
+ Class parameterType = JVMUtils.getParameterizedTypeClass(type);
return RodBinding.makeUnbound((Class extends Feature>)parameterType);
}
@@ -338,7 +338,7 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
public Object parse(ParsingEngine parsingEngine, ArgumentSource source, Type type, ArgumentMatches matches) {
ArgumentDefinition defaultDefinition = createDefaultArgumentDefinition(source);
String value = getArgumentValue( defaultDefinition, matches );
- Class extends Feature> parameterType = getParameterizedTypeClass(type);
+ Class extends Feature> parameterType = JVMUtils.getParameterizedTypeClass(type);
try {
String name = defaultDefinition.fullName;
@@ -400,16 +400,6 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
value, source.field.getName(), e.getMessage()));
}
}
-
- private Class getParameterizedTypeClass(Type t) {
- if ( t instanceof ParameterizedType ) {
- ParameterizedType parameterizedType = (ParameterizedType)t;
- if ( parameterizedType.getActualTypeArguments().length != 1 )
- throw new ReviewedStingException("BUG: more than 1 generic type found on class" + t);
- return (Class)parameterizedType.getActualTypeArguments()[0];
- } else
- throw new ReviewedStingException("BUG: could not find generic type on class " + t);
- }
}
/**
diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
index c7dd6ef14..c99aea254 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManager.java
@@ -123,7 +123,7 @@ public class FeatureManager {
*/
@Requires("featureClass != null")
public Collection getByFeature(Class featureClass) {
- Set consistentDescriptors = new HashSet();
+ Set consistentDescriptors = new TreeSet();
if (featureClass == null)
throw new IllegalArgumentException("trackRecordType value is null, please pass in an actual class object");
diff --git a/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java b/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java
index e65b8f921..fa154fca3 100755
--- a/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java
+++ b/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java
@@ -224,4 +224,14 @@ public class JVMUtils {
throw new StingException("Unknown type: " + type + " (" + type.getClass().getName() + ")");
}
}
+
+ public static Class getParameterizedTypeClass(Type t) {
+ if ( t instanceof ParameterizedType ) {
+ ParameterizedType parameterizedType = (ParameterizedType)t;
+ if ( parameterizedType.getActualTypeArguments().length != 1 )
+ throw new ReviewedStingException("BUG: more than 1 generic type found on class" + t);
+ return (Class)parameterizedType.getActualTypeArguments()[0];
+ } else
+ throw new ReviewedStingException("BUG: could not find generic type on class " + t);
+ }
}
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index 5b358519e..86f72428a 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -30,14 +30,18 @@ import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Tag;
import org.apache.log4j.Logger;
+import org.broad.tribble.Feature;
import org.broadinstitute.sting.commandline.*;
import org.broadinstitute.sting.gatk.CommandLineGATK;
+import org.broadinstitute.sting.gatk.refdata.tracks.FeatureManager;
import org.broadinstitute.sting.utils.Utils;
import org.broadinstitute.sting.utils.classloader.JVMUtils;
+import org.broadinstitute.sting.utils.collections.Pair;
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
+import org.broadinstitute.sting.utils.exceptions.StingException;
import java.io.*;
-import java.lang.reflect.Field;
+import java.lang.reflect.*;
import java.util.*;
/**
@@ -295,6 +299,8 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
return fieldDoc;
Field field = HelpUtils.getFieldForFieldDoc(fieldDoc);
+ if ( field == null )
+ throw new RuntimeException("Could not find the field corresponding to " + fieldDoc + ", presumably because the field is inaccessible");
if ( field.isAnnotationPresent(ArgumentCollection.class) ) {
ClassDoc typeDoc = getRootDoc().classNamed(fieldDoc.type().qualifiedTypeName());
if ( typeDoc == null )
@@ -319,15 +325,82 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
return null;
}
+ private static final int MAX_DISPLAY_NAME = 30;
+ Pair displayNames(String s1, String s2) {
+ if ( s1 == null ) return new Pair(s2, null);
+ if ( s2 == null ) return new Pair(s1, null);
+
+ String l = s1.length() > s2.length() ? s1 : s2;
+ String s = s1.length() > s2.length() ? s2 : s1;
+
+ if ( l.length() > MAX_DISPLAY_NAME )
+ return new Pair(s, l);
+ else
+ return new Pair(l, s);
+ }
+
+ protected String argumentTypeString(Type type) {
+ if (type instanceof ParameterizedType) {
+ ParameterizedType parameterizedType = (ParameterizedType)type;
+ List subs = new ArrayList();
+ for (Type actualType: parameterizedType.getActualTypeArguments())
+ subs.add(argumentTypeString(actualType));
+ return argumentTypeString(((ParameterizedType)type).getRawType()) + "[" + Utils.join(",", subs) + "]";
+ } else if (type instanceof GenericArrayType) {
+ return argumentTypeString(((GenericArrayType)type).getGenericComponentType()) + "[]";
+ } else if (type instanceof WildcardType) {
+ throw new RuntimeException("We don't support wildcards in arguments: " + type);
+ } else if (type instanceof Class>) {
+ return ((Class) type).getSimpleName();
+ } else {
+ throw new StingException("Unknown type: " + type);
+ }
+ }
+
+ protected Class extends Feature> getFeatureTypeIfPossible(Type type) {
+ if ( type instanceof ParameterizedType) {
+ ParameterizedType paramType = (ParameterizedType)type;
+ if ( RodBinding.class.isAssignableFrom((Class>)paramType.getRawType()) ) {
+ return (Class extends Feature>)JVMUtils.getParameterizedTypeClass(type);
+ } else {
+ for ( Type paramtype : paramType.getActualTypeArguments() ) {
+ Class extends Feature> x = getFeatureTypeIfPossible(paramtype);
+ if ( x != null )
+ return x;
+ }
+ }
+ }
+
+ return null;
+ }
+
protected Map docForArgument(FieldDoc fieldDoc, ArgumentSource source, ArgumentDefinition def) {
Map root = new HashMap();
- root.put("name", def.shortName != null ? "-" + def.shortName : "--" + def.fullName );
+ Pair names = displayNames("-" + def.shortName, "--" + def.fullName);
- if ( def.shortName != null && def.fullName != null )
- root.put("synonyms", "--" + def.fullName);
+ root.put("name", names.getFirst() );
+
+ if ( names.getSecond() != null )
+ root.put("synonyms", names.getSecond());
root.put("required", def.required ? "yes" : "no");
- root.put("type", def.argumentType.getSimpleName());
+
+ // type of the field
+ root.put("type", argumentTypeString(source.field.getGenericType()));
+
+ Class extends Feature> featureClass = getFeatureTypeIfPossible(source.field.getGenericType());
+ if ( featureClass != null ) {
+ // deal with the allowable types
+ FeatureManager manager = new FeatureManager();
+ List rodTypes = new ArrayList();
+ for (FeatureManager.FeatureDescriptor descriptor : manager.getByFeature(featureClass) ) {
+ rodTypes.add(String.format("%s ",
+ GATKDocUtils.htmlFilenameForClass(descriptor.getCodecClass()),
+ descriptor.getName()));
+ }
+
+ root.put("rodTypes", Utils.join(", ", rodTypes));
+ }
// summary and fulltext
root.put("summary", def.doc != null ? def.doc : "");
From d94da0b1cfcd66955a365c8207a66b92b4bdd451 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 21:20:26 -0400
Subject: [PATCH 09/18] Moved CG and SOAP codecs to private
---
.../codecs/completegenomics/CGVarCodec.java | 159 -------------
.../utils/codecs/soapsnp/SoapSNPCodec.java | 209 ------------------
2 files changed, 368 deletions(-)
delete mode 100755 public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java
delete mode 100755 public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java
diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java
deleted file mode 100755
index c30da828e..000000000
--- a/public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * 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.utils.codecs.completegenomics;
-
-import org.broad.tribble.Feature;
-import org.broad.tribble.FeatureCodec;
-import org.broad.tribble.readers.LineReader;
-import org.broadinstitute.sting.utils.variantcontext.Allele;
-import org.broadinstitute.sting.utils.variantcontext.VariantContext;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * a codec for the VAR file types produced by the Complete Genomics Institute
- */
-public class CGVarCodec implements FeatureCodec {
-
- private static final String REF_TYPE = "ref";
- private static final String SNP_TYPE = "snp";
- private static final String DELETION_TYPE = "del";
- private static final String INSERTION_TYPE = "ins";
- private static final String SUBSTITUTION_TYPE = "sub";
-
- // the minimum number of features in the CG file line
- private static final int minimumFeatureCount = 8;
-
- /**
- * decode the location only
- * @param line the input line to decode
- * @return a HapMapFeature
- */
- public Feature decodeLoc(String line) {
- return decode(line);
- }
-
- /**
- * decode the CG record
- * @param line the input line to decode
- * @return a VariantContext
- */
- public Feature decode(String line) {
- String[] array = line.split("\\s+");
-
- // make sure the split was successful - that we got an appropriate number of fields
- if ( array.length < minimumFeatureCount )
- return null;
-
- String type = array[6];
-
- long start = Long.valueOf(array[4]);
- long end;
- Allele ref, alt = null;
-
- //System.out.println(line);
-
- if ( type.equals(SNP_TYPE) ) {
- ref = Allele.create(array[7], true);
- alt = Allele.create(array[8], false);
- end = start;
- } else if ( type.equals(INSERTION_TYPE) ) {
- ref = Allele.create(Allele.NULL_ALLELE_STRING, true);
- alt = Allele.create(array[7], false);
- end = start;
- } else if ( type.equals(DELETION_TYPE) ) {
- ref = Allele.create(array[7], true);
- alt = Allele.create(Allele.NULL_ALLELE_STRING, false);
- end = start + ref.length();
- //} else if ( type.equals(REF_TYPE) ) {
- // ref = Allele.create("N", true); // ref bases aren't accurate
- // start++;
- // end = start;
- //} else if ( type.equals(SUBSTITUTION_TYPE) ) {
- // ref = Allele.create(array[7], true);
- // alt = Allele.create(array[8], false);
- // end = start + Math.max(ref.length(), alt.length());
- } else {
- return null; // we don't handle other types
- }
-
- HashSet alleles = new HashSet();
- alleles.add(ref);
- if ( alt != null )
- alleles.add(alt);
-
- HashMap attrs = new HashMap();
- String id = array[array.length - 1];
- if ( id.indexOf("dbsnp") != -1 ) {
- attrs.put(VariantContext.ID_KEY, parseID(id));
- }
-
- // create a new feature given the array
- return new VariantContext("CGI", array[3], start, end, alleles, VariantContext.NO_NEG_LOG_10PERROR, null, attrs);
- }
-
- public Class getFeatureType() {
- return VariantContext.class;
- }
-
- // There's no spec and no character to distinguish header lines...
- private final static int NUM_HEADER_LINES = 12;
- public Object readHeader(LineReader reader) {
- return null;
-
- //String headerLine = null;
- //try {
- // for (int i = 0; i < NUM_HEADER_LINES; i++)
- // headerLine = reader.readLine();
- //} catch (IOException e) {
- // throw new IllegalArgumentException("Unable to read a line from the line reader");
- //}
- //return headerLine;
- }
-
- private static final Pattern DBSNP_PATTERN = Pattern.compile("^dbsnp\\.\\d+:(.*)");
- private String parseID(String raw) {
- StringBuilder sb = null;
-
- String[] ids = raw.split(";");
- for ( String id : ids ) {
- Matcher matcher = DBSNP_PATTERN.matcher(id);
- if ( matcher.matches() ) {
- String rsID = matcher.group(1);
- if ( sb == null ) {
- sb = new StringBuilder(rsID);
- } else {
- sb.append(";");
- sb.append(rsID);
- }
- }
- }
-
- return sb == null ? null : sb.toString();
- }
-}
diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java
deleted file mode 100755
index 284c43e90..000000000
--- a/public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package org.broadinstitute.sting.utils.codecs.soapsnp;
-
-import org.broad.tribble.Feature;
-import org.broad.tribble.FeatureCodec;
-import org.broad.tribble.NameAwareCodec;
-import org.broad.tribble.TribbleException;
-import org.broad.tribble.exception.CodecLineParsingException;
-import org.broad.tribble.readers.LineReader;
-import org.broadinstitute.sting.utils.variantcontext.Allele;
-import org.broadinstitute.sting.utils.variantcontext.Genotype;
-import org.broadinstitute.sting.utils.variantcontext.VariantContext;
-
-import java.util.*;
-
-/**
- * @author depristo
- *
- * a codec for parsing soapsnp files (see http://soap.genomics.org.cn/soapsnp.html#usage2)
- *
- *
- * A simple text file format with the following whitespace separated fields:
- *
-1) Chromosome ID
-2) Coordinate on chromosome, start from 1
-3) Reference genotype
-4) Consensus genotype
-5) Quality score of consensus genotype
-6) Best base
-7) Average quality score of best base
-8) Count of uniquely mapped best base
-9) Count of all mapped best base
-10) Second best bases
-11) Average quality score of second best base
-12) Count of uniquely mapped second best base
-13) Count of all mapped second best base
-14) Sequencing depth of the site
-15) Rank sum test p_value
-16) Average copy number of nearby region
-17) Whether the site is a dbSNP.
- */
-public class SoapSNPCodec implements FeatureCodec, NameAwareCodec {
- private String[] parts;
-
- // we store a name to give to each of the variant contexts we emit
- private String name = "Unknown";
-
- public Feature decodeLoc(String line) {
- return decode(line);
- }
-
- /**
- * Decode a line as a Feature.
- *
- * @param line
- *
- * @return Return the Feature encoded by the line, or null if the line does not represent a feature (e.g. is
- * a comment)
- */
- public Feature decode(String line) {
- try {
- // parse into lines
- parts = line.trim().split("\\s+");
-
- // check that we got the correct number of tokens in the split
- if (parts.length != 18)
- throw new CodecLineParsingException("Invalid SoapSNP row found -- incorrect element count. Expected 18, got " + parts.length + " line = " + line);
-
- String contig = parts[0];
- long start = Long.valueOf(parts[1]);
- AlleleAndGenotype allelesAndGenotype = parseAlleles(parts[2], parts[3], line);
-
- double negLog10PError = Integer.valueOf(parts[4]) / 10.0;
-
- Map attributes = new HashMap();
- attributes.put("BestBaseQ", parts[6]);
- attributes.put("SecondBestBaseQ", parts[10]);
- attributes.put("RankSumP", parts[15]);
- // add info to keys
-
- //System.out.printf("Alleles = " + allelesAndGenotype.alleles);
- //System.out.printf("genotype = " + allelesAndGenotype.genotype);
-
- VariantContext vc = new VariantContext(name, contig, start, start, allelesAndGenotype.alleles, allelesAndGenotype.genotype, negLog10PError, VariantContext.PASSES_FILTERS, attributes);
-
- //System.out.printf("line = %s%n", line);
- //System.out.printf("vc = %s%n", vc);
-
- return vc;
- } catch (CodecLineParsingException e) {
- throw new TribbleException("Unable to parse line " + line,e);
- } catch (NumberFormatException e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- throw new TribbleException("Unable to parse line " + line,e);
- }
- }
-
- private static class AlleleAndGenotype {
- Collection alleles;
- Collection genotype;
-
- public AlleleAndGenotype(Collection alleles, Genotype genotype) {
- this.alleles = alleles;
- this.genotype = new HashSet();
- this.genotype.add(genotype);
- }
- }
-
- private AlleleAndGenotype parseAlleles(String ref, String consensusGenotype, String line) {
- /* A Adenine
- C Cytosine
- G Guanine
- T (or U) Thymine (or Uracil)
- R A or G
- Y C or T
- S G or C
- W A or T
- K G or T
- M A or C
- B C or G or T
- D A or G or T
- H A or C or T
- V A or C or G
- N any base
- . or - gap
- */
- if ( ref.equals(consensusGenotype) )
- throw new TribbleException.InternalCodecException("Ref base and consensus genotype are the same " + ref);
-
- Allele refAllele = Allele.create(ref, true);
- List genotypeAlleles = null;
-
- char base = consensusGenotype.charAt(0);
-
- switch ( base ) {
- case 'A': case 'C': case 'G': case 'T':
- Allele a = Allele.create(consensusGenotype);
- genotypeAlleles = Arrays.asList(a, a);
- break;
- case 'R': case 'Y': case 'S': case 'W': case 'K': case 'M':
- genotypeAlleles = determineAlt(refAllele, ref.charAt(0), base);
- break;
- default:
- throw new TribbleException("Unexpected consensus genotype " + consensusGenotype + " at line = " + line);
- }
-
-
- Collection alleles = new HashSet(genotypeAlleles);
- alleles.add(refAllele);
- Genotype genotype = new Genotype("unknown", genotypeAlleles); // todo -- probably should include genotype quality
-
- return new AlleleAndGenotype( alleles, genotype );
- }
-
- private static final Map IUPAC_SNPS = new HashMap();
- static {
- IUPAC_SNPS.put('R', "AG");
- IUPAC_SNPS.put('Y', "CT");
- IUPAC_SNPS.put('S', "GC");
- IUPAC_SNPS.put('W', "AT");
- IUPAC_SNPS.put('K', "GT");
- IUPAC_SNPS.put('M', "AC");
- }
-
- private List determineAlt(Allele ref, char refbase, char alt) {
- String alts = IUPAC_SNPS.get(alt);
- if ( alts == null )
- throw new IllegalStateException("BUG: unexpected consensus genotype " + alt);
-
- Allele a1 = alts.charAt(0) == refbase ? ref : Allele.create((byte)alts.charAt(0));
- Allele a2 = alts.charAt(1) == refbase ? ref : Allele.create((byte)alts.charAt(1));
-
- //if ( a1 != ref && a2 != ref )
- // throw new IllegalStateException("BUG: unexpected consensus genotype " + alt + " does not contain the reference base " + ref);
-
- return Arrays.asList(a1, a2);
- }
-
- /**
- * @return VariantContext
- */
- public Class getFeatureType() {
- return VariantContext.class;
- }
-
- public Object readHeader(LineReader reader) {
-
- return null; // we don't have a meaningful header
- }
-
- /**
- * get the name of this codec
- * @return our set name
- */
- public String getName() {
- return name;
- }
-
- /**
- * set the name of this codec
- * @param name new name
- */
- public void setName(String name) {
- this.name = name;
- }
-
- public static void main(String[] args) {
- System.out.printf("Testing " + args[0]);
- }
-}
\ No newline at end of file
From cca093051738eb18b3491ab8bc58e85d3d4f99ce Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 21:24:23 -0400
Subject: [PATCH 10/18] Better formatting for GATKDocs
---
settings/helpTemplates/generic.template.html | 13 +++++++++----
settings/helpTemplates/style.css | 14 +++++++++-----
2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/settings/helpTemplates/generic.template.html b/settings/helpTemplates/generic.template.html
index 0c938c343..e62b7c6fb 100644
--- a/settings/helpTemplates/generic.template.html
+++ b/settings/helpTemplates/generic.template.html
@@ -20,16 +20,21 @@
<#macro argumentDetails arg>
${arg.name}<#if arg.synonyms??> / ${arg.synonyms}#if>
(<#if arg.attributes??>${arg.attributes} #if>${arg.type}<#if arg.defaultValue??> with default value ${arg.defaultValue}#if>)
- ${arg.summary}. ${arg.fulltext}
+
+ ${arg.summary}. ${arg.fulltext}
+ <#if arg.rodTypes??>${arg.name} binds reference ordered data. This argument supports ROD files of the
+ following types: ${arg.rodTypes}#if>
<#if arg.options??>
-
The ${arg.name} argument is an enumerated type (${arg.type}), which can have one of the following values:
+
+ The ${arg.name} argument is an enumerated type (${arg.type}), which can have one of the following values:
<#list arg.options as option>
- ${option.name}
- ${option.summary}
+ ${option.name}
+ ${option.summary}
#list>
#if>
+
#macro>
<#macro relatedByType name type>
diff --git a/settings/helpTemplates/style.css b/settings/helpTemplates/style.css
index 2abcf0397..375df2f51 100644
--- a/settings/helpTemplates/style.css
+++ b/settings/helpTemplates/style.css
@@ -42,6 +42,10 @@ p.version
text-align: center;
}
+p.args
+{
+ margin-left: 3em;
+}
h1, h2, h3, h4
{
@@ -81,17 +85,17 @@ hr
* enum DT layout
*/
-dl {
- border: 1px solid #ccc;
+dl.enum {
+ margin-left: 3em;
+ border: 1px dashed #ccc;
}
-dt {
+dt.enum {
font-weight: bold;
text-decoration: underline;
}
-dd {
- margin: 0;
+dd.enum {
padding: 0 0 0.5em 0;
}
From c5efb6f40e7c20ee1cb5fe965719c9089aea8809 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 21:39:11 -0400
Subject: [PATCH 11/18] Usability improvements to GATKDocs
-- ArgumentSources are now sorted by case insensitive names, so arguments are shown in alphabetical order (Ryan)
-- @Advanced annotation can be used to indicate that an argument is an advanced option and should be visually deemphasized in the GATKs. There's now an advanced section. Mauricio or Ryan -- could you figure out how to make this section less prominent in the style.css?
---
.../sting/commandline/Advanced.java | 40 +++++++++++++++++++
.../sting/commandline/ArgumentSource.java | 15 ++++++-
.../sting/commandline/ParsingEngine.java | 2 +-
.../help/GenericDocumentationHandler.java | 2 +
4 files changed, 57 insertions(+), 2 deletions(-)
create mode 100644 public/java/src/org/broadinstitute/sting/commandline/Advanced.java
diff --git a/public/java/src/org/broadinstitute/sting/commandline/Advanced.java b/public/java/src/org/broadinstitute/sting/commandline/Advanced.java
new file mode 100644
index 000000000..7aeefe261
--- /dev/null
+++ b/public/java/src/org/broadinstitute/sting/commandline/Advanced.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2011, The Broad Institute
+ *
+ * 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.commandline;
+
+import java.lang.annotation.*;
+
+/**
+ * Indicates that a walker argument should is considered an advanced option.
+ *
+ * @author Mark DePristo
+ * @version 0.1
+ */
+@Documented
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE,ElementType.FIELD})
+public @interface Advanced {
+}
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
index e0e2ac378..3e149b0c6 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
@@ -39,7 +39,7 @@ import java.util.List;
* @author mhanna
* @version 0.1
*/
-public class ArgumentSource {
+public class ArgumentSource implements Comparable {
/**
* Field into which to inject command-line arguments.
*/
@@ -151,6 +151,14 @@ public class ArgumentSource {
return field.isAnnotationPresent(Hidden.class) || field.isAnnotationPresent(Deprecated.class);
}
+ /**
+ * Is the given argument considered an advanced option when displaying on the command-line argument system.
+ * @return True if so. False otherwise.
+ */
+ public boolean isAdvanced() {
+ return field.isAnnotationPresent(Advanced.class);
+ }
+
/**
* Is this command-line argument dependent on some primitive argument types?
* @return True if this command-line argument depends on other arguments; false otherwise.
@@ -208,4 +216,9 @@ public class ArgumentSource {
public String toString() {
return field.getDeclaringClass().getSimpleName() + ": " + field.getName();
}
+
+ @Override
+ public int compareTo(final ArgumentSource argumentSource) {
+ return field.getName().toLowerCase().compareTo(argumentSource.field.getName().toLowerCase());
+ }
}
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
index fbf8c6516..12b454f4f 100755
--- a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
@@ -451,7 +451,7 @@ public class ParsingEngine {
* @return A map of sources associated with this object and its aggregated objects and bindings to their bindings values
*/
private Map extractArgumentBindings(Object obj, Class sourceClass, Field[] parentFields) {
- Map bindings = new LinkedHashMap();
+ Map bindings = new TreeMap();
while( sourceClass != null ) {
Field[] fields = sourceClass.getDeclaredFields();
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index 86f72428a..fe08e5979 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -116,6 +116,7 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
args.put("all", new ArrayList());
args.put("required", new ArrayList());
args.put("optional", new ArrayList());
+ args.put("advanced", new ArrayList());
args.put("hidden", new ArrayList());
args.put("depreciated", new ArrayList());
try {
@@ -127,6 +128,7 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
logger.debug(String.format("Processing %s", argumentSource));
String kind = "optional";
if ( argumentSource.isRequired() ) kind = "required";
+ else if ( argumentSource.isAdvanced() ) kind = "advanced";
else if ( argumentSource.isHidden() ) kind = "hidden";
else if ( argumentSource.isDeprecated() ) kind = "depreciated";
From d1892cd0d77194af26df39008600a7ba03b68aab Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 21:58:36 -0400
Subject: [PATCH 12/18] Bug fixes
-- Sorting of ArgumentSources now done in GATKDoclet, not in the ParsingEngine, as the system depends on the LinkedTreeMap
-- Fixed broken exception throwing in the case where a file's type could not be determined
---
.../sting/commandline/ArgumentTypeDescriptor.java | 11 ++++++-----
.../sting/commandline/ParsingEngine.java | 2 +-
.../sting/utils/help/GenericDocumentationHandler.java | 2 +-
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
index 7353305f1..b12ae8e75 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java
@@ -375,13 +375,14 @@ class RodBindingArgumentTypeDescriptor extends ArgumentTypeDescriptor {
if ( featureDescriptor != null ) {
tribbleType = featureDescriptor.getName();
logger.warn("Dynamically determined type of " + file + " to be " + tribbleType);
- } else {
- throw new UserException.CommandLineException(
- String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
- "Please add an explicit type tag :NAME listing the correct type from among the supported types:%n%s",
- manager.userFriendlyListOfAvailableFeatures(parameterType)));
}
}
+
+ if ( tribbleType == null )
+ throw new UserException.CommandLineException(
+ String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
+ "Please add an explicit type tag :NAME listing the correct type from among the supported types:%n%s",
+ manager.userFriendlyListOfAvailableFeatures(parameterType)));
}
}
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
index 12b454f4f..fbf8c6516 100755
--- a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java
@@ -451,7 +451,7 @@ public class ParsingEngine {
* @return A map of sources associated with this object and its aggregated objects and bindings to their bindings values
*/
private Map extractArgumentBindings(Object obj, Class sourceClass, Field[] parentFields) {
- Map bindings = new TreeMap();
+ Map bindings = new LinkedHashMap();
while( sourceClass != null ) {
Field[] fields = sourceClass.getDeclaredFields();
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index fe08e5979..ff57bb744 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -120,7 +120,7 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
args.put("hidden", new ArrayList());
args.put("depreciated", new ArrayList());
try {
- for ( ArgumentSource argumentSource : parsingEngine.extractArgumentSources(HelpUtils.getClassForDoc(classdoc)) ) {
+ for ( ArgumentSource argumentSource : new TreeSet(parsingEngine.extractArgumentSources(HelpUtils.getClassForDoc(classdoc))) ) {
ArgumentDefinition argDef = argumentSource.createArgumentDefinitions().get(0);
FieldDoc fieldDoc = getFieldDoc(classdoc, argumentSource.field.getName());
Map argBindings = docForArgument(fieldDoc, argumentSource, argDef); // todo -- why can you have multiple ones?
From f2a05af3561f45bc315a921660d1e70fda8ddfad Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 21:59:44 -0400
Subject: [PATCH 13/18] Fixed layout problem with advanced arguments
---
settings/helpTemplates/generic.template.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/settings/helpTemplates/generic.template.html b/settings/helpTemplates/generic.template.html
index e62b7c6fb..7fc8cd7bd 100644
--- a/settings/helpTemplates/generic.template.html
+++ b/settings/helpTemplates/generic.template.html
@@ -82,6 +82,7 @@
<@argumentlist name="Required" myargs=arguments.required/>
<@argumentlist name="Optional" myargs=arguments.optional/>
+ <@argumentlist name="Advanced" myargs=arguments.advanced/>
<@argumentlist name="Hidden" myargs=arguments.hidden/>
<@argumentlist name="Depreciated" myargs=arguments.depreciated/>
From 77fa2c15469a9efeabb7245f8afeae8905bf30ca Mon Sep 17 00:00:00 2001
From: Eric Banks
Date: Thu, 18 Aug 2011 22:01:33 -0400
Subject: [PATCH 14/18] Renaming read filters with a superfluous 'Read' in
their names. Kept the ones that made sense to have it (e.g.
MalformedReadFilter).
---
...ckReadFilter.java => FailsVendorQualityCheckFilter.java} | 2 +-
...pingQualityReadFilter.java => MappingQualityFilter.java} | 2 +-
...ReadFilter.java => MappingQualityUnavailableFilter.java} | 2 +-
...ityZeroReadFilter.java => MappingQualityZeroFilter.java} | 2 +-
...gnmentReadFilter.java => NotPrimaryAlignmentFilter.java} | 2 +-
.../broadinstitute/sting/gatk/walkers/DuplicateWalker.java | 4 ++--
.../org/broadinstitute/sting/gatk/walkers/LocusWalker.java | 6 +++---
.../sting/gatk/walkers/genotyper/UnifiedGenotyper.java | 4 ++--
.../sting/gatk/walkers/indels/RealignerTargetCreator.java | 4 ++--
.../gatk/walkers/indels/SomaticIndelDetectorWalker.java | 4 ++--
.../sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java | 4 ++--
.../gatk/walkers/recalibration/CountCovariatesWalker.java | 6 +++---
12 files changed, 21 insertions(+), 21 deletions(-)
rename public/java/src/org/broadinstitute/sting/gatk/filters/{FailsVendorQualityCheckReadFilter.java => FailsVendorQualityCheckFilter.java} (95%)
rename public/java/src/org/broadinstitute/sting/gatk/filters/{MappingQualityReadFilter.java => MappingQualityFilter.java} (96%)
rename public/java/src/org/broadinstitute/sting/gatk/filters/{MappingQualityUnavailableReadFilter.java => MappingQualityUnavailableFilter.java} (95%)
rename public/java/src/org/broadinstitute/sting/gatk/filters/{MappingQualityZeroReadFilter.java => MappingQualityZeroFilter.java} (95%)
rename public/java/src/org/broadinstitute/sting/gatk/filters/{NotPrimaryAlignmentReadFilter.java => NotPrimaryAlignmentFilter.java} (95%)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckFilter.java
similarity index 95%
rename from public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java
rename to public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckFilter.java
index cd77a9e7e..4ec451567 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckFilter.java
@@ -34,7 +34,7 @@ import net.sf.samtools.SAMRecord;
* Filter out FailsVendorQualityCheck reads.
*/
-public class FailsVendorQualityCheckReadFilter extends ReadFilter {
+public class FailsVendorQualityCheckFilter extends ReadFilter {
public boolean filterOut( final SAMRecord read ) {
return read.getReadFailsVendorQualityCheckFlag();
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityFilter.java
similarity index 96%
rename from public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java
rename to public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityFilter.java
index 75369b306..ed9c37dca 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityFilter.java
@@ -35,7 +35,7 @@ import org.broadinstitute.sting.commandline.Argument;
* @version 0.1
*/
-public class MappingQualityReadFilter extends ReadFilter {
+public class MappingQualityFilter extends ReadFilter {
@Argument(fullName = "min_mapping_quality_score", shortName = "mmq", doc = "Minimum read mapping quality required to consider a read for calling", required = false)
public int MIN_MAPPING_QUALTY_SCORE = 10;
diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableFilter.java
similarity index 95%
rename from public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java
rename to public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableFilter.java
index 1afec36d1..ccdb40d31 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableFilter.java
@@ -34,7 +34,7 @@ import org.broadinstitute.sting.utils.QualityUtils;
* @version 0.1
*/
-public class MappingQualityUnavailableReadFilter extends ReadFilter {
+public class MappingQualityUnavailableFilter extends ReadFilter {
public boolean filterOut(SAMRecord rec) {
return (rec.getMappingQuality() == QualityUtils.MAPPING_QUALITY_UNAVAILABLE);
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroFilter.java
similarity index 95%
rename from public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java
rename to public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroFilter.java
index e49d4117c..57db8419c 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroFilter.java
@@ -33,7 +33,7 @@ import net.sf.samtools.SAMRecord;
* @version 0.1
*/
-public class MappingQualityZeroReadFilter extends ReadFilter {
+public class MappingQualityZeroFilter extends ReadFilter {
public boolean filterOut(SAMRecord rec) {
return (rec.getMappingQuality() == 0);
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentFilter.java
similarity index 95%
rename from public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java
rename to public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentFilter.java
index 31c2144ce..50cd30f71 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentFilter.java
@@ -34,7 +34,7 @@ import net.sf.samtools.SAMRecord;
* Filter out duplicate reads.
*/
-public class NotPrimaryAlignmentReadFilter extends ReadFilter {
+public class NotPrimaryAlignmentFilter extends ReadFilter {
public boolean filterOut( final SAMRecord read ) {
return read.getNotPrimaryAlignmentFlag();
}
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java
index 4bfedb672..e2db1dc52 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java
@@ -2,7 +2,7 @@ package org.broadinstitute.sting.gatk.walkers;
import net.sf.samtools.SAMRecord;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
-import org.broadinstitute.sting.gatk.filters.NotPrimaryAlignmentReadFilter;
+import org.broadinstitute.sting.gatk.filters.NotPrimaryAlignmentFilter;
import org.broadinstitute.sting.gatk.filters.UnmappedReadFilter;
import org.broadinstitute.sting.utils.GenomeLoc;
@@ -17,7 +17,7 @@ import java.util.Set;
* To change this template use File | Settings | File Templates.
*/
@Requires({DataSource.READS,DataSource.REFERENCE})
-@ReadFilters({UnmappedReadFilter.class,NotPrimaryAlignmentReadFilter.class})
+@ReadFilters({UnmappedReadFilter.class,NotPrimaryAlignmentFilter.class})
public abstract class DuplicateWalker extends Walker {
// Do we actually want to operate on the context?
public boolean filter(GenomeLoc loc, AlignmentContext context, Set> readSets ) {
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java
index b0b2687f4..8152f74c2 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java
@@ -3,8 +3,8 @@ package org.broadinstitute.sting.gatk.walkers;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.filters.DuplicateReadFilter;
-import org.broadinstitute.sting.gatk.filters.FailsVendorQualityCheckReadFilter;
-import org.broadinstitute.sting.gatk.filters.NotPrimaryAlignmentReadFilter;
+import org.broadinstitute.sting.gatk.filters.FailsVendorQualityCheckFilter;
+import org.broadinstitute.sting.gatk.filters.NotPrimaryAlignmentFilter;
import org.broadinstitute.sting.gatk.filters.UnmappedReadFilter;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
@@ -18,7 +18,7 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
@By(DataSource.READS)
@Requires({DataSource.READS,DataSource.REFERENCE, DataSource.REFERENCE_BASES})
@PartitionBy(PartitionType.INTERVAL)
-@ReadFilters({UnmappedReadFilter.class,NotPrimaryAlignmentReadFilter.class,DuplicateReadFilter.class,FailsVendorQualityCheckReadFilter.class})
+@ReadFilters({UnmappedReadFilter.class,NotPrimaryAlignmentFilter.class,DuplicateReadFilter.class,FailsVendorQualityCheckFilter.class})
public abstract class LocusWalker extends Walker {
// Do we actually want to operate on the context?
public boolean filter(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) {
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
index 8d2101d8f..d5dbdedd6 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyper.java
@@ -31,7 +31,7 @@ import org.broadinstitute.sting.gatk.arguments.DbsnpArgumentCollection;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.filters.BadMateFilter;
-import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableFilter;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.*;
import org.broadinstitute.sting.gatk.walkers.annotator.VariantAnnotatorEngine;
@@ -111,7 +111,7 @@ import java.util.*;
*/
@BAQMode(QualityMode = BAQ.QualityMode.ADD_TAG, ApplicationTime = BAQ.ApplicationTime.ON_INPUT)
-@ReadFilters( {BadMateFilter.class, MappingQualityUnavailableReadFilter.class} )
+@ReadFilters( {BadMateFilter.class, MappingQualityUnavailableFilter.class} )
@Reference(window=@Window(start=-200,stop=200))
@By(DataSource.REFERENCE)
@Downsample(by=DownsampleType.BY_SAMPLE, toCoverage=250)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java
index 145d0327c..e66598b44 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java
@@ -33,7 +33,7 @@ import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.filters.BadCigarFilter;
import org.broadinstitute.sting.gatk.filters.BadMateFilter;
-import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityZeroFilter;
import org.broadinstitute.sting.gatk.filters.Platform454Filter;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.*;
@@ -98,7 +98,7 @@ import java.util.List;
*
* @author ebanks
*/
-@ReadFilters({Platform454Filter.class, MappingQualityZeroReadFilter.class, BadCigarFilter.class})
+@ReadFilters({Platform454Filter.class, MappingQualityZeroFilter.class, BadCigarFilter.class})
@Reference(window=@Window(start=-1,stop=50))
@Allows(value={DataSource.READS, DataSource.REFERENCE})
@By(DataSource.REFERENCE)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java
index 9f6ac2a91..546bbe1a6 100644
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java
@@ -33,7 +33,7 @@ import org.broadinstitute.sting.commandline.Tags;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID;
import org.broadinstitute.sting.gatk.datasources.reference.ReferenceDataSource;
-import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityZeroFilter;
import org.broadinstitute.sting.gatk.filters.Platform454Filter;
import org.broadinstitute.sting.gatk.filters.PlatformUnitFilter;
import org.broadinstitute.sting.gatk.filters.PlatformUnitFilterHelper;
@@ -78,7 +78,7 @@ import java.util.*;
* if first bam has coverage at the site but no indication for an indel. In the --somatic mode, BED output contains
* only somatic calls, while --verbose output contains all calls annotated with GERMLINE/SOMATIC keywords.
*/
-@ReadFilters({Platform454Filter.class, MappingQualityZeroReadFilter.class, PlatformUnitFilter.class})
+@ReadFilters({Platform454Filter.class, MappingQualityZeroFilter.class, PlatformUnitFilter.class})
public class SomaticIndelDetectorWalker extends ReadWalker {
// @Output
// PrintStream out;
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java
index 34c7912d9..17a6e20f1 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java
@@ -31,7 +31,7 @@ import org.broadinstitute.sting.gatk.arguments.StandardVariantContextInputArgume
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
import org.broadinstitute.sting.gatk.datasources.sample.Sample;
-import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityZeroFilter;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.*;
import org.broadinstitute.sting.utils.BaseUtils;
@@ -91,7 +91,7 @@ import static org.broadinstitute.sting.utils.codecs.vcf.VCFUtils.getVCFHeadersFr
@By(DataSource.READS)
// Filter out all reads with zero mapping quality
-@ReadFilters({MappingQualityZeroReadFilter.class})
+@ReadFilters({MappingQualityZeroFilter.class})
public class ReadBackedPhasingWalker extends RodWalker {
private static final boolean DEBUG = false;
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
index 838842869..98c8950e3 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesWalker.java
@@ -29,8 +29,8 @@ import org.broad.tribble.Feature;
import org.broadinstitute.sting.commandline.*;
import org.broadinstitute.sting.gatk.contexts.AlignmentContext;
import org.broadinstitute.sting.gatk.contexts.ReferenceContext;
-import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter;
-import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableFilter;
+import org.broadinstitute.sting.gatk.filters.MappingQualityZeroFilter;
import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker;
import org.broadinstitute.sting.gatk.walkers.*;
import org.broadinstitute.sting.utils.BaseUtils;
@@ -97,7 +97,7 @@ import java.util.Map;
@BAQMode(ApplicationTime = BAQ.ApplicationTime.FORBIDDEN)
@By( DataSource.READS ) // Only look at covered loci, not every loci of the reference file
-@ReadFilters( {MappingQualityZeroReadFilter.class, MappingQualityUnavailableReadFilter.class} ) // Filter out all reads with zero or unavailable mapping quality
+@ReadFilters( {MappingQualityZeroFilter.class, MappingQualityUnavailableFilter.class} ) // Filter out all reads with zero or unavailable mapping quality
@Requires( {DataSource.READS, DataSource.REFERENCE, DataSource.REFERENCE_BASES} ) // This walker requires both -I input.bam and -R reference.fasta
@PartitionBy(PartitionType.LOCUS)
public class CountCovariatesWalker extends LocusWalker implements TreeReducible {
From 5fbdf968f7ebf396e74a5349ec3f66f472d5c070 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Thu, 18 Aug 2011 22:20:14 -0400
Subject: [PATCH 15/18] ArgumentSource no longer comparable. Arguments sorted
by GATKDoclet
---
.../sting/commandline/ArgumentSource.java | 7 +---
.../help/GenericDocumentationHandler.java | 42 +++++++++++++++----
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
index 3e149b0c6..8ec0d650a 100644
--- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
+++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentSource.java
@@ -39,7 +39,7 @@ import java.util.List;
* @author mhanna
* @version 0.1
*/
-public class ArgumentSource implements Comparable {
+public class ArgumentSource {
/**
* Field into which to inject command-line arguments.
*/
@@ -216,9 +216,4 @@ public class ArgumentSource implements Comparable {
public String toString() {
return field.getDeclaringClass().getSimpleName() + ": " + field.getName();
}
-
- @Override
- public int compareTo(final ArgumentSource argumentSource) {
- return field.getName().toLowerCase().compareTo(argumentSource.field.getName().toLowerCase());
- }
}
diff --git a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
index ff57bb744..d7add9af0 100644
--- a/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
+++ b/public/java/src/org/broadinstitute/sting/utils/help/GenericDocumentationHandler.java
@@ -111,16 +111,16 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
// attempt to instantiate the class
Object instance = makeInstanceIfPossible(toProcess.clazz);
- Map> args = new HashMap>();
+ Map>> args = new HashMap>>();
root.put("arguments", args);
- args.put("all", new ArrayList());
- args.put("required", new ArrayList());
- args.put("optional", new ArrayList());
- args.put("advanced", new ArrayList());
- args.put("hidden", new ArrayList());
- args.put("depreciated", new ArrayList());
+ args.put("all", new ArrayList>());
+ args.put("required", new ArrayList>());
+ args.put("optional", new ArrayList>());
+ args.put("advanced", new ArrayList>());
+ args.put("hidden", new ArrayList>());
+ args.put("depreciated", new ArrayList>());
try {
- for ( ArgumentSource argumentSource : new TreeSet(parsingEngine.extractArgumentSources(HelpUtils.getClassForDoc(classdoc))) ) {
+ for ( ArgumentSource argumentSource : parsingEngine.extractArgumentSources(HelpUtils.getClassForDoc(classdoc)) ) {
ArgumentDefinition argDef = argumentSource.createArgumentDefinitions().get(0);
FieldDoc fieldDoc = getFieldDoc(classdoc, argumentSource.field.getName());
Map argBindings = docForArgument(fieldDoc, argumentSource, argDef); // todo -- why can you have multiple ones?
@@ -155,11 +155,37 @@ public class GenericDocumentationHandler extends DocumentedGATKFeatureHandler {
logger.debug(String.format("Skipping hidden feature %s", argumentSource));
}
}
+
+ // sort the arguments
+ for (Map.Entry>> entry : args.entrySet()) {
+ entry.setValue(sortArguments(entry.getValue()));
+ }
} catch ( ClassNotFoundException e ) {
throw new RuntimeException(e);
}
}
+ private List> sortArguments(List> unsorted) {
+ Collections.sort(unsorted, new CompareArgumentsByName());
+ return unsorted;
+ }
+
+ private class CompareArgumentsByName implements Comparator> {
+ public int compare(Map x, Map y) {
+ return elt(x).compareTo(elt(y));
+ }
+
+ private String elt(Map m) {
+ String v = m.get("name").toString().toLowerCase();
+ if ( v.startsWith("--") )
+ return v.substring(2);
+ else if ( v.startsWith("-") )
+ return v.substring(1);
+ else
+ throw new RuntimeException("Expect to see arguments beginning with at least one -, but found " + v);
+ }
+ }
+
private Object getFieldValue(Class c, Object instance, String fieldName) {
Field field = JVMUtils.findField(c, fieldName);
if ( field != null ) {
From 40e67cff1b802e0ca0fc6b2237ff96a630c35466 Mon Sep 17 00:00:00 2001
From: Eric Banks
Date: Thu, 18 Aug 2011 22:27:34 -0400
Subject: [PATCH 16/18] I like the @Advanced annotation
---
.../sting/gatk/walkers/indels/IndelRealigner.java | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/IndelRealigner.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/IndelRealigner.java
index d766ae8bd..5c091c641 100755
--- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/IndelRealigner.java
+++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/IndelRealigner.java
@@ -178,6 +178,7 @@ public class IndelRealigner extends ReadWalker {
* will only proceed with the realignment (even above the given threshold) if it minimizes entropy among the reads (and doesn't simply
* push the mismatch column to another position). This parameter is just a heuristic and should be adjusted based on your particular data set.
*/
+ @Advanced
@Argument(fullName="entropyThreshold", shortName="entropy", doc="percentage of mismatches at a locus to be considered having high entropy", required=false)
protected double MISMATCH_THRESHOLD = 0.15;
@@ -185,30 +186,35 @@ public class IndelRealigner extends ReadWalker {
* For expert users only! To minimize memory consumption you can lower this number (but then the tool may skip realignment on regions with too much coverage;
* and if the number is too low, it may generate errors during realignment). Just make sure to give Java enough memory! 4Gb should be enough with the default value.
*/
+ @Advanced
@Argument(fullName="maxReadsInMemory", shortName="maxInMemory", doc="max reads allowed to be kept in memory at a time by the SAMFileWriter", required=false)
protected int MAX_RECORDS_IN_MEMORY = 150000;
/**
* For expert users only!
*/
+ @Advanced
@Argument(fullName="maxIsizeForMovement", shortName="maxIsize", doc="maximum insert size of read pairs that we attempt to realign", required=false)
protected int MAX_ISIZE_FOR_MOVEMENT = 3000;
/**
* For expert users only!
*/
+ @Advanced
@Argument(fullName="maxPositionalMoveAllowed", shortName="maxPosMove", doc="maximum positional move in basepairs that a read can be adjusted during realignment", required=false)
protected int MAX_POS_MOVE_ALLOWED = 200;
/**
* For expert users only! If you need to find the optimal solution regardless of running time, use a higher number.
*/
+ @Advanced
@Argument(fullName="maxConsensuses", shortName="maxConsensuses", doc="max alternate consensuses to try (necessary to improve performance in deep coverage)", required=false)
protected int MAX_CONSENSUSES = 30;
/**
* For expert users only! If you need to find the optimal solution regardless of running time, use a higher number.
*/
+ @Advanced
@Argument(fullName="maxReadsForConsensuses", shortName="greedy", doc="max reads used for finding the alternate consensuses (necessary to improve performance in deep coverage)", required=false)
protected int MAX_READS_FOR_CONSENSUSES = 120;
@@ -216,9 +222,11 @@ public class IndelRealigner extends ReadWalker {
* For expert users only! If this value is exceeded at a given interval, realignment is not attempted and the reads are passed to the output file(s) as-is.
* If you need to allow more reads (e.g. with very deep coverage) regardless of memory, use a higher number.
*/
+ @Advanced
@Argument(fullName="maxReadsForRealignment", shortName="maxReads", doc="max reads allowed at an interval for realignment", required=false)
protected int MAX_READS = 20000;
+ @Advanced
@Argument(fullName="noOriginalAlignmentTags", shortName="noTags", required=false, doc="Don't output the original cigar or alignment start tags for each realigned read in the output bam")
protected boolean NO_ORIGINAL_ALIGNMENT_TAGS = false;
@@ -226,6 +234,7 @@ public class IndelRealigner extends ReadWalker {
* For expert users only! This tool assumes that the target interval list is sorted; if the list turns out to be unsorted, it will throw an exception.
* Use this argument when your interval list is not sorted to instruct the Realigner to first sort it in memory.
*/
+ @Advanced
@Argument(fullName="targetIntervalsAreNotSorted", shortName="targetNotSorted", required=false, doc="The target intervals are not sorted")
protected boolean TARGET_NOT_SORTED = false;
From a5e279d697e481600d966211f4c97a16cb973f39 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Fri, 19 Aug 2011 09:05:11 -0400
Subject: [PATCH 17/18] Dynamic typing of vcf.gz files
-- CombineVariantsIntegrationTests now use dynamic typing of vcf.gz files
-- FeatureManagerUnitTests tests for correctness.
---
.../tracks/FeatureManagerUnitTest.java | 7 ++--
.../CombineVariantsIntegrationTest.java | 34 +++++++++----------
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/public/java/test/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManagerUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManagerUnitTest.java
index 90262b9c1..bae8e99ed 100644
--- a/public/java/test/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManagerUnitTest.java
+++ b/public/java/test/org/broadinstitute/sting/gatk/refdata/tracks/FeatureManagerUnitTest.java
@@ -54,7 +54,8 @@ import java.util.*;
public class FeatureManagerUnitTest extends BaseTest {
private static final File RANDOM_FILE = new File(validationDataLocation + "exampleGATKReport.eval");
private static final File VCF3_FILE = new File(validationDataLocation + "vcfexample3.vcf");
- private static final File VCF4_FILE = new File(validationDataLocation + "vcf4.1.example.vcf");
+ private static final File VCF4_FILE = new File(testDir + "HiSeq.10000.vcf");
+ private static final File VCF4_FILE_GZ = new File(testDir + "HiSeq.10000.vcf.gz");
private FeatureManager manager;
private GenomeLocParser genomeLocParser;
@@ -98,7 +99,8 @@ public class FeatureManagerUnitTest extends BaseTest {
}
public String toString() {
- return String.format("FMTest name=%s codec=%s feature=%s file=%s", name, codec, feature, associatedFile);
+ return String.format("FMTest name=%s codec=%s feature=%s file=%s",
+ name, codec.getSimpleName(), feature.getSimpleName(), associatedFile);
}
}
@@ -106,6 +108,7 @@ public class FeatureManagerUnitTest extends BaseTest {
public Object[][] createTests() {
new FMTest(VariantContext.class, VCF3Codec.class, "VCF3", VCF3_FILE);
new FMTest(VariantContext.class, VCFCodec.class, "VCF", VCF4_FILE);
+ new FMTest(VariantContext.class, VCFCodec.class, "VCF", VCF4_FILE_GZ);
new FMTest(TableFeature.class, BedTableCodec.class, "bedtable", null);
return FMTest.getTests(FMTest.class);
}
diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariantsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariantsIntegrationTest.java
index 4abf0a102..3267173a7 100755
--- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariantsIntegrationTest.java
+++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariantsIntegrationTest.java
@@ -38,21 +38,21 @@ public class CombineVariantsIntegrationTest extends WalkerTest {
return "-T CombineVariants -NO_HEADER -L 1:1-50,000,000 -o %s -R " + b36KGReference + args;
}
- public void test1InOut(String file, String md5, boolean vcf3) {
- test1InOut(file, md5, "", vcf3);
+ public void test1InOut(String file, String md5) {
+ test1InOut(file, md5, "");
}
- public void test1InOut(String file, String md5, String args, boolean vcf3) {
+ public void test1InOut(String file, String md5, String args) {
WalkerTestSpec spec = new WalkerTestSpec(
- baseTestString(" -priority v1 -V:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file + args),
+ baseTestString(" -priority v1 -V:v1 " + validationDataLocation + file + args),
1,
Arrays.asList(md5));
executeTest("testInOut1--" + file, spec);
}
- public void combine2(String file1, String file2, String args, String md5, boolean vcf3) {
+ public void combine2(String file1, String file2, String args, String md5) {
WalkerTestSpec spec = new WalkerTestSpec(
- baseTestString(" -priority v1,v2 -V:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file1 + " -V:v2,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file2 + args),
+ baseTestString(" -priority v1,v2 -V:v1 " + validationDataLocation + file1 + " -V:v2 "+ validationDataLocation + file2 + args),
1,
Arrays.asList(md5));
executeTest("combine2 1:" + new File(file1).getName() + " 2:" + new File(file2).getName(), spec);
@@ -78,23 +78,23 @@ public class CombineVariantsIntegrationTest extends WalkerTest {
executeTest("combine PLs 1:" + new File(file1).getName() + " 2:" + new File(file2).getName(), spec);
}
- @Test public void test1SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "c608b9fc1e36dba6cebb4f259883f9f0", true); }
- @Test public void test2SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "20caad94411d6ab48153b214de916df8", " -setKey foo", true); }
- @Test public void test3SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "004f3065cb1bc2ce2f9afd695caf0b48", " -setKey null", true); }
- @Test public void testOfficialCEUPilotCalls() { test1InOut("CEU.trio.2010_03.genotypes.vcf.gz", "c9c901ff9ef2a982624b203a8086dff0", false); } // official project VCF files in tabix format
+ @Test public void test1SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "c608b9fc1e36dba6cebb4f259883f9f0"); }
+ @Test public void test2SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "20caad94411d6ab48153b214de916df8", " -setKey foo"); }
+ @Test public void test3SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "004f3065cb1bc2ce2f9afd695caf0b48", " -setKey null"); }
+ @Test public void testOfficialCEUPilotCalls() { test1InOut("CEU.trio.2010_03.genotypes.vcf.gz", "c9c901ff9ef2a982624b203a8086dff0"); } // official project VCF files in tabix format
- @Test public void test1Indel1() { test1InOut("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "7593be578d4274d672fc22fced38012b", false); }
- @Test public void test1Indel2() { test1InOut("CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "1cd467863c4e948fadd970681552d57e", false); }
+ @Test public void test1Indel1() { test1InOut("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "7593be578d4274d672fc22fced38012b"); }
+ @Test public void test1Indel2() { test1InOut("CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "1cd467863c4e948fadd970681552d57e"); }
@Test public void combineWithPLs() { combinePLs("combine.3.vcf", "combine.4.vcf", "0f873fed02aa99db5b140bcd6282c10a"); }
- @Test public void combineTrioCalls() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", "", "1d5a021387a8a86554db45a29f66140f", false); } // official project VCF files in tabix format
- @Test public void combineTrioCallsMin() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", " -minimalVCF", "20163d60f18a46496f6da744ab5cc0f9", false); } // official project VCF files in tabix format
- @Test public void combine2Indels() { combine2("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "f1cf095c2fe9641b7ca1f8ee2c46fd4a", false); }
+ @Test public void combineTrioCalls() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", "", "1d5a021387a8a86554db45a29f66140f"); } // official project VCF files in tabix format
+ @Test public void combineTrioCallsMin() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", " -minimalVCF", "20163d60f18a46496f6da744ab5cc0f9"); } // official project VCF files in tabix format
+ @Test public void combine2Indels() { combine2("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "f1cf095c2fe9641b7ca1f8ee2c46fd4a"); }
- @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "e144b6283765494bfe8189ac59965083", false); }
+ @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "e144b6283765494bfe8189ac59965083"); }
- @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c", true); }
+ @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c"); }
@Test public void omniHM3Union() { combineSites(" -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED", "4836086891f6cbdd40eebef3076d215a"); }
@Test public void omniHM3Intersect() { combineSites(" -filteredRecordsMergeType KEEP_IF_ALL_UNFILTERED", "6a34b5d743efda8b2f3b639f3a2f5de8"); }
From bc902e8421ea948d727ad5fc6656c9d00eb96422 Mon Sep 17 00:00:00 2001
From: Mark DePristo
Date: Fri, 19 Aug 2011 09:05:39 -0400
Subject: [PATCH 18/18] GZIP VCF for testing
---
public/testdata/HiSeq.10000.vcf.gz | Bin 0 -> 484811 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 public/testdata/HiSeq.10000.vcf.gz
diff --git a/public/testdata/HiSeq.10000.vcf.gz b/public/testdata/HiSeq.10000.vcf.gz
new file mode 100644
index 0000000000000000000000000000000000000000..15e91010c67ae3eafe6d4f3c014c1d28b9382335
GIT binary patch
literal 484811
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