From e91ae6b2659e13442627e85038991b40ffe4d16b Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 29 Jun 2011 15:00:26 -0400 Subject: [PATCH 002/214] AF matching when selecting random variants --- .../walkers/variantutils/SelectVariants.java | 69 +++++++++++++++++-- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 963aa0ce5..4916c4ac4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -24,14 +24,12 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.variantcontext.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.MendelianViolation; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -42,9 +40,10 @@ import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.apache.log4j.Logger; import java.io.File; +import java.lang.annotation.AnnotationFormatError; import java.util.*; /** @@ -75,12 +74,24 @@ public class SelectVariants extends RodWalker { @Argument(fullName="excludeFiltered", shortName="ef", doc="Don't include filtered loci in the analysis.", required=false) private boolean EXCLUDE_FILTERED = false; + @Argument(fullName="keepOriginalAC", shortName="keepOriginalAC", doc="Don't include filtered loci.", required=false) + private boolean KEEP_ORIGINAL_CHR_COUNTS = false; + @Argument(fullName="discordance", shortName = "disc", doc="Output variants that were not called on a ROD comparison track. Use -disc ROD_NAME", required=false) private String discordanceRodName = ""; @Argument(fullName="concordance", shortName = "conc", doc="Output variants that were also called on a ROD comparison track. Use -conc ROD_NAME", required=false) private String concordanceRodName = ""; + @Hidden + @Argument(fullName="inputAF", shortName = "inputAF", doc="", required=false) + private String inputAFRodName = ""; + + @Hidden + @Argument(fullName="keepAFSpectrum", shortName="keepAF", doc="Don't include loci found to be non-variant after the subsetting procedure.", required=false) + private boolean KEEP_AF_SPECTRUM = false; + + @Argument(fullName="family_structure", shortName="family", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) private String FAMILY_STRUCTURE = ""; @@ -178,6 +189,12 @@ public class SelectVariants extends RodWalker { // Initialize VCF header Set headerLines = VCFUtils.smartMergeHeaders(vcfRods.values(), logger); headerLines.add(new VCFHeaderLine("source", "SelectVariants")); + + if (KEEP_ORIGINAL_CHR_COUNTS) { + headerLines.add(new VCFFormatHeaderLine("AC_Orig", 1, VCFHeaderLineType.Integer, "Original AC")); + headerLines.add(new VCFFormatHeaderLine("AF_Orig", 1, VCFHeaderLineType.Float, "Original AF")); + headerLines.add(new VCFFormatHeaderLine("AN_Orig", 1, VCFHeaderLineType.Integer, "Original AN")); + } vcfWriter.writeHeader(new VCFHeader(headerLines, samples)); for (int i = 0; i < SELECT_EXPRESSIONS.size(); i++) { @@ -269,6 +286,38 @@ public class SelectVariants extends RodWalker { else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom) { vcfWriter.add(sub, ref.getBase()); } + else { + if (SELECT_RANDOM_FRACTION && KEEP_AF_SPECTRUM ) { + Collection compVCs = tracker.getVariantContexts(ref, inputAFRodName, null, context.getLocation(), true, false); + if (compVCs.isEmpty()) + return 0; + + // ok we have a comp VC and we need to match the AF spectrum of inputAFRodName. + // We then pick a variant with probablity AF*desiredFraction + for (VariantContext compVC : compVCs) { + if ( compVC.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + String afo = compVC.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); + + double af; + if (afo.contains(",")) { + String[] afs = afo.split(","); + afs[0] = afs[0].substring(1,afs[0].length()); + afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); + af = Double.valueOf(afs[0]); + + } + else + af = Double.valueOf(afo); + + System.out.format("%s .. %4.1f\n",afo.toString(), af); + if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af) + vcfWriter.add(sub, ref.getBase()); + } + break; // do only one vc + } + + } + } } } @@ -413,6 +462,16 @@ public class SelectVariants extends RodWalker { } + if (KEEP_ORIGINAL_CHR_COUNTS) { + if ( attributes.containsKey(VCFConstants.ALLELE_COUNT_KEY) ) + attributes.put("AC_Orig",attributes.get(VCFConstants.ALLELE_COUNT_KEY)); + if ( attributes.containsKey(VCFConstants.ALLELE_FREQUENCY_KEY) ) + attributes.put("AF_Orig",attributes.get(VCFConstants.ALLELE_FREQUENCY_KEY)); + if ( attributes.containsKey(VCFConstants.ALLELE_NUMBER_KEY) ) + attributes.put("AN_Orig",attributes.get(VCFConstants.ALLELE_NUMBER_KEY)); + + } + VariantContextUtils.calculateChromosomeCounts(sub,attributes,false); attributes.put("DP", depth); From dc4f63a1a819a71815df2748a27528516176bd4f Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 29 Jun 2011 16:00:23 -0400 Subject: [PATCH 004/214] a) consensus goes to week queue b) New experimental TechnologyComposition annotation c) SelectVariants fixes --- .../annotator/TechnologyComposition.java | 77 +++++++++++++++++++ .../walkers/variantutils/SelectVariants.java | 12 ++- 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100755 public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java new file mode 100755 index 000000000..351117809 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java @@ -0,0 +1,77 @@ +package org.broadinstitute.sting.gatk.walkers.annotator; + +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.IndelUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.sam.ReadUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.util.*; + +/** + * Created by IntelliJ IDEA. + * User: delangel + * Date: 6/29/11 + * Time: 3:14 PM + * To change this template use File | Settings | File Templates. + */ +public class TechnologyComposition implements ExperimentalAnnotation,InfoFieldAnnotation { + private String nSLX = "NumSLX"; + private String n454 ="Num454"; + private String nSolid = "NumSOLiD"; + private String nOther = "NumOther"; + public Map annotate(RefMetaDataTracker tracker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { + if ( stratifiedContexts.size() == 0 ) + return null; + + int readsIllumina = 0; + int readsSolid = 0; + int reads454 = 0; + int readsOther = 0; + + for ( Map.Entry sample : stratifiedContexts.entrySet() ) { + AlignmentContext context = sample.getValue(); + + ReadBackedPileup pileup = null; + if (context.hasExtendedEventPileup()) + pileup = context.getExtendedEventPileup(); + else if (context.hasBasePileup()) + pileup = context.getBasePileup(); + + if (pileup != null) { + for (PileupElement p : pileup ) { + if(ReadUtils.is454Read(p.getRead())) + reads454++; + else if (ReadUtils.isSOLiDRead(p.getRead())) + readsSolid++; + else if (ReadUtils.isSLXRead(p.getRead())) + readsIllumina++; + else + readsOther++; + } + } + } + + Map map = new HashMap(); + map.put(nSLX, String.format("%d", readsIllumina)); + map.put(n454, String.format("%d", reads454)); + map.put(nSolid, String.format("%d", readsSolid)); + map.put(nOther, String.format("%d", readsOther)); + return map; + } + + public List getKeyNames() { return Arrays.asList(nSLX,n454,nSolid,nOther); } + + public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine(nSLX, 1, VCFHeaderLineType.Integer, "Number of SLX reads"), + new VCFInfoHeaderLine(n454, 1, VCFHeaderLineType.Integer, "Number of 454 reads"), + new VCFInfoHeaderLine(nSolid, 1, VCFHeaderLineType.Integer, "Number of SOLiD reads"), + new VCFInfoHeaderLine(nOther, 1, VCFHeaderLineType.Integer, "Number of Other technology reads")); } + +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 4916c4ac4..cbac54326 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.variantcontext.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; @@ -303,13 +304,20 @@ public class SelectVariants extends RodWalker { String[] afs = afo.split(","); afs[0] = afs[0].substring(1,afs[0].length()); afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); - af = Double.valueOf(afs[0]); + + double[] afd = new double[afs.length]; + + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); + + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); } else af = Double.valueOf(afo); - System.out.format("%s .. %4.1f\n",afo.toString(), af); + //System.out.format("%s .. %4.4f\n",afo.toString(), af); if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af) vcfWriter.add(sub, ref.getBase()); } From 2b88033ef4ab4501b5b78ae2d13b78d46c082a62 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 29 Jun 2011 16:12:55 -0400 Subject: [PATCH 005/214] Enable considering 454 reads, just lower GOP by 15 --- .../IndelGenotypeLikelihoodsCalculationModel.java | 4 ++-- .../gatk/walkers/indels/PairHMMIndelErrorModel.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java index 1f430548b..62f6ff5a6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java @@ -157,10 +157,10 @@ public class IndelGenotypeLikelihoodsCalculationModel extends GenotypeLikelihood GATKSAMRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); if (read == null) continue; - if(ReadUtils.is454Read(read)) { + /* if(ReadUtils.is454Read(read)) { continue; } - + */ if (DEBUG && p.isIndel()) { System.out.format("Read: %s, cigar: %s, aln start: %d, aln end: %d, p.len:%d, Type:%s, EventBases:%s\n", read.getReadName(),read.getCigar().toString(),read.getAlignmentStart(),read.getAlignmentEnd(), diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java index e7b9cfa68..419ae694f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java @@ -105,6 +105,7 @@ public class PairHMMIndelErrorModel { private static final double MIN_GAP_CONT_PENALTY = 10.0; private static final double GAP_PENALTY_HRUN_STEP = 1.0; // each increase in hrun decreases gap penalty by this. + private static final double GOP_454_DELTA = 15.0; // lower gap penalty for 454 reads private boolean doViterbi = false; @@ -771,10 +772,10 @@ public class PairHMMIndelErrorModel { if (read == null) continue; - if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { + /* if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { continue; } - + */ double[] recalQuals = null; /* @@ -990,6 +991,10 @@ public class PairHMMIndelErrorModel { } else { currentContextGOP = Arrays.copyOfRange(gapOpenProbabilityMap.get(a), (int)indStart, (int)indStop); currentContextGCP = Arrays.copyOfRange(gapContProbabilityMap.get(a), (int)indStart, (int)indStop); + if(ReadUtils.is454Read(read)) { + for (int k=0; k Date: Wed, 29 Jun 2011 21:33:41 -0400 Subject: [PATCH 007/214] VariantsToTableFix --- .../walkers/variantutils/VariantsToTable.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 71dd5df3f..079fc7aba 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -24,6 +24,7 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; @@ -169,6 +170,30 @@ public class VariantsToTable extends RodWalker { throw new UserException(String.format("Missing field %s in vc %s at %s", field, vc.getSource(), vc)); } + if (field.equals("AF")) { + String afo = val; + + double af; + if (afo.contains(",")) { + String[] afs = afo.split(","); + afs[0] = afs[0].substring(1,afs[0].length()); + afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); + + double[] afd = new double[afs.length]; + + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); + + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); + + } + else + af = Double.valueOf(afo); + + val = Double.toString(af); + + } vals.add(val); } From 50c32ce52e85a05fe252058e8ec72495b79adfe6 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 29 Jun 2011 21:39:53 -0400 Subject: [PATCH 008/214] VariantsToTableFix --- .../sting/gatk/walkers/variantutils/VariantsToTable.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 079fc7aba..2111b0959 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -173,7 +173,7 @@ public class VariantsToTable extends RodWalker { if (field.equals("AF")) { String afo = val; - double af; + double af=0; if (afo.contains(",")) { String[] afs = afo.split(","); afs[0] = afs[0].substring(1,afs[0].length()); @@ -189,7 +189,8 @@ public class VariantsToTable extends RodWalker { } else - af = Double.valueOf(afo); + if (!afo.equals("NA")) + af = Double.valueOf(afo); val = Double.toString(af); From 0c9105ca221508c5205f61ee23d5fe779936c513 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Fri, 1 Jul 2011 18:07:35 -0400 Subject: [PATCH 014/214] Minor fix of description --- .../org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java index 33069f1f5..f23433bb5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java @@ -42,5 +42,5 @@ public class LowMQ implements InfoFieldAnnotation { public List getKeyNames() { return Arrays.asList("LowMQ"); } - public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine(getKeyNames().get(0), 3, VCFHeaderLineType.Integer, "3-tuple: ,,")); } + public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine(getKeyNames().get(0), 3, VCFHeaderLineType.Float, "3-tuple: ,,")); } } From 17ff5bb09436b8805657859b787f4f7f8714cc08 Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Sat, 2 Jul 2011 09:55:35 -0400 Subject: [PATCH 016/214] Variant records coming out of the VQSR are now annotated with which input annotation was most divergent from the Gaussian mixture model. This gives a general sense for why each variant was removed from the callset. --- .../ApplyRecalibration.java | 8 +++++++- .../GaussianMixtureModel.java | 13 +++++++++++++ .../VariantDataManager.java | 4 +++- .../variantrecalibration/VariantDatum.java | 1 + .../VariantRecalibrator.java | 2 ++ .../VariantRecalibratorEngine.java | 17 +++++++++++++++++ ...iantRecalibrationWalkersIntegrationTest.java | 4 ++-- 7 files changed, 45 insertions(+), 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java index 9877781d1..02d850211 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java @@ -55,7 +55,6 @@ import java.util.*; public class ApplyRecalibration extends RodWalker { - ///////////////////////////// // Inputs ///////////////////////////// @@ -86,6 +85,7 @@ public class ApplyRecalibration extends RodWalker { final private List tranches = new ArrayList(); final private Set inputNames = new HashSet(); final private NestedHashMap lodMap = new NestedHashMap(); + final private NestedHashMap annotationMap = new NestedHashMap(); final private Set ignoreInputFilterSet = new TreeSet(); //--------------------------------------------------------------------------------------------------------------- @@ -124,6 +124,7 @@ public class ApplyRecalibration extends RodWalker { final Set hInfo = new HashSet(); hInfo.addAll(VCFUtils.getHeaderFields(getToolkit(), inputNames)); hInfo.add(new VCFInfoHeaderLine(VariantRecalibrator.VQS_LOD_KEY, 1, VCFHeaderLineType.Float, "Log odds ratio of being a true variant versus being false under the trained gaussian mixture model")); + hInfo.add(new VCFInfoHeaderLine(VariantRecalibrator.CULPRIT_KEY, 1, VCFHeaderLineType.String, "The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out")); final TreeSet samples = new TreeSet(); samples.addAll(SampleUtils.getUniqueSamplesFromRods(getToolkit(), inputNames)); @@ -149,6 +150,7 @@ public class ApplyRecalibration extends RodWalker { for ( final String line : new XReadLines( RECAL_FILE ) ) { final String[] vals = line.split(","); lodMap.put( Double.parseDouble(vals[3]), vals[0], Integer.parseInt(vals[1]), Integer.parseInt(vals[2]) ); // value comes before the keys + annotationMap.put( vals[4], vals[0], Integer.parseInt(vals[1]), Integer.parseInt(vals[2]) ); // value comes before the keys } } catch ( FileNotFoundException e ) { throw new UserException.CouldNotReadInputFile(RECAL_FILE, e); @@ -174,11 +176,15 @@ public class ApplyRecalibration extends RodWalker { String filterString = null; final Map attrs = new HashMap(vc.getAttributes()); final Double lod = (Double) lodMap.get( vc.getChr(), vc.getStart(), vc.getEnd() ); + final String worstAnnotation = (String) annotationMap.get( vc.getChr(), vc.getStart(), vc.getEnd() ); if( lod == null ) { throw new UserException("Encountered input variant which isn't found in the input recal file. Please make sure VariantRecalibrator and ApplyRecalibration were run on the same set of input variants. First seen at: " + vc ); } + // Annotate the new record with its VQSLOD and the worst performing annotation attrs.put(VariantRecalibrator.VQS_LOD_KEY, String.format("%.4f", lod)); + attrs.put(VariantRecalibrator.CULPRIT_KEY, worstAnnotation); + for( int i = tranches.size() - 1; i >= 0; i-- ) { final Tranche tranche = tranches.get(i); if( lod >= tranche.minVQSLod ) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java index 9ffe7be7a..a09a30145 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java @@ -190,6 +190,19 @@ public class GaussianMixtureModel { return MathUtils.log10sumLog10(pVarInGaussianLog10); // Sum(pi_k * p(v|n,k)) } + public Double evaluateDatumInOneDimension( final VariantDatum datum, final int iii ) { + if(datum.isNull[iii]) { return null; } + + final Normal normal = new Normal(0.0, 1.0, null); + final double[] pVarInGaussianLog10 = new double[gaussians.size()]; + int gaussianIndex = 0; + for( final MultivariateGaussian gaussian : gaussians ) { + normal.setState( gaussian.mu[iii], gaussian.sigma.get(iii, iii) ); + pVarInGaussianLog10[gaussianIndex++] = gaussian.pMixtureLog10 + Math.log10( normal.pdf( datum.annotations[iii] ) ); + } + return MathUtils.log10sumLog10(pVarInGaussianLog10); // Sum(pi_k * p(v|n,k)) + } + public double evaluateDatumMarginalized( final VariantDatum datum ) { int numVals = 0; double sumPVarInGaussian = 0.0; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index 2fd1326fe..efff5b780 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -254,7 +254,9 @@ public class VariantDataManager { public void writeOutRecalibrationTable( final PrintStream RECAL_FILE ) { for( final VariantDatum datum : data ) { - RECAL_FILE.println(String.format("%s,%d,%d,%.4f", datum.contig, datum.start, datum.stop, datum.lod)); + RECAL_FILE.println(String.format("%s,%d,%d,%.4f,%s", + datum.contig, datum.start, datum.stop, datum.lod, + (datum.worstAnnotation != -1 ? annotationKeys.get(datum.worstAnnotation) : "NULL"))); } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java index ac875b645..38e2affb6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java @@ -24,6 +24,7 @@ public class VariantDatum implements Comparable { public String contig; public int start; public int stop; + public int worstAnnotation; public MultivariateGaussian assignment; // used in K-means implementation public int compareTo( final VariantDatum other ) { 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 e651b62e0..b5fda4443 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 @@ -60,6 +60,7 @@ import java.util.*; public class VariantRecalibrator extends RodWalker, ExpandingArrayList> implements TreeReducible> { public static final String VQS_LOD_KEY = "VQSLOD"; + public static final String CULPRIT_KEY = "culprit"; @ArgumentCollection private VariantRecalibratorArgumentCollection VRAC = new VariantRecalibratorArgumentCollection(); @@ -232,6 +233,7 @@ public class VariantRecalibrator extends RodWalker randomData = dataManager.getRandomDataForPlotting( 6000 ); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorEngine.java index a0fbc572d..81e4d190c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorEngine.java @@ -57,6 +57,23 @@ public class VariantRecalibratorEngine { } } + public void calculateWorstPerformingAnnotation( final List data, final GaussianMixtureModel goodModel, final GaussianMixtureModel badModel ) { + for( final VariantDatum datum : data ) { + int worstAnnotation = -1; + double minProb = Double.MAX_VALUE; + for( int iii = 0; iii < datum.annotations.length; iii++ ) { + final Double goodProbLog10 = goodModel.evaluateDatumInOneDimension(datum, iii); + final Double badProbLog10 = badModel.evaluateDatumInOneDimension(datum, iii); + if( goodProbLog10 != null && badProbLog10 != null ) { + final double prob = goodProbLog10 - badProbLog10; + if(prob < minProb) { minProb = prob; worstAnnotation = iii; } + } + } + datum.worstAnnotation = worstAnnotation; + } + } + + ///////////////////////////// // Private Methods used for generating a GaussianMixtureModel ///////////////////////////// diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java index eb6a1a4c6..9600046da 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java @@ -26,8 +26,8 @@ public class VariantRecalibrationWalkersIntegrationTest extends WalkerTest { VRTest lowPass = new VRTest("phase1.projectConsensus.chr20.raw.snps.vcf", "d33212a84368e821cbedecd4f59756d6", // tranches - "a35cd067f378442eee8cd5edeea92be0", // recal file - "126d52843f4a57199ee97750ffc16a07"); // cut VCF + "4652dca41222bebdf9d9fda343b2a835", // recal file + "5350b1a4c1250cf3b77ca45327c04711"); // cut VCF @DataProvider(name = "VRTest") public Object[][] createData1() { From 09af6bbc6c548082edc09883980e12e5d72fbfa4 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Sat, 2 Jul 2011 16:58:57 -0400 Subject: [PATCH 018/214] Ugh - backed out experimental code not for public consumption unintendedly committed --- .../IndelGenotypeLikelihoodsCalculationModel.java | 4 ++-- .../gatk/walkers/indels/PairHMMIndelErrorModel.java | 9 ++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java index 62f6ff5a6..1f430548b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java @@ -157,10 +157,10 @@ public class IndelGenotypeLikelihoodsCalculationModel extends GenotypeLikelihood GATKSAMRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); if (read == null) continue; - /* if(ReadUtils.is454Read(read)) { + if(ReadUtils.is454Read(read)) { continue; } - */ + if (DEBUG && p.isIndel()) { System.out.format("Read: %s, cigar: %s, aln start: %d, aln end: %d, p.len:%d, Type:%s, EventBases:%s\n", read.getReadName(),read.getCigar().toString(),read.getAlignmentStart(),read.getAlignmentEnd(), diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java index 5c1f57bc7..ab7ae4184 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java @@ -105,7 +105,6 @@ public class PairHMMIndelErrorModel { private static final double MIN_GAP_CONT_PENALTY = 10.0; private static final double GAP_PENALTY_HRUN_STEP = 1.0; // each increase in hrun decreases gap penalty by this. - private static final double GOP_454_DELTA = 15.0; // lower gap penalty for 454 reads private boolean doViterbi = false; @@ -772,10 +771,10 @@ public class PairHMMIndelErrorModel { if (read == null) continue; - /* if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { + if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { continue; } - */ + double[] recalQuals = null; /* @@ -991,10 +990,6 @@ public class PairHMMIndelErrorModel { } else { currentContextGOP = Arrays.copyOfRange(gapOpenProbabilityMap.get(a), (int)indStart, (int)indStop); currentContextGCP = Arrays.copyOfRange(gapContProbabilityMap.get(a), (int)indStart, (int)indStop); - if(ReadUtils.is454Read(read)) { - for (int k=0; k Date: Sat, 2 Jul 2011 17:15:13 -0400 Subject: [PATCH 019/214] Adding ability to specify in VQSR a list of bad sites to use when training the negative model. Just add bad=true to the list of rod tags for your bad sites track. --- .../variantrecalibration/TrainingSet.java | 12 ++++- .../VariantDataManager.java | 44 ++++++++++++------- .../variantrecalibration/VariantDatum.java | 2 +- .../VariantRecalibrator.java | 4 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/TrainingSet.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/TrainingSet.java index f3677421e..9bbcf395a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/TrainingSet.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/TrainingSet.java @@ -14,6 +14,7 @@ public class TrainingSet { public String name; public boolean isKnown = false; public boolean isTraining = false; + public boolean isAntiTraining = false; public boolean isTruth = false; public boolean isConsensus = false; public double prior = 0.0; @@ -22,17 +23,24 @@ public class TrainingSet { public TrainingSet( final String name, final Tags tags ) { this.name = name; + + // Parse the tags to decide which tracks have which properties if( tags != null ) { isKnown = tags.containsKey("known") && tags.getValue("known").equals("true"); isTraining = tags.containsKey("training") && tags.getValue("training").equals("true"); + isAntiTraining = tags.containsKey("bad") && tags.getValue("bad").equals("true"); isTruth = tags.containsKey("truth") && tags.getValue("truth").equals("true"); isConsensus = tags.containsKey("consensus") && tags.getValue("consensus").equals("true"); prior = ( tags.containsKey("prior") ? Double.parseDouble(tags.getValue("prior")) : prior ); } - if( !isConsensus ) { + + // Report back to the user which tracks were found and the properties that were detected + if( !isConsensus && !isAntiTraining ) { logger.info( String.format( "Found %s track: \tKnown = %s \tTraining = %s \tTruth = %s \tPrior = Q%.1f", this.name, isKnown, isTraining, isTruth, prior) ); - } else { + } else if( isConsensus ) { logger.info( String.format( "Found consensus track: %s", this.name) ); + } else { + logger.info( String.format( "Found bad sites training track: %s", this.name) ); } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index efff5b780..cd739f9fc 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -84,7 +84,6 @@ public class VariantDataManager { remove = remove || (Math.abs(val) > VRAC.STD_THRESHOLD); } datum.failingSTDThreshold = remove; - datum.usedForTraining = 0; } } @@ -118,38 +117,47 @@ public class VariantDataManager { for( final VariantDatum datum : data ) { if( datum.atTrainingSite && !datum.failingSTDThreshold && datum.originalQual > VRAC.QUAL_THRESHOLD ) { trainingData.add( datum ); - datum.usedForTraining = 1; } } logger.info( "Training with " + trainingData.size() + " variants after standard deviation thresholding." ); if( trainingData.size() < VRAC.MIN_NUM_BAD_VARIANTS ) { - logger.warn("WARNING: Training with very few variant sites! Please check the model reporting PDF to ensure the quality of the model is reliable."); + logger.warn( "WARNING: Training with very few variant sites! Please check the model reporting PDF to ensure the quality of the model is reliable." ); } return trainingData; } public ExpandingArrayList selectWorstVariants( double bottomPercentage, final int minimumNumber ) { - Collections.sort( data ); + // The return value is the list of training variants final ExpandingArrayList trainingData = new ExpandingArrayList(); - final int numToAdd = Math.max( minimumNumber, Math.round((float)bottomPercentage * data.size()) ); - if( numToAdd > data.size() ) { - throw new UserException.BadInput("Error during negative model training. Minimum number of variants to use in training is larger than the whole call set. One can attempt to lower the --minNumBadVariants arugment but this is unsafe."); + + // First add to the training list all sites overlapping any bad sites training tracks + for( final VariantDatum datum : data ) { + if( datum.atAntiTrainingSite && !datum.failingSTDThreshold && !Double.isInfinite(datum.lod) ) { + trainingData.add( datum ); + } } - if( numToAdd == minimumNumber ) { - logger.warn("WARNING: Training with very few variant sites! Please check the model reporting PDF to ensure the quality of the model is reliable."); + final int numBadSitesAdded = trainingData.size(); + logger.info( "Found " + numBadSitesAdded + " variants overlapping bad sites training tracks." ); + + // Next, sort the variants by the LOD coming from the positive model and add to the list the bottom X percent of variants + Collections.sort( data ); + final int numToAdd = Math.max( minimumNumber - trainingData.size(), Math.round((float)bottomPercentage * data.size()) ); + if( numToAdd > data.size() ) { + throw new UserException.BadInput( "Error during negative model training. Minimum number of variants to use in training is larger than the whole call set. One can attempt to lower the --minNumBadVariants arugment but this is unsafe." ); + } else if( numToAdd == minimumNumber - trainingData.size() ) { + logger.warn( "WARNING: Training with very few variant sites! Please check the model reporting PDF to ensure the quality of the model is reliable." ); bottomPercentage = ((float) numToAdd) / ((float) data.size()); } - int index = 0; - int numAdded = 0; + int index = 0, numAdded = 0; while( numAdded < numToAdd ) { final VariantDatum datum = data.get(index++); if( !datum.failingSTDThreshold && !Double.isInfinite(datum.lod) ) { + datum.atAntiTrainingSite = true; trainingData.add( datum ); - datum.usedForTraining = -1; numAdded++; } } - logger.info("Training with worst " + (float) bottomPercentage * 100.0f + "% of passing data --> " + trainingData.size() + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "."); + logger.info( "Additionally training with worst " + (float) bottomPercentage * 100.0f + "% of passing data --> " + (trainingData.size() - numBadSitesAdded) + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "." ); return trainingData; } @@ -162,10 +170,11 @@ public class VariantDataManager { returnData.add(datum); } } - // add an extra 5% of points from bad training set, since that set is small but interesting + + // Add an extra 5% of points from bad training set, since that set is small but interesting for( int iii = 0; iii < Math.floor(0.05*numToAdd); iii++) { final VariantDatum datum = data.get(GenomeAnalysisEngine.getRandomGenerator().nextInt(data.size())); - if( datum.usedForTraining == -1 && !datum.failingSTDThreshold ) { returnData.add(datum); } + if( datum.atAntiTrainingSite && !datum.failingSTDThreshold ) { returnData.add(datum); } else { iii--; } } @@ -236,6 +245,7 @@ public class VariantDataManager { datum.atTrainingSite = false; datum.prior = 2.0; datum.consensusCount = 0; + for( final TrainingSet trainingSet : trainingSets ) { for( final VariantContext trainVC : tracker.getVariantContexts( ref, trainingSet.name, null, context.getLocation(), false, false ) ) { if( trainVC != null && trainVC.isNotFiltered() && trainVC.isVariant() && @@ -248,6 +258,10 @@ public class VariantDataManager { datum.prior = Math.max( datum.prior, trainingSet.prior ); datum.consensusCount += ( trainingSet.isConsensus ? 1 : 0 ); } + if( trainVC != null ) { + datum.atAntiTrainingSite = datum.atAntiTrainingSite || trainingSet.isAntiTraining; + } + } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java index 38e2affb6..04a5a9d3e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDatum.java @@ -14,13 +14,13 @@ public class VariantDatum implements Comparable { public double lod; public boolean atTruthSite; public boolean atTrainingSite; + public boolean atAntiTrainingSite; public boolean isTransition; public boolean isSNP; public boolean failingSTDThreshold; public double originalQual; public double prior; public int consensusCount; - public int usedForTraining; public String contig; public int start; public int stop; 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 b5fda4443..b903d20af 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 @@ -175,7 +175,6 @@ public class VariantRecalibrator extends RodWalker Date: Sat, 2 Jul 2011 17:55:10 -0400 Subject: [PATCH 020/214] Use the worst X% of calls in addition to the bad training sites list. Don't include the already added calls in the calculation of X% --- .../walkers/variantrecalibration/VariantDataManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index cd739f9fc..309d1b8fa 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -151,13 +151,13 @@ public class VariantDataManager { int index = 0, numAdded = 0; while( numAdded < numToAdd ) { final VariantDatum datum = data.get(index++); - if( !datum.failingSTDThreshold && !Double.isInfinite(datum.lod) ) { + if( !datum.atAntiTrainingSite && !datum.failingSTDThreshold && !Double.isInfinite(datum.lod) ) { datum.atAntiTrainingSite = true; trainingData.add( datum ); numAdded++; } } - logger.info( "Additionally training with worst " + (float) bottomPercentage * 100.0f + "% of passing data --> " + (trainingData.size() - numBadSitesAdded) + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "." ); + logger.info( "Additionally training with worst " + String.format("%0.3f", (float) bottomPercentage * 100.0f) + "% of passing data --> " + (trainingData.size() - numBadSitesAdded) + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "." ); return trainingData; } @@ -243,6 +243,7 @@ public class VariantDataManager { datum.isKnown = false; datum.atTruthSite = false; datum.atTrainingSite = false; + datum.atAntiTrainingSite = false; datum.prior = 2.0; datum.consensusCount = 0; From 41d46059e7cace435f9f1d558435d4fde14c8531 Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Sat, 2 Jul 2011 18:09:17 -0400 Subject: [PATCH 021/214] fixing bad format statement --- .../gatk/walkers/variantrecalibration/VariantDataManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index 309d1b8fa..f83e9b2f0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -157,7 +157,7 @@ public class VariantDataManager { numAdded++; } } - logger.info( "Additionally training with worst " + String.format("%0.3f", (float) bottomPercentage * 100.0f) + "% of passing data --> " + (trainingData.size() - numBadSitesAdded) + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "." ); + logger.info( "Additionally training with worst " + String.format("%.3f", (float) bottomPercentage * 100.0f) + "% of passing data --> " + (trainingData.size() - numBadSitesAdded) + " variants with LOD <= " + String.format("%.4f", data.get(index).lod) + "." ); return trainingData; } From fac082de64762732cbea08ddc3a47f6a41e47014 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Sun, 3 Jul 2011 14:32:12 -0400 Subject: [PATCH 022/214] Report only highest AF and AC in multiallelic records in VariantsToTable or else R can't parse table --- .../sting/gatk/walkers/variantutils/VariantsToTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 2111b0959..d8340b761 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -170,7 +170,7 @@ public class VariantsToTable extends RodWalker { throw new UserException(String.format("Missing field %s in vc %s at %s", field, vc.getSource(), vc)); } - if (field.equals("AF")) { + if (field.equals("AF") || field.equals("AC")) { String afo = val; double af=0; From 38740b0ff5e70df6c5d760251d129ed22d0eeccb Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Mon, 4 Jul 2011 16:11:42 -0400 Subject: [PATCH 023/214] First working version of the DiffNode readers for VCF and BAM files. Unit tests confirm the readers are approximately working. Skeleton of a working DiffObjects walker that will be able to provide detailed information about how exactly two files of the same type differ, so long as the files are supported by the DiffNode structure. --- public/testdata/diffTestMaster.vcf | 11 +++++++++++ public/testdata/diffTestTest.vcf | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 public/testdata/diffTestMaster.vcf create mode 100644 public/testdata/diffTestTest.vcf diff --git a/public/testdata/diffTestMaster.vcf b/public/testdata/diffTestMaster.vcf new file mode 100644 index 000000000..549f54345 --- /dev/null +++ b/public/testdata/diffTestMaster.vcf @@ -0,0 +1,11 @@ +##fileformat=VCFv4.0 +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 +chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03 +chr1 2979 rs62635286 T G 83.67 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:31,32:9:-33.61,-2.71,-0.00:27.09 +chr1 2981 rs62028691 A G 14.69 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:31,33:9:-32.12,-2.71,-0.00:27.08 +chr1 4536 rs11582131 G C 0.18 PASS AC=1;AF=0.50;AN=2 GT:AD:DP:GL:GQ 0/1:42,33:16:-41.67,-4.82,-26.29:99 +chr1 4562 rs11490464 C G 0.14 PASS AC=1;AF=0.50;AN=2 GT:AD:DP:GL:GQ 0/1:26,30:9:-19.64,-2.72,-14.87:99 +chr1 4770 rs6682375 A G 0.32 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:9,111:84:-306.27,-28.58,-3.46:99 +chr1 4793 rs6682385 A G 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:4,115:109:-350.74,-32.88,-0.10:99 +chr1 5074 rs11586607 T G 0.01 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:29,97:39:-130.41,-11.75,-3.82:79.31 +chr1 5137 rs62636497 A T 140.49 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:0,74:39:-148.99,-11.75,-0.01:99 diff --git a/public/testdata/diffTestTest.vcf b/public/testdata/diffTestTest.vcf new file mode 100644 index 000000000..8699ab253 --- /dev/null +++ b/public/testdata/diffTestTest.vcf @@ -0,0 +1,11 @@ +##fileformat=VCFv4.0 +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 +chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03 +chr1 2979 rs62635286 T G 83.67 CHANGED_FILTER AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:31,32:9:-33.61,-2.71,-0.00:27.09 +chr1 2981 rs62028691 A G 14.69 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:31,33:9:-32.12,-2.71,-0.00:27.08 +chr1 4536 rs11582131 G C 0.18 PASS AC=2;AF=0.50;AN=2 GT:AD:DP:GL:GQ 0/1:42,33:16:-41.67,-4.82,-26.29:99 +chr1 4562 rs11490464 C G 0.14 PASS AC=1;AF=0.50;AN=2 GT:AD:DP:GL:GQ 1/1:26,30:9:-19.64,-2.72,-14.87:99 +chr1 4770 rs6682375 A G 0.32 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 0/1:9,111:84:-306.27,-28.58,-3.46:99 +chr1 4793 rs6682385 A G 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:4,114:109:-350.74,-32.88,-0.10:99 +chr1 5074 rs11586607 T G 0.01 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:29,97:39:-130.41,-11.74,-3.82:79.31 +chr1 5137 rs62636497 A T 140.49 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:0,74:39:-148.99,-11.75,-0.01:9 From 08bc843d4cf630d96941128368467c0e8ebeaa73 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 20:23:22 -0400 Subject: [PATCH 025/214] SelectVariants can get a table to boost AF when choosing randomly --- .../walkers/variantutils/SelectVariants.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index cbac54326..95e5ed934 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -25,8 +25,11 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Input; import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.text.XReadLines; import org.broadinstitute.sting.utils.variantcontext.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.MendelianViolation; @@ -44,6 +47,7 @@ import org.broadinstitute.sting.utils.SampleUtils; import org.apache.log4j.Logger; import java.io.File; +import java.io.FileNotFoundException; import java.lang.annotation.AnnotationFormatError; import java.util.*; @@ -92,6 +96,8 @@ public class SelectVariants extends RodWalker { @Argument(fullName="keepAFSpectrum", shortName="keepAF", doc="Don't include loci found to be non-variant after the subsetting procedure.", required=false) private boolean KEEP_AF_SPECTRUM = false; + @Argument(fullName="afFile", shortName="afFile", doc="The output recal file used by ApplyRecalibration", required=false) + private File AF_FILE = null; @Argument(fullName="family_structure", shortName="family", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) private String FAMILY_STRUCTURE = ""; @@ -156,6 +162,10 @@ public class SelectVariants extends RodWalker { private RandomVariantStructure [] variantArray; + /* Variables used for random selection with AF boosting */ + private ArrayList afBreakpoints = null; + private ArrayList afBoosts = null; + double bkDelta = 0.0; @@ -228,7 +238,29 @@ public class SelectVariants extends RodWalker { SELECT_RANDOM_FRACTION = fractionRandom > 0; if (SELECT_RANDOM_FRACTION) logger.info("Selecting approximately " + fractionRandom + "% of the variants at random from the variant track"); - } + + + if (AF_FILE != null) { + try { + afBreakpoints = new ArrayList(); + afBoosts = new ArrayList(); + logger.info("Reading in AF boost table..."); + for ( final String line : new XReadLines( AF_FILE ) ) { + System.out.println(line); + final String[] vals = line.split("\t"); + double bkp = Double.valueOf(vals[0]); + double afb = Double.valueOf(vals[1]); + afBreakpoints.add(bkp); + afBoosts.add(afb); + + } + bkDelta = afBreakpoints.get(0); + } catch ( FileNotFoundException e ) { + throw new UserException.CouldNotReadInputFile(AF_FILE, e); + } + + } + } /** * Subset VC record if necessary and emit the modified record (provided it satisfies criteria for printing) @@ -300,6 +332,7 @@ public class SelectVariants extends RodWalker { String afo = compVC.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); double af; + double afBoost = 1.0; if (afo.contains(",")) { String[] afs = afo.split(","); afs[0] = afs[0].substring(1,afs[0].length()); @@ -317,8 +350,24 @@ public class SelectVariants extends RodWalker { else af = Double.valueOf(afo); + // now boost af by table read from file if desired + //double bkpt = 0.0; + int bkidx = 0; + if (AF_FILE != null) { + for ( Double bkpt : afBreakpoints) { + if (af < bkpt + bkDelta) + break; + else bkidx++; + } + afBoost = afBreakpoints.get(bkidx); + System.out.format("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); + + + + } + //System.out.format("%s .. %4.4f\n",afo.toString(), af); - if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af) + if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af * afBoost) vcfWriter.add(sub, ref.getBase()); } break; // do only one vc From 7a04872a3f45d23efd1e91e41b08b7f30def8b3d Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 20:33:59 -0400 Subject: [PATCH 026/214] bug fixes --- .../sting/gatk/walkers/variantutils/SelectVariants.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 95e5ed934..e7331d646 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -246,8 +246,10 @@ public class SelectVariants extends RodWalker { afBoosts = new ArrayList(); logger.info("Reading in AF boost table..."); for ( final String line : new XReadLines( AF_FILE ) ) { - System.out.println(line); + //System.out.println(line); final String[] vals = line.split("\t"); + if (vals[0].matches("midpoints")) + continue; double bkp = Double.valueOf(vals[0]); double afb = Double.valueOf(vals[1]); afBreakpoints.add(bkp); From 04df153f47886a341122f50e11b775c6852c52ed Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 20:45:10 -0400 Subject: [PATCH 027/214] bug fixes --- .../sting/gatk/walkers/variantutils/SelectVariants.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index e7331d646..bddfed66e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -245,11 +245,14 @@ public class SelectVariants extends RodWalker { afBreakpoints = new ArrayList(); afBoosts = new ArrayList(); logger.info("Reading in AF boost table..."); + boolean firstLine = false; for ( final String line : new XReadLines( AF_FILE ) ) { - //System.out.println(line); - final String[] vals = line.split("\t"); - if (vals[0].matches("midpoints")) + if (!firstLine) { + firstLine = true; continue; + } + final String[] vals = line.split("\t"); + double bkp = Double.valueOf(vals[0]); double afb = Double.valueOf(vals[1]); afBreakpoints.add(bkp); From f26ffeaea0d668c90533b32ab2e7299cc7e4e7d5 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 20:48:45 -0400 Subject: [PATCH 028/214] bug fixes --- .../sting/gatk/walkers/variantutils/SelectVariants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index bddfed66e..2eb35c2be 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -251,7 +251,7 @@ public class SelectVariants extends RodWalker { firstLine = true; continue; } - final String[] vals = line.split("\t"); + final String[] vals = line.split(" "); double bkp = Double.valueOf(vals[0]); double afb = Double.valueOf(vals[1]); From bb85f232b9e25fc07399276acd4fbcfc22e7cf51 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 21:04:49 -0400 Subject: [PATCH 029/214] bug fixes --- .../walkers/variantutils/SelectVariants.java | 89 +++++++++---------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 2eb35c2be..bbe8cd05e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -265,7 +265,7 @@ public class SelectVariants extends RodWalker { } } - } + } /** * Subset VC record if necessary and emit the modified record (provided it satisfies criteria for printing) @@ -326,58 +326,53 @@ public class SelectVariants extends RodWalker { } else { if (SELECT_RANDOM_FRACTION && KEEP_AF_SPECTRUM ) { - Collection compVCs = tracker.getVariantContexts(ref, inputAFRodName, null, context.getLocation(), true, false); - if (compVCs.isEmpty()) - return 0; - // ok we have a comp VC and we need to match the AF spectrum of inputAFRodName. // We then pick a variant with probablity AF*desiredFraction - for (VariantContext compVC : compVCs) { - if ( compVC.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { - String afo = compVC.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); - double af; - double afBoost = 1.0; - if (afo.contains(",")) { - String[] afs = afo.split(","); - afs[0] = afs[0].substring(1,afs[0].length()); - afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); + if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + String afo = sub.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); - double[] afd = new double[afs.length]; + double af; + double afBoost = 1.0; + if (afo.contains(",")) { + String[] afs = afo.split(","); + afs[0] = afs[0].substring(1,afs[0].length()); + afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); - for (int k=0; k < afd.length; k++) - afd[k] = Double.valueOf(afs[k]); + double[] afd = new double[afs.length]; - af = MathUtils.arrayMax(afd); - //af = Double.valueOf(afs[0]); + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); - } - else - af = Double.valueOf(afo); + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); - // now boost af by table read from file if desired - //double bkpt = 0.0; - int bkidx = 0; - if (AF_FILE != null) { - for ( Double bkpt : afBreakpoints) { - if (af < bkpt + bkDelta) - break; - else bkidx++; - } - afBoost = afBreakpoints.get(bkidx); - System.out.format("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); - - - - } - - //System.out.format("%s .. %4.4f\n",afo.toString(), af); - if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af * afBoost) - vcfWriter.add(sub, ref.getBase()); } - break; // do only one vc + else + af = Double.valueOf(afo); + + // now boost af by table read from file if desired + //double bkpt = 0.0; + int bkidx = 0; + if (AF_FILE != null) { + for ( Double bkpt : afBreakpoints) { + if (af < bkpt + bkDelta) + break; + else bkidx++; + } + afBoost = afBreakpoints.get(bkidx); + System.out.format("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); + + + + } + + //System.out.format("%s .. %4.4f\n",afo.toString(), af); + if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af * afBoost) + vcfWriter.add(sub, ref.getBase()); } + } } } @@ -461,8 +456,8 @@ public class SelectVariants extends RodWalker { private boolean haveSameGenotypes(Genotype g1, Genotype g2) { if ((g1.isCalled() && g2.isFiltered()) || - (g2.isCalled() && g1.isFiltered()) || - (g1.isFiltered() && g2.isFiltered() && EXCLUDE_FILTERED)) + (g2.isCalled() && g1.isFiltered()) || + (g1.isFiltered() && g2.isFiltered() && EXCLUDE_FILTERED)) return false; List a1s = g1.getAlleles(); @@ -495,7 +490,7 @@ public class SelectVariants extends RodWalker { * @param vc the VariantContext record to subset * @param samples the samples to extract * @return the subsetted VariantContext - */ + */ private VariantContext subsetRecord(VariantContext vc, Set samples) { if ( samples == null || samples.isEmpty() ) return vc; @@ -505,7 +500,7 @@ public class SelectVariants extends RodWalker { if ( samples.contains(genotypePair.getKey()) ) genotypes.add(genotypePair.getValue()); } - + VariantContext sub = vc.subContextFromGenotypes(genotypes, vc.getAlleles()); HashMap attributes = new HashMap(sub.getAttributes()); @@ -515,7 +510,7 @@ public class SelectVariants extends RodWalker { Genotype g = sub.getGenotype(sample); if (g.isNotFiltered() && g.isCalled()) { - + String dp = (String) g.getAttribute("DP"); if (dp != null && ! dp.equals(VCFConstants.MISSING_DEPTH_v3) && ! dp.equals(VCFConstants.MISSING_VALUE_v4) ) { depth += Integer.valueOf(dp); From 9124c84a7ca19714034fe6e78452f30759a20c8c Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Mon, 4 Jul 2011 21:10:44 -0400 Subject: [PATCH 030/214] bug fixes --- .../sting/gatk/walkers/variantutils/SelectVariants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index bbe8cd05e..aa8a49175 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -321,7 +321,7 @@ public class SelectVariants extends RodWalker { if (SELECT_RANDOM_NUMBER) { randomlyAddVariant(++variantNumber, sub, ref.getBase()); } - else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom) { + else if (!SELECT_RANDOM_FRACTION || (!KEEP_AF_SPECTRUM && GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom)) { vcfWriter.add(sub, ref.getBase()); } else { From 080875d5daf876ebd29b059c156890d7c349983f Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Tue, 5 Jul 2011 16:13:39 -0400 Subject: [PATCH 035/214] Refactored DiffNode/DiffElement/DiffValue class structure. DiffElement is now a pair of Name -> Value, where value is either a DiffValue or its subclass DiffNode. Code cleaned up, more tests added. DiffEngine is now working, with tests. DiffObjectWalker can now take two VCFs and itemize the difference between the two files correctly and concisely. --- build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index fe1723587..21066686f 100644 --- a/build.xml +++ b/build.xml @@ -741,8 +741,8 @@ - - + + From 7b699f8b175f02bbf7ba2cb1aea420361dc4af0d Mon Sep 17 00:00:00 2001 From: Khalid Shakir Date: Tue, 5 Jul 2011 21:59:00 -0400 Subject: [PATCH 036/214] Switched GridEngine from looking from environment variable to using embedded jar. --- build.xml | 33 ++++++++---------- ivy.xml | 3 ++ settings/ivysettings.xml | 1 + .../drmaa-6.2u5p2-sources.jar | Bin 0 -> 110692 bytes .../net.sf.gridscheduler/drmaa-6.2u5p2.jar | Bin 0 -> 51479 bytes .../net.sf.gridscheduler/drmaa-6.2u5p2.xml | 3 ++ 6 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2-sources.jar create mode 100644 settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2.jar create mode 100644 settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2.xml diff --git a/build.xml b/build.xml index fe1723587..a78c4d738 100644 --- a/build.xml +++ b/build.xml @@ -69,8 +69,6 @@ - - @@ -146,11 +144,7 @@ - - - - - @@ -178,13 +172,23 @@ - - + + + + + - + + + + + + + + @@ -214,12 +218,6 @@ - - - - - - @@ -357,7 +355,6 @@ - @@ -374,7 +371,6 @@ - @@ -682,7 +678,6 @@ - diff --git a/ivy.xml b/ivy.xml index c2a6c4ccd..10e4ee570 100644 --- a/ivy.xml +++ b/ivy.xml @@ -48,6 +48,9 @@ + + + diff --git a/settings/ivysettings.xml b/settings/ivysettings.xml index 1e47fa847..2c8fc388f 100644 --- a/settings/ivysettings.xml +++ b/settings/ivysettings.xml @@ -25,5 +25,6 @@ + diff --git a/settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2-sources.jar b/settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..dc77c7d333c61a79fa8c7be7d8ad3345678f811c GIT binary patch literal 110692 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 ml>~}UXkIdr+QWy?jjBsZE6)k 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 F{|_H6`St(+ literal 0 HcmV?d00001 diff --git a/settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2.jar b/settings/repository/net.sf.gridscheduler/drmaa-6.2u5p2.jar new file mode 100644 index 0000000000000000000000000000000000000000..f267be4b58a1930909cdf7a37a031893c6bbb71a GIT binary patch literal 51479 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 + + From ccf34f7e45164cea70beccb4cf1b0791e6acde06 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 6 Jul 2011 21:57:22 -0400 Subject: [PATCH 043/214] (1) Added very useful helper class TestDataProvider to BaseTest that making creating data providers for TestNG far easier (2) DiffEngine now officially working with with summaries. Extensive UnitTests all around! --- .../org/broadinstitute/sting/BaseTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/public/java/test/org/broadinstitute/sting/BaseTest.java b/public/java/test/org/broadinstitute/sting/BaseTest.java index 61bb8b34b..b469c8a41 100755 --- a/public/java/test/org/broadinstitute/sting/BaseTest.java +++ b/public/java/test/org/broadinstitute/sting/BaseTest.java @@ -12,6 +12,10 @@ import java.io.*; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @@ -107,6 +111,57 @@ public abstract class BaseTest { } } + /** + * Simple generic utility class to creating TestNG data providers: + * + * 1: inherit this class, as in + * + * private class SummarizeDifferenceTest extends TestDataProvider { + * public SummarizeDifferenceTest() { + * super(SummarizeDifferenceTest.class); + * } + * ... + * } + * + * Provide a reference to your class to the TestDataProvider constructor. + * + * 2: Create instances of your subclass. Return from it the call to getTests, providing + * the class type of your test + * + * @DataProvider(name = "summaries") + * public Object[][] createSummaries() { + * new SummarizeDifferenceTest().addDiff("A", "A").addSummary("A:2"); + * new SummarizeDifferenceTest().addDiff("A", "B").addSummary("A:1", "B:1"); + * return SummarizeDifferenceTest.getTests(SummarizeDifferenceTest.class); + * } + * + * This class magically tracks created objects of this + */ + public static class TestDataProvider { + private static final Map> tests = new HashMap>(); + + /** + * Create a new TestDataProvider instance bound to the class variable C + * @param c + */ + public TestDataProvider(Class c) { + if ( ! tests.containsKey(c) ) + tests.put(c, new ArrayList()); + tests.get(c).add(this); + } + + /** + * Return all of the data providers in the form expected by TestNG of type class C + * @param c + * @return + */ + public static Object[][] getTests(Class c) { + List params2 = new ArrayList(); + for ( Object x : tests.get(c) ) params2.add(new Object[]{x}); + return params2.toArray(new Object[][]{}); + } + } + /** * test if the file exists * From 5ab2e83904ea95dd141410476a7aeb5307f67420 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 7 Jul 2011 06:15:10 -0400 Subject: [PATCH 044/214] a) Cosmetic modifications to IndelType annotation. b) Add ability to select samples from a file in PrintReads, c) fixes to shaped AF random selection in SelectVariants --- .../sting/gatk/walkers/PrintReadsWalker.java | 39 +++++++++++++++++++ .../gatk/walkers/annotator/IndelType.java | 24 ++++++++++-- .../walkers/variantutils/SelectVariants.java | 18 +++++---- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index 07938d322..2b6673003 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -32,9 +32,14 @@ import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.baq.BAQ; +import java.io.File; import java.io.PrintStream; +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; /** * Renders, in SAM/BAM format, all reads from the input data set in the order in which they appear @@ -54,6 +59,13 @@ public class PrintReadsWalker extends ReadWalker { String platform = null; // E.g. ILLUMINA, 454 @Argument(fullName = "number", shortName = "n", doc="Print the first n reads from the file, discarding the rest", required = false) int nReadsToPrint = -1; + @Argument(fullName="sample_file", shortName="sf", doc="File containing a list of samples (one per line). Can be specified multiple times", required=false) + public Set sampleFiles; + @Argument(fullName="sample_name", shortName="sn", doc="Sample name to be included in the analysis. Can be specified multiple times.", required=false) + public Set sampleNames; + + private TreeSet samplesToChoose = new TreeSet(); + private boolean NO_SAMPLES_SPECIFIED = false; /** * The initialize function. @@ -61,6 +73,17 @@ public class PrintReadsWalker extends ReadWalker { public void initialize() { if ( platform != null ) platform = platform.toUpperCase(); + + Collection samplesFromFile = SampleUtils.getSamplesFromFiles(sampleFiles); + samplesToChoose.addAll(samplesFromFile); + + if (sampleNames != null) + samplesToChoose.addAll(sampleNames); + + if(samplesToChoose.isEmpty()) { + NO_SAMPLES_SPECIFIED = true; + } + } /** @@ -87,6 +110,22 @@ public class PrintReadsWalker extends ReadWalker { if ( readPlatformAttr == null || !readPlatformAttr.toString().toUpperCase().contains(platform)) return false; } + if (!NO_SAMPLES_SPECIFIED ) { + // user specified samples to select + String readSample = read.getReadGroup().getSample(); + boolean found = false; + for (String sampleSelected : samplesToChoose) { + if (readSample.equalsIgnoreCase(sampleSelected)) { + found = true; + break; + } + + } + + if (!found) + return false; + } + // check if we've reached the output limit if ( nReadsToPrint == 0 ) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java index ee8b01d7d..af4d2ff28 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java @@ -24,11 +24,27 @@ public class IndelType implements InfoFieldAnnotation, ExperimentalAnnotation { public Map annotate(RefMetaDataTracker tracker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { int run; - if ( vc.isIndel() && vc.isBiallelic() ) { + if (vc.isMixed()) { + Map map = new HashMap(); + map.put(getKeyNames().get(0), String.format("%s", "MIXED")); + return map; + + } + else if ( vc.isIndel() ) { String type=""; - ArrayList inds = IndelUtils.findEventClassificationIndex(vc, ref); - for (int k : inds) { - type = type+ IndelUtils.getIndelClassificationName(k)+"."; + if (!vc.isBiallelic()) + type = "MULTIALLELIC_INDEL"; + else { + if (vc.isInsertion()) + type = "INS."; + else if (vc.isDeletion()) + type = "DEL."; + else + type = "OTHER."; + ArrayList inds = IndelUtils.findEventClassificationIndex(vc, ref); + for (int k : inds) { + type = type+ IndelUtils.getIndelClassificationName(k)+"."; + } } Map map = new HashMap(); map.put(getKeyNames().get(0), String.format("%s", type)); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index aa8a49175..80a497d33 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -96,8 +96,9 @@ public class SelectVariants extends RodWalker { @Argument(fullName="keepAFSpectrum", shortName="keepAF", doc="Don't include loci found to be non-variant after the subsetting procedure.", required=false) private boolean KEEP_AF_SPECTRUM = false; + @Hidden @Argument(fullName="afFile", shortName="afFile", doc="The output recal file used by ApplyRecalibration", required=false) - private File AF_FILE = null; + private File AF_FILE = new File(""); @Argument(fullName="family_structure", shortName="family", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) private String FAMILY_STRUCTURE = ""; @@ -240,7 +241,7 @@ public class SelectVariants extends RodWalker { if (SELECT_RANDOM_FRACTION) logger.info("Selecting approximately " + fractionRandom + "% of the variants at random from the variant track"); - if (AF_FILE != null) { + if (KEEP_AF_SPECTRUM) { try { afBreakpoints = new ArrayList(); afBoosts = new ArrayList(); @@ -328,8 +329,7 @@ public class SelectVariants extends RodWalker { if (SELECT_RANDOM_FRACTION && KEEP_AF_SPECTRUM ) { // ok we have a comp VC and we need to match the AF spectrum of inputAFRodName. // We then pick a variant with probablity AF*desiredFraction - - if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { String afo = sub.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); double af; @@ -354,21 +354,23 @@ public class SelectVariants extends RodWalker { // now boost af by table read from file if desired //double bkpt = 0.0; int bkidx = 0; - if (AF_FILE != null) { + if (!afBreakpoints.isEmpty()) { for ( Double bkpt : afBreakpoints) { if (af < bkpt + bkDelta) break; else bkidx++; } - afBoost = afBreakpoints.get(bkidx); - System.out.format("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); + if (bkidx >=afBoosts.size()) + bkidx = afBoosts.size()-1; + afBoost = afBoosts.get(bkidx); + //System.out.formatPrin("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); } //System.out.format("%s .. %4.4f\n",afo.toString(), af); - if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af * afBoost) + if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * afBoost * afBoost) vcfWriter.add(sub, ref.getBase()); } From 212e9a1a0cf766f54f70d17d0786db570f8111ae Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Thu, 7 Jul 2011 15:18:57 -0400 Subject: [PATCH 047/214] Fixing unstable build after stable commit --- .../gatk/walkers/variantrecalibration/GaussianMixtureModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java index b4a8c4c32..17461de2f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/GaussianMixtureModel.java @@ -26,6 +26,7 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; import Jama.Matrix; +import cern.jet.random.Normal; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.MathUtils; From 3d4f0e9dd76d1ab23a7e7fdecd61067b57b8e7d7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 7 Jul 2011 17:21:15 -0400 Subject: [PATCH 049/214] Now supports the case where you have multiple AC values in the info field. --- .../gatk/walkers/varianteval/stratifications/AlleleCount.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java index ff59c9e29..2cbc66e31 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java @@ -43,9 +43,9 @@ public class AlleleCount extends VariantStratifier { if (eval != null) { int AC = -1; - if ( eval.hasAttribute("AC") ) + if ( eval.hasAttribute("AC") && eval.getAttribute("AC") instanceof Integer ) { AC = eval.getAttributeAsInt("AC"); - else if ( eval.isVariant() ) { + } else if ( eval.isVariant() ) { for (Allele allele : eval.getAlternateAlleles()) AC = Math.max(AC, eval.getChromosomeCount(allele)); } else From 2a4b3ae4a20ea3d5bbd3047f2c2f7842cd01e2ef Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Fri, 8 Jul 2011 12:48:33 -0400 Subject: [PATCH 053/214] Cleaning up / removing most of the monkeying around with annotation values that happens in VariantDataManager --- .../VariantDataManager.java | 34 +++++-------------- .../VariantRecalibrator.java | 6 ++-- ...VariantRecalibratorArgumentCollection.java | 2 +- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index 5f35c182c..ddeda1699 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -82,19 +82,11 @@ public class VariantDataManager { } foundZeroVarianceAnnotation = foundZeroVarianceAnnotation || (theSTD < 1E-6); - if( annotationKeys.get(iii).toLowerCase().contains("ranksum") ) { // BUGBUG: to clean up - for( final VariantDatum datum : data ) { - if( datum.annotations[iii] > 0.0 ) { datum.annotations[iii] /= 3.0; } - } - } meanVector[iii] = theMean; varianceVector[iii] = theSTD; for( final VariantDatum datum : data ) { + // Transform each data point via: (x - mean) / standard deviation datum.annotations[iii] = ( datum.isNull[iii] ? GenomeAnalysisEngine.getRandomGenerator().nextGaussian() : ( datum.annotations[iii] - theMean ) / theSTD ); - // Each data point is now [ (x - mean) / standard deviation ] - if( annotationKeys.get(iii).toLowerCase().contains("ranksum") && datum.isNull[iii] && datum.annotations[iii] > 0.0 ) { - datum.annotations[iii] /= 3.0; - } } } if( foundZeroVarianceAnnotation ) { @@ -163,7 +155,7 @@ public class VariantDataManager { final int numBadSitesAdded = trainingData.size(); logger.info( "Found " + numBadSitesAdded + " variants overlapping bad sites training tracks." ); - // Next, sort the variants by the LOD coming from the positive model and add to the list the bottom X percent of variants + // Next sort the variants by the LOD coming from the positive model and add to the list the bottom X percent of variants Collections.sort( data ); final int numToAdd = Math.max( minimumNumber - trainingData.size(), Math.round((float)bottomPercentage * data.size()) ); if( numToAdd > data.size() ) { @@ -241,23 +233,15 @@ public class VariantDataManager { double value; try { - if( annotationKey.equalsIgnoreCase("QUAL") ) { - value = vc.getPhredScaledQual(); - } else if( annotationKey.equalsIgnoreCase("DP") ) { - value = Double.parseDouble( (String)vc.getAttribute( "DP" ) ) / Double.parseDouble( (String)vc.getAttribute( "AN" ) ); - } else { - value = Double.parseDouble( (String)vc.getAttribute( annotationKey ) ); - if( Double.isInfinite(value) ) { value = Double.NaN; } - if( annotationKey.equalsIgnoreCase("InbreedingCoeff") && value > 0.05 ) { value = Double.NaN; } - if( jitter && annotationKey.equalsIgnoreCase("HRUN") ) { // Integer valued annotations must be jittered a bit to work in this GMM - value += -0.25 + 0.5 * GenomeAnalysisEngine.getRandomGenerator().nextDouble(); - } - if( annotationKey.equalsIgnoreCase("HaplotypeScore") && MathUtils.compareDoubles(value, 0.0, 0.0001) == 0 ) { value = -0.2 + 0.4*GenomeAnalysisEngine.getRandomGenerator().nextDouble(); } - if( annotationKey.equalsIgnoreCase("FS") && MathUtils.compareDoubles(value, 0.0, 0.01) == 0 ) { value = -0.2 + 0.4*GenomeAnalysisEngine.getRandomGenerator().nextDouble(); } + value = Double.parseDouble( (String)vc.getAttribute( annotationKey ) ); + if( Double.isInfinite(value) ) { value = Double.NaN; } + if( jitter && annotationKey.equalsIgnoreCase("HRUN") ) { // Integer valued annotations must be jittered a bit to work in this GMM + value += -0.25 + 0.5 * GenomeAnalysisEngine.getRandomGenerator().nextDouble(); } - + if( jitter && annotationKey.equalsIgnoreCase("HaplotypeScore") && MathUtils.compareDoubles(value, 0.0, 0.0001) == 0 ) { value = -0.2 + 0.4*GenomeAnalysisEngine.getRandomGenerator().nextDouble(); } + if( jitter && annotationKey.equalsIgnoreCase("FS") && MathUtils.compareDoubles(value, 0.0, 0.001) == 0 ) { value = -0.2 + 0.4*GenomeAnalysisEngine.getRandomGenerator().nextDouble(); } } catch( Exception e ) { - value = Double.NaN; // The VQSR works with missing data now by marginalizing over the missing dimension when evaluating Gaussians + value = Double.NaN; // The VQSR works with missing data by marginalizing over the missing dimension when evaluating the Gaussian mixture model } return value; 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 2c51f02d6..2d0355d7d 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 @@ -284,7 +284,7 @@ public class VariantRecalibrator extends RodWalker Date: Mon, 11 Jul 2011 14:17:59 -0400 Subject: [PATCH 063/214] Private feature to input a list of family descriptions from a file and to look for MV's on all of these. Feature can also output a detailed description of the violation into a separate file --- .../walkers/variantutils/SelectVariants.java | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 80a497d33..c60162728 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -48,6 +48,7 @@ import org.apache.log4j.Logger; import java.io.File; import java.io.FileNotFoundException; +import java.io.PrintStream; import java.lang.annotation.AnnotationFormatError; import java.util.*; @@ -100,6 +101,10 @@ public class SelectVariants extends RodWalker { @Argument(fullName="afFile", shortName="afFile", doc="The output recal file used by ApplyRecalibration", required=false) private File AF_FILE = new File(""); + @Hidden + @Argument(fullName="family_structure_file", shortName="familyFile", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) + private File FAMILY_STRUCTURE_FILE = null; + @Argument(fullName="family_structure", shortName="family", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) private String FAMILY_STRUCTURE = ""; @@ -121,6 +126,9 @@ public class SelectVariants extends RodWalker { @Argument(fullName="selectIndels", shortName="indels", doc="Select only Indels.", required=false) private boolean SELECT_INDELS = false; + @Hidden + @Argument(fullName="outMVFile", shortName="outMVFile", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) + private String outMVFile = null; /* Private class used to store the intermediate variants in the integer random selection process */ private class RandomVariantStructure { @@ -148,7 +156,7 @@ public class SelectVariants extends RodWalker { private boolean DISCORDANCE_ONLY = false; private boolean CONCORDANCE_ONLY = false; - private MendelianViolation mv; + private Set mvSet = new HashSet(); /* default name for the variant dataset (VCF) */ private final String variantRodName = "variant"; @@ -169,6 +177,8 @@ public class SelectVariants extends RodWalker { double bkDelta = 0.0; + private PrintStream outMVFileStream = null; + /** * Set up the VCF writer, the sample expressions and regexs, and the JEXL matcher @@ -224,10 +234,29 @@ public class SelectVariants extends RodWalker { CONCORDANCE_ONLY = concordanceRodName.length() > 0; if (CONCORDANCE_ONLY) logger.info("Selecting only variants concordant with the track: " + concordanceRodName); - if (MENDELIAN_VIOLATIONS) - mv = new MendelianViolation(getToolkit(), MENDELIAN_VIOLATION_QUAL_THRESHOLD); + if (MENDELIAN_VIOLATIONS) { + if ( FAMILY_STRUCTURE_FILE != null) { + try { + for ( final String line : new XReadLines( FAMILY_STRUCTURE_FILE ) ) { + MendelianViolation mv = new MendelianViolation(line, MENDELIAN_VIOLATION_QUAL_THRESHOLD); + if (samples.contains(mv.getSampleChild()) && samples.contains(mv.getSampleDad()) && samples.contains(mv.getSampleMom())) + mvSet.add(mv); + } + } catch ( FileNotFoundException e ) { + throw new UserException.CouldNotReadInputFile(AF_FILE, e); + } + if (outMVFile != null) + try { + outMVFileStream = new PrintStream(outMVFile); + } + catch (FileNotFoundException e) { + throw new UserException.CouldNotCreateOutputFile(outMVFile, "Can't open output file", e); } + } + else + mvSet.add(new MendelianViolation(getToolkit(), MENDELIAN_VIOLATION_QUAL_THRESHOLD)); + } else if (!FAMILY_STRUCTURE.isEmpty()) { - mv = new MendelianViolation(FAMILY_STRUCTURE, MENDELIAN_VIOLATION_QUAL_THRESHOLD); + mvSet.add(new MendelianViolation(FAMILY_STRUCTURE, MENDELIAN_VIOLATION_QUAL_THRESHOLD)); MENDELIAN_VIOLATIONS = true; } @@ -289,9 +318,24 @@ public class SelectVariants extends RodWalker { for (VariantContext vc : vcs) { if (MENDELIAN_VIOLATIONS) { - if (!mv.isViolation(vc)) { - break; + boolean foundMV = false; + for (MendelianViolation mv : mvSet) { + if (mv.isViolation(vc)) { + foundMV = true; + //System.out.println(vc.toString()); + if (outMVFile != null) + outMVFileStream.format("MV@%s:%d. REF=%s, ALT=%s, AC=%d, momID=%s, dadID=%s, childID=%s, momG=%s, momGL=%s, dadG=%s, dadGL=%s, " + + "childG=%s childGL=%s\n",vc.getChr(), vc.getStart(), + vc.getReference().getDisplayString(), vc.getAlternateAllele(0).getDisplayString(), vc.getChromosomeCount(vc.getAlternateAllele(0)), + mv.getSampleMom(), mv.getSampleDad(), mv.getSampleChild(), + vc.getGenotype(mv.getSampleMom()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), + vc.getGenotype(mv.getSampleDad()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), + vc.getGenotype(mv.getSampleChild()).toBriefString(),vc.getGenotype(mv.getSampleChild()).getLikelihoods().getAsString() ); + } } + + if (!foundMV) + break; } if (DISCORDANCE_ONLY) { Collection compVCs = tracker.getVariantContexts(ref, discordanceRodName, null, context.getLocation(), true, false); @@ -329,7 +373,7 @@ public class SelectVariants extends RodWalker { if (SELECT_RANDOM_FRACTION && KEEP_AF_SPECTRUM ) { // ok we have a comp VC and we need to match the AF spectrum of inputAFRodName. // We then pick a variant with probablity AF*desiredFraction - if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { String afo = sub.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); double af; From 86890c63574eba41bbbce6c52e2614f6c81b6f27 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Mon, 11 Jul 2011 16:16:15 -0400 Subject: [PATCH 068/214] N and K (in binomial probability) got switched in RFA Walker with the last commit. No longer will NaNs be produced. Added: TableToVCF. Kind of a longer-term project, but there are lots of variant calls available in a weird tabular format. I used this to convert Ju Et Al small indels to VCF. I'll check against the 1000G ASN superpopulation calls to see if we see a good amount of recapitulation, and if so, i'll put them in unvalidated comparisons. Minor chances to the TableCodec and TableFeatures to allow for this (the codec can sometimes drop a column, and the feature now allows you to grab on to its header). --- .../sting/gatk/refdata/features/table/TableCodec.java | 0 .../sting/gatk/refdata/features/table/TableFeature.java | 6 +++++- .../broadinstitute/sting/utils/variantcontext/Allele.java | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) mode change 100644 => 100755 public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java mode change 100644 => 100755 public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java old mode 100644 new mode 100755 diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java old mode 100644 new mode 100755 index 6ff0384a0..4b4ebe450 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java @@ -55,10 +55,14 @@ public class TableFeature implements Feature { } public List getAllValues() { - return getValuesTo(values.size()-1); + return getValuesTo(values.size()); } public List getValuesTo(int columnPosition) { return values.subList(0,columnPosition); } + + public List getHeader() { + return keys; + } } diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java index a9ba46159..901de6fae 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java @@ -108,7 +108,7 @@ public class Allele implements Comparable { this.bases = bases; if ( ! acceptableAlleleBases(bases) ) - throw new IllegalArgumentException("Unexpected base in allele bases " + new String(bases)); + throw new IllegalArgumentException("Unexpected base in allele bases \'" + new String(bases)+"\'"); } private Allele(String bases, boolean isRef) { From e3748675dbd518042ad67cfc653c7f1a5f89b327 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Mon, 11 Jul 2011 17:40:45 -0400 Subject: [PATCH 071/214] Support for VCF 4.1 header counts --- .../annotator/DepthPerAlleleBySample.java | 3 +- .../ReadDepthAndAllelicFractionBySample.java | 5 +- .../gatk/walkers/annotator/SampleList.java | 3 +- .../utils/codecs/vcf/StandardVCFWriter.java | 11 +-- .../codecs/vcf/VCFCompoundHeaderLine.java | 91 +++++++++++++++---- .../sting/utils/codecs/vcf/VCFConstants.java | 2 + .../utils/codecs/vcf/VCFFormatHeaderLine.java | 4 + .../utils/codecs/vcf/VCFHeaderLineCount.java | 8 ++ .../utils/codecs/vcf/VCFInfoHeaderLine.java | 4 + 9 files changed, 101 insertions(+), 30 deletions(-) create mode 100644 public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFHeaderLineCount.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java index 754d28dfd..ee66b50ee 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; @@ -142,5 +143,5 @@ public class DepthPerAlleleBySample implements GenotypeAnnotation, StandardAnnot // public String getIndelBases() public List getKeyNames() { return Arrays.asList("AD"); } - public List getDescriptions() { return Arrays.asList(new VCFFormatHeaderLine(getKeyNames().get(0), VCFCompoundHeaderLine.UNBOUNDED, VCFHeaderLineType.Integer, "Allelic depths for the ref and alt alleles in the order listed")); } + public List getDescriptions() { return Arrays.asList(new VCFFormatHeaderLine(getKeyNames().get(0), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "Allelic depths for the ref and alt alleles in the order listed")); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java index f287549bb..a670532af 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java @@ -29,6 +29,7 @@ import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; @@ -200,8 +201,8 @@ public class ReadDepthAndAllelicFractionBySample implements GenotypeAnnotation { 1, VCFHeaderLineType.Integer, "Total read depth per sample, including MQ0"), - new VCFFormatHeaderLine(getKeyNames().get(1), - VCFCompoundHeaderLine.UNBOUNDED, + new VCFFormatHeaderLine(getKeyNames().get(1), + VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "Fractions of reads (excluding MQ0 from both ref and alt) supporting each reported alternative allele, per sample")); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java index 82f16be42..e2fd2a3d4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; @@ -65,5 +66,5 @@ public class SampleList implements InfoFieldAnnotation { public List getKeyNames() { return Arrays.asList("Samples"); } - public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("Samples", VCFInfoHeaderLine.UNBOUNDED, VCFHeaderLineType.String, "List of polymorphic samples")); } + public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("Samples", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "List of polymorphic samples")); } } diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index 31251c089..230773310 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -360,14 +360,7 @@ public class StandardVCFWriter implements VCFWriter { if ( !entry.getValue().equals("") ) { int numVals = 1; VCFInfoHeaderLine metaData = mHeader.getInfoHeaderLine(key); - if ( metaData != null ) - numVals = metaData.getCount(); - - // take care of unbounded encoding - if ( numVals == VCFInfoHeaderLine.UNBOUNDED ) - numVals = 1; - - if ( numVals > 0 ) { + if ( metaData != null && (metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() > 0) ) { mWriter.write("="); mWriter.write(entry.getValue()); } @@ -423,7 +416,7 @@ public class StandardVCFWriter implements VCFWriter { VCFFormatHeaderLine metaData = mHeader.getFormatHeaderLine(key); if ( metaData != null ) { - int numInFormatField = metaData.getCount(); + int numInFormatField = metaData.getCount(vc.getAlternateAlleles().size()); if ( numInFormatField > 1 && val.equals(VCFConstants.MISSING_VALUE_v4) ) { // If we have a missing field but multiple values are expected, we need to construct a new string with all fields. // For example, if Number=2, the string has to be ".,." diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java index a799161ad..49f9ab184 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java @@ -24,6 +24,8 @@ package org.broadinstitute.sting.utils.codecs.vcf; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; @@ -43,26 +45,43 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF // the field types private String name; - private int count; + private int count = -1; + private VCFHeaderLineCount countType; private String description; private VCFHeaderLineType type; // access methods public String getName() { return name; } - public int getCount() { return count; } public String getDescription() { return description; } public VCFHeaderLineType getType() { return type; } + public VCFHeaderLineCount getCountType() { return countType; } + public int getCount() { + if ( countType != VCFHeaderLineCount.INTEGER ) + throw new ReviewedStingException("Asking for header line count when type is not an integer"); + return count; + } - // - public void setNumberToUnbounded() { this.count = UNBOUNDED; } + // utility method + public int getCount(int numAltAlleles) { + int myCount; + switch ( countType ) { + case INTEGER: myCount = count; break; + case UNBOUNDED: myCount = -1; break; + case A: myCount = numAltAlleles; break; + case G: myCount = ((numAltAlleles + 1) * (numAltAlleles + 2) / 2); break; + default: throw new ReviewedStingException("Unknown count type: " + countType); + } + return myCount; + } + + public void setNumberToUnbounded() { + countType = VCFHeaderLineCount.UNBOUNDED; + count = -1; + } // our type of line, i.e. format, info, etc private final SupportedHeaderLineType lineType; - // line numerical values are allowed to be unbounded (or unknown), which is - // marked with a dot (.) - public static final int UNBOUNDED = -1; // the value we store internally for unbounded types - /** * create a VCF format header line * @@ -74,6 +93,7 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) { super(lineType.toString(), ""); this.name = name; + this.countType = VCFHeaderLineCount.INTEGER; this.count = count; this.type = type; this.description = description; @@ -81,6 +101,24 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF validate(); } + /** + * create a VCF format header line + * + * @param name the name for this header line + * @param count the count type for this header line + * @param type the type for this header line + * @param description the description for this header line + */ + protected VCFCompoundHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) { + super(lineType.toString(), ""); + this.name = name; + this.countType = count; + this.type = type; + this.description = description; + this.lineType = lineType; + validate(); + } + /** * create a VCF format header line * @@ -92,9 +130,22 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF super(lineType.toString(), ""); Map mapping = VCFHeaderLineTranslator.parseLine(version,line, Arrays.asList("ID","Number","Type","Description")); name = mapping.get("ID"); - count = (version == VCFHeaderVersion.VCF4_0 || version == VCFHeaderVersion.VCF4_1) ? - mapping.get("Number").equals(VCFConstants.UNBOUNDED_ENCODING_v4) ? UNBOUNDED : Integer.valueOf(mapping.get("Number")) : - mapping.get("Number").equals(VCFConstants.UNBOUNDED_ENCODING_v3) ? UNBOUNDED : Integer.valueOf(mapping.get("Number")); + count = -1; + final String numberStr = mapping.get("Number"); + if ( numberStr.equals(VCFConstants.PER_ALLELE_COUNT) ) { + countType = VCFHeaderLineCount.A; + } else if ( numberStr.equals(VCFConstants.PER_GENOTYPE_COUNT) ) { + countType = VCFHeaderLineCount.G; + } else if ( ((version == VCFHeaderVersion.VCF4_0 || version == VCFHeaderVersion.VCF4_1) && + numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v4)) || + ((version == VCFHeaderVersion.VCF3_2 || version == VCFHeaderVersion.VCF3_3) && + numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v3)) ) { + countType = VCFHeaderLineCount.UNBOUNDED; + } else { + countType = VCFHeaderLineCount.INTEGER; + count = Integer.valueOf(numberStr); + + } type = VCFHeaderLineType.valueOf(mapping.get("Type")); if (type == VCFHeaderLineType.Flag && !allowFlagValues()) throw new IllegalArgumentException("Flag is an unsupported type for this kind of field"); @@ -121,7 +172,15 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF protected String toStringEncoding() { Map map = new LinkedHashMap(); map.put("ID", name); - map.put("Number", count == UNBOUNDED ? VCFConstants.UNBOUNDED_ENCODING_v4 : count); + Object number; + switch ( countType ) { + case A: number = VCFConstants.PER_ALLELE_COUNT; break; + case G: number = VCFConstants.PER_GENOTYPE_COUNT; break; + case UNBOUNDED: number = VCFConstants.UNBOUNDED_ENCODING_v4; break; + case INTEGER: + default: number = count; + } + map.put("Number", number); map.put("Type", type); map.put("Description", description); return lineType.toString() + "=" + VCFHeaderLine.toStringEncoding(map); @@ -136,15 +195,13 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF if ( !(o instanceof VCFCompoundHeaderLine) ) return false; VCFCompoundHeaderLine other = (VCFCompoundHeaderLine)o; - return name.equals(other.name) && - count == other.count && - description.equals(other.description) && - type == other.type && - lineType == other.lineType; + return equalsExcludingDescription(other) && + description.equals(other.description); } public boolean equalsExcludingDescription(VCFCompoundHeaderLine other) { return count == other.count && + countType == other.countType && type == other.type && lineType == other.lineType && name.equals(other.name); diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFConstants.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFConstants.java index 695c46c27..91cf86c70 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFConstants.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFConstants.java @@ -99,6 +99,8 @@ public final class VCFConstants { public static final String MISSING_DEPTH_v3 = "-1"; public static final String UNBOUNDED_ENCODING_v4 = "."; public static final String UNBOUNDED_ENCODING_v3 = "-1"; + public static final String PER_ALLELE_COUNT = "A"; + public static final String PER_GENOTYPE_COUNT = "G"; public static final String EMPTY_ALLELE = "."; public static final String EMPTY_GENOTYPE = "./."; public static final double MAX_GENOTYPE_QUAL = 99.0; diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java index 352be3e97..f68cb670b 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java @@ -16,6 +16,10 @@ public class VCFFormatHeaderLine extends VCFCompoundHeaderLine { throw new IllegalArgumentException("Flag is an unsupported type for format fields"); } + public VCFFormatHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) { + super(name, count, type, description, SupportedHeaderLineType.INFO); + } + protected VCFFormatHeaderLine(String line, VCFHeaderVersion version) { super(line, version, SupportedHeaderLineType.FORMAT); } diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFHeaderLineCount.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFHeaderLineCount.java new file mode 100644 index 000000000..d615c7c78 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFHeaderLineCount.java @@ -0,0 +1,8 @@ +package org.broadinstitute.sting.utils.codecs.vcf; + +/** + * the count encodings we use for fields in VCF header lines + */ +public enum VCFHeaderLineCount { + INTEGER, A, G, UNBOUNDED; +} diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFInfoHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFInfoHeaderLine.java index 135a5c1a1..9b20f38a1 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFInfoHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFInfoHeaderLine.java @@ -13,6 +13,10 @@ public class VCFInfoHeaderLine extends VCFCompoundHeaderLine { super(name, count, type, description, SupportedHeaderLineType.INFO); } + public VCFInfoHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) { + super(name, count, type, description, SupportedHeaderLineType.INFO); + } + protected VCFInfoHeaderLine(String line, VCFHeaderVersion version) { super(line, version, SupportedHeaderLineType.INFO); } From e93052a51e88ddb77c8ce71cf6a14a449ca3b1aa Mon Sep 17 00:00:00 2001 From: Khalid Shakir Date: Mon, 11 Jul 2011 19:17:58 -0400 Subject: [PATCH 072/214] When generating the QGraph, don't regenerate if there aren't scatter/gather jobs. Fixed a display issue with the number of milliseconds that Queue has tried to contact LSF. --- .../sting/queue/engine/QGraph.scala | 44 ++++++++++--------- .../queue/engine/lsf/Lsf706JobRunner.scala | 6 +-- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala index bfcc4d48c..8ed3f84c1 100755 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala @@ -138,30 +138,32 @@ class QGraph extends Logging { validate() if (running && numMissingValues == 0) { - logger.info("Generating scatter gather jobs.") val scatterGathers = jobGraph.edgeSet.filter(edge => scatterGatherable(edge)) + if (!scatterGathers.isEmpty) { + logger.info("Generating scatter gather jobs.") - var addedFunctions = List.empty[QFunction] - for (scatterGather <- scatterGathers) { - val functions = scatterGather.asInstanceOf[FunctionEdge] - .function.asInstanceOf[ScatterGatherableFunction] - .generateFunctions() - addedFunctions ++= functions + var addedFunctions = List.empty[QFunction] + for (scatterGather <- scatterGathers) { + val functions = scatterGather.asInstanceOf[FunctionEdge] + .function.asInstanceOf[ScatterGatherableFunction] + .generateFunctions() + addedFunctions ++= functions + } + + logger.info("Removing original jobs.") + this.jobGraph.removeAllEdges(scatterGathers) + prune() + + logger.info("Adding scatter gather jobs.") + addedFunctions.foreach(function => if (running) this.add(function)) + + logger.info("Regenerating graph.") + fill + val scatterGatherDotFile = if (settings.expandedDotFile != null) settings.expandedDotFile else settings.dotFile + if (scatterGatherDotFile != null) + renderToDot(scatterGatherDotFile) + validate() } - - logger.info("Removing original jobs.") - this.jobGraph.removeAllEdges(scatterGathers) - prune() - - logger.info("Adding scatter gather jobs.") - addedFunctions.foreach(function => if (running) this.add(function)) - - logger.info("Regenerating graph.") - fill - val scatterGatherDotFile = if (settings.expandedDotFile != null) settings.expandedDotFile else settings.dotFile - if (scatterGatherDotFile != null) - renderToDot(scatterGatherDotFile) - validate() } } diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala index 57d133dfe..ac2f036b4 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala @@ -286,11 +286,11 @@ object Lsf706JobRunner extends Logging { // LSB_SHAREDIR/cluster_name/logdir/lsb.acct (man bacct) // LSB_SHAREDIR/cluster_name/logdir/lsb.events (man bhist) logger.debug("Job Id %s status / exitStatus / exitInfo: ??? / ??? / ???".format(runner.jobId)) - val unknownStatusSeconds = (System.currentTimeMillis - runner.lastStatusUpdate) - if (unknownStatusSeconds > (unknownStatusMaxSeconds * 1000L)) { + val unknownStatusMillis = (System.currentTimeMillis - runner.lastStatusUpdate) + if (unknownStatusMillis > (unknownStatusMaxSeconds * 1000L)) { // Unknown status has been returned for a while now. runner.updateStatus(RunnerStatus.FAILED) - logger.error("Unable to read LSF status for %d minutes: job id %d: %s".format(unknownStatusSeconds/60, runner.jobId, runner.function.description)) + logger.error("Unable to read LSF status for %0.2f minutes: job id %d: %s".format(unknownStatusMillis/(60 * 1000D), runner.jobId, runner.function.description)) } } From 5e593793af43153e844f69c0f0df367b1d56a658 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 11 Jul 2011 23:10:27 -0400 Subject: [PATCH 077/214] DiffEngine utility function simpleDiffFiles printSummaryReport now uses GATKReport for nice formating Moved print formatting arguments into inner class provided to printing functions themselves, not the class BAMDiffableReader only reads 1000 entries to avoid performance issue. Work around for BAM files with non-unique names Uncommented all of the incorrectly commented out CombineVariants integrationtests BaseTest now uses DiffEngine to provide inline differences to VCF and BAM files --- .../org/broadinstitute/sting/BaseTest.java | 15 +- .../CombineVariantsIntegrationTest.java | 142 +++++++++--------- 2 files changed, 83 insertions(+), 74 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/BaseTest.java b/public/java/test/org/broadinstitute/sting/BaseTest.java index b469c8a41..b3e422ba9 100755 --- a/public/java/test/org/broadinstitute/sting/BaseTest.java +++ b/public/java/test/org/broadinstitute/sting/BaseTest.java @@ -4,6 +4,7 @@ import org.apache.commons.io.FileUtils; import org.apache.log4j.*; import org.apache.log4j.spi.LoggingEvent; import org.broadinstitute.sting.commandline.CommandLineUtils; +import org.broadinstitute.sting.gatk.walkers.diffengine.DiffEngine; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.testng.Assert; @@ -334,11 +335,14 @@ public abstract class BaseTest { if (parameterize || expectedMD5.equals("")) { // Don't assert - } else { - Assert.assertEquals(filemd5sum, expectedMD5, name + " Mismatching MD5s"); + } else if ( filemd5sum.equals(expectedMD5) ) { System.out.println(String.format(" => %s PASSED", name)); + } else { + Assert.fail(String.format("%s has mismatching MD5s: expected=%s observed=%s", name, expectedMD5, filemd5sum)); } + + return filemd5sum; } @@ -381,7 +385,12 @@ public abstract class BaseTest { System.out.printf("##### Path to calculated file (MD5=%s): %s%n", filemd5sum, pathToFileMD5File); System.out.printf("##### Diff command: diff %s %s%n", pathToExpectedMD5File, pathToFileMD5File); - // todo -- add support for simple inline display of the first N differences for text file + // inline differences + DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(System.out, 20, 10, 0); + boolean success = DiffEngine.simpleDiffFiles(new File(pathToExpectedMD5File), new File(pathToFileMD5File), params); + if ( success ) + System.out.printf("Note that the above list is not comprehensive. At most 20 lines of output, and 10 specific differences will be listed. Please use -T DiffObjects -R public/testdata/exampleFASTA.fasta -m %s -t %s to explore the differences more freely%n", + pathToExpectedMD5File, pathToFileMD5File); } } 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 33a20f7b5..600718aa0 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 @@ -34,76 +34,76 @@ import java.util.Arrays; * Tests CombineVariants */ public class CombineVariantsIntegrationTest extends WalkerTest { -// public static String baseTestString(String args) { -// 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, String args, boolean vcf3) { -// WalkerTestSpec spec = new WalkerTestSpec( -// baseTestString(" -priority v1 -B:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file + args), -// 1, -// Arrays.asList(md5)); -// executeTest("testInOut1--" + file, spec); -// } -// -// public void combine2(String file1, String file2, String args, String md5, boolean vcf3) { -// WalkerTestSpec spec = new WalkerTestSpec( -// baseTestString(" -priority v1,v2 -B:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file1 + " -B:v2,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file2 + args), -// 1, -// Arrays.asList(md5)); -// executeTest("combine2 1:" + new File(file1).getName() + " 2:" + new File(file2).getName(), spec); -// } -// -// public void combineSites(String args, String md5) { -// String file1 = "1000G_omni2.5.b37.sites.vcf"; -// String file2 = "hapmap_3.3.b37.sites.vcf"; -// WalkerTestSpec spec = new WalkerTestSpec( -// "-T CombineVariants -NO_HEADER -o %s -R " + b37KGReference -// + " -L 1:1-10,000,000 -B:omni,VCF " + validationDataLocation + file1 -// + " -B:hm3,VCF " + validationDataLocation + file2 + args, -// 1, -// Arrays.asList(md5)); -// executeTest("combineSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, spec); -// } -// -// -// @Test public void test1SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2117fff6e0d182cd20be508e9661829c", true); } -// @Test public void test2SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2cfaf7af3dd119df08b8a9c1f72e2f93", " -setKey foo", true); } -// @Test public void test3SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "1474ac0fde2ce42a3c24f1c97eab333e", " -setKey null", true); } -// @Test public void testOfficialCEUPilotCalls() { test1InOut("CEU.trio.2010_03.genotypes.vcf.gz", "7fc66df048a0ab08cf507906e1d4a308", false); } // official project VCF files in tabix format -// -// @Test public void test1Indel1() { test1InOut("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "ec9715f53dbf4531570557c212822f12", false); } -// @Test public void test1Indel2() { test1InOut("CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "f1072be5f5c6ee810276d9ca6537224d", false); } -// -// @Test public void combineTrioCalls() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", "", "b77a1eec725201d9d8e74ee0c45638d3", 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", "802977fdfd2f4905b501bb06800f60af", 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", "", "a67157287dd2b24b5cdf7ebf8fcbbe9a", false); } -// -// @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "e1f4718a179f1196538a33863da04f53", false); } -// -// @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "b3783384b7c8e877b971033e90beba48", true); } -// -// @Test public void omniHM3Union() { combineSites(" -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED", "902e541c87caa72134db6293fc46f0ad"); } -// @Test public void omniHM3Intersect() { combineSites(" -filteredRecordsMergeType KEEP_IF_ALL_UNFILTERED", "f339ad4bb5863b58b9c919ce7d040bb9"); } -// -// @Test public void threeWayWithRefs() { -// WalkerTestSpec spec = new WalkerTestSpec( -// baseTestString(" -B:NA19240_BGI,VCF "+validationDataLocation+"NA19240.BGI.RG.vcf" + -// " -B:NA19240_ILLUMINA,VCF "+validationDataLocation+"NA19240.ILLUMINA.RG.vcf" + -// " -B:NA19240_WUGSC,VCF "+validationDataLocation+"NA19240.WUGSC.RG.vcf" + -// " -B:denovoInfo,VCF "+validationDataLocation+"yri_merged_validation_data_240610.annotated.b36.vcf" + -// " -setKey centerSet" + -// " -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED" + -// " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + -// " -genotypeMergeOptions UNIQUIFY -L 1"), -// 1, -// Arrays.asList("a07995587b855f3214fb71940bf23c0f")); -// executeTest("threeWayWithRefs", spec); -// } + public static String baseTestString(String args) { + 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, String args, boolean vcf3) { + WalkerTestSpec spec = new WalkerTestSpec( + baseTestString(" -priority v1 -B:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file + args), + 1, + Arrays.asList(md5)); + executeTest("testInOut1--" + file, spec); + } + + public void combine2(String file1, String file2, String args, String md5, boolean vcf3) { + WalkerTestSpec spec = new WalkerTestSpec( + baseTestString(" -priority v1,v2 -B:v1,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file1 + " -B:v2,VCF" + (vcf3 ? "3 " : " ") + validationDataLocation + file2 + args), + 1, + Arrays.asList(md5)); + executeTest("combine2 1:" + new File(file1).getName() + " 2:" + new File(file2).getName(), spec); + } + + public void combineSites(String args, String md5) { + String file1 = "1000G_omni2.5.b37.sites.vcf"; + String file2 = "hapmap_3.3.b37.sites.vcf"; + WalkerTestSpec spec = new WalkerTestSpec( + "-T CombineVariants -NO_HEADER -o %s -R " + b37KGReference + + " -L 1:1-10,000,000 -B:omni,VCF " + validationDataLocation + file1 + + " -B:hm3,VCF " + validationDataLocation + file2 + args, + 1, + Arrays.asList(md5)); + executeTest("combineSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, spec); + } + + + @Test public void test1SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2117fff6e0d182cd20be508e9661829c", true); } + @Test public void test2SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2cfaf7af3dd119df08b8a9c1f72e2f93", " -setKey foo", true); } + @Test public void test3SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "1474ac0fde2ce42a3c24f1c97eab333e", " -setKey null", true); } + @Test public void testOfficialCEUPilotCalls() { test1InOut("CEU.trio.2010_03.genotypes.vcf.gz", "7fc66df048a0ab08cf507906e1d4a308", false); } // official project VCF files in tabix format + + @Test public void test1Indel1() { test1InOut("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "ec9715f53dbf4531570557c212822f12", false); } + @Test public void test1Indel2() { test1InOut("CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "f1072be5f5c6ee810276d9ca6537224d", false); } + + @Test public void combineTrioCalls() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", "", "b77a1eec725201d9d8e74ee0c45638d3", 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", "802977fdfd2f4905b501bb06800f60af", 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", "", "a67157287dd2b24b5cdf7ebf8fcbbe9a", false); } + + @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "e1f4718a179f1196538a33863da04f53", false); } + + @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "b3783384b7c8e877b971033e90beba48", true); } + + @Test public void omniHM3Union() { combineSites(" -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED", "902e541c87caa72134db6293fc46f0ad"); } + @Test public void omniHM3Intersect() { combineSites(" -filteredRecordsMergeType KEEP_IF_ALL_UNFILTERED", "f339ad4bb5863b58b9c919ce7d040bb9"); } + + @Test public void threeWayWithRefs() { + WalkerTestSpec spec = new WalkerTestSpec( + baseTestString(" -B:NA19240_BGI,VCF "+validationDataLocation+"NA19240.BGI.RG.vcf" + + " -B:NA19240_ILLUMINA,VCF "+validationDataLocation+"NA19240.ILLUMINA.RG.vcf" + + " -B:NA19240_WUGSC,VCF "+validationDataLocation+"NA19240.WUGSC.RG.vcf" + + " -B:denovoInfo,VCF "+validationDataLocation+"yri_merged_validation_data_240610.annotated.b36.vcf" + + " -setKey centerSet" + + " -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED" + + " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + + " -genotypeMergeOptions UNIQUIFY -L 1"), + 1, + Arrays.asList("a07995587b855f3214fb71940bf23c0f")); + executeTest("threeWayWithRefs", spec); + } // complex examples with filtering, indels, and multiple alleles @@ -119,7 +119,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { executeTest("combineComplexSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, spec); } - @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } +// @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } @Test public void complexTestMinimal() { combineComplexSites(" -minimalVCF", "0db9ef50fe54b60426474273d7c7fa99"); } @Test public void complexTestSitesOnly() { combineComplexSites(" -sites_only", "d20acb3d53ba0a02ce92d540ebeda2a9"); } @Test public void complexTestSitesOnlyMinimal() { combineComplexSites(" -sites_only -minimalVCF", "8d1b3d120515f8b56b5a0d10bc5da713"); } From 893cc2e103e25daf01018c86382869ddac0e1f4a Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 11 Jul 2011 23:15:08 -0400 Subject: [PATCH 078/214] Making the package public, so there's no dependances from public -> private --- .../walkers/diffengine/BAMDiffableReader.java | 122 +++++ .../gatk/walkers/diffengine/DiffElement.java | 118 +++++ .../gatk/walkers/diffengine/DiffEngine.java | 423 ++++++++++++++++++ .../gatk/walkers/diffengine/DiffNode.java | 239 ++++++++++ .../walkers/diffengine/DiffObjectsWalker.java | 113 +++++ .../gatk/walkers/diffengine/DiffValue.java | 90 ++++ .../walkers/diffengine/DiffableReader.java | 50 +++ .../gatk/walkers/diffengine/Difference.java | 58 +++ .../walkers/diffengine/VCFDiffableReader.java | 119 +++++ 9 files changed, 1332 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java new file mode 100644 index 000000000..f7a395d9d --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java @@ -0,0 +1,122 @@ +/* + * 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.gatk.walkers.diffengine; + +import net.sf.samtools.*; +import net.sf.samtools.util.BlockCompressedInputStream; +import org.broad.tribble.readers.AsciiLineReader; +import org.broad.tribble.readers.LineReader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; +import java.util.zip.GZIPInputStream; + + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 1:09 PM + * + * Class implementing diffnode reader for VCF + */ +public class BAMDiffableReader implements DiffableReader { + private final static int MAX_RECORDS_TO_READ = 1000; + @Override + public String getName() { return "BAM"; } + + @Override + public DiffElement readFromFile(File file) { + final SAMFileReader reader = new SAMFileReader(file, null); // null because we don't want it to look for the index + reader.setValidationStringency(SAMFileReader.ValidationStringency.SILENT); + + DiffNode root = DiffNode.rooted(file.getName()); + SAMRecordIterator iterator = reader.iterator(); + + int count = 0; + while ( iterator.hasNext() ) { + if ( count++ > MAX_RECORDS_TO_READ ) + break; + final SAMRecord record = iterator.next(); + + // name is the read name + first of pair + String name = record.getReadName().replace('.', '_'); + if ( record.getReadPairedFlag() ) { + name += record.getFirstOfPairFlag() ? "_1" : "_2"; + } + + DiffNode readRoot = DiffNode.empty(name, root); + + // add fields + readRoot.add("NAME", record.getReadName()); + readRoot.add("FLAGS", record.getFlags()); + readRoot.add("RNAME", record.getReferenceName()); + readRoot.add("POS", record.getAlignmentStart()); + readRoot.add("MAPQ", record.getMappingQuality()); + readRoot.add("CIGAR", record.getCigarString()); + readRoot.add("RNEXT", record.getMateReferenceName()); + readRoot.add("PNEXT", record.getMateAlignmentStart()); + readRoot.add("TLEN", record.getInferredInsertSize()); + readRoot.add("SEQ", record.getReadString()); + readRoot.add("QUAL", record.getBaseQualityString()); + + for ( SAMRecord.SAMTagAndValue xt : record.getAttributes() ) { + readRoot.add(xt.tag, xt.value); + } + + // add record to root + if ( ! root.hasElement(name) ) + // protect ourselves from malformed files + root.add(readRoot); + } + + reader.close(); + + return root.getBinding(); + } + + @Override + public boolean canRead(File file) { + final byte[] BAM_MAGIC = "BAM\1".getBytes(); + final byte[] buffer = new byte[BAM_MAGIC.length]; + try { + FileInputStream fstream = new FileInputStream(file); + new BlockCompressedInputStream(fstream).read(buffer,0,BAM_MAGIC.length); + return Arrays.equals(buffer, BAM_MAGIC); + } catch ( IOException e ) { + return false; + } catch ( net.sf.samtools.FileTruncatedException e ) { + return false; + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java new file mode 100644 index 000000000..eff24bb88 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java @@ -0,0 +1,118 @@ +/* + * 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.gatk.walkers.diffengine; + +import com.google.java.contract.*; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:55 PM + * + * An interface that must be implemented to allow us to calculate differences + * between structured objects + */ +@Invariant({ + "name != null", + "value != null", + "parent != null || name.equals(\"ROOT\")", + "value == null || value.getBinding() == this"}) +public class DiffElement { + public final static DiffElement ROOT = new DiffElement(); + + final private String name; + final private DiffElement parent; + final private DiffValue value; + + /** + * For ROOT only + */ + private DiffElement() { + this.name = "ROOT"; + this.parent = null; + this.value = new DiffValue(this, "ROOT"); + } + + @Requires({"name != null", "parent != null", "value != null"}) + public DiffElement(String name, DiffElement parent, DiffValue value) { + if ( name.equals("ROOT") ) throw new IllegalArgumentException("Cannot use reserved name ROOT"); + this.name = name; + this.parent = parent; + this.value = value; + this.value.setBinding(this); + } + + @Ensures({"result != null"}) + public String getName() { + return name; + } + + public DiffElement getParent() { + return parent; + } + + @Ensures({"result != null"}) + public DiffValue getValue() { + return value; + } + + public boolean isRoot() { return this == ROOT; } + + @Ensures({"result != null"}) + @Override + public String toString() { + return getName() + "=" + getValue().toString(); + } + + public String toString(int offset) { + return (offset > 0 ? Utils.dupString(' ', offset) : 0) + getName() + "=" + getValue().toString(offset); + } + + @Ensures({"result != null"}) + public final String fullyQualifiedName() { + if ( isRoot() ) + return ""; + else if ( parent.isRoot() ) + return name; + else + return parent.fullyQualifiedName() + "." + name; + } + + @Ensures({"result != null"}) + public String toOneLineString() { + return getName() + "=" + getValue().toOneLineString(); + } + + @Ensures({"result != null"}) + public DiffNode getValueAsNode() { + if ( getValue().isCompound() ) + return (DiffNode)getValue(); + else + throw new ReviewedStingException("Illegal request conversion of a DiffValue into a DiffNode: " + this); + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java new file mode 100644 index 000000000..ba2713bff --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -0,0 +1,423 @@ +/* + * 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.gatk.walkers.diffengine; + +import com.google.java.contract.Requires; +import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.report.GATKReport; +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; +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.exceptions.UserException; + +import java.io.File; +import java.io.PrintStream; +import java.util.*; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:51 PM + * A generic engine for comparing tree-structured objects + */ +public class DiffEngine { + final protected static Logger logger = Logger.getLogger(DiffEngine.class); + + private final Map readers = new HashMap(); + + public DiffEngine() { + loadDiffableReaders(); + } + + // -------------------------------------------------------------------------------- + // + // difference calculation + // + // -------------------------------------------------------------------------------- + + public List diff(DiffElement master, DiffElement test) { + DiffValue masterValue = master.getValue(); + DiffValue testValue = test.getValue(); + + if ( masterValue.isCompound() && masterValue.isCompound() ) { + return diff(master.getValueAsNode(), test.getValueAsNode()); + } else if ( masterValue.isAtomic() && testValue.isAtomic() ) { + return diff(masterValue, testValue); + } else { + // structural difference in types. one is node, other is leaf + return Arrays.asList(new Difference(master, test)); + } + } + + public List diff(DiffNode master, DiffNode test) { + Set allNames = new HashSet(master.getElementNames()); + allNames.addAll(test.getElementNames()); + List diffs = new ArrayList(); + + for ( String name : allNames ) { + DiffElement masterElt = master.getElement(name); + DiffElement testElt = test.getElement(name); + if ( masterElt == null && testElt == null ) { + throw new ReviewedStingException("BUG: unexceptedly got two null elements for field: " + name); + } else if ( masterElt == null || testElt == null ) { // if either is null, we are missing a value + // todo -- should one of these be a special MISSING item? + diffs.add(new Difference(masterElt, testElt)); + } else { + diffs.addAll(diff(masterElt, testElt)); + } + } + + return diffs; + } + + public List diff(DiffValue master, DiffValue test) { + if ( master.getValue().equals(test.getValue()) ) { + return Collections.emptyList(); + } else { + return Arrays.asList(new Difference(master.getBinding(), test.getBinding())); + } + } + + // -------------------------------------------------------------------------------- + // + // Summarizing differences + // + // -------------------------------------------------------------------------------- + + /** + * Emits a summary of the diffs to out. Suppose you have the following three differences: + * + * A.X.Z:1!=2 + * A.Y.Z:3!=4 + * B.X.Z:5!=6 + * + * The above is the itemized list of the differences. The summary looks for common differences + * in the name hierarchy, counts those shared elements, and emits the differences that occur + * in order of decreasing counts. + * + * So, in the above example, what are the shared elements? + * + * A.X.Z and B.X.Z share X.Z, so there's a *.X.Z with count 2 + * A.X.Z, A.Y.Z, and B.X.Z all share *.*.Z, with count 3 + * Each of A.X.Z, A.Y.Z, and B.X.Z are individually unique, with count 1 + * + * So we would emit the following summary: + * + * *.*.Z: 3 + * *.X.Z: 2 + * A.X.Z: 1 [specific difference: 1!=2] + * A.Y.Z: 1 [specific difference: 3!=4] + * B.X.Z: 1 [specific difference: 5!=6] + * + * The algorithm to accomplish this calculation is relatively simple. Start with all of the + * concrete differences. For each pair of differences A1.A2....AN and B1.B2....BN: + * + * find the longest common subsequence Si.Si+1...SN where Ai = Bi = Si + * If i == 0, then there's no shared substructure + * If i > 0, then generate the summarized value X = *.*...Si.Si+1...SN + * if X is a known summary, increment it's count, otherwise set its count to 1 + * + * Not that only pairs of the same length are considered as potentially equivalent + * + * @param params determines how we display the items + * @param diffs + */ + public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { + printSummaryReport(summarizeDifferences(diffs), params ); + } + + public List summarizeDifferences(List diffs) { + List diffPaths = new ArrayList(diffs.size()); + + for ( Difference diff1 : diffs ) { + diffPaths.add(diffNameToPath(diff1.getFullyQualifiedName())); + } + + return summarizedDifferencesOfPaths(diffPaths); + } + + final protected static String[] diffNameToPath(String diffName) { + return diffName.split("\\."); + } + + protected List summarizedDifferencesOfPaths(List diffPaths) { + Map summaries = new HashMap(); + + // create the initial set of differences + for ( int i = 0; i < diffPaths.size(); i++ ) { + for ( int j = 0; j <= i; j++ ) { + String[] diffPath1 = diffPaths.get(i); + String[] diffPath2 = diffPaths.get(j); + if ( diffPath1.length == diffPath2.length ) { + int lcp = longestCommonPostfix(diffPath1, diffPath2); + String path = lcp > 0 ? summarizedPath(diffPath2, lcp) : Utils.join(".", diffPath2); + addSummary(summaries, path, true); + } + } + } + + // count differences + for ( String[] diffPath : diffPaths ) { + for ( SummarizedDifference sumDiff : summaries.values() ) { + if ( sumDiff.matches(diffPath) ) + addSummary(summaries, sumDiff.getPath(), false); + } + } + + List sortedSummaries = new ArrayList(summaries.values()); + Collections.sort(sortedSummaries); + return sortedSummaries; + } + + private static void addSummary(Map summaries, String path, boolean onlyCatalog) { + if ( summaries.containsKey(path) ) { + if ( ! onlyCatalog ) + summaries.get(path).incCount(); + } else { + SummarizedDifference sumDiff = new SummarizedDifference(path); + summaries.put(sumDiff.getPath(), sumDiff); + } + } + + protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { + GATKReport report = new GATKReport(); + final String tableName = "diffences"; + report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffObjectsWalker_and_SummarizedDifferences for more information"); + GATKReportTable table = report.getTable(tableName); + table.addPrimaryKey("Difference", true); + table.addColumn("NumberOfOccurrences", 0); + + int count = 0, count1 = 0; + for ( SummarizedDifference diff : sortedSummaries ) { + if ( diff.getCount() < params.minSumDiffToShow ) + // in order, so break as soon as the count is too low + break; + + if ( params.maxItemsToDisplay != 0 && count++ > params.maxItemsToDisplay ) + break; + + if ( diff.getCount() == 1 ) { + count1++; + if ( params.maxCountOneItems != 0 && count1 > params.maxCountOneItems ) + break; + } + + table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); + } + + table.write(params.out); + } + + protected static int longestCommonPostfix(String[] diffPath1, String[] diffPath2) { + int i = 0; + for ( ; i < diffPath1.length; i++ ) { + int j = diffPath1.length - i - 1; + if ( ! diffPath1[j].equals(diffPath2[j]) ) + break; + } + return i; + } + + /** + * parts is [A B C D] + * commonPostfixLength: how many parts are shared at the end, suppose its 2 + * We want to create a string *.*.C.D + * + * @param parts + * @param commonPostfixLength + * @return + */ + protected static String summarizedPath(String[] parts, int commonPostfixLength) { + int stop = parts.length - commonPostfixLength; + if ( stop > 0 ) parts = parts.clone(); + for ( int i = 0; i < stop; i++ ) { + parts[i] = "*"; + } + return Utils.join(".", parts); + } + + /** + * TODO -- all of the algorithms above should use SummarizedDifference instead + * TODO -- of some SummarizedDifferences and some low-level String[] + */ + public static class SummarizedDifference implements Comparable { + final String path; // X.Y.Z + final String[] parts; + int count = 0; + + public SummarizedDifference(String path) { + this.path = path; + this.parts = diffNameToPath(path); + } + + public void incCount() { count++; } + + public int getCount() { + return count; + } + + /** + * The fully qualified path object A.B.C etc + * @return + */ + public String getPath() { + return path; + } + + /** + * @return the length of the parts of this summary + */ + public int length() { + return this.parts.length; + } + + /** + * Returns true if the string parts matches this summary. Matches are + * must be equal() everywhere where this summary isn't *. + * @param otherParts + * @return + */ + public boolean matches(String[] otherParts) { + if ( otherParts.length != length() ) + return false; + + // TODO optimization: can start at right most non-star element + for ( int i = 0; i < length(); i++ ) { + String part = parts[i]; + if ( ! part.equals("*") && ! part.equals(otherParts[i]) ) + return false; + } + + return true; + } + + @Override + public String toString() { + return String.format("%s:%d", getPath(), getCount()); + } + + @Override + public int compareTo(SummarizedDifference other) { + // sort first highest to lowest count, then by lowest to highest path + int countCmp = Integer.valueOf(count).compareTo(other.count); + return countCmp != 0 ? -1 * countCmp : path.compareTo(other.path); + } + + + } + + // -------------------------------------------------------------------------------- + // + // plugin manager + // + // -------------------------------------------------------------------------------- + + public void loadDiffableReaders() { + List> drClasses = new PluginManager( DiffableReader.class ).getPlugins(); + + logger.info("Loading diffable modules:"); + for (Class drClass : drClasses ) { + logger.info("\t" + drClass.getSimpleName()); + + try { + DiffableReader dr = drClass.newInstance(); + readers.put(dr.getName(), dr); + } catch (InstantiationException e) { + throw new ReviewedStingException("Unable to instantiate module '" + drClass.getSimpleName() + "'"); + } catch (IllegalAccessException e) { + throw new ReviewedStingException("Illegal access error when trying to instantiate '" + drClass.getSimpleName() + "'"); + } + } + } + + protected Map getReaders() { + return readers; + } + + protected DiffableReader getReader(String name) { + return readers.get(name); + } + + /** + * Returns a reader appropriate for this file, or null if no such reader exists + * @param file + * @return + */ + public DiffableReader findReaderForFile(File file) { + for ( DiffableReader reader : readers.values() ) + if (reader.canRead(file) ) + return reader; + + return null; + } + + /** + * Returns true if reader appropriate for this file, or false if no such reader exists + * @param file + * @return + */ + public boolean canRead(File file) { + return findReaderForFile(file) != null; + } + + public DiffElement createDiffableFromFile(File file) { + DiffableReader reader = findReaderForFile(file); + if ( reader == null ) + throw new UserException("Unsupported file type: " + file); + else + return reader.readFromFile(file); + } + + public static boolean simpleDiffFiles(File masterFile, File testFile, DiffEngine.SummaryReportParams params) { + DiffEngine diffEngine = new DiffEngine(); + + if ( diffEngine.canRead(masterFile) && diffEngine.canRead(testFile) ) { + DiffElement master = diffEngine.createDiffableFromFile(masterFile); + DiffElement test = diffEngine.createDiffableFromFile(testFile); + List diffs = diffEngine.diff(master, test); + diffEngine.reportSummarizedDifferences(diffs, params); + return true; + } else { + return false; + } + } + + public static class SummaryReportParams { + PrintStream out = System.out; + int maxItemsToDisplay = 0; + int maxCountOneItems = 0; + int minSumDiffToShow = 0; + + public SummaryReportParams(PrintStream out, int maxItemsToDisplay, int maxCountOneItems, int minSumDiffToShow) { + this.out = out; + this.maxItemsToDisplay = maxItemsToDisplay; + this.maxCountOneItems = maxCountOneItems; + this.minSumDiffToShow = minSumDiffToShow; + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java new file mode 100644 index 000000000..0720e18c0 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java @@ -0,0 +1,239 @@ +/* + * 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.gatk.walkers.diffengine; + +import com.google.java.contract.Requires; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.*; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:55 PM + * + * An interface that must be implemented to allow us to calculate differences + * between structured objects + */ +public class DiffNode extends DiffValue { + private Map getElementMap() { + return (Map)super.getValue(); + } + private static Map emptyElements() { return new HashMap(); } + + private DiffNode(Map elements) { + super(elements); + } + + private DiffNode(DiffElement binding, Map elements) { + super(binding, elements); + } + + // --------------------------------------------------------------------------- + // + // constructors + // + // --------------------------------------------------------------------------- + + public static DiffNode rooted(String name) { + return empty(name, DiffElement.ROOT); + } + + public static DiffNode empty(String name, DiffElement parent) { + DiffNode df = new DiffNode(emptyElements()); + DiffElement elt = new DiffElement(name, parent, df); + df.setBinding(elt); + return df; + } + + public static DiffNode empty(String name, DiffValue parent) { + return empty(name, parent.getBinding()); + } + + // --------------------------------------------------------------------------- + // + // accessors + // + // --------------------------------------------------------------------------- + + @Override + public boolean isAtomic() { return false; } + + public Collection getElementNames() { + return getElementMap().keySet(); + } + + public Collection getElements() { + return getElementMap().values(); + } + + private Collection getElements(boolean atomicOnly) { + List elts = new ArrayList(); + for ( DiffElement elt : getElements() ) + if ( (atomicOnly && elt.getValue().isAtomic()) || (! atomicOnly && elt.getValue().isCompound())) + elts.add(elt); + return elts; + } + + public Collection getAtomicElements() { + return getElements(true); + } + + public Collection getCompoundElements() { + return getElements(false); + } + + public DiffElement getElement(String name) { + for ( DiffElement elt : getElements() ) + if ( elt.getName().equals(name) ) + return elt; + return null; + } + + /** + * Returns true if name is bound in this node + * @param name + * @return + */ + public boolean hasElement(String name) { + return getElement(name) != null; + } + + // --------------------------------------------------------------------------- + // + // add + // + // --------------------------------------------------------------------------- + + @Requires("elt != null") + public void add(DiffElement elt) { + if ( getElementMap().containsKey(elt.getName()) ) + throw new IllegalArgumentException("Attempting to rebind already existing binding: " + elt + " node=" + this); + getElementMap().put(elt.getName(), elt); + } + + @Requires("elt != null") + public void add(DiffValue elt) { + add(elt.getBinding()); + } + + @Requires("elts != null") + public void add(Collection elts) { + for ( DiffElement e : elts ) + add(e); + } + + public void add(String name, Object value) { + add(new DiffElement(name, this.getBinding(), new DiffValue(value))); + } + + // --------------------------------------------------------------------------- + // + // toString + // + // --------------------------------------------------------------------------- + + @Override + public String toString() { + return toString(0); + } + + @Override + public String toString(int offset) { + String off = offset > 0 ? Utils.dupString(' ', offset) : ""; + StringBuilder b = new StringBuilder(); + + b.append("(").append("\n"); + Collection atomicElts = getAtomicElements(); + for ( DiffElement elt : atomicElts ) { + b.append(elt.toString(offset + 2)).append('\n'); + } + + for ( DiffElement elt : getCompoundElements() ) { + b.append(elt.toString(offset + 4)).append('\n'); + } + b.append(off).append(")").append("\n"); + + return b.toString(); + } + + @Override + public String toOneLineString() { + StringBuilder b = new StringBuilder(); + + b.append('('); + List parts = new ArrayList(); + for ( DiffElement elt : getElements() ) + parts.add(elt.toOneLineString()); + b.append(Utils.join(" ", parts)); + b.append(')'); + + return b.toString(); + } + + // -------------------------------------------------------------------------------- + // + // fromString and toOneLineString + // + // -------------------------------------------------------------------------------- + + public static DiffElement fromString(String tree) { + return fromString(tree, DiffElement.ROOT); + } + + /** + * Doesn't support full tree structure parsing + * @param tree + * @param parent + * @return + */ + private static DiffElement fromString(String tree, DiffElement parent) { + // X=(A=A B=B C=(D=D)) + String[] parts = tree.split("=", 2); + if ( parts.length != 2 ) + throw new ReviewedStingException("Unexpected tree structure: " + tree + " parts=" + parts); + String name = parts[0]; + String value = parts[1]; + + if ( value.length() == 0 ) + throw new ReviewedStingException("Illegal tree structure: " + value + " at " + tree); + + if ( value.charAt(0) == '(' ) { + if ( ! value.endsWith(")") ) + throw new ReviewedStingException("Illegal tree structure. Missing ): " + value + " at " + tree); + String subtree = value.substring(1, value.length()-1); + DiffNode rec = DiffNode.empty(name, parent); + String[] subParts = subtree.split(" "); + for ( String subPart : subParts ) { + rec.add(fromString(subPart, rec.getBinding())); + } + return rec.getBinding(); + } else { + return new DiffValue(name, parent, value).getBinding(); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java new file mode 100644 index 000000000..a08108db2 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -0,0 +1,113 @@ +/* + * 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.gatk.walkers.diffengine; + +import org.apache.xmlbeans.impl.tool.Diff; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.gatk.walkers.RodWalker; + +import java.io.File; +import java.io.PrintStream; +import java.util.List; + +/** + * Compares two record-oriented files, itemizing specific difference between equivalent + * records in the two files. Reports both itemized and summarized differences. + * @author Mark DePristo + * @version 0.1 + */ +@Requires(value={}) +public class DiffObjectsWalker extends RodWalker { + @Output(doc="File to which results should be written",required=true) + protected PrintStream out; + + @Argument(fullName="maxRecords", shortName="M", doc="Max. number of records to process", required=false) + int MAX_RECORDS = 0; + + @Argument(fullName="maxCount1Records", shortName="M1", doc="Max. number of records occuring exactly once in the file to process", required=false) + int MAX_COUNT1_RECORDS = 0; + + @Argument(fullName="minCountForDiff", shortName="MCFD", doc="Min number of observations for a records to display", required=false) + int minCountForDiff = 1; + + @Argument(fullName="showItemizedDifferences", shortName="SID", doc="Should we enumerate all differences between the files?", required=false) + boolean showItemizedDifferences = false; + + @Argument(fullName="master", shortName="m", doc="Master file: expected results", required=true) + File masterFile; + + @Argument(fullName="test", shortName="t", doc="Test file: new results to compare to the master file", required=true) + File testFile; + + final DiffEngine diffEngine = new DiffEngine(); + + @Override + public void initialize() { + + } + + @Override + public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + return 0; + } + + @Override + public Integer reduceInit() { + return 0; + } + + @Override + public Integer reduce(Integer counter, Integer sum) { + return counter + sum; + } + + @Override + public void onTraversalDone(Integer sum) { + out.printf("Reading master file %s%n", masterFile); + DiffElement master = diffEngine.createDiffableFromFile(masterFile); + out.printf("Reading test file %s%n", testFile); + DiffElement test = diffEngine.createDiffableFromFile(testFile); + +// out.printf("Master diff objects%n"); +// out.println(master.toString()); +// out.printf("Test diff objects%n"); +// out.println(test.toString()); + + List diffs = diffEngine.diff(master, test); + if ( showItemizedDifferences ) { + out.printf("Itemized results%n"); + for ( Difference diff : diffs ) + out.printf("DIFF: %s%n", diff.toString()); + } + + DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(out, MAX_RECORDS, MAX_COUNT1_RECORDS, minCountForDiff); + diffEngine.reportSummarizedDifferences(diffs, params); + } +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java new file mode 100644 index 000000000..7245e9e8d --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java @@ -0,0 +1,90 @@ +/* + * 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.gatk.walkers.diffengine; + +import org.broadinstitute.sting.utils.Utils; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:55 PM + * + * An interface that must be implemented to allow us to calculate differences + * between structured objects + */ +public class DiffValue { + private DiffElement binding = null; + final private Object value; + + public DiffValue(Object value) { + this.value = value; + } + + public DiffValue(DiffElement binding, Object value) { + this.binding = binding; + this.value = value; + } + + public DiffValue(DiffValue parent, Object value) { + this(parent.getBinding(), value); + } + + public DiffValue(String name, DiffElement parent, Object value) { + this.binding = new DiffElement(name, parent, this); + this.value = value; + } + + public DiffValue(String name, DiffValue parent, Object value) { + this(name, parent.getBinding(), value); + } + + public DiffElement getBinding() { + return binding; + } + + protected void setBinding(DiffElement binding) { + this.binding = binding; + } + + public Object getValue() { + return value; + } + + public String toString() { + return getValue().toString(); + } + + public String toString(int offset) { + return toString(); + } + + public String toOneLineString() { + return getValue().toString(); + } + + public boolean isAtomic() { return true; } + public boolean isCompound() { return ! isAtomic(); } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java new file mode 100644 index 000000000..84c2eed10 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java @@ -0,0 +1,50 @@ +/* + * 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.gatk.walkers.diffengine; + +import com.google.java.contract.Ensures; +import com.google.java.contract.Requires; + +import java.io.File; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 1:09 PM + * + * Interface for readers creating diffable objects from a file + */ +public interface DiffableReader { + @Ensures("result != null") + public String getName(); + + @Ensures("result != null") + @Requires("file != null") + public DiffElement readFromFile(File file); + + @Requires("file != null") + public boolean canRead(File file); +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java new file mode 100644 index 000000000..6627a4cc5 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java @@ -0,0 +1,58 @@ +/* + * 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.gatk.walkers.diffengine; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:53 PM + * + * Represents a specific difference between two specific DiffElements + */ +public class Difference { + DiffElement master, test; + + public Difference(DiffElement master, DiffElement test) { + if ( master == null && test == null ) throw new IllegalArgumentException("Master and test both cannot be null"); + this.master = master; + this.test = test; + } + + public String toString() { + return String.format("%s:%s!=%s", + getFullyQualifiedName(), + getOneLineString(master), + getOneLineString(test)); + } + + public String getFullyQualifiedName() { + return (master == null ? test : master).fullyQualifiedName(); + } + + private static String getOneLineString(DiffElement elt) { + return elt == null ? "MISSING" : elt.getValue().toOneLineString(); + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java new file mode 100644 index 000000000..743178538 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -0,0 +1,119 @@ +/* + * 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.gatk.walkers.diffengine; + +import org.broad.tribble.readers.AsciiLineReader; +import org.broad.tribble.readers.LineReader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.io.*; +import java.util.Arrays; +import java.util.Map; +import java.util.zip.GZIPInputStream; + + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 1:09 PM + * + * Class implementing diffnode reader for VCF + */ +public class VCFDiffableReader implements DiffableReader { + @Override + public String getName() { return "VCF"; } + + @Override + public DiffElement readFromFile(File file) { + DiffNode root = DiffNode.rooted(file.getName()); + try { + LineReader lineReader = new AsciiLineReader(new FileInputStream(file)); + VCFCodec vcfCodec = new VCFCodec(); + VCFHeader header = (VCFHeader)vcfCodec.readHeader(lineReader); + + String line = lineReader.readLine(); + while ( line != null ) { + VariantContext vc = (VariantContext)vcfCodec.decode(line); + String name = vc.getChr() + ":" + vc.getStart(); + DiffNode vcRoot = DiffNode.empty(name, root); + + // add fields + vcRoot.add("CHROM", vc.getChr()); + vcRoot.add("POS", vc.getStart()); + vcRoot.add("ID", vc.hasID() ? vc.getID() : VCFConstants.MISSING_VALUE_v4); + vcRoot.add("REF", vc.getReference()); + vcRoot.add("ALT", vc.getAlternateAlleles()); + vcRoot.add("QUAL", vc.hasNegLog10PError() ? vc.getNegLog10PError() * 10 : VCFConstants.MISSING_VALUE_v4); + vcRoot.add("FILTER", vc.getFilters()); + + // add info fields + for (Map.Entry attribute : vc.getAttributes().entrySet()) { + if ( ! attribute.getKey().startsWith("_") && ! attribute.getKey().equals(VariantContext.ID_KEY)) + vcRoot.add(attribute.getKey(), attribute.getValue()); + } + + for (Genotype g : vc.getGenotypes().values() ) { + DiffNode gRoot = DiffNode.empty(g.getSampleName(), vcRoot); + gRoot.add("GT", g.getGenotypeString()); + gRoot.add("GQ", g.hasNegLog10PError() ? g.getNegLog10PError() * 10 : VCFConstants.MISSING_VALUE_v4 ); + + for (Map.Entry attribute : g.getAttributes().entrySet()) { + if ( ! attribute.getKey().startsWith("_") ) + gRoot.add(attribute.getKey(), attribute.getValue()); + } + + vcRoot.add(gRoot); + } + + root.add(vcRoot); + line = lineReader.readLine(); + } + + lineReader.close(); + } catch ( IOException e ) { + return null; + } + + return root.getBinding(); + } + + @Override + public boolean canRead(File file) { + try { + final String VCF4_HEADER = "##fileformat=VCFv4"; + char[] buff = new char[VCF4_HEADER.length()]; + new FileReader(file).read(buff, 0, VCF4_HEADER.length()); + String firstLine = new String(buff); + return firstLine.startsWith(VCF4_HEADER); + } catch ( IOException e ) { + return false; + } + } +} From d7d15019dd543decffa2169f074b123633fe5984 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Tue, 12 Jul 2011 01:16:21 -0400 Subject: [PATCH 080/214] Adding support for other simple header line types (e.g. ALT) and cleaning up the interface a bit. --- .../walkers/annotator/ChromosomeCounts.java | 5 +- .../walkers/genotyper/UnifiedGenotyper.java | 17 +++- .../utils/codecs/vcf/StandardVCFWriter.java | 3 +- .../utils/codecs/vcf/VCFAltHeaderLine.java | 28 +++++++ .../codecs/vcf/VCFCompoundHeaderLine.java | 3 + .../utils/codecs/vcf/VCFFilterHeaderLine.java | 48 +---------- .../utils/codecs/vcf/VCFFormatHeaderLine.java | 2 +- .../utils/codecs/vcf/VCFSimpleHeaderLine.java | 81 +++++++++++++++++++ .../sting/utils/codecs/vcf/VCFUtils.java | 15 ---- 9 files changed, 135 insertions(+), 67 deletions(-) create mode 100644 public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFAltHeaderLine.java create mode 100644 public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFSimpleHeaderLine.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java index 143722d7c..ed10d2072 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; @@ -41,8 +42,8 @@ import java.util.*; public class ChromosomeCounts implements InfoFieldAnnotation, StandardAnnotation { private String[] keyNames = { VCFConstants.ALLELE_NUMBER_KEY, VCFConstants.ALLELE_COUNT_KEY, VCFConstants.ALLELE_FREQUENCY_KEY }; - private VCFInfoHeaderLine[] descriptions = { new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY, -1, VCFHeaderLineType.Float, "Allele Frequency, for each ALT allele, in the same order as listed"), - new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY, -1, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"), + private VCFInfoHeaderLine[] descriptions = { new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "Allele Frequency, for each ALT allele, in the same order as listed"), + new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"), new VCFInfoHeaderLine(VCFConstants.ALLELE_NUMBER_KEY, 1, VCFHeaderLineType.Integer, "Total number of alleles in called genotypes") }; public Map annotate(RefMetaDataTracker tracker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { 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 7a765c602..fe0084a19 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 @@ -37,7 +37,6 @@ import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.commandline.*; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; import java.util.*; import java.io.PrintStream; @@ -158,7 +157,7 @@ public class UnifiedGenotyper extends LocusWalker getSupportedHeaderStrings() { + Set result = new HashSet(); + result.add(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_KEY, 1, VCFHeaderLineType.String, "Genotype")); + result.add(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_QUALITY_KEY, 1, VCFHeaderLineType.Float, "Genotype Quality")); + result.add(new VCFFormatHeaderLine(VCFConstants.DEPTH_KEY, 1, VCFHeaderLineType.Integer, "Read Depth (only filtered reads used for calling)")); + result.add(new VCFFormatHeaderLine(VCFConstants.PHRED_GENOTYPE_LIKELIHOODS_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "Normalized, Phred-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; if site is not biallelic, number of likelihoods if n*(n+1)/2")); + + return result; + } + /** * Compute at a given locus. * diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index 230773310..f4996b487 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -358,9 +358,8 @@ public class StandardVCFWriter implements VCFWriter { mWriter.write(key); if ( !entry.getValue().equals("") ) { - int numVals = 1; VCFInfoHeaderLine metaData = mHeader.getInfoHeaderLine(key); - if ( metaData != null && (metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() > 0) ) { + if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) { mWriter.write("="); mWriter.write(entry.getValue()); } diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFAltHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFAltHeaderLine.java new file mode 100644 index 000000000..a9de949d8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFAltHeaderLine.java @@ -0,0 +1,28 @@ +package org.broadinstitute.sting.utils.codecs.vcf; + +/** + * @author ebanks + * A class representing a key=value entry for ALT fields in the VCF header + */ +public class VCFAltHeaderLine extends VCFSimpleHeaderLine { + + /** + * create a VCF filter header line + * + * @param name the name for this header line + * @param description the description for this header line + */ + public VCFAltHeaderLine(String name, String description) { + super(name, description, SupportedHeaderLineType.ALT); + } + + /** + * create a VCF info header line + * + * @param line the header line + * @param version the vcf header version + */ + protected VCFAltHeaderLine(String line, VCFHeaderVersion version) { + super(line, version, SupportedHeaderLineType.ALT); + } +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java index 49f9ab184..bb822f2ed 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCompoundHeaderLine.java @@ -89,6 +89,7 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF * @param count the count for this header line * @param type the type for this header line * @param description the description for this header line + * @param lineType the header line type */ protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) { super(lineType.toString(), ""); @@ -108,6 +109,7 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF * @param count the count type for this header line * @param type the type for this header line * @param description the description for this header line + * @param lineType the header line type */ protected VCFCompoundHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) { super(lineType.toString(), ""); @@ -124,6 +126,7 @@ public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCF * * @param line the header line * @param version the VCF header version + * @param lineType the header line type * */ protected VCFCompoundHeaderLine(String line, VCFHeaderVersion version, SupportedHeaderLineType lineType) { diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFilterHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFilterHeaderLine.java index 9176fc16e..418b80074 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFilterHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFilterHeaderLine.java @@ -1,19 +1,10 @@ package org.broadinstitute.sting.utils.codecs.vcf; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.Map; - - /** * @author ebanks * A class representing a key=value entry for FILTER fields in the VCF header */ -public class VCFFilterHeaderLine extends VCFHeaderLine implements VCFNamedHeaderLine { - - private String name; - private String description; - +public class VCFFilterHeaderLine extends VCFSimpleHeaderLine { /** * create a VCF filter header line @@ -22,12 +13,7 @@ public class VCFFilterHeaderLine extends VCFHeaderLine implements VCFNamedHeader * @param description the description for this header line */ public VCFFilterHeaderLine(String name, String description) { - super("FILTER", ""); - this.name = name; - this.description = description; - - if ( name == null || description == null ) - throw new IllegalArgumentException(String.format("Invalid VCFCompoundHeaderLine: key=%s name=%s desc=%s", super.getKey(), name, description )); + super(name, description, SupportedHeaderLineType.FILTER); } /** @@ -37,34 +23,6 @@ public class VCFFilterHeaderLine extends VCFHeaderLine implements VCFNamedHeader * @param version the vcf header version */ protected VCFFilterHeaderLine(String line, VCFHeaderVersion version) { - super("FILTER", ""); - Map mapping = VCFHeaderLineTranslator.parseLine(version,line, Arrays.asList("ID","Description")); - name = mapping.get("ID"); - description = mapping.get("Description"); - if ( description == null && ALLOW_UNBOUND_DESCRIPTIONS ) // handle the case where there's no description provided - description = UNBOUND_DESCRIPTION; - } - - protected String toStringEncoding() { - Map map = new LinkedHashMap(); - map.put("ID", name); - map.put("Description", description); - return "FILTER=" + VCFHeaderLine.toStringEncoding(map); - } - - public boolean equals(Object o) { - if ( !(o instanceof VCFFilterHeaderLine) ) - return false; - VCFFilterHeaderLine other = (VCFFilterHeaderLine)o; - return name.equals(other.name) && - description.equals(other.description); - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; + super(line, version, SupportedHeaderLineType.FILTER); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java index f68cb670b..474c8dd14 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFFormatHeaderLine.java @@ -17,7 +17,7 @@ public class VCFFormatHeaderLine extends VCFCompoundHeaderLine { } public VCFFormatHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) { - super(name, count, type, description, SupportedHeaderLineType.INFO); + super(name, count, type, description, SupportedHeaderLineType.FORMAT); } protected VCFFormatHeaderLine(String line, VCFHeaderVersion version) { diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFSimpleHeaderLine.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFSimpleHeaderLine.java new file mode 100644 index 000000000..152043f28 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFSimpleHeaderLine.java @@ -0,0 +1,81 @@ +package org.broadinstitute.sting.utils.codecs.vcf; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + + +/** + * @author ebanks + * A class representing a key=value entry for simple VCF header types + */ +public abstract class VCFSimpleHeaderLine extends VCFHeaderLine implements VCFNamedHeaderLine { + + public enum SupportedHeaderLineType { + FILTER, ALT; + } + + private String name; + private String description; + + // our type of line, i.e. filter, alt, etc + private final SupportedHeaderLineType lineType; + + + /** + * create a VCF filter header line + * + * @param name the name for this header line + * @param description the description for this header line + * @param lineType the header line type + */ + public VCFSimpleHeaderLine(String name, String description, SupportedHeaderLineType lineType) { + super(lineType.toString(), ""); + this.lineType = lineType; + this.name = name; + this.description = description; + + if ( name == null || description == null ) + throw new IllegalArgumentException(String.format("Invalid VCFSimpleHeaderLine: key=%s name=%s desc=%s", super.getKey(), name, description )); + } + + /** + * create a VCF info header line + * + * @param line the header line + * @param version the vcf header version + * @param lineType the header line type + */ + protected VCFSimpleHeaderLine(String line, VCFHeaderVersion version, SupportedHeaderLineType lineType) { + super(lineType.toString(), ""); + this.lineType = lineType; + Map mapping = VCFHeaderLineTranslator.parseLine(version,line, Arrays.asList("ID","Description")); + name = mapping.get("ID"); + description = mapping.get("Description"); + if ( description == null && ALLOW_UNBOUND_DESCRIPTIONS ) // handle the case where there's no description provided + description = UNBOUND_DESCRIPTION; + } + + protected String toStringEncoding() { + Map map = new LinkedHashMap(); + map.put("ID", name); + map.put("Description", description); + return lineType.toString() + "=" + VCFHeaderLine.toStringEncoding(map); + } + + public boolean equals(Object o) { + if ( !(o instanceof VCFSimpleHeaderLine) ) + return false; + VCFSimpleHeaderLine other = (VCFSimpleHeaderLine)o; + return name.equals(other.name) && + description.equals(other.description); + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java index ecede068e..4037f75b9 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java @@ -180,19 +180,4 @@ public class VCFUtils { return new HashSet(map.values()); } - - /** - * return a set of supported format lines; what we currently support for output in the genotype fields of a VCF - * @return a set of VCF format lines - */ - public static Set getSupportedHeaderStrings() { - Set result = new HashSet(); - result.add(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_KEY, 1, VCFHeaderLineType.String, "Genotype")); - result.add(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_QUALITY_KEY, 1, VCFHeaderLineType.Float, "Genotype Quality")); - result.add(new VCFFormatHeaderLine(VCFConstants.DEPTH_KEY, 1, VCFHeaderLineType.Integer, "Read Depth (only filtered reads used for calling)")); - result.add(new VCFFormatHeaderLine(VCFConstants.PHRED_GENOTYPE_LIKELIHOODS_KEY, -1, VCFHeaderLineType.Float, "Normalized, Phred-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; if site is not biallelic, number of likelihoods if n*(n+1)/2")); - - return result; - } - } \ No newline at end of file From f313e14e4ef2c3f933505bb16527313ce09e618c Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 12 Jul 2011 08:50:58 -0400 Subject: [PATCH 082/214] Now deletes the dump directory on ant clean Moving diffengine tests from private to public --- build.xml | 1 + .../diffengine/DiffEngineUnitTest.java | 229 ++++++++++++++++ .../walkers/diffengine/DiffNodeUnitTest.java | 249 ++++++++++++++++++ .../diffengine/DiffableReaderUnitTest.java | 143 ++++++++++ .../diffengine/DifferenceUnitTest.java | 95 +++++++ 5 files changed, 717 insertions(+) create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNodeUnitTest.java create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java diff --git a/build.xml b/build.xml index 80627fae0..068c69316 100644 --- a/build.xml +++ b/build.xml @@ -981,6 +981,7 @@ + diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java new file mode 100644 index 000000000..cd6c3598a --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java @@ -0,0 +1,229 @@ +/* + * 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. + */ + +// our package +package org.broadinstitute.sting.gatk.walkers.diffengine; + + +// the imports for unit testing. + +import org.broadinstitute.sting.BaseTest; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.*; + +/** + * Basic unit test for DifferableReaders in reduced reads + */ +public class DiffEngineUnitTest extends BaseTest { + DiffEngine engine; + + @BeforeClass(enabled = true) + public void createDiffEngine() { + engine = new DiffEngine(); + } + + // -------------------------------------------------------------------------------- + // + // Difference testing routines + // + // -------------------------------------------------------------------------------- + + private class DifferenceTest extends TestDataProvider { + public DiffElement tree1, tree2; + public List differences; + + private DifferenceTest(String tree1, String tree2) { + this(tree1, tree2, Collections.emptyList()); + } + + private DifferenceTest(String tree1, String tree2, String difference) { + this(tree1, tree2, Arrays.asList(difference)); + } + + private DifferenceTest(String tree1, String tree2, List differences) { + super(DifferenceTest.class); + this.tree1 = DiffNode.fromString(tree1); + this.tree2 = DiffNode.fromString(tree2); + this.differences = differences; + } + + public String toString() { + return String.format("tree1=%s tree2=%s diff=%s", + tree1.toOneLineString(), tree2.toOneLineString(), differences); + } + } + + @DataProvider(name = "trees") + public Object[][] createTrees() { + new DifferenceTest("A=X", "A=X"); + new DifferenceTest("A=X", "A=Y", "A:X!=Y"); + new DifferenceTest("A=X", "B=X", Arrays.asList("A:X!=MISSING", "B:MISSING!=X")); + new DifferenceTest("A=(X=1)", "B=(X=1)", Arrays.asList("A:(X=1)!=MISSING", "B:MISSING!=(X=1)")); + new DifferenceTest("A=(X=1)", "A=(X=1)"); + new DifferenceTest("A=(X=1 Y=2)", "A=(X=1 Y=2)"); + new DifferenceTest("A=(X=1 Y=2 B=(Z=3))", "A=(X=1 Y=2 B=(Z=3))"); + new DifferenceTest("A=(X=1)", "A=(X=2)", "A.X:1!=2"); + new DifferenceTest("A=(X=1 Y=2 B=(Z=3))", "A=(X=1 Y=2 B=(Z=4))", "A.B.Z:3!=4"); + new DifferenceTest("A=(X=1)", "A=(X=1 Y=2)", "A.Y:MISSING!=2"); + new DifferenceTest("A=(X=1 Y=2 B=(Z=3))", "A=(X=1 Y=2)", "A.B:(Z=3)!=MISSING"); + return DifferenceTest.getTests(DifferenceTest.class); + } + + @Test(enabled = true, dataProvider = "trees") + public void testDiffs(DifferenceTest test) { + logger.warn("Test tree1: " + test.tree1.toOneLineString()); + logger.warn("Test tree2: " + test.tree2.toOneLineString()); + + List diffs = engine.diff(test.tree1, test.tree2); + logger.warn("Test expected diff : " + test.differences); + logger.warn("Observed diffs : " + diffs); + } + + // -------------------------------------------------------------------------------- + // + // Low-level routines for summarizing differences + // + // -------------------------------------------------------------------------------- + + @Test(enabled = true) + public void testLongestCommonPostfix() { + testLongestCommonPostfixHelper("A", "A", 1); + testLongestCommonPostfixHelper("A", "B", 0); + testLongestCommonPostfixHelper("A.B", "A.B", 2); + testLongestCommonPostfixHelper("A.B.C", "A.B.C", 3); + testLongestCommonPostfixHelper("A.B.C", "X.B.C", 2); + testLongestCommonPostfixHelper("A.B.C", "X.Y.C", 1); + testLongestCommonPostfixHelper("A.B.C", "X.Y.Z", 0); + testLongestCommonPostfixHelper("A.B.C", "A.X.C", 1); + testLongestCommonPostfixHelper("A.B.C", "A.X.Z", 0); + testLongestCommonPostfixHelper("A.B.C", "A.B.Z", 0); + } + + public void testLongestCommonPostfixHelper(String p1, String p2, int expected) { + String[] parts1 = p1.split("\\."); + String[] parts2 = p2.split("\\."); + int obs = DiffEngine.longestCommonPostfix(parts1, parts2); + Assert.assertEquals(obs, expected, "p1=" + p1 + " p2=" + p2 + " failed"); + } + + @Test(enabled = true, dependsOnMethods = "testLongestCommonPostfix") + public void testSummarizePath() { + testSummarizePathHelper("A", "A", "A"); + testSummarizePathHelper("A", "B", "*"); + testSummarizePathHelper("A.B", "A.B", "A.B"); + testSummarizePathHelper("A.B", "X.B", "*.B"); + testSummarizePathHelper("A.B", "X.Y", "*.*"); + testSummarizePathHelper("A.B.C", "A.B.C", "A.B.C"); + testSummarizePathHelper("A.B.C", "X.B.C", "*.B.C"); + testSummarizePathHelper("A.B.C", "X.Y.C", "*.*.C"); + testSummarizePathHelper("A.B.C", "X.Y.Z", "*.*.*"); + testSummarizePathHelper("A.B.C", "A.X.C", "*.*.C"); + testSummarizePathHelper("A.B.C", "A.X.Z", "*.*.*"); + testSummarizePathHelper("A.B.C", "A.B.Z", "*.*.*"); + } + + public void testSummarizePathHelper(String p1, String p2, String expected) { + String[] parts1 = DiffEngine.diffNameToPath(p1); + String[] parts2 = DiffEngine.diffNameToPath(p2); + int obs = DiffEngine.longestCommonPostfix(parts1, parts2); + String path = DiffEngine.summarizedPath(parts2, obs); + Assert.assertEquals(path, expected, "p1=" + p1 + " p2=" + p2 + " failed"); + } + + // -------------------------------------------------------------------------------- + // + // High-level difference summary + // + // -------------------------------------------------------------------------------- + + private class SummarizeDifferenceTest extends TestDataProvider { + List diffs = new ArrayList(); + List expecteds = new ArrayList(); + + public SummarizeDifferenceTest() { super(SummarizeDifferenceTest.class); } + + public SummarizeDifferenceTest addDiff(String... diffsToAdd) { + diffs.addAll(Arrays.asList(diffsToAdd)); + return this; + } + + public SummarizeDifferenceTest addSummary(String... expectedSummary) { + expecteds.addAll(Arrays.asList(expectedSummary)); + return this; + } + + public String toString() { + return String.format("diffs=%s => expected=%s", diffs, expecteds); + } + + public void test() { + List diffPaths = new ArrayList(diffs.size()); + for ( String diff : diffs ) { diffPaths.add(DiffEngine.diffNameToPath(diff)); } + + List sumDiffs = engine.summarizedDifferencesOfPaths(diffPaths); + + Assert.assertEquals(sumDiffs.size(), expecteds.size(), "Unexpected number of summarized differences: " + sumDiffs); + + for ( int i = 0; i < sumDiffs.size(); i++ ) { + DiffEngine.SummarizedDifference sumDiff = sumDiffs.get(i); + String expected = expecteds.get(i); + String[] pathCount = expected.split(":"); + String path = pathCount[0]; + int count = Integer.valueOf(pathCount[1]); + Assert.assertEquals(sumDiff.getPath(), path, "Unexpected path at: " + expected + " obs=" + sumDiff + " all=" + sumDiffs); + Assert.assertEquals(sumDiff.getCount(), count, "Unexpected counts at: " + expected + " obs=" + sumDiff + " all=" + sumDiffs); + } + } + } + + @DataProvider(name = "summaries") + public Object[][] createSummaries() { + new SummarizeDifferenceTest().addDiff("A", "A").addSummary("A:2"); + new SummarizeDifferenceTest().addDiff("A", "B").addSummary("A:1", "B:1"); + new SummarizeDifferenceTest().addDiff("A", "A", "A").addSummary("A:3"); + new SummarizeDifferenceTest().addDiff("A", "A", "A", "B").addSummary("A:3", "B:1"); + new SummarizeDifferenceTest().addDiff("A", "A", "A", "B", "B").addSummary("A:3", "B:2"); + new SummarizeDifferenceTest().addDiff("A", "A", "A", "B", "B", "C").addSummary("A:3", "B:2", "C:1"); + new SummarizeDifferenceTest().addDiff("A.X", "A.X").addSummary("A.X:2"); + new SummarizeDifferenceTest().addDiff("A.X", "A.X", "B.X").addSummary("*.X:3", "A.X:2", "B.X:1"); + new SummarizeDifferenceTest().addDiff("A.X", "A.X", "B.X", "B.X").addSummary("*.X:4", "A.X:2", "B.X:2"); + new SummarizeDifferenceTest().addDiff("A.B.C", "X.B.C").addSummary("*.B.C:2", "A.B.C:1", "X.B.C:1"); + new SummarizeDifferenceTest().addDiff("A.B.C", "X.Y.C", "X.Y.C").addSummary("*.*.C:3", "X.Y.C:2", "A.B.C:1"); + new SummarizeDifferenceTest().addDiff("A.B.C", "A.X.C", "X.Y.C").addSummary("*.*.C:3", "A.B.C:1", "A.X.C:1", "X.Y.C:1"); + new SummarizeDifferenceTest().addDiff("A.B.C", "A.X.C", "B.X.C").addSummary("*.*.C:3", "*.X.C:2", "A.B.C:1", "A.X.C:1", "B.X.C:1"); + new SummarizeDifferenceTest().addDiff("A.B.C", "A.X.C", "B.X.C", "B.X.C").addSummary("*.*.C:4", "*.X.C:3", "B.X.C:2", "A.B.C:1", "A.X.C:1"); + + return SummarizeDifferenceTest.getTests(SummarizeDifferenceTest.class); + } + + + @Test(enabled = true, dependsOnMethods = "testSummarizePath", dataProvider = "summaries") + public void testSummarizeDifferences(SummarizeDifferenceTest test) { + test.test(); + } +} \ No newline at end of file diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNodeUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNodeUnitTest.java new file mode 100644 index 000000000..534416d29 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNodeUnitTest.java @@ -0,0 +1,249 @@ +/* + * 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. + */ + +// our package +package org.broadinstitute.sting.gatk.walkers.diffengine; + + +// the imports for unit testing. + + +import org.broadinstitute.sting.BaseTest; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.*; + +/** + * Basic unit test for DifferableReaders in reduced reads + */ +public class DiffNodeUnitTest extends BaseTest { + // Data is: + // MY_ROOT + // fields: A=A, B=B + // nodes: C, D + // C: fields: E=E, nodes: none + // D: fields: F=F, G=G, nodes: none + static DiffNode MY_ROOT = DiffNode.rooted("MY_ROOT"); + static DiffValue Value_A = new DiffValue("A", MY_ROOT, "A"); + static DiffValue Value_B = new DiffValue("B", MY_ROOT, "B"); + static DiffNode NODE_C = DiffNode.empty("C", MY_ROOT); + static DiffNode NODE_D = DiffNode.empty("D", MY_ROOT); + static DiffValue Value_E = new DiffValue("E", NODE_C, "E"); + static DiffValue Value_F = new DiffValue("F", NODE_D, "F"); + static DiffValue Value_G = new DiffValue("G", NODE_D, "G"); + + static { + MY_ROOT.add(Value_A); + MY_ROOT.add(Value_B); + MY_ROOT.add(NODE_C); + MY_ROOT.add(NODE_D); + NODE_C.add(Value_E); + NODE_D.add(Value_F); + NODE_D.add(Value_G); + } + + + // -------------------------------------------------------------------------------- + // + // Element testing routines + // + // -------------------------------------------------------------------------------- + + private class ElementTest extends TestDataProvider { + public DiffElement elt; + public String name; + public String fullName; + public DiffElement parent; + + private ElementTest(DiffValue elt, DiffValue parent, String name, String fullName) { + this(elt.getBinding(), parent.getBinding(), name, fullName); + } + + private ElementTest(DiffElement elt, DiffElement parent, String name, String fullName) { + super(ElementTest.class); + this.elt = elt; + this.name = name; + this.fullName = fullName; + this.parent = parent; + } + + public String toString() { + return String.format("ElementTest elt=%s name=%s fullName=%s parent=%s", + elt.toOneLineString(), name, fullName, parent.getName()); + } + } + + @DataProvider(name = "elementdata") + public Object[][] createElementData() { + new ElementTest(MY_ROOT.getBinding(), DiffElement.ROOT, "MY_ROOT", "MY_ROOT"); + new ElementTest(NODE_C, MY_ROOT, "C", "MY_ROOT.C"); + new ElementTest(NODE_D, MY_ROOT, "D", "MY_ROOT.D"); + new ElementTest(Value_A, MY_ROOT, "A", "MY_ROOT.A"); + new ElementTest(Value_B, MY_ROOT, "B", "MY_ROOT.B"); + new ElementTest(Value_E, NODE_C, "E", "MY_ROOT.C.E"); + new ElementTest(Value_F, NODE_D, "F", "MY_ROOT.D.F"); + new ElementTest(Value_G, NODE_D, "G", "MY_ROOT.D.G"); + return TestDataProvider.getTests(ElementTest.class); + } + + @Test(enabled = true, dataProvider = "elementdata") + public void testElementMethods(ElementTest test) { + Assert.assertNotNull(test.elt.getName()); + Assert.assertNotNull(test.elt.getParent()); + Assert.assertEquals(test.elt.getName(), test.name); + Assert.assertEquals(test.elt.getParent(), test.parent); + Assert.assertEquals(test.elt.fullyQualifiedName(), test.fullName); + } + + // -------------------------------------------------------------------------------- + // + // DiffValue testing routines + // + // -------------------------------------------------------------------------------- + + private class LeafTest extends TestDataProvider { + public DiffValue diffvalue; + public Object value; + + private LeafTest(DiffValue diffvalue, Object value) { + super(LeafTest.class); + this.diffvalue = diffvalue; + this.value = value; + } + + public String toString() { + return String.format("LeafTest diffvalue=%s value=%s", diffvalue.toOneLineString(), value); + } + } + + @DataProvider(name = "leafdata") + public Object[][] createLeafData() { + new LeafTest(Value_A, "A"); + new LeafTest(Value_B, "B"); + new LeafTest(Value_E, "E"); + new LeafTest(Value_F, "F"); + new LeafTest(Value_G, "G"); + return TestDataProvider.getTests(LeafTest.class); + } + + @Test(enabled = true, dataProvider = "leafdata") + public void testLeafMethods(LeafTest test) { + Assert.assertNotNull(test.diffvalue.getValue()); + Assert.assertEquals(test.diffvalue.getValue(), test.value); + } + + // -------------------------------------------------------------------------------- + // + // Node testing routines + // + // -------------------------------------------------------------------------------- + + private class NodeTest extends TestDataProvider { + public DiffNode node; + public Set fields; + public Set subnodes; + public Set allNames; + + private NodeTest(DiffNode node, List fields, List subnodes) { + super(NodeTest.class); + this.node = node; + this.fields = new HashSet(fields); + this.subnodes = new HashSet(subnodes); + this.allNames = new HashSet(fields); + allNames.addAll(subnodes); + } + + public String toString() { + return String.format("NodeTest node=%s fields=%s subnodes=%s", + node.toOneLineString(), fields, subnodes); + } + } + + @DataProvider(name = "nodedata") + public Object[][] createData1() { + new NodeTest(MY_ROOT, Arrays.asList("A", "B"), Arrays.asList("C", "D")); + new NodeTest(NODE_C, Arrays.asList("E"), Collections.emptyList()); + new NodeTest(NODE_D, Arrays.asList("F", "G"), Collections.emptyList()); + return TestDataProvider.getTests(NodeTest.class); + } + + @Test(enabled = true, dataProvider = "nodedata") + public void testNodeAccessors(NodeTest test) { + Assert.assertNotNull(test.node.getElements()); + + for ( String name : test.allNames ) { + DiffElement elt = test.node.getElement(name); + Assert.assertNotNull(elt, "Failed to find field " + elt + " in " + test.node); + Assert.assertEquals(elt.getName(), name); + Assert.assertEquals(elt.getValue().isAtomic(), test.fields.contains(name), "Failed atomic/compound expectation: " + test.node); + } + } + + // NOTE: add routines are being implicitly tested by the creation of the data structures + + @Test(enabled = true, dataProvider = "nodedata") + public void testCounts(NodeTest test) { + Assert.assertEquals(test.node.getElements().size(), test.allNames.size()); + Assert.assertEquals(test.node.getElementNames(), test.allNames); + } + + // -------------------------------------------------------------------------------- + // + // fromString testing routines + // + // -------------------------------------------------------------------------------- + + private class FromStringTest extends TestDataProvider { + public String string; + public DiffElement expected; + + private FromStringTest(String string, DiffElement expected) { + super(FromStringTest.class); + this.string = string; + this.expected = expected; + } + + public String toString() { + return String.format("FromStringTest string=%s expected=%s", string, expected.toOneLineString()); + } + } + + @DataProvider(name = "fromstringdata") + public Object[][] createFromData() { + new FromStringTest("A=A", Value_A.getBinding()); + new FromStringTest("B=B", Value_B.getBinding()); + new FromStringTest("C=(E=E)", NODE_C.getBinding()); + new FromStringTest("D=(F=F G=G)", NODE_D.getBinding()); + return TestDataProvider.getTests(FromStringTest.class); + } + + @Test(enabled = true, dataProvider = "fromstringdata") + public void parseFromString(FromStringTest test) { + logger.warn("Testing from string: " + test.string); + DiffElement elt = DiffNode.fromString(test.string); + Assert.assertEquals(elt.toOneLineString(), test.expected.toOneLineString()); + } +} \ No newline at end of file diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java new file mode 100644 index 000000000..5738b643f --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java @@ -0,0 +1,143 @@ +/* + * 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. + */ + +// our package +package org.broadinstitute.sting.gatk.walkers.diffengine; + + +// the imports for unit testing. + + +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.*; + +/** + * Basic unit test for DifferableReaders in reduced reads + */ +public class DiffableReaderUnitTest extends BaseTest { + DiffEngine engine; + + File vcfFile = new File(testDir + "diffTestMaster.vcf"); + File bamFile = new File(testDir + "exampleBAM.bam"); + + @BeforeClass(enabled = true) + public void createDiffEngine() { + engine = new DiffEngine(); + } + + @Test(enabled = true) + public void testPluggableDiffableReaders() { + logger.warn("testPluggableDiffableReaders"); + Map readers = engine.getReaders(); + Assert.assertNotNull(readers); + Assert.assertTrue(readers.size() > 0); + Assert.assertNotNull(readers.get("VCF")); + for ( Map.Entry e : engine.getReaders().entrySet() ) { + logger.warn("Found diffable reader: " + e.getKey()); + Assert.assertEquals(e.getValue().getName(), e.getKey()); + Assert.assertEquals(e.getValue(), engine.getReader(e.getKey())); + } + } + + private static void testLeaf(DiffNode rec, String field, Object expected) { + DiffElement value = rec.getElement(field); + Assert.assertNotNull(value, "Expected to see leaf named " + field + " in rec " + rec); + Assert.assertEquals(value.getValue().getValue(), expected, "Expected to leaf named " + field + " to have value " + expected + " in rec " + rec); + } + + @Test(enabled = true, dependsOnMethods = "testPluggableDiffableReaders") + public void testVCF1() { + logger.warn("testVCF1"); + DiffableReader vcfReader = engine.getReader("VCF"); + Assert.assertTrue(vcfReader.canRead(vcfFile)); + Assert.assertFalse(vcfReader.canRead(bamFile)); + + DiffElement diff = vcfReader.readFromFile(vcfFile); + Assert.assertNotNull(diff); + + Assert.assertEquals(diff.getName(), vcfFile.getName()); + Assert.assertSame(diff.getParent(), DiffElement.ROOT); + + DiffNode node = diff.getValueAsNode(); + Assert.assertEquals(node.getElements().size(), 9); + + // chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03 + DiffNode rec1 = node.getElement("chr1:2646").getValueAsNode(); + testLeaf(rec1, "CHROM", "chr1"); + testLeaf(rec1, "POS", 2646); + testLeaf(rec1, "ID", "rs62635284"); + testLeaf(rec1, "REF", Allele.create("G", true)); + testLeaf(rec1, "ALT", new HashSet(Arrays.asList(Allele.create("A")))); + testLeaf(rec1, "QUAL", 0.15); + testLeaf(rec1, "FILTER", Collections.emptySet()); + testLeaf(rec1, "AC", "2"); + testLeaf(rec1, "AF", "1.00"); + testLeaf(rec1, "AN", "2"); + } + + @Test(enabled = true, dependsOnMethods = "testPluggableDiffableReaders") + public void testBAM() { + logger.warn("testBAM"); + DiffableReader bamReader = engine.getReader("BAM"); + Assert.assertTrue(bamReader.canRead(bamFile)); + Assert.assertFalse(bamReader.canRead(vcfFile)); + + DiffElement diff = bamReader.readFromFile(bamFile); + Assert.assertNotNull(diff); + + Assert.assertEquals(diff.getName(), bamFile.getName()); + Assert.assertSame(diff.getParent(), DiffElement.ROOT); + + DiffNode node = diff.getValueAsNode(); + Assert.assertEquals(node.getElements().size(), 33); + + // 30PPJAAXX090125:1:42:512:1817#0 99 chr1 200 0 76M = + // 255 -130 ACCCTAACCCTAACCCTAACCCTAACCATAACCCTAAGACTAACCCTAAACCTAACCCTCATAATCGAAATACAAC + // BBBBC@C?AABCBB<63>=B@>+B9-9+)2B8,+@327B5A>90((>-+''3?(/'''A)(''19('7.,**%)3: + // PG:Z:0 RG:Z:exampleBAM.bam SM:Z:exampleBAM.bam + + DiffNode rec1 = node.getElement("30PPJAAXX090125:1:42:512:1817#0_1").getValueAsNode(); + testLeaf(rec1, "NAME", "30PPJAAXX090125:1:42:512:1817#0"); + testLeaf(rec1, "FLAGS", 99); + testLeaf(rec1, "RNAME", "chr1"); + testLeaf(rec1, "POS", 200); + testLeaf(rec1, "MAPQ", 0); + testLeaf(rec1, "CIGAR", "76M"); + testLeaf(rec1, "RNEXT", "chr1"); + testLeaf(rec1, "PNEXT", 255); + testLeaf(rec1, "TLEN", -130); + testLeaf(rec1, "SEQ", "ACCCTAACCCTAACCCTAACCCTAACCATAACCCTAAGACTAACCCTAAACCTAACCCTCATAATCGAAATACAAC"); + testLeaf(rec1, "QUAL", "BBBBC@C?AABCBB<63>=B@>+B9-9+)2B8,+@327B5A>90((>-+''3?(/'''A)(''19('7.,**%)3:"); + testLeaf(rec1, "PG", "0"); + testLeaf(rec1, "RG", "exampleBAM.bam"); + testLeaf(rec1, "SM", "exampleBAM.bam"); + } +} \ No newline at end of file diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java new file mode 100644 index 000000000..da272ec30 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java @@ -0,0 +1,95 @@ +/* + * 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. + */ + +// our package +package org.broadinstitute.sting.gatk.walkers.diffengine; + + +// the imports for unit testing. + + +import org.broadinstitute.sting.BaseTest; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Basic unit test for DifferableReaders in reduced reads + */ +public class DifferenceUnitTest extends BaseTest { + // -------------------------------------------------------------------------------- + // + // testing routines + // + // -------------------------------------------------------------------------------- + + private class DifferenceTest extends TestDataProvider { + public DiffElement tree1, tree2; + public String difference; + + private DifferenceTest(String tree1, String tree2, String difference) { + this(DiffNode.fromString(tree1), DiffNode.fromString(tree2), difference); + } + + private DifferenceTest(DiffElement tree1, DiffElement tree2, String difference) { + super(DifferenceTest.class); + this.tree1 = tree1; + this.tree2 = tree2; + this.difference = difference; + } + + public String toString() { + return String.format("tree1=%s tree2=%s diff=%s", + tree1 == null ? "null" : tree1.toOneLineString(), + tree2 == null ? "null" : tree2.toOneLineString(), + difference); + } + } + + @DataProvider(name = "data") + public Object[][] createTrees() { + new DifferenceTest("A=X", "A=Y", "A:X!=Y"); + new DifferenceTest("A=Y", "A=X", "A:Y!=X"); + new DifferenceTest(DiffNode.fromString("A=X"), null, "A:X!=MISSING"); + new DifferenceTest(null, DiffNode.fromString("A=X"), "A:MISSING!=X"); + return DifferenceTest.getTests(DifferenceTest.class); + } + + @Test(enabled = true, dataProvider = "data") + public void testDiffToString(DifferenceTest test) { + logger.warn("Test tree1: " + (test.tree1 == null ? "null" : test.tree1.toOneLineString())); + logger.warn("Test tree2: " + (test.tree2 == null ? "null" : test.tree2.toOneLineString())); + logger.warn("Test expected diff : " + test.difference); + Difference diff = new Difference(test.tree1, test.tree2); + logger.warn("Observed diffs : " + diff); + Assert.assertEquals(diff.toString(), test.difference, "Observed diff string " + diff + " not equal to expected difference string " + test.difference ); + + } +} \ No newline at end of file From 8056a3fe89046d942c4b656ff8138283e0235769 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 12 Jul 2011 08:52:31 -0400 Subject: [PATCH 083/214] getElement() now uses O(1) get from hash instead of linear O(n) search. Enables us to read large files easily. --- .../sting/gatk/walkers/diffengine/DiffNode.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java index 0720e18c0..3e1be8609 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java @@ -107,11 +107,13 @@ public class DiffNode extends DiffValue { return getElements(false); } + /** + * Returns the element bound to name, or null if no such binding exists + * @param name + * @return + */ public DiffElement getElement(String name) { - for ( DiffElement elt : getElements() ) - if ( elt.getName().equals(name) ) - return elt; - return null; + return getElementMap().get(name); } /** From 05212aea62b2f78f7a739257bac86fd0b16d2c5b Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 12 Jul 2011 08:53:19 -0400 Subject: [PATCH 084/214] reader now takes an argument for the maximum number of elements to read from the file. --- .../walkers/diffengine/BAMDiffableReader.java | 5 ++--- .../gatk/walkers/diffengine/DiffEngine.java | 7 ++++++- .../walkers/diffengine/DiffObjectsWalker.java | 17 ++++++++++------- .../gatk/walkers/diffengine/DiffableReader.java | 2 +- .../walkers/diffengine/VCFDiffableReader.java | 10 ++++++++-- .../diffengine/DiffableReaderUnitTest.java | 4 ++-- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java index f7a395d9d..a5ebf27bb 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java @@ -51,12 +51,11 @@ import java.util.zip.GZIPInputStream; * Class implementing diffnode reader for VCF */ public class BAMDiffableReader implements DiffableReader { - private final static int MAX_RECORDS_TO_READ = 1000; @Override public String getName() { return "BAM"; } @Override - public DiffElement readFromFile(File file) { + public DiffElement readFromFile(File file, int maxElementsToRead) { final SAMFileReader reader = new SAMFileReader(file, null); // null because we don't want it to look for the index reader.setValidationStringency(SAMFileReader.ValidationStringency.SILENT); @@ -65,7 +64,7 @@ public class BAMDiffableReader implements DiffableReader { int count = 0; while ( iterator.hasNext() ) { - if ( count++ > MAX_RECORDS_TO_READ ) + if ( count++ > maxElementsToRead && maxElementsToRead != -1) break; final SAMRecord record = iterator.next(); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index ba2713bff..54a7a464d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -385,12 +385,17 @@ public class DiffEngine { return findReaderForFile(file) != null; } + public DiffElement createDiffableFromFile(File file) { + return createDiffableFromFile(file, -1); + } + + public DiffElement createDiffableFromFile(File file, int maxElementsToRead) { DiffableReader reader = findReaderForFile(file); if ( reader == null ) throw new UserException("Unsupported file type: " + file); else - return reader.readFromFile(file); + return reader.readFromFile(file, maxElementsToRead); } public static boolean simpleDiffFiles(File masterFile, File testFile, DiffEngine.SummaryReportParams params) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java index a08108db2..fe411b195 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -48,11 +48,14 @@ public class DiffObjectsWalker extends RodWalker { @Output(doc="File to which results should be written",required=true) protected PrintStream out; - @Argument(fullName="maxRecords", shortName="M", doc="Max. number of records to process", required=false) - int MAX_RECORDS = 0; + @Argument(fullName="maxObjectsToRead", shortName="motr", doc="Max. number of objects to read from the files. -1 [default] means unlimited", required=false) + int MAX_OBJECTS_TO_READ = -1; - @Argument(fullName="maxCount1Records", shortName="M1", doc="Max. number of records occuring exactly once in the file to process", required=false) - int MAX_COUNT1_RECORDS = 0; + @Argument(fullName="maxDiffs", shortName="M", doc="Max. number of diffs to process", required=false) + int MAX_DIFFS = 0; + + @Argument(fullName="maxCount1Diffs", shortName="M1", doc="Max. number of diffs occuring exactly once in the file to process", required=false) + int MAX_COUNT1_DIFFS = 0; @Argument(fullName="minCountForDiff", shortName="MCFD", doc="Min number of observations for a records to display", required=false) int minCountForDiff = 1; @@ -91,9 +94,9 @@ public class DiffObjectsWalker extends RodWalker { @Override public void onTraversalDone(Integer sum) { out.printf("Reading master file %s%n", masterFile); - DiffElement master = diffEngine.createDiffableFromFile(masterFile); + DiffElement master = diffEngine.createDiffableFromFile(masterFile, MAX_OBJECTS_TO_READ); out.printf("Reading test file %s%n", testFile); - DiffElement test = diffEngine.createDiffableFromFile(testFile); + DiffElement test = diffEngine.createDiffableFromFile(testFile, MAX_OBJECTS_TO_READ); // out.printf("Master diff objects%n"); // out.println(master.toString()); @@ -107,7 +110,7 @@ public class DiffObjectsWalker extends RodWalker { out.printf("DIFF: %s%n", diff.toString()); } - DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(out, MAX_RECORDS, MAX_COUNT1_RECORDS, minCountForDiff); + DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(out, MAX_DIFFS, MAX_COUNT1_DIFFS, minCountForDiff); diffEngine.reportSummarizedDifferences(diffs, params); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java index 84c2eed10..af5771c55 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java @@ -43,7 +43,7 @@ public interface DiffableReader { @Ensures("result != null") @Requires("file != null") - public DiffElement readFromFile(File file); + public DiffElement readFromFile(File file, int maxElementsToRead); @Requires("file != null") public boolean canRead(File file); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index 743178538..06d14366f 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -51,15 +51,21 @@ public class VCFDiffableReader implements DiffableReader { public String getName() { return "VCF"; } @Override - public DiffElement readFromFile(File file) { + public DiffElement readFromFile(File file, int maxElementsToRead) { DiffNode root = DiffNode.rooted(file.getName()); try { LineReader lineReader = new AsciiLineReader(new FileInputStream(file)); VCFCodec vcfCodec = new VCFCodec(); - VCFHeader header = (VCFHeader)vcfCodec.readHeader(lineReader); + + // must be read as state is stored in reader itself + vcfCodec.readHeader(lineReader); String line = lineReader.readLine(); + int count = 0; while ( line != null ) { + if ( count++ > maxElementsToRead && maxElementsToRead != -1) + break; + VariantContext vc = (VariantContext)vcfCodec.decode(line); String name = vc.getChr() + ":" + vc.getStart(); DiffNode vcRoot = DiffNode.empty(name, root); diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java index 5738b643f..baa2f0383 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java @@ -80,7 +80,7 @@ public class DiffableReaderUnitTest extends BaseTest { Assert.assertTrue(vcfReader.canRead(vcfFile)); Assert.assertFalse(vcfReader.canRead(bamFile)); - DiffElement diff = vcfReader.readFromFile(vcfFile); + DiffElement diff = vcfReader.readFromFile(vcfFile, -1); Assert.assertNotNull(diff); Assert.assertEquals(diff.getName(), vcfFile.getName()); @@ -110,7 +110,7 @@ public class DiffableReaderUnitTest extends BaseTest { Assert.assertTrue(bamReader.canRead(bamFile)); Assert.assertFalse(bamReader.canRead(vcfFile)); - DiffElement diff = bamReader.readFromFile(bamFile); + DiffElement diff = bamReader.readFromFile(bamFile, -1); Assert.assertNotNull(diff); Assert.assertEquals(diff.getName(), bamFile.getName()); From a2597e7f00824b37174a648da7c648938f5c4886 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Tue, 12 Jul 2011 14:11:53 -0400 Subject: [PATCH 087/214] This commit incorporates several different changes that each pretty much break all the VCF-based integration tests, so I bunched them all together. We now officially emit VCF4.1 files (woo hoo), which means that the VCF headers are now all different (header version is 4.1 plus counts for some of the annotations are 'A' or 'G'). Also, I've added a Read Filter for reads with MQ=255 ('unavailable' in the SAM spec) and have applied this to the UG and the RMS MQ annotation. --- .../MappingQualityUnavailableReadFilter.java | 43 +++++++++++++++++ ...java => MappingQualityZeroReadFilter.java} | 5 +- .../annotator/AlleleBalanceBySample.java | 2 +- .../walkers/annotator/ChromosomeCounts.java | 4 +- .../annotator/MappingQualityRankSumTest.java | 7 ++- .../gatk/walkers/annotator/NBaseCount.java | 2 +- .../walkers/annotator/RMSMappingQuality.java | 7 ++- .../gatk/walkers/annotator/RankSumTest.java | 5 +- .../walkers/genotyper/UnifiedGenotyper.java | 5 +- .../indels/RealignerTargetCreator.java | 4 +- .../indels/SomaticIndelDetectorWalker.java | 2 +- .../phasing/ReadBackedPhasingWalker.java | 4 +- .../recalibration/CountCovariatesWalker.java | 4 +- .../sting/utils/QualityUtils.java | 4 ++ .../utils/codecs/vcf/StandardVCFWriter.java | 6 +-- .../VariantAnnotatorIntegrationTest.java | 28 +++++------ .../GenomicAnnotatorIntegrationTest.java | 6 +-- .../walkers/beagle/BeagleIntegrationTest.java | 6 +-- .../VariantFiltrationIntegrationTest.java | 22 ++++----- .../UnifiedGenotyperIntegrationTest.java | 48 +++++++++---------- .../ReadBackedPhasingIntegrationTest.java | 12 ++--- ...ntRecalibrationWalkersIntegrationTest.java | 2 +- .../CombineVariantsIntegrationTest.java | 34 ++++++------- .../LiftoverVariantsIntegrationTest.java | 6 +-- .../SelectVariantsIntegrationTest.java | 8 ++-- .../VCFStreamingIntegrationTest.java | 2 +- .../VariantsToVCFIntegrationTest.java | 8 ++-- .../VariantContextIntegrationTest.java | 2 +- 28 files changed, 169 insertions(+), 119 deletions(-) create mode 100644 public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java rename public/java/src/org/broadinstitute/sting/gatk/filters/{ZeroMappingQualityReadFilter.java => MappingQualityZeroReadFilter.java} (90%) diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java new file mode 100644 index 000000000..cecbedda8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 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.gatk.filters; + +import net.sf.picard.util.QualityUtil; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.QualityUtils; + +/** + * Filter out mapping quality zero reads. + * + * @author ebanks + * @version 0.1 + */ + +public class MappingQualityUnavailableReadFilter 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/ZeroMappingQualityReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java similarity index 90% rename from public/java/src/org/broadinstitute/sting/gatk/filters/ZeroMappingQualityReadFilter.java rename to public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java index 7e6fc5e82..e49d4117c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/ZeroMappingQualityReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityZeroReadFilter.java @@ -24,17 +24,16 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** - * Filter out zero mapping quality reads. + * Filter out mapping quality zero reads. * * @author hanna * @version 0.1 */ -public class ZeroMappingQualityReadFilter extends ReadFilter { +public class MappingQualityZeroReadFilter extends ReadFilter { public boolean filterOut(SAMRecord rec) { return (rec.getMappingQuality() == 0); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java index 0be737897..51d290763 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java @@ -62,5 +62,5 @@ public class AlleleBalanceBySample implements GenotypeAnnotation, ExperimentalAn public List getKeyNames() { return Arrays.asList("AB"); } - public List getDescriptions() { return Arrays.asList(new VCFFormatHeaderLine(getKeyNames().get(0), -1, VCFHeaderLineType.Float, "Allele balance for each het genotype")); } + public List getDescriptions() { return Arrays.asList(new VCFFormatHeaderLine(getKeyNames().get(0), 1, VCFHeaderLineType.Float, "Allele balance for each het genotype")); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java index ed10d2072..f3ec2b1df 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java @@ -42,8 +42,8 @@ import java.util.*; public class ChromosomeCounts implements InfoFieldAnnotation, StandardAnnotation { private String[] keyNames = { VCFConstants.ALLELE_NUMBER_KEY, VCFConstants.ALLELE_COUNT_KEY, VCFConstants.ALLELE_FREQUENCY_KEY }; - private VCFInfoHeaderLine[] descriptions = { new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "Allele Frequency, for each ALT allele, in the same order as listed"), - new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"), + private VCFInfoHeaderLine[] descriptions = { new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY, VCFHeaderLineCount.A, VCFHeaderLineType.Float, "Allele Frequency, for each ALT allele, in the same order as listed"), + new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY, VCFHeaderLineCount.A, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"), new VCFInfoHeaderLine(VCFConstants.ALLELE_NUMBER_KEY, 1, VCFHeaderLineType.Integer, "Total number of alleles in called genotypes") }; public Map annotate(RefMetaDataTracker tracker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java index 11f86b972..8260a5a81 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; @@ -21,7 +22,7 @@ public class MappingQualityRankSumTest extends RankSumTest { protected void fillQualsFromPileup(byte ref, byte alt, ReadBackedPileup pileup, List refQuals, List altQuals) { for ( final PileupElement p : pileup ) { - if( isUsableBase(p) && p.getMappingQual() < 254 ) { // 254 and 255 are special mapping qualities used as a code by aligners + if ( isUsableBase(p) ) { if ( p.getBase() == ref ) { refQuals.add((double)p.getMappingQual()); } else if ( p.getBase() == alt ) { @@ -34,7 +35,7 @@ public class MappingQualityRankSumTest extends RankSumTest { // equivalent is whether indel likelihoods for reads corresponding to ref allele are more likely than reads corresponding to alt allele ? HashMap> indelLikelihoodMap = IndelGenotypeLikelihoodsCalculationModel.getIndelLikelihoodMap(); for (final PileupElement p: pileup) { - if (indelLikelihoodMap.containsKey(p) && p.getMappingQual() < 254) { + if (indelLikelihoodMap.containsKey(p) && p.getMappingQual() != 0 && p.getMappingQual() != QualityUtils.MAPPING_QUALITY_UNAVAILABLE) { // retrieve likelihood information corresponding to this read LinkedHashMap el = indelLikelihoodMap.get(p); // by design, first element in LinkedHashMap was ref allele @@ -54,8 +55,6 @@ public class MappingQualityRankSumTest extends RankSumTest { refQuals.add((double)p.getMappingQual()); else if (altLikelihood > refLikelihood + INDEL_LIKELIHOOD_THRESH) altQuals.add((double)p.getMappingQual()); - - } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java index ba3e2cc8b..3b64abfff 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java @@ -47,5 +47,5 @@ public class NBaseCount implements InfoFieldAnnotation { public List getKeyNames() { return Arrays.asList("PercentNBaseSolid"); } - public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("PercentNBaseSolid", 4, VCFHeaderLineType.Float, "Percentage of N bases in the pileup (counting only SOLiD reads)")); } + public List getDescriptions() { return Arrays.asList(new VCFInfoHeaderLine("PercentNBaseSolid", 1, VCFHeaderLineType.Float, "Percentage of N bases in the pileup (counting only SOLiD reads)")); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java index 6e80c7555..1ef7ccd0b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; @@ -38,8 +39,10 @@ public class RMSMappingQuality implements InfoFieldAnnotation, StandardAnnotatio pileup = context.getBasePileup(); if (pileup != null) { - for (PileupElement p : pileup ) - qualities[index++] = p.getRead().getMappingQuality(); + for (PileupElement p : pileup ) { + if ( p.getMappingQual() != QualityUtils.MAPPING_QUALITY_UNAVAILABLE ) + qualities[index++] = p.getMappingQual(); + } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java index 1a967293f..f00abd6a1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java @@ -106,6 +106,9 @@ public abstract class RankSumTest implements InfoFieldAnnotation, StandardAnnota protected abstract void fillIndelQualsFromPileup(ReadBackedPileup pileup, List refQuals, List altQuals); protected static boolean isUsableBase( final PileupElement p ) { - return !( p.isDeletion() || p.getMappingQual() == 0 || ((int)p.getQual()) < 6 ); // need the unBAQed quality score here + return !( p.isDeletion() || + p.getMappingQual() == 0 || + p.getMappingQual() == QualityUtils.MAPPING_QUALITY_UNAVAILABLE || + ((int)p.getQual()) < QualityUtils.MIN_USABLE_Q_SCORE ); // need the unBAQed quality score here } } \ No newline at end of file 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 fe0084a19..fc8a5819a 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 @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; +import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.gatk.contexts.*; import org.broadinstitute.sting.gatk.filters.BadMateFilter; @@ -47,7 +48,7 @@ import java.io.PrintStream; * multi-sample data. The user can choose from several different incorporated calculation models. */ @BAQMode(QualityMode = BAQ.QualityMode.ADD_TAG, ApplicationTime = BAQ.ApplicationTime.ON_INPUT) -@ReadFilters( {BadMateFilter.class} ) +@ReadFilters( {BadMateFilter.class, MappingQualityUnavailableReadFilter.class} ) @Reference(window=@Window(start=-200,stop=200)) @By(DataSource.REFERENCE) @Downsample(by=DownsampleType.BY_SAMPLE, toCoverage=250) @@ -175,7 +176,7 @@ public class UnifiedGenotyper extends LocusWalker { // @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 e59b29502..4833a6cad 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 @@ -32,7 +32,7 @@ import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.sample.Sample; -import org.broadinstitute.sting.gatk.filters.ZeroMappingQualityReadFilter; +import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.walkers.*; @@ -58,7 +58,7 @@ import static org.broadinstitute.sting.utils.codecs.vcf.VCFUtils.getVCFHeadersFr @Requires(value = {DataSource.READS, DataSource.REFERENCE}, referenceMetaData = @RMD(name = "variant", type = ReferenceOrderedDatum.class)) @By(DataSource.READS) -@ReadFilters({ZeroMappingQualityReadFilter.class}) +@ReadFilters({MappingQualityZeroReadFilter.class}) // Filter out all reads with zero mapping quality public class ReadBackedPhasingWalker extends RodWalker { 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 ee504b6e7..6673bec92 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 @@ -34,7 +34,7 @@ import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.gatk.filters.ZeroMappingQualityReadFilter; +import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.walkers.*; @@ -75,7 +75,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( {ZeroMappingQualityReadFilter.class} ) // Filter out all reads with zero mapping quality +@ReadFilters( {MappingQualityZeroReadFilter.class} ) // Filter out all reads with zero 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 { diff --git a/public/java/src/org/broadinstitute/sting/utils/QualityUtils.java b/public/java/src/org/broadinstitute/sting/utils/QualityUtils.java index 23054e95f..fad2320fc 100755 --- a/public/java/src/org/broadinstitute/sting/utils/QualityUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/QualityUtils.java @@ -9,9 +9,13 @@ import net.sf.samtools.SAMUtils; * @author Kiran Garimella */ public class QualityUtils { + public final static byte MAX_QUAL_SCORE = SAMUtils.MAX_PHRED_SCORE; public final static double MIN_REASONABLE_ERROR = 0.0001; public final static byte MAX_REASONABLE_Q_SCORE = 40; + public final static byte MIN_USABLE_Q_SCORE = 6; + + public final static int MAPPING_QUALITY_UNAVAILABLE = 255; /** * Private constructor. No instantiating this class! diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index f4996b487..a8bf74707 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -123,12 +123,10 @@ public class StandardVCFWriter implements VCFWriter { try { // the file format field needs to be written first - mWriter.write(VCFHeader.METADATA_INDICATOR + VCFHeaderVersion.VCF4_0.getFormatString() + "=" + VCFHeaderVersion.VCF4_0.getVersionString() + "\n"); + mWriter.write(VCFHeader.METADATA_INDICATOR + VCFHeaderVersion.VCF4_1.getFormatString() + "=" + VCFHeaderVersion.VCF4_1.getVersionString() + "\n"); for ( VCFHeaderLine line : mHeader.getMetaData() ) { - if ( line.getKey().equals(VCFHeaderVersion.VCF4_0.getFormatString()) || - line.getKey().equals(VCFHeaderVersion.VCF3_3.getFormatString()) || - line.getKey().equals(VCFHeaderVersion.VCF3_2.getFormatString()) ) + if ( VCFHeaderVersion.isFormatString(line.getKey()) ) continue; // are the records filtered (so we know what to put in the FILTER column of passing records) ? diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorIntegrationTest.java index 6ba6926c6..e6300e6c9 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorIntegrationTest.java @@ -15,7 +15,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testHasAnnotsNotAsking1() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -I " + validationDataLocation + "low_coverage_CEU.chr1.10k-11k.bam -L 1:10,020,000-10,021,000", 1, - Arrays.asList("4cc077eb3d343e6b7ba12bff86ebe347")); + Arrays.asList("8a105fa5eebdfffe7326bc5b3d8ffd1c")); executeTest("test file has annotations, not asking for annotations, #1", spec); } @@ -23,7 +23,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testHasAnnotsNotAsking2() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:variant,VCF3 " + validationDataLocation + "vcfexample3.vcf -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -L 1:10,000,000-10,050,000", 1, - Arrays.asList("1de8e943fbf55246ebd19efa32f22a58")); + Arrays.asList("964f1016ec9a3c55333f62dd834c14d6")); executeTest("test file has annotations, not asking for annotations, #2", spec); } @@ -31,7 +31,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testHasAnnotsAsking1() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -I " + validationDataLocation + "low_coverage_CEU.chr1.10k-11k.bam -L 1:10,020,000-10,021,000", 1, - Arrays.asList("93c110e45fd4aedb044a8a5501e23336")); + Arrays.asList("8e7de435105499cd71ffc099e268a83e")); executeTest("test file has annotations, asking for annotations, #1", spec); } @@ -39,7 +39,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testHasAnnotsAsking2() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3.vcf -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -L 1:10,000,000-10,050,000", 1, - Arrays.asList("f5cb45910ed719f46159f9f71acaecf4")); + Arrays.asList("64b6804cb1e27826e3a47089349be581")); executeTest("test file has annotations, asking for annotations, #2", spec); } @@ -47,7 +47,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testNoAnnotsNotAsking1() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:variant,VCF3 " + validationDataLocation + "vcfexample2empty.vcf -I " + validationDataLocation + "low_coverage_CEU.chr1.10k-11k.bam -L 1:10,020,000-10,021,000", 1, - Arrays.asList("4b48e7d095ef73e3151542ea976ecd89")); + Arrays.asList("42ccee09fa9f8c58f4a0d4f1139c094f")); executeTest("test file doesn't have annotations, not asking for annotations, #1", spec); } @@ -55,7 +55,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testNoAnnotsNotAsking2() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -L 1:10,000,000-10,050,000", 1, - Arrays.asList("28dfbfd178aca071b948cd3dc2365357")); + Arrays.asList("f2ddfa8105c290b1f34b7a261a02a1ac")); executeTest("test file doesn't have annotations, not asking for annotations, #2", spec); } @@ -63,7 +63,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testNoAnnotsAsking1() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample2empty.vcf -I " + validationDataLocation + "low_coverage_CEU.chr1.10k-11k.bam -L 1:10,020,000-10,021,000", 1, - Arrays.asList("a330a5bc3ee72a51dbeb7e6c97a0db99")); + Arrays.asList("fd1ffb669800c2e07df1e2719aa38e49")); executeTest("test file doesn't have annotations, asking for annotations, #1", spec); } @@ -71,7 +71,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testNoAnnotsAsking2() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -L 1:10,000,000-10,050,000", 1, - Arrays.asList("3a31d1ef471acfb881a2dec7963fe3f4")); + Arrays.asList("09f8e840770a9411ff77508e0ed0837f")); executeTest("test file doesn't have annotations, asking for annotations, #2", spec); } @@ -79,7 +79,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testOverwritingHeader() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF " + validationDataLocation + "vcfexample4.vcf -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -L 1:10,001,292", 1, - Arrays.asList("a63fd8ff7bafbd46b7f009144a7c2ad1")); + Arrays.asList("78d2c19f8107d865970dbaf3e12edd92")); executeTest("test overwriting header", spec); } @@ -87,7 +87,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testNoReads() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -BTI variant", 1, - Arrays.asList("36378f1245bb99d902fbfe147605bc42")); + Arrays.asList("16e3a1403fc376320d7c69492cad9345")); executeTest("not passing it any reads", spec); } @@ -95,7 +95,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testDBTagWithDbsnp() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -D " + GATKDataLocation + "dbsnp_129_b36.rod -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -BTI variant", 1, - Arrays.asList("0257a1cc3c703535b2d3c5046bf88ab7")); + Arrays.asList("3da8ca2b6bdaf6e92d94a8c77a71313d")); executeTest("getting DB tag with dbSNP", spec); } @@ -103,7 +103,7 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testDBTagWithHapMap() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:compH3,VCF " + validationDataLocation + "fakeHM3.vcf -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -BTI variant", 1, - Arrays.asList("2d7c73489dcf0db433bebdf79a068764")); + Arrays.asList("1bc01c5b3bd0b7aef75230310c3ce688")); executeTest("getting DB tag with HM3", spec); } @@ -111,13 +111,13 @@ public class VariantAnnotatorIntegrationTest extends WalkerTest { public void testUsingExpression() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:foo,VCF " + validationDataLocation + "targetAnnotations.vcf -G \"Standard\" -B:variant,VCF3 " + validationDataLocation + "vcfexample3empty.vcf -E foo.AF -BTI variant", 1, - Arrays.asList("2f6efd08d818faa1eb0631844437c64a")); + Arrays.asList("e9c0d832dc6b4ed06c955060f830c140")); executeTest("using expression", spec); } @Test public void testTabixAnnotations() { - final String MD5 = "6c7a6a1c0027bf82656542a9b2671a35"; + final String MD5 = "13269d5a2e16f06fd755cc0fb9271acf"; for ( String file : Arrays.asList("CEU.exon.2010_03.sites.vcf", "CEU.exon.2010_03.sites.vcf.gz")) { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -A HomopolymerRun -B:variant,VCF " + validationDataLocation + "/" + file + " -BTI variant -NO_HEADER", 1, diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotatorIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotatorIntegrationTest.java index c4f6d5ebc..c75a5b2dc 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotatorIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotatorIntegrationTest.java @@ -29,7 +29,7 @@ public class GenomicAnnotatorIntegrationTest extends WalkerTest { */ - String[] md5WithDashSArg = {"3d3b61a83c1189108eabb2df04218099"}; + String[] md5WithDashSArg = {"efba4ce1641cfa2ef88a64395f2ebce8"}; WalkerTestSpec specWithSArg = new WalkerTestSpec( "-T GenomicAnnotator -R " + b36KGReference + " -B:variant,vcf3 /humgen/gsa-hpprojects/GATK/data/Annotations/examples/CEU_hapmap_nogt_23_subset.vcf" + @@ -58,7 +58,7 @@ public class GenomicAnnotatorIntegrationTest extends WalkerTest { "-o %s" ), 1, - Arrays.asList("caa562160733aa638e1ba413ede209ae") + Arrays.asList("772fc3f43b70770ec6c6acbb8bbbd4c0") ); executeTest("testGenomicAnnotatorOnIndels", testOnIndels); } @@ -76,7 +76,7 @@ public class GenomicAnnotatorIntegrationTest extends WalkerTest { "-o %s" ), 1, - Arrays.asList("a4cf76f08fa90284b6988a464b6e0c17") + Arrays.asList("081ade7f3d2d3c5f19cb1e8651a626f3") ); executeTest("testGenomicAnnotatorOnSNPsAndIndels", testOnSNPsAndIndels); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/beagle/BeagleIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/beagle/BeagleIntegrationTest.java index 70c34e729..fef1b6e64 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/beagle/BeagleIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/beagle/BeagleIntegrationTest.java @@ -41,7 +41,7 @@ public class BeagleIntegrationTest extends WalkerTest { "-B:beagleR2,BEAGLE " + beagleValidationDataLocation + "inttestbgl.r2 " + "-B:beagleProbs,BEAGLE " + beagleValidationDataLocation + "inttestbgl.gprobs " + "-B:beaglePhased,BEAGLE " + beagleValidationDataLocation + "inttestbgl.phased " + - "-o %s -NO_HEADER", 1, Arrays.asList("6bccee48ad2f06ba5a8c774fed444478")); + "-o %s -NO_HEADER", 1, Arrays.asList("3531451e84208264104040993889aaf4")); executeTest("test BeagleOutputToVCF", spec); } @@ -60,7 +60,7 @@ public class BeagleIntegrationTest extends WalkerTest { "-T ProduceBeagleInput -B:variant,VCF /humgen/gsa-hpprojects/GATK/data/Validation_Data/NA12878_HSQ_chr22_14-16m.vcf "+ "-B:validation,VCF /humgen/gsa-hpprojects/GATK/data/Validation_Data/NA12878_OMNI_chr22_14-16m.vcf "+ "-L 22:14000000-16000000 -o %s -bvcf %s -bs 0.8 -valp 0.98 -R /humgen/1kg/reference/human_g1k_v37.fasta -NO_HEADER ",2, - Arrays.asList("660986891b30cdc937e0f2a3a5743faa","223fb977e8db567dcaf632c6ee51f294")); + Arrays.asList("660986891b30cdc937e0f2a3a5743faa","e96ddd51da9f4a797b2aa8c20e404166")); executeTest("test BeagleInputWithBootstrap",spec); } @@ -72,7 +72,7 @@ public class BeagleIntegrationTest extends WalkerTest { "-B:beagleR2,beagle /humgen/gsa-hpprojects/GATK/data/Validation_Data/EUR_beagle_in_test.r2 "+ "-B:beagleProbs,beagle /humgen/gsa-hpprojects/GATK/data/Validation_Data/EUR_beagle_in_test.gprobs.bgl "+ "-B:beaglePhased,beagle /humgen/gsa-hpprojects/GATK/data/Validation_Data/EUR_beagle_in_test.phased.bgl "+ - "-L 20:1-70000 -o %s -NO_HEADER ",1,Arrays.asList("24b88ef8cdf6e347daab491f0256be5a")); + "-L 20:1-70000 -o %s -NO_HEADER ",1,Arrays.asList("8dd6ec53994fb46c5c22af8535d22965")); executeTest("testBeagleChangesSitesToRef",spec); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationIntegrationTest.java index 3d75fdc44..7bec67d2e 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationIntegrationTest.java @@ -16,7 +16,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testNoAction() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("4cc077eb3d343e6b7ba12bff86ebe347")); + Arrays.asList("8a105fa5eebdfffe7326bc5b3d8ffd1c")); executeTest("test no action", spec); } @@ -24,7 +24,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testClusteredSnps() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -window 10 -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("ada5540bb3d9b6eb8f1337ba01e90a94")); + Arrays.asList("27b13f179bb4920615dff3a32730d845")); executeTest("test clustered SNPs", spec); } @@ -32,17 +32,17 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testMasks() { WalkerTestSpec spec1 = new WalkerTestSpec( baseTestString() + " -mask foo -B:mask,VCF3 " + validationDataLocation + "vcfexample2.vcf -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("b0fcac4af3526e3b2a37602ab4c0e6ae")); + Arrays.asList("578f9e774784c25871678e6464fd212b")); executeTest("test mask all", spec1); WalkerTestSpec spec2 = new WalkerTestSpec( baseTestString() + " -mask foo -B:mask,VCF " + validationDataLocation + "vcfMask.vcf -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("b64baabe905a5d197cc1ab594147d3d5")); + Arrays.asList("bfa86a674aefca1b13d341cb14ab3c4f")); executeTest("test mask some", spec2); WalkerTestSpec spec3 = new WalkerTestSpec( baseTestString() + " -mask foo -maskExtend 10 -B:mask,VCF " + validationDataLocation + "vcfMask.vcf -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("0eff92fe72024d535c44b98e1e9e1993")); + Arrays.asList("5939f80d14b32d88587373532d7b90e5")); executeTest("test mask extend", spec3); } @@ -50,7 +50,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testFilter1() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -filter 'DoC < 20 || FisherStrand > 20.0' -filterName foo -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("7a40795147cbfa92941489d7239aad92")); + Arrays.asList("45219dbcfb6f81bba2ea0c35f5bfd368")); executeTest("test filter #1", spec); } @@ -58,7 +58,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testFilter2() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " -filter 'AlleleBalance < 70.0 && FisherStrand == 1.4' -filterName bar -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("e9dd4991b1e325847c77d053dfe8ee54")); + Arrays.asList("c95845e817da7352b9b72bc9794f18fb")); executeTest("test filter #2", spec); } @@ -66,7 +66,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testFilterWithSeparateNames() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " --filterName ABF -filter 'AlleleBalance < 0.7' --filterName FSF -filter 'FisherStrand == 1.4' -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("9ded2cce63b8d97550079047051d80a3")); + Arrays.asList("b8cdd7f44ff1a395e0a9b06a87e1e530")); executeTest("test filter with separate names #2", spec); } @@ -74,12 +74,12 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testGenotypeFilters() { WalkerTestSpec spec1 = new WalkerTestSpec( baseTestString() + " -G_filter 'GQ == 0.60' -G_filterName foo -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("6696e3f65a62ce912230d47cdb0c129b")); + Arrays.asList("96b61e4543a73fe725e433f007260039")); executeTest("test genotype filter #1", spec1); WalkerTestSpec spec2 = new WalkerTestSpec( baseTestString() + " -G_filter 'AF == 0.04 && isHomVar == 1' -G_filterName foo -B:variant,VCF3 " + validationDataLocation + "vcfexample2.vcf -L 1:10,020,000-10,021,000", 1, - Arrays.asList("26e5b4ee954c9e0b5eb044afd4b88ee9")); + Arrays.asList("6c8112ab17ce39c8022c891ae73bf38e")); executeTest("test genotype filter #2", spec2); } @@ -87,7 +87,7 @@ public class VariantFiltrationIntegrationTest extends WalkerTest { public void testDeletions() { WalkerTestSpec spec = new WalkerTestSpec( baseTestString() + " --filterExpression 'QUAL < 100' --filterName foo -B:variant,VCF " + validationDataLocation + "twoDeletions.vcf", 1, - Arrays.asList("e63b58be33c9126ad6cc55489aac539b")); + Arrays.asList("569546fd798afa0e65c5b61b440d07ac")); executeTest("test deletions", spec); } } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java index 20fa7719f..1f23d262e 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/genotyper/UnifiedGenotyperIntegrationTest.java @@ -28,7 +28,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { public void testMultiSamplePilot1() { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( baseCommand + " -I " + validationDataLocation + "low_coverage_CEU.chr1.10k-11k.bam -o %s -L 1:10,022,000-10,025,000", 1, - Arrays.asList("258e1954e6ae55c89abc6a716e19cbe0")); + Arrays.asList("c97829259463d04b0159591bb6fb44af")); executeTest("test MultiSample Pilot1", spec); } @@ -54,12 +54,12 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { public void testWithAllelesPassedIn() { WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommand + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -B:alleles,vcf " + validationDataLocation + "allelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,025,000", 1, - Arrays.asList("edeb1db288a24baff59575ceedd94243")); + Arrays.asList("2b69667f4770e8c0c894066b7f27e440")); executeTest("test MultiSample Pilot2 with alleles passed in", spec1); WalkerTest.WalkerTestSpec spec2 = new WalkerTest.WalkerTestSpec( baseCommand + " --output_mode EMIT_ALL_SITES --genotyping_mode GENOTYPE_GIVEN_ALLELES -B:alleles,vcf " + validationDataLocation + "allelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,025,000", 1, - Arrays.asList("581990130d90071b084024f4cd7caf91")); + Arrays.asList("b77fe007c2a97fcd59dfd5eef94d8b95")); executeTest("test MultiSample Pilot2 with alleles passed in and emitting all sites", spec2); } @@ -67,7 +67,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { public void testSingleSamplePilot2() { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( baseCommand + " -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -o %s -L 1:10,000,000-10,100,000", 1, - Arrays.asList("d120db27d694a6da32367cc4fb5770fa")); + Arrays.asList("ee8a5e63ddd470726a749e69c0c20f60")); executeTest("test SingleSample Pilot2", spec); } @@ -77,7 +77,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { // // -------------------------------------------------------------------------------------------------------------- - private final static String COMPRESSED_OUTPUT_MD5 = "75e5c430ed39f79f24e375037a388dc4"; + private final static String COMPRESSED_OUTPUT_MD5 = "ef31654a2b85b9b2d3bba4f4a75a17b6"; @Test public void testCompressedOutput() { @@ -107,7 +107,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { // Note that we need to turn off any randomization for this to work, so no downsampling and no annotations - String md5 = "a29615dd37222a11b8dadd341b53e43c"; + String md5 = "46868a9c4134651c54535fb46b408aee"; WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommand + " -dt NONE -G none -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -o %s -L 1:10,000,000-10,075,000", 1, @@ -138,9 +138,9 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { @Test public void testCallingParameters() { HashMap e = new HashMap(); - e.put( "--min_base_quality_score 26", "93e6269e38db9bc1732555e9969e3648" ); - e.put( "--min_mapping_quality_score 26", "64be99183c100caed4aa5f8bad64c7e9" ); - e.put( "--p_nonref_model GRID_SEARCH", "0592fe33f705ad8e2f13619fcf157805" ); + e.put( "--min_base_quality_score 26", "5043c9a101e691602eb7a3f9704bdf20" ); + e.put( "--min_mapping_quality_score 26", "71a833eb8fd93ee62ae0d5a430f27940" ); + e.put( "--p_nonref_model GRID_SEARCH", "ddf443e9dcadef367476b26b4d52c134" ); for ( Map.Entry entry : e.entrySet() ) { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( @@ -153,9 +153,9 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { @Test public void testOutputParameter() { HashMap e = new HashMap(); - e.put( "-sites_only", "1483e637dc0279935a7f90d136d147bb" ); - e.put( "--output_mode EMIT_ALL_CONFIDENT_SITES", "adcd91bc7dae8020df8caf1a30060e98" ); - e.put( "--output_mode EMIT_ALL_SITES", "b708acc2fa40f336bcd2d0c70091e07e" ); + e.put( "-sites_only", "eaad6ceb71ab94290650a70bea5ab951" ); + e.put( "--output_mode EMIT_ALL_CONFIDENT_SITES", "05bf7db8a3d19ef4a3d14772c90b732f" ); + e.put( "--output_mode EMIT_ALL_SITES", "e4b86740468d7369f0156550855586c7" ); for ( Map.Entry entry : e.entrySet() ) { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( @@ -169,12 +169,12 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { public void testConfidence() { WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommand + " -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -o %s -L 1:10,000,000-10,010,000 -stand_call_conf 10 ", 1, - Arrays.asList("64be99183c100caed4aa5f8bad64c7e9")); + Arrays.asList("71a833eb8fd93ee62ae0d5a430f27940")); executeTest("test confidence 1", spec1); WalkerTest.WalkerTestSpec spec2 = new WalkerTest.WalkerTestSpec( baseCommand + " -I " + validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SLX.bam -o %s -L 1:10,000,000-10,010,000 -stand_emit_conf 10 ", 1, - Arrays.asList("e76ca54232d02f0d92730e1affeb804e")); + Arrays.asList("79968844dc3ddecb97748c1acf2984c7")); executeTest("test confidence 2", spec2); } @@ -186,8 +186,8 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { @Test public void testHeterozyosity() { HashMap e = new HashMap(); - e.put( 0.01, "18d37f7f107853b5e32c757b4e143205" ); - e.put( 1.0 / 1850, "2bcb90ce2f7542bf590f7612018fae8e" ); + e.put( 0.01, "4e878664f61d2d800146d3762303fde1" ); + e.put( 1.0 / 1850, "9204caec095ff5e63ca21a10b6fab453" ); for ( Map.Entry entry : e.entrySet() ) { WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( @@ -211,7 +211,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,100,000", 1, - Arrays.asList("825f05b31b5bb7e82231a15c7e4e2b0d")); + Arrays.asList("1a58ec52df545f946f80cc16c5736a91")); executeTest(String.format("test multiple technologies"), spec); } @@ -230,7 +230,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -L 1:10,000,000-10,100,000" + " -baq CALCULATE_AS_NECESSARY", 1, - Arrays.asList("0919ab7e513c377610e23a67d33608fa")); + Arrays.asList("62d0f6d9de344ce68ce121c13b1e78b1")); executeTest(String.format("test calling with BAQ"), spec); } @@ -244,7 +244,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -L 1:10,000,000-10,100,000" + " -baq OFF", 1, - Arrays.asList("825f05b31b5bb7e82231a15c7e4e2b0d")); + Arrays.asList("1a58ec52df545f946f80cc16c5736a91")); executeTest(String.format("test calling with BAQ OFF"), spec); } @@ -263,7 +263,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("cb37348c41b8181be829912730f747e1")); + Arrays.asList("631ae1f1eb6bc4c1a4136b8495250536")); executeTest(String.format("test indel caller in SLX"), spec); } @@ -278,7 +278,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -minIndelCnt 1" + " -L 1:10,000,000-10,100,000", 1, - Arrays.asList("ca5b6a5fb53ae401b146cc3044f454f2")); + Arrays.asList("fd556585c79e2b892a5976668f45aa43")); executeTest(String.format("test indel caller in SLX witn low min allele count"), spec); } @@ -291,7 +291,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("ca4343a4ab6d3cce94ce61d7d1910f81")); + Arrays.asList("9cd56feedd2787919e571383889fde70")); executeTest(String.format("test indel calling, multiple technologies"), spec); } @@ -301,14 +301,14 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -B:alleles,vcf " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("3f555b53e9dd14cf7cdf96c24e322364")); + Arrays.asList("315e1b78d7a403d7fcbcf0caa8c496b8")); executeTest("test MultiSample Pilot2 indels with alleles passed in", spec1); WalkerTest.WalkerTestSpec spec2 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --output_mode EMIT_ALL_SITES --genotyping_mode GENOTYPE_GIVEN_ALLELES -B:alleles,vcf " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("1b9764b783acf7822edc58e6822eef5b")); + Arrays.asList("cf89e0c54f14482a23c105b73a333d8a")); executeTest("test MultiSample Pilot2 indels with alleles passed in and emitting all sites", spec2); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingIntegrationTest.java index 0ed16967a..1bf3e579f 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingIntegrationTest.java @@ -26,7 +26,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 20000, 10, 10) + " -L chr20:332341-382503", 1, - Arrays.asList("6020a68bbec97fcd87819c10cd4e2470")); + Arrays.asList("9568ba0b6624b97ac55a59bdee2d9150")); executeTest("MAX 10 het sites [TEST ONE]; require PQ >= 10", spec); } @@ -36,7 +36,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 20000, 10, 10) + " -L chr20:1232503-1332503", 1, - Arrays.asList("712c2145df4756c9a15758865d8007b5")); + Arrays.asList("ce65194c24fe83b0ec90faa6c8e6109a")); executeTest("MAX 10 het sites [TEST TWO]; require PQ >= 10", spec); } @@ -46,7 +46,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 20000, 2, 30) + " -L chr20:332341-382503", 1, - Arrays.asList("297e0896e4761529d979f40f5ad694db")); + Arrays.asList("02d134fd544613b1e5dd7f7197fc3753")); executeTest("MAX 2 het sites [TEST THREE]; require PQ >= 30", spec); } @@ -56,7 +56,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 20000, 5, 100) + " -L chr20:332341-382503", 1, - Arrays.asList("52a17f14692d726d3b726cf0ae7f2a09")); + Arrays.asList("2f7ec9904fc054c2ba1a7db05eb29334")); executeTest("MAX 5 het sites [TEST FOUR]; require PQ >= 100", spec); } @@ -66,7 +66,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 1000, 7, 10) + " -L chr20:332341-482503", 1, - Arrays.asList("af768f7958b8f4599c2374f1cc2fc613")); + Arrays.asList("da7a31725f229d1782dd3049848730aa")); executeTest("MAX 7 het sites [TEST FIVE]; require PQ >= 10; cacheWindow = 1000", spec); } @@ -76,7 +76,7 @@ public class ReadBackedPhasingIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "phasing_test_chr20_332341_1332503.bam", "phasing_test_chr20_332341_1332503.vcf", 20000, 10, 10) + " -L chr20:652810-681757", 1, - Arrays.asList("3dd886672f59a47908b94136d0427bb0")); + Arrays.asList("e9d35cb88089fb0e8ae6678bfaeeac8c")); executeTest("MAX 10 het sites [TEST SIX]; require PQ >= 10; cacheWindow = 20000; has inconsistent sites", spec); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java index 9600046da..2fec2e70f 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java @@ -27,7 +27,7 @@ public class VariantRecalibrationWalkersIntegrationTest extends WalkerTest { VRTest lowPass = new VRTest("phase1.projectConsensus.chr20.raw.snps.vcf", "d33212a84368e821cbedecd4f59756d6", // tranches "4652dca41222bebdf9d9fda343b2a835", // recal file - "5350b1a4c1250cf3b77ca45327c04711"); // cut VCF + "243a397a33a935fcaccd5deb6d16f0c0"); // cut VCF @DataProvider(name = "VRTest") public Object[][] createData1() { 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 600718aa0..daaab9425 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 @@ -71,24 +71,24 @@ public class CombineVariantsIntegrationTest extends WalkerTest { } - @Test public void test1SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2117fff6e0d182cd20be508e9661829c", true); } - @Test public void test2SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "2cfaf7af3dd119df08b8a9c1f72e2f93", " -setKey foo", true); } - @Test public void test3SNP() { test1InOut("pilot2.snps.vcf4.genotypes.vcf", "1474ac0fde2ce42a3c24f1c97eab333e", " -setKey null", true); } - @Test public void testOfficialCEUPilotCalls() { test1InOut("CEU.trio.2010_03.genotypes.vcf.gz", "7fc66df048a0ab08cf507906e1d4a308", false); } // official project VCF files in tabix format + @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 test1Indel1() { test1InOut("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "ec9715f53dbf4531570557c212822f12", false); } - @Test public void test1Indel2() { test1InOut("CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "f1072be5f5c6ee810276d9ca6537224d", false); } + @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 combineTrioCalls() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "YRI.trio.2010_03.genotypes.vcf.gz", "", "b77a1eec725201d9d8e74ee0c45638d3", 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", "802977fdfd2f4905b501bb06800f60af", 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", "", "a67157287dd2b24b5cdf7ebf8fcbbe9a", false); } + @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", "", "5b82f37df1f5ba40f0474d71c94142ec", false); } - @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "e1f4718a179f1196538a33863da04f53", false); } + @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "c58dca482bf97069eac6d9f1a07a2cba", false); } - @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "b3783384b7c8e877b971033e90beba48", true); } + @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c", true); } - @Test public void omniHM3Union() { combineSites(" -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED", "902e541c87caa72134db6293fc46f0ad"); } - @Test public void omniHM3Intersect() { combineSites(" -filteredRecordsMergeType KEEP_IF_ALL_UNFILTERED", "f339ad4bb5863b58b9c919ce7d040bb9"); } + @Test public void omniHM3Union() { combineSites(" -filteredRecordsMergeType KEEP_IF_ANY_UNFILTERED", "4836086891f6cbdd40eebef3076d215a"); } + @Test public void omniHM3Intersect() { combineSites(" -filteredRecordsMergeType KEEP_IF_ALL_UNFILTERED", "6a34b5d743efda8b2f3b639f3a2f5de8"); } @Test public void threeWayWithRefs() { WalkerTestSpec spec = new WalkerTestSpec( @@ -101,7 +101,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + " -genotypeMergeOptions UNIQUIFY -L 1"), 1, - Arrays.asList("a07995587b855f3214fb71940bf23c0f")); + Arrays.asList("8b78339ccf7a5a5a837f79e88a3a38e5")); executeTest("threeWayWithRefs", spec); } @@ -120,7 +120,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { } // @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } - @Test public void complexTestMinimal() { combineComplexSites(" -minimalVCF", "0db9ef50fe54b60426474273d7c7fa99"); } - @Test public void complexTestSitesOnly() { combineComplexSites(" -sites_only", "d20acb3d53ba0a02ce92d540ebeda2a9"); } - @Test public void complexTestSitesOnlyMinimal() { combineComplexSites(" -sites_only -minimalVCF", "8d1b3d120515f8b56b5a0d10bc5da713"); } + @Test public void complexTestMinimal() { combineComplexSites(" -minimalVCF", "df96cb3beb2dbb5e02f80abec7d3571e"); } + @Test public void complexTestSitesOnly() { combineComplexSites(" -sites_only", "f72a178137e25dbe0b931934cdc0079d"); } + @Test public void complexTestSitesOnlyMinimal() { combineComplexSites(" -sites_only -minimalVCF", "f704caeaaaed6711943014b847fe381a"); } } \ No newline at end of file diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariantsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariantsIntegrationTest.java index d32ab6282..82c894c6f 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariantsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariantsIntegrationTest.java @@ -40,7 +40,7 @@ public class LiftoverVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( "-T LiftoverVariants -o %s -R " + b36KGReference + " -B:variant,vcf3 " + validationDataLocation + "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.500.noheader.vcf -chain " + validationDataLocation + "b36ToHg19.broad.over.chain -dict /seq/references/Homo_sapiens_assembly19/v0/Homo_sapiens_assembly19.dict", 1, - Arrays.asList("37e23efd7d6471fc0f807b31ccafe0eb")); + Arrays.asList("70aeaca5b74cc7ba8e2da7b71ff0fbfd")); executeTest("test b36 to hg19", spec); } @@ -49,7 +49,7 @@ public class LiftoverVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( "-T LiftoverVariants -o %s -R " + b36KGReference + " -B:variant,vcf3 " + validationDataLocation + "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.500.noheader.unsortedSamples.vcf -chain " + validationDataLocation + "b36ToHg19.broad.over.chain -dict /seq/references/Homo_sapiens_assembly19/v0/Homo_sapiens_assembly19.dict", 1, - Arrays.asList("b6ef4a2f026fd3843aeb9ed764a66921")); + Arrays.asList("3fd7ec2dc4064ef410786276b0dc9d08")); executeTest("test b36 to hg19, unsorted samples", spec); } @@ -58,7 +58,7 @@ public class LiftoverVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( "-T LiftoverVariants -o %s -R " + hg18Reference + " -B:variant,vcf " + validationDataLocation + "liftover_test.vcf -chain " + validationDataLocation + "hg18ToHg19.broad.over.chain -dict /seq/references/Homo_sapiens_assembly19/v0/Homo_sapiens_assembly19.dict", 1, - Arrays.asList("3275373b3c44ad14a270b50664b3f8a3")); + Arrays.asList("ab2c6254225d7e2ecf52eee604d5673b")); executeTest("test hg18 to hg19, unsorted", spec); } } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariantsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariantsIntegrationTest.java index e18287a21..b5f41542e 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariantsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariantsIntegrationTest.java @@ -18,7 +18,7 @@ public class SelectVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( baseTestString(" -sn A -se '[CDH]' -sf " + samplesFile + " -env -ef -select 'DP < 250' -B:variant,VCF3 " + testfile + " -NO_HEADER"), 1, - Arrays.asList("1b9d551298dc048c7d36b60440ff4d50") + Arrays.asList("d18516c1963802e92cb9e425c0b75fd6") ); executeTest("testComplexSelection--" + testfile, spec); @@ -31,7 +31,7 @@ public class SelectVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( baseTestString(" -sn A -sn B -sn C -B:variant,VCF3 " + testfile + " -NO_HEADER"), 1, - Arrays.asList("5ba7536a0819421b330350a160e4261a") + Arrays.asList("b74038779fe6485dbb8734ae48178356") ); executeTest("testRepeatedLineSelection--" + testfile, spec); @@ -44,7 +44,7 @@ public class SelectVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( "-T SelectVariants -R " + hg19Reference + " -sn NA12878 -disc myvar -L 20:1012700-1020000 -B:variant,VCF " + b37hapmapGenotypes + " -B:myvar,VCF " + testFile + " -o %s -NO_HEADER", 1, - Arrays.asList("97621ae8f29955eedfc4e0be3515fcb9") + Arrays.asList("78e6842325f1f1bc9ab30d5e7737ee6e") ); executeTest("testDiscordance--" + testFile, spec); @@ -57,7 +57,7 @@ public class SelectVariantsIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( "-T SelectVariants -R " + hg19Reference + " -sn NA12878 -conc hapmap -L 20:1012700-1020000 -B:hapmap,VCF " + b37hapmapGenotypes + " -B:variant,VCF " + testFile + " -o %s -NO_HEADER", 1, - Arrays.asList("a0ae016fdffcbe7bfb99fd3dbc311407") + Arrays.asList("d2ba3ea30a810f6f0fbfb1b643292b6a") ); executeTest("testConcordance--" + testFile, spec); diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VCFStreamingIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VCFStreamingIntegrationTest.java index cf0673ee6..d7efe4212 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VCFStreamingIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VCFStreamingIntegrationTest.java @@ -60,7 +60,7 @@ public class VCFStreamingIntegrationTest extends WalkerTest { " --NO_HEADER" + " -o %s", 1, - Arrays.asList("debbbf3e661b6857cc8d99ff7635bb1d") + Arrays.asList("658f580f7a294fd334bd897102616fed") ); executeTest("testSimpleVCFStreaming", spec); diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java index 64d0db14b..8421076c9 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java @@ -20,7 +20,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testVariantsToVCFUsingGeliInput() { List md5 = new ArrayList(); - md5.add("bd15d98adc76b5798e3bbeff3f936feb"); + md5.add("815b82fff92aab41c209eedce2d7e7d9"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -38,7 +38,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingGeliInput() { List md5 = new ArrayList(); - md5.add("acd15d3f85bff5b545bc353e0e23cc6e"); + md5.add("22336ee9c12aa222ce29c3c5babca7d0"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -56,7 +56,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingHapMapInput() { List md5 = new ArrayList(); - md5.add("6f34528569f8cf5941cb365fa77288c1"); + md5.add("9bedaa7670b86a07be5191898c3727cf"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -73,7 +73,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingVCFInput() { List md5 = new ArrayList(); - md5.add("d8316fc1b9d8e954a58940354119a32e"); + md5.add("cc215edec9ca28e5c79ab1b67506f9f7"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + diff --git a/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextIntegrationTest.java b/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextIntegrationTest.java index 5d42f8d0c..a344817a0 100755 --- a/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/variantcontext/VariantContextIntegrationTest.java @@ -49,7 +49,7 @@ public class VariantContextIntegrationTest extends WalkerTest { WalkerTestSpec spec = new WalkerTestSpec( cmdRoot + " -NO_HEADER -B:vcf,VCF3 " + validationDataLocation + "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.500.vcf -L 1:1-1000000 -o %s --outputVCF %s", 2, // just one output file - Arrays.asList("e3c35d0c4b5d4935c84a270f9df0951f", "e6673737acbb6bfabfcd92c4b2268241")); + Arrays.asList("e3c35d0c4b5d4935c84a270f9df0951f", "ff91731213fd0bbdc200ab6fd1c93e63")); executeTest("testToVCF", spec); } From ccedd6ff4c942c20c1a57f6a6bf65c5cb63b6e16 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 12 Jul 2011 15:20:28 -0400 Subject: [PATCH 088/214] Difference is now the general form -- used to be SummarizedDifference. The old Difference class is now a subclass of Difference that includes pointers to specific the master and test DiffElements. Added a size() function that calculates the number of elements tree from a DiffElement. --- .../gatk/walkers/diffengine/DiffElement.java | 4 + .../gatk/walkers/diffengine/DiffEngine.java | 142 +++++------------- .../gatk/walkers/diffengine/DiffNode.java | 7 + .../walkers/diffengine/DiffObjectsWalker.java | 7 +- .../gatk/walkers/diffengine/DiffValue.java | 1 + .../gatk/walkers/diffengine/Difference.java | 83 +++++++--- .../diffengine/SpecificDifference.java | 59 ++++++++ .../diffengine/DiffEngineUnitTest.java | 6 +- .../diffengine/DifferenceUnitTest.java | 2 +- 9 files changed, 176 insertions(+), 135 deletions(-) create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java index eff24bb88..4c3f7bd95 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java @@ -115,4 +115,8 @@ public class DiffElement { else throw new ReviewedStingException("Illegal request conversion of a DiffValue into a DiffNode: " + this); } + + public int size() { + return 1 + getValue().size(); + } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index 54a7a464d..6d85df71d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -24,11 +24,9 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -import com.google.java.contract.Requires; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.report.GATKReport; import org.broadinstitute.sting.gatk.report.GATKReportTable; -import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.classloader.PluginManager; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; @@ -60,7 +58,7 @@ public class DiffEngine { // // -------------------------------------------------------------------------------- - public List diff(DiffElement master, DiffElement test) { + public List diff(DiffElement master, DiffElement test) { DiffValue masterValue = master.getValue(); DiffValue testValue = test.getValue(); @@ -70,14 +68,14 @@ public class DiffEngine { return diff(masterValue, testValue); } else { // structural difference in types. one is node, other is leaf - return Arrays.asList(new Difference(master, test)); + return Arrays.asList(new SpecificDifference(master, test)); } } - public List diff(DiffNode master, DiffNode test) { + public List diff(DiffNode master, DiffNode test) { Set allNames = new HashSet(master.getElementNames()); allNames.addAll(test.getElementNames()); - List diffs = new ArrayList(); + List diffs = new ArrayList(); for ( String name : allNames ) { DiffElement masterElt = master.getElement(name); @@ -86,7 +84,7 @@ public class DiffEngine { throw new ReviewedStingException("BUG: unexceptedly got two null elements for field: " + name); } else if ( masterElt == null || testElt == null ) { // if either is null, we are missing a value // todo -- should one of these be a special MISSING item? - diffs.add(new Difference(masterElt, testElt)); + diffs.add(new SpecificDifference(masterElt, testElt)); } else { diffs.addAll(diff(masterElt, testElt)); } @@ -95,11 +93,11 @@ public class DiffEngine { return diffs; } - public List diff(DiffValue master, DiffValue test) { + public List diff(DiffValue master, DiffValue test) { if ( master.getValue().equals(test.getValue()) ) { return Collections.emptyList(); } else { - return Arrays.asList(new Difference(master.getBinding(), test.getBinding())); + return Arrays.asList(new SpecificDifference(master.getBinding(), test.getBinding())); } } @@ -147,64 +145,68 @@ public class DiffEngine { * @param params determines how we display the items * @param diffs */ - public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { + public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { printSummaryReport(summarizeDifferences(diffs), params ); } - public List summarizeDifferences(List diffs) { - List diffPaths = new ArrayList(diffs.size()); - - for ( Difference diff1 : diffs ) { - diffPaths.add(diffNameToPath(diff1.getFullyQualifiedName())); - } - - return summarizedDifferencesOfPaths(diffPaths); + public List summarizeDifferences(List diffs) { + return summarizedDifferencesOfPaths(diffs); } final protected static String[] diffNameToPath(String diffName) { return diffName.split("\\."); } - protected List summarizedDifferencesOfPaths(List diffPaths) { - Map summaries = new HashMap(); + protected List summarizedDifferencesOfPathsFromString(List singletonDiffs) { + List diffs = new ArrayList(); + + for ( String diff : singletonDiffs ) { + diffs.add(new Difference(diff)); + } + + return summarizedDifferencesOfPaths(diffs); + } + + protected List summarizedDifferencesOfPaths(List singletonDiffs) { + Map summaries = new HashMap(); // create the initial set of differences - for ( int i = 0; i < diffPaths.size(); i++ ) { + for ( int i = 0; i < singletonDiffs.size(); i++ ) { for ( int j = 0; j <= i; j++ ) { - String[] diffPath1 = diffPaths.get(i); - String[] diffPath2 = diffPaths.get(j); - if ( diffPath1.length == diffPath2.length ) { - int lcp = longestCommonPostfix(diffPath1, diffPath2); - String path = lcp > 0 ? summarizedPath(diffPath2, lcp) : Utils.join(".", diffPath2); + Difference diffPath1 = singletonDiffs.get(i); + Difference diffPath2 = singletonDiffs.get(j); + if ( diffPath1.length() == diffPath2.length() ) { + int lcp = longestCommonPostfix(diffPath1.getParts(), diffPath2.getParts()); + String path = lcp > 0 ? summarizedPath(diffPath2.getParts(), lcp) : diffPath2.getPath(); addSummary(summaries, path, true); } } } // count differences - for ( String[] diffPath : diffPaths ) { - for ( SummarizedDifference sumDiff : summaries.values() ) { - if ( sumDiff.matches(diffPath) ) + for ( Difference diffPath : singletonDiffs ) { + for ( Difference sumDiff : summaries.values() ) { + if ( sumDiff.matches(diffPath.getParts()) ) addSummary(summaries, sumDiff.getPath(), false); } } - List sortedSummaries = new ArrayList(summaries.values()); + List sortedSummaries = new ArrayList(summaries.values()); Collections.sort(sortedSummaries); return sortedSummaries; } - private static void addSummary(Map summaries, String path, boolean onlyCatalog) { + private static void addSummary(Map summaries, String path, boolean onlyCatalog) { if ( summaries.containsKey(path) ) { if ( ! onlyCatalog ) summaries.get(path).incCount(); } else { - SummarizedDifference sumDiff = new SummarizedDifference(path); + Difference sumDiff = new Difference(path); summaries.put(sumDiff.getPath(), sumDiff); } } - protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { + protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { GATKReport report = new GATKReport(); final String tableName = "diffences"; report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffObjectsWalker_and_SummarizedDifferences for more information"); @@ -213,7 +215,7 @@ public class DiffEngine { table.addColumn("NumberOfOccurrences", 0); int count = 0, count1 = 0; - for ( SummarizedDifference diff : sortedSummaries ) { + for ( Difference diff : sortedSummaries ) { if ( diff.getCount() < params.minSumDiffToShow ) // in order, so break as soon as the count is too low break; @@ -261,76 +263,6 @@ public class DiffEngine { return Utils.join(".", parts); } - /** - * TODO -- all of the algorithms above should use SummarizedDifference instead - * TODO -- of some SummarizedDifferences and some low-level String[] - */ - public static class SummarizedDifference implements Comparable { - final String path; // X.Y.Z - final String[] parts; - int count = 0; - - public SummarizedDifference(String path) { - this.path = path; - this.parts = diffNameToPath(path); - } - - public void incCount() { count++; } - - public int getCount() { - return count; - } - - /** - * The fully qualified path object A.B.C etc - * @return - */ - public String getPath() { - return path; - } - - /** - * @return the length of the parts of this summary - */ - public int length() { - return this.parts.length; - } - - /** - * Returns true if the string parts matches this summary. Matches are - * must be equal() everywhere where this summary isn't *. - * @param otherParts - * @return - */ - public boolean matches(String[] otherParts) { - if ( otherParts.length != length() ) - return false; - - // TODO optimization: can start at right most non-star element - for ( int i = 0; i < length(); i++ ) { - String part = parts[i]; - if ( ! part.equals("*") && ! part.equals(otherParts[i]) ) - return false; - } - - return true; - } - - @Override - public String toString() { - return String.format("%s:%d", getPath(), getCount()); - } - - @Override - public int compareTo(SummarizedDifference other) { - // sort first highest to lowest count, then by lowest to highest path - int countCmp = Integer.valueOf(count).compareTo(other.count); - return countCmp != 0 ? -1 * countCmp : path.compareTo(other.path); - } - - - } - // -------------------------------------------------------------------------------- // // plugin manager @@ -404,7 +336,7 @@ public class DiffEngine { if ( diffEngine.canRead(masterFile) && diffEngine.canRead(testFile) ) { DiffElement master = diffEngine.createDiffableFromFile(masterFile); DiffElement test = diffEngine.createDiffableFromFile(testFile); - List diffs = diffEngine.diff(master, test); + List diffs = diffEngine.diff(master, test); diffEngine.reportSummarizedDifferences(diffs, params); return true; } else { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java index 3e1be8609..2f48de2d3 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffNode.java @@ -153,6 +153,13 @@ public class DiffNode extends DiffValue { add(new DiffElement(name, this.getBinding(), new DiffValue(value))); } + public int size() { + int count = 0; + for ( DiffElement value : getElements() ) + count += value.size(); + return count; + } + // --------------------------------------------------------------------------- // // toString diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java index fe411b195..ecb836af9 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -import org.apache.xmlbeans.impl.tool.Diff; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -95,18 +94,20 @@ public class DiffObjectsWalker extends RodWalker { public void onTraversalDone(Integer sum) { out.printf("Reading master file %s%n", masterFile); DiffElement master = diffEngine.createDiffableFromFile(masterFile, MAX_OBJECTS_TO_READ); + out.printf(" Read %d objects%n", master.size()); out.printf("Reading test file %s%n", testFile); DiffElement test = diffEngine.createDiffableFromFile(testFile, MAX_OBJECTS_TO_READ); + out.printf(" Read %d objects%n", test.size()); // out.printf("Master diff objects%n"); // out.println(master.toString()); // out.printf("Test diff objects%n"); // out.println(test.toString()); - List diffs = diffEngine.diff(master, test); + List diffs = diffEngine.diff(master, test); if ( showItemizedDifferences ) { out.printf("Itemized results%n"); - for ( Difference diff : diffs ) + for ( SpecificDifference diff : diffs ) out.printf("DIFF: %s%n", diff.toString()); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java index 7245e9e8d..3750496a1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java @@ -87,4 +87,5 @@ public class DiffValue { public boolean isAtomic() { return true; } public boolean isCompound() { return ! isAtomic(); } + public int size() { return 1; } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java index 6627a4cc5..efc6ef160 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java @@ -24,35 +24,72 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -/** - * Created by IntelliJ IDEA. - * User: depristo - * Date: 7/4/11 - * Time: 12:53 PM - * - * Represents a specific difference between two specific DiffElements - */ -public class Difference { - DiffElement master, test; +public class Difference implements Comparable { + final String path; // X.Y.Z + final String[] parts; + int count = 0; - public Difference(DiffElement master, DiffElement test) { - if ( master == null && test == null ) throw new IllegalArgumentException("Master and test both cannot be null"); - this.master = master; - this.test = test; + public Difference(String path) { + this.path = path; + this.parts = DiffEngine.diffNameToPath(path); } + public String[] getParts() { + return parts; + } + + public void incCount() { count++; } + + public int getCount() { + return count; + } + + /** + * The fully qualified path object A.B.C etc + * @return + */ + public String getPath() { + return path; + } + + /** + * @return the length of the parts of this summary + */ + public int length() { + return this.parts.length; + } + + /** + * Returns true if the string parts matches this summary. Matches are + * must be equal() everywhere where this summary isn't *. + * @param otherParts + * @return + */ + public boolean matches(String[] otherParts) { + if ( otherParts.length != length() ) + return false; + + // TODO optimization: can start at right most non-star element + for ( int i = 0; i < length(); i++ ) { + String part = parts[i]; + if ( ! part.equals("*") && ! part.equals(otherParts[i]) ) + return false; + } + + return true; + } + + @Override public String toString() { - return String.format("%s:%s!=%s", - getFullyQualifiedName(), - getOneLineString(master), - getOneLineString(test)); + return String.format("%s:%d", getPath(), getCount()); } - public String getFullyQualifiedName() { - return (master == null ? test : master).fullyQualifiedName(); + @Override + public int compareTo(Difference other) { + // sort first highest to lowest count, then by lowest to highest path + int countCmp = Integer.valueOf(count).compareTo(other.count); + return countCmp != 0 ? -1 * countCmp : path.compareTo(other.path); } - private static String getOneLineString(DiffElement elt) { - return elt == null ? "MISSING" : elt.getValue().toOneLineString(); - } + } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java new file mode 100644 index 000000000..2fe9b47f8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java @@ -0,0 +1,59 @@ +/* + * 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.gatk.walkers.diffengine; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/4/11 + * Time: 12:53 PM + * + * Represents a specific difference between two specific DiffElements + */ +public class SpecificDifference extends Difference { + DiffElement master, test; + + public SpecificDifference(DiffElement master, DiffElement test) { + super(createName(master, test)); + if ( master == null && test == null ) throw new IllegalArgumentException("Master and test both cannot be null"); + this.master = master; + this.test = test; + } + + public String toString() { + return String.format("%s:%s!=%s", + getPath(), + getOneLineString(master), + getOneLineString(test)); + } + + private static String createName(DiffElement master, DiffElement test) { + return (master == null ? test : master).fullyQualifiedName(); + } + + private static String getOneLineString(DiffElement elt) { + return elt == null ? "MISSING" : elt.getValue().toOneLineString(); + } +} diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java index cd6c3598a..96dfec6e8 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java @@ -99,7 +99,7 @@ public class DiffEngineUnitTest extends BaseTest { logger.warn("Test tree1: " + test.tree1.toOneLineString()); logger.warn("Test tree2: " + test.tree2.toOneLineString()); - List diffs = engine.diff(test.tree1, test.tree2); + List diffs = engine.diff(test.tree1, test.tree2); logger.warn("Test expected diff : " + test.differences); logger.warn("Observed diffs : " + diffs); } @@ -185,12 +185,12 @@ public class DiffEngineUnitTest extends BaseTest { List diffPaths = new ArrayList(diffs.size()); for ( String diff : diffs ) { diffPaths.add(DiffEngine.diffNameToPath(diff)); } - List sumDiffs = engine.summarizedDifferencesOfPaths(diffPaths); + List sumDiffs = engine.summarizedDifferencesOfPathsFromString(diffs); Assert.assertEquals(sumDiffs.size(), expecteds.size(), "Unexpected number of summarized differences: " + sumDiffs); for ( int i = 0; i < sumDiffs.size(); i++ ) { - DiffEngine.SummarizedDifference sumDiff = sumDiffs.get(i); + Difference sumDiff = sumDiffs.get(i); String expected = expecteds.get(i); String[] pathCount = expected.split(":"); String path = pathCount[0]; diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java index da272ec30..64579a01b 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java @@ -87,7 +87,7 @@ public class DifferenceUnitTest extends BaseTest { logger.warn("Test tree1: " + (test.tree1 == null ? "null" : test.tree1.toOneLineString())); logger.warn("Test tree2: " + (test.tree2 == null ? "null" : test.tree2.toOneLineString())); logger.warn("Test expected diff : " + test.difference); - Difference diff = new Difference(test.tree1, test.tree2); + SpecificDifference diff = new SpecificDifference(test.tree1, test.tree2); logger.warn("Observed diffs : " + diff); Assert.assertEquals(diff.toString(), test.difference, "Observed diff string " + diff + " not equal to expected difference string " + test.difference ); From 5077c94d85929bad35fcc00bbeab0b8036aabe4a Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Tue, 12 Jul 2011 15:39:07 -0400 Subject: [PATCH 090/214] Adding MappingQualityUnavailableReadFilter to the SNP and indel CountCovariates --- .../recalibration/CountCovariatesWalker.java | 3 +- .../RecalibrationWalkersIntegrationTest.java | 91 +++---------------- 2 files changed, 15 insertions(+), 79 deletions(-) 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 6673bec92..c21f548b3 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 @@ -27,6 +27,7 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import org.broad.tribble.bed.BEDCodec; import org.broad.tribble.dbsnp.DbSNPCodec; +import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; import org.broadinstitute.sting.utils.codecs.vcf.VCF3Codec; import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; import org.broadinstitute.sting.commandline.Gather; @@ -75,7 +76,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} ) // Filter out all reads with zero mapping quality +@ReadFilters( {MappingQualityZeroReadFilter.class, MappingQualityUnavailableReadFilter.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 { diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/recalibration/RecalibrationWalkersIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/recalibration/RecalibrationWalkersIntegrationTest.java index b0f76229b..129161da3 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/recalibration/RecalibrationWalkersIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/recalibration/RecalibrationWalkersIntegrationTest.java @@ -19,9 +19,9 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { public void testCountCovariates1() { HashMap e = new HashMap(); e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "7b5832d4b2a23b8ef2bb639eb59bfa88" ); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "f4f8a49bb5764d2a8f61e055f64dcce4"); + e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "9c006f8e9fb5752b1c139f5a8cc7ea88"); e.put( validationDataLocation + "NA12873.454.SRP000031.2009_06.chr1.10_20mb.bam", "e6f7b4ab9aa291022e0ba8b7dbe4c77e" ); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.bam", "570506533f079d738d70934dfe1c02cd" ); + e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.bam", "e6b98af01c5a08e4954b79ec42db6fc3" ); for ( String parallelism : Arrays.asList("", " -nt 4")) { for ( Map.Entry entry : e.entrySet() ) { @@ -53,9 +53,9 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { public void testTableRecalibrator1() { HashMap e = new HashMap(); e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "0278cce4cfdab869dc0c11d6852a984b" ); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "344d4252143df8c2cce6b568747553a5"); + e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "6797d7ffa4ef6c48413719ba32696ccf"); e.put( validationDataLocation + "NA12873.454.SRP000031.2009_06.chr1.10_20mb.bam", "2bb3374dde131791d7638031ae3b3e10" ); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.bam", "064c4a7bdd23974c3a9c5f924540df76" ); + e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.bam", "1f9d8944b73169b367cb83b0d22e5432" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -107,7 +107,7 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { @Test public void testTableRecalibratorMaxQ70() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "344d4252143df8c2cce6b568747553a5" ); + e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "0278cce4cfdab869dc0c11d6852a984b" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -133,12 +133,10 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { } } - - @Test public void testCountCovariatesSolidIndelsRemoveRefBias() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "0a6cdb9611e5880ea6611205080aa267" ); + e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "c9ea5f995e1e2b7a5688533e678dcedc" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -164,7 +162,7 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { @Test public void testTableRecalibratorSolidIndelsRemoveRefBias() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "9bc7e1ad223ba759fe5e8ddb4c07369c" ); + e.put( validationDataLocation + "NA19240.chr1.BFAST.SOLID.bam", "993fae4270e7e1e15986f270acf247af" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -189,13 +187,10 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { } } - - - @Test public void testCountCovariatesVCF() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "3700eaf567e4937f442fc777a226d6ad"); + e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "170f0c3cc4b8d72c539136effeec9a16"); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -219,7 +214,7 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { @Test public void testCountCovariatesBED() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "6803891a3398821fc8a37e19ea8e5a00"); + e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "b460478d9683e827784e42bc352db8bb"); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -243,7 +238,7 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { @Test public void testCountCovariatesVCFPlusDBsnp() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", "f224c42fbc4026db973ccc91265ab5c7"); + e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", "a3d892bd60d8f679affda3c1e3af96c1"); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -268,69 +263,10 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { } } - @Test - public void testCountCovariatesNoReadGroups() { - HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12762.SOLID.SRP000031.2009_07.chr1.10_20mb.bam", "c024e03f019aeceaf364fa58c8295ad8" ); - - for ( Map.Entry entry : e.entrySet() ) { - String bam = entry.getKey(); - String md5 = entry.getValue(); - - WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( - "-R " + b36KGReference + - " --DBSNP " + GATKDataLocation + "dbsnp_129_b36.rod" + - " -T CountCovariates" + - " -I " + bam + - " -L 1:10,000,000-10,200,000" + - " -cov ReadGroupCovariate" + - " -cov QualityScoreCovariate" + - " -cov CycleCovariate" + - " -cov DinucCovariate" + - " --default_read_group DefaultReadGroup" + - " --default_platform illumina" + - " --solid_recal_mode SET_Q_ZERO" + - " -recalFile %s", - 1, // just one output file - Arrays.asList(md5)); - List result = executeTest("testCountCovariatesNoReadGroups", spec).getFirst(); - paramsFilesNoReadGroupTest.put(bam, result.get(0).getAbsolutePath()); - } - } - - @Test - public void testTableRecalibratorNoReadGroups() { - HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12762.SOLID.SRP000031.2009_07.chr1.10_20mb.bam", "1eefbe7ac0376fc1ed1392d85242171e" ); - - for ( Map.Entry entry : e.entrySet() ) { - String bam = entry.getKey(); - String md5 = entry.getValue(); - String paramsFile = paramsFilesNoReadGroupTest.get(bam); - System.out.printf("PARAMS FOR %s is %s%n", bam, paramsFile); - if ( paramsFile != null ) { - WalkerTestSpec spec = new WalkerTestSpec( - "-R " + b36KGReference + - " -T TableRecalibration" + - " -I " + bam + - " -L 1:10,100,000-10,300,000" + - " -o %s" + - " --no_pg_tag" + - " --solid_recal_mode SET_Q_ZERO" + - " --default_read_group DefaultReadGroup" + - " --default_platform illumina" + - " -recalFile " + paramsFile, - 1, // just one output file - Arrays.asList(md5)); - executeTest("testTableRecalibratorNoReadGroups", spec); - } - } - } - @Test public void testCountCovariatesNoIndex() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.noindex.bam", "cfc31bb6f51436d1c3b34f62bb801dc8" ); + e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.noindex.bam", "284ccac1f8fe485e52c86333cac7c2d4" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -356,7 +292,7 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { @Test public void testTableRecalibratorNoIndex() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.noindex.bam", "83b848a16034c2fb423d1bb0f5be7784" ); + e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.allTechs.noindex.bam", "c167799c2d9cab815d7c9b23337f162e" ); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); @@ -380,11 +316,10 @@ public class RecalibrationWalkersIntegrationTest extends WalkerTest { } } - @Test public void testCountCovariatesFailWithoutDBSNP() { HashMap e = new HashMap(); - e.put( validationDataLocation + "NA12878.1kg.p2.chr1_10mb_11_mb.SOLID.bam", ""); + e.put( validationDataLocation + "NA12892.SLX.SRP000031.2009_06.selected.bam", ""); for ( Map.Entry entry : e.entrySet() ) { String bam = entry.getKey(); From 6007eea3ffba2e459ec6bf0a1c66c0a017fe0a62 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Wed, 13 Jul 2011 09:56:08 -0400 Subject: [PATCH 097/214] Allowing VCF records without GTs in vf4.1 --- .../utils/codecs/vcf/StandardVCFWriter.java | 41 +++++++++++++------ .../sting/utils/codecs/vcf/VCF3Codec.java | 13 +++--- .../sting/utils/codecs/vcf/VCFCodec.java | 28 ++++++------- .../sting/utils/variantcontext/Genotype.java | 35 +++++++++++++--- .../utils/variantcontext/VariantContext.java | 8 ++-- 5 files changed, 83 insertions(+), 42 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index a8bf74707..f7d09f16d 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -32,6 +32,7 @@ import org.broad.tribble.index.IndexFactory; import org.broad.tribble.util.LittleEndianOutputStream; import org.broad.tribble.util.ParsingUtils; import org.broad.tribble.util.PositionalStream; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; @@ -300,10 +301,7 @@ public class StandardVCFWriter implements VCFWriter { } else { List genotypeAttributeKeys = new ArrayList(); if ( vc.hasGenotypes() ) { - genotypeAttributeKeys.add(VCFConstants.GENOTYPE_KEY); - for ( String key : calcVCFGenotypeKeys(vc) ) { - genotypeAttributeKeys.add(key); - } + genotypeAttributeKeys.addAll(calcVCFGenotypeKeys(vc)); } else if ( mHeader.hasGenotypingData() ) { // this needs to be done in case all samples are no-calls genotypeAttributeKeys.add(VCFConstants.GENOTYPE_KEY); @@ -387,16 +385,22 @@ public class StandardVCFWriter implements VCFWriter { continue; } - writeAllele(g.getAllele(0), alleleMap); - for (int i = 1; i < g.getPloidy(); i++) { - mWriter.write(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); - writeAllele(g.getAllele(i), alleleMap); - } - List attrs = new ArrayList(genotypeFormatKeys.size()); for ( String key : genotypeFormatKeys ) { - if ( key.equals(VCFConstants.GENOTYPE_KEY) ) + + if ( key.equals(VCFConstants.GENOTYPE_KEY) ) { + if ( !g.isAvailable() ) { + throw new ReviewedStingException("GTs cannot be missing for some samples if they are available for others in the record"); + } + + writeAllele(g.getAllele(0), alleleMap); + for (int i = 1; i < g.getPloidy(); i++) { + mWriter.write(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); + writeAllele(g.getAllele(i), alleleMap); + } + continue; + } Object val = g.hasAttribute(key) ? g.getAttribute(key) : VCFConstants.MISSING_VALUE_v4; @@ -488,10 +492,13 @@ public class StandardVCFWriter implements VCFWriter { private static List calcVCFGenotypeKeys(VariantContext vc) { Set keys = new HashSet(); + boolean sawGoodGT = false; boolean sawGoodQual = false; boolean sawGenotypeFilter = false; for ( Genotype g : vc.getGenotypes().values() ) { keys.addAll(g.getAttributes().keySet()); + if ( g.isAvailable() ) + sawGoodGT = true; if ( g.hasNegLog10PError() ) sawGoodQual = true; if (g.isFiltered() && g.isCalled()) @@ -504,7 +511,17 @@ public class StandardVCFWriter implements VCFWriter { if (sawGenotypeFilter) keys.add(VCFConstants.GENOTYPE_FILTER_KEY); - return ParsingUtils.sortList(new ArrayList(keys)); + List sortedList = ParsingUtils.sortList(new ArrayList(keys)); + + // make sure the GT is first + if ( sawGoodGT ) { + List newList = new ArrayList(sortedList.size()+1); + newList.add(VCFConstants.GENOTYPE_KEY); + newList.addAll(sortedList); + sortedList = newList; + } + + return sortedList; } diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCF3Codec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCF3Codec.java index f3c99e963..c29f2ba8b 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCF3Codec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCF3Codec.java @@ -141,8 +141,6 @@ public class VCF3Codec extends AbstractVCFCodec { boolean missing = i >= GTValueSplitSize; if (gtKey.equals(VCFConstants.GENOTYPE_KEY)) { - if (i != 0) - generateException("Saw GT at position " + i + ", but it must be at the first position for genotypes"); genotypeAlleleLocation = i; } else if (gtKey.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) { GTQual = missing ? parseQual(VCFConstants.MISSING_VALUE_v4) : parseQual(GTValueArray[i]); @@ -156,12 +154,13 @@ public class VCF3Codec extends AbstractVCFCodec { } } - // check to make sure we found a gentoype field - if (genotypeAlleleLocation < 0) generateException("Unable to find required field GT for the record; we don't yet support a missing GT field"); + // check to make sure we found a genotype field + if ( genotypeAlleleLocation < 0 ) + generateException("Unable to find the GT field for the record; the GT field is required"); + if ( genotypeAlleleLocation > 0 ) + generateException("Saw GT field at position " + genotypeAlleleLocation + ", but it must be at the first position for genotypes"); - // todo -- assuming allele list length in the single digits is bad. Fix me. - // Check for > 1 for haploid genotypes - boolean phased = GTValueArray[genotypeAlleleLocation].length() > 1 && GTValueArray[genotypeAlleleLocation].charAt(1) == '|'; + boolean phased = GTValueArray[genotypeAlleleLocation].indexOf(VCFConstants.PHASED) != -1; // add it to the list try { diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCodec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCodec.java index 0fb2940bb..05fff5d9e 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCodec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFCodec.java @@ -145,8 +145,6 @@ public class VCFCodec extends AbstractVCFCodec { // todo -- all of these on the fly parsing of the missing value should be static constants if (gtKey.equals(VCFConstants.GENOTYPE_KEY)) { - if (i != 0) - generateException("Saw GT at position " + i + ", but it must be at the first position for genotypes"); genotypeAlleleLocation = i; } else if (gtKey.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) { GTQual = missing ? parseQual(VCFConstants.MISSING_VALUE_v4) : parseQual(GTValueArray[i]); @@ -160,22 +158,24 @@ public class VCFCodec extends AbstractVCFCodec { } } - // check to make sure we found a gentoype field - // TODO -- This is no longer required in v4.1 - if (genotypeAlleleLocation < 0) generateException("Unable to find required field GT for the record; we don't yet support a missing GT field"); + // check to make sure we found a genotype field if we are a VCF4.0 file + if ( version == VCFHeaderVersion.VCF4_0 && genotypeAlleleLocation == -1 ) + generateException("Unable to find the GT field for the record; the GT field is required in VCF4.0"); + if ( genotypeAlleleLocation > 0 ) + generateException("Saw GT field at position " + genotypeAlleleLocation + ", but it must be at the first position for genotypes when present"); - // todo -- assuming allele list length in the single digits is bad. Fix me. - // Check for > 1 for haploid genotypes - boolean phased = GTValueArray[genotypeAlleleLocation].length() > 1 && GTValueArray[genotypeAlleleLocation].charAt(1) == '|'; + List GTalleles = (genotypeAlleleLocation == -1 ? null : parseGenotypeAlleles(GTValueArray[genotypeAlleleLocation], alleles, alleleMap)); + boolean phased = genotypeAlleleLocation != -1 && GTValueArray[genotypeAlleleLocation].indexOf(VCFConstants.PHASED) != -1; // add it to the list try { - genotypes.put(sampleName, new Genotype(sampleName, - parseGenotypeAlleles(GTValueArray[genotypeAlleleLocation], alleles, alleleMap), - GTQual, - genotypeFilters, - gtAttributes, - phased)); + genotypes.put(sampleName, + new Genotype(sampleName, + GTalleles, + GTQual, + genotypeFilters, + gtAttributes, + phased)); } catch (TribbleException e) { throw new TribbleException.InternalCodecException(e.getMessage() + ", at position " + chr+":"+pos); } diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Genotype.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Genotype.java index 3a87f1196..0b5976c3c 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Genotype.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Genotype.java @@ -3,6 +3,7 @@ package org.broadinstitute.sting.utils.variantcontext; import org.broad.tribble.util.ParsingUtils; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.*; @@ -19,12 +20,14 @@ public class Genotype { protected InferredGeneticContext commonInfo; public final static double NO_NEG_LOG_10PERROR = InferredGeneticContext.NO_NEG_LOG_10PERROR; protected List alleles = null; // new ArrayList(); + protected Type type = null; protected boolean isPhased = false; - private boolean filtersWereAppliedToContext; + protected boolean filtersWereAppliedToContext; public Genotype(String sampleName, List alleles, double negLog10PError, Set filters, Map attributes, boolean isPhased) { - this.alleles = Collections.unmodifiableList(alleles); + if ( alleles != null ) + this.alleles = Collections.unmodifiableList(alleles); commonInfo = new InferredGeneticContext(sampleName, negLog10PError, filters, attributes); filtersWereAppliedToContext = filters != null; this.isPhased = isPhased; @@ -66,6 +69,9 @@ public class Genotype { } public List getAlleles(Allele allele) { + if ( getType() == Type.UNAVAILABLE ) + throw new ReviewedStingException("Requesting alleles for an UNAVAILABLE genotype"); + List al = new ArrayList(); for ( Allele a : alleles ) if ( a.equals(allele) ) @@ -75,6 +81,8 @@ public class Genotype { } public Allele getAllele(int i) { + if ( getType() == Type.UNAVAILABLE ) + throw new ReviewedStingException("Requesting alleles for an UNAVAILABLE genotype"); return alleles.get(i); } @@ -89,10 +97,21 @@ public class Genotype { NO_CALL, HOM_REF, HET, - HOM_VAR + HOM_VAR, + UNAVAILABLE } public Type getType() { + if ( type == null ) { + type = determineType(); + } + return type; + } + + protected Type determineType() { + if ( alleles == null ) + return Type.UNAVAILABLE; + Allele firstAllele = alleles.get(0); if ( firstAllele.isNoCall() ) { @@ -122,7 +141,8 @@ public class Genotype { * @return true if this genotype is not actually a genotype but a "no call" (e.g. './.' in VCF) */ public boolean isNoCall() { return getType() == Type.NO_CALL; } - public boolean isCalled() { return getType() != Type.NO_CALL; } + public boolean isCalled() { return getType() != Type.NO_CALL && getType() != Type.UNAVAILABLE; } + public boolean isAvailable() { return getType() != Type.UNAVAILABLE; } // // Useful methods for getting genotype likelihoods for a genotype object, if present @@ -157,8 +177,8 @@ public class Genotype { } public void validate() { - if ( alleles == null ) throw new IllegalArgumentException("BUG: alleles cannot be null in setAlleles"); - if ( alleles.size() == 0) throw new IllegalArgumentException("BUG: alleles cannot be of size 0 in setAlleles"); + if ( alleles == null ) return; + if ( alleles.size() == 0) throw new IllegalArgumentException("BUG: alleles cannot be of size 0"); int nNoCalls = 0; for ( Allele allele : alleles ) { @@ -175,6 +195,9 @@ public class Genotype { } public String getGenotypeString(boolean ignoreRefState) { + if ( alleles == null ) + return null; + // Notes: // 1. Make sure to use the appropriate separator depending on whether the genotype is phased // 2. If ignoreRefState is true, then we want just the bases of the Alleles (ignoring the '*' indicating a ref Allele) diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java index da80a3431..92c5d648b 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java @@ -1206,9 +1206,11 @@ public class VariantContext implements Feature { // to enable tribble intergrati if ( ! name.equals(g.getSampleName()) ) throw new IllegalStateException("Bound sample name " + name + " does not equal the name of the genotype " + g.getSampleName()); - for ( Allele gAllele : g.getAlleles() ) { - if ( ! hasAllele(gAllele) && gAllele.isCalled() ) - throw new IllegalStateException("Allele in genotype " + gAllele + " not in the variant context " + alleles); + if ( g.isAvailable() ) { + for ( Allele gAllele : g.getAlleles() ) { + if ( ! hasAllele(gAllele) && gAllele.isCalled() ) + throw new IllegalStateException("Allele in genotype " + gAllele + " not in the variant context " + alleles); + } } } } From 797c50e6894f5e5fd341c3b002610301173c269a Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Wed, 13 Jul 2011 10:01:23 -0400 Subject: [PATCH 098/214] Fixing integration tests I broke yesterday; removing batch merging test since we don't support that anymore. --- .../phasing/MergeMNPsIntegrationTest.java | 6 +-- ...gatingAlternateAllelesIntegrationTest.java | 6 +-- .../BatchMergeIntegrationTest.java | 46 ------------------- 3 files changed, 6 insertions(+), 52 deletions(-) delete mode 100755 public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/BatchMergeIntegrationTest.java diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsIntegrationTest.java index 3f87fc1a2..c88eac149 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsIntegrationTest.java @@ -23,7 +23,7 @@ public class MergeMNPsIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 1) + " -L chr20:556259-756570", 1, - Arrays.asList("e312b7d3854d5b2834a370659514a813")); + Arrays.asList("7f11f7f75d1526077f0173c7ed1fc6c4")); executeTest("Merge MNP sites within genomic distance of 1 [TEST ONE]", spec); } @@ -33,7 +33,7 @@ public class MergeMNPsIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 10) + " -L chr20:556259-756570", 1, - Arrays.asList("681f50e45f1d697370d2c355df2e18bc")); + Arrays.asList("53dd312468296826bdd3c22387390c88")); executeTest("Merge MNP sites within genomic distance of 10 [TEST TWO]", spec); } @@ -43,7 +43,7 @@ public class MergeMNPsIntegrationTest extends WalkerTest { baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 100) + " -L chr20:556259-756570", 1, - Arrays.asList("0bccb0ef928a108418246bec01098083")); + Arrays.asList("e26f92d2fb9f4eaeac7f9d8ee27410ee")); executeTest("Merge MNP sites within genomic distance of 100 [TEST THREE]", spec); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesIntegrationTest.java index 009048c10..f855c1dd3 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesIntegrationTest.java @@ -23,7 +23,7 @@ public class MergeSegregatingAlternateAllelesIntegrationTest extends WalkerTest baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 1) + " -L chr20:556259-756570", 1, - Arrays.asList("e16f957d888054ae0518e25660295241")); + Arrays.asList("af5e1370822551c0c6f50f23447dc627")); executeTest("Merge sites within genomic distance of 1 [TEST ONE]", spec); } @@ -33,7 +33,7 @@ public class MergeSegregatingAlternateAllelesIntegrationTest extends WalkerTest baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 10) + " -L chr20:556259-756570", 1, - Arrays.asList("122a482090677c7619c2105d44e00d11")); + Arrays.asList("dd8c44ae1ef059a7fe85399467e102eb")); executeTest("Merge sites within genomic distance of 10 [TEST TWO]", spec); } @@ -43,7 +43,7 @@ public class MergeSegregatingAlternateAllelesIntegrationTest extends WalkerTest baseTestString(hg18Reference, "merging_test_chr20_556259_756570.vcf", 100) + " -L chr20:556259-756570", 1, - Arrays.asList("bc6a8c8a42bb2601db98e88e9ad74748")); + Arrays.asList("f81fd72ecaa57b3215406fcea860bcc5")); executeTest("Merge sites within genomic distance of 100 [TEST THREE]", spec); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/BatchMergeIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/BatchMergeIntegrationTest.java deleted file mode 100755 index 7e1d86105..000000000 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/BatchMergeIntegrationTest.java +++ /dev/null @@ -1,46 +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.gatk.walkers.variantutils; - -import org.broadinstitute.sting.WalkerTest; -import org.testng.annotations.Test; - -import java.io.File; -import java.util.Arrays; - -public class BatchMergeIntegrationTest extends WalkerTest { - @Test - public void testBatchMerge1() { - String bam = validationDataLocation + "NA12878.HiSeq.b37.chr20.10_11mb.bam"; - String alleles = validationDataLocation + "batch.merge.alleles.vcf"; - WalkerTestSpec spec = new WalkerTestSpec( - "-T UnifiedGenotyper -NO_HEADER -BTI alleles -stand_call_conf 0.0 -glm BOTH -G none -nsl -gt_mode GENOTYPE_GIVEN_ALLELES -out_mode EMIT_ALL_SITES -o %s -R " + b37KGReference - + " -B:alleles,VCF " + alleles - + " -I " + bam, - 1, - Arrays.asList("f4ed8f4ef2cba96823c06e90e9d0de35")); - executeTest("testBatchMerge UG genotype given alleles:" + new File(bam).getName() + " with " + new File(alleles).getName(), spec); - } -} \ No newline at end of file From 6a431da554634b164635b299e2ef472a35fd0739 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Wed, 13 Jul 2011 14:40:01 -0400 Subject: [PATCH 102/214] Don't output source and ref header lines anymore. Short-term motivation for this is that I'd like this tool when run on a VCF to emit the exact same VCF. Long-term motivation is that these tags should be output by the VCF writer itself for all tools. --- .../walkers/variantutils/VariantsToVCF.java | 4 +-- .../utils/codecs/vcf/VCFIntegrationTest.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 public/java/test/org/broadinstitute/sting/utils/codecs/vcf/VCFIntegrationTest.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java index 7eb49da34..79134b553 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java @@ -199,8 +199,8 @@ public class VariantsToVCF extends RodWalker { // setup the header fields Set hInfo = new HashSet(); hInfo.addAll(VCFUtils.getHeaderFields(getToolkit())); - hInfo.add(new VCFHeaderLine("source", "VariantsToVCF")); - hInfo.add(new VCFHeaderLine("reference", getToolkit().getArguments().referenceFile.getName())); + //hInfo.add(new VCFHeaderLine("source", "VariantsToVCF")); + //hInfo.add(new VCFHeaderLine("reference", getToolkit().getArguments().referenceFile.getName())); allowedGenotypeFormatStrings.add(VCFConstants.GENOTYPE_KEY); for ( VCFHeaderLine field : hInfo ) { diff --git a/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/VCFIntegrationTest.java b/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/VCFIntegrationTest.java new file mode 100644 index 000000000..32ff25c7b --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/VCFIntegrationTest.java @@ -0,0 +1,28 @@ +package org.broadinstitute.sting.utils.codecs.vcf; + +import org.broadinstitute.sting.WalkerTest; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class VCFIntegrationTest extends WalkerTest { + + @Test + public void testReadingAndWritingWitHNoChanges() { + + String md5ofInputVCF = "a990ba187a69ca44cb9bc2bb44d00447"; + String testVCF = validationDataLocation + "vcf4.1.example.vcf"; + + String baseCommand = "-R " + b37KGReference + " -NO_HEADER -o %s "; + + String test1 = baseCommand + "-T VariantAnnotator -BTI variant -B:variant,vcf " + testVCF; + WalkerTestSpec spec1 = new WalkerTestSpec(test1, 1, Arrays.asList(md5ofInputVCF)); + List result = executeTest("Test Variant Annotator with no changes", spec1).getFirst(); + + String test2 = baseCommand + "-T VariantsToVCF -B:variant,vcf " + result.get(0).getAbsolutePath(); + WalkerTestSpec spec2 = new WalkerTestSpec(test2, 1, Arrays.asList(md5ofInputVCF)); + executeTest("Test Variants To VCF from new output", spec2); + } +} From df996a1a738208dac7c42b24645f747304b3de7f Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Wed, 13 Jul 2011 14:53:58 -0400 Subject: [PATCH 103/214] more progress report for the Data Processing Pipeline. Bam lists can now have empty lines, comments and whitespaces anywhere. --- .../qscripts/DataProcessingPipeline.scala | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala index f9369ee3f..d6caabd23 100755 --- a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala +++ b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala @@ -147,13 +147,22 @@ class DataProcessingPipeline extends QScript { } } + println("\n\n*** DEBUG ***\n") // Creating one file for each sample in the dataset val sampleBamFiles = scala.collection.mutable.Map.empty[String, File] for ((sample, flist) <- sampleTable) { + + println(sample + ":") + for (f <- flist) + println (f) + println() + val sampleFileName = new File(qscript.outputDir + qscript.projectName + "." + sample + ".bam") sampleBamFiles(sample) = sampleFileName add(joinBams(flist, sampleFileName)) } + println("*** DEBUG ***\n\n") + return sampleBamFiles.toMap } @@ -211,8 +220,10 @@ class DataProcessingPipeline extends QScript { if (in.toString.endsWith("bam")) return List(in) var l: List[File] = List() - for (bam <- fromFile(in).getLines) - l :+= new File(bam) + for (bam <- fromFile(in).getLines) { + if (!bam.startsWith("#") && !bam.isEmpty) + l :+= new File(bam.trim) + } return l } @@ -234,9 +245,6 @@ class DataProcessingPipeline extends QScript { // Generate a BAM file per sample joining all per lane files if necessary val sampleBamFiles: Map[String, File] = createSampleFiles(bams, realignedBams) - - println("nContigs: " + nContigs) - // Final output list of processed bam files var cohortList: List[File] = List() @@ -244,6 +252,7 @@ class DataProcessingPipeline extends QScript { println("\nFound the following samples: ") for ((sample, file) <- sampleBamFiles) println("\t" + sample + " -> " + file) + println("\n") // If this is a 'knowns only' indel realignment run, do it only once for all samples. val globalIntervals = new File(outputDir + projectName + ".intervals") From bb0e3a26fcf2a0c99ee0e70c46fb6359b3720a40 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Wed, 13 Jul 2011 14:57:21 -0400 Subject: [PATCH 104/214] Added integration test for VCF writing. Also, bug fix for writing the GT-free records. --- .../sting/utils/codecs/vcf/StandardVCFWriter.java | 7 ++++--- .../variantutils/VariantsToVCFIntegrationTest.java | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index f7d09f16d..e7ddac185 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -444,9 +444,10 @@ public class StandardVCFWriter implements VCFWriter { break; } - for (String s : attrs ) { - mWriter.write(VCFConstants.GENOTYPE_FIELD_SEPARATOR); - mWriter.write(s); + for (int i = 0; i < attrs.size(); i++) { + if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY) ) + mWriter.write(VCFConstants.GENOTYPE_FIELD_SEPARATOR); + mWriter.write(attrs.get(i)); } } } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java index 8421076c9..8c96c1e11 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCFIntegrationTest.java @@ -20,7 +20,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testVariantsToVCFUsingGeliInput() { List md5 = new ArrayList(); - md5.add("815b82fff92aab41c209eedce2d7e7d9"); + md5.add("4accae035d271b35ee2ec58f403c68c6"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -38,7 +38,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingGeliInput() { List md5 = new ArrayList(); - md5.add("22336ee9c12aa222ce29c3c5babca7d0"); + md5.add("71e8c98d7c3a73b6287ecc339086fe03"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -56,7 +56,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingHapMapInput() { List md5 = new ArrayList(); - md5.add("9bedaa7670b86a07be5191898c3727cf"); + md5.add("f343085305e80c7a2493422e4eaad983"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + @@ -73,7 +73,7 @@ public class VariantsToVCFIntegrationTest extends WalkerTest { @Test public void testGenotypesToVCFUsingVCFInput() { List md5 = new ArrayList(); - md5.add("cc215edec9ca28e5c79ab1b67506f9f7"); + md5.add("86f02e2e764ba35854cff2aa05a1fdd8"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + From 66c652d687ec5b5e15b33255441e31b775d20c3c Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Thu, 14 Jul 2011 11:56:10 -0400 Subject: [PATCH 113/214] Added some extra error checks in the VCF codec. Now that we've moved this back into the GATK, changed some of the standard exceptions to be USerErrors (instead of TribbleExceptions). --- .../utils/codecs/vcf/AbstractVCFCodec.java | 25 ++++++++++--------- .../sting/utils/exceptions/UserException.java | 10 ++++++++ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/AbstractVCFCodec.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/AbstractVCFCodec.java index 01344a117..710127f7a 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/AbstractVCFCodec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/AbstractVCFCodec.java @@ -7,6 +7,8 @@ import org.broad.tribble.NameAwareCodec; import org.broad.tribble.TribbleException; import org.broad.tribble.readers.LineReader; import org.broad.tribble.util.ParsingUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; @@ -96,6 +98,9 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec, for ( String str : headerStrings ) { if ( !str.startsWith(VCFHeader.METADATA_INDICATOR) ) { String[] strings = str.substring(1).split(VCFConstants.FIELD_SEPARATOR); + if ( strings.length < VCFHeader.HEADER_FIELDS.values().length ) + throw new TribbleException.InvalidHeader("there are not enough columns present in the header line: " + str); + int arrayIndex = 0; for (VCFHeader.HEADER_FIELDS field : VCFHeader.HEADER_FIELDS.values()) { try { @@ -159,12 +164,11 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec, } private Feature reallyDecode(String line) { - try { // the same line reader is not used for parsing the header and parsing lines, if we see a #, we've seen a header line if (line.startsWith(VCFHeader.HEADER_INDICATOR)) return null; // our header cannot be null, we need the genotype sample names and counts - if (header == null) throw new IllegalStateException("VCF Header cannot be null when decoding a record"); + if (header == null) throw new ReviewedStingException("VCF Header cannot be null when decoding a record"); if (parts == null) parts = new String[Math.min(header.getColumnCount(), NUM_STANDARD_FIELDS+1)]; @@ -174,17 +178,18 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec, // if we have don't have a header, or we have a header with no genotyping data check that we have eight columns. Otherwise check that we have nine (normal colummns + genotyping data) if (( (header == null || (header != null && !header.hasGenotypingData())) && nParts != NUM_STANDARD_FIELDS) || (header != null && header.hasGenotypingData() && nParts != (NUM_STANDARD_FIELDS + 1)) ) - throw new IllegalArgumentException("There aren't enough columns for line " + line + " (we expected " + (header == null ? NUM_STANDARD_FIELDS : NUM_STANDARD_FIELDS + 1) + - " tokens, and saw " + nParts + " )"); + throw new UserException.MalformedVCF("there aren't enough columns for line " + line + " (we expected " + (header == null ? NUM_STANDARD_FIELDS : NUM_STANDARD_FIELDS + 1) + + " tokens, and saw " + nParts + " )", lineNo); return parseVCFLine(parts); - } catch (TribbleException e) { - throw new TribbleException.InvalidDecodeLine(e.getMessage(), line); - } } protected void generateException(String message) { - throw new TribbleException.InvalidDecodeLine(message, lineNo); + throw new UserException.MalformedVCF(message, lineNo); + } + + private static void generateException(String message, int lineNo) { + throw new UserException.MalformedVCF(message, lineNo); } /** @@ -472,10 +477,6 @@ public abstract class AbstractVCFCodec implements FeatureCodec, NameAwareCodec, return true; } - private static void generateException(String message, int lineNo) { - throw new TribbleException.InvalidDecodeLine(message, lineNo); - } - private static int computeForwardClipping(List unclippedAlleles, String ref) { boolean clipping = true; // Note that the computation of forward clipping here is meant only to see whether there is a common diff --git a/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java b/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java index 0be4bec91..17c4a7df4 100755 --- a/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java +++ b/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java @@ -154,6 +154,16 @@ public class UserException extends ReviewedStingException { } } + public static class MalformedVCF extends UserException { + public MalformedVCF(String message, String line) { + super(String.format("The provided VCF file is malformed at line %s: %s", line, message)); + } + + public MalformedVCF(String message, int lineNo) { + super(String.format("The provided VCF file is malformed at line nmber %d: %s", lineNo, message)); + } + } + public static class ReadMissingReadGroup extends MalformedBAM { public ReadMissingReadGroup(SAMRecord read) { super(read, String.format("Read %s is either missing the read group or its read group is not defined in the BAM header, both of which are required by the GATK. Please use http://www.broadinstitute.org/gsa/wiki/index.php/ReplaceReadGroups to fix this problem", read.getReadName())); From ed6beae1f3769c247b9a4fc80121985baad6443f Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Thu, 14 Jul 2011 13:55:35 -0400 Subject: [PATCH 116/214] Adding headers to diffable reading for VCFs --- .../gatk/walkers/diffengine/VCFDiffableReader.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index 06d14366f..5677574bd 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -26,16 +26,12 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; import org.broad.tribble.readers.AsciiLineReader; import org.broad.tribble.readers.LineReader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.*; -import java.util.Arrays; import java.util.Map; -import java.util.zip.GZIPInputStream; /** @@ -58,7 +54,11 @@ public class VCFDiffableReader implements DiffableReader { VCFCodec vcfCodec = new VCFCodec(); // must be read as state is stored in reader itself - vcfCodec.readHeader(lineReader); + VCFHeader header = (VCFHeader)vcfCodec.readHeader(lineReader); + for ( VCFHeaderLine headerLine : header.getMetaData() ) { + final String key = (headerLine instanceof VCFNamedHeaderLine ? headerLine.getKey() + "." + ((VCFNamedHeaderLine) headerLine).getName() : headerLine.getKey()); + root.add(key, headerLine.toString()); + } String line = lineReader.readLine(); int count = 0; From 9540df69986c16112b5fdd57efebf72846d86424 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Thu, 14 Jul 2011 14:00:19 -0400 Subject: [PATCH 117/214] Oops, forgot to update unit test --- .../sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java index baa2f0383..a0cb47770 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java @@ -87,7 +87,7 @@ public class DiffableReaderUnitTest extends BaseTest { Assert.assertSame(diff.getParent(), DiffElement.ROOT); DiffNode node = diff.getValueAsNode(); - Assert.assertEquals(node.getElements().size(), 9); + Assert.assertEquals(node.getElements().size(), 10); // chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03 DiffNode rec1 = node.getElement("chr1:2646").getValueAsNode(); From 5ffeddd3b1ac5f83d6018dad0a178ae785a4dc39 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 14 Jul 2011 14:45:16 -0400 Subject: [PATCH 119/214] better to use _ instead of ., as this is a special case later. --- .../sting/gatk/walkers/diffengine/VCFDiffableReader.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index 5677574bd..a812babaf 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -56,7 +56,9 @@ public class VCFDiffableReader implements DiffableReader { // must be read as state is stored in reader itself VCFHeader header = (VCFHeader)vcfCodec.readHeader(lineReader); for ( VCFHeaderLine headerLine : header.getMetaData() ) { - final String key = (headerLine instanceof VCFNamedHeaderLine ? headerLine.getKey() + "." + ((VCFNamedHeaderLine) headerLine).getName() : headerLine.getKey()); + String key = headerLine.getKey(); + if ( headerLine instanceof VCFNamedHeaderLine ) + key += "_" + ((VCFNamedHeaderLine) headerLine).getName(); root.add(key, headerLine.toString()); } From c0bbeb23ba0200d80f940a395ddc019fdb61f093 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 14 Jul 2011 15:12:28 -0400 Subject: [PATCH 120/214] Now providing more information when the index on the fly isn't equal to the one created by reading the file from disk. --- .../test/org/broadinstitute/sting/WalkerTest.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/public/java/test/org/broadinstitute/sting/WalkerTest.java b/public/java/test/org/broadinstitute/sting/WalkerTest.java index dacaf2738..d65f4ec34 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -26,7 +26,9 @@ package org.broadinstitute.sting; import org.apache.commons.lang.StringUtils; +import org.broad.tribble.FeatureCodec; import org.broad.tribble.Tribble; +import org.broad.tribble.index.Index; import org.broad.tribble.index.IndexFactory; import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; import org.broadinstitute.sting.gatk.CommandLineExecutable; @@ -64,10 +66,19 @@ public class WalkerTest extends BaseTest { } System.out.println("Verifying on-the-fly index " + indexFile + " for test " + name + " using file " + resultFile); - Assert.assertTrue(IndexFactory.onDiskIndexEqualToNewlyCreatedIndex(resultFile, indexFile, new VCFCodec()), "Index on disk from indexing on the fly not equal to the index created after the run completed"); + Index indexFromOutputFile = IndexFactory.createIndex(resultFile, new VCFCodec()); + Index dynamicIndex = IndexFactory.loadIndex(indexFile.getAbsolutePath()); + + if ( ! indexFromOutputFile.equals(dynamicIndex) ) { + Assert.fail(String.format("Index on disk from indexing on the fly not equal to the index created after the run completed. FileIndex %s vs. on-the-fly %s%n", + indexFromOutputFile.getProperties(), + dynamicIndex.getProperties())); + } } } + + public List assertMatchingMD5s(final String name, List resultFiles, List expectedMD5s) { List md5s = new ArrayList(); for (int i = 0; i < resultFiles.size(); i++) { From 9d59c2cb618c92c52a623fd8a1c98021db650795 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Fri, 15 Jul 2011 10:13:02 -0400 Subject: [PATCH 128/214] a) Made indel VQSR consensus script operational again, b) Made VariantsToTable more indel-friendly when printing out REF and ALT fields: strip out * from REF and print out alleles in the same way as the VCF so that offline processing is easier --- .../walkers/variantutils/VariantsToTable.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index d8340b761..e7448b43e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -76,17 +76,29 @@ public class VariantsToTable extends RodWalker { // #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT getters.put("CHROM", new Getter() { public String get(VariantContext vc) { return vc.getChr(); } }); getters.put("POS", new Getter() { public String get(VariantContext vc) { return Integer.toString(vc.getStart()); } }); - getters.put("REF", new Getter() { public String get(VariantContext vc) { return vc.getReference().toString(); } }); + getters.put("REF", new Getter() { + public String get(VariantContext vc) { + String x = ""; + if (vc.hasAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)) { + Byte refByte = (Byte)(vc.getAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)); + x=x+new String(new byte[]{refByte}); + } + return x+vc.getReference().getDisplayString(); + } + }); getters.put("ALT", new Getter() { public String get(VariantContext vc) { StringBuilder x = new StringBuilder(); int n = vc.getAlternateAlleles().size(); - if ( n == 0 ) return "."; + if (vc.hasAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)) { + Byte refByte = (Byte)(vc.getAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)); + x.append(new String(new byte[]{refByte})); + } for ( int i = 0; i < n; i++ ) { if ( i != 0 ) x.append(","); - x.append(vc.getAlternateAllele(i).toString()); + x.append(vc.getAlternateAllele(i).getDisplayString()); } return x.toString(); } From 72f4cf9c0ecbd8608d207ee59a5e5bd36a395be8 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Fri, 15 Jul 2011 17:44:31 -0400 Subject: [PATCH 136/214] Walker to perform deterministic annotation of phasing by transmission (to be compatible with RBP's definition of consecutive pairwise phasing) --- .../sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1d9616aac..fbe6e5b5a 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 @@ -242,7 +242,7 @@ public class ReadBackedPhasingWalker extends RodWalker KEYS_TO_KEEP_IN_REDUCED_VCF = new HashSet(Arrays.asList("PQ")); + private static final Set KEYS_TO_KEEP_IN_REDUCED_VCF = new HashSet(Arrays.asList(PQ_KEY)); private VariantContext reduceVCToSamples(VariantContext vc, List samplesToPhase) { // for ( String sample : samplesToPhase ) From 5e7bc862a34d7366c168209261ea5aedb812c790 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 16 Jul 2011 08:51:21 -0400 Subject: [PATCH 140/214] Rev tribble to include new equal() method that prints out details of why two indices are not the same. --- .../{tribble-3.jar => tribble-4.jar} | Bin 258609 -> 286423 bytes .../{tribble-3.xml => tribble-4.xml} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename settings/repository/org.broad/{tribble-3.jar => tribble-4.jar} (69%) rename settings/repository/org.broad/{tribble-3.xml => tribble-4.xml} (58%) diff --git a/settings/repository/org.broad/tribble-3.jar b/settings/repository/org.broad/tribble-4.jar similarity index 69% rename from settings/repository/org.broad/tribble-3.jar rename to settings/repository/org.broad/tribble-4.jar index f0ab44a05fb969693b20757be8d29b18f3b611a6..1f82f3cc05b8f02f117506269a8b96110cff591a 100644 GIT binary patch delta 50001 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 diff --git a/settings/repository/org.broad/tribble-3.xml b/settings/repository/org.broad/tribble-4.xml similarity index 58% rename from settings/repository/org.broad/tribble-3.xml rename to settings/repository/org.broad/tribble-4.xml index c35358331..07235efb0 100644 --- a/settings/repository/org.broad/tribble-3.xml +++ b/settings/repository/org.broad/tribble-4.xml @@ -1,4 +1,4 @@ - From eacf205f4079e55ed03dd248cbb8c1a41491c01e Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 16 Jul 2011 09:22:34 -0400 Subject: [PATCH 142/214] Tests needed to be updated to reflect the code reorg of tribble. --- .../org/broadinstitute/sting/WalkerTest.java | 21 +++++++++++-------- .../codecs/vcf/IndexFactoryUnitTest.java | 3 ++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/WalkerTest.java b/public/java/test/org/broadinstitute/sting/WalkerTest.java index d65f4ec34..a39fa37fe 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -65,19 +65,22 @@ public class WalkerTest extends BaseTest { throw new StingException("Found an index created for file " + resultFile + " but we can only validate VCF files. Extend this code!"); } - System.out.println("Verifying on-the-fly index " + indexFile + " for test " + name + " using file " + resultFile); - Index indexFromOutputFile = IndexFactory.createIndex(resultFile, new VCFCodec()); - Index dynamicIndex = IndexFactory.loadIndex(indexFile.getAbsolutePath()); - - if ( ! indexFromOutputFile.equals(dynamicIndex) ) { - Assert.fail(String.format("Index on disk from indexing on the fly not equal to the index created after the run completed. FileIndex %s vs. on-the-fly %s%n", - indexFromOutputFile.getProperties(), - dynamicIndex.getProperties())); - } + assertOnDiskIndexEqualToNewlyCreatedIndex(indexFile, name, resultFile); } } + public static void assertOnDiskIndexEqualToNewlyCreatedIndex(final File indexFile, final String name, final File resultFile) { + System.out.println("Verifying on-the-fly index " + indexFile + " for test " + name + " using file " + resultFile); + Index indexFromOutputFile = IndexFactory.createIndex(resultFile, new VCFCodec()); + Index dynamicIndex = IndexFactory.loadIndex(indexFile.getAbsolutePath()); + + if ( ! indexFromOutputFile.equals(dynamicIndex) ) { + Assert.fail(String.format("Index on disk from indexing on the fly not equal to the index created after the run completed. FileIndex %s vs. on-the-fly %s%n", + indexFromOutputFile.getProperties(), + dynamicIndex.getProperties())); + } + } public List assertMatchingMD5s(final String name, List resultFiles, List expectedMD5s) { List md5s = new ArrayList(); diff --git a/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/IndexFactoryUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/IndexFactoryUnitTest.java index 2f6b589f4..68a2ecf8d 100755 --- a/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/IndexFactoryUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/codecs/vcf/IndexFactoryUnitTest.java @@ -4,6 +4,7 @@ import org.broad.tribble.Tribble; import org.broad.tribble.index.*; import org.broad.tribble.iterators.CloseableTribbleIterator; import org.broad.tribble.source.BasicFeatureSource; +import org.broadinstitute.sting.WalkerTest; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.testng.Assert; import org.testng.annotations.Test; @@ -75,7 +76,7 @@ public class IndexFactoryUnitTest { // test that the input index is the same as the one created from the identical input file // test that the dynamic index is the same as the output index, which is equal to the input index - Assert.assertTrue(IndexFactory.onDiskIndexEqualToNewlyCreatedIndex(outputFile, outputFileIndex, new VCFCodec())); + WalkerTest.assertOnDiskIndexEqualToNewlyCreatedIndex(outputFileIndex, "unittest", outputFile); } } } From 07b875c7796972eff2c56c662f198821a5c4e659 Mon Sep 17 00:00:00 2001 From: David Roazen Date: Sat, 16 Jul 2011 09:57:46 -0400 Subject: [PATCH 143/214] Renaming the updated tribble jar file to match the svn revision number. --- .../org.broad/{tribble-4.jar => tribble-14.jar} | Bin .../org.broad/{tribble-4.xml => tribble-14.xml} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename settings/repository/org.broad/{tribble-4.jar => tribble-14.jar} (100%) rename settings/repository/org.broad/{tribble-4.xml => tribble-14.xml} (57%) diff --git a/settings/repository/org.broad/tribble-4.jar b/settings/repository/org.broad/tribble-14.jar similarity index 100% rename from settings/repository/org.broad/tribble-4.jar rename to settings/repository/org.broad/tribble-14.jar diff --git a/settings/repository/org.broad/tribble-4.xml b/settings/repository/org.broad/tribble-14.xml similarity index 57% rename from settings/repository/org.broad/tribble-4.xml rename to settings/repository/org.broad/tribble-14.xml index 07235efb0..f2116324a 100644 --- a/settings/repository/org.broad/tribble-4.xml +++ b/settings/repository/org.broad/tribble-14.xml @@ -1,4 +1,4 @@ - From 2b55d5b7c0dfca0abd09ab810206d5a437d598ec Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 16 Jul 2011 16:45:55 -0400 Subject: [PATCH 144/214] Test tribble library where equals() ignores time stamps. --- settings/repository/org.broad/tribble-14.jar | Bin 286423 -> 286358 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/settings/repository/org.broad/tribble-14.jar b/settings/repository/org.broad/tribble-14.jar index 1f82f3cc05b8f02f117506269a8b96110cff591a..a0313df326217a5b1820cd7e7d6c029c8129e326 100644 GIT binary patch delta 6171 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 delta 6319 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 Date: Sun, 17 Jul 2011 10:14:23 -0400 Subject: [PATCH 145/214] Moved the varianteval/tags/DataPoint.java and varianteval/tags/Analysis.java to varianteval/utils. This allows rsync to see these files with the -C option, as tags is some kind of reserved CVS keyword. --- .../gatk/walkers/varianteval/VariantEvalWalker.java | 5 ++--- .../walkers/varianteval/evaluators/CompOverlap.java | 4 ++-- .../walkers/varianteval/evaluators/CountVariants.java | 4 ++-- .../varianteval/evaluators/GenotypeConcordance.java | 4 ++-- .../evaluators/GenotypePhasingEvaluator.java | 7 +++---- .../varianteval/evaluators/IndelLengthHistogram.java | 4 ++-- .../varianteval/evaluators/IndelMetricsByAC.java | 4 ++-- .../varianteval/evaluators/IndelStatistics.java | 4 ++-- .../evaluators/MendelianViolationEvaluator.java | 10 ++-------- .../varianteval/evaluators/PrintMissingComp.java | 4 ++-- .../varianteval/evaluators/SimpleMetricsByAC.java | 7 +++---- .../varianteval/evaluators/ThetaVariantEvaluator.java | 4 ++-- .../varianteval/evaluators/TiTvVariantEvaluator.java | 4 ++-- .../varianteval/evaluators/ValidationReport.java | 5 ++--- .../varianteval/evaluators/VariantQualityScore.java | 4 ++-- .../walkers/varianteval/{tags => util}/Analysis.java | 2 +- .../varianteval/util/AnalysisModuleScanner.java | 2 -- .../walkers/varianteval/{tags => util}/DataPoint.java | 2 +- .../walkers/varianteval/util/VariantEvalUtils.java | 3 --- 19 files changed, 34 insertions(+), 49 deletions(-) rename public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/{tags => util}/Analysis.java (80%) rename public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/{tags => util}/DataPoint.java (77%) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java index 15d808ebe..c9c5e09a8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java @@ -20,7 +20,7 @@ import org.broadinstitute.sting.gatk.walkers.TreeReducible; import org.broadinstitute.sting.gatk.walkers.Window; import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.VariantEvaluator; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; import org.broadinstitute.sting.gatk.walkers.variantrecalibration.Tranche; import org.broadinstitute.sting.gatk.walkers.variantrecalibration.VariantRecalibrator; @@ -30,10 +30,9 @@ import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; -import net.sf.picard.reference.FastaSequenceFile; import net.sf.picard.reference.IndexedFastaSequenceFile; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import net.sf.picard.reference.ReferenceSequence; + import java.io.FileNotFoundException; import java.io.File; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java index 76db330ed..85373baa8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; /** * The Broad Institute diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java index c4277adc9..befb2ff13 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; @Analysis(description = "Counts different classes of variants in the sample") diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java index 4b56cf130..58803c9d0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java index 3d14dd0e5..407b71893 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java @@ -1,6 +1,7 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -9,10 +10,8 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.phasing.AllelePair; import org.broadinstitute.sting.gatk.walkers.phasing.ReadBackedPhasingWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.NewEvaluationContext; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.MathUtils; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java index 5daf33a9f..f7f9fce0c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java @@ -1,11 +1,11 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java index eca6c5193..dd4bb492e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java index 48b06d532..1bd420e0a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.IndelUtils; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java index 85e0b5889..16ec74433 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java @@ -1,22 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.MendelianViolation; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Mendelian violation detection and counting *

diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java index 7d54d0df8..e83914ef8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java @@ -24,12 +24,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; @Analysis(name = "PrintMissingComp", description = "the overlap between eval and comp sites") public class PrintMissingComp extends VariantEvaluator { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java index deed05508..395309975 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; @@ -8,11 +9,9 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.Degeneracy; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.Sample; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.StateKey; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import java.util.ArrayList; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java index 89c67cfe9..f9cda5e0b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java index 8811dc001..deeafd851 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.BaseUtils; @Analysis(description = "Ti/Tv Variant Evaluator") diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java index 405f35635..756427581 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java @@ -1,14 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java index 4af14810b..29a61e27a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java @@ -25,14 +25,14 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.collections.Pair; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/Analysis.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/Analysis.java similarity index 80% rename from public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/Analysis.java rename to public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/Analysis.java index 129d5a95d..2b37ce210 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/Analysis.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/Analysis.java @@ -1,4 +1,4 @@ -package org.broadinstitute.sting.gatk.walkers.varianteval.tags; +package org.broadinstitute.sting.gatk.walkers.varianteval.util; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/AnalysisModuleScanner.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/AnalysisModuleScanner.java index c8d917040..db44e9e28 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/AnalysisModuleScanner.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/AnalysisModuleScanner.java @@ -23,8 +23,6 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.util; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.lang.annotation.Annotation; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/DataPoint.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/DataPoint.java similarity index 77% rename from public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/DataPoint.java rename to public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/DataPoint.java index 3ba448049..396843252 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/tags/DataPoint.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/DataPoint.java @@ -1,4 +1,4 @@ -package org.broadinstitute.sting.gatk.walkers.varianteval.tags; +package org.broadinstitute.sting.gatk.walkers.varianteval.util; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java index b8e45e462..eabd2e588 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java @@ -7,15 +7,12 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.report.GATKReport; import org.broadinstitute.sting.gatk.report.GATKReportTable; -import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.StandardEval; import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.VariantEvaluator; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.RequiredStratification; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.StandardStratification; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.tags.DataPoint; import org.broadinstitute.sting.utils.classloader.PluginManager; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; From a5bfcb1ed9f4ee0f5a94a744bd9e31bbd8d254a2 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 10:25:34 -0400 Subject: [PATCH 146/214] V15 is broken. Going up to v16 in a second. --- .../{tribble-14.jar => tribble-15.jar} | Bin 286358 -> 286159 bytes .../{tribble-14.xml => tribble-15.xml} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename settings/repository/org.broad/{tribble-14.jar => tribble-15.jar} (89%) rename settings/repository/org.broad/{tribble-14.xml => tribble-15.xml} (59%) diff --git a/settings/repository/org.broad/tribble-14.jar b/settings/repository/org.broad/tribble-15.jar similarity index 89% rename from settings/repository/org.broad/tribble-14.jar rename to settings/repository/org.broad/tribble-15.jar index a0313df326217a5b1820cd7e7d6c029c8129e326..4e89047f49d774453a2ae61d036a21a7d4270d09 100644 GIT binary patch delta 12091 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 RVUZBM%8lWU30VjS{ePbyo$&ww delta 12360 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 z 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 diff --git a/settings/repository/org.broad/tribble-14.xml b/settings/repository/org.broad/tribble-15.xml similarity index 59% rename from settings/repository/org.broad/tribble-14.xml rename to settings/repository/org.broad/tribble-15.xml index f2116324a..e23eec339 100644 --- a/settings/repository/org.broad/tribble-14.xml +++ b/settings/repository/org.broad/tribble-15.xml @@ -1,4 +1,4 @@ - From 4db2b13e9ebd54f832d05f885d7ec8946118fb70 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 13:05:04 -0400 Subject: [PATCH 147/214] Rev tribble. Just added more documentation for diffEngine and pointer to new wiki: http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine --- .../gatk/walkers/diffengine/DiffEngine.java | 2 +- .../walkers/diffengine/DiffableReader.java | 15 +++++++++++++++ .../org/broadinstitute/sting/WalkerTest.java | 2 +- settings/repository/org.broad/tribble-15.jar | Bin 286159 -> 0 bytes .../{tribble-15.xml => tribble-16.xml} | 0 5 files changed, 17 insertions(+), 2 deletions(-) delete mode 100644 settings/repository/org.broad/tribble-15.jar rename settings/repository/org.broad/{tribble-15.xml => tribble-16.xml} (100%) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index 6d85df71d..2f87a900a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -209,7 +209,7 @@ public class DiffEngine { protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { GATKReport report = new GATKReport(); final String tableName = "diffences"; - report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffObjectsWalker_and_SummarizedDifferences for more information"); + report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine for more information"); GATKReportTable table = report.getTable(tableName); table.addPrimaryKey("Difference", true); table.addColumn("NumberOfOccurrences", 0); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java index af5771c55..a117206f1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReader.java @@ -39,12 +39,27 @@ import java.io.File; */ public interface DiffableReader { @Ensures("result != null") + /** + * Return the name of this DiffableReader type. For example, the VCF reader returns 'VCF' and the + * bam reader 'BAM' + */ public String getName(); @Ensures("result != null") @Requires("file != null") + /** + * Read up to maxElementsToRead DiffElements from file, and return them. + */ public DiffElement readFromFile(File file, int maxElementsToRead); + /** + * Return true if the file can be read into DiffElement objects with this reader. This should + * be uniquely true/false for all readers, as the system will use the first reader that can read the + * file. This routine should never throw an exception. The VCF reader, for example, looks at the + * first line of the file for the ##format=VCF4.1 header, and the BAM reader for the BAM_MAGIC value + * @param file + * @return + */ @Requires("file != null") public boolean canRead(File file); } diff --git a/public/java/test/org/broadinstitute/sting/WalkerTest.java b/public/java/test/org/broadinstitute/sting/WalkerTest.java index a39fa37fe..22635dfa3 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -75,7 +75,7 @@ public class WalkerTest extends BaseTest { Index indexFromOutputFile = IndexFactory.createIndex(resultFile, new VCFCodec()); Index dynamicIndex = IndexFactory.loadIndex(indexFile.getAbsolutePath()); - if ( ! indexFromOutputFile.equals(dynamicIndex) ) { + if ( ! indexFromOutputFile.equalsIgnoreTimestamp(dynamicIndex) ) { Assert.fail(String.format("Index on disk from indexing on the fly not equal to the index created after the run completed. FileIndex %s vs. on-the-fly %s%n", indexFromOutputFile.getProperties(), dynamicIndex.getProperties())); diff --git a/settings/repository/org.broad/tribble-15.jar b/settings/repository/org.broad/tribble-15.jar deleted file mode 100644 index 4e89047f49d774453a2ae61d036a21a7d4270d09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286159 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 diff --git a/settings/repository/org.broad/tribble-15.xml b/settings/repository/org.broad/tribble-16.xml similarity index 100% rename from settings/repository/org.broad/tribble-15.xml rename to settings/repository/org.broad/tribble-16.xml From 35ec82a467b3e739c98bc700c4765d9f0a0be17a Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 13:08:08 -0400 Subject: [PATCH 148/214] Oops, need this --- settings/repository/org.broad/tribble-16.jar | Bin 0 -> 286215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 settings/repository/org.broad/tribble-16.jar diff --git a/settings/repository/org.broad/tribble-16.jar b/settings/repository/org.broad/tribble-16.jar new file mode 100644 index 0000000000000000000000000000000000000000..331f28ec34a8d1b63d30a02cd396595e3abe6353 GIT binary patch literal 286215 zcmd?S34Bz?l{b2BZ@0U3g{0PoKtQvD78bD?u^12nWI$jfz!+@PNDZ_RYAm&k9Xrlu zXK@lciJirc6EAU$C-Ec>wgC?lJF{iJ$?QueGxPH1n=P}xSu*oxNydra|6g@)-`m}{ zMMIo?ncoxiU90L=ojO%#ty6n<219X?sK_4-e0QUG{$di6-MxdGJNx>#E&bs)ME2&B z{yvf}fBwbyoI-N`8t}^}-MzWLZ(Hxc;F8_jcBe)&$J67v&I9SO@l1BKJGp$xvg-Ke zQO}djXHr8a(@8wT%j=eORmXeA(y3f}xO2 zYjtwb<}+tT(#gKjp(Tr}=l2Mh@@lOZ*`GNbAKiPOi@V}mJF#gN3V>`-dt zKx!<*d;4K1cQP|>$f8|@f^MTzcfY!* zUnkPJo|9vSG%Q-|>4pK|$><4yIg0lKxzt!rVPK!m&^tO@)B%xc6 zerfbux8LYy0!+M1IZf9JHUJ61GQYA{Yr!GNhY zWeU)8Xe2w1UeoijcbdBy!1Umb4P?K`P0cYAxy;B?=bO4~J-O8j%;fn#_fB^WHqf2i zHr!{I#eOHD59mQUN~_~MR8z836?>d=vQtwXIzWw4c8=->b`QIwh$P4U_^zfOV0`m8 zf3gnHO)LU`iz!W}G~-)$Or*!|He{F2$m;9!8=@JzL&ul)u+J1>)TG;i2gX^v_pYJz znH+eOaZ{!i4&oc%!cRFJ8Fgx9$aNUvrCsK{pS0E+t}&}qi$W}}I%0tQM3!T<<|yn`S8Lj{=F2WBsB%u7>_qG(C*SVRd{1bHPYtu;K>xJ!4sXg7WZ{R z&e9n_^@^PiNMqpy)^8m-{d-8p-vazfTgX1!d^Y9JQeyIof!gD<=oF?bOY6;XCqbhR z;*V7lsyKC3$*d8O+4^neG}0YIgI1IWWGS_qYyho|27)u0G}{+!RC9_vN(Nmm^G zGRu@Cduma(AazD%Y4IUke)%u{F1q{*muRs;^aRsdx* zm(?9vcA(T?BthcHj!fii0i@QM8C}2>eAb@!yiAz>hWlCnF(0#c7#iXwtJih{Z$Ycxuede$sc?aUid6w@_amcXHl5^TF5 zp+p#m3lez|&%I?$@s!noN>M(ENwZ9|%i5u4NRgSB#XRJe7rh`cr^t&EFD^CVDRrhy zmsXT&$PD%EnS~=io_T0^J9r8Hu1A8>3CBi@{9HcICIQ6kt=aVWXs-7zP_&|%p(T!* z*HZwe=nb~RGj139;85v^x@HNz$-jaa5q+bh=`ke}kShDh#T7Odh;4$hkEc#x6#GtE z_6RQ+(2d2V=Y{HK3)lm;Z0$9J-;g<1&TEMOxWJ4DYNbg(#)xJ~i{}}k2cv6J7d83U_vkw_yKK8Zf3z}c;^0W+*ZE{#{@?DUMgQQ=q<((p-4 zVGFPH6dtfA@mgRGH9^#W1aU6XZhYy+y^lT%1m>?B39md{=Jk!^l%?25Y4FVJ7!LA?kEwmYdv=v}CcgSwI3XLUkRgAJBCb)W0snZ8Nrkpp7CC;&#sA@RNJH5Q3n)pG+kFQvUL$x z9@RhMK#j>v*h~(=ypYU{o|(ucDfuK%rpA-0?uj-iScn2Kg;I!B!3$P?Lx5l1RE)fsaM473mi9)_Je4ycIL<87@PshaXl z1^+~T3Auso^(Zl*_;xtpHdoX{!42T0oPVCPW(!`@^CSZgT8?Z zHu|>9kjlw_1q06lmb6+B>}K)`18vPUc5Q{Drfu>b9XvUfJxj%~>OWVcC?|Gcl#m1D zA1OuzV@6x1j$o8fD{i&5cNWST)QM|Z;}Fu{j4^ds(Y7|79`~eGl+J16BSo?>W@^=# zv(%`eaWR5%qrX%j)C4_3jr*ZnP{mvEk=xXV9HGYfP*wgzRrZHC9NC~IHFP=f*+|T1 zg@X6|=Z0Tii2=#qI%KGz=U|A=+@&p0+ftbkSiS!z49P@kwMz!%no0&_X*oab!*SI$ zb?X1X!FUQoY6OGt^pATmp21MM10NZCYX{?PoBpu=+n~$*ZLe%F?jKbqu&j2o>B)|b z!PTOVdSe=*iv}im!;m!cK=Ye2jpeo2SC~}a0-`u`^17Cc#-2(>cXZX-U;|`zlEF)c=G|M=QF_Z?C zI<7F@VHq8axANnNCNiq0HS?GN##cBBe*4t1-oS&>?%4R6@Jo2B%*kj5T zC_J44{YjuHJ;?8`EH-5;bWjD#3{!fcw)4?mM#hzIVi`M2o{W~G8P}v|nO6Y?#83^M z9zS8o6$p5tROFhCVmU`#DwG!8^o0W=4m;^?$L3V%2a-3H2glOzEv$x*;n1nwsWZxR z)s$@&satK`%Pd)FOO(orT;AY3OSW6GL!irT=tx43W9xTxZ&8(V1Fg^%S*51Ay32hN zqq)rKbe`)m`Eoy_aBniq-(oIZMw%V*l`Zf9)Lf(?i~D; z_Wq^p55)+M^f7{35y#oMD`1F}A8|nD;JIdqYB0Cf%3Rz#4ADI0W=DP80+dFggArnv zRmij1+?88cJu)?@!W^E>DGaVKsxWeIFj|1V7}D-n#aAS#Rq$@9(^19NGF4=QSw#$8 zyNYK~HYwR+cuj|PwY@CCuhW?z41IqDYDY5x1-!|}IKio4S37+Pf(jxDKu++XFr0xc zKw%*u;6i3Gp3(u4Z2$=Rr^;`y$qtmgS{Q{D!}@n+EWB|b#X1GJ)+gWLr+gQ5pE zZ|7kUhaTSc@V1Ay+j+H}SA#g1^A2p@wZC@&PT+^H_CpbvT_@Z|W_~`!Xgx31<+4THfl&_DBa|8&n}-t| z&v2q$HITst)){DYE#(ES1Jj%t-$6D3Mc)k3WhgtEOJzpKx1{Ka9a_}Gr=er&&Oi@G z*AKzKs+P@c@+!4qS6zQ~9ZP4{0`a7ws8O~*%o+}*>nyoP?!{C#>BufBz=D0_?G|R6 z9#ihKNQ%)@srt!k>TXAbTWH9 ziT*i}JDKe2NS;mO|5!SC1`88l_@dSNUGi>A-Xr(3-Va#vUS6%0ZcE-L?+4A&Ty`>- zh3RZ`IO%jPtY^8Qll-tHACLzv`JjAAwOqOX(ciDrf*%_W%XnDMLl+M#cv#89Djrso zOPk^{V7=&9;0PS^Y0NL=GxPq&tGok9FS78UhRu$8P0}nCz3)T#BN{de9f7|;ItNf( z={$2>PC}^4W%t9oajZw7d<3rBsS(UQ1<4(kLktZh?>U(o+dMXwf&+aBGZY3%WQdP2 zs6sHs_iS2@nYJCIrD{`)qQ!zUIz)IzpQtmsMV-+z>Wt1&XY`Lcql?rTy`;|QD3RJ} zg3*DJ;fG8l0hOomU=Ggwi=P+cf&{)ML6UJp*5jxRiL|F~0P~~MuM%<`s9(K=+Ac}> zYZB5vgx(BvwbEXWRk8`ouSm@?vT)=lmxD_P;tYLNYu-`7KRcv7)?Ip45!+Cc?fIJg zJs?FB&?$IHn&BtOn?&L07z2M2PgGri2?)OnQhiaTypGG7otLC`SNm%lf*WVFJ|i>Q zXLNOkT3|e_!^^~D5@`v&cz@71_vT-D%c(Cc2cHWn(9BdSvRV-1I&d}#FlF^a7FMvI9*Bp)==6A36Y34cz1nvJ=o)4vugat_Y1&vRgr_AJ;V!n)^d8 zblGDVQ~wLa7%22cy9f3nIeTC_>Roq18iFhBi_pp^u{`ITgn}>NwXUb`!WLB@-6PX& zkn%fW3AAh?*S8POce;OXMYYKF&19iq?HZ>)DK)$Xq#CC`RptXT)CV-NTmJyC@b9-TOXyIdDR@zuUy`ZnrX{3qrm36huy5l{tGbyH zQ8(yqL$1Yjw&+>TYpuOyz5MbFEefkU-;G!G{{TYwWDF2X5xUfKp;(kl%0 z0Me2{H6~^YK-EZmP;Nq#19GU)sJAZt%_DmOc>es2dKHkKBAt*jvBQ%#6r=$F%gcOJ2Ng63t~@R|EY?Rz5@S*$ zJO`Mofb^3qse07dqopXS?;W{POQ{@EdSwgCqC+~B_P%nZTi8NmT7+3tRAopDoWiiQ z4k8xk6%*4B&E8xVLqts!BI@rC{p;HuP32-Fn3Tx^Vx>lhi_mh2(!}*~0c9}h=C~ye zL9K^}t$fo%URd-{; zVK0cB%$v1CfUE0WMqjb^Ne5HO`s>Q$(Zp#bXyo6aN3;xZn;f+yCC6AttnV?}Z8@No z-iQVm{h8_lHJ`XhUX)0dH5z%K$pJ6SFx#xx*$z zaFQYe-q!hwm|9oJGPK33N|Bc;&;*vHNe@LsHi%`Di48(PB!yUx3U=iy_$sDd^5s33 zBwEUEzYMk?+QLG9I}X0R3VgejsJw<~IMX7&@OS8atHii;S>b6J~ec z4@oDrs7rWQ3i*W;R4D|PN2Q)AyQ0#-^NOf6^1RZNRS>cV`uD)qGe-vgrR63zB25Y57(^OUpmij=c3V+G`MqYrhv0{JZb z#$+_qm)Xq|*0OV6S^b`e=y?}`S3vH(buOWKwVt;&;cKG%5tf^+mNoFpt`rq5Oo~v* z&8Aqeh`qxu+5a~$-bo#PWwKoIpOwLqITN5W#018Kb(pOjFpB-EY>yGJv6_`mab2pFc zuwvjM%7A&>#K;Ih?KY@bmiZu154eSS5sn*nvdLl;y>)?zB4cVfjep(syMky&gb*I* z;B|pW3x?zt_4#0JWpMCxl?M1apL`xA3=*N+^n!sjJ`dLw_JYZ46&cIO09Ro20FG2D z^_xS$1653TXjl~zV{vwutLuTx+h|_|)*#*ZmWkuX8U88GWE#WNKt{ZZNANT+!y!lf zOloW#(dK|qhRpLtekBX0&gPb?RKU&P*ok9k(&(T)Cj{jd*lt#~B6!Gqov?Tk>gn!j#Wg@>zKj_4J=) z3sIQMC!a#ua}1KQr{x(-J}1wb@_9?1lXI3lFFym{2UpPb9f_8FLB0s6S@MD$u;gdu zOO||@S1BX4+>f9csW6%kXgQ!As+?J^sviXH% zL*OXriZG9z89^;JkBl%Xlh1_Ue$i=aX(HhC6$9whxCLz+$)-?SJv!|hU)>bQOq8(> zG}Q?$+NM?}7g+C*!c`lpRZMD*Qcx{L82`Dc=tEbxEp1M^}d$L#xBB;b)~955s)8I(%8IL!FJGM)1_t z-I3PFvoaMgBVCCpiJA*i+ikW)TJWX1R`XeD#TygZ64&8rGoIF;lPFWX*cyFS_@!tU zYKkX#7kXTxwaIf5YcXk|TODnT)^k7$n@6Qs%NF4tr4cLSWBd{C2~Qa9h!kE0A}x($K(kJNkIke2f?t? zM{Yj2--WndisMRj^=fqRdZgHap4)||H=^eb1NIphoJXNsxfj}%_dxIeeprJ)22IRk zu!BAUbKz%Uw|E+6!slcUru)6}D=Z!}mi?buaWitMM%`(fHBSZKB+uGIg6Mbu+%rx4(k=QQZ?Gl_DyJb^_0%W>c%OJkw&u-cKq3PVX^zG z-aIFf`>TxmEtu&qQ)8*o@dhRLo<(=w1r&W75c3`gi1(sZZwDgWhmLwD5bE7Pp!diL zAj`NsfV=m~M}UZ*f(y)N;Q{kB-kp<&6|_DDIE({U`_RGFNI46+H$ho=8xUX+S6t8X zd>)q1E0kc*J+J0F_QUf)++Ngb?m%iDD}y@+P_s@#JnXOu5yhnQXf$w;6`My;WqB@dK$g zaM)-V-;==i@ztZqNq5!;^fs6&8*jdaT2Qfi1N4@&cI!#Oo}M~XPi~wMc}D6k%bY_U zLH5-}nfs!9*P*7r4mIChlzA_9hk$Xjv^*IH3s&aRr1p22CW;f)ae1jUQpjs$%2vFfymdh}p5>!yBmcS3F-n`W~gt1n; z8DOf6W@w62N;A^vHj=R8dBQat_xy|1)&N@2pAZA-G3$^Y2C_JTyMUZ@wH?%4d}PX! zcik5d;g1UVQeL1?$SpFM&cw1mQ!SH+V17-so-qft1X+f~WPD+p$H<4AbeRk-iEd4g z4~=D1j7|Us8ORBMiOgs4#;9~neTZuT23K2Hw>OFs;ej-i~al9ryUgvSrJl) z0DhcRq9K5kBNt~be&<<*eZ`p(6M653YeBFq+$ZekD!e7`8+nfsseTJU+X<~2@}jF@ zh(~x#7lWyKUMbe06YFv z8H{1#I}pQcc~czIBfO;#$zk3ep_}(DOoHhT{?c{QAC;p#r+7HV!%$R)O-Y+_+||%1 zosH7cM6|*Pay+#f5Qw&osrZXf`0&nF0>t#4QUnAiXu&ohT18JIKA84-jnKM14>Ebh zx}GX9^Skr;>GOB3PB;ETs@+FvQf>eNhqSY9Ua8pb7sa|X`#R0|N6?o2gZog-qMO-_ zLOm8RNeM02N*kVqq^v%|a65IMqU^aCzu>T&cm z80(Nr)bynlHVg_01u!}hnczALAs0{V&kUT*97pNYtErHnT8gBsy4CA*Y73Vr_e^#? z!-W9o`K=gwYSosHTGJGGg>Y)tstsJD{?2v5^iy9r1K6sXxiVe(1<>X8Bn|GkRn`)$ zw4?jtjGnqJ;>0G-7-G^vLH z*IbQDj)w_L?v%42bP(Ap9^?gz7H5L=G1F_ejEZzh==X73c&=1==cDo{5wX#wt}l?s z?6f;YObMP&-32^@AWNhQp3YFvbtU?1b|RQG$`(Fxg-EAB1sb6!NDHh&G_^2Z7S928 zvpO?cC+~qL>I_uDS%^mJ9w-LGRxKFJ`M9UQ*aEPtP)*>@^+22ciuPZG!3NK@L1z~T z&2Df(jvGJ(>>aJqWP6sPR1zjFp|h+Hq7G!;I@{V`kpR{X1=|9zz*ji<3Sy$-%4lnS z1wIEe;B&yMD6bSJr9ZhqHSz$C8&Juuu+Qy4;}4>lH=!YiQRO4xxNcF^Nh(^{nXgW# z0uFdA@R9@%{baQ;$BNyDYVqB&HZ(Gfg-d~#>GfRooYc3q;nutv6+wm0Nv*n%*!Nn_ zAUL!WLK@&W4r+P=^~nGLr#zrpmaoe)1$e3)$ae=|{e)9t9^jM>SeI&kI5Pc`SopAZ z!EoU|4nZU5DZDygc(v+f!hN-WktT|)E`Y1<%6n1d+shP5gkh0u@Mv1Mx$BHmI<18t@Ii z5D>{82J`X}fd8X_$j5+tkE&`A9okW;ZhV};U7m;6a>)K{oZT6XjFC$nfX03|Wbexo zeE}IYCTfM$XH?OSLP{gPfdS)}IaZwcIp55fo$W8XuG}w6_%Shq=OhsXEMoXYheJn! z7c5dYU)Sf$o+78)4P>+6%3ak@`D9bRbZ@&t#Z|lHDJN`~gSZ!vWi?Q8fC7i{d{m|O zv-G{LgM&^Y0f+boK7!uqf;63zaH6@tlS&6&NsVS-g(>sM6?j@;+YXq->UXy1S~ z1)!Xveu-@HRPdr5#cc6szH!G7wp3%0B7Vz|uwshYRm2y62+{7y<<62ryt_@hxzOJEW9OLj%qb#yR{~!!r?y_2egI(q zAOu#vNmH0?Q5V`=81cEIqE9Qiv$t^&j3c_T1s zFP%m#d8fR~f@1Mqro6|3!cVQ;!{G)N2lvFQ;oGs)kL&$DV9A5>K@b470uTkPKQ^{e zp;j^l+{!chaN(Rx_Q&(fbx@v~MQc1$Y^H(Gz{2vqy zW`bl;FbEKD6v+bSsxwelo#)wSAg;Ox?&8c%n8+2A*TFpm1K>XHq4^OV1Ar|4(|Av& zYblv|1I&DYEPRm6e27R8wA~)X{&a<7=6KQt-FHynY13Uk1u=9TgO8OnJ^M8#Y z_BW`)-$Iu7J4HOH{H1njx#9_U#U_xGTMDUVHh2YIu^D7cmV%w0jU42G*Wk$N7Et}L zruwXf=1Tq%ssBlR$)Wnrmm;th%|;oBVh-+6m1SVTn)>41;C8}KNI3AqbX;MLWc+EF zVqd~w2EREAj8XOL`sI}KQuCb5VjiZ64j&B-Z)kl&%mD0pt&x$?(HHUwYoC)DOo(4> z`tZ@BWcDIHR(}a}c>)8NDgO#U{=ew)e@E~AC&2Vy;McwfW59nyB6dL#4+8ou{altJRv zif_+11TAh-A`_rfm6xKlR7HRl2vTg25~K`7BQmPs{)su&m;x8$T2J4s&R3EW&LX># z`1*Vz=%##+)0Leyg2<*j2ZB#sUY5%Dy)jj4j22J%*vZ7kvRZ{v?EB4SORYkwi2}S< z7-h^xsdLJd%3;P*x8zGLz)m|jhg-uoK%?DLRwQ4;2zX{)*4BJkUU3Q_)@Y~1Daa5M zr}RUh7?-!!=fx@Y*&qfF6$u#G#tImUR$_U}t(FI!Or%{-i-ru(HAsF82P~ax)M7qQb z92!G9sUvc+DS9w{SmqiJq5mF6|9u3Zl_(bLS%9r@dTys}_nnI&MawS*<|OQ#oKo3v zEQp{WHt+*kfFsd&&=&#?S{`#D`3YYL?9bzC0q!>x&CJH*!2M6F5=v)gk~PX>2T;8L z6hSL+raU$i5>HpLJZAjI=l&C>0Gb1ocvlIlQzVJOwos$Oqj88|&mAK+RZ%WRP_j6X zcqoYPFYB-bzLZ!?UsLhN9P3YedUSSmj-_$}XGmU+bV3{Z(uf(SEc( zdUb$6IlBQ9sgPBsn=4r!e{`cFjSmz9VcT>Zu3XU5&{1}K-c7bIRX+LEbp^|IU96T= zChsa%UB^8qy1*f%a#epHY#yUy(%HB83u_`KSv^qmQM26h9Lq6y&~63PXLmuGw+pX5NvB@ zkrmHt>T2eM>ob>WpF_BuyCW?Turtw?2pJl98#aa^CbZGzuuAg=Y`E6YVwyW&kS_tWoy~Ss1a7DCO2x)IVD#hu6^^U-GLd$)u?i^JDz+NvF zj3_V36xN9RhU4bL0I%zCN6$d+Vw1pC9ZF;1WX5E`4gs$7gj%>1_}06hv_$x0FZpvN z#q&rJUjn6Vy&R0;D>v}~H8Ex;ULA>2Kb(+TL+|(+H311Ki4$^^hZGOTco^bgmHi! zpUK@#+Dz(zIiZO2DPW9DK@OYODpKdZg&b44sri~Xrg9X&7&p+)Yu_>c+FZ!4(Vd-Y zX|=JvuTMQlnDVLDJcdnQm_=y?>A|JF*67i%uau{UMw-0enHOzX+@#L(^!+ICWFwg? zc)-tcPhIaq0;RO{dY7qc>j(By0A|zvW~{Bg`U&u=ld@Zl#fW43o3xWJ0@<)Ise-jq zo+NNDQE|O7gJCZ&JCg4#UV-K+wKTQjxSGoY$e};Wb`^Y*$3w(%8cF)kjV^ZuE7sMp zfW8Z1e7r*Jr4|*rrhqxnnITp;d}4C~OKyMh%X&Xh;+)+{$?QlmV$0W9Tp+<4$zzcXu zCw3?EJm1W#LH#wjykEAJHg4uczL~jjpfq#1xY`}QnKc)|YP< z>Ap6g3uY+5lCo@lrd!r}l(nHuS;Q9BYm;IUi@Vw0l-TX5O{$n;9NFv-pm=ekwxS}v zWh%n4$civHVQH^h#l616w<28qQ4A6Ex>Z~e?MJ0mc8bx@kEDp=VOf!Fz7VM{uE<{B zifs3XNOf^V1_6=%Wgx=Yh!xr4TM@IkA~*R~q|d)1c90ntM~R(MxvNsQi*4Se=UNG3KcU0=%e+RTGtckaq^4*wr{oPaOWikW~w%bR7ad z5MQ(|U(eB5B-xK=RKjZaG+1fjg9@`up`gQZoIeu5Qer-QY<%=gQB>^@zx1~&XTqZK7*BR{Zlpa=VxIMuGs(YYe%%w)PCo)CU1i1RQAiRU$78Dxp zE(9qk{rE#XTp^Z)quULQ=dx$OZBH6G!PA2BkrNQAhz`-{YxN&H2LBHTp-`Y8t#SLv z=GCEQV*F(&EseR#+53##0g3%c4z4PQRbtX_dqVC+q!K#6_;9eLkfUb{d|cip_t1Og z?I;;#-6!ubCF}a8*pa0lV50ZRJxH{ajwbLn`2Zh1$ioNa9+SbNC*;ExJTo7*;FkGO z3qF}RJi-Kz^6+tf!e=`VPsP-*_H{RzSvnoq{a>2Lap$khF{Gk(^v)`2zuh+xVczxn z$*&pkTNdvIkoPUeQ;fZm9^*5bv8M)fwp!#+-a12pbKiI$Rwzs=Wjo@kUaozmka-?Q z`D^f-xkhyXh4KELEq(ja$Mp&uKG@$g(35{ace*{t5V7LUG&J2!i+uWkn(;W2?aq#9 zr2z}^1hj(Ssvcm2cD2g`R{P{8VC?b8qg%5R*o_oom{(P8cd>V+h)##zsv1@~)T$EI zVdxC%2sYoTBIbv%z{IYVdNRA1!f1%Q8=O;tT|PQt4)ga3VOA?es{-fwTUNT?tM|M8a1H=4jtXt z!3D>>rrCSOGh)twEgUQALk#DQMW!%%-f%x3G!-{1UI`A<; z5at@J5jTVg zfE2V749XsusP=*hy%Bp4?8Cz30eH9X#}e5CSU7x8z5@2-=dk?k*P!+NBP@gXb1Z}S zd+^TRlcTCvHfnh1d*uzgR}x6I0^)Q4U;8HH#Cgz#cgZ&()6au6zXxGfDDYD1V`Rig z)f))+CEY)eq+x6}-ULEKOnb+$Zo|N~VS>ZPH&I;i^8lV>voIh41HLOXaM{y(iD~xK zMW&M;RAg{;jfz?hBPy;&8DvbI742@$5f2*bsFp~Ev|0?K2*tbYg`DXTB592)Kc$nbfP9Dzkpw>p-&8xSWq^tLuq?-}$vXLnlbl72`XdbuOsL+_A1WtIY ztJc<6jSd~lxYO;#(D+dPE_T|Tdi~>*nWvpeH#RhaohtNHR*MZ(iYD7|O3#d3S7)kg z&WX|E`3cb)DVPl-XVp~bVUf$z!)wyL`*|yrA_b=UYuCJcw8#beV?~gEqH1}v#U*sM z;6XV~f;kHaaw&yI3KvZp8KBdLO{$cRqp&<3FC^-CQ$W;9sk};2jClUEpIu|qYH(Zr z#M?XfwL%vXdm z_iMQiHc%?;vBCRnLGS?OaE`!VFlK{J_fvU~SMzzm8bI|KtS-n5F;X?w>YEdzr$)19 zv8;44lR*1yVS2`432&G3u#Ef0!{DB`65zItc`Fh>3OFrC^WRcBCEM*%>=c-%%D8%^ z$w#}Lu$|o2maYLL3a$#C*4zL=q|ShnI_vn%3|*<814QaMS4uKHz@yH9i#nsp>P!Va z-vdhO3_z(fV5QCg7tTrimV^2lpvVHctak&rRjKk5u3Pna33GvD!lXMjkFhr66 zniOPOffzHMb5n8V?Y@~e_+}0jXWrwRS^G`1uU!p3*E_m>qIG@);J*e{363?ufoX)}7fpAV zDwgGiA3`$`?OYHX^sR{IstPLtG>H^fPN}xJ*SjHVKjKz7?_gOcx?2d@HiUzasWJWVa%xP?3=`72)K-iu7S< zm7=z7#BeK;^{oh0m3HO=h}cF9w<6=HNUlsp^g3<>-o}1iV;eEtik$VWNWVWsY$JwS zk$X^)d&^XW(<33W$G0N3rrfQ_JA5m$*S{jRrrfQ_dr*=4%T$E(Gb?hVZ$+Amk@bDP z71`%sk>=u2^FdVPLuD#L0>O%Cb-NzEjNt+ob2wbpe7R`&KI~f&_%9-h9=>`_N~CQe z2taW~9zjJOEmIL~LN*{tQtw|}k=o*leA2ffaG&(6h`qel?V3-cB2Sd52uUO%a>%!9 z>WaJON#Bax?B6wY#Sr-%D)MZZijYRLB8Pn|k|?goIp2yL@vlgtxFTOfMP4XV5i$v^ z$SuCKroNcgeA%}mw<^)QaEb@5sV}a`OQ^`pWhz20g%!EY7b0q3I4`Za=v$Ga{t&Uv z!!C|oMn!(UOhw3+u_7roJdPDg@_3g2V`%eIwlRHIiXOQ|R;KAScfRl!jUxPYOqx&G zX!fO{Egc>&)BzaPam?2U>kTzHO-GFA&FvEq(>o+s!u?@+$YeP0sJu5SAL03|7=vg6qPSW<;AFcC62nBk26> z%clIiDPN6)BYiCn#`N_n`I`I!uYNHqzr<|69F<>*%h%;sqw>E@`L#G~m}u8GqVnse z{08@L!rgC1<+n`v?Kl{N_nPuMQTg3CFaQAgJ^B3@KJ^EteAARagw%|+4Jt(JWD6eN z3iFqr51oS&-mZltA3BZgOD9nxWAC98Tm;}Rz#i9uzPDwlD4wEa+)Q>U?@@Mj7Ln3U zBUrRr4h(dLh6e7AFuEDy7l7Rsc9cc_V?|{FL=f~ z%Z5_l=$Q$8xXytJ_Nq@~qtg-S@Wa@gG!4_$ET2lLS4&lkQCLK85f8()Pg4DEDa;0$ zA-mxN*@>|sc1GC+8_RuKBV3aXyuNvK_~00Nr$2qx{_HKqpH<42O0ne1m7qc~oq}b1 zxlbq9OA&Ipku+R5GpSLmgGa~1a)K=A2x>!YSlZ^hWkuEXtAIBL3h^v4Db$8|hqrA# zh56rlX5 z4EyA8Ha$L?TbNAWrPizbwS32vzp=2a`P-)aodq%fA1wKQ%!F2mQI z4NvEEYHTSSNO4kqYGK*(Kf?{Ml+=~QdA93cEUX#+S753o|0aKGVd3zG)X-VBr~JfK-g~he>z^DKq${hpLFL#goheH^a?Br!=A%uv9($9 z>{ynUCs`^mgVEZO$MtmTd}@#U7sk07R^3TV*>b`pOF zPjZ`N^*A|{8nri4&cWflJ9(gITXGSWk&UxaOYR&xp3IIVm*A73dkd#9g}3s z6{w!f#dc?Ul*(lB^{rRZCh5i~-U5$1UGY*VeLG`s4m(HifJ z2*+Az31Dp+re#Ep7;oVfjCC2MRYbDVRohF$^PM zJb!GiB2kCU0^}Lma?(BpMIH2k_7yVuy!LjvT96tg+ejvn+d25w!hS!#v}Ytco=(B% zVsI>T3?~nJX(H@rKgJfu@TfW!0^VNVXh`d#8@#R=8fmsnWJZS7VrqnsQmCsi%FZ-d z`m5T3I0Uq01$8`EA0lfv3qz%Z-|^0v=nE4xYaeK$uQA0l6t|^@09kA#zrx!vXQ=pe zk0&oaV{hEkr+M$X;#y&-wYbl`6S?ZyFzE<}=}JFoYf=)Svk$Sm(N+v9z0}4#kkwvS zVDm_)C*S3y{Cd-Bn$EIWnBKJ1Io-y;f;q@uXfLxNsP2MJ0L(lmP+UcE4b~CI8*%6A z-1AN~`|w!XET%)d=Q`DJ$8)a2I{;Oi&ioxn(p)$(bO}o_UJE}fkxLTf25W7>u8R`h zg&im&kITaIVshj8ixNx3;o^d)*u1`qUM+}$&;2lw3)!E7;fGPz>E43a`hgAY2u;%8 z-r0Id>Tja9CkXEmXMM+F+;yNboiGP3gEnC~G(26<6s>><%4$?`Ewo?j5Db2UYC@Z? zCcR-%LNg$O6^3ZU0YqFp0`*h?cW{Y?ekcg96E-1-G|&Ri+u( z7-A}~rW;U6w01|E!tvCa@VPht$^#^!>7rFA(N-HX2M|ZNvf?f!9g|V5x%9s}UNEsmeiTC(K;^0NafK(>|CS27n%e zK#K#2lzR{*9KwzRH!I*BL4&uWgkiYwM3HM3WAOnD%dt4%B;xNNG8xQbh}(;201T`O zhjHc=0ZNVV$Km)*AV(11augALgQ&yXv2))YsO1>m(<-J*8%JqJ@dO?AhBU$f^oI-! zJP|_hzL{@wX)C&fQT*@*kLj{=7itILM|TfeL*pD`I|7`E`9Lk67ue^8_IVM`p-Zxu zIAtg>>GinB(7Yk678*wN(vn1z=AltB3N?1|-$2!g@Plm#GP&F6@3bvy z_ZY6Q(zdhzoXqv~?~;NvZ5_a*rB2urcG?`&L(sY~8V7e7tYErV76M>h@=lEAccI4j zd$4*?;W9Fy`!vAA7~l7z69UM++XnbiytlZKK$n7GZWh{wkZpFmejVRp=k>H!0=-fU6)vULAoEuEW_({xPFXF1J+|=+VG-!w$bzcdguKn zyx*+fZ}GhEao%sm`(ErEu`NF=x4RIzC_D5{zb+u226jDzrhX2V<7c61{5)o*=g@$k zQGn0};(P3-9!1ro5}9f?;~%cxlSlMfs#)05{*v^)BsaLItY_{Sczr)I2jqc59dqNC z{w%!)Yu5RjTvx2f=U{e_oJ*muSVrhCwj$28Z1m|`9iyvV9CL0rqt`=^w4RarH}J4A zj!AiwDVt3@&P+Aq%vg*wgFQbG7?lC-vA_YQ#uyGeqq2*yvBY7miZo+Vj{2!kuzKME zCgVy9R%#AspVKEulc7b6kVe(t!fT?FzzU6Xl(P47<{Irbi&kZ|&W(AKg4vvB#w;fEwjlO1kXX z(GV@h3_BwDr8GF4Ro0LxP&`g&sAI6^XO*DC!5BlRW z_Oropkg?a!_ssk!xFgBk2gd%q1hEGD0?hh0hab5trsnXmha9(#`%TkRW zUWUN_M=#2hi^A>T&WW`foKONh7p%5)pzZ|=T8A&NMtZ$A_aIw|iGL0J$gcyNx(=x} zAl+u9+z7&OJvf<7VDGl5nkSLE5A=|11{uD6U=+B%Zn65;hHucHAA7nrz6q`gYPk+> zN^h95gj>mAxFP970DK|YKR$!;|_eN4^_JX=Vke<9s=C_k|-mv z&ZHsC{RfsKb3nQZ3Gl}rSw9;#7TQ@*k;#m_7!jGF^!VnnbnhJ#sgWWYe3~)ZKy+JV zEf3u>fNXu#4(|q%8rB_Hx2?veP8NO_1OwxTY{6d*Wa+ zK*(?8b~PB1-h|Xp1U{F#(+3u$9g&nw*>6DtJP0VvhZ4^-vuT25 z3aCA{D+0CGknK*+A7@H^+of+U$R0g>=xKve51>c z;ufGh%_90k`qX7p_ih>=)XY4d%ueKzxv`0Ka%u8-YGfSdf#Xgdnh12aCR4DRsM?V9 zLjhG}Dr=QvE-!$%L8jbpLG~N51BdtoW-Eh~1whN|ZBfVadRu>0YDCc)?C`YSM+fG$ z+865k3N^AAB9SXChVy7@w`8*;=@h!tUDVfv{f|7#MLPw`)kMuDUgbE0LQ?2z0JW0) zt>zobvp82tTw5@4YOR?ju3U;%A#tUD`eelQ&mb02iEt7G^+^&?1W>*e8Z&6Yb}0o| z5Ze`o65-%ixsuB~$eU;gH-`|Nx@*9B6tf?N^rLoA*!V`KtliuVf@!5si;T?A4~ z>Ua{RlGsw1j7Y%xZ-}l`%Q+-=txaMZ&r5ZJ%08Z<;-dyed9`V(nNT2U2Z`-~2Bs4q zSb}17a5qwFDve0#XIz%VA^4ToQ@Pjx0UoEuOVacrz=$0hsU&1e^?o+1P{e8!w+2$_ zS~zictDe!W$TQS3GO|4lU=g?>B3l6E=o<_hv=UdV@@*)j^;5O5&Ch6B&mD(W<1Qd; z3TZu_<^Sj|UuvsJ-!+t0+YT1FbUk^)cX!VOc==;Mw#jlT!yIku_6FE_`Lc*(m_cTs znTM%7wD2&^q<#&n8}jZ+4(qFI32)KlP!F|%x)ZHfv-jfEjz%R@a64cH&) znmTY&*8_}Ky%d!ZnJ{G&cY)1bmwZNuB(gHPq~m~IgIu-Hy|~L=EhxeH7XiOpgEClF ztzA|h#uG=m+1B2H5c$Q0)gu!_MF|F$N``4g7p7xR8qBJSrE4(2VHfN12uA?v;!>MY z#i?bg$cUD@iikz1n#-Zf?}RZcgo=xr2G~qjMQOzvLnE?+z$zRA(o{HLpFflS(*zpA zAJ=|N)@%Dm$FpMyenHjFPuGxJG3k)=t@lswaGT~^-${nr@~iH&AIC6@0f(vLd`pH| zwHljm^)RbL6%%Euc$LGf0mH1Z@?i$3;N>Vmne!lN^k4i>fAWA$2p)2tT@5jzC_)w#)3s!6;+pR54agm87DK zlv5=`ada`la=fEBaGPaxDz{7fc24HLJsvpR18MG9dOWus8%fcv2+CvbDaFfOnN#py zI+@K517d;0TR|!C`r28N*&hBvZ_BhTJ9avSkm@!Y2Z$7E22{^MoZP6?@Ia?`{Lc&A zlPKtPd+G&i&i$BH1Eh0RJRMwYvatR9dm$Sh8AsF|6;KD^53Zg2X?DF@3S3?gD6DT( zt-DV;RkIy*lHgb2J_ajGva=JizvFY39!a03cjgdY<(4Fqy>{fP{(~m-IT|e^KnZ)El*h3MxM(h7<=d`Q=aCVXDk>Exmd!2!SEcv_PhnNA;Kq3a{;vv z4a}T&ITCO>t}`Cy4k$=e>zExb-m~1Cz6gC)zJVqBq6*ySDhgE;0({~BR_GmN`vYN0 z96tkJMQ*R<8J>=}kXKcb&vDJJa+Pm)TTY^=%4PSTIg=jiQ9D56uIFTGOzjFlAFIWj z%`_O5tC4zvxhq6o6D?hIxQ7CX2hdJ9A6I4bBL()E;^MFwQc@h73>Po1y9h1n;Y*Ja$_^7%raL`fwiDvxCGn&>N;wKo zWZbQpGb7o|uuCuMa@mq+TYTGnHRYmWJADedp$Bobud1A_TMw%cOQoi#s}O-9E-nVw zL(2$AA(R~qOGB-e*0C(ZosY?AIUZ{z#|&smT&)%Z?@)?b1;q!qNcIn~A&84GjTjqrfThR9YG-(*kcza_25nCyVIrIoV+UY!F%@zNwx>Ak zPE~NkuvDxh^#&>?>Y1h>3)D_^*x{8MnZ;DBB&d#d!_%elvNRonT-)4V8~=H;J5(E8 z9S*KW$o|^IGl+W>YK$;PV;HKrsqo?2cYoNpKVqDF^Up8Kv_pIq?BbD5Ytyl_5wF8t zLBvkFq&BLGG4>N&xRQKf+Si?zWH#>+*GZSEZupj;XbD}EIWN*$Hutj3%QtGi+YVHB z!Rt)0XtD%Kn^up_)8dfNzpu{N-@#}FGl_e34l4UpKV)+Dd;*==05#ZbbVNJ4WdO>u zqfk8!%X&C(Z3M%5Jv@&#!G-5~EP&mD5_e)JHJBS@H%jX_X2AV@HVj8Z5;}~Xh0>70 z4Z`rAnu9Xdp|g*IurXe503|+za;}5UU>xzF7*;97ec4cM57c-w)YVp`0~(-CL^WP% zWa-7tN_ce{2-dVfOjCK0nB1voJ2opaP^0h3>^EU%fZ2}@CN%rqaMVP7oqel_uKD<) z^)iiW!+?T@M)gA;R1ewTH|*`Dn3t$ZU8EDh$wl*9JZK(pYL2vwYf3Ezy?_ETP$<-_ zUHj$Fd=82m{#bnJ+)$2VC=zQ@G~aEHK{DCFLmv%QCH2v`LO_A%Tt^SLDXzl65J~1ZEJ(GuOik``iW9;arB>LpYIeaA26UwHbJ zk(vr*J917)e??=LktL?MJdSNV180@R8Y1u`#nRi21qM|uRTrp(8@Ai)V{9(o7LVr3 zR&JNlXhGg@wxG^zQKm$?C{53Y7J`5=TX0a(i+tRp%JsI%jhogh{RGb&pro+iYI~I7 zkCFx4q2p)d%Pv;~qqe6PO?v)LGlq5(I|2*U^g-Fx@28J)ok_I%*MBA-u0fx!M%95O?1J z^`I(ut%@>)SSx|HBzFVgX00K$S!=khF~WF5EhhI4msyPmrh^#rijAgmaV_ji+BbHsYB-&K*AgM@lG%7_t;wn}4yKnudszaSYO(s7 zYF)3Y<*2!}QO@D+n0Xnh#Ojf!3BLaYTrujClY6Ttcf@WK89VZXSI)i5H@A)mRb25< z@u&BCGKce@UXlN_%a&qC+2YKDzL{70W{wnRzR5SU=4p$oZ5G4(h;L@iqv*_TIFy)< zLgIq^sBh-Az%Hk!-OSPA%)`E!bttLgYTLnj+%KQ>&5TJze;LeINSSh;X#WMN!tRy9 z7uw<9wHrti@4yd6W%UsE0o(^JNVRhx#C`Bl@aaKr1RTO$2;orGO&B+@b?ci5ZX(W& zi5v6t_M0efq9-m1_k8`-r|pL^Jd71QR2URg$lHYxB48(D@Eo54{pw7tDp-Pb1?#b{ zpbyOD0fZJBf{yhJRx~^Sru1>BS~+^Px$24h=zRig>GgoX6fmZnzyJrpk_ueZ;;}cR z0j|q6)fWC58enAWK|BcENwd@-hlQ&_YV)z>T}YooGBT?H+2%5Qe=zXfjd+&-^N%I3 zoK}iV!uR~~+@Ej5tim6y&82Lj&V`kHIZD@kT>dm~3qnnvVie$_cpoyG-q}-Qm^@l| zn8w3&9$HNX)|&;An9JtKm64?jtKF%<+GUU3jy0T0BY^-A9)?Mi#%p49;%+6O%IzB+ zg?5AiHq-b_mk%E}c{{;R6cFe{0YGf>TrE>9^kvM#T#G{$4;F+plFwyV3)uoH=}_GH z6_tYNK02Pz+=XsgpB>bXh()`0Xep9pm-Jl#cEJ#(WRhE*dflvS#I>!^<4WyPXV|2Ye&M0 zT30Ba7(Zvqf5xz}_xGY|Rd^gC-w$GF#Sf$MW*m5C;Km4G#{(l6HA1`zM~z6_FpVg0 zVsU7j@g~ljs;FV{jIcGc_;3nuYNAFhqPrM%;WzC+K21c8dY&6hqmilWOrwb(fh&Yz zz!kzU>i8J`5VMSFd@-Ge*5FNB`v&923}Ysf%;K{oZ)fu`hl%I%Ft5s(Z!D-X78;9q zSZo^YRkG6PFpW;0m&A>w#xfq3^Uwvu@;lKZhJoc1vy7Fdu_|h;j>|@)*)-Ph5nMVq z8*u5IWptayx+>{4u$aOyu$W?&v9Zdy9^b;VO?NflfJzQb7Qc{RnA z8`M3zz`GD52EOqFy*KXf?eFQmZEIi8AUb68zC*Wd+qD^M4;r{xmbR*3N& z;#J|fR}E^5Tof*@iCQeIj3S_>K@h9LF0#K}Ufe?rkRlUmLEUY*Qw3jj+#4gwZ?yrG zv*iFGUGiH2$X;w5*)MzX{8DVYcv$j1y2tX^B6oEF`mZJIoZ?M zaYP|00<=?E1ksJW+9nEpYw(YE?&>YA; zPd!Fo1Tyo=23ZOYXMw5L5_6~Obm~NANE@yu35B%IGYImPs&G7+2A255^9J5=(*R2p zXJi)#a9E#G+RyelccTTVC{gGV1`8to1W%;_t}v{a6X>|A(Y>CzB8Y$};6tvqSU`aF z8o(%|`fF=O?Z1#>x6o1^8dq}~l`T#ZE>OppxPn{>^+mJOKstx6TU!3D4-7d)Fy6PC z>ru9!HL9<#@O$I@j1%u&Z-ox)(O4gszs>Q1f|`Yw=4U0)Nd!&x&M`LXmwv}D0G2LI z)mKe$P5^*>G^h}v3X(JG4mC8)K)22D%)otm%cG3i<|2)A_nSJ9oj6k9b23T7pbehHQLMVY@OT4F^VB*gwL+F!So2Gy*Og%ZB1iBV^|ulzVL=G%^-#isp3W&*8)o?sxymgM^^v8Z zk}C(z0(>%!tYw@ru(oEA<`TG8BndYicxeE>n6HxA?7K5~_5j9JFGfqkLw6F_;s zE-Gnrc-;sjlo?OXA5PBRkW>m?Tw~dZF<}{Z8fPsoDz}Wg>kAHD$PJ1(aBWu$-DWV0{L zCP|7lzv-keDf&Tgdd{(!XfPL*P5&7EQQl1eKt6_>niE5=h*AJeF-{Z>vBU9MSlRz+ z9zJ6k_ZatD#@po~%ec>Yhh@Cec!z1c%QD_=yvLG%k?&f@{qpyg@c_~r?={|MAu4S;i-fPZoH=^ywLT0F$oQiDm^mn;6OfWaH=>Qdqj zG<^cruscB?v;$KStUy&Q<5LEF7#}kpvy8`$PaBdfH-?-U$&z0-;1u+{{ETIM#`vsh zz%%GKaKq52EC`VNSNS*7c*-)K2DIh3*tTcb)X&M|DBsoD`_n1Yc-D~3rL`E;F^lq~ zYMyo`8qBJQZ0Q~y(@V`LdYYMer3B@jx|&@_B|BW&5a*+$WqjUvj)!xW@jRM@=Kf4! zlYFVF1)bkntlCkPQ!&Lb;haU3QBDvT_graa8DB8IXc{kA#?KmGvgD8DPt>|KrTI!~ zqJ`9!@nw#H<|JavK_!+{$}sQi7y0_C^+xQ|uP6#rHZqwapq6o7zH7+rBxlSG8(Do_ zwGLjY%HV2A*KyN$iL=hjNIQRdmy;^FNZsg4FJij+^A|%;@rq?!FfLlgCF51BmoM#l zfGB;}q_NTRE7uCbC3+lv@@p`_*LWFBwZXlMlKFLVlg2m8e@!j?)2uYaqPJ+BoSz4h z>r>SPA0`ihbzP707Dta&Ogm217sl+e{iMPO4>gLJp^%Bl%cWJ0RJW7TK?G|+Pvj7r z0JIxQSPP>8JH`xWj%OH|@#-TOMwP&a%F|k>cIGKvf2V~)J#&JSS2=WpLTC{96~wNB zq=!iiBgJ7J)C{Mkg=)8-RT@vAw5EdOlZ8R^6rv~#ZQBYW+{?!HGFwuLvGzpkD|CSs zA{(z7uf#W}iBUe*EextazSnsr3A<-JeQ!VUqC>v>A`t3StDOL2szyCo%uk9?Xvq(4 zD3XgNE3;uysTi{kxS=FRaBx!#pz8S+kj(81_c`=j?#Q#bz^YNk*wt*9<{5S9GGZ&2 zVEOEDSxgvEBe-%Pt{GS*F90=|*LlIEA6A~3M?>~t0KZJBn`RibZHyFYm$A^)52}~|f#2a_CwLd4} z&H&mH$=^k~7GL zU26VY_tn*%4cZM1vj__HzR4Yn{;YE zX|qn+Y$vr1w;w^LjVjNN?dXUduxa(d0pbSO!gj;eVh=p=_QEIaM!2L6!hE|QU3LIF zMjnDk{LSFm4?{c{0)IO!e~0Kj|9}O^{~;Np88(O(Y)ZXQMvX0!HMYu_u}{X0(~>i? zK*f*Zo66{G+<`rOAHf~EAHm2z4wP76?37R7SpY8k%IIshyumnWpPJRWq^+~94M`vd zY1{$+X~Ww(7~WdAeO0WjL8fv4Ds^gYOJH-Vnzr*YlddP1Wfr_r;g{0jUfSEN5DE*F zW$*1kU+s8O3&)dYwea{p_`JLWUJUPq%gMV`?X_peI=l9)(x>ez^&&srO{(#Y*$mn? z=c3Hj_CJ0^Z#?vV$ZsD|1!*tbY6lD$txsTVLF+=(VtG0$ z%7^gL52N}IdCH9E%Z#JUciLrs)-LmtfE>&0(Pd)L5JK%3BLpJOaLTcG#ui_#Jl7DA zI453_1kb?6`CpS+0H)hG4Z)A1G9N<&AAu3`Q8?Hzz}zR`IP*!s^HcCDeautIo_r;H zum|ZQs*+F1({?3$QANnQ*nSN4Lnl5ZW(dJ3gLEAUVhd=;U*;K4pVZnV5_`fDn6inm zd?w#Lp2e>Dt!>t=CJQ zqGI`?VpuSui#nG_%e86FUUf6g1%gYejucEyY&ivg!jSbCJFhf%#hbT zFqr9q0S3qn)DyBQj+k$awJ3tVPY)*+Z)k75AZ_gkw};x}3@F=Yd>dZPoqS|nkR?1L zsXAkRQ_mB2QXs-oTp|Uomc1&=;ho$0svvmFW73I>6$a)Age`1WVGDV)nkDdVjdOSI z&EH|$LaI-@fz%?uifaBEyaK*~<f!$}ngwoLDd>=e4UzQiqjX{v6uYfoOcY6CmM|W3$hl2UyUY2 zCsd_Rnbfzko6LE@1g@c{pa^r0^=RHHf!W*cteKwDlIu-Io>2(B?cu z?*k@&6|m7z3;wt4eM2nc`}n#SYS8j%sL5whCY|xxb?csx>dUh6P~!TFvg!5U#u=^8 zNIjc*kgpHkAB3a-Ke(InL%u?b@uf*G{tyNa-Q|q?4)(X$L*X2&|rJC<7&sN@bQ=39rkE%#)TT~z5Si-ugVPpIrrvY zyPej=rh+F38*Nf+w97K1L%NM6`OaE~*^CtnVm6zh#w-bxLt}aMn`+Fmv#KQU27?A- zShf~)6;y4y?#6M{oUr{E>%LQAnIikG7iHHg(yYhRLd<=;FGxS&uIjueAZ#S2t-TPP z^w9bvuFvMWn&FMwibRI-O^;NM|8&xvdGwom4?^DQw7U4jO}m&*&#c? zYV{dCh@Q9=ELg9+AJ0DuX6mCTjS*cJ!SPpvH;!rGw-r{9)%zX!T|g|Ou6_?!fLI=n zKIR$JO%izn75KiiVIjxw-)71m;P=g_2l^pQ!VYH!Qmx85a$b%kZV5X~Iyr0`i^%C- zl3OpxZEcvtj_zW@l+EzJEXT-U>(_iSlz%boz94GpQKwO>AN$Vkk;TSd*<#!%hrx2P z?V7_nVz+5A$icTjC@394!H6?y;=hA;q6hJxU6wSu_c)~t;CB%<`y~%G%agC(SLFn@ z4#l4FUzaCa!mk4UvN{r6Z5E|?6`dm8(Uzz^SZ44_jh5THV=bV!ryiHc{U+wQ|J`xu zWf^WXA4t6-!@NG$7~%D?>5s_<0%OEf;I!!}Alj&9pKzn8#D_?OoNhGVcd9Y+zU(E* z+F(5QW_Jf?5=~@RV;&IWkifAB5Ic;4c#B+b+zKo@Dm#r7bhXFif&Y)VGl8$GEc5?+ z?!C#mxjE^QE;LCB(9VoOZv}Gw71u<1*^}|1RS;E;Bmg%s7rB*#GzUzUQ8M?#;c~s{Z?F&OPh9FVFIOp2urt z1htv>c>BzEymkVH9I!1awDnC)!S9&w(r(SHy4qmzWd{NGJ;qffTg+dX?{h|scZj)v zHa}n{&Si`Jq1}?lFv)XU@(-f1_5+2xp+C~}j(W&#$?83q#!sR&xCtI~HiH+l%pL^Q4jmf@X5~pEZQu*fwJ1i}2zaVgqBj#R4#v1(R)?+hv z{g&Fpm9~+gbnQ^wmEz2fy|IUYw&zhiSUa>OWE`se~9ao)j8NgXliFDK1t_|Ayg6=A`L*(p*#d zq?xQzdv+^ytj$%RjXGdGHQzT2GK``ITu176p$?1Ea-Lja zmVi~1llf)7$kH0bZ(Ti?6j)M)kPVM5FM=gi%(=*lZifV(Dj$f<)&~icg@+WD#7UoJ zb3@>(d;t}dyx>MCAg)FTn18F#pe8Qiati54fL>B=b`|t;XIT_i#_D)&$!SGE1THF? zJo0eidPuUd0E%sS0B#naOn5dyo|%`Th5EjAUHgv6LqH@k%qj1zUc5kJiN1AR5Aj&= z+vTDS(GE@_gA%Yco3n*e93pv0SfK+AJ6S=YTJ}ppxTg(CWSdhZs;Q+{w1zw?D6yW( zDr0Pw3RIjltEu0w^KcN`kp=YSEJaF9SNM5RCc8?;_(Qq2ZxOHiGXjw!8HXE%H z!`0O!E5~&c!fX~$3_Vkb+Qf%A!2=XWXFxOFCg{X0azItb6FL3MeY}*+^|98=1b@l9 znv0W|9801)N$T*rnxZt`hW&w}Wt=hScNku`FF@qCjwKf&s@H_;@j&!W5_)tQ4}Gg2dp#@dLy?SAApv=>ssWT8AI-?Lcs zBKI1BWy2Uq#eB~$ifXYawEY?br9PX^N!a=jsl!jdXr}mP&RXp`b14l3b>W(R=*wIF zdIdYJ{$}w)xivkfY%f~Y$KtrmdU2C<-YG`P%z`-Zt)zUvYDfFNj^>^tT`W+Gdno`0 zf^jON4q945OEi$=a$vV1qCexnNHYcs*Foim28k?KzH6e+&|1yl?XS~HE{l=QIHsYl z)Ho5{#X10$VHX~LhR4Bhi~cZ+d3$&rzn&!rOp4pDHM^-&ULdHNW%C?=x66@@$@-&2!IQ(06~ZW+Bx`Sx$3c8#hU;Jw9OVW$jmhGDn%>o-qF?u zBD7jajL3kx?~ubpwhg0rvTC>{3L$dj6H)c&l>(8s=Mgx4_L*QALt+O?1sismmRO7^ zZl=8hWSg}izycxE4(DoPxe|X*dxukC4{L4P+kE6;&-&aANAJtoKy<6vB4L^^Gv(Gt zJ8US#NNdI*B0tY%_=lVy2^Q>d^rF`5JEh!!((Dq@ygX}^%eZW)<;}$-KhIu-O8S8n zMSxxLUpB+Ae9XeDiW<7_#QGj7g(W4wK;FQbyP5=zz_Ou~?@%`)+LB@U8P~52 zQ1NK>m{Mxyhfh~p#8qFmGaeq|gT1l2z|La-ul7AS$)Fn#c+PjC3_bSE*;q6HO1YwP zon`xGz=LT^d!b32Jg-z(q!_=O`nC-k+1l2D|CpoO_J-A_q`obL$~>%av1iS+b>c~1 zCUu7j>*?%}{)}C^BbHx5Tf~w2gIo+CQXoY<^ZVjn`?J;K&oUa$pas}zSq`_hci6$` znXYiQM+C_kEroq(CliQetK)Ybvmp^a@3gZIC5xDTbCqsmi`0#PpEPG z+6HfdZt((?0 z1<$Y!Rhy88fU8;vQ zx%(ToUDmWyiEf8RvJ{AIztGG$@OBuCZ%TN_cFTR)?Oh&7?+wiB%^L!5r*|2-xy%NdC(fxozr`K6=PUuY;8U$j41X%apT_6rEh1i zz!IeSrfhSTu;!gztRTGWU|@jy^uWR-wn;9a2j=|w=DpghLOvF zq}1~+A!G|qUAqsrwY2X&nr-gM>IO1pT-e(FkRZBEXkjc`lsvY+CGApJ(O7T8y*M`$ z*k(s(!yP!An=5ws_jpHqj15A+p1Bp-ZM1=Rlh+=glA%9u_Kx}(LNP9HB`v#mTVo7% zN$5`H!|>1F&XI=h!C%B8<($hp4s>+h)RAj0n9;`UO<4DIcFgX{?r*-ajeb)JCGS7f z*0aB})z%=u+~^hR;M)o&T(~;~-YdP^1MdzR!dg0ccWU^a)q;e~Dh^!V$fAh+vc7kh zjGv&IhP!bDAC>Kv%@H0udyiZ<(MqhWfp<5SQ*pOlPD9{(uLJj7E}_k0H2b3UV4(;8 ztrG_nWBB`WK~|ezu5xApB_)1^8^ZrjeMk8~Llv!UdyXK_DbR?-aNuQ?JGK*GZJkrGs)e?223;xj zgdQ3weg3xXp&O3MEt{J*tz-WwWxMXiZ116Fg+FlNXKH*=v$<*KrtO!n+p>G-_D!3# zF{)gfHeI}X=jN?k$1HS0zjgSaggcSsd^6R6(nMM$H_I|NL9C&Ikgu1&= z8|VTnmfZYxxt@w@IIWy#6Ka$BOcJ@F+mv?feRG9HBa50L=7!Y_Nn`b?oC#>~{v;8ol z)$MZy9M?Z6cKZv_Zhs-!`OWa{o#5*|Y{9)}j6Yc;}2X@pOiBzjWZJ66cURizHT z5coh>BY^tdeCpz-uS8F?m|`wLQ@jj);W=nwmjmfog{E}11-v;u>0EjKx5b!iD z#BNxOU7?0^l=8^bTf}nJ2~!QYRrpvxu!%dx^r$HDQDRI;6gSM^ z<^})tL|BK}H1exwiG%}mD^;hJ235zo(@H18)C6|v|I71BehGWx^7Iy4m6tIeBqG}> zGmNIS4zp#h0w%k*b`)N-IrlloUpD3)dT@{K+|$W1;7@9B0@#gh!c2lQJZTF`I^`)d zE@|;;PnkNzG!?bud0KJYOgL#KK4m5)bxZhDZcT~ZlAmmDO^w}}#x0O$)5EWXBTCvP zccJW>=*vrK@a>?oF9ThCIjWakrVBffy8t-86DQD*nd@yc2%$|?qwe@1z_HtC2*8V2 z40Mxf6DVWiHqhT!;{BT74SaE5*!1qL`|Xf~wWRYHqTWqm13o5C+$YS;rp71CtVhj; zQ)V`obJP@I&X1e9VAbb6VJ!Z)AYCC@7zvlgy$=&5n37 z;Ad@0{=t)GaUaQz7;O_Ak#_GDBs)*7m$I$r@Y?NQs}7*WJcN$DgPG9@Ub~Aq(oL)M zV25**_PmuAeK~hEb#Ld}JHTSS3aIa0wpF*2!Z>CYu_{P;IePo|ng?l>-T0?_pS^cC z*n@}cJwspQX4+%XWO&TZIW(@kqvazRwYj@<6L%h_+!lSi%{PzyfkL?zMm7<|!3an5 zk6mYYYwCe7R%QS%R?0vi{k+8<_<)0#c;>F=V`im0)iZmq^TLst*)K5mxr8(2$&rwrOX4TGo5xw1`|pfj|1&zP0A^RrKx zRVfh5Kje$_bLNhsl09TJ&nV?;n;pmF=DhpNRj14vFe7flu4R()nSD00cAdMTrhvq2 zH@FGx65!lEb}70ynATio0D+${o1WGRm)4>dpJ8udS$;bn-QS5p-@E9w2k6E3f^d8o z=;R~bx#lro!5@fb*ki1>nnM*VGShhT1B?pet;zK}XMe*8Vxi;ggN&$z?b|uvmVER0 z0scyUQrQS+qTdIv%p^0HgPhE26C$!pCf>==<5}gb(LXP{kP6+S6#Zo zuk)WW5Vg;m*|dImK_5N^g3#Q3Zn~~wTzb}lNq3J+1I*lc;H0@MeCN2ioamj=;(7)7 z7QAVJ;96OancJg0=G|wu)KwJcQZ`Yr;3K1#fsgNE1OhL2sj_8W6%CcE<8Q7!Zmv0Q zuI0rO=DMekovx~@$S)5Tsf+2wXt3CmFtJ#JMZ+Gd--%Je9p-Nt1fS#hd5mG61ETpn z76D)I&IiM9qfZ|1ba)IEbzBag4ZT8G4NLnh)Q)C!&AmDIy=Fn2aLhlNfw-> zJrg~V0(IUFPU?E^Jxani{_|rKJy22 z*$ZZtu(xj6c$zZ=bsSm4L7F;qh~`sfHzVeHAo<5lvsU2uo00Qq&ppRY3w?de4AWJs zyIPTob!(g2m1Umx+{NRlQu)@k$Z-sa(qPwXK!h&<6Mh}YX0@K%rkZmT z2Bh;-w2vr*=4heZMKAm<#a;l+_8oS^Qu{b!M(+zOn`RsQEWP9wPfUtlG}CH-G zF>k~Nrn#&N+U{~4t{_6SP_>F$;G1h~)VAvl9x8pa$5+6%YSXIs+NyEjy-#QRGaTA= zc7tyYq!qKR)*RB!4!zx}!(qMsGT(IhraNtpC{!Df+a{Zvd~>s}L3WF8!?wW$2>&E+ zdZpr+yJy`C)^)eEw@duB-M$R(fc^c=1H}_mv~=RK2k}S=(SF!gHbN=M_6a>0)&g{- zEr!&UFgd~_EbL#eT9Db`AqeuHHpTH%Az#_l*>k=^cSRUns*sXLCt!UgD(mD4MZ<$n z68a$24TdSlo$nzSfX#0?fVgv~4C8GdzQR|qy(?|33x9uew+j_fz=ux)uGf2vhS`&C zvP*m&1K<#WF1WOskb&_1gasT$#ntO*)q8g_*~ zF(a{2=(>?6i-F}<60wefUseq9ju=NAGRf|a<$ecNfmjmu13IPe8kgt?n_aFAnh(+_ z1xl!qaj{dVeVV5b4YSRh0MKZCPA1-azyz#Lw}Z)!OF(*!RH8GM6tDKuFoeA!^vcH0 zwr&B=@%$hKP+sFu@Sq6VwLb473143w7DH|UMp=OX8nbu;MFF4)Cr9lw-9?a1PP2Qm zZORLigja-GvUz9&Oo`a`Wfm&6#9aZ5!VG4Mbv+hf;@B8q2SZB|nE|(Vww0`Wgt)Co z4j;B5a<}1?tk5kYq8hX(EjB6$>Jv>FrT*GLe%J&20bC?&brgB`C?H=c6enREd(XyR z&0Sh^Q%0dPJ>Rx!fo!vjl(!fEs!?02ly3-(Y~al7-UTSRCKbq~+$3QNmJ)fpo3{CK zGXbo2?`(=jJ2;Q{=o~=Qy%KWeQZ8%f*bW_F$RpA~Q6BmY_Xv^HmZ+w_eWFau7KvHE9 zx=n+;O=#j-0!%SbWD&vIWq%ddO@tY9kza)YpJ(G+E#T_65JMIGZj~6#YpQP)uL`4= zl;HtZsufMg%%~M9XzE?HX-HpWIGLwm8>)BB!|vb{rlt`NvF0f=EP?SU0yi0GjQAK? zj4*ZBMpRP3vq|1@4F5o8U*+D{pqakT8~?~V-{!4vQk8E}xPL-K@EwE;-^Fh4dvFBb zw|HpLypus7FG5@gyNDBzC71%}-&U>6inx}3Wh0h}iJlyA<(?9VrB zR;v{5YxQtGaseIG2J5*}A~jTHG|`4{;|xIF8w$n&W1yj9pxByHtM}OLc6RYS?1K&X-3LwuLa^Z>t&k{89-} zlokWY+v3j8+S2eGatJOYSs9mrTO4@|nXbn#H%C5?1m^kE-#TW-Zc*61+6mmmUb2e8 zI}y8Ps2{8~S2Gq|*<382Uvu}r;I4jyIm!RAl1x&Hd z@`mh5eW+^NVi2|CJpR0Hg$L{DzknFexREK6r4L(2`%+2LsT4U_snt|V3_izFa9`{s zsCKzx&*0i;Ta-z$v{t$M)m#V6do;tmr}u|*X9Pw(g?DPv*yvju%#2?}_sXR)j_W$6 zsbnP+Y;F?^jel-m_MHl(gpw56UAoW78lsnq=IjXH4D(qp2Y|jGB(S)6jOe@mFWCfHy7J(sf*&>tm|q?i0K+cObmpY!me49yyn0D0KuWZHN4Pg z*YpLBDeAAKRSc$CvUr+f4F@q1f=|++F>PujotmdN=BLd_{VwovOA-fB{3UFBim?&? z3~&>dZDN$Jy1E2+9ota)Y6!UQ2qSSG5gE@YrLqPsc>v6|5*t@3A_6PiQC5FygP_32yhyuWkD#e=FxAWV+ z7lp6_;7;Q$?YvUPBuF8*8Rz(v`O38mnQK}Hl56W!Mq~ILsoxRfp}AP%d0u4~c`flm z5r_bUAb-Mm$4%lHlN3#doQR_%fa`c)X5#MsrK~XeqIwh&xK5giXN;BkE3#Jp1ML)! z$Eaq%n8+0x47eX>biI&$3!)A^V*@UODjmR}^yd&9D!a+rB&M>xO@mK#C2682`Zr%Z zUag-zVbV{UDtnPh*^AKsrQ`)+WL_%iTEtIh<>4 zq$wD*VQcFO*VQc@Q~$QH8h(VoCA>KBbyY~PqQ&%PEs@(Ykm{HEromUF;>l*G4ha2I z68fhUvlyj)DE7bFH`i*dz0S)119QDDnswMCQGQEWw&JY{i+!DM+Vs(0eZDVkru$L` zjMshi0V%5wU_r}4+Tx~;MMAkDpxuhWYFO3*!3;r7GGq+wjd0f-gfSa3e-d&K%#pEq z;U)@OWVF&R9L)M0g7l*09pm*Od_I6RePeufN0WJQV~7=S=nHvMi2`iy$1o=Brnq#+ zwYOD^xDB9szt#4HU7R;lbUklhhdzzWYr$B}Ig?!FuEj+t3Ug%BVOU96w^<`38d-Bn z>NV^ra?am#m19iiK6b;abnKADa+N;l{z~;Q_gPSyySirZgX434tl?X+wx$7MDZg{N zt#o~CpbvKcv?F^!n-LaPu{Fj!rTZ(Kl1VSa07#(axkDIZ0>C*nwZo2^;p1_34#MVysg;0SFc^&&HRNKb_$7>_#WdnlTL!5X2xW^LdKzz} zppZAw1(Fj?Mr=NlDpx^-Ul2C>THE|`h-qoyKgzq`X3rb*J5os_B)>Q;e=FbX-$qMP zk4mCF8BOuVj51?Ez&>fl+52^=3dyTamxn5H&9saLhe)N|8@Gtt4TBzLGXP3DgQ`n+7 zJ74_cCqKgni{$BLxw$PPSN!O;ee)_&$*-2D7kjuf!{EG2hu35P2)))fudAjk_xR@Z z8F+>_WWavCNpHW&H}_UCW&X-HZ_dyUx8dqfzi-vyZNe4)HSQ79=Kc&!#=Cs;Zr{8o z13UD9Z{90d&x5{sA7OXRLqw)E4_7hxAJN(Ss|EYi;W54S0UiEEhY#xB<2ndGD7P|H zVxBps1FtSKAMwpcGgOe>R_h=oj~Nt$yAIq8W=fE3Waes#g2sZSpl(H zioFo3r!^<&~h!PpL-k;;hB5F)(=r7D@)MDA@0LLwn{v=&Eg30u!l?g z?dgZ+b}d}q5zQb_WpYLYcX9@0B`onE8>au--PV7Kt|`L?&q0&=sYj0a>AwK!oa09{ z5#X<4$glF>7MF#c$&Q~+09XA?_guj+J&g^yZF}9)b)^5+7{tKKKcFh<&-&)G z0chdR^`~eHfO9`LNY3ne^LMO*0U+Xar7>C-&6Pve#V{`+?||xTQ&(4KS5{G`WLs?~ zsJ4I=*#NNd-z&u7mwoe<0N>$X_088jv%EJs(+l(EP+U7Zw4F=g)86`{Ut zAuO6s?fLaw%?dXxTtnE7uy=7C)>)a{9G?K=}I_q=L3KdlNzKrEtR2@G9h?tY1IHF=G9*t6Z)wF}87_ITnG(j^+Jm3J)&)H-7UzNzNwT{2ftkxkzH>srB01jB zBzC2xf4yx~3uDU_N(dq>-WlOA(wz{IhwzmERAY91OQ&BzDDK2M6G?un6y8 z3QZr{;`e6*@Rz_}$j9)I0`$R2FSD>o^urb%DXU74on#%y^>F@+`IQEJ!H|5y~uqkm-h)|M5e3MeVk_vR1P4kW$ ze_6^NE5=k1JOU`6?CuDT_l&9D(m=qA04VFTrsh6V-GCeE<9N+%1hq+kg5mS{<vGaAolkyxh2J~9 z?22@m^eEuCI{#@Po|R}JuVi{=!@+<*}>U0*dbp_e$C{#o7e@{o7*vf zdo^~>cVPni7IOu5%U6=i)#P;zrghhncQd)~20(c|Fx+O$^IFJJ!pds$Szv*lDRP@j zz8BF|3z3;fx>QN(6Ob=$qjYy6!MVhqy^W4X>&m@PginD`0p-o16~94rzRT$N6mZ|m zDUHCn|3Ha$QR}OCbGr%tXf6TCh#eL>S>Ippo9lM-*W{bs7yIV=(~On0ZpOvFr)`NWWs^v@ z4SO#A8*BDq|E)1U*0kf;K=QyAY@*$KSk2oBo)Mhx2{YrQnOU4@k4@B}d#j>EtHMN; z)WI;RchXD}c`j`iAU6#{L}eP%2_bJsU=te^UnX^=tiFLX86T7xT3H;l$p z6=QCugKj~4eJe7vmm?;B1s(cITMkK+B@{e_F}JF@C@Rq+EH@9^YA(XEvWrTogMjGP z)X~WhcVQ{FhD|y=-=vKt+VY-QTMmyh86LIe@Gukkd(O4xbrea3LN;oR-?!2b&hov! zfjk!Go7Txe--g8X?aZXVj^#Bj%4=MhR~ih&PArqvZ%1%B;rgwOoFoq(6Xw-4ubxP9 zXV*8(E0GbA&&>M}zCIMSAse;+p^~k7H^;lpTYs26+wGudmL;uygg%(UR#Bw`Bq+uCl zmYp=`JZWkjS|mTe&ZUqpnCmO7+*gVtF;CivCH!-J60g zVloQBCbzHn%I81I!lXY*(fj>8=U=P{XR=F(kX3?*uJ+A&l3v@3HM+A_hjn^ky$&0E zv(Y!3geF;)Hs|a20v#?)o6V>Rbb4_{3#)Hf>aZ=BPinapk{mTjh!F1VIoR29pf8`p z7Ml&RI%)=z`L-?zNxL_;cZ-SOdk?ohkx1D(FhU79B%yLCJJq5F&$Sq(DVBn6guBCi zQdzl)tHs>Q!OBzM{u~w6*l;en>}Vx>T__HYIEFM-+kQz+X;X`AsA}mvbhx>zZD(g0 zS4gzJ$Fu&a_cYdMT?d;Fcf)*^GB7IFK62V5w?ekoee)u@?u`kKoMxavd{mQbix9Op z$($Ro7f*y*&r2WH<;I7Vr3CC`X9<(X0bp{#2EN^b3`!dMm8nTzA{!JWPH1*@0GYB= zhszM{H)d(wYXdf&#lE>bfF8KABscFul3ONYgY7Sk=stu~VO#d=t!c>2TtAMldh@em zTid$Z5xhn1jx}-55ylD~colS(mIy{5JJ1OA1#8j>bqBu*^$3^a)Q4OvzJ!YnGli== zd9EFDny7DrMBi^lOqlqHsSdp!JzYORj*p0qYjJ@NljoGnjpQ|t9Ojei0!kq5p)rou znTFDX23&a6pE&T@G}(;T5m8mns*e5#zwt~7km|D&}vB0^XSDj z^w?U8zaeVV@l>atHWg*KJgUNSYkkLZ$lYO-^hMK1Y1b0FP-S)YcxuzQ;=IDC?6cf< zMCye$lN^8LI!?AlirAx%KO9zcWkH=DG8Ku(a}|6<@yxlfRm?rH7xqc4uFiv!NWLaU z=r(ldm(cf@lF<(8w-cDcWpvr)?BZ8Obyq~p+<00E|IkRmDrlVs+a9WWwZUUcEmaQ! z)k8LYuI$?>y9U@C>GLrytQBLYQp48OqR`hlOyKa^k(}dl$`OQFzHn`GO{{I^goVJ= zhSBBHznb*bB@>k>q^Yl#;;{%qmJi< z8O3|hFD~VwSSc&Q6w?fobHk5STK%gXCAT}H?hgz0q)9k_J72c(b|{g5&06KZf{zkr zWg+piclPdk57Zc=KY;}XO#Ez)ApnaAp$}%L{_ZM}hjs5|dZ9~ScI&X;H$539^=`e2OO3PS zQsXRhlb+qIv!goe($iaXd20sx@)bHmdw-UBrIHjpAtP5(84w(#KhuCsm}&0v&1-yf zw@*A$GiKwa^VeOrWoP6)*?LK)MWF^p?R7Ty-IuhXt8%-VG;sU7wm6%7r#cT6GV*V) z`;b9#lx8{?rwDlD=8lfGE{o)pSiPL`qC z+m?7;S6B1Vu)y&E718|xlw|9X9_`P$#TZNoy0A#y~nH@bIrZo#Rf zbpjfOUc}k5$+R5l>LT(2&M-*A#!5jnZf86|!J!6N$ql+Noh2peQihm}MlqG_C7pGo zdqGT?7)e|}4ASn9ZF-U@!ZFkm6)1*hgIoF)M)JV7E? zn3ZxpaaHJgV&#C>)To}(Yz^=t`9|NoDZp7Hzkg+Y!v_+osl;y$5a7KfK+1vhwzK=q zrf6gZNJc0lZVCfxJ3tJlL3U9!?g;Z+6H9N|mn5*G5!9zo@!zqCCu<@gFcciw?d9)z~ipBgFxIWMO zMci;LAK|gM@RP`mvD#xtPbco(V}RyTK9GHzw_eQjbmrz8JQ{v95S6B&X94|I*5jqt z=Q_j!&Bo0W=E=Sz*x|-~s2uS>)6yvyru}=PKtCLfKtP@x&2U%V9^g zSidkJs*-eK(j}1JOJO;e*`yrHR~;rLVqCQl#aWHoVLr)u=xpS^g5QWvk-76;yu3|@D!A)pdd5QJ;OX82w z-5GnoK?`&ijWW)!uUA%}Uynv=_qN!SF zrh{DFgf8Y4=uI9#^!qSclMlfs{fGtpm-NkAzOJW75Aw~0ydzHeS5eddiZ3pwd}yUT_989W2S>f1RNJG{NJio2gU&9uWf%@<7^xDudDP*mu+ir8s{x*3Had1% zwRJ4x%WQg%olb@6dFab>-^MvP%NV=DxsQ*;KCTEqPSaqywP1?P7G>4Q#FZiYCUku+ zZ(+-?PFhuvL!HT2o<4nAXNProS(U7KGN^ox=nS4~f$7kLn{>e1a)CLj!!0`8s>93i z7nVU)(UF#mJov8B@{G8^+>W15UA(FqrR1H}XbxXfZGeO806Nye!SSM4jZ^_l_+<0O zv|!4{K*7D1A16*n;6 zkq&IHytQ-6>V zOhT^RiF)$RTgDc$viUXUi~|A98x#!%;VBJ^NVF=Ac}q7j+xeCM3g?MX;(z^P^{~IJ z3-*_#!Tz!^*k2Y6e$!e(`1K+GM8=A#liNV20U0TET79i$9&1x5^&FqLkyor8qxU4P zi=gMdPr!d2ha1W9h$G=jl&nWm7m}C~J-}~*-`NeKwBd5ldxfV};VBvxdkd#|*1f-A zXdz4LJ!PuBPnxmbDSX0x3S81>Y<5l~GCRypx;W<}@M6A`pR6tXt+PbAiqI7nVHWku zz!fVtiuvsCu8l;Uqqt@k;?g?yfpJcpj|`B+J2MJ1UP zYJ9|!Yzy0UJ^70Tu(>^2pz2XYEjjOfE7p!RVRD!76a|ZO@5nmo((~$JF~k?&cFK%| zX|3I&T0CkhYe#)FH1ynBFMQV6#@e&M23`UCNtBbP%yiyDIQZj)H7}F@`NntUS6+BOj-ECpT(?F&K)Po`f zPInb7Q3B3JV0@#vN=${>30h@N)4b<>-iw_iN*O|7nJK|7FH_|IKvzEj|0cW{&qe=!M^#^SnQRe|Zs{#7pLS z?~mp%6ZTaJoa-kN<}Hb&c_`tVFC^0DtBES}e-atJ@<%x8O|DW5y3$(;;SD|vPZ+lWlw zBTV)8GmO8?5dI4DtuD1_Y=SuC3vglYym>;6%=R^?BLGIBEI?Z zn@|1bH&cw!-(o%()S6$!GXFNi0Dfx~&Hc72mTr4^yUwsren*De?*s&9?$e$7;YBlS z6>m+Ock35}<&1ei2TYa`w(G@*^vS~+^N4xBZyptoi^cO=85~!d_bL~RkrAU;i|*6q zhjjRG756@(vybZVFiRePTVGQl? zAu%XiTa0fD70Or?bsss{1E)Qr_rtQB^y;E_2g3o%Lrxslpnum$NK zLs->~rl)1U4G4J0U>bXH!_0}Aikh`o^=P{9{DsRfxE75wK^kF$`x<#2tVxdHXH3=> za8==uUDNC4U~>@zWIOcoK{RG0rVYhF(U>dMOCSAHBs{okooUlccaNp*!L5p=dd`r_ zFTZ3~uw>J4f+csVAfiZVtF6o|ca`a3pV%B~N~@a>A3k{Wvcs+R#mXb$ zNyTo(fF^!w^TC7L+gc@^?moZs;K9zDHUJ3k>1uB8&>}pN6*r6Szwv+abLSC_<6W~cp4_$YDd)vWQ$`!xc-jTaI7@6HR zb4h@rYI7hRn<9-MI3JupFS|qraEn(2FhVa6Ag3=VFG@rIZq@NJM|VrO3-yiR)3*W+ z-wq(N_xa|ZLNn_N&F!+a2Hx>qnOh_ND~&DLZ-|Eu&*g^}*}nNCQ@@!xfJhaS92 zhdXt+OS+x^Q0Bi@mK{KDDmgrFNGDlKbO7}@sj>`h&r9s2^}ru|>mS@al1 zPdqanY;;zWFbX@f*A7@-jE&f{?D)#=x5F)aq+?Grg2|S))_|a>WPh)69-JJPf7p263IZ0U`=D+;}2aj|pWAb9r4KyFqN){lHJZ*;# z_gGlp-~jz+V$0<24}RajC&Ra%l2J1>pR>B5}e&52ucvRA9g>!l>i zDf@asR&oKmQ#UntvGxxFp?@Z(vumxmtpY|*2nzj^(qI2ro$N1blLhxPJ-Hqa>&xQB z@lvjKz|M+sud}j0bk#zRAWi@=k`llnlmTw%m7K#khZU(u>)ik-zL6wy+<9f($?+p1M<}QgK~;WK_8N74V@#z=v1{&RN>oR@$kkE92mwmAFHX)9byN+mMyTL2j4RJ8oaSAncgpi+vC>vVrM=e5Ak-WmKu)33uEGQHDU(5_P+c1U zJVB}^S%)#NFA$ofhtZG?7MI-ovFE!QFFOFd$^5}I zcts-OqHbjpRGctVx76zq19#dLHkgil+~wxNZYJIJpeOdw(=EunT5W-yka|{F;PLdI z3g<M~px5m`P1qhS~j?)FUQ6 zrsA04OmjDBTiXqjTa6FWJ_GIvk9{C>UI}XD4iqD=vh{E>$+b~E)`s;M1%|4d1u(%E zGeDPYAUUT;_KmvoVPGU)E6U7MdpuYy61Uok&4!M>lC>I%BEb!X67n3D_5~u zVZ|n?VhCkx}H^irH zc+gAf!rkEBgh$P-(Z%GgtPu7sKIJVdt8L^4B3paI-m?kY1m|rzW>z$~&nG|1Ld@MQ z%6~!rYxh)v%t=Edj7(W+&OUa!Exe!*XOJ%y$me@@zxggW_D3NXQ?5>uHM>!K4~Q{? z3Z@q6@oe*McFy-O3m;&+elIGI2boLnV_rUlIrqbi?MJ|9zaJR&G44FZ@dM^@#InaZ z{w-*~ub7V@?ffVK%RUBm{)G88I(0(ZdiX@}hU4yUygBJjF;96j@Z~k%e9BvCKJA@v zp7u7IXT2SWS91$%E31NVgb7m0oiPq_vxu|Xc1O77f$5)^|zKRh0Yjo7t5&!=qG}brSoxV+nx!A}p@K*cH4{W8}QreztJa$#r zcolT5Yh*1l)(|aA!;K#!H7s0DiJDKaHJ?mDwV~!~K6yYjpB$_C!B)*ho+Uul<_K1300cWo-91UY`f#(} z8v(yQ(p=#Yn%Wy}4tryXH$C3m;!TLAm%&wm0IB+SYcv{e4C$5(o2JHvqf$ng%9l*W z0;OI#&7V3>f$HFf!@;qeD-kMVv=n23t3of*h~9GS^nc`su+!5|Me8@s1m1KCKGPP) z(IjJ{!i))bM-512G>SjC?l7}kDUvco-~VHQ-WSz{0YcE_gFNZNWGJ0 ziF-VWvrm{QDwd-@EhgNX0~&fRO2_(Gk=8^-S`!w@LzZ$)SdhhhFH)pREJ^BwSz1KT zdkbw+ZZ)Y2lT!Tj+?Fj8P&Jw4cCd=%VTA-wE<_wK6r&E?_E)$yC>sbSqmYkD`V4Q%S&0+o6zy8V}%v%K5TTEEgXdbeXp z_9}C(_iDUf-f1>?uR$tzx4GPVEuIfvADb^dVdYg(6tZWH9X+~kt;PX@uCS^{xzcc6 z7#jyr@3i{F`~a}!Tp11?4yiaaMPSx<5F55MVakDGOQ8|m5HIBC`s%P7C(Ip<_k z;VGtD-Xb)ZPC(sjReXyDQV4usY1SeVNEd?d=l$?&=B5f`|2FW!fHjB`@o$z9b!6-} zV_^}fV41Y_ut(>~cb1d(6KI>011-iQ(G0{CmNTkSC9B2=HNCE*s35oPTm3kw}WjO3Ysevy zqy>wj_;xx|B)9|;9hE0pJ94czVja0p49kBpc`J9MW6zjWBY($DC>G9V;;P^>sfjYF z0pK;+W>SOLOtJ7%G?-Rz1wPlW3w#crfW#)?j=*6Vq?py(P`Tz`;ky3Gi=Wu>74p^J zI-Z`v_$*r0zm`FufDu)L>GEYqm2?-lvPhaEzU--d`LIZuo2zjTcZ)B-71icth}3lb zifXu%SL$%PUcAG`)~J=&3aqE};@x`dwF;y0Ivws|Z_>Zy&vo_sDv?J@96PFeWkU64 z1=L6i{Pkv`)_enM%{PCoOK@v7!mZt>@EZ3Cw055mYc)cwSxb=ziLQa&1Ns{2p^<%; zT@BGOw{;N$Dza$NQo=+TP+ZJ2fL#6gw!{L}RSx=&#$UjxCL8Rt&`)vr%9&ug674q* z)Sxb-=hIi=*Jir0a~OFl!lY^PnP|S`5=QTK#ct%Yf&Z(v5%cOp~mjJ$i_+v3?^l| zApFA#b27mE;gf+mrNgJpr~N1b#j}!Ke^wDFR{G|13NnFrmFLWcz&x){w+iCYq{H8t zPb-iF_HbVekPWX^=!XvkNQX&rks?4Wvf$%0CI4bRJsh3RI@5bhwu`e{kasiD3jk5l zNUgMeTh2S@pB{tju)VQ3GXpRtb6~ChP0H*tIxrWOe*&)3^@?2ytamD=XR5nX4n!K~ zTs=U>$gUMRL`k3cl(Lk)LZ;$GB~S1Vb6!>QH$pc{u~D?+Xm?K=p{$Xe0V$Ma@lg*5QxP~1XLp2owyb+#Z9-M&DT5HK< z`F4?zjWpq212bf_BHOnNSdSA`6-0#2{;V_e9$O|FvrU_1B6%2E|pQZ412|9e>cY~UM}MXf4^FX0sz zy>r>Q)VoXn$)uNm^2R`GOI}=y=X;M9p;f|DWP$r zObiWR7UH71eem(l+H?Tv#iR#>IzR3Nr0zuIDyM?WFJKUK% z#0Q}?3y|4`G~|02;xfLh;+yq?ztWjBZPbO|&>m_#>>Juh>4K5yodrBgQl^JcC2pt0 zOVEAq;AsVAx)OQtC8T@@Pc9>6-1U;8hN=5frh@LRD|u@d&l*koMKjsQqu3t}%G9gT z(p~d{nfXVBL&nS4wSYM0@$-VId4U|!ocON6mrwCPeTO*K z*dQAg%|=B*aKrNtluk@>i*%2P+D%HzX3{+raMN^l;h2V41)Jzp!X2n^e|2P z2%Ub+7JUiDTMC+L4;`t1qw8!(N;J|Eby^GO3S%&WFV$5E+XYguxjPD`poYgk&`V~j zZDbmJEhsdVNJumfEZTn8BOGEW&|wF+Hzi& z1dV@%!lFwqZ|^=*ZH)c~?SaS2_ljghh;AmzKm0^Pb5;i4*}XU;Rcgf{2P zM|_jcwpB9*F0E!h?$BYU?p>y*msf-Dywo>WR?(2mw5uieBjHiznzXrAzt?4i9@7WS zI@{w5HUg_vUUU*^1I|D&Gf0a)+eT19<)kjvp^Hp;uPc<7M{<`MNHd#^^{xt6l#_N? zk-NP~1`^-67+{Vzjx6w?QHz~7l#lz^OWfty(3bs}Gsf8C!FkTFf^~bku~2Gp6PJmdH)+TXI_sjj1P9{2 zwRz7s9->b%l;pGMcN1 z09rH?>SA*RttU>PLw7%Xc~-tg1&?3{Ns|z+@nt8c7mTe$;VoXrTNlACOT6Cu?YQAd zl)&KPR51K|i8TK7a)kbc=?B`5?od08%&q2jhI5Oyjrj$#@5IOZfOzg9Tl)-xS?@b2 zT{v_h0$scZ0bS&*KFe_`WJrm4Yty*xSkqZhdUMcxhbG85mWo+KVKUA+z&q&>#i*I`CB1hWPC6enzIt3)PDwKA`U{viqEEI=_dOC z?;KTE%tNzj9jhj-ZqS*2oC{UD0@`^cD#}%4b{@5pDM-$$VQy6Ox$xSmIhk2LJi(Wf zth69$xnC5tFPiD-nJJKb{zwOD01vwYHsI=|+A~|>Faq(WlQ^mI;N_CGgcNX?E#$G& zKXA;0+Q33$SYyY-V%Gyl$rWon+|F{wK$1~09ZGeD?aGFzs0~zS6-8Z58e$C$4Zf19 zIj+B2gs<}j#64ZW^t+hvLJHlE^0AXuZV{5jNT5Yg(+lXG+k@86<(q}~4^m4QJU$LhBCVG+U@6=*9%h}huE`3WG)u8DoS;yJcmEVr`jFh!_x49!NN_@A zBNTPcq|11!4uzy8T~eQsTWRao!ZxHM?+eJbzTCr)5w>tzo?zOHLFK;YgX_BX9XW(U z&X_m4N!Iu`d+11aPj*jRb{|4bbl=&Y{mmWOv!@0~?{E(|+>8himT;&wqXHy-qXuV- zIjP*Rv{H9vvRsFAhu{{zfG*5wILh%|gObxSb8DCl50(M%`2=!Ar1qXNJ3v6-+Y0z0niiZE8-L#ID*T zf>##{$t^=l%Pp~Y@%tJIaJNm!*aSs1r6}x8vW-e*IUmL@T4RS8AY<27|bCTA^Pz z71E{kR?>P~nY7eNN=v93SFUa01~c=Nsget48#G6DnVid)w}e4{+iS7XByf)-4)R_2 z4x5eJp=L&1IMWg-h5gTd;(+D(kKYyhIN$%XsYk-h$*=AIxZ^+NYC8Id&!@6$`$3?I z&0Px$KfdRa<3IU*wh;YEC{%6+h95)ClZIt8BF?mMZ}8StF_b=|1Adj}n`hGISzUbA zmt&<$^Eq97UWey&c)l79=NEMNq7HwbLA{Avr7xMU=<**j$bmr?ebszjm*1$y0_K}K ze2bv&8D`Qy>F|H_!vD=+J^Ec8zNf?Y_28dzCXhkQ_#+jB!({Vg9e$$2zv%GO%BO$r z+D=zL(*Z!yWb=#U%KN{_i1~r}R~`N>ZGP#SU+KxeXUuOv~4CFi4o@XoLdkMLYdM529`SnsdROoSK#`C?j z?^Th5m+?I)tG*CLX+pPL(capFGZ1a5!w#azYU}O^BdEa8cZ8=fZ4rp1gd8Idni&d! zBiOcOD;vhP#fnCaj~iD*^f)O{hbF}$#ze(W=yzPBh?zhZo5)0<{c4HeJeNuavp;YToTh~6<%4{(QhgPbgmdP3{SaXC*TMU}HtU!KgOk|mpv^8dQu%Z=PqaZR*TgLaHmPVI{9uM-FFMMZ2?|9od<< zdus35pPkv7-5Z8V%rRzBiSI29yk#Ez^?T)UtvgHhGneH`u)H-a)!uA3YgcyWvep&3 zLb*H4(fL_?eG0xe7(3 z<#(#pY}hp5l(37v1PBNVdfH;rgHby>J86%OquF-r;ax79)TiS$CU?VYui! z0srsvPyyC@1A#e~P|)P&4{r1~$G!HK(Ao4tsTH8cdg&XS4=LQpZIVMP)_NN>#Jy%$ zoKo@0ocAcd`^X+C8qXXoS57h#L(L6NFVZ)%vMln@O17+{zc@%Q6r>Fta92O@RU^Mr zFVwo6Tcj81VnXQbu(a3S-eDxz46qJ4(zcBND`ma<$9mSG1Vun$cc_ItdNCMY5NaL%K_}vUYe;Wd{y8z_m z#C0P;PF}~A(b`5zO7mXcm4ItuQJR8H+SuhD7^TWxBU*7#_6fvF* zu}oi!?Cy2QiSFUq>rsNd5zWn;Y(cUvv#1~oZNsQi3vJV=f`X2@!sP{#NVuF7OBp&r zx!4Fssr2{V<36S}<}-Nid>I!^c)MCk;;z2rhH=R{0x zwZvZYtx~jV87Caem+AgknKEHop7wW2q7>p4N*7m%0H7)^naDGj>nb-O$yRteO2R8!>v0aEWlnN_zze$+L3gC?TC2~lue%;UtFTl6fHV_BIJ|WOz zZPmKuvXpy^Hd{g9gr{(3Lf_BO*%%Mq=2(Go(Fm^7aU9seEV@AXgUOCb-PO#wlf$cb zooAnC!TNoc9{F3u>z_m8{CU)#&!hhP0z>|b=v4onx_^nKH!PaiHF>F^NB#^(io_cf3Hx zui};+j|;zKw|;_95rv6WNXUb{>}^Yke*cGuJ~=@Vv>TQbI0t_Qz-?DRMCjppJ| zev?M~7LE38ro}(eaNk8g{v*`TKS8bgFRax+g-7`rc-@~f5q`m7|5t|fPZE+a0cqs(mHel{edJZ@@2v!eOYgfl2wmn>SI}wVK*+P8?N( zH}gh{--hI>dJw@+NzEtKznvdvapI;&(*$(>iL)t{%5mRn{gZFOD zu#={t>TUO#EgA@^N6bdOaThn=_JCP_(lpl2^FM9o?@ID`!H!)iy>-%@y7EnTV_e1Tci;g~Nu}Ov8tPA)bMcmm`#P23q*-w> zp>ijUnEZ(J%PV))t~y~>KYi?UYh5Z&waC+e@#dJM*ML`>MsvVB+uY$T1WdWu-0dx6 zjXcNP>#ZR2;z|taSKAg@!lGNnbUj8FYWaPC*fu(I-Kw+4nCQ|8KZN7K>lh%O03z)yv^ns?;^9;yV%_3 zZ8fj!n&DHFC}BQrLlnz9(qz=Xc)lMeV+~wW#C*N*5MIdzCXj#aIBhX@PTTLaUBSS z`61tYSl%!`l9Ac6-hQH*hWvo;eO#Y>LidP&gz0gH!&AQbWQKj8gda7hbVlf-`PL3O z1IzJnS~~ji<{905R%f40OG`gq;g7~E{LyoYeDs|8J1Nk=fC;kFK}SE!e5o2T6{F;@ z=niW7YV%c<*wfP=i|I_B5_4yAn z=7-YJS4&6#6RGE`%}+CM0zXTeZE30He<5Z3Pt3pR@XNHhEG>=vznlNi0ge1~=0EXt z@0zqtwO2Axoi9&xq%ip?8$UdTN}>oqo* zM01CWBxykbo|#eb;_maeZQs3Z!-mT)*}Q4v?hO}ikM!T**OCNw>O0ia*tU*lq$%rK zn^8X9=rI2_5YeAXecm_-T@Nyt5$)X@ju5SaDz|lYBd5&?Ak!iC8%vF8Ws}_C@ZmR; zP+uz3LRGPEej|hGm~O@frg7KER|NpHmL@q$V<(r`dKWF1096k#xQuYFPKAN}C z2!a<@_0H1<>LOQ*p0bu%<;=BWn&)YKX`XFLlDMK>wl-9i9c?$+lMpYI(REJcly(H1@cxpk8Xrjb`Uc9auIe)s7uFXmU>l|-@H{UuAZ^l+RG41UOR+ixUWHew65Yyb0r$&=m-ec-BcK>6*I`au`^ub7 zt@qHiDqMX4LKox7+>5c<5h>s5a@$fighDhc*h;o@Z#Jj@#W)L1@LB8|P9YkB9qb!c zDO~AWy|6bifJLI2CPUJeRzAZzy;23s`sjmu+i?ZnG;cbgc)S^bH`Bw~Y!F%-=Yu=C)Np0-Px1&%A@t1S<6 zJY(~^`tmz}fsrG-gD-GQ3H5lp^(kZrNIxcxm0LD9ZCbbePh-ni*_Vx7U7YNSjR(;j zLsoBA+nTmngO(!YXo!mIOF25RP}|yv?sVu%-eK+C8{76A*|*8^BxrDlS?@cxZ#H-A z?LI9J_#0zU+ z9##-y7kc06Jy~eo0>k3))A)-KNTIsbq8LKM=3W?#86}DkPbUOrR0$#$rlF2?5uD|n zD^^}h>J!vdQliqxk%3yv&PTZ8q13HF=`Z&vQX9*UjR%%NVym58L$Pw6L6s_1jrEVg z?=aqRA8nh$6}q|$On!sVU`nH!fIsRR6#P@5!Um~6?jon)5vXAPL*~kQu^(f2kk(M zveOn&(%0!|RTR-H#qTUzKsC*>uz)%{gkoNWUM6n_luWW#r!&$ssp3_QaVBw^Bp~zU z=fIcO+;&5NlbNW2)kQb)2NfIE?Afqpi)G?mix3*0K0~b56;$F%lZ6{tgg{k2uWDtZ zY6Y=sEsm;oomxF%uokRHky-886`wW>t&(jKYAj8$Md+axQxp_R^{TR) zX%;HswVFz=%`|v>akakBEce>6gt`Is(gAbSJBW(ukh#a}K-YfQywmG4$Gsk6P2Fgl zNe-2cVuboyW~6+1RiV*8NZTv&+&$<&Dp(4YNwW$Sqdr}I(ww(r7f$1jn>F^XKL!ON zPl=INm*Q2ll3b0zo!oJSpwPK*&+oRMcfLvYRB#LKxc%7aCQa$2T~jTf&ASW70k5H_ z{~vW{0$*i$=lkb5OU{x5gg}5mfFOtv_C-(xWZw*+5QIn-0t88ggeJkYwYJ*2wYIf( zT5&^bOBXw}T7gzYJ8gBkOlR$k)6TtfJDtvSI&){Hw{xe4=fD5&WR~y3K<;kbrrl${VLxELZSOOGWIvRj)vJN(`1NKk*P^wegP?+$ zydT8`!QM+yuy_FIoMaXrb2Ba5)aP6}fr{_tXZ3qX#ea`6)*Rx_05@3x+B1kI@EQPo z`Z!N1^NEys5aj|O)fskdJpV-iSrV$F?hF*fs&kNtXQZm(#B5Cr_U`tTu%xa{Or_9PzW)(uiXU+WTHPvg~^STpe{j(-E%*;Gx zHau%=;#se6E&`5U!Wp`R5+9?^7(!=7VU?%&O8P9HVkfaM92E5!Agj_R z?tOayu|dY@Zy_1_F5_A$+whLgVo{gmRx{163_3Ksb!kbNJ&OL}-t5(zeK_^WG79d^ ze!aO?2@dGOguGoY2d=ARt`B9|vK>mwx3oE&GVjQu3E8O&j^_s(e9jLxN0bk*^J#N~ zGTo@JH|gIM&x9CEo=Xa&dtyyr3U1{@f{oba_dvtkk7PxSGN`C04n)m7QeqHXw zJx|KqodO7%p{rJ}S-!2Ysi){DVwHJT$wCS~hS%91;c>8aSb|sn@CTA-5BX%ly)0OLso-(p`xHWe#ANIGky9PV59BG`?#mntZ zmxg{0b(tg%Dbx~*)A}hP9K5e}f6I}BvIOs?Xe6*fPo8Jq+_b>+EW;G7pafuRQ9C^Y0r+%I zJ6AGG8d+o+n6JC6bxS!n+Wj>%FKf{5*<{JR2XWc})0$Q~H!fIm2A-(ZYdm{1Y-hE) zE@xIfU|wilv5m`FxS8cdynRs^h{#dTE#>5-_nxzU)wCBTvU1**7TKoCfp zFrpa9RZP&x-2-~^@0Wt3B49VmxGv{wOF#)+0K3FO4Y(lp&zl4^TJkxZo?z&aLU%gN zGiqvqs{0Budfo_nZ`cJ?g3gYB@iT`1R`Sggt{1?oS? zJ!b+YkBamzVa94|X1>~$$~#Tn^Py0|J^ z6R7C$CP5(ONmDK+m*T|w36_665yB6R&pdF{jC@;i=ZOfmF zFCS+}H5_uOzJ@iqmL0sF0o?#2=`t)*)}!gT5#nt#G~(q@d{^X$ZzAk24WBm2L*ejo zcO_{psWXmy8h69TPMPq!v39>3z9Aw7w-m;%p7aRO{lHN-Xdh*Y6!hFCwa}A-&5=zj z2CLt+JM(#?x{6M}IOe+NGruj8S&qb&ISsYAEU0+As}>g1(DBQl3bp9u@-D1;T-oOWx+k8gHwFL0TwV(RI)M^I1R<^Q3%T4Ht;ssgpY9&*2dH+}*0nyLGuum-p!MUR`e21-jeCe`|0gw}Q0cLcGD; zlZ9>f0e$(Uju8 zjW_RtJ)>Vjzl}GKrp;seJ(f0)>-Py~UZ6Zw@TrvfbQZ`>X$|JME)S;7XVOx=ZP546 zr4(4`DUd7)sn@Jty^6^}bE1a^DWjJ~QonNfmM!a-uU)-s%W5=HHwg}5SQu-Aj4wn= ziI|CtM&5H||Nd66xY$mLMVISF&{bh|(o?Ny*FCwjLcmw#Q?3l&gsxviSf&TAR3VNnrw zepu3sWoebzl)^lI#O*S+1|(q-tQ_8Bl4p7%f34Y+6v%3gN`o^i8r*oWY*QCssau_8%8${k}QSy8&p@?sW94IND za!#}yuz29(sE4zNkk>M6T^r6uJ37~{-`cc(<;(-u&RH;XFAm7p!XGsw!d%6p9m49M zI6no-a!Qx4BtD0PjubJ&ZXfYaIBF36u9$m9~%u(37pf8b~sJ^UYr7Wk3 z_@FFVcTjuLOoiuJ2{J!ygBHIZHB`WRAE1uK81BOscA1}8cM3+`i-fZiX*BHxBmnPH z_z57KExV_L;z6dRv$N%9J3yDomE%eeu!i*|Ub(UYzg)>FJ6DMNHN(CxdMm20$;hi50r%XF^uLlrKZHHPn0%LSKoJ~oVoj*{|3+Eum`>uPG z-*^$tV5Y#0&cSvN^ac+8m?JMUC@VyX>5F*2xQMtmf)E^yMnJ;-ilo**;D!5DbSC}t z7_rCzVa7sl6(mSRt0ASgZBI8$tG0P>;2T`J7}u#FOAU|%p-egLs3;!6u)U*cm9{A; z?cGpDIpb^s3JLgq}_T=R;x400W;1 zrZNjmV;-)z=es6&N_=X*2~&e6sF|DTiYRgK!$Mt~<(_e4AZkgnCpo|fk^Y6QK+h#e z1_jFcUv4jyc?JDYPvmAH2~AhILu7+5!E1tCLNgafMn;iWHj+jo+{8#*C`O5GS-||s zfrcv?n@LYU{u=vW{G-N>85|~X=e(sJ!?q4*so~>eFerSQ>0=%>lV$Ip$hK%$W%)nm zecVEt4-yfWiH|{n<7rn^g+8aRl4pSQyrJgIt@kgftI9rRGIdphj+x7R=EQE7-My-( z(jisZV-Wkw=`y-hsw}HJUu|(+&dbB;ihWNyyX(y9q4A&YejzC-YbHJ;uAkGV@Dnma z-a2>~bBDEc+m4^fF)VR675hOz4a-NvD$^|K5|3mC$3TtFWGdz|kc%0{wG7`jsM76F zXoooRZbI4S{iwZs48@nnkYRonY2~xXKfi_s$#-EJyoOBrACX@F3v}*(q8Xy)E5^WU zNV#^fDdLoJx1&t8#D5)3T+I9u4H6NJZ{zJygVs#UW+qI=wfh7+Yh*)YK1DFf5?m`q z$}}QtFQAXX91f4pA@du5if^LQ)AR24sy$kWo_+ORxJb97OmYVs{QZba?~W|Y3xbxZ zJxI&zidw+QAGBbtK9ZzH{wcKDVXzDp?*-0T;Nn;HdEVB2)b%08;lq)7YJz&A3l>a) zLe)V@^fgX3Djoh*gZA}tP)fFM!~wNRjh!~=z}am1*>j(W?`bX5-t}p=SHyT7bcFM`9Hj` zZ^c1F;+_!|_jFvGenxDc@vwaAtEDh90#2P{{+u@oR|Dr)!~Z#N1amMEJ`fSJRNU0( zO#^jJQ(YK=&RCQS>&l%lGy7NfTkJVfpXAFa{`(3J zB))3?nX-OvPP@^^0+cdeWfQism_O_k%r-LjQ{dEH2PBM9(<_LTS2OD?spAlL71Z`A zNvb(V24S*zn2nd!Jh62<`OV_8!h2xR;=j^VoFN&k4%EJ+@8$ln=Fgb1;(_RGLQFY1 zowxxzS9wiuUd;(D7xIZPkciL)0J6E66hSZX(uJ7#Vv*s_Xo^AC?cw)EflpuYzG zdLv=IakU);tq9EvG0;3(5}^kI z?g?EsF&KK{q0kW?RwH)wVZaXL&Bvq>yd3{?OrrJ!ar#u_mq)$K+s^#n)abMMFKJ8PQ-mb=Rd! zw=RTp>yTzdgSkPEH&$}mpbv4#+)^neI+P(YJfI0tWp1l91WwZB_N=_b=EOZ4}hK<;=`#A3ee{*&_|v7&Lx45I=_y?7mSe6lS?ofd#^ik zRPX6EY3TWv$Q>+=-g8VLrGitGO&>BU^NgI?rPLD2W_M)9fV3@g(Z$$H6{QqwwrnGc z)-?lA)_d!v{Ta!kQo~`2Kp(}F?@xKY2oYP}r^yr_3Wj3Ak7-`>t=n zUbd-YOPvh2&T%P6F?6>aFdB($Cy?#x3S*VDG} z^yrHX2C8j zbt1#pDllNS;I|#dM}B37?5T*^P2Ns*;WlTmRNvj<*k#TmtQh1x3HDESFAky}61=Ft zp`}ZnV{=0GSn-Q=^HpwUh)+kymxx(+L7_3*+PjV%K1|^C)_t4dxj8e~NXsT|Y1M+1 zk6k&Z&8NlPZ+*DZ@OQgJ980V)Qs%`Rh~-N;m;f^|cj-N_eFK&yQJpt0hVo$Q>}ogD z`q5?9OWT0~gG&I}lEw6qDcT2=Iv8AM5Wo4&4{iYdq=UJa0Ug(SrlTpqlSoHec|+)Z zD3uzH5WaFS9Cl`^83oRA6Ih;Y8qr=Ty$h>o{e6OB*}(l560s(jp}< zzgYrE#BfD?*cS1VgR?&}LQMxcJ8qB^++ktmjW(lpWu-mpYKBS~mN|B-Y!aqJ%VY&? zpg6=eob7%A|L&I)!2JUHNxOi1xsI&TY2n^;l;qzphWz#H*f{bU<9tbpb20{gkQFBs zUy!Fv{402Tf}~FJw!%~C%ShzdK^8*G;uOy&i9MFW-BlWHZpeEb16NWUTnf|)Mzw2- zzOBuFTgYz>O2BV6m}`3l=93H@ zL-UG}+Et48!==+zbClF(6ptfZvh?E&Cc~OLe&(HGlue|Q^BwbR8O?JlPZkXtOQl!*u0J56{5O~G$r@ogVe zF|77CW~i(N3yVpfP{V=FQJBe+3pN3o{`K3;qTdt7{-ek#zi=Lyu{42i;1PUgrQqXFo#Rc zCc6yJ8OzNR+OroMQL zLaiskfR8hJngRJ$OuY&_{L3cyib*B#hv(SBJgAFOl*@(7=s~A+$76oA1?efrciQoC z?FQ^gFJtL#a-H$>x~f;h^(Jh1#w4qkL3Z=!O6KIEnNwh zYrENCoAa|V2pF{)?z&(?W6+f(&A)~v9ff!LrcU{93;CvnJWNKSIWhQH$8HhtS`vW2 z-6Uyof-23*8YW(|g7jo!bM>T?=KPm)J?J(t#^3OK((`Kc-r%mV;35 z51O|;C{x}sC(FPpQY=!E<-7^SVLgjY2F0e$wfWvoa1F$Uy841sX3Dc>s(Nh;189Cl z1->2P3+vc?JCaCoc7cts&{js(>%{$gxc#5s@sm1Z^f!luy-}+GS1m!??S+2n`u1EpUQp+I+^OqnNT@AT=kbdzuzh(eNVoj#wHzJA~|@Y5;t#gutkMo(W# zn`iXdqd9Bj?wfTYWewfAmGvWRIr}^8o90pD`KhkT${QaFG>HS!j zzt@|eq~$yCkIX-&%uiG1pTwXF2y8J=d-1Ez&3Ozk)sn2oN=Fcc2y7{9nsO8f_+nDH zGx%tI3A!PQXOpzzfK#d~W`O2d5;8IfGK5XpQvxABS2b6a!r05MN?O%F_93Ql`&w`G z3YFqXl~$4JGp}mMejj~jORH}pGusJUt*z5LQUt`nek#`9N|~Rf%s;0T(2)iHBE)H) zkVn4)_L(nf^^F)D@uH*}2ZhFubh3^DKY{J7-LtlBY4me+5C%bMABj$zg>>s$m4?(o z?~B!0cn{GR_J=iv%Vd^KO9IDxk}U(ZOT~~%L8J$uPrqi1&&cj@AU@pMY~!9z?Ak*6>PcQ zERGUsi%N`8m_Zv0sw zfk|;!H?U=Lua{+9RsIf{c17Xv{+sw%5tjXqw}fS1bl8To&_@=15MXa}4s`PXA)R{f z|DLS%NkMfwI#+eHb}2Z!i}W?3^oJa}1^>n|HS^k=Iq`Dl-&Icu?`r{^>2BH6cH=A@ ze74 zTGQFu+Pm5PVQ#Cb?<^4G znXsnm^7_M_9k{{V+i}oIMQ&=1NJgYcoO7!qz@1X&zjEev7b!bu&WJWFrRp1muAIEO zvs1AE547&RPJM0FR*>Ufxh4&9r$zNCOGMq6jfYhQ3o!_Wi7q3F?${Yn^mh``K3KRpks~~qejQK@ty~ohKE7VrC5uI*3 z`0UFuI)hss7raPztu_wPr7EyLukM|}xpXZl4I1Bj#)Ea{t18Om@r6FH{QD(j>5m3_ zWX|*KaRhNC4(-xtPMWxLUE7JwSq5Cgjdyfkcsy87$h=>P@k*|EwrQ8el z?rh{u9-cZmLR6NLbviM@cueoT5*%8v6;l>TA!tBr%b~ynCwlU! zDSDAN^<}Dzlw0ApF6cj)Ayid)DM-?7C-^GSwGa@$k-^BX8aEj8qltqNE`dKs$pj(G zgK!&p-PTax3yG`e0ZI!Ol|t@I2n3_f1@kn05?Ch30u##&0ydLW_>*X)ZE)(G zV!TR`y&7KMX7?+ddOb@$-k{K1>&&5Ja9EAKi<}Z9-9u2E_)+l|3 z3I$-9|=-s;s=Gk@!KmimPmHs7;{p&bMiG4@$3g5IpC>=++LYu0o9&W~C%C zC(W>zWP?sIHJe=6m}%UOe46{(=IYV%q&DUyL^trIXT0Q?$KB|DkD^`O*f`h0irmh< zH!@#?yl*Y~-IvqjD{$Vo4GG|t$Ypl${VGOdCw$_!!K~a(2`y-w?xBRe=xFcbSZgJf zf(mAkv&7x_NSqelO-F07nXyZdyE6ECJzUkRC^Jq8iihuww>v_hH2QvG~9$@?=AeN37F54+rq%MG0^zaW0d4#GETZW zhWL<(26l+47!zNHO8*p#h~RLYTg&et17n3q)oZ$^8m6&8XM2}) zS~!l6k9Mc(4#RDA1{0VHCa^I4K6a!p@_t&X;h#kR=ST!RSN0H!XIj}j4ME8~35EGK z|2cD^mm8=)uS5RmUxiO_(bG>XGNvkb4mY*ZX=V{?njO7=Q6a7A|{9>eqb@{QZ!wsSw z9msc`Mo=xRb09G~mP%hdmNDmB(*wn}04UyxJT3MWM3LA*D7+T;3!P-x`iF}w>hu>A zkk>yhvS^kyIid7i+z0w_hd#mdSIi}Brp3q2d2Wn4szc+Jj?7o0-?`3D-E(mvcFK*`EVE$6(eP<{w#HI8w#Xpx=cm^d{^ra>%Np9eEEH_;Cl0_5*jc&T|UA)-bJZEaBI@;I06Z{voo4 zb3sMg?;i-@fphcahCc@kxsQ?y%~1N{HT+>}iveTg=HsJ5D-``!eb2a7oHQ$XHsNQH zzGiy$Rc}gF@&JX()1)6@;UKC+=5}n7l{N_eTj=P&MQX|Rszq;9i|@e4aV+@>wwzxJ zQQsjkHC`u12-9aqicMmn1Uw}(zR5~twtdLVQT+%uT)yTBu1}JYt~w9S33 zB(K!h?Yitx;$~2#wAm>E?At1ZE-2xyO5j6_E_*$XGr#J zN%7*NSL^!UnFwVZkiUWPfhaz&-(Q9e(Nk#3EEfq%izPYjl~O%SOP>@Y$qw zehIjh%!x?!ydsu*P0vvZblwAf_T~L?c!1+(cb-TQ{)QZgLqiUf@_czazd)vaTvnLn zft!kDx+Ai9f7HTfikI6}f9ME`=X=l&7caYYpS08i4e@$6^Yw>XyAO2iLqU9wfmwe` zPF7es47#RcWRc^*zbyxT@!oTLp1j@M0rC(;Dk`O5AFwUY;ziOkR=eN{iLXjaLuWB^ zPQkgY%LjDgE>4;Ibl!g0nkD_*V#N!)hy&?49|N)U^UHf6LJFKPMmbp+j zJd4|$(7Ecl#nL4;4B$eYE0&UYB5t#=HA{uPkR-L2^lxzS8+cnjpo`b3_VHW#?Z)!_ z-V30_c&RSuHYae^QzTy;6G%TxsWHC^cI!F(T12?9Zz<=IlY9brfz)9uz&ZdbT#ew0 z`vtVPUm%YAWv7#N2KO;Dv#Kgk&`$DB8pC+7<;!JYNg^?7MF?8R!Waa0ym=aa3%nCa zAzm>kn$QZq6NIV@{!lk+g&}!d3$=4GPbzp(Q1H#<5_fA{q2Qis(kDZglq%g5?l)5U zO`t9}LulRt;`UCgl;7oQ@`U@ipeA{}Q1{jJac%(O?oLA>)onT0kUJ0qXU^ltaurzd zDr%p{9jaV`V+tXqao06Z-P{)G(y*W+sU~7uU%4g)?Im4BuNW?Mz2!kq<+oE9xLg=e zY_2e3-rdC=BE2F-r-P!Uau}3>esYqg;5Cpk?3c|T7Zzf0bM=surs^eWx#}f9Qg&56 znXj0k(krj#zWNn2L_bce^eBEW(A};$Zno$h8uPOl^_Ys!J>07vwM=C#9Tw6H_uO7`3@jOClVy&^^Pkd7lmGu+sS|c!ZRXnQOtx zZ^8!bo#t^S@d>^hcf(Lm{&z94E759tltHa;WGn(Nh>0W_}j3CgMC4$iw;Zmg3ECDUah^^pikLlp2Zz@7C}Kljc@I zj|iYqX>`9L{el0~f|%fo1oSiuLM(=6LcqxV0*Ckw=>>7`MKQ!+MHr-ea`P(}RYLt` zxF{cK$S0E^ksgzs%4Z+=X99(u2hukYY-N%oGK9*JSxg0fb?1HE>uweT$r$LH$C(Ga zYUc#i9tf%(t!k+?wXuBN-rLt?>b?N#U<&f*sdTp?Qvc|D{iB2WGo&h2znlcB+iwf% zuP*L(i9XA(-VFLY)0HT~%J;cCUuSi`&(%;I6Dc{`XIa1cIzviC$a>-xM};I#csFB; zMi>%U^B@=ILjo;u9rUu6AwgveNQF#ca8V5lL4$n_a=m9sA}{xe%n1n|vhr{TDHjBP zQ#GC{xfp)?qDU3PgDRqJznHdT!%m*ilUc235n7F0bI@@!s8JEvhCowPi8_#5|H1s{ zd*i2V1@Bh#ZY9bOtH9~kxGE(H#_~09%~~7jAJo>Slv$jiK)Gl1^^1^I1+j#@z{T8f zd7^D&qz`hJrFAH)vfeGH;WT~_!xFZ9=-FDnjh64AH$Ad0FE zL{Y;;ct-nhwJX|FxQ;=`chS}>Sas@kE+Cb3x0+$pEGsO7pLNOJl?t5@)I6X;zhY`E z-Y`b=tfnP0R6~QIT1Q5_@gcd93X31?I#(RqHXlz+%f=6PEz71cKe*yW=wEi28F|W# zB3_u6(-hK=p>*jI#8B!OtCZxx&KZeJ4{Ggl^di5UGDd$}NZ9)yBJ$sOH$WE%w0(tgcm@*ehavqiJmD_XQ~rhQf4dhg5OFQQq;MS zyeNUS_g=dpfz*>`ixc;)hdyzjp(&NsR9n~TLx&Z%+LPkQQoVDkV!>LF!>t4tjHw)h zqP#btbL?|d4@8tB-r-KLGI|~B^fGU9eINpiLJf56l%^4K$ zytjk#1zxb2%*1$>FAp%z3i*0Sd35tUGI-o!FBrlOs=bJaH5D5)$*G^&ejLRz?oXKPQRiBKyULg4BS9)E zL1NT@gl`pE)DCXe0U~&qZgzp39C0lYLO7J8xq&m)s@9-wiaG4x2`L$D5@ScKOPLw3 zi=*tFrihs=B?|?G@MWU-p!^<{2maBe|g=AEty9!(q?RE%DA zzQ9XqgbEzgz+lUhE*`Hp7!W7x4!l|qdX|Aq1X@FL9hs)Co_t4RM8JZ6;p&yJCJu)a-!$N^WX<`@zYcj7qj<81T{bG*p{_p+elX#<) zM@j~N;5b4Ld;q@faI-9>qaB`nhQ+>8$bmoJb;iT|Uz;}TWcj`#ZPqKrhLpKX_U-78 zN=-vfEnyB1F_#n0#|J`U+n0b{y^fx<2Jv)w!Ir?P@-084^2c{Mm@y!Z?3=b1=E)V3P zXYqSh7EdUJS%d1FHM&eO3e!XB;+!Z+ote&laVTxx#;VSYm0y(F91=(T>p}3z-5u%r z?pAMR!Mw^VO6>3KI8)Trnp^0(!{5e=NV?v|EpdXQd5;+deZErcU z(s%19)qkZf+uxLN^E-<*Yw_`9G(Krn`JUVyoAT2yN(auUTf z$NY+G!3yPBSdi=)goX@-%Ou71n4Fl4!R9d?aq0YFUPr>Q93kUOJ?}h*Gn9&S+>@Q7 za}oth+AoY@GJh9!Z&+cCu3oK1EqEWZ zL<`0DMlyN^s^_CVZ5 zrA$pq-m?beaI*-J7@4P@{pnvCL3oRCg5L=WP{akOiVmg@R_Keq4}VD-xD?=y_`pvk zpkN)?N;1^~U!f0tP@u@04C_VS9Vih_AhY{*_7`BzWu%bwb4Y=!1s5v_iCxVH zkK47em*39)bq+jv+-?Zxsn}>T304(i(TJfIbHGdy#w_2&1B$_+$e^DZUl+@vb!(f zGlH`X5bG=A@%&D(ymDG^F-3+gVd7LaP|2hsnO|3TNe5d#qQzbxF805bw=@{u(#j5^ zDO|frT#z2joieA@9J9(riRc$l4nj(}s0O9b%^Y@vtBAbP8`$)6cjY#y2lZ=O+79CT ziJesH<$?mw=i1hG#b#)&kEE-=w(a`Xb{7Dmt^F{vD8DW1)zo`(&_S5E_MIa&zfhS} z_hva&y}XT#!acOqH!WYWeus;ZiYp?8({}!bLcUU|@D+81Qunvv%8GcdOqSzW?W3WD zy5^u&;oS#X>m97|wnVbSxl|pwkHr)i8U!b3R>N{I?X$dRp@<30%yBOP}e!8@yp%+O;YhEc4vm@~%|(`1f$qTfEv z29712Z6|oqT!dyTswT8e>ScV>J8Enx#a$0gA`2%PQz(y?I+ojjqZ&jkVfwBJp4LJo zU^O76=opJgN7IK^9_XCg-L{X3j6lV8EnNqYmvc<|b>*fvcnKK_!0KVs6c!m7i@ZcN z-PYcHWy`@MKnSq$^(phoA_8pDl=Y=mp994Kx1qf2yB_E*%{%bBqnP4{)^N_uD?#SC z(Q&3;D?1Jy2Ih3NqFV|u^IEMmb53uFdX7x2<`QbDk>M@&q*QTT>rGoVD?^L4CV55e zXVaA&2wB0#_H0veJ%!zSA#63=Lb0L5uPPWueF{22*uC6h1Q95lVU!nIA2-7{Vic3| zY(=>v$-X2NxC|KaC{R;xR^-Aw@SK20oB^|}0gE05B3=tBE;;#Bs0~@B)RVpz#B>2h zEMnj_z}S;LmG0Cw3yUvs(GHD}QV1quIi$=Iu|H&%8v;U2x8 z>MHZ3LOQ5o8DAY!hMdb$IP)dtnZeGBx|h!SGG;`|5dTrljFusr9&cF|;cMoas|Ue^ z^sLuHd!!mEl{U3G8)?I**8e?x zP_d_4aEvrWZkJv)7ihA@L4|=@U46m~Lyurs^>8i(VPME(sNB6&o4}txks6MQY*Uz2 zDNM?jM)J$1mJFj`He*hhy1K-^v3OiMX~v1BOE^-=D?O}bveq%{>zVTnO!G$9(D}YG z`E}94H?0dAC><@nJkrjCFA;D#UkCyDeo zm%rZNwd~;}5~GSluop2o0%?&K{hgszmPTPt8m~FMeac z#C^Sv!m4^o)MC>=uNx%CM4lfk(^eEb96W~Jh5wQ+9>oLmMhyD^++zI+{`8|SA^)_; zVBVbp9&eH6JkB-7%DKi^+4YSzSL(7|7o2O1HO;zQr3+k%$+GbqW3JZYH7T=8E;qBOIolW`{=^v5mH}!~+A@_!gcZlBz!R4@{VQk+q}q4MxEV|+ z?vS1Mo>p8J_&}ubj{R^vFcM5PUEb2xxnO>;NxE=niBrGq3JXf%;7v<6aTmqY5Gfh9 zb+vZr9<{V#lL!~l+S%RK(cZPHtxJlD;9z+!a(|f_AqV-|zTrb2k-7xLYd}34FatTl zcONLDJ+aG8U}Be>!Ne{+io!$jgB0Y6Da-#OAUw= zk+V!KXoy5PuE0vlElxNLOcy4eC!Aj&m;Mp~B3xSi@VH(V4?3)t1 zHMZQ5N<-~)p29Au@fC9b@}p)`ajqGsA3QT@Mtr_fo-!lU{4=s1v)JT~+&KNqW)u(U zV`e(H(xT2jt`3glX*5rnCyDGAe0T!A>ZgzY_OG0pvGe!lY2ZzgDOudH*$vFqW#(er zh%?rW=1yX-J!Ur(v-fgy(rz(dv)jy{5Yp`Xc8B?~ZN{zqRo2>_cC>w)oolbL7usER zk=^a)7;PP^m3FBkSig^gxX8{pftgxER}!okzXH}W%hOF|W?a>jNwYG)H4EfP0v(q# ztoZ~s6g;BJE2S6nYePUfTuPEdB=JUYdHM161flH7^sjoDBjAn(zF(g;g9>Zak;wK! z2vKRk#|AAEk}D!ChQ|mQgULJHWYE70cr%t?Q9;Z2U2b})$o#>gziVq`5$aE>K79vD zI`8oZ)dRtumZeJ*zLygt@*5OUl`!h7|fMnjwt3>s} z58XK;x>e^&1%L(Qgu9qQZvgfOQgBX3=?v(d#QUM1(tP&}m8;V+29q&R92oA(5v|PqFB<&%Kl#7i@27VCEg)k*hS?D$J>b)1!Kbl;PvZoi#;4>* z<2>fW5lzyWk5az>zkq^}Uh5(HKTBM&Uh69$-%{W@|DVGJ)cA6&tI8Z(V-mV;SUvT3 z(Ub%Wzq1|AQS5d&KkRYLl=&yO%G%)yH0gJ^v=ybRDBRK;q4nJ1L-^*I>DwJ#2pQl* z(YVoz9J|h!P-=(w%pLA_ZzQm6=@j>|l+)jH_FahO zx$qbVuLc`JRiT=kV^3vM1`>Y&+#6>#T@rQ;kC5*99t{i&Nd~xwFaoDb%`a_s(8*~~ zv+D&_hHw=&vWt^moc5XmbzU!$aYQ0-pCZL-ZxyhVA}=NLGCNn6;ec+_i_8Pz(|eUR@5&ljm>wrV*|m%K|&UqZvx z^i0FFmz^1n>h}7e{;;?tQnxHn{kUhCi3t?p&2GiG0a+v8`OJeCp(J6U3^zUK%jbUh z{WJg2V2u7|ld$hVz8JXMN3*8I{5r$sH@f?;EV{0*>+y}0`E6Da*U;3omNzy=0vnIl zt6er>lUZ9~QyH7K8Qo=dsnjKxvV*d8_I0Hi%$*&gOO*;5sxqomic{TUho@|fgej`e zj?iVKE~9j*)n&9UW0a4|>g-rTPFwKHMRq*dEOFeRh+8Za@f14|tyViJWzSay99GjU zht(82MVY6jY=g{zUgu(`rR{Y6(wr7MLzkHyja@il)Z`u+`oa#ZEVFByEA3qmaWaN&f6 zk=$NJ?C@rI%&9|{J8d~o2T=)!w(iw+g}biinmmNqvqisKuWRGDOB~wT`VI)FosrWd z&mcahT2b_bTI5TJ>KH{iA3>p!YC>L!PM_4qbc5Ph0Y1hhi+csUc zYwhyO0n>WdxPH}+U0c_!UxSfz#UaPl!St+uj1-rP>MC#;-X#fP$lC88YeRy75IZYA z=_xvt;T7p>g$!+BR$fuKpQ6FoepX9F=44Gt9k$+p%gx8uBH!Cyhpo#+qC+jS1a4L; zlM^#sJ9m#$L`$LVwR62N9Z!gc0=$DRSZZu1ADneJ@!TYxO~KnVDd}l4>E#`Ilk2SJ z)A2n=kh{iqt_VdQ9qovJ%Nf89Tre^!vP%8TdDjK39J?2A43_Bo;&?M?c=dhQ#bK1Z zG0r%$SoR(`(k^lKKt75m^APs0z0bx;VoLi}q$mH&hGJdZ&Td2xzg6m{Q`9 zaI|8ZlSK|x6(A--{8>#aS~{<#XN?@fz`&NhdjZ~)oMg7Zw+&zae=D|(=ntHW6#FCd zy&Oh31k)fqt`x{$&f$>|C{lv6d=CB8l--rHyKRd~c_vUU_>y@!W%uOlUb`=4TXS~5 zy*6bJ z&u=ZIp&Z2IxLzH-Q5ORDNt=PoJ8>awkL2Kv@bD3PW6s`WZ_e3UEHR=>48qyK2q4^r z@=!U119{fmHbA2GbLR6ZgHR&R+jr;eZRX|j#t0gk_pq^McJFD+5&Mgwf69CzXWwgY z&)GXHIvFJl0qpxVrgz%Aa`tX}PtM+}#}AmV>+yp*^9SbZ1K=U5Kq8F%P^0>UE)R3D zAF>~&b*ne6TEcggo4iC1Y|~4W;UhWRBa!x~>=E9lJ0gOq^Y^FhM|1W8`!N?SY+y`=93dT+d- z>{3Mb)K@pcC5kP9u;ra3E5$@SS3?-t`JV>6Sd=|WW`P0 ztsZwGk=#K_jh#du!75I{X;baMN%(qmCuTkH(i+z{H8rl@#R^=%d=rM4#hG0y@+Lcc z@@c{8S5(R+QW$CxQAd+X5TvBHR5M~d!Y2tipz^wviZ&+yfH9kFg?`AuCf3yjTR!6T-GfoGh_N=Qu6 z5iAyPT@%FtdNT}zH_-HDE|o2R0Q3fk*v(DrK;LfvE6 zjxg#G6DXfH3GS(ap%>8C5^_sLD^+-8!33#Y!ru+Q+^=v4dz=y(C`h8Kqtj7%QCu+? zW%|Gp{@v-e#&L?teET5+7+ubc6pVTDkSy|=4R%4^Quc!7Dl3q;d6m=Iyu$@0qvvlG-y+ufY#t z=v-+MCXV;@wI$j(3~D9Kyo%h&<2;&PWogDJ?Wa4BN5D?i1o` zCvmS+(JW`?Crw(KZ1|S+xc2U{y zaW6*tepm6wgNhIE&NI`CD#iw>T&F+gLH z`m;iPXaya&@1rzH4t@|{I%Yv~bWQSclZ-!AldP_M+@z{27bNdUo|!)Oj<}6)PK>S^ zee>=GiJC;BCaK#`nxXDfO=9yM348p^KUHN$SB>;ZsxqYEzGs@BR;?dhH9SbOo;2L| zN;5P@qM<$!_oU*XXR3c3T1~3KL8@w{;-Ocnv4xf6Lu}u~s=FDv?k&vPJ7GA#3q|Ey z5l_6EdAyCWe2;ks?c$y#Ac{pbj>+*B zdVaa>tiwUin88>t;hkL_iec~@`lOJp&s}V+yCchQl=-wdPKpFu?lb1IG`O(*G6rNn zs7t0fTKBb8>5`QV{X&n*K1iSLLl*U+NM*G_WyzA2K^g>=eUM+R_36)>YV59tHL|IO zH!pd}46CckK4u0@tGgei#_h+?{H*R_X=>7S=k`4AI_vk`N0HWl4DrBoBfRwu)T?$cQL_@iV@W@n+@%vAjJo z?Nwa6IUvAZ+{j#Pnm!|*BHY$?MN}B|qN#lj5!mx)3|&Ftb*y{)93j&5^*K~U{cnBn zJ0bXu1;6L%^MX{3FZhI+xINyyprUy}QX6c>=_kw;Ginm^j+#|9?6!R`q!*=U)Ff-u z@!It1Q)bfhrnb2@ebSu2D1-28Y;C5d;*^*vhWxax4vPnhqzcF4+bYE9yKGo`t~o-_?x{qx*>_ol@cBx{m2=_kximm#C; zi)Q+wY8*Gq=*D<7ZwA%KfsLR+FK{ zwOO_KjwGL+3_hvg7b>4Kvs}UX^s}fyYO1snUD{bS6{_ZPSLolk9?r&ubGAUVUoKxo zo!PJ*lWfGn=97q^J_RWJG_thg2+2N!HpFMmGIqi`_QK^5N;_DlyICyz*~Hhe9^S!< zcn<{iUFOT26VI{jPmt>*|D7Tj_*V%0{fzlzLWKX25aB;HFPncgUo*coe_)3|aMqe{ z*zx9@c8Yn$&NHvti_IUR==?2|V_&gXn(x@_Nb?T!J^LQ>$MyjfWk1F5=gn#RCG+Qm zd;1Hwq(8wb{0OalmUgD8c>?VK>{HfAcidG{;!tygN9Z0J%`)U32 zyi2*QG|%LcXE=h`O)sR(iz#zDWnKcN0o4A>Y)TG(9To03*kw3%ZTPhrUHuy~x#xy^ z*>5;!6ePM$FHs^@b#VJ_qdK4BIV&R*{==LejtKXe1-HEzZQT`Yh( zE9y6>BWg^`vRn8x^?4BLv56l=N=o-CDJJd&&_syB)#MYvtfQ4<0ZxBpx#9n#6IFqD@OlaLQbo z*hi}P=GtUZUx!W;U^rox@#VNlRxjrRvip-}1veTRzk|HN^Dk({f1t+ne*y0QiA4IB zC|CaqL%3hFOMc@z<&Vhre5cyYtFBWMF=kcwq&~UF{2^;6P8nCRbNmt6X1>h<>W|2; znzVGdE8KGWj&Vn%ksIgloB_=VUi0KXBy@nL%y&WO(0lNC@*k7oN4_HP?eP^U{wEz4 z*z-f&9m;1w?RtI*vOvG|D9dM|f3P(DoW=i<{-8V-W2>xmkaX3?_)@?v&~utlq7!Cy z^Mb^~CR3A$9kV|KuNuoj8h^};nBFiA_?lq8n1|=gn&bBK`c!|+G)feI!5?W8K3hJsrIa-LFkNVXvBwa>m-@R>364 zRd2ZUs2Qs&CLFWNqBXcQG8|T##4&Tr*s6+Sb}ZmHY{sGtXH{B5}{rPjjS&Eb*akV@Y{EYCB~$TDGF zO@;5w=Yu9BkC|gywu8g!kDCm)tlvcyV^haWU2O%8c+}kDa=Qm#z}v@GVePOlwjfno zQQdgLY+R78Ngp+t)PmG;Q&*FI)QsfArr^UvOiDVvTfKVJ%;LjlHS+QW>FH|jlV(UQ zO|4109hcR;-$0C(=2DgvIe*?B|Lw@>g?juoM@l0lk9POzJ1zG zw$Ixs_GLTOeuonN#m=(-mr{Of=ek{e9|k%J+WyDv)-34kK?nUS%ufinBy=}rer&FB zr$pNPE&KaV-05^5@BUO@?Z+|FR=Tvk7AEVT@fBDG!j<3ubaNw`F`;|$i<<%1I zuHW>DpLmop*2IFHI%e*o^fTrPKz61MyzG?OvS3hc8jR)iqh@a1GiK|}{^@Zu+}-%6 z#J*X_&0u%$(#%@OdaB4QtYD+%w3BKEJz*O3eHz;*JJTV195_wQi;}OH%9>nl^7QTn zxjVA#qVLyW#{~LZlM{ZHh?cOUTnQJ)7Ywc$Od(I0nIkG{lQn}uvbGUG>_IcCHc^wi zBWE2l=f0dYS8lyyFg5*&tM7PiB3_d_Wws|4fDBgB*4z_j1-U9!2EW;SS(ERmwC+Rj zcE@vONA!8yb7q?>^TnD*$DR~c&Eybn?5)3)4qv*ln2Mdmd1g{Zh>p-p!nhExhx!krBAEg5z za+t{T?*NE&m^+bM-DkV;$#ewwN7p0MxdGJkMz+OG=AXI$Iq!dIZ$_i*oi=CR1!%Yx zknnEovTn1hd3Tw;-ChCM*ooBUef)Q?y$dnM-S(T@{h|GUea(K*{*-tBilpT~?EUt? z>_=ls`#`LL-`V!}Vyo=OV{5FZ&7J~H-N>f?0d!*p+=`(NK}~`-&vW2oFlg$f!8;Rc z$^(cdiFMdvdMD}|h{2tx>Nx#+$@~pyZo+Jh*`VZftkL`r^FKj&hs0I`k{)AMHrxMl zKqzaISf>ent;93>8|Hs;hvWI!V)G;J29c^6WCX7!LT+u1sXJqqnZbYnUR z2i)+qA(1#kV+Ms^K}HH6&v5?t`~u-mwln5}{1>p|AXoUUT&{{Uv@TrzS~Wns4S z!bb9~xKL`G4$Oxsra0lpiks z#LkTk)8jLzCuUAh&OBk>rX}ld!iM4n>W5gr7i$8|C1q8cV(=C_azxF5q}D_HkMZ#b}`z!NA8t zCrz}UMgQ(|W`TXmEVW-SYwhowE1=by?9*nOeI}0sPbI(3G&#;5X8sYXFb5K~V@9a7Kt1v(3E=D>3$Na(%FJ5UhrPwxdYB`c6N)Y*C zJZY7r7+9HP{tu`CPX@_LIUAA~G%{Bz%y{WWct)rip%Xt19r1Edj(2-Q;nmkZYp$q1 z@T_U88vLx;Dss<8cw7rvZx?}wTuiOMB_EmDvD_2*(H))Li)|Ssy-V4_xnZGx+cA`(yBCi|8 z`nL*NmoQVa^lBQO(6OeF7ZNm5QCtVANe_FrQp`ykRAv)qZrTjj?>u5mB3N9veCw{J z)mzX$T;8;K%dQoTn^#_jL3xiVdntUbETOq{4!w(>-9Sn;Lbb13y}Yq$UGuKS9Ia(Uyn)mzyOr8FP=Uu%UEC?dF7gZckk(vPyLlm*%4_7Y;N zQnvp6?@o1N$KIBMSGIJv$rz$Z7s+mL$XQ0$Hm|N(T9hWqkJs0Xs=9imx`@Wkwul&R zb^DP+rK~Xe+nHWQ8RN_Eioo|Z!N^$kIYTsslv#)evod?Kd_g_erEE1W%9(mIA-D{Y zIqNW8hKm^Uz80O-RsBX#jdLYM@GI6h%*&QbDCeAGT+oe-u9lT@=@9kI7)U*%l5Dl) zl4Wz)*RnfHEUSePh>-@rG~E5tb^zXJ7$Y(pNN{Kt;LMPhf(5vwFK6Li z{z1xoUGCVvkuu-R!Wev2QOW)=OWJQ`L0G?|g1Kxp-__-hvhbn)I14HMrz!JiY4hh; z7nr}`tkOT3AAH+~9?h0Kdzm27AJY^FpNPu%6hN(mBNOX;&g7>H=8bHJ$9jLY+iszLsN2o{S z^uGrkT8UGx*7j}(%K${-^XC2giI@puhPuR{L+{7QCXFES6n_Jhj#w>D5r$317sj>6G|xsp94~=IbFfnmkJb> z*zbmYa9$rm(?F&otAa3Ndu#WsZCe_hsX+WlCtfFleBlSDz*J^mmoPU-&@!h0bvgo@WE>?#>V|yr;RqQ#kf4^p^pkmnA?udwrjx^ z4~9vK9V*2Scd#z1Wb^4AzJ|-E`bc~4mvQI!jh3Mp^y#uw?FrGfi`B9mLFVNduX#cZc#lxu6>e-NMCLBa|tp-I_h zNTCzKr$}GJf{OYYzV!8?zQ_2??5l-CsQQ-Kql{aeQea(he4~I9g#%&I$|LQETlQXu z`qP{REMV7gmPO(9yt$g71Fd_ni=h2@>MRuN*6~||KW5eN5YPmgL!ly}e=SVCyQ911 zpc~JvZ8x`WY->N#wOL4yOkTW=N{WTr#W!d*?K&l+bDb@IS&Yta!7VNA`#KIScPj0! z8$j}utw`Ba%BI;Itjd-{AhE08aioPkm|=L_z_BpW;Wq}WtGlJMJ6yU&>f`4|8u!aR z+z!*6L$I_n2XFdn;zj7P%k0iU`0dHzz;kzb?Nm1od6<|ZG;M3jW^y)bajaP)?w*5U zA%sw${dtjti-6YEjB|h#KMAe-e5RDm&(>BnMaImXsY5c)Y{?ofO62ow8Lq zJJeZ8=HU3(gzBkUkDK#;y{)NV+0x$Lf#-T`r4(t|gVOpvEx3Vp9@DABf?VS=PY(9) zDX-nl3R&L{UDf9E;kX`^vewQ;^*N*rqjagwA!isPAABE3*}9w^%Xr&yDsyx}p?(YS zq3uv>q>1B$CbGA>>)SipXRyiuhqTW(HixvLK8I$~qd7Z4)9O^1A2RReFvcwK5MIwZ zTkEmMs_)nzbm=j3%$iBt+FNft+`6}$k_rH$evgjD`hyOV`o^CZc%y&Z9LpgInWVZN zX0hhreNGNN5;Cwomo;0XQ^R*b4ta^}M{{}1W&Oik3ga(0%M9f~CEfEpwL@EB8BUz7)-z+_(Ql}{(zqg}uIuhT z>|Z-q2wpck#0$#t3c{W3GXgF9s?{DLB{#N6FE$R3hjTJeeSIsnsf$#AX(&giw~1^4 z|C1xq{%RQ4P1z77Kz)$~1>}f&crjfZ)Lk-GM=5O24=Pbc0Ql|Q!dzBwyu7J-*V?Pr zUmmiHdIoU`BD_dr7=$1U*;iMrKHjs%S%(Y%j)GDS2V5$W%s5EV}y-_+S|qZo0k9XjTO?e0 z9qru7H}_8W%K`6xIpf_g$GrRHq<6m@_WV}s9OqZQcktBA^#D)DU{i=`z05@cK+_6& zmAqDPN$3(pug9BZN`5WVC?sW2NXkBkBS$nab72Ori_}I*b770f+XIYQDBL-4Z05qH znTKZSd|3Y%!tGc9%V8mJm*TJTQvO@!G_XB?ei^LmgXE`0FteL!rCQrg8`at;DOIgq zHGtMCSSXD7!9nk0JzKo04=r9zo7cchUl(cds(g!A!D2s5d*49|rPVCwAp6lO_alvf z#kGCyfZ9Gpde;g>U#|HZ`q2E#%yLxA)*yO(J5BThzBb?dwMZhmX{;K3Bxv*_!SYx# zfJUP+?$%MSkw#>9&b6_P6>=rMOSeawx+LG!CCE&7x~75?25UoN4R|4D8nT<@D+H~> zxv6eXA7kkf4_5cclH*Ugm-@O-f}%KT>KY3%Q+BaXce6qEz|q?ax2Dxq?zw!^g350q z9df>5@pREVvo*qY+94PL6g}# zh8>V%?GI*MjbLSsrN&9Dr>RWOOh#ZHa#~HKZ{Yk$16gS!s*Bq9&ipuCLGv|Eb!Zyb zJn9+mlZE~(7s?G1Ol{KarhFSb{f59 zFPAHndVgeYGx@pAApELN|>?-|tbgTAh#VO6oE&{Yb;v1>LV|9FBw}?v2W?|GcS@YvJjlW6R~z2Sd&6Mb`UC| z)hL6GLLGE8>agdbLp=wT*u|*CE(fz+gUaiA6jC)0a=SVRaoi0oB4V5}SGRE|b;V8j z-faqcr+4q+s|IKjRKsp+jH4WQJ9i1}Vgt?WxP6`QzrSI+qr(Bg;)lb|3x?xfEw)$9 zAn8C?k3MO}yfhwdjuqpFo4R-3wZOUOoq%qKJm0c62I=SY0@P{byf;4K1d65;@(^Bo zMWb4Q?p+181Nu2;&SwveKWfIQhUZN^XTXH&^H9+yjK(Avuwu+h4K+yyx3Gqn!k9Ja zG{C}zx%>^*@Hg35uhN-6L~!|SApCc5fAn3m0cF8WuxXp%(zc-%bqA_X_n`KqF_j|a zg^Y~GR3mwBekAWT?`NZOVzL|Va{heP*(`MLbu4&T~&3{7t|7dmEe8vks*Qy z7ryqNQ1ee&raz0+J|$8+Z0XU!6Zn6#-yoR8>0* zhehtj}jcZgr z4OY|>o$bINfUMu`=ac$F%w5c_{hWz2V^h$pwnc-L75y6wmXr!KSW6q?^Qy)lGYcCM z^M;x;w+=P;9wVqx#k>@npyxGIW#^%)iErns+`Ot4$4pg2)u4G*D>)Q;wBAFy-$sUR zscV~YEdtUlrYSLTB>do^LgY=gzRqMMUIibjp7R0*N(osNBp5Q(wil0K#|Uq#5cCO_ zklScVnf%h2s%mUJ+@_tUP3y8&am>$8>|Vl9KW=hTs!p7KvUuZN$i}Nf13cJxq};dE z=dC8>4%Loz#WI-`%VeqyuP*G4L8edjoDyFqB%4QEKb0bGmOX{O#z$Dij++~dtc2@Ww>Khx^Qo-&IBk-#7HCg$GEd@2Hj z92#TiGkX^z%UysYt%c0o#gUPpoNw>sVCPXw{v?_loJ4|}9NyJKBkjwIGZeHBp{Rq# zGo01T*eA>+M!hDndu&Z&AL{-(kROru?;siKU>?q7Wb_`gr>3^>CYzmvzh)}PJg!0pRM$#sZ4)77<^0m6GK_-80$})VJov2=eK5B zor8(f>Jq!%O;!5F+j^j3c86=52h273r*-5i}(+vNm^@LfWB-->dYB42PS)1Vblv(wl)aO<&N}>z51``iZrM0KbdXS}> zq)R-$Ciy<)cDXie2YRTSeX{I&$n1N@T!!vy1wWXcH6GPs-w?joojPSUE=twXBoyg4 zZ?8?EGhcnhtqal=0@hiRPV7FW+P5sqxY{#M)A;=T9TjJepLs-YD%{tKrx#`2P4*?a zJ`OFbpV9qIAXEDNF1qFVl^&vge}?v)emyX|9-_h6Yf+&+05EGKxWsj4915~iZ9Cfb z9jKHXHY-q&U2E?$n{1caVY|&WD8gRL>DG=??2YzD^DcW6inF)Kn+mMuTk%2lZu6|Y z&Ae>igFV+>XyV^){*>R>Nc%tS`w4Dvmz<Fe{FM=*fyR1&Vw=sPt~$-3WbooVyAT z>93g2IIy^bWBs$dOVaXRI5OIB|F77h3B?-+GWdB+m;8}1&!k^B!xC?pMJe+Ifan|a z#*T82zi)qSDxHdFrHQA^7f}uUg5n51U9|6I*y#7k{VZcuSs%i&QAFpMhbd6q?s=Hu z#Gi6jbU%%NE)QWp$Tq(Z#QZ~S^$#+jo|4hZjH5@Q&Ix+g(`j*Jbf<3WY^X;a(qsMg z5m-w=?$?1H!)ZFJ{5jIa(Ei=duVOZCV?STnQz7GhFTVD`y|i6_myoaw+qnnlt_QoZ zSSiCSmdE0SQlGm>my1&xV)$aioZg&N*;cLIva50RrnOD$te3}!oJ&NcM_S{w0~Mkm zxlgxi^O`kVS2yWXRsPeO&70B63rf-_BxAL57`SrtMtF8xx2|60nV-A1uD@!v)26Uy zJX&+hw>38H+P0}=G9thieQ8>^WwUcLvV7y_ZJX2rVb^KL9$dc)?<{tOss^J7-_6zY zz2Wnk#SYCjS@&|~#$7bCad{Iw$J(&LVRP4S-bA0T zTh ziR7Ff8|+mF2wGs;#e*E=xtC*aDz3g}<7tP+D&5y{Umv?~;J&f!zA1L!%=;D;?ZW(8 zxt|_;KZEeo{hU~Ss!wMu{ao(n#qQ^GzaW-=A@_@7_lvn- z61!i@y$gxdZhC^yNC;CvYzZYrkCYUqQF#^)or1H+a^N*93jiN-r?T*S*Kn7E3mkmx z<>++%{axd%7jpa3jdS|;Wg6exw=dh6>)Ti3_wDo3efx6!8f$dWU8B9tr?@IK)^M!V z!(!uRj&+S&IM!!5H0Wt#<4lfCx@=a`7F|u#p;d?JI?T|aO^0?JI&_$s?t2=&@W$7_ zPEWfS7&!H!)y@ufH&o9-dg~&dq|Dl+(%qh}&(=P`#M7^v1m}YBk-WYProXMggutR} zyUM#F&!AjMEFb~;ZMwO-0Mltl9+oivbFVSi>9ET;*XI;1l91%O@6!P%y4RQ+fjDQ+ z<_vyxuQB-1B}%9cH|uaqPT?Z6dXhD7)Zx~gxy?8Gl~2EK4)|t(X&b1upz#y<Rl=%?&ZeYVQlC^Uaoc8baLBfG z(5aEshO+uCqjXVYTv5p-s0(^+P~Nu?hNbBrazffAFN^b?ge~f&t^MQuI0i#GAks9T z&zj=dT4)P9LylLcq*0Vq>hjH?9Z_^>f&&bKqfuTSuZnG}UMhCbTV&iF?Yr&|R z;dm=F;*i26&I3QNkU2_X$6Emt7f_;9LJs-na1kcq?L|=wMc7CPl+USQ(Gn_dXnXEF zY<00z;z$vWI*}7k81xtreBfo>rZ^xK2`Tz?4if$I(CE<6F?14(Fd0dFhgoE!Fv@e` zJ;F#(2$6IIDW;LOH4i&#)nToIwtj6KANc3$RYgK53 zYm^IDBiC@D%shu`p%rFF`iJxk&cE#9jGm#qR&(;iAj)_yPmAl?vRQzkLSRx41my!J z^c+C1zJaZH%!Gz`-zX4+bLU*SS=$1^>R&8;;EkaXRhmc99mwfR;|)5GH1lq+u` zv=zk9cZuX0g(ovFE=(^x*c!D4Mri#@rxf)3c~is=mKfzO%D30(wSZft!GH`)9m*N% zHHSc_35NA0M$zN9;umEbg7@tR)31W4yas944um#4VX9vbH*z=B?jC5>K1j?Ppl)x1 zO5cY_<7T7+x0t^`!uU64KU&=VC}tnP!hHa?>LE%Uf}MKMn*;Mk<9QEbmIFOn4t|xP zgpYtQtYSm`IB!;SRYM6wpi`^B?4Clk??SF}l(GRdViioTSD0yvKwcnM7yBJV%j*p1 z2Uoq&jG$;-UB(qcD6ZD?ZJInJyobWR#5b4c=bj-(z*(At75PTrY~nxU^ySz?dVGGC znFfg+zJOTq&1S{s*+M2Mvo(p${LZ?I|L?a!AoS}cK^1J~%D%o`R}LLTZF|99+)Hwf zshgA`H{E&qf~W_?pwQJEU3C_;+Wa5{6UxNLkD~`?p~Wn>QA*)inowv%L%s%Yg;mHd zXu(QtsFT($j)Y+RGm!f&|#BQ5l;I?-18dvCj8eKbFs$ztn zmDODM8v)sYmX5@XsiXVC0}}W`LutGNo2MXz)?(Ix$tzY=8$kn$EDX+FXvd!qr@V*iW~`^fjZ&?MtB;0|y{vWGJRQbSaURh;5QkvavCmIhTlNT1oLVp>8xm1eXMIu+wO3p?0BMC|nfLifL%8GN{{_|dH@(|SU`)vMB0YUK) zr}14oKXFkIru{uwA^R0IYtiZy>quHE+jtNzUA-EZ^yy`*nVR zSld2+2+UMgX!_^~zDC>aI_*cF{_xNWo?LkQiX9_|6mOJ8c4BnoF0|(wOQ2?5vm0cV(zqnhyet`}H1ZBmJq{)w zS~CDzz`p8OXz{1s}twN1%NtE$V~*ytIZpV!bFNfOyCV*?Qb$- z3Kvn!c*r^kx3TWerAP1Ec=nyZ^ADI0T6K0trgLfM!6C>Zw06-}w*y*IQYYa@if~Cj z>>HerBk(OEXnh0bI&_YPewmvQMTD-8_;O$VX?z8l8f&kzUd230Uo4~VZO0ZRB|Fbe zq-Z{G9xH-@eZe=6tNmX*=T4v$zZ`BZ$su5txPAynpN5Z*bYhi-Rz7V!HINIGL!DRw@-mZ#Mn~m$J<;MY zbD&uQ0gzRhvjE#ZJam+PS`}9gJtJAEHHJQS&@q;kIHdG2$KQ?Ae|1T7~Je4s2l&_zIR(U}eNJ zgH{*bCt6Rqk|;gh6SD#e4@kw`E}mO#&2k8AIOV-wz)VhA*0ICg0p~y@`)qJv?yC%SlDsP*ibY8t?IT2;bb%-JE>}oy}*A-(VDZec%0Vx)$Zn2_ys$AzGw2h!0#iTQDrQ~9kA_ls!!{q zS+yP>)^$`woP%9lX+$rkFSbyf1@yyi`k^LP<&Zf8xdEt!{j;)&2a?o+OeqTn@FRwRi6bx9p_Pod#0Yxo7A*3^7FJU zRw>EZZ{#CQ$~j~qy?|RQP0CPpaD6z1W<9YpHcJ;IW+sl87N$3ZDQ7>?n+dPmGcPfM zDd>j95Jfs)Pl=0}S~_1(7wPPp>$Jgf*aH>fqoiL4I~sa})OP|(?xG!c^W9sbE?B|> z-wX3e9eZmu`Q8wleCv&mMjbt{k*Sx1#gmwF`+jZ~`{w5I$5*~W*Vze}gPZjR*ID$v zdK!UNi&=EqEPmRl6FQNWg8_@Fh%-&O)ylC%3C;!zc9m0t?f3oFL$jcT^_x$YRqz;R zOIJn(-l~wA7y9NR0WN}30`&4gJt;BZ^3+_IGwXCl$Dzio*I|P^CTy$~U$2(wvQ-BO z%Ir!*zagTQ9CCbK^wFGZd=}RPcBt3S9x!qhP>PQb+p8%mN#elE85}w~G;ZZKPz}vt zFfhj>8M3<^p`t=J0pVkCeqx?1KyDNSgowSsvXmEc)Q}qHB6|>HVCW?-XT-Ni8;uMb zXj?=O{Kd+AVqwaH$96A{(j!Akx&ylVMCcM|L2RcE(+ANi!wPPI@}X*Rzds4or|M@S zQ4>t7+F%9>6Or?rX-JPk{!#^FO(nUy2&~@Wo1H}g%X5)P)3=PAJnH01Zh)*|FLc2! zbG;6`E$QW(8;ZcIy}r4r2#fh<)p!z<2=Jym=0#=dD8>00mrXmyBX0uu^J)`iUNsLM84?)XFr&j zvXXeiZtNcy!7x2URTI5R+x^4+W7iJdg%Hw4B`GIo0$dc#u}R!B{m^^)MEG-vWt~6bc-|I!a2Tp%TiS zq|4F_DmX2cDXt-b<~S?oM^-YWm*C6g{$#L|_IB;)esO(z!|Yj)nU&qMS4$H0jLG0` z`6&aQQiGh!Z$_|_*W&_WD0WdiLE{kg>o!|e!Rp>oR1-x>?PU$um$Ln+eL_i^xR#(z zyXwX49}B2MmNyc$rKtF7_RB@oN8*PiymeKEq4|pOeJK%kHpG&{PV!wVvehLv12c;;KCaVHx*t-wKTq7^(18gc6E57mN#RETs1rQPahs zOI^11LKr*fGu2)-m4#%t9hD8#w1@9SBsdIQPnL71?#52yjOxB(_0RZjB~Ngo%y+Bp z)tVBU_4oGt(}o|XzBur1G-ve_RZ(Sg-7!2qj(dvZgTwuC23Of`3)i&8T$yJwpi6SK z&{!fdXUxtR_q16mCD)l<+Lx~{fCTQrYo?SzP$dC$`O+f6Plen!?E~5H%`LG#_Z-ak z^V*14R@;cHG?zu0lCgTVy|h;5%bQ0=jt=!ZF*F>v%mMD*_E)~uCfJ8CuX6TtlsPQ8 z+|0K`6N3rbsOL8v9~(Y&e8?($*!SAB^dey?oE3))Ek=7rSEeccX^_$uvxNv#Hk&N~ z8YRLrOYqs6;0)SC{cY-atTZW@*z7L~&TE4+p6KlJOV}5c;a3&wr_T=- z%^`%jag7Yu^djP2fwaD1$EqhP9!DBLst6j~5h|GwXRfq2aT z68#CfF-RN*>o)+&M7=m?s)C>?3n?8}Vj6I|6@gXA;HY6gkaIijdCrfY2#gE(MtR*H zI&6DQ+pgA3D6F&(jj<^%=hsEpg>=8`@yFx=|- z8$IB++nndqjs@&It_J&q8njie!G~m$k+$t~MPESCb11qqR{7dJs>2@$woL_0upJ(p*UyS~ z{H(^dyBZtcGE=9vx9tB&sWxt#?4qgNGdxx&^++oa(>tkELg3(;s~sC&3dF`Y!8 z;>~)tm+X^eQJ>r&R8DrDlU42>SGjxkm)8v&1YkrX+@aZQ*6J-+w`Eb?7DjcOJz3qv z`g7xTULE)0^2+s6xph?TGAg$|R=M-)IDlVJxgXMTVv6i6@3`Pz26yUE1yYKSb8ChX zo~=>Ny=8we==;M_FV)>yk8Y;!Td4b1>b;HO+zuvm1^siCZHHq#?Tk8kThz(xgHCQ^ zNLJawn9GyZTxIN}Xf!Z0R+y|$-~+3>l2|c-d)G+sR+`vEBOePI^T5XNVsm(LvGop3 zLm#+U7M*JH0~aggl)I{puIi$zhUpE{Obu4U5!9L9(0Iw+)9W}i=I-sEUaN~nF7mo) z1n)ZQ?-@sD65qxkjnC?yV zrIZJ!?PelF!r<+_hpRNXyo;V(OMfhav$UEkpBzWQ ztk?2wFMHV~T-B2MtzhA@o4=N_#qMpeJ&uz5S&AcQ#F|X-M~Nl)*u)&YESOrWIeWa# zVbhg6ZSr5^+QEBA!wlOxJN#EbSpX@X(|WsK2=uHbpD?GwX;b^FWjP%?XHK3tLP4G0 z9l(ihX^AxsK1q_Cr_TQU^9J7>FjVo);rNrC^fb};6 z%` zpe_L>Bb+mV!h?JU4lBW;GN^|3LoW!endq;wXtRn)g+TpQf$z(SguF{>se*#N4$ycH z#Mr%bxIDqvP0l8;sJxsMy4MbQ7rsWd2yFI3 z#nqPj0cd>a-VlM7FU5of4zUM$M>2(V%Bx%jp(x)m3t`#B>lO;f#rBGe!6OnPnYaR` zd{E?2-w5L+gjrbdb_u~NA>f0SnCctRV1|jeO4%irIPBU$l%5D84Aib?2_wc}?~~G( ze2ECMw^%?^8MhWE$l=!QK>QAiH-`}uq#C9_hh;N2ERLN5Xc;T)NpWrwY@EqfC`Shw zd6LOEq+J<1q;@u2`vp{EPAu~l;GWA|nzv14Ew+ZZTXSqN!s%4Z5YIB4r4B5+cU01B zL9;6rM9d>*!!)pO?Fi1}KxlC&R7j<2)WkGjhfQ1p=w3=rU9l!MMc#M=ikU=tOWAQ>b)PPyPnXlD zD`EwnyHC5KVie;;&61OW)J(a~(D3ORL@m74Xl9e0?DjUf`C7w75PR*SSm}$R<_bG6 zAJLxIsq{-I{ZdNrrSx@GN?$gibl^tN#SaB--+HdL+pcJgy29SJMYrl1KiM-KED-|= zQ8XK=+a{*LW@@=ba-~=uw?;j*m2oTYA<5_6H251*Il?ts$R$-isCFRw!wy9GGD;7O5xY6C8}_4L&Z zq$+-hb!Boc-*5w*mYP07nLFO$5JufTX61rh_=f4rIzO zQ_8wo7J=ZGocLQPPN*CYZx=IS{VU9Neb5b8b5{S>tGbp*0hR@7#3fjElzfjd!pCF% zQ6H6EACw*MkB#J+GMkdf>2F+r=?|wvHtHv~bd_y+Ck{eyz(MNR0-WR?M-gz(c>j1A zW_n2hz`i8UATQOSO9w0f@}@_JWm3&0Fw6?G5>~(HJmZfX9o%Udv_fb6<3o44yFAbL zj1O)dx&y?Cr{OhB-GPzOLF8}Zkc#^mA+4`L23#9!(F8^O<<)T4iX8&`GjrnP81`eC zB@R`)Ya$wn^8JuFzI6o6*a~K9&6PkoXaX(D91A(tbV=?G#Z@^z0F$ms4oC<4N7XCC zHV{u4f3-fUQ5;jV$XT5!7NG<=)a%fo!vZs(5Im*GB|WcZ;1jrxlYS-i;ZzlxGWMoX z#z|d4TdFBNM%8BD&ohDKSVD%}MLS!mx;;~Id#3L8?C>TTdYAB~OIUxREelo+3zwLI zXTuWiRL5Fvu2z)CJsu)~>F_Z$zVCwqN+E z%$`E<#Ji0Ak7W)i)h~?<@LmtI?xBw9Lq~X8qo?*$&e)7)OUQ{+ACWE443NM!Kz2JI zL%ZiJ0QDRYoK67Gyx2nT4=PSINv+1Xg`Qd{t+6=~D!DS~lA5k$cQ~?rL98okf*hMD zYc6@HE5!Cvhgyb;_!$n!yN@0A=K3)keLN4G&3$|YeXWn>*fEv==%Wk^?Z+uwy|@Ps zwz`}a#i}7}Oe3P^Fb^6xYDk%@L8jM$}nHB9e@Rb&}Q;UDErfQ&3gKMR9ruO zFxg@&gRIkVKq3XSCZxMQPGZbCVb<#b6z5F}_keW?!f^up@#QsS(p6s(l)Nfn#B@#3 zJ^B;vL$P)gjKyFyS+ar$4wVpiai~NM)3XjR6N+uKtfD&ZoQ;iaX@o0kKqan5>|7eq z-$z(`d}v|c`)3)W-%=7*8PHw*qhoBAcIQlvsfV`HmFCw9pq}6G%`?7vR`S`?8tCVI z^XsydJDoGn7ih%`L@Upk7qPoCFXha)a^~9wMfdj2Zxp~PUb1m^TFlEih1ywTzV9p0 z&J1(978j1coiqPI=O6m!cWQ}?`=3{Q@h23e8tEn?Epr zSgUZcy8WYC!djBUA1fgVW|{w%Gk>DjKhc{%CDKmL{JAdw!Z&}Z^MCivd(|=*UT2&6 zE8YCHYWFuf5MXDG0_@CEfSol8u(QVeLxGTe|D-FT>Z~#UQj3$qAJ&3R{cqp=YXMJ% z|2Iz_|K^*Yu~SZJd-HlMfrZtUKzvYH1 z70qKN)f-E2zWyCSpenR!Y+!getj*|>>*_L-yhi?~M+s~r%$4g#>)FQVsR%XiY2cw^+rp7D|fV%VUv z8YHS8RU^!=s213WCBWX2!+V=lfX^I@$^oi#Mv zb4GjFu@gs!8J0>QszN2Uh|}x$J8%I_IX-e^=r|S5qA@vqi~>;1N!XqQfTdDaH!H9D z@lj%KSt41HE|^!?kqwgPP+#z(FDOD{hWxSqyTW__xVvH>Wl7O<6ra$64T|1Uv9Htg zHFH(|OS0$y_hUPhx@C)vz1(2CWba`>+ZfiW5R~ECj(2E<7FkoU@%{rSoI#J;Z{6ka z*dDves_G8YwAA=&J`y-}0m!N-4ab40g?y}hH+MlgJhQ&~1Yc%hX9y&0Q<53T(z2RQ zv!?h)9uUpw00$bn&Kr&toq~`*;bt0Hs>k*?_f9IrXE`usD#c-{vb!?S2ggtJ77=@= zLMexB$;5C(9ozeM1(AowtYe$8lP6BtQNZuoHC~!=KaAsqUM8{5W4#0sED}VpW`e@; zjBultSD;u!l#S289lEDTI4tV(>I46jVo{kQk=pC3>r%6?6}@`mN8#C{spvI(wMDOm zh*5DjL(yhYB#_i}-nM6N3FJg|XIm)fL_N0ON|0OGUBGCpcX67$x!yeP z-c0*?2n|Izr3Cfi)|QQ|qzGK^A?dxkcu01zpD22Zy(L9&sX{3&_PUid@syT&%ZlD| zZ-wuzEPAW-cr`(q6ha9fzeR5?A(YJgiHMekyYcDgyGTpDMKmdrqNI?$Qc@R-OSno; z<9;8UqO&c;E(fdKTyKXw+EC7^EFPMHGyMY;P=d#THIE+KJ1p)_MS&x$t>SY&u13=( z!xu&2kc!yvF(Bv^V!B;YB&lFJ(rW=I5<%U(-K0xalauUo=Lh=l)YDdtf5BEuGKVb3gp}vtSokk0*TU);tL)&d|BgC~S2~y{J0ua`?vXZ9jKKlWl48&xmb#pefOX z1Ni51jr?QslW6WLOg7qOyHV5J@g&zXnFG(8S^IjPLst}M%d&jEmYYtc=~#v$+T6X% zqL;cmb@nfC!#z*EpFz$k4YVA`byV{*si2U5l@Xd&CPRy}xty3uF<>j6x zXt4qzsn4c8Z{}lGvtUOzjaj&tm>r8^~?&i zd9jM=-LdH1oxFP!cd~8H%Ppd-h1W|bNn7-Nss-jVi#_wKS+Ya52C2>^Q`HXHBe78-9DEv4bPe7a*K^^&AjK#ij-kQUJlYVuOvzHsvZUm zir|}O&2vNoBCCr|D@exN=8HKb#?DDyZ=~saY5G2R?KdNTzJ{LG%F>hlO!tdxGwHS2G*P8c`|MroxB8zZ3{Gp7 z9_iZCnth_xf7Ec>njscO@VK?6)h8Ino>re8g*rPe%P#0+RvFD(q;yO zNo=px&lIt~OUXC5X}jl?nd$PL<{tOvTp8^-l}!cRNNi^^8JqxQ@PXqK1EXLb<;iE+ z7Cwi->+?+G#{o`XWQP4R;OP{d^A)E46HMN(G0&c)Grvy2l3%kOB?aLR@%tnlB{27y zsLMVRb=hZvF4J4Q?@)^j=T9+iQd#&owa`cx_)?=6sv7% zWqXW6&zc#O`Y5$_^Zwi9rP;E9sd)KL3j1ecR{DlenQ2x*qk;n-BcX2 zZFXt0T@BncIGs$J-=j^x&m{RV*vuawoBTuI-+yK={38I@AG3A;30uie*fRbc;P4l~ z$-ks4|C%288)B*bEdc$0MHB8<$t9d{r=tmXI+$>2^9?(>Brbc}POdcRpR|J@O~)@W zr8VK&7_=|h33m~$IR!@Cgqv?_&$4MVG|_|ur`wJJjpxm7pUqWf8iVsIM4fQB!&%M( z;hWjNwm9?8PLFv`U@-PBw^wNwg-Q4>NbZoIA#5R zqDucvmH&lK{NDhwe+2>fKVU-tm)Z4ipcMZO{5u0G@rvylZ7D0*aJ~X06^Pr+n*Azg zf-_hI0=GYGRd45QX$x}c-x;O<)hPXOrlL##PSW@De1^%Kk>GdajMVkNcE()5@n;n3 zHlio#<*!Frv(udfvu!ckPMhsdn=8If7VP639i*-2?kVn4=IN49Qx>QlFK_tXCwZaY zVt&>57J+-;{-a5erYgtaA@!|=c;6Lw0t`zdAuMhP-;#$&60fQw#!|urug1}5@U`IO zP*WP1fuysuK`=m#t0^^365H=QHS?kec%$Dk5=`1S$9*VkB0BtyW?3FeWw{P3q>R5( z&sIwAFSRB~ZkJ(wq%*!QFc#L~V(aHs3456pzPZeo67(cm?lDKo31z2{w1%A#S8P6i z4gIQ|lv3}z-VhmURnkSy67CmT-Wr<1Ik4*W2~p$*C}kJVmt>B2bd?Ba1`Ucbhx${X zyB=!s4@_a^w3b&XVBAhOmls*AD5qOX(%DjP+NdX+s`DS=irU6>9zcg)p51W%qXQ1} zwpl+TMaUoAHlP*^8-9ut2G))xvdac%YBRjV&WkhooN`-Sy*%*PP_llGc|u@}&YO2M zNs#Kv`BzZ`VijT(1DdpUUS@T= zoz8rz6sMBE0F{r0biyKAlC~LDKdkulpd>wWwye5Z#24wZ(&gYsrAud2weNY#)PP<= z!R0J#0mA?}bda{GswJg2r)iD}RjE#nBvr_fZrY=8Bg!^&nRIL;uzA*@hL_`=GqQylaYrSyxdDWQbzir{j!%>v2gBwZ6^Az*%9z8i3P ziz~(hqa*!;D`0{iKzg?#U<3~xk>D?EYE;*Pq*Lw=V1-wrLy{;23b12CLx|!7BdNrO z0*+TQkEeHK_7&_f+|{_g4tAo*(5rCV?lKZ%RMf?dIl@j4jlk1&%>D$rGBfP$WJ`jr zr_HPktf1`H1FV|N-B6ph7`s`aY*_?E%rCNT@udc;^TbTtLoG0aVWx?hrJyE z=!BtE45Nt8$E$3Z1ZS-zfatVtWj^VA0yqFIs3W6F>D|c+UK|%g;0_0CmRLaDoC<(+ zM&LS2=!BYmsBK#R)wq@kVw^gM)QV(&eNO+}1ciBX`#h(9E_uIY5&OauTc-oYwdK)Ly9k+^#vQE}7t)mNV?qV=5VH}dxWts-%{1W8|-R@L5 zb`vX#)PI!t?kcb~qaBWuqf1q$>!vm2dm;JCK>uRfDo4~$poX%V_DB^3tf+JQnQG#A|G0UC;i8r&XG1(UF#904 zt0_~t$#H3MACbu|?ym=whru8^(QkNKc!wJWuY>)tx%vDxJ`cI^ZllEobRzIZIEQdv$ng z&b&=SY|Jx9NeNH207vSb1-PaUC{want>mkf&uVi|9>er^=gflz1@E?spfk-wzImTq zu;Zfr{W^a@hY#k=hjQk_F#8JN4j+ZVmop#FnNKK}H^XSinTK=ck(~Kd&U_l4fVgF! zRmDH&6Ta9?K?(G*4O2llugNy3sOOyfW%l9xwwrcs+tRm9aR@7FW!B-xRwfzaLA06Z z1NhsK_Gu`04n3ux_ZHhV z1KM>U9tVTMc#}ESFO}2j32`v%3gNCJu=__3Rn=zmQLh@uZ!wsL)s+Z|Rqzy57gy+1 zm9M9c)&<7vS=q2NwaRs5-^*ISQx^<0)Vx?^(AAd>pn5hu4)vYDVWx+eKs4C{^ktpd zUW8GF*Q;tyk0yNSmWeeUvI;Ax;RKEoEir32vA|gS#JjC|9&%Dty*GtQ3#frm+ z21o8Zj=A;V@`16TGPaiaft-{{Di6?cqXd1%$8;qCIn z+$`@u3fJi{L$v(RJ=V=Tyj$O#vd-3h^W`E;xF?7zTZDJ{H4uVTOFLa?sKL$?0Yj>D zc#MEx7?NR420;8m5fQN>n1NF50*Z7VbFs)eS5MLi z2Aw3fD%6+DQUxAAdS`L^cfY>!J0GBU-o%Qp{cil_lBsSkzIm=_e%(AT^WqC%E8ZDl zqX~9FeMw8fc}$p!XZ5DiM_BO>5rcznL5+9}^)`C5qFNHmy=RhkyB+lxqn1>GqvJS& z)%ZG-@lk+i0axz4IY5)Mcxs3%(0>#lmgv$@VFm@8UyQEE3a|np%sI_Fi;i4m)^hFu zf4qcMb1B!7)OTPuSGr$ru{!6;W<4ngYELRy^IhHEv!PYc1|B$MunY1)dJiEQ3=a`r zkp76Ag`K$b3@#LK8$Tc?nJL?w!0ALTG(+s9pc2yix>3EzfciRgQzeARwvg5)&={5C z#GTDiDa}DCLX)q6`ACp1QibJ7Nd|RTo@}Btl_$4GStyg5QZcR}t8G7(8j_ES$OjrW z(zMwbWEZEFvbc74bcZVKsHL^GvLSx#xw@N&y!ucbTm(4^qxAi{3g5>Y#-35R zCIQ`6%4uVToY-1Wj&K99zN}*kMs1veVVgT%{8OD`(xVs5rGkPZrC^bvF}nPlY~6R$LlH znkHrAQdeH<8_$_j9$gE0s3WIz8#4jpIq$))7c-B+HLO2{L2G*Tj;)w5jXG8d5ao^d!rZW`w9O`g+u+M>Y0Q7Dbbm-kR3T3%Opuy$0FpwDy{IKP};B z>t4CNpN=5(f&Py^Y})Oe4l}r`eaf^o;~>A|c{6igyZ@}2)tlpyeB=`-u$i^c*$%-= zhA5PDbiMe9LKL($&*LVRY(6QP7bxLETIcC&b zOsv(_=A^g7+~Hks?)3JVyS#U!Dk4~7y^?tkQc6E}4c^_9BUn4nJ4k6em@5}~d+hwq zm@B=Fl)ewZc&*oKYfytv&5fQ#NX?-jGz^UV?896bxo`X*%IUsVUQ7zR;{P28a#mZbWB_wVNP{C&MK z`e~z^1VM?=d54sj(f*$=z#O|Z54BAIw%KNXfss3)s{vgN>S{<=2X%Ew2ZFB=zqg?H zy>w3jRu-Q7kC@{H=E;cyRVLQj5wR1FnDGKCMX(W$m^*!Qmp;Bbr})zMm^b_8Ejh6d zI)Z>}_t=1IQ=!_+D8S6&5m};Dq`@;Mtkq;rWGK;!L8;Tw7=-XS7Y#~(Z8oI8sU2IR3uJUK8xv^kdh?I&S>tvEQ^e{2YT1ptRi`RW7%`Zs=e_|+K$P5qyyN(yuZRRzOJYa(tRNR>p|FZPyO7Q= zhmKxtro#ld0PJWH=&l^&u7e4%lC+MVzD%lE+))F|Eb#1=YU(1NiJlgrL5QjE+q^TCMcu=Gd2tBB2Ie#4l{jWl;rs$V*L51=MpXkL?xm5WXsJ?kfEr z8Y)pw=bX(F-=*dvyp#8%^vgISJuGdCTYlKAQf%QlfZ<7-7gXU`P zm0*uAEPXorF>`5qP4}$U%zl)W2cc7)a(PE<<`FX|wN_$9(zeJW=@^` zp6x-=u=HVTX02*nO6Wh)3mN%o)0#r{JpQ8QiL&p?U-ydV6J^w%e~D$g4*k|2F&1CK zFO1IId(vX&-kyJC{;NIz4c=3D?&ZB&d+)~Z!&Y*71NqztzP^uTb~CfY^F{}C1$zh~Z#?(sYD5%XU3jUPhC_?;-%-fwi4K4!A&#=y^e66aixfRtN^aABKT9+i5m{XUr;W7xHJBq}jkzGBx9U-x)#yYI>gpV%gr_>3_9RzJ1t+^#5vSqw+?%B=+of_ z))^u@P!NS*Lq{x92~$--6VeAo(F9HrKqB-wiAY2wXDDC}Qk}mBaCbFCYhpJEk%`cH zqQ^lf#09iTS`R0jJcZQh&7P2Yu{0=1X*rFTkf+X=*fRk&*KRfxQAnB|$_^(Eq4l6$M70Tka&w^i z1rON9zUh)4SeLoghU&J;U^-l+!`dS7m@8t#%8T~=qPFfL@C;e+(kV~#smtu5SUQ@4 z*N%*D7cm(PeVhP_YbzHmMHn=ixdM8O;W9)sCh2oS-1s=}5##FVn4RE35+;``wORr& zEhPSK$y7_D7{1c>74VVsXt|k|6@^q_W&EH31y0rMMnJUEOt+Y-jofR6H*wjGRD&E? zUPS7}Y)VVWb1B@eP)anNy+Zi2?p2y+I=L2NHkY4MDw9^wu3$r$2_OcK($1bm+5#4g zb4fpg`$CKLDYioh<(AoE92lM%6tjT0s1UVpER`c2GAVz_k!4c(P31Tww3O+pSf=v% zt-8zYwUoN_y*5hW@A5sX3c^&+?{x^dGI2=pS~iD^W1UbJbwZsb3X+v$RtK41#96z9 z6{fh>m)Ea1R=?UH+fF`FkE*4P(ojvShNF{Sx8{{PC z!79&61R<;fSx+geYpe9c#cXxSo&d&Fu3mk4_4Z6sJr~4U4c!#49_r=|<T0^?)cvm`3>+X3HxjrjH#nejZ+^JEkXP8}78@d)fibpCSYGdc5U&U`j! zKBo^q@0-VR<_iUo$j5#2MLm-054-fF{vgYcj5_#Z1U?x@AIoZ<*Mypa^Qxgi=yXN8 zffKN=P=oHg)%zyJzDgr2{P5%`TWNqchGhd8t19}JDz6%fB_3m!m$q)QE=S(J=$kJw zAHY?|;#&Dm6cC|x6IJn&?Ee_LNKRq{$MyE(ynpAv?HqjhN!a~)i5+(LA3sDJD~OB; zMB&@-L+Ab}cULDXx zp-YR<$JbTHpNhaHd`3C{Trm$YfrA*BqT5DCM@Bmj4vh~SMklc|n97|F$L>7HJH}hq zY^b#rA;O>5l~Yf{%WTn{whm^C2!CHFVqA?;N{v+=vtPW({NUmx^R1}~6xh75RoL4< zDxdJZoi`j0RnMeuH$Dt&-)fvK?~K&%)~h<-hU**F+$};Lf5&`_(J4y&DA|kzNZ3f? zU<;G)->|`yi{>|_W0$^g)mp3T_pdNbI$TFbQ#B5XH3E0#2!BN?LC!oi+K&7T-Kb7g4X0ld-g5gvbjt%l2+Q%Lg7oX@w$){Ye}Qn-HOwF z2}+6UY-PpKpU)eonrNtUSnVygA3V6S#F{cG`Ef}3=4v12tVir=MT=7K8P}eKv?b%P zWmU!X%?60u%VT|06BSaUjg&k*&esKb#icD7M@TBG8eYp0!zPZQw8hocgAA|qv0wi2 z_KF`nRYQ%+ehQKBqeF3P#n8lEsuk1IHZIV4X3pa8LpIq?;5 zmd>~!-D2D==Fj%CT;O1`(j5|Oay0Lyxa zC4P{_d^@6)BP^JslsbYqXcQ6982`qR6`aH#>y-Hd;-0TS#eD;hQqLpsc^OAse}zk} ze?!o7*1W@OF!y=W%sahybH6tWVr{PZlD8D!sw>Sed20~(TyEa)ZQ=QqJl|zL?Cmz6 z^bR4udeVH#`-b_ncba$K(@!d(Rl$@$1K6I9S2EE8+E>y@zgVH3x1vs<=7YwRngL)-6>wx3e zWAM!jdL{{Rjs#i61UoDDHLrTstbWO6x{;&H>(^p=6)NO)6rrJoUI`wkg)fRs=-^Az zjIxyZi?PgS2AOLZ0v>3o&N+mVw==4O&M^Vfn$zaOr%kQe?^$T<>b!`%5uT;YiKGDO zlOO-+n{I>ush@gpN;qwq-sQ3aJNyFQEYzO1KptQg`DSr}I`eReFUNWj8^I}(otN(4 ztFR+W5b!aI+&5j|SfOzgRFMrsg`!*k;P#V8rHB{Wl*9>jiB_z~7iUN(^SdPPfQ(|+ z^bxBdAwp?Mk_CbIgdk8;qdkj^PES?(Z{d`NEhJ=;C}{j?i9a%dcafRPxXSsOTLy|= zg=!af6+D-+V+U)c7M0o(Qeutkff_QchiAbX?f5M`k#T+O3D+{SS7GJpB^>*Ki9qzpH!ptl8{}8QEgn*I8cIyo3hB{tc(j{)v`?tf*yHtn6C3 zn@(Gtt$h;$lIb8Ob78eELKdL_?^3rBPN=G1NYQhts%-r;++PgJ(!g0)9el&klV%og zQ#5K3U$^t*0^Vb>eFn90IrKVXW&!GmXT;;M#m;d`{K;IZrd2zSW6I1=uG78$W!+_O zqx$+u8)ixa9?+g;%N54tJaZksHVd*P$(cQf`?XkaAfTPOk!Xg9ITgQdAM!fi+#+@+ zuWHR3^!|;$RHPftZNAwr;ZT3h94Np()`kFVmkR?V!ZXaF0g@bGF+W*40}6$^VXs~*-jD}q8h&#L5;buh?3R)Ue#D^(d;Oi2c&zBcomLl zNw3>ZB&(91-~>8ekZ;~2&Gh%eta7b@Q6skqicv{Z5LEcHl42 z0=RK_Y}447Vo||K+&(&j2%!=vf+bfE@QJ|(&#XzfRS00#q(H@~gxIxH0qOwp2oigh zop*|Cvp7*k$g+$T5jF$Jp~A!e7<7#vav`~%66!d(T-aaE8=?(v1@ zgzPM52AzjNDIEZP{An^b&zr2g!q>>bxBp~UGnS7$Zh7A1 z@r&5$v`sRg6uD97XUpS^RGw&QfdXs#zz`C+Kq=y~z^l(|U>9X=;S;8KRXJ;XkW}r-Ck-718-YD| ziXBmL&b*3w07SL(K;!PjF)U@~g_{Q&Hi=Iv&I2(%+&q|PSs~%RS_dhw8KAk5Vg_g$ zX?n>YZGHLp-}^C0}? z1KPVI1~IH?7Yy^fScg>sUR7nJ_-qIu8NG5FHA~$_wU$@aKdSJdRYby6J0FWZ^y)HT zc_cZGbXl1UI7IzOn!0NxytGO(8P$)ebB6<1Nkhy z#)ggF4kSi^A5atio0RA6EPvo{^cpuY__KoEDJcMVe@jx?tjc!L%pH`Ir(%bwOUoea za(QjIfGpB5ca^?m|JlsF;9dqS8pJKR@4f9)joEL~Q~I4FR6uFImchGD?RXuwd9!>u z@2t2r`Q`$^okMPXGbfIvy&l}l`I9eWc06PkV`D-LEx3iKjl<$32$~e9V$D=%dz3n> z;(DI?mRgM=Rw^LE*rpC>BGgN>M9VT<{cE_>lFe#ae%($YO?Zd#=a@e8?8FPVSLZ`m zbbuD07TvupI>`|hT+kUUs0(6?sWWz6zMz)GCiMcl)X50?Mur$EmX$oU*AzB_Oxg96 zf!OreM`Jf6lU<0skPDUUU|xzM6`d%^C%7lv54e|H0k^gPm*2gXcI&r@53B6_5p%6< z0T9lk!Iy5%xpdAd=(aiWT!L-gB$sRFqh?hzbQerzXdE(SUMF^``clQk3G^oC9#)*R zk%PY&D=rqbBa;#2VemO;gWbmME;*h!ff|x~Qm_N@M6*u2kfsf=Ejc1Qi~gkKUu8t( zeIWVariUI`^LZ+vpOm@I@nPiNV8Nb|fg?lXF}=020lrkVpDQ8JJYCJ#6}a6(vnVG) zFxEEW1R)w;C}$o$1Px&>jM+>hd5u_$t{lOk@x#Mo3qWJ0?A|7Vk=Ip4%@VE{);VM+ zR;qiD6po(1kzvz>KAS*_Tv81rCn`Fz^XZ@3;ke3bOvAnOm{duZuZeZEynG2ngB?)B zh&koxeMOO3SXX3UX6wTBJGS_6I=A3TRvd3Pgam?-gX@b3{~|Lf+_S7bzgdN~T1*6i z1SmG+s&Ts80=ZCyahsw`j>#=5&cUsoL~+zf7D|(hUhf}}>y8C0SJIKYU)5YKZ(_v> z3sR%iCy*g>AK=lbkRU>b^rR$uznOdOM2!k3;&m;PGe?|L1kNagqdH9X#{jE8AkRM} zkN?cBV<4ocgs$Ulgr!q;CfX-{p!wLL!0jI{t}J~XxAr>) z^UIQ?pRz_KzoO?~mK^;n!c?EYiLVT>e^rOC75Mf^W$<<1JXK(;#xm$>oqtV-ZxqmQ zeO6hW&Y96lEdF#jQEeyCD^r(pi0`A@p~QO^8s&itNle&07g&Y3?bz)Af>-~8tSZ0-M& zGk>H^|Eo&)kf1Wdcq4Qt*=D+LwKYa5)f&7!h z$jKLH9aQzP{^Nr#ugcp=lqQgLmH=kV7cT&_espN;1R~y{-Dm{Kscu`e#=>YA?hR=R z@=_g&PD>faK$hS%&V9y)?-+8fjp8)96U)Vt?6SeA#R)4?iK>+lve(0{Dfs^AyFeo(YkV(P#v)y4DCwJ!8#8m}? zes<#+)81cKl@S>1zM;D%>v8Wm{*|OT#%SJ&TX-(RnZnq->7>l+r|!V1=D_gr{!yg< zf$OL0`Vf?(S+-;NIHvsh@sT4#$BF07yqxLU<08*kf9-wY%V=r_=v8K5WRSZ1!kXE$ z)nRV;W-0pSuYdw9a2UuF9aCZS0K+Y&E{8dr6eG}=8ymOXLlX|7KtLj7pTU!DlY4^$W}t}nY#%yP=EkBN zq!guKTST`Or}O3LfYSeU46}(rqoVm6^S65cck=QDRkDKZKM90l=u!;oH~>{7lH~{W z`QPjC4=5R)d$+TLr=M~?GSACzxo+pqP1kOflEc54pB4!p`LDkD zKSe@E{#y~%;D2XL%3md~PslXzjQMAtXc2WXbFRPPsy;CNzJ0s4bprJ=yEg5i$9`^J z!F<--RYaruUm<>M#W0^69O_)JVwk_?uZo`MrF2La(L&CK9Z_jHK(F`EF0ZEO`O474 zt)ARZc)233feJ-bqHjf{AHeBOdEi`e0#Hn8B<2_MaTmd%@ToAe(%ghCyl42>3DgAo zc42xqFa+Qq>^#sv*r`R_Nu+`!c=y9-5nuOM3#!)+sE^JQTUM)T>CfHU_Vn4FDHgpt z+rzuJ_3ftSO$W3xaWnwkIZnhB@Ro z`~r1U&YwP++{ym*Qkx|H9X&QQh`N(D6szu{tp#L+^{dXci`DJ8liJ+*!-|i29YM$x z5|a$FORlo#{Mg9@Ojo;CP1m!Dd$)GmiBBg!(U9ej58X9xcSlx4Nzp5iWov(%G;YG{ z&r+DgpfK*@vBXs>(e`wf-8(rCorm>gV6XUEG<suZ{v#}9LYenWta)TO;>qNiYN(i(;KGTN-769}Pbh=J zzV61>XRW6_?obUv-hz7(w1ZUo^QHmqoW|g3)3c`eS<^y|o;TCi!-HBb)bi^na zPtE9Y8bzw&Jo-r<46`WTw7?=+h;GUTsHv-A!CenEb%WVxtLiB0y+Kt)JF9m*($!&_ zbd+izBOhYVosmZMacj~c61bNiJ8aObVHzcBe3|ve-i|g=M>B3nW}!QSxtvsbsBMP3 zIkB3nvMFq#LiL`jA?~h$55B`z%*m6MMHO3y8$4BPg!EwrMzNK0{rVXyAlAYVH;>O04UxB*_njZ|kZ8a+4JDmjNV>!K>H!%$0A zlJ?O_uEgq|kN>=*R3_@Rx#hifC;GRp(yKV@Yrm@*jib4x{%{hdH^kKU`R$^7|eO&w#mxXJtS=P-!Hes2f2OLywo zhS-SnW)@@3V~u!EBi{ad)@FJdm%1?Y%hqOFvyYlzCrEu}e{1#`v%HrusVnxi*EFwu z)~xFF!=aH4;A-+}Uc+JX8;bjexv`^OqrqykY~+hFVU>&51ZwD?|siK*2+~@{MNF3duyot`h8tQGl1E| zLfrs|t6S<~C&5$yl_`|AGyP`qh!_r;l+6S#bTU~MGN-#(Ok1%3yM`IP*G{XGq_~5x zoukL!#?j-yn75PDy`Z{p^;)p`>p<&xu6e*)ZQkW=!;!Th4|aOIpK0Dq`W!iYh4gP= zP-RW{Rur9mQn!##AI})(U{?9wM!VS2ruF7gs-|+6H`}}ez?r5_XYd7cE9+~o`A2k} zZw07mdM`EEGZLU4&zv#hck=>6p3;pH-fK%b_10<7B@kep%$E)Hi?^W|=&(aGFsXXadi z%uN7;o)R$FOd19_00t#c;CO={VNrY(vDe3tAAcN0q(^ME1UeV+<{=9v<=4x>dtJSc zKJ;uav8^miv>!?%SpRFuK zu{Oa!qutsq1{f>Mm>22vj2$_E!glW10k7cXIj^27{gkOgXSJ>QN(SjFRVCP&xk|?t z_|-UaK$g0xR&FT)hZq_a(T!-v)4hhjiZ~s9h&ZkYAP!i7q7B^ewQn^QX zmcoE|7iTf1*R!EsSI(I3e*ANfAC^v%$QC zD9)f9IR$dgDv)#5Y$%|OysZY}`hw(4qIfj+%LpWy1VS*||Okj0yUlI|cT02uzH zPNzaPUqu#Yz=9HQGvZ*Lo02*&Ew8BtQAi5U&cWg>=S5!Q8?>dbNpK{6IX9Y=7OLX) zK91)*xpWm0vMLo8<4!rAa6+(M2PeW!7ZE;^;;o?xid%@IA$&w8TzAHpqmcuqJj{h% z*Im138%{W328p$`%n!I*_;oGH1l_vz1iQDa6yMxdWILcNBtbJJZfsSs1VJxzDOUOyGoi8sh z{R0r$%qTqA3?C9-IkRMo6c(mL6`v=4`&tM=r%9X!xFvm$8chITnGeu&!a&LE{tt+O zHkeo zy@QD>xuQdO?lVqXjJiY4&8Jlhc(>SqZqX!+-?4f(=HE>}Kw`0c7lh9^FP6hmM<@xr zJLmlBjyRUk;B?qzI_$QOb++_SmB^J|$|m#-TAoeX?P#TJu9zenXOE+7uBK7iM5jSI zG(JM#gFB<#mnr#bE#-TQTZxzp7NDn`-Ud-{m)yk^bJj3 z&tp|`zd4qBM=W;~7Tav*fRu`vdp%L+AFP)7v2$mh!%{?QUaEO)k8dW1+tViF_V`ji zbdpkms|dD`6gGGK()T{`AULpolM9;x4wzt;ZR*Pv&#F_-73NAmYo4y=TVD%$p$TWF z)~k#I745)Fr>J}&Cfa%J$CF7KU85zhiWuu-IESbt2y({`DK!UkBt zm_1HSNoA6Z!{9Je7oDAhaUGMP!7p(>8?^eQm?Z^Wr&yMfW(X_ZInu3HcoO;U5+f|o z0Fhp!v-DcTyjx8Axc;HEnwvoFZ5*hjR$Pl%8CrkvdD!&S5H5bE@4okH5*VI$D_3S!@EhH{Ey->f+H%?eE4 zWbVz`DE7+X?X_%T_YndsXYMaRS3RH{@;AG%}XfzgrvL3vvk9!K{_5%EM@uJX;3Me}tFR41*aoyQ1wr9D)FR*ZirfuB&W;3d5jB<>qNHZ*cFpmrsK zw`xZHgVFN|GWqHu4SI%0#~Qj1G#6ycWP)iN8MhF zn%hK9&g;Q=sKPc%G$7a|g{9Zo0k_kLjg}n+kvuB&aZ!2L+!zoJ9?_*^CyqKzw%FS+ z`-))u7o&04a}L##2@x8#cZ8uM3uA{z?%WF2F>;8U&ey_-Qn#C^)ATdBmlcxsSb{P>d{4hP@ro{;8ckO^X}xo#9Ry7jaZYo&)2A#E`!x)JuRpnEkPquS+74NU%%`UEY^ZX{Bzk%!9crHhw2f3Eh3^~`7PdLR9%-Cz#>C|0u+1#_s zpj}*)!T#VG!aanGaNIek5KzE&r^B~#cia?yE<%30Z?4#gp;oQQ_~uG?4=UuFt7;VA z8y1ot+6QOB(4#~$lCF^GnzJynYJ!i%g4^MeL8-|xaY{2K^%3fiR)TlrDN|^!B_2x< zOYqudjD3R}Pq;uAJa3v1!ZyR6!$}D~N_g9f@by_U=xEI+g9)r2GTU(7si^6h?Rb#KkG_N)Z6bD~0ix#xSyg3uR;7t}-6 zb5ka*aDeZ_9)ePiV z9datYFm3jpI%gfwSy&WRIMFMMla-}E!~R0%9yWsx4wM=+ZQlKoB zybZGYI_ibqHDAg9Gw{GW5-9iR>IP~Gq0N=^(%k4Nkew8EW_W!F$!=j4>F0s_DNC|$fcwqbaf5FN#Chx84`58C`Ep)_vj-ELX0kxG(S^Z6G zF-uPyoYBz1-Au@yr%i`r$f-}Apjs}z6)tapC&*BfMEpM%w!O2N+UqCy`D!+rGHM=w zAw}QR#kZeo+j3%C0(*hNDQ!+ww)o_pl@RJopRfm7ldbCR!=%tY;hPEw<~eK?WwU5m zNt~th#RRbIBs_E`dzd%TpSYw|dicc1i9jR9dCT{QM~>YFqGZnlJRLiEjFOaU zd;~l)KQexJXmro8ls(Hi4j8H@X6Njx0 z@)HZ6RUWt07N^kx2?bbQ4d4xx1GDhWnz>WV%V{oyG)Rq}dEe}qxqsIF4ISCTGl_LO z6Sb+#Y$ESwXCEd+Ect+Crwd(DfF;Uc}J)vw=uzwezo`wy)d z_swBWN7>0TnYXt3nYZ5eu&E(ItG_m(I1jw8F z%0;={spQ}nf&%v20?76V`6^cxg!bit%8M1S-xYB7{=(V&bE#8jUr4X5Ypt^#&_Wh< zZ&=k~R+ZBuL0 zr%0iWY$8R&{Y__2o&Ec^x@ji&iAPO+TZ6mEHhitEuC3vdpEd=(t2y#Dz2U^5rY*bo z2NvL8#!j@JIkJJl-vpwz8SBCA=zLuPxAbb}(hdO6PM+=n(Yv0Vw~u|~2KL*VKs5KU zm)^|Idn*#a{isbHK<8utroj+8Du?k>Jj{-J0G-pL?7GLWTs&_6Cp+;^&6~UqGv+Na zcd!@U>GhZs-fE&ut;aj(6`XgnBlnrNd;R#2Kf?J;NN)C@% z8C-R6l`=Ij{%3NPW@SDJmv}mhqtW{+0x;=Yt@0kCk8mtt_Id|RC(nFyySE3?!gTh5 zG4E=GWbz;N7H<E3mX zmztJF%EA7mh;nLg_$Nn0?yu4OuT8qzxvg*0va7D$zT%Z1NFS&4>F@FBsxLkH&Lbq! zPbRP7-{bG-<}&&eKcQglnnfAaWWJiSN9v#u;TKH! zf(-U`By&-3{icCihJcOeCNW;Xkj;^CG}inAxBytKW{dM>Z63gqL|2J47uC{{G}~BT zP*aY7bn4t1P!Uf`lyBjnx1Dl44lAb3hxd2Md#Bu=PCSf4AmpOKJ8BBf9JBJM6>J$^ zm6wV95)nOuHkd(9E;p)7EgyBuNa9(;Sh-ShaNoqOEyS3Q01J)xr zjU$q-z0s~Qaz+{Fmen${vTv*##C!nH2?6-(+Ukx8$ru;N=i#+bUR-ghMRnbpx4$36 z5WEXiBwh1Ak&r0k_8#-xRfaiZuNE|8*ty3p!Dd9JkbIRj}~O)owGaAws-2pJ(k0}o^ez6h8z4?q3%^HG|9kN6E5g!T;1@~PHldJR1!0aH zN72=$p1x)IhpXVAh(3Z7UtMdJ;XykkP!z`P;_8ZM_54P3XYjKauZ>Z0&kW_+%CGgp z+Qnt)r3u-sc6`B!WBAB)7uWK7t3KLdlolbot8=+7jE>HqIo-Zsbst<+!Rsn8of}KK zwtl)3Ctq}drcqx1$g+Zny@*J@@soKEhGP>6@pOzEMYKEI2=cya_9pi?|9d=KKhZ;C zA38rVb~`VFtJY2bQCb7%;E^InUX{3 z*WSO@uM>)kcuJ7qt84dMSkh-^kI!&0uw`V6SC$>vOzRhj(WH znR(e^Hw{f^RsfIcpk0zaRS9`1gtb|mWVV^5*<0nC@GJ$Nrm#4eba$dm zFy?^KrL_$lxO?N~7Cs*#_l)i8T$L2uj&08BzT|$U`0` zmp4Yy^Bta=-E(M?8}bacGgsqp>7>x*L<>S4W_$^ zWQllN8=S7iEP=7}B}I(gO%oXEstM@?dSWKw=b;6k_W+cT#zj{mkQgBeSbMaQ0t}n^MW^OZ zRSP`$!oKWkOpX(2lE8dCOz%`l8!D41Algk9s1}zsC0tyJ7Dvd%wBf>c5vP`NqIu1= z-@t-|><#m-CLm>8X$j**kvF>xtKUX#h$gneVYsZy$#A&-C=@7?+91i6A8dc{awngU zFdrE=`E>0SZ!*So0n>Fg6t`OEy4gpWmHUlO3tZ^um4=EI*z9t; zXZtVH(UlUiyU6t>Gb+YJ@(SB9`VHkd)e{=$VzbnpxoF=+|G2E^ny2omDBjmbP^X7M#ug+^~uztrA z7^Dz#hrB`eloeNWYW6teS*lv|Z7%F^e&I4(RjVHLbj@)D=EV3oW?f77CNowtVutq{ ze~YG=QxN+<>Ws8McHqNP2(7CluT~>^Bjh-7z?sI$h<|*^D&>QVwg0;ccSp$0uj9GKNKxA< zu9091ib(W*S=iEH_kG5Z1*?k7Kc1FU4kHkmf&*V&t8gYUrbc-AB9818hp@Va-Tqjf z!QpB@C*^W*fgvv6<@};r^IMybO&@}xB_UU%{N|3DI}23{sW|-E+7-wZArB27Je8;r zGgCNaW4u7Cn73kG%I;B>RDr=Q(Ni*ET_1NrnWd41;ljd@VwVGns|OGG<}YXjgd9Qc z9^gnEd+OHzVo`wPamAyy)a5pl`yYqHCAvu&I5{{0Icm~&<=0l?H3PnA;7gWBYeqYg zj-J2+TXsT*khM*>1aYR8=V~pTbjn0W!m;6!63h}uaGhqv)ee+UJ#gfbG3Y=EIrw;F zT0#=y??P2);;$12o^FE*NyvU+%S(@>0Z+Gr9<1sBNdEwcCIE{E79TBjj4QcZD-8p2T3k zqM8q)u1EKE=wAWb61^o|SFKEd)NJo|eM$YZ_T|5=Z07S3^4!eyN=It(M!C3C+D*Xq zyaBCuVDLrsk#tYn;3*(>4TEh?kIL8Fdc4;iL^p&S;S6{$ac=VoZMAti=Wf5f7(F17 zB56PWfVTvA4L8%gTG{GKcg!FWGWl?Hjt;I)*gp1fx?1z~>(Rf`vjuW*kRO|b;!s@z~Qt!xbgsWz6;ueHipCOHLU%8SXw^Qt8 zec>{W`f5VdZXuWT8MzqwrJD(mt80k$Wv&?Mzb*hfJ&y zob|0KL9A=yCdwLQQME z94JQnqaS*?Md$M!U6}E3NI+k=h)Bk6%m!M-zt&k92qB rZ#Y5}+jc@-t%ryN8wTs1T#iRqqRr%C_*dTlRqmSsFIbs^p{DQuu!z;; literal 0 HcmV?d00001 From 9ca9cf52aca2fe7bc47c6cc5d7eb527a77c488a6 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 15:38:33 -0400 Subject: [PATCH 149/214] Uncommenting a stray commented test. --- .../walkers/variantutils/CombineVariantsIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 daaab9425..fb18c6c33 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 @@ -119,7 +119,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { executeTest("combineComplexSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, spec); } -// @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } + @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } @Test public void complexTestMinimal() { combineComplexSites(" -minimalVCF", "df96cb3beb2dbb5e02f80abec7d3571e"); } @Test public void complexTestSitesOnly() { combineComplexSites(" -sites_only", "f72a178137e25dbe0b931934cdc0079d"); } @Test public void complexTestSitesOnlyMinimal() { combineComplexSites(" -sites_only -minimalVCF", "f704caeaaaed6711943014b847fe381a"); } From 4ea433f8e1083bb79416dd326b7e7feecfd188a4 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 19:42:00 -0400 Subject: [PATCH 152/214] Moved PhaseByTransmission to public --- .../walkers/phasing/PhaseByTransmission.java | 321 ++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100755 public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmission.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmission.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmission.java new file mode 100755 index 000000000..523c24d9b --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmission.java @@ -0,0 +1,321 @@ +package org.broadinstitute.sting.gatk.walkers.phasing; + +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; + +import java.util.*; + +/** + * Phases a trio VCF (child phased by transmission, implied phase carried over to parents). Given genotypes for a trio, + * this walker modifies the genotypes (if necessary) to reflect the most likely configuration given the genotype + * likelihoods and inheritance constraints, phases child by transmission and carries over implied phase to the parents + * (their alleles in their genotypes are ordered as transmitted|untransmitted). Computes probability that the + * determined phase is correct given that the genotype configuration is correct (useful if you want to use this to + * compare phasing accuracy, but want to break that comparison down by phasing confidence in the truth set). Optionally + * filters out sites where the phasing is indeterminate (site has no-calls), ambiguous (everyone is heterozygous), or + * the genotypes exhibit a Mendelian violation. This walker assumes there are only three samples in the VCF file to + * begin. + */ +public class PhaseByTransmission extends RodWalker { + @Argument(shortName="f", fullName="familyPattern", required=true, doc="Pattern for the family structure (usage: mom+dad=child)") + public String familyStr = null; + + @Argument(shortName="nofilters", fullName="disableFilters", required=false, doc="Disable filters for sites where the phase can't be determined, where the parental origin of the alleles is ambiguous (i.e. everyone is heterozygous), or Mendelian violations") + public Boolean noFilters = false; + + @Output + protected VCFWriter vcfWriter = null; + + private String SAMPLE_NAME_MOM; + private String SAMPLE_NAME_DAD; + private String SAMPLE_NAME_CHILD; + + private final String ROD_NAME = "variant"; + private final String AMBIGUOUS_ALLELE_ORIGIN_FILTER_NAME = "AmbiguousAlleleOrigin"; + private final String INSUFFICIENT_DATA_FILTER_NAME = "InsufficientInformation"; + private final String MENDELIAN_VIOLATION_FILTER_NAME = "MendelianViolation"; + private final String TRANSMISSION_PROBABILITY_TAG_NAME = "TP"; + private final String SOURCE_NAME = "PhaseByTransmission"; + + private final Double MENDELIAN_VIOLATION_PRIOR = 1e-8; + + /** + * Parse the familial relationship specification, and initialize VCF writer + */ + public void initialize() { + String[] pieces = familyStr.split("[\\+\\=]"); + + SAMPLE_NAME_MOM = pieces[0]; + SAMPLE_NAME_DAD = pieces[1]; + SAMPLE_NAME_CHILD = pieces[2]; + + ArrayList rodNames = new ArrayList(); + rodNames.add(ROD_NAME); + + Map vcfRods = VCFUtils.getVCFHeadersFromRods(getToolkit(), rodNames); + Set vcfSamples = SampleUtils.getSampleList(vcfRods, VariantContextUtils.GenotypeMergeType.REQUIRE_UNIQUE); + + if (vcfSamples.size() != 3) { + throw new UserException("File to phase by transmission contains more than three samples. This walker only" + + "accepts VCFs with three samples, so that the meaning of the applied filters is" + + "unambiguous."); + } + + if (!vcfSamples.contains(SAMPLE_NAME_MOM) || !vcfSamples.contains(SAMPLE_NAME_DAD) || !vcfSamples.contains(SAMPLE_NAME_CHILD)) { + throw new UserException("One or more of the samples specified in the familyPattern argument is not present" + + "in this file. Please supply a VCF file that contains only three samples: the" + + "mother, the father, and the child"); + } + + Set samples = new TreeSet(); + samples.add(SAMPLE_NAME_MOM); + samples.add(SAMPLE_NAME_DAD); + samples.add(SAMPLE_NAME_CHILD); + + Set headerLines = new HashSet(); + headerLines.addAll(VCFUtils.getHeaderFields(this.getToolkit())); + + if (!noFilters) { + headerLines.add(new VCFFilterHeaderLine(AMBIGUOUS_ALLELE_ORIGIN_FILTER_NAME, "The parental origin of each of the child's allele cannot be determined (ie everyone is heterozygous)")); + headerLines.add(new VCFFilterHeaderLine(INSUFFICIENT_DATA_FILTER_NAME, "The phase of the child's genotype cannot be determined (ie someone is a no-call)")); + headerLines.add(new VCFFilterHeaderLine(MENDELIAN_VIOLATION_FILTER_NAME, "No combination of the parents' alleles can yield the child's genotype (ie a possible Mendelian violation)")); + } + + headerLines.add(new VCFInfoHeaderLine(TRANSMISSION_PROBABILITY_TAG_NAME, 1, VCFHeaderLineType.Float, "Probability that the phase is correct given that the genotypes are correct")); + vcfWriter.writeHeader(new VCFHeader(headerLines, samples)); + } + + private double computeTransmissionLikelihoodOfGenotypeConfiguration(Genotype mom, Genotype dad, Genotype child) { + double[] momLikelihoods = MathUtils.normalizeFromLog10(mom.getLikelihoods().getAsVector()); + double[] dadLikelihoods = MathUtils.normalizeFromLog10(dad.getLikelihoods().getAsVector()); + double[] childLikelihoods = MathUtils.normalizeFromLog10(child.getLikelihoods().getAsVector()); + + int momIndex = mom.getType().ordinal() - 1; + int dadIndex = dad.getType().ordinal() - 1; + int childIndex = child.getType().ordinal() - 1; + + return momLikelihoods[momIndex]*dadLikelihoods[dadIndex]*childLikelihoods[childIndex]; + } + + private ArrayList createAllThreeGenotypes(Allele refAllele, Allele altAllele, Genotype g) { + List homRefAlleles = new ArrayList(); + homRefAlleles.add(refAllele); + homRefAlleles.add(refAllele); + Genotype homRef = new Genotype(g.getSampleName(), homRefAlleles, g.getNegLog10PError(), null, g.getAttributes(), false); + + List hetAlleles = new ArrayList(); + hetAlleles.add(refAllele); + hetAlleles.add(altAllele); + Genotype het = new Genotype(g.getSampleName(), hetAlleles, g.getNegLog10PError(), null, g.getAttributes(), false); + + List homVarAlleles = new ArrayList(); + homVarAlleles.add(altAllele); + homVarAlleles.add(altAllele); + Genotype homVar = new Genotype(g.getSampleName(), homVarAlleles, g.getNegLog10PError(), null, g.getAttributes(), false); + + ArrayList genotypes = new ArrayList(); + genotypes.add(homRef); + genotypes.add(het); + genotypes.add(homVar); + + return genotypes; + } + + private int getNumberOfMatchingAlleles(Allele alleleToMatch, Genotype g) { + List alleles = g.getAlleles(); + int matchingAlleles = 0; + + for (Allele a : alleles) { + if (!alleleToMatch.equals(a)) { + matchingAlleles++; + } + } + + return matchingAlleles; + } + + private boolean isMendelianViolation(Allele refAllele, Allele altAllele, Genotype mom, Genotype dad, Genotype child) { + int numMomRefAlleles = getNumberOfMatchingAlleles(refAllele, mom) > 0 ? 1 : 0; + int numMomAltAlleles = getNumberOfMatchingAlleles(altAllele, mom) > 0 ? 1 : 0; + + int numDadRefAlleles = getNumberOfMatchingAlleles(refAllele, dad) > 0 ? 1 : 0; + int numDadAltAlleles = getNumberOfMatchingAlleles(altAllele, dad) > 0 ? 1 : 0; + + int numChildRefAlleles = getNumberOfMatchingAlleles(refAllele, child); + int numChildAltAlleles = getNumberOfMatchingAlleles(altAllele, child); + + return (numMomRefAlleles + numDadRefAlleles < numChildRefAlleles || numMomAltAlleles + numDadAltAlleles < numChildAltAlleles); + } + + private ArrayList getPhasedGenotypes(Genotype mom, Genotype dad, Genotype child) { + Set possiblePhasedChildGenotypes = new HashSet(); + + for (Allele momAllele : mom.getAlleles()) { + for (Allele dadAllele : dad.getAlleles()) { + ArrayList possiblePhasedChildAlleles = new ArrayList(); + possiblePhasedChildAlleles.add(momAllele); + possiblePhasedChildAlleles.add(dadAllele); + + Genotype possiblePhasedChildGenotype = new Genotype(child.getSampleName(), possiblePhasedChildAlleles, child.getNegLog10PError(), child.getFilters(), child.getAttributes(), true); + + possiblePhasedChildGenotypes.add(possiblePhasedChildGenotype); + } + } + + ArrayList finalGenotypes = new ArrayList(); + + for (Genotype phasedChildGenotype : possiblePhasedChildGenotypes) { + if (child.sameGenotype(phasedChildGenotype, true)) { + Allele momTransmittedAllele = phasedChildGenotype.getAllele(0); + Allele momUntransmittedAllele = mom.getAllele(0) != momTransmittedAllele ? mom.getAllele(0) : mom.getAllele(1); + + ArrayList phasedMomAlleles = new ArrayList(); + phasedMomAlleles.add(momTransmittedAllele); + phasedMomAlleles.add(momUntransmittedAllele); + + Genotype phasedMomGenotype = new Genotype(mom.getSampleName(), phasedMomAlleles, mom.getNegLog10PError(), mom.getFilters(), mom.getAttributes(), true); + + Allele dadTransmittedAllele = phasedChildGenotype.getAllele(1); + Allele dadUntransmittedAllele = dad.getAllele(0) != dadTransmittedAllele ? dad.getAllele(0) : dad.getAllele(1); + + ArrayList phasedDadAlleles = new ArrayList(); + phasedDadAlleles.add(dadTransmittedAllele); + phasedDadAlleles.add(dadUntransmittedAllele); + + Genotype phasedDadGenotype = new Genotype(dad.getSampleName(), phasedDadAlleles, dad.getNegLog10PError(), dad.getFilters(), dad.getAttributes(), true); + + finalGenotypes.add(phasedMomGenotype); + finalGenotypes.add(phasedDadGenotype); + finalGenotypes.add(phasedChildGenotype); + + return finalGenotypes; + } + } + + finalGenotypes.add(mom); + finalGenotypes.add(dad); + finalGenotypes.add(child); + + return finalGenotypes; + } + + private VariantContext phaseTrioGenotypes(VariantContext vc) { + Genotype mom = vc.getGenotype(SAMPLE_NAME_MOM); + Genotype dad = vc.getGenotype(SAMPLE_NAME_DAD); + Genotype child = vc.getGenotype(SAMPLE_NAME_CHILD); + + Set filters = new HashSet(); + filters.addAll(vc.getFilters()); + + Map attributes = new HashMap(); + attributes.putAll(vc.getAttributes()); + attributes.put(TRANSMISSION_PROBABILITY_TAG_NAME, 0.0); + + ArrayList finalGenotypes = new ArrayList(); + finalGenotypes.add(mom); + finalGenotypes.add(dad); + finalGenotypes.add(child); + + if (!mom.isCalled() || !dad.isCalled() || !child.isCalled()) { + filters.add(INSUFFICIENT_DATA_FILTER_NAME); + } else { + ArrayList possibleMomGenotypes = createAllThreeGenotypes(vc.getReference(), vc.getAlternateAllele(0), mom); + ArrayList possibleDadGenotypes = createAllThreeGenotypes(vc.getReference(), vc.getAlternateAllele(0), dad); + ArrayList possibleChildGenotypes = createAllThreeGenotypes(vc.getReference(), vc.getAlternateAllele(0), child); + + double bestConfigurationLikelihood = 0.0; + double bestPrior = 0.0; + Genotype bestMomGenotype = mom; + Genotype bestDadGenotype = dad; + Genotype bestChildGenotype = child; + + double norm = 0.0; + + for (Genotype momGenotype : possibleMomGenotypes) { + for (Genotype dadGenotype : possibleDadGenotypes) { + for (Genotype childGenotype : possibleChildGenotypes) { + double prior = isMendelianViolation(vc.getReference(), vc.getAlternateAllele(0), momGenotype, dadGenotype, childGenotype) ? MENDELIAN_VIOLATION_PRIOR : 1.0 - 12*MENDELIAN_VIOLATION_PRIOR; + double configurationLikelihood = computeTransmissionLikelihoodOfGenotypeConfiguration(momGenotype, dadGenotype, childGenotype); + norm += prior*configurationLikelihood; + + if (prior*configurationLikelihood > bestPrior*bestConfigurationLikelihood) { + bestConfigurationLikelihood = configurationLikelihood; + bestPrior = prior; + bestMomGenotype = momGenotype; + bestDadGenotype = dadGenotype; + bestChildGenotype = childGenotype; + } + } + } + } + + if (isMendelianViolation(vc.getReference(), vc.getAlternateAllele(0), bestMomGenotype, bestDadGenotype, bestChildGenotype)) { + filters.add(MENDELIAN_VIOLATION_FILTER_NAME); + } else if (bestMomGenotype.isHet() && bestDadGenotype.isHet() && bestChildGenotype.isHet()) { + filters.add(AMBIGUOUS_ALLELE_ORIGIN_FILTER_NAME); + } else { + finalGenotypes = getPhasedGenotypes(bestMomGenotype, bestDadGenotype, bestChildGenotype); + + attributes.put(TRANSMISSION_PROBABILITY_TAG_NAME, bestPrior*bestConfigurationLikelihood / norm); + } + } + + return new VariantContext(SOURCE_NAME, vc.getChr(), vc.getStart(), vc.getStart(), vc.getAlleles(), finalGenotypes, vc.getNegLog10PError(), noFilters ? vc.getFilters() : filters, attributes); + } + + /** + * For each variant in the file, determine the phasing for the child and replace the child's genotype with the trio's genotype + * + * @param tracker the reference meta-data tracker + * @param ref the reference context + * @param context the alignment context + * @return null + */ + @Override + public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + if (tracker != null) { + Collection vcs = tracker.getVariantContexts(ref, ROD_NAME, null, context.getLocation(), true, true); + + for (VariantContext vc : vcs) { + vcfWriter.add(phaseTrioGenotypes(vc), ref.getBase()); + } + } + + return null; + } + + /** + * Provide an initial value for reduce computations. + * + * @return Initial value of reduce. + */ + @Override + public Integer reduceInit() { + return null; + } + + /** + * Reduces a single map with the accumulator provided as the ReduceType. + * + * @param value result of the map. + * @param sum accumulator for the reduce. + * @return accumulator with result of the map taken into account. + */ + @Override + public Integer reduce(Integer value, Integer sum) { + return null; + } +} From 9992c373be8bda5fd4e5999ac3cac36c35e9bb96 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 20:29:58 -0400 Subject: [PATCH 153/214] Optimize imports run on the whole project, public and private. I just got too tired of all of the unused imports floating around. Confirmed that the system builds after the changes. --- .../analyzecovariates/AnalyzeCovariates.java | 11 +++-- .../sting/commandline/Argument.java | 7 +-- .../commandline/ArgumentDefinitionGroup.java | 4 +- .../commandline/ArgumentDefinitions.java | 4 +- .../commandline/ArgumentTypeDescriptor.java | 6 +-- .../sting/commandline/CommandLineProgram.java | 10 +++- .../sting/commandline/CommandLineUtils.java | 10 +++- .../MissingArgumentValueException.java | 2 - .../sting/commandline/ParsingEngine.java | 10 ++-- .../sting/commandline/ParsingMethod.java | 4 +- .../sting/gatk/CommandLineExecutable.java | 21 +++------ .../sting/gatk/CommandLineGATK.java | 10 ++-- .../sting/gatk/GenomeAnalysisEngine.java | 15 ++---- .../sting/gatk/ReadMetrics.java | 9 ++-- .../sting/gatk/ReadProperties.java | 1 - .../sting/gatk/WalkerManager.java | 7 ++- .../arguments/GATKArgumentCollection.java | 11 ++--- .../sting/gatk/contexts/AlignmentContext.java | 6 +-- .../gatk/contexts/AlignmentContextUtils.java | 2 +- .../sting/gatk/contexts/ReferenceContext.java | 9 ++-- .../datasources/providers/AllLocusView.java | 16 +++---- .../providers/LocusReferenceView.java | 11 ++--- .../providers/LocusShardDataProvider.java | 9 ++-- .../gatk/datasources/providers/LocusView.java | 2 +- .../ManagingReferenceOrderedView.java | 2 +- .../providers/ReadReferenceView.java | 3 +- .../providers/ReadShardDataProvider.java | 7 ++- .../gatk/datasources/providers/ReadView.java | 5 +- .../datasources/providers/ReferenceView.java | 18 ++++---- .../datasources/providers/RodLocusView.java | 4 +- .../providers/ShardDataProvider.java | 5 +- .../reads/BAMBlockStartIterator.java | 5 -- .../gatk/datasources/reads/BAMSchedule.java | 7 +-- .../gatk/datasources/reads/BAMScheduler.java | 12 +---- .../gatk/datasources/reads/FilePointer.java | 10 +--- .../gatk/datasources/reads/GATKBAMIndex.java | 14 ++---- .../datasources/reads/GATKBAMIndexData.java | 6 +-- .../datasources/reads/IntervalSharder.java | 11 +---- .../gatk/datasources/reads/LocusShard.java | 3 +- .../datasources/reads/LocusShardStrategy.java | 17 +++---- .../datasources/reads/MonolithicShard.java | 2 +- .../reads/MonolithicShardStrategy.java | 2 +- .../gatk/datasources/reads/ReadShard.java | 14 +++--- .../datasources/reads/ReadShardStrategy.java | 5 +- .../gatk/datasources/reads/SAMDataSource.java | 14 +++--- .../sting/gatk/datasources/reads/Shard.java | 8 +--- .../reads/ShardStrategyFactory.java | 4 +- .../reads/utilities/BAMFileStat.java | 8 ++-- .../reads/utilities/BAMTagRenamer.java | 8 ++-- .../reads/utilities/PrintBGZFBounds.java | 1 - .../reference/ReferenceDataSource.java | 11 ++--- .../gatk/datasources/rmd/ResourcePool.java | 6 +-- .../datasources/sample/SampleDataSource.java | 5 +- .../sting/gatk/examples/CoverageBySample.java | 17 ++++--- .../gatk/examples/GATKPaperGenotyper.java | 4 +- .../sting/gatk/executive/Accumulator.java | 12 ++--- .../executive/HierarchicalMicroScheduler.java | 18 ++++---- .../gatk/executive/LinearMicroScheduler.java | 11 ++--- .../sting/gatk/executive/MicroScheduler.java | 25 +++++----- .../sting/gatk/executive/OutputMergeTask.java | 3 +- .../sting/gatk/executive/ReduceTree.java | 4 +- .../sting/gatk/executive/ShardTraverser.java | 6 +-- .../sting/gatk/executive/TreeReducer.java | 2 +- .../sting/gatk/executive/WindowMaker.java | 19 ++++---- .../sting/gatk/filters/BadCigarFilter.java | 6 ++- .../sting/gatk/filters/BadMateFilter.java | 1 - .../filters/CountingFilteringIterator.java | 13 +++--- .../gatk/filters/DuplicateReadFilter.java | 1 - .../FailsVendorQualityCheckReadFilter.java | 1 - .../sting/gatk/filters/FilterManager.java | 3 -- .../gatk/filters/MalformedReadFilter.java | 2 +- .../filters/MappingQualityReadFilter.java | 1 - .../MappingQualityUnavailableReadFilter.java | 1 - .../gatk/filters/MaxInsertSizeFilter.java | 1 - .../gatk/filters/MaxReadLengthFilter.java | 1 - .../gatk/filters/MissingReadGroupFilter.java | 1 - .../NoOriginalQualityScoresFilter.java | 1 - .../NotPrimaryAlignmentReadFilter.java | 1 - .../sting/gatk/filters/Platform454Filter.java | 2 - .../sting/gatk/filters/PlatformFilter.java | 4 +- .../gatk/filters/PlatformUnitFilter.java | 10 ++-- .../sting/gatk/filters/ReadFilter.java | 1 - .../filters/ReadGroupBlackListFilter.java | 13 +++--- .../sting/gatk/filters/ReadStrandFilter.java | 1 - .../sting/gatk/filters/SampleFilter.java | 3 +- .../gatk/filters/SingleReadGroupFilter.java | 3 +- .../gatk/filters/UnmappedReadFilter.java | 1 - .../sting/gatk/io/DirectOutputTracker.java | 4 +- .../sting/gatk/io/OutputTracker.java | 16 +++---- .../sting/gatk/io/StingSAMFileWriter.java | 2 +- .../gatk/io/ThreadLocalOutputTracker.java | 9 ++-- .../gatk/io/storage/OutputStreamStorage.java | 4 +- .../gatk/io/storage/SAMFileWriterStorage.java | 9 ++-- .../sting/gatk/io/storage/StorageFactory.java | 2 +- .../gatk/io/storage/VCFWriterStorage.java | 19 +++++--- .../OutputStreamArgumentTypeDescriptor.java | 2 +- .../sting/gatk/io/stubs/OutputStreamStub.java | 4 +- .../SAMFileReaderArgumentTypeDescriptor.java | 8 ++-- .../SAMFileWriterArgumentTypeDescriptor.java | 9 ++-- .../gatk/io/stubs/SAMFileWriterStub.java | 15 +++--- .../VCFWriterArgumentTypeDescriptor.java | 7 ++- .../sting/gatk/io/stubs/VCFWriterStub.java | 18 ++++---- .../gatk/iterators/BoundedReadIterator.java | 4 +- .../gatk/iterators/BufferingReadIterator.java | 5 +- .../gatk/iterators/DownsampleIterator.java | 3 +- .../gatk/iterators/GenomeLocusIterator.java | 2 +- .../sting/gatk/iterators/LocusIterator.java | 3 +- .../gatk/iterators/LocusIteratorByState.java | 20 +++++--- .../sting/gatk/iterators/NullSAMIterator.java | 1 - .../iterators/PositionTrackingIterator.java | 1 - .../iterators/ReadFormattingIterator.java | 7 +-- .../gatk/iterators/StingSAMIterator.java | 1 - .../sting/gatk/phonehome/GATKRunReport.java | 5 +- .../sting/gatk/refdata/RODRecordIterator.java | 10 ++-- .../sting/gatk/refdata/RODRecordListImpl.java | 2 +- .../gatk/refdata/RefMetaDataTracker.java | 4 +- .../gatk/refdata/SeekableRODIterator.java | 2 +- .../gatk/refdata/VariantContextAdaptors.java | 12 ++--- .../annotator/AnnotatorInputTableCodec.java | 12 ++--- .../annotator/AnnotatorInputTableFeature.java | 4 +- .../refdata/features/beagle/BeagleCodec.java | 10 ++-- .../features/beagle/BeagleFeature.java | 5 +- .../features/refseq/RefSeqFeature.java | 3 +- .../features/sampileup/SAMPileupCodec.java | 4 +- .../features/sampileup/SAMPileupFeature.java | 3 +- .../features/samread/SAMReadCodec.java | 6 +-- .../refdata/features/table/BedTableCodec.java | 5 -- .../refdata/features/table/TableCodec.java | 6 +-- .../refdata/features/table/TableFeature.java | 2 +- .../gatk/refdata/indexer/RMDIndexer.java | 1 - .../gatk/refdata/tracks/QueryableTrack.java | 1 - .../sting/gatk/refdata/tracks/RMDTrack.java | 2 - .../tracks/builders/RMDTrackBuilder.java | 8 ++-- .../utils/FeatureToGATKFeatureIterator.java | 2 - .../sting/gatk/refdata/utils/GATKFeature.java | 2 - .../LocationAwareSeekableRODIterator.java | 4 -- .../StringToGenomeLocIteratorAdapter.java | 2 +- .../refdata/utils/helpers/DbSNPHelper.java | 2 +- .../gatk/traversals/TraversalEngine.java | 9 ++-- .../gatk/traversals/TraverseDuplicates.java | 3 +- .../sting/gatk/traversals/TraverseLoci.java | 1 - .../gatk/traversals/TraverseReadPairs.java | 16 ++++--- .../sting/gatk/traversals/TraverseReads.java | 8 ++-- .../sting/gatk/walkers/Allows.java | 7 +-- .../sting/gatk/walkers/BAQMode.java | 7 +-- .../broadinstitute/sting/gatk/walkers/By.java | 7 +-- .../sting/gatk/walkers/ClipReadsWalker.java | 26 +++++------ .../sting/gatk/walkers/DuplicateWalker.java | 7 +-- .../walkers/FindReadsWithNamesWalker.java | 1 - .../sting/gatk/walkers/FlagStatWalker.java | 6 +-- .../walkers/GCContentByIntervalWalker.java | 3 +- .../sting/gatk/walkers/LocusWalker.java | 7 ++- .../sting/gatk/walkers/PileupWalker.java | 8 ++-- .../sting/gatk/walkers/PrintRODsWalker.java | 4 +- .../sting/gatk/walkers/PrintReadsWalker.java | 6 +-- .../sting/gatk/walkers/ReadWalker.java | 2 +- .../sting/gatk/walkers/Requires.java | 7 +-- .../gatk/walkers/SplitSamFileWalker.java | 18 +++++--- .../sting/gatk/walkers/Walker.java | 6 +-- .../sting/gatk/walkers/WalkerName.java | 6 +-- .../sting/gatk/walkers/Window.java | 5 +- .../gatk/walkers/annotator/AlleleBalance.java | 16 +++---- .../annotator/AlleleBalanceBySample.java | 14 ++++-- .../walkers/annotator/AnnotationByDepth.java | 3 +- .../gatk/walkers/annotator/BaseCounts.java | 12 ++--- .../annotator/BaseQualityRankSumTest.java | 8 ++-- .../walkers/annotator/ChromosomeCounts.java | 20 ++++---- .../walkers/annotator/DepthOfCoverage.java | 15 +++--- .../annotator/DepthPerAlleleBySample.java | 19 ++++---- .../gatk/walkers/annotator/FisherStrand.java | 14 +++--- .../gatk/walkers/annotator/GCContent.java | 13 +++--- .../sting/gatk/walkers/annotator/GLstats.java | 15 +++--- .../walkers/annotator/HaplotypeScore.java | 32 +++++++------ .../gatk/walkers/annotator/HardyWeinberg.java | 15 +++--- .../walkers/annotator/HomopolymerRun.java | 10 ++-- .../gatk/walkers/annotator/IndelType.java | 6 +-- .../sting/gatk/walkers/annotator/LowMQ.java | 12 ++--- .../annotator/MappingQualityRankSumTest.java | 8 ++-- .../walkers/annotator/MappingQualityZero.java | 8 ++-- .../annotator/MappingQualityZeroBySample.java | 20 ++++---- .../annotator/MappingQualityZeroFraction.java | 6 +-- .../gatk/walkers/annotator/NBaseCount.java | 6 +-- .../gatk/walkers/annotator/QualByDepth.java | 12 ++--- .../walkers/annotator/RMSMappingQuality.java | 15 +++--- .../gatk/walkers/annotator/RankSumTest.java | 15 +++--- .../ReadDepthAndAllelicFractionBySample.java | 21 ++++----- .../walkers/annotator/ReadPosRankSumTest.java | 11 +++-- .../gatk/walkers/annotator/SBByDepth.java | 10 ++-- .../gatk/walkers/annotator/SampleList.java | 10 ++-- .../walkers/annotator/SpanningDeletions.java | 6 +-- .../annotator/TechnologyComposition.java | 6 ++- .../walkers/annotator/VariantAnnotator.java | 13 +++--- .../annotator/VariantAnnotatorEngine.java | 31 ++++++------- .../genomicannotator/GenomicAnnotation.java | 14 +++--- .../genomicannotator/GenomicAnnotator.java | 22 ++++----- .../annotator/genomicannotator/JoinTable.java | 6 +-- .../genomicannotator/JoinTableParser.java | 8 ++-- .../TranscriptToGenomicInfo.java | 15 ++---- .../interfaces/GenotypeAnnotation.java | 10 ++-- .../interfaces/InfoFieldAnnotation.java | 8 ++-- .../beagle/BeagleOutputToVCFWalker.java | 14 +++--- .../beagle/ProduceBeagleInputWalker.java | 13 +++--- .../VariantsToBeagleUnphasedWalker.java | 19 ++++---- .../walkers/coverage/CallableLociWalker.java | 6 +-- .../coverage/CoarseCoverageWalker.java | 7 ++- .../coverage/CompareCallableLociWalker.java | 10 ++-- .../gatk/walkers/coverage/CoverageUtils.java | 4 +- .../coverage/DepthOfCoverageWalker.java | 11 +++-- .../walkers/diffengine/BAMDiffableReader.java | 13 ++---- .../gatk/walkers/diffengine/DiffElement.java | 4 +- .../gatk/walkers/diffengine/DiffValue.java | 2 - .../walkers/diffengine/VCFDiffableReader.java | 5 +- .../fasta/FastaAlternateReferenceWalker.java | 2 +- .../walkers/fasta/FastaReferenceWalker.java | 5 +- .../gatk/walkers/filters/ClusteredSnps.java | 2 +- .../walkers/filters/FiltrationContext.java | 2 +- .../filters/FiltrationContextWindow.java | 4 +- .../filters/VariantFiltrationWalker.java | 13 +++--- .../AlleleFrequencyCalculationModel.java | 7 +-- .../genotyper/DiploidIndelGenotypePriors.java | 2 - .../DiploidSNPGenotypeLikelihoods.java | 11 +++-- .../genotyper/ExactAFCalculationModel.java | 15 ++++-- .../GenotypeLikelihoodsCalculationModel.java | 2 +- .../genotyper/GridSearchAFEstimation.java | 10 ++-- ...elGenotypeLikelihoodsCalculationModel.java | 11 ++--- .../MultiallelicGenotypeLikelihoods.java | 2 +- ...NPGenotypeLikelihoodsCalculationModel.java | 18 ++++---- .../walkers/genotyper/UGCalcLikelihoods.java | 8 ++-- .../walkers/genotyper/UGCallVariants.java | 8 ++-- .../genotyper/UnifiedArgumentCollection.java | 1 - .../walkers/genotyper/UnifiedGenotyper.java | 19 ++++---- .../genotyper/UnifiedGenotyperEngine.java | 16 ++++--- .../indels/ConstrainedMateFixingManager.java | 6 ++- .../indels/HaplotypeIndelErrorModel.java | 7 +-- .../gatk/walkers/indels/IndelRealigner.java | 38 +++++++-------- .../gatk/walkers/indels/LeftAlignIndels.java | 6 ++- .../indels/PairHMMIndelErrorModel.java | 27 +++++------ .../walkers/indels/RealignedReadCounter.java | 24 ++++++---- .../indels/RealignerTargetCreator.java | 12 ++--- ...CoordinateComparatorWithUnmappedReads.java | 3 +- .../indels/SomaticIndelDetectorWalker.java | 46 +++++++++++-------- .../gatk/walkers/phasing/AllelePair.java | 2 +- .../walkers/phasing/AnnotateMNPsWalker.java | 9 ++-- .../gatk/walkers/phasing/MergeMNPsWalker.java | 8 ++-- ...eSegregatingAlternateAllelesVCFWriter.java | 15 +++--- ...ergeSegregatingAlternateAllelesWalker.java | 10 ++-- .../phasing/ReadBackedPhasingWalker.java | 21 +++++---- .../gatk/walkers/phasing/SNPallelePair.java | 4 +- .../sting/gatk/walkers/phasing/WriteVCF.java | 2 +- .../sting/gatk/walkers/qc/CountIntervals.java | 4 +- .../gatk/walkers/qc/CountLociWalker.java | 1 - .../gatk/walkers/qc/CountPairsWalker.java | 6 +-- .../gatk/walkers/qc/CountReadsWalker.java | 4 +- .../gatk/walkers/qc/CountRodByRefWalker.java | 2 +- .../sting/gatk/walkers/qc/CountRodWalker.java | 11 +++-- .../gatk/walkers/qc/CycleQualityWalker.java | 24 +++++----- .../walkers/qc/PrintLocusContextWalker.java | 12 ++--- .../walkers/qc/ReadClippingStatsWalker.java | 27 ++++++----- .../gatk/walkers/qc/ReadValidationWalker.java | 8 ++-- .../walkers/qc/RodSystemValidationWalker.java | 6 ++- .../walkers/qc/ValidatingPileupWalker.java | 8 ++-- .../CountCovariatesGatherer.java | 1 - .../recalibration/CountCovariatesWalker.java | 13 +++--- .../walkers/recalibration/CycleCovariate.java | 1 - .../walkers/recalibration/DinucCovariate.java | 5 +- .../recalibration/RecalDataManager.java | 18 ++++---- .../recalibration/RecalDatumOptimized.java | 2 +- .../TableRecalibrationWalker.java | 30 ++++++------ .../walkers/sequenom/CreateSequenomMask.java | 4 +- .../walkers/sequenom/PickSequenomProbes.java | 18 ++++---- .../varianteval/VariantEvalWalker.java | 17 +++---- .../evaluators/CompEvalGenotypes.java | 2 +- .../varianteval/evaluators/CompOverlap.java | 6 +-- .../varianteval/evaluators/CountVariants.java | 8 ++-- .../evaluators/GenotypeConcordance.java | 12 ++--- .../evaluators/GenotypePhasingEvaluator.java | 7 +-- .../evaluators/IndelLengthHistogram.java | 8 ++-- .../evaluators/IndelMetricsByAC.java | 6 +-- .../evaluators/IndelStatistics.java | 8 ++-- .../MendelianViolationEvaluator.java | 8 ++-- .../evaluators/PrintMissingComp.java | 6 +-- .../evaluators/SamplePreviousGenotypes.java | 2 +- .../evaluators/SimpleMetricsByAC.java | 7 +-- .../evaluators/ThetaVariantEvaluator.java | 6 +-- .../evaluators/TiTvVariantEvaluator.java | 8 ++-- .../evaluators/ValidationReport.java | 12 ++--- .../evaluators/VariantEvaluator.java | 2 +- .../evaluators/VariantQualityScore.java | 10 ++-- .../stratifications/AlleleCount.java | 5 +- .../stratifications/AlleleFrequency.java | 2 +- .../varianteval/stratifications/CompRod.java | 2 +- .../varianteval/stratifications/Contig.java | 2 +- .../varianteval/stratifications/CpG.java | 2 +- .../stratifications/Degeneracy.java | 4 +- .../varianteval/stratifications/EvalRod.java | 2 +- .../varianteval/stratifications/Filter.java | 2 +- .../stratifications/FunctionalClass.java | 2 +- .../stratifications/JexlExpression.java | 4 +- .../varianteval/stratifications/Novelty.java | 2 +- .../varianteval/stratifications/Sample.java | 2 +- .../stratifications/VariantStratifier.java | 3 +- .../util/NewEvaluationContext.java | 2 +- .../util/SortableJexlVCMatchExp.java | 2 +- .../varianteval/util/VariantEvalUtils.java | 4 +- .../ApplyRecalibration.java | 12 ++--- .../walkers/variantrecalibration/Tranche.java | 7 ++- .../VQSRCalibrationCurve.java | 2 +- .../VariantDataManager.java | 6 ++- .../VariantRecalibrator.java | 4 +- .../walkers/variantutils/CombineVariants.java | 13 +++--- .../variantutils/FilterLiftedVariants.java | 19 ++++---- .../variantutils/LeftAlignVariants.java | 12 ++--- .../variantutils/LiftoverVariants.java | 32 ++++++------- .../variantutils/RandomlySplitVariants.java | 13 +++--- .../walkers/variantutils/SelectVariants.java | 19 ++++---- .../variantutils/ValidateVariants.java | 21 +++++---- .../VariantValidationAssessor.java | 13 +++--- .../walkers/variantutils/VariantsToTable.java | 5 +- .../walkers/variantutils/VariantsToVCF.java | 24 +++++----- .../sting/jna/clibrary/LibC.java | 5 +- .../sting/jna/lsf/v7_0_6/LibLsf.java | 2 +- .../gatk/ArgumentDefinitionField.java | 7 ++- .../queue/extensions/gatk/ArgumentField.java | 5 +- .../gatk/GATKExtensionsGenerator.java | 7 ++- .../sting/utils/DisjointSet.java | 4 +- .../broadinstitute/sting/utils/GenomeLoc.java | 1 - .../sting/utils/GenomeLocParser.java | 6 ++- .../sting/utils/IndelUtils.java | 2 +- .../broadinstitute/sting/utils/MathUtils.java | 9 ++-- .../sting/utils/MendelianViolation.java | 7 +-- .../broadinstitute/sting/utils/PathUtils.java | 4 +- .../sting/utils/ReservoirDownsampler.java | 4 +- .../sting/utils/SWPairwiseAlignment.java | 7 ++- .../sting/utils/SampleUtils.java | 6 +-- .../sting/utils/SimpleTimer.java | 5 +- .../org/broadinstitute/sting/utils/Utils.java | 5 +- .../broadinstitute/sting/utils/baq/BAQ.java | 6 +-- .../sting/utils/baq/BAQSamIterator.java | 5 +- .../sting/utils/bed/BedParser.java | 5 +- .../sting/utils/classloader/JVMUtils.java | 2 +- .../sting/utils/clipreads/ClippingOp.java | 3 -- .../sting/utils/clipreads/ReadClipper.java | 1 - .../codecs/completegenomics/CGVarCodec.java | 1 - .../utils/codecs/soapsnp/SoapSNPCodec.java | 6 +-- .../utils/codecs/vcf/StandardVCFWriter.java | 4 +- .../sting/utils/codecs/vcf/VCFParser.java | 4 +- .../sting/utils/codecs/vcf/VCFUtils.java | 4 +- .../utils/collections/NestedHashMap.java | 3 +- .../utils/collections/RODMergingIterator.java | 7 ++- .../sting/utils/duplicates/DupUtils.java | 9 ++-- .../sting/utils/exceptions/UserException.java | 3 +- .../CachingIndexedFastaSequenceFile.java | 7 +-- .../sting/utils/genotype/DiploidGenotype.java | 1 - .../sting/utils/genotype/Haplotype.java | 8 ++-- .../sting/utils/help/ApplicationDetails.java | 8 ++-- .../sting/utils/help/DescriptionTaglet.java | 1 - .../sting/utils/help/DisplayNameTaglet.java | 1 - .../sting/utils/help/HelpFormatter.java | 12 ++--- .../sting/utils/help/HelpTaglet.java | 4 +- .../help/ResourceBundleExtractorDoclet.java | 14 +++--- .../sting/utils/help/SummaryTaglet.java | 1 - .../sting/utils/instrumentation/Sizeof.java | 2 +- .../interval/IntervalFileMergingIterator.java | 6 +-- .../sting/utils/interval/IntervalUtils.java | 4 +- .../interval/NwayIntervalMergingIterator.java | 3 +- .../interval/OverlappingIntervalIterator.java | 3 +- .../pileup/AbstractReadBackedPileup.java | 11 ++--- .../pileup/ExtendedEventPileupElement.java | 3 -- .../sting/utils/pileup/FragmentPileup.java | 5 +- .../pileup/MergingPileupElementIterator.java | 2 +- .../sting/utils/pileup/PileupElement.java | 5 +- .../pileup/ReadBackedExtendedEventPileup.java | 6 +-- .../ReadBackedExtendedEventPileupImpl.java | 5 +- .../sting/utils/pileup/ReadBackedPileup.java | 5 +- .../utils/pileup/ReadBackedPileupImpl.java | 2 +- .../sting/utils/sam/AlignmentUtils.java | 9 ++-- .../utils/sam/ArtificialReadsTraversal.java | 16 +++---- .../utils/sam/ArtificialSAMFileReader.java | 16 ++++--- .../utils/sam/ArtificialSAMIterator.java | 5 +- .../utils/sam/ArtificialSAMQueryIterator.java | 5 +- .../sting/utils/sam/ComparableSAMRecord.java | 2 - .../utils/sam/GATKSAMReadGroupRecord.java | 2 +- .../sting/utils/sam/GATKSAMRecord.java | 8 ++-- .../sting/utils/sam/ReadUtils.java | 5 +- .../sting/utils/sam/SAMFileReaderBuilder.java | 3 +- .../utils/sam/SimplifyingSAMFileWriter.java | 7 --- .../sting/utils/text/ListFileUtils.java | 1 - .../sting/utils/text/TextFormattingUtils.java | 8 ++-- .../sting/utils/text/XReadLines.java | 6 +-- .../FileBackedGenomeLocProcessingTracker.java | 4 -- .../NoOpGenomeLocProcessingTracker.java | 4 -- .../sting/utils/threading/SharedFileLock.java | 3 -- .../threading/SharedFileThreadSafeLock.java | 5 -- .../sting/utils/variantcontext/Allele.java | 4 +- .../variantcontext/GenotypeLikelihoods.java | 2 +- .../variantcontext/MutableVariantContext.java | 5 +- .../utils/variantcontext/VariantContext.java | 2 +- .../variantcontext/VariantContextUtils.java | 19 +++++--- .../variantcontext/VariantJEXLContext.java | 5 +- .../sting/utils/wiggle/WiggleWriter.java | 2 +- 400 files changed, 1480 insertions(+), 1602 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java b/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java index f8e298d88..b9e380295 100755 --- a/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java +++ b/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java @@ -25,20 +25,21 @@ package org.broadinstitute.sting.analyzecovariates; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.CommandLineProgram; import org.broadinstitute.sting.commandline.Input; -import org.broadinstitute.sting.gatk.walkers.recalibration.*; +import org.broadinstitute.sting.gatk.walkers.recalibration.Covariate; +import org.broadinstitute.sting.gatk.walkers.recalibration.RecalDatum; +import org.broadinstitute.sting.gatk.walkers.recalibration.RecalibrationArgumentCollection; import org.broadinstitute.sting.utils.classloader.PluginManager; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.commandline.CommandLineProgram; -import org.broadinstitute.sting.commandline.Argument; +import java.io.*; import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.regex.Pattern; -import java.io.*; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/commandline/Argument.java b/public/java/src/org/broadinstitute/sting/commandline/Argument.java index b2ee9d1fc..33592287d 100755 --- a/public/java/src/org/broadinstitute/sting/commandline/Argument.java +++ b/public/java/src/org/broadinstitute/sting/commandline/Argument.java @@ -25,12 +25,7 @@ package org.broadinstitute.sting.commandline; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitionGroup.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitionGroup.java index c36a8e04f..b47677b08 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitionGroup.java +++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitionGroup.java @@ -27,10 +27,10 @@ package org.broadinstitute.sting.commandline; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.List; -import java.util.Collections; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; +import java.util.List; /** * A group of argument definitions. diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitions.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitions.java index 39e698ca3..9f92df6e0 100755 --- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitions.java +++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentDefinitions.java @@ -27,10 +27,10 @@ package org.broadinstitute.sting.commandline; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.Set; -import java.util.HashSet; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; +import java.util.Set; /** * A collection of argument definitions. diff --git a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java index 6c50e1784..9c33e084d 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java +++ b/public/java/src/org/broadinstitute/sting/commandline/ArgumentTypeDescriptor.java @@ -25,12 +25,12 @@ package org.broadinstitute.sting.commandline; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.walkers.Multiplex; import org.broadinstitute.sting.gatk.walkers.Multiplexer; -import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.classloader.JVMUtils; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.lang.annotation.Annotation; diff --git a/public/java/src/org/broadinstitute/sting/commandline/CommandLineProgram.java b/public/java/src/org/broadinstitute/sting/commandline/CommandLineProgram.java index d404a2b6e..aba4fc109 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/CommandLineProgram.java +++ b/public/java/src/org/broadinstitute/sting/commandline/CommandLineProgram.java @@ -25,14 +25,20 @@ package org.broadinstitute.sting.commandline; -import org.apache.log4j.*; +import org.apache.log4j.FileAppender; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; import org.broadinstitute.sting.gatk.CommandLineGATK; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.help.ApplicationDetails; import org.broadinstitute.sting.utils.help.HelpFormatter; import java.io.IOException; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Locale; public abstract class CommandLineProgram { diff --git a/public/java/src/org/broadinstitute/sting/commandline/CommandLineUtils.java b/public/java/src/org/broadinstitute/sting/commandline/CommandLineUtils.java index 99608f167..bd2006388 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/CommandLineUtils.java +++ b/public/java/src/org/broadinstitute/sting/commandline/CommandLineUtils.java @@ -25,11 +25,17 @@ package org.broadinstitute.sting.commandline; -import org.apache.log4j.*; +import org.apache.log4j.Appender; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; import java.lang.annotation.Annotation; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.Map; /** * Static utility methods for working with command-line arguments. diff --git a/public/java/src/org/broadinstitute/sting/commandline/MissingArgumentValueException.java b/public/java/src/org/broadinstitute/sting/commandline/MissingArgumentValueException.java index 8029db7b3..4e6c3a16f 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/MissingArgumentValueException.java +++ b/public/java/src/org/broadinstitute/sting/commandline/MissingArgumentValueException.java @@ -26,8 +26,6 @@ package org.broadinstitute.sting.commandline; import org.broadinstitute.sting.utils.Utils; -import java.util.Collection; - /** * Specifies that a value was missing when attempting to populate an argument. */ diff --git a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java index 717c5c522..8423bb2f2 100755 --- a/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java +++ b/public/java/src/org/broadinstitute/sting/commandline/ParsingEngine.java @@ -25,16 +25,16 @@ package org.broadinstitute.sting.commandline; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.apache.log4j.Logger; 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.UserException; import org.broadinstitute.sting.utils.help.ApplicationDetails; import org.broadinstitute.sting.utils.help.HelpFormatter; -import org.apache.log4j.Logger; -import java.lang.reflect.*; +import java.lang.reflect.Field; import java.util.*; /** diff --git a/public/java/src/org/broadinstitute/sting/commandline/ParsingMethod.java b/public/java/src/org/broadinstitute/sting/commandline/ParsingMethod.java index d1cda3ed9..a070cb5a1 100755 --- a/public/java/src/org/broadinstitute/sting/commandline/ParsingMethod.java +++ b/public/java/src/org/broadinstitute/sting/commandline/ParsingMethod.java @@ -27,10 +27,8 @@ package org.broadinstitute.sting.commandline; import org.broadinstitute.sting.utils.Utils; -import java.util.regex.Pattern; import java.util.regex.Matcher; -import java.util.List; -import java.util.ArrayList; +import java.util.regex.Pattern; /** * Holds a pattern, along with how to get to the argument definitions that could match that pattern. diff --git a/public/java/src/org/broadinstitute/sting/gatk/CommandLineExecutable.java b/public/java/src/org/broadinstitute/sting/gatk/CommandLineExecutable.java index fd7e749c3..a080ab439 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/CommandLineExecutable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/CommandLineExecutable.java @@ -25,30 +25,21 @@ package org.broadinstitute.sting.gatk; -import org.broadinstitute.sting.commandline.Tags; -import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection; -import org.broadinstitute.sting.commandline.CommandLineProgram; import org.broadinstitute.sting.commandline.ArgumentTypeDescriptor; -import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID; +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.io.stubs.OutputStreamArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.SAMFileReaderArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.VCFWriterArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.phonehome.GATKRunReport; -import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet; -import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet.RMDStorageType; -import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.Walker; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.*; - -import net.sf.picard.filter.SamRecordFilter; -import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.ListFileUtils; -import org.broadinstitute.sting.utils.text.XReadLines; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; /** * @author aaron diff --git a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java index 7982f61e2..da2be74bf 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java +++ b/public/java/src/org/broadinstitute/sting/gatk/CommandLineGATK.java @@ -26,13 +26,15 @@ package org.broadinstitute.sting.gatk; import org.broad.tribble.TribbleException; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.ArgumentCollection; +import org.broadinstitute.sting.commandline.CommandLineProgram; import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection; import org.broadinstitute.sting.gatk.walkers.Attribution; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.text.TextFormattingUtils; -import org.broadinstitute.sting.utils.help.ApplicationDetails; -import org.broadinstitute.sting.commandline.*; import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.help.ApplicationDetails; +import org.broadinstitute.sting.utils.text.TextFormattingUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java b/public/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java index f8527c33b..918bc1251 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisEngine.java @@ -28,24 +28,14 @@ import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.picard.reference.ReferenceSequenceFile; import net.sf.samtools.*; import org.apache.log4j.Logger; -import org.broadinstitute.sting.commandline.ArgumentException; -import org.broadinstitute.sting.commandline.ArgumentSource; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.commandline.CommandLineUtils; -import org.broadinstitute.sting.commandline.ParsingEngine; -import org.broadinstitute.sting.commandline.Tags; +import org.broadinstitute.sting.commandline.*; import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; -import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID; -import org.broadinstitute.sting.gatk.datasources.reads.Shard; +import org.broadinstitute.sting.gatk.datasources.reads.*; import org.broadinstitute.sting.gatk.datasources.reference.ReferenceDataSource; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; -import org.broadinstitute.sting.gatk.datasources.reads.MonolithicShardStrategy; -import org.broadinstitute.sting.gatk.datasources.reads.ShardStrategy; -import org.broadinstitute.sting.gatk.datasources.reads.ShardStrategyFactory; -import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource; import org.broadinstitute.sting.gatk.executive.MicroScheduler; import org.broadinstitute.sting.gatk.filters.FilterManager; import org.broadinstitute.sting.gatk.filters.ReadFilter; @@ -65,6 +55,7 @@ import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.interval.IntervalUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java b/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java index 27a86ab3f..7cb615f7f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java +++ b/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java @@ -25,13 +25,12 @@ package org.broadinstitute.sting.gatk; import net.sf.picard.filter.SamRecordFilter; - -import java.util.Map; -import java.util.HashMap; -import java.util.Collections; - import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + /** * Holds a bunch of basic information about the traversal. */ diff --git a/public/java/src/org/broadinstitute/sting/gatk/ReadProperties.java b/public/java/src/org/broadinstitute/sting/gatk/ReadProperties.java index 1a361029a..93fa2d146 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/ReadProperties.java +++ b/public/java/src/org/broadinstitute/sting/gatk/ReadProperties.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk; -import net.sf.picard.filter.SamRecordFilter; import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMFileReader; diff --git a/public/java/src/org/broadinstitute/sting/gatk/WalkerManager.java b/public/java/src/org/broadinstitute/sting/gatk/WalkerManager.java index 9553f651e..cf190835e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/WalkerManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/WalkerManager.java @@ -25,19 +25,18 @@ package org.broadinstitute.sting.gatk; -import net.sf.picard.filter.SamRecordFilter; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.filters.FilterManager; import org.broadinstitute.sting.gatk.filters.ReadFilter; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.classloader.PluginManager; -import org.broadinstitute.sting.utils.text.TextFormattingUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.help.DescriptionTaglet; import org.broadinstitute.sting.utils.help.DisplayNameTaglet; import org.broadinstitute.sting.utils.help.SummaryTaglet; -import org.broadinstitute.sting.utils.baq.BAQ; +import org.broadinstitute.sting.utils.text.TextFormattingUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java b/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java index 93638f21d..ee2e85025 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java +++ b/public/java/src/org/broadinstitute/sting/gatk/arguments/GATKArgumentCollection.java @@ -26,17 +26,16 @@ package org.broadinstitute.sting.gatk.arguments; import net.sf.samtools.SAMFileReader; -import org.broadinstitute.sting.commandline.Hidden; -import org.broadinstitute.sting.gatk.phonehome.GATKRunReport; -import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.interval.IntervalMergingRule; import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Input; import org.broadinstitute.sting.gatk.DownsampleType; import org.broadinstitute.sting.gatk.DownsamplingMethod; -import org.broadinstitute.sting.utils.interval.IntervalSetRule; +import org.broadinstitute.sting.gatk.phonehome.GATKRunReport; import org.broadinstitute.sting.utils.baq.BAQ; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.interval.IntervalMergingRule; +import org.broadinstitute.sting.utils.interval.IntervalSetRule; import org.simpleframework.xml.*; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.stream.Format; diff --git a/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContext.java b/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContext.java index 337c2664c..17e4a0743 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContext.java +++ b/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContext.java @@ -26,13 +26,13 @@ package org.broadinstitute.sting.gatk.contexts; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.HasGenomeLocation; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import java.util.*; +import java.util.List; /** * Useful class for forwarding on locusContext data from this iterator diff --git a/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContextUtils.java b/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContextUtils.java index 6a0d30837..1f9a7d705 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContextUtils.java +++ b/public/java/src/org/broadinstitute/sting/gatk/contexts/AlignmentContextUtils.java @@ -27,8 +27,8 @@ package org.broadinstitute.sting.gatk.contexts; import net.sf.samtools.SAMReadGroupRecord; import org.broadinstitute.sting.gatk.datasources.sample.Sample; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/contexts/ReferenceContext.java b/public/java/src/org/broadinstitute/sting/gatk/contexts/ReferenceContext.java index 760b3a7bc..376064cdb 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/contexts/ReferenceContext.java +++ b/public/java/src/org/broadinstitute/sting/gatk/contexts/ReferenceContext.java @@ -25,11 +25,12 @@ package org.broadinstitute.sting.gatk.contexts; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.BaseUtils; +import com.google.java.contract.Ensures; +import com.google.java.contract.Requires; import net.sf.samtools.util.StringUtil; -import com.google.java.contract.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; /** * The section of the reference that overlaps with the given diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/AllLocusView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/AllLocusView.java index b36c59a2c..e92599494 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/AllLocusView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/AllLocusView.java @@ -1,16 +1,14 @@ package org.broadinstitute.sting.gatk.datasources.providers; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.iterators.GenomeLocusIterator; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; + +import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; -import java.util.ArrayList; -import java.util.Collections; - -import org.broadinstitute.sting.gatk.iterators.GenomeLocusIterator; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.utils.GenomeLoc; -import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; /** * User: hanna * Date: May 13, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusReferenceView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusReferenceView.java index 330a9e4f7..ff312bcac 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusReferenceView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusReferenceView.java @@ -1,13 +1,12 @@ package org.broadinstitute.sting.gatk.datasources.providers; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; +import net.sf.picard.reference.ReferenceSequence; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.walkers.Reference; import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.gatk.walkers.Window; -import org.broadinstitute.sting.gatk.walkers.Reference; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import net.sf.picard.reference.ReferenceSequence; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; /* * Copyright (c) 2009 The Broad Institute * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusShardDataProvider.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusShardDataProvider.java index 72b962522..55304da34 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusShardDataProvider.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusShardDataProvider.java @@ -1,16 +1,15 @@ package org.broadinstitute.sting.gatk.datasources.providers; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.iterators.LocusIterator; -import org.broadinstitute.sting.gatk.ReadProperties; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; import java.util.Collection; -import net.sf.picard.reference.IndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.GenomeLocParser; - /** * Presents data sharded by locus to the traversal engine. * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusView.java index b467a2ab5..f9ed0cb74 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/LocusView.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.gatk.datasources.providers; -import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.DownsampleType; +import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.iterators.LocusIterator; import org.broadinstitute.sting.utils.GenomeLoc; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ManagingReferenceOrderedView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ManagingReferenceOrderedView.java index a91e169c1..223659a46 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ManagingReferenceOrderedView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ManagingReferenceOrderedView.java @@ -5,10 +5,10 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; import org.broadinstitute.sting.utils.GenomeLoc; -import java.util.List; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; /** * User: hanna * Date: May 21, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadReferenceView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadReferenceView.java index d2c097f5d..3d62faf49 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadReferenceView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadReferenceView.java @@ -1,9 +1,8 @@ package org.broadinstitute.sting.gatk.datasources.providers; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.GenomeLoc; /* * Copyright (c) 2009 The Broad Institute * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadShardDataProvider.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadShardDataProvider.java index 5a672b09f..7843e7518 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadShardDataProvider.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadShardDataProvider.java @@ -1,14 +1,13 @@ package org.broadinstitute.sting.gatk.datasources.providers; +import net.sf.picard.reference.IndexedFastaSequenceFile; import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.utils.GenomeLocParser; import java.util.Collection; -import net.sf.picard.reference.IndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.GenomeLocParser; - /** * Present data sharded by read to a traversal engine. * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadView.java index 0c4b78a7c..e809092d4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReadView.java @@ -1,11 +1,10 @@ package org.broadinstitute.sting.gatk.datasources.providers; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import java.util.Collection; import java.util.Arrays; - -import net.sf.samtools.SAMRecord; +import java.util.Collection; /** * User: hanna * Date: May 22, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReferenceView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReferenceView.java index d6c938f36..efb92235f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReferenceView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ReferenceView.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.datasources.providers; -import org.broadinstitute.sting.utils.*; - -import java.util.Collections; -import java.util.Collection; -import java.util.Arrays; - -import net.sf.samtools.SAMSequenceRecord; -import net.sf.samtools.SAMRecord; -import net.sf.picard.reference.ReferenceSequence; import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.picard.reference.ReferenceSequence; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMSequenceRecord; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; /** * User: hanna * Date: May 22, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/RodLocusView.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/RodLocusView.java index feed2ab85..39c632539 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/RodLocusView.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/RodLocusView.java @@ -25,9 +25,9 @@ package org.broadinstitute.sting.gatk.datasources.providers; -import org.broadinstitute.sting.gatk.refdata.*; -import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; import org.broadinstitute.sting.utils.GenomeLoc; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ShardDataProvider.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ShardDataProvider.java index a0ea32f9b..803bd885b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ShardDataProvider.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/providers/ShardDataProvider.java @@ -1,15 +1,14 @@ package org.broadinstitute.sting.gatk.datasources.providers; +import net.sf.picard.reference.IndexedFastaSequenceFile; import org.broadinstitute.sting.gatk.datasources.reads.Shard; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.ArrayList; -import java.util.List; import java.util.Collection; - -import net.sf.picard.reference.IndexedFastaSequenceFile; +import java.util.List; /** * User: hanna * Date: May 8, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMBlockStartIterator.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMBlockStartIterator.java index a9e04e357..de938e845 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMBlockStartIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMBlockStartIterator.java @@ -24,9 +24,6 @@ package org.broadinstitute.sting.gatk.datasources.reads; -import net.sf.samtools.SAMFileReader; -import net.sf.samtools.SAMRecord; -import org.apache.commons.lang.ArrayUtils; import org.broadinstitute.sting.utils.exceptions.StingException; import java.io.File; @@ -35,9 +32,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java index 34693d501..521bcd5a3 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMSchedule.java @@ -39,12 +39,7 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Writes schedules for a single BAM file to a target output file. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMScheduler.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMScheduler.java index 266232c0f..467aebac5 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMScheduler.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/BAMScheduler.java @@ -26,20 +26,10 @@ package org.broadinstitute.sting.gatk.datasources.reads; import net.sf.picard.util.PeekableIterator; import net.sf.samtools.GATKBAMFileSpan; -import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocSortedSet; -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; +import java.util.*; /** * Assign intervals to the most appropriate blocks, keeping as little as possible in memory at once. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/FilePointer.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/FilePointer.java index c014c1995..e4141f61c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/FilePointer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/FilePointer.java @@ -29,19 +29,11 @@ import net.sf.samtools.GATKBAMFileSpan; import net.sf.samtools.SAMFileSpan; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.GenomeLocSortedSet; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.interval.IntervalMergingRule; import org.broadinstitute.sting.utils.interval.IntervalUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.*; /** * Represents a small section of a BAM file, and every associated interval. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java index 8ebb8b1a8..5d0c38b78 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndex.java @@ -23,24 +23,18 @@ */ package org.broadinstitute.sting.gatk.datasources.reads; -import net.sf.samtools.Bin; - -import net.sf.samtools.GATKBAMFileSpan; -import net.sf.samtools.GATKBin; -import net.sf.samtools.GATKChunk; -import net.sf.samtools.LinearIndex; -import net.sf.samtools.SAMException; -import net.sf.samtools.util.RuntimeIOException; +import net.sf.samtools.*; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * A basic interface for querying BAM indices. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndexData.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndexData.java index f9b998a60..daf1b77e3 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndexData.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/GATKBAMIndexData.java @@ -24,11 +24,7 @@ package org.broadinstitute.sting.gatk.datasources.reads; -import net.sf.samtools.Bin; -import net.sf.samtools.GATKBAMFileSpan; -import net.sf.samtools.GATKBin; -import net.sf.samtools.GATKChunk; -import net.sf.samtools.LinearIndex; +import net.sf.samtools.*; import java.util.ArrayList; import java.util.Collections; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/IntervalSharder.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/IntervalSharder.java index fc3f76ab7..4ddf28dce 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/IntervalSharder.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/IntervalSharder.java @@ -35,16 +35,7 @@ import org.broadinstitute.sting.utils.GenomeLocSortedSet; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.PriorityQueue; -import java.util.Queue; +import java.util.*; /** * Shard intervals based on position within the BAM file. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShard.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShard.java index 26af890b4..19d33aa6b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShard.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShard.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.datasources.reads; +import net.sf.samtools.SAMFileSpan; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.Utils; @@ -7,8 +8,6 @@ import org.broadinstitute.sting.utils.Utils; import java.util.List; import java.util.Map; -import net.sf.samtools.SAMFileSpan; - /** * Handles locus shards of BAM information. * @author aaron diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShardStrategy.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShardStrategy.java index 950d67428..a5ca07853 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShardStrategy.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/LocusShardStrategy.java @@ -24,17 +24,18 @@ package org.broadinstitute.sting.gatk.datasources.reads; -import net.sf.samtools.GATKBAMFileSpan; -import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMFileSpan; +import net.sf.samtools.SAMSequenceRecord; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.GenomeLocSortedSet; -import java.util.*; - -import net.sf.samtools.SAMFileHeader; -import net.sf.samtools.SAMSequenceRecord; -import net.sf.samtools.SAMFileSpan; -import net.sf.picard.reference.IndexedFastaSequenceFile; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; /** * A sharding strategy for loci based on reading of the index. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShard.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShard.java index 7579c22f6..278eeb898 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShard.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShard.java @@ -1,8 +1,8 @@ package org.broadinstitute.sting.gatk.datasources.reads; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.GenomeLoc; import java.util.List; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShardStrategy.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShardStrategy.java index 10228ecd7..28b737f28 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShardStrategy.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/MonolithicShardStrategy.java @@ -4,8 +4,8 @@ import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import java.util.Iterator; -import java.util.NoSuchElementException; import java.util.List; +import java.util.NoSuchElementException; /** * Create a giant shard representing all the data in the input BAM(s). diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShard.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShard.java index 9aecd7779..4d9c9092d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShard.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShard.java @@ -1,15 +1,17 @@ package org.broadinstitute.sting.gatk.datasources.reads; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.gatk.iterators.StingSAMIteratorAdapter; - -import java.util.*; - import net.sf.samtools.SAMFileSpan; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.iterators.StingSAMIteratorAdapter; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + /** * * User: aaron diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShardStrategy.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShardStrategy.java index da70a615b..c2235ec73 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShardStrategy.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ReadShardStrategy.java @@ -25,12 +25,11 @@ package org.broadinstitute.sting.gatk.datasources.reads; import net.sf.samtools.SAMFileSpan; - -import java.util.*; - import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import java.util.*; + /** * The sharding strategy for reads using a simple counting mechanism. Each read shard * has a specific number of reads (default to 10K) which is configured in the constructor. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java index c2aa5f18e..6064806f3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java @@ -24,21 +24,19 @@ package org.broadinstitute.sting.gatk.datasources.reads; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.picard.sam.MergingSamRecordIterator; +import net.sf.picard.sam.SamFileHeaderMerger; import net.sf.samtools.*; import net.sf.samtools.util.CloseableIterator; -import net.sf.picard.filter.SamRecordFilter; -import net.sf.picard.sam.SamFileHeaderMerger; -import net.sf.picard.sam.MergingSamRecordIterator; -import net.sf.picard.reference.IndexedFastaSequenceFile; - import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.DownsamplingMethod; -import org.broadinstitute.sting.gatk.filters.ReadFilter; -import org.broadinstitute.sting.gatk.iterators.*; -import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.ReadMetrics; +import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; import org.broadinstitute.sting.gatk.filters.CountingFilteringIterator; +import org.broadinstitute.sting.gatk.filters.ReadFilter; +import org.broadinstitute.sting.gatk.iterators.*; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.baq.BAQ; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/Shard.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/Shard.java index 418f5d3ee..f8d941784 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/Shard.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/Shard.java @@ -2,17 +2,13 @@ package org.broadinstitute.sting.gatk.datasources.reads; import net.sf.samtools.SAMFileSpan; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource; -import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.gatk.ReadMetrics; import org.broadinstitute.sting.gatk.ReadProperties; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.HasGenomeLocation; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.io.Serializable; import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ShardStrategyFactory.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ShardStrategyFactory.java index fa733ce12..780b41ef7 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ShardStrategyFactory.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/ShardStrategyFactory.java @@ -1,10 +1,10 @@ package org.broadinstitute.sting.gatk.datasources.reads; -import net.sf.samtools.SAMSequenceDictionary; import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.samtools.SAMSequenceDictionary; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; /** * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMFileStat.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMFileStat.java index ae0f1cf43..07c13a76e 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMFileStat.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMFileStat.java @@ -25,17 +25,17 @@ package org.broadinstitute.sting.gatk.datasources.reads.utilities; -import org.broadinstitute.sting.commandline.CommandLineProgram; +import net.sf.samtools.BAMIndex; +import net.sf.samtools.SAMFileReader; import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.CommandLineProgram; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.instrumentation.Sizeof; import java.io.File; import java.lang.reflect.Field; -import java.util.Map; import java.util.List; - -import net.sf.samtools.*; +import java.util.Map; /** * diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMTagRenamer.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMTagRenamer.java index f03e2a44f..54de04379 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMTagRenamer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/BAMTagRenamer.java @@ -24,12 +24,12 @@ package org.broadinstitute.sting.gatk.datasources.reads.utilities; -import org.broadinstitute.sting.commandline.CommandLineProgram; -import org.broadinstitute.sting.commandline.Argument; -import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMFileReader; -import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMFileWriterFactory; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.CommandLineProgram; import java.io.File; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/PrintBGZFBounds.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/PrintBGZFBounds.java index df7dccaa9..773541d11 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/PrintBGZFBounds.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/utilities/PrintBGZFBounds.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.datasources.reads.utilities; -import net.sf.samtools.SAMFileReader; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.CommandLineProgram; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reference/ReferenceDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reference/ReferenceDataSource.java index c2d64ddd8..ef69a8e5f 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reference/ReferenceDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reference/ReferenceDataSource.java @@ -25,16 +25,15 @@ package org.broadinstitute.sting.gatk.datasources.reference; -import net.sf.picard.reference.ReferenceSequenceFileFactory; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import net.sf.picard.reference.FastaSequenceIndexBuilder; -import net.sf.picard.sam.CreateSequenceDictionary; -import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.picard.reference.FastaSequenceIndex; +import net.sf.picard.reference.FastaSequenceIndexBuilder; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.picard.sam.CreateSequenceDictionary; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; import org.broadinstitute.sting.utils.file.FSLockWithShared; import org.broadinstitute.sting.utils.file.FileSystemInabilityToLockException; -import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; import java.io.File; diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/rmd/ResourcePool.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/rmd/ResourcePool.java index 934f4f997..21f58d480 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/rmd/ResourcePool.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/rmd/ResourcePool.java @@ -28,11 +28,7 @@ import net.sf.samtools.SAMSequenceDictionary; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; /** * A pool of open resources, all of which can create a closeable iterator. diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java index 0a5981a1b..067bf3f72 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/sample/SampleDataSource.java @@ -3,11 +3,10 @@ package org.broadinstitute.sting.gatk.datasources.sample; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMReadGroupRecord; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.yaml.snakeyaml.TypeDescription; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; diff --git a/public/java/src/org/broadinstitute/sting/gatk/examples/CoverageBySample.java b/public/java/src/org/broadinstitute/sting/gatk/examples/CoverageBySample.java index a1419ba70..5dbd90405 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/examples/CoverageBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/examples/CoverageBySample.java @@ -1,15 +1,20 @@ package org.broadinstitute.sting.gatk.examples; -import net.sf.samtools.*; -import org.broadinstitute.sting.gatk.refdata.*; -import org.broadinstitute.sting.gatk.walkers.LocusWalker; -import org.broadinstitute.sting.gatk.contexts.*; -import org.broadinstitute.sting.utils.pileup.*; +import net.sf.samtools.SAMReadGroupRecord; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import java.util.*; import java.io.PrintStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; /** * Computes the coverage per sample. diff --git a/public/java/src/org/broadinstitute/sting/gatk/examples/GATKPaperGenotyper.java b/public/java/src/org/broadinstitute/sting/gatk/examples/GATKPaperGenotyper.java index b96d0ffbf..26205a203 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/examples/GATKPaperGenotyper.java +++ b/public/java/src/org/broadinstitute/sting/gatk/examples/GATKPaperGenotyper.java @@ -25,6 +25,8 @@ package org.broadinstitute.sting.gatk.examples; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -32,8 +34,6 @@ import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.gatk.walkers.TreeReducible; import org.broadinstitute.sting.gatk.walkers.genotyper.DiploidSNPGenotypePriors; import org.broadinstitute.sting.utils.MathUtils; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import java.io.PrintStream; diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/Accumulator.java b/public/java/src/org/broadinstitute/sting/gatk/executive/Accumulator.java index 3e335733d..b23782563 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/Accumulator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/Accumulator.java @@ -25,18 +25,18 @@ package org.broadinstitute.sting.gatk.executive; -import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; -import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider; +import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; +import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.ArrayList; -import java.util.List; import java.util.Iterator; +import java.util.List; /** * Manages the */ diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/HierarchicalMicroScheduler.java b/public/java/src/org/broadinstitute/sting/gatk/executive/HierarchicalMicroScheduler.java index 8a27e008c..59fb4aa9e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/HierarchicalMicroScheduler.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/HierarchicalMicroScheduler.java @@ -1,27 +1,27 @@ package org.broadinstitute.sting.gatk.executive; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource; import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.gatk.walkers.TreeReducible; import org.broadinstitute.sting.gatk.datasources.reads.ShardStrategy; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.gatk.io.*; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.io.OutputTracker; +import org.broadinstitute.sting.gatk.io.ThreadLocalOutputTracker; +import org.broadinstitute.sting.gatk.walkers.TreeReducible; +import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.threading.ThreadPoolMonitor; -import java.util.Queue; -import java.util.LinkedList; import java.util.Collection; -import java.util.concurrent.Executors; +import java.util.LinkedList; +import java.util.Queue; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; -import net.sf.picard.reference.IndexedFastaSequenceFile; - /** * A microscheduler that schedules shards according to a tree-like structure. * Requires a special walker tagged with a 'TreeReducible' interface. diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java b/public/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java index 4cb571c45..9466fdf75 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/LinearMicroScheduler.java @@ -1,22 +1,21 @@ package org.broadinstitute.sting.gatk.executive; -import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider; import org.broadinstitute.sting.gatk.datasources.providers.ReadShardDataProvider; +import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource; import org.broadinstitute.sting.gatk.datasources.reads.Shard; import org.broadinstitute.sting.gatk.datasources.reads.ShardStrategy; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.gatk.io.DirectOutputTracker; import org.broadinstitute.sting.gatk.io.OutputTracker; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.gatk.walkers.Walker; import java.util.Collection; -import net.sf.picard.reference.IndexedFastaSequenceFile; - /** A micro-scheduling manager for single-threaded execution of a traversal. */ public class LinearMicroScheduler extends MicroScheduler { diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java b/public/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java index cfe0f8187..23e5769f1 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/MicroScheduler.java @@ -25,26 +25,18 @@ package org.broadinstitute.sting.gatk.executive; +import net.sf.picard.reference.IndexedFastaSequenceFile; import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource; -import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.datasources.reads.Shard; import org.broadinstitute.sting.gatk.datasources.reads.ShardStrategy; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; +import org.broadinstitute.sting.gatk.io.OutputTracker; +import org.broadinstitute.sting.gatk.iterators.NullSAMIterator; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; import org.broadinstitute.sting.gatk.traversals.*; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.io.OutputTracker; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.gatk.iterators.NullSAMIterator; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.gatk.ReadMetrics; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.PrintStream; -import java.lang.management.ManagementFactory; -import java.util.*; - -import net.sf.picard.reference.IndexedFastaSequenceFile; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.threading.*; @@ -52,6 +44,11 @@ import org.broadinstitute.sting.utils.threading.*; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.lang.management.ManagementFactory; +import java.util.Collection; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/OutputMergeTask.java b/public/java/src/org/broadinstitute/sting/gatk/executive/OutputMergeTask.java index 76e0c1c8a..7be37a616 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/OutputMergeTask.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/OutputMergeTask.java @@ -1,10 +1,9 @@ package org.broadinstitute.sting.gatk.executive; import org.broadinstitute.sting.gatk.io.storage.Storage; -import org.broadinstitute.sting.gatk.io.OutputTracker; -import java.util.Collection; import java.util.ArrayList; +import java.util.Collection; /** * User: hanna diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/ReduceTree.java b/public/java/src/org/broadinstitute/sting/gatk/executive/ReduceTree.java index 151a1ba26..7aac70b47 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/ReduceTree.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/ReduceTree.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.executive; -import java.util.Queue; -import java.util.List; import java.util.ArrayList; import java.util.LinkedList; +import java.util.List; +import java.util.Queue; import java.util.concurrent.Future; /** * User: hanna diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java b/public/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java index b78a4edc9..6136bd68d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.executive; import org.apache.log4j.Logger; -import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider; +import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.broadinstitute.sting.gatk.traversals.TraversalEngine; import org.broadinstitute.sting.gatk.io.ThreadLocalOutputTracker; -import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.gatk.traversals.TraversalEngine; import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.concurrent.Callable; diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/TreeReducer.java b/public/java/src/org/broadinstitute/sting/gatk/executive/TreeReducer.java index 8fb4adb5d..d36a3b576 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/TreeReducer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/TreeReducer.java @@ -4,8 +4,8 @@ import org.broadinstitute.sting.gatk.walkers.TreeReducible; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.concurrent.Callable; -import java.util.concurrent.Future; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; /** * User: hanna * Date: Apr 29, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java b/public/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java index 5c341bb02..cfbce58ee 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/executive/WindowMaker.java @@ -1,17 +1,20 @@ package org.broadinstitute.sting.gatk.executive; -import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.gatk.iterators.*; +import net.sf.picard.util.PeekableIterator; import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; - -import java.util.*; - -import net.sf.picard.util.PeekableIterator; +import org.broadinstitute.sting.gatk.datasources.reads.Shard; +import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; +import org.broadinstitute.sting.gatk.iterators.LocusIterator; +import org.broadinstitute.sting.gatk.iterators.LocusIteratorByState; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + /** * Buffer shards of data which may or may not contain multiple loci into * iterators of all data which cover an interval. Its existence is an homage diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/BadCigarFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/BadCigarFilter.java index b8a3ee977..0987c5d74 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/BadCigarFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/BadCigarFilter.java @@ -24,8 +24,10 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; -import net.sf.samtools.*; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; /** * Filter out reads with wonky cigar strings. diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/BadMateFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/BadMateFilter.java index 3b988c8fb..8596e18eb 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/BadMateFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/BadMateFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java b/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java index 84390c173..03fc2063b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java @@ -23,17 +23,16 @@ */ package org.broadinstitute.sting.gatk.filters; -import net.sf.samtools.util.CloserUtil; - -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Collection; - +import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; import net.sf.samtools.util.CloseableIterator; -import net.sf.picard.filter.SamRecordFilter; +import net.sf.samtools.util.CloserUtil; import org.broadinstitute.sting.gatk.ReadMetrics; +import java.util.Collection; +import java.util.Iterator; +import java.util.NoSuchElementException; + /** * Filtering Iterator which takes a filter and an iterator and iterates * through only those records which are not rejected by the filter. diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/DuplicateReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/DuplicateReadFilter.java index fb3c38582..589910fc7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/DuplicateReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/DuplicateReadFilter.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /* diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java index b7806524a..cd77a9e7e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/FailsVendorQualityCheckReadFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/FilterManager.java b/public/java/src/org/broadinstitute/sting/gatk/filters/FilterManager.java index cda08fb66..67f82235d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/FilterManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/FilterManager.java @@ -25,11 +25,8 @@ package org.broadinstitute.sting.gatk.filters; -import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.classloader.PluginManager; -import net.sf.picard.filter.SamRecordFilter; - import java.util.Collection; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MalformedReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MalformedReadFilter.java index 4deeb09ee..74deace9a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MalformedReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MalformedReadFilter.java @@ -24,8 +24,8 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMSequenceRecord; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java index bcd473b15..75369b306 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityReadFilter.java @@ -25,7 +25,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java index cecbedda8..1afec36d1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MappingQualityUnavailableReadFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.util.QualityUtil; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.QualityUtils; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MaxInsertSizeFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MaxInsertSizeFilter.java index 584783d34..7bcee033f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MaxInsertSizeFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MaxInsertSizeFilter.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MaxReadLengthFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MaxReadLengthFilter.java index 8a2fd5af3..cd31da61a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MaxReadLengthFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MaxReadLengthFilter.java @@ -25,7 +25,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/MissingReadGroupFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/MissingReadGroupFilter.java index d5d40ec38..490a55040 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/MissingReadGroupFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/MissingReadGroupFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/NoOriginalQualityScoresFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/NoOriginalQualityScoresFilter.java index fc21538e8..29738e499 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/NoOriginalQualityScoresFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/NoOriginalQualityScoresFilter.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /* diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java index cfbba0383..31c2144ce 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/NotPrimaryAlignmentReadFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/Platform454Filter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/Platform454Filter.java index dcddebd55..8ad91ac1c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/Platform454Filter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/Platform454Filter.java @@ -25,9 +25,7 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; - import org.broadinstitute.sting.utils.sam.ReadUtils; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformFilter.java index 691fd95f0..30b2f828d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformFilter.java @@ -25,11 +25,9 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; - -import org.broadinstitute.sting.utils.sam.ReadUtils; import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.utils.sam.ReadUtils; /** * Filter out PL matching reads. diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java index 4ef88402d..81044b888 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java @@ -1,14 +1,12 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMReadGroupRecord; - -import java.util.Set; -import java.util.HashSet; - +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.exceptions.UserException; +import java.util.HashSet; +import java.util.Set; + /** * Created by IntelliJ IDEA. * User: asivache diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadFilter.java index 1d74ee20e..227637761 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadFilter.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.gatk.filters; import net.sf.picard.filter.SamRecordFilter; -import net.sf.samtools.SAMFileHeader; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadGroupBlackListFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadGroupBlackListFilter.java index 69ebc8b04..0e5e8800c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadGroupBlackListFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadGroupBlackListFilter.java @@ -25,17 +25,16 @@ package org.broadinstitute.sting.gatk.filters; -import java.util.*; -import java.util.Map.Entry; -import java.io.File; -import java.io.FileNotFoundException; - -import net.sf.picard.filter.SamRecordFilter; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; +import java.io.File; +import java.io.FileNotFoundException; +import java.util.*; +import java.util.Map.Entry; + /** * Removes records matching the read group tag and exact match string. * For example, this filter value: diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadStrandFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadStrandFilter.java index 1b2a77f45..16eeed3cc 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/ReadStrandFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/ReadStrandFilter.java @@ -25,7 +25,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/SampleFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/SampleFilter.java index 682b22b1f..99d6bc154 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/SampleFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/SampleFilter.java @@ -25,9 +25,8 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/SingleReadGroupFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/SingleReadGroupFilter.java index 05b472036..2f93cbcae 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/SingleReadGroupFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/SingleReadGroupFilter.java @@ -25,9 +25,8 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMReadGroupRecord; -import net.sf.picard.filter.SamRecordFilter; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/filters/UnmappedReadFilter.java b/public/java/src/org/broadinstitute/sting/gatk/filters/UnmappedReadFilter.java index ac4f4853a..e7ee345d2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/UnmappedReadFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/UnmappedReadFilter.java @@ -24,7 +24,6 @@ package org.broadinstitute.sting.gatk.filters; -import net.sf.picard.filter.SamRecordFilter; import net.sf.samtools.SAMRecord; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/DirectOutputTracker.java b/public/java/src/org/broadinstitute/sting/gatk/io/DirectOutputTracker.java index 865528688..658a28fbd 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/DirectOutputTracker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/DirectOutputTracker.java @@ -25,9 +25,9 @@ package org.broadinstitute.sting.gatk.io; -import org.broadinstitute.sting.gatk.io.stubs.Stub; -import org.broadinstitute.sting.gatk.io.storage.StorageFactory; import org.broadinstitute.sting.gatk.io.storage.Storage; +import org.broadinstitute.sting.gatk.io.storage.StorageFactory; +import org.broadinstitute.sting.gatk.io.stubs.Stub; /** * Maps creation of storage directly to output streams in parent. diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/OutputTracker.java b/public/java/src/org/broadinstitute/sting/gatk/io/OutputTracker.java index b68013aa4..f39ba2d8d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/io/OutputTracker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/OutputTracker.java @@ -26,20 +26,20 @@ package org.broadinstitute.sting.gatk.io; import net.sf.samtools.SAMFileReader; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.classloader.JVMUtils; import org.broadinstitute.sting.commandline.ArgumentSource; -import org.broadinstitute.sting.utils.sam.SAMFileReaderBuilder; -import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.gatk.io.storage.Storage; +import org.broadinstitute.sting.gatk.io.storage.StorageFactory; import org.broadinstitute.sting.gatk.io.stubs.OutputStreamStub; import org.broadinstitute.sting.gatk.io.stubs.Stub; -import org.broadinstitute.sting.gatk.io.storage.StorageFactory; -import org.broadinstitute.sting.gatk.io.storage.Storage; +import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.sam.SAMFileReaderBuilder; -import java.io.*; +import java.io.OutputStream; import java.lang.reflect.Field; -import java.util.Map; import java.util.HashMap; +import java.util.Map; /** * Manages the output and err streams that are created specifically for walker diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/StingSAMFileWriter.java b/public/java/src/org/broadinstitute/sting/gatk/io/StingSAMFileWriter.java index 8701ecf3c..a9a74925d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/StingSAMFileWriter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/StingSAMFileWriter.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.gatk.io; -import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMFileWriter; /** * A writer that will allow unsorted BAM files to be written diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/ThreadLocalOutputTracker.java b/public/java/src/org/broadinstitute/sting/gatk/io/ThreadLocalOutputTracker.java index 36960246a..999deddd1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/ThreadLocalOutputTracker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/ThreadLocalOutputTracker.java @@ -25,15 +25,16 @@ package org.broadinstitute.sting.gatk.io; -import org.broadinstitute.sting.gatk.io.stubs.Stub; -import org.broadinstitute.sting.gatk.io.storage.StorageFactory; -import org.broadinstitute.sting.gatk.io.storage.Storage; import org.broadinstitute.sting.gatk.executive.OutputMergeTask; +import org.broadinstitute.sting.gatk.io.storage.Storage; +import org.broadinstitute.sting.gatk.io.storage.StorageFactory; +import org.broadinstitute.sting.gatk.io.stubs.Stub; import org.broadinstitute.sting.utils.exceptions.UserException; -import java.util.*; import java.io.File; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; /** * An output tracker that can either track its output per-thread or directly, diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/storage/OutputStreamStorage.java b/public/java/src/org/broadinstitute/sting/gatk/io/storage/OutputStreamStorage.java index 4dc976289..56c9c0465 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/storage/OutputStreamStorage.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/storage/OutputStreamStorage.java @@ -25,14 +25,14 @@ package org.broadinstitute.sting.gatk.io.storage; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.gatk.io.stubs.OutputStreamStub; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.*; +import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; -import java.nio.channels.Channels; public class OutputStreamStorage extends OutputStream implements Storage { /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/storage/SAMFileWriterStorage.java b/public/java/src/org/broadinstitute/sting/gatk/io/storage/SAMFileWriterStorage.java index 610db1d76..cb8786be1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/storage/SAMFileWriterStorage.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/storage/SAMFileWriterStorage.java @@ -27,17 +27,16 @@ package org.broadinstitute.sting.gatk.io.storage; import net.sf.samtools.*; import net.sf.samtools.util.CloseableIterator; - -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - import net.sf.samtools.util.RuntimeIOException; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterStub; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.sam.SimplifyingSAMFileWriter; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** * Provides temporary storage for SAMFileWriters. * diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/storage/StorageFactory.java b/public/java/src/org/broadinstitute/sting/gatk/io/storage/StorageFactory.java index ee5c56524..66907dd6b 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/storage/StorageFactory.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/storage/StorageFactory.java @@ -25,9 +25,9 @@ package org.broadinstitute.sting.gatk.io.storage; -import org.broadinstitute.sting.gatk.io.stubs.Stub; import org.broadinstitute.sting.gatk.io.stubs.OutputStreamStub; import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterStub; +import org.broadinstitute.sting.gatk.io.stubs.Stub; import org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/storage/VCFWriterStorage.java b/public/java/src/org/broadinstitute/sting/gatk/io/storage/VCFWriterStorage.java index 74176ec35..1da03e9c2 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/storage/VCFWriterStorage.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/storage/VCFWriterStorage.java @@ -1,16 +1,21 @@ package org.broadinstitute.sting.gatk.io.storage; +import net.sf.samtools.util.BlockCompressedOutputStream; import org.apache.log4j.Logger; import org.broad.tribble.source.BasicFeatureSource; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub; - -import java.io.*; - -import net.sf.samtools.util.BlockCompressedOutputStream; +import org.broadinstitute.sting.utils.codecs.vcf.StandardVCFWriter; +import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; /** * Provides temporary and permanent storage for genotypes in VCF format. diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamArgumentTypeDescriptor.java index 00e78f391..8bc97c886 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamArgumentTypeDescriptor.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamArgumentTypeDescriptor.java @@ -30,8 +30,8 @@ import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.io.OutputStream; import java.io.File; +import java.io.OutputStream; import java.lang.reflect.Constructor; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamStub.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamStub.java index 5cf84c5a2..27bcb8a1c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamStub.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/OutputStreamStub.java @@ -27,9 +27,9 @@ package org.broadinstitute.sting.gatk.io.stubs; import org.broadinstitute.sting.gatk.io.OutputTracker; -import java.io.OutputStream; -import java.io.IOException; import java.io.File; +import java.io.IOException; +import java.io.OutputStream; /** * A stub for routing and management of anything backed by an OutputStream. diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileReaderArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileReaderArgumentTypeDescriptor.java index d847015ed..f124c2302 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileReaderArgumentTypeDescriptor.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileReaderArgumentTypeDescriptor.java @@ -24,14 +24,14 @@ package org.broadinstitute.sting.gatk.io.stubs; -import org.broadinstitute.sting.commandline.ArgumentTypeDescriptor; -import org.broadinstitute.sting.commandline.ArgumentSource; +import net.sf.samtools.SAMFileReader; import org.broadinstitute.sting.commandline.ArgumentMatches; +import org.broadinstitute.sting.commandline.ArgumentSource; +import org.broadinstitute.sting.commandline.ArgumentTypeDescriptor; import org.broadinstitute.sting.commandline.ParsingEngine; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.sam.SAMFileReaderBuilder; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import net.sf.samtools.SAMFileReader; import java.io.File; diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterArgumentTypeDescriptor.java index a9a272220..38640eda0 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterArgumentTypeDescriptor.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterArgumentTypeDescriptor.java @@ -25,18 +25,17 @@ package org.broadinstitute.sting.gatk.io.stubs; +import net.sf.samtools.SAMFileWriter; import org.broadinstitute.sting.commandline.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; -import net.sf.samtools.SAMFileWriter; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Arrays; import java.io.File; import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.List; /** * Insert a SAMFileWriterStub instead of a full-fledged concrete OutputStream implementations. diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterStub.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterStub.java index f5c1e0efc..d8e59a3dd 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterStub.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/SAMFileWriterStub.java @@ -25,20 +25,19 @@ package org.broadinstitute.sting.gatk.io.stubs; +import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMFileHeader; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.io.OutputTracker; +import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; +import org.broadinstitute.sting.utils.baq.BAQ; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.File; import java.io.OutputStream; -import org.broadinstitute.sting.gatk.io.OutputTracker; -import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.baq.BAQ; - /** * A stub for routing and management of SAM file reading and writing. * diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterArgumentTypeDescriptor.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterArgumentTypeDescriptor.java index 7521e754d..615841f02 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterArgumentTypeDescriptor.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterArgumentTypeDescriptor.java @@ -25,14 +25,17 @@ package org.broadinstitute.sting.gatk.io.stubs; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.File; import java.io.OutputStream; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; /** * Injects new command-line arguments into the system providing support for the genotype writer. diff --git a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterStub.java b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterStub.java index 1a79d2785..bb84f9457 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterStub.java +++ b/public/java/src/org/broadinstitute/sting/gatk/io/stubs/VCFWriterStub.java @@ -25,19 +25,19 @@ package org.broadinstitute.sting.gatk.io.stubs; -import java.io.File; -import java.io.PrintStream; -import java.io.OutputStream; -import java.util.Collection; - -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.gatk.CommandLineExecutable; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.io.OutputTracker; import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.io.File; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.Collection; /** * A stub for routing and management of genotype reading and writing. diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/BoundedReadIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/BoundedReadIterator.java index b5643f834..478675f9d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/BoundedReadIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/BoundedReadIterator.java @@ -1,13 +1,11 @@ package org.broadinstitute.sting.gatk.iterators; +import net.sf.picard.sam.MergingSamRecordIterator; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMRecord; -import net.sf.picard.sam.MergingSamRecordIterator; import java.util.Iterator; -import org.broadinstitute.sting.gatk.ReadProperties; - /* * Copyright (c) 2009 The Broad Institute * diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/BufferingReadIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/BufferingReadIterator.java index f3a060be1..7eaf4be41 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/BufferingReadIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/BufferingReadIterator.java @@ -26,12 +26,11 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; import net.sf.samtools.util.CloseableIterator; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.Queue; import java.util.LinkedList; import java.util.NoSuchElementException; - -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import java.util.Queue; /** * Buffers access to a large stream of reads, replenishing the buffer only when the reads diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/DownsampleIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/DownsampleIterator.java index 1342f11fd..835748ff0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/DownsampleIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/DownsampleIterator.java @@ -1,11 +1,10 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import java.util.Iterator; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; - public class DownsampleIterator implements StingSAMIterator { diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/GenomeLocusIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/GenomeLocusIterator.java index aa376a12a..240564d34 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/GenomeLocusIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/GenomeLocusIterator.java @@ -3,8 +3,8 @@ package org.broadinstitute.sting.gatk.iterators; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; -import java.util.NoSuchElementException; import java.util.Iterator; +import java.util.NoSuchElementException; /** * User: hanna * Date: May 12, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIterator.java index 30c1cf512..e177984ca 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIterator.java @@ -1,11 +1,10 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.util.CloseableIterator; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import java.util.Iterator; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; - /** * Iterator that traverses a SAM File, accumulating information on a per-locus basis */ diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java index 4e58813f5..e13c5a764 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/LocusIteratorByState.java @@ -25,19 +25,27 @@ package org.broadinstitute.sting.gatk.iterators; -import net.sf.samtools.*; import net.sf.picard.util.PeekableIterator; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.gatk.ReadProperties; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.gatk.DownsamplingMethod; import org.broadinstitute.sting.gatk.DownsampleType; +import org.broadinstitute.sting.gatk.DownsamplingMethod; +import org.broadinstitute.sting.gatk.ReadProperties; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.gatk.datasources.sample.SampleDataSource; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.ReservoirDownsampler; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.pileup.*; +import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileupImpl; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; import org.broadinstitute.sting.utils.sam.ReadUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/NullSAMIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/NullSAMIterator.java index ff458467f..21b71c9e6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/NullSAMIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/NullSAMIterator.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.iterators; -import org.broadinstitute.sting.gatk.ReadProperties; import net.sf.samtools.SAMRecord; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/PositionTrackingIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/PositionTrackingIterator.java index c2d3976ea..cc499b247 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/PositionTrackingIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/PositionTrackingIterator.java @@ -25,7 +25,6 @@ package org.broadinstitute.sting.gatk.iterators; -import org.broadinstitute.sting.gatk.ReadProperties; import net.sf.samtools.SAMRecord; import net.sf.samtools.util.CloseableIterator; diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java index 239392eec..2f30d12a8 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java @@ -1,13 +1,8 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMTag; -import net.sf.samtools.SAMReadGroupRecord; -import org.broadinstitute.sting.gatk.ReadProperties; -import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.apache.log4j.Logger; - -import java.util.List; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; /** * An iterator which does post-processing of a read, including potentially wrapping diff --git a/public/java/src/org/broadinstitute/sting/gatk/iterators/StingSAMIterator.java b/public/java/src/org/broadinstitute/sting/gatk/iterators/StingSAMIterator.java index d294993d4..1b248d097 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/StingSAMIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/StingSAMIterator.java @@ -2,7 +2,6 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; import net.sf.samtools.util.CloseableIterator; -import org.broadinstitute.sting.gatk.ReadProperties; /** * * User: aaron diff --git a/public/java/src/org/broadinstitute/sting/gatk/phonehome/GATKRunReport.java b/public/java/src/org/broadinstitute/sting/gatk/phonehome/GATKRunReport.java index a51ca9292..69c0b3e0a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/phonehome/GATKRunReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/phonehome/GATKRunReport.java @@ -26,19 +26,16 @@ package org.broadinstitute.sting.gatk.phonehome; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.broadinstitute.sting.commandline.CommandLineUtils; import org.broadinstitute.sting.gatk.CommandLineGATK; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection; import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.jets3t.service.S3Service; import org.jets3t.service.S3ServiceException; import org.jets3t.service.impl.rest.httpclient.RestS3Service; -import org.jets3t.service.model.S3Bucket; import org.jets3t.service.model.S3Object; import org.jets3t.service.security.AWSCredentials; import org.simpleframework.xml.Element; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordIterator.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordIterator.java index fa0c323b5..ce924fd87 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordIterator.java @@ -25,17 +25,17 @@ package org.broadinstitute.sting.gatk.refdata; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.gatk.iterators.PushbackIterator; +import java.io.File; +import java.io.FileNotFoundException; +import java.lang.reflect.Constructor; import java.util.Iterator; import java.util.regex.Pattern; -import java.io.FileNotFoundException; -import java.io.File; -import java.lang.reflect.Constructor; /** * This is a low-level iterator designed to provide system-wide generic support for reading record-oriented data diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordListImpl.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordListImpl.java index cff97e4ee..59b273d38 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordListImpl.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/RODRecordListImpl.java @@ -2,9 +2,9 @@ package org.broadinstitute.sting.gatk.refdata; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.HasGenomeLocation; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.GenomeLoc; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java index 43bf6f8e0..d03b122e2 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.refdata; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java index b3cb22a03..b7437e6e8 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/SeekableRODIterator.java @@ -6,9 +6,9 @@ import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java index c7c0468e7..1d622e2c7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java @@ -3,17 +3,13 @@ package org.broadinstitute.sting.gatk.refdata; import org.broad.tribble.Feature; import org.broad.tribble.dbsnp.DbSNPFeature; import org.broad.tribble.gelitext.GeliTextFeature; -import org.broadinstitute.sting.utils.codecs.hapmap.HapMapFeature; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.MutableGenotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.utils.classloader.PluginManager; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.codecs.hapmap.HapMapFeature; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.*; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableCodec.java index 59cd14a22..6bba754be 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableCodec.java @@ -25,12 +25,6 @@ package org.broadinstitute.sting.gatk.refdata.features.annotator; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.StringTokenizer; - import org.apache.log4j.Logger; import org.broad.tribble.Feature; import org.broad.tribble.exception.CodecLineParsingException; @@ -41,6 +35,12 @@ import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.Utils; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.StringTokenizer; + public class AnnotatorInputTableCodec implements ReferenceDependentFeatureCodec { private static Logger logger = Logger.getLogger(AnnotatorInputTableCodec.class); diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableFeature.java index d97e378fb..d12badd28 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/annotator/AnnotatorInputTableFeature.java @@ -25,13 +25,13 @@ package org.broadinstitute.sting.gatk.refdata.features.annotator; +import org.broad.tribble.Feature; + import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.broad.tribble.Feature; - /** * This class represents a single record in an AnnotatorInputTable. */ diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleCodec.java index 7f97451cf..5e536d4c1 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleCodec.java @@ -26,19 +26,19 @@ package org.broadinstitute.sting.gatk.refdata.features.beagle; import org.broad.tribble.Feature; +import org.broad.tribble.exception.CodecLineParsingException; import org.broad.tribble.readers.AsciiLineReader; import org.broad.tribble.readers.LineReader; +import org.broadinstitute.sting.gatk.refdata.ReferenceDependentFeatureCodec; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; -import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.broad.tribble.exception.CodecLineParsingException; -import org.broadinstitute.sting.gatk.refdata.ReferenceDependentFeatureCodec; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; public class BeagleCodec implements ReferenceDependentFeatureCodec { private String[] header; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleFeature.java index c7bf86569..e6832754d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/beagle/BeagleFeature.java @@ -25,14 +25,11 @@ package org.broadinstitute.sting.gatk.refdata.features.beagle; import org.broad.tribble.Feature; - +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.ArrayList; import java.util.Map; -import net.sf.samtools.util.StringUtil; -import org.broadinstitute.sting.utils.variantcontext.Allele; - public class BeagleFeature implements Feature { private String chr; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/refseq/RefSeqFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/refseq/RefSeqFeature.java index 4648efd1e..d12114f9a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/refseq/RefSeqFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/refseq/RefSeqFeature.java @@ -4,9 +4,8 @@ import org.broad.tribble.Feature; import org.broadinstitute.sting.gatk.refdata.Transcript; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.ArrayList; import java.util.List; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupCodec.java index 00b7c45d9..43e2c3ff5 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupCodec.java @@ -25,15 +25,15 @@ package org.broadinstitute.sting.gatk.refdata.features.sampileup; -import org.broad.tribble.FeatureCodec; import org.broad.tribble.Feature; +import org.broad.tribble.FeatureCodec; import org.broad.tribble.exception.CodecLineParsingException; import org.broad.tribble.readers.LineReader; import org.broad.tribble.util.ParsingUtils; import java.util.ArrayList; -import java.util.regex.Pattern; import java.util.regex.Matcher; +import java.util.regex.Pattern; import static org.broadinstitute.sting.gatk.refdata.features.sampileup.SAMPileupFeature.VariantType; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupFeature.java index a794c2704..378f26934 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/sampileup/SAMPileupFeature.java @@ -25,12 +25,11 @@ package org.broadinstitute.sting.gatk.refdata.features.sampileup; +import net.sf.samtools.util.StringUtil; import org.broad.tribble.Feature; import java.util.List; -import net.sf.samtools.util.StringUtil; - /** * A tribble feature representing a SAM pileup. * diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/samread/SAMReadCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/samread/SAMReadCodec.java index 15f559d46..039b8adde 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/samread/SAMReadCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/samread/SAMReadCodec.java @@ -24,14 +24,14 @@ package org.broadinstitute.sting.gatk.refdata.features.samread; +import net.sf.samtools.Cigar; +import net.sf.samtools.TextCigarCodec; +import net.sf.samtools.util.StringUtil; import org.broad.tribble.Feature; import org.broad.tribble.FeatureCodec; import org.broad.tribble.exception.CodecLineParsingException; import org.broad.tribble.readers.LineReader; import org.broad.tribble.util.ParsingUtils; -import net.sf.samtools.util.StringUtil; -import net.sf.samtools.TextCigarCodec; -import net.sf.samtools.Cigar; /** * Decodes a simple SAM text string. diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/BedTableCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/BedTableCodec.java index b831606a3..745ccdd9f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/BedTableCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/BedTableCodec.java @@ -1,13 +1,8 @@ package org.broadinstitute.sting.gatk.refdata.features.table; import org.broad.tribble.Feature; -import org.broad.tribble.readers.LineReader; import org.broadinstitute.sting.gatk.refdata.ReferenceDependentFeatureCodec; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.exceptions.UserException; -import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java index 6f0a712bf..ab1ac59d8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableCodec.java @@ -1,16 +1,14 @@ package org.broadinstitute.sting.gatk.refdata.features.table; import org.broad.tribble.Feature; -import org.broad.tribble.FeatureCodec; import org.broad.tribble.readers.LineReader; import org.broadinstitute.sting.gatk.refdata.ReferenceDependentFeatureCodec; -import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.interval.IntervalUtils; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; /** * implementation of a simple table (tab or comma delimited format) input files diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java index 4b4ebe450..ca73ee960 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/features/table/TableFeature.java @@ -3,7 +3,7 @@ package org.broadinstitute.sting.gatk.refdata.features.table; import org.broad.tribble.Feature; import org.broadinstitute.sting.utils.GenomeLoc; -import java.util.*; +import java.util.List; /** * A feature representing a single row out of a text table diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/indexer/RMDIndexer.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/indexer/RMDIndexer.java index 5bb65f9a2..085d6b5b3 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/indexer/RMDIndexer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/indexer/RMDIndexer.java @@ -10,7 +10,6 @@ import org.broad.tribble.util.LittleEndianOutputStream; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.CommandLineProgram; import org.broadinstitute.sting.commandline.Input; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; import org.broadinstitute.sting.gatk.refdata.ReferenceDependentFeatureCodec; import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java index 19050ae11..731df997d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/QueryableTrack.java @@ -28,7 +28,6 @@ import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.utils.GenomeLoc; import java.io.IOException; -import java.util.Iterator; /** * @author aaron diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java index 3b9f8243f..ba1ca674e 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/RMDTrack.java @@ -35,8 +35,6 @@ import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.File; import java.io.IOException; -import java.lang.reflect.Type; -import java.util.Iterator; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/RMDTrackBuilder.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/RMDTrackBuilder.java index c2057ad5e..19c91be1b 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/RMDTrackBuilder.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/tracks/builders/RMDTrackBuilder.java @@ -42,15 +42,17 @@ import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet; import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet.RMDStorageType; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.SequenceDictionaryUtils; -import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.classloader.PluginManager; -import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.file.FSLockWithShared; import org.broadinstitute.sting.utils.file.FileSystemInabilityToLockException; import org.broadinstitute.sting.utils.instrumentation.Sizeof; -import java.io.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java index 462bf98df..104ba87b5 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/FeatureToGATKFeatureIterator.java @@ -28,8 +28,6 @@ import org.broad.tribble.Feature; import org.broad.tribble.iterators.CloseableTribbleIterator; import org.broadinstitute.sting.utils.GenomeLocParser; -import java.util.Iterator; - /** * diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeature.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeature.java index 1553402a5..59e8471a3 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeature.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/GATKFeature.java @@ -28,8 +28,6 @@ import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.HasGenomeLocation; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java index 83aa5f056..96086598a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/LocationAwareSeekableRODIterator.java @@ -2,12 +2,8 @@ package org.broadinstitute.sting.gatk.refdata.utils; import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.util.CloseableIterator; -import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.utils.GenomeLoc; -import java.util.Iterator; -import java.util.List; - /** * @author aaron *

diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/StringToGenomeLocIteratorAdapter.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/StringToGenomeLocIteratorAdapter.java index 101784d97..fc7f7c58f 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/StringToGenomeLocIteratorAdapter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/StringToGenomeLocIteratorAdapter.java @@ -25,10 +25,10 @@ package org.broadinstitute.sting.gatk.refdata.utils; +import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.bed.BedParser; -import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/helpers/DbSNPHelper.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/helpers/DbSNPHelper.java index 75e7c1a32..3201769e0 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/helpers/DbSNPHelper.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/utils/helpers/DbSNPHelper.java @@ -3,8 +3,8 @@ package org.broadinstitute.sting.gatk.refdata.utils.helpers; import net.sf.samtools.util.SequenceUtil; import org.broad.tribble.annotation.Strand; import org.broad.tribble.dbsnp.DbSNPFeature; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Arrays; diff --git a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraversalEngine.java b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraversalEngine.java index e1085c6b2..89a179d0e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraversalEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraversalEngine.java @@ -25,11 +25,11 @@ package org.broadinstitute.sting.gatk.traversals; import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.gatk.ReadMetrics; import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; import org.broadinstitute.sting.gatk.datasources.reads.Shard; import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.gatk.ReadMetrics; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; @@ -38,7 +38,10 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; -import java.util.*; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; public abstract class TraversalEngine,ProviderType extends ShardDataProvider> { // Time in milliseconds since we initialized this engine diff --git a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseDuplicates.java b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseDuplicates.java index 89ff688a7..1ba48ca5f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseDuplicates.java +++ b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseDuplicates.java @@ -28,12 +28,11 @@ package org.broadinstitute.sting.gatk.traversals; import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.datasources.providers.ReadView; import org.broadinstitute.sting.gatk.datasources.providers.ReadShardDataProvider; +import org.broadinstitute.sting.gatk.datasources.providers.ReadView; import org.broadinstitute.sting.gatk.iterators.PushbackIterator; import org.broadinstitute.sting.gatk.walkers.DuplicateWalker; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLoci.java b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLoci.java index 240176f2f..232989fb0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLoci.java +++ b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseLoci.java @@ -10,7 +10,6 @@ import org.broadinstitute.sting.gatk.walkers.DataSource; import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReadPairs.java b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReadPairs.java index f15a20cd3..196d54036 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReadPairs.java +++ b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReadPairs.java @@ -1,16 +1,18 @@ package org.broadinstitute.sting.gatk.traversals; -import org.broadinstitute.sting.gatk.walkers.Requires; -import org.broadinstitute.sting.gatk.walkers.DataSource; -import org.broadinstitute.sting.gatk.walkers.ReadPairWalker; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordCoordinateComparator; +import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.datasources.providers.ReadShardDataProvider; import org.broadinstitute.sting.gatk.datasources.providers.ReadView; import org.broadinstitute.sting.gatk.datasources.reads.Shard; -import org.apache.log4j.Logger; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMRecordCoordinateComparator; +import org.broadinstitute.sting.gatk.walkers.DataSource; +import org.broadinstitute.sting.gatk.walkers.ReadPairWalker; +import org.broadinstitute.sting.gatk.walkers.Requires; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Traverse over a collection of read pairs, assuming that a given shard will contain all pairs. diff --git a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReads.java b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReads.java index 670676b48..06e4539c4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReads.java +++ b/public/java/src/org/broadinstitute/sting/gatk/traversals/TraverseReads.java @@ -2,14 +2,16 @@ package org.broadinstitute.sting.gatk.traversals; import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.gatk.WalkerManager; import org.broadinstitute.sting.gatk.ReadMetrics; +import org.broadinstitute.sting.gatk.WalkerManager; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.datasources.providers.*; +import org.broadinstitute.sting.gatk.datasources.providers.ReadBasedReferenceOrderedView; +import org.broadinstitute.sting.gatk.datasources.providers.ReadReferenceView; +import org.broadinstitute.sting.gatk.datasources.providers.ReadShardDataProvider; +import org.broadinstitute.sting.gatk.datasources.providers.ReadView; import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.DataSource; import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.GenomeLoc; /* diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/Allows.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/Allows.java index a29e51189..2541921e9 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/Allows.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/Allows.java @@ -1,11 +1,6 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.Documented; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; +import java.lang.annotation.*; /** * User: hanna * Date: May 19, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/BAQMode.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/BAQMode.java index 99dd46cbe..03097887d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/BAQMode.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/BAQMode.java @@ -1,11 +1,6 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.Documented; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; +import java.lang.annotation.*; /** * User: hanna diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/By.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/By.java index 25455b587..8fa6a4c1b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/By.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/By.java @@ -1,11 +1,6 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.Documented; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; +import java.lang.annotation.*; /** * User: hanna * Date: May 14, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java index 1a3f87a7a..ca4e3f5e3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/ClipReadsWalker.java @@ -25,29 +25,29 @@ package org.broadinstitute.sting.gatk.walkers; -import net.sf.samtools.*; -import net.sf.picard.reference.ReferenceSequenceFileFactory; -import net.sf.picard.reference.ReferenceSequenceFile; import net.sf.picard.reference.ReferenceSequence; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import net.sf.picard.reference.ReferenceSequenceFile; +import net.sf.picard.reference.ReferenceSequenceFileFactory; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.util.StringUtil; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.clipreads.ClippingOp; import org.broadinstitute.sting.utils.clipreads.ClippingRepresentation; import org.broadinstitute.sting.utils.clipreads.ReadClipper; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.sam.ReadUtils; -import java.util.*; -import java.util.regex.Pattern; -import java.util.regex.Matcher; import java.io.File; import java.io.PrintStream; - -import net.sf.samtools.util.StringUtil; -import org.broadinstitute.sting.utils.sam.ReadUtils; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * This ReadWalker provides simple, yet powerful read clipping capabilities. It allows the user to clip bases in reads 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 1fc606f07..4bfedb672 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/DuplicateWalker.java @@ -1,16 +1,13 @@ package org.broadinstitute.sting.gatk.walkers; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.filters.UnmappedReadFilter; import org.broadinstitute.sting.gatk.filters.NotPrimaryAlignmentReadFilter; +import org.broadinstitute.sting.gatk.filters.UnmappedReadFilter; import org.broadinstitute.sting.utils.GenomeLoc; import java.util.List; import java.util.Set; -import java.util.Arrays; - -import net.sf.samtools.SAMRecord; -import net.sf.picard.filter.SamRecordFilter; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/FindReadsWithNamesWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/FindReadsWithNamesWalker.java index a272150c7..56287df31 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/FindReadsWithNamesWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/FindReadsWithNamesWalker.java @@ -26,7 +26,6 @@ package org.broadinstitute.sting.gatk.walkers; import net.sf.samtools.SAMFileWriter; -import net.sf.samtools.SAMReadGroupRecord; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/FlagStatWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/FlagStatWalker.java index 13a55eaac..fcfcb81b5 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/FlagStatWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/FlagStatWalker.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import java.io.PrintStream; import java.text.DecimalFormat; import java.text.NumberFormat; -import java.io.PrintStream; /* diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/GCContentByIntervalWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/GCContentByIntervalWalker.java index c0f469973..68bea4dba 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/GCContentByIntervalWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/GCContentByIntervalWalker.java @@ -28,13 +28,12 @@ import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; import java.io.PrintStream; -import java.util.*; +import java.util.List; /** * Walks along reference and calculates the GC content for each interval. 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 fc4b403c5..b0b2687f4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/LocusWalker.java @@ -1,9 +1,12 @@ package org.broadinstitute.sting.gatk.walkers; -import org.broadinstitute.sting.gatk.filters.*; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; 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.UnmappedReadFilter; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PileupWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PileupWalker.java index 84d868c1a..508d1f6ee 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PileupWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PileupWalker.java @@ -26,22 +26,22 @@ package org.broadinstitute.sting.gatk.walkers; import org.broad.tribble.dbsnp.DbSNPFeature; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; -import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import java.io.PrintStream; import java.util.ArrayList; import java.util.List; -import java.io.PrintStream; /** * Prints the alignment in the pileup format. In the pileup format, each line represents a genomic position, diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintRODsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintRODsWalker.java index 9ac3fc0e6..158992a22 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintRODsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintRODsWalker.java @@ -25,15 +25,15 @@ package org.broadinstitute.sting.gatk.walkers; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.VariantContextAdaptors; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; -import org.broadinstitute.sting.commandline.Output; -import java.util.Iterator; import java.io.PrintStream; +import java.util.Iterator; /** * Prints out all of the RODs in the input data set. Data is rendered using the toString() method diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index 07938d322..a189c00b5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -28,14 +28,12 @@ package org.broadinstitute.sting.gatk.walkers; import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMReadGroupRecord; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.utils.baq.BAQ; -import java.io.PrintStream; - /** * Renders, in SAM/BAM format, all reads from the input data set in the order in which they appear * in the input file. It can dynamically merge the contents of multiple input BAM files, resulting diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/ReadWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/ReadWalker.java index a5486fd9a..db2038aa3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/ReadWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/ReadWalker.java @@ -1,8 +1,8 @@ package org.broadinstitute.sting.gatk.walkers; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/Requires.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/Requires.java index 6c1e64c4e..e9a381a85 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/Requires.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/Requires.java @@ -1,11 +1,6 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.Documented; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; +import java.lang.annotation.*; /** * User: hanna * Date: May 19, 2009 diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/SplitSamFileWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/SplitSamFileWalker.java index 014acff9c..486d233b7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/SplitSamFileWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/SplitSamFileWalker.java @@ -25,14 +25,20 @@ package org.broadinstitute.sting.gatk.walkers; -import net.sf.samtools.*; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.utils.sam.ReadUtils; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMFileWriter; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.utils.sam.ReadUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Divides the input data set into separate BAM files, one for each sample in the input data set. The split diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/Walker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/Walker.java index f0ba8bb46..384742302 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/Walker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/Walker.java @@ -25,14 +25,14 @@ package org.broadinstitute.sting.gatk.walkers; -import java.util.List; - +import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.filters.MalformedReadFilter; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.collections.Pair; -import org.apache.log4j.Logger; + +import java.util.List; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/WalkerName.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/WalkerName.java index 0e4d40675..4d46607e5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/WalkerName.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/WalkerName.java @@ -1,10 +1,6 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/Window.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/Window.java index 0b718071d..9827fdf09 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/Window.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/Window.java @@ -25,7 +25,10 @@ package org.broadinstitute.sting.gatk.walkers; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Describes the size of the window into the genome. Has differing semantics based on diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalance.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalance.java index b02dcd8e2..3144098a8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalance.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalance.java @@ -25,21 +25,21 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class AlleleBalance implements InfoFieldAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java index 51d290763..a99f87a70 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AlleleBalanceBySample.java @@ -1,12 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; +import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.gatk.contexts.*; -import org.broadinstitute.sting.utils.variantcontext.*; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AnnotationByDepth.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AnnotationByDepth.java index 51b5381dc..6c14e7445 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AnnotationByDepth.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/AnnotationByDepth.java @@ -1,8 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.variantcontext.Genotype; + import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseCounts.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseCounts.java index 244627154..66416ce11 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseCounts.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseCounts.java @@ -31,19 +31,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class BaseCounts implements InfoFieldAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java index ff916bedd..2a5c996f7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/BaseQualityRankSumTest.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; -import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import java.util.Arrays; public class BaseQualityRankSumTest extends RankSumTest { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java index f3ec2b1df..74f7f9d80 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ChromosomeCounts.java @@ -25,18 +25,22 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class ChromosomeCounts implements InfoFieldAnnotation, StandardAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthOfCoverage.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthOfCoverage.java index e56825dbe..c384e0d09 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthOfCoverage.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthOfCoverage.java @@ -1,18 +1,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class DepthOfCoverage implements InfoFieldAnnotation, StandardAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java index ee66b50ee..e3e8bc258 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/DepthPerAlleleBySample.java @@ -1,21 +1,20 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFCompoundHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; -import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; +import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/FisherStrand.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/FisherStrand.java index 2115526a6..97ed221e7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/FisherStrand.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/FisherStrand.java @@ -24,20 +24,20 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import cern.jet.math.Arithmetic; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import cern.jet.math.Arithmetic; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GCContent.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GCContent.java index 5eaa30bf3..48677bbe5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GCContent.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GCContent.java @@ -1,18 +1,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class GCContent implements InfoFieldAnnotation, ExperimentalAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GLstats.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GLstats.java index 3a5db2884..cca0ad4bc 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GLstats.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/GLstats.java @@ -1,19 +1,20 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HaplotypeScore.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HaplotypeScore.java index bd8c51a41..b175579f1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HaplotypeScore.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HaplotypeScore.java @@ -24,25 +24,29 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.genotype.Haplotype; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.sam.AlignmentUtils; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; -import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.genotype.Haplotype; -import org.broadinstitute.sting.utils.pileup.*; import java.util.*; -import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.sam.AlignmentUtils; public class HaplotypeScore implements InfoFieldAnnotation, StandardAnnotation { private final static boolean DEBUG = false; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HardyWeinberg.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HardyWeinberg.java index ecebfbbd2..d86728d5e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HardyWeinberg.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HardyWeinberg.java @@ -1,20 +1,21 @@ package org.broadinstitute.sting.gatk.walkers.annotator; import org.broad.tribble.util.popgen.HardyWeinbergCalculation; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.WorkInProgressAnnotation; import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class HardyWeinberg implements InfoFieldAnnotation, WorkInProgressAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HomopolymerRun.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HomopolymerRun.java index 099780fa7..02efd854c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HomopolymerRun.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/HomopolymerRun.java @@ -1,19 +1,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class HomopolymerRun implements InfoFieldAnnotation, StandardAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java index ee8b01d7d..12b48473d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.utils.IndelUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java index f23433bb5..1d999c531 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/LowMQ.java @@ -1,19 +1,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class LowMQ implements InfoFieldAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java index 8260a5a81..cc62580a9 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityRankSumTest.java @@ -1,17 +1,17 @@ package org.broadinstitute.sting.gatk.walkers.annotator; +import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; -import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import java.util.Arrays; public class MappingQualityRankSumTest extends RankSumTest { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZero.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZero.java index 25a7b286d..f240d02bc 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZero.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZero.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroBySample.java index 00cc30309..0ca53adf2 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroBySample.java @@ -25,22 +25,22 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroFraction.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroFraction.java index dc4934ade..08a25a7e3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroFraction.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/MappingQualityZeroFraction.java @@ -1,15 +1,15 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java index 3b64abfff..1c70a1b33 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/NBaseCount.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/QualByDepth.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/QualByDepth.java index 720984835..2175d39e6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/QualByDepth.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/QualByDepth.java @@ -1,19 +1,19 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; public class QualByDepth extends AnnotationByDepth implements InfoFieldAnnotation, StandardAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java index 1ef7ccd0b..d52f07b58 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RMSMappingQuality.java @@ -1,20 +1,23 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class RMSMappingQuality implements InfoFieldAnnotation, StandardAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java index f00abd6a1..5466828f6 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/RankSumTest.java @@ -1,22 +1,23 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.MannWhitneyU; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.List; import java.util.ArrayList; -import java.util.Map; import java.util.HashMap; +import java.util.List; +import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java index a670532af..c56e2622d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadDepthAndAllelicFractionBySample.java @@ -26,25 +26,24 @@ package org.broadinstitute.sting.gatk.walkers.annotator; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; -import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFCompoundHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Arrays; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java index 727904a3b..aabfb2970 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/ReadPosRankSumTest.java @@ -1,14 +1,17 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.walkers.genotyper.IndelGenotypeLikelihoodsCalculationModel; import org.broadinstitute.sting.gatk.walkers.indels.PairHMMIndelErrorModel; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import net.sf.samtools.*; +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SBByDepth.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SBByDepth.java index fc769ac54..a5ebd8db2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SBByDepth.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SBByDepth.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java index e2fd2a3d4..ff9092a71 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SampleList.java @@ -25,15 +25,15 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineCount; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SpanningDeletions.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SpanningDeletions.java index 0b6cbcc2e..a4668eeb6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SpanningDeletions.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SpanningDeletions.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.StandardAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Arrays; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java index 351117809..b46d82d8b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/TechnologyComposition.java @@ -5,7 +5,6 @@ import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.ExperimentalAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; -import org.broadinstitute.sting.utils.IndelUtils; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.pileup.PileupElement; @@ -13,7 +12,10 @@ import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.sam.ReadUtils; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java index cd5b6694b..acbeee3b2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotator.java @@ -25,24 +25,23 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.AnnotationType; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; import org.broadinstitute.sting.utils.BaseUtils; -import org.broadinstitute.sting.utils.classloader.PluginManager; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.classloader.PluginManager; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorEngine.java index 54c8be73a..fdf498a3d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/VariantAnnotatorEngine.java @@ -25,30 +25,27 @@ package org.broadinstitute.sting.gatk.walkers.annotator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Map.Entry; - -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; -import org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator.*; +import org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator.GenomicAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator.JoinTable; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.AnnotationInterfaceManager; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.GenotypeAnnotation; +import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.util.*; +import java.util.Map.Entry; public class VariantAnnotatorEngine { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotation.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotation.java index e02c62baf..05c1b3c52 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotation.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotation.java @@ -25,13 +25,6 @@ package org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator; -import java.util.*; -import java.util.Map.Entry; - -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -39,7 +32,14 @@ import org.broadinstitute.sting.gatk.refdata.features.annotator.AnnotatorInputTa import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.walkers.annotator.VariantAnnotatorEngine; import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.InfoFieldAnnotation; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLineType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.util.*; +import java.util.Map.Entry; /** * This plugin for {@link VariantAnnotatorEngine} serves as the core diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java index 69a35a584..b42310780 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/GenomicAnnotator.java @@ -26,28 +26,28 @@ package org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator; -import java.io.File; -import java.io.IOException; -import java.util.*; -import java.util.Map.Entry; - -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.features.annotator.AnnotatorInputTableCodec; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.gatk.walkers.annotator.VariantAnnotatorEngine; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.Map.Entry; /** * Annotates variant calls with information from user-specified tabular files. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTable.java index c57aacb5b..714f374cf 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTable.java @@ -25,6 +25,9 @@ package org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -33,9 +36,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; - /** * This is a container that holds all data corresponding to a single join table as specified by one -J arg (ex: -J bindingName1,/path/to/file,bindingName1.columnName=bindingName2.columnName2). * Some terminology: diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTableParser.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTableParser.java index d3fcfd42a..3b6c87f90 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTableParser.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/JoinTableParser.java @@ -25,16 +25,16 @@ package org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; + import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.utils.exceptions.UserException; - /** * Used to parse files passed to the GenomicAnnotator via the -J arg. * The files must be tab-delimited, and the first non-empty/non-commented line diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/TranscriptToGenomicInfo.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/TranscriptToGenomicInfo.java index 0ed61fc48..0bbfa51b4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/TranscriptToGenomicInfo.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/genomicannotator/TranscriptToGenomicInfo.java @@ -24,9 +24,6 @@ package org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator; -import java.io.*; -import java.util.*; - import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -36,17 +33,15 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.features.annotator.AnnotatorInputTableCodec; import org.broadinstitute.sting.gatk.refdata.features.annotator.AnnotatorInputTableFeature; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.gatk.walkers.By; -import org.broadinstitute.sting.gatk.walkers.DataSource; -import org.broadinstitute.sting.gatk.walkers.RMD; -import org.broadinstitute.sting.gatk.walkers.Reference; -import org.broadinstitute.sting.gatk.walkers.Requires; -import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.gatk.walkers.Window; +import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import java.io.IOException; +import java.io.PrintStream; +import java.util.*; + /** * Takes a table of transcripts (eg. UCSC refGene, knownGene, and CCDS tables) and generates the big table which contains * annotations for each possible variant at each transcript position (eg. 4 variants at each genomic position). diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/GenotypeAnnotation.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/GenotypeAnnotation.java index 29b256479..57bc44ab8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/GenotypeAnnotation.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/GenotypeAnnotation.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.annotator.interfaces; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFFormatHeaderLine; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import java.util.Map; import java.util.List; +import java.util.Map; public interface GenotypeAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/InfoFieldAnnotation.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/InfoFieldAnnotation.java index 5b33395b5..4e850d01b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/InfoFieldAnnotation.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/interfaces/InfoFieldAnnotation.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.annotator.interfaces; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.codecs.vcf.VCFInfoHeaderLine; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.Map; import java.util.List; +import java.util.Map; public interface InfoFieldAnnotation { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/BeagleOutputToVCFWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/BeagleOutputToVCFWalker.java index aa23abc67..21c8ec430 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/BeagleOutputToVCFWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/BeagleOutputToVCFWalker.java @@ -25,26 +25,26 @@ package org.broadinstitute.sting.gatk.walkers.beagle; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.gatk.refdata.features.beagle.BeagleFeature; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.gatk.refdata.features.beagle.BeagleFeature; import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; + import static java.lang.Math.log10; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/ProduceBeagleInputWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/ProduceBeagleInputWalker.java index 93ee0b085..3eed12992 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/ProduceBeagleInputWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/ProduceBeagleInputWalker.java @@ -25,10 +25,6 @@ package org.broadinstitute.sting.gatk.walkers.beagle; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Input; @@ -36,17 +32,20 @@ import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.gatk.walkers.variantrecalibration.VQSRCalibrationCurve; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.StingException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; import java.io.PrintStream; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/VariantsToBeagleUnphasedWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/VariantsToBeagleUnphasedWalker.java index 18aa3e257..f6cd1d636 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/VariantsToBeagleUnphasedWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/beagle/VariantsToBeagleUnphasedWalker.java @@ -25,28 +25,29 @@ package org.broadinstitute.sting.gatk.walkers.beagle; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.PrintStream; -import java.util.*; +import java.util.Arrays; +import java.util.Set; /** * Produces an input file to Beagle imputation engine, listing unphased, hard-called genotypes for a single sample diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CallableLociWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CallableLociWalker.java index 2c67265d6..90e6fcd77 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CallableLociWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CallableLociWalker.java @@ -22,6 +22,8 @@ package org.broadinstitute.sting.gatk.walkers.coverage; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -31,12 +33,10 @@ import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import java.io.File; -import java.io.PrintStream; import java.io.FileNotFoundException; +import java.io.PrintStream; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoarseCoverageWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoarseCoverageWalker.java index ae947eac1..405a44c29 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoarseCoverageWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoarseCoverageWalker.java @@ -26,12 +26,11 @@ package org.broadinstitute.sting.gatk.walkers.coverage; import net.sf.samtools.SAMRecord; - -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; import java.io.PrintStream; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CompareCallableLociWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CompareCallableLociWalker.java index 5a9c62b7f..6b91b0198 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CompareCallableLociWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CompareCallableLociWalker.java @@ -22,19 +22,19 @@ package org.broadinstitute.sting.gatk.walkers.coverage; +import org.broad.tribble.bed.FullBEDFeature; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import org.broad.tribble.bed.FullBEDFeature; import org.broadinstitute.sting.utils.exceptions.UserException; -import java.util.*; import java.io.PrintStream; +import java.util.Arrays; +import java.util.List; /** * Test routine for new VariantContext object diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoverageUtils.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoverageUtils.java index 298aa90b9..a41e55166 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoverageUtils.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/CoverageUtils.java @@ -8,7 +8,9 @@ import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.PileupElement; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * IF THERE IS NO JAVADOC RIGHT HERE, YELL AT chartl diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/DepthOfCoverageWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/DepthOfCoverageWalker.java index 91ae81cd5..c1956f1d7 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/DepthOfCoverageWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/coverage/DepthOfCoverageWalker.java @@ -26,6 +26,8 @@ package org.broadinstitute.sting.gatk.walkers.coverage; import net.sf.samtools.SAMReadGroupRecord; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -34,12 +36,13 @@ import org.broadinstitute.sting.gatk.refdata.features.refseq.RefSeqCodec; import org.broadinstitute.sting.gatk.refdata.features.refseq.RefSeqFeature; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; -import org.broadinstitute.sting.gatk.refdata.utils.*; +import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; +import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; +import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java index a5ebf27bb..15b16ca6b 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java @@ -24,22 +24,15 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -import net.sf.samtools.*; +import net.sf.samtools.SAMFileReader; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordIterator; import net.sf.samtools.util.BlockCompressedInputStream; -import org.broad.tribble.readers.AsciiLineReader; -import org.broad.tribble.readers.LineReader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; -import java.util.Map; -import java.util.zip.GZIPInputStream; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java index 4c3f7bd95..eb8a71c2c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffElement.java @@ -24,7 +24,9 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -import com.google.java.contract.*; +import com.google.java.contract.Ensures; +import com.google.java.contract.Invariant; +import com.google.java.contract.Requires; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java index 3750496a1..963191446 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffValue.java @@ -24,8 +24,6 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; -import org.broadinstitute.sting.utils.Utils; - /** * Created by IntelliJ IDEA. * User: depristo diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index a812babaf..4e44578c7 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -30,7 +30,10 @@ import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaAlternateReferenceWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaAlternateReferenceWalker.java index 828d39717..efc101618 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaAlternateReferenceWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaAlternateReferenceWalker.java @@ -25,13 +25,13 @@ package org.broadinstitute.sting.gatk.walkers.fasta; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.Collection; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaReferenceWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaReferenceWalker.java index 6be2336c0..2dbfc76ff 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaReferenceWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/fasta/FastaReferenceWalker.java @@ -25,16 +25,15 @@ package org.broadinstitute.sting.gatk.walkers.fasta; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RefWalker; import org.broadinstitute.sting.gatk.walkers.WalkerName; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import java.io.PrintStream; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/ClusteredSnps.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/ClusteredSnps.java index b31526987..2c009f7f2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/ClusteredSnps.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/ClusteredSnps.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.filters; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; public class ClusteredSnps { private GenomeLocParser genomeLocParser; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContext.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContext.java index c3849e240..ede19746a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContext.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContext.java @@ -25,8 +25,8 @@ package org.broadinstitute.sting.gatk.walkers.filters; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; public class FiltrationContext { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContextWindow.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContextWindow.java index 225cdecc3..d7c0dd4d5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContextWindow.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/FiltrationContextWindow.java @@ -27,7 +27,9 @@ package org.broadinstitute.sting.gatk.walkers.filters; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; /** * A window of variants surrounding the current variant being investigated diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationWalker.java index 884d0ac24..6c023573a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/filters/VariantFiltrationWalker.java @@ -25,21 +25,20 @@ package org.broadinstitute.sting.gatk.walkers.filters; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; 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 47be7e6fe..83a8ce7d7 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 @@ -26,14 +26,15 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.PrintStream; -import java.util.*; +import java.util.Map; +import java.util.Set; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidIndelGenotypePriors.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidIndelGenotypePriors.java index 22c9dcf91..696a74de8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidIndelGenotypePriors.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidIndelGenotypePriors.java @@ -4,8 +4,6 @@ import org.broadinstitute.sting.gatk.walkers.indels.HaplotypeIndelErrorModel; import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.genotype.DiploidGenotype; -import java.util.Arrays; - /** * Created by IntelliJ IDEA. * User: delangel diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidSNPGenotypeLikelihoods.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidSNPGenotypeLikelihoods.java index ab075eaf2..2014801e4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidSNPGenotypeLikelihoods.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/DiploidSNPGenotypeLikelihoods.java @@ -26,13 +26,14 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; import net.sf.samtools.SAMUtils; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.pileup.FragmentPileup; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.genotype.DiploidGenotype; -import org.broadinstitute.sting.utils.sam.ReadUtils; +import org.broadinstitute.sting.utils.pileup.FragmentPileup; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import static java.lang.Math.log10; import static java.lang.Math.pow; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/ExactAFCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/ExactAFCalculationModel.java index 89504b371..5c27bc943 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/ExactAFCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/ExactAFCalculationModel.java @@ -26,17 +26,22 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.SimpleTimer; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.utils.exceptions.UserException; import sun.reflect.generics.reflectiveObjects.NotImplementedException; -import java.util.*; import java.io.PrintStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; public class ExactAFCalculationModel extends AlleleFrequencyCalculationModel { // 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 3902a0b7f..8261cd588 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 @@ -30,11 +30,11 @@ import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GridSearchAFEstimation.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GridSearchAFEstimation.java index c4e315f68..10b646d63 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GridSearchAFEstimation.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/GridSearchAFEstimation.java @@ -26,18 +26,18 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; import java.io.PrintStream; +import java.util.*; public class GridSearchAFEstimation extends AlleleFrequencyCalculationModel { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java index 1f430548b..be2039780 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/IndelGenotypeLikelihoodsCalculationModel.java @@ -25,16 +25,14 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.indels.HaplotypeIndelErrorModel; import org.broadinstitute.sting.gatk.walkers.indels.PairHMMIndelErrorModel; -import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.genotype.Haplotype; @@ -42,11 +40,10 @@ import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/MultiallelicGenotypeLikelihoods.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/MultiallelicGenotypeLikelihoods.java index 2cf149fd0..3652763de 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/MultiallelicGenotypeLikelihoods.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/MultiallelicGenotypeLikelihoods.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.ArrayList; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/SNPGenotypeLikelihoodsCalculationModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/SNPGenotypeLikelihoodsCalculationModel.java index 9f4d4182f..3e3cd128b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/SNPGenotypeLikelihoodsCalculationModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/SNPGenotypeLikelihoodsCalculationModel.java @@ -25,23 +25,25 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.genotype.DiploidGenotype; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.PileupElement; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class SNPGenotypeLikelihoodsCalculationModel extends GenotypeLikelihoodsCalculationModel { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCalcLikelihoods.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCalcLikelihoods.java index cf1c57a05..22c3081a3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCalcLikelihoods.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCalcLikelihoods.java @@ -25,8 +25,6 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.commandline.ArgumentCollection; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.DownsampleType; @@ -36,8 +34,12 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.baq.BAQ; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeSet; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCallVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCallVariants.java index 1533e8777..68d8f9b54 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCallVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/genotyper/UGCallVariants.java @@ -24,19 +24,19 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.commandline.ArgumentCollection; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; 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 055eb0b97..2b25df4aa 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 @@ -27,7 +27,6 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; -import org.broadinstitute.sting.commandline.Input; import java.io.File; 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 fc8a5819a..2a0338bca 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 @@ -25,22 +25,25 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; -import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.gatk.contexts.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.ArgumentCollection; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.DownsampleType; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.filters.BadMateFilter; +import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.gatk.walkers.annotator.VariantAnnotatorEngine; -import org.broadinstitute.sting.gatk.DownsampleType; -import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.baq.BAQ; -import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.utils.codecs.vcf.*; -import java.util.*; import java.io.PrintStream; +import java.util.*; /** 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 6fc972b5d..a10897172 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 @@ -25,22 +25,24 @@ package org.broadinstitute.sting.gatk.walkers.genotyper; +import com.google.java.contract.Requires; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.GenotypeLikelihoods; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.AlignmentContextUtils; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.annotator.VariantAnnotatorEngine; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.baq.BAQ; -import org.broadinstitute.sting.utils.pileup.*; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; -import com.google.java.contract.*; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.GenotypeLikelihoods; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.PrintStream; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/ConstrainedMateFixingManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/ConstrainedMateFixingManager.java index df1f4f908..adb7c4c38 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/ConstrainedMateFixingManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/ConstrainedMateFixingManager.java @@ -1,11 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.indels; import net.sf.picard.sam.SamPairUtil; -import net.sf.samtools.*; +import net.sf.samtools.SAMFileWriter; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordComparator; +import net.sf.samtools.SAMRecordCoordinateComparator; import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/HaplotypeIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/HaplotypeIndelErrorModel.java index 7617aa9de..e68aa31e0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/HaplotypeIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/HaplotypeIndelErrorModel.java @@ -25,21 +25,16 @@ package org.broadinstitute.sting.gatk.walkers.indels; -import net.sf.samtools.AlignmentBlock; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.walkers.genotyper.ExactAFCalculationModel; import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.genotype.Haplotype; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.sam.ReadUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.util.Arrays; import java.util.HashMap; -import java.util.List; public class HaplotypeIndelErrorModel { 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 a53665d64..61f21c488 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 @@ -25,39 +25,41 @@ package org.broadinstitute.sting.gatk.walkers.indels; +import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.samtools.*; import net.sf.samtools.util.RuntimeIOException; -import net.sf.samtools.util.StringUtil; import net.sf.samtools.util.SequenceUtil; -import net.sf.picard.reference.IndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.commandline.*; +import net.sf.samtools.util.StringUtil; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Input; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; -import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID; -import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterStub; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.exceptions.StingException; -import org.broadinstitute.sting.utils.interval.IntervalMergingRule; -import org.broadinstitute.sting.utils.interval.IntervalUtils; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.*; -import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; -import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.walkers.BAQMode; import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.refdata.VariantContextAdaptors; +import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; +import org.broadinstitute.sting.gatk.walkers.BAQMode; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; import org.broadinstitute.sting.utils.*; import org.broadinstitute.sting.utils.baq.BAQ; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; import org.broadinstitute.sting.utils.interval.IntervalFileMergingIterator; +import org.broadinstitute.sting.utils.interval.IntervalMergingRule; +import org.broadinstitute.sting.utils.interval.IntervalUtils; import org.broadinstitute.sting.utils.interval.NwayIntervalMergingIterator; +import org.broadinstitute.sting.utils.sam.AlignmentUtils; import org.broadinstitute.sting.utils.sam.NWaySAMFileWriter; +import org.broadinstitute.sting.utils.sam.ReadUtils; import org.broadinstitute.sting.utils.text.TextFormattingUtils; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import org.broadinstitute.sting.utils.sam.ReadUtils; -import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; import java.io.FileNotFoundException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/LeftAlignIndels.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/LeftAlignIndels.java index 010e0cf6f..af8051334 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/LeftAlignIndels.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/LeftAlignIndels.java @@ -25,8 +25,10 @@ package org.broadinstitute.sting.gatk.walkers.indels; -import net.sf.samtools.*; -import org.broadinstitute.sting.commandline.*; +import net.sf.samtools.Cigar; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java index ab7ae4184..60262d6f4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/PairHMMIndelErrorModel.java @@ -28,30 +28,25 @@ package org.broadinstitute.sting.gatk.walkers.indels; import net.sf.samtools.Cigar; import net.sf.samtools.CigarElement; import net.sf.samtools.CigarOperator; -import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -/*import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.Covariate; -import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalDataManager; -import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalDatum; -import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalibrationArgumentCollection; -*/import org.broadinstitute.sting.utils.MathUtils; -import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.classloader.PluginManager; -import org.broadinstitute.sting.utils.collections.NestedHashMap; -import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; -import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.genotype.Haplotype; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; -import org.broadinstitute.sting.utils.text.XReadLines; +import org.broadinstitute.sting.utils.variantcontext.Allele; import java.io.File; -import java.io.FileNotFoundException; -import java.util.*; -import java.util.regex.Pattern; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; + +/*import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.Covariate; +import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalDataManager; +import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalDatum; +import org.broadinstitute.sting.oneoffprojects.walkers.IndelCountCovariates.RecalibrationArgumentCollection; +*/ public class PairHMMIndelErrorModel { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignedReadCounter.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignedReadCounter.java index fc196e712..2c89b907b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignedReadCounter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignedReadCounter.java @@ -25,19 +25,23 @@ package org.broadinstitute.sting.gatk.walkers.indels; -import net.sf.samtools.*; -import org.broadinstitute.sting.utils.interval.IntervalMergingRule; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.*; -import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.filters.BadMateFilter; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.utils.interval.IntervalFileMergingIterator; -import org.broadinstitute.sting.utils.sam.ReadUtils; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.filters.BadMateFilter; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.By; +import org.broadinstitute.sting.gatk.walkers.DataSource; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.interval.IntervalFileMergingIterator; +import org.broadinstitute.sting.utils.interval.IntervalMergingRule; +import org.broadinstitute.sting.utils.sam.ReadUtils; import java.io.File; -import java.util.*; +import java.util.Iterator; @By(DataSource.READS) // walker to count realigned reads 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 3b94989aa..488e37f26 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 @@ -25,27 +25,27 @@ package org.broadinstitute.sting.gatk.walkers.indels; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; 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.Platform454Filter; -import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.filters.BadMateFilter; +import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; +import org.broadinstitute.sting.gatk.filters.Platform454Filter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.baq.BAQ; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.ArrayList; import java.io.PrintStream; +import java.util.ArrayList; /** * Emits intervals for the Local Indel Realigner to target for cleaning. Ignores 454 reads, MQ0 reads, and reads with consecutive indel operators in the CIGAR string. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SAMRecordCoordinateComparatorWithUnmappedReads.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SAMRecordCoordinateComparatorWithUnmappedReads.java index 1fe3fdd04..3854a4a8c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SAMRecordCoordinateComparatorWithUnmappedReads.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SAMRecordCoordinateComparatorWithUnmappedReads.java @@ -23,7 +23,8 @@ */ package org.broadinstitute.sting.gatk.walkers.indels; -import net.sf.samtools.*; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordCoordinateComparator; /** * Extends Picard's Comparator for sorting SAMRecords by coordinate. This one actually deals with unmapped reads 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 1f05ddaf0..443e6e9f2 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 @@ -25,15 +25,21 @@ package org.broadinstitute.sting.gatk.walkers.indels; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import net.sf.samtools.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Output; 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.*; -import org.broadinstitute.sting.gatk.refdata.*; +import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; +import org.broadinstitute.sting.gatk.filters.Platform454Filter; +import org.broadinstitute.sting.gatk.filters.PlatformUnitFilter; +import org.broadinstitute.sting.gatk.filters.PlatformUnitFilterHelper; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.refdata.SeekableRODIterator; +import org.broadinstitute.sting.gatk.refdata.Transcript; import org.broadinstitute.sting.gatk.refdata.features.refseq.RefSeqCodec; import org.broadinstitute.sting.gatk.refdata.features.refseq.RefSeqFeature; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; @@ -42,22 +48,22 @@ import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODItera import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; import org.broadinstitute.sting.gatk.walkers.ReadFilters; import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.utils.interval.IntervalUtils; -import org.broadinstitute.sting.utils.interval.IntervalFileMergingIterator; -import org.broadinstitute.sting.utils.interval.IntervalMergingRule; -import org.broadinstitute.sting.utils.interval.OverlappingIntervalIterator; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.exceptions.StingException; -import org.broadinstitute.sting.utils.sam.AlignmentUtils; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocSortedSet; +import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.collections.CircularArray; import org.broadinstitute.sting.utils.collections.PrimitivePair; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.commandline.Hidden; - -import net.sf.samtools.*; +import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.interval.IntervalFileMergingIterator; +import org.broadinstitute.sting.utils.interval.IntervalMergingRule; +import org.broadinstitute.sting.utils.interval.IntervalUtils; +import org.broadinstitute.sting.utils.interval.OverlappingIntervalIterator; +import org.broadinstitute.sting.utils.sam.AlignmentUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.*; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AllelePair.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AllelePair.java index 869edf784..cb123c868 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AllelePair.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AllelePair.java @@ -23,9 +23,9 @@ */ package org.broadinstitute.sting.gatk.walkers.phasing; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.ArrayList; import java.util.List; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AnnotateMNPsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AnnotateMNPsWalker.java index 81d9b4ddb..9aa370d3f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AnnotateMNPsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/AnnotateMNPsWalker.java @@ -24,14 +24,10 @@ package org.broadinstitute.sting.gatk.walkers.phasing; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.refdata.features.annotator.AnnotatorInputTableFeature; @@ -41,9 +37,12 @@ import org.broadinstitute.sting.gatk.walkers.annotator.genomicannotator.AminoAci import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsWalker.java index 709bc44ce..5bd438605 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeMNPsWalker.java @@ -24,10 +24,6 @@ package org.broadinstitute.sting.gatk.walkers.phasing; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -35,7 +31,11 @@ import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.walkers.*; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesVCFWriter.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesVCFWriter.java index abced442e..b0491a281 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesVCFWriter.java @@ -24,20 +24,19 @@ package org.broadinstitute.sting.gatk.walkers.phasing; -import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.picard.reference.ReferenceSequenceFile; import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.MathUtils; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.File; import java.io.FileNotFoundException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesWalker.java index ec6f5c648..be15d4541 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeSegregatingAlternateAllelesWalker.java @@ -24,20 +24,22 @@ package org.broadinstitute.sting.gatk.walkers.phasing; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; 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 fbe6e5b5a..9702fd18c 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 @@ -23,27 +23,28 @@ */ package org.broadinstitute.sting.gatk.walkers.phasing; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedDatum; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.DisjointSet; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.HasGenomeLocation; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.codecs.vcf.SortingVCFWriter; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.*; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/SNPallelePair.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/SNPallelePair.java index db1f888a1..153c4a23f 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/SNPallelePair.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/SNPallelePair.java @@ -23,10 +23,10 @@ */ package org.broadinstitute.sting.gatk.walkers.phasing; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; public class SNPallelePair extends AllelePair { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/WriteVCF.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/WriteVCF.java index f82e48abd..2851ace0d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/WriteVCF.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/WriteVCF.java @@ -24,9 +24,9 @@ package org.broadinstitute.sting.gatk.walkers.phasing; import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; public class WriteVCF { public static void writeVCF(VariantContext vc, VCFWriter writer, Logger logger) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountIntervals.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountIntervals.java index feb5f62af..2bdd4558f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountIntervals.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountIntervals.java @@ -6,14 +6,12 @@ import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; -import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.gatk.walkers.RefWalker; -import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; -import java.util.List; import java.io.PrintStream; +import java.util.List; /** * Counts the number of contiguous regions the walker traverses over. Slower than it needs to be, but diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountLociWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountLociWalker.java index ef6ff04f2..0d68c8493 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountLociWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountLociWalker.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.walkers.qc; -import net.sf.samtools.SAMFileWriter; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountPairsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountPairsWalker.java index cece04fcf..df89efe6d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountPairsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountPairsWalker.java @@ -25,14 +25,14 @@ package org.broadinstitute.sting.gatk.walkers.qc; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.walkers.ReadPairWalker; import org.broadinstitute.sting.utils.collections.ExpandingArrayList; -import org.broadinstitute.sting.commandline.Output; -import net.sf.samtools.SAMRecord; +import java.io.PrintStream; import java.util.Collection; import java.util.List; -import java.io.PrintStream; /** * Counts the number of read pairs encountered in a file sorted in diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountReadsWalker.java index 74f63aa2f..87c0409b9 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountReadsWalker.java @@ -1,11 +1,11 @@ package org.broadinstitute.sting.gatk.walkers.qc; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.DataSource; import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.walkers.Requires; /** * Walks over the input data set, calculating the number of reads seen for diagnostic purposes. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodByRefWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodByRefWalker.java index a4e80138f..d1545f159 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodByRefWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodByRefWalker.java @@ -25,13 +25,13 @@ package org.broadinstitute.sting.gatk.walkers.qc; +import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RefWalker; import org.broadinstitute.sting.utils.collections.ExpandingArrayList; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.commandline.Argument; /** * Prints out counts of the number of reference ordered data objects are diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodWalker.java index 92867e1a9..8a03dea44 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CountRodWalker.java @@ -27,23 +27,24 @@ package org.broadinstitute.sting.gatk.walkers.qc; import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.SAMSequenceRecord; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.gatk.walkers.TreeReducible; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.collections.ExpandingArrayList; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import java.io.PrintStream; import java.util.ArrayList; -import java.util.List; import java.util.Collection; import java.util.LinkedList; -import java.io.PrintStream; +import java.util.List; /** * Prints out counts of the number of reference ordered data objects are diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CycleQualityWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CycleQualityWalker.java index 5ae35416a..b5f5442cd 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CycleQualityWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/CycleQualityWalker.java @@ -25,22 +25,22 @@ package org.broadinstitute.sting.gatk.walkers.qc; -import org.broadinstitute.sting.gatk.walkers.Requires; -import org.broadinstitute.sting.gatk.walkers.DataSource; -import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.collections.PrimitivePair; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.sam.AlignmentUtils; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMReadGroupRecord; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.DataSource; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.utils.collections.PrimitivePair; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import java.util.*; import java.io.*; +import java.util.*; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/PrintLocusContextWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/PrintLocusContextWalker.java index 39b69ba29..d3b992cb5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/PrintLocusContextWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/PrintLocusContextWalker.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.qc; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.gatk.walkers.TreeReducible; -import java.util.List; -import java.util.Arrays; import java.io.PrintStream; - -import net.sf.samtools.SAMRecord; +import java.util.Arrays; +import java.util.List; /** * At each locus in the input data set, prints the reference base, genomic location, and diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadClippingStatsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadClippingStatsWalker.java index 2f1773d01..908e389a8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadClippingStatsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadClippingStatsWalker.java @@ -22,21 +22,24 @@ package org.broadinstitute.sting.gatk.walkers.qc; -import org.broadinstitute.sting.gatk.walkers.Requires; -import org.broadinstitute.sting.gatk.walkers.DataSource; -import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.utils.MathUtils; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.sam.AlignmentUtils; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; -import net.sf.samtools.*; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.DataSource; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import java.util.*; -import java.io.*; +import java.io.PrintStream; +import java.util.Arrays; /** * User: depristo diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadValidationWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadValidationWalker.java index 6ad0340a4..fa1bb4d55 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadValidationWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ReadValidationWalker.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.qc; +import net.sf.samtools.SAMFileWriter; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMFileWriter; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.List; import java.util.ArrayList; +import java.util.List; /* diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/RodSystemValidationWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/RodSystemValidationWalker.java index 9cb715507..170630b77 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/RodSystemValidationWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/RodSystemValidationWalker.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.walkers.qc; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -8,8 +7,11 @@ import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; -import org.broadinstitute.sting.gatk.walkers.*; +import org.broadinstitute.sting.gatk.walkers.Reference; +import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.gatk.walkers.Window; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.*; import java.math.BigInteger; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ValidatingPileupWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ValidatingPileupWalker.java index bc68be592..e1e6c4b69 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ValidatingPileupWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/qc/ValidatingPileupWalker.java @@ -25,20 +25,20 @@ package org.broadinstitute.sting.gatk.walkers.qc; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.features.sampileup.SAMPileupFeature; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; -import java.util.Arrays; import java.io.PrintStream; +import java.util.Arrays; /** * At every locus in the input set, compares the pileup data (reference base, aligned base from diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesGatherer.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesGatherer.java index 568e1b638..fc6b3daee 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesGatherer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CountCovariatesGatherer.java @@ -7,7 +7,6 @@ import org.broadinstitute.sting.utils.text.XReadLines; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; 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 c21f548b3..8c6539f8d 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 @@ -27,24 +27,25 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import org.broad.tribble.bed.BEDCodec; import org.broad.tribble.dbsnp.DbSNPCodec; -import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; -import org.broadinstitute.sting.utils.codecs.vcf.VCF3Codec; -import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.ArgumentCollection; import org.broadinstitute.sting.commandline.Gather; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; +import org.broadinstitute.sting.gatk.filters.MappingQualityUnavailableReadFilter; import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.classloader.PluginManager; +import org.broadinstitute.sting.utils.codecs.vcf.VCF3Codec; +import org.broadinstitute.sting.utils.codecs.vcf.VCFCodec; import org.broadinstitute.sting.utils.collections.NestedHashMap; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.ArgumentCollection; import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.pileup.PileupElement; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java index 64e0864c0..945d02837 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/CycleCovariate.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import net.sf.samtools.SAMRecord; - import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.exceptions.UserException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/DinucCovariate.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/DinucCovariate.java index 0de6897d0..a7717161a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/DinucCovariate.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/DinucCovariate.java @@ -1,11 +1,10 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; -import java.util.HashMap; - import net.sf.samtools.SAMRecord; - import org.broadinstitute.sting.utils.BaseUtils; +import java.util.HashMap; + /* * Copyright (c) 2009 The Broad Institute * diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java index fdbeb6a31..e6d0b306c 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDataManager.java @@ -25,19 +25,21 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMUtils; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.collections.NestedHashMap; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import org.broadinstitute.sting.utils.*; -import org.broadinstitute.sting.utils.collections.NestedHashMap; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; -import java.util.*; - -import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMReadGroupRecord; -import net.sf.samtools.SAMUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java index 7ba441ccc..f04989fa5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/RecalDatumOptimized.java @@ -3,7 +3,7 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.QualityUtils; -import java.util.*; +import java.util.List; /* * Copyright (c) 2010 The Broad Institute diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/TableRecalibrationWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/TableRecalibrationWalker.java index 0eaa1245e..0277fda0d 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/TableRecalibrationWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/recalibration/TableRecalibrationWalker.java @@ -25,31 +25,33 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.*; -import java.util.regex.Pattern; - import net.sf.samtools.*; import net.sf.samtools.util.SequenceUtil; - +import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.classloader.PluginManager; -import org.broadinstitute.sting.utils.collections.NestedHashMap; import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.text.TextFormattingUtils; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.baq.BAQ; -import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.utils.classloader.PluginManager; +import org.broadinstitute.sting.utils.collections.NestedHashMap; +import org.broadinstitute.sting.utils.exceptions.DynamicClassResolutionException; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; +import org.broadinstitute.sting.utils.text.TextFormattingUtils; +import org.broadinstitute.sting.utils.text.XReadLines; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.regex.Pattern; /** * This walker is designed to work as the second pass in a two-pass processing step, doing a by-read traversal. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java index c1c17bda5..b3b63bb96 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.sequenom; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.PrintStream; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java index fde233b5d..b877ff70b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java @@ -25,29 +25,27 @@ package org.broadinstitute.sting.gatk.walkers.sequenom; -import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.bed.BEDCodec; -import org.broad.tribble.dbsnp.DbSNPCodec; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.*; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.refdata.ReferenceOrderedData; +import org.broadinstitute.sting.gatk.refdata.SeekableRODIterator; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; -import java.util.*; import java.io.PrintStream; +import java.util.*; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java index c9c5e09a8..fe3173506 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/VariantEvalWalker.java @@ -1,14 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval; +import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.samtools.SAMSequenceRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; @@ -20,22 +18,21 @@ import org.broadinstitute.sting.gatk.walkers.TreeReducible; import org.broadinstitute.sting.gatk.walkers.Window; import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.VariantEvaluator; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; import org.broadinstitute.sting.gatk.walkers.variantrecalibration.Tranche; import org.broadinstitute.sting.gatk.walkers.variantrecalibration.VariantRecalibrator; import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; -import net.sf.picard.reference.IndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; - -import java.io.FileNotFoundException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; +import java.io.FileNotFoundException; import java.io.PrintStream; import java.lang.reflect.Field; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompEvalGenotypes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompEvalGenotypes.java index 787dbe9af..925bff9c0 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompEvalGenotypes.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompEvalGenotypes.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.variantcontext.Genotype; class NewCompEvalGenotypes { private GenomeLoc loc; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java index 85373baa8..255a54737 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CompOverlap.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; /** * The Broad Institute diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java index befb2ff13..8c281b2f8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/CountVariants.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; @Analysis(description = "Counts different classes of variants in the sample") public class CountVariants extends VariantEvaluator implements StandardEval { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java index 58803c9d0..bbd3f5f54 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypeConcordance.java @@ -1,18 +1,18 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; import org.apache.log4j.Logger; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java index 407b71893..a476a2680 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/GenotypePhasingEvaluator.java @@ -1,9 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; import org.apache.log4j.Logger; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -12,8 +9,12 @@ import org.broadinstitute.sting.gatk.walkers.phasing.ReadBackedPhasingWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.NewEvaluationContext; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.HashMap; import java.util.HashSet; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java index f7f9fce0c..77def0f30 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelLengthHistogram.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; /** * IF THERE IS NO JAVADOC RIGHT HERE, YELL AT chartl diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java index dd4bb492e..6e1b76acd 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelMetricsByAC.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java index 1bd420e0a..d99196ecf 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/IndelStatistics.java @@ -1,15 +1,15 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.IndelUtils; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java index 16ec74433..a0cc393d9 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/MendelianViolationEvaluator.java @@ -1,15 +1,15 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.MendelianViolation; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; /** * Mendelian violation detection and counting diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java index e83914ef8..b209ee13d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/PrintMissingComp.java @@ -24,12 +24,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; @Analysis(name = "PrintMissingComp", description = "the overlap between eval and comp sites") public class PrintMissingComp extends VariantEvaluator { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SamplePreviousGenotypes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SamplePreviousGenotypes.java index 5f3e6b0fa..751f61a97 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SamplePreviousGenotypes.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SamplePreviousGenotypes.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.variantcontext.Genotype; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java index 395309975..d466645ea 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/SimpleMetricsByAC.java @@ -1,17 +1,18 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.*; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.Degeneracy; import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.Sample; import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.StateKey; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.ArrayList; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java index f9cda5e0b..ec43cbd55 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ThetaVariantEvaluator.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java index deeafd851..be957abd7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/TiTvVariantEvaluator.java @@ -1,13 +1,13 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; @Analysis(description = "Ti/Tv Variant Evaluator") public class TiTvVariantEvaluator extends VariantEvaluator implements StandardEval { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java index 756427581..9c331b577 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/ValidationReport.java @@ -1,16 +1,16 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.Set; /** * The Broad Institute diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantEvaluator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantEvaluator.java index 6017ecca3..e29e7ed50 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantEvaluator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantEvaluator.java @@ -1,12 +1,12 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.NewEvaluationContext; import org.broadinstitute.sting.gatk.walkers.varianteval.util.StateKey; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; public abstract class VariantEvaluator { public void initialize(VariantEvalWalker walker) {} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java index 29a61e27a..b6ad55b18 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/evaluators/VariantQualityScore.java @@ -25,16 +25,16 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.evaluators; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; -import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.Analysis; +import org.broadinstitute.sting.gatk.walkers.varianteval.util.DataPoint; import org.broadinstitute.sting.gatk.walkers.varianteval.util.TableType; import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.ArrayList; import java.util.HashMap; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java index 2cbc66e31..411493d4f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleCount.java @@ -1,12 +1,11 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; -import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java index 48b4ffa91..2ffc7716c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/AlleleFrequency.java @@ -1,10 +1,10 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java index 9942ba8d6..c6975808f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CompRod.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java index 1a9d31085..c14355035 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Contig.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java index 15b1d41c1..3e8a6ed17 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/CpG.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java index 65af6090c..155a66186 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Degeneracy.java @@ -1,14 +1,14 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.HashMap; -import java.util.Set; import java.util.HashSet; +import java.util.Set; public class Degeneracy extends VariantStratifier { private ArrayList states; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java index 7bd15a974..40f952fd2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/EvalRod.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java index 8d8782ab7..3b7a419f2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Filter.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java index fd724d6d1..c6c094f8e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/FunctionalClass.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java index a7ccd3182..76efedbf4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/JexlExpression.java @@ -1,10 +1,10 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java index 39d2e6b4d..a0973a088 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Novelty.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Collection; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java index f909de4f3..a2a3eb3fb 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/Sample.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java index 218cb23ca..2c4b8bc46 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/stratifications/VariantStratifier.java @@ -1,11 +1,10 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.stratifications; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.varianteval.VariantEvalWalker; import org.broadinstitute.sting.gatk.walkers.varianteval.util.SortableJexlVCMatchExp; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java index 3208c26bb..8112ae97f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/NewEvaluationContext.java @@ -1,6 +1,5 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.util; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; @@ -9,6 +8,7 @@ import org.broadinstitute.sting.gatk.walkers.varianteval.evaluators.VariantEvalu import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.VariantStratifier; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.HashMap; import java.util.Set; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/SortableJexlVCMatchExp.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/SortableJexlVCMatchExp.java index 0281653af..38f7a7f40 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/SortableJexlVCMatchExp.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/SortableJexlVCMatchExp.java @@ -1,6 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.util; -import org.apache.commons.jexl2.*; +import org.apache.commons.jexl2.Expression; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; public class SortableJexlVCMatchExp extends VariantContextUtils.JexlVCMatchExp implements Comparable { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java index eabd2e588..0a915db37 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/varianteval/util/VariantEvalUtils.java @@ -1,9 +1,7 @@ package org.broadinstitute.sting.gatk.walkers.varianteval.util; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.report.GATKReport; import org.broadinstitute.sting.gatk.report.GATKReportTable; @@ -16,6 +14,8 @@ import org.broadinstitute.sting.gatk.walkers.varianteval.stratifications.Variant import org.broadinstitute.sting.utils.classloader.PluginManager; import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.lang.reflect.Field; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java index d4e07dccf..403c67d3e 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/ApplyRecalibration.java @@ -25,23 +25,23 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Input; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.collections.NestedHashMap; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; import java.io.FileNotFoundException; -import java.lang.Double; import java.util.*; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/Tranche.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/Tranche.java index 64fe36637..15424f0f7 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/Tranche.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/Tranche.java @@ -25,11 +25,14 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; -import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; import java.util.*; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VQSRCalibrationCurve.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VQSRCalibrationCurve.java index 5deb5d8c2..bc7252ec2 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VQSRCalibrationCurve.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VQSRCalibrationCurve.java @@ -26,10 +26,10 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; import java.io.FileNotFoundException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java index ddeda1699..67d54a408 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantDataManager.java @@ -26,7 +26,6 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; @@ -34,9 +33,12 @@ import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.collections.ExpandingArrayList; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.PrintStream; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Created by IntelliJ IDEA. 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 2d0355d7d..8179463eb 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 @@ -25,14 +25,12 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.ArgumentCollection; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RodWalker; @@ -42,6 +40,8 @@ import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.collections.ExpandingArrayList; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; import java.io.FileNotFoundException; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java index 597a54dc1..837f352f8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java @@ -25,12 +25,12 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; +import org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.Reference; import org.broadinstitute.sting.gatk.walkers.Requires; @@ -38,11 +38,10 @@ import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.gatk.walkers.Window; import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; -import org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/FilterLiftedVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/FilterLiftedVariants.java index ba6f5e513..b45ee1b67 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/FilterLiftedVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/FilterLiftedVariants.java @@ -24,18 +24,21 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; -import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; /** * Filters a lifted-over VCF file for ref bases that have been changed. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LeftAlignVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LeftAlignVariants.java index d9dd85f0c..2ebd183f4 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LeftAlignVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LeftAlignVariants.java @@ -28,21 +28,17 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; import net.sf.samtools.Cigar; import net.sf.samtools.CigarElement; import net.sf.samtools.CigarOperator; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.SortingVCFWriter; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.sam.AlignmentUtils; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariants.java index 7eda54387..4f05c8aac 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/LiftoverVariants.java @@ -24,27 +24,27 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; -import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; - -import java.io.File; -import java.util.*; - import net.sf.picard.PicardException; import net.sf.picard.liftover.LiftOver; import net.sf.picard.util.Interval; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMFileReader; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.RMD; +import org.broadinstitute.sting.gatk.walkers.Requires; +import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; + +import java.io.File; +import java.util.*; /** * Lifts a VCF file over from one build to another. Note that the resulting VCF could be mis-sorted. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/RandomlySplitVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/RandomlySplitVariants.java index 0c41a9728..f0756d884 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/RandomlySplitVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/RandomlySplitVariants.java @@ -24,11 +24,6 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.StandardVCFWriter; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; @@ -39,11 +34,15 @@ import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; /** * Takes a VCF file, randomly splits variants into two different sets, and outputs 2 new VCFs with the results. diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index cbac54326..1db692e9f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -24,27 +24,26 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.commandline.Hidden; -import org.broadinstitute.sting.utils.MathUtils; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.utils.variantcontext.*; -import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.utils.MendelianViolation; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.RMD; import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.MendelianViolation; import org.broadinstitute.sting.utils.SampleUtils; -import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; -import java.lang.annotation.AnnotationFormatError; import java.util.*; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/ValidateVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/ValidateVariants.java index 1bd73414c..0644c669b 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/ValidateVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/ValidateVariants.java @@ -25,22 +25,25 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broad.tribble.dbsnp.DbSNPFeature; import org.broad.tribble.TribbleException; +import org.broad.tribble.dbsnp.DbSNPFeature; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; import java.io.File; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantValidationAssessor.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantValidationAssessor.java index 482679593..86bb3b0e8 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantValidationAssessor.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantValidationAssessor.java @@ -25,20 +25,19 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.SampleUtils; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; import org.broadinstitute.sting.utils.collections.Pair; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 71dd5df3f..8d90af65a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -24,18 +24,17 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.PrintStream; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java index 79134b553..aa0e5987f 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToVCF.java @@ -28,26 +28,26 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; import net.sf.samtools.util.CloseableIterator; import org.broad.tribble.dbsnp.DbSNPCodec; import org.broad.tribble.dbsnp.DbSNPFeature; -import org.broadinstitute.sting.utils.codecs.hapmap.HapMapFeature; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; -import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.broadinstitute.sting.gatk.refdata.*; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.refdata.VariantContextAdaptors; import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.hapmap.HapMapFeature; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/jna/clibrary/LibC.java b/public/java/src/org/broadinstitute/sting/jna/clibrary/LibC.java index b01533ee6..b5efcc153 100644 --- a/public/java/src/org/broadinstitute/sting/jna/clibrary/LibC.java +++ b/public/java/src/org/broadinstitute/sting/jna/clibrary/LibC.java @@ -24,7 +24,10 @@ package org.broadinstitute.sting.jna.clibrary; -import com.sun.jna.*; +import com.sun.jna.LastErrorException; +import com.sun.jna.Native; +import com.sun.jna.NativeLong; +import com.sun.jna.Structure; import com.sun.jna.ptr.NativeLongByReference; /** diff --git a/public/java/src/org/broadinstitute/sting/jna/lsf/v7_0_6/LibLsf.java b/public/java/src/org/broadinstitute/sting/jna/lsf/v7_0_6/LibLsf.java index 0c0579d6f..c7b3de6cf 100644 --- a/public/java/src/org/broadinstitute/sting/jna/lsf/v7_0_6/LibLsf.java +++ b/public/java/src/org/broadinstitute/sting/jna/lsf/v7_0_6/LibLsf.java @@ -29,7 +29,7 @@ import com.sun.jna.ptr.FloatByReference; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; import org.broadinstitute.sting.jna.clibrary.JNAUtils; -import org.broadinstitute.sting.jna.clibrary.LibC.*; +import org.broadinstitute.sting.jna.clibrary.LibC.timeval; /* NOTE: This library uses Pointer for some Struct.ByReference members going diff --git a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentDefinitionField.java b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentDefinitionField.java index fe6758e76..c09c4037e 100644 --- a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentDefinitionField.java +++ b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentDefinitionField.java @@ -27,13 +27,16 @@ package org.broadinstitute.sting.queue.extensions.gatk; import net.sf.samtools.BAMIndex; import net.sf.samtools.SAMFileWriter; import org.broad.tribble.Tribble; -import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import org.broadinstitute.sting.commandline.*; import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterArgumentTypeDescriptor; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; import java.io.File; import java.lang.annotation.Annotation; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; public abstract class ArgumentDefinitionField extends ArgumentField { diff --git a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentField.java b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentField.java index 2da427d44..e90933504 100644 --- a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentField.java +++ b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/ArgumentField.java @@ -35,7 +35,10 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.lang.annotation.Annotation; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; public abstract class ArgumentField { diff --git a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/GATKExtensionsGenerator.java b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/GATKExtensionsGenerator.java index 21fb44733..5095bd6e5 100644 --- a/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/GATKExtensionsGenerator.java +++ b/public/java/src/org/broadinstitute/sting/queue/extensions/gatk/GATKExtensionsGenerator.java @@ -27,17 +27,20 @@ package org.broadinstitute.sting.queue.extensions.gatk; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.commandline.ArgumentTypeDescriptor; +import org.broadinstitute.sting.commandline.CommandLineProgram; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.commandline.ParsingEngine; import org.broadinstitute.sting.gatk.CommandLineGATK; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.WalkerManager; import org.broadinstitute.sting.gatk.arguments.ValidationExclusion; import org.broadinstitute.sting.gatk.filters.FilterManager; import org.broadinstitute.sting.gatk.filters.ReadFilter; -import org.broadinstitute.sting.gatk.io.stubs.VCFWriterArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.OutputStreamArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.SAMFileReaderArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.io.stubs.SAMFileWriterArgumentTypeDescriptor; +import org.broadinstitute.sting.gatk.io.stubs.VCFWriterArgumentTypeDescriptor; import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; import org.broadinstitute.sting.gatk.walkers.PartitionBy; import org.broadinstitute.sting.gatk.walkers.PartitionType; diff --git a/public/java/src/org/broadinstitute/sting/utils/DisjointSet.java b/public/java/src/org/broadinstitute/sting/utils/DisjointSet.java index 5f68d3414..52c18e6d6 100644 --- a/public/java/src/org/broadinstitute/sting/utils/DisjointSet.java +++ b/public/java/src/org/broadinstitute/sting/utils/DisjointSet.java @@ -23,7 +23,9 @@ */ package org.broadinstitute.sting.utils; -import java.util.*; +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; public class DisjointSet { private ItemNode[] nodes; diff --git a/public/java/src/org/broadinstitute/sting/utils/GenomeLoc.java b/public/java/src/org/broadinstitute/sting/utils/GenomeLoc.java index 1f8800542..b96923589 100644 --- a/public/java/src/org/broadinstitute/sting/utils/GenomeLoc.java +++ b/public/java/src/org/broadinstitute/sting/utils/GenomeLoc.java @@ -2,7 +2,6 @@ package org.broadinstitute.sting.utils; import com.google.java.contract.Ensures; import com.google.java.contract.Requires; -import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.Serializable; diff --git a/public/java/src/org/broadinstitute/sting/utils/GenomeLocParser.java b/public/java/src/org/broadinstitute/sting/utils/GenomeLocParser.java index 18a1e7ffd..a5c6e0537 100644 --- a/public/java/src/org/broadinstitute/sting/utils/GenomeLocParser.java +++ b/public/java/src/org/broadinstitute/sting/utils/GenomeLocParser.java @@ -25,12 +25,14 @@ package org.broadinstitute.sting.utils; -import com.google.java.contract.*; +import com.google.java.contract.Ensures; +import com.google.java.contract.Invariant; +import com.google.java.contract.Requires; +import com.google.java.contract.ThrowEnsures; import net.sf.picard.reference.ReferenceSequenceFile; import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.SAMSequenceRecord; - import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; diff --git a/public/java/src/org/broadinstitute/sting/utils/IndelUtils.java b/public/java/src/org/broadinstitute/sting/utils/IndelUtils.java index 30e1a3f5b..af69ebca6 100755 --- a/public/java/src/org/broadinstitute/sting/utils/IndelUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/IndelUtils.java @@ -1,8 +1,8 @@ package org.broadinstitute.sting.utils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.ArrayList; import java.util.Arrays; diff --git a/public/java/src/org/broadinstitute/sting/utils/MathUtils.java b/public/java/src/org/broadinstitute/sting/utils/MathUtils.java index 50aa0f707..36ed506aa 100755 --- a/public/java/src/org/broadinstitute/sting/utils/MathUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/MathUtils.java @@ -25,17 +25,14 @@ package org.broadinstitute.sting.utils; -import cern.jet.math.Arithmetic; - -import java.math.BigDecimal; -import java.util.*; - import com.google.java.contract.Requires; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.utils.collections.PrimitivePair; import org.broadinstitute.sting.utils.exceptions.UserException; +import java.math.BigDecimal; +import java.util.*; + /** * MathUtils is a static class (no instantiation allowed!) with some useful math methods. * diff --git a/public/java/src/org/broadinstitute/sting/utils/MendelianViolation.java b/public/java/src/org/broadinstitute/sting/utils/MendelianViolation.java index a8089ffe8..c6a07b5ce 100755 --- a/public/java/src/org/broadinstitute/sting/utils/MendelianViolation.java +++ b/public/java/src/org/broadinstitute/sting/utils/MendelianViolation.java @@ -1,12 +1,13 @@ package org.broadinstitute.sting.utils; -import org.broadinstitute.sting.utils.variantcontext.Genotype; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.util.*; +import java.util.Collection; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/public/java/src/org/broadinstitute/sting/utils/PathUtils.java b/public/java/src/org/broadinstitute/sting/utils/PathUtils.java index 47466be20..822d04dfd 100755 --- a/public/java/src/org/broadinstitute/sting/utils/PathUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/PathUtils.java @@ -2,10 +2,10 @@ package org.broadinstitute.sting.utils; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.List; -import java.util.ArrayList; import java.io.File; import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.List; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/ReservoirDownsampler.java b/public/java/src/org/broadinstitute/sting/utils/ReservoirDownsampler.java index 30257d967..a758df431 100644 --- a/public/java/src/org/broadinstitute/sting/utils/ReservoirDownsampler.java +++ b/public/java/src/org/broadinstitute/sting/utils/ReservoirDownsampler.java @@ -3,7 +3,9 @@ package org.broadinstitute.sting.utils; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; /** * Randomly downsample from a stream of elements. This algorithm is a direct, diff --git a/public/java/src/org/broadinstitute/sting/utils/SWPairwiseAlignment.java b/public/java/src/org/broadinstitute/sting/utils/SWPairwiseAlignment.java index 4b7fa3e41..92d73a5ce 100755 --- a/public/java/src/org/broadinstitute/sting/utils/SWPairwiseAlignment.java +++ b/public/java/src/org/broadinstitute/sting/utils/SWPairwiseAlignment.java @@ -24,15 +24,14 @@ package org.broadinstitute.sting.utils; +import net.sf.samtools.Cigar; import net.sf.samtools.CigarElement; import net.sf.samtools.CigarOperator; -import net.sf.samtools.Cigar; - -import java.util.*; - import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.StingException; +import java.util.*; + /** * Created by IntelliJ IDEA. * User: asivache diff --git a/public/java/src/org/broadinstitute/sting/utils/SampleUtils.java b/public/java/src/org/broadinstitute/sting/utils/SampleUtils.java index c0370064d..f9997bfd8 100755 --- a/public/java/src/org/broadinstitute/sting/utils/SampleUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/SampleUtils.java @@ -27,12 +27,12 @@ package org.broadinstitute.sting.utils; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMReadGroupRecord; -import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; import java.io.FileNotFoundException; diff --git a/public/java/src/org/broadinstitute/sting/utils/SimpleTimer.java b/public/java/src/org/broadinstitute/sting/utils/SimpleTimer.java index a59c5134a..342087b41 100644 --- a/public/java/src/org/broadinstitute/sting/utils/SimpleTimer.java +++ b/public/java/src/org/broadinstitute/sting/utils/SimpleTimer.java @@ -1,7 +1,10 @@ package org.broadinstitute.sting.utils; +import com.google.java.contract.Ensures; +import com.google.java.contract.Invariant; +import com.google.java.contract.Requires; + import java.io.PrintStream; -import com.google.java.contract.*; /** * A useful simple system for timing code. This code is not thread safe! diff --git a/public/java/src/org/broadinstitute/sting/utils/Utils.java b/public/java/src/org/broadinstitute/sting/utils/Utils.java index 4c13d8b18..6a50badce 100755 --- a/public/java/src/org/broadinstitute/sting/utils/Utils.java +++ b/public/java/src/org/broadinstitute/sting/utils/Utils.java @@ -25,13 +25,12 @@ package org.broadinstitute.sting.utils; -import java.util.*; - import net.sf.samtools.util.StringUtil; - import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.collections.Pair; +import java.util.*; + /** * Created by IntelliJ IDEA. * User: depristo diff --git a/public/java/src/org/broadinstitute/sting/utils/baq/BAQ.java b/public/java/src/org/broadinstitute/sting/utils/baq/BAQ.java index 456f0fa0f..ef7cf751e 100644 --- a/public/java/src/org/broadinstitute/sting/utils/baq/BAQ.java +++ b/public/java/src/org/broadinstitute/sting/utils/baq/BAQ.java @@ -1,10 +1,10 @@ package org.broadinstitute.sting.utils.baq; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.CigarElement; -import net.sf.samtools.CigarOperator; import net.sf.picard.reference.IndexedFastaSequenceFile; import net.sf.picard.reference.ReferenceSequence; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; diff --git a/public/java/src/org/broadinstitute/sting/utils/baq/BAQSamIterator.java b/public/java/src/org/broadinstitute/sting/utils/baq/BAQSamIterator.java index 24d4152a5..26356a4a4 100644 --- a/public/java/src/org/broadinstitute/sting/utils/baq/BAQSamIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/baq/BAQSamIterator.java @@ -2,11 +2,10 @@ package org.broadinstitute.sting.utils.baq; import com.google.java.contract.Ensures; import com.google.java.contract.Requires; -import net.sf.samtools.SAMRecord; import net.sf.picard.reference.IndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.baq.BAQ; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/utils/bed/BedParser.java b/public/java/src/org/broadinstitute/sting/utils/bed/BedParser.java index abcae066f..b95165841 100644 --- a/public/java/src/org/broadinstitute/sting/utils/bed/BedParser.java +++ b/public/java/src/org/broadinstitute/sting/utils/bed/BedParser.java @@ -1,11 +1,12 @@ package org.broadinstitute.sting.utils.bed; -import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.*; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * Created by IntelliJ IDEA. 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 404bd80b6..e65b8f921 100755 --- a/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/classloader/JVMUtils.java @@ -29,9 +29,9 @@ import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.StingException; import org.reflections.util.ClasspathHelper; -import java.lang.reflect.*; import java.io.File; import java.io.IOException; +import java.lang.reflect.*; import java.net.URL; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/utils/clipreads/ClippingOp.java b/public/java/src/org/broadinstitute/sting/utils/clipreads/ClippingOp.java index 95f3e160c..5449906b2 100644 --- a/public/java/src/org/broadinstitute/sting/utils/clipreads/ClippingOp.java +++ b/public/java/src/org/broadinstitute/sting/utils/clipreads/ClippingOp.java @@ -4,9 +4,6 @@ import net.sf.samtools.Cigar; import net.sf.samtools.CigarElement; import net.sf.samtools.CigarOperator; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.walkers.ClipReadsWalker; -import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.sam.ReadUtils; import java.util.Vector; diff --git a/public/java/src/org/broadinstitute/sting/utils/clipreads/ReadClipper.java b/public/java/src/org/broadinstitute/sting/utils/clipreads/ReadClipper.java index 031467ed9..988d297f6 100644 --- a/public/java/src/org/broadinstitute/sting/utils/clipreads/ReadClipper.java +++ b/public/java/src/org/broadinstitute/sting/utils/clipreads/ReadClipper.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.utils.clipreads; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.walkers.ClipReadsWalker; import java.util.ArrayList; import java.util.List; 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 index a286ce789..fef6c4ea0 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/completegenomics/CGVarCodec.java @@ -30,7 +30,6 @@ import org.broad.tribble.readers.LineReader; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.regex.Matcher; 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 index 618d9ce79..e169dbdfc 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/soapsnp/SoapSNPCodec.java @@ -4,11 +4,11 @@ import org.broad.tribble.Feature; import org.broad.tribble.FeatureCodec; import org.broad.tribble.NameAwareCodec; import org.broad.tribble.TribbleException; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.Genotype; 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.*; diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java index e7ddac185..b7f4be39a 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/StandardVCFWriter.java @@ -33,13 +33,13 @@ import org.broad.tribble.util.LittleEndianOutputStream; import org.broad.tribble.util.ParsingUtils; import org.broad.tribble.util.PositionalStream; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.*; -import java.util.*; import java.lang.reflect.Array; +import java.util.*; /** * this class writes VCF files diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFParser.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFParser.java index dac996494..1dba351e2 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFParser.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFParser.java @@ -2,7 +2,9 @@ package org.broadinstitute.sting.utils.codecs.vcf; import org.broadinstitute.sting.utils.variantcontext.Allele; import org.broadinstitute.sting.utils.variantcontext.Genotype; -import java.util.*; + +import java.util.List; +import java.util.Map; /** diff --git a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java index 4037f75b9..f43891e77 100755 --- a/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/codecs/vcf/VCFUtils.java @@ -25,10 +25,10 @@ package org.broadinstitute.sting.utils.codecs.vcf; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; -import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/utils/collections/NestedHashMap.java b/public/java/src/org/broadinstitute/sting/utils/collections/NestedHashMap.java index a36ed9ac6..d280ac804 100755 --- a/public/java/src/org/broadinstitute/sting/utils/collections/NestedHashMap.java +++ b/public/java/src/org/broadinstitute/sting/utils/collections/NestedHashMap.java @@ -25,7 +25,8 @@ package org.broadinstitute.sting.utils.collections; -import java.util.*; +import java.util.HashMap; +import java.util.Map; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/collections/RODMergingIterator.java b/public/java/src/org/broadinstitute/sting/utils/collections/RODMergingIterator.java index 3a731c2fd..6d6cb8272 100644 --- a/public/java/src/org/broadinstitute/sting/utils/collections/RODMergingIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/collections/RODMergingIterator.java @@ -27,10 +27,13 @@ package org.broadinstitute.sting.utils.collections; import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.PriorityQueue; public class RODMergingIterator implements Iterator, Iterable { PriorityQueue queue = new PriorityQueue(); diff --git a/public/java/src/org/broadinstitute/sting/utils/duplicates/DupUtils.java b/public/java/src/org/broadinstitute/sting/utils/duplicates/DupUtils.java index 41de5ef96..bba47c76c 100644 --- a/public/java/src/org/broadinstitute/sting/utils/duplicates/DupUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/duplicates/DupUtils.java @@ -26,15 +26,18 @@ package org.broadinstitute.sting.utils.duplicates; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; -import java.util.List; import java.util.Arrays; +import java.util.List; public class DupUtils { private static SAMRecord tmpCopyRead(SAMRecord read) { diff --git a/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java b/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java index 17c4a7df4..7eab6f6c9 100755 --- a/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java +++ b/public/java/src/org/broadinstitute/sting/utils/exceptions/UserException.java @@ -28,9 +28,8 @@ import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.SAMSequenceRecord; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import java.io.File; import java.util.Arrays; diff --git a/public/java/src/org/broadinstitute/sting/utils/fasta/CachingIndexedFastaSequenceFile.java b/public/java/src/org/broadinstitute/sting/utils/fasta/CachingIndexedFastaSequenceFile.java index 0c5085cc7..43ef4aa74 100644 --- a/public/java/src/org/broadinstitute/sting/utils/fasta/CachingIndexedFastaSequenceFile.java +++ b/public/java/src/org/broadinstitute/sting/utils/fasta/CachingIndexedFastaSequenceFile.java @@ -25,15 +25,16 @@ package org.broadinstitute.sting.utils.fasta; import net.sf.picard.PicardException; -import net.sf.picard.reference.*; +import net.sf.picard.reference.FastaSequenceIndex; +import net.sf.picard.reference.IndexedFastaSequenceFile; +import net.sf.picard.reference.ReferenceSequence; import net.sf.samtools.SAMSequenceRecord; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.File; import java.io.FileNotFoundException; import java.util.Arrays; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; - /** * A caching version of the IndexedFastaSequenceFile that avoids going to disk as often as the raw indexer. * diff --git a/public/java/src/org/broadinstitute/sting/utils/genotype/DiploidGenotype.java b/public/java/src/org/broadinstitute/sting/utils/genotype/DiploidGenotype.java index cbfba848c..1c2cfe2e1 100755 --- a/public/java/src/org/broadinstitute/sting/utils/genotype/DiploidGenotype.java +++ b/public/java/src/org/broadinstitute/sting/utils/genotype/DiploidGenotype.java @@ -26,7 +26,6 @@ package org.broadinstitute.sting.utils.genotype; import org.broadinstitute.sting.utils.BaseUtils; -import org.broadinstitute.sting.utils.MathUtils; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/genotype/Haplotype.java b/public/java/src/org/broadinstitute/sting/utils/genotype/Haplotype.java index 31791e805..a17e81461 100755 --- a/public/java/src/org/broadinstitute/sting/utils/genotype/Haplotype.java +++ b/public/java/src/org/broadinstitute/sting/utils/genotype/Haplotype.java @@ -24,14 +24,14 @@ package org.broadinstitute.sting.utils.genotype; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.variantcontext.Allele; -import java.util.*; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; public class Haplotype { protected byte[] bases = null; diff --git a/public/java/src/org/broadinstitute/sting/utils/help/ApplicationDetails.java b/public/java/src/org/broadinstitute/sting/utils/help/ApplicationDetails.java index d9e74640f..483c874dc 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/ApplicationDetails.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/ApplicationDetails.java @@ -25,13 +25,13 @@ package org.broadinstitute.sting.utils.help; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.classloader.JVMUtils; import org.broadinstitute.sting.commandline.CommandLineProgram; +import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.List; -import java.util.Collections; import java.io.IOException; +import java.util.Collections; +import java.util.List; /** * Contains details additional details that the program can diff --git a/public/java/src/org/broadinstitute/sting/utils/help/DescriptionTaglet.java b/public/java/src/org/broadinstitute/sting/utils/help/DescriptionTaglet.java index 68633a2b3..65c332048 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/DescriptionTaglet.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/DescriptionTaglet.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.utils.help; import com.sun.tools.doclets.Taglet; -import com.sun.javadoc.Tag; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/utils/help/DisplayNameTaglet.java b/public/java/src/org/broadinstitute/sting/utils/help/DisplayNameTaglet.java index be6f7f3eb..6c6dad736 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/DisplayNameTaglet.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/DisplayNameTaglet.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.utils.help; import com.sun.tools.doclets.Taglet; -import com.sun.javadoc.Tag; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/utils/help/HelpFormatter.java b/public/java/src/org/broadinstitute/sting/utils/help/HelpFormatter.java index 493f26e76..a9d71ef98 100755 --- a/public/java/src/org/broadinstitute/sting/utils/help/HelpFormatter.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/HelpFormatter.java @@ -25,22 +25,16 @@ package org.broadinstitute.sting.utils.help; +import org.apache.log4j.Logger; import org.broadinstitute.sting.commandline.ArgumentDefinition; import org.broadinstitute.sting.commandline.ArgumentDefinitionGroup; import org.broadinstitute.sting.commandline.ArgumentDefinitions; -import org.broadinstitute.sting.utils.text.TextFormattingUtils; import org.broadinstitute.sting.utils.Utils; -import org.apache.log4j.Logger; +import org.broadinstitute.sting.utils.text.TextFormattingUtils; -import java.util.Formatter; -import java.util.List; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Comparator; -import java.util.Collection; -import java.util.Collections; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.*; /** * Print out help for Sting command-line applications. */ diff --git a/public/java/src/org/broadinstitute/sting/utils/help/HelpTaglet.java b/public/java/src/org/broadinstitute/sting/utils/help/HelpTaglet.java index b962664eb..b350b1a29 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/HelpTaglet.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/HelpTaglet.java @@ -1,9 +1,7 @@ package org.broadinstitute.sting.utils.help; -import com.sun.tools.doclets.Taglet; import com.sun.javadoc.Tag; - -import java.util.Map; +import com.sun.tools.doclets.Taglet; /** * Basic functionality for the help taglet. diff --git a/public/java/src/org/broadinstitute/sting/utils/help/ResourceBundleExtractorDoclet.java b/public/java/src/org/broadinstitute/sting/utils/help/ResourceBundleExtractorDoclet.java index 4afac69c3..6ee12d42e 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/ResourceBundleExtractorDoclet.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/ResourceBundleExtractorDoclet.java @@ -26,14 +26,16 @@ package org.broadinstitute.sting.utils.help; import com.sun.javadoc.*; +import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.classloader.JVMUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.*; -import java.util.*; - -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.classloader.JVMUtils; -import org.broadinstitute.sting.utils.Utils; -import org.broadinstitute.sting.gatk.walkers.Walker; +import java.util.HashSet; +import java.util.Properties; +import java.util.Scanner; +import java.util.Set; /** * Extracts certain types of javadoc (specifically package and class descriptions) and makes them available diff --git a/public/java/src/org/broadinstitute/sting/utils/help/SummaryTaglet.java b/public/java/src/org/broadinstitute/sting/utils/help/SummaryTaglet.java index 036bbec4f..db8b55940 100644 --- a/public/java/src/org/broadinstitute/sting/utils/help/SummaryTaglet.java +++ b/public/java/src/org/broadinstitute/sting/utils/help/SummaryTaglet.java @@ -1,7 +1,6 @@ package org.broadinstitute.sting.utils.help; import com.sun.tools.doclets.Taglet; -import com.sun.javadoc.Tag; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/utils/instrumentation/Sizeof.java b/public/java/src/org/broadinstitute/sting/utils/instrumentation/Sizeof.java index 3420c9876..73a29ba4f 100644 --- a/public/java/src/org/broadinstitute/sting/utils/instrumentation/Sizeof.java +++ b/public/java/src/org/broadinstitute/sting/utils/instrumentation/Sizeof.java @@ -27,9 +27,9 @@ package org.broadinstitute.sting.utils.instrumentation; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.lang.instrument.Instrumentation; +import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.lang.reflect.Array; import java.util.IdentityHashMap; /** diff --git a/public/java/src/org/broadinstitute/sting/utils/interval/IntervalFileMergingIterator.java b/public/java/src/org/broadinstitute/sting/utils/interval/IntervalFileMergingIterator.java index e722ac196..988240ef9 100644 --- a/public/java/src/org/broadinstitute/sting/utils/interval/IntervalFileMergingIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/interval/IntervalFileMergingIterator.java @@ -25,16 +25,16 @@ package org.broadinstitute.sting.utils.interval; +import org.broadinstitute.sting.gatk.iterators.PushbackIterator; +import org.broadinstitute.sting.gatk.refdata.utils.StringToGenomeLocIteratorAdapter; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; -import org.broadinstitute.sting.gatk.iterators.PushbackIterator; -import org.broadinstitute.sting.gatk.refdata.utils.StringToGenomeLocIteratorAdapter; -import java.util.Iterator; import java.io.File; import java.io.FileNotFoundException; +import java.util.Iterator; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/interval/IntervalUtils.java b/public/java/src/org/broadinstitute/sting/utils/interval/IntervalUtils.java index 80dc35455..f551e1368 100644 --- a/public/java/src/org/broadinstitute/sting/utils/interval/IntervalUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/interval/IntervalUtils.java @@ -5,17 +5,17 @@ import net.sf.picard.util.IntervalList; import net.sf.samtools.SAMFileHeader; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.datasources.reference.ReferenceDataSource; -import org.broadinstitute.sting.utils.GenomeLocSortedSet; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.GenomeLocSortedSet; import org.broadinstitute.sting.utils.bed.BedParser; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.UserException; import org.broadinstitute.sting.utils.text.XReadLines; +import java.io.File; import java.io.IOException; import java.util.*; -import java.io.File; /** * Parse text representations of interval strings that diff --git a/public/java/src/org/broadinstitute/sting/utils/interval/NwayIntervalMergingIterator.java b/public/java/src/org/broadinstitute/sting/utils/interval/NwayIntervalMergingIterator.java index 31a2f41fb..7e87ce8b5 100644 --- a/public/java/src/org/broadinstitute/sting/utils/interval/NwayIntervalMergingIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/interval/NwayIntervalMergingIterator.java @@ -26,11 +26,10 @@ package org.broadinstitute.sting.utils.interval; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import java.util.PriorityQueue; import java.util.Iterator; +import java.util.PriorityQueue; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/interval/OverlappingIntervalIterator.java b/public/java/src/org/broadinstitute/sting/utils/interval/OverlappingIntervalIterator.java index 0b63d582e..29ffb13e4 100755 --- a/public/java/src/org/broadinstitute/sting/utils/interval/OverlappingIntervalIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/interval/OverlappingIntervalIterator.java @@ -25,9 +25,8 @@ package org.broadinstitute.sting.utils.interval; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocSortedSet; import org.broadinstitute.sting.gatk.iterators.PushbackIterator; +import org.broadinstitute.sting.utils.GenomeLoc; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java index 543302446..3821c9c8a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/AbstractReadBackedPileup.java @@ -24,19 +24,16 @@ package org.broadinstitute.sting.utils.pileup; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; import org.broadinstitute.sting.gatk.datasources.sample.Sample; -import org.broadinstitute.sting.utils.HasGenomeLocation; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.BaseUtils; -import org.broadinstitute.sting.gatk.iterators.IterableIterator; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.exceptions.StingException; import java.util.*; -import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.exceptions.StingException; - /** * A generic implementation of read-backed pileups. * diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ExtendedEventPileupElement.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ExtendedEventPileupElement.java index b6f3e9f09..26e66014c 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ExtendedEventPileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ExtendedEventPileupElement.java @@ -1,8 +1,5 @@ package org.broadinstitute.sting.utils.pileup; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.BaseUtils; import net.sf.samtools.SAMRecord; import java.util.Arrays; diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java index 6c855c1c7..f7d237401 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -1,6 +1,9 @@ package org.broadinstitute.sting.utils.pileup; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * An easy to access fragment-based pileup, which contains two separate pileups. The first diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java b/public/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java index d8af2ea8f..7005cf869 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/MergingPileupElementIterator.java @@ -27,9 +27,9 @@ package org.broadinstitute.sting.utils.pileup; import net.sf.picard.util.PeekableIterator; import org.broadinstitute.sting.gatk.datasources.sample.Sample; -import java.util.PriorityQueue; import java.util.Comparator; import java.util.Iterator; +import java.util.PriorityQueue; /** * Merges multiple pileups broken down by sample. diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java index 51e02bf74..66e1afecb 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -1,9 +1,10 @@ package org.broadinstitute.sting.utils.pileup; -import org.broadinstitute.sting.utils.*; +import com.google.java.contract.Ensures; +import com.google.java.contract.Requires; import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.sam.ReadUtils; -import com.google.java.contract.*; /** * Created by IntelliJ IDEA. diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java index a32aa5645..8d43a368a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileup.java @@ -24,15 +24,13 @@ package org.broadinstitute.sting.utils.pileup; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; -import java.util.Iterator; -import java.util.List; import java.util.Collection; - -import net.sf.samtools.SAMRecord; +import java.util.List; /** * A clean interface for working with extended event pileups. diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java index a1a08c95f..31d29430a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedExtendedEventPileupImpl.java @@ -23,15 +23,14 @@ */ package org.broadinstitute.sting.utils.pileup; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.datasources.sample.Sample; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.*; -import net.sf.samtools.SAMRecord; - public class ReadBackedExtendedEventPileupImpl extends AbstractReadBackedPileup implements ReadBackedExtendedEventPileup { private int nInsertions; private int maxDeletionLength; // cached value of the length of the longest deletion observed at the site diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java index c52cc0b52..36b8a8c65 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileup.java @@ -24,14 +24,13 @@ package org.broadinstitute.sting.utils.pileup; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.gatk.iterators.IterableIterator; -import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.HasGenomeLocation; -import java.util.List; import java.util.Collection; +import java.util.List; /** * A data retrieval interface for accessing parts of the pileup. diff --git a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java index 70eba577c..e5b054961 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/ReadBackedPileupImpl.java @@ -23,9 +23,9 @@ */ package org.broadinstitute.sting.utils.pileup; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.datasources.sample.Sample; import org.broadinstitute.sting.utils.GenomeLoc; -import net.sf.samtools.SAMRecord; import java.util.List; import java.util.Map; diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java index 4e4294b20..344eccb83 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java @@ -25,15 +25,16 @@ package org.broadinstitute.sting.utils.sam; -import net.sf.samtools.CigarOperator; -import net.sf.samtools.SAMRecord; import net.sf.samtools.Cigar; import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; +import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.utils.BaseUtils; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.pileup.*; import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; import java.util.ArrayList; import java.util.Arrays; diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialReadsTraversal.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialReadsTraversal.java index 5812c9aec..5f7db458a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialReadsTraversal.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialReadsTraversal.java @@ -1,15 +1,13 @@ package org.broadinstitute.sting.utils.sam; -import org.broadinstitute.sting.gatk.traversals.TraversalEngine; -import org.broadinstitute.sting.gatk.walkers.Walker; -import org.broadinstitute.sting.gatk.walkers.ReadWalker; -import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.apache.log4j.Logger; - -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider; +import org.broadinstitute.sting.gatk.traversals.TraversalEngine; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.walkers.Walker; /* diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMFileReader.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMFileReader.java index ce6ca570c..adf60b16b 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMFileReader.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMFileReader.java @@ -1,15 +1,17 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.*; - -import java.io.InputStream; -import java.io.ByteArrayInputStream; -import java.io.UnsupportedEncodingException; -import java.util.*; - -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; /** * User: hanna * Date: Jun 11, 2009 diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMIterator.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMIterator.java index b683f5247..62e371bc0 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMIterator.java @@ -1,9 +1,8 @@ package org.broadinstitute.sting.utils.sam; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.gatk.ReadProperties; -import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; import java.util.Iterator; diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMQueryIterator.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMQueryIterator.java index 4f5dcca61..2b359fe6a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMQueryIterator.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMQueryIterator.java @@ -1,13 +1,12 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMFileHeader; -import net.sf.samtools.SAMSequenceRecord; import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMSequenceRecord; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.util.List; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; - /* * Copyright (c) 2009 The Broad Institute diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ComparableSAMRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/ComparableSAMRecord.java index 01f1dfe96..31deb7535 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ComparableSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ComparableSAMRecord.java @@ -26,8 +26,6 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; public class ComparableSAMRecord implements Comparable { diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java index 2b8ac387c..c7ffcab0c 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMReadGroupRecord.java @@ -1,6 +1,6 @@ package org.broadinstitute.sting.utils.sam; -import net.sf.samtools.*; +import net.sf.samtools.SAMReadGroupRecord; /** * @author ebanks diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java index f3d9edab9..517f9f75d 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -1,12 +1,14 @@ package org.broadinstitute.sting.utils.sam; -import java.lang.reflect.Method; -import java.util.*; - import net.sf.samtools.*; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * @author ebanks * GATKSAMRecord diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java index 080762039..6c15910b1 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -25,13 +25,14 @@ package org.broadinstitute.sting.utils.sam; -import com.google.java.contract.*; +import com.google.java.contract.Ensures; +import com.google.java.contract.Requires; import net.sf.samtools.*; import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; import java.io.File; +import java.util.*; /** * A miscellaneous collection of utilities for working with SAM files, headers, etc. diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/SAMFileReaderBuilder.java b/public/java/src/org/broadinstitute/sting/utils/sam/SAMFileReaderBuilder.java index f8a0ca6a7..bb9db5d98 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/SAMFileReaderBuilder.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/SAMFileReaderBuilder.java @@ -26,11 +26,10 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMFileReader; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.File; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; - /** * Allows the user to steadily accumulate information about what * components go into a SAM file writer, ultimately using this diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/SimplifyingSAMFileWriter.java b/public/java/src/org/broadinstitute/sting/utils/sam/SimplifyingSAMFileWriter.java index df2010e8b..60e1d9948 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/SimplifyingSAMFileWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/SimplifyingSAMFileWriter.java @@ -3,13 +3,6 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMFileHeader; import net.sf.samtools.SAMFileWriter; import net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.gatk.iterators.StingSAMIterator; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.exceptions.UserException; - -import java.util.Iterator; -import java.util.NoSuchElementException; /** * XXX 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 9beb7895b..f6aa882ad 100644 --- a/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/text/ListFileUtils.java @@ -26,7 +26,6 @@ package org.broadinstitute.sting.utils.text; import org.broadinstitute.sting.commandline.ParsingEngine; import org.broadinstitute.sting.commandline.Tags; -import org.broadinstitute.sting.gatk.arguments.GATKArgumentCollection; import org.broadinstitute.sting.gatk.datasources.reads.SAMReaderID; import org.broadinstitute.sting.gatk.refdata.utils.RMDTriplet; import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; diff --git a/public/java/src/org/broadinstitute/sting/utils/text/TextFormattingUtils.java b/public/java/src/org/broadinstitute/sting/utils/text/TextFormattingUtils.java index 803d6ac0f..1d4251542 100644 --- a/public/java/src/org/broadinstitute/sting/utils/text/TextFormattingUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/text/TextFormattingUtils.java @@ -28,11 +28,11 @@ package org.broadinstitute.sting.utils.text; import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.*; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.io.StringReader; import java.io.IOException; +import java.io.StringReader; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Common utilities for dealing with text formatting. diff --git a/public/java/src/org/broadinstitute/sting/utils/text/XReadLines.java b/public/java/src/org/broadinstitute/sting/utils/text/XReadLines.java index 064256388..52b6f3b01 100644 --- a/public/java/src/org/broadinstitute/sting/utils/text/XReadLines.java +++ b/public/java/src/org/broadinstitute/sting/utils/text/XReadLines.java @@ -25,10 +25,10 @@ package org.broadinstitute.sting.utils.text; -import java.util.Iterator; -import java.util.List; -import java.util.LinkedList; import java.io.*; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; /** * Support for Python-like xreadlines() function as a class. This is an iterator and iterable over diff --git a/public/java/src/org/broadinstitute/sting/utils/threading/FileBackedGenomeLocProcessingTracker.java b/public/java/src/org/broadinstitute/sting/utils/threading/FileBackedGenomeLocProcessingTracker.java index cae099eeb..3763ec67d 100644 --- a/public/java/src/org/broadinstitute/sting/utils/threading/FileBackedGenomeLocProcessingTracker.java +++ b/public/java/src/org/broadinstitute/sting/utils/threading/FileBackedGenomeLocProcessingTracker.java @@ -1,18 +1,14 @@ package org.broadinstitute.sting.utils.threading; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.*; -import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.concurrent.locks.ReentrantLock; /** * Keeps a copy of the processing locks in a file diff --git a/public/java/src/org/broadinstitute/sting/utils/threading/NoOpGenomeLocProcessingTracker.java b/public/java/src/org/broadinstitute/sting/utils/threading/NoOpGenomeLocProcessingTracker.java index 4e61ef9e1..ad2a6d31b 100644 --- a/public/java/src/org/broadinstitute/sting/utils/threading/NoOpGenomeLocProcessingTracker.java +++ b/public/java/src/org/broadinstitute/sting/utils/threading/NoOpGenomeLocProcessingTracker.java @@ -1,9 +1,5 @@ package org.broadinstitute.sting.utils.threading; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; - -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; diff --git a/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileLock.java b/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileLock.java index 3eb2be96b..0f47da413 100644 --- a/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileLock.java +++ b/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileLock.java @@ -6,10 +6,7 @@ import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.channels.*; /** * User: depristo diff --git a/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileThreadSafeLock.java b/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileThreadSafeLock.java index dec69f7c2..d70879a0a 100644 --- a/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileThreadSafeLock.java +++ b/public/java/src/org/broadinstitute/sting/utils/threading/SharedFileThreadSafeLock.java @@ -2,13 +2,8 @@ package org.broadinstitute.sting.utils.threading; import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.channels.*; /** * User: depristo diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java index 901de6fae..c3f437f11 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/Allele.java @@ -1,9 +1,9 @@ package org.broadinstitute.sting.utils.variantcontext; -import java.util.Arrays; -import java.util.List; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.List; /** * Immutable representation of an allele diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/GenotypeLikelihoods.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/GenotypeLikelihoods.java index 3feaf5e1c..dba16cf86 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/GenotypeLikelihoods.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/GenotypeLikelihoods.java @@ -24,8 +24,8 @@ package org.broadinstitute.sting.utils.variantcontext; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broad.tribble.TribbleException; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; public class GenotypeLikelihoods { public static final boolean CAP_PLS = false; diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/MutableVariantContext.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/MutableVariantContext.java index 4efba8825..a191670a4 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/MutableVariantContext.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/MutableVariantContext.java @@ -1,7 +1,10 @@ package org.broadinstitute.sting.utils.variantcontext; -import java.util.*; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** * Mutable version of VariantContext diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java index 92c5d648b..eab392c4d 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContext.java @@ -2,8 +2,8 @@ package org.broadinstitute.sting.utils.variantcontext; import org.broad.tribble.Feature; import org.broad.tribble.TribbleException; -import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broad.tribble.util.ParsingUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.codecs.vcf.VCFParser; import java.util.*; diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java index 5d58954aa..5a5671056 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java @@ -23,21 +23,26 @@ package org.broadinstitute.sting.utils.variantcontext; -import java.io.Serializable; -import java.util.*; - -import com.google.java.contract.*; +import com.google.java.contract.Ensures; +import com.google.java.contract.Requires; import net.sf.picard.reference.ReferenceSequenceFile; import net.sf.samtools.util.StringUtil; -import org.apache.commons.jexl2.*; +import org.apache.commons.jexl2.Expression; +import org.apache.commons.jexl2.JexlEngine; import org.broad.tribble.util.popgen.HardyWeinbergCalculation; -import org.broadinstitute.sting.utils.codecs.vcf.AbstractVCFCodec; import org.broadinstitute.sting.gatk.walkers.phasing.ReadBackedPhasingWalker; -import org.broadinstitute.sting.utils.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.codecs.vcf.AbstractVCFCodec; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import java.io.Serializable; +import java.util.*; + public class VariantContextUtils { final public static JexlEngine engine = new JexlEngine(); static { diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantJEXLContext.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantJEXLContext.java index c5a3b6f2a..a59ed7abe 100644 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantJEXLContext.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantJEXLContext.java @@ -29,7 +29,10 @@ import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.codecs.vcf.VCFConstants; import org.broadinstitute.sting.utils.exceptions.UserException; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; /** * diff --git a/public/java/src/org/broadinstitute/sting/utils/wiggle/WiggleWriter.java b/public/java/src/org/broadinstitute/sting/utils/wiggle/WiggleWriter.java index ab91d0e2e..5782c2704 100755 --- a/public/java/src/org/broadinstitute/sting/utils/wiggle/WiggleWriter.java +++ b/public/java/src/org/broadinstitute/sting/utils/wiggle/WiggleWriter.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.utils.wiggle; -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.*; From 0a0363aef23e25f876034928eae7e4b3fff08623 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Sun, 17 Jul 2011 20:43:35 -0400 Subject: [PATCH 154/214] Revving Picard to get a parser that works with the latest metrics file formats we're starting to see. --- ...1941.jar => picard-private-parts-1954.jar} | Bin 36047 -> 36047 bytes .../picard-private-parts-1954.xml | 3 +++ ...941.xml => picard-private-parts-1954.xml~} | 0 ...icard-1.47.869.jar => picard-1.48.889.jar} | Bin 1084255 -> 1106870 bytes .../repository/net.sf/picard-1.48.889.xml | 3 +++ ...card-1.47.869.xml => picard-1.48.889.xml~} | 0 settings/repository/net.sf/sam-1.47.869.xml | 3 --- .../{sam-1.47.869.jar => sam-1.48.889.jar} | Bin 535562 -> 536180 bytes settings/repository/net.sf/sam-1.48.889.xml | 3 +++ 9 files changed, 9 insertions(+), 3 deletions(-) rename settings/repository/edu.mit.broad/{picard-private-parts-1941.jar => picard-private-parts-1954.jar} (88%) create mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1954.xml rename settings/repository/edu.mit.broad/{picard-private-parts-1941.xml => picard-private-parts-1954.xml~} (100%) rename settings/repository/net.sf/{picard-1.47.869.jar => picard-1.48.889.jar} (87%) create mode 100644 settings/repository/net.sf/picard-1.48.889.xml rename settings/repository/net.sf/{picard-1.47.869.xml => picard-1.48.889.xml~} (100%) delete mode 100644 settings/repository/net.sf/sam-1.47.869.xml rename settings/repository/net.sf/{sam-1.47.869.jar => sam-1.48.889.jar} (91%) create mode 100644 settings/repository/net.sf/sam-1.48.889.xml diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1941.jar b/settings/repository/edu.mit.broad/picard-private-parts-1954.jar similarity index 88% rename from settings/repository/edu.mit.broad/picard-private-parts-1941.jar rename to settings/repository/edu.mit.broad/picard-private-parts-1954.jar index 760db5cb8e7fbcd12b9cd90049ff2ff9ba037b11..67637d3d9311d10767c5758006471a628c5a8a88 100644 GIT binary patch delta 633 zcmX>qR2NBc{P{|ft1A@W_2KST^>yRR0dI#r^ zWqet|GSW&tEMSpUYVX*=jM;jtI6;iblAQXJ_gnBFxfJAz2^Jn;Ww$NuzXyj1DIae=mm1j_aoAl(vO;#ZG zq~;v3lKkc*Fny&t6Rgys#Sg4>Vhcq4TT3FCAJrNIrgyd`foZw6P_X*4wg@o)Vp|oM z_G?cA)7#tQ!L(!tM1O5ZI@q4)9mQbr*v>?-{)3&aU~$f_FtB)1R~(o=+y!x;QFjKI SKesy?O#kjq0jp2y$prxRP5Jr& delta 633 zcmX>|n-hy;Ynb#$-uO{mJ_+c#vEQa>WD-53sV^7Jng@+_n;B28(>Q z-NgoGY;e(mNZogR53&DZ&<=>2p0HVrV25Z%n1a8}U*`}6+Hbe8 zf@h^5GXp~b8v}#wWJWus$pzhVn+po0Ax8BT-(Ui3$SjM8Sa-TSpMx0~nv-oCEWnmj zG}wbwOy1R?52oKV7=vl0MoX}KT%!Y+UfAdb7Jt{64d%x*d4l70E2e^Pyhe` diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1954.xml b/settings/repository/edu.mit.broad/picard-private-parts-1954.xml new file mode 100644 index 000000000..c702fd6e5 --- /dev/null +++ b/settings/repository/edu.mit.broad/picard-private-parts-1954.xml @@ -0,0 +1,3 @@ + + + diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1941.xml b/settings/repository/edu.mit.broad/picard-private-parts-1954.xml~ similarity index 100% rename from settings/repository/edu.mit.broad/picard-private-parts-1941.xml rename to settings/repository/edu.mit.broad/picard-private-parts-1954.xml~ diff --git a/settings/repository/net.sf/picard-1.47.869.jar b/settings/repository/net.sf/picard-1.48.889.jar similarity index 87% rename from settings/repository/net.sf/picard-1.47.869.jar rename to settings/repository/net.sf/picard-1.48.889.jar index d277fd2177e994cf602f728bfad82c7abc7f885e..1b725dde5da26bac05010bc371775cdb890c323c 100644 GIT binary patch delta 67365 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 b()RE^J#5(jz^qfUl(%Ow_T^Nt&Dj3~hZON% delta 52367 zcma&P2YggT7dL#)-Ew#D-t=r50TKu;l^RGO5PA!}h7t%6Is^#ChKmZKC?KqIAr=(H zSU`FC!CtUP24u`@+6S5h@%R4o8Lk=x}^YI2;@HE4Tl?t!%f0|)3DEkF5&xT*6H=Ggt5)hN`o}G&B#g3DFcv+ zWFi-}pqB78YNg!P3SL!{9z5NsOR#BFRA7sj zrqPoIO{bFrJ*Csr2Fg%@QxfxxIM0gnoH);m^MXz<8fb~i^^zCR%LctduNp{uO`O*y z?hSF?6z47Z=xu@Ck;2~<=sj`X4@md}AALxtee@B1EY2r7eQHos`pn(qt8MbH+Mv(r z3(5bbIA4kLwK(61^Q{#Aoj~7<^MjQ5qd-3i^s_*}i1VxD`%R$#iSxU(_z%?oC;cTE z|CaC>Y5ZA9J}1F?RLmIFSD3}o#Bqq@G}y&%FH&_0dc^UfC^kIolYl9K2!SFEj^b#8 zV>lLtbDY8P?3aWDai%8vIEhZ{oNUl=P7$Y(IH~egW2vACTEk7nNi#T|o5@$r4bI>e zI=3`vBDeB#Yi=V>riZg6IUCc-hR!)U=N?Fj`I0#gTZXHGX>p6K{WBbe!D;Q91)Im; zzu$i|bKBr82_3lIfl~>yIc~f9s=dw~&?Ho#bH`wxq;Z@Zye(-%#4=iL(h9oKq#0BZ zP(ttQYBTGv`C!A608zuDa|^+Kg&#-OY=)`7E;6~hKs_X`n0xBn%jDkNN9VRC_eC+>kNaDD|8Tbm4B#T2 z2bw&H2b)|X`G?4tLj@Wp&~P|3UxFjV87Xn2q=wM~jS*<9K;tCeLdh~-oKlIKz!Pnv*IXcfZc^=O&#S@@e>e>mtLbtdL7vLU1~z_0inK+v=68N z=%){TOvC6C8b_bfmB^idZ&4Bj=qmUET}{^@j%hWm3D-A2T%SLymZG z8>{MfsQMFtu8F?Dar6~h{4Lt>9mUi4s-85}V*mMi{B$j?MfpU2x{j_#jq3nAh^4DH z(2aK0Xq!t4<-VB*De@r2d2hahy9#WF)>WIK@NI5*Dc{y5Jk>2G)bo|o&F;2Z+ZyPK%n-D z;O$rsAf4z}=^y4I5GRunhmae~v*WQk>Qqbl06SOHtKmHHk|jPfD@0wksjTv0fkYP6 z&_l>uxQ&`1FG~rv)O8ze%S4U@$&pY)H%gM4<*UO5W=Ki~a(Al^P=w@lNQ?t9McZgH zyzbRBHk`SoB(+3bk2)%rq7G8eyD0_{z3|t&mikmvW>#$9TIx46=Op=aYN>y8{9TlQ z)Bysh3ff31ZDjuJ&8Fs$V<-^8u~@|M)SUg)mJ_K94%z{nLc=(fCUaw&%jvX~o6%LA zLDz8$OlWJmliSd4&Zg(MExpR^=qv6(zu-g?j3D#(Dy7j@YzV@9%rvA+uEluWeaQDXB?Cn^F!OxVj$&}&> zo!Gb~g)YED3f;-BWBIzbv&Y-nK*Z3)7!xWqlTCZO^9q5~eji>KksMJ=Bb+nxBLx@< zAWDEy!Bd&p>7%Pjch->8kss&CkN3xIqm}kNj@d?4($HW+R!8m@9Go@K-Co+#K3JWV z;vOsD*x-?@H1{|G#|2MkB?izz!9uEo$`35ZO5>iC$-Srt;J(2T=tNrgB~Oz_=as#l1X= z_JF#m1zqtB$cmRiP<#V=;(MMzXL%yXgK0b$G{b@bz)N@zPV2e64urzZAQ855CGP~4 z@BoN}gCGx%@lt*k#KB9vg5TiF_;U~jXLzip@s*m3S7|YPmDZS7Ydv|5Hh{0yrtw;> z0tdb<-=8T72VXYbMz>=jCr}>ULEEvAU*;^j6LEo9v@3@0q8${6)!(mqfO9t`hS zv>y=oI&EgdMg$Z-JOLdze|XkWvWJ?{7EkD3?{T5e3MV7Lps&!K;KBq!=Gev zI)Pw`>Zu(?|0Bc2={nT~@5*f%xaj+flL_Yqs%e3e&Qi8chjlvgCwc3!{~hPc#GGhC zJlg00#HP)+re?)XsimnyvQJWMHg-9%cKNpOHrs`7Y%Hg^LJr(WIGwh{9RBONqiBl)R z!{QtDYVXyf0OKAW-iQy>yyB z66a$B#O2V@v z*}_HTbCy)h=v_H~e#P{ql}mz~+TCVN|JvKw+8ggl4W>Pi797*-ly#z?uS4)m@5Y9= zYIfz4r9;aXR0I?IOtw1YdHYz~-_W9iZR1)83;M3NCQRT?R;w5FSnKoy5mCl*jG9hA z>-38iUBwfFFZL@BKEA(SuxY1C?3!PL4-L3JLYtET5yz5>@)#Uog?z|?I(=-#ai?};eRxo3FVsPV-1gmO-CoR}y zXq2^j3TFg2eUTJA-Fc}kP|(_p4SwWoje>euR~?K-F)DR4b><(b)1IH{&g9p4Xq~EuS%CWX1H#B{Lvpsa)8*a>1hc6-z6u@0)Vh z;HrYnR@FAhAGTlNwGM9KXshXsy2rXK-P!oSurcWzNWr!y96~9e&j$d>3{>c25W<81 z6)w3bJOt@OFA5I>V!?L~FL=uyXLu#Q4BX*j=xM8&cAzg`__5pA+#72t|^3oFU{pfKp`SHd9 zDbJRD&c@)*xhTKLm6jnj9wLAh;StJ%FC*m2tfj_sUfB&&rwxYjLS?RSWlo$fmxe!n z0+ZvwHzV+IlS~knO;1w5KKc$3Bb-)8={ORb)e1+OyPqso44 zOPR6AlpPB`1;lpls9MUi=}GBI3hE%V!-@Li(cMPqY72B^INBktv*iFI!mT3;jKDD{ zf(tE?Wuey2 zkXjUj$-4PbaHu;Jw6YbeSO192kQmO0hR2K`aNJ=q;a-q z+8*Q;9WhUxO6&~z2dOiJAJiK`LvjJ=N49SQvJ2bq!zGB=%WrncbGhfy^! z#;rIpZo{D5iClMqiM$8yPBmb*uxUqlz|t|K>jDt=FvLCfCQ(tSfYl7 z9QY^&HJS>zXB`EKN3GVtSibP@>AxSl@&PR2U092|!B0Fy`JmJLB0LxrxlF$>%GuyG zZbF|OSR|bw<`|%6wItj_gL+|f1a-=q#x6e#k{pzOM|>H?mmkQ?O=M%%YyCB_1SZ^Qo60+`aNn8X3-P!ec`TLH;P zuQuvbCjS{H|Dbt;B%9|$n_WL;QaA_v`2AZHio}|zaRzp zH~#8Pfr}B?oeEoeuzDIMz8NZ(e?}ao)KTvPlp(XmYHivma1h3S2jVoab^YKAdF_DP z7cn&;5B~=;`w%2s_5ao!)xFlZX`Oc9)2WdTrK|gG`mr{VqEZ@g==ZOVwIDjy!s63f znC?FDYK*nj!BGK_q-*InkEmKA>34T=2I|B=3H>3?pU$F^=b%f9q`!3fTc@)ICg_}m z>vhq%MAC0?nB6^2s}I5FXu9ZL;!!HpFBH!%aoir!z{HCNW-WX1JsSpOZUIxk2rv0K zQs*cSM|(KN022=#jKOgdAMatm_z50PG&l(g7&s~7G!h32m?Um2P7`sO8l1-I2AvTF zj1gAANP$qnL~<*MYwhDUoaqzl%NKwPrDYoDN=lv&1Xw1t9zH7K4&rpwxs!pV2X$02 z=Zn)>a(5A^K%hc_x(d`ypdx{~3)DlP<~kP}G=zJ)dmOekWRld&-Q!d^6hN@IyT_{? z)IUk=eHg{*xgs-L^ZCl@mGclY>wrurvo1J3K-Bs9?7fRLp}7=%PxbRYSxXDsjUW2sm885eARsQR0jiXN=6tSe?gtc)W*84NML!~zXw?|n;Hj}5`o`z{GSv$>=0o;hdX zoT}N@4+pe_VDa{-0}F%M96Y?gbA-9Ha%uVefeWiDmMpEZ(j8i(1E+5u!3hg=UWj#y zDaF#o0>gA-N~{r2LKl5>OPb>WdN8=_z=Lhp(+#5J+G+xK+-d^z-^CO&w|sed-m;~0 z=I8ZYxNO0Y@r>4wuS5s-eolkJOJepltx!VUqnwcnM=zT z&Zt;0WqReZh0r&xk~q(jnRXcJB$KbE!_Xgzvs#=r;#@1vT5+!9>y`fK2ENhc^|tcp zCY@39W)3P%k;z-wG9kU%rgOEK&bRVy7%!7=m(TCu?Iz#JcbU9{@7DPqop)ONQ$&Jc z^1YH&!`rPM9XJar!u#lHlkaCt=!24f7o9YDw?GdGv`3)57+c;a(0P> z92Dn}IJM%0#HkbKusBD=IV#S>;yl9Fn-H)aH~EAV@Te60m_U!yR-G4^`~*K~@=1Qm zH8P+GK-Fd;ew@$HsY{~`J^x08! ztR97~Cf1AR+^*on+ol}&_O_eY>zT7~>Dco5%PN8=?sziT`}ok{oyU&`JB&`Veq5)! zH(%)tZah&Hhy)536km~;|QFR zd59wR6|0hV!?kI5Ax^sBXex%Vq%X*tfgtgQg8XSW@ zT!@p7K%!+2-rdM&vquLh6~a^yWld}^Vm~!KN@=CB>9Ng1)V!85#vu{0EyA%a{}J0N z9NSuA1IR2?il(|{5Aht(VRO;N`JllTKv298>`|p^U7Fp3aO;F8dKgro%^e+6YBVRP zy%XUUKY>zRD0?)xoi^Jj2VQ2iQZ;2&Q&WVpt0|BKKc`yhn{unc0fAksw)v#II%?ZJ ztB%?gI;A_wPVh`8D6MfFbpZ2W6T}zR#S*Z%mqJ^x5)Hl*t0Mp*!YbA1j&>u?H+pnf z8j6O|;{gadHGGmHfG0sy0QS0>)6J6}nm{yTGSRA6QfWv7No^VbG#>_JGQ-4LP5`sL++{0%suK z`b0-`7|IS+j-ITem;z6dM-;K%_4BMdwAiCmj5XV{&`36t-G``GvXSK3c!+uVLhqFZ_c`6IylTgX5 z4bG{7{Dh?Vcp3)vb!@V6kVaq)Bpd#OLo`C-M>fPm#}$qrE%9R-;>VqjA1CqS8{#LN zkDnm%F%9t(&&N-c_(_3=gtGGqWs)$ZA-?>4e7VF=Ylxq5K7NM8S2V=WIv+nv;%7I+ z&pjVMHz_J=76v*dYI;FTpyr&FtQW>%M)jwtQKpQ6EGoAEgXc|`kpyZ?RvBt(UM4M?w}tL)GG&TWF!t}bmr%GaPpexQKWXi|vQ9GCs?R7mT4>I(Q8 z?D93(oY#U8y$&qz^$_o^gDC3;V1*5c-H88g!r`|G?A~UaOhMSG+)T#;;6R_odH5nu z#8JL5Bfm~x zLumKSUzB!+A|RdrrXFh`LZ@%T2|9hJ)Au_4fLuR1@DD~nXQ+uNVYntf&X6JE60`AWnlZ!+r2Y zD&WIJ)f6W~dYgu|$zWF7(T8sD@WH+YJ6|!`-SEsfR`P%^pS{ku-F1#{I`wiKx|auk zbTkP@KiBlYk(Y0DsXPPUeA~{m-#k{f0C^Ui&olr1EA2ereZ0-1GGG5qC_)(n?|0w% z^Y0jf-!1lOiNO=?BZHOaA`h(k)8kYbZ#esc`ZP4j!3$eUROtCE?xIYKL!Mkt)0CWI z!aMbmX^_>VIjw#FeNc7*1_SoCt9z!h2lLkn0ixl zt8AayK6Jbt)b8Bay6ZRgH+&jn&F#P~I7@i8QDJN2Sd5et(=Oxd4*M6Zk8LYtBOLDw z`xmT`W7T(Ym_7MEKJ5F$enQw!4Esr8KUw??e2@~3XcYES!#-1E*tsz^wLZ$@gg$8~ z-JbWB*a;0}s|)L-IYJtW61N4&TcKDPJFpE!|4SYeGCFa8HS?j-`Mkwc!~R__?i;C~ z0b_Z7tb#(bxvi2Ig}$E0Qxhc48geyvjS<<=kTXsGa-kae>jHD+6l*WI66^NsIM#aM zYK{!h!v?jY3J=ZnVpwPC1g_snkODXftUrtkC3?O%3&dGyfJ|H@&|-0xNU%zvrQ$5p zX}O11h?4UXU<=3(=rWxyH-L+-5ND+Ux($ZFtLQ3mt~RI(<&&#wnZE_6c>A^=Abd@294PLUz4BolLu-?4^s=`arN}V=aN$X)bKY#{? z2Cip6yIWHmruNpR)tsh=tjH9hsZO_;IAtsoG-a+yMdIWT^qCMoY@=!u!d1j{7Uxz8 z_7kWlIY__tdZG?nq0NuvaK??5RGJyeaw_-MOvxx&FJB&qiy3+&)wnL}8m5jm! zvxUeS6S(7k9rmKYJiE|d6Byv)iptW8IpO|7~45uL5d=Xr)Two!Dd)%Fo~S|8ucLF>0m zc(nD|Eqrr~Syi!gWW~&iB^3*&S72CLTlk0NzF$*hW@{)T_iP7fCS9if0MgPayP_dI>V_+@biGRP;qzaF_E|mpCVT= z;xV1!T*5?$bM>O$6QC(YmcEF@w1=}a^q}{IfSueQr81^{AlyOdVgb4*Cy4I?(<}#w zhQqjlrEQCGYX`Mn12Xa9*cghC7b=h8;bMxy#Y7z?CpZSt(7EeKzo@7HauB|Z#J3m9 ziUN~267f#(Q={#&_-%v)$^HhC&GQsm1|L?d9(XVX^T9K1FT(aNh~kb5xrbQEXMz_mIZ6o*Pm(k(+HM8B#zVuIbChKrKF)%guxSlwi=kOUiblb%R@80jP%~nLnhQ$@VmhOi zS|kgF3*A*q#kxDy@K1vpf}l~2f;~e5w5pAvlgJHLRRmAUASBV!*b z8$)BUJTUU%87>D6I}R0#`r z(h8lX;^-|uL##t%&SCMV(rUUBnuc;g%7eWi zL`%dOA`XPmei|kYWYB&ZAz(?*;uiOUuzN1R-7k|m)%HL*UppGQXd(PP5541oZafz|l|ZX9TW zC>-@52E<3T%13?5N9D>#)yhZh%0~l~-!dFVTT~d$Q9fFv{LHYA#;Gvcr+hR~`MH5G zkQesbhW&P7AB|TTJB0m?VZT$@&ky^Z!+w{rUjXbT9qJkmcMJPPVZVFWkLjTR!C06E zxV;q7 zpt2@cCjp@&Xw)Oh*R{geQ4)?+V6;jK$fw~9NRLsG5~u2pwS%oHRRkOu z*&|oHjVz@v_FaYtvGI4K!w+GN?7;!C4}0|h_S-?41+~ECIA_;^@3;%{zdrb;LA~4; z*dM1{3AXY8d@KUNu+7Xr_uKC3L%Tyi?&2|yh-bjqJxgAGj#Bt}Yvf*@;eDAR_!Uax z*R11vc|jz<1+M6ASX#eD&GTP zp2%b8!QS7_*!$Z>0kxg6_qX$KgGVs7{dUH--!9D=!`Sg2rF=5DlqZNYQF1{66>vfW z1ry&g$uUKosghD|z(Cj5LHTf@XO>Uy@`y86XHcOYo^PPvq7RbfN@ou=-k=r?YIHj< z)_IA}RR(48QXg*iK<*DRbUR<-pr~HOl0&Zd=nPu4LxB5u81!fd20hw=ukDY@tSXsYp@GJbP!LRY_?&4C+tV}K}uVH$b$!|&f z-u5t5-I+XA>Uviycuz9CFRl1MoDU5?%^$gs|Jd;L1N^bO$M9)GUis<%GwxzL7K+4A zTr$z0T4#52>Xur5!>eGpsA9?J@+Gq>mJVCCbkVYFhZce;gHOy%Yj>+SQ6b${QMgqVs1uf3EWvQ2hO0No7x)u}qF76*EI1 zm>X+8{?cBwSOcLhkHP?*9oBu1fdsGm+>;wJAIE(b<1q}X8pqb52~Th~M?69GCXmp6 z6If`MRUQ+WU`=hJMa7!*1b-E#{p;uuQybwf+5}7y-G5`8)pJ87IzoaZ2g9b=xT(;dp{hTR)!SevS#+L~HRmPm=XuYeyy~Ws<2)*2;8k zic%)eG_|Q3rnFp~X)@;1O>Kr&p=(H)rOnp0Ii@yOo2P5@O>Kd;(9|lW(~GnStT3;s zE!LKpS`|8?E!CEp+Hz^b3Tf^orgo`znW0<1M|3ZddDp1HqG~Pmj#7KD`;HvX9;GOt*SG$3ClSy*t5Lu)r5<4Q>=^ zSoc=CQ>=y0@er$Qp4S_C?m27+>%L~r5!UH(&H`)u5YDuQuZT>xnpPTV)@v_uR%{D7wdy2QIS@M zJ$gH9(?j}LD|e0A*}8oWq+@$tgh5`S(mA@5!Tv!-s?w8j z3j`S&*&jm{g2I{{rlyb?D2-j3=>0N8UzaZWx@Lu<&@gcQt9ddk7BkkAAEM?p^>3kT zElNe(*OJLKJGNDbTI1rJMEtWPC=J6U1u|7pZIazbDXTPD#whzRp%0qP58a1d<&27`bfir6tAMaP2P90$I1ykZzO&|)3|ruAu5DMo#Z!2_Mb zCl2I_RXPbb)CXBg`0qmQ1n4AQBsVvMI7IXmkRI?z=q6sq_X0hH1<4B93rIsF9)rf> zRg|||?uoqy(1|O8iL^{|)uRg#+rOpL+xTCYi(xvwqyB&QFUnM6 zd;lVRc@NqOEKsZMrFvo~89>`SUH|&;T=?_~ ze7f@g@u}=Mq4e>%0=kE7fh}a~^9MVMaIZH_R!^@?Kx*~mLJbbX&(zqqi>m8C*-!1D z$7?ToybjnF9b@GVDOOx~_&U;TkZgYry(mi?wjQ zYN4&kAAG)ZgQ0wR9_`bxHa^8fYHGAi#1PgFuB!l&F~;S|GvFrvhG@ga3W3j&g0mMc zdga=LF^IsX{|ws^7gcc?+uj7-5(3-ciad1=t;bJ@8j73T%-hgV#!nM^_ zkoW)vSHrR#-wl!y1|fB@-1tO9iA0o0#6|TCk;ox-QR;@K7$$`KGfdKkAuTZ6-nmNm zpJw9#Y-Tl!BMLW^&1A^$(9dWaLO|_1OrY$-rhA9LQ9}pe0sits3y=!May#fUyJBzm z#oB{p9~N;Jnz{qXdM8AK_d*DGKlIcOAm@XK-397>KMvjl5Y5+OvmOD0JBrPB z3>)(}yXXYt_8RBWN$y5ZabN;02j}8a>kafQSJQKRA3YCKx)=Bq^tx}+OZ*w)zQHx> z@98!EiQd9}&bPH@^bRQ5_q6u(zBZgb&=%8&+A8`8NA<_rPWTVfr`kUHLOVfUYOm8b z+NVJ4K=mAr6Qv!*hF=1iJJGEO+8e-Y3L1Ln01p3(9B5xGB$wX+4g3(s|4zOOz5W(R z#fJutz}2>Uz`or;Q&m1MFQZGXHu<0j2u4$hbeQ*M(6GQU@Lrcjzu8lTV zac&KIp$t{DiS}oyqJ8L1p~`4z6EV#4u@}88gHHcN@@Rz+u}YjSSgHa40s09#TS(ls zTfy!~mrAs4;V$KIEd;T@g0ue>xqd_QT^PL+c$MHDg4RNgrObxmz_quA(fA!>VizZI zc5xCXXmlwx_4GI^N7Wzl|KE^praYQ-k4i0fJIo*0cN_ zq)8$H^Fh)zIh4Jn#2TZX*vkI8ThMEIiiga%{)Z2>_EH<%(eqf zRA7z-#FS1`bW0|tRqjQ{V~ks4lnXJgJu!@Z=?|Pme}P*08x#p{THr7ja>G88mW5|d znRDh zp)bHPAYL=D#qYsV84mM07gEtD80x!$TRf21&$JN$aA>9~B@Q%gKUGRJI?+>=62s{r zq@|Qt^w$113d_*`HWK!Qd~0|O`uHZstq3f_2;RURe4=4EZ^S?fK^)81V>pikLHPMv z3@UI2@XB`>+IxV54$>DK0muWA@+e0F@`Bo`!=M96;!^M-483#-_v|?a5FXmX#s65k z2M>EFOtOcJdUQz_qL8hkLux2u=uui#niHa{jz?E?kFI#w zSLjr(5MbC?SIe%y29(8lqJ;JHM9FHK-dH1S8>kGy2GQMCzu-w?pN8W#c^BrvQYX;Z^TSxLTH+I%4t`Ogr#VjQFe zm3Az61{u9`zoAJw6rMrr&^J6LaKk(pCPqbWy^T61K~H;gL6qN!Zja|+Zm3MMZ8|ZGeud-iMiO0$oTC>=2tV#oH;sG`(?d_ramoA5WSLf@FR$Varn? z4}&S}NMM=KRD$|xB##BE8BbSoDXjw;u!SdKpA3j6VGyefLFOb!wVmO z;cbp6Ua9$cojO^*q(CCb8!xOog!d~3gxlcQ!oNck`#rXBB=k970at*G0Co31=&&EK zUH3!g@c}o&c6}IcSfnDK55+wQlz0#J=#}&v?v1BmozKSh7Q(}g3mnZ9lV$J;y!nzY zU+{ClxXoY@2psYzkXCa*QMhX{$IggB`<*j@O>vo!-wrphgiist3XU1ck8>+-jR7Bz z8x(B-x%eu&nKRKe5V*97vjBNyqlIyn5G`_&+Re*G^MowvRY8$wKz?(MsDe3Hp32bF zcF&P;-Wl?$*d}4Lk%JK8+sglfb^eBhN8$IJKI1JEriu6wRh$I429-mF$%=SBNYkDo zSL7b7DO0EmEXzjgD#hv*(BcB&1OZH|g-TTp?LnR8R4wUj*zt-WLHbDR`1hRAW@~}p zk)P;KjA<3UgDMl;Nzn-&d61^MAPN5>XJHX1MOMbst(N%%M&@=a{|C41b4*jC(3X&(5E;#J7K07^!M*j+a1TeWZ-$2&VZb_MfovAESPDq zAMY_l#u)5w*eQj8448mC&RvmDURpQ;mO+;BBs>{Y1SlG200%g;JHS|25bWe0Ai&~r zyxxh!_BePLSrh{)(yWJo2oJTqWgYkt3+*lI-5)u5QqKl7j^!+rBt$52w7rh*JV5P) z&|pPq*lOQ=EQel*(|`zez>h@_vT&W`E^MIH*t<=|w(%m->UzMn}(+T%Drt{!+Zb7mRG(wRID8|)Th52TEMn`yEIZetLzm+ zm&R#vx=P)cq8(@^kd^tayQ!7uW{)+$NV7k^v`D*4lXp@>jf=HnR?yU*+M8Yl6%N*J zo2UwT`(EvNEfV>Dn z4{_2P9(h8xJXDkEsGW)a>GDWlVd2#*B%#0z=brviN@&gTZC zFJBrU5%3yknY_kXCa-ap(RWhs_eKD=B0os@N0_i0K+Z2o;AaEQFL(f_iMdecy5yX)}voJ{MIk~wbqgJKRoLpZKP_rR(*`KOK8Rc zt%wag5Q6(6mEC$42FtfM3q5~Ody`Xft&1sA)EBvPDsz`ESTth})Ye__9w!t5JzHt1 z0eM5DE68HFnJ(t(Rq;M8EirtdZ~#6aG@E8(;|QeJ$Z;pkMd9x z7v!(DUjEuhiiM4)*fZXS=RJA2QW{!YLs}OYw_mOE2t4qK*FDKpx{rz(X_X5L@rX)S z984ykmG?a1;K43=&l3*r zn45U43vZgv=LI0=Cqjrh8A}5li>Q?T-y+2<;>A|P`+91Er+Ies=52G^;?Yvv<cVmqNT^mv!76fpp9#B3stUdinV2z;0uF2*4_b8%|cs_ zXq#Q36(_VeI8cTSYoE)QFW}E<2+0k->G+#50S_0jOkX%bEC;6pjn1orMOio%^ZDP@ z%7#?T@qbg7Hl!}2!1DhluV_fNAL@`6iB;otP#viFGP+!v6|NnN1Y)Hl8`ETkf zJ2h6;60B&@9eF%M&IkLkinV|>2=z6{t*-_gfg-~9AFWFs*X{|dN2G0yQw${43zDY( zkTDISQeeHQuw1Nw%A*oT-wIg5T>-?l79+R;-`HY=pt==8xD`S$+S2NAf`WhAEKaZ< z$D;~>0t)JMv(qU{2^kyiPu>W4d`~nDXA%@~BodQ=ubH`KE$^}cxQjkki>I{oz=d*g_wD~rxpuAK)xb1)kNcgw zFjZe-|1EX@(X-CAhPDg@m!bWDM_xH6CG^d0maO)RTOB2)iM|h zWh9o$SS*yuP;AV=BAJIpvJAr*z^B(h2D=V3i94?tTniG`t&pg0Lv?q6(7F>M%)23U zx(C9gonXc91>If)9^^h=f=fKhK)tVkK;tsdL90N~t)qK5h`B?R*A`we$H< zxScNorP}!*8-w6et}fvpAXzaGeZ*=GwEYe&w6VCTvlIK;fnjWi;aZNNmDN0*Oyew2 zJ=N%RUqsU1)bk7lxtC7&*CU4$iyXG%cB-s$#BLX6mNHri>KCq>KAZSEa?y^{!kuwK2(riil5-)7ND_xaw*qQ^ z7}lxC{EIRrfCn(~Fl{Obcb8)qHp58k^HW-0Kr%TX@OSLOvT9g1_9G>aW0yYx;`&L* zIiLapIobwV%3SCt+rvtBFg*wH@Uy@aFJSe&h)H-^wR0reG8lh*F=0AXrx{S2L-PZ{ zWK-~Z%dtU=AlW|v$c_2}vm0gyYEpYYCqe9VFBYMOstO_DsmA2Ul%&bSv28Gtal$^y z_+#KP2M>tUT1P|9eS%c+rw@ zg==NVq@O?$|NeN`zd!!uqK^X?zQ!pV{#w{hS)Rf;V%<#qcL85qRDkDv?Ksr`FSWP& z_s8E{^s$Qq_TCg;=jrgw$)PNx>9=QW5|aQ>?M~K6UADGSn|+5|BnUr(=lV&NY9A5j zH$0BoQ^0Ku$wI@4B{A0_#vbu!1Q|Swg>0{xi-$bz-|hbOAMLiAZI|*qK7Ro=IXvbFb`=xA%oHPI1P_I&n) zUU**1v@eGJ{ff5FX3_S%u03OOVOPAPIUULn)j4nStt~NHEj8<^B0L*M<<6K ze_v~BfA_x+wT^aKIiJB&O7UznzR>a%2e#!4t)+eK>G*Hj6Im+m+H}XatcqW_=(_7R z#6T$*V~yzKNVlRbuhaTseNNd$yXZPm!GRHa9mOrLAYHgNv-*iV;yVF0+cG#D=g8R^>m;Qp` z{h;{{n@=4#-|@X&!GKD~2X_88%N%#xaWAfLthJfl(tu;4of=y0SXHR%Dm?BuW5*Rd z=?F!uxL;m(9L-SBzP}treH8RlcW2)SfvkcOXMu`ZR^m+2)Frb0ADrpYEE+$Jfxqq+ zKkrJnUi#LR5_)&2v%Otp^c3eQyT9+va=z+S1NhGAx)3;EaKYB22VEJ~i%Xo|(ASHd zr|pc-U*@zgEruqoa_+IOvPA}+iFRu1Tb(oP%WoTRbG~i&Z{9u5=WM8Om-DJ5)yQK{ zIQ!fE^E~4mW{=l|*POp5tJD$SJD1xR=brh?`Kdi|`|6!X?R=Gn>zJDKP}>++rCW8? zbH^LJ5La^KuZMKCnN_SgQ$pV+x~?3g%3Ltbb&EI^&obgHh$wMyPI&|$H zScQMc@3i=>Mc+GPte0+dMuplx@ABBi7ro+oIy?k#x!$$6$>*QDI@ldg{l!(-NL5}M z>0WPl{Hr8)QnH$(wlz}+y@9RsMvOg2U)~uVWt9XmQG?sN-;7ate*XKhEBQ+3|T zDRF13CQT}FZ?T*7+gSH|_ISKD!M(M$q^g}zx!Uc$=!b6*9lGZlcbq+lM^?MT+u_!A z?ul(wk$)a=e`gQkS4Z6I>>`&RbMH%)RFML;Q_`KXcikE*nNIe(rAHnB3HE@o<#R6{ z*ZRU88M^5`_c6O&BffCAEl^#YQMLTOc^HOyE^AY|LuK?>3)6MedgYV|!vI7U?shRe6t2|LogE82UvqHd0)4Uv#>4EEfai8>%n1 zu~uM;-aKCAE*n)F-36Peizht5_eCdKr?1srq0?3R5RY2B!%I6a_cz9wgui_2r6GDF z>-Jhb$=Z8ArT`^-LV+vvSCY&kob+*^#`mNpI73rz(f4rRA<$1xgR63Y^CZwjX>j+0 zGCBYv;Sl8IAqX4maHru2M2!#A7+45Sg6wcQsFJy$1{UK`zZTTjdX!;-@_Gmo@FziO zJ&m*G8JH(HVU}Rfn~=D_1tIl25NW>0eIZXDLLc%N$dqOTAl+OEG3pjbnQjBuupPSn zd1%5eD2|>1eI>MZG(Nu;wDx2`S*Y?(Krtw)0#x^89B1ecSkp>;B~UdQgY^hVC~=%U zfbIc=OLTlC3^8s5VK4Z~-Nge)#w}R1_CY{C zSj2Tlqb7q~x|Z>NJqnDV_1p|Sz908QmZI)L^0W#~*s6E8m*}nA^gkojinH$1ciR}K z|89Lv7YPZFCzOk3%+Gd`| zZPYuYljn$yT#X{n2s^H9m?y`^?;ECgO6?8t^&HO!c9Wl7;8{|n>L`BDGs*7m_FbO; z*>!B)<9RtsrOrR@`K+meMt|t}!baQO|L|nnUo803bDdA6{^9h#Z@2UG;{KN!ZSlT!Nily2S8y?JK`%)JB|4ak307kZc2FIV6!el;?vWznxC) zb?V@ujs{j)C!O+j>a0^2tE|MRvNo=P!SSjghQ}IyINEESZWZ15qTr$-#t7@xQ;`MM zs;BXo^9Q4iW>)D?V*t0eE+1p$=M~7E?#Dlv4&O#|o zz<=3g-AGR1u1NjRh*nFkZOY8o0WupQ*qY(SK~4SVH57&Wqu$b313$^&!;2xp5;O+> z@&K1fZMKo*E!f3d5PvIDwoy9JgFMeKEf8uv9XmS>u6&ylZc8%)I+Q!@sbGzp`%qd2 zQsvTqOZak!xivUM5dcBz2_OIdq1@;m9GX@6uuk|TAz35&0oOw#6L*;jx#!eieQk=>WUP^rHJxTK#ht&lv1m!<^opvgiW#^nKOMiF1WtVx z)Tt(TmAUpReQ2!F*3pdSg|JEoX!Zh4!5E6ZOcp5GpcbYqAz7$0q4olmR~J}K-~aal zZGms>1-e~Lbi)E|1@kXipjlWrc3Iz%F4}L{Mth4{%*-`hwZ)lvm^@CLi{8?qC#gH4 z9k6#a@S?s^KB+jKe2cv|SJ%H*M-k3P@Z&L#qZ9?kKe}lx#l*_n(6tl~qX>UZ{XTnT zCzi%0VPz+WSN2#8Yy#GzG_xfIyzq8lQOdct6XS3%5^69nyO8Yx+);iIr{iwb50M9G zP?6Zz>YWg)WZcB70gn2jz?h1H6;actXhhG|_n(TEC6$IFxQDE~-0g*R>_ zAn)?a+a0GQ@Vpn3|AIg-iUW;SB)u%oE8@JWbZn7yO7;=7Ya_K6;1V73V!& zp6CC7KGa36mPj8-^2Y*wVn90h8FW^7oL@lb)jpM1^s8;lU5vQ7?{?x}iC2#nC=_ z-u@!|ki&5v^~$OwB%tyOIyH2F8|j>?9`3Z#@;&9&W%DC1wahZ(YCN`*zK91}#VtIp z(EDY^Vpr(i8OAnl{hH2AboCBC#t_4YNAsapv^8F`@&qU>T zUW2oAh6X8{bJWB7|5AIYAEblnfqFJ0f0g{oUHF-OQO1Rz*>5UpHN3sA-rAQRw}S`} zYNhUyy9a*80B=fKoo5?k-Nh#N8u`ejO@e#>gVsI!~yCz@Srl|p*&1}+rWdLzr(FbYGrL&Z1}DHbBuV$D%>WL1J>IP zdrfK?DZva?%P4EuT*Du+ibvy@@#re~WxT5d>#g#y;&Iad@z8;W)n@~EqBUrqksCcp zGEU|)-Tr;N9BcPe_<@L>^NbV+bZP3nkI)bEjKMBmdJ$F^3c@895&whgzxvA2(yCr! zbhMiL@Vf%PE-^j`jKrRn-?)%>Aq4$lV&RShEJ$*^io+ZOE65}J@(Wv%Cd#A9z!zmz zg7d4O=9)GTSRMK;;3NBUQEW}d2gov0vdlslOC+4yP(T353nUqY{RCBlykGy%5|Fw? ziV?LJme#*YK*BO9V0l9USa{(qqI8>#Kcrp)4~y}9H!cfzqpjT!raO;aG`& z*)M8qkO9k3VCloXddo6nK<{fX1oi{&c|emLFo5|Ol5RMmdf-gz4Sd`W=ST@O2@M2L zXQc@fZIL|Mj&iIUmKkZCr6Bvp$|xX|(HDIX1ue)rq&gKVgAZ^mqZo_~C=qRT=;LL^ z9UPc(lscEfWF|yi3ZXhGD9yxGCwGVn3-zPa6(Kx42)?e+bCink@L!0!7kU-w5m4P9 z=pp8B$|iZPR6^PeU8`AD5JBw&Cz!o4UoGW{a{z;k{b#AHA--&#nS*e z>?mVDF%G+Ca@ghIu**$wLlYG{*qVBY(Kt|o<4)bE8iKpAyNGdp_FMh|gpfS3PcU8R z2)9%%Ed$dPi;?$ZLFGel+7&CJAJ)_`tg4A%M5lshT!8;pV!5nU9O4q3j4N;wUJhpU z3Wz^f(rM_oe}q8QjSc99$zUKGCWA%b<_6JP9)Vvc!>e+9IrQmk=tfuw-2_&26RdtV z^I_beev0Hy9nAm&^gPR{<%=r_3zv(OYzbm==?(U`cMo55=kc3Vs382zL5CkbgK$;Lp=t>I_lp-Ym%7^q`GcCnG07Ib-<&BZN&B_73A%Z=TL-et~;xkW(z9H?ODOM)C|1Vi*185m|~rUSp8A8h94&xPJA&a zx){wOH&lpr6sL?{0WFSp26UX55NFenj-#TJ0;HNU7Yx?**wtCl(FCn}fOM3@d+;L- zep-tmi*=-_I4V0FqM!JYQAYfHq`t~U({1g=)cIVo?N_m!du)O2s#t}5eWUG)fiGA6 z)HCDEYO|t{dxTvnwuP{>n{AP-`$x6_HgiALtkPTKSnjPYwwJ|pf9XzJlvqctIAi-H zl+VfMeQ*0jK=W?kS|dI?uQk$g?}|fFt~i9)dDdh%u|k*4#Jb)n-)_}QVgiN(P-PiODE@JoWC{F1=de-AtR2p3)StPTCjNef-cY$B1=L?Wq4Ib){# zqCO;9)I_&2o0OCE_?Z3_(kOjhpa(9FIxn@pG}3swC~sjlD_1NekbX!4sYW+OeXD$D zA(2!Qs$LLVO-0I27UgFm{R?S-LEY;|<+_FLjQUWyNtnOlx+7BRLiDvs*XwuX4?9j* z{AI^(<86A}!GRLkPasiLBT>{u3SOG>z=BJ=6}*}k zA@3xOHiwcIv{zO7a*+HAnY1a_@`B8Xi12{YIc)y7Cv7j2E{JGDux?K`Ft;adul5j1 z@d%?wI6WeOqKl-ES4r&)grhB7?xYz3VvR#)bPeLk_Cqa;F2SaQZY;8`OR|vKSADt# zz)x3?9&{VC1(z`CQpqY@toxFzcy_~L|3#O=)@PXm*$peyx{7V~1;&sspcn>CR}>-F zYt10z^14PW-eq5;Ggt0#*;8~jx;FqBg3WFA;p3KYR+eTlSNi$egLTG#urtSc41x++ zRR<6*DaKt%IRW;wh8fDt%J@M044npvhu@t;npKl@N)&5r!P@c})oww=kR)*pl!{Ra z*5X^xz04z&k!D>cSNx(&oiXhliw6!ywBiD8;0#?WxBeHB&ZSk7UJV&J1uUbnEs*_l z#bReq2HX9I^ZS~i)uqfdL-`991Ur&eR@-iA?b>#W8;)j3WK%ch>Ob=s|S=;T&c{BMYQKPK+}+gYoJL{tbml> z3h7qparDKF{7mIQNT2Zq6Nh2KF%0TqibolX!MP~Bo#wMhe#{{BrZRNu6Wc0^u_rk6w{R> z{{dP+&_X~_i~b#UJVAw^Jc&-BQk>ODPbM(k^Mp$K@4(LxbSg$m)LWTyRCwSOv7h7Z z>CI-rQ{2Byx*lneT-#uAsyzm=ju>~`qHZi?)!Fz9D!~}aDDdAK%+Wls5OuqP3*D*( zz*0M;ITCg0l4bTk9SO1VDI_Bw zyEkJnaE-;NQ~*t?aTrv_L*SYK;bjueh)veTD^qlJm1(+^BGd;e;6jw#c@#P6?pYB$ z8oMluAa?A8UB4G$0{W zTy!)dv6YZ_SECNRj967tj}Sn*ZgnlZU=990NrvmpN|{+%{{We@n8})^^nh7Svr=y6 zH&v1lh)bSB>!5X!d`lBL1xg}DkjEBql)elnLARyC8h_)xN)tU2(Uc4Z9#i6JdbM9^ z-nX(yX%Uc#qwpw@R(L^$4-=?EG$YEQ;t{1ITE=sr`aBph4=rT@#HbfIb@V0fMHZO{tRDAT10GT4tvJnbmo^!MVGuoZoP<#jp$w+ZFl1gc$^ioxao>5z>!&5{2Y=fKm;m>wdk=xV3DQE>EGdTH(W8oGwqKBJW z!_823d4vp$bbu!m4m%PWbPTha+6c|Y(Qx=&zfK7bwu6l@IFF{#IUM)BK@E`(nB$)0 z`qW~&(Ng|w#F)d?Xk-iIyhTEx+|x3|4=Q2-J-n$UX;m;*+#*gjWChmaRzV+YH7dZ% z;K>>sYgmg$fWsV^;ta>+rV!JbX+@aN%*Cu`5z4z1JYNMK(~0a2;Mi8^t9=BHxvO&) zx=1PkGf4HtZs=%K=Uym*DC_ehEM9*(T%FkkRb+4yBivTN-eo>+==@PO;;{&uu%t%m;H}EM8>hONdciyJ+ zc{E?aCD=8gh))=WIe z?E)Dvk)4}g3Mr>TH}x?(ZTFtCm;UTcCI))1QyvfKW9FSP{hb1{@!TH`2zKLv=TClE zdjKx^;a+LBzOFs2s4tHAQJdmR5r?X!sNcV-_4iQo5aV7TM#)d57|DZTq4!>80Jo)5 z8%h3G#s=|>p% ziHWM3L)-2sY76$!!*Jfe1tyvgpoMor3Z1VXux9Z98|Zo* zsz|{3{>IoyZ>fBu>w(Sm3DESTYD%VA=0f(bLR~V0+??z?EaNsGJA@cciY$49}{{x zH^b}!BT&X8j5V=Wy<&e_#1g#8{)z~+i9G%Mq5sG#HNj|t>G z(T1J6N%S?DzF@8~R(YEKgx&C1Whyhzi12f^ zhIl?tpL6Lk&rAlyW0e=oWH~%uSpth4up3TEgjy~s`{T}VrlnaE*bP55MaP&H3N!RM zCKX4~iZKTm3X5_>hnba?Y{oy9+AP$nZei!F>IbmaS7uXlb&iHgBeEQenN&j@J-laE zqb&_-^BsGHY}{R2RHueY7Fn82Rxuo{;fB3c3`Xl!3^(gk3`gZE2Az#$(GFjm$?r9K zY@t85(t}Q)&^S)^*P63;Rkc<`L#4uF|L;w4Ga0JsTUgj)J+jpdn51jS*SA>aeM@6Q zLnV(DI@IQ-cFIFKr31@2qIF<@IMiU>+w5k5C78uI)e*V_WXUb8vdpOt(6Q21Y9rQK zQx94i!jf9Qew{k8yw++e>ly6|W1alfwy8-dTOGE)4XF6Y9d7`%FG{< zt1(+U&lXvy2|W2al)j%ryND`4w6@(0Z3vwWDJ^j1+x}`yh8KAtM-~dR4v9?XLs~(T zfwX^NmYWCb7@)?q_68gD{{+j%vN8n&Gbk7$cA_qk#5Ik*8la9U3c;o;PML@G4G4$$ z5+OHTM?<^}MQ$kqe*dWcNi2g7#l;lEloqpF#P_Wq4$IxODxi7+UL|0I zIs%KKJmu4CuxcV$HA&I*la(<26eV8&w34i!sx;D1Q(9pf_ppA3lA|wD`simV(Stcq9cD4{ENqQhHj8Hq82`ixy54`?HYl3 zeejnFwImx`RF9%IJ`67R1=Ir3tpTP%kAbayAT5&NY%*+S$Ie1$MJ>V{NE8j_Wu7b= zDg}$8!vS%W0!|lEe?LfrrUqtDycVIH#0|iXS%Ewt!AQ!shzjR{k@49sGU#b=0=HwQN}(gm{I0UPtZZw-FI+ zVs-1Pt$;SHuA0XKSKew=S$V21`Y6Boic!CSm1L;B9hhtC7h~ID30h?d`z=Gw$NdF) z4b`E3OmXQ~u;UHYJRHqSZUkcU*@#B!NItIpvbN>y2n@{R+KX{5?x+^W4&j_|WqM=v zlFlz%G3nc~pr&e5J_c_|-?!ux)SylUu8FEo_Qm@O2v`i&0iQFcv1z zZfyToG8V_sJc!;x^^uSO!iH5>wXcU}8qu?YO1t-xc zIEh9<9OE-9vuv0{BTxb#3awaGnPb5ys3e7n+cf5p*L;hzfZi`yl!f$OWKkBI#RVE; znyK4pKnrATnya5$RCjM5(?T7q8pjNtI1Gz)wDiZW3^7NusupT~WxGtZvCiLtQ=U(b z#&w##1`o*x)>d{UQ+;;%(-=?I^;2Cex|Mp9k0bt_aRvr$iEfMVjwSurtv9h6TIEoo z9-OMy8<|16Y0yU@6YTY9NX4VRk^~((`ob*{WWF7LrqH7fJu>(JF3x>IG7}eXnCarr zmvIslGbi}0rLT4LRYvz?tcN84I>>6kwF{+HT|;Nk+3_*ZxSG;lomrHCT0lL10A&|n z0hC$(rkgV8Z!m*AMURimIp~)wr2+b) ze9%D~)DW4AtH=e-vYYcJh^LljTZkN~6^U)mi;9Me z=De_wVSG_>Q9s|D7Z@?UIaO$kPV_~EX5wE|Y-avN1y_VAIlz=>D{>2EP2`+PZWaO( zk%;|DFsADvImyZOQy`#(Cf85qZ$8H~kYFHYJbGMUqz}WW8;(&of+w5=58A|YCp-e8 z6U|@9kK`iE^yuUzltPj6hu}>jnuYt2;kQTNqsK_BhltWiBuf_$IOS+*eOU2N!3x4U zB`VxVBEe22JRl+!-g?}qxmSt8nJD~W1dh2HPIN$w4^9ywS%GA$h7=nR=YvEz2H=>g z;owe8UmPlA)HXbmz)D3QquBMasD+72nm$SCs83OP>Qj|`eIsRxzOhoG&*UsBqIEbr zC+z0YQV0ctM@uor(l5yQIsOCUXLA1o` zN4RXXM95`2C4o!G&?cZEUr5M)XalHd2;D=3X6s(Fgbbye{Ws)C|6^1ZZ&d#+u($)J z5i6W(4yp6MVtNen7nx^X*Gc`~$h~DA)~7iCH*z0IIenYo|3-dXB9Gf<4nZ;gckYnF zlDi=E_=4^X#9sY&e29Yh|GA@}CnB98YL%~`A5!rSN{*~9D2EhTar3RWo2gEWR>G1CAmfSN1GiJ+i+YbBNPD992!h;J4{eeB zhAHXosmkLM8nlQ`j}?8&*Hh?OsI40yFD!xZXoK*(gx4%G9Q$gG(|?tFyQselHTsI~ zYPeVw_@IZH_b6W!NGn&Ti{nMFSEylP@!1~M&=-v|vZ~Hd3cZ<%(|S9?9YK|&td6N-N#c8lqp8^6k4tp?D$ebdUJN-n2I0mS z#rYc^Eq=aq?D-*v=;&x(Q{0_^xW8^b26PwVv$EgI9Br@;;@)o~ZTEO+ zf7HTY6pw+XHV;hq2}PkUkj_4Bm&Kzq4@7VW_KAWZIvN0pR6_7YBSR|YZL~T`w)4WU zA|_ONX>b-aB6;6PSWyD2KG33p7K1-S$*h7#XUAjBWSlZqhgS7BYFj*jdZiXi-|rX1 z+5GJ*j&-7}=5BKI6h}ZVZg%*K!zI7&bo3InuHzoZNpZ9znxSt&^*34-MVlB=)%6ME~o_A~(bmv}iG~;K=Di2$oyToym zDZ$Q>c3#XsoQ?YZ0L1wN0W7VTE1YS;INR!scb*cbV7_YP>@SkiD${AN#YuM_;EWNq zYV;`Qcj0_evTkqJZ7k+}X9{zk)BM?`P7Z73x;f6Dg$B%`Mb6F{JnZKOovp-CpYZpc zO~qNsx0lRmO@{&6_=y=s*)69(YjDo#VxM(#xGKv&bY_VKy}aVNg##jSY$a0Ywh&@v zz^Bf9pnhLQ)z%%unxnEbx6$b#1PEqdL33kwnX9AV&d)a2ha!WA z{9UaDp$93h&Ad6VEsb4Y@pQk?#PzOdieF8+Tktpr!^ibPQHHmR!oOVB%A!oyNMTax zr&cbU11952m2F+41Sf0va-|Dy^cmpV5zMJt$Ghr^bA}hY{6aezaIB(}BfPX^j3#nF zWwy&Knr86=SCFV5D;BxVi?4A@T_1|ChnKm+MFSta%C%S|_5GQa0b%}%f_sbksl75# zs7zdkIC<>36|Pi~^;vsdt3}0#dB@dB@Nm=-S1E_?IpGQv{aDC(*L49jUvQljnfd&( zD__*yi z1!oBh8fivRG?QCvFPr&6(89w%UB3XHUtotv;vlH@jb^XRdRY5Sbj?jVYVwqq)?Ir- zB&)EGW);2M^x@iQ+_{SLk3Wsknj6OBBXO*jWhlVMh_PB46%$)IR%=K+VW-DxEx3=Z zK+EAiH(t>q+2jJP4*#pHKpV-E)TQ>)0|U`_3}nHD+GBAvtKYt9YFcI-78~FOpqaXV z<;AU>EN_w)S9&?Jd1Bh&qy!d7V5hOb>wDfXo6T3W4 z6P^2waayE)TxS6-7!t!ekJoq&V}r&6GQXP};$W`!7lCPJAIj^r!%ue`YP z6oFoK&Yx|6S`u0}0fhRmAxL`ZsS{>)VzNwc{KS{KrlYBnYwf0jcX{#dwS?ZhH0=X3 z8#qy>b<9K%$}Z;+_Rd5tkf&zo2aSS?L4ceuk&rEdNXe(>l-w>leGnA0Xly6$dM95jw#>hA)$e6bVa1RfNiXhSd2#Q9gqp@4FO;aB>tHeT z`J!qc5NaIV4qH0wwqOd6^Rvl_^YOE8Xe?_oMKZGU6hP|Xk{uDw!K2|}UL(k=`=wQe zaF*UcXDYo>AfWM-*F|kir$5FhLN3FdSiH-NKT&k0hYevACW6-qj_Mlr^P1AyTwtTL7^`ZKaMD@A))x>s;*Hj+TbL$^^-!z|)se?r% zbYm)A0w@CU;f}5@W3#4fA%;&zdXR8)=s}&8ou94+aLV2*$mo(w@2|Z0@v+qcwVolX zo)-fP2cADPCNf-;ZF(z;E+XEy=(>m4Wr z!g!#Gb(tw!W51aInzjgFU3TeDohh|uD_fPBKOW0)v=j$f+50OmF59JBmaDJL{sy^P zR7rzam(3YyCFFctN}q!wj%c>euGg69OD%whC~AK4{vPz19u!vWm^JG;0wZ zuf@fh&Dx6Hc{Vu6TG!hyB4&dJvA8Fitv?SQz)%S{1Hq<||B5;A_rIWT$8yerzxlIe zo_{4^*SR846ZY^NnW}zs;2*va{^P#Hk)KBjr2iK3k6QwN&O4YfN#rHFqDxfJRg@|@ z-vOp{sT(=^vObn|K{p_p@pGVbVz~fDvhwF-41396w-WwK6EQ*hrQzI^3j4whya}M;`mcI6INK0b-*+VQ8ds^= z1IFLN{`fqt8ISjcc_8uKpPWPpJ2X#Akn?Tu%lu`4m^?!$Ydv3t^lIp0BRVFa7?0;D+_Ge}Z19EwKZI~XDVenEEd&)BZUtwum{v<%?> zl^6f+#w{!`*x7=7WO?91nUXOJLG0T&Nel@7%>IEK!gMPG?&6pa9reL-nDd&#cUe{O&}Ip1L+XB+2c zWA@Vli92>q*@Wv@Mk3eBCqavE8kjE2*qTKjlLb;-f&w{z57p*6uIxToBE3(Mcfft= zUGfELepOeaiKQ%+2rZX_VQC60ehJ%JWVwgUTO;#VlG`C~2C6?f-)gm86Zm;g8O<#H z3i3yFnltec%h>3-n7)wn4fIU7Cy;~Xz9{j%mVjyw2Hg_~ALfL{8!c=r@Oc4Oy@>RV zN)ez6W~{~HN+qfD0ogD1#$26T8y|Mv&Jg%<^NiSs13o9Uz7(XkJ|sYwN@b6Emwb5F{@Z6^O0aao2WxgC0E~vO8?1(8pldn;et5pa+!~q<)E@*ngGR} zG={P6Cs4%wR>}6bWkdgot06Iw^X1E5&oO_d)n&PpjREWu=&))CvtqcNLh^s}(XE@RxMp5{1#a^4W2n@#+z?8rn(`76JFHXH9@Y4hRqSz9DKNI_DhGc7tm54v5mT(ZzbL zl4bGKDnuO`CqPxt`$co%le4waHP^vS=;_Iko{Reju_r;`Uw+0uJh9ga=VKNbe6Ju{AG0}SoU4DNw2v)y!U7eXZ_+l* zC;XN?Rk7&->HQ#yKY1^g|`Hu%t^yTKIO3x7hwX zB=BeTg5j-8u_hO5R3=lkq2&d``(cVg&Ue6h{zSDv%Yo11-&%(F*MB2GFtioPqxM?Y zswv>U^M^nsQ(FwCwyN>gYi_G%)a(Bdf!wyY0`h2{;?57f{XKusB;dq7KV|H&iD?st zrxiZ+R z+!tX7?iDSZEqX-@;#uz!8Pz|puA-15^DpjSdGR=vQ29z47isir6V~HZE&N|AB3h|) z*vAM*4kNVZS6-tDU8i2mz7{;IV!>P`2uvNTubFu z;{o{w7J33$SnCZ^eykRKjrrTLg(f!mdsC>-1eWGZpH;rp@+iWQ^G*IgG6>7Nf$CIe z6XKu%UK41vVe0*r7b}Z-9MKFG(QK^#M%iO!ZbVOTeFcZrWwYGgOUOI^BatkRZ8RYV zPZ^t=0o7nq53V6=fApygFdzx1=~6ejd&Ny4cJUHmo3(JCJW`FmUibB~5_AXTe5U|` zmqie^u7Nq0o!%nlte|^6W=2BjBiF#2Mbv@6ugd^2o3&b8X7`$AtGOOB=mE!V#Y?Sh zGfFMWpXF`V>Tp|Z?8nWrnC}y)U1Bv5%(U6r$n&z5_?T+*NzExNS!~uKJeJ!;4>)Ic zr?xwhRdOjl_)WVA{JXDVqJqL?v0D&z!+yfIYO^_%jR6mMf~OPc>wyAPxE=Q4h&>#1 zkwBvc3sA`#T)l8P(gC?|t8A-3+`9Hf9K=0xnLY_vIkaY=Ra+$&c5DSv|FPBJS|L_r zNVw*Fu0{uYQ|=#iOP8KDvn#3Az<-sy*A!Y!(bM&enfbqth3X~S^3$UiEnJt4k_wxA@6$r(mQvkC6a}olR@kifISx} zVP{9<3~7f7nc;y18y;I7wyMHit_1sHfP`JH(9(EzhV4G~$t#!-lJjLo=0J&C^13A+ zHr*wiXWjsvMuR2n=2lA-JG2vtpagP?i%;C^!Z3=E^OelZh?0m zV{+*}9KBH@13bM`OXkEM+qkLj55OUZj^6XbQrv6qMOnJX8^FcbE}8djyFhHh0SUXfOXDW;*aPxzd0Kj>zp2&c zX}#8|sP}8AW8{3Nq4}3MZaX&W4Ve_%v2(-DAQ|Ky@kz?W>m0WQa}BjxSf_n5DVe(w z=cYe6tQkAo8?X^u+{q+Z_+1W5VSnzH-u6B4j%a2Tl`U_s)yB3xhj2N2WKDg75O!r& zM_92(2HsAvtHUJht36s0&*RXCB0}`w9l2zmbeE2jxDAe316b!uNoPC{LW&rGo=MJ=zIlAY76Uu@dGD;9!1lNn#Oif!N9`5(XnxMwa`Q7Q=~o&HdFZ z+zIz&0Bw}b$=;nTWB1yAs~MoS!6uT60Em6B7RY1pTFR=~6C~PY0Jq&N6C1QwGI{J? zq`53vB9!fw64Pn&{w_^;FW;y2=Y7Y(eenIfxkN76r*V6!>}~Qs+>3jsv1=P`Fl4x2 z(vRH_*oMbBtRXAduf=n5>aQ1?45)$@06E{vSf0l!_G{gFmR@l_v21QA775^d+wPGW zoMHo(^R|?tlE!`W2##aWk&GIpwR#zw^|scSQ@r-am*?jIgIt_XnNC<^V~0(+0iIiV zxCyd6fY%U2O|CZCP(1)Q3o-N!8S4IbA+vGbh|V0{9oj*wLB~DntcEVFK4>yQ^ehdXjwe zI}2a!uv~%h9#^V4(R;VMKphQKPPX_k2u$upzKvPg5oG+*VOg8T%sKXDAjTkaSw7i| z>__Q2z0T6K#@$Vt=d?HK{d0f#gYv^C!u^I&~{b} zMsPIX~fuZ^(3xPg?SSq8}&c+ti9rSHr)bsD`iu@v4RGzbMm4 zD)QSA3prmVod2X|$ZPK8`KZGCWbE?gYJs30pTd*pRfMlO$M64*2S1p-?B1Ju<0u$A z_0MXc`$x54PU@M1zf61=EsmV8fI04t2j9ll=0a)wsrO{lnE4*)ExIew%$q2t9 z$f*eeKj3}2ztrG;_!hrPzQHW-eU00=Wz)#Fpn`mZNWo2GZ@(|=xmO3Sra1rmE)RYX z3q3BQO*sxyo8J;YLAH07M^?!2La3TD=(h+nJ18$<)4tLC_aJC=EAosTe`p%oKizK;n?LLMg&4SA(!GIMFNoZ zJC*5nIf7WuNf@-fcR~}UxT8*j+VJ1KFfsS~`az#=(_AOPijqh5uKpW z`>hT^Ic5-8LVFV&7V!aK1Cu2zyVw!QMtmUiFr8pyG9>Km^NwIXDdWS1SKY7XsQpg| z834+EK|CTJU}mS1m3^_iMb38-_huI!AeePqWc6pGPs!M4okHv{=5kmHJ8??N+E>W? zhaS><$D0ld``9f4-%3cVXTe$uxeOn^-tEr=H00aSJUt`)?~k62o`Rh3l3UL~95;*= z?r}u3JEtY5tY;8${BRBnX1RKkmHD|j)sJAOW^!1NP_%m-E4-Y;+X(i3k$^4#)Dg%w zuMi}cp9SQ_1u|56CX@kMo|U0;3HHHG2m8?K%w%IwTs+l9&F}W83%yu!zO$fb4|3c% zZ=!4;g2c7s4z~1`Gm1e+&%`=^C^OTSU_X8-VKGgdK`f>*5W4S^2yYWYhi@c8`T?Dh z-T6?a&GivrI5aB=b6D0OXv$R$haIXsbgDe58w+>sTaOiXa=x9)_)Nc&}(Gy=TpJ`mtLxr3`X$#KqdbSYV0@&Uabq+YvIr+9OWQ zJC*y9h}9k^VMUjms&^LURW7VqEuNSv18`MC&%AKU#~^mCNWy;jSn}u|c`sbez3cOl zhBM`0J5#_D=t9W(u6ZAPnd8=GWA8W}-n8!h1at~slQ7anTvi5+Fe?^EIKlOI*A00N zRhXP_mH%^>3>0g3IlT?{)Zd?Ny#ouhyDvIL&ywB5<;VJbDg);eZ24E!VV8e%+1SA*pg{GEr{Aj{SyLW- z;u{&1lqDIIB~2{s6hhG=+_H(Sk1aq)Le94t{PC?jRF+F+xff7JD8P~6UkV#x*@PS< zanG;3_?@3*fG^r2nz9SB9`3k+)TiB(upQ4}-9EP$l5oR~a32WzAvjq61;(-T&$L)R zlAc&%KJzUkMRLB}4T=<~c`;BFp&pCld-XVL_TX75gdf6OW^A!`##R_Fkq4h4)`g7- zl*si;IF+AU-J3iGeIB`oJb9z>es?XHMn#=b$n@Q-Efbx+2(;FJuIn zUjUTbMu4hHU4b0LWBIy4-OrQ3aB`R_dVbiTZcq4qIPJ(ULEv5o@~F)QK$VC4jw9dx zeaRQ+sCT*Stf)d(Bu;xF3;S&#`ZRL2Jd`O1FAU;=N}W|!b|2(8`u5j$9)vnI9hR%H zKv{3Jh~vRKu4)|;PeZ{)q+wD%hcAEE6#z-tC4@i@K0#pn1TWb6m5lApH)ma3kC@2$ zE{Vq%iP+AbhAQ+}H~yjyJqJ9C&WN1vY%Tyce=ljU1wd8$j2r*zQ#U>e15?TQt_6KN zpYS{I^mVy}^z~Xy9*JzxC7HJ52M5Xn0&$cH&NpqAeS{juvV%~IuDS7Zg07cFBOl~^ zHKazJ68KQ9jqz?>j=qdoFQ4{+I`gz#Bj5BdJ-%EQR}{_3(_v1|LTF)Vo!W684xgGcJ~K} zi(Gr3niKiA2S1iQ(O0vx)9yeQ(yy$ogz!bqcSU>}RG6-yjv^5;-aW4!@k`GIBLZ^1 eB{bJ1@rR>W%f8Vp&ekwR*L$L({1$>fK>0sIx+D+) diff --git a/settings/repository/net.sf/picard-1.48.889.xml b/settings/repository/net.sf/picard-1.48.889.xml new file mode 100644 index 000000000..877687930 --- /dev/null +++ b/settings/repository/net.sf/picard-1.48.889.xml @@ -0,0 +1,3 @@ + + + diff --git a/settings/repository/net.sf/picard-1.47.869.xml b/settings/repository/net.sf/picard-1.48.889.xml~ similarity index 100% rename from settings/repository/net.sf/picard-1.47.869.xml rename to settings/repository/net.sf/picard-1.48.889.xml~ diff --git a/settings/repository/net.sf/sam-1.47.869.xml b/settings/repository/net.sf/sam-1.47.869.xml deleted file mode 100644 index 1b76fe2f9..000000000 --- a/settings/repository/net.sf/sam-1.47.869.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/sam-1.47.869.jar b/settings/repository/net.sf/sam-1.48.889.jar similarity index 91% rename from settings/repository/net.sf/sam-1.47.869.jar rename to settings/repository/net.sf/sam-1.48.889.jar index 933b9cfd6f7ee1a55835939e49239a384d38dd98..33ae4aa7d2e0652c767092e89fef9e93c92887f2 100644 GIT binary patch delta 19247 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 F{{SlKLgWAd diff --git a/settings/repository/net.sf/sam-1.48.889.xml b/settings/repository/net.sf/sam-1.48.889.xml new file mode 100644 index 000000000..8046a0c02 --- /dev/null +++ b/settings/repository/net.sf/sam-1.48.889.xml @@ -0,0 +1,3 @@ + + + From 00b650a35dad72cc79ce962ba6e1f6f01299cf3f Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Sun, 17 Jul 2011 20:52:46 -0400 Subject: [PATCH 155/214] Get rid of accidental commit of emacs backup '~' file. --- settings/repository/net.sf/picard-1.48.889.xml~ | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 settings/repository/net.sf/picard-1.48.889.xml~ diff --git a/settings/repository/net.sf/picard-1.48.889.xml~ b/settings/repository/net.sf/picard-1.48.889.xml~ deleted file mode 100644 index 86d07d4fa..000000000 --- a/settings/repository/net.sf/picard-1.48.889.xml~ +++ /dev/null @@ -1,3 +0,0 @@ - - - From 558e197989ea669de27e2e5e1ba80f09e01f7e3e Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 21:25:08 -0400 Subject: [PATCH 156/214] Integration test for PhaseByTransmission --- .../PhaseByTransmissionIntegrationTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java new file mode 100644 index 000000000..c8b54e36e --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java @@ -0,0 +1,44 @@ +package org.broadinstitute.sting.gatk.walkers.phasing; + +import org.broadinstitute.sting.WalkerTest; +import org.testng.annotations.Test; + +import java.util.Arrays; + +public class PhaseByTransmissionIntegrationTest extends WalkerTest { + private static String phaseByTransmissionTestDataRoot = validationDataLocation + "/PhaseByTransmission"; + private static String fundamentalTestVCF = phaseByTransmissionTestDataRoot + "/" + "FundamentalsTest.unfiltered.vcf"; + + @Test + public void testBasicFunctionalityWithoutFilters() { + WalkerTestSpec spec = new WalkerTestSpec( + buildCommandLine( + "-T PhaseByTransmission", + "-R " + b37KGReference, + "-B:variant,VCF " + fundamentalTestVCF, + "-f NA12892+NA12891=NA12878", + "-nofilters", + "-o %s" + ), + 1, + Arrays.asList("") + ); + executeTest("testBasicFunctionalityWithoutFilters", spec); + } + + @Test + public void testBasicFunctionalityWithFilters() { + WalkerTestSpec spec = new WalkerTestSpec( + buildCommandLine( + "-T PhaseByTransmission", + "-R " + b37KGReference, + "-B:variant,VCF " + fundamentalTestVCF, + "-f NA12892+NA12891=NA12878", + "-o %s" + ), + 1, + Arrays.asList("") + ); + executeTest("testBasicFunctionalityWithFilters", spec); + } +} From afb506e12833b9a82809d58baa02ab30eafd0177 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 21:55:33 -0400 Subject: [PATCH 157/214] Added MD5s for PhaseByTransmission integration tests --- .../walkers/phasing/PhaseByTransmissionIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java index c8b54e36e..9f59adeb6 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/PhaseByTransmissionIntegrationTest.java @@ -21,7 +21,7 @@ public class PhaseByTransmissionIntegrationTest extends WalkerTest { "-o %s" ), 1, - Arrays.asList("") + Arrays.asList("416a483e87358cdcb0b09a496e3254c0") ); executeTest("testBasicFunctionalityWithoutFilters", spec); } @@ -37,7 +37,7 @@ public class PhaseByTransmissionIntegrationTest extends WalkerTest { "-o %s" ), 1, - Arrays.asList("") + Arrays.asList("8c5db343567e90e97993912c7e541d0d") ); executeTest("testBasicFunctionalityWithFilters", spec); } From 8167aba601c5d660e17b2407f090e3d9c61884e0 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 22:47:32 -0400 Subject: [PATCH 158/214] Moved (poorly named) MergeAndMatchHaplotypes to public. Added integration test --- .../phasing/MergeAndMatchHaplotypes.java | 107 ++++++++++++++++++ ...ergeAndMatchHaplotypesIntegrationTest.java | 28 +++++ 2 files changed, 135 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java new file mode 100644 index 000000000..4da049b39 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java @@ -0,0 +1,107 @@ +package org.broadinstitute.sting.gatk.walkers.phasing; + +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.RodWalker; +import org.broadinstitute.sting.utils.SampleUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeader; +import org.broadinstitute.sting.utils.codecs.vcf.VCFHeaderLine; +import org.broadinstitute.sting.utils.codecs.vcf.VCFUtils; +import org.broadinstitute.sting.utils.codecs.vcf.VCFWriter; +import org.broadinstitute.sting.utils.variantcontext.Allele; +import org.broadinstitute.sting.utils.variantcontext.Genotype; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; + +import java.util.*; + +public class MergeAndMatchHaplotypes extends RodWalker { + @Output + protected VCFWriter vcfWriter = null; + + private Map pbtCache = new HashMap(); + private Map rbpCache = new HashMap(); + + private final String SOURCE_NAME = "MergeReadBackedAndTransmissionPhasedVariants"; + + public void initialize() { + ArrayList rodNames = new ArrayList(); + rodNames.add("pbt"); + + Map vcfRods = VCFUtils.getVCFHeadersFromRods(getToolkit(), rodNames); + Set vcfSamples = SampleUtils.getSampleList(vcfRods, VariantContextUtils.GenotypeMergeType.REQUIRE_UNIQUE); + Set headerLines = new HashSet(); + headerLines.addAll(VCFUtils.getHeaderFields(this.getToolkit())); + + vcfWriter.writeHeader(new VCFHeader(headerLines, vcfSamples)); + } + + @Override + public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + if (tracker != null) { + Collection pbts = tracker.getVariantContexts(ref, "pbt", null, ref.getLocus(), true, true); + Collection rbps = tracker.getVariantContexts(ref, "rbp", null, ref.getLocus(), true, true); + + VariantContext pbt = pbts.iterator().hasNext() ? pbts.iterator().next() : null; + VariantContext rbp = rbps.iterator().hasNext() ? rbps.iterator().next() : null; + + if (pbt != null && rbp != null) { + Map genotypes = pbt.getGenotypes(); + + if (!rbp.isFiltered()) { + for (String sample : rbp.getSampleNames()) { + Genotype rbpg = rbp.getGenotype(sample); + Genotype pbtg = pbt.getGenotype(sample); + + // Propagate read-backed phasing information to genotypes unphased by transmission + //if (!pbtg.isPhased() && rbpCache.containsKey(sample)) { + if (!pbtg.isPhased() && rbpg.isPhased() && rbpCache.containsKey(sample)) { + boolean orientationMatches = rbpCache.get(sample).sameGenotype(pbtCache.get(sample), false); + + if (orientationMatches) { + pbtg = rbpg; + } else { + List fwdAlleles = rbpg.getAlleles(); + List revAlleles = new ArrayList(); + + for (int i = fwdAlleles.size() - 1; i >= 0; i--) { + revAlleles.add(fwdAlleles.get(i)); + } + + pbtg = new Genotype(sample, revAlleles, rbpg.getNegLog10PError(), rbpg.getFilters(), rbpg.getAttributes(), rbpg.isPhased()); + } + } + + genotypes.put(sample, pbtg); + + // Update the cache + if (/*rbpg.isPhased() &&*/ rbpg.isHet()) { + rbpCache.put(sample, rbpg); + pbtCache.put(sample, pbtg); + } else if (!rbpg.isPhased()) { + rbpCache.remove(sample); + pbtCache.remove(sample); + } + } + } + + VariantContext newvc = new VariantContext(SOURCE_NAME, pbt.getChr(), pbt.getStart(), pbt.getStart(), pbt.getAlleles(), genotypes, pbt.getNegLog10PError(), pbt.getFilters(), pbt.getAttributes()); + vcfWriter.add(newvc, ref.getBase()); + } + } + + return null; + } + + @Override + public Integer reduceInit() { + return null; + } + + @Override + public Integer reduce(Integer value, Integer sum) { + return null; + } +} diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java new file mode 100644 index 000000000..46d96da27 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java @@ -0,0 +1,28 @@ +package org.broadinstitute.sting.gatk.walkers.phasing; + +import org.broadinstitute.sting.WalkerTest; +import org.testng.annotations.Test; + +import java.util.Arrays; + +public class MergeAndMatchHaplotypesIntegrationTest extends WalkerTest { + private static String mergeAndMatchHaplotypesTestDataRoot = validationDataLocation + "/MergeByHaplotypes"; + private static String fundamentalTestPBTVCF = mergeAndMatchHaplotypesTestDataRoot + "/" + "FundamentalsTest.pbt.vcf"; + private static String fundamentalTestRBPVCF = mergeAndMatchHaplotypesTestDataRoot + "/" + "FundamentalsTest.pbt.rbp.vcf"; + + @Test + public void testBasicFunctionality() { + WalkerTestSpec spec = new WalkerTestSpec( + buildCommandLine( + "-T MergeAndMatchHaplotypes", + "-R " + b37KGReference, + "-B:pbt,VCF " + fundamentalTestPBTVCF, + "-B:rbp,VCF " + fundamentalTestRBPVCF, + "-o %s" + ), + 1, + Arrays.asList("") + ); + executeTest("testBasicMergeAndMatchHaplotypesFunctionality", spec); + } +} From 824100e57f71d1e98f1fe7940f64cd1837e0a53b Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 22:50:54 -0400 Subject: [PATCH 159/214] Corrected typo in MergeAndMatchHaplotypes integration test --- .../walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java index 46d96da27..21435dd7d 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypesIntegrationTest.java @@ -6,7 +6,7 @@ import org.testng.annotations.Test; import java.util.Arrays; public class MergeAndMatchHaplotypesIntegrationTest extends WalkerTest { - private static String mergeAndMatchHaplotypesTestDataRoot = validationDataLocation + "/MergeByHaplotypes"; + private static String mergeAndMatchHaplotypesTestDataRoot = validationDataLocation + "/MergeAndMatchHaplotypes"; private static String fundamentalTestPBTVCF = mergeAndMatchHaplotypesTestDataRoot + "/" + "FundamentalsTest.pbt.vcf"; private static String fundamentalTestRBPVCF = mergeAndMatchHaplotypesTestDataRoot + "/" + "FundamentalsTest.pbt.rbp.vcf"; From 497721a799afb09d1ba3042420de4a91f3179daf Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 18 Jul 2011 00:25:21 -0400 Subject: [PATCH 161/214] Added class documentation string. --- .../sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java index 4da049b39..298d8d6c8 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/MergeAndMatchHaplotypes.java @@ -17,6 +17,9 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.util.*; +/** + * Merges read-back-phased and phase-by-transmission files. + */ public class MergeAndMatchHaplotypes extends RodWalker { @Output protected VCFWriter vcfWriter = null; From 6f26c07b8506756cc62f566099ca08adde51b101 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 10:42:35 -0400 Subject: [PATCH 164/214] Removed the SpecificDifference class. Now Difference classes always have the option to remember specific master and test values. This means that all summarized differences carry with them specific examples of their differences. Consequently, now even summarized differences give at least one example of the specific difference, even when the count of the difference is > 1. Unit tests updated. Added DiffObjects integrationtest. VCFDiffableReader now specifically reads the first line of the VCF file to capture the version number. --- .../gatk/walkers/diffengine/DiffEngine.java | 42 +++++------ .../walkers/diffengine/DiffObjectsWalker.java | 4 +- .../gatk/walkers/diffengine/Difference.java | 45 +++++++++++- .../diffengine/SpecificDifference.java | 59 --------------- .../walkers/diffengine/VCFDiffableReader.java | 6 ++ .../diffengine/DiffEngineUnitTest.java | 2 +- .../DiffObjectsIntegrationTest.java | 71 +++++++++++++++++++ .../diffengine/DiffableReaderUnitTest.java | 2 +- .../diffengine/DifferenceUnitTest.java | 10 +-- 9 files changed, 151 insertions(+), 90 deletions(-) delete mode 100644 public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java create mode 100644 public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index 2f87a900a..e3910ef11 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -58,7 +58,7 @@ public class DiffEngine { // // -------------------------------------------------------------------------------- - public List diff(DiffElement master, DiffElement test) { + public List diff(DiffElement master, DiffElement test) { DiffValue masterValue = master.getValue(); DiffValue testValue = test.getValue(); @@ -68,14 +68,14 @@ public class DiffEngine { return diff(masterValue, testValue); } else { // structural difference in types. one is node, other is leaf - return Arrays.asList(new SpecificDifference(master, test)); + return Arrays.asList(new Difference(master, test)); } } - public List diff(DiffNode master, DiffNode test) { + public List diff(DiffNode master, DiffNode test) { Set allNames = new HashSet(master.getElementNames()); allNames.addAll(test.getElementNames()); - List diffs = new ArrayList(); + List diffs = new ArrayList(); for ( String name : allNames ) { DiffElement masterElt = master.getElement(name); @@ -84,7 +84,7 @@ public class DiffEngine { throw new ReviewedStingException("BUG: unexceptedly got two null elements for field: " + name); } else if ( masterElt == null || testElt == null ) { // if either is null, we are missing a value // todo -- should one of these be a special MISSING item? - diffs.add(new SpecificDifference(masterElt, testElt)); + diffs.add(new Difference(masterElt, testElt)); } else { diffs.addAll(diff(masterElt, testElt)); } @@ -93,11 +93,11 @@ public class DiffEngine { return diffs; } - public List diff(DiffValue master, DiffValue test) { + public List diff(DiffValue master, DiffValue test) { if ( master.getValue().equals(test.getValue()) ) { return Collections.emptyList(); } else { - return Arrays.asList(new SpecificDifference(master.getBinding(), test.getBinding())); + return Arrays.asList(new Difference(master.getBinding(), test.getBinding())); } } @@ -145,11 +145,11 @@ public class DiffEngine { * @param params determines how we display the items * @param diffs */ - public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { + public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { printSummaryReport(summarizeDifferences(diffs), params ); } - public List summarizeDifferences(List diffs) { + public List summarizeDifferences(List diffs) { return summarizedDifferencesOfPaths(diffs); } @@ -177,8 +177,12 @@ public class DiffEngine { Difference diffPath2 = singletonDiffs.get(j); if ( diffPath1.length() == diffPath2.length() ) { int lcp = longestCommonPostfix(diffPath1.getParts(), diffPath2.getParts()); - String path = lcp > 0 ? summarizedPath(diffPath2.getParts(), lcp) : diffPath2.getPath(); - addSummary(summaries, path, true); + String path = diffPath2.getPath(); + if ( lcp != 0 && lcp != diffPath1.length() ) + path = summarizedPath(diffPath2.getParts(), lcp); + Difference sumDiff = new Difference(path, diffPath2.getMaster(), diffPath2.getTest()); + sumDiff.setCount(0); + addSummaryIfMissing(summaries, sumDiff); } } } @@ -187,7 +191,7 @@ public class DiffEngine { for ( Difference diffPath : singletonDiffs ) { for ( Difference sumDiff : summaries.values() ) { if ( sumDiff.matches(diffPath.getParts()) ) - addSummary(summaries, sumDiff.getPath(), false); + sumDiff.incCount(); } } @@ -196,13 +200,9 @@ public class DiffEngine { return sortedSummaries; } - private static void addSummary(Map summaries, String path, boolean onlyCatalog) { - if ( summaries.containsKey(path) ) { - if ( ! onlyCatalog ) - summaries.get(path).incCount(); - } else { - Difference sumDiff = new Difference(path); - summaries.put(sumDiff.getPath(), sumDiff); + protected void addSummaryIfMissing(Map summaries, Difference diff) { + if ( ! summaries.containsKey(diff.getPath()) ) { + summaries.put(diff.getPath(), diff); } } @@ -213,6 +213,7 @@ public class DiffEngine { GATKReportTable table = report.getTable(tableName); table.addPrimaryKey("Difference", true); table.addColumn("NumberOfOccurrences", 0); + table.addColumn("SpecificDifference", 0); int count = 0, count1 = 0; for ( Difference diff : sortedSummaries ) { @@ -230,6 +231,7 @@ public class DiffEngine { } table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); + table.set(diff.getPath(), "SpecificDifference", diff.valueDiffString()); } table.write(params.out); @@ -336,7 +338,7 @@ public class DiffEngine { if ( diffEngine.canRead(masterFile) && diffEngine.canRead(testFile) ) { DiffElement master = diffEngine.createDiffableFromFile(masterFile); DiffElement test = diffEngine.createDiffableFromFile(testFile); - List diffs = diffEngine.diff(master, test); + List diffs = diffEngine.diff(master, test); diffEngine.reportSummarizedDifferences(diffs, params); return true; } else { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java index ecb836af9..8e362dcc4 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -104,10 +104,10 @@ public class DiffObjectsWalker extends RodWalker { // out.printf("Test diff objects%n"); // out.println(test.toString()); - List diffs = diffEngine.diff(master, test); + List diffs = diffEngine.diff(master, test); if ( showItemizedDifferences ) { out.printf("Itemized results%n"); - for ( SpecificDifference diff : diffs ) + for ( Difference diff : diffs ) out.printf("DIFF: %s%n", diff.toString()); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java index efc6ef160..81b6f7e0e 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/Difference.java @@ -27,13 +27,24 @@ package org.broadinstitute.sting.gatk.walkers.diffengine; public class Difference implements Comparable { final String path; // X.Y.Z final String[] parts; - int count = 0; + int count = 1; + DiffElement master = null , test = null; public Difference(String path) { this.path = path; this.parts = DiffEngine.diffNameToPath(path); } + public Difference(DiffElement master, DiffElement test) { + this(createPath(master, test), master, test); + } + + public Difference(String path, DiffElement master, DiffElement test) { + this(path); + this.master = master; + this.test = test; + } + public String[] getParts() { return parts; } @@ -44,6 +55,10 @@ public class Difference implements Comparable { return count; } + public void setCount(int count) { + this.count = count; + } + /** * The fully qualified path object A.B.C etc * @return @@ -81,7 +96,7 @@ public class Difference implements Comparable { @Override public String toString() { - return String.format("%s:%d", getPath(), getCount()); + return String.format("%s:%d:%s", getPath(), getCount(), valueDiffString()); } @Override @@ -91,5 +106,31 @@ public class Difference implements Comparable { return countCmp != 0 ? -1 * countCmp : path.compareTo(other.path); } + public String valueDiffString() { + if ( hasSpecificDifference() ) { + return String.format("%s!=%s", getOneLineString(master), getOneLineString(test)); + } else { + return "N/A"; + } + } + private static String createPath(DiffElement master, DiffElement test) { + return (master == null ? test : master).fullyQualifiedName(); + } + + private static String getOneLineString(DiffElement elt) { + return elt == null ? "MISSING" : elt.getValue().toOneLineString(); + } + + public boolean hasSpecificDifference() { + return master != null || test != null; + } + + public DiffElement getMaster() { + return master; + } + + public DiffElement getTest() { + return test; + } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java deleted file mode 100644 index 2fe9b47f8..000000000 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/SpecificDifference.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.gatk.walkers.diffengine; - -/** - * Created by IntelliJ IDEA. - * User: depristo - * Date: 7/4/11 - * Time: 12:53 PM - * - * Represents a specific difference between two specific DiffElements - */ -public class SpecificDifference extends Difference { - DiffElement master, test; - - public SpecificDifference(DiffElement master, DiffElement test) { - super(createName(master, test)); - if ( master == null && test == null ) throw new IllegalArgumentException("Master and test both cannot be null"); - this.master = master; - this.test = test; - } - - public String toString() { - return String.format("%s:%s!=%s", - getPath(), - getOneLineString(master), - getOneLineString(test)); - } - - private static String createName(DiffElement master, DiffElement test) { - return (master == null ? test : master).fullyQualifiedName(); - } - - private static String getOneLineString(DiffElement elt) { - return elt == null ? "MISSING" : elt.getValue().toOneLineString(); - } -} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index 4e44578c7..df2a5cda1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -53,7 +53,13 @@ public class VCFDiffableReader implements DiffableReader { public DiffElement readFromFile(File file, int maxElementsToRead) { DiffNode root = DiffNode.rooted(file.getName()); try { + // read the version line from the file LineReader lineReader = new AsciiLineReader(new FileInputStream(file)); + final String version = lineReader.readLine(); + root.add("VERSION", version); + lineReader.close(); + + lineReader = new AsciiLineReader(new FileInputStream(file)); VCFCodec vcfCodec = new VCFCodec(); // must be read as state is stored in reader itself diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java index 96dfec6e8..2ae19264e 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngineUnitTest.java @@ -99,7 +99,7 @@ public class DiffEngineUnitTest extends BaseTest { logger.warn("Test tree1: " + test.tree1.toOneLineString()); logger.warn("Test tree2: " + test.tree2.toOneLineString()); - List diffs = engine.diff(test.tree1, test.tree2); + List diffs = engine.diff(test.tree1, test.tree2); logger.warn("Test expected diff : " + test.differences); logger.warn("Observed diffs : " + diffs); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java new file mode 100644 index 000000000..cca1eccb4 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java @@ -0,0 +1,71 @@ +/* + * 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.gatk.walkers.diffengine; + +import org.broadinstitute.sting.WalkerTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class DiffObjectsIntegrationTest extends WalkerTest { + private class TestParams extends TestDataProvider { + public File master, test; + public String MD5; + + private TestParams(String master, String test, String MD5) { + super(TestParams.class); + this.master = new File(master); + this.test = new File(test); + this.MD5 = MD5; + } + + public String toString() { + return String.format("master=%s,test=%s,md5=%s", master, test, MD5); + } + } + + @DataProvider(name = "data") + public Object[][] createData() { + new TestParams(testDir + "diffTestMaster.vcf", testDir + "diffTestTest.vcf", "fb7f4e011487ca56bce865ae5468cdc5"); + new TestParams(testDir + "exampleBAM.bam", testDir + "exampleBAM.simple.bam", "423cec3befbf0a72d8bc3757ee628fc4"); + return TestParams.getTests(TestParams.class); + } + + @Test(enabled = true, dataProvider = "data") + public void testDiffs(TestParams params) { + WalkerTestSpec spec = new WalkerTestSpec( + "-T DiffObjects -R public/testdata/exampleFASTA.fasta " + + " -m " + params.master + + " -t " + params.test + + " -o %s", + Arrays.asList(params.MD5)); + executeTest("testDiffObjects:"+params, spec).getFirst(); + } +} + diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java index a0cb47770..dee7bbd88 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffableReaderUnitTest.java @@ -87,7 +87,7 @@ public class DiffableReaderUnitTest extends BaseTest { Assert.assertSame(diff.getParent(), DiffElement.ROOT); DiffNode node = diff.getValueAsNode(); - Assert.assertEquals(node.getElements().size(), 10); + Assert.assertEquals(node.getElements().size(), 11); // chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03 DiffNode rec1 = node.getElement("chr1:2646").getValueAsNode(); diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java index 64579a01b..4e4080bc7 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DifferenceUnitTest.java @@ -75,10 +75,10 @@ public class DifferenceUnitTest extends BaseTest { @DataProvider(name = "data") public Object[][] createTrees() { - new DifferenceTest("A=X", "A=Y", "A:X!=Y"); - new DifferenceTest("A=Y", "A=X", "A:Y!=X"); - new DifferenceTest(DiffNode.fromString("A=X"), null, "A:X!=MISSING"); - new DifferenceTest(null, DiffNode.fromString("A=X"), "A:MISSING!=X"); + new DifferenceTest("A=X", "A=Y", "A:1:X!=Y"); + new DifferenceTest("A=Y", "A=X", "A:1:Y!=X"); + new DifferenceTest(DiffNode.fromString("A=X"), null, "A:1:X!=MISSING"); + new DifferenceTest(null, DiffNode.fromString("A=X"), "A:1:MISSING!=X"); return DifferenceTest.getTests(DifferenceTest.class); } @@ -87,7 +87,7 @@ public class DifferenceUnitTest extends BaseTest { logger.warn("Test tree1: " + (test.tree1 == null ? "null" : test.tree1.toOneLineString())); logger.warn("Test tree2: " + (test.tree2 == null ? "null" : test.tree2.toOneLineString())); logger.warn("Test expected diff : " + test.difference); - SpecificDifference diff = new SpecificDifference(test.tree1, test.tree2); + Difference diff = new Difference(test.tree1, test.tree2); logger.warn("Observed diffs : " + diff); Assert.assertEquals(diff.toString(), test.difference, "Observed diff string " + diff + " not equal to expected difference string " + test.difference ); From d6e2e89f9994f45182071962f3d140a0569dc865 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 10:46:01 -0400 Subject: [PATCH 165/214] Walker test system refactoring. All MD5DB related functions are now in MD5DB.java. System has the concept of a local and a global MD5 db. The local one is like it operated previously. The global one lives in /humgen/gsa-hpprojects/GATK/data/integrationtests. If the system can find this directory then MD5s will also be read / written to this location. This means that gsabamboo will print differences as appropriate. And all users will in effect have access to a complete history of MD5 file results. A few minor code reshuffles changed VariantRecalibration and VCFHeader test files. --- .../org/broadinstitute/sting/BaseTest.java | 206 +-------------- .../test/org/broadinstitute/sting/MD5DB.java | 247 ++++++++++++++++++ .../org/broadinstitute/sting/WalkerTest.java | 4 +- ...ntRecalibrationWalkersIntegrationTest.java | 5 +- .../CombineVariantsIntegrationTest.java | 3 +- .../utils/genotype/vcf/VCFHeaderUnitTest.java | 55 +++- 6 files changed, 306 insertions(+), 214 deletions(-) create mode 100644 public/java/test/org/broadinstitute/sting/MD5DB.java diff --git a/public/java/test/org/broadinstitute/sting/BaseTest.java b/public/java/test/org/broadinstitute/sting/BaseTest.java index b3e422ba9..ef46d4bff 100755 --- a/public/java/test/org/broadinstitute/sting/BaseTest.java +++ b/public/java/test/org/broadinstitute/sting/BaseTest.java @@ -13,10 +13,7 @@ import java.io.*; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @@ -83,11 +80,6 @@ public abstract class BaseTest { public static final String networkTempDir = "/broad/shptmp/"; public static final File networkTempDirFile = new File(networkTempDir); - /** - * Subdirectory under the ant build directory where we store integration test md5 results - */ - public static final String MD5_FILE_DB_SUBDIR = "integrationtests"; - public static final String testDir = "public/testdata/"; /** before the class starts up */ @@ -129,7 +121,7 @@ public abstract class BaseTest { * 2: Create instances of your subclass. Return from it the call to getTests, providing * the class type of your test * - * @DataProvider(name = "summaries") + * @DataProvider(name = "summaries" * public Object[][] createSummaries() { * new SummarizeDifferenceTest().addDiff("A", "A").addSummary("A:2"); * new SummarizeDifferenceTest().addDiff("A", "B").addSummary("A:1", "B:1"); @@ -206,200 +198,6 @@ public abstract class BaseTest { } } - /** - * a little utility function for all tests to md5sum a file - * Shameless taken from: - * - * http://www.javalobby.org/java/forums/t84420.html - * - * @param file the file - * @return a string - */ - public static String md5SumFile(File file) { - MessageDigest digest; - try { - digest = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - throw new ReviewedStingException("Unable to find MD5 digest"); - } - InputStream is; - try { - is = new FileInputStream(file); - } catch (FileNotFoundException e) { - throw new ReviewedStingException("Unable to open file " + file); - } - byte[] buffer = new byte[8192]; - int read; - try { - while ((read = is.read(buffer)) > 0) { - digest.update(buffer, 0, read); - } - byte[] md5sum = digest.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - return bigInt.toString(16); - - } - catch (IOException e) { - throw new ReviewedStingException("Unable to process file for MD5", e); - } - finally { - try { - is.close(); - } - catch (IOException e) { - throw new ReviewedStingException("Unable to close input stream for MD5 calculation", e); - } - } - } - - protected static void ensureMd5DbDirectory() { - // todo -- make path - File dir = new File(MD5_FILE_DB_SUBDIR); - if ( ! dir.exists() ) { - System.out.printf("##### Creating MD5 db %s%n", MD5_FILE_DB_SUBDIR); - if ( ! dir.mkdir() ) { - throw new ReviewedStingException("Infrastructure failure: failed to create md5 directory " + MD5_FILE_DB_SUBDIR); - } - } - } - - protected static File getFileForMD5(final String md5) { - final String basename = String.format("%s.integrationtest", md5); - return new File(MD5_FILE_DB_SUBDIR + "/" + basename); - } - - private static void updateMD5Db(final String md5, final File resultsFile) { - // todo -- copy results file to DB dir if needed under filename for md5 - final File dbFile = getFileForMD5(md5); - if ( ! dbFile.exists() ) { - // the file isn't already in the db, copy it over - System.out.printf("##### Updating MD5 file: %s%n", dbFile.getPath()); - try { - FileUtils.copyFile(resultsFile, dbFile); - } catch ( IOException e ) { - throw new ReviewedStingException(e.getMessage()); - } - } else { - System.out.printf("##### MD5 file is up to date: %s%n", dbFile.getPath()); - - } - } - - private static String getMD5Path(final String md5, final String valueIfNotFound) { - // todo -- look up the result in the directory and return the path if it exists - final File dbFile = getFileForMD5(md5); - return dbFile.exists() ? dbFile.getPath() : valueIfNotFound; - } - - public static byte[] getBytesFromFile(File file) throws IOException { - InputStream is = new FileInputStream(file); - - // Get the size of the file - long length = file.length(); - - if (length > Integer.MAX_VALUE) { - // File is too large - } - - // Create the byte array to hold the data - byte[] bytes = new byte[(int) length]; - - // Read in the bytes - int offset = 0; - int numRead = 0; - while (offset < bytes.length - && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { - offset += numRead; - } - - // Ensure all the bytes have been read in - if (offset < bytes.length) { - throw new IOException("Could not completely read file " + file.getName()); - } - - // Close the input stream and return bytes - is.close(); - return bytes; - } - - /** - * Tests a file MD5 against an expected value, returning the MD5. NOTE: This function WILL throw an exception if the MD5s are different. - * @param name Name of the test. - * @param resultsFile File to MD5. - * @param expectedMD5 Expected MD5 value. - * @param parameterize If true or if expectedMD5 is an empty string, will print out the calculated MD5 instead of error text. - * @return The calculated MD5. - */ - public static String assertMatchingMD5(final String name, final File resultsFile, final String expectedMD5, final boolean parameterize) { - String filemd5sum = testFileMD5(name, resultsFile, expectedMD5, parameterize); - - if (parameterize || expectedMD5.equals("")) { - // Don't assert - } else if ( filemd5sum.equals(expectedMD5) ) { - System.out.println(String.format(" => %s PASSED", name)); - } else { - Assert.fail(String.format("%s has mismatching MD5s: expected=%s observed=%s", name, expectedMD5, filemd5sum)); - } - - - - return filemd5sum; - } - - - /** - * Tests a file MD5 against an expected value, returning the MD5. NOTE: This function WILL NOT throw an exception if the MD5s are different. - * @param name Name of the test. - * @param resultsFile File to MD5. - * @param expectedMD5 Expected MD5 value. - * @param parameterize If true or if expectedMD5 is an empty string, will print out the calculated MD5 instead of error text. - * @return The calculated MD5. - */ - public static String testFileMD5(final String name, final File resultsFile, final String expectedMD5, final boolean parameterize) { - try { - byte[] bytesOfMessage = getBytesFromFile(resultsFile); - byte[] thedigest = MessageDigest.getInstance("MD5").digest(bytesOfMessage); - BigInteger bigInt = new BigInteger(1, thedigest); - String filemd5sum = bigInt.toString(16); - while (filemd5sum.length() < 32) filemd5sum = "0" + filemd5sum; // pad to length 32 - - // - // copy md5 to integrationtests - // - updateMD5Db(filemd5sum, resultsFile); - - if (parameterize || expectedMD5.equals("")) { - System.out.println(String.format("PARAMETERIZATION[%s]: file %s has md5 = %s, stated expectation is %s, equal? = %b", - name, resultsFile, filemd5sum, expectedMD5, filemd5sum.equals(expectedMD5))); - } else { - System.out.println(String.format("Checking MD5 for %s [calculated=%s, expected=%s]", resultsFile, filemd5sum, expectedMD5)); - System.out.flush(); - - if ( ! expectedMD5.equals(filemd5sum) ) { - // we are going to fail for real in assertEquals (so we are counted by the testing framework). - // prepare ourselves for the comparison - System.out.printf("##### Test %s is going fail #####%n", name); - String pathToExpectedMD5File = getMD5Path(expectedMD5, "[No DB file found]"); - String pathToFileMD5File = getMD5Path(filemd5sum, "[No DB file found]"); - System.out.printf("##### Path to expected file (MD5=%s): %s%n", expectedMD5, pathToExpectedMD5File); - System.out.printf("##### Path to calculated file (MD5=%s): %s%n", filemd5sum, pathToFileMD5File); - System.out.printf("##### Diff command: diff %s %s%n", pathToExpectedMD5File, pathToFileMD5File); - - // inline differences - DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(System.out, 20, 10, 0); - boolean success = DiffEngine.simpleDiffFiles(new File(pathToExpectedMD5File), new File(pathToFileMD5File), params); - if ( success ) - System.out.printf("Note that the above list is not comprehensive. At most 20 lines of output, and 10 specific differences will be listed. Please use -T DiffObjects -R public/testdata/exampleFASTA.fasta -m %s -t %s to explore the differences more freely%n", - pathToExpectedMD5File, pathToFileMD5File); - } - } - - return filemd5sum; - } catch (Exception e) { - throw new RuntimeException("Failed to read bytes from calls file: " + resultsFile, e); - } - } - /** * Creates a temp file that will be deleted on exit after tests are complete. * @param name Prefix of the file. diff --git a/public/java/test/org/broadinstitute/sting/MD5DB.java b/public/java/test/org/broadinstitute/sting/MD5DB.java new file mode 100644 index 000000000..bea9eaec5 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/MD5DB.java @@ -0,0 +1,247 @@ +/* + * 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; + +import org.apache.commons.io.FileUtils; +import org.broadinstitute.sting.gatk.walkers.diffengine.DiffEngine; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.testng.Assert; + +import java.io.*; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +/** + * Created by IntelliJ IDEA. + * User: depristo + * Date: 7/18/11 + * Time: 9:10 AM + * + * Utilities for manipulating the MD5 database of previous results + */ +public class MD5DB { + /** + * Subdirectory under the ant build directory where we store integration test md5 results + */ + public static final String LOCAL_MD5_DB_DIR = "integrationtests"; + public static final String GLOBAL_MD5_DB_DIR = "/humgen/gsa-hpprojects/GATK/data/integrationtests"; + + // ---------------------------------------------------------------------- + // + // MD5 DB stuff + // + // ---------------------------------------------------------------------- + + /** + * Create the MD5 file directories if necessary + */ + protected static void ensureMd5DbDirectory() { + File dir = new File(LOCAL_MD5_DB_DIR); + if ( ! dir.exists() ) { + System.out.printf("##### Creating MD5 db %s%n", LOCAL_MD5_DB_DIR); + if ( ! dir.mkdir() ) { + throw new ReviewedStingException("Infrastructure failure: failed to create md5 directory " + LOCAL_MD5_DB_DIR); + } + } + } + + /** + * Returns the path to an already existing file with the md5 contents, or valueIfNotFound + * if no such file exists in the db. + * + * @param md5 + * @param valueIfNotFound + * @return + */ + public static String getMD5FilePath(final String md5, final String valueIfNotFound) { + // we prefer the local db to the global DB, so match it first + for ( String dir : Arrays.asList(LOCAL_MD5_DB_DIR, GLOBAL_MD5_DB_DIR)) { + File f = getFileForMD5(md5, dir); + if ( f.exists() && f.canRead() ) + return f.getPath(); + } + + return valueIfNotFound; + } + + /** + * Utility function that given a file's md5 value and the path to the md5 db, + * returns the canonical name of the file. For example, if md5 is XXX and db is YYY, + * this will return YYY/XXX.integrationtest + * + * @param md5 + * @param dbPath + * @return + */ + private static File getFileForMD5(final String md5, final String dbPath) { + final String basename = String.format("%s.integrationtest", md5); + return new File(dbPath + "/" + basename); + } + + /** + * Copies the results file with md5 value to its canonical file name and db places + * + * @param md5 + * @param resultsFile + */ + private static void updateMD5Db(final String md5, final File resultsFile) { + copyFileToDB(getFileForMD5(md5, LOCAL_MD5_DB_DIR), resultsFile); + copyFileToDB(getFileForMD5(md5, GLOBAL_MD5_DB_DIR), resultsFile); + } + + /** + * Low-level utility routine that copies resultsFile to dbFile + * @param dbFile + * @param resultsFile + */ + private static void copyFileToDB(File dbFile, final File resultsFile) { + if ( ! dbFile.exists() ) { + // the file isn't already in the db, copy it over + System.out.printf("##### Updating MD5 file: %s%n", dbFile.getPath()); + try { + FileUtils.copyFile(resultsFile, dbFile); + } catch ( IOException e ) { + System.out.printf("##### Skipping update, cannot write file %s%n", dbFile); + } + } else { + System.out.printf("##### MD5 file is up to date: %s%n", dbFile.getPath()); + } + } + + /** + * Returns the byte[] of the entire contents of file, for md5 calculations + * @param file + * @return + * @throws IOException + */ + private static byte[] getBytesFromFile(File file) throws IOException { + InputStream is = new FileInputStream(file); + + // Get the size of the file + long length = file.length(); + + if (length > Integer.MAX_VALUE) { + // File is too large + } + + // Create the byte array to hold the data + byte[] bytes = new byte[(int) length]; + + // Read in the bytes + int offset = 0; + int numRead = 0; + while (offset < bytes.length + && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { + offset += numRead; + } + + // Ensure all the bytes have been read in + if (offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } + + // Close the input stream and return bytes + is.close(); + return bytes; + } + + /** + * Tests a file MD5 against an expected value, returning the MD5. NOTE: This function WILL throw an exception if the MD5s are different. + * @param name Name of the test. + * @param resultsFile File to MD5. + * @param expectedMD5 Expected MD5 value. + * @param parameterize If true or if expectedMD5 is an empty string, will print out the calculated MD5 instead of error text. + * @return The calculated MD5. + */ + public static String assertMatchingMD5(final String name, final File resultsFile, final String expectedMD5, final boolean parameterize) { + String filemd5sum = testFileMD5(name, resultsFile, expectedMD5, parameterize); + + if (parameterize || expectedMD5.equals("")) { + // Don't assert + } else if ( filemd5sum.equals(expectedMD5) ) { + System.out.println(String.format(" => %s PASSED", name)); + } else { + Assert.fail(String.format("%s has mismatching MD5s: expected=%s observed=%s", name, expectedMD5, filemd5sum)); + } + + return filemd5sum; + } + + + /** + * Tests a file MD5 against an expected value, returning the MD5. NOTE: This function WILL NOT throw an exception if the MD5s are different. + * @param name Name of the test. + * @param resultsFile File to MD5. + * @param expectedMD5 Expected MD5 value. + * @param parameterize If true or if expectedMD5 is an empty string, will print out the calculated MD5 instead of error text. + * @return The calculated MD5. + */ + public static String testFileMD5(final String name, final File resultsFile, final String expectedMD5, final boolean parameterize) { + try { + byte[] bytesOfMessage = getBytesFromFile(resultsFile); + byte[] thedigest = MessageDigest.getInstance("MD5").digest(bytesOfMessage); + BigInteger bigInt = new BigInteger(1, thedigest); + String filemd5sum = bigInt.toString(16); + while (filemd5sum.length() < 32) filemd5sum = "0" + filemd5sum; // pad to length 32 + + // + // copy md5 to integrationtests + // + updateMD5Db(filemd5sum, resultsFile); + + if (parameterize || expectedMD5.equals("")) { + System.out.println(String.format("PARAMETERIZATION[%s]: file %s has md5 = %s, stated expectation is %s, equal? = %b", + name, resultsFile, filemd5sum, expectedMD5, filemd5sum.equals(expectedMD5))); + } else { + System.out.println(String.format("Checking MD5 for %s [calculated=%s, expected=%s]", resultsFile, filemd5sum, expectedMD5)); + System.out.flush(); + + if ( ! expectedMD5.equals(filemd5sum) ) { + // we are going to fail for real in assertEquals (so we are counted by the testing framework). + // prepare ourselves for the comparison + System.out.printf("##### Test %s is going fail #####%n", name); + String pathToExpectedMD5File = getMD5FilePath(expectedMD5, "[No DB file found]"); + String pathToFileMD5File = getMD5FilePath(filemd5sum, "[No DB file found]"); + System.out.printf("##### Path to expected file (MD5=%s): %s%n", expectedMD5, pathToExpectedMD5File); + System.out.printf("##### Path to calculated file (MD5=%s): %s%n", filemd5sum, pathToFileMD5File); + System.out.printf("##### Diff command: diff %s %s%n", pathToExpectedMD5File, pathToFileMD5File); + + // inline differences + DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(System.out, 20, 10, 0); + boolean success = DiffEngine.simpleDiffFiles(new File(pathToExpectedMD5File), new File(pathToFileMD5File), params); + if ( success ) + System.out.printf("Note that the above list is not comprehensive. At most 20 lines of output, and 10 specific differences will be listed. Please use -T DiffObjects -R public/testdata/exampleFASTA.fasta -m %s -t %s to explore the differences more freely%n", + pathToExpectedMD5File, pathToFileMD5File); + } + } + + return filemd5sum; + } catch (Exception e) { + throw new RuntimeException("Failed to read bytes from calls file: " + resultsFile, e); + } + } +} diff --git a/public/java/test/org/broadinstitute/sting/WalkerTest.java b/public/java/test/org/broadinstitute/sting/WalkerTest.java index 22635dfa3..386c17659 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -53,7 +53,7 @@ public class WalkerTest extends BaseTest { } public String assertMatchingMD5(final String name, final File resultsFile, final String expectedMD5) { - return assertMatchingMD5(name, resultsFile, expectedMD5, parameterize()); + return MD5DB.assertMatchingMD5(name, resultsFile, expectedMD5, parameterize()); } public void maybeValidateSupplementaryFile(final String name, final File resultFile) { @@ -191,7 +191,7 @@ public class WalkerTest extends BaseTest { } protected Pair, List> executeTest(final String name, WalkerTestSpec spec) { - ensureMd5DbDirectory(); // ensure the md5 directory exists + MD5DB.ensureMd5DbDirectory(); // ensure the md5 directory exists List tmpFiles = new ArrayList(); for (int i = 0; i < spec.nOutputFiles; i++) { diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java index 2fec2e70f..057053a1c 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibrationWalkersIntegrationTest.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.gatk.walkers.variantrecalibration; +import org.broadinstitute.sting.MD5DB; import org.broadinstitute.sting.WalkerTest; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; @@ -65,8 +66,8 @@ public class VariantRecalibrationWalkersIntegrationTest extends WalkerTest { " -NO_HEADER" + " -B:input,VCF " + params.inVCF + " -o %s" + - " -tranchesFile " + getFileForMD5(params.tranchesMD5) + - " -recalFile " + getFileForMD5(params.recalMD5), + " -tranchesFile " + MD5DB.getMD5FilePath(params.tranchesMD5, null) + + " -recalFile " + MD5DB.getMD5FilePath(params.recalMD5, null), Arrays.asList(params.cutVCFMD5)); executeTest("testApplyRecalibration-"+params.inVCF, spec); } 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 fb18c6c33..00ee44f75 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 @@ -70,7 +70,6 @@ public class CombineVariantsIntegrationTest extends WalkerTest { executeTest("combineSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, 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); } @@ -119,7 +118,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { executeTest("combineComplexSites 1:" + new File(file1).getName() + " 2:" + new File(file2).getName() + " args = " + args, spec); } - @Test public void complexTestFull() { combineComplexSites("", "64b991fd3850f83614518f7d71f0532f"); } + @Test public void complexTestFull() { combineComplexSites("", "b5a53ee92bdaacd2bb3327e9004ae058"); } @Test public void complexTestMinimal() { combineComplexSites(" -minimalVCF", "df96cb3beb2dbb5e02f80abec7d3571e"); } @Test public void complexTestSitesOnly() { combineComplexSites(" -sites_only", "f72a178137e25dbe0b931934cdc0079d"); } @Test public void complexTestSitesOnlyMinimal() { combineComplexSites(" -sites_only -minimalVCF", "f704caeaaaed6711943014b847fe381a"); } diff --git a/public/java/test/org/broadinstitute/sting/utils/genotype/vcf/VCFHeaderUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/genotype/vcf/VCFHeaderUnitTest.java index c4ca6a551..14e63191d 100644 --- a/public/java/test/org/broadinstitute/sting/utils/genotype/vcf/VCFHeaderUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/genotype/vcf/VCFHeaderUnitTest.java @@ -2,15 +2,16 @@ package org.broadinstitute.sting.utils.genotype.vcf; import org.broad.tribble.readers.AsciiLineReader; import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.testng.Assert; import org.broadinstitute.sting.BaseTest; import org.testng.annotations.Test; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringBufferInputStream; +import java.io.*; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; /** * Created by IntelliJ IDEA. @@ -40,6 +41,52 @@ public class VCFHeaderUnitTest extends BaseTest { checkMD5ofHeaderFile(header, "ad8c4cf85e868b0261ab49ee2c613088"); } + /** + * a little utility function for all tests to md5sum a file + * Shameless taken from: + * + * http://www.javalobby.org/java/forums/t84420.html + * + * @param file the file + * @return a string + */ + private static String md5SumFile(File file) { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new ReviewedStingException("Unable to find MD5 digest"); + } + InputStream is; + try { + is = new FileInputStream(file); + } catch (FileNotFoundException e) { + throw new ReviewedStingException("Unable to open file " + file); + } + byte[] buffer = new byte[8192]; + int read; + try { + while ((read = is.read(buffer)) > 0) { + digest.update(buffer, 0, read); + } + byte[] md5sum = digest.digest(); + BigInteger bigInt = new BigInteger(1, md5sum); + return bigInt.toString(16); + + } + catch (IOException e) { + throw new ReviewedStingException("Unable to process file for MD5", e); + } + finally { + try { + is.close(); + } + catch (IOException e) { + throw new ReviewedStingException("Unable to close input stream for MD5 calculation", e); + } + } + } + private void checkMD5ofHeaderFile(VCFHeader header, String md5sum) { File myTempFile = null; PrintWriter pw = null; From 449bf1b539369011b5d2f5fc946662686a9e7c30 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 10:47:03 -0400 Subject: [PATCH 166/214] Testdata for diffObjects. PipelineTest updated to point to MD5DB.java --- .../sting/queue/pipeline/PipelineTest.scala | 3 ++- public/testdata/exampleBAM.simple.bai | Bin 0 -> 232 bytes public/testdata/exampleBAM.simple.bam | Bin 0 -> 3595 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 public/testdata/exampleBAM.simple.bai create mode 100644 public/testdata/exampleBAM.simple.bam diff --git a/public/scala/test/org/broadinstitute/sting/queue/pipeline/PipelineTest.scala b/public/scala/test/org/broadinstitute/sting/queue/pipeline/PipelineTest.scala index dc3cfd9d4..c2c956118 100644 --- a/public/scala/test/org/broadinstitute/sting/queue/pipeline/PipelineTest.scala +++ b/public/scala/test/org/broadinstitute/sting/queue/pipeline/PipelineTest.scala @@ -31,6 +31,7 @@ import org.broadinstitute.sting.commandline.CommandLineProgram import java.util.Date import java.text.SimpleDateFormat import org.broadinstitute.sting.BaseTest +import org.broadinstitute.sting.MD5DB import org.broadinstitute.sting.queue.QCommandLine import org.broadinstitute.sting.queue.util.{Logging, ProcessController} import java.io.{FileNotFoundException, File} @@ -105,7 +106,7 @@ object PipelineTest extends BaseTest with Logging { private def assertMatchingMD5s(name: String, fileMD5s: Traversable[(File, String)], parameterize: Boolean) { var failed = 0 for ((file, expectedMD5) <- fileMD5s) { - val calculatedMD5 = BaseTest.testFileMD5(name, file, expectedMD5, parameterize) + val calculatedMD5 = MD5DB.testFileMD5(name, file, expectedMD5, parameterize) if (!parameterize && expectedMD5 != "" && expectedMD5 != calculatedMD5) failed += 1 } diff --git a/public/testdata/exampleBAM.simple.bai b/public/testdata/exampleBAM.simple.bai new file mode 100644 index 0000000000000000000000000000000000000000..2d8268b1d9ecd4c5da64f692d7790723d89e2445 GIT binary patch literal 232 zcmZ>A^kigYU|?VaVoxCk1`u108At$u6g!0Wf{MfV54a)X-cWHEf0Y14+y^QS<8z2Z r#QmV+Fn*FO)ci>d3`{^K%wCwdB19Tag4_sGgYFiXT`(GE2TU^nq8kf) literal 0 HcmV?d00001 diff --git a/public/testdata/exampleBAM.simple.bam b/public/testdata/exampleBAM.simple.bam new file mode 100644 index 0000000000000000000000000000000000000000..c3eb7ae7bf90a4f4aee3ce11cb0a3bd63139d36f GIT binary patch literal 3595 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 R0stET0{{R300000006Of@cRG& literal 0 HcmV?d00001 From bc8b5da698bac57a95673c53c1e491ee14d22473 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Mon, 18 Jul 2011 12:25:54 -0400 Subject: [PATCH 170/214] Added docs while I was reading through the code to understand it --- .../walkers/variantutils/CombineVariants.java | 2 +- .../variantcontext/VariantContextUtils.java | 47 ++++++++++++++----- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java index 837f352f8..3dc47caa2 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java @@ -149,7 +149,7 @@ public class CombineVariants extends RodWalker { // get all of the vcf rods at this locus // Need to provide reference bases to simpleMerge starting at current locus - Collection vcs = tracker.getAllVariantContexts(ref, null,context.getLocation(), true, false); + Collection vcs = tracker.getAllVariantContexts(ref, null, context.getLocation(), true, false); if ( sitesOnlyVCF ) { vcs = VariantContextUtils.sitesOnlyVariantContexts(vcs); diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java index 5a5671056..c1eb48b68 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java @@ -289,8 +289,8 @@ public class VariantContextUtils { /** * Returns a newly allocated VC that is the same as VC, but without genotypes - * @param vc - * @return + * @param vc variant context + * @return new VC without genotypes */ @Requires("vc != null") @Ensures("result != null") @@ -303,8 +303,8 @@ public class VariantContextUtils { /** * Returns a newly allocated list of VC, where each VC is the same as the input VCs, but without genotypes - * @param vcs - * @return + * @param vcs collection of VCs + * @return new VCs without genotypes */ @Requires("vcs != null") @Ensures("result != null") @@ -362,9 +362,9 @@ public class VariantContextUtils { * information per genotype. The master merge will add the PQ information from each genotype record, where * appropriate, to the master VC. * - * @param unsortedVCs - * @param masterName - * @return + * @param unsortedVCs collection of VCs + * @param masterName name of master VC + * @return master-merged VC */ public static VariantContext masterMerge(Collection unsortedVCs, String masterName) { VariantContext master = findMaster(unsortedVCs, masterName); @@ -435,11 +435,15 @@ public class VariantContextUtils { * If uniqifySamples is true, the priority order is ignored and names are created by concatenating the VC name with * the sample name * - * @param unsortedVCs - * @param priorityListOfVCs - * @param filteredRecordMergeType - * @param genotypeMergeOptions - * @return + * @param genomeLocParser loc parser + * @param unsortedVCs collection of unsorted VCs + * @param priorityListOfVCs priority list detailing the order in which we should grab the VCs + * @param filteredRecordMergeType merge type for filtered records + * @param genotypeMergeOptions merge option for genotypes + * @param annotateOrigin should we annotate the set it came from? + * @param printMessages should we print messages? + * @param inputRefBase the ref base + * @return new VariantContext */ public static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collection unsortedVCs, List priorityListOfVCs, FilteredRecordMergeType filteredRecordMergeType, GenotypeMergeType genotypeMergeOptions, @@ -448,6 +452,24 @@ public class VariantContextUtils { return simpleMerge(genomeLocParser, unsortedVCs, priorityListOfVCs, filteredRecordMergeType, genotypeMergeOptions, annotateOrigin, printMessages, inputRefBase, "set", false, false); } + /** + * Merges VariantContexts into a single hybrid. Takes genotypes for common samples in priority order, if provided. + * If uniqifySamples is true, the priority order is ignored and names are created by concatenating the VC name with + * the sample name + * + * @param genomeLocParser loc parser + * @param unsortedVCs collection of unsorted VCs + * @param priorityListOfVCs priority list detailing the order in which we should grab the VCs + * @param filteredRecordMergeType merge type for filtered records + * @param genotypeMergeOptions merge option for genotypes + * @param annotateOrigin should we annotate the set it came from? + * @param printMessages should we print messages? + * @param inputRefBase the ref base + * @param setKey the key name of the set + * @param filteredAreUncalled are filtered records uncalled? + * @param mergeInfoWithMaxAC should we merge in info from the VC with maximum allele count? + * @return new VariantContext + */ public static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collection unsortedVCs, List priorityListOfVCs, FilteredRecordMergeType filteredRecordMergeType, GenotypeMergeType genotypeMergeOptions, boolean annotateOrigin, boolean printMessages, byte inputRefBase, String setKey, @@ -834,6 +856,7 @@ public class VariantContextUtils { /** * create a genome location, given a variant context + * @param genomeLocParser parser * @param vc the variant context * @return the genomeLoc */ From 80b5c5261a097b1a97ebc63e397d3f0f7d13f2eb Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Mon, 18 Jul 2011 13:42:45 -0400 Subject: [PATCH 173/214] CombineVariants no longer combines records of different types. So now when combining SNP and indel callsets, overlapping calls get their own records. Useful for Khalid in the pipeline. For those interested, it turns out the previous behavior was doing the wrong thing occasionally (and this was even captured in the integration tests). --- .../walkers/variantutils/CombineVariants.java | 19 +++++++++++++------ .../variantcontext/VariantContextUtils.java | 13 ++++++++++++- .../CombineVariantsIntegrationTest.java | 6 +++--- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java index 3dc47caa2..6970431ff 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java @@ -172,17 +172,24 @@ public class CombineVariants extends RodWalker { if (minimumN > 1 && (vcs.size() - numFilteredRecords < minimumN)) return 0; - VariantContext mergedVC; + List mergedVCs = new ArrayList(); if ( master ) { - mergedVC = VariantContextUtils.masterMerge(vcs, "master"); + mergedVCs.add(VariantContextUtils.masterMerge(vcs, "master")); } else { - mergedVC = VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(),vcs, priority, filteredRecordsMergeType, - genotypeMergeOption, true, printComplexMerges, ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC); + Map> VCsByType = VariantContextUtils.separateVariantContextsByType(vcs); + // iterate over the keys (and not the values) so that it's deterministic + for ( VariantContext.Type type : VCsByType.keySet() ) { + mergedVCs.add(VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(), VCsByType.get(type), + priority, filteredRecordsMergeType, genotypeMergeOption, true, printComplexMerges, + ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC)); + } } - //out.printf(" merged => %s%nannotated => %s%n", mergedVC, annotatedMergedVC); + for ( VariantContext mergedVC : mergedVCs ) { + // only operate at the start of events + if ( mergedVC == null ) + continue; - if ( mergedVC != null ) { // only operate at the start of events HashMap attributes = new HashMap(mergedVC.getAttributes()); // re-compute chromosome counts VariantContextUtils.calculateChromosomeCounts(mergedVC, attributes, false); diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java index c1eb48b68..212600360 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java @@ -492,7 +492,7 @@ public class VariantContextUtils { if ( ! filteredAreUncalled || vc.isNotFiltered() ) VCs.add(VariantContext.createVariantContextWithPaddedAlleles(vc,inputRefBase,false)); } - if ( VCs.size() == 0 ) // everything is filtered out and we're filteredareUncalled + if ( VCs.size() == 0 ) // everything is filtered out and we're filteredAreUncalled return null; // establish the baseline info from the first VC @@ -637,6 +637,17 @@ public class VariantContextUtils { return merged; } + public static Map> separateVariantContextsByType(Collection VCs) { + HashMap> mappedVCs = new HashMap>(); + for ( VariantContext vc : VCs ) { + if ( !mappedVCs.containsKey(vc.getType()) ) + mappedVCs.put(vc.getType(), new ArrayList()); + mappedVCs.get(vc.getType()).add(vc); + } + + return mappedVCs; + } + private static class AlleleMapper { private VariantContext vc = null; private Map map = null; 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 00ee44f75..c5fd9bcbe 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 @@ -80,9 +80,9 @@ public class CombineVariantsIntegrationTest extends WalkerTest { @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", "", "5b82f37df1f5ba40f0474d71c94142ec", false); } + @Test public void combine2Indels() { combine2("CEU.dindel.vcf4.trio.2010_06.indel.genotypes.vcf", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "cba8f749f2444d69a54553b15328ed47", false); } - @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "c58dca482bf97069eac6d9f1a07a2cba", false); } + @Test public void combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "78b169cf9955c9fd01340292d5ba2dca", false); } @Test public void uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c", true); } @@ -100,7 +100,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + " -genotypeMergeOptions UNIQUIFY -L 1"), 1, - Arrays.asList("8b78339ccf7a5a5a837f79e88a3a38e5")); + Arrays.asList("0e475c98d5152fb12eb17f3907b849a9")); executeTest("threeWayWithRefs", spec); } From 92fa41045070ef1d938a0d4cc600f500ba1137a9 Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Mon, 18 Jul 2011 13:43:34 -0400 Subject: [PATCH 174/214] Check that it's a valid bam file before parsing or bad things can happen --- .../gatk/walkers/diffengine/BAMDiffableReader.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java index 15b16ca6b..a1c043365 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java @@ -29,9 +29,7 @@ import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecordIterator; import net.sf.samtools.util.BlockCompressedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.*; import java.util.Arrays; @@ -102,8 +100,10 @@ public class BAMDiffableReader implements DiffableReader { final byte[] BAM_MAGIC = "BAM\1".getBytes(); final byte[] buffer = new byte[BAM_MAGIC.length]; try { - FileInputStream fstream = new FileInputStream(file); - new BlockCompressedInputStream(fstream).read(buffer,0,BAM_MAGIC.length); + InputStream fstream = new BufferedInputStream(new FileInputStream(file)); + if ( !BlockCompressedInputStream.isValidFile(fstream) ) + return false; + new BlockCompressedInputStream(fstream).read(buffer, 0, BAM_MAGIC.length); return Arrays.equals(buffer, BAM_MAGIC); } catch ( IOException e ) { return false; From 83ba2c066a75ac7ebb10a60934b4dfa7dc89c2cf Mon Sep 17 00:00:00 2001 From: Eric Banks Date: Mon, 18 Jul 2011 13:59:02 -0400 Subject: [PATCH 175/214] Making it deterministic --- .../gatk/walkers/variantutils/CombineVariants.java | 12 +++++++----- .../variantutils/CombineVariantsIntegrationTest.java | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java index 6970431ff..9c2a520ef 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.apache.poi.hpsf.Variant; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; @@ -177,11 +178,12 @@ public class CombineVariants extends RodWalker { mergedVCs.add(VariantContextUtils.masterMerge(vcs, "master")); } else { Map> VCsByType = VariantContextUtils.separateVariantContextsByType(vcs); - // iterate over the keys (and not the values) so that it's deterministic - for ( VariantContext.Type type : VCsByType.keySet() ) { - mergedVCs.add(VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(), VCsByType.get(type), - priority, filteredRecordsMergeType, genotypeMergeOption, true, printComplexMerges, - ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC)); + // iterate over the types so that it's deterministic + for ( VariantContext.Type type : VariantContext.Type.values() ) { + if ( VCsByType.containsKey(type) ) + mergedVCs.add(VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(), VCsByType.get(type), + priority, filteredRecordsMergeType, genotypeMergeOption, true, printComplexMerges, + ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC)); } } 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 c5fd9bcbe..904a5b29b 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 @@ -80,9 +80,9 @@ public class CombineVariantsIntegrationTest extends WalkerTest { @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", "", "cba8f749f2444d69a54553b15328ed47", false); } + @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 combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "78b169cf9955c9fd01340292d5ba2dca", false); } + @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 uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c", true); } @@ -100,7 +100,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + " -genotypeMergeOptions UNIQUIFY -L 1"), 1, - Arrays.asList("0e475c98d5152fb12eb17f3907b849a9")); + Arrays.asList("1de95f91ca15d2a8856de35dee0ce33e")); executeTest("threeWayWithRefs", spec); } From 45702d308438299cb2cb876ed80a89f2c84a5a72 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 15:40:15 -0400 Subject: [PATCH 178/214] Now supports a mode where the primary key isn't sorted. In this case the records are displayed in the order in which they are added to to the table. --- .../sting/gatk/report/GATKReport.java | 6 ++++- .../sting/gatk/report/GATKReportTable.java | 26 +++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java index f4c565318..59d496828 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java @@ -100,7 +100,11 @@ public class GATKReport { * @param tableDescription the description of the table */ public void addTable(String tableName, String tableDescription) { - GATKReportTable table = new GATKReportTable(tableName, tableDescription); + addTable(tableName, tableDescription, true); + } + + public void addTable(String tableName, String tableDescription, boolean sortByPrimaryKey) { + GATKReportTable table = new GATKReportTable(tableName, tableDescription, sortByPrimaryKey); tables.put(tableName, table); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java index 0e503f92a..f7ea25696 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java @@ -3,9 +3,7 @@ package org.broadinstitute.sting.gatk.report; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.PrintStream; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.TreeSet; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -96,8 +94,9 @@ public class GATKReportTable { private String tableDescription; private String primaryKeyName; - private TreeSet primaryKeyColumn; + private Collection primaryKeyColumn; private boolean primaryKeyDisplay; + boolean sortByPrimaryKey = true; private LinkedHashMap columns; @@ -121,12 +120,17 @@ public class GATKReportTable { * @param tableDescription the description of the table */ public GATKReportTable(String tableName, String tableDescription) { - if (!isValidName(tableName)) { + this(tableName, tableDescription, true); + } + + public GATKReportTable(String tableName, String tableDescription, boolean sortByPrimaryKey) { + if (!isValidName(tableName)) { throw new ReviewedStingException("Attempted to set a GATKReportTable name of '" + tableName + "'. GATKReportTable names must be purely alphanumeric - no spaces or special characters are allowed."); } this.tableName = tableName; this.tableDescription = tableDescription; + this.sortByPrimaryKey = sortByPrimaryKey; columns = new LinkedHashMap(); } @@ -137,20 +141,14 @@ public class GATKReportTable { * @param primaryKeyName the name of the primary key column */ public void addPrimaryKey(String primaryKeyName) { - if (!isValidName(primaryKeyName)) { - throw new ReviewedStingException("Attempted to set a GATKReportTable primary key name of '" + primaryKeyName + "'. GATKReportTable primary key names must be purely alphanumeric - no spaces or special characters are allowed."); - } - - this.primaryKeyName = primaryKeyName; - - primaryKeyColumn = new TreeSet(); - primaryKeyDisplay = true; + addPrimaryKey(primaryKeyName, true); } /** * Add an optionally visible primary key column. This becomes the unique identifier for every column in the table, and will always be printed as the first column. * * @param primaryKeyName the name of the primary key column + * @param display should this primary key be displayed? */ public void addPrimaryKey(String primaryKeyName, boolean display) { if (!isValidName(primaryKeyName)) { @@ -159,7 +157,7 @@ public class GATKReportTable { this.primaryKeyName = primaryKeyName; - primaryKeyColumn = new TreeSet(); + primaryKeyColumn = sortByPrimaryKey ? new TreeSet() : new LinkedList(); primaryKeyDisplay = display; } From 782a05e9b5413c35d8156e3e558994286b61a228 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 15:43:01 -0400 Subject: [PATCH 179/214] Support for sorting the diff output in reverse order. --- .../gatk/walkers/diffengine/DiffEngine.java | 38 +++++++++++++------ .../walkers/diffengine/DiffObjectsWalker.java | 1 + 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index e3910ef11..89e20dad1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -143,7 +143,7 @@ public class DiffEngine { * Not that only pairs of the same length are considered as potentially equivalent * * @param params determines how we display the items - * @param diffs + * @param diffs the list of differences to summarize */ public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { printSummaryReport(summarizeDifferences(diffs), params ); @@ -207,14 +207,7 @@ public class DiffEngine { } protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { - GATKReport report = new GATKReport(); - final String tableName = "diffences"; - report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine for more information"); - GATKReportTable table = report.getTable(tableName); - table.addPrimaryKey("Difference", true); - table.addColumn("NumberOfOccurrences", 0); - table.addColumn("SpecificDifference", 0); - + List toShow = new ArrayList(); int count = 0, count1 = 0; for ( Difference diff : sortedSummaries ) { if ( diff.getCount() < params.minSumDiffToShow ) @@ -230,10 +223,26 @@ public class DiffEngine { break; } - table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); - table.set(diff.getPath(), "SpecificDifference", diff.valueDiffString()); + toShow.add(diff); } + // if we want it in descending order, reverse the list + if ( ! params.descending ) { + Collections.reverse(toShow); + } + + // now that we have a specific list of values we want to show, display them + GATKReport report = new GATKReport(); + final String tableName = "diffences"; + report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine for more information", false); + GATKReportTable table = report.getTable(tableName); + table.addPrimaryKey("Difference", true); + table.addColumn("NumberOfOccurrences", 0); + table.addColumn("ExampleDifference", 0); + for ( Difference diff : toShow ) { + table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); + table.set(diff.getPath(), "ExampleDifference", diff.valueDiffString()); + } table.write(params.out); } @@ -252,7 +261,7 @@ public class DiffEngine { * commonPostfixLength: how many parts are shared at the end, suppose its 2 * We want to create a string *.*.C.D * - * @param parts + * @param parts the separated path values [above without .] * @param commonPostfixLength * @return */ @@ -351,6 +360,7 @@ public class DiffEngine { int maxItemsToDisplay = 0; int maxCountOneItems = 0; int minSumDiffToShow = 0; + boolean descending = true; public SummaryReportParams(PrintStream out, int maxItemsToDisplay, int maxCountOneItems, int minSumDiffToShow) { this.out = out; @@ -358,5 +368,9 @@ public class DiffEngine { this.maxCountOneItems = maxCountOneItems; this.minSumDiffToShow = minSumDiffToShow; } + + public void setDescending(boolean descending) { + this.descending = descending; + } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java index 8e362dcc4..fba6549fb 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -112,6 +112,7 @@ public class DiffObjectsWalker extends RodWalker { } DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(out, MAX_DIFFS, MAX_COUNT1_DIFFS, minCountForDiff); + params.setDescending(false); diffEngine.reportSummarizedDifferences(diffs, params); } } \ No newline at end of file From c05451047c93ebc56cd022415cdc613114bb4e7e Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 15:43:52 -0400 Subject: [PATCH 180/214] Support for multiple records at the same site. The first record gets chr:start, and subsequent records get chr:start_2, chr:start_3, etc. --- .../sting/gatk/walkers/diffengine/VCFDiffableReader.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index df2a5cda1..77a992ce0 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -72,13 +72,19 @@ public class VCFDiffableReader implements DiffableReader { } String line = lineReader.readLine(); - int count = 0; + int count = 0, nRecordsAtPos = 1; + String prevName = ""; while ( line != null ) { if ( count++ > maxElementsToRead && maxElementsToRead != -1) break; VariantContext vc = (VariantContext)vcfCodec.decode(line); String name = vc.getChr() + ":" + vc.getStart(); + if ( name.equals(prevName) ) { + name += "_" + ++nRecordsAtPos; + } else { + prevName = name; + } DiffNode vcRoot = DiffNode.empty(name, root); // add fields From 8f0badc52ba16bd7b303b10e245fedbb7a306d1d Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 15:44:21 -0400 Subject: [PATCH 181/214] Updating md5s, as the diffobjects walker now emits the summary in reverse order. --- .../gatk/walkers/diffengine/DiffObjectsIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java index cca1eccb4..77159d9c2 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java @@ -52,8 +52,8 @@ public class DiffObjectsIntegrationTest extends WalkerTest { @DataProvider(name = "data") public Object[][] createData() { - new TestParams(testDir + "diffTestMaster.vcf", testDir + "diffTestTest.vcf", "fb7f4e011487ca56bce865ae5468cdc5"); - new TestParams(testDir + "exampleBAM.bam", testDir + "exampleBAM.simple.bam", "423cec3befbf0a72d8bc3757ee628fc4"); + new TestParams(testDir + "diffTestMaster.vcf", testDir + "diffTestTest.vcf", "4d9f4636de05b93c354d05011264546e"); + new TestParams(testDir + "exampleBAM.bam", testDir + "exampleBAM.simple.bam", "37e6efd833b5cd6d860a9df3df9713fc"); return TestParams.getTests(TestParams.class); } From 9b446020f95f2176092bfddf98a1053e259d7915 Mon Sep 17 00:00:00 2001 From: Khalid Shakir Date: Mon, 18 Jul 2011 21:49:03 -0400 Subject: [PATCH 188/214] Using picard implementations for accessing aggregation directories. Added more utilities to PicardPrivate. Revved picard. --- public/packages/PicardPrivate.xml | 2 ++ .../picard-private-parts-1954.jar | Bin 36047 -> 0 bytes .../picard-private-parts-1954.xml~ | 3 --- .../picard-private-parts-1959.jar | Bin 0 -> 347579 bytes ...1954.xml => picard-private-parts-1959.xml} | 2 +- .../repository/net.sf/picard-1.48.889.xml | 3 --- ...icard-1.48.889.jar => picard-1.49.895.jar} | Bin 1106870 -> 1106752 bytes .../repository/net.sf/picard-1.49.895.xml | 3 +++ settings/repository/net.sf/sam-1.48.889.xml | 3 --- .../{sam-1.48.889.jar => sam-1.49.895.jar} | Bin 536180 -> 536187 bytes settings/repository/net.sf/sam-1.49.895.xml | 3 +++ 11 files changed, 9 insertions(+), 10 deletions(-) delete mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1954.jar delete mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1954.xml~ create mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1959.jar rename settings/repository/edu.mit.broad/{picard-private-parts-1954.xml => picard-private-parts-1959.xml} (58%) delete mode 100644 settings/repository/net.sf/picard-1.48.889.xml rename settings/repository/net.sf/{picard-1.48.889.jar => picard-1.49.895.jar} (95%) create mode 100644 settings/repository/net.sf/picard-1.49.895.xml delete mode 100644 settings/repository/net.sf/sam-1.48.889.xml rename settings/repository/net.sf/{sam-1.48.889.jar => sam-1.49.895.jar} (95%) create mode 100644 settings/repository/net.sf/sam-1.49.895.xml diff --git a/public/packages/PicardPrivate.xml b/public/packages/PicardPrivate.xml index 110b41d3f..581c47979 100644 --- a/public/packages/PicardPrivate.xml +++ b/public/packages/PicardPrivate.xml @@ -7,6 +7,8 @@ + + diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1954.jar b/settings/repository/edu.mit.broad/picard-private-parts-1954.jar deleted file mode 100644 index 67637d3d9311d10767c5758006471a628c5a8a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36047 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 - - diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1959.jar b/settings/repository/edu.mit.broad/picard-private-parts-1959.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae11e636b1415998685bfacb36398b34f1a1492c GIT binary patch literal 347579 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

+G{xAg?}Hksz=Sb>W44 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

pDq=%+^yW?exD~9Ak$05js!J2lIo5=@x8j3-) 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 |!MVlA< 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 c}t)RlBWI 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 literal 0 HcmV?d00001 diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1954.xml b/settings/repository/edu.mit.broad/picard-private-parts-1959.xml similarity index 58% rename from settings/repository/edu.mit.broad/picard-private-parts-1954.xml rename to settings/repository/edu.mit.broad/picard-private-parts-1959.xml index c702fd6e5..e7c7e3a21 100644 --- a/settings/repository/edu.mit.broad/picard-private-parts-1954.xml +++ b/settings/repository/edu.mit.broad/picard-private-parts-1959.xml @@ -1,3 +1,3 @@ - + diff --git a/settings/repository/net.sf/picard-1.48.889.xml b/settings/repository/net.sf/picard-1.48.889.xml deleted file mode 100644 index 877687930..000000000 --- a/settings/repository/net.sf/picard-1.48.889.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/picard-1.48.889.jar b/settings/repository/net.sf/picard-1.49.895.jar similarity index 95% rename from settings/repository/net.sf/picard-1.48.889.jar rename to settings/repository/net.sf/picard-1.49.895.jar index 1b725dde5da26bac05010bc371775cdb890c323c..3ee1f209056b2b0a973d478f5e1ecb1a4971a3c7 100644 GIT binary patch delta 18811 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 (-r<;2kc=Gm3dj>o7~J#BUKJ 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 an}-aP{n(RpaQCM2UD>L=9uFr? + + diff --git a/settings/repository/net.sf/sam-1.48.889.xml b/settings/repository/net.sf/sam-1.48.889.xml deleted file mode 100644 index 8046a0c02..000000000 --- a/settings/repository/net.sf/sam-1.48.889.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/sam-1.48.889.jar b/settings/repository/net.sf/sam-1.49.895.jar similarity index 95% rename from settings/repository/net.sf/sam-1.48.889.jar rename to settings/repository/net.sf/sam-1.49.895.jar index 33ae4aa7d2e0652c767092e89fef9e93c92887f2..c55ab0b7274ad3a7f911d12050ec71c44f13b0f5 100644 GIT binary patch delta 7726 zcmaJm30#%M_A~P>Gxu_V3tYC#E+7ghkoj^&5OWv7G&L7AMROMyOe=v(ZBa8RPNJrk zY37z%-Lwp>o>^96*@jElX61&}`RltFZ5)4HZ6?0TBXNp&@9K>^V2Laub2UFs$t=q| zwtS}zp`Et!7-vek9}C&l-~8Angx;*4HL#nPAc~O_h(lI1RBIU&!{Uy?Q z;U!&$cV$G{=+hk#I^6*R&XJJvtl_>8vWNKXn)dwJ4pOvWe{!%y79V{#R3hCjy|0pN zx;)R6l*eyul`cK07>~CLlBdE49|@P(ltkQL%6qDshXT$5b#w9JxeINhGBsOp# z&WVs%ky2ccNABdRF6pcoXJcI2ZdR8W|B*ci4m>|^JsLp*#L_OoMu z?BudIzy}B7Ac|e$BUn5_#3NLY!%BQ`IClHs2plOMQFauDqXj2MJYp%1qqvzJC7>pT z1*NO_$Pr2LM-SXhVD}5!{Sg=jIw;~aQAeuUzo4m<%*bl^$o zngdTpOC5L$p6bBU(BE+KC{2Rt2e2F7Ttp(Z>9`0!TSS^WXK*R>JUZgQGtu7;JPU3u zB0YR&JMau#>_8s$etGs22{7{+(z^8=bkKnx#d949&{7^;kNyrk4;>b?#~i2>jd$S3 z#p4M)pW>48fWE=bAB5pjTt@Me4*V2;x_sZ8Zc*kg2VQ^|I?!Lj=OR?^K<80C?6{yO zwxsx32YwzecHkwLdvQ%1T|7E%!nCvpX3dx|b^PEN6J{08aNrm4GRVl``$YO5rU_YL zx&i$TQ9Hc)ED2*T;^hu>5nY1wZS;^}Eu(cCipw4NCH%5Twbp^Apz@F!>wU#7k&3Vq7e3IEp`{Tte^AaUA$^cjp;K}Ki?(C4ss1?led1v;n7tjD)=Zm#;JG1Pen)3ad>MLaT_N%<7Z{~#42vM zj(?v-zd+DxUIM?O-}om+zjJ$qtI5E`KmK7T82y1xae-;vH$i`LjL#;VSWQm(oJME( zXB20hg_>81%Xu!;#Ogmz7gK%tRZ`LW0(zZ)irCvDvkAEoq39g_B>(`P(dQ--I3!Ljn zxT^<#20xb-ez!3ZM{VbIWQC7BVSd^|mQaaJc!xZ$j^saglZbmI%{)i$R|iY(1+qXL z$=_cjISPxsOwOxA%+IFPD>>||MTJP+xOnYeMH|vwn~? zAsy=0m?7n(>TGbxmod-%y|uCGpxctGJ*keEjC}1_i8SgwtW_%KTffmxslcID>!##R z9MeXr(=YpXEnA)E3r=enlBDk3AiY?fXwE&wwX=9HG0P8fyXtO84`895){**r*;{$G zC+jcDzQvQ%RllZk$n35^rc8gBtG89h?&ZPyYpQ)%@vuHZ(HbV{BUJc9r|YZLcs9(| z-*(Cnwk*`YxJL!ETaQ+WRPNFDBud)gIvpoSY?yBJQ7y`*0OOFFsmG#>m!jl>zN;WI zb~ztA0U3a^jOI|+*c=MNBi{2K^ft}2!#hj=|mC^c~0VjyijI(GO~<#*_?R> z4>E?> zrAyM~D#KruiuswbN9BC>nbNmf^4MEiIaePr?4ENqMi&)(`uE0rsZ#kbV$M{F7dXr# ziuXDFVBRq}0Dwj`vVWy~Mwxh=Eq0Ha-*33~@_7CPBl~Usg(@$ak zf0%pJTKMvcS)i6}>ju;6e8X;;37zG@cIiOV)M_m1N!7*1GrbQzqt-&fU}{%sO)j7_ zePxYQJNE~j(-0Dn1BYvjFi0f9S7}GdD!EDrOXR1kv``}1*XU%4ynP#q zX`q87WljSfB9U(zXn%<$T&MXGdGtEXlgPpAbc{qYZqP{*S#yJq6iCHQ`iLYYmL!kR4Slbft?K5C-Fgz(FetdD$8 zWPFe3-yWvowP7|uS{sR3H;KG~*+7Zh#H^=8dJv}4T|<~k?h>)o@7LG^Qf8%QXvJvqbWW;MN z;e0HU+a;WJaMuHxOB4Lgeo^yiuG&5cXSp6xVmOnV-SfYx5|Y{<1_qy1Q%lx-c<{=wHu5E2mMC7Y5jWn-b#&x-v8 zKOUd`uw^1|DzU>Ue=9!Ha5HNKuP6a+yzFfJ#!}e+o#wi$uyNzS4ul6Nzjs1u7H+a@svQ3 zleLq&TbwL{%nX9KKo(rS_8}8~b28OM+!CBK5rV^KB7nuq>VCKBr49W<5fb1X^QL4e zT3-K~nlovBa{xEexvStL!r1`kl98o-+#>uwUS$HjBWnk-fmUS00=epYxiT`S%hhcu z|18jIeR`Ymyj}&wdL?)c_64#u8Sr6u*oipaDM;`VDt}nnE-lmbW#Y$=4L=PG~h*r|^7`RTh;&Jk|%M-{Hr?8E#LG0CsWKrP+5_T(y}0vNqIZ zZ5N9RyG&Yi4?+UGSI&lomeN8!7`AhHY40OpZ{}{rs&_GYrb0k4r@pjDQY$X#;V?Yd z@?Ru4`E|EBcG$`}vhLUaa4gW*7a;-Od&(ew9}WoO(?0(uVbI7GisfQk?+md%3a=xFh3I`i&xv2(gm0hjM|l zT`Ymy4YlR{jf|*ZK9K^v2Pz-RLfL)N`v=0nmXQY3jWyh|y@uVRKp2tZZo$D=2vqSGa62ZDO(lcoE%%C$dS-7+;Wj8==YQx zsA83oD1OE?VHvUfWJd6bn79c>xLGJ154WgixCU7*sS&_?abLNo%3QMCECMfv;ck{G zzgP2b()fNw1atqNrSQ(V%E_I08!4cb*VNn#O>Wjn8W0g^A5#pYYwqdEKXWoJ%u&Q;yt;5`@O6Vg;7y#pj^GD zPOOWX$%|P)TQ8yXKw&QfuE$$m+|k_2mA1-D=`DVQ-(k%ctmIt9+7@g2Lrt``2JT)w z{<(Fv0vuy)U7cdM{(B>Yeptn5GeC}_jIV#=8+Io@!v&;z#pf=B(XlM7yl%V`j>T9p zUJ!<6jguUxpJ3V`E!GO;K>Kd}+Y+7?x@zjmh?Q;}eC zwg}EURfvf)BUpsM^{qsrF4%LZPJskgX*Ap|G z2nq1s0c>y~(b@shn{ylcuiUobS8Ig>*A>uHP7%$5zx(R09!PugfnmPo9Uv2r^fC;|NByYsic zY!Xx@v23~I1J0~^W;s7>1a!G0B4%_V#I&$(6w_O9FGB}YDCd_*HzZb_%RsWk`0h&T@F%&1oZO~N-3g{T|{%?tiP3RMlyFc zdafk5gtc?23l=9^yp@7y&X<8CL0z&H!?SBH9pFDJA_3l`@HYgcSfdc^sNY%1J0$^K zy<+G9MJX&_4%HxZ#{C>$C<3~B3Ec}PQ><%L`&1r9v#m0UsESmU0RG$fuilY79GUIG zEsuS$oOk;I(!GrA*`<^qJ%#yI@H0U=eLL@Rcq;Fc1bFX3m5|YjwUI_=M_t@Jh#yM= zQoM|^udUL!`vd%)eSvTNB{Di3UPiYu3dabcIhB`Y(Iq BJ{bT2 delta 7901 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 diff --git a/settings/repository/net.sf/sam-1.49.895.xml b/settings/repository/net.sf/sam-1.49.895.xml new file mode 100644 index 000000000..0436ce881 --- /dev/null +++ b/settings/repository/net.sf/sam-1.49.895.xml @@ -0,0 +1,3 @@ + + + From e6d306458c8882aa02724ebd591bd0ccc48b2af2 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Tue, 19 Jul 2011 14:36:20 -0400 Subject: [PATCH 192/214] Merge bug fixes --- .../sting/gatk/walkers/variantutils/VariantsToTable.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 3fe626f77..39358dad5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -24,11 +24,8 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -<<<<<<< HEAD import org.broadinstitute.sting.utils.MathUtils; import org.broadinstitute.sting.utils.variantcontext.VariantContext; -======= ->>>>>>> 9de6bab260a6bfca0aabf2c9d650dd2dad3ebe20 import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -38,7 +35,6 @@ import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.PrintStream; From 6181d1e4cbd585458139fba909bad28b46effbaf Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Tue, 19 Jul 2011 14:42:11 -0400 Subject: [PATCH 193/214] Fixed integration test for VariantsToTable: now the * in REF column is not output --- .../walkers/variantutils/VariantsToTableIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java old mode 100644 new mode 100755 index 72647c8e1..1db712353 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java @@ -44,7 +44,7 @@ public class VariantsToTableIntegrationTest extends WalkerTest { @Test(enabled = true) public void testComplexVariantsToTable() { WalkerTestSpec spec = new WalkerTestSpec(variantsToTableCmd(" -AMD"), - Arrays.asList("b2a3712c1bfad8f1383ffada8b5017ba")); + Arrays.asList("e8f771995127b727fb433da91dd4ee98")); executeTest("testComplexVariantsToTable", spec).getFirst(); } From 07e716d23a7234743692f5e8a031611f7a72ca3d Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Tue, 19 Jul 2011 15:21:47 -0400 Subject: [PATCH 194/214] PickSequenomProbes2 expanded functionality: lowercasing based on sequence uniqueness, preserving reference base prior to indel (not a part of the VC as I thought it was), masking deletion bases with 'N's, flanking insertion with 'N's, output is a fasta formatted file. Renamed to ValidationAmplicons since this is really not for picking sequenom probes, but for generating amplicon sequence from which other applications (like sequenom) can choose PCR primers. Moved from private to public. --- .../validation/ValidationAmplicons.java | 398 ++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100755 public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java new file mode 100755 index 000000000..3a5213868 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java @@ -0,0 +1,398 @@ +package org.broadinstitute.sting.gatk.walkers.validation; + +import net.sf.picard.reference.ReferenceSequenceFileFactory; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMSequenceDictionary; +import org.broadinstitute.sting.alignment.Alignment; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.bwa.BWTFiles; +import org.broadinstitute.sting.alignment.bwa.c.BWACAligner; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.refdata.features.table.TableFeature; +import org.broadinstitute.sting.gatk.walkers.*; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.Utils; + +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: 6/13/11 + * Time: 2:12 PM + * To change this template use File | Settings | File Templates. + */ +@Requires(value={DataSource.REFERENCE}, referenceMetaData={@RMD(name="ProbeIntervals",type=TableFeature.class), +@RMD(name="ValidateAlleles",type=VariantContext.class),@RMD(name="MaskAlleles",type=VariantContext.class)}) +public class PickSequenomProbes2 extends RodWalker { + + @Argument(doc="Lower case SNPs rather than replacing with 'N'",fullName="lowerCaseSNPs",required=false) + boolean lowerCaseSNPs = false; + + @Argument(doc="Size of the virtual primer to use for lower-casing regions with low specificity",fullName="virtualPrimerSize",required=false) + int virtualPrimerSize = 20; + + @Argument(doc="Monomorphic sites in the mask file will be treated as filtered",fullName="filterMonomorphic",required=false) + boolean filterMonomorphic = false; + + GenomeLoc prevInterval; + GenomeLoc allelePos; + String probeName; + StringBuilder sequence; + StringBuilder rawSequence; + boolean sequenceInvalid; + List invReason; + int indelCounter; + + @Argument(fullName="target_reference",shortName="target_ref",doc="The reference to which reads in the source file should be aligned. Alongside this reference should sit index files " + + "generated by bwa index -d bwtsw. If unspecified, will default " + + "to the reference specified via the -R argument.",required=false) + private File targetReferenceFile = null; + + @Output + PrintStream out; + + BWACAligner aligner = null; + + private SAMFileHeader header = null; + + public void initialize() { + if(targetReferenceFile == null) + targetReferenceFile = getToolkit().getArguments().referenceFile; + BWTFiles bwtFiles = new BWTFiles(targetReferenceFile.getAbsolutePath()); + BWAConfiguration configuration = new BWAConfiguration(); + aligner = new BWACAligner(bwtFiles,configuration); + header = new SAMFileHeader(); + SAMSequenceDictionary referenceDictionary = + ReferenceSequenceFileFactory.getReferenceSequenceFile(targetReferenceFile).getSequenceDictionary(); + header.setSequenceDictionary(referenceDictionary); + header.setSortOrder(SAMFileHeader.SortOrder.unsorted); + } + + public Integer reduceInit() { + prevInterval = null; + sequence = null; + rawSequence = null; + sequenceInvalid = false; + probeName = null; + invReason = null; + indelCounter = 0; + return 0; + } + + public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + if ( tracker == null || ! tracker.hasROD("ProbeIntervals")) { return null; } + + GenomeLoc interval = ((TableFeature) tracker.getReferenceMetaData("ProbeIntervals",true).get(0)).getLocation(); + //logger.debug(interval); + if ( prevInterval == null || ! interval.equals(prevInterval) ) { + // we're in a new interval, we should: + // 1) print out previous data + // 2) reset internal data + // 3) instantiate traversal of this interval + + // step 1: + if ( prevInterval != null ) { + // there was a previous interval + validateSequence(); // ensure the sequence in the region is valid + // next line removed in favor of the one after + //lowerRepeats(); // change repeats in sequence to lower case + lowerNonUniqueSegments(); + print(); // print out the fasta sequence + } + + // step 2: + prevInterval = interval; + allelePos = null; + sequence = new StringBuilder(); + rawSequence = new StringBuilder(); + sequenceInvalid = false; + invReason = new LinkedList(); + logger.debug(Utils.join("\t",((TableFeature) tracker.getReferenceMetaData("ProbeIntervals",true).get(0)).getAllValues())); + probeName = ((TableFeature) tracker.getReferenceMetaData("ProbeIntervals",true).get(0)).getValue(1); + indelCounter = 0; + } + + // step 3 (or 1 if not new): + // build up the sequence + + VariantContext mask = tracker.getVariantContext(ref,"MaskAlleles",ref.getLocus()); + VariantContext validate = tracker.getVariantContext(ref,"ValidateAlleles",ref.getLocus()); + + if ( mask == null && validate == null ) { + if ( indelCounter > 0 ) { + sequence.append('N'); + indelCounter--; + } else { + sequence.append(Character.toUpperCase((char) ref.getBase())); + } + rawSequence.append(Character.toUpperCase((char) ref.getBase())); + } else if ( validate != null ) { + // doesn't matter if there's a mask here too -- this is what we want to validate + if ( validate.isFiltered() ) { + logger.warn("You are attempting to validate a filtered site. Why are you attempting to validate a filtered site? You should not be attempting to validate a filtered site."); + sequenceInvalid = true; + invReason.add("SITE_IS_FILTERED"); + } + if ( validate.isIndel() ) { + sequence.append(Character.toUpperCase((char)ref.getBase())); + rawSequence.append(Character.toUpperCase((char)ref.getBase())); + } + sequence.append('['); + sequence.append(validate.getAlternateAllele(0).toString()); + sequence.append('/'); + sequence.append(validate.getReference().toString()); + sequence.append(']'); + // do this to the raw sequence to -- the indeces will line up that way + rawSequence.append('['); + rawSequence.append(validate.getAlternateAllele(0).getBaseString()); + rawSequence.append('/'); + rawSequence.append(validate.getReference().getBaseString()); + rawSequence.append(']'); + allelePos = ref.getLocus(); + if ( indelCounter > 0 ) { + logger.warn("An indel event overlaps the event to be validated. This completely invalidates the probe."); + sequenceInvalid = true; + invReason.add("INDEL_OVERLAPS_VALIDATION_SITE"); + if ( validate.isSNP() ) { + indelCounter--; + } else { + indelCounter -= validate.getEnd()-validate.getStart(); + } + } + } else /* (mask != null && validate == null ) */ { + if ( ! mask.isSNP() && ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphic() )) { + logger.warn("Mask Variant Context on the following warning line is not a SNP. Currently we can only mask out SNPs. This probe will not be designed."); + logger.warn(String.format("%s:%d-%d\t%s\t%s",mask.getChr(),mask.getStart(),mask.getEnd(),mask.isInsertion() ? "INS" : "DEL", Utils.join(",",mask.getAlleles()))); + sequenceInvalid = true; + invReason.add(mask.isInsertion() ? "INSERTION" : "DELETION"); + // note: indelCounter could be > 0 (could have small deletion within larger one). This always selects + // the larger event. + int indelCounterNew = mask.isInsertion() ? 2 : mask.getEnd()-mask.getStart(); + if ( indelCounterNew > indelCounter ) { + indelCounter = indelCounterNew; + } + //sequence.append((char) ref.getBase()); + //sequence.append(mask.isInsertion() ? 'I' : 'D'); + sequence.append("N"); + indelCounter--; + rawSequence.append(Character.toUpperCase((char) ref.getBase())); + } else if ( indelCounter > 0 ) { + // previous section resets the indel counter. Doesn't matter if there's a SNP underlying this, we just want to append an 'N' and move on. + sequence.append('N'); + indelCounter--; + rawSequence.append(Character.toUpperCase((char)ref.getBase())); + } else if ( ! mask.isFiltered() && ( ! filterMonomorphic || ! mask.isMonomorphic() )){ + logger.debug("SNP in mask found at " + ref.getLocus().toString()); + + if ( lowerCaseSNPs ) { + sequence.append(Character.toLowerCase((char) ref.getBase())); + } else { + sequence.append((char) BaseUtils.N); + } + + rawSequence.append(Character.toUpperCase((char) ref.getBase())); + } else if ( mask.isSNP() ) { + logger.debug("SNP in mask found at "+ref.getLocus().toString()+" but was either filtered or monomorphic"); + sequence.append((Character.toUpperCase((char) ref.getBase()))); + rawSequence.append(Character.toUpperCase((char) ref.getBase())); + } + } + + return 1; + } + + public Integer reduce(Integer i, Integer j) { + return 0; + } + + public void onTraversalDone(Integer fin ) { + validateSequence(); + lowerNonUniqueSegments(); + print(); + } + + public void validateSequence() { + // code for ensuring primer sequence is valid goes here + + // validate that there are no masked sites near to the variant site + String seq = sequence.toString(); + int start = seq.indexOf('[') - 4; + int end = seq.indexOf(']') + 5; + + if ( start < 50 ) { + logger.warn("There is not enough sequence before the start position of the probed allele for adequate probe design. This site will not be designed."); + sequenceInvalid = true; + invReason.add("START_TOO_CLOSE"); + } else if ( end > seq.length() - 50 ) { + logger.warn("There is not enough sequence after the end position of the probed allele fore adequate probe design. This site will not be desinged. "); + sequenceInvalid = true; + invReason.add("END_TOO_CLOSE"); + } else { + boolean maskNearVariantSite = false; + for ( int i = start; i < end; i++ ) { + maskNearVariantSite |= (seq.charAt(i) == 'N' || Character.isLowerCase(seq.charAt(i))); + } + + if ( maskNearVariantSite ) { + logger.warn("There is one (or more) mask variants within 4 basepair of the variant given for validation. This site will not be designed."); + sequenceInvalid = true; + invReason.add("VARIANT_TOO_NEAR_PROBE"); + } + } + + if ( seq.indexOf("[") != seq.lastIndexOf("[") ) { + logger.warn("Multiple probe variants were found within this interval. Please fix the definitions of the intervals so they do not overlap."); + sequenceInvalid = true; + invReason.add("MULTIPLE_PROBES"); + } + + if ( seq.indexOf("[") < 0 ) { + logger.warn("No variants in region were found. This site will not be designed."); + sequenceInvalid = true; + invReason.add("NO_VARIANTS_FOUND"); + } + } + + public void lowerNonUniqueSegments() { + if ( ! invReason.contains("MULTIPLE_PROBES") && !invReason.contains("NO_VARIANTS_FOUND") ) { + String leftFlank = rawSequence.toString().split("\\[")[0]; + String rightFlank = rawSequence.toString().split("\\]")[1]; + List badLeft = getBadIndeces(leftFlank); + List badRight = getBadIndeces(rightFlank); + // propagate lowercases into the printed sequence + for ( int idx = 0; idx < leftFlank.length(); idx++ ) { + while ( badLeft.size() > 0 && idx > badLeft.get(0) + virtualPrimerSize ) { + badLeft.remove(0); + } + + if ( badLeft.size() > 0 && badLeft.get(0) <= idx && idx <= badLeft.get(0) + virtualPrimerSize ) { + sequence.setCharAt(idx,Character.toLowerCase(sequence.charAt(idx))); + } + } + + int offset = 1 + rawSequence.indexOf("]"); + for ( int i= 0; i < rightFlank.length(); i++ ) { + int idx = i + offset; + while ( badRight.size() > 0 && i > badRight.get(0) + virtualPrimerSize ) { + //logger.debug("Removing "+badRight.get(0)+" because "+(badRight.get(0)+virtualPrimerSize)+" < "+i); + badRight.remove(0); + } + + if ( badRight.size() > 0 && badRight.get(0) <= i && i <= badRight.get(0) + virtualPrimerSize ) { + //logger.debug("Resetting character on right flank: "+idx+" "+i+" offset="+offset); + //logger.debug(sequence); + sequence.setCharAt(idx,Character.toLowerCase(sequence.charAt(idx))); + //logger.debug(sequence); + } + } + } + } + + private List getBadIndeces(String sequence) { + + List badLeftIndeces = new ArrayList(sequence.length()-virtualPrimerSize); + for ( int i = 0; i < sequence.length()-virtualPrimerSize ; i++ ) { + String toAlign = sequence.substring(i,i+virtualPrimerSize); + Iterable allAlignments = aligner.getAllAlignments(toAlign.getBytes()); + for ( Alignment[] alignments : allAlignments ) { + if ( alignments.length > 1 ) { + if ( alignments[0].getMappingQuality() == 0 ) { + // this region is bad -- multiple MQ alignments + badLeftIndeces.add(i); + } + } + } + } + + return badLeftIndeces; + } + + + /** + * Note- this is an old function - a proxy for identifying regions with low specificity to genome. Saved in case the alignment-based version + * turns out to be worse than just doing a simple repeat-lowering method. + */ + public void lowerRepeats() { + // convert to lower case low-complexity repeats, e.g. tandem k-mers + final int K_LIM = 8; + String seq = sequence.toString(); + StringBuilder newSequence = new StringBuilder(); + int start_pos = 0; + while( start_pos < seq.length() ) { + boolean broke = false; + for ( int length = K_LIM; length > 1; length -- ) { + //logger.debug(String.format("start1: %d end1: %d start2: %d end2: %d str: %d",start_pos,start_pos+length,start_pos+length,start_pos+2*length,seq.length())); + if ( start_pos + 2*length> seq.length() ) { + continue; + } + if ( equalsIgnoreNs(seq.substring(start_pos,start_pos+length),seq.substring(start_pos+length,start_pos+2*length)) ) { + newSequence.append(seq.substring(start_pos,start_pos+length).toLowerCase()); + newSequence.append(seq.substring(start_pos+length,start_pos+2*length).toLowerCase()); + start_pos += 2*length; + broke = true; + break; + } + } + + if ( ! broke ) { + newSequence.append(seq.substring(start_pos,start_pos+1)); + start_pos++; + } + + } + + if ( seq.indexOf("[") != seq.lastIndexOf("[") ) { + return; + } + + sequence = newSequence; + } + + public boolean equalsIgnoreNs(String one, String two) { + if ( one.length() != two.length() ) { return false; } + for ( int idx = 0; idx < one.length(); idx++ ) { + if ( Character.toUpperCase(one.charAt(idx)) != Character.toUpperCase(two.charAt(idx)) ) { + if ( Character.toUpperCase(one.charAt(idx)) != 'N' && Character.toUpperCase(two.charAt(idx)) != 'N' ) { + return false; + } + } + } + + //logger.debug(String.format("one: %s two: %s",one,two)); + + return true; + } + + public void print() { + String valid; + if ( sequenceInvalid ) { + valid = ""; + while ( invReason.size() > 0 ) { + String reason = invReason.get(0); + invReason.remove(reason); + int num = 1; + while ( invReason.contains(reason) ) { + num++; + invReason.remove(reason); + } + valid += String.format("%s=%d,",reason,num); + } + } else { + valid = "Valid"; + } + + String seqIdentity = sequence.toString().replace('n', 'N').replace('i', 'I').replace('d', 'D'); + out.printf(">%s %s %s%n%s%n", allelePos != null ? allelePos.toString() : "multiple", valid, probeName, seqIdentity); + } +} From baae381acb89ab6b57ab05d47e1cc182ecde2db1 Mon Sep 17 00:00:00 2001 From: David Roazen Date: Tue, 19 Jul 2011 18:38:53 -0400 Subject: [PATCH 198/214] Revert "Merge branch 'master' of ssh://gsa1/humgen/gsa-scr1/gsa-engineering/git/unstable" This reverts commit 039a6bb01f345322ce2be50ae3634308bb24e77e, reversing changes made to b9c9973d1c638dfc9f8c19b5eb845e99844f9d29. --- .../sting/gatk/report/GATKReport.java | 6 +- .../sting/gatk/report/GATKReportTable.java | 26 ++- .../sting/gatk/walkers/PrintReadsWalker.java | 44 ++++- .../gatk/walkers/annotator/IndelType.java | 24 ++- .../walkers/diffengine/BAMDiffableReader.java | 10 +- .../gatk/walkers/diffengine/DiffEngine.java | 38 ++-- .../walkers/diffengine/DiffObjectsWalker.java | 1 + .../walkers/diffengine/VCFDiffableReader.java | 8 +- .../walkers/variantutils/CombineVariants.java | 23 ++- .../walkers/variantutils/SelectVariants.java | 177 ++++++++++++++---- .../walkers/variantutils/VariantsToTable.java | 46 ++++- .../variantcontext/VariantContextUtils.java | 60 ++++-- .../DiffObjectsIntegrationTest.java | 4 +- .../CombineVariantsIntegrationTest.java | 6 +- .../VariantsToTableIntegrationTest.java | 2 +- public/packages/PicardPrivate.xml | 2 + .../qscripts/DataProcessingPipeline.scala | 60 +++--- .../qscripts/RecalibrateBaseQualities.scala | 12 +- .../picard-private-parts-1954.jar | Bin 36047 -> 0 bytes .../picard-private-parts-1954.xml~ | 3 - .../picard-private-parts-1959.jar | Bin 0 -> 347579 bytes ...1954.xml => picard-private-parts-1959.xml} | 2 +- .../repository/net.sf/picard-1.48.889.xml | 3 - ...icard-1.48.889.jar => picard-1.49.895.jar} | Bin 1106870 -> 1106752 bytes .../repository/net.sf/picard-1.49.895.xml | 3 + settings/repository/net.sf/sam-1.48.889.xml | 3 - .../{sam-1.48.889.jar => sam-1.49.895.jar} | Bin 536180 -> 536187 bytes settings/repository/net.sf/sam-1.49.895.xml | 3 + 28 files changed, 415 insertions(+), 151 deletions(-) mode change 100644 => 100755 public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java delete mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1954.jar delete mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1954.xml~ create mode 100644 settings/repository/edu.mit.broad/picard-private-parts-1959.jar rename settings/repository/edu.mit.broad/{picard-private-parts-1954.xml => picard-private-parts-1959.xml} (58%) delete mode 100644 settings/repository/net.sf/picard-1.48.889.xml rename settings/repository/net.sf/{picard-1.48.889.jar => picard-1.49.895.jar} (95%) create mode 100644 settings/repository/net.sf/picard-1.49.895.xml delete mode 100644 settings/repository/net.sf/sam-1.48.889.xml rename settings/repository/net.sf/{sam-1.48.889.jar => sam-1.49.895.jar} (95%) create mode 100644 settings/repository/net.sf/sam-1.49.895.xml diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java index f4c565318..59d496828 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java @@ -100,7 +100,11 @@ public class GATKReport { * @param tableDescription the description of the table */ public void addTable(String tableName, String tableDescription) { - GATKReportTable table = new GATKReportTable(tableName, tableDescription); + addTable(tableName, tableDescription, true); + } + + public void addTable(String tableName, String tableDescription, boolean sortByPrimaryKey) { + GATKReportTable table = new GATKReportTable(tableName, tableDescription, sortByPrimaryKey); tables.put(tableName, table); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java index 0e503f92a..f7ea25696 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReportTable.java @@ -3,9 +3,7 @@ package org.broadinstitute.sting.gatk.report; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import java.io.PrintStream; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.TreeSet; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -96,8 +94,9 @@ public class GATKReportTable { private String tableDescription; private String primaryKeyName; - private TreeSet primaryKeyColumn; + private Collection primaryKeyColumn; private boolean primaryKeyDisplay; + boolean sortByPrimaryKey = true; private LinkedHashMap columns; @@ -121,12 +120,17 @@ public class GATKReportTable { * @param tableDescription the description of the table */ public GATKReportTable(String tableName, String tableDescription) { - if (!isValidName(tableName)) { + this(tableName, tableDescription, true); + } + + public GATKReportTable(String tableName, String tableDescription, boolean sortByPrimaryKey) { + if (!isValidName(tableName)) { throw new ReviewedStingException("Attempted to set a GATKReportTable name of '" + tableName + "'. GATKReportTable names must be purely alphanumeric - no spaces or special characters are allowed."); } this.tableName = tableName; this.tableDescription = tableDescription; + this.sortByPrimaryKey = sortByPrimaryKey; columns = new LinkedHashMap(); } @@ -137,20 +141,14 @@ public class GATKReportTable { * @param primaryKeyName the name of the primary key column */ public void addPrimaryKey(String primaryKeyName) { - if (!isValidName(primaryKeyName)) { - throw new ReviewedStingException("Attempted to set a GATKReportTable primary key name of '" + primaryKeyName + "'. GATKReportTable primary key names must be purely alphanumeric - no spaces or special characters are allowed."); - } - - this.primaryKeyName = primaryKeyName; - - primaryKeyColumn = new TreeSet(); - primaryKeyDisplay = true; + addPrimaryKey(primaryKeyName, true); } /** * Add an optionally visible primary key column. This becomes the unique identifier for every column in the table, and will always be printed as the first column. * * @param primaryKeyName the name of the primary key column + * @param display should this primary key be displayed? */ public void addPrimaryKey(String primaryKeyName, boolean display) { if (!isValidName(primaryKeyName)) { @@ -159,7 +157,7 @@ public class GATKReportTable { this.primaryKeyName = primaryKeyName; - primaryKeyColumn = new TreeSet(); + primaryKeyColumn = sortByPrimaryKey ? new TreeSet() : new LinkedList(); primaryKeyDisplay = display; } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index a189c00b5..57ea5166a 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -30,10 +30,16 @@ import net.sf.samtools.SAMReadGroupRecord; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.utils.SampleUtils; import org.broadinstitute.sting.utils.baq.BAQ; +import java.io.File; +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; + +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; /** * Renders, in SAM/BAM format, all reads from the input data set in the order in which they appear * in the input file. It can dynamically merge the contents of multiple input BAM files, resulting @@ -52,6 +58,13 @@ public class PrintReadsWalker extends ReadWalker { String platform = null; // E.g. ILLUMINA, 454 @Argument(fullName = "number", shortName = "n", doc="Print the first n reads from the file, discarding the rest", required = false) int nReadsToPrint = -1; + @Argument(fullName="sample_file", shortName="sf", doc="File containing a list of samples (one per line). Can be specified multiple times", required=false) + public Set sampleFiles; + @Argument(fullName="sample_name", shortName="sn", doc="Sample name to be included in the analysis. Can be specified multiple times.", required=false) + public Set sampleNames; + + private TreeSet samplesToChoose = new TreeSet(); + private boolean NO_SAMPLES_SPECIFIED = false; /** * The initialize function. @@ -59,6 +72,17 @@ public class PrintReadsWalker extends ReadWalker { public void initialize() { if ( platform != null ) platform = platform.toUpperCase(); + + Collection samplesFromFile = SampleUtils.getSamplesFromFiles(sampleFiles); + samplesToChoose.addAll(samplesFromFile); + + if (sampleNames != null) + samplesToChoose.addAll(sampleNames); + + if(samplesToChoose.isEmpty()) { + NO_SAMPLES_SPECIFIED = true; + } + } /** @@ -85,6 +109,22 @@ public class PrintReadsWalker extends ReadWalker { if ( readPlatformAttr == null || !readPlatformAttr.toString().toUpperCase().contains(platform)) return false; } + if (!NO_SAMPLES_SPECIFIED ) { + // user specified samples to select + String readSample = read.getReadGroup().getSample(); + boolean found = false; + for (String sampleSelected : samplesToChoose) { + if (readSample.equalsIgnoreCase(sampleSelected)) { + found = true; + break; + } + + } + + if (!found) + return false; + } + // check if we've reached the output limit if ( nReadsToPrint == 0 ) { diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java index 12b48473d..2fd62ddf3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/IndelType.java @@ -24,11 +24,27 @@ public class IndelType implements InfoFieldAnnotation, ExperimentalAnnotation { public Map annotate(RefMetaDataTracker tracker, ReferenceContext ref, Map stratifiedContexts, VariantContext vc) { int run; - if ( vc.isIndel() && vc.isBiallelic() ) { + if (vc.isMixed()) { + Map map = new HashMap(); + map.put(getKeyNames().get(0), String.format("%s", "MIXED")); + return map; + + } + else if ( vc.isIndel() ) { String type=""; - ArrayList inds = IndelUtils.findEventClassificationIndex(vc, ref); - for (int k : inds) { - type = type+ IndelUtils.getIndelClassificationName(k)+"."; + if (!vc.isBiallelic()) + type = "MULTIALLELIC_INDEL"; + else { + if (vc.isInsertion()) + type = "INS."; + else if (vc.isDeletion()) + type = "DEL."; + else + type = "OTHER."; + ArrayList inds = IndelUtils.findEventClassificationIndex(vc, ref); + for (int k : inds) { + type = type+ IndelUtils.getIndelClassificationName(k)+"."; + } } Map map = new HashMap(); map.put(getKeyNames().get(0), String.format("%s", type)); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java index 15b16ca6b..a1c043365 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/BAMDiffableReader.java @@ -29,9 +29,7 @@ import net.sf.samtools.SAMRecord; import net.sf.samtools.SAMRecordIterator; import net.sf.samtools.util.BlockCompressedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.*; import java.util.Arrays; @@ -102,8 +100,10 @@ public class BAMDiffableReader implements DiffableReader { final byte[] BAM_MAGIC = "BAM\1".getBytes(); final byte[] buffer = new byte[BAM_MAGIC.length]; try { - FileInputStream fstream = new FileInputStream(file); - new BlockCompressedInputStream(fstream).read(buffer,0,BAM_MAGIC.length); + InputStream fstream = new BufferedInputStream(new FileInputStream(file)); + if ( !BlockCompressedInputStream.isValidFile(fstream) ) + return false; + new BlockCompressedInputStream(fstream).read(buffer, 0, BAM_MAGIC.length); return Arrays.equals(buffer, BAM_MAGIC); } catch ( IOException e ) { return false; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java index e3910ef11..89e20dad1 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffEngine.java @@ -143,7 +143,7 @@ public class DiffEngine { * Not that only pairs of the same length are considered as potentially equivalent * * @param params determines how we display the items - * @param diffs + * @param diffs the list of differences to summarize */ public void reportSummarizedDifferences(List diffs, SummaryReportParams params ) { printSummaryReport(summarizeDifferences(diffs), params ); @@ -207,14 +207,7 @@ public class DiffEngine { } protected void printSummaryReport(List sortedSummaries, SummaryReportParams params ) { - GATKReport report = new GATKReport(); - final String tableName = "diffences"; - report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine for more information"); - GATKReportTable table = report.getTable(tableName); - table.addPrimaryKey("Difference", true); - table.addColumn("NumberOfOccurrences", 0); - table.addColumn("SpecificDifference", 0); - + List toShow = new ArrayList(); int count = 0, count1 = 0; for ( Difference diff : sortedSummaries ) { if ( diff.getCount() < params.minSumDiffToShow ) @@ -230,10 +223,26 @@ public class DiffEngine { break; } - table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); - table.set(diff.getPath(), "SpecificDifference", diff.valueDiffString()); + toShow.add(diff); } + // if we want it in descending order, reverse the list + if ( ! params.descending ) { + Collections.reverse(toShow); + } + + // now that we have a specific list of values we want to show, display them + GATKReport report = new GATKReport(); + final String tableName = "diffences"; + report.addTable(tableName, "Summarized differences between the master and test files.\nSee http://www.broadinstitute.org/gsa/wiki/index.php/DiffEngine for more information", false); + GATKReportTable table = report.getTable(tableName); + table.addPrimaryKey("Difference", true); + table.addColumn("NumberOfOccurrences", 0); + table.addColumn("ExampleDifference", 0); + for ( Difference diff : toShow ) { + table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); + table.set(diff.getPath(), "ExampleDifference", diff.valueDiffString()); + } table.write(params.out); } @@ -252,7 +261,7 @@ public class DiffEngine { * commonPostfixLength: how many parts are shared at the end, suppose its 2 * We want to create a string *.*.C.D * - * @param parts + * @param parts the separated path values [above without .] * @param commonPostfixLength * @return */ @@ -351,6 +360,7 @@ public class DiffEngine { int maxItemsToDisplay = 0; int maxCountOneItems = 0; int minSumDiffToShow = 0; + boolean descending = true; public SummaryReportParams(PrintStream out, int maxItemsToDisplay, int maxCountOneItems, int minSumDiffToShow) { this.out = out; @@ -358,5 +368,9 @@ public class DiffEngine { this.maxCountOneItems = maxCountOneItems; this.minSumDiffToShow = minSumDiffToShow; } + + public void setDescending(boolean descending) { + this.descending = descending; + } } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java index 8e362dcc4..fba6549fb 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsWalker.java @@ -112,6 +112,7 @@ public class DiffObjectsWalker extends RodWalker { } DiffEngine.SummaryReportParams params = new DiffEngine.SummaryReportParams(out, MAX_DIFFS, MAX_COUNT1_DIFFS, minCountForDiff); + params.setDescending(false); diffEngine.reportSummarizedDifferences(diffs, params); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java index df2a5cda1..77a992ce0 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/diffengine/VCFDiffableReader.java @@ -72,13 +72,19 @@ public class VCFDiffableReader implements DiffableReader { } String line = lineReader.readLine(); - int count = 0; + int count = 0, nRecordsAtPos = 1; + String prevName = ""; while ( line != null ) { if ( count++ > maxElementsToRead && maxElementsToRead != -1) break; VariantContext vc = (VariantContext)vcfCodec.decode(line); String name = vc.getChr() + ":" + vc.getStart(); + if ( name.equals(prevName) ) { + name += "_" + ++nRecordsAtPos; + } else { + prevName = name; + } DiffNode vcRoot = DiffNode.empty(name, root); // add fields diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java index 837f352f8..9c2a520ef 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/CombineVariants.java @@ -25,6 +25,7 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.apache.poi.hpsf.Variant; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; @@ -149,7 +150,7 @@ public class CombineVariants extends RodWalker { // get all of the vcf rods at this locus // Need to provide reference bases to simpleMerge starting at current locus - Collection vcs = tracker.getAllVariantContexts(ref, null,context.getLocation(), true, false); + Collection vcs = tracker.getAllVariantContexts(ref, null, context.getLocation(), true, false); if ( sitesOnlyVCF ) { vcs = VariantContextUtils.sitesOnlyVariantContexts(vcs); @@ -172,17 +173,25 @@ public class CombineVariants extends RodWalker { if (minimumN > 1 && (vcs.size() - numFilteredRecords < minimumN)) return 0; - VariantContext mergedVC; + List mergedVCs = new ArrayList(); if ( master ) { - mergedVC = VariantContextUtils.masterMerge(vcs, "master"); + mergedVCs.add(VariantContextUtils.masterMerge(vcs, "master")); } else { - mergedVC = VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(),vcs, priority, filteredRecordsMergeType, - genotypeMergeOption, true, printComplexMerges, ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC); + Map> VCsByType = VariantContextUtils.separateVariantContextsByType(vcs); + // iterate over the types so that it's deterministic + for ( VariantContext.Type type : VariantContext.Type.values() ) { + if ( VCsByType.containsKey(type) ) + mergedVCs.add(VariantContextUtils.simpleMerge(getToolkit().getGenomeLocParser(), VCsByType.get(type), + priority, filteredRecordsMergeType, genotypeMergeOption, true, printComplexMerges, + ref.getBase(), SET_KEY, filteredAreUncalled, MERGE_INFO_WITH_MAX_AC)); + } } - //out.printf(" merged => %s%nannotated => %s%n", mergedVC, annotatedMergedVC); + for ( VariantContext mergedVC : mergedVCs ) { + // only operate at the start of events + if ( mergedVC == null ) + continue; - if ( mergedVC != null ) { // only operate at the start of events HashMap attributes = new HashMap(mergedVC.getAttributes()); // re-compute chromosome counts VariantContextUtils.calculateChromosomeCounts(mergedVC, attributes, false); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java index 1db692e9f..ac6797609 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/SelectVariants.java @@ -24,6 +24,16 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.broadinstitute.sting.commandline.Hidden; +import org.broadinstitute.sting.commandline.Input; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.codecs.vcf.*; +import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.text.XReadLines; +import org.broadinstitute.sting.utils.variantcontext.*; +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; +import org.broadinstitute.sting.utils.MendelianViolation; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Hidden; import org.broadinstitute.sting.commandline.Output; @@ -44,6 +54,9 @@ import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.lang.annotation.AnnotationFormatError; import java.util.*; /** @@ -91,6 +104,13 @@ public class SelectVariants extends RodWalker { @Argument(fullName="keepAFSpectrum", shortName="keepAF", doc="Don't include loci found to be non-variant after the subsetting procedure.", required=false) private boolean KEEP_AF_SPECTRUM = false; + @Hidden + @Argument(fullName="afFile", shortName="afFile", doc="The output recal file used by ApplyRecalibration", required=false) + private File AF_FILE = new File(""); + + @Hidden + @Argument(fullName="family_structure_file", shortName="familyFile", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) + private File FAMILY_STRUCTURE_FILE = null; @Argument(fullName="family_structure", shortName="family", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) private String FAMILY_STRUCTURE = ""; @@ -113,6 +133,9 @@ public class SelectVariants extends RodWalker { @Argument(fullName="selectIndels", shortName="indels", doc="Select only Indels.", required=false) private boolean SELECT_INDELS = false; + @Hidden + @Argument(fullName="outMVFile", shortName="outMVFile", doc="USE YAML FILE INSTEAD (-SM) !!! string formatted as dad+mom=child where these parameters determine which sample names are examined", required=false) + private String outMVFile = null; /* Private class used to store the intermediate variants in the integer random selection process */ private class RandomVariantStructure { @@ -140,7 +163,7 @@ public class SelectVariants extends RodWalker { private boolean DISCORDANCE_ONLY = false; private boolean CONCORDANCE_ONLY = false; - private MendelianViolation mv; + private Set mvSet = new HashSet(); /* default name for the variant dataset (VCF) */ private final String variantRodName = "variant"; @@ -155,8 +178,14 @@ public class SelectVariants extends RodWalker { private RandomVariantStructure [] variantArray; + /* Variables used for random selection with AF boosting */ + private ArrayList afBreakpoints = null; + private ArrayList afBoosts = null; + double bkDelta = 0.0; + private PrintStream outMVFileStream = null; + /** * Set up the VCF writer, the sample expressions and regexs, and the JEXL matcher @@ -212,10 +241,29 @@ public class SelectVariants extends RodWalker { CONCORDANCE_ONLY = concordanceRodName.length() > 0; if (CONCORDANCE_ONLY) logger.info("Selecting only variants concordant with the track: " + concordanceRodName); - if (MENDELIAN_VIOLATIONS) - mv = new MendelianViolation(getToolkit(), MENDELIAN_VIOLATION_QUAL_THRESHOLD); + if (MENDELIAN_VIOLATIONS) { + if ( FAMILY_STRUCTURE_FILE != null) { + try { + for ( final String line : new XReadLines( FAMILY_STRUCTURE_FILE ) ) { + MendelianViolation mv = new MendelianViolation(line, MENDELIAN_VIOLATION_QUAL_THRESHOLD); + if (samples.contains(mv.getSampleChild()) && samples.contains(mv.getSampleDad()) && samples.contains(mv.getSampleMom())) + mvSet.add(mv); + } + } catch ( FileNotFoundException e ) { + throw new UserException.CouldNotReadInputFile(AF_FILE, e); + } + if (outMVFile != null) + try { + outMVFileStream = new PrintStream(outMVFile); + } + catch (FileNotFoundException e) { + throw new UserException.CouldNotCreateOutputFile(outMVFile, "Can't open output file", e); } + } + else + mvSet.add(new MendelianViolation(getToolkit(), MENDELIAN_VIOLATION_QUAL_THRESHOLD)); + } else if (!FAMILY_STRUCTURE.isEmpty()) { - mv = new MendelianViolation(FAMILY_STRUCTURE, MENDELIAN_VIOLATION_QUAL_THRESHOLD); + mvSet.add(new MendelianViolation(FAMILY_STRUCTURE, MENDELIAN_VIOLATION_QUAL_THRESHOLD)); MENDELIAN_VIOLATIONS = true; } @@ -227,6 +275,33 @@ public class SelectVariants extends RodWalker { SELECT_RANDOM_FRACTION = fractionRandom > 0; if (SELECT_RANDOM_FRACTION) logger.info("Selecting approximately " + fractionRandom + "% of the variants at random from the variant track"); + + + if (KEEP_AF_SPECTRUM) { + try { + afBreakpoints = new ArrayList(); + afBoosts = new ArrayList(); + logger.info("Reading in AF boost table..."); + boolean firstLine = false; + for ( final String line : new XReadLines( AF_FILE ) ) { + if (!firstLine) { + firstLine = true; + continue; + } + final String[] vals = line.split(" "); + + double bkp = Double.valueOf(vals[0]); + double afb = Double.valueOf(vals[1]); + afBreakpoints.add(bkp); + afBoosts.add(afb); + + } + bkDelta = afBreakpoints.get(0); + } catch ( FileNotFoundException e ) { + throw new UserException.CouldNotReadInputFile(AF_FILE, e); + } + + } } /** @@ -250,9 +325,24 @@ public class SelectVariants extends RodWalker { for (VariantContext vc : vcs) { if (MENDELIAN_VIOLATIONS) { - if (!mv.isViolation(vc)) { - break; + boolean foundMV = false; + for (MendelianViolation mv : mvSet) { + if (mv.isViolation(vc)) { + foundMV = true; + //System.out.println(vc.toString()); + if (outMVFile != null) + outMVFileStream.format("MV@%s:%d. REF=%s, ALT=%s, AC=%d, momID=%s, dadID=%s, childID=%s, momG=%s, momGL=%s, dadG=%s, dadGL=%s, " + + "childG=%s childGL=%s\n",vc.getChr(), vc.getStart(), + vc.getReference().getDisplayString(), vc.getAlternateAllele(0).getDisplayString(), vc.getChromosomeCount(vc.getAlternateAllele(0)), + mv.getSampleMom(), mv.getSampleDad(), mv.getSampleChild(), + vc.getGenotype(mv.getSampleMom()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), + vc.getGenotype(mv.getSampleDad()).toBriefString(), vc.getGenotype(mv.getSampleMom()).getLikelihoods().getAsString(), + vc.getGenotype(mv.getSampleChild()).toBriefString(),vc.getGenotype(mv.getSampleChild()).getLikelihoods().getAsString() ); + } } + + if (!foundMV) + break; } if (DISCORDANCE_ONLY) { Collection compVCs = tracker.getVariantContexts(ref, discordanceRodName, null, context.getLocation(), true, false); @@ -283,46 +373,59 @@ public class SelectVariants extends RodWalker { if (SELECT_RANDOM_NUMBER) { randomlyAddVariant(++variantNumber, sub, ref.getBase()); } - else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom) { + else if (!SELECT_RANDOM_FRACTION || (!KEEP_AF_SPECTRUM && GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom)) { vcfWriter.add(sub, ref.getBase()); } else { if (SELECT_RANDOM_FRACTION && KEEP_AF_SPECTRUM ) { - Collection compVCs = tracker.getVariantContexts(ref, inputAFRodName, null, context.getLocation(), true, false); - if (compVCs.isEmpty()) - return 0; - // ok we have a comp VC and we need to match the AF spectrum of inputAFRodName. // We then pick a variant with probablity AF*desiredFraction - for (VariantContext compVC : compVCs) { - if ( compVC.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { - String afo = compVC.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); + if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + String afo = sub.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); - double af; - if (afo.contains(",")) { - String[] afs = afo.split(","); - afs[0] = afs[0].substring(1,afs[0].length()); - afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); + double af; + double afBoost = 1.0; + if (afo.contains(",")) { + String[] afs = afo.split(","); + afs[0] = afs[0].substring(1,afs[0].length()); + afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); - double[] afd = new double[afs.length]; + double[] afd = new double[afs.length]; - for (int k=0; k < afd.length; k++) - afd[k] = Double.valueOf(afs[k]); + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); - af = MathUtils.arrayMax(afd); - //af = Double.valueOf(afs[0]); + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); - } - else - af = Double.valueOf(afo); - - //System.out.format("%s .. %4.4f\n",afo.toString(), af); - if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * af) - vcfWriter.add(sub, ref.getBase()); } - break; // do only one vc + else + af = Double.valueOf(afo); + + // now boost af by table read from file if desired + //double bkpt = 0.0; + int bkidx = 0; + if (!afBreakpoints.isEmpty()) { + for ( Double bkpt : afBreakpoints) { + if (af < bkpt + bkDelta) + break; + else bkidx++; + } + if (bkidx >=afBoosts.size()) + bkidx = afBoosts.size()-1; + afBoost = afBoosts.get(bkidx); + //System.out.formatPrin("af:%f bkidx:%d afboost:%f\n",af,bkidx,afBoost); + + + + } + + //System.out.format("%s .. %4.4f\n",afo.toString(), af); + if (GenomeAnalysisEngine.getRandomGenerator().nextDouble() < fractionRandom * afBoost * afBoost) + vcfWriter.add(sub, ref.getBase()); } + } } } @@ -406,8 +509,8 @@ public class SelectVariants extends RodWalker { private boolean haveSameGenotypes(Genotype g1, Genotype g2) { if ((g1.isCalled() && g2.isFiltered()) || - (g2.isCalled() && g1.isFiltered()) || - (g1.isFiltered() && g2.isFiltered() && EXCLUDE_FILTERED)) + (g2.isCalled() && g1.isFiltered()) || + (g1.isFiltered() && g2.isFiltered() && EXCLUDE_FILTERED)) return false; List a1s = g1.getAlleles(); @@ -440,7 +543,7 @@ public class SelectVariants extends RodWalker { * @param vc the VariantContext record to subset * @param samples the samples to extract * @return the subsetted VariantContext - */ + */ private VariantContext subsetRecord(VariantContext vc, Set samples) { if ( samples == null || samples.isEmpty() ) return vc; @@ -450,7 +553,7 @@ public class SelectVariants extends RodWalker { if ( samples.contains(genotypePair.getKey()) ) genotypes.add(genotypePair.getValue()); } - + VariantContext sub = vc.subContextFromGenotypes(genotypes, vc.getAlleles()); HashMap attributes = new HashMap(sub.getAttributes()); @@ -460,7 +563,7 @@ public class SelectVariants extends RodWalker { Genotype g = sub.getGenotype(sample); if (g.isNotFiltered() && g.isCalled()) { - + String dp = (String) g.getAttribute("DP"); if (dp != null && ! dp.equals(VCFConstants.MISSING_DEPTH_v3) && ! dp.equals(VCFConstants.MISSING_VALUE_v4) ) { depth += Integer.valueOf(dp); diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java index 8d90af65a..39358dad5 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTable.java @@ -24,6 +24,8 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.commandline.Argument; import org.broadinstitute.sting.commandline.Output; import org.broadinstitute.sting.gatk.contexts.AlignmentContext; @@ -33,7 +35,6 @@ import org.broadinstitute.sting.gatk.walkers.Requires; import org.broadinstitute.sting.gatk.walkers.RodWalker; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; import java.io.PrintStream; @@ -74,17 +75,29 @@ public class VariantsToTable extends RodWalker { // #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT getters.put("CHROM", new Getter() { public String get(VariantContext vc) { return vc.getChr(); } }); getters.put("POS", new Getter() { public String get(VariantContext vc) { return Integer.toString(vc.getStart()); } }); - getters.put("REF", new Getter() { public String get(VariantContext vc) { return vc.getReference().toString(); } }); + getters.put("REF", new Getter() { + public String get(VariantContext vc) { + String x = ""; + if (vc.hasAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)) { + Byte refByte = (Byte)(vc.getAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)); + x=x+new String(new byte[]{refByte}); + } + return x+vc.getReference().getDisplayString(); + } + }); getters.put("ALT", new Getter() { public String get(VariantContext vc) { StringBuilder x = new StringBuilder(); int n = vc.getAlternateAlleles().size(); - if ( n == 0 ) return "."; + if (vc.hasAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)) { + Byte refByte = (Byte)(vc.getAttribute(VariantContext.REFERENCE_BASE_FOR_INDEL_KEY)); + x.append(new String(new byte[]{refByte})); + } for ( int i = 0; i < n; i++ ) { if ( i != 0 ) x.append(","); - x.append(vc.getAlternateAllele(i).toString()); + x.append(vc.getAlternateAllele(i).getDisplayString()); } return x.toString(); } @@ -168,6 +181,31 @@ public class VariantsToTable extends RodWalker { throw new UserException(String.format("Missing field %s in vc %s at %s", field, vc.getSource(), vc)); } + if (field.equals("AF") || field.equals("AC")) { + String afo = val; + + double af=0; + if (afo.contains(",")) { + String[] afs = afo.split(","); + afs[0] = afs[0].substring(1,afs[0].length()); + afs[afs.length-1] = afs[afs.length-1].substring(0,afs[afs.length-1].length()-1); + + double[] afd = new double[afs.length]; + + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); + + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); + + } + else + if (!afo.equals("NA")) + af = Double.valueOf(afo); + + val = Double.toString(af); + + } vals.add(val); } diff --git a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java index 5a5671056..212600360 100755 --- a/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/variantcontext/VariantContextUtils.java @@ -289,8 +289,8 @@ public class VariantContextUtils { /** * Returns a newly allocated VC that is the same as VC, but without genotypes - * @param vc - * @return + * @param vc variant context + * @return new VC without genotypes */ @Requires("vc != null") @Ensures("result != null") @@ -303,8 +303,8 @@ public class VariantContextUtils { /** * Returns a newly allocated list of VC, where each VC is the same as the input VCs, but without genotypes - * @param vcs - * @return + * @param vcs collection of VCs + * @return new VCs without genotypes */ @Requires("vcs != null") @Ensures("result != null") @@ -362,9 +362,9 @@ public class VariantContextUtils { * information per genotype. The master merge will add the PQ information from each genotype record, where * appropriate, to the master VC. * - * @param unsortedVCs - * @param masterName - * @return + * @param unsortedVCs collection of VCs + * @param masterName name of master VC + * @return master-merged VC */ public static VariantContext masterMerge(Collection unsortedVCs, String masterName) { VariantContext master = findMaster(unsortedVCs, masterName); @@ -435,11 +435,15 @@ public class VariantContextUtils { * If uniqifySamples is true, the priority order is ignored and names are created by concatenating the VC name with * the sample name * - * @param unsortedVCs - * @param priorityListOfVCs - * @param filteredRecordMergeType - * @param genotypeMergeOptions - * @return + * @param genomeLocParser loc parser + * @param unsortedVCs collection of unsorted VCs + * @param priorityListOfVCs priority list detailing the order in which we should grab the VCs + * @param filteredRecordMergeType merge type for filtered records + * @param genotypeMergeOptions merge option for genotypes + * @param annotateOrigin should we annotate the set it came from? + * @param printMessages should we print messages? + * @param inputRefBase the ref base + * @return new VariantContext */ public static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collection unsortedVCs, List priorityListOfVCs, FilteredRecordMergeType filteredRecordMergeType, GenotypeMergeType genotypeMergeOptions, @@ -448,6 +452,24 @@ public class VariantContextUtils { return simpleMerge(genomeLocParser, unsortedVCs, priorityListOfVCs, filteredRecordMergeType, genotypeMergeOptions, annotateOrigin, printMessages, inputRefBase, "set", false, false); } + /** + * Merges VariantContexts into a single hybrid. Takes genotypes for common samples in priority order, if provided. + * If uniqifySamples is true, the priority order is ignored and names are created by concatenating the VC name with + * the sample name + * + * @param genomeLocParser loc parser + * @param unsortedVCs collection of unsorted VCs + * @param priorityListOfVCs priority list detailing the order in which we should grab the VCs + * @param filteredRecordMergeType merge type for filtered records + * @param genotypeMergeOptions merge option for genotypes + * @param annotateOrigin should we annotate the set it came from? + * @param printMessages should we print messages? + * @param inputRefBase the ref base + * @param setKey the key name of the set + * @param filteredAreUncalled are filtered records uncalled? + * @param mergeInfoWithMaxAC should we merge in info from the VC with maximum allele count? + * @return new VariantContext + */ public static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collection unsortedVCs, List priorityListOfVCs, FilteredRecordMergeType filteredRecordMergeType, GenotypeMergeType genotypeMergeOptions, boolean annotateOrigin, boolean printMessages, byte inputRefBase, String setKey, @@ -470,7 +492,7 @@ public class VariantContextUtils { if ( ! filteredAreUncalled || vc.isNotFiltered() ) VCs.add(VariantContext.createVariantContextWithPaddedAlleles(vc,inputRefBase,false)); } - if ( VCs.size() == 0 ) // everything is filtered out and we're filteredareUncalled + if ( VCs.size() == 0 ) // everything is filtered out and we're filteredAreUncalled return null; // establish the baseline info from the first VC @@ -615,6 +637,17 @@ public class VariantContextUtils { return merged; } + public static Map> separateVariantContextsByType(Collection VCs) { + HashMap> mappedVCs = new HashMap>(); + for ( VariantContext vc : VCs ) { + if ( !mappedVCs.containsKey(vc.getType()) ) + mappedVCs.put(vc.getType(), new ArrayList()); + mappedVCs.get(vc.getType()).add(vc); + } + + return mappedVCs; + } + private static class AlleleMapper { private VariantContext vc = null; private Map map = null; @@ -834,6 +867,7 @@ public class VariantContextUtils { /** * create a genome location, given a variant context + * @param genomeLocParser parser * @param vc the variant context * @return the genomeLoc */ diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java index cca1eccb4..77159d9c2 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/diffengine/DiffObjectsIntegrationTest.java @@ -52,8 +52,8 @@ public class DiffObjectsIntegrationTest extends WalkerTest { @DataProvider(name = "data") public Object[][] createData() { - new TestParams(testDir + "diffTestMaster.vcf", testDir + "diffTestTest.vcf", "fb7f4e011487ca56bce865ae5468cdc5"); - new TestParams(testDir + "exampleBAM.bam", testDir + "exampleBAM.simple.bam", "423cec3befbf0a72d8bc3757ee628fc4"); + new TestParams(testDir + "diffTestMaster.vcf", testDir + "diffTestTest.vcf", "4d9f4636de05b93c354d05011264546e"); + new TestParams(testDir + "exampleBAM.bam", testDir + "exampleBAM.simple.bam", "37e6efd833b5cd6d860a9df3df9713fc"); return TestParams.getTests(TestParams.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 00ee44f75..904a5b29b 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 @@ -80,9 +80,9 @@ public class CombineVariantsIntegrationTest extends WalkerTest { @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", "", "5b82f37df1f5ba40f0474d71c94142ec", false); } + @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 combineSNPsAndIndels() { combine2("CEU.trio.2010_03.genotypes.vcf.gz", "CEU.dindel.vcf4.low_coverage.2010_06.indel.genotypes.vcf", "", "c58dca482bf97069eac6d9f1a07a2cba", false); } + @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 uniqueSNPs() { combine2("pilot2.snps.vcf4.genotypes.vcf", "yri.trio.gatk_glftrio.intersection.annotated.filtered.chr1.vcf", "", "89f55abea8f59e39d1effb908440548c", true); } @@ -100,7 +100,7 @@ public class CombineVariantsIntegrationTest extends WalkerTest { " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + " -genotypeMergeOptions UNIQUIFY -L 1"), 1, - Arrays.asList("8b78339ccf7a5a5a837f79e88a3a38e5")); + Arrays.asList("1de95f91ca15d2a8856de35dee0ce33e")); executeTest("threeWayWithRefs", spec); } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java old mode 100644 new mode 100755 index 72647c8e1..1db712353 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableIntegrationTest.java @@ -44,7 +44,7 @@ public class VariantsToTableIntegrationTest extends WalkerTest { @Test(enabled = true) public void testComplexVariantsToTable() { WalkerTestSpec spec = new WalkerTestSpec(variantsToTableCmd(" -AMD"), - Arrays.asList("b2a3712c1bfad8f1383ffada8b5017ba")); + Arrays.asList("e8f771995127b727fb433da91dd4ee98")); executeTest("testComplexVariantsToTable", spec).getFirst(); } diff --git a/public/packages/PicardPrivate.xml b/public/packages/PicardPrivate.xml index 110b41d3f..581c47979 100644 --- a/public/packages/PicardPrivate.xml +++ b/public/packages/PicardPrivate.xml @@ -7,6 +7,8 @@ + + diff --git a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala index 6a47d4b97..1f4f79993 100755 --- a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala +++ b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/DataProcessingPipeline.scala @@ -72,6 +72,9 @@ class DataProcessingPipeline extends QScript { @Input(doc="Number of threads BWA should use", fullName="bwa_threads", shortName="bt", required=false) var bwaThreads: Int = 1 + @Input(doc="Dont perform validation on the BAM files", fullName="no_validation", shortName="nv", required=false) + var noValidation: Boolean = false + /**************************************************************************** * Global Variables @@ -135,7 +138,7 @@ class DataProcessingPipeline extends QScript { } } - println("\n\n*** DEBUG ***\n") + println("\n\n*** INPUT FILES ***\n") // Creating one file for each sample in the dataset val sampleBamFiles = scala.collection.mutable.Map.empty[String, File] for ((sample, flist) <- sampleTable) { @@ -149,7 +152,7 @@ class DataProcessingPipeline extends QScript { sampleBamFiles(sample) = sampleFileName add(joinBams(flist, sampleFileName)) } - println("*** DEBUG ***\n\n") + println("*** INPUT FILES ***\n\n") return sampleBamFiles.toMap } @@ -246,7 +249,12 @@ class DataProcessingPipeline extends QScript { val preValidateLog = swapExt(bam, ".bam", ".pre.validation") val postValidateLog = swapExt(bam, ".bam", ".post.validation") - add(validate(bam, preValidateLog)) + // Validation is an optional step for the BAM file generated after + // alignment and the final bam file of the pipeline. + if (!noValidation) { + add(validate(bam, preValidateLog), + validate(recalBam, postValidateLog)) + } if (cleaningModel != ConsensusDeterminationModel.KNOWNS_ONLY) add(target(bam, targetIntervals)) @@ -257,8 +265,8 @@ class DataProcessingPipeline extends QScript { recal(dedupedBam, preRecalFile, recalBam), cov(recalBam, postRecalFile), analyzeCovariates(preRecalFile, preOutPath), - analyzeCovariates(postRecalFile, postOutPath), - validate(recalBam, postValidateLog)) + analyzeCovariates(postRecalFile, postOutPath)) + cohortList :+= recalBam } @@ -282,6 +290,13 @@ class DataProcessingPipeline extends QScript { this.isIntermediate = true } + // General arguments to non-GATK tools + trait ExternalCommonArgs extends CommandLineFunction { + this.memoryLimit = 4 + this.isIntermediate = true + } + + case class target (inBams: File, outIntervals: File) extends RealignerTargetCreator with CommandLineGATKArgs { if (cleaningModel != ConsensusDeterminationModel.KNOWNS_ONLY) this.input_file :+= inBams @@ -300,8 +315,8 @@ class DataProcessingPipeline extends QScript { this.targetIntervals = tIntervals this.out = outBam this.rodBind :+= RodBind("dbsnp", "VCF", dbSNP) - if (!indels.isEmpty) - this.rodBind :+= RodBind("indels", "VCF", indels) + if (!qscript.indels.isEmpty) + this.rodBind :+= RodBind("indels", "VCF", qscript.indels) this.consensusDeterminationModel = consensusDeterminationModel this.compress = 0 this.scatterCount = nContigs @@ -332,7 +347,6 @@ class DataProcessingPipeline extends QScript { this.isIntermediate = false this.analysisName = queueLogDir + outBam + ".recalibration" this.jobName = queueLogDir + outBam + ".recalibration" - } @@ -350,48 +364,41 @@ class DataProcessingPipeline extends QScript { this.jobName = queueLogDir + inRecalFile + ".analyze_covariates" } - case class dedup (inBam: File, outBam: File, metricsFile: File) extends MarkDuplicates { + case class dedup (inBam: File, outBam: File, metricsFile: File) extends MarkDuplicates with ExternalCommonArgs { this.input = List(inBam) this.output = outBam this.metrics = metricsFile - this.memoryLimit = 6 - this.isIntermediate = true this.analysisName = queueLogDir + outBam + ".dedup" this.jobName = queueLogDir + outBam + ".dedup" } - case class joinBams (inBams: List[File], outBam: File) extends MergeSamFiles { + case class joinBams (inBams: List[File], outBam: File) extends MergeSamFiles with ExternalCommonArgs { this.input = inBams this.output = outBam - this.memoryLimit = 4 - this.isIntermediate = true this.analysisName = queueLogDir + outBam + ".joinBams" this.jobName = queueLogDir + outBam + ".joinBams" } - case class sortSam (inSam: File, outBam: File, sortOrderP: SortOrder) extends SortSam { + case class sortSam (inSam: File, outBam: File, sortOrderP: SortOrder) extends SortSam with ExternalCommonArgs { this.input = List(inSam) this.output = outBam this.sortOrder = sortOrderP - this.memoryLimit = 4 - this.isIntermediate = true this.analysisName = queueLogDir + outBam + ".sortSam" this.jobName = queueLogDir + outBam + ".sortSam" } - case class validate (inBam: File, outLog: File) extends ValidateSamFile { + case class validate (inBam: File, outLog: File) extends ValidateSamFile with ExternalCommonArgs { this.input = List(inBam) this.output = outLog this.maxRecordsInRam = 100000 this.REFERENCE_SEQUENCE = qscript.reference - this.memoryLimit = 4 this.isIntermediate = false this.analysisName = queueLogDir + outLog + ".validate" this.jobName = queueLogDir + outLog + ".validate" } - case class addReadGroup (inBam: File, outBam: File, readGroup: ReadGroup) extends AddOrReplaceReadGroups { + case class addReadGroup (inBam: File, outBam: File, readGroup: ReadGroup) extends AddOrReplaceReadGroups with ExternalCommonArgs { this.input = List(inBam) this.output = outBam this.RGID = readGroup.id @@ -407,12 +414,7 @@ class DataProcessingPipeline extends QScript { this.jobName = queueLogDir + outBam + ".rg" } - trait BWACommonArgs extends CommandLineFunction { - this.memoryLimit = 4 - this.isIntermediate = true - } - - case class bwa_aln_se (inBam: File, outSai: File) extends CommandLineFunction with BWACommonArgs { + case class bwa_aln_se (inBam: File, outSai: File) extends CommandLineFunction with ExternalCommonArgs { @Input(doc="bam file to be aligned") var bam = inBam @Output(doc="output sai file") var sai = outSai def commandLine = bwaPath + " aln -t " + bwaThreads + " -q 5 " + reference + " -b " + bam + " > " + sai @@ -420,7 +422,7 @@ class DataProcessingPipeline extends QScript { this.jobName = queueLogDir + outSai + ".bwa_aln_se" } - case class bwa_aln_pe (inBam: File, outSai1: File, index: Int) extends CommandLineFunction with BWACommonArgs { + case class bwa_aln_pe (inBam: File, outSai1: File, index: Int) extends CommandLineFunction with ExternalCommonArgs { @Input(doc="bam file to be aligned") var bam = inBam @Output(doc="output sai file for 1st mating pair") var sai = outSai1 def commandLine = bwaPath + " aln -t " + bwaThreads + " -q 5 " + reference + " -b" + index + " " + bam + " > " + sai @@ -428,7 +430,7 @@ class DataProcessingPipeline extends QScript { this.jobName = queueLogDir + outSai1 + ".bwa_aln_pe1" } - case class bwa_sam_se (inBam: File, inSai: File, outBam: File) extends CommandLineFunction with BWACommonArgs { + case class bwa_sam_se (inBam: File, inSai: File, outBam: File) extends CommandLineFunction with ExternalCommonArgs { @Input(doc="bam file to be aligned") var bam = inBam @Input(doc="bwa alignment index file") var sai = inSai @Output(doc="output aligned bam file") var alignedBam = outBam @@ -437,7 +439,7 @@ class DataProcessingPipeline extends QScript { this.jobName = queueLogDir + outBam + ".bwa_sam_se" } - case class bwa_sam_pe (inBam: File, inSai1: File, inSai2:File, outBam: File) extends CommandLineFunction with BWACommonArgs { + case class bwa_sam_pe (inBam: File, inSai1: File, inSai2:File, outBam: File) extends CommandLineFunction with ExternalCommonArgs { @Input(doc="bam file to be aligned") var bam = inBam @Input(doc="bwa alignment index file for 1st mating pair") var sai1 = inSai1 @Input(doc="bwa alignment index file for 2nd mating pair") var sai2 = inSai2 diff --git a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/RecalibrateBaseQualities.scala b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/RecalibrateBaseQualities.scala index fca420816..f8218148e 100755 --- a/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/RecalibrateBaseQualities.scala +++ b/public/scala/qscript/org/broadinstitute/sting/queue/qscripts/RecalibrateBaseQualities.scala @@ -20,14 +20,14 @@ class RecalibrateBaseQualities extends QScript { @Input(doc="input BAM file - or list of BAM files", shortName="i", required=true) var input: File = _ - @Input(doc="path to R resources folder inside the Sting repository", fullName="path_to_r", shortName="r", required=false) - var R: String = new File("/humgen/gsa-scr1/carneiro/stable/R") + @Input(doc="path to R resources folder inside the Sting repository", fullName="path_to_r", shortName="r", required=true) + var R: String = _ - @Input(doc="Reference fasta file", shortName="R", required=false) - var reference: File = new File("/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta") + @Input(doc="Reference fasta file", shortName="R", required=true) + var reference: File = _ // new File("/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta") - @Input(doc="dbsnp ROD to use (VCF)", shortName="D", required=false) - var dbSNP: File = new File("/humgen/gsa-hpprojects/GATK/data/dbsnp_132_b37.leftAligned.vcf") + @Input(doc="dbsnp ROD to use (VCF)", shortName="D", required=true) + var dbSNP: File = _ // new File("/humgen/gsa-hpprojects/GATK/data/dbsnp_132_b37.leftAligned.vcf") val queueLogDir: String = ".qlog/" var nContigs: Int = 0 diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1954.jar b/settings/repository/edu.mit.broad/picard-private-parts-1954.jar deleted file mode 100644 index 67637d3d9311d10767c5758006471a628c5a8a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36047 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 - - diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1959.jar b/settings/repository/edu.mit.broad/picard-private-parts-1959.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae11e636b1415998685bfacb36398b34f1a1492c GIT binary patch literal 347579 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

+G{xAg?}Hksz=Sb>W44 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

pDq=%+^yW?exD~9Ak$05js!J2lIo5=@x8j3-) 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 |!MVlA< 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 c}t)RlBWI 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 literal 0 HcmV?d00001 diff --git a/settings/repository/edu.mit.broad/picard-private-parts-1954.xml b/settings/repository/edu.mit.broad/picard-private-parts-1959.xml similarity index 58% rename from settings/repository/edu.mit.broad/picard-private-parts-1954.xml rename to settings/repository/edu.mit.broad/picard-private-parts-1959.xml index c702fd6e5..e7c7e3a21 100644 --- a/settings/repository/edu.mit.broad/picard-private-parts-1954.xml +++ b/settings/repository/edu.mit.broad/picard-private-parts-1959.xml @@ -1,3 +1,3 @@ - + diff --git a/settings/repository/net.sf/picard-1.48.889.xml b/settings/repository/net.sf/picard-1.48.889.xml deleted file mode 100644 index 877687930..000000000 --- a/settings/repository/net.sf/picard-1.48.889.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/picard-1.48.889.jar b/settings/repository/net.sf/picard-1.49.895.jar similarity index 95% rename from settings/repository/net.sf/picard-1.48.889.jar rename to settings/repository/net.sf/picard-1.49.895.jar index 1b725dde5da26bac05010bc371775cdb890c323c..3ee1f209056b2b0a973d478f5e1ecb1a4971a3c7 100644 GIT binary patch delta 18811 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 (-r<;2kc=Gm3dj>o7~J#BUKJ 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 an}-aP{n(RpaQCM2UD>L=9uFr? + + diff --git a/settings/repository/net.sf/sam-1.48.889.xml b/settings/repository/net.sf/sam-1.48.889.xml deleted file mode 100644 index 8046a0c02..000000000 --- a/settings/repository/net.sf/sam-1.48.889.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/sam-1.48.889.jar b/settings/repository/net.sf/sam-1.49.895.jar similarity index 95% rename from settings/repository/net.sf/sam-1.48.889.jar rename to settings/repository/net.sf/sam-1.49.895.jar index 33ae4aa7d2e0652c767092e89fef9e93c92887f2..c55ab0b7274ad3a7f911d12050ec71c44f13b0f5 100644 GIT binary patch delta 7726 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 BJ{bT2 delta 7901 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 diff --git a/settings/repository/net.sf/sam-1.49.895.xml b/settings/repository/net.sf/sam-1.49.895.xml new file mode 100644 index 000000000..0436ce881 --- /dev/null +++ b/settings/repository/net.sf/sam-1.49.895.xml @@ -0,0 +1,3 @@ + + + From 92c7cfa1c81ad1c91e44eb8cc4cf769c1c5c9d4e Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Tue, 19 Jul 2011 20:11:31 -0400 Subject: [PATCH 199/214] BWA bindings and tests moved to public (was required for ValidationAmplicons) Integration tests for ValidationAmplicons. New argument to disable BWA, lowercase letters only for repetitiveness instead. --- public/c/SeparateQltout.cc | 70 +++ public/c/bwa/Makefile | 21 + public/c/bwa/build_linux.sh | 7 + public/c/bwa/build_mac.sh | 7 + public/c/bwa/bwa_gateway.cpp | 268 +++++++++++ public/c/bwa/bwa_gateway.h | 82 ++++ public/c/bwa/libbwa.so.1 | Bin 0 -> 380907 bytes ...tute_sting_alignment_bwa_c_BWACAligner.cpp | 437 ++++++++++++++++++ ...titute_sting_alignment_bwa_c_BWACAligner.h | 61 +++ public/c/libenvironhack/Makefile | 10 + public/c/libenvironhack/libenvironhack.c | 37 ++ public/c/libenvironhack/libenvironhack.dylib | Bin 0 -> 28904 bytes .../sting/alignment/Aligner.java | 52 +++ .../sting/alignment/Alignment.java | 221 +++++++++ .../alignment/AlignmentValidationWalker.java | 157 +++++++ .../sting/alignment/AlignmentWalker.java | 133 ++++++ .../alignment/CountBestAlignmentsWalker.java | 125 +++++ .../sting/alignment/bwa/BWAAligner.java | 38 ++ .../sting/alignment/bwa/BWAConfiguration.java | 44 ++ .../sting/alignment/bwa/BWTFiles.java | 240 ++++++++++ .../sting/alignment/bwa/c/BWACAligner.java | 258 +++++++++++ .../sting/alignment/bwa/c/BWAPath.java | 101 ++++ .../bwa/java/AlignerTestHarness.java | 165 +++++++ .../bwa/java/AlignmentMatchSequence.java | 151 ++++++ .../alignment/bwa/java/AlignmentState.java | 13 + .../alignment/bwa/java/BWAAlignment.java | 190 ++++++++ .../alignment/bwa/java/BWAJavaAligner.java | 392 ++++++++++++++++ .../sting/alignment/bwa/java/LowerBound.java | 88 ++++ .../sting/alignment/package-info.java | 4 + .../alignment/reference/bwt/AMBWriter.java | 68 +++ .../alignment/reference/bwt/ANNWriter.java | 95 ++++ .../sting/alignment/reference/bwt/BWT.java | 172 +++++++ .../alignment/reference/bwt/BWTReader.java | 86 ++++ .../bwt/BWTSupplementaryFileGenerator.java | 60 +++ .../alignment/reference/bwt/BWTWriter.java | 71 +++ .../sting/alignment/reference/bwt/Bases.java | 108 +++++ .../sting/alignment/reference/bwt/Counts.java | 151 ++++++ .../reference/bwt/CreateBWTFromReference.java | 200 ++++++++ .../reference/bwt/SequenceBlock.java | 41 ++ .../alignment/reference/bwt/SuffixArray.java | 159 +++++++ .../reference/bwt/SuffixArrayReader.java | 82 ++++ .../reference/bwt/SuffixArrayWriter.java | 67 +++ .../packing/BasePackedInputStream.java | 92 ++++ .../packing/BasePackedOutputStream.java | 140 ++++++ .../packing/CreatePACFromReference.java | 64 +++ .../reference/packing/PackUtils.java | 135 ++++++ .../packing/UnsignedIntPackedInputStream.java | 102 ++++ .../UnsignedIntPackedOutputStream.java | 118 +++++ .../walkers/sequenom/CreateSequenomMask.java | 50 -- .../walkers/sequenom/PickSequenomProbes.java | 334 ------------- .../validation/ValidationAmplicons.java | 40 +- .../alignment/AlignerIntegrationTest.java | 27 ++ .../PickSequenomProbesIntegrationTest.java | 34 -- .../ValidationAmpliconsIntegrationTest.java | 56 +++ 54 files changed, 5492 insertions(+), 432 deletions(-) create mode 100644 public/c/SeparateQltout.cc create mode 100644 public/c/bwa/Makefile create mode 100755 public/c/bwa/build_linux.sh create mode 100644 public/c/bwa/build_mac.sh create mode 100644 public/c/bwa/bwa_gateway.cpp create mode 100644 public/c/bwa/bwa_gateway.h create mode 100755 public/c/bwa/libbwa.so.1 create mode 100644 public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.cpp create mode 100644 public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.h create mode 100644 public/c/libenvironhack/Makefile create mode 100644 public/c/libenvironhack/libenvironhack.c create mode 100755 public/c/libenvironhack/libenvironhack.dylib create mode 100644 public/java/src/org/broadinstitute/sting/alignment/Aligner.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/Alignment.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/AlignmentValidationWalker.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/AlignmentWalker.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/CountBestAlignmentsWalker.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/BWAAligner.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/BWAConfiguration.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/BWTFiles.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWACAligner.java create mode 100755 public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWAPath.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignerTestHarness.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentMatchSequence.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentState.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAAlignment.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAJavaAligner.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/bwa/java/LowerBound.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/package-info.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/AMBWriter.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/ANNWriter.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWT.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTReader.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTSupplementaryFileGenerator.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTWriter.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Bases.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Counts.java create mode 100755 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/CreateBWTFromReference.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SequenceBlock.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArray.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayReader.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayWriter.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedInputStream.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedOutputStream.java create mode 100755 public/java/src/org/broadinstitute/sting/alignment/reference/packing/CreatePACFromReference.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/packing/PackUtils.java create mode 100644 public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedInputStream.java create mode 100755 public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedOutputStream.java delete mode 100755 public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java delete mode 100755 public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java create mode 100644 public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java delete mode 100755 public/java/test/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbesIntegrationTest.java create mode 100755 public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java diff --git a/public/c/SeparateQltout.cc b/public/c/SeparateQltout.cc new file mode 100644 index 000000000..7644c9603 --- /dev/null +++ b/public/c/SeparateQltout.cc @@ -0,0 +1,70 @@ +#include "MainTools.h" +#include "Basevector.h" +#include "lookup/LookAlign.h" +#include "lookup/SerialQltout.h" + +unsigned int MatchingEnd(look_align &la, vecbasevector &candidates, vecbasevector &ref) { + //la.PrintParseable(cout); + + for (int i = 0; i < candidates.size(); i++) { + look_align newla = la; + + if (newla.rc1) { candidates[i].ReverseComplement(); } + newla.ResetFromAlign(newla.a, candidates[i], ref[la.target_id]); + + //newla.PrintParseable(cout, &candidates[i], &ref[newla.target_id]); + //cout << newla.Errors() << " " << la.Errors() << endl; + + if (newla.Errors() == la.Errors()) { + return i; + } + } + + //FatalErr("Query id " + ToString(la.query_id) + " had no matches."); + + return candidates.size() + 1; +} + +int main(int argc, char **argv) { + RunTime(); + + BeginCommandArguments; + CommandArgument_String(ALIGNS); + CommandArgument_String(FASTB_END_1); + CommandArgument_String(FASTB_END_2); + CommandArgument_String(REFERENCE); + + CommandArgument_String(ALIGNS_END_1_OUT); + CommandArgument_String(ALIGNS_END_2_OUT); + EndCommandArguments; + + vecbasevector ref(REFERENCE); + vecbasevector reads1(FASTB_END_1); + vecbasevector reads2(FASTB_END_2); + + ofstream aligns1stream(ALIGNS_END_1_OUT.c_str()); + ofstream aligns2stream(ALIGNS_END_2_OUT.c_str()); + + basevector bv; + + SerialQltout sqltout(ALIGNS); + look_align la; + while (sqltout.Next(la)) { + vecbasevector candidates(2); + candidates[0] = reads1[la.query_id]; + candidates[1] = reads2[la.query_id]; + + unsigned int matchingend = MatchingEnd(la, candidates, ref); + if (matchingend < 2) { + bv = (matchingend == 0) ? reads1[la.query_id] : reads2[la.query_id]; + + //la.PrintParseable(cout, &bv, &ref[la.target_id]); + la.PrintParseable(((matchingend == 0) ? aligns1stream : aligns2stream), &bv, &ref[la.target_id]); + } + } + + aligns1stream.close(); + aligns2stream.close(); + + return 0; +} diff --git a/public/c/bwa/Makefile b/public/c/bwa/Makefile new file mode 100644 index 000000000..6399a0e6d --- /dev/null +++ b/public/c/bwa/Makefile @@ -0,0 +1,21 @@ +CXX=g++ +CXXFLAGS=-g -Wall -O2 -m64 -fPIC + +.cpp.o: + $(CXX) -c $(CXXFLAGS) -I$(BWA_HOME) -I$(JAVA_INCLUDE) $< -o $@ + +all: init lib + +init: + @echo Please make sure the following platforms are set correctly on your machine. + @echo BWA_HOME=$(BWA_HOME) + @echo JAVA_INCLUDE=$(JAVA_INCLUDE) + @echo TARGET_LIB=$(TARGET_LIB) + @echo EXTRA_LIBS=$(EXTRA_LIBS) + @echo LIBTOOL_COMMAND=$(LIBTOOL_COMMAND) + +lib: org_broadinstitute_sting_alignment_bwa_c_BWACAligner.o bwa_gateway.o + $(LIBTOOL_COMMAND) $? -o $(TARGET_LIB) -L$(BWA_HOME) -lbwacore $(EXTRA_LIBS) + +clean: + rm *.o libbwa.* diff --git a/public/c/bwa/build_linux.sh b/public/c/bwa/build_linux.sh new file mode 100755 index 000000000..c713f3963 --- /dev/null +++ b/public/c/bwa/build_linux.sh @@ -0,0 +1,7 @@ +#!/bin/sh +export BWA_HOME="/humgen/gsa-scr1/hanna/src/bwa" +export JAVA_INCLUDE="/broad/tools/Linux/x86_64/pkgs/jdk_1.6.0_12/include -I/broad/tools/Linux/x86_64/pkgs/jdk_1.6.0_12/include/linux" +export TARGET_LIB="libbwa.so" +export EXTRA_LIBS="-lc -lz -lstdc++ -lpthread" +export LIBTOOL_COMMAND="g++ -shared -Wl,-soname,libbwa.so" +make diff --git a/public/c/bwa/build_mac.sh b/public/c/bwa/build_mac.sh new file mode 100644 index 000000000..bfed900bb --- /dev/null +++ b/public/c/bwa/build_mac.sh @@ -0,0 +1,7 @@ +#!/bin/sh +export BWA_HOME="/Users/mhanna/src/bwa" +export JAVA_INCLUDE="/System/Library/Frameworks/JavaVM.framework/Headers" +export TARGET_LIB="libbwa.dylib" +export EXTRA_LIBS="-lc -lz -lsupc++" +export LIBTOOL_COMMAND="libtool -dynamic" +make diff --git a/public/c/bwa/bwa_gateway.cpp b/public/c/bwa/bwa_gateway.cpp new file mode 100644 index 000000000..3f6850e37 --- /dev/null +++ b/public/c/bwa/bwa_gateway.cpp @@ -0,0 +1,268 @@ +#include +#include + +#include "bwase.h" +#include "bwa_gateway.h" + +BWA::BWA(const char* ann_filename, + const char* amb_filename, + const char* pac_filename, + const char* forward_bwt_filename, + const char* forward_sa_filename, + const char* reverse_bwt_filename, + const char* reverse_sa_filename) +{ + // Load the bns (?) and reference + bns = bns_restore_core(ann_filename,amb_filename,pac_filename); + reference = new ubyte_t[bns->l_pac/4+1]; + rewind(bns->fp_pac); + fread(reference, 1, bns->l_pac/4+1, bns->fp_pac); + fclose(bns->fp_pac); + bns->fp_pac = NULL; + + // Load the BWTs (both directions) and suffix arrays (both directions) + bwts[0] = bwt_restore_bwt(forward_bwt_filename); + bwt_restore_sa(forward_sa_filename, bwts[0]); + bwts[1] = bwt_restore_bwt(reverse_bwt_filename); + bwt_restore_sa(reverse_sa_filename, bwts[1]); + load_default_options(); + + // initialize the bwase subsystem + bwase_initialize(); +} + +BWA::~BWA() { + delete[] reference; + bns_destroy(bns); + bwt_destroy(bwts[0]); + bwt_destroy(bwts[1]); +} + +void BWA::find_paths(const char* bases, const unsigned read_length, bwt_aln1_t*& paths, unsigned& num_paths, unsigned& best_path_count, unsigned& second_best_path_count) +{ + bwa_seq_t* sequence = create_sequence(bases, read_length); + + // Calculate the suffix array interval for each sequence, storing the result in sequence->aln (and sequence->n_aln). + // This method will destroy the contents of seq and rseq. + bwa_cal_sa_reg_gap(0,bwts,1,sequence,&options); + + paths = new bwt_aln1_t[sequence->n_aln]; + memcpy(paths,sequence->aln,sequence->n_aln*sizeof(bwt_aln1_t)); + num_paths = sequence->n_aln; + + // Call aln2seq to initialize the type of match present. + bwa_aln2seq(sequence->n_aln,sequence->aln,sequence); + best_path_count = sequence->c1; + second_best_path_count = sequence->c2; + + bwa_free_read_seq(1,sequence); +} + +Alignment* BWA::generate_single_alignment(const char* bases, const unsigned read_length) { + bwa_seq_t* sequence = create_sequence(bases,read_length); + + // Calculate paths. + bwa_cal_sa_reg_gap(0,bwts,1,sequence,&options); + + // Check for no alignments found and return null. + if(sequence->n_aln == 0) { + bwa_free_read_seq(1,sequence); + return NULL; + } + + // bwa_cal_sa_reg_gap destroys the bases / read length. Copy them back in. + copy_bases_into_sequence(sequence,bases,read_length); + + // Pick best alignment and propagate its information into the sequence. + bwa_aln2seq(sequence->n_aln,sequence->aln,sequence); + + // Generate the best alignment from the sequence. + Alignment* alignment = new Alignment; + *alignment = generate_final_alignment_from_sequence(sequence); + + bwa_free_read_seq(1,sequence); + + return alignment; +} + +void BWA::generate_alignments_from_paths(const char* bases, + const unsigned read_length, + bwt_aln1_t* paths, + const unsigned num_paths, + const unsigned best_count, + const unsigned second_best_count, + Alignment*& alignments, + unsigned& num_alignments) +{ + bwa_seq_t* sequence = create_sequence(bases,read_length); + + sequence->aln = paths; + sequence->n_aln = num_paths; + + // (Ab)use bwa_aln2seq to propagate values stored in the path out into the sequence itself. + bwa_aln2seq(sequence->n_aln,sequence->aln,sequence); + + // But overwrite key parts of the sequence in case the user passed back only a smaller subset + // of the paths. + sequence->c1 = best_count; + sequence->c2 = second_best_count; + sequence->type = sequence->c1 > 1 ? BWA_TYPE_REPEAT : BWA_TYPE_UNIQUE; + + num_alignments = 0; + for(unsigned i = 0; i < (unsigned)sequence->n_aln; i++) + num_alignments += (sequence->aln + i)->l - (sequence->aln + i)->k + 1; + + alignments = new Alignment[num_alignments]; + unsigned alignment_idx = 0; + + for(unsigned path_idx = 0; path_idx < (unsigned)num_paths; path_idx++) { + // Stub in a 'working' path, so that only the desired alignment is local-aligned. + const bwt_aln1_t* path = paths + path_idx; + bwt_aln1_t working_path = *path; + + // Loop through all alignments, aligning each one individually. + for(unsigned sa_idx = path->k; sa_idx <= path->l; sa_idx++) { + working_path.k = working_path.l = sa_idx; + sequence->aln = &working_path; + sequence->n_aln = 1; + + sequence->sa = sa_idx; + sequence->strand = path->a; + sequence->score = path->score; + + // Each time through bwa_refine_gapped, seq gets reversed. Revert the reverse. + // TODO: Fix the interface to bwa_refine_gapped so its easier to work with. + if(alignment_idx > 0) + seq_reverse(sequence->len, sequence->seq, 0); + + // Copy the local alignment data into the alignment object. + *(alignments + alignment_idx) = generate_final_alignment_from_sequence(sequence); + + alignment_idx++; + } + } + + sequence->aln = NULL; + sequence->n_aln = 0; + + bwa_free_read_seq(1,sequence); +} + +Alignment BWA::generate_final_alignment_from_sequence(bwa_seq_t* sequence) { + // Calculate the local coordinate and local alignment. + bwa_cal_pac_pos_core(bwts[0],bwts[1],sequence,options.max_diff,options.fnr); + bwa_refine_gapped(bns, 1, sequence, reference, NULL); + + // Copy the local alignment data into the alignment object. + Alignment alignment; + + // Populate basic path info + alignment.edit_distance = sequence->nm; + alignment.num_mismatches = sequence->n_mm; + alignment.num_gap_opens = sequence->n_gapo; + alignment.num_gap_extensions = sequence->n_gape; + alignment.num_best = sequence->c1; + alignment.num_second_best = sequence->c2; + + // Final alignment position. + alignment.type = sequence->type; + bns_coor_pac2real(bns, sequence->pos, pos_end(sequence) - sequence->pos, &alignment.contig); + alignment.pos = sequence->pos - bns->anns[alignment.contig].offset + 1; + alignment.negative_strand = sequence->strand; + alignment.mapping_quality = sequence->mapQ; + + // Cigar step. + alignment.cigar = NULL; + if(sequence->cigar) { + alignment.cigar = new uint16_t[sequence->n_cigar]; + memcpy(alignment.cigar,sequence->cigar,sequence->n_cigar*sizeof(uint16_t)); + } + alignment.n_cigar = sequence->n_cigar; + + // MD tag with a better breakdown of differences in the cigar + alignment.md = strdup(sequence->md); + delete[] sequence->md; + sequence->md = NULL; + + return alignment; +} + +void BWA::load_default_options() +{ + options.s_mm = 3; + options.s_gapo = 11; + options.s_gape = 4; + options.mode = 3; + options.indel_end_skip = 5; + options.max_del_occ = 10; + options.max_entries = 2000000; + options.fnr = 0.04; + options.max_diff = -1; + options.max_gapo = 1; + options.max_gape = 6; + options.max_seed_diff = 2; + options.seed_len = 2147483647; + options.n_threads = 1; + options.max_top2 = 30; + options.trim_qual = 0; +} + +void BWA::set_max_edit_distance(float edit_distance) { + if(edit_distance > 0 && edit_distance < 1) { + options.fnr = edit_distance; + options.max_diff = -1; + } + else { + options.fnr = -1.0; + options.max_diff = (int)edit_distance; + } +} + +void BWA::set_max_gap_opens(int max_gap_opens) { options.max_gapo = max_gap_opens; } +void BWA::set_max_gap_extensions(int max_gap_extensions) { options.max_gape = max_gap_extensions; } +void BWA::set_disallow_indel_within_range(int indel_range) { options.indel_end_skip = indel_range; } +void BWA::set_mismatch_penalty(int penalty) { options.s_mm = penalty; } +void BWA::set_gap_open_penalty(int penalty) { options.s_gapo = penalty; } +void BWA::set_gap_extension_penalty(int penalty) { options.s_gape = penalty; } + +/** + * Create a sequence with a set of reasonable initial defaults. + * Will leave seq and rseq empty. + */ +bwa_seq_t* BWA::create_sequence(const char* bases, const unsigned read_length) +{ + bwa_seq_t* sequence = new bwa_seq_t; + + sequence->tid = -1; + + sequence->name = 0; + + copy_bases_into_sequence(sequence, bases, read_length); + + sequence->qual = 0; + sequence->aln = 0; + sequence->md = 0; + + sequence->cigar = NULL; + sequence->n_cigar = 0; + + sequence->multi = NULL; + sequence->n_multi = 0; + + return sequence; +} + +void BWA::copy_bases_into_sequence(bwa_seq_t* sequence, const char* bases, const unsigned read_length) +{ + // seq, rseq will ultimately be freed by bwa_cal_sa_reg_gap + sequence->seq = new ubyte_t[read_length]; + sequence->rseq = new ubyte_t[read_length]; + for(unsigned i = 0; i < read_length; i++) sequence->seq[i] = nst_nt4_table[(unsigned)bases[i]]; + memcpy(sequence->rseq,sequence->seq,read_length); + + // BWA expects the read bases to arrive reversed. + seq_reverse(read_length,sequence->seq,0); + seq_reverse(read_length,sequence->rseq,1); + + sequence->full_len = sequence->len = read_length; +} diff --git a/public/c/bwa/bwa_gateway.h b/public/c/bwa/bwa_gateway.h new file mode 100644 index 000000000..0ef0a129b --- /dev/null +++ b/public/c/bwa/bwa_gateway.h @@ -0,0 +1,82 @@ +#ifndef BWA_GATEWAY +#define BWA_GATEWAY + +#include + +#include "bntseq.h" +#include "bwt.h" +#include "bwtaln.h" + +class Alignment { + public: + uint32_t type; + int contig; + bwtint_t pos; + bool negative_strand; + uint32_t mapping_quality; + + uint16_t *cigar; + int n_cigar; + + uint8_t num_mismatches; + uint8_t num_gap_opens; + uint8_t num_gap_extensions; + uint16_t edit_distance; + + uint32_t num_best; + uint32_t num_second_best; + + char* md; +}; + +class BWA { + private: + bntseq_t *bns; + ubyte_t* reference; + bwt_t* bwts[2]; + gap_opt_t options; + + void load_default_options(); + bwa_seq_t* create_sequence(const char* bases, const unsigned read_length); + void copy_bases_into_sequence(bwa_seq_t* sequence, const char* bases, const unsigned read_length); + Alignment generate_final_alignment_from_sequence(bwa_seq_t* sequence); + + public: + BWA(const char* ann_filename, + const char* amb_filename, + const char* pac_filename, + const char* forward_bwt_filename, + const char* forward_sa_filename, + const char* reverse_bwt_filename, + const char* reverse_sa_filename); + ~BWA(); + + // Parameterize the aligner. + void set_max_edit_distance(float edit_distance); + void set_max_gap_opens(int max_gap_opens); + void set_max_gap_extensions(int max_gap_extensions); + void set_disallow_indel_within_range(int indel_range); + void set_mismatch_penalty(int penalty); + void set_gap_open_penalty(int penalty); + void set_gap_extension_penalty(int penalty); + + // Perform the alignment + Alignment* generate_single_alignment(const char* bases, + const unsigned read_length); + void find_paths(const char* bases, + const unsigned read_length, + bwt_aln1_t*& paths, + unsigned& num_paths, + unsigned& best_path_count, + unsigned& second_best_path_count); + void generate_alignments_from_paths(const char* bases, + const unsigned read_length, + bwt_aln1_t* paths, + const unsigned num_paths, + const unsigned best_count, + const unsigned second_best_count, + Alignment*& alignments, + unsigned& num_alignments); +}; + +#endif // BWA_GATEWAY diff --git a/public/c/bwa/libbwa.so.1 b/public/c/bwa/libbwa.so.1 new file mode 100755 index 0000000000000000000000000000000000000000..bfa3c28473de8485fed89f8458be2a2bda1cdc4a GIT binary patch literal 380907 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�hQB+h<*i^cqfi4&9%JO8 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

<>pb~gv8^Jx4*#rM^_Q95m|2RtS4Jy~ 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 literal 0 HcmV?d00001 diff --git a/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.cpp b/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.cpp new file mode 100644 index 000000000..1ccbef0d4 --- /dev/null +++ b/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.cpp @@ -0,0 +1,437 @@ +#include +#include +#include + +#include "bntseq.h" +#include "bwt.h" +#include "bwtaln.h" +#include "bwa_gateway.h" +#include "org_broadinstitute_sting_alignment_bwa_c_BWACAligner.h" + +typedef void (BWA::*int_setter)(int value); +typedef void (BWA::*float_setter)(float value); + +static jobject convert_to_java_alignment(JNIEnv* env, const jbyte* read_bases, const jsize read_length, const Alignment& alignment); +static jstring get_configuration_file(JNIEnv* env, jobject configuration, const char* field_name); +static void set_int_configuration_param(JNIEnv* env, jobject configuration, const char* field_name, BWA* bwa, int_setter setter); +static void set_float_configuration_param(JNIEnv* env, jobject configuration, const char* field_name, BWA* bwa, float_setter setter); +static void throw_config_value_exception(JNIEnv* env, const char* field_name, const char* message); + +JNIEXPORT jlong JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_create(JNIEnv* env, jobject instance, jobject bwtFiles, jobject configuration) +{ + jstring java_ann = get_configuration_file(env,bwtFiles,"annFile"); + if(java_ann == NULL) return 0L; + jstring java_amb = get_configuration_file(env,bwtFiles,"ambFile"); + if(java_amb == NULL) return 0L; + jstring java_pac = get_configuration_file(env,bwtFiles,"pacFile"); + if(java_pac == NULL) return 0L; + jstring java_forward_bwt = get_configuration_file(env,bwtFiles,"forwardBWTFile"); + if(java_forward_bwt == NULL) return 0L; + jstring java_forward_sa = get_configuration_file(env,bwtFiles,"forwardSAFile"); + if(java_forward_sa == NULL) return 0L; + jstring java_reverse_bwt = get_configuration_file(env,bwtFiles,"reverseBWTFile"); + if(java_reverse_bwt == NULL) return 0L; + jstring java_reverse_sa = get_configuration_file(env,bwtFiles,"reverseSAFile"); + if(java_reverse_sa == NULL) return 0L; + + const char* ann_filename = env->GetStringUTFChars(java_ann,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* amb_filename = env->GetStringUTFChars(java_amb,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* pac_filename = env->GetStringUTFChars(java_pac,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* forward_bwt_filename = env->GetStringUTFChars(java_forward_bwt,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* forward_sa_filename = env->GetStringUTFChars(java_forward_sa,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* reverse_bwt_filename = env->GetStringUTFChars(java_reverse_bwt,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + const char* reverse_sa_filename = env->GetStringUTFChars(java_reverse_sa,JNI_FALSE); + if(env->ExceptionCheck()) return 0L; + + BWA* bwa = new BWA(ann_filename, + amb_filename, + pac_filename, + forward_bwt_filename, + forward_sa_filename, + reverse_bwt_filename, + reverse_sa_filename); + + Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_updateConfiguration(env,instance,(jlong)bwa,configuration); + if(env->ExceptionCheck()) return 0L; + + env->ReleaseStringUTFChars(java_ann,ann_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_amb,amb_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_pac,pac_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_forward_bwt,forward_bwt_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_forward_sa,forward_sa_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_reverse_bwt,reverse_bwt_filename); + if(env->ExceptionCheck()) return 0L; + env->ReleaseStringUTFChars(java_reverse_sa,reverse_sa_filename); + if(env->ExceptionCheck()) return 0L; + + return (jlong)bwa; +} + +JNIEXPORT void JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_destroy(JNIEnv* env, jobject instance, jlong java_bwa) +{ + BWA* bwa = (BWA*)java_bwa; + delete bwa; +} + +JNIEXPORT void JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_updateConfiguration(JNIEnv *env, jobject instance, jlong java_bwa, jobject configuration) { + BWA* bwa = (BWA*)java_bwa; + set_float_configuration_param(env, configuration, "maximumEditDistance", bwa, &BWA::set_max_edit_distance); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "maximumGapOpens", bwa, &BWA::set_max_gap_opens); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "maximumGapExtensions", bwa, &BWA::set_max_gap_extensions); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "disallowIndelWithinRange", bwa, &BWA::set_disallow_indel_within_range); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "mismatchPenalty", bwa, &BWA::set_mismatch_penalty); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "gapOpenPenalty", bwa, &BWA::set_gap_open_penalty); + if(env->ExceptionCheck()) return; + set_int_configuration_param(env, configuration, "gapExtensionPenalty", bwa, &BWA::set_gap_extension_penalty); + if(env->ExceptionCheck()) return; +} + +JNIEXPORT jobjectArray JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_getPaths(JNIEnv *env, jobject instance, jlong java_bwa, jbyteArray java_bases) +{ + BWA* bwa = (BWA*)java_bwa; + + const jsize read_length = env->GetArrayLength(java_bases); + if(env->ExceptionCheck()) return NULL; + + jbyte *read_bases = env->GetByteArrayElements(java_bases,JNI_FALSE); + if(read_bases == NULL) return NULL; + + bwt_aln1_t* paths = NULL; + unsigned num_paths = 0; + + unsigned best_path_count, second_best_path_count; + bwa->find_paths((const char*)read_bases,read_length,paths,num_paths,best_path_count,second_best_path_count); + + jobjectArray java_paths = env->NewObjectArray(num_paths, env->FindClass("org/broadinstitute/sting/alignment/bwa/c/BWAPath"), NULL); + if(java_paths == NULL) return NULL; + + for(unsigned path_idx = 0; path_idx < (unsigned)num_paths; path_idx++) { + bwt_aln1_t& path = *(paths + path_idx); + + jclass java_path_class = env->FindClass("org/broadinstitute/sting/alignment/bwa/c/BWAPath"); + if(java_path_class == NULL) return NULL; + + jmethodID java_path_constructor = env->GetMethodID(java_path_class, "", "(IIIZJJIII)V"); + if(java_path_constructor == NULL) return NULL; + + // Note that k/l are being cast to long. Bad things will happen if JNI assumes that they're ints. + jobject java_path = env->NewObject(java_path_class, + java_path_constructor, + path.n_mm, + path.n_gapo, + path.n_gape, + path.a, + (jlong)path.k, + (jlong)path.l, + path.score, + best_path_count, + second_best_path_count); + if(java_path == NULL) return NULL; + + env->SetObjectArrayElement(java_paths,path_idx,java_path); + if(env->ExceptionCheck()) return NULL; + + env->DeleteLocalRef(java_path_class); + if(env->ExceptionCheck()) return NULL; + } + + delete[] paths; + + env->ReleaseByteArrayElements(java_bases,read_bases,JNI_FALSE); + + return env->ExceptionCheck() ? NULL : java_paths; +} + +JNIEXPORT jobjectArray JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_convertPathsToAlignments(JNIEnv *env, jobject instance, jlong java_bwa, jbyteArray java_bases, jobjectArray java_paths) +{ + BWA* bwa = (BWA*)java_bwa; + + const jsize read_length = env->GetArrayLength(java_bases); + if(env->ExceptionCheck()) return NULL; + + jbyte *read_bases = env->GetByteArrayElements(java_bases,JNI_FALSE); + if(read_bases == NULL) return NULL; + + const jsize num_paths = env->GetArrayLength(java_paths); + bwt_aln1_t* paths = new bwt_aln1_t[num_paths]; + unsigned best_count = 0, second_best_count = 0; + + for(unsigned path_idx = 0; path_idx < (unsigned)num_paths; path_idx++) { + jobject java_path = env->GetObjectArrayElement(java_paths,path_idx); + jclass java_path_class = env->GetObjectClass(java_path); + if(java_path_class == NULL) return NULL; + + bwt_aln1_t& path = *(paths + path_idx); + + jfieldID mismatches_field = env->GetFieldID(java_path_class, "numMismatches", "I"); + if(mismatches_field == NULL) return NULL; + path.n_mm = env->GetIntField(java_path,mismatches_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID gap_opens_field = env->GetFieldID(java_path_class, "numGapOpens", "I"); + if(gap_opens_field == NULL) return NULL; + path.n_gapo = env->GetIntField(java_path,gap_opens_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID gap_extensions_field = env->GetFieldID(java_path_class, "numGapExtensions", "I"); + if(gap_extensions_field == NULL) return NULL; + path.n_gape = env->GetIntField(java_path,gap_extensions_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID negative_strand_field = env->GetFieldID(java_path_class, "negativeStrand", "Z"); + if(negative_strand_field == NULL) return NULL; + path.a = env->GetBooleanField(java_path,negative_strand_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID k_field = env->GetFieldID(java_path_class, "k", "J"); + if(k_field == NULL) return NULL; + path.k = env->GetLongField(java_path,k_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID l_field = env->GetFieldID(java_path_class, "l", "J"); + if(l_field == NULL) return NULL; + path.l = env->GetLongField(java_path,l_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID score_field = env->GetFieldID(java_path_class, "score", "I"); + if(score_field == NULL) return NULL; + path.score = env->GetIntField(java_path,score_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID best_count_field = env->GetFieldID(java_path_class, "bestCount", "I"); + if(best_count_field == NULL) return NULL; + best_count = env->GetIntField(java_path,best_count_field); + if(env->ExceptionCheck()) return NULL; + + jfieldID second_best_count_field = env->GetFieldID(java_path_class, "secondBestCount", "I"); + if(second_best_count_field == NULL) return NULL; + second_best_count = env->GetIntField(java_path,second_best_count_field); + if(env->ExceptionCheck()) return NULL; + } + + Alignment* alignments = NULL; + unsigned num_alignments = 0; + bwa->generate_alignments_from_paths((const char*)read_bases,read_length,paths,num_paths,best_count,second_best_count,alignments,num_alignments); + + jobjectArray java_alignments = env->NewObjectArray(num_alignments, env->FindClass("org/broadinstitute/sting/alignment/Alignment"), NULL); + if(java_alignments == NULL) return NULL; + + for(unsigned alignment_idx = 0; alignment_idx < (unsigned)num_alignments; alignment_idx++) { + Alignment& alignment = *(alignments + alignment_idx); + jobject java_alignment = convert_to_java_alignment(env,read_bases,read_length,alignment); + if(java_alignment == NULL) return NULL; + env->SetObjectArrayElement(java_alignments,alignment_idx,java_alignment); + if(env->ExceptionCheck()) return NULL; + } + + delete[] alignments; + delete[] paths; + + env->ReleaseByteArrayElements(java_bases,read_bases,JNI_FALSE); + + return env->ExceptionCheck() ? NULL : java_alignments; +} + +JNIEXPORT jobject JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_getBestAlignment(JNIEnv *env, jobject instance, jlong java_bwa, jbyteArray java_bases) { + BWA* bwa = (BWA*)java_bwa; + + const jsize read_length = env->GetArrayLength(java_bases); + if(env->ExceptionCheck()) return NULL; + + jbyte *read_bases = env->GetByteArrayElements(java_bases,JNI_FALSE); + if(read_bases == NULL) return NULL; + + Alignment* best_alignment = bwa->generate_single_alignment((const char*)read_bases,read_length); + jobject java_best_alignment = (best_alignment != NULL) ? convert_to_java_alignment(env,read_bases,read_length,*best_alignment) : NULL; + delete best_alignment; + + env->ReleaseByteArrayElements(java_bases,read_bases,JNI_FALSE); + + return java_best_alignment; +} + +static jobject convert_to_java_alignment(JNIEnv *env, const jbyte* read_bases, const jsize read_length, const Alignment& alignment) { + unsigned cigar_length; + if(alignment.type == BWA_TYPE_NO_MATCH) cigar_length = 0; + else if(!alignment.cigar) cigar_length = 1; + else cigar_length = alignment.n_cigar; + + jcharArray java_cigar_operators = env->NewCharArray(cigar_length); + if(java_cigar_operators == NULL) return NULL; + jintArray java_cigar_lengths = env->NewIntArray(cigar_length); + if(java_cigar_lengths == NULL) return NULL; + + if(alignment.cigar) { + for(unsigned cigar_idx = 0; cigar_idx < (unsigned)alignment.n_cigar; ++cigar_idx) { + jchar cigar_operator = "MIDS"[alignment.cigar[cigar_idx]>>14]; + jint cigar_length = alignment.cigar[cigar_idx]&0x3fff; + + env->SetCharArrayRegion(java_cigar_operators,cigar_idx,1,&cigar_operator); + if(env->ExceptionCheck()) return NULL; + env->SetIntArrayRegion(java_cigar_lengths,cigar_idx,1,&cigar_length); + if(env->ExceptionCheck()) return NULL; + } + } + else { + if(alignment.type != BWA_TYPE_NO_MATCH) { + jchar cigar_operator = 'M'; + env->SetCharArrayRegion(java_cigar_operators,0,1,&cigar_operator); + if(env->ExceptionCheck()) return NULL; + env->SetIntArrayRegion(java_cigar_lengths,0,1,&read_length); + if(env->ExceptionCheck()) return NULL; + } + } + delete[] alignment.cigar; + + jclass java_alignment_class = env->FindClass("org/broadinstitute/sting/alignment/Alignment"); + if(java_alignment_class == NULL) return NULL; + + jmethodID java_alignment_constructor = env->GetMethodID(java_alignment_class, "", "(IIZI[C[IILjava/lang/String;IIIII)V"); + if(java_alignment_constructor == NULL) return NULL; + + jstring java_md = env->NewStringUTF(alignment.md); + if(java_md == NULL) return NULL; + delete[] alignment.md; + + jobject java_alignment = env->NewObject(java_alignment_class, + java_alignment_constructor, + alignment.contig, + alignment.pos, + alignment.negative_strand, + alignment.mapping_quality, + java_cigar_operators, + java_cigar_lengths, + alignment.edit_distance, + java_md, + alignment.num_mismatches, + alignment.num_gap_opens, + alignment.num_gap_extensions, + alignment.num_best, + alignment.num_second_best); + if(java_alignment == NULL) return NULL; + + env->DeleteLocalRef(java_alignment_class); + if(env->ExceptionCheck()) return NULL; + + return java_alignment; +} + +static jstring get_configuration_file(JNIEnv* env, jobject configuration, const char* field_name) { + jclass configuration_class = env->GetObjectClass(configuration); + if(configuration_class == NULL) return NULL; + + jfieldID configuration_field = env->GetFieldID(configuration_class, field_name, "Ljava/io/File;"); + if(configuration_field == NULL) return NULL; + + jobject configuration_file = (jobject)env->GetObjectField(configuration,configuration_field); + + jclass file_class = env->FindClass("java/io/File"); + if(file_class == NULL) return NULL; + + jmethodID path_extractor = env->GetMethodID(file_class,"getAbsolutePath", "()Ljava/lang/String;"); + if(path_extractor == NULL) return NULL; + + jstring path = (jstring)env->CallObjectMethod(configuration_file,path_extractor); + if(path == NULL) return NULL; + + env->DeleteLocalRef(configuration_class); + env->DeleteLocalRef(file_class); + env->DeleteLocalRef(configuration_file); + + return path; +} + +static void set_int_configuration_param(JNIEnv* env, jobject configuration, const char* field_name, BWA* bwa, int_setter setter) { + jclass configuration_class = env->GetObjectClass(configuration); + if(configuration_class == NULL) return; + + jfieldID configuration_field = env->GetFieldID(configuration_class, field_name, "Ljava/lang/Integer;"); + if(configuration_field == NULL) return; + + jobject boxed_value = env->GetObjectField(configuration,configuration_field); + if(env->ExceptionCheck()) return; + + if(boxed_value != NULL) { + jclass int_box_class = env->FindClass("java/lang/Integer"); + if(int_box_class == NULL) return; + + jmethodID int_extractor = env->GetMethodID(int_box_class,"intValue", "()I"); + if(int_extractor == NULL) return; + + jint value = env->CallIntMethod(boxed_value,int_extractor); + if(env->ExceptionCheck()) return; + + if(value < 0) + { + throw_config_value_exception(env,field_name,"cannot be set to a negative value"); + return; + } + + (bwa->*setter)(value); + + env->DeleteLocalRef(int_box_class); + } + + env->DeleteLocalRef(boxed_value); + env->DeleteLocalRef(configuration_class); +} + +static void set_float_configuration_param(JNIEnv* env, jobject configuration, const char* field_name, BWA* bwa, float_setter setter) +{ + jclass configuration_class = env->GetObjectClass(configuration); + if(configuration_class == NULL) return; + + jfieldID configuration_field = env->GetFieldID(configuration_class, field_name, "Ljava/lang/Float;"); + if(configuration_field == NULL) return; + + jobject boxed_value = env->GetObjectField(configuration,configuration_field); + if(boxed_value != NULL) { + jclass float_box_class = env->FindClass("java/lang/Float"); + if(float_box_class == NULL) return; + + jmethodID float_extractor = env->GetMethodID(float_box_class,"floatValue", "()F"); + if(float_extractor == NULL) return; + + jfloat value = env->CallFloatMethod(boxed_value,float_extractor); + if(env->ExceptionCheck()) return; + + if(value < 0) + { + throw_config_value_exception(env,field_name,"cannot be set to a negative value"); + return; + } + + (bwa->*setter)(value); + + env->DeleteLocalRef(float_box_class); + } + + env->DeleteLocalRef(boxed_value); + env->DeleteLocalRef(configuration_class); +} + +static void throw_config_value_exception(JNIEnv* env, const char* field_name, const char* message) +{ + char* buffer = new char[strlen(field_name)+1+strlen(message)+1]; + sprintf(buffer,"%s %s",field_name,message); + jclass sting_exception_class = env->FindClass("org/broadinstitute/sting/utils/StingException"); + if(sting_exception_class == NULL) return; + env->ThrowNew(sting_exception_class, buffer); + delete[] buffer; +} diff --git a/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.h b/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.h new file mode 100644 index 000000000..0c44e430a --- /dev/null +++ b/public/c/bwa/org_broadinstitute_sting_alignment_bwa_c_BWACAligner.h @@ -0,0 +1,61 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_broadinstitute_sting_alignment_bwa_c_BWACAligner */ + +#ifndef _Included_org_broadinstitute_sting_alignment_bwa_c_BWACAligner +#define _Included_org_broadinstitute_sting_alignment_bwa_c_BWACAligner +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: create + * Signature: (Lorg/broadinstitute/sting/alignment/bwa/BWTFiles;Lorg/broadinstitute/sting/alignment/bwa/BWAConfiguration;)J + */ +JNIEXPORT jlong JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_create + (JNIEnv *, jobject, jobject, jobject); + +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: updateConfiguration + * Signature: (JLorg/broadinstitute/sting/alignment/bwa/BWAConfiguration;)V + */ +JNIEXPORT void JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_updateConfiguration + (JNIEnv *, jobject, jlong, jobject); + +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: destroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_destroy + (JNIEnv *, jobject, jlong); + +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: getPaths + * Signature: (J[B)[Lorg/broadinstitute/sting/alignment/bwa/c/BWAPath; + */ +JNIEXPORT jobjectArray JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_getPaths + (JNIEnv *, jobject, jlong, jbyteArray); + +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: convertPathsToAlignments + * Signature: (J[B[Lorg/broadinstitute/sting/alignment/bwa/c/BWAPath;)[Lorg/broadinstitute/sting/alignment/Alignment; + */ +JNIEXPORT jobjectArray JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_convertPathsToAlignments + (JNIEnv *, jobject, jlong, jbyteArray, jobjectArray); + +/* + * Class: org_broadinstitute_sting_alignment_bwa_c_BWACAligner + * Method: getBestAlignment + * Signature: (J[B)Lorg/broadinstitute/sting/alignment/Alignment; + */ +JNIEXPORT jobject JNICALL Java_org_broadinstitute_sting_alignment_bwa_c_BWACAligner_getBestAlignment + (JNIEnv *, jobject, jlong, jbyteArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/public/c/libenvironhack/Makefile b/public/c/libenvironhack/Makefile new file mode 100644 index 000000000..302ff8e31 --- /dev/null +++ b/public/c/libenvironhack/Makefile @@ -0,0 +1,10 @@ +CC=gcc +CCFLAGS=-Wall -dynamiclib -arch i386 -arch x86_64 + +libenvironhack.dylib: libenvironhack.c + $(CC) $(CCFLAGS) -init _init_environ $< -o $@ + +all: libenvironhack.dylib + +clean: + rm -f libenvironhack.dylib diff --git a/public/c/libenvironhack/libenvironhack.c b/public/c/libenvironhack/libenvironhack.c new file mode 100644 index 000000000..8b2a2640e --- /dev/null +++ b/public/c/libenvironhack/libenvironhack.c @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* +LSF 7.0.6 on the mac is missing the unsatisfied exported symbol for environ which was removed on MacOS X 10.5+. +nm $LSF_LIBDIR/liblsf.dylib | grep environ +See "man environ" for more info, along with http://lists.apple.com/archives/java-dev/2007/Dec/msg00096.html +*/ + +#include + +char **environ = (char **)0; + +void init_environ(void) { + environ = (*_NSGetEnviron()); +} diff --git a/public/c/libenvironhack/libenvironhack.dylib b/public/c/libenvironhack/libenvironhack.dylib new file mode 100755 index 0000000000000000000000000000000000000000..a45e038b49f238f1ce5138fed4d11dbebccb03b1 GIT binary patch literal 28904 zcmeI4O-!6c7{_OEp=)i+8ZkkwWiJ@x2T0OHZbAbVv{nK%HX%CQg)O^w7YHm0wTY`l z10mI3y{bnKJsHyw)1+M5gL?B~43{RD)WjGM+QhE^|2yyO7YM1nDE^;h_L*lso_F5g z>?S*(H||{d+8EP-un*xrW8zR;_*MdUd!$FM$lUKh$hL1ItsaeRDoPV++Yt zF752C^~sv`*!Wxema|rkMU9!jlL;q91pX$B;>%Fa28F|NHu%`JflazNUAp`N)N1iKK1&-eZMFD(V4YgIIkI#s8YGTw#xV$5jbB`P z6nQK0rS<68^=pVaiEn%yL-3}w2#A0Ph=2%)fCz|y2#A0Ph=2%)z}_M78)fgjj^0EB zL_h>YKmYKm53ko34J=_#u z&RMme$ZJ6T2Kb94u){r{;b#48%4X8ZiS(@D&V4&qm`~YMc4{I!HHnPe3^LrNetUL) zYTV|gr_asLxUx2%9MAaLHr(fKY<4PJs95&o$nkWc-)(|7b8wqWC-T!1^KO%VZ4+gQ zfCz|y2#A0Ph=2%)fCz|y2#CPHj=;C>{C|XFZ;sJ<_PU5cHqZZ49zj^fcz)YE09e2k zW6Vit^E@}l`FwWKbw}JQL-O%=R`IvgKHkb5WF;n0)OKtmj z=7bV+%FwRn#`fX0%Cg)24Xt(lXz$cMawFp{cOfLgM~41PXa`4SkX7HVyS*EMXKeV~ zkHUUN^dE`8JE8lNmW}22Z@+Qr^FOW}Yk2W{GUWXQtqJ$LEkb8tSKpoB`<-R^Tdd{` zvqlyYwf#aKEMLAm0X9+b``?XlH+LtX_?CLQKY>&vA|L`HAOa#F0wN#+{|5rSBPT9C zzVu6})H_mYe+O^e+-6Gc=MgzIuyS*gf3XKv&A>|I+lXDiR%)MwhM?B#P(Q7eN+qt# zQzGYwO=KY+i67V(yM#aN&miqE!j~vRd61%0GQ~{ z0r+)#e->alT;J?LnPx1S`t{jC+HmaGKVO6G&jKJCtVeQ9GJ%!Zd)dQZ*`vSHj(ubP E0>D0Q!T getAllAlignments(final byte[] bases); + + /** + * Get a iterator of aligned reads, batched by mapping quality. + * @param read Read to align. + * @param newHeader Optional new header to use when aligning the read. If present, it must be null. + * @return Iterator to alignments. + */ + public Iterable alignAll(final SAMRecord read, final SAMFileHeader newHeader); +} + + diff --git a/public/java/src/org/broadinstitute/sting/alignment/Alignment.java b/public/java/src/org/broadinstitute/sting/alignment/Alignment.java new file mode 100644 index 000000000..ebbc8c1b8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/Alignment.java @@ -0,0 +1,221 @@ +package org.broadinstitute.sting.alignment; + +import net.sf.samtools.*; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.Utils; + +/** + * Represents an alignment of a read to a site in the reference genome. + * + * @author mhanna + * @version 0.1 + */ +public class Alignment { + protected int contigIndex; + protected long alignmentStart; + protected boolean negativeStrand; + protected int mappingQuality; + + protected char[] cigarOperators; + protected int[] cigarLengths; + + protected int editDistance; + protected String mismatchingPositions; + + protected int numMismatches; + protected int numGapOpens; + protected int numGapExtensions; + protected int bestCount; + protected int secondBestCount; + + /** + * Gets the index of the given contig. + * @return the inde + */ + public int getContigIndex() { return contigIndex; } + + /** + * Gets the starting position for the given alignment. + * @return Starting position. + */ + public long getAlignmentStart() { return alignmentStart; } + + /** + * Is the given alignment on the reverse strand? + * @return True if the alignment is on the reverse strand. + */ + public boolean isNegativeStrand() { return negativeStrand; } + + /** + * Gets the score of this alignment. + * @return The score. + */ + public int getMappingQuality() { return mappingQuality; } + + /** + * Gets the edit distance; will eventually end up in the NM SAM tag + * if this alignment makes it that far. + * @return The edit distance. + */ + public int getEditDistance() { return editDistance; } + + /** + * A string representation of which positions mismatch; contents of MD tag. + * @return String representation of mismatching positions. + */ + public String getMismatchingPositions() { return mismatchingPositions; } + + /** + * Gets the number of mismatches in the read. + * @return Number of mismatches. + */ + public int getNumMismatches() { return numMismatches; } + + /** + * Get the number of gap opens. + * @return Number of gap opens. + */ + public int getNumGapOpens() { return numGapOpens; } + + /** + * Get the number of gap extensions. + * @return Number of gap extensions. + */ + public int getNumGapExtensions() { return numGapExtensions; } + + /** + * Get the number of best alignments. + * @return Number of top scoring alignments. + */ + public int getBestCount() { return bestCount; } + + /** + * Get the number of second best alignments. + * @return Number of second best scoring alignments. + */ + public int getSecondBestCount() { return secondBestCount; } + + /** + * Gets the cigar for this alignment. + * @return sam-jdk formatted alignment. + */ + public Cigar getCigar() { + Cigar cigar = new Cigar(); + for(int i = 0; i < cigarOperators.length; i++) { + CigarOperator operator = CigarOperator.characterToEnum(cigarOperators[i]); + cigar.add(new CigarElement(cigarLengths[i],operator)); + } + return cigar; + } + + /** + * Temporarily implement getCigarString() for debugging; the TextCigarCodec is unfortunately + * package-protected. + * @return + */ + public String getCigarString() { + Cigar cigar = getCigar(); + if(cigar.isEmpty()) return "*"; + + StringBuilder cigarString = new StringBuilder(); + for(CigarElement element: cigar.getCigarElements()) { + cigarString.append(element.getLength()); + cigarString.append(element.getOperator()); + } + return cigarString.toString(); + } + + /** + * Stub for inheritance. + */ + public Alignment() {} + + /** + * Create a new alignment object. + * @param contigIndex The contig to which this read aligned. + * @param alignmentStart The point within the contig to which this read aligned. + * @param negativeStrand Forward or reverse alignment of the given read. + * @param mappingQuality How good does BWA think this mapping is? + * @param cigarOperators The ordered operators in the cigar string. + * @param cigarLengths The lengths to which each operator applies. + * @param editDistance The edit distance (cumulative) of the read. + * @param mismatchingPositions String representation of which bases in the read mismatch. + * @param numMismatches Number of total mismatches in the read. + * @param numGapOpens Number of gap opens in the read. + * @param numGapExtensions Number of gap extensions in the read. + * @param bestCount Number of best alignments in the read. + * @param secondBestCount Number of second best alignments in the read. + */ + public Alignment(int contigIndex, + int alignmentStart, + boolean negativeStrand, + int mappingQuality, + char[] cigarOperators, + int[] cigarLengths, + int editDistance, + String mismatchingPositions, + int numMismatches, + int numGapOpens, + int numGapExtensions, + int bestCount, + int secondBestCount) { + this.contigIndex = contigIndex; + this.alignmentStart = alignmentStart; + this.negativeStrand = negativeStrand; + this.mappingQuality = mappingQuality; + this.cigarOperators = cigarOperators; + this.cigarLengths = cigarLengths; + this.editDistance = editDistance; + this.mismatchingPositions = mismatchingPositions; + this.numMismatches = numMismatches; + this.numGapOpens = numGapOpens; + this.numGapExtensions = numGapExtensions; + this.bestCount = bestCount; + this.secondBestCount = secondBestCount; + } + + /** + * Creates a read directly from an alignment. + * @param alignment The alignment to convert to a read. + * @param unmappedRead Source of the unmapped read. Should have bases, quality scores, and flags. + * @param newSAMHeader The new SAM header to use in creating this read. Can be null, but if so, the sequence + * dictionary in the + * @return A mapped alignment. + */ + public static SAMRecord convertToRead(Alignment alignment, SAMRecord unmappedRead, SAMFileHeader newSAMHeader) { + SAMRecord read; + try { + read = (SAMRecord)unmappedRead.clone(); + } + catch(CloneNotSupportedException ex) { + throw new ReviewedStingException("Unable to create aligned read from template."); + } + + if(newSAMHeader != null) + read.setHeader(newSAMHeader); + + // If we're realigning a previously aligned record, strip out the placement of the alignment. + read.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME); + read.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); + read.setMateReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME); + read.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START); + + if(alignment != null) { + read.setReadUnmappedFlag(false); + read.setReferenceIndex(alignment.getContigIndex()); + read.setAlignmentStart((int)alignment.getAlignmentStart()); + read.setReadNegativeStrandFlag(alignment.isNegativeStrand()); + read.setMappingQuality(alignment.getMappingQuality()); + read.setCigar(alignment.getCigar()); + if(alignment.isNegativeStrand()) { + read.setReadBases(BaseUtils.simpleReverseComplement(read.getReadBases())); + read.setBaseQualities(Utils.reverse(read.getBaseQualities())); + } + read.setAttribute("NM",alignment.getEditDistance()); + read.setAttribute("MD",alignment.getMismatchingPositions()); + } + + return read; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/AlignmentValidationWalker.java b/public/java/src/org/broadinstitute/sting/alignment/AlignmentValidationWalker.java new file mode 100644 index 000000000..16e713bf6 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/AlignmentValidationWalker.java @@ -0,0 +1,157 @@ +/* + * 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.alignment; + +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.alignment.bwa.c.BWACAligner; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.bwa.BWTFiles; +import net.sf.samtools.SAMRecord; + +import java.util.Iterator; + +/** + * Validates consistency of the aligner interface by taking reads already aligned by BWA in a BAM file, stripping them + * of their alignment data, realigning them, and making sure one of the best resulting realignments matches the original + * alignment from the input file. + * + * @author mhanna + * @version 0.1 + */ +public class AlignmentValidationWalker extends ReadWalker { + /** + * The supporting BWT index generated using BWT. + */ + @Argument(fullName="BWTPrefix",shortName="BWT",doc="Index files generated by bwa index -d bwtsw",required=false) + private String prefix = null; + + /** + * The instance used to generate alignments. + */ + private BWACAligner aligner = null; + + /** + * Create an aligner object. The aligner object will load and hold the BWT until close() is called. + */ + @Override + public void initialize() { + if(prefix == null) + prefix = getToolkit().getArguments().referenceFile.getAbsolutePath(); + BWTFiles bwtFiles = new BWTFiles(prefix); + BWAConfiguration configuration = new BWAConfiguration(); + aligner = new BWACAligner(bwtFiles,configuration); + } + + /** + * Aligns a read to the given reference. + * @param ref Reference over the read. Read will most likely be unmapped, so ref will be null. + * @param read Read to align. + * @return Number of reads aligned by this map (aka 1). + */ + @Override + public Integer map(ReferenceContext ref, SAMRecord read, ReadMetaDataTracker metaDataTracker) { + //logger.info(String.format("examining read %s", read.getReadName())); + + byte[] bases = read.getReadBases(); + if(read.getReadNegativeStrandFlag()) bases = BaseUtils.simpleReverseComplement(bases); + + boolean matches = true; + Iterable alignments = aligner.getAllAlignments(bases); + Iterator alignmentIterator = alignments.iterator(); + + if(!alignmentIterator.hasNext()) { + matches = read.getReadUnmappedFlag(); + } + else { + Alignment[] alignmentsOfBestQuality = alignmentIterator.next(); + for(Alignment alignment: alignmentsOfBestQuality) { + matches = (alignment.getContigIndex() == read.getReferenceIndex()); + matches &= (alignment.getAlignmentStart() == read.getAlignmentStart()); + matches &= (alignment.isNegativeStrand() == read.getReadNegativeStrandFlag()); + matches &= (alignment.getCigar().equals(read.getCigar())); + matches &= (alignment.getMappingQuality() == read.getMappingQuality()); + if(matches) break; + } + } + + if(!matches) { + logger.error("Found mismatch!"); + logger.error(String.format("Read %s:",read.getReadName())); + logger.error(String.format(" Contig index: %d",read.getReferenceIndex())); + logger.error(String.format(" Alignment start: %d", read.getAlignmentStart())); + logger.error(String.format(" Negative strand: %b", read.getReadNegativeStrandFlag())); + logger.error(String.format(" Cigar: %s%n", read.getCigarString())); + logger.error(String.format(" Mapping quality: %s%n", read.getMappingQuality())); + for(Alignment[] alignmentsByScore: alignments) { + for(int i = 0; i < alignmentsByScore.length; i++) { + logger.error(String.format("Alignment %d:",i)); + logger.error(String.format(" Contig index: %d",alignmentsByScore[i].getContigIndex())); + logger.error(String.format(" Alignment start: %d", alignmentsByScore[i].getAlignmentStart())); + logger.error(String.format(" Negative strand: %b", alignmentsByScore[i].isNegativeStrand())); + logger.error(String.format(" Cigar: %s", alignmentsByScore[i].getCigarString())); + logger.error(String.format(" Mapping quality: %s%n", alignmentsByScore[i].getMappingQuality())); + } + } + throw new ReviewedStingException(String.format("Read %s mismatches!", read.getReadName())); + } + + return 1; + } + + /** + * Initial value for reduce. In this case, validated reads will be counted. + * @return 0, indicating no reads yet validated. + */ + @Override + public Integer reduceInit() { return 0; } + + /** + * Calculates the number of reads processed. + * @param value Number of reads processed by this map. + * @param sum Number of reads processed before this map. + * @return Number of reads processed up to and including this map. + */ + @Override + public Integer reduce(Integer value, Integer sum) { + return value + sum; + } + + /** + * Cleanup. + * @param result Number of reads processed. + */ + @Override + public void onTraversalDone(Integer result) { + aligner.close(); + super.onTraversalDone(result); + } + +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/AlignmentWalker.java b/public/java/src/org/broadinstitute/sting/alignment/AlignmentWalker.java new file mode 100644 index 000000000..e97d7a56f --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/AlignmentWalker.java @@ -0,0 +1,133 @@ +/* + * 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.alignment; + +import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.walkers.WalkerName; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.alignment.bwa.c.BWACAligner; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.bwa.BWTFiles; +import net.sf.samtools.*; +import net.sf.picard.reference.ReferenceSequenceFileFactory; + +import java.io.File; +import java.io.PrintStream; + +/** + * Aligns reads to a given reference using Heng Li's BWA aligner, presenting the resulting alignments in SAM or BAM format. + * Mimics the steps 'bwa aln' followed by 'bwa samse' using the BWA/C implementation. + * + * @author mhanna + * @version 0.1 + */ +@WalkerName("Align") +public class AlignmentWalker extends ReadWalker { + @Argument(fullName="target_reference",shortName="target_ref",doc="The reference to which reads in the source file should be aligned. Alongside this reference should sit index files " + + "generated by bwa index -d bwtsw. If unspecified, will default " + + "to the reference specified via the -R argument.",required=false) + private File targetReferenceFile = null; + + @Output + private StingSAMFileWriter out = null; + + /** + * The actual aligner. + */ + private BWACAligner aligner = null; + + /** + * New header to use, if desired. + */ + private SAMFileHeader header; + + /** + * Create an aligner object. The aligner object will load and hold the BWT until close() is called. + */ + @Override + public void initialize() { + if(targetReferenceFile == null) + targetReferenceFile = getToolkit().getArguments().referenceFile; + BWTFiles bwtFiles = new BWTFiles(targetReferenceFile.getAbsolutePath()); + BWAConfiguration configuration = new BWAConfiguration(); + aligner = new BWACAligner(bwtFiles,configuration); + + // Take the header of the SAM file, tweak it by adding in the reference dictionary and specifying that the target file is unsorted. + header = getToolkit().getSAMFileHeader().clone(); + SAMSequenceDictionary referenceDictionary = + ReferenceSequenceFileFactory.getReferenceSequenceFile(targetReferenceFile).getSequenceDictionary(); + header.setSequenceDictionary(referenceDictionary); + header.setSortOrder(SAMFileHeader.SortOrder.unsorted); + + out.writeHeader(header); + } + + /** + * Aligns a read to the given reference. + * @param ref Reference over the read. Read will most likely be unmapped, so ref will be null. + * @param read Read to align. + * @return Number of alignments found for this read. + */ + @Override + public Integer map(ReferenceContext ref, SAMRecord read, ReadMetaDataTracker metaDataTracker) { + SAMRecord alignedRead = aligner.align(read,header); + out.addAlignment(alignedRead); + return 1; + } + + /** + * Initial value for reduce. In this case, alignments will be counted. + * @return 0, indicating no alignments yet found. + */ + @Override + public Integer reduceInit() { return 0; } + + /** + * Calculates the number of alignments found. + * @param value Number of alignments found by this map. + * @param sum Number of alignments found before this map. + * @return Number of alignments found up to and including this map. + */ + @Override + public Integer reduce(Integer value, Integer sum) { + return value + sum; + } + + /** + * Cleanup. + * @param result Number of reads processed. + */ + @Override + public void onTraversalDone(Integer result) { + aligner.close(); + super.onTraversalDone(result); + } + +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/CountBestAlignmentsWalker.java b/public/java/src/org/broadinstitute/sting/alignment/CountBestAlignmentsWalker.java new file mode 100644 index 000000000..1a1e1197d --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/CountBestAlignmentsWalker.java @@ -0,0 +1,125 @@ +/* + * 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.alignment; + +import org.broadinstitute.sting.gatk.refdata.ReadMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.alignment.bwa.BWTFiles; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.bwa.c.BWACAligner; +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import net.sf.samtools.SAMRecord; + +import java.util.*; +import java.io.PrintStream; + +/** + * Counts the number of best alignments as presented by BWA and outputs a histogram of number of placements vs. the + * frequency of that number of placements. + * + * @author mhanna + * @version 0.1 + */ +public class CountBestAlignmentsWalker extends ReadWalker { + /** + * The supporting BWT index generated using BWT. + */ + @Argument(fullName="BWTPrefix",shortName="BWT",doc="Index files generated by bwa index -d bwtsw",required=false) + private String prefix = null; + + @Output + private PrintStream out = null; + + /** + * The actual aligner. + */ + private Aligner aligner = null; + + private SortedMap alignmentFrequencies = new TreeMap(); + + /** + * Create an aligner object. The aligner object will load and hold the BWT until close() is called. + */ + @Override + public void initialize() { + if(prefix == null) + prefix = getToolkit().getArguments().referenceFile.getAbsolutePath(); + BWTFiles bwtFiles = new BWTFiles(prefix); + BWAConfiguration configuration = new BWAConfiguration(); + aligner = new BWACAligner(bwtFiles,configuration); + } + + /** + * Aligns a read to the given reference. + * @param ref Reference over the read. Read will most likely be unmapped, so ref will be null. + * @param read Read to align. + * @return Number of alignments found for this read. + */ + @Override + public Integer map(ReferenceContext ref, SAMRecord read, ReadMetaDataTracker metaDataTracker) { + Iterator alignmentIterator = aligner.getAllAlignments(read.getReadBases()).iterator(); + if(alignmentIterator.hasNext()) { + int numAlignments = alignmentIterator.next().length; + if(alignmentFrequencies.containsKey(numAlignments)) + alignmentFrequencies.put(numAlignments,alignmentFrequencies.get(numAlignments)+1); + else + alignmentFrequencies.put(numAlignments,1); + } + return 1; + } + + /** + * Initial value for reduce. In this case, validated reads will be counted. + * @return 0, indicating no reads yet validated. + */ + @Override + public Integer reduceInit() { return 0; } + + /** + * Calculates the number of reads processed. + * @param value Number of reads processed by this map. + * @param sum Number of reads processed before this map. + * @return Number of reads processed up to and including this map. + */ + @Override + public Integer reduce(Integer value, Integer sum) { + return value + sum; + } + + /** + * Cleanup. + * @param result Number of reads processed. + */ + @Override + public void onTraversalDone(Integer result) { + aligner.close(); + for(Map.Entry alignmentFrequency: alignmentFrequencies.entrySet()) + out.printf("%d\t%d%n", alignmentFrequency.getKey(), alignmentFrequency.getValue()); + super.onTraversalDone(result); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAAligner.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAAligner.java new file mode 100644 index 000000000..ddbf784f5 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAAligner.java @@ -0,0 +1,38 @@ +package org.broadinstitute.sting.alignment.bwa; + +import org.broadinstitute.sting.alignment.Aligner; + +/** + * Align reads using BWA. + * + * @author mhanna + * @version 0.1 + */ +public abstract class BWAAligner implements Aligner { + /** + * The supporting files used by BWA. + */ + protected BWTFiles bwtFiles; + + /** + * The current configuration for the BWA aligner. + */ + protected BWAConfiguration configuration; + + /** + * Create a new BWAAligner. Purpose of this call is to ensure that all BWA constructors accept the correct + * parameters. + * @param bwtFiles The many files representing BWTs persisted to disk. + * @param configuration Configuration parameters for the alignment. + */ + public BWAAligner(BWTFiles bwtFiles, BWAConfiguration configuration) { + this.bwtFiles = bwtFiles; + this.configuration = configuration; + } + + /** + * Update the configuration passed to the BWA aligner. + * @param configuration New configuration to set. + */ + public abstract void updateConfiguration(BWAConfiguration configuration); +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAConfiguration.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAConfiguration.java new file mode 100644 index 000000000..73441cb6a --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWAConfiguration.java @@ -0,0 +1,44 @@ +package org.broadinstitute.sting.alignment.bwa; + +/** + * Configuration for the BWA/C aligner. + * + * @author mhanna + * @version 0.1 + */ +public class BWAConfiguration { + /** + * The maximum edit distance used by BWA. + */ + public Float maximumEditDistance = null; + + /** + * How many gap opens are acceptable within this alignment? + */ + public Integer maximumGapOpens = null; + + /** + * How many gap extensions are acceptable within this alignment? + */ + public Integer maximumGapExtensions = null; + + /** + * Do we disallow indels within a certain range from the start / end? + */ + public Integer disallowIndelWithinRange = null; + + /** + * What is the scoring penalty for a mismatch? + */ + public Integer mismatchPenalty = null; + + /** + * What is the scoring penalty for a gap open? + */ + public Integer gapOpenPenalty = null; + + /** + * What is the scoring penalty for a gap extension? + */ + public Integer gapExtensionPenalty = null; +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/BWTFiles.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWTFiles.java new file mode 100644 index 000000000..cd7800900 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/BWTFiles.java @@ -0,0 +1,240 @@ +package org.broadinstitute.sting.alignment.bwa; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.alignment.reference.packing.PackUtils; +import org.broadinstitute.sting.alignment.reference.bwt.BWT; +import org.broadinstitute.sting.alignment.reference.bwt.BWTWriter; +import org.broadinstitute.sting.alignment.reference.bwt.SuffixArray; +import org.broadinstitute.sting.alignment.reference.bwt.SuffixArrayWriter; +import org.broadinstitute.sting.alignment.reference.bwt.ANNWriter; +import org.broadinstitute.sting.alignment.reference.bwt.AMBWriter; + +import java.io.File; +import java.io.IOException; + +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; +import net.sf.samtools.util.StringUtil; + +/** + * Support files for BWT. + * + * @author mhanna + * @version 0.1 + */ +public class BWTFiles { + /** + * ANN (?) file name. + */ + public final File annFile; + + /** + * AMB (?) file name. + */ + public final File ambFile; + + /** + * Packed reference sequence file. + */ + public final File pacFile; + + /** + * Reverse of packed reference sequence file. + */ + public final File rpacFile; + + /** + * Forward BWT file. + */ + public final File forwardBWTFile; + + /** + * Forward suffix array file. + */ + public final File forwardSAFile; + + /** + * Reverse BWT file. + */ + public final File reverseBWTFile; + + /** + * Reverse suffix array file. + */ + public final File reverseSAFile; + + /** + * Where these files autogenerated on the fly? + */ + public final boolean autogenerated; + + /** + * Create a new BWA configuration file using the given prefix. + * @param prefix Prefix to use when creating the configuration. Must not be null. + */ + public BWTFiles(String prefix) { + if(prefix == null) + throw new ReviewedStingException("Prefix must not be null."); + annFile = new File(prefix + ".ann"); + ambFile = new File(prefix + ".amb"); + pacFile = new File(prefix + ".pac"); + rpacFile = new File(prefix + ".rpac"); + forwardBWTFile = new File(prefix + ".bwt"); + forwardSAFile = new File(prefix + ".sa"); + reverseBWTFile = new File(prefix + ".rbwt"); + reverseSAFile = new File(prefix + ".rsa"); + autogenerated = false; + } + + /** + * Hand-create a new BWTFiles object, specifying a unique file object for each type. + * @param annFile ANN (alternate dictionary) file. + * @param ambFile AMB (holes) files. + * @param pacFile Packed representation of the forward reference sequence. + * @param forwardBWTFile BWT representation of the forward reference sequence. + * @param forwardSAFile SA representation of the forward reference sequence. + * @param rpacFile Packed representation of the reversed reference sequence. + * @param reverseBWTFile BWT representation of the reversed reference sequence. + * @param reverseSAFile SA representation of the reversed reference sequence. + */ + private BWTFiles(File annFile, + File ambFile, + File pacFile, + File forwardBWTFile, + File forwardSAFile, + File rpacFile, + File reverseBWTFile, + File reverseSAFile) { + this.annFile = annFile; + this.ambFile = ambFile; + this.pacFile = pacFile; + this.forwardBWTFile = forwardBWTFile; + this.forwardSAFile = forwardSAFile; + this.rpacFile = rpacFile; + this.reverseBWTFile = reverseBWTFile; + this.reverseSAFile = reverseSAFile; + autogenerated = true; + } + + /** + * Close out this files object, in the process deleting any temporary filse + * that were created. + */ + public void close() { + if(autogenerated) { + boolean success = true; + success = annFile.delete(); + success &= ambFile.delete(); + success &= pacFile.delete(); + success &= forwardBWTFile.delete(); + success &= forwardSAFile.delete(); + success &= rpacFile.delete(); + success &= reverseBWTFile.delete(); + success &= reverseSAFile.delete(); + + if(!success) + throw new ReviewedStingException("Unable to clean up autogenerated representation"); + } + } + + /** + * Create a new set of BWT files from the given reference sequence. + * @param referenceSequence Sequence from which to build metadata. + * @return A new object representing encoded representations of each sequence. + */ + public static BWTFiles createFromReferenceSequence(byte[] referenceSequence) { + byte[] normalizedReferenceSequence = new byte[referenceSequence.length]; + System.arraycopy(referenceSequence,0,normalizedReferenceSequence,0,referenceSequence.length); + normalizeReferenceSequence(normalizedReferenceSequence); + + File annFile,ambFile,pacFile,bwtFile,saFile,rpacFile,rbwtFile,rsaFile; + try { + // Write the ann and amb for this reference sequence. + annFile = File.createTempFile("bwt",".ann"); + ambFile = File.createTempFile("bwt",".amb"); + + SAMSequenceDictionary dictionary = new SAMSequenceDictionary(); + dictionary.addSequence(new SAMSequenceRecord("autogenerated",normalizedReferenceSequence.length)); + + ANNWriter annWriter = new ANNWriter(annFile); + annWriter.write(dictionary); + annWriter.close(); + + AMBWriter ambWriter = new AMBWriter(ambFile); + ambWriter.writeEmpty(dictionary); + ambWriter.close(); + + // Write the encoded files for the forward version of this reference sequence. + pacFile = File.createTempFile("bwt",".pac"); + bwtFile = File.createTempFile("bwt",".bwt"); + saFile = File.createTempFile("bwt",".sa"); + + writeEncodedReferenceSequence(normalizedReferenceSequence,pacFile,bwtFile,saFile); + + // Write the encoded files for the reverse version of this reference sequence. + byte[] reverseReferenceSequence = Utils.reverse(normalizedReferenceSequence); + + rpacFile = File.createTempFile("bwt",".rpac"); + rbwtFile = File.createTempFile("bwt",".rbwt"); + rsaFile = File.createTempFile("bwt",".rsa"); + + writeEncodedReferenceSequence(reverseReferenceSequence,rpacFile,rbwtFile,rsaFile); + } + catch(IOException ex) { + throw new ReviewedStingException("Unable to write autogenerated reference sequence to temporary files"); + } + + // Make sure that, at the very least, all temporary files are deleted on exit. + annFile.deleteOnExit(); + ambFile.deleteOnExit(); + pacFile.deleteOnExit(); + bwtFile.deleteOnExit(); + saFile.deleteOnExit(); + rpacFile.deleteOnExit(); + rbwtFile.deleteOnExit(); + rsaFile.deleteOnExit(); + + return new BWTFiles(annFile,ambFile,pacFile,bwtFile,saFile,rpacFile,rbwtFile,rsaFile); + } + + /** + * Write the encoded form of the reference sequence. In the case of BWA, the encoded reference + * sequence is the reference itself in PAC format, the BWT, and the suffix array. + * @param referenceSequence The reference sequence to encode. + * @param pacFile Target for the PAC-encoded reference. + * @param bwtFile Target for the BWT representation of the reference. + * @param suffixArrayFile Target for the suffix array encoding of the reference. + * @throws java.io.IOException In case of issues writing to the file. + */ + private static void writeEncodedReferenceSequence(byte[] referenceSequence, + File pacFile, + File bwtFile, + File suffixArrayFile) throws IOException { + PackUtils.writeReferenceSequence(pacFile,referenceSequence); + + BWT bwt = BWT.createFromReferenceSequence(referenceSequence); + BWTWriter bwtWriter = new BWTWriter(bwtFile); + bwtWriter.write(bwt); + bwtWriter.close(); + + SuffixArray suffixArray = SuffixArray.createFromReferenceSequence(referenceSequence); + SuffixArrayWriter suffixArrayWriter = new SuffixArrayWriter(suffixArrayFile); + suffixArrayWriter.write(suffixArray); + suffixArrayWriter.close(); + } + + /** + * Convert the given reference sequence into a form suitable for building into + * on-the-fly sequences. + * @param referenceSequence The reference sequence to normalize. + * @throws org.broadinstitute.sting.utils.exceptions.ReviewedStingException if normalized sequence cannot be generated. + */ + private static void normalizeReferenceSequence(byte[] referenceSequence) { + StringUtil.toUpperCase(referenceSequence); + for(byte base: referenceSequence) { + if(base != 'A' && base != 'C' && base != 'G' && base != 'T') + throw new ReviewedStingException(String.format("Base type %c is not supported when building references on-the-fly",(char)base)); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWACAligner.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWACAligner.java new file mode 100644 index 000000000..8631c42d8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWACAligner.java @@ -0,0 +1,258 @@ +package org.broadinstitute.sting.alignment.bwa.c; + +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMFileHeader; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.Alignment; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.bwa.BWTFiles; +import org.broadinstitute.sting.alignment.bwa.BWAAligner; + +import java.util.*; + +/** + * An aligner using the BWA/C implementation. + * + * @author mhanna + * @version 0.1 + */ +public class BWACAligner extends BWAAligner { + static { + System.loadLibrary("bwa"); + } + + /** + * A pointer to the C++ object representing the BWA engine. + */ + private long thunkPointer = 0; + + public BWACAligner(BWTFiles bwtFiles, BWAConfiguration configuration) { + super(bwtFiles,configuration); + if(thunkPointer != 0) + throw new ReviewedStingException("BWA/C attempting to reinitialize."); + + if(!bwtFiles.annFile.exists()) throw new ReviewedStingException("ANN file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.ambFile.exists()) throw new ReviewedStingException("AMB file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.pacFile.exists()) throw new ReviewedStingException("PAC file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.forwardBWTFile.exists()) throw new ReviewedStingException("Forward BWT file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.forwardSAFile.exists()) throw new ReviewedStingException("Forward SA file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.reverseBWTFile.exists()) throw new ReviewedStingException("Reverse BWT file is missing; please rerun 'bwa aln' to regenerate it."); + if(!bwtFiles.reverseSAFile.exists()) throw new ReviewedStingException("Reverse SA file is missing; please rerun 'bwa aln' to regenerate it."); + + thunkPointer = create(bwtFiles,configuration); + } + + /** + * Create an aligner object using an array of bytes as a reference. + * @param referenceSequence Reference sequence to encode ad-hoc. + * @param configuration Configuration for the given aligner. + */ + public BWACAligner(byte[] referenceSequence, BWAConfiguration configuration) { + this(BWTFiles.createFromReferenceSequence(referenceSequence),configuration); + // Now that the temporary files are created, the temporary files can be destroyed. + bwtFiles.close(); + } + + /** + * Update the configuration passed to the BWA aligner. + * @param configuration New configuration to set. + */ + @Override + public void updateConfiguration(BWAConfiguration configuration) { + if(thunkPointer == 0) + throw new ReviewedStingException("BWA/C: attempting to update configuration of uninitialized aligner."); + updateConfiguration(thunkPointer,configuration); + } + + /** + * Close this instance of the BWA pointer and delete its resources. + */ + @Override + public void close() { + if(thunkPointer == 0) + throw new ReviewedStingException("BWA/C close attempted, but BWA/C is not properly initialized."); + destroy(thunkPointer); + } + + /** + * Allow the aligner to choose one alignment randomly from the pile of best alignments. + * @param bases Bases to align. + * @return An align + */ + @Override + public Alignment getBestAlignment(final byte[] bases) { + if(thunkPointer == 0) + throw new ReviewedStingException("BWA/C getBestAlignment attempted, but BWA/C is not properly initialized."); + return getBestAlignment(thunkPointer,bases); + } + + /** + * Get the best aligned read, chosen randomly from the pile of best alignments. + * @param read Read to align. + * @param newHeader New header to apply to this SAM file. Can be null, but if so, read header must be valid. + * @return Read with injected alignment data. + */ + @Override + public SAMRecord align(final SAMRecord read, final SAMFileHeader newHeader) { + if(bwtFiles.autogenerated) + throw new UnsupportedOperationException("Cannot create target alignment; source contig was generated ad-hoc and is not reliable"); + return Alignment.convertToRead(getBestAlignment(read.getReadBases()),read,newHeader); + } + + /** + * Get a iterator of alignments, batched by mapping quality. + * @param bases List of bases. + * @return Iterator to alignments. + */ + @Override + public Iterable getAllAlignments(final byte[] bases) { + final BWAPath[] paths = getPaths(bases); + return new Iterable() { + public Iterator iterator() { + return new Iterator() { + /** + * The last position accessed. + */ + private int position = 0; + + /** + * Whether all alignments have been seen based on the current position. + * @return True if any more alignments are pending. False otherwise. + */ + public boolean hasNext() { return position < paths.length; } + + /** + * Return the next cross-section of alignments, based on mapping quality. + * @return Array of the next set of alignments of a given mapping quality. + */ + public Alignment[] next() { + if(position >= paths.length) + throw new UnsupportedOperationException("Out of alignments to return."); + int score = paths[position].score; + int startingPosition = position; + while(position < paths.length && paths[position].score == score) position++; + return convertPathsToAlignments(bases,Arrays.copyOfRange(paths,startingPosition,position)); + } + + /** + * Unsupported. + */ + public void remove() { throw new UnsupportedOperationException("Cannot remove from an alignment iterator"); } + }; + } + }; + } + + /** + * Get a iterator of aligned reads, batched by mapping quality. + * @param read Read to align. + * @param newHeader Optional new header to use when aligning the read. If present, it must be null. + * @return Iterator to alignments. + */ + @Override + public Iterable alignAll(final SAMRecord read, final SAMFileHeader newHeader) { + if(bwtFiles.autogenerated) + throw new UnsupportedOperationException("Cannot create target alignment; source contig was generated ad-hoc and is not reliable"); + final Iterable alignments = getAllAlignments(read.getReadBases()); + return new Iterable() { + public Iterator iterator() { + final Iterator alignmentIterator = alignments.iterator(); + return new Iterator() { + /** + * Whether all alignments have been seen based on the current position. + * @return True if any more alignments are pending. False otherwise. + */ + public boolean hasNext() { return alignmentIterator.hasNext(); } + + /** + * Return the next cross-section of alignments, based on mapping quality. + * @return Array of the next set of alignments of a given mapping quality. + */ + public SAMRecord[] next() { + Alignment[] alignmentsOfQuality = alignmentIterator.next(); + SAMRecord[] reads = new SAMRecord[alignmentsOfQuality.length]; + for(int i = 0; i < alignmentsOfQuality.length; i++) { + reads[i] = Alignment.convertToRead(alignmentsOfQuality[i],read,newHeader); + } + return reads; + } + + /** + * Unsupported. + */ + public void remove() { throw new UnsupportedOperationException("Cannot remove from an alignment iterator"); } + }; + } + }; + } + + /** + * Get the paths associated with the given base string. + * @param bases List of bases. + * @return A set of paths through the BWA. + */ + public BWAPath[] getPaths(byte[] bases) { + if(thunkPointer == 0) + throw new ReviewedStingException("BWA/C getPaths attempted, but BWA/C is not properly initialized."); + return getPaths(thunkPointer,bases); + } + + /** + * Create a pointer to the BWA/C thunk. + * @param files BWT source files. + * @param configuration Configuration of the aligner. + * @return Pointer to the BWA/C thunk. + */ + protected native long create(BWTFiles files, BWAConfiguration configuration); + + /** + * Update the configuration passed to the BWA aligner. For internal use only. + * @param thunkPointer pointer to BWA object. + * @param configuration New configuration to set. + */ + protected native void updateConfiguration(long thunkPointer, BWAConfiguration configuration); + + /** + * Destroy the BWA/C thunk. + * @param thunkPointer Pointer to the allocated thunk. + */ + protected native void destroy(long thunkPointer); + + /** + * Do the extra steps involved in converting a local alignment to a global alignment. + * @param bases ASCII representation of byte array. + * @param paths Paths through the current BWT. + * @return A list of alignments. + */ + protected Alignment[] convertPathsToAlignments(byte[] bases, BWAPath[] paths) { + if(thunkPointer == 0) + throw new ReviewedStingException("BWA/C convertPathsToAlignments attempted, but BWA/C is not properly initialized."); + return convertPathsToAlignments(thunkPointer,bases,paths); + } + + /** + * Caller to the path generation functionality within BWA/C. Call this method's getPaths() wrapper (above) instead. + * @param thunkPointer pointer to the C++ object managing BWA/C. + * @param bases ASCII representation of byte array. + * @return A list of paths through the specified BWT. + */ + protected native BWAPath[] getPaths(long thunkPointer, byte[] bases); + + /** + * Do the extra steps involved in converting a local alignment to a global alignment. + * Call this method's convertPathsToAlignments() wrapper (above) instead. + * @param thunkPointer pointer to the C++ object managing BWA/C. + * @param bases ASCII representation of byte array. + * @param paths Paths through the current BWT. + * @return A list of alignments. + */ + protected native Alignment[] convertPathsToAlignments(long thunkPointer, byte[] bases, BWAPath[] paths); + + /** + * Gets the best alignment from BWA/C, randomly selected from all best-aligned reads. + * @param thunkPointer Pointer to BWA thunk. + * @param bases bases to align. + * @return The best alignment from BWA/C. + */ + protected native Alignment getBestAlignment(long thunkPointer, byte[] bases); +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWAPath.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWAPath.java new file mode 100755 index 000000000..347d4344f --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/c/BWAPath.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2009 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.alignment.bwa.c; + +/** + * Models a BWA path. + * + * @author mhanna + * @version 0.1 + */ +public class BWAPath { + /** + * Number of mismatches encountered along this path. + */ + public final int numMismatches; + + /** + * Number of gap opens encountered along this path. + */ + public final int numGapOpens; + + /** + * Number of gap extensions along this path. + */ + public final int numGapExtensions; + + /** + * Whether this alignment was found on the positive or negative strand. + */ + public final boolean negativeStrand; + + /** + * Starting coordinate in the BWT. + */ + public final long k; + + /** + * Ending coordinate in the BWT. + */ + public final long l; + + /** + * The score of this path. + */ + public final int score; + + /** + * The number of best alignments seen along this path. + */ + public final int bestCount; + + /** + * The number of second best alignments seen along this path. + */ + public final int secondBestCount; + + /** + * Create a new path with the given attributes. + * @param numMismatches Number of mismatches along path. + * @param numGapOpens Number of gap opens along path. + * @param numGapExtensions Number of gap extensions along path. + * @param k Index to first coordinate within BWT. + * @param l Index to last coordinate within BWT. + * @param score Score of this alignment. Not the mapping quality. + */ + public BWAPath(int numMismatches, int numGapOpens, int numGapExtensions, boolean negativeStrand, long k, long l, int score, int bestCount, int secondBestCount) { + this.numMismatches = numMismatches; + this.numGapOpens = numGapOpens; + this.numGapExtensions = numGapExtensions; + this.negativeStrand = negativeStrand; + this.k = k; + this.l = l; + this.score = score; + this.bestCount = bestCount; + this.secondBestCount = secondBestCount; + } + +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignerTestHarness.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignerTestHarness.java new file mode 100644 index 000000000..ae6e22221 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignerTestHarness.java @@ -0,0 +1,165 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +import org.broadinstitute.sting.alignment.Aligner; +import org.broadinstitute.sting.alignment.Alignment; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.BaseUtils; + +import java.io.File; +import java.io.FileNotFoundException; + +import net.sf.samtools.*; +import net.sf.picard.reference.IndexedFastaSequenceFile; + +/** + * A test harness to ensure that the perfect aligner works. + * + * @author mhanna + * @version 0.1 + */ +public class AlignerTestHarness { + public static void main( String argv[] ) throws FileNotFoundException { + if( argv.length != 6 ) { + System.out.println("PerfectAlignerTestHarness "); + System.exit(1); + } + + File referenceFile = new File(argv[0]); + File bwtFile = new File(argv[1]); + File rbwtFile = new File(argv[2]); + File suffixArrayFile = new File(argv[3]); + File reverseSuffixArrayFile = new File(argv[4]); + File bamFile = new File(argv[5]); + + align(referenceFile,bwtFile,rbwtFile,suffixArrayFile,reverseSuffixArrayFile,bamFile); + } + + private static void align(File referenceFile, File bwtFile, File rbwtFile, File suffixArrayFile, File reverseSuffixArrayFile, File bamFile) throws FileNotFoundException { + Aligner aligner = new BWAJavaAligner(bwtFile,rbwtFile,suffixArrayFile,reverseSuffixArrayFile); + int count = 0; + + SAMFileReader reader = new SAMFileReader(bamFile); + reader.setValidationStringency(SAMFileReader.ValidationStringency.SILENT); + + int mismatches = 0; + int failures = 0; + + for(SAMRecord read: reader) { + count++; + if( count > 200000 ) break; + //if( count < 366000 ) continue; + //if( count > 2 ) break; + //if( !read.getReadName().endsWith("SL-XBC:1:82:506:404#0") ) + // continue; + //if( !read.getReadName().endsWith("SL-XBC:1:36:30:1926#0") ) + // continue; + //if( !read.getReadName().endsWith("SL-XBC:1:60:1342:1340#0") ) + // continue; + + SAMRecord alignmentCleaned = null; + try { + alignmentCleaned = (SAMRecord)read.clone(); + } + catch( CloneNotSupportedException ex ) { + throw new ReviewedStingException("SAMRecord clone not supported", ex); + } + + if( alignmentCleaned.getReadNegativeStrandFlag() ) + alignmentCleaned.setReadBases(BaseUtils.simpleReverseComplement(alignmentCleaned.getReadBases())); + + alignmentCleaned.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); + alignmentCleaned.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); + alignmentCleaned.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY); + alignmentCleaned.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR); + + // Clear everything except flags pertaining to pairing and set 'unmapped' status to true. + alignmentCleaned.setFlags(alignmentCleaned.getFlags() & 0x00A1 | 0x000C); + + Iterable alignments = aligner.getAllAlignments(alignmentCleaned.getReadBases()); + if(!alignments.iterator().hasNext() ) { + //throw new StingException(String.format("Unable to align read %s to reference; count = %d",read.getReadName(),count)); + System.out.printf("Unable to align read %s to reference; count = %d%n",read.getReadName(),count); + failures++; + } + + Alignment foundAlignment = null; + for(Alignment[] alignmentsOfQuality: alignments) { + for(Alignment alignment: alignmentsOfQuality) { + if( read.getReadNegativeStrandFlag() != alignment.isNegativeStrand() ) + continue; + if( read.getAlignmentStart() != alignment.getAlignmentStart() ) + continue; + + foundAlignment = alignment; + } + } + + if( foundAlignment != null ) { + //System.out.printf("%s: Aligned read to reference at position %d with %d mismatches, %d gap opens, and %d gap extensions.%n", read.getReadName(), foundAlignment.getAlignmentStart(), foundAlignment.getMismatches(), foundAlignment.getGapOpens(), foundAlignment.getGapExtensions()); + } + else { + System.out.printf("Error aligning read %s%n", read.getReadName()); + + mismatches++; + + IndexedFastaSequenceFile reference = new IndexedFastaSequenceFile(referenceFile); + + System.out.printf("read = %s, position = %d, negative strand = %b%n", formatBasesBasedOnCigar(read.getReadString(),read.getCigar(),CigarOperator.DELETION), + read.getAlignmentStart(), + read.getReadNegativeStrandFlag()); + int numDeletions = numDeletionsInCigar(read.getCigar()); + String expectedRef = new String(reference.getSubsequenceAt(reference.getSequenceDictionary().getSequences().get(0).getSequenceName(),read.getAlignmentStart(),read.getAlignmentStart()+read.getReadLength()+numDeletions-1).getBases()); + System.out.printf("expected ref = %s%n", formatBasesBasedOnCigar(expectedRef,read.getCigar(),CigarOperator.INSERTION)); + + for(Alignment[] alignmentsOfQuality: alignments) { + for(Alignment alignment: alignmentsOfQuality) { + System.out.println(); + + Cigar cigar = ((BWAAlignment)alignment).getCigar(); + + System.out.printf("read = %s%n", formatBasesBasedOnCigar(read.getReadString(),cigar,CigarOperator.DELETION)); + + int deletionCount = ((BWAAlignment)alignment).getNumberOfBasesMatchingState(AlignmentState.DELETION); + String alignedRef = new String(reference.getSubsequenceAt(reference.getSequenceDictionary().getSequences().get(0).getSequenceName(),alignment.getAlignmentStart(),alignment.getAlignmentStart()+read.getReadLength()+deletionCount-1).getBases()); + System.out.printf("actual ref = %s, position = %d, negative strand = %b%n", formatBasesBasedOnCigar(alignedRef,cigar,CigarOperator.INSERTION), + alignment.getAlignmentStart(), + alignment.isNegativeStrand()); + } + } + + //throw new StingException(String.format("Read %s was placed at incorrect location; count = %d%n",read.getReadName(),count)); + } + + + if( count % 1000 == 0 ) + System.out.printf("%d reads examined.%n",count); + } + + System.out.printf("%d reads examined; %d mismatches; %d failures.%n",count,mismatches,failures); + } + + private static String formatBasesBasedOnCigar( String bases, Cigar cigar, CigarOperator toBlank ) { + StringBuilder formatted = new StringBuilder(); + int readIndex = 0; + for(CigarElement cigarElement: cigar.getCigarElements()) { + if(cigarElement.getOperator() == toBlank) { + int number = cigarElement.getLength(); + while( number-- > 0 ) formatted.append(' '); + } + else { + int number = cigarElement.getLength(); + while( number-- > 0 ) formatted.append(bases.charAt(readIndex++)); + } + } + return formatted.toString(); + } + + private static int numDeletionsInCigar( Cigar cigar ) { + int numDeletions = 0; + for(CigarElement cigarElement: cigar.getCigarElements()) { + if(cigarElement.getOperator() == CigarOperator.DELETION) + numDeletions += cigarElement.getLength(); + } + return numDeletions; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentMatchSequence.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentMatchSequence.java new file mode 100644 index 000000000..879ecb5fb --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentMatchSequence.java @@ -0,0 +1,151 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.Deque; +import java.util.ArrayDeque; +import java.util.Iterator; + +import net.sf.samtools.Cigar; +import net.sf.samtools.CigarElement; +import net.sf.samtools.CigarOperator; + +/** + * Represents a sequence of matches. + * + * @author mhanna + * @version 0.1 + */ +public class AlignmentMatchSequence implements Cloneable { + /** + * Stores the particular match entries in the order they occur. + */ + private Deque entries = new ArrayDeque(); + + /** + * Clone the given match sequence. + * @return A deep copy of the current match sequence. + */ + public AlignmentMatchSequence clone() { + AlignmentMatchSequence copy = null; + try { + copy = (AlignmentMatchSequence)super.clone(); + } + catch( CloneNotSupportedException ex ) { + throw new ReviewedStingException("Unable to clone AlignmentMatchSequence."); + } + + copy.entries = new ArrayDeque(); + for( AlignmentMatchSequenceEntry entry: entries ) + copy.entries.add(entry.clone()); + + return copy; + } + + public Cigar convertToCigar(boolean negativeStrand) { + Cigar cigar = new Cigar(); + Iterator iterator = negativeStrand ? entries.descendingIterator() : entries.iterator(); + while( iterator.hasNext() ) { + AlignmentMatchSequenceEntry entry = iterator.next(); + CigarOperator operator; + switch( entry.getAlignmentState() ) { + case MATCH_MISMATCH: operator = CigarOperator.MATCH_OR_MISMATCH; break; + case INSERTION: operator = CigarOperator.INSERTION; break; + case DELETION: operator = CigarOperator.DELETION; break; + default: throw new ReviewedStingException("convertToCigar: cannot process state: " + entry.getAlignmentState()); + } + cigar.add( new CigarElement(entry.count,operator) ); + } + return cigar; + } + + /** + * All a new alignment of the given state. + * @param state State to add to the sequence. + */ + public void addNext( AlignmentState state ) { + AlignmentMatchSequenceEntry last = entries.peekLast(); + // If the last entry is the same as this one, increment it. Otherwise, add a new entry. + if( last != null && last.alignmentState == state ) + last.increment(); + else + entries.add(new AlignmentMatchSequenceEntry(state)); + } + + /** + * Gets the current state of this alignment (what's the state of the last base?) + * @return State of the most recently aligned base. + */ + public AlignmentState getCurrentState() { + if( entries.size() == 0 ) + return AlignmentState.MATCH_MISMATCH; + return entries.peekLast().getAlignmentState(); + } + + /** + * How many bases in the read match the given state. + * @param state State to test. + * @return number of bases which match that state. + */ + public int getNumberOfBasesMatchingState(AlignmentState state) { + int matches = 0; + for( AlignmentMatchSequenceEntry entry: entries ) { + if( entry.getAlignmentState() == state ) + matches += entry.count; + } + return matches; + } + + /** + * Stores an individual match sequence entry. + */ + private class AlignmentMatchSequenceEntry implements Cloneable { + /** + * The state of the alignment throughout a given point in the sequence. + */ + private final AlignmentState alignmentState; + + /** + * The number of bases having this particular state. + */ + private int count; + + /** + * Create a new sequence entry with the given state. + * @param alignmentState The state that this sequence should contain. + */ + AlignmentMatchSequenceEntry( AlignmentState alignmentState ) { + this.alignmentState = alignmentState; + this.count = 1; + } + + /** + * Clone the given match sequence entry. + * @return A deep copy of the current match sequence entry. + */ + public AlignmentMatchSequenceEntry clone() { + try { + return (AlignmentMatchSequenceEntry)super.clone(); + } + catch( CloneNotSupportedException ex ) { + throw new ReviewedStingException("Unable to clone AlignmentMatchSequenceEntry."); + } + } + + /** + * Retrieves the current state of the alignment. + * @return The state of the current sequence. + */ + AlignmentState getAlignmentState() { + return alignmentState; + } + + /** + * Increment the count of alignments having this particular state. + */ + void increment() { + count++; + } + } +} + diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentState.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentState.java new file mode 100644 index 000000000..92c603335 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/AlignmentState.java @@ -0,0 +1,13 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +/** + * The state of a given base in the alignment. + * + * @author mhanna + * @version 0.1 + */ +public enum AlignmentState { + MATCH_MISMATCH, + INSERTION, + DELETION +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAAlignment.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAAlignment.java new file mode 100644 index 000000000..c59546bbb --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAAlignment.java @@ -0,0 +1,190 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +import org.broadinstitute.sting.alignment.Alignment; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import net.sf.samtools.Cigar; + +/** + * An alignment object to be used incrementally as the BWA aligner + * inspects the read. + * + * @author mhanna + * @version 0.1 + */ +public class BWAAlignment extends Alignment implements Cloneable { + /** + * Track the number of alignments that have been created. + */ + private static long numCreated; + + /** + * Which number alignment is this? + */ + private long creationNumber; + + /** + * The aligner performing the alignments. + */ + protected BWAJavaAligner aligner; + + /** + * The sequence of matches/mismatches/insertions/deletions. + */ + private AlignmentMatchSequence alignmentMatchSequence = new AlignmentMatchSequence(); + + /** + * Working variable. How many bases have been matched at this point. + */ + protected int position; + + /** + * Working variable. How many mismatches have been encountered at this point. + */ + private int mismatches; + + /** + * Number of gap opens in alignment. + */ + private int gapOpens; + + /** + * Number of gap extensions in alignment. + */ + private int gapExtensions; + + /** + * Working variable. The lower bound of the alignment within the BWT. + */ + protected long loBound; + + /** + * Working variable. The upper bound of the alignment within the BWT. + */ + protected long hiBound; + + protected void setAlignmentStart(long position) { + this.alignmentStart = position; + } + + protected void setNegativeStrand(boolean negativeStrand) { + this.negativeStrand = negativeStrand; + } + + /** + * Cache the score. + */ + private int score; + + public Cigar getCigar() { + return alignmentMatchSequence.convertToCigar(isNegativeStrand()); + } + + /** + * Gets the current state of this alignment (state of the last base viewed).. + * @return Current state of the alignment. + */ + public AlignmentState getCurrentState() { + return alignmentMatchSequence.getCurrentState(); + } + + /** + * Adds the given state to the current alignment. + * @param state State to add to the given alignment. + */ + public void addState( AlignmentState state ) { + alignmentMatchSequence.addNext(state); + } + + /** + * Gets the BWA score of this alignment. + * @return BWA-style scores. 0 is best. + */ + public int getScore() { + return score; + } + + public int getMismatches() { return mismatches; } + public int getGapOpens() { return gapOpens; } + public int getGapExtensions() { return gapExtensions; } + + public void incrementMismatches() { + this.mismatches++; + updateScore(); + } + + public void incrementGapOpens() { + this.gapOpens++; + updateScore(); + } + + public void incrementGapExtensions() { + this.gapExtensions++; + updateScore(); + } + + /** + * Updates the score based on new information about matches / mismatches. + */ + private void updateScore() { + score = mismatches*aligner.MISMATCH_PENALTY + gapOpens*aligner.GAP_OPEN_PENALTY + gapExtensions*aligner.GAP_EXTENSION_PENALTY; + } + + /** + * Create a new alignment with the given parent aligner. + * @param aligner Aligner being used. + */ + public BWAAlignment( BWAJavaAligner aligner ) { + this.aligner = aligner; + this.creationNumber = numCreated++; + } + + /** + * Clone the alignment. + * @return New instance of the alignment. + */ + public BWAAlignment clone() { + BWAAlignment newAlignment = null; + try { + newAlignment = (BWAAlignment)super.clone(); + } + catch( CloneNotSupportedException ex ) { + throw new ReviewedStingException("Unable to clone BWAAlignment."); + } + newAlignment.creationNumber = numCreated++; + newAlignment.alignmentMatchSequence = alignmentMatchSequence.clone(); + + return newAlignment; + } + + /** + * How many bases in the read match the given state. + * @param state State to test. + * @return number of bases which match that state. + */ + public int getNumberOfBasesMatchingState(AlignmentState state) { + return alignmentMatchSequence.getNumberOfBasesMatchingState(state); + } + + /** + * Compare this alignment to another alignment. + * @param rhs Other alignment to which to compare. + * @return < 0 if this < other, == 0 if this == other, > 0 if this > other + */ + public int compareTo(Alignment rhs) { + BWAAlignment other = (BWAAlignment)rhs; + + // If the scores are different, disambiguate using the score. + if(score != other.score) + return score > other.score ? 1 : -1; + + // Otherwise, use the order in which the elements were created. + if(creationNumber != other.creationNumber) + return creationNumber > other.creationNumber ? -1 : 1; + + return 0; + } + + public String toString() { + return String.format("position: %d, strand: %b, state: %s, mismatches: %d, gap opens: %d, gap extensions: %d, loBound: %d, hiBound: %d, score: %d, creationNumber: %d", position, negativeStrand, alignmentMatchSequence.getCurrentState(), mismatches, gapOpens, gapExtensions, loBound, hiBound, getScore(), creationNumber); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAJavaAligner.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAJavaAligner.java new file mode 100644 index 000000000..81186c53e --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/BWAJavaAligner.java @@ -0,0 +1,392 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +import org.broadinstitute.sting.alignment.reference.bwt.*; +import org.broadinstitute.sting.alignment.bwa.BWAAligner; +import org.broadinstitute.sting.alignment.bwa.BWAConfiguration; +import org.broadinstitute.sting.alignment.Alignment; +import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.Utils; + +import java.io.File; +import java.util.*; + +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMFileHeader; + +/** + * Create imperfect alignments from the read to the genome represented by the given BWT / suffix array. + * + * @author mhanna + * @version 0.1 + */ +public class BWAJavaAligner extends BWAAligner { + /** + * BWT in the forward direction. + */ + private BWT forwardBWT; + + /** + * BWT in the reverse direction. + */ + private BWT reverseBWT; + + /** + * Suffix array in the forward direction. + */ + private SuffixArray forwardSuffixArray; + + /** + * Suffix array in the reverse direction. + */ + private SuffixArray reverseSuffixArray; + + /** + * Maximum edit distance (-n option from original BWA). + */ + private final int MAXIMUM_EDIT_DISTANCE = 4; + + /** + * Maximum number of gap opens (-o option from original BWA). + */ + private final int MAXIMUM_GAP_OPENS = 1; + + /** + * Maximum number of gap extensions (-e option from original BWA). + */ + private final int MAXIMUM_GAP_EXTENSIONS = 6; + + /** + * Penalty for straight mismatches (-M option from original BWA). + */ + public final int MISMATCH_PENALTY = 3; + + /** + * Penalty for gap opens (-O option from original BWA). + */ + public final int GAP_OPEN_PENALTY = 11; + + /** + * Penalty for gap extensions (-E option from original BWA). + */ + public final int GAP_EXTENSION_PENALTY = 4; + + /** + * Skip the ends of indels. + */ + public final int INDEL_END_SKIP = 5; + + public BWAJavaAligner( File forwardBWTFile, File reverseBWTFile, File forwardSuffixArrayFile, File reverseSuffixArrayFile ) { + super(null,null); + forwardBWT = new BWTReader(forwardBWTFile).read(); + reverseBWT = new BWTReader(reverseBWTFile).read(); + forwardSuffixArray = new SuffixArrayReader(forwardSuffixArrayFile,forwardBWT).read(); + reverseSuffixArray = new SuffixArrayReader(reverseSuffixArrayFile,reverseBWT).read(); + } + + /** + * Close this instance of the BWA pointer and delete its resources. + */ + @Override + public void close() { + throw new UnsupportedOperationException("BWA aligner can't currently be closed."); + } + + /** + * Update the current parameters of this aligner. + * @param configuration New configuration to set. + */ + public void updateConfiguration(BWAConfiguration configuration) { + throw new UnsupportedOperationException("Configuration of the BWA aligner can't currently be changed."); + } + + /** + * Allow the aligner to choose one alignment randomly from the pile of best alignments. + * @param bases Bases to align. + * @return An align + */ + public Alignment getBestAlignment(final byte[] bases) { throw new UnsupportedOperationException("BWAJavaAligner does not yet support the standard Aligner interface."); } + + /** + * Align the read to the reference. + * @param read Read to align. + * @param header Optional header to drop in place. + * @return A list of the alignments. + */ + public SAMRecord align(final SAMRecord read, final SAMFileHeader header) { throw new UnsupportedOperationException("BWAJavaAligner does not yet support the standard Aligner interface."); } + + /** + * Get a iterator of alignments, batched by mapping quality. + * @param bases List of bases. + * @return Iterator to alignments. + */ + public Iterable getAllAlignments(final byte[] bases) { throw new UnsupportedOperationException("BWAJavaAligner does not yet support the standard Aligner interface."); } + + /** + * Get a iterator of aligned reads, batched by mapping quality. + * @param read Read to align. + * @param newHeader Optional new header to use when aligning the read. If present, it must be null. + * @return Iterator to alignments. + */ + public Iterable alignAll(final SAMRecord read, final SAMFileHeader newHeader) { throw new UnsupportedOperationException("BWAJavaAligner does not yet support the standard Aligner interface."); } + + + public List align( SAMRecord read ) { + List successfulMatches = new ArrayList(); + + Byte[] uncomplementedBases = normalizeBases(read.getReadBases()); + Byte[] complementedBases = normalizeBases(Utils.reverse(BaseUtils.simpleReverseComplement(read.getReadBases()))); + + List forwardLowerBounds = LowerBound.create(uncomplementedBases,forwardBWT); + List reverseLowerBounds = LowerBound.create(complementedBases,reverseBWT); + + // Seed the best score with any score that won't overflow on comparison. + int bestScore = Integer.MAX_VALUE - MISMATCH_PENALTY; + int bestDiff = MAXIMUM_EDIT_DISTANCE+1; + int maxDiff = MAXIMUM_EDIT_DISTANCE; + + PriorityQueue alignments = new PriorityQueue(); + + // Create a fictional initial alignment, with the position just off the end of the read, and the limits + // set as the entire BWT. + alignments.add(createSeedAlignment(reverseBWT)); + alignments.add(createSeedAlignment(forwardBWT)); + + while(!alignments.isEmpty()) { + BWAAlignment alignment = alignments.remove(); + + // From bwtgap.c in the original BWT; if the rank is worse than the best score + the mismatch PENALTY, move on. + if( alignment.getScore() > bestScore + MISMATCH_PENALTY ) + break; + + Byte[] bases = alignment.isNegativeStrand() ? complementedBases : uncomplementedBases; + BWT bwt = alignment.isNegativeStrand() ? forwardBWT : reverseBWT; + List lowerBounds = alignment.isNegativeStrand() ? reverseLowerBounds : forwardLowerBounds; + + // if z < D(i) then return {} + int mismatches = maxDiff - alignment.getMismatches() - alignment.getGapOpens() - alignment.getGapExtensions(); + if( alignment.position < lowerBounds.size()-1 && mismatches < lowerBounds.get(alignment.position+1).value ) + continue; + + if(mismatches == 0) { + exactMatch(alignment,bases,bwt); + if(alignment.loBound > alignment.hiBound) + continue; + } + + // Found a valid alignment; store it and move on. + if(alignment.position >= read.getReadLength()-1) { + for(long bwtIndex = alignment.loBound; bwtIndex <= alignment.hiBound; bwtIndex++) { + BWAAlignment finalAlignment = alignment.clone(); + + if( finalAlignment.isNegativeStrand() ) + finalAlignment.setAlignmentStart(forwardSuffixArray.get(bwtIndex) + 1); + else { + int sizeAlongReference = read.getReadLength() - + finalAlignment.getNumberOfBasesMatchingState(AlignmentState.INSERTION) + + finalAlignment.getNumberOfBasesMatchingState(AlignmentState.DELETION); + finalAlignment.setAlignmentStart(reverseBWT.length() - reverseSuffixArray.get(bwtIndex) - sizeAlongReference + 1); + } + + successfulMatches.add(finalAlignment); + + bestScore = Math.min(finalAlignment.getScore(),bestScore); + bestDiff = Math.min(finalAlignment.getMismatches()+finalAlignment.getGapOpens()+finalAlignment.getGapExtensions(),bestDiff); + maxDiff = bestDiff + 1; + } + + continue; + } + + //System.out.printf("Processing alignments; queue size = %d, alignment = %s, bound = %d, base = %s%n", alignments.size(), alignment, lowerBounds.get(alignment.position+1).value, alignment.position >= 0 ? (char)bases[alignment.position].byteValue() : ""); + /* + System.out.printf("#1\t[%d,%d,%d,%c]\t[%d,%d,%d]\t[%d,%d]\t[%d,%d]%n",alignments.size(), + alignment.negativeStrand?1:0, + bases.length-alignment.position-1, + alignment.getCurrentState().toString().charAt(0), + alignment.getMismatches(), + alignment.getGapOpens(), + alignment.getGapExtensions(), + lowerBounds.get(alignment.position+1).value, + lowerBounds.get(alignment.position+1).width, + alignment.loBound, + alignment.hiBound); + */ + + // Temporary -- look ahead to see if the next alignment is bounded. + boolean allowDifferences = mismatches > 0; + boolean allowMismatches = mismatches > 0; + + if( allowDifferences && + alignment.position+1 >= INDEL_END_SKIP-1+alignment.getGapOpens()+alignment.getGapExtensions() && + read.getReadLength()-1-(alignment.position+1) >= INDEL_END_SKIP+alignment.getGapOpens()+alignment.getGapExtensions() ) { + if( alignment.getCurrentState() == AlignmentState.MATCH_MISMATCH ) { + if( alignment.getGapOpens() < MAXIMUM_GAP_OPENS ) { + // Add a potential insertion extension. + BWAAlignment insertionAlignment = createInsertionAlignment(alignment); + insertionAlignment.incrementGapOpens(); + alignments.add(insertionAlignment); + + // Add a potential deletion by marking a deletion and augmenting the position. + List deletionAlignments = createDeletionAlignments(bwt,alignment); + for( BWAAlignment deletionAlignment: deletionAlignments ) + deletionAlignment.incrementGapOpens(); + alignments.addAll(deletionAlignments); + } + } + else if( alignment.getCurrentState() == AlignmentState.INSERTION ) { + if( alignment.getGapExtensions() < MAXIMUM_GAP_EXTENSIONS && mismatches > 0 ) { + // Add a potential insertion extension. + BWAAlignment insertionAlignment = createInsertionAlignment(alignment); + insertionAlignment.incrementGapExtensions(); + alignments.add(insertionAlignment); + } + } + else if( alignment.getCurrentState() == AlignmentState.DELETION ) { + if( alignment.getGapExtensions() < MAXIMUM_GAP_EXTENSIONS && mismatches > 0 ) { + // Add a potential deletion by marking a deletion and augmenting the position. + List deletionAlignments = createDeletionAlignments(bwt,alignment); + for( BWAAlignment deletionAlignment: deletionAlignments ) + deletionAlignment.incrementGapExtensions(); + alignments.addAll(deletionAlignments); + } + } + } + + // Mismatches + alignments.addAll(createMatchedAlignments(bwt,alignment,bases,allowDifferences&&allowMismatches)); + } + + return successfulMatches; + } + + /** + * Create an seeding alignment to use as a starting point when traversing. + * @param bwt source BWT. + * @return Seed alignment. + */ + private BWAAlignment createSeedAlignment(BWT bwt) { + BWAAlignment seed = new BWAAlignment(this); + seed.setNegativeStrand(bwt == forwardBWT); + seed.position = -1; + seed.loBound = 0; + seed.hiBound = bwt.length(); + return seed; + } + + /** + * Creates a new alignments representing direct matches / mismatches. + * @param bwt Source BWT with which to work. + * @param alignment Alignment for the previous position. + * @param bases The bases in the read. + * @param allowMismatch Should mismatching bases be allowed? + * @return New alignment representing this position if valid; null otherwise. + */ + private List createMatchedAlignments( BWT bwt, BWAAlignment alignment, Byte[] bases, boolean allowMismatch ) { + List newAlignments = new ArrayList(); + + List baseChoices = new ArrayList(); + Byte thisBase = bases[alignment.position+1]; + + if( allowMismatch ) + baseChoices.addAll(Bases.allOf()); + else + baseChoices.add(thisBase); + + if( thisBase != null ) { + // Keep rotating the current base to the last position until we've hit the current base. + for( ;; ) { + baseChoices.add(baseChoices.remove(0)); + if( thisBase.equals(baseChoices.get(baseChoices.size()-1)) ) + break; + + } + } + + for(byte base: baseChoices) { + BWAAlignment newAlignment = alignment.clone(); + + newAlignment.loBound = bwt.counts(base) + bwt.occurrences(base,alignment.loBound-1) + 1; + newAlignment.hiBound = bwt.counts(base) + bwt.occurrences(base,alignment.hiBound); + + // If this alignment is valid, skip it. + if( newAlignment.loBound > newAlignment.hiBound ) + continue; + + newAlignment.position++; + newAlignment.addState(AlignmentState.MATCH_MISMATCH); + if( bases[newAlignment.position] == null || base != bases[newAlignment.position] ) + newAlignment.incrementMismatches(); + + newAlignments.add(newAlignment); + } + + return newAlignments; + } + + /** + * Create a new alignment representing an insertion at this point in the read. + * @param alignment Alignment from which to derive the insertion. + * @return New alignment reflecting the insertion. + */ + private BWAAlignment createInsertionAlignment( BWAAlignment alignment ) { + // Add a potential insertion extension. + BWAAlignment newAlignment = alignment.clone(); + newAlignment.position++; + newAlignment.addState(AlignmentState.INSERTION); + return newAlignment; + } + + /** + * Create new alignments representing a deletion at this point in the read. + * @param bwt source BWT for inferring deletion info. + * @param alignment Alignment from which to derive the deletion. + * @return New alignments reflecting all possible deletions. + */ + private List createDeletionAlignments( BWT bwt, BWAAlignment alignment) { + List newAlignments = new ArrayList(); + for(byte base: Bases.instance) { + BWAAlignment newAlignment = alignment.clone(); + + newAlignment.loBound = bwt.counts(base) + bwt.occurrences(base,alignment.loBound-1) + 1; + newAlignment.hiBound = bwt.counts(base) + bwt.occurrences(base,alignment.hiBound); + + // If this alignment is valid, skip it. + if( newAlignment.loBound > newAlignment.hiBound ) + continue; + + newAlignment.addState(AlignmentState.DELETION); + + newAlignments.add(newAlignment); + } + + return newAlignments; + } + + /** + * Exactly match the given alignment against the given BWT. + * @param alignment Alignment to match. + * @param bases Bases to use. + * @param bwt BWT to use. + */ + private void exactMatch( BWAAlignment alignment, Byte[] bases, BWT bwt ) { + while( ++alignment.position < bases.length ) { + byte base = bases[alignment.position]; + alignment.loBound = bwt.counts(base) + bwt.occurrences(base,alignment.loBound-1) + 1; + alignment.hiBound = bwt.counts(base) + bwt.occurrences(base,alignment.hiBound); + if( alignment.loBound > alignment.hiBound ) + return; + } + } + + /** + * Make each base into A/C/G/T or null if unknown. + * @param bases Base string to normalize. + * @return Array of normalized bases. + */ + private Byte[] normalizeBases( byte[] bases ) { + Byte[] normalBases = new Byte[bases.length]; + for(int i = 0; i < bases.length; i++) + normalBases[i] = Bases.fromASCII(bases[i]); + return normalBases; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/bwa/java/LowerBound.java b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/LowerBound.java new file mode 100644 index 000000000..3784643c0 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/bwa/java/LowerBound.java @@ -0,0 +1,88 @@ +package org.broadinstitute.sting.alignment.bwa.java; + +import java.util.List; +import java.util.ArrayList; + +import org.broadinstitute.sting.alignment.reference.bwt.BWT; + +/** + * At any point along the given read, what is a good lower bound for the + * total number of differences? + * + * @author mhanna + * @version 0.1 + */ +public class LowerBound { + /** + * Lower bound of the suffix array. + */ + public final long loIndex; + + /** + * Upper bound of the suffix array. + */ + public final long hiIndex; + + /** + * Width of the bwt from loIndex -> hiIndex, inclusive. + */ + public final long width; + + /** + * The lower bound at the given point. + */ + public final int value; + + /** + * Create a new lower bound with the given value. + * @param loIndex The lower bound of the BWT. + * @param hiIndex The upper bound of the BWT. + * @param value Value for the lower bound at this site. + */ + private LowerBound(long loIndex, long hiIndex, int value) { + this.loIndex = loIndex; + this.hiIndex = hiIndex; + this.width = hiIndex - loIndex + 1; + this.value = value; + } + + /** + * Create a non-optimal bound according to the algorithm specified in Figure 3 of the BWA paper. + * @param bases Bases of the read to use when creating a new BWT. + * @param bwt BWT to check against. + * @return A list of lower bounds at every point in the reference. + * + */ + public static List create(Byte[] bases, BWT bwt) { + List bounds = new ArrayList(); + + long loIndex = 0, hiIndex = bwt.length(); + int mismatches = 0; + for( int i = bases.length-1; i >= 0; i-- ) { + Byte base = bases[i]; + + // Ignore non-ACGT bases. + if( base != null ) { + loIndex = bwt.counts(base) + bwt.occurrences(base,loIndex-1) + 1; + hiIndex = bwt.counts(base) + bwt.occurrences(base,hiIndex); + } + + if( base == null || loIndex > hiIndex ) { + loIndex = 0; + hiIndex = bwt.length(); + mismatches++; + } + bounds.add(0,new LowerBound(loIndex,hiIndex,mismatches)); + } + + return bounds; + } + + /** + * Create a string representation of this bound. + * @return String version of this bound. + */ + public String toString() { + return String.format("LowerBound: w = %d, value = %d",width,value); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/package-info.java b/public/java/src/org/broadinstitute/sting/alignment/package-info.java new file mode 100644 index 000000000..60cf1e425 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/package-info.java @@ -0,0 +1,4 @@ +/** + * Analyses used to validate the correctness and performance the BWA Java bindings. + */ +package org.broadinstitute.sting.alignment; \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/AMBWriter.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/AMBWriter.java new file mode 100644 index 000000000..1d97fec79 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/AMBWriter.java @@ -0,0 +1,68 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; + +import java.io.PrintStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Writes .amb files - a file indicating where 'holes' (indeterminant bases) + * exist in the contig. Currently, only empty, placeholder AMBs are supported. + * + * @author mhanna + * @version 0.1 + */ +public class AMBWriter { + /** + * Number of holes is fixed at zero. + */ + private static final int NUM_HOLES = 0; + + /** + * Input stream from which to read BWT data. + */ + private final PrintStream out; + + /** + * Create a new ANNWriter targeting the given file. + * @param file file into which ANN data should be written. + * @throws java.io.IOException if there is a problem opening the output file. + */ + public AMBWriter(File file) throws IOException { + out = new PrintStream(file); + } + + /** + * Create a new ANNWriter targeting the given OutputStream. + * @param stream Stream into which ANN data should be written. + */ + public AMBWriter(OutputStream stream) { + out = new PrintStream(stream); + } + + /** + * Write the contents of the given dictionary into the AMB file. + * Assumes that there are no holes in the dictionary. + * @param dictionary Dictionary to write. + */ + public void writeEmpty(SAMSequenceDictionary dictionary) { + long genomeLength = 0L; + for(SAMSequenceRecord sequence: dictionary.getSequences()) + genomeLength += sequence.getSequenceLength(); + + int sequences = dictionary.getSequences().size(); + + // Write the header + out.printf("%d %d %d%n",genomeLength,sequences,NUM_HOLES); + } + + /** + * Close the given output stream. + */ + public void close() { + out.close(); + } +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/ANNWriter.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/ANNWriter.java new file mode 100644 index 000000000..17296c31c --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/ANNWriter.java @@ -0,0 +1,95 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import net.sf.samtools.SAMSequenceDictionary; +import net.sf.samtools.SAMSequenceRecord; + +import java.io.PrintStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Writes .ann files - an alternate sequence dictionary format + * used by BWA/C. For best results, the input sequence dictionary + * should be created with Picard's CreateSequenceDictionary.jar, + * TRUNCATE_NAMES_AT_WHITESPACE=false. + * + * @author mhanna + * @version 0.1 + */ +public class ANNWriter { + /** + * BWA uses a fixed seed of 11, written into every file. + */ + private static final int BNS_SEED = 11; + + /** + * A seemingly unused value that appears in every contig in the ANN. + */ + private static final int GI = 0; + + /** + * Input stream from which to read BWT data. + */ + private final PrintStream out; + + /** + * Create a new ANNWriter targeting the given file. + * @param file file into which ANN data should be written. + * @throws IOException if there is a problem opening the output file. + */ + public ANNWriter(File file) throws IOException { + out = new PrintStream(file); + } + + /** + * Create a new ANNWriter targeting the given OutputStream. + * @param stream Stream into which ANN data should be written. + */ + public ANNWriter(OutputStream stream) { + out = new PrintStream(stream); + } + + /** + * Write the contents of the given dictionary into the ANN file. + * Assumes that no ambs (blocks of indeterminate base) are present in the dictionary. + * @param dictionary Dictionary to write. + */ + public void write(SAMSequenceDictionary dictionary) { + long genomeLength = 0L; + for(SAMSequenceRecord sequence: dictionary.getSequences()) + genomeLength += sequence.getSequenceLength(); + + int sequences = dictionary.getSequences().size(); + + // Write the header + out.printf("%d %d %d%n",genomeLength,sequences,BNS_SEED); + + for(SAMSequenceRecord sequence: dictionary.getSequences()) { + String fullSequenceName = sequence.getSequenceName(); + String trimmedSequenceName = fullSequenceName; + String sequenceComment = "(null)"; + + long offset = 0; + + // Separate the sequence name from the sequence comment, based on BWA's definition. + // BWA's definition appears to accept a zero-length contig name, so mimic that behavior. + if(fullSequenceName.indexOf(' ') >= 0) { + trimmedSequenceName = fullSequenceName.substring(0,fullSequenceName.indexOf(' ')); + sequenceComment = fullSequenceName.substring(fullSequenceName.indexOf(' ')+1); + } + + // Write the sequence GI (?), name, and comment. + out.printf("%d %s %s%n",GI,trimmedSequenceName,sequenceComment); + // Write the sequence offset, length, and ambs (currently fixed at 0). + out.printf("%d %d %d%n",offset,sequence.getSequenceLength(),0); + } + } + + /** + * Close the given output stream. + */ + public void close() { + out.close(); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWT.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWT.java new file mode 100644 index 000000000..7f8c48253 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWT.java @@ -0,0 +1,172 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.alignment.reference.packing.PackUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +/** + * Represents the Burrows-Wheeler Transform of a reference sequence. + * + * @author mhanna + * @version 0.1 + */ +public class BWT { + /** + * Write an occurrence table after every SEQUENCE_BLOCK_SIZE bases. + * For this implementation to behave correctly, SEQUENCE_BLOCK_SIZE % 8 == 0 + */ + public static final int SEQUENCE_BLOCK_SIZE = 128; + + /** + * The inverse SA, used as a placeholder for determining where the special EOL character sits. + */ + protected final long inverseSA0; + + /** + * Cumulative counts for the entire BWT. + */ + protected final Counts counts; + + /** + * The individual sequence blocks, modelling how they appear on disk. + */ + protected final SequenceBlock[] sequenceBlocks; + + /** + * Creates a new BWT with the given inverse SA, counts, and sequence (in ASCII). + * @param inverseSA0 Inverse SA entry for the first element. Will be missing from the BWT sequence. + * @param counts Cumulative count of bases, in A,C,G,T order. + * @param sequenceBlocks The full BWT sequence, sans the '$'. + */ + public BWT( long inverseSA0, Counts counts, SequenceBlock[] sequenceBlocks ) { + this.inverseSA0 = inverseSA0; + this.counts = counts; + this.sequenceBlocks = sequenceBlocks; + } + + /** + * Creates a new BWT with the given inverse SA, occurrences, and sequence (in ASCII). + * @param inverseSA0 Inverse SA entry for the first element. Will be missing from the BWT sequence. + * @param counts Count of bases, in A,C,G,T order. + * @param sequence The full BWT sequence, sans the '$'. + */ + public BWT( long inverseSA0, Counts counts, byte[] sequence ) { + this(inverseSA0,counts,generateSequenceBlocks(sequence)); + } + + /** + * Extract the full sequence from the list of block. + * @return The full BWT string as a byte array. + */ + public byte[] getSequence() { + byte[] sequence = new byte[(int)counts.getTotal()]; + for( SequenceBlock block: sequenceBlocks ) + System.arraycopy(block.sequence,0,sequence,block.sequenceStart,block.sequenceLength); + return sequence; + } + + /** + * Get the total counts of bases lexicographically smaller than the given base, for Ferragina and Manzini's search. + * @param base The base. + * @return Total counts for all bases lexicographically smaller than this base. + */ + public long counts(byte base) { + return counts.getCumulative(base); + } + + /** + * Get the total counts of bases lexicographically smaller than the given base, for Ferragina and Manzini's search. + * @param base The base. + * @param index The position to search within the BWT. + * @return Total counts for all bases lexicographically smaller than this base. + */ + public long occurrences(byte base,long index) { + SequenceBlock block = getSequenceBlock(index); + int position = getSequencePosition(index); + long accumulator = block.occurrences.get(base); + for(int i = 0; i <= position; i++) { + if(base == block.sequence[i]) + accumulator++; + } + return accumulator; + } + + /** + * The number of bases in the BWT as a whole. + * @return Number of bases. + */ + public long length() { + return counts.getTotal(); + } + + /** + * Create a new BWT from the given reference sequence. + * @param referenceSequence Sequence from which to derive the BWT. + * @return reference sequence-derived BWT. + */ + public static BWT createFromReferenceSequence(byte[] referenceSequence) { + SuffixArray suffixArray = SuffixArray.createFromReferenceSequence(referenceSequence); + + byte[] bwt = new byte[(int)suffixArray.length()-1]; + int bwtIndex = 0; + for(long suffixArrayIndex = 0; suffixArrayIndex < suffixArray.length(); suffixArrayIndex++) { + if(suffixArray.get(suffixArrayIndex) == 0) + continue; + bwt[bwtIndex++] = referenceSequence[(int)suffixArray.get(suffixArrayIndex)-1]; + } + + return new BWT(suffixArray.inverseSA0,suffixArray.occurrences,bwt); + } + + /** + * Gets the base at a given position in the BWT. + * @param index The index to use. + * @return The base at that location. + */ + protected byte getBase(long index) { + if(index == inverseSA0) + throw new ReviewedStingException(String.format("Base at index %d does not have a text representation",index)); + + SequenceBlock block = getSequenceBlock(index); + int position = getSequencePosition(index); + return block.sequence[position]; + } + + private SequenceBlock getSequenceBlock(long index) { + // If the index is above the SA-1[0], remap it to the appropriate coordinate space. + if(index > inverseSA0) index--; + return sequenceBlocks[(int)(index/SEQUENCE_BLOCK_SIZE)]; + } + + private int getSequencePosition(long index) { + // If the index is above the SA-1[0], remap it to the appropriate coordinate space. + if(index > inverseSA0) index--; + return (int)(index%SEQUENCE_BLOCK_SIZE); + } + + /** + * Create a set of sequence blocks from one long sequence. + * @param sequence Sequence from which to derive blocks. + * @return Array of sequence blocks containing data from the sequence. + */ + private static SequenceBlock[] generateSequenceBlocks( byte[] sequence ) { + Counts occurrences = new Counts(); + + int numSequenceBlocks = PackUtils.numberOfPartitions(sequence.length,SEQUENCE_BLOCK_SIZE); + SequenceBlock[] sequenceBlocks = new SequenceBlock[numSequenceBlocks]; + + for( int block = 0; block < numSequenceBlocks; block++ ) { + int blockStart = block*SEQUENCE_BLOCK_SIZE; + int blockLength = Math.min(SEQUENCE_BLOCK_SIZE, sequence.length-blockStart); + byte[] subsequence = new byte[blockLength]; + + System.arraycopy(sequence,blockStart,subsequence,0,blockLength); + + sequenceBlocks[block] = new SequenceBlock(blockStart,blockLength,occurrences.clone(),subsequence); + + for( byte base: subsequence ) + occurrences.increment(base); + } + + return sequenceBlocks; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTReader.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTReader.java new file mode 100644 index 000000000..64a595419 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTReader.java @@ -0,0 +1,86 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.reference.packing.UnsignedIntPackedInputStream; +import org.broadinstitute.sting.alignment.reference.packing.BasePackedInputStream; +import org.broadinstitute.sting.alignment.reference.packing.PackUtils; + +import java.io.*; +import java.nio.ByteOrder; +/** + * Reads a BWT from a given file. + * + * @author mhanna + * @version 0.1 + */ +public class BWTReader { + /** + * Input stream from which to read BWT data. + */ + private FileInputStream inputStream; + + /** + * Create a new BWT reader. + * @param inputFile File in which the BWT is stored. + */ + public BWTReader( File inputFile ) { + try { + this.inputStream = new FileInputStream(inputFile); + } + catch( FileNotFoundException ex ) { + throw new ReviewedStingException("Unable to open input file", ex); + } + } + + /** + * Read a BWT from the input stream. + * @return The BWT stored in the input stream. + */ + public BWT read() { + UnsignedIntPackedInputStream uintPackedInputStream = new UnsignedIntPackedInputStream(inputStream, ByteOrder.LITTLE_ENDIAN); + BasePackedInputStream basePackedInputStream = new BasePackedInputStream(Integer.class, inputStream, ByteOrder.LITTLE_ENDIAN); + + long inverseSA0; + long[] count; + SequenceBlock[] sequenceBlocks; + + try { + inverseSA0 = uintPackedInputStream.read(); + count = new long[PackUtils.ALPHABET_SIZE]; + uintPackedInputStream.read(count); + + long bwtSize = count[PackUtils.ALPHABET_SIZE-1]; + sequenceBlocks = new SequenceBlock[PackUtils.numberOfPartitions(bwtSize,BWT.SEQUENCE_BLOCK_SIZE)]; + + for( int block = 0; block < sequenceBlocks.length; block++ ) { + int sequenceStart = block* BWT.SEQUENCE_BLOCK_SIZE; + int sequenceLength = (int)Math.min(BWT.SEQUENCE_BLOCK_SIZE,bwtSize-sequenceStart); + + long[] occurrences = new long[PackUtils.ALPHABET_SIZE]; + byte[] bwt = new byte[sequenceLength]; + + uintPackedInputStream.read(occurrences); + basePackedInputStream.read(bwt); + + sequenceBlocks[block] = new SequenceBlock(sequenceStart,sequenceLength,new Counts(occurrences,false),bwt); + } + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to read BWT from input stream.", ex); + } + + return new BWT(inverseSA0, new Counts(count,true), sequenceBlocks); + } + + /** + * Close the input stream. + */ + public void close() { + try { + inputStream.close(); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to close input file", ex); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTSupplementaryFileGenerator.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTSupplementaryFileGenerator.java new file mode 100644 index 000000000..f24baf766 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTSupplementaryFileGenerator.java @@ -0,0 +1,60 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import net.sf.picard.reference.ReferenceSequenceFileFactory; +import net.sf.picard.reference.ReferenceSequenceFile; +import net.sf.samtools.SAMSequenceDictionary; + +import java.io.File; +import java.io.IOException; + +/** + * Generate BWA supplementary files (.ann, .amb) from the command line. + * + * @author mhanna + * @version 0.1 + */ +public class BWTSupplementaryFileGenerator { + enum SupplementaryFileType { ANN, AMB } + + public static void main(String[] args) throws IOException { + if(args.length < 3) + usage("Incorrect number of arguments supplied"); + + File fastaFile = new File(args[0]); + File outputFile = new File(args[1]); + SupplementaryFileType outputType = null; + try { + outputType = Enum.valueOf(SupplementaryFileType.class,args[2]); + } + catch(IllegalArgumentException ex) { + usage("Invalid output type: " + args[2]); + } + + ReferenceSequenceFile sequenceFile = ReferenceSequenceFileFactory.getReferenceSequenceFile(fastaFile); + SAMSequenceDictionary dictionary = sequenceFile.getSequenceDictionary(); + + switch(outputType) { + case ANN: + ANNWriter annWriter = new ANNWriter(outputFile); + annWriter.write(dictionary); + annWriter.close(); + break; + case AMB: + AMBWriter ambWriter = new AMBWriter(outputFile); + ambWriter.writeEmpty(dictionary); + ambWriter.close(); + break; + default: + usage("Unsupported output type: " + outputType); + } + } + + /** + * Print usage information and exit. + */ + private static void usage(String message) { + System.err.println(message); + System.err.println("Usage: BWTSupplementaryFileGenerator "); + System.exit(1); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTWriter.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTWriter.java new file mode 100644 index 000000000..b3867ebfe --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/BWTWriter.java @@ -0,0 +1,71 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.reference.packing.UnsignedIntPackedOutputStream; +import org.broadinstitute.sting.alignment.reference.packing.BasePackedOutputStream; + +import java.io.*; +import java.nio.ByteOrder; + +/** + * Writes an in-memory BWT to an outputstream. + * + * @author mhanna + * @version 0.1 + */ +public class BWTWriter { + /** + * Input stream from which to read BWT data. + */ + private final OutputStream outputStream; + + /** + * Create a new BWT writer. + * @param outputFile File in which the BWT is stored. + */ + public BWTWriter( File outputFile ) { + try { + this.outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); + } + catch( FileNotFoundException ex ) { + throw new ReviewedStingException("Unable to open output file", ex); + } + } + + /** + * Write a BWT to the output stream. + * @param bwt Transform to be written to the output stream. + */ + public void write( BWT bwt ) { + UnsignedIntPackedOutputStream intPackedOutputStream = new UnsignedIntPackedOutputStream(outputStream, ByteOrder.LITTLE_ENDIAN); + BasePackedOutputStream basePackedOutputStream = new BasePackedOutputStream(Integer.class, outputStream, ByteOrder.LITTLE_ENDIAN); + + try { + intPackedOutputStream.write(bwt.inverseSA0); + intPackedOutputStream.write(bwt.counts.toArray(true)); + + for( SequenceBlock block: bwt.sequenceBlocks ) { + intPackedOutputStream.write(block.occurrences.toArray(false)); + basePackedOutputStream.write(block.sequence); + } + + // The last block is the last set of counts in the structure. + intPackedOutputStream.write(bwt.counts.toArray(false)); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to read BWT from input stream.", ex); + } + } + + /** + * Close the input stream. + */ + public void close() { + try { + outputStream.close(); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to close input file", ex); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Bases.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Bases.java new file mode 100644 index 000000000..bc0a5b63d --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Bases.java @@ -0,0 +1,108 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.*; + +/** + * Enhanced enum representation of a base. + * + * @author mhanna + * @version 0.1 + */ +public class Bases implements Iterable +{ + public static byte A = 'A'; + public static byte C = 'C'; + public static byte G = 'G'; + public static byte T = 'T'; + + public static final Bases instance = new Bases(); + + private static final List allBases; + + /** + * Representation of the base broken down by packed value. + */ + private static final Map basesByPack = new HashMap(); + + static { + List bases = new ArrayList(); + bases.add(A); + bases.add(C); + bases.add(G); + bases.add(T); + allBases = Collections.unmodifiableList(bases); + + for(int i = 0; i < allBases.size(); i++) + basesByPack.put(i,allBases.get(i)); + } + + /** + * Create a new base with the given ascii representation and + * pack value. + */ + private Bases() { + } + + /** + * Return all possible bases. + * @return Byte representation of all bases. + */ + public static Collection allOf() { + return allBases; + } + + /** + * Gets the number of known bases. + * @return The number of known bases. + */ + public static int size() { + return allBases.size(); + } + + /** + * Gets an iterator over the total number of known base types. + * @return Iterator over all known bases. + */ + public Iterator iterator() { + return basesByPack.values().iterator(); + } + + /** + * Get the given base from the packed representation. + * @param pack Packed representation. + * @return base. + */ + public static byte fromPack( int pack ) { return basesByPack.get(pack); } + + /** + * Convert the given base to its packed value. + * @param ascii ASCII representation of the base. + * @return Packed value. + */ + public static int toPack( byte ascii ) + { + for( Map.Entry entry: basesByPack.entrySet() ) { + if( entry.getValue().equals(ascii) ) + return entry.getKey(); + } + throw new ReviewedStingException(String.format("Base %c is an invalid base to pack", (char)ascii)); + } + + /** + * Convert the ASCII representation of a base to its 'normalized' representation. + * @param base The base itself. + * @return The byte, if present. Null if unknown. + */ + public static Byte fromASCII( byte base ) { + Byte found = null; + for( Byte normalized: allBases ) { + if( normalized.equals(base) ) { + found = normalized; + break; + } + } + return found; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Counts.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Counts.java new file mode 100644 index 000000000..268b11ac4 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/Counts.java @@ -0,0 +1,151 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.HashMap; +import java.util.Map; + +/** + * Counts of how many bases of each type have been seen. + * + * @author mhanna + * @version 0.1 + */ +public class Counts implements Cloneable { + /** + * Internal representation of counts, broken down by ASCII value. + */ + private Map counts = new HashMap(); + + /** + * Internal representation of cumulative counts, broken down by ASCII value. + */ + private Map cumulativeCounts = new HashMap(); + + /** + * Create an empty Counts object with values A=0,C=0,G=0,T=0. + */ + public Counts() + { + for(byte base: Bases.instance) { + counts.put(base,0L); + cumulativeCounts.put(base,0L); + } + } + + /** + * Create a counts data structure with the given initial values. + * @param data Count data, broken down by base. + * @param cumulative Whether the counts are cumulative, (count_G=numA+numC+numG,for example). + */ + public Counts( long[] data, boolean cumulative ) { + if(cumulative) { + long priorCount = 0; + for(byte base: Bases.instance) { + long count = data[Bases.toPack(base)]; + counts.put(base,count-priorCount); + cumulativeCounts.put(base,priorCount); + priorCount = count; + } + } + else { + long priorCount = 0; + for(byte base: Bases.instance) { + long count = data[Bases.toPack(base)]; + counts.put(base,count); + cumulativeCounts.put(base,priorCount); + priorCount += count; + } + } + } + + /** + * Convert to an array for persistence. + * @param cumulative Use a cumulative representation. + * @return Array of count values. + */ + public long[] toArray(boolean cumulative) { + long[] countArray = new long[counts.size()]; + if(cumulative) { + int index = 0; + boolean first = true; + for(byte base: Bases.instance) { + if(first) { + first = false; + continue; + } + countArray[index++] = getCumulative(base); + } + countArray[countArray.length-1] = getTotal(); + } + else { + int index = 0; + for(byte base: Bases.instance) + countArray[index++] = counts.get(base); + } + return countArray; + } + + /** + * Create a unique copy of the current object. + * @return A duplicate of this object. + */ + public Counts clone() { + Counts other; + try { + other = (Counts)super.clone(); + } + catch(CloneNotSupportedException ex) { + throw new ReviewedStingException("Unable to clone counts object", ex); + } + other.counts = new HashMap(counts); + other.cumulativeCounts = new HashMap(cumulativeCounts); + return other; + } + + /** + * Increment the number of bases seen at the given location. + * @param base Base to increment. + */ + public void increment(byte base) { + counts.put(base,counts.get(base)+1); + boolean increment = false; + for(byte cumulative: Bases.instance) { + if(increment) cumulativeCounts.put(cumulative,cumulativeCounts.get(cumulative)+1); + increment |= (cumulative == base); + } + } + + /** + * Gets a count of the number of bases seen at a given location. + * Note that counts in this case are not cumulative (counts for A,C,G,T + * are independent). + * @param base Base for which to query counts. + * @return Number of bases of this type seen. + */ + public long get(byte base) { + return counts.get(base); + } + + /** + * Gets a count of the number of bases seen before this base. + * Note that counts in this case are cumulative. + * @param base Base for which to query counts. + * @return Number of bases of this type seen. + */ + public long getCumulative(byte base) { + return cumulativeCounts.get(base); + } + + /** + * How many total bases are represented by this count structure? + * @return Total bases represented. + */ + public long getTotal() { + int accumulator = 0; + for(byte base: Bases.instance) { + accumulator += get(base); + } + return accumulator; + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/CreateBWTFromReference.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/CreateBWTFromReference.java new file mode 100755 index 000000000..92bb713f0 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/CreateBWTFromReference.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2009 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 WITHoc THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.alignment.reference.bwt; + +import net.sf.picard.reference.ReferenceSequenceFile; +import net.sf.picard.reference.ReferenceSequenceFileFactory; +import net.sf.picard.reference.ReferenceSequence; + +import java.io.*; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.reference.packing.PackUtils; + +/** + * Create a suffix array data structure. + * + * @author mhanna + * @version 0.1 + */ +public class CreateBWTFromReference { + private byte[] loadReference( File inputFile ) { + // Read in the first sequence in the input file + ReferenceSequenceFile reference = ReferenceSequenceFileFactory.getReferenceSequenceFile(inputFile); + ReferenceSequence sequence = reference.nextSequence(); + return sequence.getBases(); + } + + private byte[] loadReverseReference( File inputFile ) { + ReferenceSequenceFile reference = ReferenceSequenceFileFactory.getReferenceSequenceFile(inputFile); + ReferenceSequence sequence = reference.nextSequence(); + PackUtils.reverse(sequence.getBases()); + return sequence.getBases(); + } + + private Counts countOccurrences( byte[] sequence ) { + Counts occurrences = new Counts(); + for( byte base: sequence ) + occurrences.increment(base); + return occurrences; + } + + private long[] createSuffixArray( byte[] sequence ) { + return SuffixArray.createFromReferenceSequence(sequence).sequence; + } + + private long[] invertSuffixArray( long[] suffixArray ) { + long[] inverseSuffixArray = new long[suffixArray.length]; + for( int i = 0; i < suffixArray.length; i++ ) + inverseSuffixArray[(int)suffixArray[i]] = i; + return inverseSuffixArray; + } + + private long[] createCompressedSuffixArray( int[] suffixArray, int[] inverseSuffixArray ) { + long[] compressedSuffixArray = new long[suffixArray.length]; + compressedSuffixArray[0] = inverseSuffixArray[0]; + for( int i = 1; i < suffixArray.length; i++ ) + compressedSuffixArray[i] = inverseSuffixArray[suffixArray[i]+1]; + return compressedSuffixArray; + } + + private long[] createInversedCompressedSuffixArray( int[] compressedSuffixArray ) { + long[] inverseCompressedSuffixArray = new long[compressedSuffixArray.length]; + for( int i = 0; i < compressedSuffixArray.length; i++ ) + inverseCompressedSuffixArray[compressedSuffixArray[i]] = i; + return inverseCompressedSuffixArray; + } + + public static void main( String argv[] ) throws IOException { + if( argv.length != 5 ) { + System.out.println("USAGE: CreateBWTFromReference .fasta "); + return; + } + + String inputFileName = argv[0]; + File inputFile = new File(inputFileName); + + String bwtFileName = argv[1]; + File bwtFile = new File(bwtFileName); + + String rbwtFileName = argv[2]; + File rbwtFile = new File(rbwtFileName); + + String saFileName = argv[3]; + File saFile = new File(saFileName); + + String rsaFileName = argv[4]; + File rsaFile = new File(rsaFileName); + + CreateBWTFromReference creator = new CreateBWTFromReference(); + + byte[] sequence = creator.loadReference(inputFile); + byte[] reverseSequence = creator.loadReverseReference(inputFile); + + // Count the occurences of each given base. + Counts occurrences = creator.countOccurrences(sequence); + System.out.printf("Occurrences: a=%d, c=%d, g=%d, t=%d%n",occurrences.getCumulative(Bases.A), + occurrences.getCumulative(Bases.C), + occurrences.getCumulative(Bases.G), + occurrences.getCumulative(Bases.T)); + + // Generate the suffix array and print diagnostics. + long[] suffixArrayData = creator.createSuffixArray(sequence); + long[] reverseSuffixArrayData = creator.createSuffixArray(reverseSequence); + + // Invert the suffix array and print diagnostics. + long[] inverseSuffixArray = creator.invertSuffixArray(suffixArrayData); + long[] reverseInverseSuffixArray = creator.invertSuffixArray(reverseSuffixArrayData); + + SuffixArray suffixArray = new SuffixArray( inverseSuffixArray[0], occurrences, suffixArrayData ); + SuffixArray reverseSuffixArray = new SuffixArray( reverseInverseSuffixArray[0], occurrences, reverseSuffixArrayData ); + + /* + // Create the data structure for the compressed suffix array and print diagnostics. + int[] compressedSuffixArray = creator.createCompressedSuffixArray(suffixArray.sequence,inverseSuffixArray); + int reconstructedInverseSA = compressedSuffixArray[0]; + for( int i = 0; i < 8; i++ ) { + System.out.printf("compressedSuffixArray[%d] = %d (SA-1[%d] = %d)%n", i, compressedSuffixArray[i], i, reconstructedInverseSA); + reconstructedInverseSA = compressedSuffixArray[reconstructedInverseSA]; + } + + // Create the data structure for the inverse compressed suffix array and print diagnostics. + int[] inverseCompressedSuffixArray = creator.createInversedCompressedSuffixArray(compressedSuffixArray); + for( int i = 0; i < 8; i++ ) { + System.out.printf("inverseCompressedSuffixArray[%d] = %d%n", i, inverseCompressedSuffixArray[i]); + } + */ + + // Create the BWT. + BWT bwt = BWT.createFromReferenceSequence(sequence); + BWT reverseBWT = BWT.createFromReferenceSequence(reverseSequence); + + byte[] bwtSequence = bwt.getSequence(); + System.out.printf("BWT: %s... (length = %d)%n", new String(bwtSequence,0,80),bwt.length()); + + BWTWriter bwtWriter = new BWTWriter(bwtFile); + bwtWriter.write(bwt); + bwtWriter.close(); + + BWTWriter reverseBWTWriter = new BWTWriter(rbwtFile); + reverseBWTWriter.write(reverseBWT); + reverseBWTWriter.close(); + + /* + SuffixArrayWriter saWriter = new SuffixArrayWriter(saFile); + saWriter.write(suffixArray); + saWriter.close(); + + SuffixArrayWriter reverseSAWriter = new SuffixArrayWriter(rsaFile); + reverseSAWriter.write(reverseSuffixArray); + reverseSAWriter.close(); + */ + + File existingBWTFile = new File(inputFileName+".bwt"); + BWTReader existingBWTReader = new BWTReader(existingBWTFile); + BWT existingBWT = existingBWTReader.read(); + + byte[] existingBWTSequence = existingBWT.getSequence(); + System.out.printf("Existing BWT: %s... (length = %d)%n",new String(existingBWTSequence,0,80),existingBWT.length()); + + for( int i = 0; i < bwt.length(); i++ ) { + if( bwtSequence[i] != existingBWTSequence[i] ) + throw new ReviewedStingException("BWT mismatch at " + i); + } + + File existingSAFile = new File(inputFileName+".sa"); + SuffixArrayReader existingSuffixArrayReader = new SuffixArrayReader(existingSAFile,existingBWT); + SuffixArray existingSuffixArray = existingSuffixArrayReader.read(); + + for(int i = 0; i < suffixArray.length(); i++) { + if( i % 10000 == 0 ) + System.out.printf("Validating suffix array entry %d%n", i); + if( suffixArray.get(i) != existingSuffixArray.get(i) ) + throw new ReviewedStingException(String.format("Suffix array mismatch at %d; SA is %d; should be %d",i,existingSuffixArray.get(i),suffixArray.get(i))); + } + } + +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SequenceBlock.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SequenceBlock.java new file mode 100644 index 000000000..13714de1e --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SequenceBlock.java @@ -0,0 +1,41 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +/** + * Models a block of bases within the BWT. + */ +public class SequenceBlock { + /** + * Start position of this sequence within the BWT. + */ + public final int sequenceStart; + + /** + * Length of this sequence within the BWT. + */ + public final int sequenceLength; + + + /** + * Occurrences of each letter up to this sequence block. + */ + public final Counts occurrences; + + /** + * Sequence for this segment. + */ + public final byte[] sequence; + + /** + * Create a new block within this BWT. + * @param sequenceStart Starting position of this sequence within the BWT. + * @param sequenceLength Length of this sequence. + * @param occurrences How many of each base has been seen before this sequence began. + * @param sequence The actual sequence from the BWT. + */ + public SequenceBlock( int sequenceStart, int sequenceLength, Counts occurrences, byte[] sequence ) { + this.sequenceStart = sequenceStart; + this.sequenceLength = sequenceLength; + this.occurrences = occurrences; + this.sequence = sequence; + } +} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArray.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArray.java new file mode 100644 index 000000000..dba3633d1 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArray.java @@ -0,0 +1,159 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.util.Comparator; +import java.util.TreeSet; + +import net.sf.samtools.util.StringUtil; + +/** + * An in-memory representation of a suffix array. + * + * @author mhanna + * @version 0.1 + */ +public class SuffixArray { + public final long inverseSA0; + public final Counts occurrences; + + /** + * The elements of the sequence actually stored in memory. + */ + protected final long[] sequence; + + /** + * How often are individual elements in the sequence actually stored + * in memory, as opposed to being calculated on the fly? + */ + protected final int sequenceInterval; + + /** + * The BWT used to calculate missing portions of the sequence. + */ + protected final BWT bwt; + + public SuffixArray(long inverseSA0, Counts occurrences, long[] sequence) { + this(inverseSA0,occurrences,sequence,1,null); + } + + /** + * Creates a new sequence array with the given inverse SA, occurrences, and values. + * @param inverseSA0 Inverse SA entry for the first element. + * @param occurrences Cumulative number of occurrences of A,C,G,T, in order. + * @param sequence The full suffix array. + * @param sequenceInterval How frequently is the sequence interval stored. + * @param bwt bwt used to infer the remaining entries in the BWT. + */ + public SuffixArray(long inverseSA0, Counts occurrences, long[] sequence, int sequenceInterval, BWT bwt) { + this.inverseSA0 = inverseSA0; + this.occurrences = occurrences; + this.sequence = sequence; + this.sequenceInterval = sequenceInterval; + this.bwt = bwt; + + if(sequenceInterval != 1 && bwt == null) + throw new ReviewedStingException("A BWT must be provided if the sequence interval is not 1"); + } + + /** + * Retrieves the length of the sequence array. + * @return Length of the suffix array. + */ + public long length() { + if( bwt != null ) + return bwt.length()+1; + else + return sequence.length; + } + + /** + * Get the suffix array value at a given sequence. + * @param index Index at which to retrieve the suffix array vaule. + * @return The suffix array value at that entry. + */ + public long get(long index) { + int iterations = 0; + while(index%sequenceInterval != 0) { + // The inverseSA0 ('$') doesn't have a usable ASCII representation; it must be treated as a special case. + if(index == inverseSA0) + index = 0; + else { + byte base = bwt.getBase(index); + index = bwt.counts(base) + bwt.occurrences(base,index); + } + iterations++; + } + return (sequence[(int)(index/sequenceInterval)]+iterations) % length(); + } + + /** + * Create a suffix array from a given reference sequence. + * @param sequence The reference sequence to use when building the suffix array. + * @return a constructed suffix array. + */ + public static SuffixArray createFromReferenceSequence(byte[] sequence) { + // The builder for the suffix array. Use an integer in this case because + // Java arrays can only hold an integer. + TreeSet suffixArrayBuilder = new TreeSet(new SuffixArrayComparator(sequence)); + + Counts occurrences = new Counts(); + for( byte base: sequence ) + occurrences.increment(base); + + // Build out the suffix array using a custom comparator. + for( int i = 0; i <= sequence.length; i++ ) + suffixArrayBuilder.add(i); + + // Copy the suffix array into an array. + long[] suffixArray = new long[suffixArrayBuilder.size()]; + int i = 0; + for( Integer element: suffixArrayBuilder ) + suffixArray[i++] = element; + + // Find the first element in the inverse suffix array. + long inverseSA0 = -1; + for(i = 0; i < suffixArray.length; i++) { + if(suffixArray[i] == 0) + inverseSA0 = i; + } + if(inverseSA0 < 0) + throw new ReviewedStingException("Unable to find first inverse SA entry in generated suffix array."); + + return new SuffixArray(inverseSA0,occurrences,suffixArray); + } + + /** + * Compares two suffix arrays of the given sequence. Will return whichever string appears + * first in lexicographic order. + */ + private static class SuffixArrayComparator implements Comparator { + /** + * The data source for all suffix arrays. + */ + private final String sequence; + + /** + * Create a new comparator. + * @param sequence Reference sequence to use as basis for comparison. + */ + public SuffixArrayComparator( byte[] sequence ) { + // Processing the suffix array tends to be easier as a string. + this.sequence = StringUtil.bytesToString(sequence); + } + + /** + * Compare the two given suffix arrays. Criteria for comparison is the lexicographic order of + * the two substrings sequence[lhs:], sequence[rhs:]. + * @param lhs Left-hand side of comparison. + * @param rhs Right-hand side of comparison. + * @return How the suffix arrays represented by lhs, rhs compare. + */ + public int compare( Integer lhs, Integer rhs ) { + String lhsSuffixArray = sequence.substring(lhs); + String rhsSuffixArray = sequence.substring(rhs); + return lhsSuffixArray.compareTo(rhsSuffixArray); + } + } + +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayReader.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayReader.java new file mode 100644 index 000000000..c10984145 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayReader.java @@ -0,0 +1,82 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.reference.packing.UnsignedIntPackedInputStream; +import org.broadinstitute.sting.alignment.reference.packing.PackUtils; + +import java.io.*; +import java.nio.ByteOrder; + +/** + * A reader for suffix arrays in permanent storage. + * + * @author mhanna + * @version 0.1 + */ +public class SuffixArrayReader { + /** + * Input stream from which to read suffix array data. + */ + private FileInputStream inputStream; + + /** + * BWT to use to fill in missing data. + */ + private BWT bwt; + + /** + * Create a new suffix array reader. + * @param inputFile File in which the suffix array is stored. + * @param bwt BWT to use when filling in missing data. + */ + public SuffixArrayReader(File inputFile, BWT bwt) { + try { + this.inputStream = new FileInputStream(inputFile); + this.bwt = bwt; + } + catch( FileNotFoundException ex ) { + throw new ReviewedStingException("Unable to open input file", ex); + } + } + + /** + * Read a suffix array from the input stream. + * @return The suffix array stored in the input stream. + */ + public SuffixArray read() { + UnsignedIntPackedInputStream uintPackedInputStream = new UnsignedIntPackedInputStream(inputStream, ByteOrder.LITTLE_ENDIAN); + + long inverseSA0; + long[] occurrences; + long[] suffixArray; + int suffixArrayInterval; + + try { + inverseSA0 = uintPackedInputStream.read(); + occurrences = new long[PackUtils.ALPHABET_SIZE]; + uintPackedInputStream.read(occurrences); + // Throw away the suffix array size in bytes and use the occurrences table directly. + suffixArrayInterval = (int)uintPackedInputStream.read(); + suffixArray = new long[(int)((occurrences[occurrences.length-1]+suffixArrayInterval-1)/suffixArrayInterval)]; + uintPackedInputStream.read(suffixArray); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to read BWT from input stream.", ex); + } + + return new SuffixArray(inverseSA0, new Counts(occurrences,true), suffixArray, suffixArrayInterval, bwt); + } + + + /** + * Close the input stream. + */ + public void close() { + try { + inputStream.close(); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to close input file", ex); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayWriter.java b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayWriter.java new file mode 100644 index 000000000..972fc2a15 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/bwt/SuffixArrayWriter.java @@ -0,0 +1,67 @@ +package org.broadinstitute.sting.alignment.reference.bwt; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.alignment.reference.packing.UnsignedIntPackedOutputStream; + +import java.io.*; +import java.nio.ByteOrder; + +/** + * Javadoc goes here. + * + * @author mhanna + * @version 0.1 + */ +public class SuffixArrayWriter { + /** + * Input stream from which to read suffix array data. + */ + private OutputStream outputStream; + + /** + * Create a new suffix array reader. + * @param outputFile File in which the suffix array is stored. + */ + public SuffixArrayWriter( File outputFile ) { + try { + this.outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); + } + catch( FileNotFoundException ex ) { + throw new ReviewedStingException("Unable to open input file", ex); + } + } + + /** + * Write a suffix array to the output stream. + * @param suffixArray suffix array to write. + */ + public void write(SuffixArray suffixArray) { + UnsignedIntPackedOutputStream uintPackedOutputStream = new UnsignedIntPackedOutputStream(outputStream, ByteOrder.LITTLE_ENDIAN); + + try { + uintPackedOutputStream.write(suffixArray.inverseSA0); + uintPackedOutputStream.write(suffixArray.occurrences.toArray(true)); + // How frequently the suffix array entry is placed. + uintPackedOutputStream.write(1); + // Length of the suffix array. + uintPackedOutputStream.write(suffixArray.length()-1); + uintPackedOutputStream.write(suffixArray.sequence,1,suffixArray.sequence.length-1); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to read BWT from input stream.", ex); + } + } + + + /** + * Close the input stream. + */ + public void close() { + try { + outputStream.close(); + } + catch( IOException ex ) { + throw new ReviewedStingException("Unable to close input file", ex); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedInputStream.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedInputStream.java new file mode 100644 index 000000000..6681e37ec --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedInputStream.java @@ -0,0 +1,92 @@ +package org.broadinstitute.sting.alignment.reference.packing; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.*; +import java.nio.ByteOrder; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +/** + * Reads a packed version of the input stream. + * + * @author mhanna + * @version 0.1 + */ +public class BasePackedInputStream { + /** + * Type of object to unpack. + */ + private final Class type; + + /** + * Ultimate source for packed bases. + */ + private final FileInputStream targetInputStream; + + /** + * Channel source for packed bases. + */ + private final FileChannel targetInputChannel; + + /** + * A fixed-size buffer for word-packed data. + */ + private final ByteOrder byteOrder; + + /** + * How many bases are in a given packed word. + */ + private final int basesPerPackedWord = PackUtils.bitsInType(Integer.class)/PackUtils.BITS_PER_BASE; + + /** + * How many bytes in an integer? + */ + private final int bytesPerInteger = PackUtils.bitsInType(Integer.class)/PackUtils.BITS_PER_BYTE; + + + public BasePackedInputStream( Class type, File inputFile, ByteOrder byteOrder ) throws FileNotFoundException { + this(type,new FileInputStream(inputFile),byteOrder); + } + + public BasePackedInputStream( Class type, FileInputStream inputStream, ByteOrder byteOrder ) { + if( type != Integer.class ) + throw new ReviewedStingException("Only bases packed into 32-bit words are currently supported by this input stream. Type specified: " + type.getName()); + this.type = type; + this.targetInputStream = inputStream; + this.targetInputChannel = inputStream.getChannel(); + this.byteOrder = byteOrder; + } + + /** + * Read the entire contents of the input stream. + * @param bwt array into which bases should be read. + * @throws IOException if an I/O error occurs. + */ + public void read(byte[] bwt) throws IOException { + read(bwt,0,bwt.length); + } + + /** + * Read the next length bases into the bwt array, starting at the given offset. + * @param bwt array holding the given data. + * @param offset target position in the bases array into which bytes should be written. + * @param length number of bases to read from the stream. + * @throws IOException if an I/O error occurs. + */ + public void read(byte[] bwt, int offset, int length) throws IOException { + int bufferWidth = ((bwt.length+basesPerPackedWord-1)/basesPerPackedWord)*bytesPerInteger; + ByteBuffer buffer = ByteBuffer.allocate(bufferWidth).order(byteOrder); + targetInputChannel.read(buffer); + targetInputChannel.position(targetInputChannel.position()+buffer.remaining()); + buffer.flip(); + + int packedWord = 0; + int i = 0; + while(i < length) { + if(i % basesPerPackedWord == 0) packedWord = buffer.getInt(); + int position = basesPerPackedWord - i%basesPerPackedWord - 1; + bwt[offset+i++] = PackUtils.unpackBase((byte)((packedWord >> position*PackUtils.BITS_PER_BASE) & 0x3)); + } + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedOutputStream.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedOutputStream.java new file mode 100644 index 000000000..c62f40e51 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/BasePackedOutputStream.java @@ -0,0 +1,140 @@ +package org.broadinstitute.sting.alignment.reference.packing; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * A general-purpose stream for writing packed bases. + * + * @author mhanna + * @version 0.1 + */ +public class BasePackedOutputStream { + /** + * Type of object to pack. + */ + private final Class type; + + /** + * How many bases can be stored in the given data structure? + */ + private final int basesPerType; + + /** + * Ultimate target for the packed bases. + */ + private final OutputStream targetOutputStream; + + /** + * A fixed-size buffer for word-packed data. + */ + private final ByteBuffer buffer; + + public BasePackedOutputStream( Class type, File outputFile, ByteOrder byteOrder ) throws FileNotFoundException { + this(type,new BufferedOutputStream(new FileOutputStream(outputFile)),byteOrder); + } + + /** + * Write packed bases to the given output stream. + * @param type Type of data to pack bases into. + * @param outputStream Output stream to which to write packed bases. + * @param byteOrder Switch between big endian / little endian when reading / writing files. + */ + public BasePackedOutputStream( Class type, OutputStream outputStream, ByteOrder byteOrder) { + this.targetOutputStream = outputStream; + this.type = type; + basesPerType = PackUtils.bitsInType(type)/PackUtils.BITS_PER_BASE; + this.buffer = ByteBuffer.allocate(basesPerType/PackUtils.ALPHABET_SIZE).order(byteOrder); + } + + /** + * Writes the given base to the output stream. Will write only this base; no packing will be performed. + * @param base List of bases to write. + * @throws IOException if an I/O error occurs. + */ + public void write( int base ) throws IOException { + write( new byte[] { (byte)base } ); + } + + /** + * Writes an array of bases to the target output stream. + * @param bases List of bases to write. + * @throws IOException if an I/O error occurs. + */ + public void write( byte[] bases ) throws IOException { + write(bases,0,bases.length); + } + + /** + * Writes a subset of the array of bases to the output stream. + * @param bases List of bases to write. + * @param offset site at which to start writing. + * @param length number of bases to write. + * @throws IOException if an I/O error occurs. + */ + public void write( byte[] bases, int offset, int length ) throws IOException { + int packedBases = 0; + int positionInPack = 0; + + for( int base = offset; base < offset+length; base++ ) { + packedBases = packBase(bases[base], packedBases, positionInPack); + + // Increment the packed counter. If all possible bases have been squeezed into this byte, write it out. + positionInPack = ++positionInPack % basesPerType; + if( positionInPack == 0 ) { + writePackedBases(packedBases); + packedBases = 0; + } + } + + if( positionInPack > 0 ) + writePackedBases(packedBases); + } + + /** + * Flush the contents of the OutputStream to disk. + * @throws IOException if an I/O error occurs. + */ + public void flush() throws IOException { + targetOutputStream.flush(); + } + + /** + * Closes the given output stream. + * @throws IOException if an I/O error occurs. + */ + public void close() throws IOException { + targetOutputStream.close(); + } + + /** + * Pack the given base into the basepack. + * @param base The base to pack. + * @param basePack Target for the pack operation. + * @param position Position within the pack to which to add the base. + * @return The packed integer. + */ + private int packBase( byte base, int basePack, int position ) { + basePack |= (PackUtils.packBase(base) << 2*(basesPerType-position-1)); + return basePack; + } + + /** + * Write the given packed base structure to the output file. + * @param packedBases Packed bases to write. + * @throws IOException on error writing to the file. + */ + private void writePackedBases(int packedBases) throws IOException { + buffer.rewind(); + if( type == Integer.class ) + buffer.putInt(packedBases); + else if( type == Byte.class ) + buffer.put((byte)packedBases); + else + throw new ReviewedStingException("Cannot pack bases into type " + type.getName()); + targetOutputStream.write(buffer.array()); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/CreatePACFromReference.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/CreatePACFromReference.java new file mode 100755 index 000000000..8211c97d8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/CreatePACFromReference.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2009 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.alignment.reference.packing; + +import net.sf.picard.reference.ReferenceSequenceFile; +import net.sf.picard.reference.ReferenceSequenceFileFactory; +import net.sf.picard.reference.ReferenceSequence; + +import java.io.*; +import java.nio.ByteOrder; + +/** + * Generate a .PAC file from a given reference. + * + * @author hanna + * @version 0.1 + */ + +public class CreatePACFromReference { + public static void main( String argv[] ) throws IOException { + if( argv.length != 3 ) { + System.out.println("USAGE: CreatePACFromReference .fasta "); + return; + } + + // Read in the first sequence in the input file + String inputFileName = argv[0]; + File inputFile = new File(inputFileName); + ReferenceSequenceFile reference = ReferenceSequenceFileFactory.getReferenceSequenceFile(inputFile); + ReferenceSequence sequence = reference.nextSequence(); + + // Target file for output + PackUtils.writeReferenceSequence( new File(argv[1]), sequence.getBases() ); + + // Reverse the bases in the reference + PackUtils.reverse(sequence.getBases()); + + // Target file for output + PackUtils.writeReferenceSequence( new File(argv[2]), sequence.getBases() ); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/PackUtils.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/PackUtils.java new file mode 100644 index 000000000..beed21b49 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/PackUtils.java @@ -0,0 +1,135 @@ +package org.broadinstitute.sting.alignment.reference.packing; + +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.FileOutputStream; +import java.nio.ByteOrder; + +/** + * Utilities designed for packing / unpacking bases. + * + * @author mhanna + * @version 0.1 + */ +public class PackUtils { + /** + * How many possible bases can be encoded? + */ + public static final int ALPHABET_SIZE = 4; + + /** + * How many bits does it take to store a single base? + */ + public static final int BITS_PER_BASE = (int)(Math.log(ALPHABET_SIZE)/Math.log(2)); + + /** + * How many bits fit into a single byte? + */ + public static final int BITS_PER_BYTE = 8; + + /** + * Writes a reference sequence to a PAC file. + * @param outputFile Filename for the PAC file. + * @param referenceSequence Reference sequence to write. + * @throws IOException If there's a problem writing to the output file. + */ + public static void writeReferenceSequence( File outputFile, byte[] referenceSequence ) throws IOException { + OutputStream outputStream = new FileOutputStream(outputFile); + + BasePackedOutputStream basePackedOutputStream = new BasePackedOutputStream(Byte.class, outputStream, ByteOrder.BIG_ENDIAN); + basePackedOutputStream.write(referenceSequence); + + outputStream.write(referenceSequence.length%PackUtils.ALPHABET_SIZE); + + outputStream.close(); + } + + + /** + * How many bits can a given type hold? + * @param type Type to test. + * @return Number of bits that the given type can hold. + */ + public static int bitsInType( Class type ) { + try { + long typeSize = type.getField("MAX_VALUE").getLong(null) - type.getField("MIN_VALUE").getLong(null)+1; + long intTypeSize = (long)Integer.MAX_VALUE - (long)Integer.MIN_VALUE + 1; + if( typeSize > intTypeSize ) + throw new ReviewedStingException("Cannot determine number of bits available in type: " + type.getName()); + return (int)(Math.log(typeSize)/Math.log(2)); + } + catch( NoSuchFieldException ex ) { + throw new ReviewedStingException("Cannot determine number of bits available in type: " + type.getName(),ex); + } + catch( IllegalAccessException ex ) { + throw new ReviewedStingException("Cannot determine number of bits available in type: " + type.getName(),ex); + } + } + + /** + * Gets the two-bit representation of a base. A=00b, C=01b, G=10b, T=11b. + * @param base ASCII value for the base to pack. + * @return A byte from 0-3 indicating the base's packed value. + */ + public static byte packBase(byte base) { + switch( base ) { + case 'A': + return 0; + case 'C': + return 1; + case 'G': + return 2; + case 'T': + return 3; + default: + throw new ReviewedStingException("Unknown base type: " + base); + } + } + + /** + * Converts a two-bit representation of a base into an ASCII representation of a base. + * @param pack Byte from 0-3 indicating which base is represented. + * @return An ASCII value representing the packed base. + */ + public static byte unpackBase(byte pack) { + switch( pack ) { + case 0: + return 'A'; + case 1: + return 'C'; + case 2: + return 'G'; + case 3: + return 'T'; + default: + throw new ReviewedStingException("Unknown pack type: " + pack); + } + } + + /** + * Reverses an unpacked sequence of bases. + * @param bases bases to reverse. + */ + public static void reverse( byte[] bases ) { + for( int i = 0, j = bases.length-1; i < j; i++, j-- ) { + byte temp = bases[j]; + bases[j] = bases[i]; + bases[i] = temp; + } + } + + /** + * Given a structure of size size that should be split + * into partitionSize partitions, how many partitions should + * be created? Size of last partition will be <= partitionSize. + * @param size Total size of the data structure. + * @param partitionSize Size of an individual partition. + * @return Number of partitions that would be created. + */ + public static int numberOfPartitions( long size, long partitionSize ) { + return (int)((size+partitionSize-1) / partitionSize); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedInputStream.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedInputStream.java new file mode 100644 index 000000000..c07766ee1 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedInputStream.java @@ -0,0 +1,102 @@ +package org.broadinstitute.sting.alignment.reference.packing; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; + +/** + * Read a set of integers packed into + * + * @author mhanna + * @version 0.1 + */ +public class UnsignedIntPackedInputStream { + /** + * Ultimate target for the occurrence array. + */ + private final FileInputStream targetInputStream; + + /** + * Target channel from which to pull file data. + */ + private final FileChannel targetInputChannel; + + /** + * The byte order in which integer input data appears. + */ + private final ByteOrder byteOrder; + + /** + * How many bytes are required to store an integer? + */ + private final int bytesPerInteger = PackUtils.bitsInType(Integer.class)/PackUtils.BITS_PER_BYTE; + + /** + * Create a new PackedIntInputStream, writing to the given target file. + * @param inputFile target input file. + * @param byteOrder Endianness to use when writing a list of integers. + * @throws java.io.IOException if an I/O error occurs. + */ + public UnsignedIntPackedInputStream(File inputFile, ByteOrder byteOrder) throws IOException { + this(new FileInputStream(inputFile),byteOrder); + } + + /** + * Read ints from the given InputStream. + * @param inputStream Input stream from which to read ints. + * @param byteOrder Endianness to use when writing a list of integers. + */ + public UnsignedIntPackedInputStream(FileInputStream inputStream, ByteOrder byteOrder) { + this.targetInputStream = inputStream; + this.targetInputChannel = inputStream.getChannel(); + this.byteOrder = byteOrder; + } + + /** + * Read a datum from the input stream. + * @return The next input datum in the stream. + * @throws IOException if an I/O error occurs. + */ + public long read() throws IOException { + long[] data = new long[1]; + read(data); + return data[0]; + } + + /** + * Read the data from the input stream. + * @param data placeholder for input data. + * @throws IOException if an I/O error occurs. + */ + public void read( long[] data ) throws IOException { + read( data, 0, data.length ); + } + + /** + * Read the data from the input stream, starting at the given offset. + * @param data placeholder for input data. + * @param offset place in the array to start reading in data. + * @param length number of ints to read in. + * @throws IOException if an I/O error occurs. + */ + public void read( long[] data, int offset, int length ) throws IOException { + ByteBuffer readBuffer = ByteBuffer.allocate(bytesPerInteger*length).order(byteOrder); + + targetInputChannel.read(readBuffer,targetInputChannel.position()); + readBuffer.flip(); + targetInputChannel.position(targetInputChannel.position()+readBuffer.remaining()); + + int i = 0; + while(i < length) + data[offset+i++] = readBuffer.getInt() & 0xFFFFFFFFL; + } + + /** + * Closes the given output stream. + * @throws IOException if an I/O error occurs. + */ + public void close() throws IOException { + targetInputStream.close(); + } +} diff --git a/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedOutputStream.java b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedOutputStream.java new file mode 100755 index 000000000..9d7853695 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/alignment/reference/packing/UnsignedIntPackedOutputStream.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2009 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.alignment.reference.packing; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Writes an list of integers to the output file. + * + * @author mhanna + * @version 0.1 + */ +public class UnsignedIntPackedOutputStream { + /** + * Ultimate target for the occurrence array. + */ + private final OutputStream targetOutputStream; + + /** + * A fixed-size buffer for int-packed data. + */ + private final ByteBuffer buffer; + + /** + * Create a new PackedIntOutputStream, writing to the given target file. + * @param outputFile target output file. + * @param byteOrder Endianness to use when writing a list of integers. + * @throws IOException if an I/O error occurs. + */ + public UnsignedIntPackedOutputStream(File outputFile, ByteOrder byteOrder) throws IOException { + this(new FileOutputStream(outputFile),byteOrder); + } + + /** + * Write packed ints to the given OutputStream. + * @param outputStream Output stream to which to write packed ints. + * @param byteOrder Endianness to use when writing a list of integers. + */ + public UnsignedIntPackedOutputStream(OutputStream outputStream, ByteOrder byteOrder) { + this.targetOutputStream = outputStream; + buffer = ByteBuffer.allocate(PackUtils.bitsInType(Integer.class)/PackUtils.BITS_PER_BYTE).order(byteOrder); + } + + /** + * Write the data to the output stream. + * @param datum datum to write. + * @throws IOException if an I/O error occurs. + */ + public void write( long datum ) throws IOException { + buffer.rewind(); + buffer.putInt((int)datum); + targetOutputStream.write(buffer.array()); + } + + /** + * Write the data to the output stream. + * @param data data to write. occurrences.length must match alphabet size. + * @throws IOException if an I/O error occurs. + */ + public void write( long[] data ) throws IOException { + for(long datum: data) + write(datum); + } + + /** + * Write the given chunk of data to the input stream. + * @param data data to write. + * @param offset position at which to start. + * @param length number of ints to write. + * @throws IOException if an I/O error occurs. + */ + public void write( long[] data, int offset, int length ) throws IOException { + for( int i = offset; i < offset+length; i++ ) + write(data[i]); + } + + /** + * Flush the contents of the OutputStream to disk. + * @throws IOException if an I/O error occurs. + */ + public void flush() throws IOException { + targetOutputStream.flush(); + } + + /** + * Closes the given output stream. + * @throws IOException if an I/O error occurs. + */ + public void close() throws IOException { + targetOutputStream.close(); + } + +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java deleted file mode 100755 index c1c17bda5..000000000 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/CreateSequenomMask.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.broadinstitute.sting.gatk.walkers.sequenom; - -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.RodWalker; -import org.broadinstitute.sting.commandline.Output; -import org.broadinstitute.sting.utils.GenomeLoc; - -import java.io.PrintStream; - -/** - * Create a mask for use with the PickSequenomProbes walker. - */ -public class CreateSequenomMask extends RodWalker { - @Output - PrintStream out; - - public void initialize() {} - - public Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { - if ( tracker == null ) - return 0; - - int result = 0; - for ( VariantContext vc : tracker.getAllVariantContexts(ref) ) { - if ( vc.isSNP() ) { - GenomeLoc loc = context.getLocation(); - out.println(loc.getContig() + "\t" + (loc.getStart()-1) + "\t" + loc.getStop()); - result = 1; - break; - } - } - - return result; - } - - public Integer reduceInit() { - return 0; - } - - public Integer reduce(Integer value, Integer sum) { - return value + sum; - } - - public void onTraversalDone(Integer sum) { - logger.info("Found " + sum + " masking sites."); - } -} \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java deleted file mode 100755 index fde233b5d..000000000 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbes.java +++ /dev/null @@ -1,334 +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.gatk.walkers.sequenom; - -import net.sf.samtools.util.CloseableIterator; -import org.broad.tribble.bed.BEDCodec; -import org.broad.tribble.dbsnp.DbSNPCodec; -import org.broadinstitute.sting.utils.variantcontext.Allele; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.gatk.contexts.AlignmentContext; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.gatk.refdata.*; -import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; -import org.broadinstitute.sting.gatk.refdata.tracks.builders.RMDTrackBuilder; -import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; -import org.broadinstitute.sting.gatk.refdata.utils.LocationAwareSeekableRODIterator; -import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; -import org.broadinstitute.sting.gatk.refdata.utils.helpers.DbSNPHelper; -import org.broadinstitute.sting.gatk.walkers.*; -import org.broadinstitute.sting.utils.GenomeLoc; -import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; - -import java.io.File; -import java.util.*; -import java.io.PrintStream; - - -/** - * Generates Sequenom probe information given a single variant track. Emitted is the variant - * along with the 200 reference bases on each side of the variant. - */ -@WalkerName("PickSequenomProbes") -@Requires(value={DataSource.REFERENCE}) -@Reference(window=@Window(start=-200,stop=200)) -public class PickSequenomProbes extends RodWalker { - @Output - PrintStream out; - - @Argument(required=false, shortName="snp_mask", doc="positions to be masked with N's") - protected String SNP_MASK = null; - @Argument(required=false, shortName="project_id",doc="If specified, all probenames will be prepended with 'project_id|'") - String project_id = null; - @Argument(required = false, shortName="omitWindow", doc = "If specified, the window appender will be omitted from the design files (e.g. \"_chr:start-stop\")") - boolean omitWindow = false; - @Argument(required = false, fullName="usePlinkRODNamingConvention", shortName="nameConvention",doc="Use the naming convention defined in PLINKROD") - boolean useNamingConvention = false; - @Argument(required = false, fullName="noMaskWindow",shortName="nmw",doc="Do not mask bases within X bases of an event when designing probes") - int noMaskWindow = 0; - @Argument(required = false, shortName="counter", doc = "If specified, unique count id (ordinal number) is added to the end of each assay name") - boolean addCounter = false; - - private byte [] maskFlags = new byte[401]; - - private LocationAwareSeekableRODIterator snpMaskIterator=null; - - private GenomeLoc positionOfLastVariant = null; - - private int cnt = 0; - private int discarded = 0; - - VariantCollection VCs ; // will keep a set of distinct variants at a given site - private List processedVariantsInScope = new LinkedList(); - - public void initialize() { - if ( SNP_MASK != null ) { - logger.info("Loading SNP mask... "); - ReferenceOrderedData snp_mask; - //if ( SNP_MASK.contains(DbSNPHelper.STANDARD_DBSNP_TRACK_NAME)) { - RMDTrackBuilder builder = new RMDTrackBuilder(getToolkit().getReferenceDataSource().getReference().getSequenceDictionary(),getToolkit().getGenomeLocParser(),getToolkit().getArguments().unsafe); - RMDTrack track = builder.createInstanceOfTrack(BEDCodec.class, new File(SNP_MASK)); - snpMaskIterator = new SeekableRODIterator(track.getHeader(), - track.getSequenceDictionary(), - getToolkit().getReferenceDataSource().getReference().getSequenceDictionary(), - getToolkit().getGenomeLocParser(), - track.getIterator()); - //} else { - // // TODO: fix me when Plink is back - // throw new IllegalArgumentException("We currently do not support other snp_mask tracks (like Plink)"); - //} - - } - VCs = new VariantCollection(); - } - - - public String map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { - if ( tracker == null ) - return ""; - - logger.debug("Probing " + ref.getLocus() + " " + ref.getWindow()); - - VCs.clear(); - VCs.addAll( tracker.getAllVariantContexts(ref), ref.getLocus() ); - - discarded += VCs.discarded(); - - if ( VCs.size() == 0 ) { - logger.debug(" Context empty"); - return ""; - } - - if ( VCs.size() > 1 ) { - logger.debug(" "+VCs.size()+ " variants at the locus"); - } - -// System.out.print("At locus "+ref.getLocus()+": "); -// for ( VariantContext vc : VCs ) { -// System.out.println(vc.toString()); -// } - - // little optimization: since we may have few events at the current site on the reference, - // we are going to make sure we compute the mask and ref bases only once for each location and only if we need to - boolean haveMaskForWindow = false; - boolean haveBasesForWindow = false; - String leading_bases = null; - String trailing_bases = null; - - StringBuilder assaysForLocus = new StringBuilder(""); // all assays for current locus will be collected here (will be multi-line if multiple events are assayed) - - // get all variant contexts!!!! - for ( VariantContext vc : VCs ) { - - // we can only deal with biallelic sites for now - if ( !vc.isBiallelic() ) { - logger.debug(" Not biallelic; skipped"); - continue; - } - - // we don't want to see the same multi-base event (deletion, DNP etc) multiple times. - // All the vcs we are currently seeing are clearly on the same contig as the current reference - // poisiton (or we would not see them at all!). All we need to check is if the vc starts at the - // current reference position (i.e. it is the first time we see it) or not (i.e. we saw it already). - if ( ref.getLocus().getStart() != vc.getStart() ) - continue; - - if ( ! haveMaskForWindow ) { - String contig = context.getLocation().getContig(); - int offset = context.getLocation().getStart(); - int true_offset = offset - 200; - - // we have variant; let's load all the snps falling into the current window and prepare the mask array. - // we need to do it only once per window, regardless of how many vcs we may have at this location! - if ( snpMaskIterator != null ) { - // clear the mask - for ( int i = 0 ; i < 401; i++ ) - maskFlags[i] = 0; - - RODRecordList snpList = snpMaskIterator.seekForward(getToolkit().getGenomeLocParser().createGenomeLoc(contig,offset-200,offset+200)); - if ( snpList != null && snpList.size() != 0 ) { - Iterator snpsInWindow = snpList.iterator(); - int i = 0; - while ( snpsInWindow.hasNext() ) { - GenomeLoc snp = snpsInWindow.next().getLocation(); - // we don't really want to mask out multi-base indels - if ( snp.size() > 1 ) - continue; - logger.debug(" SNP at "+snp.getStart()); - int offsetInWindow = (int)(snp.getStart() - true_offset); - maskFlags[offsetInWindow] = 1; - } - } - } - haveMaskForWindow = true; // if we use masking, we will probably need to recompute the window... - } - - if ( ! haveBasesForWindow ) { - byte[] context_bases = ref.getBases(); - for (int i = 0; i < 401; i++) { - if ( maskFlags[i] == 1 && ( i < 200 - noMaskWindow || i > 200 + getNoMaskWindowRightEnd(vc,noMaskWindow) ) ) { - context_bases[i] = 'N'; - } - } - leading_bases = new String(Arrays.copyOfRange(context_bases, 0, 200)); - trailing_bases = new String(Arrays.copyOfRange(context_bases, 201, 401)); - // masked bases are not gonna change for the current window, unless we use windowed masking; - // in the latter case the bases (N's) will depend on the event we are currently looking at, - // so we better recompute.. - if ( noMaskWindow == 0 ) haveBasesForWindow = true; - } - - - // below, build single assay line for the current VC: - - String assay_sequence; - if ( vc.isSNP() ) - assay_sequence = leading_bases + "[" + (char)ref.getBase() + "/" + vc.getAlternateAllele(0).toString() + "]" + trailing_bases; - else if ( vc.isMNP() ) - assay_sequence = leading_bases + "[" + new String(vc.getReference().getBases()) + "/" + new String(vc.getAlternateAllele(0).getBases())+"]"+trailing_bases.substring(vc.getReference().length()-1); - else if ( vc.isInsertion() ) - assay_sequence = leading_bases + (char)ref.getBase() + "[-/" + vc.getAlternateAllele(0).toString() + "]" + trailing_bases; - else if ( vc.isDeletion() ) - assay_sequence = leading_bases + (char)ref.getBase() + "[" + new String(vc.getReference().getBases()) + "/-]" + trailing_bases.substring(vc.getReference().length()); - else - continue; - - StringBuilder assay_id = new StringBuilder(); - if ( project_id != null ) { - assay_id.append(project_id); - assay_id.append('|'); - } - if ( useNamingConvention ) { - assay_id.append('c'); - assay_id.append(context.getLocation().toString().replace(":","_p")); - } else { - assay_id.append(context.getLocation().toString().replace(':','_')); - } - if ( vc.isInsertion() ) assay_id.append("_gI"); - else if ( vc.isDeletion()) assay_id.append("_gD"); - - if ( ! omitWindow ) { - assay_id.append("_"); - assay_id.append(ref.getWindow().toString().replace(':', '_')); - } - ++cnt; - if ( addCounter ) assay_id.append("_"+cnt); - - assaysForLocus.append(assay_id); - assaysForLocus.append('\t'); - assaysForLocus.append(assay_sequence); - assaysForLocus.append('\n'); - } - return assaysForLocus.toString(); - } - - public String reduceInit() { - return ""; - } - - public String reduce(String data, String sum) { - out.print(data); - return ""; - } - - private int getNoMaskWindowRightEnd(VariantContext vc, int window) { - if ( window == 0 ) { - return 0; - } - - if ( vc.isInsertion() ) { - return window-1; - } - - int max = 0; - for (Allele a : vc.getAlleles() ) { - if ( vc.isInsertion() ) { - logger.debug("Getting length of allele "+a.toString()+" it is "+a.getBases().length+" (ref allele is "+vc.getReference().toString()+")"); - } - if ( a.getBases().length > max ) { - max = a.getBases().length; - } - } - return max+window-1; - } - - public void onTraversalDone(String sum) { - logger.info(cnt+" assay seqences generated"); - logger.info(discarded+" events were found to be duplicates and discarded (no redundant assays generated)"); - } - - static class EventComparator implements Comparator { - - public int compare(VariantContext o1, VariantContext o2) { - // if variants start at different positions, they are different. All we actually - // care about is detecting the variants that are strictly the same; the actual ordering of distinct variants - // (which one we deem less and which one greater) is utterly unimportant. We just need to be consistent. - if ( o1.getStart() < o2.getStart() ) return -1; - if ( o1.getStart() > o2.getStart() ) return 1; - - if ( o1.getType() != o2.getType() ) return o1.getType().compareTo(o2.getType()); - - int refComp = o1.getReference().compareTo(o2.getReference()); - if ( refComp != 0 ) return refComp; - - return o1.getAlternateAllele(0).compareTo(o2.getAlternateAllele(0)); - - } - } - - static class VariantCollection implements Iterable { - TreeSet variants = new TreeSet(new EventComparator()); - int discarded = 0; - - public void add(VariantContext vc, GenomeLoc current) { - if ( vc.getStart() != current.getStart() ) return; // we add only variants that start at current locus - // note that we do not check chr here, since the way this class is used, the mathod is always called with - // VCs coming from the same metadata tracker, so they simply can not be on different chrs! - if ( !vc.isBiallelic() ) { - logger.info(" Non-biallelic variant encountered; skipped"); - return; - } - if ( variants.add(vc) == false ) discarded++; - } - - public void addAll(Collection c, GenomeLoc current) { - for ( VariantContext vc : c ) add(vc,current); - } - - public void clear() { - variants.clear(); - discarded = 0; - } - - public int discarded() { return discarded; } - - public int size() { return variants.size(); } - - public Iterator iterator() { return variants.iterator(); } - } -} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java index 3a5213868..466c1aee3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java @@ -34,7 +34,7 @@ import java.util.List; */ @Requires(value={DataSource.REFERENCE}, referenceMetaData={@RMD(name="ProbeIntervals",type=TableFeature.class), @RMD(name="ValidateAlleles",type=VariantContext.class),@RMD(name="MaskAlleles",type=VariantContext.class)}) -public class PickSequenomProbes2 extends RodWalker { +public class ValidationAmplicons extends RodWalker { @Argument(doc="Lower case SNPs rather than replacing with 'N'",fullName="lowerCaseSNPs",required=false) boolean lowerCaseSNPs = false; @@ -45,6 +45,9 @@ public class PickSequenomProbes2 extends RodWalker { @Argument(doc="Monomorphic sites in the mask file will be treated as filtered",fullName="filterMonomorphic",required=false) boolean filterMonomorphic = false; + @Argument(doc="Do not use BWA, lower-case repeats only",fullName="doNotUseBWA",required=false) + boolean doNotUseBWA = false; + GenomeLoc prevInterval; GenomeLoc allelePos; String probeName; @@ -67,16 +70,18 @@ public class PickSequenomProbes2 extends RodWalker { private SAMFileHeader header = null; public void initialize() { - if(targetReferenceFile == null) - targetReferenceFile = getToolkit().getArguments().referenceFile; - BWTFiles bwtFiles = new BWTFiles(targetReferenceFile.getAbsolutePath()); - BWAConfiguration configuration = new BWAConfiguration(); - aligner = new BWACAligner(bwtFiles,configuration); - header = new SAMFileHeader(); - SAMSequenceDictionary referenceDictionary = - ReferenceSequenceFileFactory.getReferenceSequenceFile(targetReferenceFile).getSequenceDictionary(); - header.setSequenceDictionary(referenceDictionary); - header.setSortOrder(SAMFileHeader.SortOrder.unsorted); + if ( ! doNotUseBWA ) { + if(targetReferenceFile == null) + targetReferenceFile = getToolkit().getArguments().referenceFile; + BWTFiles bwtFiles = new BWTFiles(targetReferenceFile.getAbsolutePath()); + BWAConfiguration configuration = new BWAConfiguration(); + aligner = new BWACAligner(bwtFiles,configuration); + header = new SAMFileHeader(); + SAMSequenceDictionary referenceDictionary = + ReferenceSequenceFileFactory.getReferenceSequenceFile(targetReferenceFile).getSequenceDictionary(); + header.setSequenceDictionary(referenceDictionary); + header.setSortOrder(SAMFileHeader.SortOrder.unsorted); + } } public Integer reduceInit() { @@ -106,8 +111,11 @@ public class PickSequenomProbes2 extends RodWalker { // there was a previous interval validateSequence(); // ensure the sequence in the region is valid // next line removed in favor of the one after - //lowerRepeats(); // change repeats in sequence to lower case - lowerNonUniqueSegments(); + if ( doNotUseBWA ) { + lowerRepeats(); // change repeats in sequence to lower case + } else { + lowerNonUniqueSegments(); + } print(); // print out the fasta sequence } @@ -218,7 +226,11 @@ public class PickSequenomProbes2 extends RodWalker { public void onTraversalDone(Integer fin ) { validateSequence(); - lowerNonUniqueSegments(); + if ( doNotUseBWA ) { + lowerRepeats(); + } else { + lowerNonUniqueSegments(); + } print(); } diff --git a/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java b/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java new file mode 100644 index 000000000..dafaf3ffe --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java @@ -0,0 +1,27 @@ +package org.broadinstitute.sting.alignment; + +import org.testng.annotations.Test; +import org.broadinstitute.sting.WalkerTest; + +import java.util.Arrays; + +/** + * Integration tests for the aligner. + * + * @author mhanna + * @version 0.1 + */ +public class AlignerIntegrationTest extends WalkerTest { + @Test + public void testBasicAlignment() { + String md5 = "34eb4323742999d6d250a0aaa803c6d5"; + WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( + "-R " + GATKDataLocation + "bwa/human_b36_both.fasta" + + " -T Align" + + " -I " + validationDataLocation + "NA12878_Pilot1_20.trimmed.unmapped.bam" + + " -o %s", + 1, // just one output file + Arrays.asList(md5)); + executeTest("testBasicAlignment", spec); + } +} diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbesIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbesIntegrationTest.java deleted file mode 100755 index 850a3113e..000000000 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/sequenom/PickSequenomProbesIntegrationTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.broadinstitute.sting.gatk.walkers.sequenom; - -import org.broadinstitute.sting.WalkerTest; -import org.testng.annotations.Test; - -import java.util.Arrays; - -public class PickSequenomProbesIntegrationTest extends WalkerTest { - @Test - public void testProbes() { - String testVCF = validationDataLocation + "complexExample.vcf4"; - String testArgs = "-R " + b36KGReference + " -T PickSequenomProbes -L 1:10,000,000-11,000,000 -B:input,VCF "+testVCF+" -o %s"; - WalkerTestSpec spec = new WalkerTestSpec(testArgs, 1, - Arrays.asList("6b5409cc78960f1be855536ed89ea9dd")); - executeTest("Test probes", spec); - } - - @Test - public void testProbesUsingDbSNPMask() { - - String md5 = "46d53491af1d3aa0ee1f1e13d68b732d"; - String testVCF = validationDataLocation + "pickSeqIntegrationTest.vcf"; - - String testArgs = "-snp_mask " + validationDataLocation + "pickSeqIntegrationTest.bed -R " - + b36KGReference + " -omitWindow -nameConvention " - + "-project_id 1kgp3_s4_lf -T PickSequenomProbes -B:input,VCF "+testVCF+" -o %s"; - WalkerTestSpec spec1 = new WalkerTestSpec(testArgs, 1, Arrays.asList(md5)); - executeTest("Test probes", spec1); - - testArgs += " -nmw 1"; - WalkerTestSpec spec2 = new WalkerTestSpec(testArgs, 1, Arrays.asList(md5)); - executeTest("Test probes", spec2); - } -} diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java new file mode 100755 index 000000000..6528f5795 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java @@ -0,0 +1,56 @@ +package org.broadinstitute.sting.gatk.walkers.validation; + +import org.broadinstitute.sting.WalkerTest; +import org.testng.annotations.Test; + +import java.util.Arrays; + +/** + * Created by IntelliJ IDEA. + * User: Ghost + * Date: 7/19/11 + * Time: 7:39 PM + * To change this template use File | Settings | File Templates. + */ +public class ValidationAmpliconsIntegrationTest extends WalkerTest { + + @Test + public void testWikiExample() { + String siteVCF = validationDataLocation + "sites_to_validate.vcf"; + String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; + String intervalTable = validationDataLocation + "amplicon_interval_table1.table"; + String testArgs = "-R " + b37KGReference + " -T ValidationAmplicons -B:ValidateAlleles,VCF "+siteVCF+" -o %s"; + testArgs += " -B:ProbeIntervals,table "+intervalTable+" -BTI ProbeIntervals -B:MaskAlleles,VCF "+maskVCF; + testArgs += " --virtualPrimerSize 30"; + WalkerTestSpec spec = new WalkerTestSpec(testArgs, 1, + Arrays.asList("27f9450afa132888a8994167f0035fd7")); + executeTest("Test probes", spec); + } + + @Test + public void testWikiExampleNoBWA() { + String siteVCF = validationDataLocation + "sites_to_validate.vcf"; + String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; + String intervalTable = validationDataLocation + "amplicon_interval_table1.table"; + String testArgs = "-R " + b37KGReference + " -T ValidationAmplicons -B:ValidateAlleles,VCF "+siteVCF+" -o %s"; + testArgs += " -B:ProbeIntervals,table "+intervalTable+" -BTI ProbeIntervals -B:MaskAlleles,VCF "+maskVCF; + testArgs += " --virtualPrimerSize 30 --doNotUseBWA"; + WalkerTestSpec spec = new WalkerTestSpec(testArgs, 1, + Arrays.asList("f2611ff1d9cd5bedaad003251fed8bc1")); + executeTest("Test probes", spec); + } + + @Test + public void testWikiExampleMonoFilter() { + String siteVCF = validationDataLocation + "sites_to_validate.vcf"; + String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; + String intervalTable = validationDataLocation + "amplicon_interval_table1.table"; + String testArgs = "-R " + b37KGReference + " -T ValidationAmplicons -B:ValidateAlleles,VCF "+siteVCF+" -o %s"; + testArgs += " -B:ProbeIntervals,table "+intervalTable+" -BTI ProbeIntervals -B:MaskAlleles,VCF "+maskVCF; + testArgs += " --virtualPrimerSize 30 --filterMonomorphic"; + WalkerTestSpec spec = new WalkerTestSpec(testArgs, 1, + Arrays.asList("77b3f30e38fedad812125bdf6cf3255f")); + executeTest("Test probes", spec); + } + +} From fb2d475c2285c10fd6a66aff1dc0d6c1dd6c1b90 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Tue, 19 Jul 2011 20:13:56 -0400 Subject: [PATCH 200/214] Bug fix to prevent null pointer --- .../sting/gatk/walkers/PrintReadsWalker.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index 57ea5166a..78b6e7c04 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -59,7 +59,7 @@ public class PrintReadsWalker extends ReadWalker { @Argument(fullName = "number", shortName = "n", doc="Print the first n reads from the file, discarding the rest", required = false) int nReadsToPrint = -1; @Argument(fullName="sample_file", shortName="sf", doc="File containing a list of samples (one per line). Can be specified multiple times", required=false) - public Set sampleFiles; + public Set sampleFile; @Argument(fullName="sample_name", shortName="sn", doc="Sample name to be included in the analysis. Can be specified multiple times.", required=false) public Set sampleNames; @@ -73,10 +73,13 @@ public class PrintReadsWalker extends ReadWalker { if ( platform != null ) platform = platform.toUpperCase(); - Collection samplesFromFile = SampleUtils.getSamplesFromFiles(sampleFiles); - samplesToChoose.addAll(samplesFromFile); + Collection samplesFromFile; + if (!sampleFile.isEmpty()) { + samplesFromFile = SampleUtils.getSamplesFromFiles(sampleFile); + samplesToChoose.addAll(samplesFromFile); + } - if (sampleNames != null) + if (!sampleNames.isEmpty()) samplesToChoose.addAll(sampleNames); if(samplesToChoose.isEmpty()) { From e8409c80fa9c771dd79c515cdb8273e2d7645b07 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Tue, 19 Jul 2011 21:59:24 -0400 Subject: [PATCH 201/214] Further protection vs null pointers in PrintReadsWalker --- .../broadinstitute/sting/gatk/walkers/PrintReadsWalker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index 78b6e7c04..b10486e50 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -59,9 +59,9 @@ public class PrintReadsWalker extends ReadWalker { @Argument(fullName = "number", shortName = "n", doc="Print the first n reads from the file, discarding the rest", required = false) int nReadsToPrint = -1; @Argument(fullName="sample_file", shortName="sf", doc="File containing a list of samples (one per line). Can be specified multiple times", required=false) - public Set sampleFile; + public Set sampleFile = new TreeSet(); @Argument(fullName="sample_name", shortName="sn", doc="Sample name to be included in the analysis. Can be specified multiple times.", required=false) - public Set sampleNames; + public Set sampleNames = new TreeSet(); private TreeSet samplesToChoose = new TreeSet(); private boolean NO_SAMPLES_SPECIFIED = false; From a2d90a35903d28ea4e7ab7017e712a008bc12712 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 20 Jul 2011 10:23:10 -0400 Subject: [PATCH 202/214] Bug fix: reverted logic so that default behavior skips over sample lookup --- .../sting/gatk/walkers/PrintReadsWalker.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index b10486e50..2b7db8d34 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -64,7 +64,7 @@ public class PrintReadsWalker extends ReadWalker { public Set sampleNames = new TreeSet(); private TreeSet samplesToChoose = new TreeSet(); - private boolean NO_SAMPLES_SPECIFIED = false; + private boolean SAMPLES_SPECIFIED = false; /** * The initialize function. @@ -82,8 +82,8 @@ public class PrintReadsWalker extends ReadWalker { if (!sampleNames.isEmpty()) samplesToChoose.addAll(sampleNames); - if(samplesToChoose.isEmpty()) { - NO_SAMPLES_SPECIFIED = true; + if(!samplesToChoose.isEmpty()) { + SAMPLES_SPECIFIED = true; } } @@ -112,7 +112,7 @@ public class PrintReadsWalker extends ReadWalker { if ( readPlatformAttr == null || !readPlatformAttr.toString().toUpperCase().contains(platform)) return false; } - if (!NO_SAMPLES_SPECIFIED ) { + if (SAMPLES_SPECIFIED ) { // user specified samples to select String readSample = read.getReadGroup().getSample(); boolean found = false; From 7140280bf640fe2e46de52c51888134210dddf6e Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Wed, 20 Jul 2011 10:44:37 -0400 Subject: [PATCH 203/214] Further bug fixes/cleanups for PrintReadsWalker --- .../sting/gatk/walkers/PrintReadsWalker.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java index 2b7db8d34..7e1dcd707 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/PrintReadsWalker.java @@ -114,17 +114,9 @@ public class PrintReadsWalker extends ReadWalker { } if (SAMPLES_SPECIFIED ) { // user specified samples to select - String readSample = read.getReadGroup().getSample(); - boolean found = false; - for (String sampleSelected : samplesToChoose) { - if (readSample.equalsIgnoreCase(sampleSelected)) { - found = true; - break; - } - - } - - if (!found) + // todo - should be case-agnostic but for simplicity and speed this is ignored. + // todo - can check at initialization intersection of requested samples and samples in BAM header to further speedup. + if (!samplesToChoose.contains(read.getReadGroup().getSample())) return false; } From 15610ce0c3d3d096d1775afd849f31c489f7e490 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Thu, 21 Jul 2011 11:04:22 -0400 Subject: [PATCH 207/214] Per Matt's request, disabling BWA-based integration tests so he can assess bamboo memory usage. --- .../validation/ValidationAmpliconsIntegrationTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java index 6528f5795..1829e9549 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java @@ -14,7 +14,7 @@ import java.util.Arrays; */ public class ValidationAmpliconsIntegrationTest extends WalkerTest { - @Test + @Test(enabled=false) public void testWikiExample() { String siteVCF = validationDataLocation + "sites_to_validate.vcf"; String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; @@ -27,7 +27,7 @@ public class ValidationAmpliconsIntegrationTest extends WalkerTest { executeTest("Test probes", spec); } - @Test + @Test(enabled=true) public void testWikiExampleNoBWA() { String siteVCF = validationDataLocation + "sites_to_validate.vcf"; String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; @@ -40,7 +40,7 @@ public class ValidationAmpliconsIntegrationTest extends WalkerTest { executeTest("Test probes", spec); } - @Test + @Test(enabled=false) public void testWikiExampleMonoFilter() { String siteVCF = validationDataLocation + "sites_to_validate.vcf"; String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; From 7054c5342f28f1b5ccb966919dc3a23f06206d0b Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 21 Jul 2011 12:13:29 -0400 Subject: [PATCH 210/214] When using the BWA bindings, you have to explicitly call close() to get the bindings to release memory. It may or may not be possible to implicitly close triggered by the GC; I'll add a JIRA. --- .../sting/gatk/walkers/validation/ValidationAmplicons.java | 3 +++ .../validation/ValidationAmpliconsIntegrationTest.java | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java index 14d462518..7e39d2658 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java @@ -228,6 +228,9 @@ public class ValidationAmplicons extends RodWalker { } public void onTraversalDone(Integer fin ) { + if(aligner != null) + aligner.close(); + validateSequence(); if ( doNotUseBWA ) { lowerRepeats(); diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java index 1829e9549..95f4ac0ae 100755 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmpliconsIntegrationTest.java @@ -14,7 +14,7 @@ import java.util.Arrays; */ public class ValidationAmpliconsIntegrationTest extends WalkerTest { - @Test(enabled=false) + @Test(enabled=true) public void testWikiExample() { String siteVCF = validationDataLocation + "sites_to_validate.vcf"; String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; @@ -40,7 +40,7 @@ public class ValidationAmpliconsIntegrationTest extends WalkerTest { executeTest("Test probes", spec); } - @Test(enabled=false) + @Test(enabled=true) public void testWikiExampleMonoFilter() { String siteVCF = validationDataLocation + "sites_to_validate.vcf"; String maskVCF = validationDataLocation + "amplicon_mask_sites.vcf"; From 2f5d10d16bd9e53b293c1a913e9f7a3cd601784f Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Thu, 21 Jul 2011 13:21:48 -0400 Subject: [PATCH 211/214] Fix bug wherein aligner could be closed prior to its being used to lowercase sequences. --- .../sting/gatk/walkers/validation/ValidationAmplicons.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java index 7e39d2658..cb03d4c61 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/validation/ValidationAmplicons.java @@ -228,14 +228,12 @@ public class ValidationAmplicons extends RodWalker { } public void onTraversalDone(Integer fin ) { - if(aligner != null) - aligner.close(); - validateSequence(); if ( doNotUseBWA ) { lowerRepeats(); } else { lowerNonUniqueSegments(); + aligner.close(); } print(); } From 59eb1f46634d60ccc3c1442fc5243a1df09016b2 Mon Sep 17 00:00:00 2001 From: Khalid Shakir Date: Thu, 21 Jul 2011 22:57:18 -0400 Subject: [PATCH 212/214] Memory limits changed from Int to Double. Updated LSF calls to read memory units from config along with tweaks to select hosts. Moved some common code from GridEngine and LSF to super classes. --- .../jna/lsf/v7_0_6/LibBatIntegrationTest.java | 25 +-- .../sting/queue/QSettings.scala | 2 +- .../queue/engine/CommandLineJobRunner.scala | 33 ++- .../sting/queue/engine/JobManager.scala | 4 +- .../sting/queue/engine/JobRunner.scala | 5 + .../sting/queue/engine/QGraph.scala | 5 +- .../gridengine/GridEngineJobRunner.scala | 57 ++--- .../queue/engine/lsf/Lsf706JobManager.scala | 2 +- .../queue/engine/lsf/Lsf706JobRunner.scala | 207 +++++++++--------- .../queue/engine/shell/ShellJobRunner.scala | 6 +- .../queue/function/CommandLineFunction.scala | 4 +- .../function/JavaCommandLineFunction.scala | 8 +- .../examples/HelloWorldPipelineTest.scala | 14 +- 13 files changed, 198 insertions(+), 174 deletions(-) diff --git a/public/java/test/org/broadinstitute/sting/jna/lsf/v7_0_6/LibBatIntegrationTest.java b/public/java/test/org/broadinstitute/sting/jna/lsf/v7_0_6/LibBatIntegrationTest.java index aa6303a6f..77db34cbc 100644 --- a/public/java/test/org/broadinstitute/sting/jna/lsf/v7_0_6/LibBatIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/jna/lsf/v7_0_6/LibBatIntegrationTest.java @@ -34,7 +34,6 @@ import org.testng.annotations.Test; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.jna.lsf.v7_0_6.LibBat.*; -import javax.jws.soap.SOAPBinding; import java.io.File; /** @@ -55,25 +54,25 @@ public class LibBatIntegrationTest extends BaseTest { @Test public void testReadConfEnv() { - LibLsf.config_param[] unitsParam = (LibLsf.config_param[]) new LibLsf.config_param().toArray(4); + LibLsf.config_param[] configParams = (LibLsf.config_param[]) new LibLsf.config_param().toArray(4); - unitsParam[0].paramName = "LSF_UNIT_FOR_LIMITS"; - unitsParam[1].paramName = "LSF_CONFDIR"; - unitsParam[2].paramName = "MADE_UP_PARAMETER"; + configParams[0].paramName = "LSF_UNIT_FOR_LIMITS"; + configParams[1].paramName = "LSF_CONFDIR"; + configParams[2].paramName = "MADE_UP_PARAMETER"; - Structure.autoWrite(unitsParam); + Structure.autoWrite(configParams); - if (LibLsf.ls_readconfenv(unitsParam[0], null) != 0) { + if (LibLsf.ls_readconfenv(configParams[0], null) != 0) { Assert.fail(LibLsf.ls_sysmsg()); } - Structure.autoRead(unitsParam); + Structure.autoRead(configParams); - System.out.println("LSF_UNIT_FOR_LIMITS: " + unitsParam[0].paramValue); - Assert.assertNotNull(unitsParam[1].paramValue); - Assert.assertNull(unitsParam[2].paramValue); - Assert.assertNull(unitsParam[3].paramName); - Assert.assertNull(unitsParam[3].paramValue); + System.out.println("LSF_UNIT_FOR_LIMITS: " + configParams[0].paramValue); + Assert.assertNotNull(configParams[1].paramValue); + Assert.assertNull(configParams[2].paramValue); + Assert.assertNull(configParams[3].paramName); + Assert.assertNull(configParams[3].paramValue); } @Test diff --git a/public/scala/src/org/broadinstitute/sting/queue/QSettings.scala b/public/scala/src/org/broadinstitute/sting/queue/QSettings.scala index 71970a36b..05c1a1775 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/QSettings.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/QSettings.scala @@ -45,7 +45,7 @@ class QSettings { var jobPriority: Option[Int] = None @Argument(fullName="default_memory_limit", shortName="memLimit", doc="Default memory limit for jobs, in gigabytes.", required=false) - var memoryLimit: Option[Int] = None + var memoryLimit: Option[Double] = None @Argument(fullName="run_directory", shortName="runDir", doc="Root directory to run functions from.", required=false) var runDirectory = new File(".") diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/CommandLineJobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/CommandLineJobRunner.scala index 2fbfab5ec..2e3108136 100755 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/CommandLineJobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/CommandLineJobRunner.scala @@ -33,12 +33,29 @@ import org.broadinstitute.sting.queue.util.{Logging, IOUtils} */ trait CommandLineJobRunner extends JobRunner[CommandLineFunction] with Logging { + /** The string representation of the identifier of the running job. */ + def jobIdString: String = null + /** A generated exec shell script. */ protected var jobScript: File = _ /** Which directory to use for the job status files. */ protected def jobStatusDir = function.jobTempDir + /** Amount of time a job can go without status before giving up. */ + private val unknownStatusMaxSeconds = 5 * 60 + + /** Last known status */ + protected var lastStatus: RunnerStatus.Value = _ + + /** The last time the status was updated */ + protected var lastStatusUpdate: Long = _ + + final override def status = this.lastStatus + + def residentRequestMB: Option[Double] = function.memoryLimit.map(_ * 1024) + def residentLimitMB: Option[Double] = residentRequestMB.map( _ * 1.2 ) + override def init() { super.init() var exec = new StringBuilder @@ -53,7 +70,21 @@ trait CommandLineJobRunner extends JobRunner[CommandLineFunction] with Logging { } exec.append(function.commandLine) - this.jobScript = IOUtils.writeTempFile(exec.toString, ".exec", "", jobStatusDir) + this.jobScript = IOUtils.writeTempFile(exec.toString(), ".exec", "", jobStatusDir) + } + + protected def updateStatus(updatedStatus: RunnerStatus.Value) { + this.lastStatus = updatedStatus + this.lastStatusUpdate = System.currentTimeMillis + } + + override def checkUnknownStatus() { + val unknownStatusMillis = (System.currentTimeMillis - lastStatusUpdate) + if (unknownStatusMillis > (unknownStatusMaxSeconds * 1000L)) { + // Unknown status has been returned for a while now. + updateStatus(RunnerStatus.FAILED) + logger.error("Unable to read status for %0.2f minutes: job id %d: %s".format(unknownStatusMillis/(60 * 1000D), jobIdString, function.description)) + } } override def cleanup() { diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/JobManager.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/JobManager.scala index d2be4939a..30187f7e2 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/JobManager.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/JobManager.scala @@ -44,9 +44,9 @@ trait JobManager[TFunction <: QFunction, TRunner <: JobRunner[TFunction]] { /** * Updates the status on a list of functions. * @param runners Runners to update. + * @return runners which were updated. */ - def updateStatus(runners: Set[TRunner]) { - } + def updateStatus(runners: Set[TRunner]): Set[TRunner] = Set.empty /** * Stops a list of functions. diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/JobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/JobRunner.scala index 4b4d44988..de5fbde05 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/JobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/JobRunner.scala @@ -52,6 +52,11 @@ trait JobRunner[TFunction <: QFunction] { */ def status: RunnerStatus.Value + /** + * Checks if the status has been unknown for an extended period of time. + */ + def checkUnknownStatus() {} + /** * Returns the function to be run. */ diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala index 8ed3f84c1..a52e9c561 100755 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/QGraph.scala @@ -1005,7 +1005,10 @@ class QGraph extends Logging { .asInstanceOf[Set[JobRunner[QFunction]]] if (managerRunners.size > 0) try { - manager.updateStatus(managerRunners) + val updatedRunners = manager.updateStatus(managerRunners) + for (runner <- managerRunners.diff(updatedRunners)) { + runner.checkUnknownStatus() + } } catch { case e => /* ignore */ } diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/gridengine/GridEngineJobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/gridengine/GridEngineJobRunner.scala index 82edf6221..8c639b5bb 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/gridengine/GridEngineJobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/gridengine/GridEngineJobRunner.scala @@ -40,12 +40,7 @@ class GridEngineJobRunner(val function: CommandLineFunction) extends CommandLine /** Job Id of the currently executing job. */ private var jobId: String = _ - - /** Last known status */ - private var lastStatus: RunnerStatus.Value = _ - - /** The last time the status was updated */ - protected var lastStatusUpdate: Long = _ + override def jobIdString = jobId def start() { GridEngineJobRunner.gridEngineSession.synchronized { @@ -82,11 +77,14 @@ class GridEngineJobRunner(val function: CommandLineFunction) extends CommandLine nativeSpecString += " -q " + function.jobQueue } - // If the memory limit is set (GB) specify the memory limit - if (function.memoryLimit.isDefined) { - val memAvl: String = function.memoryLimit.get + "G" - val memMax: String = (function.memoryLimit.get * 1.2 * 1024).ceil.toInt + "M" - nativeSpecString += " -l mem_free=" + memAvl + ",h_rss=" + memMax + // If the resident set size is requested pass on the memory request + if (residentRequestMB.isDefined) { + nativeSpecString += " -l mem_free=%dM".format(residentRequestMB.get.ceil.toInt) + } + + // If the resident set size limit is defined specify the memory limit + if (residentLimitMB.isDefined) { + nativeSpecString += " -l h_rss=%dM".format(residentLimitMB.get.ceil.toInt) } // If the priority is set (user specified Int) specify the priority @@ -121,21 +119,11 @@ class GridEngineJobRunner(val function: CommandLineFunction) extends CommandLine logger.info("Submitted Grid Engine job id: " + jobId) } } - - def status = this.lastStatus - - private def updateStatus(updatedStatus: RunnerStatus.Value) { - this.lastStatus = updatedStatus - this.lastStatusUpdate = System.currentTimeMillis - } } object GridEngineJobRunner extends Logging { private val gridEngineSession = SessionFactory.getFactory.getSession - /** Amount of time a job can go without status before giving up. */ - private val unknownStatusMaxSeconds = 5 * 60 - initGridEngine() /** @@ -156,16 +144,14 @@ object GridEngineJobRunner extends Logging { /** * Updates the status of a list of jobs. * @param runners Runners to update. + * @return runners which were updated. */ - def updateStatus(runners: Set[GridEngineJobRunner]) { + def updateStatus(runners: Set[GridEngineJobRunner]) = { var updatedRunners = Set.empty[GridEngineJobRunner] gridEngineSession.synchronized { runners.foreach(runner => if (updateRunnerStatus(runner)) {updatedRunners += runner}) } - - for (runner <- runners.diff(updatedRunners)) { - checkUnknownStatus(runner) - } + updatedRunners } /** @@ -219,20 +205,11 @@ object GridEngineJobRunner extends Logging { logger.warn("Unable to determine status of Grid Engine job id " + runner.jobId, de) } - Option(returnStatus) match { - case Some(returnStatus) => - runner.updateStatus(returnStatus) - return true - case None => return false - } - } - - private def checkUnknownStatus(runner: GridEngineJobRunner) { - val unknownStatusSeconds = (System.currentTimeMillis - runner.lastStatusUpdate) - if (unknownStatusSeconds > (unknownStatusMaxSeconds * 1000L)) { - // Unknown status has been returned for a while now. - runner.updateStatus(RunnerStatus.FAILED) - logger.error("Unable to read Grid Engine status for %d minutes: job id %d: %s".format(unknownStatusSeconds/60, runner.jobId, runner.function.description)) + if (returnStatus != null) { + runner.updateStatus(returnStatus) + true + } else { + false } } diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobManager.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobManager.scala index c0fff9125..23ddab619 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobManager.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobManager.scala @@ -34,6 +34,6 @@ class Lsf706JobManager extends CommandLineJobManager[Lsf706JobRunner] { def runnerType = classOf[Lsf706JobRunner] def create(function: CommandLineFunction) = new Lsf706JobRunner(function) - override def updateStatus(runners: Set[Lsf706JobRunner]) { Lsf706JobRunner.updateStatus(runners) } + override def updateStatus(runners: Set[Lsf706JobRunner]) = { Lsf706JobRunner.updateStatus(runners) } override def tryStop(runners: Set[Lsf706JobRunner]) { Lsf706JobRunner.tryStop(runners) } } diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala index ac2f036b4..46dd08332 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/lsf/Lsf706JobRunner.scala @@ -32,8 +32,8 @@ import org.broadinstitute.sting.utils.Utils import org.broadinstitute.sting.jna.clibrary.LibC import org.broadinstitute.sting.jna.lsf.v7_0_6.LibBat.{submitReply, submit} import com.sun.jna.ptr.IntByReference -import com.sun.jna.{StringArray, NativeLong} import org.broadinstitute.sting.queue.engine.{RunnerStatus, CommandLineJobRunner} +import com.sun.jna.{Structure, StringArray, NativeLong} /** * Runs jobs on an LSF compute cluster. @@ -45,12 +45,7 @@ class Lsf706JobRunner(val function: CommandLineFunction) extends CommandLineJobR /** Job Id of the currently executing job. */ private var jobId = -1L - - /** Last known status */ - private var lastStatus: RunnerStatus.Value = _ - - /** The last time the status was updated */ - protected var lastStatusUpdate: Long = _ + override def jobIdString = jobId.toString /** * Dispatches the function on the LSF cluster. @@ -85,12 +80,19 @@ class Lsf706JobRunner(val function: CommandLineFunction) extends CommandLineJobR request.options |= LibBat.SUB_QUEUE } - // If the memory limit is set (GB) specify the memory limit - if (function.memoryLimit.isDefined) { - request.resReq = "rusage[mem=" + function.memoryLimit.get + "]" + // If the resident set size is requested pass on the memory request + if (residentRequestMB.isDefined) { + val memInUnits = Lsf706JobRunner.convertUnits(residentRequestMB.get) + request.resReq = "select[mem>%1$d] rusage[mem=%1$d]".format(memInUnits) request.options |= LibBat.SUB_RES_REQ } + // If the resident set size limit is defined specify the memory limit + if (residentLimitMB.isDefined) { + val memInUnits = Lsf706JobRunner.convertUnits(residentLimitMB.get) + request.rLimits(LibLsf.LSF_RLIMIT_RSS) = memInUnits + } + // If the priority is set (user specified Int) specify the priority if (function.jobPriority.isDefined) { request.userPriority = function.jobPriority.get @@ -122,11 +124,13 @@ class Lsf706JobRunner(val function: CommandLineFunction) extends CommandLineJobR } } - def status = this.lastStatus - - private def updateStatus(updatedStatus: RunnerStatus.Value) { - this.lastStatus = updatedStatus - this.lastStatusUpdate = System.currentTimeMillis + override def checkUnknownStatus() { + // TODO: Need a second pass through either of the two archive logs using lsb_geteventrecbyline() for disappeared jobs. + // Can also tell if we wake up and the last time we saw status was greater than lsb_parameterinfo().cleanPeriod + // LSB_SHAREDIR/cluster_name/logdir/lsb.acct (man bacct) + // LSB_SHAREDIR/cluster_name/logdir/lsb.events (man bhist) + logger.debug("Job Id %s status / exitStatus / exitInfo: ??? / ??? / ???".format(jobId)) + super.checkUnknownStatus() } } @@ -137,17 +141,8 @@ object Lsf706JobRunner extends Logging { /** Number of seconds for a non-normal exit status before we give up on expecting LSF to retry the function. */ private val retryExpiredSeconds = 5 * 60 - /** Amount of time a job can go without status before giving up. */ - private val unknownStatusMaxSeconds = 5 * 60 - initLsf() - /** The name of the default queue. */ - private var defaultQueue: String = _ - - /** The run limits for each queue. */ - private var queueRlimitRun = Map.empty[String,Int] - /** * Initialize the Lsf library. */ @@ -161,8 +156,9 @@ object Lsf706JobRunner extends Logging { /** * Bulk updates job statuses. * @param runners Runners to update. + * @return runners which were updated. */ - def updateStatus(runners: Set[Lsf706JobRunner]) { + def updateStatus(runners: Set[Lsf706JobRunner]) = { var updatedRunners = Set.empty[Lsf706JobRunner] Lsf706JobRunner.lsfLibLock.synchronized { @@ -192,70 +188,7 @@ object Lsf706JobRunner extends Logging { } } - for (runner <- runners.diff(updatedRunners)) { - checkUnknownStatus(runner) - } - } - - /** - * Tries to stop any running jobs. - * @param runners Runners to stop. - */ - def tryStop(runners: Set[Lsf706JobRunner]) { - lsfLibLock.synchronized { - // lsb_killbulkjobs does not seem to forward SIGTERM, - // only SIGKILL, so send the Ctrl-C (SIGTERM) one by one. - for (runner <- runners.filterNot(_.jobId < 0)) { - try { - if (LibBat.lsb_signaljob(runner.jobId, SIGTERM) < 0) - logger.error(LibBat.lsb_sperror("Unable to kill job " + runner.jobId)) - } catch { - case e => - logger.error("Unable to kill job " + runner.jobId, e) - } - } - } - } - - - /** - * Returns the run limit in seconds for the queue. - * If the queue name is null returns the length of the default queue. - * @param queue Name of the queue or null for the default queue. - * @return the run limit in seconds for the queue. - */ - private def getRlimitRun(queue: String) = { - lsfLibLock.synchronized { - if (queue == null) { - if (defaultQueue != null) { - queueRlimitRun(defaultQueue) - } else { - // Get the info on the default queue. - val numQueues = new IntByReference(1) - val queueInfo = LibBat.lsb_queueinfo(null, numQueues, null, null, 0) - if (queueInfo == null) - throw new QException(LibBat.lsb_sperror("Unable to get LSF queue info for the default queue")) - defaultQueue = queueInfo.queue - val limit = queueInfo.rLimits(LibLsf.LSF_RLIMIT_RUN) - queueRlimitRun += defaultQueue -> limit - limit - } - } else { - queueRlimitRun.get(queue) match { - case Some(limit) => limit - case None => - // Cache miss. Go get the run limits from LSF. - val queues = new StringArray(Array[String](queue)) - val numQueues = new IntByReference(1) - val queueInfo = LibBat.lsb_queueinfo(queues, numQueues, null, null, 0) - if (queueInfo == null) - throw new QException(LibBat.lsb_sperror("Unable to get LSF queue info for queue: " + queue)) - val limit = queueInfo.rLimits(LibLsf.LSF_RLIMIT_RUN) - queueRlimitRun += queue -> limit - limit - } - } - } + updatedRunners } private def updateRunnerStatus(runner: Lsf706JobRunner, jobInfo: LibBat.jobInfoEnt) { @@ -280,20 +213,6 @@ object Lsf706JobRunner extends Logging { ) } - private def checkUnknownStatus(runner: Lsf706JobRunner) { - // TODO: Need a second pass through either of the two archive logs using lsb_geteventrecbyline() for disappeared jobs. - // Can also tell if we wake up and the last time we saw status was greater than lsb_parameterinfo().cleanPeriod - // LSB_SHAREDIR/cluster_name/logdir/lsb.acct (man bacct) - // LSB_SHAREDIR/cluster_name/logdir/lsb.events (man bhist) - logger.debug("Job Id %s status / exitStatus / exitInfo: ??? / ??? / ???".format(runner.jobId)) - val unknownStatusMillis = (System.currentTimeMillis - runner.lastStatusUpdate) - if (unknownStatusMillis > (unknownStatusMaxSeconds * 1000L)) { - // Unknown status has been returned for a while now. - runner.updateStatus(RunnerStatus.FAILED) - logger.error("Unable to read LSF status for %0.2f minutes: job id %d: %s".format(unknownStatusMillis/(60 * 1000D), runner.jobId, runner.function.description)) - } - } - /** * Returns true if LSF is expected to retry running the function. * @param exitInfo The reason the job exited. @@ -309,4 +228,86 @@ object Lsf706JobRunner extends Logging { } } } + + /** + * Tries to stop any running jobs. + * @param runners Runners to stop. + */ + def tryStop(runners: Set[Lsf706JobRunner]) { + lsfLibLock.synchronized { + // lsb_killbulkjobs does not seem to forward SIGTERM, + // only SIGKILL, so send the Ctrl-C (SIGTERM) one by one. + for (runner <- runners.filterNot(_.jobId < 0)) { + try { + if (LibBat.lsb_signaljob(runner.jobId, SIGTERM) < 0) + logger.error(LibBat.lsb_sperror("Unable to kill job " + runner.jobId)) + } catch { + case e => + logger.error("Unable to kill job " + runner.jobId, e) + } + } + } + } + + /** The name of the default queue. */ + private lazy val defaultQueue: String = { + lsfLibLock.synchronized { + val numQueues = new IntByReference(1) + val queueInfo = LibBat.lsb_queueinfo(null, numQueues, null, null, 0) + if (queueInfo == null) + throw new QException(LibBat.lsb_sperror("Unable to get LSF queue info for the default queue")) + queueInfo.queue + } + } + + /** The run limits for each queue. */ + private var queueRlimitRun = Map.empty[String,Int] + + /** + * Returns the run limit in seconds for the queue. + * If the queue name is null returns the length of the default queue. + * @param queue Name of the queue or null for the default queue. + * @return the run limit in seconds for the queue. + */ + private def getRlimitRun(queueName: String) = { + lsfLibLock.synchronized { + val queue = if (queueName == null) defaultQueue else queueName + queueRlimitRun.get(queue) match { + case Some(limit) => limit + case None => + // Cache miss. Go get the run limits from LSF. + val queues = new StringArray(Array(queue)) + val numQueues = new IntByReference(1) + val queueInfo = LibBat.lsb_queueinfo(queues, numQueues, null, null, 0) + if (queueInfo == null) + throw new QException(LibBat.lsb_sperror("Unable to get LSF queue info for queue: " + queue)) + val limit = queueInfo.rLimits(LibLsf.LSF_RLIMIT_RUN) + queueRlimitRun += queue -> limit + limit + } + } + } + + private lazy val unitDivisor: Double = { + lsfLibLock.synchronized { + val unitsParam: Array[LibLsf.config_param] = new LibLsf.config_param().toArray(2).asInstanceOf[Array[LibLsf.config_param]] + unitsParam(0).paramName = "LSF_UNIT_FOR_LIMITS" + + Structure.autoWrite(unitsParam.asInstanceOf[Array[Structure]]) + if (LibLsf.ls_readconfenv(unitsParam(0), null) != 0) + throw new QException(LibBat.lsb_sperror("ls_readconfenv() failed")) + Structure.autoRead(unitsParam.asInstanceOf[Array[Structure]]) + + unitsParam(0).paramValue match { + case "MB" => 1D + case "GB" => 1024D + case "TB" => 1024D * 1024 + case "PB" => 1024D * 1024 * 1024 + case "EB" => 1024D * 1024 * 1024 * 1024 + case null => 1D + } + } + } + + private def convertUnits(mb: Double) = (mb / unitDivisor).ceil.toInt } diff --git a/public/scala/src/org/broadinstitute/sting/queue/engine/shell/ShellJobRunner.scala b/public/scala/src/org/broadinstitute/sting/queue/engine/shell/ShellJobRunner.scala index 603511a30..128d8773c 100755 --- a/public/scala/src/org/broadinstitute/sting/queue/engine/shell/ShellJobRunner.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/engine/shell/ShellJobRunner.scala @@ -50,10 +50,10 @@ class ShellJobRunner(val function: CommandLineFunction) extends CommandLineJobRu // Allow advanced users to update the job. updateJobRun(job) - runStatus = RunnerStatus.RUNNING + updateStatus(RunnerStatus.RUNNING) job.run() - runStatus = RunnerStatus.DONE + updateStatus(RunnerStatus.FAILED) } - def status = runStatus + override def checkUnknownStatus() {} } diff --git a/public/scala/src/org/broadinstitute/sting/queue/function/CommandLineFunction.scala b/public/scala/src/org/broadinstitute/sting/queue/function/CommandLineFunction.scala index 2b1abb2d0..c62fdcd7c 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/function/CommandLineFunction.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/function/CommandLineFunction.scala @@ -9,7 +9,7 @@ trait CommandLineFunction extends QFunction with Logging { def commandLine: String /** Upper memory limit */ - var memoryLimit: Option[Int] = None + var memoryLimit: Option[Double] = None /** Job project to run the command */ var jobProject: String = _ @@ -56,7 +56,7 @@ trait CommandLineFunction extends QFunction with Logging { if (memoryLimit.isEmpty) memoryLimit = qSettings.memoryLimit - super.freezeFieldValues + super.freezeFieldValues() } /** diff --git a/public/scala/src/org/broadinstitute/sting/queue/function/JavaCommandLineFunction.scala b/public/scala/src/org/broadinstitute/sting/queue/function/JavaCommandLineFunction.scala index 72445442e..e8279f62b 100644 --- a/public/scala/src/org/broadinstitute/sting/queue/function/JavaCommandLineFunction.scala +++ b/public/scala/src/org/broadinstitute/sting/queue/function/JavaCommandLineFunction.scala @@ -47,7 +47,7 @@ trait JavaCommandLineFunction extends CommandLineFunction { /** * Memory limit for the java executable, or if None will use the default memoryLimit. */ - var javaMemoryLimit: Option[Int] = None + var javaMemoryLimit: Option[Double] = None /** * Returns the java executable to run. @@ -61,8 +61,8 @@ trait JavaCommandLineFunction extends CommandLineFunction { null } - override def freezeFieldValues = { - super.freezeFieldValues + override def freezeFieldValues() { + super.freezeFieldValues() if (javaMemoryLimit.isEmpty && memoryLimit.isDefined) javaMemoryLimit = memoryLimit @@ -72,7 +72,7 @@ trait JavaCommandLineFunction extends CommandLineFunction { } def javaOpts = "%s -Djava.io.tmpdir=%s" - .format(optional(" -Xmx", javaMemoryLimit, "g"), jobTempDir) + .format(optional(" -Xmx", javaMemoryLimit.map(gb => (gb * 1024).ceil.toInt), "m"), jobTempDir) def commandLine = "java%s %s" .format(javaOpts, javaExecutable) diff --git a/public/scala/test/org/broadinstitute/sting/queue/pipeline/examples/HelloWorldPipelineTest.scala b/public/scala/test/org/broadinstitute/sting/queue/pipeline/examples/HelloWorldPipelineTest.scala index 0871e769b..7c76823da 100644 --- a/public/scala/test/org/broadinstitute/sting/queue/pipeline/examples/HelloWorldPipelineTest.scala +++ b/public/scala/test/org/broadinstitute/sting/queue/pipeline/examples/HelloWorldPipelineTest.scala @@ -29,7 +29,7 @@ import org.broadinstitute.sting.queue.pipeline.{PipelineTest, PipelineTestSpec} class HelloWorldPipelineTest { @Test - def testHelloWorld { + def testHelloWorld() { val spec = new PipelineTestSpec spec.name = "HelloWorld" spec.args = "-S public/scala/qscript/org/broadinstitute/sting/queue/qscripts/examples/HelloWorld.scala" @@ -37,15 +37,23 @@ class HelloWorldPipelineTest { } @Test - def testHelloWorldWithPrefix { + def testHelloWorldWithPrefix() { val spec = new PipelineTestSpec spec.name = "HelloWorldWithPrefix" spec.args = "-S public/scala/qscript/org/broadinstitute/sting/queue/qscripts/examples/HelloWorld.scala -jobPrefix HelloWorld" PipelineTest.executeTest(spec) } + @Test + def testHelloWorldWithMemoryLimit() { + val spec = new PipelineTestSpec + spec.name = "HelloWorldWithPrefix" + spec.args = "-S public/scala/qscript/org/broadinstitute/sting/queue/qscripts/examples/HelloWorld.scala -memLimit 1.25" + PipelineTest.executeTest(spec) + } + @Test(enabled=false) - def testHelloWorldWithPriority { + def testHelloWorldWithPriority() { val spec = new PipelineTestSpec spec.name = "HelloWorldWithPriority" spec.args = "-S public/scala/qscript/org/broadinstitute/sting/queue/qscripts/examples/HelloWorld.scala -jobPriority 100" From f50145b87213ed50c39e83519ff07c19396ebfe9 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Fri, 22 Jul 2011 13:41:53 -0400 Subject: [PATCH 214/214] Reinitialize random seed in the bwa bindings from the fixed seed stored in the BWA support files every time the support files are loaded. --- public/c/bwa/build_linux.sh | 2 +- public/c/bwa/bwa_gateway.cpp | 9 +++++++++ public/c/bwa/bwa_gateway.h | 1 + public/c/bwa/libbwa.so.1 | Bin 380907 -> 0 bytes .../alignment/AlignerIntegrationTest.java | 2 +- 5 files changed, 12 insertions(+), 2 deletions(-) delete mode 100755 public/c/bwa/libbwa.so.1 diff --git a/public/c/bwa/build_linux.sh b/public/c/bwa/build_linux.sh index c713f3963..b3631a28d 100755 --- a/public/c/bwa/build_linux.sh +++ b/public/c/bwa/build_linux.sh @@ -1,5 +1,5 @@ #!/bin/sh -export BWA_HOME="/humgen/gsa-scr1/hanna/src/bwa" +export BWA_HOME="/humgen/gsa-scr1/hanna/src/bwa-trunk/bwa" export JAVA_INCLUDE="/broad/tools/Linux/x86_64/pkgs/jdk_1.6.0_12/include -I/broad/tools/Linux/x86_64/pkgs/jdk_1.6.0_12/include/linux" export TARGET_LIB="libbwa.so" export EXTRA_LIBS="-lc -lz -lstdc++ -lpthread" diff --git a/public/c/bwa/bwa_gateway.cpp b/public/c/bwa/bwa_gateway.cpp index 3f6850e37..00f5aa5bc 100644 --- a/public/c/bwa/bwa_gateway.cpp +++ b/public/c/bwa/bwa_gateway.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "bwase.h" #include "bwa_gateway.h" @@ -27,6 +28,9 @@ BWA::BWA(const char* ann_filename, bwt_restore_sa(reverse_sa_filename, bwts[1]); load_default_options(); + // Always reinitialize the random seed whenever a new set of files are loaded. + initialize_random_seed(); + // initialize the bwase subsystem bwase_initialize(); } @@ -207,6 +211,11 @@ void BWA::load_default_options() options.trim_qual = 0; } +void BWA::initialize_random_seed() +{ + srand48(bns->seed); +} + void BWA::set_max_edit_distance(float edit_distance) { if(edit_distance > 0 && edit_distance < 1) { options.fnr = edit_distance; diff --git a/public/c/bwa/bwa_gateway.h b/public/c/bwa/bwa_gateway.h index 0ef0a129b..2d26ec650 100644 --- a/public/c/bwa/bwa_gateway.h +++ b/public/c/bwa/bwa_gateway.h @@ -37,6 +37,7 @@ class BWA { gap_opt_t options; void load_default_options(); + void initialize_random_seed(); bwa_seq_t* create_sequence(const char* bases, const unsigned read_length); void copy_bases_into_sequence(bwa_seq_t* sequence, const char* bases, const unsigned read_length); Alignment generate_final_alignment_from_sequence(bwa_seq_t* sequence); diff --git a/public/c/bwa/libbwa.so.1 b/public/c/bwa/libbwa.so.1 deleted file mode 100755 index bfa3c28473de8485fed89f8458be2a2bda1cdc4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380907 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�hQB+h<*i^cqfi4&9%JO8 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
<>pb~gv8^Jx4*#rM^_Q95m|2RtS4Jy~ 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 diff --git a/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java b/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java index dafaf3ffe..a6af034cb 100644 --- a/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java +++ b/public/java/test/org/broadinstitute/sting/alignment/AlignerIntegrationTest.java @@ -14,7 +14,7 @@ import java.util.Arrays; public class AlignerIntegrationTest extends WalkerTest { @Test public void testBasicAlignment() { - String md5 = "34eb4323742999d6d250a0aaa803c6d5"; + String md5 = "a2bdf907b18114a86ca47f9fc23791bf"; WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + GATKDataLocation + "bwa/human_b36_both.fasta" + " -T Align" +