From b66820da35d7f8f7e84330a9665dd75f8725e595 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Wed, 29 Jun 2011 14:43:17 -0400 Subject: [PATCH 001/214] Initial phase of PreQC database generation, plus refactoring of pm input parser and per sample metrics generator to provide supporting methods for PreQC database generation. 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 963aa0ce5f..4916c4ac4a 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.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 void initialize() { // 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 @@ private VariantContext subsetRecord(VariantContext vc, Set samples) { } + 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 ebe6dda0c195f92e801ca61d80bcaeb7f0cf9480 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Wed, 29 Jun 2011 15:39:07 -0400 Subject: [PATCH 003/214] Oops...we were pulling only first of pair alignment summary metrics into QC before; now (I think) we're pulling cumulative metrics instead. We should eventually consider incorporating the 1 of pair, 2 of pair, and unpaired metrics as well. 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 0000000000..3511178092 --- /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 4916c4ac4a..cbac543262 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 @@ else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().ne 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 1f430548b1..62f6ff5a67 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 @@ private ArrayList computeConsensusAlleles(ReferenceContext ref, 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 e7b9cfa683..419ae694f0 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 synchronized double[] computeReadHaplotypeLikelihoods(ReadBackedPileup pi if (read == null) continue; - if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { + /* if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { continue; } - + */ double[] recalQuals = null; /* @@ -990,6 +991,10 @@ public synchronized double[] computeReadHaplotypeLikelihoods(ReadBackedPileup pi } 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 18:09:26 -0400 Subject: [PATCH 006/214] Moved around packages and imports for the Replication Validation walker to work with the new private/public framework. Pooled caller implemented but is failing tests (always choosing AC=0). From 9b134f3b96b6d5ed4cd0b87843cb6b0b5e1fc4d5 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel 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 71dd5df3f5..079fc7aba9 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 static List extractFields(VariantContext vc, List fields, 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 079fc7aba9..2111b09591 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 static List extractFields(VariantContext vc, List fields, 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 static List extractFields(VariantContext vc, List fields, } else - af = Double.valueOf(afo); + if (!afo.equals("NA")) + af = Double.valueOf(afo); val = Double.toString(af); From 843f604be2ec3336027ac9f7815651237d79a4df Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 30 Jun 2011 11:20:50 -0400 Subject: [PATCH 009/214] Bugfixing: better handling of missing Picard directories. Writing dates in a format more conducive to R parsing. From 18e2e1441ab274f614fb0870497ceaba75ed8ad1 Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Thu, 30 Jun 2011 12:49:30 -0400 Subject: [PATCH 010/214] VCF4 test walker isn't useful anymore From 5f83a5cb0916a57a475ba8493cc51084cdcabd0c Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Thu, 30 Jun 2011 14:16:36 -0400 Subject: [PATCH 011/214] Revert "VCF4 test walker isn't useful anymore" This reverts commit 744fcb5c6d0e0993fdfa4b3c70428ef18dff2a21. From 419bf259ee3c88c02f451e320a8ae6ec0af51d4a Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 30 Jun 2011 18:03:59 -0400 Subject: [PATCH 012/214] Large number of bugfixes for bugs encountered while trying to scale up preQC database generation to all reprocessed data: - Better support for missing data, esp. in eval files. - More R-compatible date formatting. - Some of the AlignmentSummaryMetrics were only for first of pair. - Some of the InsertSizeMetrics retrieved data for only one pairing orientation. - More/better command-line customization. From bf29ca21cd14753639f8c0f9f8d0941c97e1af9a Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Fri, 1 Jul 2011 10:53:07 -0400 Subject: [PATCH 013/214] Some bugfixes for yesterday's sparse data population enhancements. 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 33069f1f5b..f23433bb54 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 Map annotate(RefMetaDataTracker tracker, ReferenceContext 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 635dc5de4b56a0e91a70a05e9b3aeab1633ca7a2 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Fri, 1 Jul 2011 20:51:01 -0400 Subject: [PATCH 015/214] New hyper-parallel structure for indel consensus: each 3 MB chunk is divided into 100 subchunks so I can fit in hour queue. Got rid on indel realignment and snp parts, use BTI to compute only at input sites. 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 9877781d1d..02d850211e 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 @@ 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 void initialize() { 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 void initialize() { 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 Integer map( RefMetaDataTracker tracker, ReferenceContext ref, AlignmentC 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 9ffe7be7a1..a09a301457 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 double evaluateDatum( final VariantDatum datum ) { 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 2fd1326fe3..efff5b780b 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 void parseTrainingSets( final RefMetaDataTracker tracker, final Reference 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 ac875b645a..38e2affb69 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 e651b62e0e..b5fda4443f 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 @@ 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 void onTraversalDone( final ExpandingArrayList reduceSum ) engine.evaluateData( dataManager.getData(), goodModel, false ); final GaussianMixtureModel badModel = engine.generateModel( dataManager.selectWorstVariants( VRAC.PERCENT_BAD_VARIANTS, VRAC.MIN_NUM_BAD_VARIANTS ) ); engine.evaluateData( dataManager.getData(), badModel, true ); + engine.calculateWorstPerformingAnnotation( dataManager.getData(), goodModel, badModel ); final ExpandingArrayList 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 a0fbc572d7..81e4d190cf 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 void evaluateData( final List data, final GaussianMixtureMo } } + 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 eb6a1a4c62..9600046da7 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 VRTest(String inVCF, String tranchesMD5, String recalMD5, String cutVCFMD 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 b66581dc453ce2cc35d389cdac4cd0e6c0931716 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Sat, 2 Jul 2011 16:45:08 -0400 Subject: [PATCH 017/214] More changes on consensus script 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 62f6ff5a67..1f430548b1 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 @@ private ArrayList computeConsensusAlleles(ReferenceContext ref, 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 5c1f57bc72..ab7ae4184a 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 synchronized double[] computeReadHaplotypeLikelihoods(ReadBackedPileup pi if (read == null) continue; - /* if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { + if(ReadUtils.is454Read(read) && !getGapPenaltiesFromFile) { continue; } - */ + double[] recalQuals = null; /* @@ -991,10 +990,6 @@ public synchronized double[] computeReadHaplotypeLikelihoods(ReadBackedPileup pi } 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 f3677421ea..9bbcf395ac 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 efff5b780b..cd739f9fc2 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 void normalizeData() { remove = remove || (Math.abs(val) > VRAC.STD_THRESHOLD); } datum.failingSTDThreshold = remove; - datum.usedForTraining = 0; } } @@ -118,38 +117,47 @@ public ExpandingArrayList getTrainingData() { 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 ExpandingArrayList getRandomDataForPlotting( int numToAdd ) 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 void parseTrainingSets( final RefMetaDataTracker tracker, final Reference 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 void parseTrainingSets( final RefMetaDataTracker tracker, final Reference 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 38e2affb69..04a5a9d3ef 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 b5fda4443f..b903d20afe 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 ExpandingArrayList map( final RefMetaDataTracker tracker, f datum.originalQual = vc.getPhredScaledQual(); datum.isSNP = vc.isSNP() && vc.isBiallelic(); datum.isTransition = datum.isSNP && VariantContextUtils.isTransition(vc); - datum.usedForTraining = 0; // Loop through the training data sets and if they overlap this loci then update the prior and training status appropriately dataManager.parseTrainingSets( tracker, ref, context, vc, datum, TRUST_ALL_POLYMORPHIC ); @@ -328,7 +327,8 @@ private void createVisualizationScript( final ExpandingArrayList r stream.print("data <- c("); for( final VariantDatum datum : randomData ) { - stream.print(String.format("%.3f, %.3f, %.3f, %d, %d,", datum.annotations[iii], datum.annotations[jjj], (datum.lod < lodCutoff ? -1.0 : 1.0), datum.usedForTraining, (datum.isKnown ? 1 : -1))); + stream.print(String.format("%.3f, %.3f, %.3f, %d, %d,", datum.annotations[iii], datum.annotations[jjj], (datum.lod < lodCutoff ? -1.0 : 1.0), + (datum.atAntiTrainingSite ? -1 : (datum.atTrainingSite ? 1 : 0)), (datum.isKnown ? 1 : -1))); } stream.println("NA,NA,NA,NA,1)"); stream.println("d <- matrix(data,ncol=5,byrow=T)"); From 781c0c33a42a4df39624e33da7eb300a580c61b3 Mon Sep 17 00:00:00 2001 From: Ryan Poplin 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 cd739f9fc2..309d1b8fa4 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 ExpandingArrayList selectWorstVariants( double bottomPercen 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 void parseTrainingSets( final RefMetaDataTracker tracker, final Reference 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 309d1b8fa4..f83e9b2f0c 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 ExpandingArrayList selectWorstVariants( double bottomPercen 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 2111b09591..d8340b761f 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 static List extractFields(VariantContext vc, List fields, 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 0000000000..549f543457 --- /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 0000000000..8699ab253b --- /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 527fbeaf3c4cee9f03be13ac368d320f0b296f27 Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Mon, 4 Jul 2011 19:34:15 -0400 Subject: [PATCH 024/214] Extensive unit tests for DiffNodes, Diffelements, and DiffLeafs data structure. The lack of unity in these three data structures is a bit gross, to be honest, but it might may not be a significant factor when I reach implementing the generic diff functions. The problem is that ideally these would look like the scheme structures: (A B (C D E)) which is a nested list containing A and B items and a sublist of C D E. Here there are only two classes: lists and everything else. Right now we have three. DiffNodes, which contain both atomic fields (A B) as well as the subnodes ((C D E)) here. These a specific class for DiffLeaf, which is really just a pair mapping name=value. And DiffElement contains a named item, since all objected in the hierarchy have a name. It's just doesn't feel right to me right now. Ultimately the problem is that you want the objects to be self-describing, so the DiffElement and DiffLeaf are a clean factoring the need for names in both the values and the nodes. 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 cbac543262..95e5ed9347 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.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 void set (VariantContext vcP, byte refBaseP) { 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 @@ else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().ne 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 @@ else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().ne 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 95e5ed9347..e7331d6466 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 e7331d6466..bddfed66eb 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 bddfed66eb..2eb35c2be8 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 | 83 +++++++++---------- 1 file changed, 39 insertions(+), 44 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 2eb35c2be8..bbe8cd05ed 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { } } - } + } /** * Subset VC record if necessary and emit the modified record (provided it satisfies criteria for printing) @@ -326,58 +326,53 @@ else if (!SELECT_RANDOM_FRACTION || GenomeAnalysisEngine.getRandomGenerator().ne } 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); - double[] afd = new double[afs.length]; + if ( sub.hasAttribute(VCFConstants.ALLELE_FREQUENCY_KEY) ) { + String afo = sub.getAttributeAsString(VCFConstants.ALLELE_FREQUENCY_KEY); - for (int k=0; k < afd.length; k++) - afd[k] = Double.valueOf(afs[k]); + 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); - af = MathUtils.arrayMax(afd); - //af = Double.valueOf(afs[0]); + double[] afd = new double[afs.length]; - } - else - af = Double.valueOf(afo); + for (int k=0; k < afd.length; k++) + afd[k] = Double.valueOf(afs[k]); - // 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); + af = MathUtils.arrayMax(afd); + //af = Double.valueOf(afs[0]); + } + 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()); } - break; // do only one vc + + //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 @@ private boolean sampleHasVariant(Genotype g) { 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 void onTraversalDone(Integer result) { * @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 @@ private VariantContext subsetRecord(VariantContext vc, Set samples) { 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 @@ private VariantContext subsetRecord(VariantContext vc, Set samples) { 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 bbe8cd05ed..aa8a49175f 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 3a8710b7de65d7b49fd4501515ba9636a5c5d5be Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Mon, 4 Jul 2011 23:43:49 -0400 Subject: [PATCH 031/214] Parsing and printing via simple oneLineString representations. X=Y, X=(A=B C=D), for example. Diff algorithm implementation, but no testing. DiffEngineUnitTest implemented, and testing framework nearly ready to actually evalute the correctness of the diff algorithm. From 60b9aa7c59e419001c99ecdf7c25bced37570dec Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Tue, 5 Jul 2011 09:10:34 -0400 Subject: [PATCH 032/214] Intemediate commit. Not working, but last changes are now logged before revisiting the DiffNode DiffElement DiffLeaf hierarchy From 592e79a4ba00871a50911e59f01f07772d3f34f5 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Tue, 5 Jul 2011 13:32:21 -0400 Subject: [PATCH 033/214] There is no pretty way to do this unfortunately. How to remove files from STABLE, sync with UNSTABLE but maintain the files there : 1. Remove all files from STABLE commit then push. 2. Do the 'bug-fix' routine to update UNSTABLE. <-- here you will also remove the files from unstable. 3. Go to unstable and revert the commit where you deleted the files. This way you keep them in Unstable, remove from stable and safely maintain the repositories going their separate ways. ps: this is what I did here :-) This reverts commit 4dbd5e476cbe441c2a9fa67e88c3b4dbf57b3b9e. From a765c08381c676d677609e0a909ef48fd7046a94 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Tue, 5 Jul 2011 13:58:50 -0400 Subject: [PATCH 034/214] New home for the ReducedBAMEvaluation qscript. 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 fe17235872..21066686f6 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 fe17235872..a78c4d7384 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 c2a6c4ccda..10e4ee570f 100644 --- a/ivy.xml +++ b/ivy.xml @@ -48,6 +48,9 @@ + + + diff --git a/settings/ivysettings.xml b/settings/ivysettings.xml index 1e47fa847e..2c8fc388f2 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 zS6QP(m0Zv6vDTa>W4zuSEV})UQ8m2srAje&+TGhk@Xm2aBY&c?tLB2T0Bun8$VDaG zTob?a9JQ*LA3~jDLTJ155j+vRedq8^*#N$GUtK7IFZkOL3rl#CeeQjT7ie>VSfjd& zkGmJL&AD#AN82r0gl+jVh%XcI=vCU#i(e#JHEz52EWsGwAqXZPsqA9s<&n#HXu~LB z(6F&4>qI5HeX)_Q(J$e@e5-WsD>dQiTYif<#E-#e1=fTCu>=IIXvAw~YcRg_0qp14$ZS^<2 z75A?MGqSYcm4_Qsbf;Fenc6UQ;WV_)91OU7-FY)op9^S)qj)ZzO=k{~&#*gN`>`pi z=EdrQAWlaDMf)N>u<}nrsA(*}?bBD&5bH!7S!UH|KbT}JPx}6X8Rnb|6HGA}ye{nw zj0x|RC0gN1R~g)V6buH zGk2t+hDNW5$e7Gct)`()(DP?o=ZXlOYr=!V;h^6ce8>F;tHu`%>Q6jLS}~uN-57p!mV^4WhKx=^JeiFcUENvvCGi;Nv8tua|H4}5}wXd!mU!ts3Psu z3^_m9k*}ES&yJ**G%u_+k-SE$=bfhfrxt#&_$9Xe2y}$0CuiJw0TcMSPA<0k1K;H% zxw|p;&!wka7u%IH)w&+XFzrxPo}4&Z4})LIFZT9?7^Amyd8X_n>d-dKMJ;#({h~sS zwJE`vmsK<+U%;h}(ekPZ+{ORGq+3Wbh}d3E(3xSf{L)qiQ}npf?qvEcx*vB7Ie39k zLPQs-#)1k@?cl|{RlTh5q25eppr`b;lfiqgRwef;#GgEoYPd66do@VevkxmW4Ks*r z&1zcTOjZ5-`S7)l+IIvSHMbbQ)CgPNdHL3NDl5Cw#SzIA@@{ zs=mw_g;#3H(FZ?r{&LfEMj$wn(Z8<~Ke*Ib@x?)Oe_wvYl~k^e z@%LQ@XLi&U+A~&GqOo z?4YhgB3`!aHG^U#M|E{BSO_r}I}B5sV8x~R)79Rgo8Iw?@JJ^tUtw3`OPOIAc>(Xm zGw$ov(^Gp}XHRc8w>iAWgVUtPwD#FwzmTApeO!(^y&gQD2y&iq8j~HIle=PjSq%H) z`|5wpD2t>+Qk#Ym1?ZN7p+FkC#{XKE_asS?S>YKXlgCn%Q0Sn{;WhE+8~|PiEssH1 zW0L3$kBH^{Z0k%y!8^oxmyn+#VQ|@WH=RwacCIWlM%LIz2HoKAI(AS#PV{+zXTMC~ z@p{2i)6-|K5c_VYMgTI6f_7GURoY?PvGRRQ)PepigTl0n^Ew>Gs^9vLyB`GyzsS}_?~Rr`7Z-Imu9kHvgfx9=WT z>tb~VH*8mAPV>k2)1y}G<3z0#9Lp!lMSGy{%YGeV&CE$Q;IAfuBC;Q>dqSn&F+&xi zwcV2lUg)<_&K{1UDe`!vH0(mQf^!j_UE-4o+p9G1n;^*7R@$i#t zsjrev9|JLSF3oRn3*{vpz%TDb5t>8dX9l}b-HFP$qVUp$Izp=|8N!lMKG^B1b`b|806|^WHe;OCaFS12_ znQMM{bFFoU_O}}Y>6poXa&CrHN zzIU_jj&Xm>5Ul6gfd@rTIyw27XALDuBOyeNwDxkL<&#+=7dgS)1!XA+ zX^a+bwH9Y_&6ApX#r_ZEYEp?(^a_kW>35j0#gPd&P`2AqMa08J$-bUQ(6K>lvJy9^QKSv2N~Aec1$s9v&v5o zO20&1dU79~Y@Uqk={^+S-cc&yw@xu$OgBJ)AuF-oZ~JM#?D07g@EJzCQG75f`be1M zmPw`@Tk={ye}-}vQkn(gwUl=<9cI>1Lnz%EeotlE;9kNvMZ&mqR;E3PuUby(Ue`ho z-H&0-d;$l$uMq=R{Dy;C+rck3U*tMtjJ`hhI${bT$qJz;EJBEsF{s*Z2z{E&mDUng z9p7fg9>{*0Gxv<0jH*m1G;N{x>1}-hJkad3*GlP|J}|q4;-1a_mIvRk<>=K)aFZEF zpRo%pV!T4}-KhLHnO8eqCue9E^+b@IwN0yH$}O4^&PI~=1J{pV`1tbJUE20iKk_nP z-a5V1C}d>$NUPCv4(@BR(tG&y;lsmOLU)D08u)pI6o(%(k$$vtFJgmG;DbNmFQ$_% zXy>2)YB(XWvQKJj-Wz)^7`V5kivZS&I+K}nIG!%jd7{u<*R zODiR|&+?|;JC9#Mt|I6<-q^N>82OH5aI)S%UxTMj#5Tt^k?39rb@hr7$V05+GCA08 zydc(@h0BuC(PTyv>pbX+9MLF z?00o6@16urYZ1ou+P|#9@_~EoAP^;ZlzR(BPw*V*B0vYd7>v60acO|1Aa~-?IAUnC zfQ(8A^MwnhC_sMdpyVRanm;HFnco@D_DSg}d5>B8t>Qz|rX)p4whp91yhKmkr z!g%N;%kV=Wex#p{v3egu&ORDY(NQx8_OcE+*h~V}lG9|svRT$t(#Fp(hflwR7%G*z zn0^*9n701Kmo=*sMjaS~Y;gF9haH|Ss3u<=A~dRZZgdprc9Z7(xEYu3GFeAGLq#(u zxIeb+vYN8{kwOmDu!`PKk+S_il)VFEW#NKmom6bwwpFoh+qP}nwry8zCl%YaUD2fO z?e6KG?(cpx=RcgY_j%v7o`wIpsFj%FGs6)!4ZuXK^@vi4DM>m}s>p!wbE#M2a*$CK z5P4;~w=TexIBW^uz;DZhe_@_T!vZoWEaqo5k|F?(o=-*aSlBE8aiVxk^-M_YPxUa< z@IsV3u$ZM}7(9?4EPPcodSiSSjUvsu=78H9!#_}4NDdig_otS?iy40th@mI~tBb@b zOI^B!d$OqLRO6~vAJ2u5kRs`ErlKCMwB=C+#wbD_A+^wP)&r8BY z;ivfPG65fuOTrL$u0PqVucz{Mt?OKOQ-lY-5@ruu9#^ob;g7J`T6=4;!Nl5(51ep6 z)tE07dRkGvQf)9(3`zMe_p@p8|0Zt)`Ayw8MvL=n9t-&^AX5eu7NIJ0+e3cwq}^ojN%6Uyow2ab_7c4!v^{ktFi?p zV+1|stJJF$Ck{}54k)a~WCMk2b*2bh ze0RTtsn=Xwd={WW*XFTs?kqcerWsVy>O0VAu~Yfz7}Z!DQO>Eo&L4mB@}@B-nuhp) zJ75`qA4v2PA1L}Ec{Br)3RXZlBBw(czWOt$_7eM7vhHVwFdi|Xu$&Zg#RLh(mz8BX zJn6+HP7q*5fMQM?nA3$m)d`G!eeSU^Pu z4{9-6_2jMTBu{PAMw)B8!*s-r+|y5M2t-l_LuCM|8bSp4apL#0&ktM=3A3a@Ey!zZ zAAV86*nSC-Iz_EYH$h*yGmF99+0AFcS6c`D;mi-Wp}3KrR4xkrK3#4?JKsBe0kv-| zBTgI~*gN37Jy^q6+r$8y`j>`K0?BN0p~E6A@+)=@&r}6edBU&qT$_@iODYG2$Ch@l zlJcIbKc{>&SvsWYaW;NIa{N#(#kNg*oeg~8jn+*r?oyU3^)&_i`&fj6o?Hc3M!02= zijrSYVhSZM$lMyEJyngk9p>*p zrQ2L3=|HXPltQc!-TPZRMZODKZ6be`cUxEo20Y--xtmtx)pRuzYEzB1T6JohU?9zb z?=+FM8qLbl)#27%1zT}(T54y4qt8<<4%YzOPShKqeWu&gPfF`R@~hk(q?vpn!x#bF z-qSaEB4q8iZFcJc25Ow06P?Ji~#>}yzgoFlB=Qm}2h<@2DP zF)FIb@~C%$@#*33L~KQ7HCI7RwpFD%U{C~N62#>O*T69Y?Eo$O--L;6f(ErUCKj7^ zz4M;<0z|b6-Xw$9985D$CSmHvxO%C(q z^pDEXP5y)-zg`|4QAx5UDshb5fXZT0r|Q~JES+=1rVIgsTht@^R9I80>r&TWCa=(G z0};NOiz@)E;9qAQ1VV$;>bzW+-*FI8#3N$6wFZFJ2zdjfi?yIuEyxIMO`5VBQMj)& zO;!4u)t|Od-URo}h-k@9iLv8>IzTklB0>!!C<7Wz;eMnzbZSZwf1V?7%|bu8IvRnf z>5Q>Qo?Tbn2anU#?!tuA=L))YnMA4QF>=T6IO>gGV)@mEtu44O zB9N=K%6{qPl%(Hmj#9SM6rtn21S+UC&E5vY#l<8+n#*sr2cJHc8?OUE3-`)AO0)_X zod#l#?k|Ob5&RhqiR&0XkXJIe(AIRIWX3}sUWoO~JZ?N*YsZ}QBt35gXq(?87>(Kk zLyS6d3p~QTTcQFfL$8*1$Fd`!O;EB?5Qv-NrnU#O9n+tnTP3`LMJ7IIAF;(_0i=N2 zZ?|MOzRaqlGv$J!$!7 zrFTCdnn+H$yPsdSkT1(d@G$P{o^gEuA$qs_OsG?W56!v;u56wrHuaVR61H`pVNQ1o z1p^j68h>CeELa{PnnNK>l2TT~xb1_OgK)ED#?VuwLP}BO35KWK@2Eq&P&lgy>L*+^ zs5M!jUa&$!S!4l&WX>S)$J=SAcNvc`2ZSJs6tp3SlxsT5uw^rxFXkgN)DUmU6~AlegDS!DKzIquN2*D@_As<^-!#x9k zWR(;=z30RZd0`gxlYIuMctcxZjJp>A;TcQ{AHbpG8vl72dY(5^3DYmB#Z6p@^@k7H zZbR)|W(qA*N*MWQ3*q3{fWp@4G9B1ni`k|dPij#dz=W=agPZ*b@%c@$5$B_5Y72z_ zC6vUtlgZ};Zlfr=;$s@kZEBZ9LA_c2PhmKl5$51(Qt60Xe|lSA&Y@%$*dkkPUJ$ss z24g|UFL-g3LLLJ3MV~RAi*+#S`8As}Qa~F$R9}?P|#h zaXZCM=E2N?)io8s_gmH_}d8!4(f>>KXZ zO{%c9cK}t^0{^JSx~V@cg3Pb|O_OfUOmkF%T>z``qC{y8(Jv!yC6;*0D1q>NYQ0o`5bf7ZJKfK;JTXcwwz$=3HY-qt*o`-c96HIpkEt6zE7%@9EY z+0oMe(sC=ntCgHlIs@Q<eDn(SbEb zOIRr_P4qBSe`_dgTZ0W6s6R+pJp_*)4`r<-uvh~+rGo>5T??z8u%5XbVC6`3nFCvw z1KN@@EZss2;U3COZ#((4$~_Eo%F*wnK-!`F=NS6~T6jl)=$Av=eB0?$tyWy*X}!+^ zweSu+kh=@{ZMM;YkoGmsZ|DhZKpJduc6sth?l>Cv<1Lkk*+6TA{Z;HMH%n}RKyj{& z?}=jtkmdcQ)WYaYqU{($RqQmYk+yg$s`H?|5&3pU^|Fwevq0sCS+KR5Vb#4U<~O|5 zVg#1@T&4J?_6FPZyN`ZAfg5B->W$hB?WB_~E>|^aRUY*|y!BdF$FM~_Xwy7c154y0 zB5a@Qc@Q7QCp|-QMig!NH|H%Ra?68Wic%pv*TNQsH1mA!(qt@m;fNZsXs>!rO35EA zrA->0aOSBQ7^LQ_AJG5&S&A(+{KSY6@e8O{0N&NRfG97^3Gdp_Azq1uh&B+r__$F@; z;dn@6Bc`Jp&{M^ap35GRu5EClT&T(~AoHVG91*E7-LO@Xn%afl*&j1^hM9bfe(#t6|=id7*4b`5y7n{Gluf^Atzar~(XMMB#su=xP#kb1erXmqruX+mM zT+w|*$FJ?*oxvM=aV>|Kke!tcX=`Uw^W$$r&E97E2QqQMXZT&1G>^Nb;2n2= z=U*>c(Pb2N90a#A>mL@~sMdMv2)c3ssM8%&B^8yxHd5xRobCa~qZb2Hk3VE`eypul3bLD_#MTBau+D@6fW7_2!WEndmpU4OR z9qf&Me$X;tXKAeJ8O4E?lGf-~z(-c;thUt%FNa~O-e5Qf-_ z)M28p_J=X13oCTT{56raj9xJu$=SkY8>~*%IZ&w1RvXG0OQlcu^Jb|Is`f_y(w zw|*WIi3UcFR=Q|sCkV`TnhCN5)t-PJM=?e*{OVKH?uoryl2O>E6L-^cKw#Zy=AT2d zF(noJ#Y;6Si1sQMwF|%$Ftx2ZUr7MVgN!7|-ipl34!|l;XE2tB#gulEhi2;h}s!&bJEb}^NM!ixy6NoAIj z&=B`3IjPDP^@z$JRB)zTS+^y(nE_0;$;#|==2;Rgqbr#meQ96}MN{VnS8`M1t3Ys8 zF3O%g5-H{K>n)=Ui{qPyA>~D^#Y&+Z(*;F>L*#L^$%TF+V~EwAX}@u@G>yZl8`?<% zsjERnSQtl%sAKCoqd!C7m&DXlL4yw0vO~p?H&d0j86BI-IYhU==vn71?_-E+lGj>= z2~U5AS&E$%kd6}p^Wdis`FpxJqHHEw)*<;En~f8X3tr`DlpPQr(krR55L($n|AyZB z%&D}ub3r3rSi)Z`g+`8ZFJV|JT1&|2ww?E>&DG)6^pNOGMpXJOz}30tuvy~o>-)9& z^$#FYlJ2JX={w8TaqzEB(5e303A&8!zpRb@2VC{75^4QICHlKa7q<4lsYt3sOmTLW zZz>Y^dy#G#RIv5$B3;b3cjtelA}6**{@`aKvK^KaVzHx)Vk*CqUSDw3c?wEtgIkyoHN-@&5R?_g2e|JL?Z z{sxP_wf#T>S@jIsyY|@snTmuIsSQl8`9HQ@|Cv4U{?AmT+TZNSUn(;8f2JZ)|9_~+ zu>YJJlL@v(n?*mO4rC98(Z?ah$lRjq2VQy}^GHrehQ6irk@@)d+?elw&5c$3M{Z2~ zJ6W_Q|0>V@oh&LB9;$vWTBG(*)%EWJ?-NJS{fD&=!^EXmjfq%X`CUC}h%@@Go`gF- zY7@nHlfjxPQW8!djkA$h#eBK^b%{7WAut!fs6GD~Mc||@bUO+)9*B(X6p(9&tgygJ z@|b>o9EFh|q3Pq*BpxTZ=_f&IVLm#s3D-fZE<*x<|;pB*(@%b(9>q-is$}Mc5hbf;J7HNl#y0+a9%QAbJbxvWw z^|bKDlDF;D?k#~xu{cC3k$j_(!-4fajB#_dkP6RJihw%OovX3%i)%<);mm9nD~W7} z^e3&~r7^NkXY{q_3H=o6eNVl=!Uzs&nZczB2w@ zd@a;OJ%0V$MQ|%;`tb}n>hkYhgubi4Yjgjz zxkBV^u)2B16DX^n5M=)ZP{|&23*@DD`>g`27XlaXE{i9Xe5=3^b%!2(gp3Vt?Z0yC zU!E+BKr|buCs!zObLG^N{;GiACUAR(=>rcTDZOmLsPI2b;O|LEMu`$vr+=EjrWlhH ze_e#Jl?R`1lc-yEsWPd`C`|R%w&*X_Om=b>_|hc!T{Yp&{0G&n`qxGHcdA+Y?>2KZ z-qe3=GiOW{xIQASuo3)p9)kO~ZDu&N%8-n?ssGq!&TxFp{=3Z#w3Za|?=FHV+keUh zvUShcOWvOUM=tQcR*U}T0u2t6r^I`R)l~aLWs1?jl4NFd+_!{z;$NuM1yWB|9s`-r z@+3CyT3WXEW}C2@xo+izES7YOw8&8HsVGVwp3 z)56o=R*~R_srINj8p9(XQ4i(@$-5L*rIY1DucbWC{^N8QCU7_QmDYEqs8uWx6cNvS z2>rYjN_t{Ffb?L~7u1{cmWPbGH9^U;oVCgCZ>DG=Dv#~k@y(r=ZD99ZWcpzIc8kn= zzx#n_FS$Y7^GG{L!gCRS7+n9YR3zg>7pMPx0WaIuZm2PL*5>KHdHiMk@ZAOl1OH@q zzj6BhPGkQ+f{u3jhL-xK#hi_eKG^|&>`2Jkc~)UM4Nge78>eg4Ca9r$OJJq znJpsL3M5xETRF^|@O#J;pC7NT*jt0OnGZ~>{f-_hf_I-y+tzv>c))nEnfPJzZq(F6 zUV!EN#^K^rRsni%jM~zq`cu}882~}eg9hMQql3{}!F?~VLpvHUOxjtZ>IM(tkmi6W za_cM&$r1LwfwcaX5De<9NsrV}KP4(X6D5D<^^aR}lbp4O+||=axY%Lg!O1(30eArz z<+s-KEP#sDGp8|?Lw1K-_Vy5QU2UW9y93cU`)n084`5GI%$8$&)2|UyoHR{vp6A?i zj*rQs%xI_L9Hhw$dVwzKy;YIq@K>VLvog{BZZ;^ydYMZ{!EJ3(2w+Vvt585L5k^L1 zN@b)tHla<~)0fhlZeIVzN1_IsJE8HNI}xf`m$y$CrfYn+bqiLiRyUo{J$u+UdW2u2$7P zZgvNDZz~hw@M4~1zupGe0&U@9dA-y&UnYF5tF{*JQ@UG{xu75`KQ3E*NNhn-$h7G0x@h;^p%7zPsY`=<)Sv_x1YpcDkcn$+8#r%vQ`=e^*x1;|@8p1qgWKip_|q>obcAlZlk+Fn=Mv!K(ap(?*Vp^a z!7sW#T-e_Q_seg`H@W;yE_Y|xTW|oWCyS?ge$u$mIxsppxe#Kaf%B=g`D>qSwxAy; zi@WX*keFMsTUWU`c->ylCSS}RZ&weOV;Ek+a3f?Rmh{E4fG989?RoMEX+S8^_W?es zjYerP^8`p>ZG};^_p;*g#jD0me)VAy4|k9+@aU2JhiHipj5THCcBgVlBs$1M^)+Cj zX|ME>mCQLpU}L353DbI3X+#A`068W%hsHep3?4d}>E0O`pq;6`azS&B8KtvB1zo>C zjS#aP*klqJDR@YT9$#Z{6Vh7faj@~kkEn|OMGu9 zJ|fsC#0bowCMM#?qx72?0m__bTxwZrSDgXc~i5Ul8`GM6YU<0P7 znR%Pky)$8+F+~Lmp3D070GJWSO@-p~L9Pu3al+c-ldkkq*g7||Wo6C1y%A9g3@`GA zeuN44R0ye(GtS1fOi@>B7IW*_9Zrt92(j^G2#k;_1wp8;p`ldjx~zJ769LAjS33gx z$%Jv*b_ELt{}Bg{E$!D7EDmH=A63e8gxEytCwI1b9~z7P8fY}?y-i7lud}!y-&mEi z%Gt=RcM`BX#0A7!RdavBp#!f-E@t4DBWgje1UHm9Z~?w1GqE+!AsLBHi89L^&XfUv zYnPTpaz`ak{s&q1XvW%~K8}>g>|W}YGgU9ZT{M{tOU^APzTFUi(lJuAT`YuwcEk^O zADGHWA>4mXiAsM<@R>}UnnMZ%y9gjtmEJiqH~$0Tj;he5?&~8oQ57#nCT3cfNB|tK z&b?_{l9Dt@Y{|6VteO@~A>*opbYKMGufu2=BbzuSrGxB6M7WMKlN}z%p-; z8&W<`WNmui3E&izUMU84NbK^usQDkj>Mboe(R|Kj=mu~}m}xJ>nrP{8AZFOkdar-wra7z#dlNC?(J@pCKWfGko?`wKiyUzz7vBK4=JvWn zCkM*Pxo`OMqVJSVj3%>xv<`e{#9&NodA(!E(aqXBa~2cX2M8Y80qh2y3?#=!x z3!?emeil5HW>#Suk(eAS#PGH}<#DYj;v|RTlyqWq6z@t1DOmQ!C&!wVo5FweZXE0$ zrgoBABNT>bC{1ND<(q^FwW2aXjR~vbl+J$D4qZRRJ~~hyOR4KC7qW+g_{(cA$hBx~ z@)b~b^LnnemJ`|S+x#{`no)TJ%?~dJ$3pKi^%cAVQh7}(HG}>I3XzLGUrYy$4GnV` zcLaFQM~o}3!}|IiG}&CE8OJ3DgHl-%ORo{@M&wFbM~Nt87No_4y?0j;2D>!~z*;_` z{sjJ@E_7UjKoP(&(uA&UAUXYn)KM0sEfQY%!=hK>dDTgm(6x%q`Xz{NV`h(z;4Z#- zo~;a$_dF1bA5J@we8Ow6?;WDyn9~&z+WQ=7M*X?z%(H_lo^o2v6{%JiV`q!hAuVz1MYnfH0pgID>yx43kS zxi%s7)hXhAt3y{N!6*g!{BZHZU7WM9CAywDPo2@^i*_ONY zX;{RG!xZ+NqNmq7aVc$Z=YDVKZ6-9cow6k`Or&e=^HJ~1YbLg3QidhT=liLToNBK& zm9Ma@AsRYzU6&l1X_K4gV~VnXzjRH2+zO9`qM~33AL$NCg#PGLu`$;$NS;pon|`9- zrSHJh2=DPw_4XRRbw>Ugz?u$-F_ut}l!_EACtlbBCnfn2V@FNe&+r;f4~8;F^tlkM z47SfBDsqFwA$=b73$27eiu=z!-Ys^C17OkQl08KL?7=GUIQxy&Z`NSnq@s7*8s4Ma z+@vX2MYY&LY?F8;LrN82$!Z5Z)40}Azo6*~1-~(yL5oPa8&R{E$_3gy1t98k8!@vc z)if0Li^vkI68Ov?n#;R_{!LtkD5x!hb5{eJ_kzLm^ddAU_e`|%)|y#p_MBf$Y`+WsZ*muSMBKPN@TrpfNljNW0yi~&+dcR{BhI0e=z zS8)Ab27Xw1kj^LlP$eE1vP)PwLo~bg){kogHPU+v>(aZ#^8kQfMwzl&l^pE-te9O< zF46?6qdOaTx_Ys)qm>qj`XTqTYf_C2KFPo;Oyw6b4dR9jF?leRE3zQEyI0d+?z zK4R?C*W+&Po9z}1mzXu6p4_b2X;uPEh);@*qVOLG)3U`SVlc*RY&f2*@7F7AJibWH z%*@O!k(DUdN)a^?ej-^`z#^Nab=*}%+j-3K@6wFT<~pjCfXyOun1z}7Tf7;B=2J_c zW|k()gAe_St=Vb08Ti^`OXA_`8nM4Mtz~MfSzOY%_S!59%j=9yL#KV_ajh)a#u)}H z73R>kwuUjw#}l`2uwtbej6vTZTcplK4-&@T9r0&>KXc{@3Z!sHt9t)|7~*P^|srrOpRTmwYTem?u5P5}rp zv=j4o7`QX~z}>YoU690)?ubene(v75ovPG9g|0eS$2XmC4L;*@t?4U*r4S*}re>cK z@4AZS^tBp(eNqxA0#XhN@WeZaN@S;{(=RW?15Wk31+iK;Fs5{&$kmV~0#Ks4!!rIv z%8MoL)Lx00M)Hp_1p~}rLPk#rwoi&OWabT)ZXUtp@yz`PET=)LtqzP&l~6oEu9#!!=JGm_59Xpz8xEe_rR;+2{L_=|mTAt|Ylk5s^n{DUOEl*o9R`U*Lrpx)Z) z_e>jbQR%glY2%V9f#O)rnegaEZm}}SvcU46X%k+^_gZBdXqAuV>devuAo;annCa6H zY)76wJNH2IqL{dX^UBUDJV5Z!NTZ_4`^;YPh2`QOyT=S#(o>2I@6s$Z4w0l{!|P=b@`$<(_ie-EOBki_%hM@P72r#1gId8 z3hVB@j_l9zE~kCLEvId}kkYkzc`t>3a_Wqyq!3|U{0jY?DYgqGWh*R_K&^vnr=6>i z7(G?wpxDKp?U>!T3!^%pGuQRtX;_ihMEbBG+bkUC#5&D!$v;*N(Z%w#V~{IDltsX* z67(c|9J5n!vMe%@2xyTyzQ8zFh%%p+RPh_1l z^hx8ZMN!It14jI4GYB?0@1EJ%jBg~~lVUE%&_Ah`=TkCYdCMotYCPVrSkjUhk(cG$ z*o4R-osuKEo>xp-(Z?&{J zSFu2^PX$|(g(XWoV9dEdOT9NwP#!NVb^W4eTI=qa3*jknjP;gSiITHyYGL!Kqbf7+ zk4b>IxX-R=G5!qxnEf=40|5;*nvr-|?tyegdv0}yRT@d#5toPR(0SpcXmGo$4tVI- z<;O#1Z?1a!k*u#~w20gK&S$@=I=j?Ts__v`$|_-A;0&`OqN;b1x}_L)Ddww2H*_N} zoUd(5gp0kr#C7O%8Gt8+lcFzt#}Z;9RGSd_BN;94xYR2^rg1s1>hQ#bS*Z5bk_mkv z5F6BgwNaX9P)BOivx9On8fGwB#@CDpA2;DzWuy2(&Pu3&gl zq+p*ht?DzU-=&Ca;P?gbu|oQSDgMIXAJ zswg#mkGPo}SyDHJun~tcNC2E0Q)!%)w&wL5Bg~Su*Derl|+UR;lhx?3rc_nnb-+4K9JT_pp0uf z+rg^^rJ(#0kfelTDh)|$Njb4vXaoj`%@FRoQA)nT;yVvS2V(L7&C>>=(=~=Ww%WOp zxjL(!3Jt&h>2Qh_w_GAuMKOAJOEs6xn6pr zX#?y}=h)uoI*eD(xMaz7@+5TR<5!CjwBhlNV%s|#$7)l${jnf#UrDw$;QA!yl5i~~ zWF_7Mj$5@5L5pc@KQ|C5u`7?UY4pofmBe6#82t{!AM+DxLLe?lsAKR{<}V4XgwkP` z95mFrYdcPA2uqHWsPwdV6q4)}5oC|xa-jwp$4@JQR*IRE=usTGs$x%%>Aay#K%~Zy z9CD0zAvwtIAm06ErcE+!dN5CNu!4(po#F9xRYPf9eWw=z1(Po2j>E3zcEjk2rm}3= zbgNz-egkHe{UQ8N%g|B%M1eo~N*a;oc_iZa232~h661>VWXF{QFjoM}^0|YvMX&L( z?pE1Hvs6t39pRmO;->ywXaz;DnOJ@Woc6C+u{h~R`xc6JZeEPJMd>nk&t_C7l!;JR zP4>m@-{`R^A(b?|4)G1ZA%*OqrwY3h=R4w|6Zz?z3y_his-Z;iPb@m?cohlzMkqi& zA)gxYpSip;WJ7RLLpSg%LlR0NBIMzxP>$F82YO4h%EWoJ&AgADww4v8;x=Pr&4==X zrV<_CNw;&)98S6+qjbm}<4&!>;k1?YRbPted}E(tIasl*Z1Rmkx>TS6SUICmsd`knaKwvZ z3`e=KLcLHv_IhUK$0IQA7a%gfe944=AD7dFwcN%xVTa{OR1Xf%7P2fv=Al_Gu*d<< zX{jT24?BgcvP+i_779~7A~>Vws37tMQ%G24BPWlzsZCLAuktfS;o8XSIm3{b(+b~F zOdT8ZSrhM5#NOCEggvJwINt`V#xDhdB{#(PJCs?581)nwT8$^>8Y-Z)u;y~_N=K_; z(k4i<5~~$d(TyE|^N2Hwm-9fTUGkjPZTF=(M(S`~RN?^mm^f0#1c6k`2sK}}66X*U zU>0Rr249OTV|Fbt{`gsl0s5A;*lu|%SKN?n+}4vyqB%hSoGce`o}#~f=1mkn>#XC8 z5~Oz`rZgiS zw9i2&3^_ufixt^$=J0-k`a`%ReimL{wx!+Taze^kT)j?bCD?tyG^L2&H4-9G_XB>0 z#!PcLaKzW&0v-9VIv7tN`AnN$S`UV%{G~}Ru|fzY3I*3>xs?ZmYN?*J2l&BgO~vRJ z_T%F3f|B{AchMga2*~C7p>)<&&|+S|=PIkbe{P=2@_&aYmex3)-Z&1~^w$r?vioYA z16v4BOV-U{48x`Lum(0G0+?BCcd|F>ooC0nqFWAwa70=?-bRuQyapk?gv0Y*@)6xL zrh9@Y&pVIp^XefbB!!fQg}Kt}d**ShJ0SE>SC0?R=5Fx48Blt3fn=ugMQb9&5S77~ zKbwj67amCSXsZkf@2dEUF>w`-SGo~4X7v5ZgJ~@YyvOjoi;8L%mRIpd4kc88TM>Ug zfpN!E|Km5F+C27Z$L>;`vn9#T%3q!;=WLo5o4^fdV;bmFUjW6zTucJWNhb>n>NzOE ziS^)`%VMUFn{X_}`~$8P+Hm^U5|)hy?m=YBdWHy+`Y+?ftlph5lfXo>FOWcCgCPS& z+6wzRbd|MOEc9ha+&L|KsFE952m~Xin2peOk!d@vDp|Dka>_)&wv$w$v-GR0?ZWDl zHtR|X{=(itp$nT6$_PQZdSXSM+G|W?!Ok0{L~Qt)WzTo$=qgA}Rb66w(YI1MUAA7g zmQ`58uglZjOi*;qbsRtJOEzcY^IH|pu1PPjZ50HP)0Rsr`1_C(mbJGdcw z89thUy$^fV;}j{5{rx$kI8n#~xL=O$;Kvl3riO%&lxzA{-lXZ~ySORdf~$s4I1MpX znk0FUn~7JU0zO^vbS^H7;E}31z1)XPLfTua%|rDM1k2!V()5&&$P#q!Aq#!;%m;BF z8dgNN2B4itfvNM1v9M#3DRbg;YxE$fzkWvnBjP?=`U+KG_))@I-#o#t`5sZ~w?0KJ zjW9vdTl20W1yAb~x59LAjg0GK)PBZ^YRt)y#xxZP6#G?-LQ^qS{sx^Q^ER>2$m*qx zZymL!Nr1!BNSU0Grg>VQt5R)OOm=#!XTqoIjq(f6F3C(J*yJ#T;&k37ty@lylVP^? zM6TVBh_3TZ^;!8uqR9te3~W0Tj0C#+$!(zRjpV5+i{N#^CA6T_YkyTBwilaY+bLj9 zB%DV;rU@fP$2G&TFGa#;KG#GKyylcRxuIQX1Z!@!IGW}7W+LsVh~&*HT9|TLR(`9| zQn+3?vvBml^w?Y-*=p5bon8IvU#E0#;$ePsUPjYzF%^d~A)&uo>(r9GVqaHAH?j?B zzgdUbAumpuF}k9d2`DQdUXMh&0tH=*%7`dILzpVQ`NQdo(A2d2=4cN5UFmp9)F~GNYV23s|d!1)wm}s=G@+4W;~W?=D>X`qpn7u*8LH2l*VC$f(%u z{;et@dAmFT?ex%JUfTc0Ux)N!bZq5lp&|Mu-v)dY=PH_q@5cY+s>|}&7i#CMQix#K z#h&rqGa@@`mEfn*m}`X}axO>lDS6&7Hg?E`9a!c~b^&443N7X29ZT7`XEmsX`o3kS zkdK7Ss~=JPMxFqO(v!r9#5FR)NSO@;M&89sI6LfqCT`lW4)+EoW?0tdQIL0dyfl9Doyq|m zzC#PCROoSV6RBpMig>2zz90(XGs4`2;<;y4`{NZ*PI&m_z%h z4Rsknw+t;I@@86S=BcsvRPYL0Zch|0%75P1>rHkXi!T|4k)d$%K)|#e4d}(wqq!LI zNiXPOZQ;JNX1Oj)wbq{z|2Ve7y>S07!WJa8B|q8OxWp6NX+7@ShuJmG7sN=~{Q zJu_kRp%Ry5PyPJ$4hxe3YB$p{$*hdroSD#Iaqy^W%G-yr&=_^5;^IpbvFxR32;CLj zY?2{Q#{L&HQh@GH{oX+wXIZ>R90+N9y8ceGpN2ppJko_U{K)7Y$gL)_m5YaKGqoZ`$} zqmI86fk7XXakUITd>p`)^bfZNprqqIV7`CKR5G&2p;z3yc@9rQngI zIW`UND1fN;s+u<)fZ2$bKg~Im(TvGz9i*+9ATAw6COVQcDlcG6yv>iBon$;bS9*uJ_>3lU} zQC^1UYisC<7aC6@@=aRvLm(#|<&?|zJ`Cyl&vx(&q}N9NSU;cOSqU&iLNCwel$}V?zldd2N;LjMh+~x8ZJc5;;8>)rp_MgT zvb@sIUKq%tDAy?jMdvn}_!4@mHTkjH$$zj$F+Fpkj@4ic)R5Tw$}G|;u_%FC;lL`1 zcHOmjy8Tpp*{Knxz4}4rbkS1Y%kY8EJ(I4ZZqZ}gsMBf+;r#T%)~KoI;7{(ZUYMYE zm;GC{IKz6Qg2zfC-}R{707xm5=hH*A+eTOshX;{ef3#2W!!TX`Jh$8JF+QZU zj&2wKC@9FH=kIspkr(fK_pGl;kA~5uI5KB(=^l(pIZq-(v$ss4+ER-@CnKR}zL&^r zr@VGHA*qz2RH}ik{KLAW(c&CXYE`ty=S(SNj=+LAVL^tg5~Afx?A)wHqiIRQNqH=5 zcUrN@P|dEl05J{JDA(GSr@0>fdkbfN7FGu0!-tMz9Sj!SCftsyq^6ohlmrD(qaO)s z92psRh<4SK;RX`}u&DHVq!RW_Se6cX-k2gi73V8zZEJd|-GXb~I z`)aJloT?xeUq%dKJk*;lj!$B=&6q+dwJM)e0xd*qe-i7LyZ#Z%Xgwi=^|oCqQYavZjVF)^WqR7s>ubhf*GOkP)4nnG&l z2=a54?1-z61^sXftceaOC?$^UL*ZakWg|4)Lj{>+1KYKcg9_ycDhWWUOz5&IvbBnI zWIKMtuQ|eeB{SuCSYFzKhK$&ewB-Pm((mDH%O0Q=JVP0(&WrWUp5F!tH16@!V?5t2 zP0Wo5*@Ri+J(F>IRMB+0P8+%2T9Ztu0eC5_CrDLgCqce9GxtMcx(?J+bbGX#ULz~R z5pz%^s@(Ie&!8lH(8uK;C4e{T`RTu17Af5$NREv*x>2R|&<=+bUyy=5BR1J;uyl%KAE* ze_tGQmt|h!pnj2yZq}AB1{%U~;BlMDm$5vyrI&&UM3ifn_Xlh-z9*3qW@PB=nR`Is zu-?l{zUg8X7>RdBYs%Isi3QJVw|FtxL#CKjkUL3^9w@)b4bdjx`He!Z@ucS9z;+N! zj^~abejpj$Zx9kp9F+pKu=bsoD)b4P}ymfb?-$k&$%k%dktYAc; zVyJLh+*o!7C_zfH-~;pV*;Gh`~x@s#*7Qm=!I*V5=Z5gE(Jo-uQkQ4A$(P+97Q2cld}Xvi{Cl0^diVspLO z`y7~_OQTPiXG1x&TxEw7bQ2li%}B1mt)9ajo-(bBV|6((bEY+fF``N#IPTjq4AD5LJm-0KwaS#AHyAoRpw z(JE2wEo^u%bhi^{WUD8pjd)TkCWGXzG>W^z&t6xtVRi~f;@TaVda_v|YO39IzUZh$ zTO$-66IwTNWjo~QY-qv?{*|3c!)Ixo*~_^&73>haR^#rz`(8k~r;j3T*b)DS{h?~S z117ps*pe#K%!a*q1$)a>_R7r7I>J>ylSHM_W_$;cNZ6ERbGX7e&5pXdKEfo?y?nvy zy0`g9GNz$kD=|w9pPJuwoBx?V(5gRw3c46Y#`PAdim$gTtyYQl7j3{~77_#}S!!fm z`ozSXewD?pAVi1S$O@wt5MKBSW4jaut>V`2M8^(ujea0itrB{7LNZ(j^2P|$-qD`a z-Whup63S9*j94UCg}`k?Z!{WCxMOt%4zda87*G=UXcGlV>@uOHiLRM!rB+@{2JZw+ zZZPo4OBqGnAl2sW1K?tjXIe4{E|dom(Q;5q1|2%5QDdiusW<{$caEjoBm=|6P5_PV zQv5s1-Jzyg#gqpXf0Z#FMjIpaNNTAQ0fH!+tv4X~uv_g93Kk3y{>_URQOs9;@%;S>y0|FZ?JKj_BE-wPcL`syaUUT=N+r>S8vvK z8s2}t)YikNTQbdl($LrBJc@9khs)L)^8o0jYg{4Ts|%OvaFHvH$q#*ukG~KSdM>vV zm?K7JKFCqC{6IlBFvyBEFQIF)elqDBxm#bh+Q>mZjjiJsm_YV02_)77a{eP}fctu$ zg+|$73pO>8XXONYcYChjC{Ah{>W}suuYc7VP}q^vvC=(jPL31nY@lbI+FhIy#N`(U zlRhgR*vFCA7qlmRFmLc|HOtgCQIZi>dsQ-!y{AMih3j>6rEs=yb)Y|sFf>ybWzLIw zm@5A2mZXRqQbRfBn#Zp~m)b#D56m3=zu0@n?o6X@O*>91w(V4GR&3k0ZQHhO+jq>0?Nn^rdGqW&-Y?xf_V*s6 zf5dsMHRrm{<9J~@W%K%O#{RHijhCA^D+ZCn36v4qx)YZ!EBjUpE<;SS*{fH%u^_r2 zNQ;-gFdXU#n5>488N48-^pQ%**VtqIbPMw z9DCG7+gU%c7P6ncwR^Xz`4KKJOMU0&6&8k&mo~`p_{!;o{W2={hyf1%z<5H+=85%6 z*TeL#q}Ytfr`q|5%%8-V@YJf9*fuL5ks5hfVb>Eilj0f!&}}-6V7b1H?A9RF+8sAS`weDjHZo4oKfaSxEto`cg;XG&bRe9fd8r_IUjEe zdlk^X|1xVVtxwjxanVvvp+d|eE(JXh z=BhBO6jZ+~VDj$N|K`;1nENdRlPdq%>n~|n3*wfGyB_X6M{jp$8{AY(zL!)}3q65t z{lFd*Ygtpn0L15*84oHObY$mXF&k+#d^6d?HrY8`2xy`wxwZ2k`p?KJWe@Ie+C$^=gPi`KioBw7Hy%~?i_nb2WEL{D#Ir}uXzmGjVD9IyzxJRkVd-#rIPUbO7I@G<16wmxZo;Af4#! zzD2EvRssr9O&W??Y*YJ@3&`Ic(5&GumFt z#Fzaj23d9s==05dD!n$bagJQMN)tvxc|7@>zdHS|xe&S^M@m`Ju)Ry0r6b&Ow#@^5^&aNs-zkmz~3{^F2a>bCk;V0pH!_i93G9YGB^|E+bqn0dAK>* zCHpf0pFwZ)vK(Dvr41D+-yh{JnI9jH_v^=*H#Z6RMHLcD`d|H-cY}|3FLQT_7(M}e zsx76qX0>=1ib8)}7TD-kHlc#eI(`tz-6!7`e8=1{wi{}#*wO|lP$;c%ydxlltn|6+hneDUOAnoyi> zPcsmZc^y$+ThCH=%c%JB5QL|3PA(%E?Iv>cWCHQgtQvRTq1%zMFcntu zae)?KaI@Kr^jY7E|1QK!?m-%G!XF~XA(`m$16{MOH($SQ#S!)&yKX@ecrRWgTCiVj zjnpk$#)&4abRjNa6r~L_V>NVZ!VI~P%Z{YhR$Oa&*ixgmK~{(u+<7o!RMtwjW1m=D zOQZMbeCawe-Y_7?9z4j1XjHLcE38pCn*S9l&F?K zr*lE9r5vy8ELpH8su5FNyJ7FrK+ZkZYHyE5mO7>lz^A-~pr!RA;oK;?0~s+>qIp$y^~o<>Pq*ar0!~v7sW`FZLj0S*l{~ZxTojY zUA2fzE%!o5M;Sg1#~eTJB$a2akfza40*+O`ASi5ffsR@MDU`SLG>NL3n!-l-GBk_X zsup)gXQHlmJ%{~df7E*VxwGSLALVxHxK0-EyN7lbTDW^f#6-5AHlzUjW{rQ#WD~6ExZ> z?AIdy^^!I%`o&8-pku9m!0`n;O^4+7u1`oDgX<+D=hCfyZ+$Y%`JZ?A2t=)!+&@;&Tqmpl$mCn%pU9JmA(AYF1Z2ZO zN*M=5Hw6pSIV z6NMv;rkiREER#`+UxR?&AFYM|sfsMlmNN&G?(Ovmjj)bvxGasUvJ81ss56m6cG*Q8 zFwxI*1OW$-AswtnO4Ce~1dGK9kWioZS=M{`J83pp;g*=iF%Hd&qWff2cIWR~>Vi;2 zxrlwuM0SJN%ZDm!;=XqnW2p5ctq)VMSZN6y-r>LN;?$xaB-nJb`6X?LZjo*ei_Dn^ zv`Wn0e`l1f>TDxy+M!`XbY4U{G7Gm~!8z~?Ap3#A^Die|=&P^%(NKCN6vb2zk|I89 zbx<})-7nDRg^4^6w`K?;O6k1~>>Px3hf5vK?QVd_+WW^q?NvbL4*JBJ{Y&TP;-iW+ z#_sTsLE@1~V5&rNvI@+BDXFo4;=;E1Q}Ck$1@Av496xs#4tFQ}RyuF5*Zm+!-5C)i zLVe};fXMHYI8c7n6)C?Mh%j%?k{-C0L(akKUWG132mNOBCw_L*yfQ$Ex8rU9Csv1r zh+hmW0{tE*@9_kqmqu!}PM~gX1K**GZob|rxV6@qZ_IDm;UN5{7#ww9SnH|nQ%QSW zdJM!uME#^>&UVwSgA4jF~x+k8|XD<2*T^8Uh(Lb!fUh zB=RaCsDYW4yq+0UvF&;$ky&?^0Upy6bIGWLN@&SqvsGALMVn0}A@@PkR5Un#TgNQK z$TB}LxRHLxt^mUtTe5j)i51kFzG<_!`~mwRd-@DhqcV@PWJ~!wpFMz|uM8E%w# z4FBVkY;QG{ssfS=)v?e4@=EbEuLcwUUi}q@c{A#&SV3r#RMR6HkE9Q5im+WB{w(?z zJ#Z9zRR?HU=kAgMWqnXD5EpDQT?R`wLwJE?*`v}SmIn1dwN$IT6zo%z)#`(KtS;P1 zCIfG+52jV1ePP`Io-gBvuhQ5;a#gpJ>Qm2BR&V%6a}BxG`2DQ4!IG_)_)(u2?C$G# z>5Y8!pPELzjU&3EJhxQ6)aLS@bXKVbSB_jrTYMuw^S#lI%H6M2DwZGKpXye=jN8=| zJ-O$!5A_ZnV|(9Z*IF`D_`CB0n+NZfcH{z__;KC8oMoAEo108;F7TZeu^a&NlKTy> z{CsSMl3AOpY$mCBbk+!;9~GNsYriPIXHZ`(=JFI)xyTUo!H-S+^;a8g1NT6n)HLMo z?+rh#?KC~*ntvZ&ptaqcN|CqioJy7o_lGZc5H@U$M>QRd9^rW%E9wv}P(|~pS+;gq zPks-9HK=OI39*3s{bBGU$~b(!4=?BV$&+NpnX$D%XehLL;Uft^$8&0iuv}`MFaqGu z6-NZfrHlG+p0Yb$AUx9oH{!5G6ounU1u>Pe@_nt-l9yAn2FO!JDMlZWLCQjQf{I!-`LtK>AT+L#}sf`#UE zBgbd5G`d299Jwq<9L^othk;@wWY!F^qeaJbb&$h5uEqff?YI^k;oUIv{CGtEQw-aw zJ1$azmMogOvp0p%gL^jAF}t8ZFjh;%^>2!FTgDUrNSl3Rd=%U$Q?8v6WX<2tD#2^s zrsD>`$s_qu{NnKQqt@1!6?F}zV4<6dv?X3_c!rzkWs;rd*l{a(4|yV%{!lmCHxG?b z_2G%$Fvs8;$s8W!v19RnB%Njop*u0$@92LaE7j%Rt zn(i!?M5e5>05Z!73g_Py@I`krO6q@vvD~ep3IBso`mVi-R?lm5QL_Wd8MPO zSeHE3p5Xa6Y{T@3StVQPp?6-2^?=US-CHSVyt#(mW;$J!$=6G38(ACX zKzI&wV7JTN9t~Fd6D2?(XGvvd* zaPhWWe-slj{qw4}@-B>8fJpD^r%TH&ri6TiU;l1r>hK5VZHKdNnyKOpxfQxl1i1QW z#6W9ZC`irM47Pa&TQV2lQ3=qp*MSdicBL3=P3ptM_tH)<|7e!Yu2T-;Co5U-WE^d8 z9P2w|X&0d|ymll?$9cA6Q#dj;sYN)J9#scm;zQ3b!`#q7=!6)ut9Gy9XF2|1O2O|! zZvqlH`x%?ilx>lle4%Qv@2NJUGL%|*=ZQTD_)|aW94J%TP+7HZxiWhhtvUEAou_dVlg&Wk5z1VfWUWkC0-vv#1u4BFZizCc!G9c|oLG-V zj<&L_uy{r)m`ycLF1S{D!+~TX*6FqOmxd(8cKwm~P+EB_*8QpoxUsCnjXoQB!Rz~c zM zv8SJ$Eut5jz}1E(7Quf8C83~(7^0MQ1lS=93WgNe2{UKmz(smL$*c|8QY^ss$qJ7& zclE}cvKAuWJkn6H@Vj4*YrD^tBmHdmx8y_6x8YP^ZfncDVXh&poDa90sBY62iKoc4 zo{*8kOhS8wP#zOz10xt3Q_{)nd^HrvEYF&u7n4Ts(5TEI3&ihTTryP3KC+GsqkF)! ztrui$PY+g{`QDW*AtW836wAS9)ToV04?)nSi_dA4L@O<+pSw^7?g!)Q3n&?78MEZb z={N1f59|d0RhUY>%s`Ba_508E8C?){A|$7?nP;OWH{&-^hX=zGzg;(u9W%2d#CtVp z5~|chFj?2M6MQ?6hGgsavQ1-fkr?0Ef4}x{bO|*AcoTwRNn1Z!VFk=J`rG1|pw{Eh z0bceEIjHUynrri8sg1ox^Q~0+Is_I z2V9*`l~+e_#$&c9=mp4B5-ITF&Qdg7IE zQ6MJ41}W4Nmy8y1S+h%tortmtld>a4>SQK?8vG?$iVdvV*l7H1xfS~7GF)5>V&q6Q z&mWphK###}Ws7a@L|MaQKXT(7r1+A`_XbjTX}5tR0A$Wdl?*9&E$%Y60V4}F1CibpVsD|6eu0yksIWebU9gE@{}_n&;Z@(D@vPb5wPmrB{w9lPK7I}6HW6;M|II^4R!J3qjs{BGIK_8lF z+kzYW=-k^A#OcAN#Rpmqt`^P$V5k{>#P6O`u#0<=)9a}Pyz|<-B|`D1BK(&*-XM0y|$Hw*<~;Hdb#n~>*m01=Q=6TQsU)( zG=Z1M@JR;rGg#X4Rjt4#e`x7UZo8{8v_X)Eq~v!BA=)y($X-;}a#xsDw2o0aN`{5@ zLyy`Om*#vG#$-R@w4IIjEkY<2Gw-0i5@Q_?06_1b&wQ*jIo&KjAN`IzL{d)bFcf%d zi=+FUnjJDr$S#7q!0b{aWW2{u%-0~L;l_E1-ZBlCWpoHPs(r|>z+4(Af+ZYy{aymT z`m+WrhM0(R?B?wayK^{3qA;1`4_!0OtLTY8&X$3XFIU?an*=9qt_!;0S?bKZNLxm; zijiW}W(M#>@$QMSip+T**>yI(uZzWE3{Ya*O2EZJtm+|XpmSQ%Bj%oPB zrCLqZ_K7TWj<*_9cb$sXwu?{LO{ugjL+TZoK98t{F|+8Xhs>r`m(M(F|2d~u8Hf#< zw%YV~)EE3wvqs5_ddFN>|7^%=gw2!HrUiCq#@ZUrxn5*vW%3N^(1-^rA<2>Zw}8gi z)go)yG9Hj9DRjp7qbSIV=o>pYEp zd1MCBE$|oKJ}b-mrZ8=s!35=|AZL37)2wKLC!Gkw*9%yhX`Rey?Hn1Lg;yc>#8H*w zAW6pwm?)wor(WvEX}}x58tDt*np=B~R#}9+Dg`*ApT-SE)XgmZoX5E-AzY3L{v`yV zKXB$$UEjP;BxXr>b14~0bc=Bi38Jy;qmD9jX1}(4CYyOLz<_nMa zsqRP}Q(@f6wjg3oMJf;f%e2mA_0?Vs>hsK`6Tc`3f2r=?gXjtcm?xTjH$cg!!b|=7 z@Ae|E2DNn-68`ljF`U>NE$sc8AXzAK?sd!Sw)QsP@NhQ1?8zHV(veP?HfJ8$a3|1? z%NJ0jIFcH+ZS;ur`<#~C&pv`zZI!6B3uGyd?H%3P)4!5J}rpo$HJY3X< z-6ghbd~CTs;33(K*mY9#i9${X%g0C+`TAmBmOqZtuJ>`t9=l$*$9`lj^bec?ZIC$W z$ioJ=ZeWL5if+%Y-#5a4=u_7#0dlG0KtNdm!2g3x>BqG6zo>TqSIm*9ouiF`^MAvR zv^|{G#nHe0Dv!9GwObhVK~^0SD_+VCta%E^N9g*prc9OSfZ@!ENn_x-bJx6|ed_3S zwgfq3*|cy}OrwjhR<2(FMF{5XwRLsxK}}KT=l54PZRdKPy-$!UD=|-Te9brrE}t); z2H!|bx{8i_9Y`)k@$OE@w3qRdHetxr`Nk$wJA*MM+{wvg>w&ma$K zFoM9Z!p}uWLq{y-Wg~sF75Ru;VX|wyM_aWCy{*KgMuPJf6qUOrj0Ln{G~eB{Aq2#k zj6{sFM7}0my^vO!&*-evS_f9)ux4n}L@)K0qRtikSUi0$!wpjB{z_ntW{I_xWAWYC z=8r}XT}4A^gK*+{E7u8tr%JVUlFSp>Bt)RC8zd!pE)eu~wqqx;Z|&A|WA>6^m=$xo zOZlE7$YvEo+Ib1hzmFc)vtvKXjt|E_%+TvSd)+khad`N+tP^}>l00_$Z4 zC0;&@8h=!Bhkiefo$Oh|&Up2~aN<09avWG(SGzIc|B^fg?2c2PEPo!l)JaUg8973L zy8W14IIi-v0ax(jhf6nihG2F-awWqXFl|q$>b~C8S)>vRp@a^M`uEu~B`;gK4o5^h zA`N$T7JC~vfvY}r(s~T3J|du~q&xDTRS)qpsyr8(4HkL`nP!9oX8L?xcJ z4}tX{k^r55`{h6uid`t1r^d}BxziLX00juu=#=bUiK#>DU)ec_@z^ltd^`lZbEz)h z>@cw@Tly138B;P7FI^2#3qz|KOLTRL-w`-9wdE%~k=(5(vOM)3BA!2%D$4BAl@fa5 zQ`W)o#I%y5M=Wi?MI7JD@&00vGm@U|lYhez? z+;3sPIDY3#7(r|EodqY?h??eLNHJV}E}9ZQU06^4GwVg1DhNa_+T-QUAmjZaJuTTip0F>6YZA((0(yjvFNZS^ARP&X zSLQx?PGUL$ZFkiYLa@-8PQc6D=4=W(A{ZDFZUuPY%3X{WqI+05y}VY^#Z{%j)Sv11 zpen|pnX;ToL=p&A2<_Wjs0`~VPHu7f1>LHcKXc=4f$_`8ni;t}nmek|hEZQgK{{*4 zfKGk9Qh^Ix}KrX4#Q=9yzoexZwNfs2z`!H8G)-QnzP<1+wZ_y`&<10wV;c{l*VS{X$Q$CJS#OtXq3866Qr?K!9rOspubvdubG+3r>Fo(WD zAIl!$NFQzUK9lrlEJ-*<*p2{!5RTwK*8l?+c|uD z7(w!TkiSV7n*;YH?1LDH_CW3MN84jcJ{|*53!9E};xVIqil8`4=frW8LF8Z``;g){ zo;lX(2WUCYTy^OuF&VryrD0=F7M^)|w+oBEO??t}L$sJK@^dp{d05Z0%>v`C(?)*f z!5ZVcAGlh`rB#a_5Du{Uhpk2o@YKMjl3Byt65rA@hJ$qRnj2#xV`+mSBi3g4JVy;pyiH2|josytz zBJ9P<9fad$LVwX~B19CXs`JxSRwzR!;kRvUc)0ld-QHe7&z36pcI{;h62FwPVi4sU z#64wsoYEqjxM(xMG=Z|nU}?%T$X|Th6Iu)Nrg}GaUplCSRQ0grD9~5_0t6y!B~+nz zx9OoTwh3q>f%yEWp%B^#o$D(-Sn-sf zq#3RX%~xDy$U!^bA}3>u9gN#~ zw?DaSk=nbw}E`@dl{I^;jSBl*RhT+1v2Ey_JbZZ>~A)}QyDQ7 zIfNHmwxPz7YHE!r$$_qL^bj_zsTUV`;d$ad1NX z`(rH^E8<{6WjMZ;B894uqF%$pBM@}>SB9&eakbSol8|6cL_@J^qEI|Z@uZa+Ze)J2 zdp4Z_67l56kRUvx1O0v>(};aQ5k{6c+9HeHKdeA7+5Ri}p?oxP{JDYm96SKy zVGHY1y{gHw)VMbFu(#Fa&=J!eq-s-HJ3wOLcz@YKA=VIz}vzVDFjP`hb;1#rlBJSJApOUNFXm=qw$ z!eOFk)L~YyN`v+-LLdB_M0GPGpuF9VR`NQTQ`f#}I?bIbYV7*`Ai`|#EG2;;8D0lq z;{0W2iC12ltI^2W-`o^g&6XE?cc7t!J%Q5rcnQZYcP|Y+ES2M?V%3CRAL)z5oX_Vj zch`Q@T%)hgUXPs_R}p(t@M{LW*b5ijrE|~2-~iz&Z9CN=;q2Lv%f@R6C|Y|+OGBNQ zDi%}~TnqI+&^^S~8+j33cFs@#op+1=bmHcZ-4qvn@)%Q-Yo%KS&OP9B?c$e?v5~wWY_klrKTZ;{P3zt2}#kyql5HB|K)K(t#y3hukpI$)ZB+YhNG(yGs_d@Y5E#od?T= zGtSU(%Mwov8%y|0si%j#i^UmW3_>S|OBKSVC;mCEAL_?AOLynMnb9op$?Fj){a`eyV`tzrq%jxruYl z?#QOuNE6E?{kRnIaK;U{z4~+;a9xjVIxti36uTB)VS<{BAymVgBpW2hdwSQ_sRs5k z=Zwa`sJYT>GLqA&uQ||UUn^5b8QwPisGON}jANt>mZq1~W%|S*DWpzojgnkuGWG z%8>)N@G7?zt_6bAA1+Hpt2irHFEY7S7(@1$LFq6!W0*PO=XD(O6ZTdk4Fv0bA@cj4 z>Cvo7%?C6B)*f;sOJ}m)UQJ7WRAUNzKGtjc+L=SIfv0{Ouu^<&-84B{Ig@W$897fg%^@=QkAhXl}Q|+C4eo z>@5cmLW1?~94pF9{D2w^0kr*b`|0+6<`ch?r6l^~wox?MN!tiq0U^DHi7t26$r~eZ7{br&@L{N_^ zhQ*w`2F2R|vlO-qqox7RZa{DAiZI4vL~03ntXK`jszoEGYs=&Bn8re_nS5%1@89L= z-&94=b*EZEWd=<8)1eaTQ@gh^)8BVd`fziKpEuCGDccpFqH)OGi%M?2;bm9YJWD4U z+PPs4H4XD}Pz~$-dFu{W?zul?J6F(9#7%3E&mPYy8UqE#`r?2>vCX-w>(G z?tjEv4b+thWQLW=_;2Yzgd^Ptp~}33B>KW*+K^%+Ly)zmwGo11i0T#o*yTzpS92;v z297^2fSK(2-#Mikp6gEqi;Ws&D01oL_h9f@6)$sNYwcXuQQsWWE2@l@yY##4V`Je=#>bF%yUH4?BwK)BaHEomy{RDA%%>Bp(AM zN_4OopI#;EA|~CMe^c&)&zoC63>W1{2Kz}uslCv}uS=y_CQXcIwyQqD)iyFB#~1e~ z5rg;-e;}UlQ<>2Ccih`z>Z1 z^f~I-8EG1#M0mJE|LfB*9unp~v*`Wi`oD12LbC@f2}nRdO`87`&YIX8di{JpaZSoibV7h)_gYowt+rT7AS3!3wIHEFFNd=Qrd+YJ|m0% z-*-aws3Y7k6Ir^p6GlF1Oe1dF1SzwCnC#L%yH6q7YG zf*Qp0rBnMcQ?=7J7`wZEreLq!Y`kYp3tDu_8k~tt89_{7l_Yv|OA*yT zpCXh9pjCrGPe>SE82*eNZsQ}ST}?bRm`-%}7B*3Uc-2W?kOR|Tnz7*fk2|1fY>Ol6 zXpUvZGv6dx_WDHm#Q-VBVA?T#p@pb=fW>U#T_kN&_Ngn138iZww7;Q-PF24#8?HO$g!Q+oR;9PWZ(^Kwj%F+H2j{}v6 zLv@(_Kkk6-KG^5g^3=%rXJFD`8d8nYO2^@jH;Hhgx*?SH9YV(M9R6uj)WNAG12q|(xV@3RKZyU4F(<WuPknaC*@?#1}?1ue%(0fl>q(9A4 zclptu{SC!QLynWiDl&xLACW$y6xKbs!sMMZJ%rqIqSF&iHoH;iZ~<0|IpBu_MJAwP zi2Tb~SlCNnG3(dse*PZu%)QrfTF3>1Hcw-rA2uSd8`RHp`z@qSFPPVh_2P^7DV!Cn zzLnCmq!;n@j9ip)e-5=%dYE~wZ{~>xkj&0ll1&Nrh+d^#Nci~Cemus9)D_wNXGwc& zQh=!SqX@YEAGIIM|A+88x!C-_?Eb&({$HBi(v8RN-B34IsgkO8Sjx>-fvN+zQ!+wM zPe_t%V)`Jy&y}y@2dOu5MLdQLfHA4foB@jU>JJX@>BEWe zMp$0*Hah*v1l)2R{ymZq5k^iy<-2FHl-KJtIv>7UTQLrHO=YtJL2OdEi&;!bONMlc zFF&X=vV(he(2csHJn;pjs;>FA*Yo%C$eHhdvU~bJW*7T^%dV1%lhglyyk6>@JK?Y=eqZ&19M`Oi z|B@LWKZ>d;7nE|I6fX28MH_W-DFF$~=a{z-tUtd(OS|dGFAj!Td6^ZbZDGlu8j# zF<#5A5TRM)kp|-9Da}#j;w&qMUjs1j)*BI`Ow!cwvL~MuDFB4 zq0XIl=S{NCM)M$DmB5WqhJNZAGs!NwFnRWp0%zliDdI`OsQ`245-+k1%emvxbY6Xa zf2V&;y4rn@9axon_ThXIuDPhVDav4waiVsxhRot+|Ht#sXNuPpoWXZ+Ub+DU-_=M_ zZcm9+HFB70wndwaQLf;hOEtQ1;A!bO*LZ2JIVm?V7EK# z4BmK5X1t8pF!{`s=#171a(Q9Nf8OsYE`;n@&fq8r*4DI^aeR$?;X+68mc#7cNtVC& zKg;>>pX1in!r^59<-xw)9O}C}JNoiqejz_OGjZTadnWa-)f;)?J&ao4)v^Z=_^|PM zaR-?%{pcl6Zm#i0B`R(U2)-8zsJc;ZN=Fq5Ij>6&m7${ak$+3KNb z;^;95eF^0jmDptVq-swj;-|)VB$3V03#`;az}(|UejokfMrS7;SFNYigkQyaz%9F( zQeYb#_E1q8g10C`$;!!1?-sk`8wzb`_^G9xhsci7CO#MHlsl73C8${_YooF6WU06%klt{y47 z_FIjS0Y@0ohATcRoHG$lF)(y7QZsp|-CUpY$^Ww0hSNFxJY|~A8qOx5nXFfICB@3i zSY6P`NqN?rjF$$SqW}$hyHLK#I;T-2RcD_a=`Z~gA@8uISsE>PHB*Mm2jbytXsHF+ zlfIpcdhHacQJP?il%kGo4~TE=9cH;hsUkHDok>_R@U}R&%fgfvCi?`t&dG-N9%U8c z?DvqvkXnCP2ZuJAzAlM8VLpi=y9N(v=&v_bh7-22D}u;0?Ds1qNUpl&LO8^8#x!2~)c3?)BYtGyUHALH3qmGk3_ z0Lx%sOX(XFE~gPmvhsYLV|gkK-6Zs7*7uVz{b}p(Pp3c=wCK%%Ipa+hz8!c5%-W2y z0rd7&OsM`5hmAef6;4^95VRN+=gpx?z_9LcN7X4c&kCgvGY>}HcuP*}pY>^pG z&4wrTqud+7fe#mZ48Qmub`jAx8K&uo(Ajr?e5V;0*0=Y_FFaC06b}6(LU8WNMyaoaGIehnk)9sa78 zu~o|D92AByRw&F20%K;M@B2eCFi7vfv!5Dga8}*gFX?>#)NbJGP_`YN)?8yqFKs75 zWcan~FY(^3c5zDr-+x}Flk9mQAc3du9MhR<>XhzC%Y!Rz{`$cD0R$rKjwv$z2Dwty z8o5>ul6$z3r}}YU2%jU_`mC_i(Sm`E7rnKyu;K0Mkz&}G14Z`>ywUHCY*+7sYXWn6 z^o_<(8IXQ%u7OHlJqCXxb`)o@MqAu>8IRU=5zY03@M2EinJ{<)y%;$Hw>8&9mtw!pb^cn-}Y^p`qY&bn|UP`t#u~ zRv1QbF6_4x{;-gdPLe#p0Cr0uwx~yX#x_qSj<9kXK%K}BG@AKA3AG%RMgf;u5{c{Z zpg4)h2D*ETTf`#60Rn?jzfG=rXv}*~6KckS)EwgSHg|0$1~1DtY>v8@oiQsAQI1vq zdt65S$~V)C_XiVmd70Gl)vVXHDo)C9mls0mkA4sb?~I@K(}TFqdyb>`6ie#A_94DL z)ENtMm!L4kuK75oaQblIInC4ccf`T~a$d%hC&@|v^TMQ@8~0umKhjxdS%&n_PoWgK zLngb%i%qBnjsQQ01%&{K^Iscu@ows(__-8i({8GOo@ha@U5c>g3cYx)?p%DkD$)nn z5Gzx?#ts8s__iXQe=Q5>P#$U4XxaUXbvf-W!c?G{#92KRh;G_e;K|Me(rYU_2jk{@ z7*Uhtc^?_JO=eXpc8gI%&(%1?A{-8Y;mAX%=0gIS1Lj*Ue#cKHdZVlJACYP?0c9+0x6`| z13JpAFITk?4}|k55^4%c>mN%W&50|}X|tdOZs*y8 z#rs$(CdZ9k2JU5N9AEPfZuE3r6y~&8hK%XoMbc%C325V!TEfgVP$N0EeOYV!Zz^IR-=bXvz=8YbEgnH34+)%d}A5+9W z1ts+pJrK_+C*uL!kuGS3o9iJsy}B?Uy=K?1E#kNP*qitxEdiRmSgy0Vn5UsLR$EvNcaUb#Y800j`1<_YN0WC>>%8wOZ{-|*_Oz*Q{JK@gmo-9Y6-`T z?~m1eAVJ?tV=o9ygv?K%>B76N83cIN z9!qw;kT}a?o+$Ku+9!Cq3@Z?KRIxZM-PxrBo5c!sXFk{dd;qj6;GR;pm7X6IHW~PS z{Z*7g9|=|@V#lJvafGoC%`^zRI(E$+p2;BipZ({89qRr)r)6dsCuKpY4dY)?ecf*1 zjo1@iS8iW^vqI9dKG#$jXGb_W&IG7pPc!pr`;b-lBD+qPNoYpwk$$dIokzvqzniEggBd05rB%`pL)v%`!pr$q)2+ zJ~U(h(NIp~U~Zdj^s47n!w3^FeZe{cq24^_o4Vqli(~C;aC~pjIIxKz%)t*KU}_NFd3TMMC}5wDey*@}Lp{ z1OgM%tA}uEC_|+wj(g_snb7Mhj4GokiU9c2|F5&NfU0ZP7B*5`io3fPr%>D}UfkW? zrMMM$_u}sEF2&v5wYU}eckjLLp0?+lp7;JR_8toc`I5{eGg-;Z3HYJ2_ys<#VeAx9nscw3comU5_ z22!o`uV6SP)cLX9FpiW^0_NEbl!o}3HKvn|TerT{R&g~B1VOLGz|~RN3DDM&d*NUu zDpO=D%yM5t-WW$)Noo7Fh$V?SMOM&2ynP)dk%XCqKDazB9m|K@BmUt)@SSCxp2a58 zP#Yg+mMHVC{iO2ns<}2^*cRX(+|A%g;&8d@tgOMyyQ=Y>`NVQCkc8-m)?$ursNVEa+)<~VMoU|s*SE*H*k2K(| zK}KMw#jfJI)n@9N31YVW0w~p+wx5fSeC&XL#p{a1EDGJZCYt4)CXkNqOiF9m`<(7* zlmoLkcY(xPvOsF2q@oFI4=**dWeX5?>9l)M>G2*ymB_0TMckh53va&`bPGF2BToTL1ZC@vR}1#rYvq zOABTiZqC-HyywUDk$`Tuu<64H3y!dcYbu`1ccD^NmY2uO8^W{nGw!UI{Pfswnnaz5q=~pvzvbD8?Gf z_+l}&<1n%CEz9gTn>rv8RfIEnVCA6$P8^2n+*NQsw1Xtarsx*tl0t>|%JS9z_3Uce274``#Oi7Q$7AM9QBw(A zyyr{ZIXOOUB=4S(^A_ZN&c${r>vGsGmam@)cm=b`n+a?kU1wH^YzMS-`q1%p&ZG`J zsSUPf`avJ=gjqLG!KC=4k4+c8B+JMdf%;sy0=Ln79}D8@6Rj>YxP=)zU09b%{oYWa zg0?cnVjPBm8)NgOa4qPFh&VU`0%U1TGHd*|h3d`W)9N@lYb{vdBe?P0vuS&p#hP7U z$1#O2`CZd^`_U~yYW&V2^|?*iby3=*vSC5ZMVK7;p?RH(zNroQ>Mi%4PTD~-)C3gy?-rt5r! z!U}#7`wtj#m^{kybmNcXO{#Cjf)tfDN-)){L3dMEeJSYO*Mxm&Ax+4DRvvwY$(fvn z#zi&1jqlDcgEp4KozlLd5uEJ1XKX0YnSI}Le5_5k`#|)Hs0)f;;Ya0bMR!%w&D^=%IzeB46=nuT)Hy+vZ|sSoBJ+|D?a+Kh`ug) zw|ruq?5HQs8E-qr6I~UHoXEn8em!=x60pk^#g_QY19BP8p&@sf;q5X8sl4Z`MZe~S z%~bcL7tYo+S$~2hck~G~%SLrF-$)#G*rcP2t<{+VpP!LOtO@9@uIFCV8)s%m?5)Ij zsTi6Z$%g1uN5e*70hn-}TWhTD{znb2wZp2J4F)APbpsr`K)WFX1Jx65@(1llE0Bw^`qH(EsgyeEwaql{kfszqML}s;laSedzHz~p4hF1UfC;sR4eo6}-ilOJ zqmM!OZtA@{@s3j-=t$5srfYf4N*VPk#~xW&J|YeBWE&SZSW0S6Bp`}67cBT^^8q}%B$l7qprxv_i96fXpPm3d!_5dehiBKI!G)S zyQhxXCS9gzMY?_x74V>(-rMAnk26lUm5!HI>3J63Biw!2uuXM9xb6bJcD7SA-F8@t zO8BsOPwLo7bUwIPx(!981QWh$c7A!{;$Ow6$!y;9NTR(8ZRN(FF#(*RhlO-7%^ld)msplRki6sy6kuCbTnL^{$)TTVYV?`g>eIOx?r z5>lU?|GYGLfryZZ4u$s)8nOJf!%~zbsW23f)jI6~*6@k;oU8-+@DijWXwH$*h!t3i zA{e5KXzTfDH;Z5-UbDnB8Pkg>reG{m2#9sc5Z>tIcoDMjP?{|^?Crhzx80AR1L>Kh zN5F`?BUq$j{{_&$Qzez?u8$aFY0JQ+4^1duB2{6{e~1(X*rePXtx-5T7-ir zKP=yNXmhpQ-Oz@Ek%U}#QK!9$_A!54G6NsD0tZsG?j<3@p6?K$< z>2k}kgbK~>YH?fKsa^$*o2KAyZE}_&DlD9?BXQG4Q;y6VB=_bO`cw50(USLwmCZEAZSAxP!1P1I3*8d!*(RIRd$hiYU?Vq5bP&{UC=e zxgw{g9Vb$pF%9D{BZ`%=jBeVq?^{M`pzHkwKDz(F> z5X1~}4iD`RGZ{-htW0te-HprNS(*@Vvyjss!dRkjDPMYR^)_>ND6& za`yV<aBC&{4t1xfg4}DWTrI|J^Gpd)2+C5l_Ma0G>p6BJq)Mj!Qp&xYB=#b3| z8K6$*?VdDhm+$8$#hj&=;x)U9?^Rtdt%{ab6PmfL)TD0-M^_z`Ixo}$=o2~>npv6; zm+p7yu!`%-R&nbcTrJZ4lnPe71(rTiSpm_MPTsVgmsMpJFS?u1!d*YCx95W)#&<}xM^%6iiH)e53P>4AP=FW1clFbzXQ zujD}~5AmZ5KczH9FLFS+VyQPNrlbo3e(G}ZB$m|!%qi|PTdxDiu{O-R^EaBb3HG=m zEjj8*cx(vX^G`b@)QC3&5$KRh0_v-2-WE8Mo(Y2c();Dp&I#TAA6E>?Vxg#g&u{Lh zgJ7TOf}6cYZw!duN#ioKD1Av5;St79P-+32s&sE`K5tT}HYV0`D%2!R+l&$pn*5SH ze~Ppm+2QLBPN|r%g;=uvB4BoLE#Zww|3Wrqh>FjCQtL@Hwi8AL-Mp=o1g^WjyO9QH zys-W;7{sq#8DgB1FLB3AnL}T|@?GA}V zZjviK&MDzht7dZTTBO`OeuAG=)>%?J01>CAt9NZM{HlYz&r~`{NhDu^R|T{p%LFRZPGRuj}v3GYJ1~ zmq=Jg&)&+`<=@9|R4pQ~*pZ&owKjzEX<{PDR1R|F43YiQymQ!?=s~JJP8={Zu7J0g zESH?5C%oHf*NR(v@DI?*a%*_K6wK&#V%zvQEvMjko1vkl)xR~d{qSH*|K$8Mbmq?4 z*5)zmIq7-Rnoj--aQH@x$u=Hl#7~h#3#oNCn8u|KGA`8I7#iP_Vr(D8<3sP}>v-cV zyZ!z^Lt9_pP=ZGtMM$KO8X48qn4~lJj*U9D7SfKgJPj;4IqE zrp3rzu)pazyA|9{Mj2-xHX*5O_OoEw0J&N;XOaRNXx(wOkhj*&A|TN+hIXgCT3ua2 zRc6;jEgDokIyv(2Bz5`H6AXh^$WM`NLy~yf{u*ws+L^VvVRV_staY%fY+KwtM0nxL zBltsp4gzJ2;zu4#H`tL1H!4vhdgAjE0W^7=8K!8Dh&_C=jNR?qPQY5>7*EV#AZ%a8 zV8655DzShuuGHXJhSJoAIV&f53}w)pa=J}I=Dw}!5b3@1J9mvqAver1h)ZY2Qb<4P$543>ChF?t=vg43@hc-Ff0{XDMO&6EAhR zyvw`esb1~(W!#eGWK72X0q6RUAdgPa!5!@bi=QeF;iC-bMx1I5ptLS}u)t+M4^Xx1 ze6X%0x~+f_yqLjShj3<$z7XnDl21wZ8tHLhfwWISxYu9+3J04@HQY{Jsi0Zw%2URP zgc98aQ60TNVcWY7C%y?K2RAVSBFY{y+ltkLY+5jhAQ#xms}O0n_|z9?VR1+ij}m?K%{Y=of^yp;$!KBKQYm`PD~~!J zK3W5?mBO^|<29a2Ss}631J(h1XA&)&JFesH^FjaZV9mA{!Fn{NMEF&&|73utmtK|n zq6cKjK+A1Y)8iV!5oS;!}1}k>$UZnKT1&eJ$mZMQeEw!#| zTcMOnP_CgF4?<^@Y>>Gu%=AN-^iM9|9GyifyN@!yE!A%*4X#?koYnbJ;KWC!q~`M$ ztJ~|ubR0ZiTLpqrJAg0^Jt{_39BsFwJ;RkgeOP10%0itw)w|uUVU4A@y$!<;OVh|c zG5^-=fe2ysmHVlB;JWZ>4dx1W9@oBt$AjhQc#Hph>YeI7%h`wbLa*9jZ^j#)Avy_s zl=V0$v@3&U*C@l6UKk&m?;Vl57RB%2@r=Vn&=C;%oIVu>NOpWU!`R=r9G(OdY+u6b z354~D*B)Vj5`fD&I3-^}aTH8TUoWrjtS>NRuteT@xg3gE$7@4<~UR(e8 z0Ew0Q%`hlI|1rX&B5nC|gO!xzO6-8lwoMx(SJHSx*Gk@hcVe z@*>}qzQ|hL#LSclLlZS<6N=>cht-7cdmy>b+yNc~Zt^dgggRWTC(F&Y#mmX6pfniB zsJN}R;bGn+0Uvg4d3f=Iq6qq@xZaby1u-dzu;#MyOKa*=7JcodP1FG8(-B4v)173k zH_k6Iy|eZUj%Y%MGN!uo^a^VVi_~*0S;WRy7O(I77=M?%a)w#0HaA3u?zhN8@3V4R z#i&am$|dOUYL*w1)xf zHYP?XmP(G!9cFti`=$F^@YdXk+9FidJ2RLUuzWx)}S zUE!$v(N}f`8TeaV5J&WAa#r6qMp!o}c8WB}C0@OAM!x5shlby33r14=@xVJ4HGR?Rjfet2tdBkxJ-8bjLPYDoJuU{2E zBvD2kc-!L+eqLQW>m8LPmskLtJinX>@w9J?d#8`3)6uZ*gWIb!&NFE1puSgeWXNcQ zdvQg1|9P5F*AtCdZbd3T&SfNZEhy>izR5@&6hi((Ub6;xpb`;8JG^E2Kr%bem=|hI z>!VMiK;qyU+Ax`uZh!y63LidOHY}23b(iJd7fmR!n3pskbxduRk0)1wuR~7! z7a{Zgql?D39Y;Ff&fuUVb}Q-;%WTYDM(i4n&I3nls-(YHlid|Ym~Ws095b$XGku{N&czO{lw(~|^5s90ELs(V;HHaDPyNCJyg#PY55qtCX7p-p{0C$y9n zDE}XRpyuLBYee5_B>=O+cfI zG9`WWYGlf$pTi%05a;l~{ z%Qf2;8HbyqH0!(IHF{a%VZ~1w^D(ieuPk=KTisVZs$k+F!s#4UIsyYMws*U42eDh3 zGq{8iux$tpEUnGsm80ZGP;Kf*zJ4P;)e2lA%tJrRON{>j z@dV7NAIH*vdHuAqR*;QG68haHnq^%+ zb|*%ghn_tvd1Yep^r?iy$@3b!+Uqax4mFu8;|Ob#^n2$gTkwUS;vh*>pi8#EIGijs zH=C%Pr}AeiOW|o(A^9SMrpFXd)hYth&%Jrxz7x#)pc_b|6E((trN-3Kp|(wXjay>p3Jifp#bVFM4w*o1^uxbZ{TS{Yc2& z4p`B@?wSIR6PDAJS3d3}-&)%n^UhXX2TZg>%N8?d_H~T!mZ5`#7KoumFA5;9=fu4d z*1gdHgA$_YuXpJxL_J;(z}|zqK4x8;kCQZ?sDT6u%rTZ zAGmfp#pvcoHECO}$pCjFGQ_ETCKAPkuEje^)wa^n=mTcIY)dO!4Lr8InInGz{r-X> ze_LjO1PcVTP5rwU43a;;V3=4~n;X2h(v>#=JOB*8|MiZs!)0c-#TvaP7x&`jT+Dir zDj&z|4aET?`-do3KA!@jyQPnr`NI{2P504SD<{dSzQ^t?< zi8IR;E zlBCq`*%PESA^Fq}!|OfbzoJENbCNbJP;WA%bDn*tWap=CAD`tV_()10rXxe6iq6@xUorJmW8|#^LcoC=lH= z+4cFdnr|WOmIh?8`qvp`bn7N|wSp38#og%=PF{aGTZj3y_6+O7?@E zTzEG(Q?pgx0ItwAo{mLPu@CzK2BTL8oH6JiXENVDSsOsh6Ej|*D(gL#~^Y$&U z2{633Hyh|oi|+mlKffJ3&@yOD%(!tu<(TvrpSKke2dJ;88gaGkfj;cPqzu{GR)?dR zA>}P^kioJp=U`${YGSCx`#PN z0l_WNEPDBCGFcEKRgu!_;TdVtb#Q8t8{o8aZd-xs$SIj%F;TJZt2XA?j3$fAjhZd> zfvjNl;M0ivCVX0&D&lV*G98He) z*@o?7I^7?5-=<}FAY25ONaoCrca8xz2nFJYy<;70uehGt$-Pjan-(CM^CBjG$4E>l z2|`Dqm@~*jxDJLO(;J$~a;4ybsgv`>?i`Lkkrcb`i5@-83PUxq$58;9)r@vQ-r<98 z{em?I*+LC6K<$&|p(CLS_SuHU;`%1ll6P`8=>s)yh5$XR%!HD5Hfc}?Ln6nDdr=omV~M9zC`QLz#Zq!4hBJ@?v8nGFy*G%#~IlP_07k}VFQeS>v0 z1M!BucynH~6)MV@BZ|4&CBrQpfV-A)42#{o%ErTR!imE};rcdbEFz4nBuY;`ehW6eP1WJC=V>HTIe-(N9Hj-DqX^4)2{#`o&}>Ah zV_yV0nB}_`Ev9sI>-GXd{tE}yKEfhqX=AntBQG@t>&Jz=a_09^L>1999MhMGOd?k zEC$Z$|HQYy-Nvn4DNNc(Fk2MdnQ&s}b`LVjW|VehmYd+W{HZv#B`#;iSCCul?9yr2 zz)aA!;&Y>B@!%^1BANbbfceaWaGW}|HQtBX{O3*W4azO=xBidg5-+!dYcEoVgq&dm zz#(`Ybn2jeyx)TR1YEL;>Tr(3kl)e>62){@+518qmg+dn5<^2+zljlOD=ERbWNTu5 z@4?6z&gx8c5eq+j%-V6o2lkx)GiQ{u)2~8T&V=%|yU)ACXZn{O>O^-mdSLhoJ`)12F<76wSxhb^D zW)$))i;tnA6@yzoKddaag}6GoWe~NAX2Rw#;WKepiSo-X!$Hn~=%_|B}O}G{-{<&)TawEfLi& z)q||%q>dcnT5-=>6m*;9j&P?7UiLM#dpe|A-jbO|=dcP9AjNB*rp7gsLPUTXZ}mBK zX|+NRGo-C7Lw$&DQm*bLhySek(3O~tPEdUNdi#A?BahZ_YxCPFDpOOTq34!~+2mo9 zY5t?vuk|AW+IT!wo1Jz^g~MvgKHnHgw@z<|YbKVi@^_$;+@3n(2oomEnLN3R zXiW9qzJ}XjVRgp|RNvw|;mj6m(@&ZQeJO5Z?_Oon)uB(-Ap50gwb`0r=8}w;Ms(nAu9~xj2OaHM8?aRay8F#aR zK*8s;0rd(}F1YYx)$O%NMbh(nW|+09x0>1?BAiooMHYaf%TQI0^d3J7T)Z>vUko1N zT9B=-#@BnhLrt#dSPCNTvwK((PY090xcx9sOd(*|yMs;X>&wur7(mWfeTtc9V5@G} z;%9INhEYk`c^cL&xPjf|i^kR#z;xGlby(Ix_oN=`=6g4oUKRArbXshY?Aop>HWuwS|CwL&_Swmf)AB_`UT-ks-3f(r8T9teVN zu;7?w)9VMB-<5bR&f-Ewf?qhd>s8ZQis9@Ct@IX8VGgp2FUXrt5wll|p6|-Re_HZ) zu4sJ4vJpw$(LoeLj5-sITJMvhDqe{)`DlZw@ik&a)6;CCw68QQ3zx%$z2Yc>PS^M9VB+t#^Zn7cGwVl(+|9=(p>5QbO=lxv&u=17=^Y;~bON%G$~Yb}uvVBOLi$ zv^l?`(7ohLF8kxetXfR_VSW#LSnL&w)1<1*&17vC*8OBvr2};)tWuLQF$K~UmQFXv zQi#AWpA|Sf{CYVZ;>548&i8Jdi9`D#ljU1McdL=E5Q@w`gHV8?Xnjs%Z0GMXvbEc_ z>aaL7scBocotJkh+i_@>odv0Pt(?3j5MlG`Hq!S=uwrmMpMls8h>9?n=@l-U_t~Uf zGZh~FiYDy=LzQ~wuM?Gh3hfWFtkEgr-Dss0e6%n_T$Ak_rDrDHh%dyo^Z`#Wc7>Z@ zH82ECRa=6;#sOfv(_(q2SJt1((pt84iK;hP-GoPTTD9?zxa%B-82kE-oC4e4_71ND zs&oyF(s+*>TqSi~&$}3YC}7^=Hx1AV%M~biBjej8ifV~5WRbz^aP)#*4XVjLorS`* z9`(rOXH$@NuWJ}EFR7I;$OQ2MsVAx9*WDK%@F5w4>|AggWb5VW07>ZWbAP(dRXX2MC~NnR$#dU_^}k zh!jswQ~ln+38BZZvz5NS(XhusD3)g@z}DG)cv-b8o68g8BTBTsl}8t(W_@V-R-CW! z;$d9UGNrg^Zq8>>Af1gmm?a3WHmBW!n2ar7HnuNl%JA(uoR+5$rsKXOJTF zhL}X@O{i;<^k>06+66T6gTxbL8oI>*?)&QV@q@Ufz#4@LrwWwjn*H-C*yaFF8_~vU z#a#rBoa1WgiFiRFCQvJ&(^76)O9${+ZtpG|v1#%0>87R#TcaEPXZa2%VanG*!k%P( zg3k)=nH2GNB0@X4Et|TM5Aej<<`*s0tc#Yb$>r^q_B}7xVUe^%P3{$|F!l+ctg-w@ z5*IpRcGWBI`oAUC2zQMRH>IqF_ZxIP?B%D2)^o#N#(U!e8ut(X}YF# z(W+ES_r67HfeZ44m{7aF5$&48cKGI^+-fl|H?U|Z-PL_a!im(La$ECY)8b+?9J3b& zm+@*YMgKVT>&507=%K1^?GE=T{N>fG&?YYV@q@c@dKvi~SB!)5S;*~2dBjCe;w|vVKsgM5;BWOk2Za|>nZLVGrJ2c zOFz}N&5t{byvlfVhV`z!zn{@p($Z_p7&xVXHM>=HR7STXdInletX^q3)OuT|CGd6c z##b||;f#Y7CO?QGFe+>~|Ky%&?1O@6s}13L(5=Y35m zlB!eGh1Sa++&)b5qcTPyH?cu9(}cXb!zP_x6Evg?amsXY2IK74(LkPw37@)7p382} zv2Z^FGMP^J6^W<&*WpmClzMv%sk7xOdSB6ad;DLbP_>B%n% zbFi~Eu+;zm^FeU%hYx}*Qb&Ui1eD~$6ECZTq%bFSd@=-n+Ty7jTPYE2)ghc?CN-g# zZn$Llm#??ug!qEt z;JNJbQP}VAv~6|z#2L9H`VLAyKCSWrve2MPzlk}rND3WCF>8I&`VL^#6YE#s*^CV1 zWK9cQIy|8qo+*#ki83pJevPuKq1krAC9=2H3btOprlIE=Y&3P*?)I3hJa(^QYkeA? z4i{g|Hg}fEA@PWqQ#Jni(m7vbQyR>Q7BZ;i#)3Fea9KphOj^eaN*JNG7S?4OoEZ4UCSTJ{4_=~H47C^7U#+P zK{67On=b=@w7neRIQC{OZ^wT=C`&r@2pTkw!y4d%U_B7vf}jX%>Giik;zA2zD#KRt z8$*VM2Y8%dgw&!5ws>+-2H$m!#un`e)yTeKv_~}IaLf7VpHKX{G5E5=1K7TLFQM;aNIP2 zgUn^@9NPU}+YuO;0XrBvGi&I|2klxd*H6RW($1EhWz+nlx9Cl@$HF>$z0Lbym*gyhwv0vD?Y zDVIjXGIJ}3%LJiGc6ult*52jlf2}i-eMLbyk7RUrx4Sj6O*CeQHm2m#1{?GG{@Z?h zFQB_(O451EVR?T9s>1D(7YhM&SG9_FI@;8xugVayG$)7BLz1nGhwM|Nm6a=k9}#E{ z`*1IKEs0M^=v5s14ncF`hoX-rd5btS2xtVoCkYjOk964r>Jt*IT*qQA#jSwvE_07!(>L=E?&po$85XoWe*%`An zeHev1!5S^EW0Gm!ns|7g*j;~N<&fJq0?=D+Zh(r}{mwz%w9n095mmBZWqHnu#pX@G zDneE4xONgTRyj8{WK`bWsO5mERnZL3Q{myus>Jd;q8nZz^ED+K)!-u{Cz8u5Kn*Y z;+hv$S~OkiU~YyoYFK&G2vum6PVXWhRrz4cF<@DZT55@2n~KtxJNf zw8{KYTLLgoD-~%`0sU1Ou_{tOsb~^)?=T6WUo(ijhLR=9$ZkgnDy6$z%Fh8#Y>bD` z*EM2C`%x0mU#*t>l8D44s}3YZf>(p|?!X^uNd$Ks~REh2dZqCV;=GsY?DIXk*P)m-AFwgY?s z@w7R?9SpW7e)j=%*~2laMFNpn`;@=MkbMzSm8m?d-U;O5QY9{H_TReL+A{shBIWy7?^p+k?VQFR_Liu zGi3fs9ys4*A0Ug_?AKoO{n$SuAOgc{x=s9+oQaiN!tfj7qNnS$WhX;*%wm-vZt z_&^nZ)+04wYNRVdr!{D<*snxCP;tU)x}5>>bN|tW@12gnHhJ8)S-4%d{!2OrMO3W! zF1(}-6dQsHK)pl3+aj*EqPA+6(U^N;i^Ct4@;llfR~xCMIzF!lRAU)Bcc`+;$4Ws| z5b4tmFvj`Qj*gIry>(1`n<*(K7(Nna_I^IS&7rH@Eb!ekgQ+|OjqBDMRYwXBPC8%X z-2j8`3s03G0)>OPol)xP^vb0u+^l$jOaBFj7z?2X`nYHj;C^U}Ze!-Yy!U(ytx+PQ zhsil+W+IEZWF{%XRK8{Olfbg9h0(G4cDDZQdZmQ}_|RmW?`7n&qc+1ihO@yP@sgMD z+HO3)3eT+QB*M?7rR7{EEa%RhG=T7_;d&1%yN23Q%pO?ag) z+^t!)5%4&9t zZ&5rfjUMnvcR!P=m>L@`eacy&6i=O=0>Vr&ua^#`?^2u-)f5Ymbb4636}%^Qg;&Xnl&x#G#bz9Bz7^2OYf_t6Ld5Zf~a=y(lujOU(UWcL~Pn{Y; ze4J9QLLU>1h_Yk=1b^1gKtEioQ1>~g538ob0fjk^x_Xc>$tuf7pab21@&cSl^3G?# z-$xXMG0%EX_Y0~&Pocbowev=+ISPZC2u(cy3WX#h+j`}kKVp>4qJP5EbBL)$^>d04 zaH_|V@iNNVL7tk2iBhTjH>sygy&Jq(CWueuXR;_5-q`E>0^T8JpW%a_v8U8Qw+a@h z#xOP@TXZ;T-^aey3?tf2URU)gzQi^XfRd*aV9rt9>u=R0TJX8>vpFpEp)RiOFFe(l zMy{p^%oLelT7nK&J`6jTpzFnQqRCu`p-Kabd+Sz`KLO^~4KURs-~hO)m2kkF z{-ph2Y0KsR+LsW!DnK|V0}xU9#2y< z18gfqO(vm}A`w2XQ-8Ts8RDmGY{l*!t zCHAAufzt+OVi!9!UdIeUDtPzN5Fez{+{O$^mr5#zbl+HIj(|LvXUn8WtR)0=JpZCo z+*Bg1%5kb*l>i^nth{X>azm%Gm%doAOJLAWW)G(x)Py6Yp@}-+1{Y=FE;Ap!81{7u zrsz&gjVXz34D19%dOqtu8$${-GU5J@aSOG%js9#sepOVsOC0|9Bi$dtRlq+p5$6Pd zVbPeL;xSR~TPBtBbW@ZqoXMu)`HF0-Ub-yvAxlF_N|$zbKV>f7+vBL~XzQ7}0V~NN z@M7CWYO`I8pKqW?JUX{NlA2#?7*=hE-;{m;4_Q-?v?;}%mD6({txM)EMvXd$x#AFRbun0m%< zH5=y~B-x)PLt8o?gTzUxgmuBq4DKz}Zs}l|I!*2aTLf~ru$~2Ia7L+^!p)OQ2gs+( zkOo6gU8_~c?Or$Pn_aPC<*i)AyvxLRA)}~n@mqwjXAoxGwx3EIj$~ix<*4=M3k|8@rn6 zg;+3Sv#5@2ftSovWhNOr#p5kZh}$IBC-fM zYi}iQ(OlHX6F-L#!(iDb^C{9fL?F5}`-ATaH&)YG()$Up82w0?-a7K)=&}WMK4As9 z4Gz+MP_^y>S~QYMxRe^X(gzo-i#0PZt{YpWl!tik{F~9x**A-}`y!!*8+cq)BM;nm zShWDZPKLmBdjeU>+=FMzORGi{7i4S+RxQg(;OQ)?3VM{i&@0;T*Hi3lne1`bGYNTxs{}Koe1muqVeLMpOK>3h33p zAO8C-DJ0KFD<&oU=K0H?qq;qUbaDdz_4^0qzfrzFZ~;F5jVj3}B_=E+Cr>9S{5^4K zAn1SnZG%70?mIavNS7TgbUfPg@O|DDeF zSVp!c`oE0|5Z@1h?$@aLfcsl?ehUB`Px&Ee{WZYY%E{j9Uzq=?CwqXX3jCEosQ_~l zbiiB3_XUDKLj3PAqTgW*|FSsyvF5)MwT?M`1OUVU0Fmqu9N-BF>=&W@yJY{)*uRNd zf6assy4i0BFbe>6^K&i>0e|^kq5l>1pO}n)nM)-fiuPv!kre9JTs8r0@&1AMH@R#9 z_KCa%v^QlyTlhJbumJzAzh^T2WiGpp_)L@lL<~UN{#ll?X#Yt3n_LD36<)^yYQpdJ zugpil)bk&5srA>=+{-RXTmndw93ah~OTI(!PfX^&EcvOF^xX@ff~Hd2|NI@@JwR)jttg|B|R`0fqRTDEOyRYt#J`k?k*ui>jJU0RWB43|NaN z{;BV1F#aVGVE!p)X=o(|umJr_ARIe5TOXhbEJ^{D^AnJn{qKPPV^8|G(DP3$Jj4L) z&f-&bzV8b_h(rJ(0_x$1(608Eu>ZJU{LjI< zzs+R$e7c}E0uayz&#$6H)BYXzZ-K}?*@Dx6y3qynJV1B;A@o}V+Q4@uE#$28-6r?H zHSu?25}ao&PGnm8}t-k&z+Y zzw{y9&qDj%=m+R?KZI}q8$kN)==1YI^<8#e|M}OeVYGTc~>c2Ln;7V z1pr6$6D}d*FK_}@78VYcCVKyi`m;=gp_c@ZT>#{t$Bg$ee?bP+l!^WCi;m6iL2Lsc z4*!XG5dT+1G0T4l8%>{mEAxNa zQvS6G%u|&&=>hQl06gtac-z8X@&B+}{VO^ezaa550F4fi@6T<39x$kWSB~FR-M^KV zm?dC0%~Hqw_iZ2)Ert8LD!T_{7BH;;5Qr=POmx&SH~C{_|KGPc{+=JLpB|zK;II5i z*84U8#Q&GZ`8_^iV3I)xfS(88f7Zmg4S$3GKPVh_$hCs+dzonf`uDN!kD%Z3H*~-x z==V8x*^sg?05ClPRrvGRiQ4h^%>S7O{hobA`L1#jFn4hT3>)8i;lIKC`==*#p2h073rTa_J8K4F125HW3-;#L|FSB_?3$;AdfioczlF-K6rzyHkmO zC_WHS(&?|9U++u(ONst?Ne7^!e+XV|z`rPgUx7bd!1}9h`SJRI@76Vc1Y@yZvH!dK zK7LK%M_J5;eT-{!LJGY=pWsRa-aFW`p;u);@_3h44c 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 1f1231f47add6499f99b2af581bc2f99c4a1f924 Mon Sep 17 00:00:00 2001 From: "Mark A. DePristo" Date: Tue, 5 Jul 2011 23:23:49 -0400 Subject: [PATCH 037/214] Implementation of key summarizing algorithm and support routines. UnitTests for support routines. Almost ready to test the summarizer on real difference set. From f5890b1715816ca7f57831eb8012256c7865b8d1 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Wed, 6 Jul 2011 12:12:25 -0400 Subject: [PATCH 038/214] Moving RFA from string/walkers to sting/gatk/walkers (PSP2 as well). Dumb emacs backups committed accidentally, will be removed shortly. From 759bc25643d592d16971708dcd90f392d67bf823 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Wed, 6 Jul 2011 12:15:04 -0400 Subject: [PATCH 039/214] Get rid of the dumb backups From a5ad603b3542acfb64f3f57420dd7dbfc76ba5b5 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Wed, 6 Jul 2011 12:15:41 -0400 Subject: [PATCH 040/214] Gah. Missed one. From ebf117f1fe3aea759c02dca19f5ddfb81c22b4ff Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Wed, 6 Jul 2011 14:05:50 -0400 Subject: [PATCH 041/214] Change packages to reflect current structure. Remove @Overrides on interface methods. From 3ed6d494ceb60557f167fe498f5efedd8ddb0c5e Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Wed, 6 Jul 2011 15:58:12 -0400 Subject: [PATCH 042/214] Huh, guess I forgot to commit this one. 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 61bb8b34b4..b469c8a41c 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.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 07938d3220..2b66730031 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.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 boolean filter(ReferenceContext ref, SAMRecord read) { 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 ee8b01d7db..af4d2ff284 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 aa8a49175f..80a497d33f 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 @@ else if (!SELECT_RANDOM_FRACTION || (!KEEP_AF_SPECTRUM && GenomeAnalysisEngine.g 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 @@ else if (!SELECT_RANDOM_FRACTION || (!KEEP_AF_SPECTRUM && GenomeAnalysisEngine.g // 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 0df31f3d78e0cb586e9dac1c056a4c87535a47da Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 7 Jul 2011 11:16:42 -0400 Subject: [PATCH 045/214] Simple usability improvements to the DiffEngine and DiffObjectsWalker. Can specify min count for summarized diff objects for display. From fe8e2c305c073b08d26d57c103b7382b8e751490 Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Thu, 7 Jul 2011 13:37:29 -0400 Subject: [PATCH 046/214] Adding dev qscript which I used to perform the VQSR in exome by sample size experiment 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 b4a8c4c328..17461de2f2 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 d540d93d935e097a3e35580f5c2d11a06c5c1aae Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Thu, 7 Jul 2011 15:46:27 -0400 Subject: [PATCH 048/214] Moved PhaseByTransmission from walkers to gatk.walkers 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 ff59c9e291..2cbc66e313 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 ArrayList getRelevantStates(ReferenceContext ref, RefMetaDataTrac 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 609ca0baabefc5c752d367f1c942300e063d346a Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 7 Jul 2011 22:02:45 -0400 Subject: [PATCH 050/214] canRead() now implemented by looking for BAM_MAGIC value BAM\1 in file, and for the ##fileformat=VCFv4 header line in the VCF file. BAM reader now fully operational, and with a unit test. All unit tests work now. Minus function / class documentation the system is pretty stable and usable. From b9ffe592c42f8126f0f98b269e8fa8ab1c5ea5a4 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 7 Jul 2011 22:32:47 -0400 Subject: [PATCH 051/214] Now supports files without indels calls in them From f7b7467139c8192a2d6ef1e9fe3e01ecc080c32c Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Fri, 8 Jul 2011 12:28:46 -0400 Subject: [PATCH 052/214] Moving the private filter package from sting/filters to sting/gatk/filters, updating package name and imports. This was preventing walkers from running. (Thanks, Matt!) 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 5f35c182c2..ddeda1699f 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 void normalizeData() { } 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 ExpandingArrayList selectWorstVariants( double bottomPercen 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 @@ private static double decodeAnnotation( final String annotationKey, final Varian 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 2c51f02d65..2d0355d7dd 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 @@ private void createVisualizationScript( final ExpandingArrayList r throw new UserException.CouldNotCreateOutputFile(RSCRIPT_FILE, "", e); } - // We make extensive use of the ggplot2 library: http://had.co.nz/ggplot2/ + // We make extensive use of the ggplot2 R library: http://had.co.nz/ggplot2/ stream.println("library(ggplot2)"); createArrangeFunction( stream ); @@ -378,6 +378,7 @@ private void createVisualizationScript( final ExpandingArrayList r } } + // The Arrange function is how we place the 4 model plots on one page // from http://gettinggeneticsdone.blogspot.com/2010/03/arrange-multiple-ggplot2-plots-in-same.html private void createArrangeFunction( final PrintStream stream ) { stream.println("vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)"); @@ -402,5 +403,4 @@ private void createArrangeFunction( final PrintStream stream ) { stream.println("}"); stream.println("}"); } - - } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorArgumentCollection.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorArgumentCollection.java index f597fb1285..e1a8159132 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorArgumentCollection.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantrecalibration/VariantRecalibratorArgumentCollection.java @@ -60,7 +60,7 @@ public enum Mode { @Argument(fullName="priorCounts", shortName="priorCounts", doc="The number of prior counts to use in variational Bayes algorithm.", required=false) public double PRIOR_COUNTS = 20.0; @Argument(fullName="percentBadVariants", shortName="percentBad", doc="What percentage of the worst scoring variants to use when building the Gaussian mixture model of bad variants. 0.07 means bottom 7 percent.", required=false) - public double PERCENT_BAD_VARIANTS = 0.015; + public double PERCENT_BAD_VARIANTS = 0.03; @Argument(fullName="minNumBadVariants", shortName="minNumBad", doc="The minimum amount of worst scoring variants to use when building the Gaussian mixture model of bad variants. Will override -percentBad arugment if necessary.", required=false) public int MIN_NUM_BAD_VARIANTS = 2000; } From 38d9b9b5687803de5678c7515fe31c885ce5b5c0 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Fri, 8 Jul 2011 13:13:58 -0400 Subject: [PATCH 054/214] A printf from debugging made it in in some prior commit. The read transform adding the AI tag can cause an exception for widowed reads -- added a check for this case, preventing blowup. From 2ea36b06cc78bf801f788c028a8afcd0a77604c3 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 8 Jul 2011 14:04:00 -0400 Subject: [PATCH 055/214] Really works now with files where (1) there's no functional annotation and (2) there's no indel calls. From ae02eabc93382e14d1304404a89a22dddd6c333b Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 8 Jul 2011 14:04:59 -0400 Subject: [PATCH 056/214] Since it now works with all classes of variants, should really be renamed From 8de82f397438f26b93d793ea37e5aa734a5f7344 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 8 Jul 2011 14:07:28 -0400 Subject: [PATCH 057/214] Updated names to be more reflective of the fact that this works for exomes and WG now. From 885ec5809301e5635c1cb27932eb90b1a8bd14e2 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Fri, 8 Jul 2011 17:24:26 -0400 Subject: [PATCH 058/214] Overhaul of the PreQC plots, with more distinct separation of current dataset vs. historical data. From 125b488a0cce252144a10259bd4517ba984c712d Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 10 Jul 2011 18:15:17 -0400 Subject: [PATCH 059/214] Reports the insert size distribution for each sample. From feef50802c16e06942b570ef5f4af90070b02cc0 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 10 Jul 2011 18:29:39 -0400 Subject: [PATCH 060/214] Formatting change From ef17e5db322dc9eebd5b2a5c74f0af202bd3d8b8 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 10 Jul 2011 18:56:21 -0400 Subject: [PATCH 061/214] Reports the read length distribution for each sample. From 42583ee7879fd6f4ee5bc91e56eca9a8657d8338 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 11:55:28 -0400 Subject: [PATCH 062/214] Incorporates information from RBP so that triple hets and sites with missing information can still be phased. From d587856f2da597b289c7c9ebdc38a231f82a06ad Mon Sep 17 00:00:00 2001 From: Guillermo del Angel 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 80a497d33f..c601627282 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 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 void set (VariantContext vcP, byte refBaseP) { 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 void set (VariantContext vcP, byte refBaseP) { 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 void initialize() { 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 @@ else if (!SELECT_RANDOM_FRACTION || (!KEEP_AF_SPECTRUM && GenomeAnalysisEngine.g 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 41db509a17431942f6b4b52f45b942207fc0b158 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 11 Jul 2011 15:20:01 -0400 Subject: [PATCH 064/214] A simple python program for downloading S3 logs in the cron script. From c04ffc57f2d9ebae676bf9ed99a5e453385209fb Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 16:01:50 -0400 Subject: [PATCH 065/214] Added some code to print out sites where the haplotypes between RBP and PbT don't match. From 7c387eaa4755a9725eb32e04d426c2ff4dfb8b58 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 16:08:33 -0400 Subject: [PATCH 066/214] Refined some code to print out sites where the haplotypes between RBP and PbT don't match. From 6ada358f759b6ba457d9c1de5d3ac02d2c99908e Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 16:11:32 -0400 Subject: [PATCH 067/214] Refined some code to print out sites where the haplotypes between RBP and PbT don't match. 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 6ff0384a07..4b4ebe450d --- 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 GenomeLoc getLocation() { } 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 a9ba461594..901de6fae1 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 @@ private Allele(byte[] bases, boolean isRef) { 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 f5a1d8a40f9175e9d4c567b1972c6e5beefc79ab Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 17:19:40 -0400 Subject: [PATCH 069/214] Count the number of phase error, phase correct, and total phaseable sites From 7a8927545812479e168828965c34d974236eba38 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 17:25:02 -0400 Subject: [PATCH 070/214] Count the number of phase error, phase correct, and total phaseable sites 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 754d28dfd3..ee66b50ee0 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 @@ private String getAlleleRepresentation(Allele allele) { // 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 f287549bb8..a670532af3 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.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 List getDescriptions() { 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 82f16be429..e2fd2a3d45 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 Map annotate(RefMetaDataTracker tracker, ReferenceContext 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 31251c0897..2307733104 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 @@ private void writeInfoString(Map infoFields) throws IOException 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 @@ private void addGenotypeData(VariantContext vc, Map alleleMap, L 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 a799161ad4..49f9ab1843 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 enum SupportedHeaderLineType { // 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 enum SupportedHeaderLineType { 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 @@ protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, 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 @@ protected VCFCompoundHeaderLine(String line, VCFHeaderVersion version, Supported 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 @@ private void validate() { 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 boolean equals(Object o) { 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 695c46c27c..91cf86c702 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 352be3e97a..f68cb670be 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 VCFFormatHeaderLine(String name, int count, VCFHeaderLineType type, Strin 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 0000000000..d615c7c78d --- /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 135a5c1a16..9b20f38a15 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 VCFInfoHeaderLine(String name, int count, VCFHeaderLineType type, String 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 | 42 ++++++++++--------- .../queue/engine/lsf/Lsf706JobRunner.scala | 6 +-- 2 files changed, 25 insertions(+), 23 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 bfcc4d48c9..8ed3f84c11 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("Removing original jobs.") + this.jobGraph.removeAllEdges(scatterGathers) + prune() - logger.info("Adding scatter gather jobs.") - addedFunctions.foreach(function => if (running) this.add(function)) + 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("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 57d133dfe5..ac2f036b4a 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 2d129762547d108b4d643ac1424c15c0def89655 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 19:44:15 -0400 Subject: [PATCH 073/214] Restored ComputeSwitchErrorRate from old SVN repo From 48e5078497a8871d0e2ace6ca402cc052dd5fcb4 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 20:40:26 -0400 Subject: [PATCH 074/214] Restored ComputeSwitchErrorRate.java from old SVN repo From e0c03c2c06760e0628727b3b5fc753e80beac6ed Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 20:48:17 -0400 Subject: [PATCH 075/214] Fixed imports From 7d579a5b958a480cf24db4bf606e60d5bb15aa55 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Mon, 11 Jul 2011 22:45:57 -0400 Subject: [PATCH 076/214] PhaseByTransmission now sort the samples in the VCF 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 b469c8a41c..b3e422ba9f 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.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 static String assertMatchingMD5(final String name, final File resultsFile 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 static String testFileMD5(final String name, final File resultsFile, fina 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 33a20f7b52..600718aa08 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 @@ * 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 void combineComplexSites(String args, String md5) { 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 0000000000..f7a395d9d9 --- /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 0000000000..eff24bb889 --- /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 0000000000..ba2713bff3 --- /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 0000000000..0720e18c0c --- /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 0000000000..a08108db28 --- /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 0000000000..7245e9e8d0 --- /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 0000000000..84c2eed103 --- /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 0000000000..6627a4cc51 --- /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 0000000000..743178538d --- /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 89792ee0f7cb382283912f555f428b5dfa10083e Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Tue, 12 Jul 2011 00:03:12 -0400 Subject: [PATCH 079/214] Prototype for incorporating RBP information into trio-phased data 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 143722d7c4..ed10d20727 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 @@ 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 7a765c602d..fe0084a191 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.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 @@ else if ( source.getName().startsWith(VariantAnnotatorEngine.dbPrefix) ) { } // FORMAT and INFO fields - headerInfo.addAll(VCFUtils.getSupportedHeaderStrings()); + headerInfo.addAll(getSupportedHeaderStrings()); // FILTER fields if ( UAC.STANDARD_CONFIDENCE_FOR_EMITTING < UAC.STANDARD_CONFIDENCE_FOR_CALLING ) @@ -167,6 +166,20 @@ else if ( source.getName().startsWith(VariantAnnotatorEngine.dbPrefix) ) { return headerInfo; } + /** + * 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 + */ + private 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, 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 2307733104..f4996b4876 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 @@ private void writeInfoString(Map infoFields) throws IOException 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 0000000000..a9de949d85 --- /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 49f9ab1843..bb822f2edf 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 void setNumberToUnbounded() { * @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 @@ protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, * @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 @@ protected VCFCompoundHeaderLine(String name, VCFHeaderLineCount count, VCFHeader * * @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 9176fc16e6..418b800742 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 VCFFilterHeaderLine(String name, String description) { * @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 f68cb670be..474c8dd143 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 VCFFormatHeaderLine(String name, int count, VCFHeaderLineType type, Strin } 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 0000000000..152043f289 --- /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 ecede068e4..4037f75b99 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 @@ else if ( line instanceof VCFFilterHeaderLine) { 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 23f2c5fabc0b45ce52fa6b6e482dd2dfc8bc8ed4 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Tue, 12 Jul 2011 01:31:58 -0400 Subject: [PATCH 081/214] Fixed a bug where the first variant in a haplotype was not getting phased properly. 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 80627fae04..068c69316e 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 0000000000..cd6c3598a6 --- /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 0000000000..534416d294 --- /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 0000000000..5738b643f2 --- /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 0000000000..da272ec30c --- /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 0720e18c0c..3e1be86091 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 Collection getCompoundElements() { 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 f7a395d9d9..a5ebf27bb3 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 @@ * 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 DiffElement readFromFile(File file) { 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 ba2713bff3..54a7a464d3 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 boolean canRead(File file) { 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 a08108db28..fe411b1956 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 Integer reduce(Integer counter, Integer sum) { @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 void onTraversalDone(Integer sum) { 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 84c2eed103..af5771c55f 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 743178538d..06d14366ff 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 5738b643f2..baa2f0383a 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 void testVCF1() { 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 void testBAM() { 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 b2ade16debe884bb71892d01fa955d55898785a5 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Tue, 12 Jul 2011 11:43:03 -0400 Subject: [PATCH 085/214] More detail in pre-QC plots, plus much improved handling of samples with special characters in the name. From 40622e55d49d2ec05607739310c414a2fd02e4f1 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Tue, 12 Jul 2011 12:37:28 -0400 Subject: [PATCH 086/214] Further changes to project consensus indel script 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 0000000000..cecbedda86 --- /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 7e6fc5e828..e49d4117c5 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 0be737897b..51d2907630 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 @@ private Double annotateSNP(AlignmentContext stratifiedContext, VariantContext vc 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 ed10d20727..f3ec2b1df9 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 @@ 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 11f86b9726..8260a5a810 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 @@ protected void fillIndelQualsFromPileup(ReadBackedPileup pileup, List re // 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 @@ protected void fillIndelQualsFromPileup(ReadBackedPileup pileup, List re 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 ba3e2cc8bb..3b64abfff2 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 Map annotate(RefMetaDataTracker tracker, ReferenceContext 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 6e80c7555c..1ef7ccd0b4 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 @@ else if (context.hasBasePileup()) 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 1a967293fd..f00abd6a1f 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 @@ else if (context.hasBasePileup()) 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 fe0084a191..fc8a5819a2 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 @@ * 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 @@ private static Set getSupportedHeaderStrings() { 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")); + result.add(new VCFFormatHeaderLine(VCFConstants.PHRED_GENOTYPE_LIKELIHOODS_KEY, VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification")); return result; } 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 048dbd8cbb..3b94989aa3 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 @@ -30,7 +30,7 @@ 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.ZeroMappingQualityReadFilter; +import org.broadinstitute.sting.gatk.filters.MappingQualityZeroReadFilter; import org.broadinstitute.sting.gatk.filters.BadMateFilter; import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; import org.broadinstitute.sting.gatk.walkers.*; @@ -50,7 +50,7 @@ /** * 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. */ -@ReadFilters({Platform454Filter.class, ZeroMappingQualityReadFilter.class, BadCigarFilter.class}) +@ReadFilters({Platform454Filter.class, MappingQualityZeroReadFilter.class, BadCigarFilter.class}) @Reference(window=@Window(start=-1,stop=50)) @Allows(value={DataSource.READS, DataSource.REFERENCE}) @By(DataSource.REFERENCE) diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/SomaticIndelDetectorWalker.java index c2953d1d7a..1f05ddaf06 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 @@ -72,7 +72,7 @@ * if first bam has coverage at the site but no indication for an indel. In the --somatic mode, BED output contains * only somatic calls, while --verbose output contains all calls annotated with GERMLINE/SOMATIC keywords. */ -@ReadFilters({Platform454Filter.class, ZeroMappingQualityReadFilter.class, PlatformUnitFilter.class}) +@ReadFilters({Platform454Filter.class, MappingQualityZeroReadFilter.class, PlatformUnitFilter.class}) public class SomaticIndelDetectorWalker extends ReadWalker { // @Output // PrintStream out; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/phasing/ReadBackedPhasingWalker.java index e59b29502b..4833a6cadf 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.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 @@ @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 ee504b6e7a..6673bec92a 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.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 @@ @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 23054e95fd..fad2320fcf 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 @@ * @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 f4996b4876..a8bf747075 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 void writeHeader(VCFHeader header) { 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 6ba6926c6d..e6300e6c9b 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 static String baseTestString() { 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 void testHasAnnotsNotAsking1() { 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 void testHasAnnotsNotAsking2() { 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 void testHasAnnotsAsking1() { 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 void testHasAnnotsAsking2() { 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 void testNoAnnotsNotAsking1() { 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 void testNoAnnotsNotAsking2() { 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 void testNoAnnotsAsking1() { 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 void testNoAnnotsAsking2() { 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 void testOverwritingHeader() { 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 void testNoReads() { 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 void testDBTagWithDbsnp() { 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 void testDBTagWithHapMap() { 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 c4f6d5ebc3..c75a5b2dc9 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 void testGenomicAnnotatorOnDbSNP() { */ - 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 void testGenomicAnnotatorOnIndels() { "-o %s" ), 1, - Arrays.asList("caa562160733aa638e1ba413ede209ae") + Arrays.asList("772fc3f43b70770ec6c6acbb8bbbd4c0") ); executeTest("testGenomicAnnotatorOnIndels", testOnIndels); } @@ -76,7 +76,7 @@ public void testGenomicAnnotatorOnSNPsAndIndels() { "-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 70c34e7291..fef1b6e649 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 void testBeagleOutput() { "-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 void testBeagleInput2() { "-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 void testBeagleOutput2() { "-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 3d75fdc44f..7bec67d2ef 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 static String baseTestString() { 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 void testNoAction() { 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 void testClusteredSnps() { 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 void testMasks() { 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 void testFilter1() { 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 void testFilter2() { 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 void testFilterWithSeparateNames() { 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 void testGenotypeFilters() { 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 20fa7719f9..1f23d262e6 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 void testMultiSamplePilot2AndRecallingWithAlleles() { 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 void testWithAllelesPassedIn() { 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 void testSingleSamplePilot2() { // // -------------------------------------------------------------------------------------------------------------- - 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 void testParallelization() { // 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 void testParallelization() { @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 void testCallingParameters() { @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 void testOutputParameter() { 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 void testConfidence() { @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 void testMultiTechnologies() { " -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 void testCallingWithBAQ() { " -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 void testCallingWithBAQOff() { " -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 void testSimpleIndels() { " -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 void testIndelsWithLowMinAlleleCnt() { " -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 void testMultiTechnologyIndels() { " -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 void testWithIndelAllelesPassedIn() { 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 0ed16967ac..1bf3e579ff 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 void test1() { 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 void test2() { 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 void test3() { 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 void test4() { 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 void test5() { 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 void test6() { 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 9600046da7..2fec2e70ff 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 VRTest(String inVCF, String tranchesMD5, String recalMD5, String cutVCFMD 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 600718aa08..daaab9425f 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 void combineSites(String args, String md5) { } - @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 void combineSites(String args, String md5) { " -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 void combineComplexSites(String args, String md5) { } // @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 d32ab6282c..82c894c6f7 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 void testb36Tohg19() { 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 void testb36Tohg19UnsortedSamples() { 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 void testhg18Tohg19Unsorted() { 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 e18287a215..b5f41542ef 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 void testComplexSelection() { 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 void testRepeatedLineSelection() { 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 void testDiscordance() { 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 void testConcordance() { 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 cf0673ee69..d7efe42120 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 void testSimpleVCFStreaming() throws IOException { " --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 64d0db14b5..8421076c94 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 void testVariantsToVCFUsingGeliInput() { @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 void testGenotypesToVCFUsingGeliInput() { @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 void testGenotypesToVCFUsingHapMapInput() { @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 5d42f8d0c9..a344817a0f 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 void testToVCF() { 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 eff24bb889..4c3f7bd95e 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 DiffNode getValueAsNode() { 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 54a7a464d3..6d85df71dc 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 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 List diff(DiffElement master, DiffElement test) { 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 List diff(DiffNode master, DiffNode test) { 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 List diff(DiffNode master, DiffNode test) { 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 List diff(DiffValue master, DiffValue test) { * @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 @@ protected void printSummaryReport(List sortedSummaries, Su 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 @@ protected static String summarizedPath(String[] parts, int commonPostfixLength) 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 static boolean simpleDiffFiles(File masterFile, File testFile, 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 3e1be86091..2f48de2d36 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 void add(String name, Object value) { 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 fe411b1956..ecb836af97 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 Integer reduce(Integer counter, Integer sum) { 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 7245e9e8d0..3750496a1f 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 String toOneLineString() { 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 6627a4cc51..efc6ef1606 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 toString() { - return String.format("%s:%s!=%s", - getFullyQualifiedName(), - getOneLineString(master), - getOneLineString(test)); + public String[] getParts() { + return parts; } - public String getFullyQualifiedName() { - return (master == null ? test : master).fullyQualifiedName(); + public void incCount() { count++; } + + public int getCount() { + return count; } - private static String getOneLineString(DiffElement elt) { - return elt == null ? "MISSING" : elt.getValue().toOneLineString(); + /** + * 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(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); + } + + } 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 0000000000..2fe9b47f8a --- /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 cd6c3598a6..96dfec6e8a 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 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); + 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 void test() { 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 da272ec30c..64579a01b9 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 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); + 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 7991d69ba471e7880edbaf27341b9b12dcc3014f Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Tue, 12 Jul 2011 15:25:43 -0400 Subject: [PATCH 089/214] I added experimental function in the ReducedBAMEvaluation. At the beginning of the scrpit you can specify a list of values to test and it will process the ReduceReadsWalker for your parameter. I also added a method to convert the number when naming files to be sort-friendly. 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 6673bec92a..c21f548b3d 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 @@ 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 @@ @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 b0f76229b0..129161da30 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 void testCountCovariates1() { 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 void testCountCovariatesUseOriginalQuals() { @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 void testTableRecalibratorMaxQ70() { } } - - @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 void testCountCovariatesSolidIndelsRemoveRefBias() { @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 void testTableRecalibratorSolidIndelsRemoveRefBias() { } } - - - @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 void testCountCovariatesVCF() { @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 void testCountCovariatesBED() { @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 void testCountCovariatesVCFPlusDBsnp() { } } - @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 void testCountCovariatesNoIndex() { @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 void testTableRecalibratorNoIndex() { } } - @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 c94401967875ae606fb80963aca4c83713a9e868 Mon Sep 17 00:00:00 2001 From: Ryan Poplin Date: Tue, 12 Jul 2011 15:44:45 -0400 Subject: [PATCH 091/214] Adding dev qscript I used to perform the exome t2d+1kg calling experiment From 775d2c2598acb6d7e6b62a1516f08bf1cc0b0664 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Tue, 12 Jul 2011 15:56:24 -0400 Subject: [PATCH 092/214] Added VQSR to the ReducedBAM evaluation script. Our tests need to address the annotations used by VQSR so we can actually measure the impact of changing the parameters in the ReduceReads walker (especially context size). From f68064eb9520bd605ec8cb6a60f90dbe99ab6a8c Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Tue, 12 Jul 2011 16:06:36 -0400 Subject: [PATCH 093/214] Change MBRC parameter to CS From 60870b360a4b58c7bf3023281d3ef9e0dd2306ed Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Tue, 12 Jul 2011 15:34:42 -0400 Subject: [PATCH 094/214] Fixed the calculation of the allele count prior, it was using ac instead of maxAlleleCount. From 30768eccbbb30231eabdf38ccdade62822fa0342 Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Tue, 12 Jul 2011 18:33:12 -0400 Subject: [PATCH 095/214] Big change to PSP2: Amplicon sequence no longer lower-cased for repetitiveness, but instead for non-uniqueness via alignment by bwa. Performance heavily dependent on length of sequence (duh), with size=30 a good balance, but default is 20 because that's the default length of a sequenom primer. Indentation changes to other stuff. From 95040d95b9f925219a725d4feefb0b19ec16569b Mon Sep 17 00:00:00 2001 From: Christopher Hartl Date: Tue, 12 Jul 2011 19:21:26 -0400 Subject: [PATCH 096/214] Adding in check for filtered site (Sorry Mark, looks like it wasn't checking the validated rod, only the mask). Also by allowing user to lowercase SNPs, could miss 'SNP_TOO_NEAR_PROBE', now we properly check for that. 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 a8bf747075..f7d09f16d4 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.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 void add(VariantContext vc, byte refBase, boolean refBaseShouldBeAppliedT } 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 @@ private void addGenotypeData(VariantContext vc, Map alleleMap, L 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 @@ else if ( val instanceof List ) { 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 @@ private static List calcVCFGenotypeKeys(VariantContext vc) { 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 f3c99e963d..c29f2ba8ba 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 Map createGenotypeMap(String str, List alleles, 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 Map createGenotypeMap(String str, List alleles, } } - // 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 0fb2940bb1..05fff5d9e9 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 Map createGenotypeMap(String str, List alleles, // 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 Map createGenotypeMap(String str, List alleles, } } - // 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 3a87f11965..0b5976c3c9 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 @@ 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 List getAlleles() { } 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 List getAlleles(Allele allele) { } 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 enum Type { 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 Type getType() { * @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 @@ private GenotypeLikelihoods getLikelihoods(String key, boolean asPL) { } 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 String getGenotypeString() { } 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 da80a34311..92c5d648bd 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 @@ private void validateGenotypes() { 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 3f87fc1a24..c88eac1494 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 void test1() { 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 void test2() { 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 void test3() { 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 009048c102..f855c1dd3a 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 void test1() { 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 void test2() { 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 void test3() { 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 7e1d861052..0000000000 --- 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 6450b48951a28fceed4e4a46cd9edf7ec080ad34 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 10:14:38 -0400 Subject: [PATCH 099/214] manageGATKS3Logs now downloads and deletes files in groups of 100 files by default. This should significantly improve the performance of the S3 log synchronization. From b04b8b20a51ecd6d03654d72449908667e4c5cf7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 10:22:32 -0400 Subject: [PATCH 100/214] Added support for -p log so that we can track progress without trying to ls a directory with 1.5M entries in it. From e86113e5378e6caccb943952481aee558c5e9b9b Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 10:27:24 -0400 Subject: [PATCH 101/214] Minor fixes for logging. Now logs even if you don't need to download the file (it's a complete log now). Bug fix for del logging. 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 7eb49da345..79134b5530 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 @@ private void writeRecord(VariantContext vc, RefMetaDataTracker tracker, byte ref // 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 0000000000..32ff25c7bb --- /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 f9369ee3f3..d6caabd23d 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 f7d09f16d4..e7ddac1859 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 @@ private void addGenotypeData(VariantContext vc, Map alleleMap, L 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 8421076c94..8c96c1e116 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 void testVariantsToVCFUsingGeliInput() { @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 void testGenotypesToVCFUsingGeliInput() { @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 void testGenotypesToVCFUsingHapMapInput() { @Test public void testGenotypesToVCFUsingVCFInput() { List md5 = new ArrayList(); - md5.add("cc215edec9ca28e5c79ab1b67506f9f7"); + md5.add("86f02e2e764ba35854cff2aa05a1fdd8"); WalkerTest.WalkerTestSpec spec = new WalkerTest.WalkerTestSpec( "-R " + b36KGReference + From d163a2106abbec6153bd86871fdbdcbb93d474f5 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 21:36:02 -0400 Subject: [PATCH 105/214] Now uses the log file to determine which files exist locally, avoiding the potentially expensive check on disk From 63c58c5f7e4e22d657962e1704581122ee9dd4b0 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 21:41:15 -0400 Subject: [PATCH 106/214] Log file no longer optional. From d6c1540e57e2bf145071f077595433e6e96a5dfe Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 22:37:49 -0400 Subject: [PATCH 107/214] Parallel version. From ae044af6787812a68ae0fae05bccfa975eb17d9a Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 22:39:58 -0400 Subject: [PATCH 108/214] Forgot to comment out a debug From db7a23d89631f754f86573c98de533202e922708 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Wed, 13 Jul 2011 22:58:04 -0400 Subject: [PATCH 109/214] Added check to only evaluate phased genotypes, in case I ever want to use this program on another file that's not guaranteed to have every genotype phased. From 1390f354dca6f3d816ff1503f29ce4ebd17d60a4 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 13 Jul 2011 23:12:19 -0400 Subject: [PATCH 110/214] Giving up on parallel s3 fetching. The solution here is to do incremental processing, and not try to download 1.5M records at once, but obtain the ~10K per day that are appearing. From ad373ffa7e1d2e1ddf1e01ec2bfa8991f84674bc Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Thu, 14 Jul 2011 09:12:43 -0400 Subject: [PATCH 111/214] Broke down and implemented parallel get. Now running 10x parallel no problems on gsa1. From 0f568b50fb98f64f7a80caca9e3fef23ff9917b2 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 14 Jul 2011 09:51:54 -0400 Subject: [PATCH 112/214] Curating the dataset based on 2*sigma filtering, 6 month timestamp. 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 01344a117f..710127f7a1 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.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 @@ protected Object createHeader(List headerStrings, String line) { 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 Feature decode(String line) { } 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 @@ private Feature reallyDecode(String line) { // 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 @@ protected static boolean isSingleNucleotideEvent(List alleles) { 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 0be4bec912..17c4a7df4d 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 MalformedBAM(SAMRecord read, String message) { } } + 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 2e45f2fb61bd7778324078bf3c32ba0084535207 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 14 Jul 2011 13:13:15 -0400 Subject: [PATCH 114/214] Cleanup -- get a lot of the common plotting operations into functions. From 2d95c71a1c59f0e0554d59088d070567e50cd190 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 14 Jul 2011 13:49:27 -0400 Subject: [PATCH 115/214] Integrate mean/sigma markers into generic plotting functions. 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 06d14366ff..5677574bd3 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 @@ 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 DiffElement readFromFile(File file, int maxElementsToRead) { 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 baa2f0383a..a0cb47770a 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 void testVCF1() { 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 1f9a730587c88ecf3713cea3a722faa9b0c929df Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 14 Jul 2011 14:29:06 -0400 Subject: [PATCH 118/214] Adding density plots to all the existing simple scatter plots. 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 5677574bd3..a812babaf5 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 DiffElement readFromFile(File file, int maxElementsToRead) { // 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 dacaf27381..d65f4ec342 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 void maybeValidateSupplementaryFile(final String name, final File resultF } 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 04b7f2fc6acbb0f96c8546603ea7271c7793bf86 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Thu, 14 Jul 2011 15:16:19 -0400 Subject: [PATCH 121/214] Color scheme consistency. Eliminate density plots that really have no meaning (mean target coverage, bad cycles). From 6620ebd8d8bf9ab0b204fcedc6c4692efe240ac5 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 14 Jul 2011 19:16:14 -0400 Subject: [PATCH 122/214] Changes to indel VQSR consensus creation script From 0162426b99a6995fd3aa9fb16cd262c7803151f3 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 14 Jul 2011 19:35:39 -0400 Subject: [PATCH 123/214] Log chromosome combine job in meaningful file From a36f9c4f6bf5587e220de898811a9d4b9fa8d5d9 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 14 Jul 2011 20:22:58 -0400 Subject: [PATCH 124/214] Updates to VQSR indel running script From 0e9b81283b6881ceb729d89567c2fef872964cf9 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 14 Jul 2011 20:25:50 -0400 Subject: [PATCH 125/214] Further bug fixes to VQSR indel running script From c0889df90e529cba0a038800c05155793dfea971 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Fri, 15 Jul 2011 09:27:04 -0400 Subject: [PATCH 126/214] Walker to compute missing genotype error - a metric to assess the quality of imputation From f10fa3180eaee407da95e46980da260999b8333e Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Fri, 15 Jul 2011 09:38:21 -0400 Subject: [PATCH 127/214] Bug fix to walker that computes missing genotype error 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 d8340b761f..e7448b43ed 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 static abstract class Getter { public abstract String get(VariantContext // #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 c2c8df49e158b662bef3434cc19a563139365348 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Fri, 15 Jul 2011 13:46:24 -0400 Subject: [PATCH 129/214] Can specify the phasing/child sample on the command-line. From 28274187e20283575a123584f4c3dd5ab93bb8b4 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Fri, 15 Jul 2011 14:22:22 -0400 Subject: [PATCH 130/214] Added summary page incorporating core project stats. From ce4d702e25e1041378a47cea0ce2eef2961cbf42 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Fri, 15 Jul 2011 14:36:37 -0400 Subject: [PATCH 131/214] No-calls and filtered genotypes are now properly considered missing From 3193a3a992a7a18d91459a60325f63ae41c98a3a Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Fri, 15 Jul 2011 16:25:01 -0400 Subject: [PATCH 132/214] Moving the PostCallingQC script to archive. From 891c5d84d92209936a26af15be6d2220a6858675 Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Fri, 15 Jul 2011 16:36:25 -0400 Subject: [PATCH 133/214] Changed ReducedReads Quality to # greater than Quality Equivalent (argument added but not yet implemented) Changed ReducedBAMEvaluation ot accomodate all three parameters (consolidated CallingInterval) From af6c4e30c731350e75be10f3a5c7bf919770013f Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 15 Jul 2011 16:51:05 -0400 Subject: [PATCH 134/214] Deleting some useless Queue scripts Restoring two useful scripts to private repository: manySampleUGPerformance.scala [calculates performance of UG and other tools as a function of the number of samples] PostCallingQC.scala [VariantEval of a call set + R scripts to create pretty pictures. For the pipeline team to eventually own] From 93ec4763ee0dc048bfe5a09f528d0ae499aad69e Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Fri, 15 Jul 2011 17:34:33 -0400 Subject: [PATCH 135/214] Adding hard filters and making it the default test mode of the ReducedBAM evaluation script 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 1d9616aaca..fbe6e5b5a5 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 @@ else if (context.hasExtendedEventPileup()) { return new PhasingStatsAndOutput(phaseStats, completedList); } - private static final Set 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 9bdf36bb69e24eb8091b5d510513aafebea1b696 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Fri, 15 Jul 2011 17:48:42 -0400 Subject: [PATCH 137/214] Refactoring to enable object-oriented version of haplotype calculation From dc6edf56f3253902c6bcc4855def1535e24a10f3 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Fri, 15 Jul 2011 18:34:22 -0400 Subject: [PATCH 138/214] Walker to use RBP and trio to determine source of de novo het SNPs From 2ca84ebeaaced2636deca184005618f22b5a2b7d Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Sat, 16 Jul 2011 08:12:06 -0400 Subject: [PATCH 139/214] Request more memory for final combine job or else it will fail in large chromosomes 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 zcmb@v2Y3`m(l=f`v%9mq8l_c0DS9L_$U&p8LMzF&2(Rtx6d@B2T`U$8ShGdeh=c7|a zgBFd%u!Eo59)6aHp0%c~(Y(P!nqkHLPIm+^|BEYlPXDdU{9Bt(lZk&hHVT^m&qX{oecG+}=|uc13VyjDDR?@$>(PHDJ)vIM>-|~1 zuqSP&y3^OUT_sL-8>SL%S-MKt{mTq4IJmm+Ac?>uedoDl!ZGv#1?KT#wKB`m&ST%Q z$-LiA>?^bMp41X26YnoLrSjgtC^1Ujd9wD#XqhNo7j#OjJ=$AW-E9)_F9%qAt>v%j z$wxCbJ!Epm;7d33lP`!HE8H<$&C3^zf9I-LqN`%9cgKko>-1~7CV7}x~kgB>c$Zb)nnGItyq~?xw4|M z@%O*{<|JCGfL6K5L4(}nrNMkCa?ubP>ZD?WhPi1tl{jgHlSXo;QBE4|rZF^@vy5}n zcz!;?NfX_;o@7v|n>;j`4^#Ls)lJi=$W2kxX@(1sXBspsIPT<%+nYq9L@e$C#D-X# z-_*Jqj@r7a>h*oCij7*2SeY&mq*bpGB<2S*Pi0td@6+Og&peV69QRD2-C0w+vf8@& zpQ3XxKPFiR7Qw!cruI#|0CwK;ic2d@N~3g>a`}))`3B84X%5W=^d5EAnyW-Yz@T|1 zmC<}broy7g*Q2pVUHfH$x-@A4T_Pyn=c{IdHumc6EB5tR(xc9xg(fYc#U_sF@7Gv0_*6mi6j)ziQUxs$ROG|ow1(Qcrbb`=+9qF9!`f^sshGbYJP2f{#X!*Yre#!YN|15DJ?Uo)}ZAkt)P`A zrBY`>z3Us6<}a~opA*rtZDKFL)cRtyo@_n!XOV7|y{jb~j@67?O>j-mWUGruOSP`_ zpi$occjlOQS?+4rmSAcrPr4=jJR!^-Fl-z56@6uo87$QioZfHP833eq~ zBdB!_zHlr$#;B~Qn^9eX3hBLi&$qr9CbENx&-4r){V6p#w)E9s?v8=od0A)CjpKShpaGUoDy(}s&O z9l2(<-*Sa++0?Dk4!>YSo>{ocLS<6%yeCo`@+49(>J6}{26AQNoP(c(H1lVgPcG(W zywL^s1|vWJB^{w?PfRlfVmT4lOtH3Bif816M9w3Lk_`!;LveUN5uL%s9U=s$9;Gp) z^b_PM^S4k!X?8Ou?xHB1l3FSG5C|y_A%m)GGTD(H01$-$H;__*NM}^i7r^ag1&R7l zUtGCRRsr=xIa~)PiL;bqP=BNbglmz3r~GHMQm3Po(t)-^K8V4w5RWw)*fCJC#FQ_E z4rw^oH(0;P*5a%~uj^)1`-p~&N2fg3q{RPoFILG!Fy{}2Qi@jp;Wa6aj~4yqGnW*! z+3)w0V%7L<=U6{z;@7N0&uS^wG>>ptH^*wx!A+k>S@~~4I6wIQkHS8UY+`!wfe#Ah zTZgZHXv4R?h`#M*m1OA=Z&`CREjDn%pdVcHBmLy0pA9uxD&JoQQF-{T7=Qua{_+~s`c$^}^4a^elZJ|G> zNOA@6B-s$1IA@|EQn(kp;HVHAD@03J|5hx7zFh~h8itk~V5@L*7j1}Yf z!FWDQ;G!lPVv->y8v=teWrP^>vMgs5|=pCp(3$SkSm& z{AWFav0D?F`{Jy}J;E9M{b#ETRA{y#>aFSVT0(I8=U>|ehOfRmw|0~Hg6qGSVw9r= z46*v?%U_J+R#;<-2GJ;}mm0o!Q1jK*H(?}cY^tcMtoGH{_(m*gY-*^eY_i&()=~n7 zXfnlGaj6NRwn0!2^`h_6>V`(3S>$V4R@><7QRT}l_SH8nt8PFVqoG)5iuK|$6Ro@1 zq?_nwj5DD(<)Bwx#bZ)#W6U+_D!M{YF24|1*{Fs&^~TKF4dJ(bRptgR^Kz56 z@Y~tHE^gM$_5v?>)ugSo4U*~CuS^b%9?<^MuduwD3DPa}Qq9VWrH$=be+B;Wi1Xp~U<~YpU)hD>)NJ@AZaGLa-ID&3wZH|WW^3J!0 zew4lne*A5g;|b=;W5ML_vZ9(z(IQ$+aa{a{^9>Ac{I1ygYP8<>f6=R~g0IA);4>pL zj{fz#g}Nm?+8As8emyn#@=ra3oqztHfDNNY6GcOYqCSu|F6IE7Q|WTL0?)2QT7wFh zN*m9+wsCjHGaL6%c}Aa;XY?LHzfrSC@I+@;%_rRhg0-+l>pnw~ZvAw{d z&;P4me1tTQ4pqulre{Nsvd`5IW}hZ8+5ZGN za`3yGvN(%jms$93D>-MD+4vc!ngjA3JaFNb>wX%*$>%A){SNfC-Q;5!QDGP^1;7<5 z5Lr#UY~H#{6&4-NXtq*}$}3X}KV*+Z_E?oYpn2lL`D4TRWh$IM9{J;&$rHjPA^bwT zf*#+2Ng}c)hH9M@&X*XjwM>NpC+7s7pyX!i6oQ-*ej`~yPVRv01!QkW*3@uTugdBT zWwjkd3+uE4#|=`q9EGMEO);?kGH5LH*9p*0Cqbtxr5Q9i0L6707;rjTdInyaO?Sbr zI!SZsG*r|-z*_p0E}_q9F*KZVkwO(B6&6Ylsup80c8;f7F^86mH5f1(sZMOBda;LA zi@nrHJAr^t@eBp&R$PI5=r+0?9F-+DkcE311@6Fo4@DW?vs7Tvu8g$2Jb$j=k4%t= ziuu6DI#NVKpwV{ri(};SCsNumGSw;8@9A<3EOUf1j*-KEf_!BylzEJjJCa`3MKwv3 zEOaqKC$mABby1){6yE{V35sbt=+zy)E+74;2>p&LV5)LM6=0n9gm4-I0IX?8qmZs; z*)7zqg}Qf?;+7A$0>Cy2NGa3N?UX==zY9+U1sLYu5X`Z7iD9}?&mR74)UyL%43iQ) z)`kx2qU{kt-C>|^0No5&4D;>~ObhQZ%uxy^`W@3K8@-Ilm<|3jnUJ^BVKtt{$!*+mddIvKr8)B~nshTA&1d>_EPFhR}!@M`# zLc>DTL~T){4%}7KK#I`;+Sy^~IKl`z=swvtg6^jWLiiPjfVqI57sgaiMocl3LhSK~ zy1K%kTquK^S5eD|}U^4$6z4RscsQy5spfXIMSE-)P zpmV+k#(P~-p+72E59WJ>9tFq+$p08U4rr)!xEXGyLv$F8pwkU>1l?Stqj=6-6i}}| zfmfN0Ow!KL0%6dxpJ44a;|`C{EqDQHOo*mkaF1!a(GNZttRxO3Kr4+&B%pX{ez47WIKtJb!c()i^md?>Op z(R01FW*Rp4K->Er{4o+VBl;gu?`;UOe?ZK?0~f@*5M=Mcrhgy8{-2QX|Dt*H5iO*D zQx$zowe%lQ?Gp-YfPlXe0-k#+ld_iL={Mk69gm~HXxmWRg%IRVO0uEWVWMuNr!Y{6 z5Z&~jY1&yb#ZM?cl5S8T72P1^big9;o~+&;iatTZ17)6)78-F%AC{hW4<&F#=koKp zTXk`u?X!+bb^-enEN(mf1aHgFP*={Pq;rrsKf|}uCh=!aOcMT`2CmEi*L%7;8 z_B}0Y!mS-mdf+T2z?C6@cVYzIf}R0O%02{_h#GxjPteFRv;hX;Q7tt35CB970Psx5 zfDs!iSSee-1(BWuXDe{q0gl;+yT3O(&`e`a)7T=L*Y*P0#UZaPE&Vu+)4{Okb${WZ zXpul3kxYpghTB^UV8V6m5|TB1?}bonbwNjBT12B&e}~SbxLkT~5)E{$>sbD2=v{)9 z^$>>l;mi#+gqdWAl>S+ontfy(j)r0_>4!c$Lus`GF z83(9z@(G$%c7kR@shH!L+f4J+%Vo_pKc|Hjocg~#hcE;nukF-fN!1ZF9xh1Sij?hBSB73{y&q{lUlUNyUrNzxu z?ze&eD@r-%l8_bg1XZ#YuAcLQs_=vAjt9(Ns`DxSnn>NmBQNQ#DrR}eKxnN;>9cwJ#yITEQZ$+%`klH;2CR$3h* zoMKJ@M4O8aSq7Kge6Z3bG)XL^bz%|xDdk|J3c5>F!lJIG zx5ZLP)Ea53M$z9f;(6S)W?lL-4C-pcDZmv!b28{wYUse!!S)A< zNL$Al0;-0tFKjk;FM)9cyKfi>eH-rTY^CvEOah5kYCK8{9Y-mH(H7Fwl4xUIgl9T5 z`VRLs`kpSuITaPCL9VqKP`L((96IQ5!FyYZj_W#aZlL8iUR*9`Yg^(I zMPfH6&m8pLGrFNAccA#AtM4Dtp09%Y&VUB5K_hw{^OkQxFMI>T;hQi@{!D|==|_QY z$AfcA>1``_gt%V3YaJgUCcEATd;JrLeqhCp6qCe9)`F2@u=uxi+ek56d}94)q`0&9 z7l8Z~y3RM?;co%`J18DMK+F0GEP9TLp@-TN;$s<08> zZ`x$gW`nN6!~kt^gOu{H)eTi;8y~KAv$Myb>!N`1c7v{W1M3^yaPZv3xo<}@cQ|P`Pb%MuiPb#@-Q~vMyw{++-54(R8MNOGPr^NJ zK)KgNL+L(F-5&*W=>Q)d(@}$-u4c>;Zk%pfkZ8xy6>h3NtAs z^qPgq(gBVV`jeoZ(m}a;u!sea5_;X5o+a`JBlQMP5@YW7O`ZkDbg@BinP6^U`4{@D z2^Rmm3I2ZDgb04egzSCKWXWnh&2CkonE`N()MRDO7Dd**)uN~V0e#3b=t%{T97-0k*5n#7!b4$(Ua5+cM*PYu(5@ea)4$Q*-ntR%#-T( z+TeCN#h2-2obGa}$oMrpUy<|I@B$JbP)zX}r?L-0JWZo=v|7AOZ3&%sLQL_Ky{P&= zX#PiWe+yE4twUsWc=9w5&<4UeK(r{3tuw~GObD}{n04+;Qz3|^f%-G>WF}HjFXzE{ zE5|5Z2@hU1Qk!TAK+lF*HwPohTsUIpp_m0I>=L*r7NYP96u%hbW;vv31@yv7*=DOz zTqb1Q1eyp0dSX1Egp?hHW}x`VK&TqXOaTfuz>Y@YoVqoD#-9e~q74AmW5gywB+rm4 zumY#ZV4@ zQFyMLJoSW}s7(^8 zQdV7IsICxHhP5(;?HwQ#8#e_xepp>u0#;8?onT({+6ASdnR<`R!O@?2oU&~&!~UHU z;G4%Or`?|9s&HfjVXh$>Dq14^onH7myTb?269Wr(Pqw1HXzo>1CrMKfMyUWkfz`62 z1<;ooP%CaD_(7w+XlF>35So)iM2+%v7u62v{sQ5r7Z$Z z++ZmuC>K39Z!$;$Ulj~ge>TeK+d*9Rn1cSdLS?xP9qRUo!cxM8rGyG|LSvW()r8w_ zEv90mJVGwzvPcRQHYL{&CmKr1{Z&bXF64x|8$nb@2!$JZTw$i|(iV`EO`z~16K~g znYG2iP!ozuywEiYsTgN3CJ=UApe$OO8pKekaGh!pKRIRU$;-vlGNP|#({*BijKOPZ zy+e%j$*1R9#T!Zqd*h_=dt|`hv^lknYomzxH^|x_FFISVo))Rr*i%|;%d9ivQW+`O z^77xsU*xOS)V*3a9$KR#;xAcY{qQ|eAcHPjI&0dkou!6%&-I6D_QCqv7ae@{#S}Rp zTayz-OpDeMN34{#L4W6~$fPeehAH$b@a(4flJ(WbF=Ry$6+uEZEt-5I4~qo(DfQiENmR zIkZ*e(sd$_ZV>q`MN>3HZ43g8!GNK>7X9G0C=|tbZy3zX;WR~*z*ZkYE5%4m9F3+1 zF~(XuRr{@LA|coVj;<-z$Z6Waq?v#+8`#c+e{l}{U~}PsDzo(I+D@^^x_!DfQB+y) zPS+-hrB?0?ZI1ZP+B!p4+OW;V2)TVD0)5sHSd+Q=FR_ zqEb7LJLv=~(N7xmlpBNmNhh6R_<_?-dfG|P81$@@ev4Qfe(yOqOeK`~JiQPFx83gy z`aL7~l9T@6hIj52gZ{`0Gjin8@3@Rt-B6$obDlE@)uh+>-k|8UYfZVcn^^8J4p^qw1v+xvX@C*S$NNgr~lu%(%v|t!3YAElWgyY|wuU`b28kPg#GOqfN7>%+(g!elMuPdiqf<(OOi7 zS8q9(VD%ZNd0S%VX+>HzH1tmm`b_@+sAbN4t&1KFJ;7uRLWVh7n-^+x;~VL7IPLS6 zZZPO$lfIy3QcJhqxmQbrw%tfy8i-ebvhcOFdaj2b>=1nhAmjEU5~3Df}1@(5>2?8zeG^uvZkih zMfv$AjJ#!5*K(~Y&Y+)7n0e<6`o*L+L9Da0qCb%)-Cm((FBGQGg#N1_PUtx%Yf3;{ z*i5+5114)hAe|}f$SoXnohb|fWd<=08->dhZo1A8Q6>OJgIp%ugV$NtR%pHSn2wrc z#WFy7h%?!8v(8m$o%DF&kvhG|2xji^2ETA81b=ze(Xx7p_Lg9MzF+F>8KvW^S0aoB zv97&TSZ7^zQ$B86nUCwKR{dPfv??nQ`i7LN<)2mBGHu9Mi0*M1+*7%>5X>ZXKc2v4 z&5zHl?D1JCc(LGpR`4{MW8J(|dn7Oy57l(VSg2{^FlqtBAh`rFMU_xpt3ZZozNS%S(L^)7ga<^F#s+G=JNrF zRn}_&jOmjJO}8FTgrrI=IXdelm^JBza64L^CL4JTH!`vg0SJE8@MqgvsgF{}7)hl; zZMPb!!@fvXKqx`P6Jc{aDepL>i1s1;R~4OPA0G1B~a z*8dm{U|m8{Md`UW;LRJsDK|k<-;9>L1w6AuA^|;@)${Hk4!fi{#po~(bO)i<%W8C& zi0L3*yWPt9IiRK;RgRNs1X2Ghs_j@}o?TOThfziOk+|LoT=xLiyCB2&0@u5N>%Mke zC0Z9lm3f^h{{Moi22`&Ip}L*D|4i02Nmfv_fN87wbC|Ya9M4DbVZ8AOP&^27J_>iy zV?guq2o%%8)J%i&HdRtHP12B2Oq24WgPN#6zi>V|H5QHvM^THGXM^V&xGpt0p}b2@ zJ|jI)@RW^E4=}fUoCa%DsxFHJ=E7#lFeHSE4`G+SfWgEWV7L!Kml}G2`cF9#fPvrM z<%-eW;29XEdL7;<$W>;4$kZQ-85~&fI`q#85Nf^Uc|CAr4VTY0*%#Gx_HWR!o`iDz z6lPyeqOU!T+|NQT{TA>34(;`Oy!9N-4q&ifj~g3tV;knV+B;@1yv`C-KrD8Xy^)KZ zN*wB?`lVuo2>_|`b@1mkA%d0zr5v*NZ-a#nDRmV(_!gE@t1AuKdJau!&^BovYj|kT z)yN*n($}C3gzV9*w{xekgC+yGKP#41{rN44GtZ=R42Ht00~fx-jVpNU3bEay5I7F; zvL3I~+=1Z&6MXITQ*kcu0K0c#lD!`RKK@tW`3{3G#}9L~apzTFI|AHvS%DhJ9_DlN z1eL(VPfN#yb3{G3o;gy@?!3%Ewlo80^fk%z3j4eWxOPM!0W4m= zQ^w<5__Bz2S<(L@Z)3c@3v8o`&Xfg%dY;j(H0CJzmC@Kytv(>H!g((QC!@9xolO~! zB@n3N!SXhUoBMJ0;{2O-Kg4ar>g;g8)0uZS=VgPW+$!3lO>(5w7%S+Efbrp`Il>R>|41D zTE{Ne{+fFWl!YBIA8y5T_#N>0?S^`F7qpnWp+f8fnEN2L_d}rGgC_^9C$G?!NmKQ2 zj=l#Mz?$UWfb%d*vsPWHxdPX4T@f&!N(h#3U(AI#c|wr9m*%+9eDmBW2NCjR(#hrq zA`AHfG4fu5r>)#c6>ex>l}>gwSM%zy8iSTb!Q)lS2G4Tn4g7qiL8}a^GhoP3GzUAc zudbS5eRQREm)%@d(XhfgG)Qy``jZ!1pKjFZf@hviwblo;{lRA+PK9(Tx0XMk1+3dQ zX{`ghP=*PGZ~#P=$qpcsV1*jgXhM@&YrrDvP0V-;`;yL)RVI_Bh zHk?HWBfo+WXWX57NcDcOXG}vweS@#Dx~ZwQZmExPGH4@5#cvXnq8>I>w?AH8-&o6G z{DO+DirZi-K)aCZ zVxS8o=(n%dx&=Bg&H?CLV4Npk>HzBrgY|?l_Fyu#+XWbdAs8%Boe2E7Ua=5Yw&$ft zv^A4csfb*l8f^NZANKE$i$YlmHJHVQN-IP*$nBW(h%%4{Nz9+PM(ZIlS5q8=AxVlN zU?hfMMACCGu)|6MKy3hA9?WI@AMk>H7=3`E5e*?cu`mGQIAV>bRAMBa9kd^bdt-2K z6ve_57f1mkGL=}VhEE3=43RH-BWi$<40z0kVr2~6(ZfOrRbrRvi~ortC=OH-K>rwJ%EL7 za!gN9V@gLY7E0Lc&gLG{&h91*OvUadC^%X+feCt!=4J*d$8pQz4K`$$I`Jnck;A?m z$0>H{HXwz}Vk|y+U9>~ObqgBgy*J+u`^_jX8t~BLIyi;2tr_OndE0VWv z*sJ9!&*xM3YMqrU@oz`8Q9}C5mi0?cz=Sa-jjb==!(`yAf7LRBUL&@p=?QJW(PJo_ zam8>Q4uk7(IHiaZ1SgGvn{Xsd!clM|jz&P}n3kd^wL8TGjJskY?oXn@q7>_6C(|`z z3f(QH(xYM;wTKz?w3tn=!m0NL9DMJKGWr3lps-#`q>4*KfmkF4h{d8vlv`a+YWIo( z)-xxy;S$Mbir%X&MdOy*q%Sq@gqGGa>Xf!vF7|G@|5@!VHRm39L3__G7r7t%+Z$~k zqOm?~se4(wD#P_J=&TsjHL`yEMC&2`W@UV;rHe6)1)L7HMLt z=pvS4vEEAI6Wc^4Vi&q%ZB92Vr|B*Zh#umQ$Py<+FL7G*7B30E_(bH3Zvo{OQ2;HL z*a8+dbmc$7xOKzDw-V8v>(GxrfHPztQUxkb)ESq!2{+I1V`0G> z;fzkP6vNzWcUaSY$%jiEye~J6wiw*GGT>-b+ zm7w58P%Z!#+a$)|-XyH3nhxqN5Le^44K%(M@fz2O=kkzz5eupQEN&DZ;pS)J7V!<1 zP5mr_nqAzg`El+eZr4T&OB*ZhX!-hU&7s-%AO`3z>z8k}hx+bE@*cFny&%8?=q?YU zyF5fW;$e8i4pTEskFYlT~DxHKBr|P{o^@p6HXg`3Aw{Rx%b&c zLoC%Qb+YMR&q8oYPwMGO41IA${yR~Q1%Wl}caBROyXAFAHNq=I0 z`Rf5xkpJ4+_?0&}kyKac) z*ZKNA2Jt?p{>iBiq-^KZhfewzpFeWazZuxaeDR+EA3x!GeaflN7&tJU#fQ(inA!A& zL0>xQE39>;ulWEZhtoH1L3msB+bi|beD2fp_&a2E*7@DtLt%^`%6PO3}L`iZ2fH4YqDxs)y0gt zba0yJ%W@wB92Qf#+>wBzM9QtF4=HA`Cy!fOx1n}5JijKKsnv$`G>a(f%;S1j>urZ_ zI%=?zhjOjyx9S;Itf9yBH-rfvw1_cbU_%2B(&YxboHuaEaFns8jb)~Brhwbo5DBJ8 zggz{N>L(1nTXc;`mJ2jZ^!DvC7{>0@J7;tfDW>Qoye4E^XI?UTgCWvPk&X($UAo;G z?$k&0&k#NnHY8R+W^!peXeVDHYAtD6L-nePrnS6v0(MfUukqE$%@XdWeby6By*I#j zHDMK7CJd*2Cgfyyesd2~5 z7-2}lVM3PnHAI0a`icG~L`I=028ux@;>5Bzyr$6F+gEp6Qx58;b=alYLyBG8_tpv*?t^BhbZ&y9dm9EMU1N5ujOMfrS}S>^G1*MJ8jx*Z|; z`aw>d#KBR;YO*e|R7TKZnD*tM^b(k7m5?3PvH+zBW`_!3{|!P+5_BhQ*$%>>?=Ycp z=USX0AgDiz(4QwR7ZIp|1g49A0D&oRwLC9P7!6xFNNVxH#s@poO<|-~WUay|UI+EM z9&NlDdg2<`d<`(r)d32n_p2V2HL!_Cz9>f;tD!>?~VMZd!y2GQV z59O9provSb5Yr+cVnJ4FiHHQr_BcbdzVzq`fn+A8YH|f=XGH6`!mZ zO$f8^ff+9gnUY>;OW#Xl7{NkBh3%%OBwPAE>aQJ4=NPe0g$|IB9hi>nG!B?fv9=_j zk+~W&7#hpQbU0ZIc!#19rs%;OZ3>oArNYPE6+Z61@No}?BW(mk!C2^M6A&ZCU0^)k zh(>6_I)*go&PI`d*)*%|_i0%V=9XGVE}7twH#8oR19;^HnJnSqs&*5!$Mk3biH<}pme z=*JNF+XB8~+Bl%MI_{--KJCLA!xqZeOJPAb0xzSQuRxl;iXQVCZG}R(9m*h+ zjaMZMK;4;aOswm}#JV1S=p|_GWN_>?Na+B+3SETBI}6=dy}`7KA$$Be%Cdo4oke15 z1hF(8W_WIcc^6UGl6P~NT3E=qix)4ebWfZN{G8h=s*g~wliP0Hecqx&W)9^b_%p`l zzd#WFJ%ZPBLpU=o4${po7cl$v4k+C$le#7AgC(OWSRVk+M_{avBVhH4fCa@Q6>5ia zHggT`19Rv&4@Cp^-p%dpFY_QyE$5U!&Vz+}ah@lgrT%O^&eKYH#mJPO7U$VVF_5r* zc7-Yw=#X4$9o5%pz;Doi-$8nP4;%6axRHK@ocKv%U9QGsV@d?6O@f!sHvEi}ok zCh2H_UIyJF&Z|3nGIw&-fpjDCLUdU3JLzKzI)uhA5tSb%fh$KhgvL<7(pbe{cDK%S z(v#x*KIvq6ho-WjmMv6Zecws%s7B@mhr;UItyN zhDk7S9?St04DFnLcZi+<1bQ+ctP>h&U6Z1Bk!>~~oJaz5B?3yUFu`iklp$iNJ0=?n z5IHj#kuyaikxE1oVp2L`=cp7ci}u16=}cFPG};Mu#)3ApU-;-@kx7q>uJn}XM$d@u zk_5^*@ocF5J45U+eFcW9l~dsiW>Q}bkIijJsR;)Jj>euPzrdlhNW~JkNYSXVzQc3_ zvzOi!v2|mF-NgZ-rV?9nba!#tA z7AWFgiGePLPw?k}nGfn6Y^#>}^hZMsfB{vAaHWB0guxL+%nGBH6=GL{m$F^rW+{m) z85e_{Cq6=8xPb{wHRiWJr0SVsi1is`#O$i5gV+L50t$_Q?Ku**+bC3L4D}T7yNPiU z1(s+j5RKe=Os8Coz^t`#N)2F~YDXqFgp3aB zlY!q9;5QZcO#^;2fZt5uH|xLP#~R=NU-)U5r`QLsU1qIJ)3b(z`#JnMEbf&!NeZ`5 zQkW!3A(CjUqe}oUr|Bh<@=|Pzg%JSq!vONb0P;fsTyQSjt2kd{PK8s4zJ@F;F3C`$ zeGeH&XxJgFI4$$b6{k~j)syOG8p&CnbQam<;@VN(fDJcVY4k3_E?i@Z?3fiE>$M-k z$U3f-CS1!3hRmIjWZ%ZG%hx8(_1aD{pehWqjytL92u<>0aTZP|Td5T5yAIIA_8a9! zD@`skyugWNedePf{$K#~SKs*;?x@_k(Vj3SpT-gOA*htpdfZ3o)!;yVuc z)N!cD%?WFC7rl=p-=*v%grCMPmZ4kM!cVt?y1;4DTht+xuO74Ks}aJt22O`-5r)@D z^8~^~;2c>Br%4?gCF{j{x>8&QXUgSR1$HIv6C3Fv5ul@D6P*^Dv0ciw^artp&fxrK zK?OhLhvL1dMmHdI}I>WyL_rU!mEpTkFN0?%Q%LY&mlgq#f?h0@_M1;2K~m3hHRD5 zjQwOZqmxc@%;6~~okl35o0m%)9LX3@r=;5_fu47==cga9h=Jdy6SYP`J>+0UKEI3= zFj2e$29B2T9KM)Fr}!E%jA`rwN@H&j95>w-ht!CN$+v;eS^ap|3)9kMNnfx-kve^5!Vy`o_?d*;nR=)!w2|#(%9eA zkNrLU=yNwB4!`6SoIL&L>nLbUFGoRSe{0ZpZm3Pz0d5TaXwXkq-(=C9I`e`|tAf*CPqy0X^gMB|l~=Eyu>GAUBsrtySgp@+PNGuj^0CTS z>jQDsW+Jc_A&Ko%q1H>Qb(fC)=-8W*VSTq+Pfwe~(TR2$*eJ-s=f)y9nm7#6VNF`2 zXGc#$93p8;u^pEaZ^E_FKd#+P1fG`xiR{MdWY9TN#K09K;zYa&cQt|)6Rpt9EVF52`g!B~AJrdgn3VP{>l)0KE7G zvx!K9?l?{k?r%x%IR*EWkzpc42lT-cmSHLs(j^0QFn441S+8de=gexd(1R=q@&)CN zNrHhhTfP_vZ^c{y;bxGn;OJxFR6>1A|l z9pGnLZR_>U0n_inh97P$n8K2)xY7fJ1rPBYZ|K4Ds{~#RlUVAPYovB@6ip}I?;-+t592x;KF>T*FduFNUZJGcm-zACB3a2oyc1wo7Ryj} zelZP(W3pO3uE3Q^_JnxjEX8ACPyBgQ;dMN!LVpK9meCWi1%a10BXM|A4=zf zuyk|b59o*4#L*A~?G*zCa0782IHeqLSmywhycU@9Z2fYmF}m~(sCGxL04yy5u$+zk zZ(M2k0?c!SE>@2?hzvQ1X>jFmh)GkZ&Z}`|swJMFZipJ~Udo%h^q337FDs&HR2aZi z48PN0&Q6DKV@3qSB*M^M8UPR{sL~pfGjHLTOM7*LkPLsdLmV?#_0DEi^gFsggD4z)v zh>1YGuE!}KQAP*ap66ynJ`Z-H$n^BhL7QRonWv~9meOm0HK3IZy-W}Go5?({`BWU} z98`WTDqn{FG9TWD1z@m6k`Vm~vke2l!o1-cuTd<9pQ;vZgepPNWa7l&$gy|4y=x=J z`OP2#dw1A;Q*UlTO6A`g&c7|3|7zstMvW)!7mj7QM*gq=2@J&)4QOz2@H#IJcH&9i zVnE}T#gZ{S8|vdAHRs$RX_iGaAukzI49ELIT@Mfpik%M(>P3KJA4_q1S{0N~^a`e9 zc3J^CLXj;EbCLF>fIa;lO7+@gZ}8eMxmf@r&fRLqh6EpSyU5O=}@;#2E!zN&yyah=e;Cjg(Vr%aN zu5*Nt`_(Xs(omlAEO5QXqF&rY*f}RnZ>7O(D)QWTyDYw5VxdeAUem59i? zF>?&lZZWZ}(v5m57R4^zsAtCxnJMRK9e%hA5iM%%->7#ANd5zLY*kDjcovHN{1hRh z%yBahP-mVN=B<6??II`gf{0${%p|)qWf{M*U;~0h$FaUxSdHOeFYeq8Ps2XwyZga_ z_d&GW58ikH!sP(!^a!~2AYB!J7xFqNv^(I1+>Ngz!Znq6MISuN4mx1L!@(-b< z{W_so4z*K!_B4QTI}ZaB4Y&Rg&<6#Ebc_#*Ykq?qCs5>*5bsZcJ5GUfPGfX<8bMso z%IYXD!!S@nwbwAvgEx$`!^x^FJOdo2;xB!m7Bh`vl~{sZU|=1O@SKI!lRz#fX!w9^ z*u9%{udArg?vL|fe3!_eI6*tH0)o!-&d6CrX4?oS;v;&!+|oiJ$Ppv5;VS5q^#X=-op#{lJy zrJ)9I4L5jesKIp@9Nf4X3Op(sm)GANl2o&y@CU(D+$U2&E3|aQH=Xt8{o328wp82N??Z_IhO90dqTELb(Z%&9$>p5p#=Su9LW69 z8W;vMD!G%f(TR%a z>5kwE8=IULuw&h|MgOa`>^5xGUskr;#O?Y!4jJR}@2Y{GhhvEzjt#E<1Gb^wp~q;m zrdbs`^rXO(Zd9m|cS~q8Xf0c6jV|1|lvC^Yu$~W>@nHiWF6YA)e7KSi*!Ceb&EC8c zIWfMuF|=)Q!&Q%6BnlWr0cS5@I0dx91y|%XPP!J$lH{fmv)!@3%g4oHrN^3S^{E(G2e%MC8RB7IF`w^ zNmgKj-r4f))}3i%XH8R6sA|>H5R7tT=1m(jYSx(1eXZ$_>nXv7(Xk2Pdr%D=Lu>15 zn}%6a59`Un4}AlIFTITYmq9>RJ1Bg$K-0Y$k()LnYJ`TLKSdiHk(kIK68SYvtMg|! zRyRz;HyGB{H&jiiTfMevNbfn=Zg%a3w*}={?|vjwk}v*}_3}tQriH#T937D8;X-E%|Jv~ZNF(YT^^ zb!jyw?uB(rPd!Z%&02k{?uY}aY*iIa6_BEQDhP@xNzwZanv3pk@Y2T{`Lhd|$up~~ zS5z!nSskWy=)(&`Xsn4ob%|Pg#{>+t6Hv7Uc5tCWX+^=j;}vdl5#KaUA>`O(onC%+ zfl~_wO$SM^q;A>Ls`_jZdygtvi#K*b+a1k z`{iHSIDTp0!R?oM%NF1&uVN)Whq0`pwoWb&yw7B5Z_oh~GL4sSn(Q}%56Fc0d|Z&P zZ*Sk))u?}Um9IVi)`yL+YwIfO8yc!B(SzVpiW43U~u2cb!PIjhxSE#4YagvexUV4N6yWkxp@!Hn&W z6XmxgobBIx;81Rxz1M<~)-8`{|4dkQWv#fV=AxI%u zoj9&G6=V4z5MwaXY#gN`cD3U=4;G04;|;~LV&vczeykK@WtnJE0g@Wj%yxU)4>`-m zW_w_QfstYauAp8U7#v0c)@WR?K|Myo<=s{p?mUczJb-v$?`l|6rpq;Dw$LnzDniZO z<>GA>mCVH`-O>{-#uF-qV=#D26W*&smKTr(vh#qWZwXi_iJpFOR9p&`05_7trQ{-@AQ51aDpYu{3~q~d(zq|I%-Dz)jwH)W zITA-=#hwHO)T+0j!gL@pS;A0LZ&6{=Mui+E9C6K|HyY50f~m+`kwn5>0G(UGEkvy& z=w@Enj5DB%%xtePY#g+zV#!Ew5Q!mh1?Pi{zOWhQw1c`RBp0mN#R`(10&2SB9sq^;D=P6L{3jjA66fSQcHHq4+WaRCzLmna9P*YO z#(YANBguw&55wz#7MYE8GGzPeXSmTjvD;PHRK51N1Ki73)!1@ujmW^B2|cm@LIJH6rF5y7j(r%)FnMzgtZ|kfY#xFS zP)eWzm$Bk96vQI7tEfS7rC^u=m?mT{w_*3c5)@wsaX3X3NfaCiM(r>Ag#k3a0YZZi zhFgF;%aC#bIl`D37c~-}B*NyeIF5nR9Az7Ws0?6IyMBWHAR8$h^z4dMbQ|0T!r2uKnA*$F~kg0fi-M(FVQ2%b1f zeU%R1Avv;;a}9FB6L+2tKkT(nGIBnPA>vqzJyJ%f|{_9 zFPDvh6>^~zzkQjL%G?~bY0wo;HUjWb0W8AiTbr^N0=1R$rIZw&I%9^@IPj+``-d5!vJv%0PW>ZDwipdqLXR#h^ z?b@SfIP4A8t5;qY^i|4AMu#dngKrM8Ml2E;okca`mDCOj_+;0Zsbj<6fEi*vy+=>S zLbfefatlHmG#N|Ql*mX~$ zUOj7?3G;sk&@?d_JH()%iQax&D0&vFKY=~3ni<94BAJH`_~b{xE~sm0mEN5uJPvnR zXNQU$Ywz9q7&~LRx5IQuxX^UqcwM>s9M8Szn4Aed-Q3BHB(t@6A9kTYY^}puQ6u6y ztFNPlHmeX6g#cT&%9tgsGfjGGB1hbUX|a0;Qfx?spn5}4XE)WZ#3yu&F!eX^MkQT> zo4z!H`@TqEX1+M1$(=FUag%&*Jv|$%8u3C_2)5#WL9tj!I0MF7hlPgj(|BnxwqAzY zPmZi0+p@KdGuKw)`!K*OdHGt{t@$+#6|1UYX0FH|(TM7yI&RpVNX)|b2h(Q0i8iD zFVvW+q?l973pHjRdCfCB{KwxlV=<_{YR1tPIq+F((2fZ_(jKq|E!~gL3}A5t$N6F~ zWu=Io>Iw&!V%2|2V&-=!NEG(P>Cu=JEYkJVBJj_A9?J49v0F&9e#X5 zA{33xg{!H$A`FQ`WC3c*hT|7h0S-wiRs*}jihKXwb@iI{{;j@<1ASPXSd>( zv^yy_{Z5KXOE1qpc^^fcplGOW zY)M9Wq3uB13zCMc8H0*Rwn9d`BcpM!2)gMWY!au*_~ec!j)NDx$l=S8kBitq3g7U$ zPQla|0*C7vbd3iQjKODIBXW`WTAt5f8)v@$n1153aET~+tp{W~?!;(8u$c^Kcd5_< z{m=>vV4M^}RUHH+WC(P_(a;J@p#_#h3t2@g39&-(uhwHgS&dnUHE`880Ez42SiS+p zuETuAdiXpyAYS+iAay-g(c1mE{&1ZG?he|O*p;Isw)-mQo~y%xfLVB&mA_fhRa@e>^5x9RODd<9ZS^E`n!6eG@6(m=b*nsVR6D z1|3pUk5Q=ahV!QbaV~X64)cZh>0kf;|1DFW`mGRPCG)KJSojsYAi9}_0VDFIn44evMcX~ zor?a1aXc9lM!XA6N4aU|m)rTga(Uw>B}Mu(QYhDbf>O&ooniHz!d0X&yEg*pJa-6c zNB?)CZRY_5%hL$898sZNj#4M3mUl?CUdVZgEMVbzYI#fU4*f-^^rLUt8S~HH@rZwl zmmk+Hc}8_CROKttU3>%CKtwywc#%=^3|n$SQiC;zRX}(ct5E` zyU`r*d_$AQmRqS$A`_4&h)G3YA0R8x36{5b^Ju_%ACq?-{4%tK6HF#&&lrd ztLPRPK@IOYW-A%!ZG3$@@62GqdG1CJ+ighSIrhhJ(q1Rsjc_}Dalb+LIO$&O??(4w zDFfePm#7L)8gi#T$C`dvPh?-X{E)9C!f-=(BjS}E;nt2j^BJn@+J<-A)4n4dwz=wd{Bs*V6MP( z4!1jQKSQTcLAfgyid%9S9PY&^DOYa$EI&ESyFNEVNAKUaP`a71z>)W)PQ6>7jd|$P z=c&HM^dhgT%Yhb*FEFrs)o%^kr!Qe&>i^poY%Tlt;j3|WTPvbNo$7h27Y z?YdjPP#1JU1`d>c0CbmUkRE4V$UYRuDD)Av^q>6#BhVSy!G!>WR)RM*r1F&DmQs20 zAq4u!(OIcHF6rFFV+dmw#H^&Csd*(H!+QoDUdNfgGNrT5XTzttuyO=i9xp$^G@whs zcWxY@ZrJ7wO=+Wyi=xgj3^l`Lae;P?ko6V*!w0#g9wu<+?XQ?Rks6^*X@n&*E6d1{ z5>C5DsK5y5PZxXHxbWq%fs4Ma9I9M&IS^ufE;S=G+SsaFDN*WnHrDNIQj^mpot2Zj z6vNGAOb$;8lan3w?bS<#N0SxZ7|5$xOn+U@)bjwxI})fpoKdi?6N)u4;(mkXhHA8n zdPKB4cEyfG_=FsjV$+d;#)Z-8*J@lU*ranvjT1#SPg;>(m%5TIeOraQdZ58$r@@Nc z5+qp7GmstjI0UTl8xik-A+Y_{)Xl_5CJs^B7x@UsDgvA(3Rxc zLn%oPY$u=K|Tby%DDiu;jpTEM;O3Xs-a4x_OPKsrN40 z7*T7uG-G8ZoOv@rMj786Q5}u96pUp>IF`e$Vm;VY@I12QCpq>|0@T_F?445N<~(j_!10F87UoTU@sN-Tw|YZ|oDnb1fVK@(kySS^m0 zyAz>Gd+7ic2t0^M!S#?smtjoVfW6nQ#8Rw{h%MNJu!hYdmaY0s5SjF# z=#8+`KD1r*gHk#i(eR^ie?0C_!_uA^bcYBmg_eB?UobsJdqgW9K81(Rp?+tu#l;)A z{wuEE!>sZLNPhwZSVrL!Dkv;dPBXCI{wpX>gR!(_26R1^TUgSFjT1s$4k?~;fT%!f zA(T7TW52;$JTXxkz(xWbJ!!*s2={>~OVI6Riv6HL8G1g8y4xr*8@g>9-hgWq;;xe2 zuT|K~N!S1sA3{kjIERf0pzLbUch4exl4Cp&{&8MjDI>8m(V&{MG@mnb&YuD-NH3my zDPr;2Cwx8_U}V61%$9~S_E>DFJt$dTW#h*Kljsn+%5Xj$A?SE>ZkDzH!8;hXi=GvD zlVLqXPCs1TcJ`x*b>;)=F463KqT!&ZNg@Cm|46&LnUT=ZjnK zq)=U1=&J zLgl7lPTq!gmK*pXq@x$jadKz?lyVo9VXIW^tk23R9!1e5{Cpv{-*;mWUTjb~Zva){ zq$O@lCNN8ZJ2=*VDj$~eUSV)pcj7}b%{F+$Fdr>!p}yXQ$u)ZJGV# zxmuppSg5C^mLuG@p?Ya;V^ej5a;c753GW&!awArVgnW3`qL#@Jl+b+>@c*B-%P9Ma>Rd31%zmTG8!5Vrp}oe5Drz%(E zYu^G*tq-_-k(TP*Ojq$IxVKsr6$lsL-G4LXwr1?f&4tb^kzQF*w=`eUMmn9@g`0p? zIoGkf`FiZksftuzC2y)#<*sd587kLTgPqtanc_vz;WyI_R-Zu#HHgQC2~d?0GAehE z2!8!)yyZEp&$JMTpJ-Jd)_Yl1+YnR`TdfVSZhb@>Eu#$*<7yk>BCTCoC!<#y>R~9T zW)$g@%#=MKc%g0Q4{e;`&m_1ZNt6{_HZdR>S& z*aY6gJs9T+eh++L`fhx#(}Uqp-^F`G**RR^!BNk~A-@MRmAIX7f?QZwtsb?I8=<#R zxHdU!H2hPC08EGN%L*1g#l$gZ9%x>jF+u3Vu{R>v2E+Zpu0~cfJEMH%v*g(F!LY4Z zxo5eed!kdMme0bf7#)|t#)6Mr;~{@Cf{`vnWPfbw35w&`{rE%JWh}vy2+aVI{>i|p zQ&|hX72v^VKKbjWsW>&0vfEkuMMK~7giuxfzV0Zs2kvIUQP2}O_mWt$^37jx;c0Gg z3ZAfRWe9AX48oc5g*d}zWTTOfzW}4qoJd+gW{mYG5OlUK2vhZkJ|?9|)E1GDjARJv9?}aboYIl#oDK;m>U` z6Divy9@Y0C?_}ITKy=4Y!Jj19endYaHv(%JeoQ|ncNc0I-lBi27MTrvQg2gF2cOb! zmQRB@f9S?j3mH7Ma2~8-BW~E;Z@-O*e?#S1lNg$RP?I3tXX4ZA)lJqrzi8fRG?>4# zm&t=jS59@~RCiu3@_#zJ68Na9bARsKBr};z_Qh<#ge@c_k|1lsz6Sz?MJP*w5Q0pF z1PGzkwvMsVXRURc+N0J5F&3p(5i0lu5p9)ya|ID0Zde6GyIXv`|NoqOXXXaz`}GCx z+~w@scfRwj-94g^+e#4^Wmnq32a~GAO;8ipq;dc&F=C)xXIdFL`@K%ASFWQ-a8fL( zKSN9oO_`+R_Egm)jLA!~lI1VDvgFH#Il!N)b60|Ww!s!(6?k+j6{xG1hhH)CFW<^- zW#;6$R|6H9*4VtVu6_)R(cqL6F4mHzOA@e~lOlTgFm)55PA>A@qRdC~7b1@Y_m8G2 zb*tUt8fDzlP1!n34SD`m@U|SywR^a^+?*XU=PAyW&7ss|pm)z}pD-%?8g6s5(TyZO zNpYOImX)FOsdjfIIf|%c@8rw=FS?Su11NFSG=hfuV=ks(DJENAQZUC2ktT=tHVcC3 z_^3&kZ({+zgM{xQ;!y~G3uMCunSwKXHtu|4W&~0xfPA?KrPa%Pd`ZK%nYa^zbimq+ z*#yB4h?ZD%be^^hVBPVSt2`E}!PETrvE)u5-w$xqKZ(5BRLL4%bg)Y9fanC69Z^Cj zJiAb{t8gbq%6SOYf9H&!)_ukHDfl`?xo1<1yr84Eocw(wGal>rAuo>75A*2}{y@;R zTC9ztEmqSHMYUK50YsAcG~v!GenX^dy`sTA#qaP(kwV`O$x5n`mRFzQPw-hU5^rP< z&$;Q8B8N1=&AdY~GKWqnwosK5)HFD6VO*$kW{7PbvE3tHf)=OpNRc6SGUycsz3QR) zt{f_J!o3-PcJXI7)Hpq2FGY?)E$t=td&B{h8Wab;)Z=6Yj(C&-FDP!pMW}}sxhllF zZd&UaERK0-t1E}Lx-!K39;LA9#mJmu)$o(dAFpMzYm4~MBR*oyKX!{xc>ffB9RUU| zU7m8?bXV`*iFJ+3men>avS;?C@B$d39Y+~rk~@zYxyeZ|_`1BYp{afwW6UOm%67~U zKq#B`$ET*dH~D}ZiOj+UKT9cZ{7yzW(v*Vi`$ZlvppJPnPT!IAF;fD7n1-3~-g zsgbb9G^Va`5o+XaT#m#I*Rf$5USf(UCnb9@@h;1F?=g5hS>;iJEsATdBrux5rH3d7 zQEmmXJ;3v=FAnZ`hh!z2F$%4)H-;#Fx~!Su%1+0u|Br#H7tGKfl<}vW5+7BU>=>}k z?8B+P&W9uYbR5IP3?ErbVe@WtZHznu*%|*&vJqmuUZ41!?nD-fGfG1^<*c}yZ|C^) zr6m^Oj~+k7f3!wncjoP^{SQ~W|UcovhpnIl{o;F=Ilos|>hfN(l zeJbjbN^GEB7u2LcmKz56KsKtwhNVwe5qS<`4H!iWbD%nQekxA5qrw6osPZfP(fi)<8vGTn&Nr z$4|Oa&Db7Q^4XIx^qx1=DE7vKSF}oj99i}?oX;+_v`>(?$&P4%Hu0P~5#frWgPBp~4F zATZ>DN52^18e7T(9hLMtn@Y!WUd9=YINVIKcj6&4@14~%C3CBi+`$_TxQfBdGcJqY zCX#W)Ou<(;-~p!xdgWV1I%I(?)5@`1Mdm~hrL$mw3zTcy9xm&s6$kqQhwO*C^#@iq z0EgQO9Hj=K2L}Tl4pVj2IOR;MuEZMIKL+9@f-1Ze{kIIcd2q(OKuT1DqNEY|tH1?t zg$QgI)qaVHmMS6O9B?0U)AF{6e4PKlui&|qco;Rnfl5@O*L3;*=<*Bb|Fkp2T1q#DBY+K&kKWT2 zL1ssx!_(U@^!ZN`%eNxDG7Vkv5)I*$ET z(7xZa!9?~OZNzipxr=#jE{ODqCSA_8=M&ox?*VE;MYsP3P{wroqjJK*`;wd%*g0Jx zBf4Ty8M$U)j#A8JY;jt5b==<~3R8pPLzw)+_!Xua8`gp|2^LB&~CM{OB8YiGcR2Iu#79>Q2oKPiXlsn z(-zk25V!<_O#wLU#@7EgkT*;PL6mtkj0h?Ed00GtOqgz1TE$pWBf){0fN4z!RCAGT z38qtX5W_=(pnVVs`m?whS^XI3!%apy*ey0+2a*TFPa zZU!`1(1e*^pqSvDs#!MEST6)p#BLW0kck0#C>s<#g!&Q2j>edH;=yeww5L?sP(9ip zG7eMIvw*;JIDkS)1SpI^9E`CA6l{=y^`{TWA*_vGf=G2A=%Bv>NP1A!i%_&HLheuy z6J>`1#Ar}u2_V={*kfqlECRiNz*(!e9|I8rBO%IYJ|TNFFu+MbVCW*di*ojdZ_(M^ z1!-gr3`qN83JT+a%VvXF4OAYF$|m+QFy$U>i#i($Co-GNO{8&-)KJ{mB1TbQ&*C&i zz~y>u&Kt3@Zo)}*b5t4HfvdBsK#`F%Az&L?&YhzURRv4AJ8xUm-~l*{!5cQdvBg2O zLrZ|Mcd~B_9YYjj*eXyeYp%UcZO1}<3ETJ% z5I9~2(c=}s@K>=IcOm9$*w|ke!Tu0L83Y4N!?6U%z`x@{9Nz6+>S~Pq55aqqo`U#rC7qDV!}KzElujP;23S;59gmL5j)lx+vCHHSD5o z7TKEh#fIsjCdu?cywPT04eq4S3W-KVnlnIzy!AdfgOgRq9_AyG5O!1$?|ZWtJAOu4y$w!X5*j~LAaw4^()}v@+-gL z@0MuOGAx>Bp120}@nPT~MRk?P_F;Br@l1&>ipTk+ zYz`izr9KQ47;e9P0F|{q;8?jn5XM1DEhm#r=?$btcNGs~by~Mz;c`f~y?LiA%L6J# z?IO@2x+N#NO}Qj(@$Z1(1PQkQ8#gHK?o#VIh8!XAiqf$CTav?ooW0~h!54UmLy!3QpG=PMwJ4t$1h*r5|(uj1lk6pS`^3Aby#lIJiPlK28q z@MJD1+S0X={%)umoy-;Cw-_sxb`g7%TqeOR(qZ)BD98n0Bv>oZ5JReTSG>TC>h z>L6@zNj|0qJdu3H{vY{(C5wu&I^%ICtjhqdm+~OGAE=IPF_*Q|9j0qn&0Og&Qzfvf z$3DS9D9Iegj4&7R%Z#a5%XpMnPfiuPA5-$?$*D%kI){bfNTp{-RXR5+cQ72YRpyxE z!U$d_ccUbn``uT{ec8Xy-2*1oHCEN5U@`0or*9T98WyXnQqESOb_PT&2#otW$>X`V z?~=CxWx36iZDS2Z9(P*{QW>o1c{TOj{B*2bK=*^4`P79!T^YbBr6!LuoRC#xX*fx;u)P*<<2BB3BwiFktkHfIFJFn|jmU4e3W z0fGf(5yrcMWiWxGSn58^cTkzY$MOLnWGX(64|{CBO;`z+dt}?6EuY zC`9}oKxpj6odixoD&81}IfH3~XRNazaB0AN05@F(go&mm>i>*EHl@OqEuz7 z&yt>SrXGOCt5mf;0FF7Tk{*D^98}0ENR^{mJZuUbQn8uCeSnmf;zeBhmh?tdu0i|z zs6zEZBrlCE31=I6EG0t;!tANpH})npnU}VCX(Iwk`>P!y@G5<3L)8-Y+PuJ2Ag8i~ zT9!-b+77Zn{J}w>kyCX!DJ3gBVxkx4neb0tmGduVngjb>NU zU`J&hYWic3vbw@7ZcYHmy#+dV9&sz}POf1VloC&XEwG>Q=XU=5oIiIkE=0r=m58`U z-0c?ku=snS9N-0Xtp{?ZIDN^ZOb|I@N_GCEO3bJeotp~s#AmA$E1u`MxWfS`ocQ~gnTsaMuK z%_lsfwqT9L*HF|;W{-fdDyuTu5@y{Z)X9?R6OCmcG=`l{{(_Y!CWV_ylRt?@z~qW` zMqUMRBRv60!M6Cjl6sZDM&~KrNgvKf5Bs2Xu@*f_=OycWkX-Dm1n1LyunpFiLO{JB z-|vHUsP#6;al%O|VnKTU0UvDZZV1cvWY2Iqd! zzh)}=myt67fqtD07zQJC8$jP))fnTq&_G)iS@pC}?4+oFYJ_DluC{3jlzhW#rx2rB z3(i88oL^~XrL_~w0vSD&T9S@MbQ#Um{Y_?BaVqL(RbzT!S$$)(!XT^2a!OKKptXyv z@A9<@vozh>gEXPqA`=h)tt%t6`I~{EX~TMuGT*7)6l;%}M^VXPaHSM-y@`?bv28b} zy2?Y3-qSn&N=!d{(^Ti8N{U|Pj=JpPz!F9)$N|N4Zd%g#{ZRlcIM^tfJC~AH!L=8Z zyysqHq}yTw+B`yAXI2#^%da`yGCFMj*c$|?@7 z_O8=a2@=_eq85XS2i%yPjwT?Y6kE-B#j00;j_& z>wPL}Q;A)U_wRs=G9TZkf@Z~c6Q@rBq7RP`#FI;r7nNLlVHYmL*K*|7U-S%u=GF^M z?2V&-A7nNV&z0B@2jOi9B8^;(0#4Q)GHEo+*b#A>%$g z-Xb-v0QTVl7sXSFPJbJOZCvYx*5X@`k8wyC;2{`y7YGD638T+Pza;`U#x2GU zgZyxUh;fT?`W;ZgEvn)!A}S6C{HQ)$#C8^rH2(6DCR_x%6URi<(c}55T4x5lg}NFp z4!A3X764N+uHPiQX$jCywbVZ+(Y$N29#i1=aC4Fha%dXPUJ!kwx+X4ALAQ#lUQWxd zh)v6>i0ipaq-+A-4#Tl7z>WNB40p$#X&pc~?MShEvo};o-8*7hMSPAsrZ>#5=fsjk z3R9Y#IVj~fCA*v@fqWlbQVH@da0!zdqz{TRSTXHPOL>KO=mKs;Ebd)#Z=Z3H)&`Gc zy5auZY61oLGf^{<$qKL`km<{%s!caI=wAPCD*+xt_i&9J{ZiW9=oxqu?!0a0Wp413%V8>tn)ZWpRPq!fqCLdYp$di z)H@^_?J8qB2vu`1wT2-7xj{sXg*B5R@Zm^o=A`!v7$*h2h(w8RMK;8t@xNo)1rcwQ zmwY2~AsUTX1Y{okTd08zJyrDi&5T#QBScOJVs z*Wm@!Oy`N~ym$0ZuwlU?hAr-`aFa_AoObALlACh*iDAet+fEvJc@E%CR%`^s)2>2J zZ(3Tg!94bYXhFBEON-=wq_&kS*ixXxu$+9WnGlk3NyPvyF({Ag75=j61Uszs~(2zHV3PRn|7Ns z)x*)<=6LncZI3xwJ$!$UIaNLE-(%LOhfaIVDe9qVuN8UcUh{kEOX)uA;lX`oz53$X zZ`P`Z#rw@A>fy+KbFq4;IAE?+56>Pj1L`5~AiVmqhAR%5}aVgk;tu3vGRqVBUI?1^Qt=M)b?|I>u6mfQV!doi#HX_sUM-^FCSvcnm@5({#{HU7&Ju_c5z#L(REg{|f{KUPJA2aBppS zW;)|{mnkW(IJq$k<$a4pojC8R8w&nV0;yA8BsK^*tRVlxMyjkkZsonW zaQOAIx7`_=W(;68l*O6)hDEbY92LmW$*W`tY-XR+h6_yk|M8b z?0j%KUi zGb7N{jDF-rEYSXIZQ1f(IG0>`?1Vkbm`ls2ItbmAEt5`QtOIsm-TooMzk5c7hZeky zq5iXfKTfly}u5s0lBrxTTpb-CrnHY@%UkG36L2YF{+L+t3dx3+Az;-7Cb2dJzcYWQNs zC;39~asq@G=Z3S+k>0&ld^ObEv%T!wr4_WnRwd7I?y$2=L@#h@GAKIJzU=U9TgZdfb(G$t*ZH zuI!E10L*w%uFL*wZOM2toGf47^@&-c+Op#l)OGal!aqYs*tF>G*Wdu4b=_AMuOce%0KuTgRuXblK;$nW<`3eHulV9ta0@ zl)pZ0b-_jkxsQZv<(FH|Tm2gLr4A_T?AJ5zgyTb&@-r)bq~7G3*?*kjewVC02L|1S z&rF|(AfIlo<&MwHEZ4PGP}s}0%=wd*U&M!X`&JI}==@Y7xU|+_XU$7TfBADjP+m^p zeV`~DKUpUE%w%~QiB#8I_!HXyT(59=tnB}}nWuXBU}gV*yaEJ;mlLK02k7{|O1J}F zRt`7ZPkwIY_YzXO?jIBtKIt0RH4E6wI_H+p?tn@N)k4&v%I>DtmUZKGqDjL|-zD?# zZPycZARLo;+-{G&I7KHrf7DH?BdiANmP<72A|v5S#M)u0geVl{ym5`$afW ziadDM>Y4$$xBTp0oJe>%H|MKEj9;MKV#{9VtoRWl?EVu5mS+<=sb5&Iw zh9V;|(KYT3DylEqK%T5^Gc#1Wf;mr~g~4{R58CZFWB;4!2CG;RD>v<9rM;>v4x2am zYG(h>In2b{-qc@dCtRkVv6|yhB6ifV?A@sNN}YJCjd$hxPEHK~#PV|X!Nm`mC`T^e z0&iG5H<|Hr@M&vc9yoW`g6AZ-q~QioaOU(G7ir}y@iaEQ7%Dv_8NBWwL;c0v>pSw8lq znO;EP8sXBmFT5>7r;AnT)SOi*9K19~NzY~L6hp0&qIhfVtLq?DI5Jt?LuWFMnOsUo zP-?>MbBoGANj2zqZYD>IbZ)ZOE2cZST{^iFQ^CwAjzsB}RWl(L%bbD^w}|gww1 z>gJs%qYr-`8D2R;H#|fxqJKI*+8W+b{}!*FyLJA0D^-g}_7k zlRPTm?DIz(%%i2XD$CKN!S5I>podDCb)Zw63e-Kh zRw1+P60^j~hvs9X4r zv##tLkHYW0?K@w~)`<95DAOm4q`I@;#vk4MO`~w+k|FZyw*9j(g6Y4x(?z$;B$Ao3 z{tZ1IP-0|bnc(!V+MBR_uP$Il+>WXGN7&tE*`wLkyk zq0w}~(HQ)5(XX6-(WFb9<$_7SF|6sa7Q=ArH)-Q!2FohdTHsHbSp`7=2&D@=4iWr*v@ah*6Wn?pGskt^~z zp))_aa9v$Zk#CA_rs(0JA#}kd3h@?2{OHM#ULG1OicQfQ)DeALqQn%X9?@5nfv#d& zKac1y1~BY_E-}bWQ^a787$Szc#4!FCZi*2ennD-2y7DkFQiSm%!W0!AnkGiMM5VK= ziqxM+j22^DVys7u6XO}|1XD~r8h!3Yt(Rxkf(0{%)>O}^Su99Q7UbrL%Eb#7E)nG7 z@POHi5ey%@w0ioSk<|;wRbM@~2Apy9{(r@2(UZ`DgH}$jS-7-z!Tcqrs5<)6kK2UE zkXTEin~< z#8qONC91_VQ(SF{>0*XOU(-J&kpT*v5@^}I^ao3<6@F8!v*8Wth=RA) zt^F-ipG))V{`gy}tp1Z0gMQd#iQB~Ome?%rFvS*2Y!%xqdV}5+6rGl~bivZE$*>%p2-wpb&nirBdym&+?@%cL*1YHrv}P}xKfw@ z{#6voKP72{VuDN#$|7`SKVY z-GVPPl5V9CPZd z{y_kM`4kA9q}ZyQ0QmwG*IbK7B~Al`Y6U6I&Kx3DIPCzN+3l1;n1hjrL3+^6HrY97 zXEVGA(12(LDy;$5Gj00YKs_O#9spe)1iCW_RH7gQ9bf|mvoVcwz+y~Cyd6wOyq!!) zyiF!0-tJ@M<~KMe{tS6R&Sq?~$j?Nq1v=NDiF44Sb150)usud$E`~#QjKcmHPfSD` z%K;%Q2hc9?1~+{-?FnKz2sm;VM}b2%^kWnIHZ!DCrLS)47C&bWg4~L*gS3b;hIv=0 zi%Ns!M61xGX5{UzxgJGsXn~(IgrAf42D|2Nx(5(3jHx6D%grMw=Qt(!88e%qY|J*b zfaMOsa#MW}*1ixsUm0ZQwt$6ko{-J&cEr5PcOi5AnP68__l$L|a9mgr1 z-_GD0QbonPgIU20?GVg<%+Gw0ae~?ls>nM*nF5`fhd`E~Gt{Bj$Vo6xP)Gjg#31-9 zyXosd<5_NZpAq3Q*I!<|NP^mZA z4@qiJsqD-`n)6M#lLHdJeL?=ML$05m1QYt+`9q36&vQtzMu4$_p{Psb?$^4Nsaf2GQcWQhx? zz9r$H?bw8)y8)CrImd3_T@-$j@~gZB0qS;IFHK3lmtwe~6FGU}23;Iz{I0o;_I&gf zDE~Ia&^zQ$q<2x%dyqKqP&R#_8jub6KKyqA$T9=ugcu+vh^vFLKqO`W#yXtzixeX+ zLZiL_5!Q^h02QAIqRm5yMN{NS>RyFDz~tE@K>or*h-)bTK2s>zV=^*Wv8^;biSnn= z4{AtainNC$4}TUVMQ5mIv5{arPY!V?!AMRyLA`YFTHpiM^2OGg>fgm)@AcFhx=6>qUOj*p* z08O?>J%@Uqpgw~9BXfhJz6}Cu)c35&%Q-oJLVXr>?@FV&M$+ zS69e2#!QD?OHo6YXRF?!R`mv>^3dh}3M1_zrKr*APj1y+(1C62p~>^`B-+N15`f0>*D#wT)dHVM=G^axt0#br;`miEvKN<>sil`sWhCt)@&3Fz4U+~)&`D#Rq zNDwWWJi<$HB9>Bw4+1rgx`;MZD*W-(Po&Zykw!yBA`KHsG+QK7E#&{rh~FwQ6opws z>xdcHrmzR%;6=q5!!UOKjA5@q5OC-vgg~8f&8eOG>xcb;CrGA2y8feVe1{!;u#$`jAjW6en6AYCR z`o_ctniNdtgsM=&VY_Q~V{eC_{9>8o49&7o8x%vsLSD&Etw-t2$w7c#U2M zFB!bR!FwZS$e*B2!RSSwoTMq};wxAu2bW(qwLRTpYEyHWpC_}PCkTtaVn>4GIl3po zae}4_Ds<|FW@x&zbDW^7kj<6g3J#eR4yiFSt=OG_xwU#XIX9S)cz?~UdWgG|icSfBdwK;?eNLulmBVMMw=_?$N_XrP)PB@Z+f z=dwt#=iEXF6B7C45(S`HH;l&~)K?UOlX}t!=nN}FF>Mrmz(pmrSM;S1L_hji3{W(k z32LpNFh9KoN$iGp+g=S?7dW^MqIdxqZUof(cM&q7NAH7(ejfv}69(u9YKHcK1)FB* zPeKg$34Mqe9R>!JmP}c&r?Wh3c|D}hOZ2RjU?b3!8QkmLH|@EeI^6WR$z%DVn{U5?4vZwd6c3VZ=rNMThq=2 zo8$qN?+~wH5}Si}A{sjdxp?)^0RrwmryG{90@0n^t*p=icN_7VgRPo@kCMf;$`l)z zk}6^|lx1^!?fJs*EF%8pDa)oD)!*<14)qs1-1#4%hd%^Aegvv~3?1ncNHZ!ZcMhokAge}-5#mRA-$>C*{3QQ6 zQj8bB$Q~79Pp6B3{2PUXxIP#z6EMYPV|wd?>8)6}sRaC2DqK`4Jn}ykVzziiUOh?- zR;_smrgLT04Wx|~JC$KPa1ypShqA+#&rg3kHw@O~Fq!(G9xtP=5XpftlSQ8}m3->N zkis9@5dF}mZlR2qu%CEk=YcTOzEmUJe%M<3&`ll;oSQvZXx+-8O&oWdhu7jJ-C@!e z4|;N|2SZdnwt1+8>iDtUgB8XOlVli0(oU0hd7wG$_F$oQ7w5jqq`hvyyW6CDJWw`o za#20M_wnOi4|ItAev|&_qWe9V%^xu7L6aWxVCjF*q=!9F>M=AQ^-v}qVyq6ksf>J)>lTI@# zXH0qu%7uJ&rbscK78EOg7$;(-F-vUikg;I?z}h8qhRvT*vvSa)Wz}=XEvTqjF?ZE~ z#WmGSYi6i;L4E7S94r-+N-me?)pW{a6|5~`Q#hP{eF&zkg{Nzcm2TCq3q zW3A|`w;M=SuU6-(h>*Ks}?5V z*DT1+H~8_UNpD#Y(eE_d*c=vw>wEH(O`17UsJ~Ur+cMhb_VGEU84G|-MnJ-ci@r9rc zbz2X{%f53&Bx)N-U&<|`QQM(>k=P5Lf9FOmvoPY8aA=W9Ut16_z#7uUf@r}&{+`ZR z^aK6NqJPtm7X3s&%fkyqp%Z2}K|SQwHKLRB-z+TIZlUO;pQm5glIfGv7m9;2tx%-P zis7P-Ja(_1E^pYUuL*2gB$f%;XMo;Lru|vZlWm5J%)q84qP><>j6uP&$^%=)0EAe1 z2j%e`Ebnx7#fSh zkr;{N5He6b_`G4zqtnb^|$~nwrpET~$z2-2w7cK(~b%P(2+!M+0j* z;l<7bEcYYMP-J-y)SM`dV5E%RMPWJqGZcNCyydyi!Nho+V)F1t+1LZLq}Vt@aVMz_ zRHk@u0<0I%iW84h60c8_575|R<0Pe2dD~_u7y(K>&7bL29By~I*!*vJX~nMJf#+v{ zE&xn0Pv;y00V-)4O~(R{LpKE9+bB(a-;Ji%W8HKV@i!pE-@2mrYRG#6JvEdvKuRY_ z7X|_*!P=LORdEMc`|>dz71I^yk*Vm9tB`XxP4YuKo(8Mdbj(>buyCz|b?XMGJR9k1 z=*rVE5zat0vryS=m>go0uWiC*iyAai-V>vz%l^Lk66Dpj9-pYsW zJsA}{0X+$oUy0O>(9Nc*(01~B5WEVJ$AZZ&?p~l&jkgBySED7Y&b|g@W+)bU6`*FK z-LsHm3|YTXrAf0*sx|2v)9i239O&+IDomO?!lZeP;1`!k^Fvus$OO)$awa$W0TNnM zt8_Py+aSY_LmPCIiNgvjqlyzb+FY8W_a5|cCDfXbQdnsg3+0~Z9ZQN zTfGLHAox@bP;yF;o%J%9B9BnV2I_P<)O8A~t?9c%P~GT2hRU#(1+m=;Lh_{OOcU5 zqDE$)^fyrz^5nnBxuXR+BSW=B1{)50MX(k(7Wp{;;;slu^qt|tgIq0 z8x}~^l=t5?!5-&=VJ`yudJ`2<&>yPF7iyM|)?@5w$R4ih)KTa4zt_M*G_c5SV9(>w z>wm9-*o$+44WeNa`n~pHk!`b)-M|}E1F!$R2CB;J2BN0lYv41e=~*=Jxt0z5zqD`e z)etv23U06`B@nZn;vmdQF;v_@y^q>^4noN}dzkeCmK%|imkxdLW>vccvaPf%0oqnE z^}{;_#?=FtsoJvN8qr7Trt8*-3oaG9ZlicgIXeXU)rlU;aUrnkUeP~IrJnkec+1w! zcf267y-GE$oKU-D88p{r&|F{B;$_z%Mpgjc1AgT^5!n2tcuy6Pzpm0USPKc4yT296 zHzIK0TT!6gOadQGHw;A~NuE4{fAUt?RlR$dG5}Xs*^iE`ha0+WU5^rVP=#3$>;I$wGe#?1LiHMi_2+ zYN+ONv5!P))Ga3huME{1t!Nk4MQ(Bn56mMLC5mwQ@px@t3JmtJ*SKM?i4bwHFSfzT zAfEC>BIS#uz+DrxcA_K$ww+8$7i_rbi1=K%7<8f@BAd!Y4vZLiSPpfDS*Hsv6NDEgz^04(AMQiT`BfiLp|jtR3`WA`+8Oh>Tm~5QsEbzsFshq$l$Ropc`(O8Z-?R^Mvt1*VA2T>M$6+aI>~Qn{t@(~ z2V?#*rSHe`8%lm$lalYEXFL$RtV(;Z#CzUFF95!uUUbo)T}o?q(aRnTAC!BA7a)%@ zPOqAD)&m3CYbL$!VWSX~<}j=b-!|zTPJh=$?|Ez``9lw6InXSix4GJnJP`GdbDobG z<-c;=C;a(o7+V$i@p%{x{2P4{#w&6D{>sB^X%DNqSVeoVGx{Aze{0hB9*pmE{P=-m z{^g>7bFDv`^pgqow`{8Rxt#c}o)u_+m6k2S&ztm%N&iu+o9E<|X>uS6ssJiZlUt$Ak)!L0(_-T_}Y<^Y$zaBU`U2Cg{tM$ZK8mC+*Xqq5d`G$Z}ze!7#4YRajeGP4sKh4s* zyRmnxSwa_veCir4SuWg*9P?&tU6EtsokGORhS}OCeT{I`t@mceT39FlCdizx9?BbbhnN zN*ai3i5L-KVHj_-gipkQ;z$;4EDYprrbw_vqDTT&EtsOV$sN~d9ra|p)g>L)h!lp` z)`D($k05XV>Ls<)2V+^eY;n!l1+N+xsdedF6Y9=+V&v(^G*@83 z9PKS3KmAz0C-D9}ZKgJWjV$HRIuf}xN-_aqyuHx<#;G?i0r;EMOJ1*lc6di(IG}x) z2dBx$Pah zWTdh?h=3wZVmLG^rKsK~J1o}Pixskbv6kmQLLH1JsbiHMLzyr}cdE$4XLgmIiw}5b zV8@NkxOsvOjyytLPErIEib!wQ;}ngx4zG)#I_2vJPf|e@_SRX6I*1B~LA6_hv8{uW ztp33=1syaUI&&s`QaVG!9R`Yyp%s46VI>roRmi>?dvMocTXzk1QP(K~v*CUWL<}q2 z8geF}@Dc!B3PLPJw-_jq3|cNnDmz}RP_#^krmzwe6iT;@BxjOdhOM5CVzEi9k`+U& zW`;nK-rOHt7MuM>NFigKZ8hRXg@&zHn?TO)Dl^zs&4d;}`nn*@Z6GsieCesuk@OVmcVLX@$=DZ@^a*s_d7u2K2F;zm5F=g=-U<7Ne;UZ^9K| zTB2GHg!Tc|dm-=t095VWY91H=8>&1mnBYNF{r@Yj>~^#hpnXHJ&I3}}HM4Ow*nfzbm z)L35HD2iG&#E5Q!iCH^Az1barcMcK8W+4K?{wU#9SE)wj>_LFUz5;saIOPac)Iept z`6945;~X#&^u`G5cYwNAoTLPpG3)`@AA=7@hynH(M1i8b042e~5VR`v!%iEF1v<=u z!_cnI>b(+e8i!%VZ$mL%F+7OyaT){kDOe2t1TElch`{HN{RIfI7g6{XsOPVu*q=d` zzo6(VAi=BXl{XX}*<#ZXrCI6<pGUPqnLWF7C4^=|*f3{XCutDu2gxY`8r%YN+y3=U3%0d_HSr+7GbjWs zhzY64ZP8AIT5>JtZ!H9Np*jtoM}ke-K{N*8&4h6)Gy*gvhy#lon|$B5Xf3aCIi;+WzA+klzV0>{c9(yPZWyg}%o%CaiT0DT+p>;JJ#nsqNsE^{M`Mm&nWnIPJ zi~|A+P>^>&W(k{7x&#qnMiGpIrbfj7SQt~zAHfxN;T*jAFVZ`#frcNY zE-^IXD0MhI7I8wsu??o(P^uJkwUOlwKd$EiW!~f^=^)6?kzj5EvgQ%I6Yzfe@+B!2 ziN$KswRiI2!-103+Ig3I7BbIk zHfR$ZtH80V<(v)L`*|Co7qH#t7V3(vkO3G>Bhaua@Z&77(<&gl2F!FFm}ocMB^Phh zW~)W*V;85rwFVRU8cUwLQjgzpqn0~sH7ol=dD~-{2bSOw{8{ed1wDsGdDwE`0f&y| z$2iQJ9@IU-q=_z?z=#dPXi2mlKtZ7Bw4_Nau;EFO@OH5ZRl_iFfo#ie?Wn=Lwtv zfoojM<@HQxfopWIo_JI@u0DDh1&dCZK*z$-ip9OTrCbA}=M+S|xX@STV_Q2Q% z@*O2%Z@)JeNCJ4aEA!q{BHkVVj|5{UkZ5H}3v8;>(rvTfqkCW`Qs%ei_i1y~raRl~ zvSs}vn)5OfTKfH3XGb_2#uA@yIPns6s+VNj2lWJHHju0D*CGS;4{I++C~ym(&;|%4 z&>g1^%?X@*Qv2S_>bIt{jhH7kM-98n6?H6UVT>EBZdt@ z-eHIzPQAnkx>}TDQ9cr@>}%TJ>>e|OX$R_$A zTduzkMhy@mTHd%?iwN|8M;nmp{t!wPte)b6-2Ahanfeyo7vUsJsr3|>o1Nox_>ALJ z5}^LaXz&4XpM3pit+I4nu5pZp91zfjsjYYT+TE1GWzy?Kac)zQ26kFQo{qshMm;S{ ziE`FshjZF_m}LegxP9=^9TC-QKNZMZ&TCz4KcWWt%z5qk$Q0%DqeG`8OtLw0_b=LX zzgKh>38FVBQYwS?6*d+WSO>7kDI0MoSM>I0TKG9x0C^E${9C3PFbQI5u zPU1_^S$r?Lh+jlL)Kr4gPK03T_$rp59&Ap{gzMxAjJYphl&D7td&W?ZA4kZAt>i1{ ztRL%Gx40Rq!fTu?wnBI2j4r_&Yp){}J1pV?)`8mro|YlsDv*9b zdsg$$M$NT=bPZT<4yB8^@Yk3}W5s-$CKk{tv5?jye3MvAo5d2kQ!J%>#WFf6meX@$ z1t71aZxH?g@#n=VYQ#AnORNC_uLI%Mg5CUL5aLGQtj=h$0Zh0N|80Pq$xU$kxLG{g zS==gKz~{R-AM+I=zY}+eAJGH9ifx)h)WP1jP3tP|)CP(j+F&6Ab(b`!=GX)0qPyhX zjoJhG^$6}mC)^7f+=roa07K_~9HV#u*5HTWe{vA#${wcCQ1r%$M`^q`d~BtDL|MgU zo~9Ql3vSuD!20VQP-*cSBDZ!l5@p#~BT`P&^(47vjNuGCuIcj)Q6oENJ0B)Z6-XYFQyvDtKeiKBjF z6w#^)JX~Olb+av&Lk^FK6T%5ysId_MglP(xP~EViN}sN01O|EZuDX~OSRSrNX`Y`= z5oQX@#D>O}NPT8jEv*gON};D(SY1qGiyj_V({u}FJXlg^(scP$H@zba#j{|hW7{c? zU$Sc1*;z}A;8iQve*wYSdxst+$42RCa@3!6kFtRlS}-a?d#n}F99qfixwR(SW3S_S zu~%wg33ELT3Bn#Le5Q!AaFjA$*^_^Z(lf$qVUHzcySd92^ftm$ela+^LqJyw4SKrFoirH zt#<;vObaW7-4>QoIGUFwIw%V-2xUPwc9MO)diu~>k!^__k!y-P3z8B>?XIE|;|*Qg zPwOmEz;uJJ6G&`{ZlXKRf?A?b6j`FD=w)GQ>TQWWfL0AZQu(o0ZxorVDk~dz<41ag ze7aum7+4#tSLkCWfM?hxPg90op5oCzh|#!<)Em8|-smXxMqjBnx(jbF_Z8l(aM#i` zc+Qcj@%m_N^(>0li!#~HU|RsolsOfjPMihO4E&4P{^m%0Ok#6fkAl$~S8~U;@SfF-KIJ;J_er;`MGYy+*?N6NO(i zAGGp9vkFiwpR^D#gV}D9&Gnb7`n!yT(YyjytWhoM9}}v73=F3$f~{D|waU^&y`n`c zCfHCWLS3B%?XRi@l#&pX5-b^~Dk%1b{v7#rqTUW$BUX~0P|hgX>xXKrO|J%(XJ8pq zLusHoQ`XkXbAr&;AO=S27@h6A%|yWvP()q?h;8E3;kN_uw}55sIf~@hacU#?CF#C7 zT%CQkjXiG{Lit~W>K9|}v;^woQmC?g7;hz(1*=+A-@Qfk@I{F8wyNC^ODnns(Y?L{)0jb>T3dkeugG@xF zBVdx4j;1gNs1qqVO!n+=-?>#^*v3}$1@?d)sFi3FTBASD$7qtPyfB@$J)IgAb#4FD zSW1;fTRqdCo}JF;j`U-2{l(cN?z%!Jlu_p&aPkwcddft6yWP~5L9h=GJb1jB$0-Zv z!8#nLjtn!~=Lj7~@Je2N>(y7O*eh6!SDjb1TVx-l`UxHQGdl1W$ff^a5M999^j8Rp ziwY~-Y|=-`dfp943$kz~abe!M$go(E)gcu1nWD z&c-MxR2<6*QBiRJF{YJ(6#H=OhoesIZ_Vg%3(A5=Qm-JRBj=1#1vH9BQ;$ALDfa}4 z4X_|K!@x13Vj0y=Z>u_VGT4+v7*;VBRuB>3!$?XM(Kr?9r2-LyMQSV+i#Ygnw1HPe z0!>8E&J;;lQKZm~qAkuVq>>bAv`@672So-wD%#VNB9s0kvJ`!6lf=_O=178EV&V%- z`*Xc8QgT1s2z$g%gmhXXPq%~kYo0wc)>dpHLR#6*Z`e9YHfIE=x4hU+@8ItP|4bZJ zJ7P??Wxps4=gH zp=tkyXe}#CwP%XE$b>d<=p^;8%JvQj(7=j3JEi704dN_MxPqSFgK=035e+nC7eyYS zp~VhtUk*!f9Ku9Byn)JZ<~~umQ+T`2jt5g^sb70%b`dT3?&X2N+Mw>iGh)%Ees@`U?9mCi>L?& zlKwD|3=y}&^=ui|n9Fe-ZUxN}D``FqBP#`*9K^LSqFje_W$-K&>*xWoo{oy^>5RC6 zo<+Hr#724z?{|^+W0;6OLm1P9pT7LySC&&omg0Z51)Cg)oA%%SDXISRe$ZY(PE@4Q4kVHs?;F2~<^< zaG7QH{Z9I)wtMEOF8W_=%kFJG^*Gzgd0!vhw2iWl4%cDM;UiYo82xSAPxFf__1zw| z_w~%^UN6Tvu#$1e%^i&t*>!>L3!I*KfW1p;?efWl{<2uT7&!97CRM6OC(is=Q)KkRgVxD!e4_}z_;d3bmKG^Ws;PX5` zVDQ1|7n5G~UgAb0ngu!h2Ie#kuy?0Hv@uYEvH2TU#Uvu(5*t3r< zJn-h@;CFE36r< zf;%3KlB1&ZHoTLV;4x;xr_X{ZG@R`$eR_^!zdVQX^b_Rd_mW~n%!C^r-nLub{F8)h)sWu0h~&Y5!r;R-5&i@TKd z24B~r;@mVg$a8nGj#9%SR;yq;hOw(`Obf^5dt%#6iYxINi z$yB3ro49NE_NgGL2825N&h-Y4Vg0Hn24-KU@6@A*fz=73LG4H*6j>(&+3-u`ZF+n8 z!po`g_+pdmM2M5oa?*M|t1tU`*?WIp$eI{cz_#A_AZMzO>VVmmPpt?w;qwywN&w-5 zDh%Yw^?Itm8At-MC$<0*5dz}=9Ux#T1_H!+#ls@6Yl%RIt0=TJdB%fE}<4&>V2lxbnkA3vwa2~1+A5V!d&sK+)aQV?m zN@Al@@*(&Pu@cOv+lH(Rv?>!6=m15wBL-zB7yzxdA;X(@gS~oG$y8vZW;G;cfO3Z@-lQ}Uj zl*nHP8b1S-vbgbvYP`~0v8ZrkrEg(19|P>$!?v6UV_r8jeIWJ`nTzbT3G1-T6a*1x zdtAm)p&#o;whgui{hHhsn=FZ(jqQBMhFr^$iyIBQhjoeCz;D2$m8q~$@dURTIIuIN z;s|7h3l!pGPf`ciDLR((RW_X_La)kh(RIoXzz-I3p)nCa)C)FebZs7vg-sdfn~-V& zv$ep3S0K%4%R*_q#cQLn4rr`bYZGS7Vvq^bA>GbsWa9`C@AT%DGa5m}M&|gH+bG|Q zqv&3Q0D9vLb%v7~x(C>IQTMob^U(uXft{cN4V?wo(ySBIO(S&5bHRMx?#SZpk&8Yn z6u8r+=mhoD0IF956>~~&JX&=hJ5$2pXA&A;g~m_8=(_@@7B&n|Q-ok8qz5d8d`B63 zOO!y(SOk7Tldzb)3GWC1;FIM7WtYGR!xwomnYhR8lA92+^WPTAe|sqZX1MmLUX3R0 zH%eD0U2*1k#RZHAo1|MnQixEL07-#COG{t_^|ANOc_iAVn`>J1pgY8HZYX+n0KuTP z2SL36P^$eUDakXSB4b!EA#;*(%S=YGk!(z3Wjp0wN=z`+U`Q~q)mi`|PTb(Y{R>}m zzo@}rO9Fc^EClACnw0Lw`?={f$sV|^w_6lZ(P?C??xLlf()s`OfXnZ`ek!=IAk&ljy*t0oS$ztQqjdO zM%X6lU?_0}Yz*LoQ{)hr^?pR{!zjELw!S}rCI1Lva{$b8Kg14uj6ICzJc1E;7_4{% zY;zQJ!TJVZ*bjXxe)Y%!!v(-LHGOZW>3f4s=Tvr>W6`+__3Xgg#B)E5;!g8`QrtgI zAak4QA2^!>WIP#-zzLeueI^V#>JQ#4-P)kqKLSm=gPsB~77L}|ssZxs&3aFN-{uL$ zW}_#N<4II`3iAFm*ySm((w{K7u;1yksyVh*r4$XfWojv!e>ZAyz{30>mIxY37bz@t zlx?f9w0S3zu!=EFIw-ssu||s_H=n0_MD_F?x9ACO*ekN5(vDN9JbVkzDh!mb+@i;K z4|craW+#b-| zDb1Zd93qHd`_-X`^VLmI$)P>G3!=UUQSv^VXg8?pB3!zhERt$1Up>Eii|s#&te}%=khqiX(L571C`&8)gSkF zJecN?>hB(qg*+bZ{?4GVMi}xzOYU!(yh%^++qZwQtYSx8mVNyp`iJ0P1}0s|_}%Ji z$0jL1(vI9kZ4pRUg1;gcbHGpyor$X-^G4#L7iB53XWY)VbpiGN2>gBm$wJ(wzK8k^h>`EB8fX3S*+&(#3$qa_vE!>c7x6l!X z5i43qs0e&LjyR1@wsJd?n{U(KSF6uCx9cz4i^|@0`X^4c`b?j4|3BAaV6S!69hw?1 z&&BBB@}b9dPhj&2eX~nt`R45Iil`{KxJET+!QOI${|v6}rFm{>bMr$N5A)Xoek=^b zq=!=xOZa1{Nz2$hbDoQq^Lqs+uH?`veysMe8sg#YXb$;Zw2q_KyXboUzQLpo9;rQTK1SXd6qN?Izvnq8%=hF52m$ zT`soy>^J>Y>`O}d+-?lGyJ7l7U5%BS@qm+cJKeVNu-ewK(edg-H@Q{MVG zZa`3*>|f5t{kpiZV;`C;?|(+Gb-QZj&lpoZe^!mW?qNMe7Cft$Md8%by(awuc}&`m z|K-}fdYs((tllS?{oiIqz zZtaY;#f)p-)vK1)q%E#lw5(>y(#~mVl?#^C@>(~oGz|;ir8V=H=FP2{KWpjiw2lj# zl1dct0AFSs%u{Y>;egLW9FcpA)4*37zyb@g5J6qS1%v+ZHP^uZyR=OsSA z)wFZW-l!cguXThR%0-UO$div;T_^)fo&M1O%aE7Vj0~joLkw#(1C;9`0(dj#0{egP zw&Git+VQCcTpKooEoVbhku;3_!|~!4v3od+E@yUXXdj<(v6r8PkkLh|K3hF^hHBwO zR!_hXc#jCe>HQv;&aZxWo(6RpZhL~_c`GssTFz>jOPf3?c>zm z=Q-$e`rJ@m4>Z20dceLfP4hVm-7T`Y53+F_imEpYJKJy$NHCwGj=N}W69xSkDxH9t z%7nKU`Vgb+Y#KUV+zk<)fM$mCxxa8P7R@c%je8?}&buf^V}pALIoH9lsTTP0? zg4uD^MEiuW)0n=;;!JD-d=kT8slr=*KaXDLZ+;hu-RgZn1l0Q(@gl#$HO#{B^2C#^ z3>64fVl<8hqm9D=9FL(_1)iUb*eQTIRjmkT!Q!$6&ME%AFjU+R9qi9APJ95<#HUzQ z{Q!f*&(O(!#hU#$SiE#>SccIO0VfgRqvawUE0s*dXCuAb z#$>K<8ZZdiXQ?=@3hmNV>STm;+yihcT6YCTPo=m~t$H2s<-7qyY&?c7%cZTjW;D`- zU4Ja=^pH(g@jY?=X(m;}>O`J`OK_gV0!+h3+C^+3vc_jNXH@x=G=r0dNmpOQL1kp- zoOu0DnWtkLfvn4+02`e0z;iS&8Jh;YeFT;TBzGkmXZv)w6li-C*=&I(f^=yuGiKQ` z12c^d8G>e=q%Kw7t^vwFt$;R*ySo)EzYWauJHT*~BnXVJ&tYImJm6VE#PHDNkL`O} zIZiY~zrO{hNkQP;3)sd;D6@4()$SqS^lQKf_RP>ioh*P8!%=eE>SQzAOyp$u0yqq{ zQYQmphrs#d*|ZJ7q}*B^*efG-`?yw+79bv51Xi5lx0!}ll>U* zuQ!;4f4#v;IUb;xYf_#`o%y&9BE$HS@~$SXI9T-7VEM*f@NrilzkgS+l-EzidG~vE zXi?DxFuJz*2N0;6{P2A}H#r(R(m?~bN!=};`a_2BX8l1qM7F)$AdVGjk%b2|uV^eu zpl#&J`VaJIJsQpk>-XvTayl;aue4hYN2UMpqh=ZVrp6-9p8CQt=QrDj`6Le8hvRWpK*M~_&KxF6@zt#J75*oqF z&o)LnIV2Z#HG1;Da3c?PHPjIR`CV6|i%Lq%H`G7QA}8e=B`RiTzA;e+{*`YGSAo6- z#wZooT40P(fiDY;N)_nU%^0l$w|5I>e!rV>jfxr4Js5bbyHTTJl6x4{DzL7HF0!)NfpLY#VikC?(5O{`9!17j71&f{3{`=*i;OE(ps;7K)IB|oaVqBLo<@}ljOk_c zQ-K}5f;fNGD~MsAVq>yO+Er{!QGxTt#&{JN)jQba=rSWoKGWOisG`5`9YkSJpJ2wl zeT+dW>5D$W5`9a8fwEynl4d?zci0zO*Y;IUWaS8<#p)jJZ2mWfWLYWF`!%I!)UA8j zDYx`A)W2sVAK=7>7n%y!eS8+a=uL?ceUX^@5-0LMiQ`KHxKihy>+ih<8WR6HgK?Vv z_OG85%IU64d(S0z^)=e4BE5P&y7v!mBK~!4%8&Q{^?C0#0p}u-@?u}ZtD4F5(As_` z*Y_8Ra%h=hDL}3Mk)2k6#@Si<-`uI&{Ebr{Y%0?HukF~PzNysy^{;=Sprc4Q|NA>$ zRYQ5*pEuV*@#J4dQ(lGYkuaIx&&XG~=Dl3LqZpG0|FT-;x-pt_CCa<-Pz^cJ4-GM5 z?bvhuj7$Zf)t#EH03;RJS#iZ?y2?8G^IJdc4h^1vtuY!mP=4CqNR^NF4?6+jGYUYkRg**2$hAmxJ{K~V3z`XqH5-P>) zawJqLTE34;?7=b+_&$1V6TE2q;=-I^K^($AzJK-KaAJyo_QKBwxqtnVTbjxw$_EAo zp`988Xb4j4*lK#ZYCc%IAg#8~Fhz z-IvlLsdBC`B~w$il!cAHJ4dC*@-0wqdF`+u*jqX6%@%3t@}s75kY7pq$~>*EUs{a1 zBueHC4;CvPj-*4)Np0l&!wqjb%bG9mzNhqiG=zVx8T$5;AgKA8S8f>sQ_Lq#@V;kw z&y;F1|9&ko?{enio2Bl>G|N9$|C;{xum3ezq^|NIuUt36NL47bx_7B5Gv52x|7VO{ zh06c!h#-NugY=$@>?Bz~3z+pSH!KB<4_FU`lN0|2w1Ty)MS(c^ieHP650(ds(0nkO zpwKk`?O&gGU2`>YGJIsPK&3FnW6)1fx%I5x*ThO7)nc zOXyG|hA3NYn*R2$KlBF$qKje)#p{pE9sd5$$iTmXri^&+U;oMx`AMabCqEq(92R{1 z@ixqZ{A)cdVjr`!Zh1&^$zhej22HKR*gAiTle)@>DueUg^0PlJy%DmPf2~L9&Zjx+ zK!w(s>T&-ZoZ_i)m;Q|%=7vXbz!a>{c+Mip)3^f5Dn0O#wG za?gYyo~>N3TH%>7Q{`8lSa(hc*7V>6K-zMH4e65!MzRf`W9MxM#d>7liNUr^o`|H9 zTkWJR6N8%Is!51V+iJ(I+XI>&d>jv0=AAOHiG zQoFvpW7;w3DE!N7MaqI>q5M&D^W1bQNBSTCiRXf zs6P9NP_jpsO$ma#D&f7?D^NB6T5E5)r|tZF&zW30F4&U9sQ`8AjGa_DH7H$n-uUU~ nKVr1=uTQH+TxiZ}%F1k`ZCvFDhm*6c#D8yKA{+WVh)(|pF;%Cv 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 c353583313..07235efb03 100644 --- a/settings/repository/org.broad/tribble-3.xml +++ b/settings/repository/org.broad/tribble-4.xml @@ -1,4 +1,4 @@ - From 6e8ec206c83d8b6c9ab4bf320eed7870fe288897 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 16 Jul 2011 09:11:49 -0400 Subject: [PATCH 141/214] Now with clean output. Ready to go live in crontab. 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 d65f4ec342..a39fa37fe9 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -65,19 +65,22 @@ public void maybeValidateSupplementaryFile(final String name, final File resultF 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 2f6b589f46..68a2ecf8d9 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.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 void testOnTheFlyIndexing1() throws IOException { // 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 07235efb03..f2116324a6 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 15d808ebe9..c9c5e09a8c 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.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.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 76db330edc..85373baa84 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 c4277adc96..befb2ff132 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 4b56cf130b..58803c9d06 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 3d14dd0e58..407b718936 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.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 5daf33a9fd..f7f9fce0c0 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 eca6c51936..dd4bb492e4 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 48b06d532b..1bd420e0a0 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 85e0b58894..16ec74433c 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 7d54d0df84..e83914ef8a 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 deed05508c..395309975b 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.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 89c67cfe9a..f9cda5e0b9 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 8811dc0010..deeafd8513 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 405f356350..7564275813 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 4af14810b8..29a61e27a1 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 129d5a95d1..2b37ce2107 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 c8d917040d..db44e9e281 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 3ba4480490..396843252d 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 b8e45e462e..eabd2e588c 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.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 zcmZWv2Ygk<(w{l!+ECgHrSzX!1AdfA+et{^JDI{MlAEo&@eF+uFfAR|^7Ayz9L2+#5vn zhDbQaF`hk|>G@gzP|>_;Bx(xy&bf#cFxAynSHLrY;dak!)}MCIzL2dp@!0TETk;DP z<&V_pL^Wbfo*v^l9MwwHcQ%~0KSjP^vpgAd*=Bh>zS{1|N?d6JueC0=f%;_K1{|qV zO*yn@c2>SpVQ1DTw*s6++ifwsi>E1)+PL1I8jAM!ep!m7eSdF=0=^w{NNXmi{mg>3 z>F>d0@43a2TrJwOWqFwA(9Mq8uWtI>mip?n)j^77z+E0!sALJ#K3)2hMI@gNo{M8* z#JvSZRBgiIXDv0@(N&!l1FxRwR%0w2)A#h!V4|hL;$pZFEoK%P(Y0H|s$fN)u_H&3 z-@2oHlma{l7nzE$+EbMDl!<{%rJHD0WVk%#Zw1#5`sZ#n!RljqilgAzeA_sCPu!va zPxME*3RCgXNu^Y6^4C8H$R5wpRjoa=6s}7j-cK}_Y%PzWN(p5KIqxt}1 zCKt1tHP+<^LNbXRE_TWf)5R_~2e4ay1iC3#Vl4R)Z6tA9`AQDtcAOH(?KxGx(oF6cNZFija)xX(-JHdpmmC}WnWJT^>TA>?jsR> z<*Q5%)z9SqCJ!`uu$zW)c$JIGB~T$>L*#3yn}+f*lZQ+5jBxQtY2i_BuH?~D<`@@` z4WP+9&c!#$cD%_G+-Sq)2onSOW^OBADJD;H(`|fphz;rR(=omFMWCPJ#DG z)K{Ywmpg_$PET00oT`|}qI>DS>Z{Gg?hJN# zE?f>C{Wv{o(c`qm;(Pf%ix<&)i>r9C#Y=dx$xAI>#`jzF3;k;Gayn=61EA*zd4)x9 z$i9borO6Llyoy(wJj3EORAcd4zR%=!f;V!M!{YUPpD5|f;Yk)(ON7VbM#eyI6Jac7!&_-Sfg?N+2oB46EHC$`m)uOi=b@`@`Dsy-$+wE}<2l-sel0$1JMXY~J3nLbvmk?r z=R9Mtm9^i=yG(xG;um-x-TKd&9us+%OlJwEbo(1*Efpr#pd7s7m`4w@o3T(6M z9O6)v)?BRqo1;8`*8e0vzRc~s5zPNJs+wV~-br^Mq+{uBT0l(q0M=+B1xO#N{zX*f z?~euD;wImQj3Uq(GI~^tz)>w?LA3}R)go}vYJ|XnyoV*6POHF(2x{n{H5gzm2pbeB zq-em1NxZAQ8=Sn9t2|(xNpX0Wl1V+O8TFzB>P<;hM#CqNSP7!*t9{{P;<(q7VtnD*gpgIFMuKBz!q4E8pf5vo|MAS*9-jEttcq< z03}tXd8w6`TJJ@NM$$@dg}fgEmMcL~>bokaVFnaLPr*A#PjYekWcCJ;l<7|OQk&GY zmnq=7z-H0}v;w0(1g%##66*HLbVKGcpUka3nF4%LW~r1Z;@#Y{Lh5H5VKv09fsSh_ z0-lbCui9X89WaAz4A29Dr4el1OZ~%?(l(e}s{RkEk;90+Zcb9Rb>fp?qwBT{@v%w& zI7n;OUGhEcH)FAH%1$}m;Oo=1?YA8)I~wWW^y}cH?LPDEpl75GBq{lJ^pI z!jxp9U`$JsSykyhGKkkIy?a1YqA#HHmskm3VM(8+cJwt?!Z(yh-(q2(!GivdM$!Lh z92V~_^aD-90-iQ&^yKcD;)*lL(WJ*|{Dmm*sxyn??;<8R>IWzj-~rF3RPVwBJc6_(PNfuvob7Ao-K zo0t;&wygtCfd&|ms#DXv;%W%LbUhBaGnB|dp_fZhoKG#d3#D)YWpE*C*&>v%rKl2n zQeQ5nGVVrGxjQzG5?X=&_1s4(T#OWug0y8T>_!ZqRQ4)EoP3D2rXhMI^f4glAYD`h zK!SE~$XP^@^9nS$M5(<^`eeLGpW^w<)o4Nn{o9vAZV%%bB{GNDX6#3;u`jjf0n~#B zVhs*bTG?rItS=ziV|9N{r{EbwRw8JtMQk`x1W%$22p7IVW4lS-+6)d{Nkq zoL4E*r2ioj>M>{lwq>jh`DxPkCjEeO7}6~zULvg?MS`L55sHAYwq=z5hzuhw(;|}l 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 f2116324a6..e23eec339a 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 6d85df71dc..2f87a900a2 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 @@ private static void addSummary(Map summaries, String path, b 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 af5771c55f..a117206f1d 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 @@ */ 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 a39fa37fe9..22635dfa31 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -75,7 +75,7 @@ public static void assertOnDiskIndexEqualToNewlyCreatedIndex(final File indexFil 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 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 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 daaab9425f..fb18c6c333 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 void combineComplexSites(String args, String md5) { 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 eac127e66ac48ffaf2c12e7626fcebef85d16374 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 19:15:52 -0400 Subject: [PATCH 150/214] Reverted PhaseByTransmission to an earlier form that does not try to incorporate RBP information while phasing genotypes by transmission. Also restored a line that ensures the samples get emitted to the VCF file in sorted form. From f36641721c5a639da90f11e8e525358260778b39 Mon Sep 17 00:00:00 2001 From: Kiran V Garimella Date: Sun, 17 Jul 2011 19:31:33 -0400 Subject: [PATCH 151/214] Basic functionality for reading a VCF file into R. 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 0000000000..523c24d9b4 --- /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 | 8 ++-- .../sting/gatk/GenomeAnalysisEngine.java | 15 ++----- .../sting/gatk/ReadMetrics.java | 7 ++-- .../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 | 14 +++---- .../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 | 9 ++-- .../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 | 17 ++++---- .../sting/gatk/filters/BadCigarFilter.java | 6 ++- .../sting/gatk/filters/BadMateFilter.java | 1 - .../filters/CountingFilteringIterator.java | 11 +++-- .../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 | 8 ++-- .../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 | 13 +++--- .../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 | 16 ++++--- .../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 | 18 ++++---- .../walkers/annotator/DepthOfCoverage.java | 15 +++---- .../annotator/DepthPerAlleleBySample.java | 17 ++++---- .../gatk/walkers/annotator/FisherStrand.java | 14 +++---- .../gatk/walkers/annotator/GCContent.java | 13 +++--- .../sting/gatk/walkers/annotator/GLstats.java | 15 +++---- .../walkers/annotator/HaplotypeScore.java | 28 +++++++------ .../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 | 15 ++----- .../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 | 9 ++-- .../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 | 36 ++++++++-------- .../gatk/walkers/indels/LeftAlignIndels.java | 6 ++- .../indels/PairHMMIndelErrorModel.java | 27 +++++------- .../walkers/indels/RealignedReadCounter.java | 18 ++++---- .../indels/RealignerTargetCreator.java | 12 +++--- ...CoordinateComparatorWithUnmappedReads.java | 3 +- .../indels/SomaticIndelDetectorWalker.java | 42 +++++++++++-------- .../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 | 18 ++++---- .../walkers/qc/PrintLocusContextWalker.java | 12 +++--- .../walkers/qc/ReadClippingStatsWalker.java | 21 ++++++---- .../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 | 26 ++++++------ .../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 | 28 ++++++------- .../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 | 22 +++++----- .../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 | 14 +++---- .../utils/sam/ArtificialSAMFileReader.java | 14 ++++--- .../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 | 6 +-- .../sting/utils/text/XReadLines.java | 4 +- .../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, 1446 insertions(+), 1568 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java b/public/java/src/org/broadinstitute/sting/analyzecovariates/AnalyzeCovariates.java index f8e298d88e..b9e380295f 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 b2ee9d1fcb..33592287d3 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 c36a8e04f1..b47677b08e 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 @@ 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 39e698ca33..9f92df6e08 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 @@ 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 6c50e17846..9c33e084d3 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 d404a2b6e7..aba4fc109f 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 99608f1678..bd20063880 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 8029db7b3e..4e6c3a16fa 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 @@ 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 717c5c5228..8423bb2f2e 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 d1cda3ed95..a070cb5a11 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 @@ 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 fd7e749c38..a080ab4390 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 7982f61e21..da2be74bf6 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.gatk.walkers.Walker; 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.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 f8527c33bd..918bc12517 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.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.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 27a86ab3f2..7cb615f7fb 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java +++ b/public/java/src/org/broadinstitute/sting/gatk/ReadMetrics.java @@ -25,12 +25,11 @@ package org.broadinstitute.sting.gatk; import net.sf.picard.filter.SamRecordFilter; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.util.Map; -import java.util.HashMap; import java.util.Collections; - -import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +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 1a361029a1..93fa2d146c 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 9553f651ea..cf190835e3 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 93638f21d0..ee2e850253 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 337c2664cb..17e4a07432 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 6a0d30837c..1f9a7d705a 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 @@ 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 760b3a7bc0..376064cdb5 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 b36c59a2c0..e92599494c 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 java.util.List; -import java.util.NoSuchElementException; -import java.util.ArrayList; -import java.util.Collections; - -import org.broadinstitute.sting.gatk.iterators.GenomeLocusIterator; +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 net.sf.samtools.SAMRecord; -import org.broadinstitute.sting.utils.GenomeLocParser; import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; + +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; /** * 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 330a9e4f70..ff312bcac0 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 72b9625222..55304da347 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 b467a2ab5d..f9ed0cb747 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 a91e169c12..223659a46f 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.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 d2c097f5dd..3d62faf495 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 5a672b09f9..7843e7518c 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 0c4b78a7c2..e809092d48 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 d6c938f361..efb92235fc 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 feed2ab85b..39c632539f 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 a0ea32f9bc..803bd885b0 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 a9e04e3574..de938e8453 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.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 34693d501a..521bcd5a3d 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.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 266232c0fd..467aebac53 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 @@ 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 c014c19950..e4141f61c9 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.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 8ebb8b1a89..5d0c38b783 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 f9b998a60c..daf1b77e39 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 fc3f76ab77..4ddf28dced 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.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 26af890b49..19d33aa6ba 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 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 950d67428d..a5ca078534 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 7579c22f65..278eeb8989 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 10228ecd72..28b737f283 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.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 9aecd77790..4d9c9092d6 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 da70a615bd..c2235ec73a 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 c2aa5f18e8..6064806f3e 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 418f5d3eeb..f8d941784a 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 @@ 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 fa733ce126..780b41ef72 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 ae0f1cf430..07c13a76e7 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 f03e2a44f5..54de043793 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 df7dccaa95..773541d117 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 c2d64ddd8b..ef69a8e5f7 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.FastaSequenceIndex; 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.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 934f4f997c..21f58d4804 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 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 0a5981a1bf..067bf3f720 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 @@ 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 a1419ba70a..5dbd904051 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 b96d0ffbfe..26205a203f 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.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 3e335733d8..b23782563f 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 8a27e008cf..59fb4aa9ef 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 4cb571c454..9466fdf756 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 cfe0f81872..23e5769f1b 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.traversals.*; -import org.broadinstitute.sting.gatk.walkers.*; +import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource; 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.gatk.iterators.StingSAMIterator; +import org.broadinstitute.sting.gatk.traversals.*; +import org.broadinstitute.sting.gatk.walkers.*; 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 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 76e0c1c8ac..7be37a616e 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 151a1ba264..7aac70b473 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 b78a4edc9b..6136bd68da 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 8fb4adb5d4..d36a3b5768 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.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 5c341bb022..cfbce58ee9 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 net.sf.picard.util.PeekableIterator; +import org.broadinstitute.sting.gatk.ReadProperties; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; 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.gatk.iterators.*; -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.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 b8a3ee9779..0987c5d749 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 3b988c8fb3..8596e18eb6 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 84390c1734..03fc2063b3 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/CountingFilteringIterator.java @@ -23,16 +23,15 @@ */ package org.broadinstitute.sting.gatk.filters; +import net.sf.picard.filter.SamRecordFilter; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.util.CloseableIterator; import net.sf.samtools.util.CloserUtil; +import org.broadinstitute.sting.gatk.ReadMetrics; +import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; -import java.util.Collection; - -import net.sf.samtools.SAMRecord; -import net.sf.samtools.util.CloseableIterator; -import net.sf.picard.filter.SamRecordFilter; -import org.broadinstitute.sting.gatk.ReadMetrics; /** * Filtering Iterator which takes a filter and an iterator and iterates 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 fb3c385828..589910fc7b 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 b7806524a9..cd77a9e7e0 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 cda08fb665..67f82235dd 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 4deeb09ee9..74deace9a9 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 bcd473b158..75369b3066 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 cecbedda86..1afec36d15 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 584783d340..7bcee033f8 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 8a2fd5af36..cd31da61a0 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 d5d40ec389..490a550400 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 fc21538e88..29738e499c 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 cfbba03836..31c2144ce2 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 dcddebd55a..8ad91ac1c1 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 691fd95f0d..30b2f828d0 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 4ef88402d5..81044b888a 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java +++ b/public/java/src/org/broadinstitute/sting/gatk/filters/PlatformUnitFilter.java @@ -1,13 +1,11 @@ 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.utils.exceptions.UserException; -import java.util.Set; import java.util.HashSet; - -import org.broadinstitute.sting.utils.exceptions.UserException; +import java.util.Set; /** * Created by IntelliJ IDEA. 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 1d74ee20e7..2276377619 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 69ebc8b041..0e5e8800ca 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 1b2a77f450..16eeed3ccf 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 682b22b1f1..99d6bc1544 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 05b4720367..2f93cbcaed 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 ac4f4853ad..e7ee345d2f 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 8655286884..658a28fbd4 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 b68013aa44..f39ba2d8d4 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 8701ecf3ca..a9a74925dc 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 36960246a7..999deddd1f 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 4dc9762890..56c9c04651 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 610db1d768..cb8786be10 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 @@ 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 ee5c56524c..66907dd6b1 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 74176ec350..1da03e9c27 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 00e78f3912..8bc97c886d 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.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 5cf84c5a28..27bcb8a1cf 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 @@ 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 d847015ed7..f124c23028 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 a9a2722206..38640eda05 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 f5c1e0efc3..d8e59a3dd6 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,19 +25,18 @@ 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 java.io.File; -import java.io.OutputStream; - +import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; 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.baq.BAQ; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.baq.BAQ; + +import java.io.File; +import java.io.OutputStream; /** * 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 7521e754d7..615841f022 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 1a79d27857..bb84f9457b 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 b5643f8346..478675f9d1 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 f3a060be10..7eaf4be410 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 @@ 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 1342f11fd2..835748ff0e 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 aa376a12a9..240564d347 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 @@ 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 30c1cf5129..e177984caa 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 4e58813f55..e13c5a7641 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 ff458467f4..21b71c9e64 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 c2d3976ea7..cc499b247f 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 239392eec2..2f30d12a80 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 d294993d45..1b248d0970 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 @@ 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 a51ca92923..69c0b3e0a0 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 @@ 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 fa0c323b57..ce924fd875 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.util.Iterator; -import java.util.regex.Pattern; -import java.io.FileNotFoundException; import java.io.File; +import java.io.FileNotFoundException; import java.lang.reflect.Constructor; +import java.util.Iterator; +import java.util.regex.Pattern; /** * 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 cff97e4eec..59b273d386 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 @@ 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 43bf6f8e0b..d03b122e23 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 b3cb22a032..b7437e6e85 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.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 c7c0468e76..1d622e2c7d 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 @@ 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 59cd14a223..6bba754be1 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.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 d97e378fb1..d12badd28c 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 7f97451cf7..5e536d4c1b 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 @@ 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 c7bf865690..e6832754d0 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 4648efd1e4..d12114f9ab 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.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 00b7c45d96..43e2c3ff5b 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 a794c2704b..378f269347 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 15f559d46d..039b8addea 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 b831606a3d..745ccdd9f9 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 6f0a712bff..ab1ac59d8b 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 4b4ebe450d..ca73ee960a 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 @@ 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 5bb65f9a2d..085d6b5b3c 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.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 19050ae117..731df997de 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.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 3b9f8243fa..ba1ca674e2 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 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 c2057ad5ef..19c91be1b8 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.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 462bf98dfe..104ba87b54 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.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 1553402a51..59e8471a37 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.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 83aa5f056a..96086598ae 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 @@ 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 101784d97d..fc7f7c58f8 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 75e7c1a320..3201769e0a 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 @@ 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 e1085c6b28..89a179d0ea 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.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 89ff688a7c..1ba48ca5f3 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 @@ 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 240176f2fa..232989fb05 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.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 f15a20cd38..196d540363 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 670676b48c..06e4539c48 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 @@ 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 a29e511892..2541921e9b 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 99dd46cbe4..03097887d3 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 25455b5872..8fa6a4c1b8 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 1a3f87a7a2..ca4e3f5e3b 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 1fc606f079..4bfedb6724 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 a272150c76..56287df31f 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 13a55eaace..fcfcb81b58 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 c0f469973a..68bea4dbad 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.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 fc4b403c55..b0b2687f4d 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 84d868c1a3..508d1f6eed 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 9ac3fc0e6c..158992a220 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 07938d3220..a189c00b5c 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 @@ 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 a5486fd9a2..db2038aa36 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 6c1e64c4ed..e9a381a854 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 014acff9c5..486d233b74 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 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 org.apache.log4j.Logger; -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 f0ba8bb465..3847423026 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 0e4d406759..4d46607e58 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 0b718071d5..9827fdf095 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 b02dcd8e21..3144098a83 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 51d2907630..a99f87a704 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 51b5381dc3..6c14e74457 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 244627154d..66416ce115 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 ff916bedd0..2a5c996f7d 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 f3ec2b1df9..74f7f9d804 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.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.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.VariantContext; import org.broadinstitute.sting.utils.variantcontext.VariantContextUtils; -import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; -import org.broadinstitute.sting.gatk.walkers.annotator.interfaces.*; -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 e56825dbe1..c384e0d09c 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 ee66b50ee0..e3e8bc258a 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.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.ReadBackedPileup; import org.broadinstitute.sting.utils.pileup.ReadBackedExtendedEventPileup; -import org.broadinstitute.sting.utils.pileup.ExtendedEventPileupElement; +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 2115526a6b..97ed221e76 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 5eaa30bf31..48677bbe5d 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 3a5db28844..cca0ad4bcf 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 bd8c51a414..b175579f1c 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 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 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.*; +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.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.*; +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 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 ecebfbbd2a..d86728d5e7 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 099780fa7b..02efd854ca 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 ee8b01d7db..12b48473d3 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 f23433bb54..1d999c531a 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 8260a5a810..cc62580a9b 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 25a7b286d1..f240d02bca 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 00cc303094..0ca53adf29 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 dc4934ade9..08a25a7e3d 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 3b64abfff2..1c70a1b33b 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 7209848351..2175d39e6a 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 1ef7ccd0b4..d52f07b581 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 f00abd6a1f..5466828f6a 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 a670532af3..c56e2622da 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 727904a3b9..aabfb29703 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 fc769ac545..a5ebd8db21 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 e2fd2a3d45..ff9092a718 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 0b6cbcc2ed..a4668eeb61 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 3511178092..b46d82d8b6 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.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.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 cd5b6694b1..acbeee3b24 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 54c8be73a9..fdf498a3d6 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 e02c62bafe..05c1b3c524 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.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 69a35a584c..b42310780e 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 c57aacb5bd..714f374cf7 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.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 d3fcfd42a4..3b6c87f907 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 0ed61fc487..0bbfa51b4c 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.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 29b2564798..57bc44ab8b 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.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 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 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 5b33395b54..4e850d01bc 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 aa23abc672..21c8ec4307 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 93ee0b0850..3eed12992e 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.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 18aa3e2573..f6cd1d6360 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 2c67265d69..90e6fcd77a 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.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 ae947eac1c..405a44c29f 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 5a9c62b7f9..6b91b01980 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 298aa90b9f..a41e551665 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.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 91ae81cd50..c1956f1d73 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.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 a5ebf27bb3..15b16ca6bb 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 4c3f7bd95e..eb8a71c2cb 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 3750496a1f..9631914461 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 a812babaf5..4e44578c74 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.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 828d397179..efc101618f 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 6be2336c01..2dbfc76ff0 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 b315269872..2c009f7f26 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 c3849e2403..ede19746a2 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 225cdecc32..d7c0dd4d51 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 @@ 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 884d0ac240..6c023573ab 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 47be7e6fe6..83a8ce7d7e 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 22c9dcf919..696a74de8a 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.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 ab075eaf25..2014801e48 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.genotype.DiploidGenotype; 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.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 89504b371a..5c27bc9434 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.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.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 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 3902a0b7f4..8261cd5881 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.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 c4e315f687..10b646d637 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 1f430548b1..be20397803 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.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 2cf149fd08..3652763dee 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 9f4d4182f4..3e3cd128b7 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 cf1c57a054..22c3081a34 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.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 1533e87772..68d8f9b544 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 055eb0b978..2b25df4aac 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 @@ 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 fc8a5819a2..2a0338bcab 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 6fc972b5dc..a10897172c 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 df1f4f9089..adb7c4c386 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 7617aa9de5..e68aa31e06 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 a53665d640..61f21c4886 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.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.ReadWalker; import org.broadinstitute.sting.gatk.walkers.BAQMode; -import org.broadinstitute.sting.gatk.io.StingSAMFileWriter; +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 010e0cf6f2..af80513340 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 ab7ae4184a..60262d6f4f 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 @@ 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 fc196e712d..2c89b907bd 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 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.refdata.*; -import org.broadinstitute.sting.gatk.walkers.*; import org.broadinstitute.sting.gatk.filters.BadMateFilter; -import org.broadinstitute.sting.utils.*; +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 org.broadinstitute.sting.commandline.Argument; 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 3b94989aa3..488e37f260 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 1fe3fdd046..3854a4a8c5 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 1f05ddaf06..443e6e9f2d 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.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.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.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.exceptions.UserException; -import org.broadinstitute.sting.utils.exceptions.StingException; import org.broadinstitute.sting.utils.sam.AlignmentUtils; -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.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 869edf7847..cb123c8683 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 81d9b4ddba..9aa370d3f2 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.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 709bc44cec..5bd4386059 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.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 abced442ea..b0491a2818 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.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.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.exceptions.ReviewedStingException; +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.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 ec6f5c6485..be15d45410 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 fbe6e5b5a5..9702fd18cf 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 db1f888a1d..153c4a23f0 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 f82e48abd5..2851ace0d1 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 feb5f62af5..2bdd4558f2 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.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 ef6ff04f2f..0d68c8493f 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 cece04fcf2..df89efe6d6 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 74f63aa2f9..87c0409b93 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 a4e80138f6..d1545f1592 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 92867e1a91..8a03dea44b 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 @@ 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 5ae35416a9..b5f5442cd6 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 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.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.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 org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import net.sf.samtools.SAMRecord; -import net.sf.samtools.SAMReadGroupRecord; -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 39b69ba29f..d3b992cb5f 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 2f1773d014..908e389a88 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 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 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.refdata.ReadMetaDataTracker; -import org.broadinstitute.sting.gatk.contexts.ReferenceContext; -import org.broadinstitute.sting.utils.Utils; +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 org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; -import net.sf.samtools.*; -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 6ad0340a40..fa1bb4d557 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 9cb7155071..170630b773 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.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 bc68be592e..e1e6c4b69e 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 568e1b638a..fc6b3daee6 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 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 c21f548b3d..8c6539f8d3 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 @@ 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 64e0864c0e..945d02837f 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 0de6897d0f..a7717161a7 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 fdbeb6a31e..e6d0b306c1 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 java.util.*; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; -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 7ba441cccb..f04989fa57 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 @@ 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 0eaa1245e7..0277fda0d9 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.QualityUtils; +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.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.sam.GATKSAMRecord; 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.sam.GATKSAMRecord; + +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 c1c17bda52..b3b63bb96d 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 fde233b5de..b877ff70b7 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 c9c5e09a8c..fe31735066 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.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.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.VCFHeader; 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.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.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 787dbe9af6..925bff9c09 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 85373baa84..255a547373 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 befb2ff132..8c281b2f88 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 58803c9d06..bbd3f5f548 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 407b718936..a476a2680a 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.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 f7f9fce0c0..77def0f308 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 dd4bb492e4..6e1b76acdf 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 1bd420e0a0..d99196ecf7 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 16ec74433c..a0cc393d92 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 e83914ef8a..b209ee13d5 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 5f3e6b0fa7..751f61a976 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 395309975b..d466645ea4 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 f9cda5e0b9..ec43cbd55a 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 deeafd8513..be957abd78 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 7564275813..9c331b5771 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 6017ecca3d..e29e7ed50d 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 29a61e27a1..b6ad55b184 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 2cbc66e313..411493d4f0 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 48b4ffa91e..2ffc7716ca 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 9942ba8d69..c6975808f7 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 1a9d310851..c143550356 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 15b1d41c1f..3e8a6ed172 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 65af6090c5..155a661867 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 7bd15a9747..40f952fd23 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 8d8782ab73..3b7a419f2b 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 fd724d6d15..c6c094f8e6 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 a7ccd31827..76efedbf4c 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 39d2e6b4d5..a0973a088d 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 f909de4f38..a2a3eb3fbe 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 218cb23cab..2c4b8bc466 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 3208c26bb4..8112ae97f2 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.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 0281653afe..38f7a7f402 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 eabd2e588c..0a915db371 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.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 d4e07dccf9..403c67d3e8 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 64fe366376..15424f0f7e 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 5deb5d8c2a..bc7252ec20 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 ddeda1699f..67d54a408e 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.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 2d0355d7dd..8179463eb1 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.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 597a54dc1a..837f352f8d 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.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 ba6f5e513e..b45ee1b674 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 d9dd85f0ca..2ebd183f41 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 @@ 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 7eda54387e..4f05c8aacb 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,28 +24,28 @@ package org.broadinstitute.sting.gatk.walkers.variantutils; -import org.broadinstitute.sting.utils.variantcontext.VariantContext; -import org.broadinstitute.sting.utils.codecs.vcf.*; +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.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.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.*; -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; - /** * 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 0c41a9728d..f0756d884b 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.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 cbac543262..1db692e9f5 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 1bd73414c9..0644c669b1 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 4826795930..86bb3b0e86 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 71dd5df3f5..8d90af65a7 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 79134b5530..aa0e5987f6 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 @@ 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.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.*; -import org.broadinstitute.sting.commandline.Argument; -import org.broadinstitute.sting.commandline.Output; +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 b01533ee66..b5efcc153e 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 0c0579d6fb..c7b3de6cf0 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.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 fe6758e76a..c09c4037e3 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 @@ 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 2da427d447..e90933504a 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.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 21fb447332..5095bd6e5f 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 @@ 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 5f68d34144..52c18e6d65 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 1f8800542b..b969235895 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 @@ 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 18a1e7ffdf..a5c6e05373 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 30e1a3f5b9..af69ebca68 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 50aa0f7078..36ed506aaa 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 a8089ffe8e..c6a07b5ce0 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 47466be20e..822d04dfd5 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 @@ 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 30257d9670..a758df4315 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 @@ 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 4b7fa3e41a..92d73a5ced 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 c0370064d7..f9997bfd8f 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 @@ 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 a59c5134ab..342087b41d 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 4c13d8b184..6a50badce9 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 456f0fa0f9..ef7cf751ed 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 24d4152a58..26356a4a4d 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 @@ 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 abcae066f0..b95165841e 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 404bd80b6a..e65b8f9216 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.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 95f3e160cf..5449906b2b 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.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 031467ed9b..988d297f67 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 a286ce7898..fef6c4ea06 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.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 618d9ce792..e169dbdfc9 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.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 e7ddac1859..b7f4be39a1 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.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 dac9964949..1dba351e2a 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 @@ 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 4037f75b99..f43891e77c 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 a36ed9ac63..d280ac8049 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 3a731c2fd9..6d6cb8272a 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 @@ 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 41de5ef96b..bba47c76cb 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 17c4a7df4d..7eab6f6c97 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.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 0c5085cc7c..43ef4aa741 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 cbfba848cc..1c2cfe2e1d 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 31791e8058..a17e814615 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 d9e74640fe..483c874dcd 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 68633a2b3a..65c3320485 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 be6f7f3eb9..6c6dad736d 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 493f26e763..a9d71ef986 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 b962664eb7..b350b1a29a 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 4afac69c3e..6ee12d42ec 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 036bbec4fa..db8b559406 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 3420c98764..73a29ba4f7 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 @@ 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 e722ac196f..988240ef94 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 80dc354559..f551e1368f 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.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 31a2f41fbf..7e87ce8b54 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 0b63d582ec..29ffb13e4a 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 5433024469..3821c9c8ab 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 b6f3e9f09a..26e66014c1 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 6c855c1c7f..f7d237401c 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 d8af2ea8fc..7005cf8699 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 @@ 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 51e02bf74a..66e1afecb5 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 a32aa56458..8d43a368aa 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 a1a08c95f0..31d29430a9 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 c52cc0b527..36b8a8c654 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 70eba577cc..e5b0549612 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 4e4294b20e..344eccb83d 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 5812c9aec8..5f7db458a7 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 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.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 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 ce6ca570ca..adf60b16ba 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 org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; -import java.io.InputStream; import java.io.ByteArrayInputStream; +import java.io.InputStream; 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 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 b683f52478..62e371bc03 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 4f5dcca619..2b359fe6a7 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 01f1dfe960..31deb7535b 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 2b8ac387c4..c7ffcab0c0 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 f3d9edab9c..517f9f75d6 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 080762039f..6c15910b1b 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 f8a0ca6a70..bb9db5d980 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 df2010e8bb..60e1d99487 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 @@ 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 9beb7895b3..f6aa882ad9 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 @@ 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 803d6ac0f0..1d4251542c 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 @@ import org.apache.log4j.Logger; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import java.io.IOException; +import java.io.StringReader; import java.util.*; -import java.util.regex.Pattern; import java.util.regex.Matcher; -import java.io.StringReader; -import java.io.IOException; +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 0642563886..52b6f3b011 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.io.*; import java.util.Iterator; -import java.util.List; import java.util.LinkedList; -import java.io.*; +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 cae099eeb6..3763ec67dd 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 4e61ef9e19..ad2a6d31bb 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 3eb2be96b8..0f47da4138 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.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 dec69f7c2d..d70879a0a5 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 @@ 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 901de6fae1..c3f437f11b 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 3feaf5e1c8..dba16cf86b 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 4efba88258..a191670a4a 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 92c5d648bd..eab392c4d9 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 @@ 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 5d58954aac..5a56710562 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 c5a3b6f2ad..a59ed7abe3 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.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 ab91d0e2ed..5782c2704c 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 0000000000..c702fd6e58 --- /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 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 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 0000000000..8776879308 --- /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 1b76fe2f9d..0000000000 --- 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 0000000000..8046a0c025 --- /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 86d07d4fa1..0000000000 --- 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 0000000000..c8b54e36ea --- /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 c8b54e36ea..9f59adeb66 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 void testBasicFunctionalityWithoutFilters() { "-o %s" ), 1, - Arrays.asList("") + Arrays.asList("416a483e87358cdcb0b09a496e3254c0") ); executeTest("testBasicFunctionalityWithoutFilters", spec); } @@ -37,7 +37,7 @@ public void testBasicFunctionalityWithFilters() { "-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 0000000000..4da049b39d --- /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 0000000000..46d96da278 --- /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 46d96da278..21435dd7dc 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 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 c9878b92862072f1557fe36bdec8209cdfad9b65 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sun, 17 Jul 2011 22:58:18 -0400 Subject: [PATCH 160/214] Supports the new GATK release naming scheme: 1.0-6145-g1af7673. Now looks at 1.0- (or appropriate) and scores all of these directories as part of the same release. 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 4da049b39d..298d8d6c89 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 java.util.*; +/** + * Merges read-back-phased and phase-by-transmission files. + */ public class MergeAndMatchHaplotypes extends RodWalker { @Output protected VCFWriter vcfWriter = null; From 837a91b85d4e35b33ada0835a36af782d122b5c0 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 18 Jul 2011 08:31:08 -0400 Subject: [PATCH 162/214] No more ls to stdout unless verbose is true [manageGATKS3Logs.py] Fully qualified paths now work properly. Moved script into git [downloadGATKReportsFromS3.csh] Correct path to files in runGATKReport.csh From 1f538d2add94d5752cfa52234ef20b414c04e347 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 10:33:57 -0400 Subject: [PATCH 163/214] Place the preQC database in /humgen/gsa-scr1/GATK_Data. Rework the way data outside the center 95% is trimmed out. Cleanup some documentation. 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 2f87a900a2..e3910ef11e 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 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 List diff(DiffElement master, DiffElement test) { 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 List diff(DiffNode master, DiffNode test) { 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 List diff(DiffNode master, DiffNode test) { 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 List diff(DiffValue master, DiffValue test) { * @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 @@ protected List summarizedDifferencesOfPaths(List 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 @@ protected List summarizedDifferencesOfPaths(List summarizedDifferencesOfPaths(List 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 @@ protected void printSummaryReport(List sortedSummaries, SummaryRepor 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 @@ protected void printSummaryReport(List sortedSummaries, SummaryRepor } table.set(diff.getPath(), "NumberOfOccurrences", diff.getCount()); + table.set(diff.getPath(), "SpecificDifference", diff.valueDiffString()); } table.write(params.out); @@ -336,7 +338,7 @@ public static boolean simpleDiffFiles(File masterFile, File testFile, 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 ecb836af97..8e362dcc42 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 void onTraversalDone(Integer sum) { // 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 efc6ef1606..81b6f7e0e9 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 @@ 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 int getCount() { 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 boolean matches(String[] otherParts) { @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 int compareTo(Difference other) { 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 2fe9b47f8a..0000000000 --- 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 4e44578c74..df2a5cda1e 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 96dfec6e8a..2ae19264ee 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 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); + 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 0000000000..cca1eccb44 --- /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 a0cb47770a..dee7bbd884 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 void testVCF1() { 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 64579a01b9..4e4080bc7e 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 String toString() { @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 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); - 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 b3e422ba9f..ef46d4bff1 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.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 boolean foundString() { } } - /** - * 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 0000000000..bea9eaec57 --- /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 22635dfa31..386c17659c 100755 --- a/public/java/test/org/broadinstitute/sting/WalkerTest.java +++ b/public/java/test/org/broadinstitute/sting/WalkerTest.java @@ -53,7 +53,7 @@ public void initializeRandomGenerator() { } 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 @@ protected Pair, List> executeTest(final String name, WalkerTe } 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 2fec2e70ff..057053a1cf 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 void testApplyRecalibration(VRTest params) { " -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 fb18c6c333..00ee44f756 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 void combineSites(String args, String 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", "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 void combineComplexSites(String args, String md5) { 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 c4ca6a551e..14e63191dd 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 @@ 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 void testVCF4ToVCF4_alternate() { 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 dc3cfd9d4c..c2c9561182 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 cb9bef684721ecc2c31568c710d573ac52ccdbd5 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 10:51:22 -0400 Subject: [PATCH 167/214] Updated documentation. From 95c776bf59bf50f85c39c5fb03d02062a62d78df Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 10:52:06 -0400 Subject: [PATCH 168/214] Updated documentation. From 5493a4dd99179d80b3921931177cd14e2d226b72 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Mon, 18 Jul 2011 12:06:08 -0400 Subject: [PATCH 169/214] Added annotations to filter out : * unmapped reads * failed vendor quality reads * duplicate reads * not primary alignment reads 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 837f352f8d..3dc47caa2a 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo // 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 5a56710562..c1eb48b682 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 static double computeHardyWeinbergPvalue(VariantContext vc) { /** * 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 static VariantContext sitesOnlyVariantContext(VariantContext vc) { /** * 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 enum FilteredRecordMergeType { * 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec * 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec 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 static boolean isTransversion(VariantContext context) { /** * create a genome location, given a variant context + * @param genomeLocParser parser * @param vc the variant context * @return the genomeLoc */ From d05d79218b4c69445ff23bb887c2b1d1e733ee5f Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Mon, 18 Jul 2011 13:08:22 -0400 Subject: [PATCH 171/214] Implemented minimum quality equivalent argument Mapping quality now takes a root mean square (slow) Implemented Quality Equivalent (QE=i) (1 to 64) From d8ba4ab835c643719b8f939a35f29bd146eedd48 Mon Sep 17 00:00:00 2001 From: Menachem Fromer Date: Mon, 18 Jul 2011 13:14:39 -0400 Subject: [PATCH 172/214] Only maintain an unbroken haplotype chain if the current is phased relative to previous (by RBP), or both previous and current are parentally phased 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 3dc47caa2a..6970431ffe 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 c1eb48b682..2126003607 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec 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 @@ else if ( nVariant == 0 ) // everyone was reference 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 00ee44f756..c5fd9bcbef 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 void combineSites(String args, String md5) { @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 void combineSites(String args, String md5) { " -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 15b16ca6bb..a1c0433652 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.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 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); + 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 6970431ffe..9c2a520ef7 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 c5fd9bcbef..904a5b29b4 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 void combineSites(String args, String md5) { @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 void combineSites(String args, String md5) { " -priority NA19240_BGI,NA19240_ILLUMINA,NA19240_WUGSC,denovoInfo" + " -genotypeMergeOptions UNIQUIFY -L 1"), 1, - Arrays.asList("0e475c98d5152fb12eb17f3907b849a9")); + Arrays.asList("1de95f91ca15d2a8856de35dee0ce33e")); executeTest("threeWayWithRefs", spec); } From adce37774a60b935fe87937d36333414f37ee72c Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 14:12:01 -0400 Subject: [PATCH 176/214] Add functionality for tsv output. From e5e7523f8ba7d5a41dd0dc608ab857f958bccb99 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 14:56:00 -0400 Subject: [PATCH 177/214] Modify to support either bam list format files or tsv formatted files. The latter provide a major advantage when dealing with samples with spaces in the names. 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 f4c5653185..59d4968283 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 @@ private void loadReport(File file) { * @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 0e503f92ac..f7ea256966 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 @@ 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 @@ private boolean isValidName(String name) { * @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 GATKReportTable(String tableName, String tableDescription) { * @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 void addPrimaryKey(String primaryKeyName, boolean display) { 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 e3910ef11e..89e20dad1f 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 List diff(DiffValue master, DiffValue test) { * 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 @@ protected void addSummaryIfMissing(Map summaries, Difference } 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 @@ protected void printSummaryReport(List sortedSummaries, SummaryRepor 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 @@ protected static int longestCommonPostfix(String[] diffPath1, String[] diffPath2 * 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 static class SummaryReportParams { 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 SummaryReportParams(PrintStream out, int maxItemsToDisplay, int maxCountO 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 8e362dcc42..fba6549fb7 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 void onTraversalDone(Integer sum) { } 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 df2a5cda1e..77a992ce0b 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 DiffElement readFromFile(File file, int maxElementsToRead) { } 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 cca1eccb44..77159d9c24 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 String toString() { @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 a9f956c80c998070131f61e15a4489bf7d9261e0 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Mon, 18 Jul 2011 16:04:11 -0400 Subject: [PATCH 182/214] Fixed several bugs in the pooled caller. Creating a good dataset to test its accuracy now. From c618a5b54cddee61323560123c3bbf5ef0134d17 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Mon, 18 Jul 2011 17:25:45 -0400 Subject: [PATCH 183/214] commented out wrong MD5s From 9729d61e2d6f5bc5add2933ac414748db495704b Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 17:29:00 -0400 Subject: [PATCH 184/214] Use geom_text() instead of geom_point() when outputting data for new project only. From 044f5faa4dcb6c98bb436bd4558b2240168b219d Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 17:44:49 -0400 Subject: [PATCH 185/214] Support for numeric columns. From 916c0c9489adb1fecc12ed783ec0f5491f812d73 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Mon, 18 Jul 2011 17:57:12 -0400 Subject: [PATCH 186/214] some quick & dirty debug info for the replication validation walker. From d5d107856c4588fad08857b219e0d296f228c851 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Mon, 18 Jul 2011 18:42:21 -0400 Subject: [PATCH 187/214] Subselect based on bait set. 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 110b41d3f2..581c479792 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 zcmbTe1ym$KmIX>T?(W{WyE`;a;qLAfP`Eel?%L3}ySuy7xH~lNH1>OTW@lz+|Lp$# zc{1zdIrZX2WJTtCFYdirin8DkaA06CU|=AvGeNL_+F-#TzyRW^A`H^<5=`%7U|@=W zGlc{B!n~KL6tJueJ_WCPtwD zsR{AFYvO7IvNCeEvIqXXKNv9TKmC2We`Xwj0s{;EGce)*y|IF^lfA8(vzaW=-VLb! z7oR|9F?&-p6Ll6w6I&xEr)-U9H~gQN??WjZP5d#b1M;>6yGaxgS(?J6-?Cfoe~?>~ z<5z6c7dlF0gbRGlaFigU%9}~~91NzH3m=@6opQl()F88#HUGZZU0PhctmZ+-NA^m^RjdY}Gye`W$hHsT5Kac_fs+|!xl#x@b6n)I-eBYehj#xOMuH;r@_ zDe#ELa^{|Nrwp-cq2BuulW+$_Ai@%FBag1mC+L@lm@JX%#^^WGjZZFT^;XZYm%Ytm zpN_n7GrezTea(?#lDhRFWIA=14vZ({OUX&g^rYp>$(Wr<_88J-O%$KcRyh2;<#;5? z-T-h1@-S~0F4C*pBKlC7ADJto&$A^ur7tYhCJwJ0fSgoJR+69?Hl$crIcyDT0OJo9 z%knS9-c&HQspA$LUy=E$(4*#b_??g3NAu-piFn%m)WuBu>W>Qq_F5iP3zM4P63x3T z;W?`fu`B>v@s4(^X!P7>h@osvYSJlLBOQkn_z6vUNNT{9HWQOkU!AH3}`8 zW*RFF;Et+kK5?i`n$KD7)Hv+6I+4wV8kxP~Zshdus-*>RB@c9mq#a3 z9A6;`5Qi^O$_iALJl{FUn}>Kwtr3`N83`~?5IkIDT&;gwp33yUh!6DK1yb=J+Ag>k|0TmKc_uC<3= zcOoP5lwVUA=iSqqgTIDC6f^qwT*OT;11t8p2WGcnXsXRN{KZZjd8|M5RjxlNIquJW zcX_reRtbbxuxcE4%%wC_w~4qSj1O|C4`RfX7;mI7nk|L9|HDR zqh^NHIVB+*d3pZIg#-xu=l;yq75?xs21p?T?+S>oawtRHwi!52Jid8*cHrFud{CQ% zF5umLUU*Q=DEaQbegYj=>-N1bU}U_4>{szYuPmFaSK(6MWo~V(d;_NuUeyb>b{?VL zNeth^gm9nO-uw96kM7m_O){xt561oNu>xGi@OZ^CmQ+{ucGhJ`(<{n-_2|S~y53!a zUZ{SR8Jc+eY4^Wf-($YG-Zz-~S&SUwVX*fm0|jC6KdoR|+cq=^__ianEJ%pm!|;iM z->by8e4g+8WbGpEV=k=C$r;J+%Ta?l=BQr9WT3@Zqxx!m6D&M{WC!usA1;J8v?)0axl1w=Bc4A(hdWl+atCaD(t^;E^S}faddq2}8 zN^Yv3xhxP`Ra!TXEm-dWcc|6MH;e@e>@07&%oy0(n)|FHK}1BFO z`0AQb18Sy~)~*yu+4xs3DK9mtTV5|ufW#g2dI>vV~&K6bI+y|+vr=P2A26yjCg?2T(gq3P}Q@%%pxXrqvuT42OZV3-}pLE<_ zS%jH4nxV!@q4NmQZsftNo%;>P>`=mOg#HL`=UuI&^$c;*;&wsjo4z}JYi}p(1Z>RW zFE`5BXAjIrR^e6mPe5+-yo=rPYv^yUj_dlw;~0nv5npw>2R}d3I-TL&?r;$8{@Oo6 zG<_nGwN=Ou_QJnH%u-a!DHmVqUuLCMcvPm6E%kRrGLp&eL1A;rP!8gJWI_H;?j_mc z6ykwZ_?A6#ednB2P^ixCN;H4H;5SQ>G|AfCxAzSFbMWBAbIcRdj6c7NR%+;(_P1F> z`{EX1t@T`vwvgiBCRh1W#K@znWA&U}l&a&_QTb@9VZgWP&KNhTIhV7Yz;5Kr>$=YA z^6O9NM`9sQsPR6!ZrjBg$gk{v7Gb{&>PlRc`O8_4GC!dIk>me0BNP3*3~6Bow0HJ! zF#CIU{qOYw?f=@=#2#p34>C0Zn*75L%zsoOo@rVLLZ86EAU=bEiTt1Zd^J`9IslBE zO)LRs&LArjr@yA@LPdZ=pD>CKoq@6l2IhTHIQ0ECrM?pSCu!!wxCW42)0*0%u`}MKeW(SwOxy8}1mp$|z3M9n+8ET{MAaJODT<+!~8y&Gs|BXaL zL1)IAz#xT8x$`=kmZ zI(+yn!%Sl{D`7%Ds~6zu>dUA9yhHw4L-|9oIdUL?fkEMcfpPu2+4)BS_8(IsVP$J3 zX$CX{89Cd7{yHa>njYS&e@dsR%!A3BggEKX2$4ZQrAea5(RRO)$i_>-j2K!9>lm2p zCsolshr!u;#G!z_lrOQ!{ zh7A~ejQBj}cwMw^@jTilTEqzbhWI9k4U74RB`zBP1Z**7S8bn3Vv9DhIv) zmeqH+2cGd2LkPV;lGT@SkAn2f3>#|)8>qUS%Bt_Uqt?gnbXf=Kwcp>5 z_loJ$uPxxKBtgZ%8ieeZRgtR&y#m+L_b@!WYv||}B0DXa5go!vN(2sT_L6w{=-qc+k`a2VN+P47*CcjK$xO<1hIV+kj~PnrY1Zp?XL!h;%+^zSHN`|-h@vkHRBaUAA+BJKP=!A8YCK6p7P)UCDNZE5Hg^f`_>dD9=ttK zs_d%ol#aAl${axVIyENcFb>#r$*|fM3Z(?T;EuNr4g;E+hJBQe|*fY zOw?dZz&)(3L*mw4&frNMoW4WJZgOimujR7_VewAkxG}?;wwxs>(u8wPAkc)w0j!Z1 zUvmnMHyJ@si|?laUU@CtC^6t2#$#e}uFUqX!3&O1p15uHtv$hf{JgoCsfE5Zd%)zvpL$bHhI zl|S33MjC!eVkML_-MjBn2Y?$yv8N=Z+XXzn2`3}W{!Vp%X7f(WGMUb8S(3*&g;%6m zWn=#A8A_KMWuj}^5;WqTD$pX%7LY%0omXuuXIzO3z?bAj9OB(0Wx#|?9FjN@b&UG% zFj*YDu~Y zyiBtJ21kI2g|a292WEz-3eU&B11FQOrg-LqkQ8 z4Jc%p?5mC%E~lt$IfObq7HoN{d9=KG2$4MTsjh`2|jOJDQSFUKP`f1+~4Yid8dC;N@MzhpLAhs`>qQ(I}QHL$D& zG4ROVhTXgvWt53-EnkquViLPj^~o8mykJJkb@_HzFq7w#)5TVeo)V3N#-~<#+1BN6M5z6P}03R{_hFWDhY(wJTB zb6c!HEe(1hT0NE(iAyo5pfNLUR>^`0?|hxH*@I>dX{6>(FLG3EPryn)jAYQRUz4y<)(u zP<;7xX(Zf5)vM2OZCri39C6n=#y5-3nen6I5zS8}B{yLLgxN#~^Fq+rc6vZyaFix& z0o!xEbm1q7tsl7h(>pF=i=IT)&E}OpS7BIjM?|xb83q@O9v`2bK1^PRv$J`QhGt$v z>K^)Ehoeh8VqT=*SDzGy#V2Nm>Y?;?o`2DP@6PQL>x?5}ofe0P?(UJ{u7x}2r&DnJ z5`kkl1;NT{@j26Uir3wo<+6p_XPB@9t64qyu}@hL%*KStR-h(T$CD%#yLT4aB35_? z-0eAli249i--h_cGfoJ>919<#!~`Z%@!KHv5L#9MVp_B(=bVJ9aU$%^-GUl!+&}iP z`r68l@89A>+Os?$QainA_wemv80bIvZ;QfdswM!g^E2!D`RIByT21E;Y}!&x$ho<- zuc*|WX^I+xLg9Vn`~uW?O%k;S6Q7dUwJT#yjPrxFHhT4ei?j)89jOmj!(KQlpVg~> zYU9@2Hg#ZA=(k%~qs>3`oj0x}rV-V6oqxjDdB&)&BxWN&3+(i|id(WSKNBmx@3U@S zvc{gbUa`sEu0r6Z-oE4IXG=_L#D;`s;oGLK)fnI4PAzqkv)&Pzz*H5SykkofoG!p7 z9w?<0(6!s5QQ_J;xq2E{G<=&u-IO6T?HI(BLRTsOlvI0o@RnxZyGR-WiH4N_W!ua9$YUE+P04IIf)!AvRPIOFfc_V+ zYzm-#4p%pJ@uNv?P$eG)UOx6*pgb#rFEIWc3eUJJ(K)kR>(3$nQpuvp-URv?n^m}gy@X&cBJ0e;7Mk!-rol)U}PijgQ`%u#VQCbV$;D$JSTcfpJM zhY^Al(+&&Ug~7o{^{}%9-hP^a)Zp4>vk6UkE$}^zrI-0RMDy8g zLt1oyk*V6MS<~GUJJznxav7|JcLGUcEpPOArtXVI>LKq26N%4*G5J6DyY+^aVvL&Z zkj#lpev)4kLlcS5bp_A2N)4AU+wlD0MEl+A^CI}fFkWQ7YoD@=SzcO-lC>J@qylS6 zRXg5I-b8FlgEgN=l~K4ajj;=pno-=cP0*X}PMP=`+42RBEONJw*3Q(3gsR|C@$0Z+ z3S*xe>$u+G*{=`q|GEL`~y`7|AFKG0ww>yqR0POiHI0GIfIN$oc|k|`!_6C z-9}|i9Yvt8?qEd5n1~YjhNOYL$vcfR^fDf>cy6e*m$k+rga`zfzfq3ldYM`j4o5P$@IyEHVBVAbxsQ1DXpf~xn+iosSKrx zIT?j2b=I<9AttrwOk)=@YN^cGY~zSNOQ8E7Dr{rFbJSR~>bj<||Q>Sp=5bP8Pzs>{TlgunU8_ zOvl7D5ZixX>xLQ*I3%ybDl;2!$+ep@YE#6FI3RI<68y2FttMdcQ|~7BGEE{~HPe10 z%SvONkk?Zy;B>B!tah*!hFfZ*C{Bl{*{SK|^xm!$c-Gda-B^Xq`druqKF+9#x#ob6 zH0tX>8Mi{>E!$5^0~%v(@@5vxu#VMk*rk zU{^7TD)agY4QN*_ zkmMz|-l+3$(~ zLy5e#c4{=r7$KT>om~PzR7_i=df#5QH0edz2Ug5YaSw)gL_)}!|M>Oz=z@C67$xUh zqXUR;e1N5P`AZv`Vgum!;i%g&I1d;s*YPic!uTp00sF+pD3mua3IWg_${aEKc^`>@ z8s4YuuEo6;v3ikdM6o9blzIggIdc9N1h-iV+4XnRaVe9a8MzNSE!Jqad4Tg|5p)L3 zK`e&r3`IYC;w>^m1F|TO-)wQDbrmpV=d;g7K~@BVIKil7 zc8}D$f}Ap>e)2o=FilJ_j>L(+!hVUEMJ!H1IO2H+lCchsCi^I<87x__wwT>HXw8#0Qo>ccQ{>EX&j787!m~NZXzF9fjX`@Dck~M3Xf=;2UZh1Z|e~W zXu%xFWc6JpI`qpnqbQO|Lz-yljO zC~xw$q6_25iyrmEJ3WE#GM_kM(5sd``NW!fVW4qJqGYDUDS&dZXjIXRA1_;C6W*!T z?^l@7B?R|66qDgB^mM#is-iF;;h6vZ8}lWESohJ-DPxGOFsQg1a^|h~{{gHc`*#8G z?_iyUnXT2|5xc)4ZLp&{TrYnjDA^x8=ig#E|J8xyA1{A_bCk`DOwIm=<#ek5QpS+P zc+Xg)?GOr#kx4 zA)-$?da|j7V_3OrNh?&uR6PCs+q?KBD@W-4_Z!DII`_Oi`ioyu#@dn$=Ij$gSHhB* zMAq&FM)Lg~x|%bniP0g!+Ri3Q{T3|VjQ1(*{EM?eRLbY!A!dY?EyVp1XWcW`6kQ2q zjCLAkiF2?$b0o%^^Rxb;%4sQmE-TA;ob0yN4(zrps>S@W1vnuIePii5u7*{=iJB*( zvUj`8ih_SZPO}9-#n{P*)E9J0&$~?5*X7T7f6FtUaXsHg67y031=>5!KTObYCBh$m zHn^(v-xLp_EuEN&YtUm!T+_yU=QnVXn#;OVUf0_1VmQi+n_Y7K#=-YaPr>Sc-rAs} zRs*!atx7p+Fi}{JaVKw~@IJ9tZ*_(d*rgGB)9q2ooafKySGoqB2;*cRwMY+qF6Gei z^xD0OfKnJ*ysm3dUm?T%HUA~f<}ryFK~JDlS_8t|b#mgSvgbCdf`^OWCs#CQ;7s_5 z|4K?gNmKxPIfjRpD?Ua(xXo09&!Sk5Xy1EvgLci~is7=Shj3MSZ;{hYrD4Zz^@_nC zM|)ILd~OH0nx(gaQu=LxD$@Ai`IE|`;y%_z-eRc6Ntg%i6LOe%mXak#m7B;5F_P%_ zTad4eT#3yJ=;^^A$rjavw#^uQfmk4HXFqFHp#A9?27dT4gmuKv6sLp}JTm6fmtn&K}u_U>K}h2nwz_gzy{ zjANO)%l81}WfM40g_~omaxM}jQKI;X>X%KGQ3IN#D})WG$Q@Cd29qCGyz!Zcci(1s z+~pZjklky18#F^u?yMp7jVellvBjs3NxxumBv~Zc9RKL{uP^D5MlYp1NM?2bl{|+!zl5)oTo{MdIj37i| zKuq~dAyR1M!jbJX}fo(v%s*&9FsyCLkg-~{q_;9v0HBK?OCrh!I z1#mGj^Kl*sV=4>d0XV6njEGzJOEQ)!tZazA&KH~_eynwjI-?TxVr!_TByNwvqxv%R zGw+%iHH+TJy9mKVo5`U?vNrLp_~Y*yioasx3RXW~`2NJxdT1~(&VLt>|51_t4H7r| zJ4XK3N;Fx`PD4c!#TV6|z<1li1D_i~T#M#8zes%Z96M7Gz1xtbje;6E|Fzvio ztX~D|Fs_L?Rt_1dbWdig4gR5pZOhdZ`|lrDrnJl`Wgn}jbS~gQv6@~_lYmSj~GJyMkxp6}Mw~~=fVVu^8AXzG6h;!4JSZS-eE;PU+8+uNKFJY;$MA7V7(}NFZ zFIrfALl5`HI+tIb_Mmj8;9$P9v~S~4ck5@p^UDCY3vG%zCat7j3~l53oeZlc<^sk% zuNu}p2WpE1kj}(&jUpsLPu^P9a3;L4IR-?k;C{d}dy)^;a2TJ~vq2!ayVT(AYm$+#C0Z4(lO z%NqRM7ADCyY0}Kz+tR{Lm1M7EwZtfs)bRmdj&2&=cTjFcCfC~k%97-3KIt1=zv^xj zRE~0ExqK%+H|K#YlbP1Meu;E;Rb*U<6Sdi!3 zFCJ&~Hhr4I(nVUfI@99n<_Jr((!_TGVU(k)F{Xy*#>BR}V1&P3jtQd9^K6WfH@w2; zmkeV`JHI{{cJ{W0PjS`wkrgAYldMXj+w~gD$GjBGW@)`6HcY#CK-II^XJ8~MwihSC1?h9gdkS4_0~d0=W=CKCIUM~( z(sd%x?ET|UD7r!c17rE$!_hx4jQ>W`Y3SGzSp3m9d8Kbma@$mQ#^|jz1P?8nP-QYU zH`R)vFHr*b$QOoaq-EG182XC+lk0eK0SjQ8>S13{N=UXp z!G>eI@4=E2xeFiUDR$jXyLYZ+!_bp@e0*g2P2KYyy|TUEcl+I;gK2pS`eRIyJFr!7 zmwISnnU0PckAu`x#I;gPMXiHi4-t~ zMK?k)?k2=Y26?F72@>_2fSy`n6po(?LL6qbn>Y$$vg*|<<$7ru&CPYG40PA4^BQf1 zbZaBwA5>W^s;y><*aya{4qAp~%@CE^(^S4LceaS)lS!WGQq*U;vE9m#j+v?7z^5dR zS7^&`f^G|q&E-pe@X1y6*h#KWJ^?w%WpB;av>KhD;UU`% z=QWN%U78?%*STv5CgoPf_fgSN(4feQel5W`0}q~O#}Ou%!3g)mkIobxU~APm1`Rgh zB=+saCq(qXNoqL&z>caiQOs$;q$4SDJ9aY=+#SF9ZGpW>4v9s-aR;Mud8A7GAPvGy^<+rn8it>*A9YQ<|duNp@jAN!o z%l2WsH7Wsa=Q17}LIuki8b4J;v7>Fp8SVxp!^7X<$NRHylXh!bNc{59Npe>kq#-sY zm{eRl3Mm8ZU6$tF!@lCeAw1uHRTF%w;ewdUGaZH5!+MHtCQM z)?@fgdCa!eJLY@Z9scn3bqFIjKmXd2gbHxC zN&dJKr%w&c3N|>K5;agr+ksFyy%q@kkw*wok*Np|C+?d)@K5w!m9Phh#!;R-5A zUzdMShqDw=hqG2thqL`TXD{1r>5tuWTZkMVj(Vomp4dSQn&?6dntVt6I^paNu2fG| z_h~~;k_&~+>ke^XGG`eIO(#Ah3X@yPKGf2NfX@+`m$`R>D*P}MXWqz|O}zTCOitd5 z$R^$NU-mb-AhZS-aoA0k)g5k+6)T}4hT7{Qt-%a6uUO1#m#wQiEGs-v_F zUJ`qm<;K2S!j_h}^3$gqJ0{Z6{HF1+;Nhy=e$@ucYv}^k7R3tDZ$ zPJd1K*xv%BjF;3jS#e!9weeTBUFC8D1u_j0zExD3 zCD58Vu|M#OXNE-)woM>zNK^X0Sl-fW#)#L^xL_e0!yd&Cv%Ye7rTw@j^Q_8@&sS_(HkEJ+S*OdRlne>{fp?j^Yb=>ws3JS?aR=>wzGst6x%r#d1g^@;*y1ln=w zpr)Y2)f!e&Hb|It(fv}IxL_a=ZW?83OUQ$~Fc2o{Fw=jVHcZHgnUY;iDxjRd=-93y zt7NnTd>C6ka(8`h^KA=>&h^z-Xh*Y|z>#22{g?CP73)au%~Uj#GNY}xjP zcv}PXU4vC#>3Xiggm-$7VyUVA$YNm|93lb$imlkIHQOmH^XY-c=7V=7=g6YMc53#~ z_MyOC?#U6Kxjo4bA7`)LM_qp+PeQIvk(cr{q`&_P?xADjSVeJC_HpYkTOwL~FeYGRN)tkIhOP2tm@`qB96<*#~V;`;WaAz$?aZ zc)r`@-bjA#jpg!u_sYE?s9rZe_?mwsl$pGSbi?uRt(yN(gAq7Zs3C4(at!Vg9JvIC zeI(B0CWS!dvEfw&RJ-v`IrT%leEQT@T`JrxXJ)nE!1_V5g;*zaNBj>&{4WXrTYTiI zChQ-H`5!U${}Ip809iTzC!SNN;o**9f%`EDOjxmnLQ8Ncpfnv7Beneuk3j>X49eF* z4=9*}Dll_(OF&4UuywPrQj}HlDsNb{hPT!!PqDUwl;La;iNLlL_~m2JXf5zj&A<5g zX1=^($^|jUKka)t+2sI zcnI42DVJE#J8a4A#zBMTVo1PuJ@UofqdN+D{3(oh{z?hUWhNH-isZX@R4Vf5Q%h8+ znRj0-p7&g=mis_#x_c50(z7GZ_uYfywmulkO?*6Eg@Pw2Rtt(>q7y3lO zQEcy+6`^V2ZjwD3p^VzCP_kE_46Cl={?yl!9<~mrg-{ER>nvo0haDVy!p9wmNRKWA zDwYAUjMV-KFPR~DG@0M*97Po53(c7sgfb6738&xev?N#;ey-L^b2a>e=%t07N9Z(Q zyAvFbplGiMn$(T<(52Dg67{ag?6gZUvQ*M(mNRBLpYsCzl&4^ajUPAF*{B*+&ik~1 zB#xGX2S0dUk`Wf{$uVE|ILMKK<7rvnZav+n)0o0YA4}EH$&-nuE~lOqM2nVUT4-Xo zD69)8X%au3?kowVleU}%imQy$W3p^{R~BBi(>=jGB43RcU9irL_AQWt~|uuo(HR$x4Z?cPN%U#yp*56HAv! zUd$o~AH9vixFO6a;n$jr%31$gvnghWDLQbM_lO7oJ;vV$3pEB8W(^+QNsQRRIdW^*FoOfdVa z0UJ$_8f1`6+MHSW>^l+%BZBmx+E65`glSfhrs*B9#seR>N3PDB-K?Z(F%OCNdd9p^ zPNy$wNHlE}Y7lja2tQ0JdJqnxAV@7baS~TTO^rm78nj@lEW4~z|GXa?LGUv%MY`oj zNOHl|)v*(WD&Mv^XXvQzmo+o*;IsMil}wPajr?8!?0C5xzm7Oi4dp)V?8Z&26oMjU z%1DP}RW>qBy)S{zwK^c%9r;|k_Z+NU4s^K$zOLNZjYyIsk3Z0;~0QwS=8ys zTsGM1En6~bu1Qjs5k!G9``LVq`KhZOj<;4#1YX;Yjfm9+PE0PFnJU=Hb z?^|pj*lsQpO$}+elK|;yvj+T$=uj1}yk13miLWDqR>l3Na)>6QW+(lF=J`Hbi^7+< z8Wsl#?Wh&Kv#Et7!|C^zCvmlZF2jXCE2z|id+!rXiHc1c7*KW$>@c(W6bQZ+e5LUk zt*p`e>#04!Z~HskdoU5C#4}T z`vRMsuy96DJNeAif9;Oz)eo^BV7Yl9fM@oa3D=lu2@Q&-Xqd3i4<4Lw(dXyk5Ih24 zPjOAQAa7Zjta6ttCvJ=b%p9AHv+Bod6nXCB7NzD`m75Ol5>AI8pJzqWMs#8vQfkBr zXCwxXIZvl}FQ26i%~^bs=-o06zNc$M9X~D2>(H7P9vjtUn`oUW;WN!nl(=Vk(4Y^0 ztxZ%Dg

}{_1A8*D`&mw)g$&SKim?;nE-}O-*XGo2GTRVe^woE?LNP7pvwXm@X_% zlhs_sFkmTRcCLw8vZGLQLfbryPtyU)jOw)MOH?El;adm^-CgM@!)h+W#Sdtocp9wy z&J*ouJ9Epj^azzzJ!xALq&KJ5nD?V3rBQ)2bD|4}hIWw&uDMuV@JYJXBa4UXVva@& zmSS_VsnYoQW`sg_>?Tw*>`HA#QH*b_pG*0cRmlM+0%sE+(N- ztRx@zV{9%hTjK3H3c4tw-M;u+CpakqN(-iBQRG_xCHrF+cu;j%*FE4!$pg-x{cznN zI^_Kd^(kX64IfxB^mDN{A9r32?uO5*BXYtO*?dRPQ9RC-HcW!*wifr4O`;6jJlBoj zAjYXpXFtC9^m9aq^9*voxXBzT8?;pIjaUgBC!&cUos1%0tRhU-fO7`ph$krIYD5I> z5zOkD#C(^u?P@3M3EuP@1hX(KZTPRq?R06BC%Yqw-JcD^DSUubi0K^&AJd#UAApTD zaX$k=44Gxowzg&~bu`MJj0wvmZ7TP;A)f4fOA$!R{Ml8XvDi#yN-443k706Nv-gv} z7fxmC%~m{<-)GpYFTE9dc+@f9Bu5xyf8d3VJcSzVIU?-B7F=UUIFKj4{B%c48F88u zG^w2DS)>g<`fPiG2zPDuI^nc&&t6+Is=dr~R1=jLRcuvZYw!6<)$YVNqawut3zM)y zk&W+Wa*3dfBPPP8zQzLGa2ppdR@uiJ>-LI(VvnVw2ezzh+Ja=7>>ej4)YyTO!b%jv zJrdrx8OGxhQgu|S%b%A~hEtjG6vZdKEzQZw_5g2mG}TxmE2vWy{3d;Ti1j;7&lzdr zZ40si_R3!GMhmuqO=<5qM%@+-&707F7Hj{1o$q=j(Y0@mIOI3ABSMWArW{N5-Qmzz58uNj&WZty0XdSnq?<7fc2vfh1 za^K$^PIjzR&u+fIzJm+HSO3x+l1FUk=rAsM3^o$a?s^=xu;ev3NZvb_*)=kQumS3h@d&s5xPAgNuaXq1HevAWl z5@#Lm<|_-AK(n1rA7b|H$Qj(N>WsAghtV-^-b&*J(#C@(74OGLO^2VuP>pdB*T{_uM)~B+4>(Io_m1w)B$#ja?bvQVWFQ7`#c33Mau4Wu9FXfuxnNSha-1C6z%Y zYMf*M&G#&WM)#K-W$cMPP4guI@n=MfBm)7dqZP$Q7stNMj|t+4JN!RVkia)X4MX?T zlB{XQ3(jzCUV{mReK{j!**ltVlDQ}~GK3UbM$rqOi8VB<9SEb*zNqF%-sWi)B{HNY4)00W@gpNYJ7 zt{vLY-a?G?9@5aJbKQ6#$FO-h%qwk{D=x+NAI>_2gY6-Q#H(&HvJUB{&rSw~wwVbq%uv~uH-*BQ`6=Y_Ukwnnn+ z5Y6N2JlbrYT}->EJ8pZPPPF&JO$|+)#$?oL&L!G8`ML9=)m%)-Fy(~fP7LV~amJ0{ zF_ElAz9-pk#k~JP>V06PLK2!P-R+(6$(RAH+0#4z*Y{9|)AkQaa)A%Sc_dCW`!pJj zW6V(MwoHPCS`dZZ!Vs)Qft=1YL{3)ofm3g!JTA5s`JwfUP&=`L6g7c$(47=s~L@aGT~i}70IvVI281M3*5fJ(Z*$wUD0~X=J(S8*giu{6Hpbmf> zu(msoBQPXS4^NbasO(%-udHlpv_9|jxf+DlE6-i1TBRcX4gXuG&2!CyHHcI?Rbp{> zBFpFb;oz)udjHYS_Z_oG`<2=RGDgZB5CSbpd&RC=8x=QU zKg5T&nLHabA8?aXbJG=sOr90*kdpU>m$ih-)skgOal=a$P)<4t6YfJ5$R585{OS>8 zWXBX+Baa0mhEnaXoI^7IkFPC!dt*7*%)S6c8DQn2gPq@ zRjXK?(hz3AQWAYqmdrZ(5JKRpQ9V_u2x3oC-AgeVNXYB0^n!k_#aJTq{w9gQw%VG` zTm}%tTg>+cjU21&L8$J1UM;7TGCdNN(J;qXxvy2!Y<|Mw;v=5Z44Cfk-ai#M za_vf1n8*r`PHI&!0W)p7adcxb!^+_kr8?Heu2;{=MsKal*A0kx~raJFoKr7fc zN$NrlZuWH{%`WW$sdfNwDFMNTXy5r!mlVN)Lx#tQdWjxbmSV)Z(A>~ghvRxoKCcot ztEL+A)wHCkEYEsInGD@oS0013PDOWdTrNj$5T=H__c^FD7T*eppG%%1 zVJwm0S|`18Q72Z^KPv@XUunQLQ6y&!oTJ$xcxEyb7k1Ugo=TFp~=rWrWPv42_Rp}UPXpy+V^S>h*eYLv`K{uoPe zfZD!^U2?dfmZ_*X^9f`+>+R6Ku+N>{6o9fw%`UY>qZx|`mm}65kZc+MXB{f}q$xu8 z8Sa6k!jRY#!?xcwq{t&z(1aNi_cHvNd#N&K6he|vz6oVeN zg&Z4s`41zsT7a*vqTT@D_7Uk5hinhNSGc0dZU_)Tpn)+?4w}Z$?fV4#o$gNnfvehu zhh4((4zI@Wjs}NA+A)LN$_1_@GVQ#Uo3tcHUzv`lnIaL<|~R z<|c2xGwI<+;=5Npi>2=N<%y6nmu7D}y&ZNvTV56Y)QotHjld-aGB|L}E#z8}h$3U3 zJ(NK<(@9e)lW)u>Fl8#xAaHZ#WZ}=Jey66jSR!b=^b4_oOQW~U9V*QH0*^4XKoVkS+1*ta!pbZu@f3q$@k2tG6@wE~G7K z&J{4ZlM3EHQ;W}x(=0MN&$IqH+dm}m2sBbTK~*!H1EgzFwHl>qr*DR^ArXPD3M2by`@JA~L~ z7s~TXV)|{WA^TTQ0o+-1kPi&~!Y^Y#t>6P@KVrq1cle`SHo zU?-y2{v<7=KZV`@2T{sD7j^&fXBU5yN5@QBe`di5o^FiEZ)!aKK}T%3&R*EwB%6mp z+k&z_ys!LazMvrArCMYHZtTY}>YN+qP{xX`D1^W7}?QJ89BCJ!((yJ@_+x=n{`CWSgq8p#9^QrnMD*} z=HkTXCEUu7BvB|ShVz)AzRhcz7A;~^wKdpUyjc`4m^jKfHS+ReqTYI|fGM2{1%>&7skZiav3E!Qd zw(95{)nDlLK*evp7Jj}6X-4|t+%oEP6&weU)d0v)c`y5}q zn!rEKa=^~vIw!jBICbZ8?@7YhpONJ}1>5{BH(u+DJ|Q=z=GEUi3TLSb3f6iIoBa`z6=ns*YwogVP1FmzYvqQ)zw}WTq!;u$(n6lMJQ4`r{*lB z|2*V)B5963KU=A_xB$Z{sRXbH(?Mt1or8Qjm)7;hG9P!3hY&dej6l~yumPKD$lcLQ zqC1t%A{gvxnUM(&XxYnAzmAO-?(JO_ssexKJ)FpAHg?31Do`L#`0zy^DguQ-G}S0i znUkSqd+93K-@(inF4^A!^DohZPv!X;-FK^fB%hNooX53)&GjXr>t%pn%DbLy{`9;iU+4RYG!DO&!A`ya^6sNDcKZ*j703C^>sr z%%v1>Jg>dVvOffq2<%&vu?~`B6=L0V)T9sLx2xUh> z0<#=5+=WUZAjNhymUlSl6SUwU{3FywEK z?Nm|6uP$Ibmto<47skF1L@4Wrz3oQ~qJLucsgJj)*l2Vzf>l?hmIb&7a`qCQK|fx4 zlNVQ_Q_4MPTVNl^aLpABaTVnz&Yq5N!QV!!TuS6}a zGrz!{%YGKE15U1?+a5lQ2ip%*ZM;p$N=v3hr($PnfiP1f9-DB?*?#FLpP&#QBVeG| zZoY}T1%81Gw93Ii!ZQiSr>xh^U2bm4Oh4Lp3v9HrXK*?YM};V_VGYoPSMAz>lL~B{ z1P!(!>!SLAlpBJ{Yd^wsNet%_uk0OG+rj6IDKKrwc$OU>?+tjRk&BrI z1IE5WPK7JyapBW0R-j1{k}k~3^#usFi0dQVyE}1xHP2Imk%OR ztm4V3>j*2A|8E^u?2ak9NRS%fBglwjq!d12j|G@@&56i(Pw| z{kSf(#=~&IDHq;vgS8_|H!Ba+7kST7Gx2UDxo9L=Hwv-0Ii*hFb}w#y#kvnRQ8h|E z68lE=*0K+?5T-p?{9{Hn{q1;sd+=~uM*eO-cNDcqtT*0hmkX9=fKu-e+#Kcpu;-J= z{pE_ZA#{ANF&Z%i^ZRVal;e(e16d)mVP!grD9$)ZlqJ<|0d?v3WxSReA`cG8l104= zfQ8Y)Q-(5)7>MzXZxC@Kx%X)GeE7Qd>2!|4B#|Gdqk!`rQZhPBySL+bJOmqc?ViF; z2of@ZnW8^TW~IML$o^P!3Q_|2`UPLJ9^#x42se5G1({XPT4g8XSvQ{G z)(0!0ea4vd0|>i>cDGPDDqbPmQ=_}-nAebMdp2?9ns7_jNBE)sD6q_8fKhOy)BL>R zQK0CJW<_!aQAmx@4*%WmQBm``6diL?kt4jXdahz4{j>tlplR5YbaJo^T0QTIMz!!F zQ|nWN=tA4dtSmWiCFbJ9xAJH7c(#PW*rjc3RAel)p`- zNz2E8KuJ|NOTaj6&oQlO3C|AuNoyl@6oFK`d6}^c8&4B_%__hKAZQj2hchHnE2R~d z7p*{YzdAs)sVm6>ie}77jz}=lqz7QFTM102>bHE~=PCg|Pps9PRt`)4wy}^v~1>B-# z8+jHhp zwhO7OWv5hP%Y43i3}2fNOr9jkYZTe|MvtLjh}t8g{L$`jVBbrbIN5& zs(8sY!~LAF{7&5v3oF4ZG2kSa(~N?RjKGCDoe{3Hd=ZlMNAX9qgsFoySp^U5clMi|;RaihELMmruEe=uD6|muf=o-GNCZNLIsl#E zk=srr8rO+e(F;I11CU`YC z*PP?)ppOXfw+YSj9?tWg_Vb=7h{N*+)PpjXf!!JuanAE3CYy{1pjZ25m9TDAOd*+K zJeVA#ZF-tTW(@xh3kRUaN&2y9QZ++;t|89y`Uc2-L-{=5!`&4Mh$KrGSv#vg>~E zbg4TgDmM&%v*7^L)m-2KRON{P@qmo^_?~=-os2j$aZ~Rj&W9_!tK0m+`p9@w@#F_= zgAUkK9G>0an1@MOgH8VFn1?Lgi`;F3k=B}?W_QI?@v^$6b^hVP%ezSfPtjdgrLv7U zKI&Q}ulB?hKx}r?M&L{-bA7esf?7=~8_V^RIyBz=@(%z$p?(}JhkL%&3V*>1vG!A85jW6YyOKo5bvG4^)hS|rwWIDc_GM*ih z6Xf479!ZFk5Nc2PI5EJU=Cwt38>1Jp4=eliA7<50pC;rC(*tpdbJ45rbE5G!Pw^TU z1KU~~!BsiH4FTh-LBrjp+9pGGWy0W-5QJb|D{k3Tz5&d_Dr7j9lirMRt{5OH9uV)` zq_1t>hDtYF&z{6BJW#o0(0fob@=qwj=wa~XU3%-!!2@dqK*xzCz$*j?J2@tSTU6{% zngIapeFQO+7d$$WL1QXI0(CGVtJZu1!B!rFe2`yvCz3lDEb;1yM0nqdcsKC#1@Sv8 zqDa|TtRfHqfbOg3kjVe{jYrY~lh>L4I6ehOw=xSn4w%EHsfp=Tx+zGb3ZV5#*07R0`ZEXynQZpacZ^qZN zKLJP(pa`>T^}uyw!d}@5#O&(gg$ZV9U!IePNn}K6U&ZX;VfDTnH)zD{ecf|9$%p(t z^GP8OA7-7Fr8gEL&Bkd>9Ot!CNe(~D#a(w#%rd`_7kd}&L>VGwQnrml^)xx~SBX`U zTKYb*%D0x)6|ya5nX3ln?=qYzmw_5!iyjr7QbTfxY3Q)GQp0VM0-mt0Cg2RYr%$~U zSfbZYC)Pox)mAOCRX>l$wB@q{ic7AMS}#^vS!HWc^2MWgQqwIF#*$4{$m}AF@-@SC zdXB=SSaL28x@;Isyb3-_Wh_5WMoy2!|ZI>X&6b3gJ>`~OEn#;m$+#}v7|gF zA-|-`Z;vVJDi!D4PCQ&?RWeH&#LLt5HWTz%G$VR%^+_jAa0xeAMQi;%Q1C zW;wtEqnnxm!9jJyHr$6$1k~1?MudzKKkN#!=1?n;%zZgppEk(T4X)BBbQ<_Rn9Fme zFE=-ap9{1=L<@k8(z+oWW|)b?oB{QfO<|C3-o_c`de^LYv?$=)t5%T5Wt{+17~OJ9 zPZF)gbtj8M!5%!X!?a=oUgyG0af_ie#qYA5$gi4w6f8#?_j8KxhZ~%M1%@$2;=zfu z1fNRb1K01t5azCQqnK-sWcRrXFZJUhgwJL@sq{_Sb_R}ydsHG4`uI#1U7%p$5vSw$ z@Pfu&jQUg@1;-^$c8WC;vwW52pf~HF=fab`cOFf~+7nUU2CV$PfppW&qm|kif?nJ^Rg^W9~TyMbD z$ByN!LSyV9s~Fu$tHg=>2BT8ggxvz1W&MG~MQo3k9nH0u8;4V+o`42_)1yo*NDWwUqzrJ}P-CC9l#nCv{U30IyGBTdNi=Jl&uslwX z`J5DFiQtF;4Z0-(LViH6B7EEK0=I(V+wU$~09bt$c@Uj zEL~0?4$&63lt`$RB5qygA*!o1YSc`->CkO38hCcHjGGeE#IT?3njO$Udq17IMDnL5 z3E(%v-`B15ukuQk_V4)#934z8ezL-U-;dAKKl`V>TAPYrwNMoQxt^}QgQ1MBo&BGl zn~_T6)|kdCI@#^_tb1G|i>}B(_)n^-L95%vPEj!BZE<#_m&# zsiPwnY4y;EWO*S7a*8qjJ$T6)Jdk+}NceF!8xv4`AyAvrUj}l^WV)|LN0!X{k+_cU zww~9{T)jEZn4cDty+1{ zQ<;hFKeDT_D;ZYZpQtU+WerBc0$C7z5mtM$u(fqX0c3wC^ex1acLp>L}sd!iMqK*yiD|xgUhELN2o=lhe9sSCV6`3+4&3 zsNZNFi~uP#)aK-35>-;%&epyvU#Cg8YDNk9O|djTN9KxhI+ejw{S+Y=y=q}(kbz0o zS`ouZMe~}oPRnvB>0n-;fx!qa3~d@VU}T`9l2kd(vLL?A$$syv$of?W?a}l|m_ycU zTp9bGQ0+syLJn1GBf?JI$EUQiqBES$ZSZ9Iq1_nO4_NR6h$jl*+Q3x7frqym7x>}t zDneTQgqzcEyCiwXElkv`rBg>q@!-F$P0B>wC)XAbKu#H=8C8w;fq&f44AYN{6!vm% zX8*9&S)2KeK(webrPHB@VhMlnacQ2Qw=Ntd07>p-H8>C}ZUEB%9+IN1>Pq>(WZaEv zU5}c`+Kv65iG22|BrmC-R_M|NIp3AT|AU{f^XH*0q>Om6I>?+a2R)TimsuKb`PS>Z zM4J{N^$94&v6F2DdA~XJ$WtwsLUBhsUtpKg>1|(dRqb97XeiRwAbAm|jcGIrFw}D< zBW8T?4?m&$V`D3eYYSl)|7?QrM&8WGf z6%}3AbKD*jfd;&IBTm3%F1(viSNWw3_Ig(n5^8!u#;uY1+z^^DV*rLz3MVRqueocw z7X~y0m0quoLQ<57^vU4~o_wQx67&XzatB+0yz>mn zUPdJUS}U5z^b}wZ^BSztG4{;dY;GfEds0!-fyN$df80=z{5m1zK_{oC%uBZ>%Feek55JLB zZaj5y9BJu-=n_GuxYwZOjPSz+OB2W{f@17Xq5VNyTOt|qHaLr_j+<#^D<0>IzKUP< zbdYe6Tl)wyFC@t9??m2v3Q(B!9z$nP7=|q^xKt%PFTW%ETw&m(GeGg5C-R_O%wx`TY`qI}_5w9I=3 zy1FMB6LwVDT+h?mb;J}-oemdZ4cel-2V5)YrKh+@ZqWW>ii~`g^+k-}5v<-Vj9JCM zAV~9`y&cssu=Rr3?R{6-&6jGHZbft&A^3e*6UzJzB4|ND-9)g*4xZgNVgn6<=vs5M zWaBU4dyF1;P{-de(W1y>AL@JGeijx;K6aBsE`RTlyo1AH1Jt|WTWi};u-3-~GCwtP z{fYTOCFEw)On*rcYRk}#FR9%v`g2@tG440)p@Hcsy?50SC19mA zxxz1AQeqSmHp`ve3Q3G}XF1*-=L>9Nclh|?!XG9>G0>t1t4MMnGg;EFQxkDf-_kXN zWwE<>bkulbft@Ono1?}&7Y*$$6N;_aoY5u>TQuJ7zdX4BDzhJ>VvQkqT2E;*aBP#% z*skUYki&{~&ri0^u8_!l1C(rsV0vD*EPW=U@($s=N1J}Qf+_dMQmPZVJ0Q7d7Vnr0 z?F5yTlPxfJ*=&ut{^HT8(*K3iv~sSI`y=O6wCP!LghS%fQN;B;mb5tgl;?=0#IVyy zJIPKmC!J>CyOxyPND^zya+wx_APK)@F}Yjvbe=K$pQ(GkpIdqniaEarN$b2iR51M0 zEAFpzi-4((g|(@{pJtXn3{uLA>KOA#-!vKd{9`P6Hv=oNLs0Pid(HIgP;(bjf>IdY zvCvDV^P+Fp3Nr{W*zqm3icb-*rk{$d6(4Li+RCd-0VK~2$}d+(dmeaCRZB~aqd}{{ zWmE%mjh(GA+*RCVFm!XDJwH(UV6T+=2JHE{V28hv06yn~d%l+d$cFx6&kJm$*tduF z>GSq0A0DCrlh)g~1#w;vG;LiF8n6q<4z=*=jU)Pw&SUGLd*t%R_uMZq@ydpn`lV-= zyYBR$sGn%IfVW@`G7P@vM)3CG45I3Nt&Py_%N{`0{aP9!AHf|@H*~KCzzw@eTJ>R9 zy9Q_;&_%P4#vgGx{LM!^8Kh{a9^wWIx}^Ec1&vO*x>^vW97D5g&{K)WFJ7BB(>zKOKS7-F>3o~LF5$UXY7j( z5uws}?6#(JFXv=NH7vRu>NAv3SBlCB4DfQ$gN#g80rf0A=lRQl7%m16rbT_L7A=i) z9>dHKS@W_)o^A^Z0}^LhFj`A9DR%ej`NT3ALJ(|brADC$@sTD;GX1P}L6@5>OT4Cr zO8O$yCR9He3((Jg>>KCO@u|}9(Anu%NasI_9Eq}AFYvCS)MOH0T#I#>88K`XA9t`e zILSk2T58%^wrY1cXzVc@arP8ZnjfsEqK4y{#2PcCD9h8aInls?kyzQ59U~w9g%B zyu5DfOA4kB+5^bcQ8&xA@%cO<0Z7N|It@Ef10SM%@4Q608_dOb02Z%Q8#6h!pYasT zoXIlu$j>qyZ;2nEy)h4%x%>gXi}kBePGz1X86N9w2#Q_rM~RyQD63RJcV=Vv ziV_UfO1Lh}{fioPCb13^cF5Jz{KKND{1PLjS_%Ewq|+-HL1#p!tygj!l=(4JRic3P zO}6;;z*pCLU&jtKzIW0fHUt6Oo0V{zs8C;|k1s|6tO8}aEPaDauRfS^8k3vDlQ$lv z(_?fky9BpB9l+S>$*RiS`00&OTnLzH48~A|SuLfR9z}Tt&b?>tjkSxdyC{T{+L8d@ zlGu%b*g%a6rv1DP93L+Mn);Rw&4|8h8!=uM6Q!h$8*04lR`4(vjw`C4Po*!6C%lxE z&fV)ID9a`ne>M16FAIxWn!S*t60sqN46#Ix@y0k@&D@+Kalel|KW-c~X>jMAX?4lx z(iU;GzTCLO>f`i)+@;$uO8#c~O4uofU4DJ-OD#J(?mUh$I`#&e-PprXibj^VE}jJ^ zYeTpVYhE;gjcLx5!!^S#)Ho?cM9}a0(}=5~LT`BK8=YtpX^4C|F+4TgRVTkLpY!Dx z73cCMBRuFBHA&n?wFnB=$sfU=+LBx%)15AwrP;=G1mdG%E_8kQw$o+8?8$aL-9Irl z30kG=WAnKi0XysZHHZ!mHkcFh;yfWZKf+`?3AlaVL^DuWcASd;$n6vzcV!?x^tPd7 zqqR6bzTTW*J6i`r4?^**(>dM=FdCuKDI2TcYL9j&^NeJ5q|y^y&H?1*4tLc7S_zVa zmr;Q$NcxLt7dkpNnY3V(+~;w&Jm=^68gHc814ZDe;g}=yB)Et*O}>+Ne8USDRx|S$ ziEhd@@s{@*80-+dxytejmWbz`>R2g#Z#P`;DopGnxpvT=!8|1%A+jwrI;%E_@d=0m z($%w6c~`M!lzjnN$(TgEg_R5WVPpAUJ`I>^>yuM46)K(6(j7V@TyR*#oVLx0Ncny^ zDV6{uo2N?Hdp~rI`1~Q=(-1bs=`2tg#YFHm2F%!0QBcnKLR9TRq!CAYx?RkQg*U`K z3XqEQ59QP`$heOV^rSZkji57`$mR;gTvJ)7pj^Ve?3 z#aXA|h!=^;fg1~&=h6=bZRfukm8p+zMNW%dlDlPb3~l70xQ>Lc;CN!VTU(UzwBx@< z0;<3{Q*3yq2hv!Qc|as{ZZK$p&D0ty*+9QJU@Hg=_STw)r6L4}=r zcm#4l$ElJR!ZuPZzGn`V>FfPMUhoF#ni6`-eYzgJ$i8Ki?F&DzrBypA$iQrJj6d#up;2sV> z8F@bA%lAFxQF37YRsN z+m9q>fHi?3FUi(R=HOt0DAiwK|GXam?reNMsdei9nny5_@thFjb47x#krPnqN+UygI)=i4lE!JR^g$Y>mxGAj-gm9@=Kg z&LozVW+_F!l}6UIE@4Ck&Ffg)R!Pw+>2F<=NkZT>wWOO0K~bseN@>^Q`JJpZg?^h1*>|% zWlw4fAz-{9ahqDS;gv+vz#GAs$d{>U@~pvIarldq2B8LW;|pyh+)ewNN@)PJ|GcY347^X zt3-ZcE03=v|8`t_zje`cc?)4BA_~=zMUChPPG)5USBpjpTjP`ls7PuX>x@f_AEScG zSV+)$1+9T5JKDi$k%s%q;r_uf3!{Z(b7Oqo>67Y-M0fghBRfB8B#dL&H@`tNW3}QS z3e@Z#iM}uyg6Q%@AHL9vx0(XP3X!fW4X%0PY}<|QsmfyE9*L(&2Xbni?`W9)3UlIF z9>?R5>g4iIQCl>uAT^lsla^WYQA%2l^|7_gqa8 z<=2nI2W#zOF}}%LG;A+sU##!hhl?p1U(~R^(Vk0x4VOIrw!e&yK7?=5ByZ$4rJt%@ zlxY6SZLL>t42v=scC>voDuzg{;hg2G$U&vS;;uIm%V&}OO6b}~&$v)UE~_aExjbcR zPfx)4TvU-tm>VCg!E6T_Xe4dWqUoIlk?$6F$duKphU}1G$4XscLavJ?m+4cgew)j){iPDK~QygV9FNNu+;P8OD&eiE3DIrZ*9B6t2IG@8{EQv0*> z>MowtAcWt#B#@=E++Y|=&M6sqcsQ*oF9U|ja3JVPi@)e&B{jBk->i`lYYrR3^aKwc zi|d-bg%W4IPPhi;Vrkx?u67KWxuN8)h5CDqGOEl%A17k0>6>~t2XQi}j}SKS_C#OU z9t7|YW%OHMJC^LnQ_@7O)z1ApZ{&t?%oK3E0ZTqN#gr;Y8LS_N7R!B_!EHYfrrBXQV=z-RexXrcqVWLJs1L$@$$S+Zi6d@MA5+#3 zZ4wx?7k{gZFwXiGX*9NzX}}pX!NbY!4uJd~sB5E0exm5hG!CpoaJqeo3D=u%WC~m% zX{HL$GY9hE9Pn9P8C%;`JSf@9{CoBYfIT{Jy&U)|VsFh$+G5q5&n@}2*z#QPa!OF} zgjPYVoe`2@*nm4Sk>{ z>K->HA#Y(QamRK{f}25tpTUdb8bT7|*d%BNd(J8<9@Ok@AX!P^mxNIsV4GJrw@)E4 z*Mzw;)QsuwLQt7m^=NI-%lFRpUgR&a*4npT)IhT;s~*`HBBSIwo{!3ME!wU(rwtxo zbx@-*gD|A)WQ5}ZcSmbPLAcav-4+6APn3D3nr`Q)-o|N8M9p#c4AEg_1tqHmQJ!S= zAG*%U3*~en(-QLUX<$0%d=1BZVm#rFi0V5q-L;%ma&Lr@%=g0m3Z5jPYg$2;(XGfz z$sSf_b&}GgPHoN)Lt&tq+D)#iyjN57@rE%g)lL#-d{BMeK|;{uO_jmSmDPfX&SzR_ zs;p%X20rBoI`zBh5ulNH!bl8bCDw&Nh_oX(SD_X|uq!LNRob2>t_~`el7{`9#ytPV zahr*lJzW1uYSw+T`*E3e=^ZV=G?;K~b4s@n5*#xvr+T}+Ej1*qME;TlcV0)g5L9BM zEl|`Kd=sMn$`9Nj3(?E|xGyM6NAb!*OJIWAmq#h+Y^3w(M>88*B=p% zY?9@0#>z?6;CaJty4D1^*&{-unRhpc-3t8}KSglbY$cF0HHpO;o4c68P_631E;GJ= zTVqu{ZRbKAo2}mAe09iK($}tFYasMcb;+Y3S2%2A=SL6nfgBedW^-3n%8(6*y}$G> z(bmjImg0+*oV8C&am@uG@~kCW;E{Bf_v;QUmy%8@buB@DQGNf50zcQ~Z7KY#LDl9} ziO=~@+Kqo7M)liqM(CBL*xJtZ4?Ty1x-^0;+=~>Mg(~C>Uni7_pl?zmB{MIz7AcBg zSPEj==jDUbFsS9#*44aw5|3N$FXEzvllO<-Q!K{ndO1wMX%4%`#~K~hMq@9JS10T~ z5Fg{bk{bWMEFQ3-lV$R$G_r@K$KkTl*OK}~vT)fhM$Lmp2zfH1a5OlLhs-E1+sZaa&3 z*KHv*KP1*^llW2JUXl!*+?jDlhNUgYlI$qyx${zwN*Pf`x#e(aY?6b&;4|!X>)qP} z6{Bn%yWW~a#qOECE#)fSLG=cYIr1=b3gcKo!B9r~7rVgt?on%jXw&Lg`U9e?uKGk>Ou<9Oi@x{ZzW>yL%LMcZthbQM*@& zYSSO$EDx=o@wfXzwV++84kL?|xXRpQd+4vVEKFN1Qqof7&6e#PX4mQ>q+5|I#j$UK z&>KFMjtTm!beh4@oXgegMe6RRnUBIff|)XWsxCiel}93~oD5uDKw_40a;VC570@%k z5NeyNNOKA$UeEhPV_!#z$$%n0*6%#%ixS>iC`+Li`TmSMGavHJJQvU;mU#%?6sbPU z-K3;8`Gq+kLb>oIF(+98+QDutLQS>9`3CYJ@;FP#GNHdB*a|PsfztJs71ce-*94da zu0U(!f&*a5)BpuvZvt6fd-@eQ-)oSQVsIB4_2_urhmo1xRKNaWlXX_X{xJx)?p#PK z!UJvIdtgm&jtamL08d_DM1u%?fsi&jA>2N?2vIgkU6^U?2@|BZr;`xd?NSwB;ASE3 z_upW@Yv7HJI%5tZdMk#j{&v_;1p7k{Yv`4z%L<-p=4I|k+0TIc@O{q+W)@Rlzz|R zsPLM->JQte{FC&w4C2e_T%|ghg$2;g28JO+)Ecd4IFgwofZE2|gKP&l z)1MkCA~YX}zGg~;%|Y@{AzKc|zX=lPwyU_3b~JNtcywAdNO7OX(fJy~j#WOYvkm2$ zL~d@?ttX;rscY$|#x%UV!4%A4=F{@*n;Tbsdc|+WqQM9~eP=PLL3TY)B=2~%0^tFS z?IZ(itxE3%l1WUy*mXPnHh-RRo$^?&;oD?UXnfHs;>wvz0OIKIXO-zo_f~5cEAwUZ z1wVE>?sQLjM71iSBMII0j(if zEE?Xy-fv*@biQ#>ZOz4-iBa@gU_nv31`Y;=19;uE4zb+)6{pR9&D)oOS&NP4PfDvK zkmBtmwY%p|?mMmSw(yCEa>->TDr|UY8uo(ABy-#7u_$+9(?fvICZ><-i9;y`urXsn zY$T3u8mFQ3dLo;kR(@mI6;A~_`Hr1ZaIE~-461Lp2)B5T-|tB4(2r>I5uU>s`pV_=BiB}9?6?>Z9b6wtgOla6GB9k1uNLNne=wCFu3s~L^B2$e?9^n- z0(Esr>pjL7Ux4mq^coFy8;alY(Q6xdrP4gSJbVT8VL%nGLFlvsc85QvV4+lz^Qv4l z>v*pgQMbL0go&9=D4&Kfrza*MK~(FfYX&JU=dNT^8%HZj38gfyGAWTkK_O9ns(wpg zzISy`FT<7ONVEuu^MTAflzphOrnq8Tw97S;fgr_In6(2{lB=K9m0vR1#dtN{(~OV8 zciGg)7jAD}kQBAB>Nd?<0u2+}FI)bGN3Ya>%RvuP8D1_%VwP1k~l z`)mFo#X}CY4#mih6?lGc>oe4k9{z4=2YBnMjsB{Fu!08wVENyA__r6e68)dH zhzDnc`B$FABq~+x&rqQ0g{V`=c>aRmc%iE3H1s7dxyUJcVxubP%RrX{5kjC-LPw&MMA^j!3%TsKiTh{|U8)B>OK0|^Vrw65L!G|X3oCpmE{?c&KRiU{* zz(a6AInYDWfs?vTJNW=)BMa_Sbn-DlA{%Bi6*p@(=dSTg+5zSc>)<2=)}-W!)ldTM z)pQZv8&{>jsNcp!c{H-bI$yKOOAyb@WWmM4!U1=7jI)n^8hUra?cu{u&$=?dhJj;s zc7%RE{HhI`^1#g=rG_P!~YQQ@@KVt7?}8h*SnG15^T z&Hip8i5J>;%pwh0`C6rMF*zHRF0;E&qz_TJj*Ni8ge7U@xz~r?YKQUom~Q%EAz-IZ zD5D}aN>YuiTeQDuyT;t`WPz96eNO2^BL%3OKRc?Cq8p*9beJXd@ZM7%o=cJx0t~cy zpM>^+gWb%Wd4ww2I5RW_fw~x8b5uW>oQ3i=woHymbF`eejjL2b83l1qN07~u*q~@P zYjtj)J^q+PzpIxW=vW(y$>Owrx)mie`Y;-T z)%*0p-nf%?(JP6ydih-d0*9%#JJI@#Z`mfx_)TaPhypv!)jL_sLKS`DLLb2W(8sqn z3xftW1;T(F!{tly8tZ|lAR>wL!p{|CU}**C0?^LRqO!$Ppzaq(~~kNKuDU zjo&#fagbD)vz+Eq4tGq|PlrJ?kK_hbHrWl{3DHx77DYrPzSm$FeM-U_OdU%|wHh}V zi4e`CAfaSGa+$X3A7+KBYy>Yjm6(f}0Boe=y&8_Iie+0hmnbvSODAv&hvM(PB}()k z;=-~wZdHNFLcMYEX~MY#D9r%BN_ z?<)}&%@zh*2N~q2KB1vM)ne15`APBi>b=BBTAhN>u}x|YY+8bNA*NW$7im%E%~e~DE8v?& zQOxJvxLyTY{hPPa=km~0;sE?B4~u%)?T0B>4|{$+Gyz}bd>#@P+~fzU1HXcPn!RA( z@QUW%zt3;JBl)V@uYInJ<=qX9<=xNCc&zfMpR=*14&D&Gtl5r3CshO;D+J(&BM`dK7;+P>u^UsHVMzVlR)r9r_BiPhrM9`lmf4peoP z>B10}7l`6u+G}`FVLFuyufC#Ybhh?${$=81d!fKqr7AekdO$>1LZtNDk&QIc&?6TJ zLWIyBxh{-H?HkqYQZZ<}6Zta%f|i$u@zIEEyhP)~&uMw+H`yI#s%f6jWh~)OusNi6 z^z&{%1gYei)Z}R?nMCU zA>r?-44I*+)LzJks3}6*3x;RcbQLyVuXpgrTNR7!(asxQJhmtMIqx^vOmibVP&PYW zEHMqMKURI6s#p?haL_27ZnxCV46-`D6U^Rdfs9Je2LW~yA$Joczl#N42Al-oY>%3# zO{zRf2b?ZxEtm;;WI_apdghUsq6PvC(N4EQ81Sqpo?;@z zU!Xd}&T)Uk3ZT8CZmpCH$(S4FVJvI&W5gD*8%k6oqKqb-1eA)>XFIglyHLJI7XSR! zbnYo8Q=3XC$DD2$D`)vvjUCerK{tdtS|0Z|4;|+xR?1#*Qzkh+OM!6QD!{gd)g-vu zupQUW8KIFf^+Y@mt*q-^X3x675Ail*$rBYcc!6QtPH@7UmP@u`fi2F|ZXkvzHOFj+ z(X*8qLfsg^hO=48vWw-K@0_Y*K8p@+mubG4>MJ)fE61%fN=6Y;kBM(kuC1a%)Ks5d zK%~@p9&~tPZC)O?C0woFU0YP(5AFzZF+kP~z*D|CVC zjJ>xOztYaLosBys4S!G!ubbPjsk#=kM|#C!eh0GqD46kCFyadl(lcSXH#EEpO%xgC z*aJ(&W+5^)a8@(S)hf#pqW#5d7Eelkztl-7WGGIsU1Vel2&1x7iY;9vMzPY}nYWhu;~D0;+igTnn#N z*(KivZaU(We9JS^R#U%F(|D!&%4ca_Z3xd_!TJshQS86azPEnjwfq0xbAPn{FE5#&WqtRt`K$Wt2lBtZ ze3$k1)zSYy%ldnA=08XGce~xM>6!l&UEr(mKgs=#CFNg}HUDVFzt1=P1Mc#5S^e8) z{20x@m{?wYhkm{h{R;AHDzP6R9w`46PJf0NVaXOQn#rC(E9`~ZQ$|A(jkF${n7{;!EHe#ZDd zV}IqV|ACQ7{9iGCUSq#5uHXCVS9aVV;-jelLHyr4{?C5;nJf248~%0g`}?Y6f4yP; z=h6L{o9$=0ziw*ZS>Apx-)D{g|0MS}&bPlW=wDgi{uEx|JNCbd{_h-cKic*Cp!`ZX z_7gbUKlIm+dG+&{|4KmiE6}eTPCtNlUv>2Vc3^%0{k4z$%;@wh!mmUdKM?W-{wu=I zP5H^E;a7}b*(rWtObPx2#;-L3U!yjDJmBwZ z;#cq3AA*^+|KS1u8svZLEBh - - 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 zsD|=(la|glw2XZp@y9U4T1b*j_<^&zNFE}6<#%#;+kMTb7#Rhbk0zQ+W0;~Wf!Hpo zyco=WmhKro*l-k~|`0IK&|@jTYIKu7rRYrbphgT2MlPR9PKxS6lA0UmN}K ztIW%PVv~aU> zz$wG9hdvX9a?(rrDatuH;T3Y|4n=;;1Uzaqp8vh9`pq3?xXqq zwfgPc2y*{SJ|*g`wzr+9bL5O8nl>LH#2LI#^9;OIFvvvxjMk{TV~&P)oxLML{0hc>4~db+ zAS|6F2FmHrh+`J7Czy*b9L#8{xR-`O*d9@#lnW09v~o7DltX+DJCMO$zgqjof~}#S zV9Rq858do9YN79qGa+1$j(A27Ob{Vq3&SNv7_DP}{U{tBu|DGCiV42(#zyAn43MiM zOCU<=b45RWWF)Ai?ACkxm6BPOuK)OU-K=m)JP{E|iq_4BVPnROR+0aK&f>^;NJ}EX zfMsk9&*paX>ZlFjCz05&yJkonw`zJi`FwK&R^`6Hz@0+zww=>v z<~bmzx8KYYqC$}9U!HAW+#r|x0+#NCV*OaRF8!dS^$q2H#+-k-hc6GnRjC(yIwgN* zm+YDi>jjrrkT0-w+iQz_*zxLB8{XkHuUu;4>)@S>F~3fUbV_smhw-LPE}Id*VXVs zQtOaUV!rY)#^4)}XZaz=@+#dTGT!O&$=0XLY|m;RuWrzqFjFeDn$$s(DXRYNVBVqPfDi+Dd+TG7|n|pjnW8 z=48jcdYmj;#?uJU*5v3+zxMoe3@&vUsdQbCYY6f2=ePD0+(vG1;t`B`)krXv+f29Q z)X{7I2!@2vk?jQmLty3UOAn^hn%6VX?gwYXJo?g6={HP!6zWS33=b?;GaZ>#o7h=- zXGUYDvbAFP&A;xby{n3g2TG(jvkzT)6;>k<+*-Sii8fp{JTH^uXi71yMVAzF_9a!6 zRtw%g=UWe$zFwts&1=seH{u3Jw!>W@usn?~glo|ciUCoIVL8~9p2X?Q} zOKK6D_Ks-rPgxmw{6LS_RV^?6O zgr3o%UJx~eWg(T*Rwwq;OeL4uWz$a+D3l>9oM-0yPh_fpNY6%0k^Z9J97c!l==${^ zk@fGSXG3cvt8ZZwy`ZhNwZ4tfKO(1pEzlA&HZiv`|HnH-*v-(`?w^l;fhSpUlCr>z zh{MId+x;oR{mHk{f9#Xt1=;aSOR)um_H|yMm8@RIU*-AG%97x{1Nl(wOY!do1k{GO zJ0G!s71>_XR|DDoXy+X1VN1ismS9W7RD&xunlqB)a=v~6aRsglmLZ>2fICmZ3y`9| z0}Jq{PHM>r^v-SXz}G805y3<7(2^WG9+YB=XAB4~7up*DF{RX2U?`=8zAKzYJ3WXAMBZ85rR|+3yD*M8=Y>5E zL=_Z`=^kXEP#{q2#jWbuy?hljt-Sr*V6(AD5RDz0&PxCm;htSfWo4AjZ7yr1tTA=$ z4renhds}e_QjZ*~r>m&O3b+Zld(vL#EcoVk7P0n#Yks z-gAe)dI9L2M>7Q^a+=L_HzhG0Xw00JDY(kj3g=(CzM{gl1RgWvh@FvzH=bw%jx^wL zXh@%jPD`RB{%U!LNb^P6-F7^;#g(-zYQ~MCl);TTUXrLYOmm zSC?OLDx#8B&IWC+pt8%kI8|l23mI76inK3Pq`QQXZRd5>E=D}bO z$Eo{wHV4G!Hl#=1j|aRn?324D10-!H{kNJ(!U_*N&$2-ayFu~aMtEYtbErj*8yO=b zy8pp0{U_IeVBK}GAc25vkbr=`cZK}lz{mfVYbs3to@S~qt|;F!(4k~nb-W%J@Qgx? zIW)omVMxL-bu4?`SnCdyUx_^Y7A5m4aMu7bC% z&$;e`;^J*@<|boJTE^p*r_JV#%l4;Dc8`0$WgFlXKi^<`ae~7A5eE0+CeJj7|gKtPN@saL~SKXCbh6BBXM^uBnq@8%_+I3S-!FIC| zuf%6x6Qy$C_tFTm7ymppUCTPbKjEHUh9a1ioO2pWVb(_K#|*|-8Lk?(v(lVTtZ^>a zZ1NK)u(MkIVvAl(iZ*zT)b#*N^1OdLUjnyE;S!=Z* z$7h3OK95Oo=^D+Ie4ftM9Kxb>RckfADLRid-INsNtcmIPG?UB^=Qm}Qj;8vc*0h?E zgTa{9KO{B;5Ur;qW;WwUp7q{>5nzNzgHMMvL_S{;vAt^O4!r@ItLX+ zmKSlOB!|EtycCFeeI1=6nU+9AyT}y`Y{}14zfLejyC(C z>nh%VGdN|4K4}RY=hEp#V6jRShuc3#Wia`#p zcv&^b={!rle>wIapbvak`2CW!;-NTF9rO;~y?D#L>l4Fw@|@rDME)Q{9 z>pRTHa-sHW_-A)Z6S6VpKx`itsEG71iUaZTX<2pP0ds z(XDcYs~R+K5${oS^Sb%8lyOA7A^f3uVp{e%5BZLE|JAes70P{`Nl+r( zJ*UPb>`YG*=j$FRA`m2H$8z)b<^xT2e9EMTn-Yf46lb;4hkIPTWQf{0-E-GF;x-)V zcXs>y4nmfX(+Yh46{#78^G0_%0Yjt)wT8&StF*@q7&Vup9 zEq$du-jX4ti~WjK?iklypI`QuCx6&>xy*ATz0mi%KCN+#tG{=h&Q+{QG&*UO&Uaet zW(C_^JPGIQwn9f|~k@peYf)FxM+X8_Nav=uCbzOn*9=KyR- zLli1{uy7d1ZG}=-4-2nk)HP5L00;dFQQ+&M1nQa40HNwk2j`Pr8=%gv`mNHRsHS}I zFH_lj9g+KF9_Z0c06A?$DHt`C9tX_tawgv^TX6Y)KKBZTwOuWYXGuStlehd`>(D$? z*aM}W;g{!+m#&*j8&w~~IkP{%*MboF)IjYEtH}v;5xO2eGQ*4$c1fdzTv$q0kM{hLPN~*`KjX0REdb+# zeGK%3F}WtC$@j&4937-n{>P-mx=;nj24Uhua_yorDMj&w~<@2D0C?F zbay4wR_+*oi#1pS8lqzOxT(c}peqD5Ov?nM4q=3?zIT+pwqc>R=|=Uv z&xT&mHceUKyA|!BJH0F;i=z3G#b~xlQ0mKnat8cIJLQafS8n=U+be(9_Wz*QHpWi$ zjwbZ~pOEZdj*Z{z$!tvjX}=WylM`T+qP8N6IDj`RE!HUY7n|jb_C9(QQ>26zpBf;P zAlwA*d`ZCX+oDKtuIGdymn@6+E8Mp0r4K|!zv8YJf5*1YrL!4Ra6s*F{PJr3*e7$o zneYASiubpqT1{;KAT0PTb%vz5mdt*5P&tO|KD&#wno(8lF;|8-o1#_GYNBFGT%Qzl zJuqe?A-eKG$T{%Knc}r>HNb7x!+e^Zaz@os*q1FGIFCpV%!lI3%(`kU)TZctM%CEQ z|K54$r0zH8a*3p0uLZf;s3sft`jC0xSt-i>jpbts)B+f0NR} zcLJI5w9j}QZIOjE0w=CK6i+aC&iu|-dX5;6*LmqfVF~8(H+@>O#l!eWwvQRbsL<1& z$R`Mgj>_8QfzB_P&to-Jx2wX3i`lepnr)8A30mh0%Iyt|ney@D8}WB(zv|Ff(iOPH zQ7vm{!z~=POy`0EI)+-5u|w>8hX?^yu(<@WBN_{FNqy4TjxEA(6;V7s4feprRvX`w zT|8H-4dI~4YqqOgD!Zfh2EfQAjFa!*(h5pH6kfq@qz8BZ3Nafn9qB1>zaF8O+7m_! z-VnOj-L^GEv6qUE4_4&aQYE!{srtsX$Z^z6iRl}{p+~$UIQn!_7c$|gUBE{?4yey> zevA0*hfZXgcAb!iHPNRK`@joXCyfAc_MVzIv_94?g5Dv!>BC8{x~MKM33}UDpGwDf zDHllbI#UV<49v_SAd!-~fc#e(Q$eI*piXWX?U}c^{_IFg9g@f$8LfRjznM6ngt)1Y>q^#^#WAh6!@1 zSg+x=8dsJAw+AqVBkI(l1p9efragity{5QB9k|VNjyfaq&^J~EuXr_?IOO>P0n8Np z02gMK9(Hq!;~Svn8-&RQS-c|^G97qf*m+NkiGuv(Je+RC>3uaaZ4sWGSyXN+vWJ6OM*g;hZvHiRQ#3steZ~H8 z+en(ZV&N`|E0q0@{@|Z{?LizuY5xXHuD)|t@PEzM|HENb&e+)UA3^B9c*f%2s&W1A zmi%9>LZPCzB?>=)w^?OKiTT-Bw9RufIkLsv-pW4beMK*%1^ z%HKICTkZBYw-mXHl{gY5&#@8q)!u9;klJF*(!UpSC)&G8Eit_Ya*}F3)Q82(663B8 zW}9Ynafq%_aaH-k=@L_(jKv*84?a8=w9Le(4@kvd-xeEeaOJPsx3kA#XR3~4D|oPL z+?vdd6*9S#k{l|h<=(_zN2yg^jLeL_cbI&%H=nC)XX_Ji#LQDT^2cZ-=f`^y2RBQ|9ktBK@j*I^uNZ&B|P+O!}k_?&hJH&*#ARp z{2NUB|F(yoUVuf^&#Ma)Q&;9)BsDRT5nv<%U=ooimRv|Eie5zgTuA>Ueb;zcE0g`J zz>v8$Dvg}K)^HZW)}b0o1sI{vzt;B3e`++YE&W_rTWYeXZ0gRTSaUQXOW2&GyE(^q zJl^7d@;UZ8{wCq29d~{F1-0k0(c8%#0Qw+^w>8+A(YlKDXLpn73Tj8^eIzEE zAiO4u+|zi2eE*XmdN9d{r{@~~e(Q3>lOgohZ6qe-W2KiN#;!ggBj>qxJVx~6!G_9l*DLbj$=l;wAzFERnBo78abEE@dI^ z=O4ONM20rd06)oK&XZ>z)h1JU!Sq+nI3b(m92A(=BO^Cm8%p{Q)&BhjnIJQDLS>S8 zV}InZ;pkW}prehmVUt~x-N`Zfcd^x)!Vg}$?D;LJVpJg;KwD60<1u2tcSRb^O$6JrpvQ~g8kPRW zj^@`)-@w}Wg&9Z9!*|R6I(cA;mtXwWCE@t+Cdd()3q%t?mp05bYI*HaqfPL)@ z&Dg%fzzlnWnaf%S80C8-i(1c>reJWGEA%spP@ei_4P6hSdSK=Z(XG%z7iEJjk~(j0 zoVq9p>m&ip0QexZgUBQjRP%(URjr~luMLeDiC7M&GgEfLZAZ_ksNgdNBUte1s1qFd zAxCkQ@iPzHazfOQ7p<{oZnjnEX;xOj!npUh3qrp%LU4e3@=s9EtDjNjLRg>gU2=qr1_?{-iBxz11~Zy{&4wJIWm* zs=~eJJkP9KayMi?`8&NbLP(m@?@WeX#Rt%z3+RmMyur4eqA(P@fe$yl8CtGfq*psY^ve zCw&=f{%}Z@34`*X(=0aLDR>cgX$XxC!|evMHMy1Z$h$6$^@_|E{m`HO-Bi!mbgFik z>~L+Bg;@LSiJKTZG+@p}6k;qYtUOgLfXkyplY%&Pk574iLL))5 z)v?p<9ci}6={Y#^bfmJgBaEq6rk$S_g>WnL_R2XGZN!Kp>z@nbInW8V*)G)zI(mrh z3{?u>yDuHwRr`ZV7oPhW_!L**|esB_KN~1sSwW+`C zE$GZc=P9FaMjQJiDAv)dirONh-IQz_#}GBQ3Ub3N%zoZB*oPw6a)+j+z;`t>KDholtDJL018~hcFeo}I9 zu-4LucE-ow8jTsW<;D|&G`JF2$3(_vwQ;dbq0D+LQi%@=_?3#n%M@xYA<@4n&#ZJf z=_u~M-)Et4Ddplo7ObfY)+3+h;6BtEa($`bT9b%azJx#&U)fSkt`Sj{!+3lwEs3a+s(ye$n#=LpH= zMROwb17^lKN#g)dLVL%+?(;j&mfm$zWtm=RFGw$G#+ZzTUS!#0^+|4p=)$E#&0*Ee z66n1isj;8>)5>h0Y>72GXNa*Mc^*QekN=)##!88W;K+&>Tu-@GhbMUh2VvV4P|VQ; z$%Y{jageYMj)aOX->Z;mNJ!W30C6i6Vjhe1h6Gs2&fUxeRPirsD|Hx&j^KyO z<)G>pmiNOnq<6MVFs~2EjiArJ$rH>(y)0motyoQRGkS^Oi#+HbOhBYgv%o-%;iWqxrjyQ+{YYlO^Ug!^V zEE;7xjZ5J)L|P}$ZbG&tZr4$GDpI&2&2c5_@nV{Sl$Bs%|IzY~gFgf+YD+AyRO?w& z;Y@_c7idI9)x*pM$`*vIK_X*zfAepit#dhHgR;e!A18+h9DhSR6Ukm7wCK!E=aG$~ zKX9yG;GM(XKzIQs`ct(;7v{UJkL@O5?eXw+)I9cqvO005BfV*)%_)3r-ZUY2Y=u z?_ac+;F7lI+eY!!&ZLms?Cr3R4&{t{C=V%RC@X4s6Y>s@exH1dT?}Sb;6t?p@dV3b z;!#fvyLwP*(=<T9eG@^e&heZqm#HbAUPM(BJv8TmdM#X)Q;-_s5UwX8|@coV^EcNd!A=omXtUQ(G{pW#6<|dixWP>w1h5= zsma)SaxM%etoujI%kSGDFBwPZke@1D0y;dJ{u!3=3_Ungt;uhW@uQpTN9Q8+%`fE_ z8Kp-(=*}_^20xwQr$3=Oi@X@()hHem%hv;8>ja*jl<=@71l%{>NyyLTG%zc>3lOrc zrd0%K=&elXoJ^wYH<6wKbQ{fzcA~}m@b&iW#)GuA_QOYg-q)cm+Ya{UxEsL0Je24= zZ>hQrPGewTUD=wqz`(DA|OI|NN*30 z9v#qPY(?xiS!S!aLkQy=D#PH%##vBik-v5S3X7EVt~fPe-=ue%`=HP)^>>iWRbPGf&F=F}B%ayjo7?lnq;rjc zT+arac8TcMvemPEQb{5a%0KKpLbrjvgAnMm)eb=NT?r#?Woy3wH^We*i_B2$Z#_-? zcfrs1KNS1_0&f0~M(}@a0#(!<|FI9N$`T4AGOccxMy;)Z`?>^ z7>e)@Doq5oOt@uH zg7Oe6k1P^;B<31QTW>6c0YTv@bMTf8N8~ z1Gqj+0mQq!Yx@w*GD8j6{BPU$R|Y}|YVpmnl+dhFlqKm&JL!vGYx0ff=!+dNr)Y=Y zK9!}>m<6bdGIts9h17s9DLkyJJaRx)nnFZE4I_ZAXlakrF{xdYawop6p$rQPoi&5i z8cSByaN*HJ;RMEkbg57vVcw*7&TXQTrKGcoc(kM_W+14mJIY-q9CRf1O~!g zL9pW+q|NLvtyoxGS(E5pJMU6Mj16hYRj6i(tXCcP2TU%(#S|SC)~I!tuUe!tj+C=2 zyxq+vIr&|1dkm<{SF^A^dw#~hzLX|zbhjw~~aGNxqliYTR} z)TYMp0N5L!phDz|4K2#e;Ax0)d=KP zFeF&jPk*xu#5-eLKNk}XIr+(An`a8yPZBnFAZB_v7nOe;e}Se59xQ9(x4 zGni9s91;_Aq{?q^367jUQQpBekDMN>=om)22JzlOju+Tkdb)B%ShBMyf!DT7mnk=Of$~s>ddNEFguE7}*>9Lw zgRMZVdtbN;{a9Gpc}X5Y)>dOq^etD0eHGCwD)bTW9KH*sj?lmJOc$G zD`-eycd;dkwa?4V_Qw1Pn}WY9Q}mma^_$&SA|;9gy|*Nl>PuQ7R=!B6E)_PH`d6-n z_j&fN+)_y+n7m{a}_|6Kud8!2-~Cz9{? ze}&nilr|maMKE~Jb13AE>^25SNabb&4YmjV`CQc z&>=&Edw#Dy?wzXpg_#g2^LFXRWHmtx@>MYxoerL11srwuD8c|IBnjr1oddTP-edzf z)*gUc=d5kV%obN4PAORhmv5J|M&@14Cd@7T^odv!BXLkgfK`YgjT#QP?P*%wUm3bi zyA+kothjHX?~zAT%DSNe8e{hOpL0^U^L! zIPw%D(InbW^l?yuqtVjrCi@w~G~eb2$w#Vl1XY7w#28WQm!I3vztv4TCF8f(<#)u2 zOIOxyxah80rJFB(qG&d8pM@Q@65kB|V4`KYN!a>Q-QKMjnFf4XvEp=*5= zD_#cP1kwz0sV;i_ps-qx{ywRu6zE!psCmFMp9ZbmhOU{+a&eMLIRd|7CGK((V~9_( zq3Ylzp*P%w1{#AK5}8yrXh+Q#UrFt#}>8>H?Tq47}$lqxUik`p!cj*{$-7EZ~5fj=tm;c zyk1@qOA!bM#>hYjFK_qig>08Vtbt*v4l$&tibejmsg+_z#)Klz?%+vE3&NLs>l?!Q z`A$Xk30D9ptly3p3>st&*Luft#Km)eSy3m z!2Ni2h%PJy$SV1WMEXdG_F~{nT%!YNP!Vqeny#AGl>>zWsAY3yko*H+WqV6)4NVr8 zHt3qxmWy=IBVSo>TN525AcY^K?yl}n*`8Oc)1CBP?}I3^D6<^IAX-nHeFzDjcTD3L0_C$0t@Ak{4BNx~sH1$!(quxbHC#U6=O zQz_@uD3ckt7E;kDo0rZqb&e?*(y%Tm>>E9}DN2uggCThx=|;D!OrCY6GK`C*$z_jo z0M@}hMH<${mc5hN{35Q&h}n4>=eEKk&9Wf{W*SySvgx`7E6QUvi>kt@8l}pHsfGph z07o9SB=VT4NQjgvbD|ed2MXZ7*F&+A3Oi7w=-{#{H!?XvQ6zPhZh1NMW%9#6u z+A*bL&r+xYFp*xZMh&x-lJo-1x&7wuh1*t|c+490X zrn*T5ba8Hz(iR{b+tR?owZla&$x3t~b~TIqLb~Kqus(i8xt0Nil(CL+8t2vqX+>@Q zGU`sJ&bBcHRn0Rjezyc30x8|51=WrRW#`JC_9=yB%`mW!A}SHl^2UXFvGQ_$7HsW?aPf+jai({;iqt6ne#LT#%9EH7V6jUb8Nh z(O<<=Or2rA+M-Q1!KL$*H zsPL=Ps!WyUFUYA?%>qK_Ls6ULt8U|hWwOVng6+r*{^8n8s+bho zzg>l&Mx}f(MEE0HKNE*_rT(faeoQLhtDjvbzp8Ed7?jC6>Vtjim-?ok>2g|?`DUEe z<4ncf-Q!Fp-O0f}#oyV%AB($_guIEp2*cybeW9(0-ZG4^tXNX?*TBXY8-;O5F-BQc z>tiJwAEX8^Gda-qn__m-1^i{zRE7?BdHn;KaG8JJK* z`?(y7pZ-lk9BW+E4P+Zw$ykcL{;$G~FlQ>0S`4_Fs=DBbXYKFhLN0`tsbnL9+DM$MdwnxS$8JcTy(Iiw00&P@k&UdzfEnu%+aEpFO{|PIFc1y@p^|*>ieXlbs>MlG5VJ90000xXeUEQ^UVf z`d+RYVQ4RRrRK_@Xf)2Snu~8`DXHV6XFW;VlPUJ$tJ$MESx$=rPLF_9F}L#VcO~yn z{!jVP&3HW;8tY=_Vp0s7#hIRWJQxOJSyTmS5M>F^v6B)~DRoPsl~g4+jHXiqWose; z3|Sr{KjkbA_`5v$7`Z-l$&4G}O6Bc>3-vk+;&CP@DR`U(5fbeo5cflBpnZguiXn;H z?VywhP2z80r^3OZCKBE;PqD|^1xu`p>rtus&-=6CfFA=5>4I^R%wwAlgbqHgjYegk z+d+6DIOkwmYKy|yYuFjAGWF~%!E2fNoR$Phj#i(Kt`m8X7P7i=xUPxh&C+)0Bn25M z#9BgjkaCk@$s-1y#fNFGYl^9Vw;XXN%V3)Hs+u`5zNKVdKg#$E+B)V~xwkN^`gf2D zdG$>eFhNcPtJVVbDCLHKF@MX&{XLoWa0yPWdl?AqSJ=?)2fE3Y`5Un^1f$ReaJ8G3 zD3aXWX)nWOf`!5hzR$Im8>mdafR$E`IUfm$AcNm~BO&P5CXRp9cI2a7fw-kIo0eGA z4(9-C2^!FH9}EjyAAH;D_ONlEl^BB@=AUYHkR8aXxJLpp5sGoAcrs&I^!dr?mJ{|z z(8JXzJsYj*WqC+|c~&B1im=ICrV-U-jS-nX3Y`wdTIeaAdI+UOL=cwX%|}!&crEUW z4P$MH8`0WWF|X()FnjhYA`SzAFfVLPDVl{w$+p!0L)SZni4tvFnmcXVwr$(SPTRI^ z+qP}nHh0>#GdoY+>aObgZau|Ayv2%$HRfD%{9}Ipm35Ik1ZEl233O;pXFwq%cvL>) zXB{%k#vKt$L@w)V2C4>D#K_k?+5wf$$r(VWZupGvN0{Z!_hO#B#iDyQoK4ISViU9| zAj!>;`tp{&w7I)DpJt65b5|D+s--zNqXT-(RGq@ zf~1^bhR-DiPcUKQG4!O~0gm$ah(s`J5p^o=h0i)y8euT71m|S3Fj@>Ni!`B_uu-I@ z{um)v{X3zxGG$ET3AF$5Ep%aXIRrrrv@W&xp&RNuqm-;G8y@}*(;@u={t1qgbXTRVrU)XU81)Tr|Ev=xe{&^$_>-aE-J{B*a zsDVe0$iTQn0HcM8sXYOQ70FGfsfcv}6!zKCNJ%{o-wgC~hJ} zf3vI;q?DMkv~$q<({@94Pca6Jt}S%-*-T(nc{Bo9KL0Ba!4s?SreQR}W;E&(eO)04 z`9Qc~5HqjNjP9S4VHg%iQ#CLzQNF_7S@gb8d@_HO7&P6pr}rqtvx`L7!Wr<9%)M!E zt?9l-{I3F1R4ALIvhC4EciC8uF>x<1(A9T00J-}+X5MX6XlBqiH<(%x-d!fZ5xqkS zUPJJmQ>GBi!4CW#5tumm>^k#1jKOFG-fspxVPYTb$7T`eh{V5%Iz$X3@7O#=g=KVZ*^UM(s!XAHR`lWtlalzxfx8xQJ45c>D)g|{V9Y_wfoOkW zW_%8k2{WUnSiA#mZ~#iGgYc5WPo^~0thG;mneD2jFwyMxu@60B#In^#D0X{0{;;yr zA+e9BJ1?R|iXY3oT_)07P`sPNQ1208LqzP2yG91~iW;f)vi5&y%*a~<;3 zbJPg%>fKvuQ{4PZRPfqJcCwG>7RR%^GGdbe<7)ebK>i(O_|p=PoFQzqMqxE@Ec#>n zE8?#M@(Jk48R)R;&;0cA6n!}2vVHi=tfP2l=^JzJ{NMS;bMER244i3urxRSsF z)&6>x78yp_{wcd7eHPSlobFIn|Ioof_pd4s@*_70jML%gD^FQ34XFK(051l^kNd{* ziGcL=Z7jLBi1pd<$DRBzU|xQ`B;f1BrrDU#;*ahd@amNWDs_Kz%BK$$jAW`8iW!=% zGh%BGD-UIomuh#*x^!?7=Z}|yuqpFY8CVc9Sy|?}r%?mTRmvn6QCv2>RnSikZteyR zC@T{d-6>Jg5hSGVFiJ6(&4j3Ubh=-?Y98+Xa?hGd?+NkNgeqbwMK5}7QKsFR^BQIV zAhB$h-QBVFKzWdYHoEqC!$!<&x>d&B40-kl40Vt@CY&&t(0A=fFQy$anP543jcAG9 z_5tACn2g!|y9|axqppHo>x7On!sKC`D-#0WGxo#|0;}u~f!fe?&NFNrHPJEmN{ZD* zsAgBIQrwZ|sGVg8;$pDCu%g1iFf)&}9E;I`(nazY2hY!Y1~Cl)^A|=pXLx*~7HCdQ z2}CC*ho<;*?w1I*7mfcE3~qx=5}*E1q&dU}f}v_s5;f!cte&U^{#LB%tSDMX=1>T7 z?-eG4?+uwM$1ors0Yf27ZsGLmch|5#*Wi8){eF}+pUjeCp6@$6`UTr_?h=nE1|&$6jm zaSgtX#vsAk&h$boY^Y3eoH-GIS<#J*FovUzjmAA z5{oL<(R)O4ogMB8Q%#+0ARA2HyLV6#aeaBBl9f{LK;tzZoV0~Q}%c}0~5 zyf4OpDBi42V#)yR3(c?)MtPCB-b01F`1-*6lUR_sbC6Xg8M5n+=EaxV2y$5@_F;_tm6>C4;CJb&z@fl#U0ou!6JAj#dN_TL{tKkf?s5PvVx^ob$cigcFV%-sVae&IKZ;|Irw`n3N45 zQ^J9fX+dBhj=D_0Fug=qQvRZPe;@9RaIm=-CQcRhJYxht6Conyoz$UcBTNhv!2tneXYm1lsUTAICm$vPP+ z5(a~uRM>17;T`ivRHT=vG~#psv?;r^(DwrcJm7#v{U3=2bEXtRg+|N3av`|8?t1<@ z9)#*8i|8<+&w5sza^wy|_}Gqq()ObqgpEHlEFnno(RSbVME%TH8m ztAq|k)!r>VX~?llGBw^K9x0t_sXuFJ;LaGU_@UF zyOGpd0LCuV+)*}4_}7fq&(f}a>37f&eU_?*I&}>Cm3hMPg`zG>S^z1kDp)M}e2>l4 z<>F_9R6Jdy>Hu4&Mr@YAe~x~JAyAd8c~L=%H5V?%_w6wKS?bLqp95e~;3u@rwT_r- zSZnSuGNUYaOXcQ*aUS|gOgs2kG0vRZA>}0H&Q01PXJ{>AL{>Lj=hitr#e5Xq1=-Th zpn7!fzxdmVX%HJ~C98y)-I>kD|7Lm5>&j=G0k1%o&QVi3@91~h+{?6ebj*bW8PRr} zdfcXdyNJjlX!lqR-0|s%V>MSiQlFIBtAgK$_R+a-^W|OC8@<@-+;`#}4F_k~XRZxO zF>RF@y{h7Ktt}}Nx&OVlDE^qP%tEqMY;6rTh=x^Q(i*@wSX5&fZF|-N3^;#57_S?+ zTc@!Oj~)nfy9d-xJH|%+CQ~?-4Qn{q@hB;hDXjkrs=@k>tn56Rw6yeG@Nf?SIzsBP z#HwU?8WFUP*E1AOeH{YHnu!<`Az|DhS~cM%nvDt4 zSS8JPqHwMDmWyQ}#L}-Pyt=#PY*&?)O6gH`X?_ZoAJI6&iH9ha#w5cNo#MYN*LUBy zOS&f!;FLrdF6YTPtFxNKj&ee3hK_W})vymxmGmX=J9NB9IQjQ|xL_DjjK-X1>zhrY ztIjL{5xotdmXz(*XQ-`+$it0Y}x*P(T4 zdUhy5ej0NU)dufs1bS}t&02x)&2+K#AXQ5e9^j3$51>Jh7>JD$2B!IV)?jE$s1WvL zpv=Onux@)C|9pKJzw&NYWo|A_Y-S|tJ}sOqO~eG%GLI}$5l1)EdSUF`x>?Xf_GkKX zu&U0*I!EzKMb4$raIfKUyX{+N#$@X6JxIv>O3rD?ztIw>5@V6>D^GD-`hRmh8w?AB zF*l(JHT114P5)vdF@>IKR<<6iiIjR5q(fHQ^QaM5SIN(5acXY7-%VY#W|(ISjGr0> z(A)svS>2seBC_Lro$Yma>}S0+Pa)N;+e%`(P^qQg=D5xvlpcL<&`vKB zO3>>Bf0ob|&u9S@Obd<_NCRBGcuXDm`|fFgIaRzB8}_cqS93T&q!pa9&tMko+&r4k zlS7vGFP7}S$cPU{$g`o62m4A%>&o0L_uOJfz^9#E*s~(U6LVwn)k!-y#$Ivd7Fv5| z=v{GUp;*@jMd{(Vz#DY6WW#j-g*vD7;-OtO6$;z!sl$jj6Rm(cAKPYE#EeeV64vgQ zHUEr2w<$DX>y%JhmDnKv+IV+L{D1&s43V?$afzrCQ97G5dUDGMJkM|k%%${8e*O(%=BTh7p@sh#VsXouJ~%u z!<4`hSfV@fAatTy=9by-3$Bl80n3lv|`CCPb+;|)ZoAeU&*gLhPdZ;B>!j&J+dz1|c~ z=AX}FHb7=MXoBV`UvZ*r^`@+M1 zg$sAzMczi0<%N5okXP80eg>ohhjgIyzgG@pA=z`8o>%&(fL$+Hp}tV5SH(~)m_N1# z8(&8fD!C9(HSj#S#uprJi5_fRZ#J^Cu8zaPeuc4%7>ot1ECXqW5)3t*mF!gGoaG!{ zle9CSJFJPnC<6!XMD9%r&yV?5C?2!q_KNQtz2ly_+VCH|i`Ag>_o3eBY zk{=nhWo!9CeEHet;qqN-2kUwSUgl!Ycs-PULt?F-9ndB6Jy?_4wUo4n?!J+=Z{+5m ze0rco70)u{*ZMF`Z;#5{nXB`;#mdrI>cK1xO#Rn%;+`Xl+JNwc26Hv9bIA_xXVLWe zYVa)yKpF5mV(?c5;wHbKI^y*5jyE;eMmF(Bxaw&53MC$CWlD7ie10TtT>(>Qr6B$) zNRIi*T68)pZDwB}7WN!+NQ-O_g>^Y_WZxr%E7^lCZgu39NXT~EhIPDo>r@Q z#yXt3))n`L8H6Qrb?8&f7v!JS*6k4kP9k$V+Uh$P!cz0b`*mjCxs4m(+tA4Z> z8E4N=^mQVmxyaKgQz>Y{_*aBoW6@p@#B-o{GeWxKo^YeumzYg8@anYE&0NMl8Q4$7 zRR%xDBcsVcF{xBPzMEhV^Bl)A{C9-?hZ)9HBRy(I=)_qbmwL5=SX~TZBITyQQ5a}u zbTEWE;?H60Vi2Q0QT7Nfq{|%r%O~UB<2katCmz4S$NWFL^yqCJH;$Y}t}n{Z2mr()T3UV&A#5M>+O*-$jG>DAl&dC$xDUdp_q2yL^k$#e)m$KM zztCI!=@awaBfEDTUkI;fz2WLl<01UN^r=6)wfG(kL5mU`!dKLqunL{12UZ-|!aalF zDX@$DiM32ndYhEeJw8iw-?<99Wtn(`HoI8XcXwUk#?)c+H!liE>IfOB3ynroeP|?x zA>q!jy%jvkoo3TI8k@tM**OieEX(VE7E9SZ=~$?$^Gxd9gOtfNM6ZNZCy@z5hU*xT?ioLSQYBrZ~x~7%uX5>;G6w%hEQQJJ!b$%ZYx_ z0SsL+Z}B`RdLC!Uc1-!Ud#=;jB>lO-*QOTn;2MCo0>x3YDvq}iSKHt{gk0}ap%qWF zYo1h3Ss!WGNOa&uV=w9=9_FSm4EXX$CgwY(p;5buXq(Oi7n4R_mCS#=aR!spb+Umg4iz>;N9jv*QX?K5h zv!10l*6NT|cnQ}ha%Am0wil$9#xWUF6zK}10xsKlR$fi9d2v02k1$N8K|c59iB!p)U1DZHf)|-+EMzS zS6TzZE>i`kG>6Bb))%Gj>Pddj!Xd2Ho@~z~#47DCT_oG(m~pC_n{8uY|8D1SA&c=Y zSLkJK`pEM%Z9XX1r&gHU*`Kp9AGWfpJ(Dt#tSic3nmr3WH6Os2x_aLjWlOJV)|of0%Pq z(&{2(4={CS7A-J{#w(-7tlAuD5#r{nMO&53BY2kd!jbYKe%-l^d<6(VB)!c3adx?% zDcKHDIh$QOa)Afutwjk_Gdp@lJeiUU1>mu#^WmZ!tGZp9Lw_~H?hxuf3&(*r=-WNZ zSL3+P%m?^`l#iR!qUlTuT{Tq~#Zm6q7_X0{Qf{!zS14v|0h<)l&`b|k&MHR+f>w4Y zQ3JZ|VsW@sy|tV3UM%5ci>5$QaR^OSf+HRr?cxFw3X~m(O(pAO)*R&_wbF9PtlpRgcz1O#q^G^ia=slwApIc9H&#rr z^i1GEJIEaYD2!|D1@wJSc!Mn{q0ZkpzmHSQo?M#)>$s6C@FtfzrB864+1LfDPxP;J zSAyLQq0l!9&IvjEwT;lYa|yi%=-B-)t!c1VC!Z9{H;%NP6MaA3KOuDeuRQ~;4{)!v z-vq=TD&MrdBeDI!H%Ga8&#|xOK8d=AxfU|!g<6L)AuE1X!2ST$Or%p^7S&Lsd{<_% z6pA^Ji#o@)mRIo`JT5Ll8{V8;4X+glVu70)&vSZ zC4+XsXL)k$adC3k!k{ImXo_JM$c$CEWw{_5JIroe6BpiiHnTVd)Ad)L3()`yL-o;| zLQTc8vqXsZxPO&@vIDC^HceqfV{ZR7GRwTI2e3(_P^#uBfwtt2v zJE^ZEj+yPA?}GOyUD~GaqLA555T0ig+`OgNkg><=Ir^79o*A(P`=DAHGxJ4;2SD0KE4&oEy9nC4@^~S)^r!^P{W)0d8Ex@iqIJ@txtO z-(IJzUgsqmMs{Uq~?1Uuf8_KocBxyaB$JUu}Ebfot{)pbD3r8t>r_z=ebMnIb za4xwBud#gj{hUE^wq(l@I&=FlN%@dR_zK9BU#`0_QZe$OuX3q~WY4;*iybd|_0J8O z@lgQ150|#*yxUbigSm7UC-!(g;*lfH8jQ3)J$-OLKNt{+@5XM~^aFZ!q$?O@MPnon zn0cNMEJG4&F|$mN^7_%jUsd-w(m)TYn|y|Z2-Td^u1|l(Dys~mb4K4??P)SJg8Nr0!7N!yIGJV5lB9@riMt{^;sDSxToOvfB0I zkyEd$fTZ4}4OtQValBz$pUlcn#R?U1q-BJhBH6-9OXE#~C`$4$c~B}4&6WO53NQte zOL`kcA#*Yo+5@pbITCF1z-i|a;8ZrH4ryPUug3Ec00k&Q z1n-HButLtgdEXi^H79^;LUm4fT8TJG(sgnVuSB6F50kF*NE!MdC@#y5O#{7h5e`?c zWT_Y62GYSl5??i2vZC~-6sGcw{%5*-z8a;iVWyARw!uFbXXI3JlBeGt6KG}h>$G`5 zn`2uNJGFspSsHu3s-Q%&l#j{*rGZd9FW_M(j~2G(z;?dsYxS6L6EtD*W#;b8^ zjDarmpdYXPi^gP=ILPI>g%?X_a{-v|85shuW$8^S(*;)+tlo0d#bk5;YAwz{oKd?g zj_2i;yxxl|3SU%sPAY=8)L3qfn$gp@7-K4qx@5CQ)hboIvN?0{lm&bQtB+ITp1R93 zUcH+`_~fU{4R5*PTf;@&Um?TOr2jXIz1Pp_)Z-~e{ zP~KZ|*a(?9cY*JWlYG-c@PR6?i-p2|zfzscpR9Kyu#luwB5;a%3Dv=q4RYSeSq{=y z+NR+sI7i}qS*c6E>LlHA48zG2u_OAx+R`goK8|K(1o`gZ_cB#Zj3fSKP%I~f36?`e z|86P&oCd5xMHj=g7C^{H^gLIin?bSjFe5zIzRd~!)d#P+`KQ&qk2--0@ff%r^48k6 zXC*x!jDTD`8KH!F-1gO25p=Q3LN+CZ5xGn9gHl2v+x7jf(0@LlhCBKVrdzAdBePme z|72##T@BvQ%3RZHK74yZeH2J1ce+A-+_Q{*lR*hz=#Ca*lYOgKf1-W9Rd27ewf6DT zbFK~i^BrYdDQ#(fTR z$Sd~`&Q!6c@7_~+6p58;_NFphg;@%9=(0Y9KAI>Vi1h!M;iKIVH@m9dYo9RaIpYGU znj)rPvrBw==e1^sOu0_WEj-DcoyDHRe<2N7jTapmV1k>Qmr^&!+%J1jDq@x8Zh&KS zryZ9~!jEXlVlAmSMR#P_sOlELJ{fyRYR~#OQ^hK@-Z?!v=T!IfN6zWgT<=0HoAl^x zkGocMx@C4`zLa^smY(Z;7j8`CmRWzwJz0OJcF3VrTuJPVFP7Kx&X4ag#JSGfMt;mY z7124*Jqj>`oQ<2A{lFK=QZ>s>oxH@YbwPKN@9U1~I_k6ejD_{g^D}eOJ5wqpEm15T z`YiJ%yZhb8jQyR2bFaXrt?TQ|j-4{sxeU+8%D~V#tQl7K0obmghzO;x;25JEZx1w;y+< zTy-?@gZ6i#=6f2IOvJk^nKpo3!kyx48KKhRGH@x-s3KJF9XCXsM{sbt(2kwUyut&z zpgB@wnYTmSSyB2bUuyXPy#0AWZ7GprksWm8o5csmawscHY2LWwIRv(-MkamIQoCxp zu!=YIRBIe;mibK#Jmlym9S2ZU-*k9^*EE-Z6Zlh{O7+bKv%=aabn(k|+Z(#`seaPN zd!Nzg84T>B{Kt#np;Yjgs^}T6e48|M%>mmbw{eJ%32Vx?Ur#Xgg7NgexAXiSX6*7> z>a5|LR)By``9t8*RN(Ps*EUCt^PX^jJJqcGouFE^R#CWH^kV74DcK{?M&6dN=L=$g z)Afw^33a>nUy14RtkMq2*3D@`*tR1@0G}yRmg=H~PonSsp}F_ir4sWyeKgx!X)qJ^ znRn!lOO{#X1CAgs>%(7wVa~IM;vAfZXq=7tx421?;?bF6ADQ-Zwk4^r6pzXm#q_A4 z772(kIfA5{1V5|&w_Wa$?m@oBUjIJ8cgXnj$)khNSTjpIOO-Zh(4MGCLECS`69kd%So<``y|15=rF8@9!KW0 ztsSq$fX_wcdvo~<=&iYpxCk3FwQJ++VRuk#Ucf3+YK}$c%gb8j?@rCB%AOY%Im!>t z&9TZ~ip4;&%0+?dU*5r-QFiCxC}niJB{7PB0G&JX&0^wZOfg7l7^opJIglB;n*NOy zSHj?J8$A|qMRg@%kP4$AId?Hb4H@#V`!F8Y{nOOhDueuE6gBpZXdqL zd@q_NRnL}wUoQXn7vSB7#w6J;m}4tIkpIn_HJjv-vtMB>^s~U^Y`2v>bSz7Ix6kKN zWriGQjvyZ;FG-B{S(-hS`-%pjn7^qN`JuxcPe4u}d46HTlt6O#?H>0X?(4l1n|W&Y zQYYf(H8OOva34O>mYW&92%Z=+7{6!$@ogaKrwr~ z0k!ml(J!}jSOoxDltRAEGlYd|3x(l5uFJpHAI$P5o-L)~a&MCcXqK@yh%s~42JLt$ zaCD-$ifk8dElzqyEemh@y+nrb6wwq<_G1Y3)#@)zqRVziBRFL!h(1I)0RA;=XUL#s ztvE$AgtlfFnO8OB?lzMyN{y1p$UOlp{HI*J{4dX4T&h~pM zeuYvxF+9PJ_WJoMhhh0iTQsE+^WnsceDE;fIx&+;mN(1(o@1Mgj8VGf72J1Ex@Hbg zW{K^Bg0pUFZJY=*#ogt8EM)ZbBlbLaK^K1p*a%`KiI8@6M&yp1Hh8wqj4;&!j+wy?<;8$Aq)3#>MxF$qGI_S;rnkJVx%+NGp% zi<)r9iRNo1O!ONQi8Fa4*}=0iJ~#;8vi-5yGun>tC zI~I~PbW`np2x=vH`u-%-4HF3{b3Y#lz!AStr1hgmbdsSnxI3i4UDcw$&_-bM?L$PNlM8qxdQj?u+9K z!1^T}Lr*ZkiDo5>!}Iy=*|n$pg=4SQ*QXO~mq4pp5O_4;ksWtPBWrgt5nv1;3N&7T z6&!@)8@;mN%uY2ds_df~&jOLqhl6zVlXNJ3JMC5&%&tRZ9_@LdsJ zcM88$Aa=6-WPF`rcZAw-Hy%GIfvQ0)6nxD%{D089)qnn>-oXlaQ?BzcC-K(T`qrJy zg)8su>42_`$}bw8ru-7C!m3b^Lyjo4XHH7rAHDiz*GmZH9@j#~=QeyLbCQrUs$xl` zNlGa&xb~=7pfDUxjmjj;4LhvRqy^XC^loTh8ZC&u>^WcH#S^i7>hyjS)GvMr-%~l` zCbh<{CH^iSDnzf<4?+VFTBc3>kzsqnI#%DWGN@=sslz@I4u=F*Zq*$h2bsoIm{J&2 zyrKvx)~=}8@IfRe9J z%*dxMc#^oI&QjvrQn4kAg9ra4n|=wJ@Sn41BzP{vQ5Rg6zGacsoY`Nh=E&GE-9(FJ zxQ?z%i*pUcFs55alQ6LfTT+dGQ}`Gn7n!K{P)^3owK{?y4->F)F9VGei=4$o9Ow@b`rv@b(IVV(ldc$X=83r-NZD zRo66=VdN?t)-oEbj0v;YqPq+>l_BuGm{S&IhgK1L`gJ%#(atbJZVhmV^r<#Ttb{tlY)QOArJ$#Cr2oo5 zot$P7CR-6zDG2T(Zqsq0uejl+2$5&)%|#rwk*~8mJHFj?=+C|_O)Fqw^N5gU`2B9mjK?){XDq?@1s3n@uVelQ&;Bl}T^2roe$9{%p zVxptib%%(Y6yk-yt4KUNMJar_{wT8NSfyyl_IG0#JHqsgqEyq8@HDgOrr0O)-xD(8 zUM(=kB{*ZhFZzFo|CS1`D_!XpL4;aWgAFpi4~)Y89KUzwN2Ldxyh#&bPELZ9N{LKi zm?-A#s_hXzn%JahC{~KkXqUMAXJnw$O#%7LS_^5N-GmE@`;^QvLzL%rq<9YTeG809h zqqodiL9h}IX=WYUo95)bvF>M=3=O3ix#4cEoy)j|})nnhN z?y^?U7CwUpVl3xbLwb`M* z78r2;LTdcp9RGoTs};M|-AKbP$PGu&w(u{2nXlQx%pjzG_x)4N zjh8gpd=^2I)VRW@@H5$Wqn-*|z2gCf^=$`99t0XRo(-jWL9H~FAVf5RjqutkTF?@E zxC^qz**UG6V3$S@%W>7GNGLH*A7ILZdBTHf-GxiZgK19CWRIDt#R-F(J?-d}QSX6^ zlT8h(L2k+9q~YbXVRF`_fV$}D6l2E;fSq$yRdxWk6uRLRZHIK(vB-;a&3K~A6+$Gt ziSzY;XcM{ta*W4cOCsAZH~7D^B>u(>EBzY5HZ_z|PDb$3yjfFnjZh|o?R zEu!2>l5{Xp1s_GFe4OLrIcM_jkh{6m{ptF|=`&uVXfk9Df3YJ8hm9(>13e%mRWyre zA(N3Vjtk4Gq-hH=M`EH-N0-^-G+90u1!PNhl;UVjPFJ$&A1Wn1mZ1jc@1tz1c{HVR zfgj_?$8hs$JFJ!35stSx>q9x!wKGnGW4-t9#_`Z08A~-mwdFwJAhQNFvdBjQ9EqXB zgUTug`x|dOt7|G>acOEd&D% zcO&-7YuJVDp?J=9O9q6_z0>D!1uSHjZt0vpNP``K6sm0D<^bchy1IabUYWlebBtx^ zy}T&YiCqpPE<{Ho)fbtF=Z9|^ZWfFE>VRop7LF~do%d?_Y5CXI0GfKU9Uk1;ggumQ zK~YyNwO93XZ+`{<4TBSk8JBcJ)3ba^xy%lOUpfNP4x|?Mv76#^RmR+8`hu&h`oDd2 zWAJHUtaKo=V{x-f0fD|K4Xt@HlykM0fVB!nU zjFuslywLlEvr`7x99u(wj_IRBqUd1{tJCQTD;?3CK?F~v2VYZn)55bP&^0twa01aQ zR_=fvC}L6_dIvs{WJZ__BPN&d*sEQZ9Cq27hVF=@4=AEulPFo2pQ=Whz(}u9HW(PQ z`JqVDog>z3;}4pC&E^vdhHl|MStNm|IdP?Ei&{$b3BHAz(igF7;JxVxqujX_sWK7M zIVqwfHY=HIPJmR9Wu)-0@OUcyJ4_nQrTpGuu{h$)ZyEgAD*dFo{RM>8OLy7cS>mnp zcHRznXWm_%qetaD^=g$_-No6a8HBz4lWoxpmLA9!%cvF0&z2E)(yje|vCcTTr(5PV zoa}yPQg-U7^DNtM|66#~f6AI9J`N}E-(N@nuP!F}ziDD2D_cin2NfrCtN-#&1}j@D z{VHM~8&*4^21F3x%IYOllAtkFjcQDO0+e7-|%?Jv917Tc7*| z46duyZ{kv=k1Z(!L_`Y{huQX%oQEvOT+f;BubZ3S_}!sdd*R#ep(FO1T?_25F;e>A zGhh=t8JblR6QnSGSwgZqAwYWeOYXD)w(4&tgF--G5Y@$zUxv72eb6FsobqyV5=9L8`Y~keAVO50w7R zC>cv6b1JG_{s-ls9bXGAlrGN88XA9HC-hZGSi6#)lZ&t9^LkMW1RiYU zq3n1-T73^aRt6TL)r?J;_nF(jClzEkjfEppc0-xpSM$ znzL)pBXY3_0qt9Wu&#eaM>)4SVU!JPo%ZDY!J^x_3Hv-dQ7a|EPq}ADM z4^7sV@d5h^O-A9l=A644P>Qf@I)2I}jEix$powmaVBI(5JOg!lbkYQnJcP!s9f(;1 zmOo^?f>Jy!dy_AP&({-b<8Pf*ChjkIOgGdrpZkVX&+`a=xvOXomdH%j5?{no52lnJ z%GAleuxi;QfaAEaz!9P^E5l5)ojZk6B(4h=tveE+Y;9(~o;-F(E?9@Z##&6T0V<&HeBFIEG zl?r|q1J0QUdA0pb?TP@!?*3x%mhL~Gs0Y!Ny%uoiA|2{N?oB$J^MmWgGwG__HN*Gd z4zLNnnxM}fXzFJL+lJoatbb{v>?qxNgCq}jxG$HbOJqP8t|`NxZCGhpHx)%s=|$Qc zDW>X+S*o$^;^x}WpS9gLp|>ZET^saaN*;mOjWlW8XKLJ! z)Fn@sJkWSpdJ(Gfm@sBy?QZ)=;oR7DawIS%h8V-ng(1>&f{3Z~kS`^77!$V+MI(Gz zG^8jK&j>7LNS9*3L>Ggz(CBv6k2pH*Bl-#vxvM7TzLU=B4MOT%#Z?4^YCgC-w()gG zEB>Pj7P$*cmri$*VZTAB;8E-7s+p1dTOoPmOqivvQkS;}{JH6d(N47&21i|}i-QM^ zwIV-xzNBY5LWtl%bx9LqYzr|K1vNN=nwX_VUyDqVMbe(*>86v9@jb51(Sh6HChI0IHPniWi+LwxuMrJOg~#peB$Ma7W=07 zFfKAXDQl9aZ%hLEonos#i7>p zc^E}_q6DP0BqPhrW=H8Wv{o%$vduUcWUvzSbZJIwu9JrNU?O{WZ=g`9&!a;(NDG6O zr!r{KWNwx!AXXcJXZZ@@Q?YM~=@Wy7oTWwR2J&35g|^x3!JLds?+BSeN?V)gp`1Ep zLQRxBzFN%KlI=WBKx9gcQSEra{0Z2*bV~&dUI&9|leo94w|C!sj_DJq$?}QXTUh4m z7{*j>k|fCuV>`&=RK;e<{HcQs!a7fd`Hk=TsSv`aFF%-T{EUY2eXjM*22$EXsm=0< z^D|ec&0HnY8sfX}f%3C(OZY8gV&(=xXXb{%rTiHhT@O6X+!cURB{}?W5m_&^gghda z!!swKBlv`-O6ur>@o(i!nIm@U%e%@TmmLw)(;5zrw3&9;%_0(ZhmrbDA*GKD1i8RQ zS(5!xL{~|fqnpgzU5FW>!WELU}68Qm2zPM>7$K={pE-BMFl} zSu)gVMnj_^WczstN_fuIO|GpY2g8u$H1e3WEI z6hfm?D`}h9tL=F0{h#8T!`+dwlbtgolTyp?=Y|uSjvR)XI;Y7uk`is_ShRHW%{*ns zSk6;6w^hx?i{{scC2O=QiR*g^o!38b4Joh6!{whM^$~b0CxwW-XW*Yx&k{;?xmVAQ ztOiBuRgbDQX*! zaKH5oEBC!fSJ&v;Tp)@c_D-PXGYh`$$>BCL>5kA_Qt3o7YOfk&*Ej7jXjAb}vb6Pe zUpU!&8P@PQA|_7Y{XTEiSD9gT6CM71lkNZjXMBReN8$Fbf5@Za1agMV$!0mAA9;r& zTw{re2xAG6>?p_NTVOBdgy9N1BOPJR+cCmHvG>B*Fi^6OxX%NAgKCFSGV5_(<%(pU zES^7@+hSd53#o56sX&)G@}oejpJ3uQMsHmWCTFeoy+p8!1m_pz+ETTVgafR$pz=bffZFzdpyZ1V}5s}y%&~(eQ=&#!ZS>fR@(F!*5+X1}0Uzj-6wul2OJ@wUW=Gg8Rz&&u75AW-qKC+ z{wKhnXTA{p{RO;${O86Ycvp5RVk6cf-srq5VyXx#R?mGYJIe>X@jYw#{Mh8p zVBzIg{2G`8*wpmLjG|@zkz5SfwrEcl08+pmLTU)Yw*EmQp9=X+(3Qi^??YH_RQNJS zu={G`G_fpJ3Oci!!HQNmS{&`tA@ysT1du+~6{r*4Z!`P@b|tm5&4rD^6K-?1+lugyrzHT2AbB z^G)}X>@5Ch=-I9}JH*HMwb)wg2qd-62+j>L!k3db)B2YVS9YiN)bi(wTkiD!OXoBD zhwZVCy%dTUong*)r;U4j6D8S~jkC4p2#XiVam# ze{)R)Mm&krP&$_a#TD0Yli=6Zpkn-RV4mX@!oYPt&oOwdE(=_4?%_=3-8&e)Q$N8T zVmv%{oLUxz^ma#Z??UE&p{F&Abl>_(KXYD5>j_Qc{XMqsp^NVj^A9ab__3#9OuAbx zntJs^Fka&ee+FkX;>#?oiaYG#xlkHffjgJK(yrsn*{&1jY|t(BDS$Ud4pkQBKYt2*|NO!GZ|dM*9sOVE{QuI=)!zSu9(3FO(!*xU=q^E;7){+* z7fS8tm*>Y14p1QB7bH@L8e)Vf+Q^U?rjE9ypy^sY*PG!}o4>C?SyQ<0L1~k>FG|@XH!P!URay`mky+jr9HCj>79Fv< zs2;T=Am^%Rp9&}Ww$1C+F*ctYWVp7uyszsp#wr$(CZQHhO+qP}nc21m=++0-sFSlwQy83mdYj*GY z*4kZLU|DYfJU0Z)UKJnhaeM=>3J=9`d?R_QZ%mkesz-D0`j~y&Q+~pIb4m|JbbbN8 zub=vqeEjOZf+KPj?h9jjhkQk4c}q)E7hh;!X%}B8-&B;kD{of3>f?HHM}4P#1&3|Q zK0*6_V)=H84_=ku0!Mc5`MEy{k!;>ya$j?Q|F(|)9G=|0J%)(?WJ?VpQO4vMQX(ysrOOW0DNW@WmZpx0H|0>B z*(Ubc>)3UXnz{{J)utaJk-80OGh6s&PrXD^)Tr+xEF0oK{(cI_s3(t-MvU-&TQvZ~ z2rhe$L@awFR%$FSfIpk}778FqEe$g^Y*S(S+(()(4nsCR`Ua{;STAgQL{yd-qRgT< zWUA|g;2WYmb8S$q%J;R9qch}c%05KeE!Vf}z`haig4l zfu!}8wd|X!<{jogTRO?1>p=T2_Y6g=;=!BQ!Ql@In&Oj)t^MWwGuc}-=L ziAs47+jPFZ$&dt$lp0%gRh?#Qb*sTc=LuESrKMW6LBA!2v9g=XsHb2K529xN8!Qtz zGqsE05*Btf`kuazgOHERP^3!?OOz$16=tQ?DvR>UntosBlAu{IX{?u52X&#;akCIMTd*#B$dUIi=1IXf5ePgYyj?&CyN^tNWK9fH|+r^^5 zHo}t_Z^ldv^TYUD3Jm~_msPT&oSBxG2!1!3!e@5X6`Jj~8Y(tMGlMQsmzAhUd(c~H zEVMeROXPd%H`o@*_f%Nonyt8yy%lwuzuL7JHeS$0`IUI{SEH`$19LdSQjwMz8LCwp zon-D0Z%_^ymK7<4^><6Epu*6S-)*bvnmS8uqohKJfX=Xn#Ap$f7V>x%78s~B)=`(9 zT2Bd?X9)-O*m@2qHQK7G8q$ww-BBtKy%HDZP$3$a0$662Ja1iiM(Bnh+|<|5O(GtI zq5_6(%-B$_tRYZ$RWTK>;+iI+?Tw{nq{x?iS0oyi92#H+yvtirF2;Fl0js<6*yfPJ zP#1=Kbd~1E&RP4pWA&?J_41;!swy5?i#%<#h-Z9d zO{BqKPtPLpHRZ7@jv#w7qih~GR)xlLp5@SSAaN(T^#RLRYv;zSC55dB{RMj|8#8L` z8;i*7kopT86`t|k&|Tcb%{PIdBVaxF3uuwH_0o6i#1s}&8#AdlX<@sp*p?iggI4+p zBC-r#B-OikICACT8T>k+1yM~wo`hOip;hoM5v11xV<)d6{Z6c$D8d^9#t3`oYOT7B zVd?>9muJzegy)2ccys{pIv47Mw^#rxfOyGMVNN0*CyZ!X96;AYN>E7`H7E=donof# z`K<;5Y#oHnd0f)E)fH?@J(Nh%a$8nP9xS5r97DF@n1j<=b0~!Rg<_T-n(d@?(vA|O z9c+_Um~z_fjn$@v0P>u0Sxz3)yIeKSb~c9mTm$wmXe2rB*kTc+Bt{^bx_9SnWl}7R z24i)Xpg(055X?Q~TSj#QY z1!-bLH|OuSaO%2svY@rm1BvvhN$~GBgWK6c4Pz%XG%pzyw2iw_ebkp3>=+9t+T{(v zQ=@{~-T(9?=0bh1BHg)hU?%>!m z6u7IkWpTwr^)KGqGcPZRG$PI*Ft;Jx+OymkU;+)e8&f~pY5`h$A(D4?8D^f3X-gsT z(T_KUCmc6`PvVUUSWU^fVrg|A)f!F4Pe~z)IGI@;`u;U=tx{h_iHiTOJnoKKgI+1> z8;2&TkuwGps@6ZR>eSRy07}Oq)MF@HKZ10nB(K#s^U5EBK~HF>aStA@;emIsm`+V5 z1_Rk>7_i9zPeZ0O9>s>)Wd{xt%+{?q1cOr8?(r~E?JFFBidvBQI5Gtyk5VlFPjpdT zzeatnjVjXVG4DLm5lx#4hcKuilWeYO9l_s*W(`MuV(9gzh7yrCUJkcexG&YMCfzIv z(=_3yi*h}<&UXdsG?&N1d>yrax>%+e6YgtlA`(8eb)I0jA?#=wE?Eh!r0<;%*`mj1 zCyIuIaLLqxnyIzD6D{*L6T-zm5H4)UEvbQ+jRa%kRJRhuaBE%vOm1)9i??3C9{ zfQ25RR+5vK#HNK5*)*ye%%RaySfa10==&pV>tgef)-*=y!hv4a*7n&FW^%wz`!tct@J zq_ez(^g-$+>E`G?=E8)rX?UJRD3QwPX#b-CQ?8Q51D#Z-tEzwgCoEc zxur81>zk6e86~-G9K-f+3k3NH0cSXdZZ_Uerxy|I(I^oxfM#}ab|$19-x7!cl!he+ zb~0nr<;uiK-uzU1bJC>x<5BQbAZ%e~niso}hPDfdQftN+LjjF~A8^;`DE#6k97N8@ zI9X;wc2-mdG}y*DP@Y6L%$=ioL*``5i;d)nwql!DU|5dW&h;C(4I`-nS2PE!@^)Tv z9Zs1Bsz-m0ii8i6mIIXJ`BCetROXdwz4uy(530||w>IL5qVIbAXLX4Q8Y5MyS)y~xSW_HjJ^z{3#h z9(;Cu6MQ?0S}w3($13T0)52O3tm zGtrD$*^;z9(3zXNY~YZCfU`JCR<8Y0|H#r z9?mF52hy#=CsNmj*;->Yi$esRFZt_v4<@^X5n0^jVOkyT$=ZdD73FPy`nUtD1}!uo z@NwH=(}plGhe8^i+9&5)qw0g?#@Vrlht74Wq3uE2m64-sK^<;_7mGs)9d44`)e)vc zjlcAr?y)-K`ojrq_w%yR)d?Ska#c`clOi_lJSJ5@%>cK-bg{fwOTZOwKR3T|#DcO?pR*`BDFd zPhqKt|L|%cyIEW}Lhnmx`s;HA1sGbkX_J{1Qd$GeJAr76&&qF{^It!g7kYk7}?GccLU1 zL`W|Or3u#%7(>O-xGBkW7eebpvb#KdJ%sCYm-zsWrr{Go^F#Do9oZ88%DRS; z`3m9RTNvr`hQ^p8&zU=Ha(VH3$esP3zU_y%iZ^A5zJk~?$5h*jfbeRr!aAzYwXf$` z-o=e>mMn3Z+6ls^`PHdpk^W9p@EyQ75Hq8?VCR#V{c;olH;{^Ntel z4m2|XS~MXxMJuLn<;x+&Hw5Kd16c80%CaS${V2aHnryhUzJ`H^jYZ}Ma%pxB@MAVC z*oGwpqA4qm%m7i|I^M`kr^J$|3wjXt_Yvdymno#DL+>J~QeCf@D{{T?7?cv(fv>J)DTD0K_d=#(5VRO*U!$sUu+ zuMl(AoJnLphin=${>c!_~SqG zB(2V}{dxA~JnbBdO$_8h4f<+qm!b+NakE5`rA=PzJ)MUnr($qD=~j}NwZ%ur!wct< z!u7oCCb(w6T!K3c#BD6-qI=QCS_E_pX#p9^k|P)19GyVBq1E@SBuZ+H=D|iWGr|{a zfz31M(KgqYHg*ZCtpw7yvXND7OQ#y73;Mn~6Qs~g6q^IDqqv7`{RP0~pV}KeOWX3o z6N|BjYy*iz5%FAc#PN3H;fYn}oL<4pNn+uot8A>xcsgpnzf<0+-X#NOZ;8u3)EswD zo&gi7{W860QaSF?ftjJNVWe#B=A|`NF+@Tm1 z#N9(N#z+RxNw)@SbvJ}QL~?ur|5AtmGsmSi*%}?On3s5pp{7@8DCv&`n@anvG@h^; zmbC{o?&a4|kO1?o&>MI0&q9iI1sWK2#C14}rJbQ0%i3QyFp+i;W?co+W?Uakg3Dl3 zPzey0m6sNEnMHZ&2OVHQS|JChER)F-!;n3#32b7^_()=*fmxw}cG;Um&UGJ~Pqt(E z-v;PN9byFCDq%>CuwU}p(mX0y5Fd@UAFGIGt;iIAT%H_vIGb>b3Qq#JW(_o7*1Apu zb_vZK2!m0?vSWI*;th`gLnJKdcGV^?>LZy8aheOZIETcTK+v>!7|EMfo^s{n46t5J z3Ue$~pNDnhXJpNQvj%4g^)Qs>fXRWU9yoJ^(ZdWVl*5YUSoG5udpzzFJL8s@|^*1^`n9+ae`;EBs6CN3`k3S(B{~koLxcImLfyH zTwUWGgD3AZB$X}BDSsFsXOg#X8vi4$ySgl)7IVL2Yu&w79UqP|=&a z9ws}ZbJq-ufnp$AkEp6cSn}=|I!uK!89rKwppC>jgN%e|3reVMaash$$-2)}G5Crx zhsa>Y1`*Yae06&feY~USL$TzW|Qqa2c zqw*G$BCN7Ne_Hd``ELmF6Y``8io!2gcHJmMTvc9KrX4&bR*r@|m<=PB$wo~0I4+2mA$m+S*1zZ- zrh!lQ{1cd{EAHupatYdnNbrQ$wf(FrX?aW)U*suLR#(N(N(9;Tv1S#u5%g#a^E$o_ zf*PC9Id(NGYdF%*ee4Y0`g&>(uCb+EO}gwA{X;rDbD%zrAYBximdxpPA^W8#XZ|mz z2M6|(!ciauBJsdkwEfOJ^X_6*;mB}PkOxy#r!LgkIan4>OG7uZW5-z6vj92Fbt@^B zp~9insIrthLwtIK`RTfCt^LcDP-Yh?Zkd4XeVx(wI!mdu|3qBPA|`%9wwPDU3sgLj z9+ZV-;n-Gp!Cq_)BQ&kVJwsqC%wrPa&l)QfM@i-uC{g&d6Bjh!~5F+bgKr0dei98rQXqcT=m1fvfeE zm9?wwqJ6V3za15mpSGdJauJCl5}y=*SN1m(p&7#`B4D$<;yZZyV`{DHy2x1D!6{q%sl<^I+$~%(2vT|q!~u2MSz|8;|*x1f)t5(Elxw@WPlP0du4y}m5_}41(h9v+!qRGlM^mT?x-EPAP&JW^|H`h_~dI`IEGESyAR}?I7d#tgGH_7nZ zWmgwF3}h&cUT&3pE9xV9NL@3Oesz*$A%d*Q(t{`G_djzD>UjoLbHg7F*Kh7P%++&^ zJ$W(D9I>xt>>qO`Pxl@1Gj9DV88=YaH!Bg}_ZY|xA*|jk>UzdibfX`LT0N*&WSf^{ z20gQ?bz`1EHND7JQ`XNX>UPa5S@pexs(KO6Dy<)u)p^!cbpw4Z<8VBAgzrbrl4O2z zEL(js_W)?~3OUtvY<@zgpD@)L->voZhc+p5Hg9bU!BOe%4oq&N ze=AnE$$Fw_NL-}zMmdr*C`!h1ItkXlzv(g}{=3KW2~r}sDDUCT`fSieXM>H7)UJ|) zvjdM?^8P3P^7~WbLDd5AYDZJ8^x3tciVir_0oH^-wgHq5MAISm!Z_@alm}eZp?&1R z*oGY2K~x87>>;;7uMS+nhj`{;|J6g_`ZMhdxY8QVv8kJ!HPk!?t<79}BSQ!&X!p}H z0|O?Vv>507(>gXmhm z=38414GSJZ8hn^o^~oPhVin~^CBkiuIYlIgxt}Aj`iY--99< zPKkF1BDeL&BiKE2h{h8Fy>2^zOMg=t*H0^wVR8jofVqY@HZO-A?X^&|L|hPeSx{cRiCRa6fN2z_5+pPrH?)ua`~uG!^3=v#40*eR^Acu1R!)+c)9HFFADdi)ID zCP=~&B;kl*w#?qW11fB|VYcW_D>E^-oe%8JL(11j7=mnjZQvX;tm_W!khpmU$FBqF)sn3PjU!w8s6xR zxE4aX)3!-dAUr#^3$+1-UL)Rr@tq;{W0{AT#c^EHqWpGyh@V0LUU{za6wGfv41qBOTIAg0I%WJ{5Q(Pf3$+O^6k zW~5>=(ztoSb*&A1@yyVD=|~T9060ao0hb&{T!OoxBM7#VG2aDS*XTk5Gf3I0%W$TCs(DF9E8Sn# zW7buEL`b}-Zf@QMlQowfz-f(&hMBTgoc+T4<4kjXr~Jx`{-Xmf;nisP$v-9of)(co zGm8~E%zGL0%}hL-GR7X@bmq7H^TV#pP+sSbT?0~dD(PKrdQVMlU5@RasUca=2!*-> zb@8|Bjdz@U^pu3g=>zVkkzF9&Ah=5b(`){1-l=KKfYl37fftD7nnPmW8M_l3a@`2L zte+iy78G7HpSY}{2Ye2RG%_A)9Vs>NiQhX0s(kdt2c`tmOVLQqCt?BANKPx;Ct!!d zv|6mx@+ccYiOeu`o6+rUhQ7z}?Z_UHY&M+YP=-cXW>5ZyIf8%(7tz8vu*z%#k${=^&|3*kSwiQ9lG zh1V4(kSABw+a`;#1h`C0@v_$LcrMod(CS1>McD(%{T{MQFvPkojD4%`cIQ#i!fgxz zAFcie5LD{dkN!d+ZGuN2g;xZ?8{l!BNA5pY0x%gL&LBVe(gZYKjR!+eyX$GCx!jbe zemV1J#R+^-z9&q-dek@b1*Q0?3aw^?eJwiL`!nA`Cf@?C+I^HE4{qZ$cMfydY^Eno zdq=Q!h{pcl64lp~h#1$jP;1;(*i0KJ#Y-tTgO3fuV$Ct>e?A%0?v9|F&e$W__VS1Hh_+mz-JOS&?OT*uy8jUA_FTI5~$xER{I z8@th+vsGE79P58lu4t*2%8U2$kB7GfZk;vqY?Y|;C0Fd1c z1$jH-j*}L`8$IY~FawYsNYb+jwO6 zGZh=0d{ZGiL+84a@J8b`blta}Y`_U3x#tQ#Ge0Fk-t392DHNG};#Q5ZK;?X~CfqqH zoGBKWz`1}FDUr{nt`~8xM)0vxp2Sj~)Y5A3SZ(k)ZGisC^BL3vfHedy22rc(X<;aaID$yqB-*zDX(r(wzp-egoU`KN1-XR+MDz?^L)Y?GV3ZfU4x;%spw$df3ly~FENGO@-`Y0;#sh!DltS2NjL@}|qPMw` zryk*l5CQ=c_RLZK4TaU(LbdR{mTSyX^4FlmI2K*|)Mc=&XxQyQ9_=SHac&_iY9}K4 zo9+K=hnk3)M9r6Q@>*JaMT>>&$EcH$So^A!|F=xo<42yHPkiF?LRQrczluvo&9v0+T8HN4hGW#AjnXK-UZLdIL@dC>f+ zh$|{>I@nV1d1Bg^lxl_#$Wdau2#H)>)oKC{+bj6*GX(6#kotpFn(a=JGe7F;CzuW%YKaBICTL#R%DDt_ys(Eb-aHR~sxdIMS- zQP_Z+`jDE*;Z#-C=%;m%9rpXk2Uceb)Xrvh&TKf_bM*H7Dt_k_p?ss-^LDIGi*VZy z`15uu&Jma$YGJm|@N;&bWs}0FOfFrb$hM*|-JsiiV=7VAf9>&8kbV2w)ts=L!`jX$ zPxxBO1NI6wHcAAjR@Dfn>Tkm;(e3WuT%=e}njhCQB$(Kz>*dH%+l2zRCl`xfih&cW< zP@*S;8f$yd7jIrK&us(1Yqw{H43+@1OrNovt!R`;0o;ukQT^ZxyqPA>E+i=_cKRs9{3;&ot0FZ7ARijp)QZ7bMeE!Oe3K->1cFHwqsj*;wyrqnI- zEMBUDAZ-!nbKfh7qjQlUzACq&JwcW9@YCR3mw=iJWgYUwbhN zbh{Xhg65P&NZzwW;9})AS(gd9RN>U~6S0gIbzd}y;!e9c1xdA);ox5SX*wKTKw@ESex zpv=ryl{Cg>{x>Ri!T&B6fRS;)p zx{th&>K>TWMDd3{=|vS>>H2dsPeCp}9xqV?d0AG>5#u7NWoGQB;|o@p4e^MUtB@>T z@@2B$@_dts{W#m?fcR!q)R4oPG5hlQsOEV3j-EEb845$stg? zz!%OfGM=XF6(V`6B3Z_^$;2_O&}E}dmI;tX{udZ4GH#$jd0KgQ*Jv_q~nTWPhEHwSF$^exPU^TWFe^L7`#X-_<^1{h8 z9aiGO&2$4`TcHi^R`}nJie4`ssq%GD*IIlE59n+D?fu!O*Z%I<0WWOT!sEx)2V9?q zzz{_QjxhPVXj&BZ* zVoGH?_Ed|bZy#3UCdetXhfO-h3g^iq*lJqoNPW;5)KP+E)To8jmWtzp-D2Z%^|xp$ z>B07=#f1Z+AZ_L8RuT)B6F6F9la_0_PlsYu)P|dnRi#*!R8(Rp+jHxD31lJ&xOmXJ zhl`zyI0T;Li{-XKdma5Y0j{-VlxNg$#{E;89BgxeGA2FP>Do3=OK#>z3Q6MD4%@kV z^Wqi@{W=Gkr)t7uQ&;F_ROy2Thcjs6q#zmRmHd(zOwW zAxWQ!vZ2VS%gCCv7^x|AfQfaZc~APV+NIfgbdA1E#sJ=rS3$m?i!;7Xajj)ISGxh` z+*^1ZkZ~PWbugxJZ$p=G`@)6Z2B)Wy=$4WlQBG6O(Y{#}m;qRV?vF^o!RxKfr}Hn6 zQ^4)3e{sQ{qmu350fQa;t;&EACFL6bpCt3hw`RBgmiG*{y+iYP3<1=<*9MmviGc-{5p`)K2xvaZh8hdp5w>5V1pn5P~}W>nGwEFTExWV z&@mf}FC*`w4n`+4uswJt^9%7Aug+@6IlDcXRlV$y z9kc9F9pPsIi_7TQTnVE@TSm@CkjQt6W zGq#AmURlSe0hh#mjN^=VZb zRkiUj1wa+>L6TE-@hHW*+IWoW{qqE7&D(kk&tLC#A-1kguoVly1C(Dkq#GauU_1)w z7!#la zzH_eH3>}BDp2G-Wx1Q5@nClG&z%RrhV;S&%><@A^Icv0T5s=A+t`}I{bw2U7FLDu< zJg;Ed4+H2)o?z}H9eRy7Y*LEf5cUaFxk_)a%A}gPEtmn*X*e5Y*golr)q2qv8m<_X zr=-b!Hs!tziW8lRiQscRwu+IG3SCxhX#?rXm}=z(b@k;nAxn@>p(#l!vgys>VJB*; zlq7D{gQ_)?Ha|u5Vz;B-zA?^^+P=Z4ACXChivGX+mX;AA%jq;@{khR(4ag~a-i3D@ z9EjP6IO<(-My5;!YdgiK5BIJy^H=t*9?`BfVWXBZ4Y`ZeB-{Q=*>&ox2|NC`9Qch@ zrGC#z2K|L}-#p+ftLCDPZ-NS*IrBNE)-$Y|ch#<&)-%HKQ4(%6WEMEcW$*NA)P6%3 z^lBw2fmKHY?US=Uexk~EFZbcl+IcM)&C z_1#e~^0wdMeq?`wx!b)Q(2q2!r`mo~7ehf|nBUIH=E+lkUsBif2JG449NMknJLA0y z3zNF9f+hHEG0zU1$H6~?_ zsS?GEssH=OzRaQ`UN>ol{skyX6LL{ymP!l!&NF@FP-JURpZty-T6e=DSP3n#>2duu zv5Pe;V6QF1kWn9j96}bxm`ouV6Vp9vVN%`3NaJmY^wWYL-sv?HH>0u_$J`OEDmE*Z zgwC{>-W`t*mvqUVPW~jxW{nko*vWdQVdg0no_>c<^PR4(NN6>JYJOTSpf(Ta;&R2l zTA4ruCr+$_S--=jw0b!%nANgIy>1T7%_TOwUJlgOvWI;SC*G|ZT0d+HX09^YAk`(| zTTdtYcPXtwe(o@!CC`)^*1EY11(ix#6NV*`Rz7RP%B7@sr&@!|rKNUf)`pBFRF@b` z)7T2@OLb=gjy%z|$}{r|TT6~lwQK#)Z-}hU^$E}g39m@>-TE0@wCIKwfvu9j%VMwJRZDR6V@*i=U5GToqM53VnE_u)+kV%RXU8J*?|$zfVf5IBb5$W7Az%b-Ts&>@ zn^2FAKpsPnfF5DzT#+|NGWm4{pjK~sAN6$(5UFSnQw#>2;FPA4-*g0a*12ftt{zlsfXhesJ1I5kIWncGcul*Di=MC9czwzET zHm0zcd>DXBQY)gFP2`~m&N1@8#EcRhK9#*7nIEig%YFQ*AF#*ecZ1~5JmrdeVVKWA z=88YCJC|biu^$Z9YJ4GE%YK7GmuB}&&ra?-|Jc4n{spR3>S=BKxVGz>CjE7pN2c=6 zBkZF#d5q|#E&;cX+@3&tyr9nJf;6`#{DI}IVBZ^^@;Gd8lqo8~(i;Dk>VIX4He~-J zYMK_U9^FBz({oyo@D5h6%DmO|aEI+%Yt-fBKH*B<7>v$5C$Aun{*+4Qnp(o)m2ML> z<;(1m>tWBXjfl$^xIglAa%1;V1~-FLGMqNzwN5^5dKK-?)1(c0ZT;7FoWd5m9*-&ER&?)VAXzS3ga$d|D%!T1kZ^B3V)*ZRlsANfO~j+<(yH z{H2crXB7U}bM(fQ@S+}(`GZW@rCy=~*mLIUhZsOp+(-H?X57~I(!opID6FGh)pC_X zUx-#{yg2k5)%iMal7E4|6s@!z3YB5_L){lY$-y-$k1f-0j{eCm+tXo=vszH5HBj)6 zl|g0!*8#ot*t2!d+9Q}SIM7{X=#i%mP(|AL9{d3Phd9FgC61^T-uZQY$$fED008p; z5J&$vz5IW4f8W^$Q3h{GQi?H& znK^}=0y&YH21o)aQ9fT}D=Q<*`P`T^C*yAbI7n1C@I$~np`s)~xd=Z#Ox?XGwW6~3 z!&u+t;>ly4X24sH)17oCGhw^BY0K+v(_HW8_0x^rozv-h*qkhY`LGx0r9+SBH`C|H z-X9>B_JMx2dO2=e=6XOql+G;YZR>s1ZOY{~h?%wF?Hj>Pp`kUH+HbC+4WGG z92y@RG+PUs3!6KY{9)weR+Gh!?vz=(W<{dbH2rkQ%2MgBEgUO`B1-Zr>ke-zFF852 zxzya$Ue^!xs(eLq3-?Cdz4;UOd)Y_108d-Soas7+{hErM^8U3{iS_6TqKsCyXz1sy z4c;m~5g8RRQri+%&5dI8E=fIKtwb*NA|jhJEJq-ip^5es8RqEYq>9j1Wk+}R4BYPI zAYxQEYYs2R; z^~2~Sd0iT|q!iyOzQG#6nHb3djXY-Ol)>wYZ+QEOU6F{7j51B8s zbJ2{_Qe?PP3pq{S6;mn>OO-Q9Q$S>l1eVGV#;)Oh|B>+M`IMy1&N@vUE=#AXpu?i_ z3DY+9U^U*3WioTBnZc^838=LEHC~T|nThVE>=tC(>yk_sU2GZkNR0X*Y+rHkwzek7 z4RR3TOl*j8TOHY56O3-`^ofp>eDP@0&ZN&e6UvhGDS0I}TnSeVVc9k59JT3*pN&q} z*N}p?2!AKJCopKqa>?Vz$O*UIM9&V!B#TkY zNXlXUm|=NSMG3|S3ND`XGhWKD#0~;8G@1%!(=-|2XbK#vfE~W9Gqm?;`-x}Bn1Gv% zLU~s+#|dx7q|>sVj0Ed#-85tykJ;#+8u$%*2ijStg-~=2vqK7Q8$)O@nP{j9K|Zg^ z6Ccc6h6n0grU!0adIt#B%yf9rp#9D#)6y0f;ta{~-H!1PIyBmA0_&5ZAzN<)B)UVA z2lov6V3uyfLzQk)5=r(P0{Ioi>0%|X!9aKCd>v)5O zl);RE`XnCBbjH&|dU;%B5X8kh`8f$RdrMQHfqJv!!viyAv)Ejo${69YJRs`y$*;)LuFR}Ce6}^>d7)o zoa^b|!wm7MV|G`R`G?wL`n z`bG^axH%L?8pf%>1`TC~fQQ5lw#ye`v#J!^o@SHKP^Fjn98$M`hFyoC$Bh+3HYvvP z(-Yej(3z8}mKXe1-#0%uA*vih(^ffmxx}e{Z-%tCQ(%OAw{p zPwLKAHsjz`AKk(ORj@toHDc#@Ew+ar&hFn2*M}ZBm_}#FHtIzE8MzqptjaY;+6Y%8 zutOe$nK|<0g6#A$yd^nk;obbkz-i1+xcX^(S6${sYwBqtgsG-E?xTm;mS#MA>5^?v zIZMsQIQb>7IEuu>7}gGk=c74&wQ1ID***o+FY7^OV)af$2+bUC+ZU@P*_-1@_sfZ}q2yj6xc`>Vg9!$d7t#H4Q1Wn?UO_+*!bfs1>et!Yi9GrPxeSj(( z;->o&s=G6)dqS$)adz5)v>eD3zgoJ1+#FtTXL0+r+T{p2rBQG66KRbSC4p5%tmDuc zcy0};h!ZU9l7%aMlJ^EriX$h%b;n3ab&Rm(64_(sF=mR|6FUKnI@5$LjYT_+E#Am5 zatjWk9`{g3stl^|Ly5sqla+s>S`5RZVx$ts#z_UPIZ2y5`6`K!=B}ix*or-gkdDAZ zmK~H1)Y^lLF_(p2G!vc(ba0sYad!M_Q;eJzh8XpfX$!V zFb455iotz|9l(8LP9Dog#SWrb(88s}85q=4BP`?kUs_SZWP+J%cH%t+p85s{_I7^6 zV-km;J`fdIIxs-vaL~A4crL1tHE^7LXO`B@W)1pAr zApHFYjpu?C*zzmu%Ok&614VMZDGJ;Z)Y2n+41izaKA)C?J0mo1> znHTy16w8Q0OW%S3{2`PblDamfOERyc*Q;B+WqG`iNgZS;J+Zka4(N+^v!|+a0DGVn z^$7BcL~A#4m+OG$QPNp$}lU@|U`0Ykeq6%~L-57Bpa*{U7(Ue z{=Q6sw_@VSemW8b)yibycMCP3towbYaWCS#tcS4h;d(&`a-42wZ|&G=GfN{%)d zlcehAML`CaC`?6Tg@rTK5QY}=yCUHZ|0Obc40aioV8Y65{+qpp0s^K9!1wSw9_E5! zb9XDZs|TK20W=;z-X<;Gwd*>wS7e>pXvuf!)q=d~zZ1T?JH;R^87FUGoo_@rUl1v8 zOi6EO(_?xHL46W$VC~tnfs>O##nF1F#u*VtqW%}yf`FE1@STe^3+2HpR3%fy=T7RE zv1#wx6Ay|)zZGGRR4#7rBwRk1*IDLQ$6+qPzc1atBRvUh@Zr+b?7)3z;9RoKgbcBn zqc3t6IO6Zr->tU+k9pr-4NxEW;X@Fq>CniX8)_f>R8_ z#ndPZ!{r<5@k2aLvs2GvIpq~Z%i_XSioH}M6(xmnE3LCI-1PHdJVD%E2~m#`V?qcp zA-Uixwdy`RtmWfjOcF%~>@;_%QqUNB{;}ilGA6SnHgJ=I&g@v@X*9|kN;zg9~JSYgBs^}dF>qg=1!e#N!$ip!aN6!`-Bw9Fpgr;*7ZPn2difP z^TW5#K|sg9HnHSOH=Edo`weU8Wy8O}_n#8|zoh_N`aZ)hz`tTG$p2rCCnz8zVQXyS zE@WrxY+~#Dzx8>Fs+Jm-3i7wCEm9)IJoE5kWHa+7Jo$nr9WvB_B|Y$#vSzuaTp|Rt zwCTC=A?42ynxBB4cexdW`jzARGT2Yx&u~lkwUa400fwXw^{k7Zm!DUj9ohR)o}Mp| zJ&G)}kovU{VjczgDEx5Zdh&2Rb?BTC`Y?@ygBG+2h?`-!k%Dz^xDklkh`roECB1gk z5pQqw0hM>nen6ldda}n3^`%Uh08M(S=^4zfwWUm`@KLMkn)OVzrOAzf)HHN;KfFyd z!I6lPljDqM?F3e=3C7I!*S6w7wME=x>Vt8O?44Et1xJ_R zoLHf`a$EhNmG))VV0>e~A{kAN5@~_Y=2ewTc|j(y>}#n2G9z)o(MNYv1nUNHEM|6* zWQ}F)j3Fq)!E@FHrV{8pBfoLA@J!(%a#NwbMtfU8i zU`{DNsM$4Vb)(h-Ps8IxzYHmj<^7m`>OXJ`%RD2X?v|aArP_rI7tzzuV{2b%U}?3a zi!wVc<&JZnER*wzeUhrOZoaH=RYKEF(t%?n5v*+UuZV0!H*Nb!q$8(iK{>J49j-)I zxWyDzF;7=i810CBrXRLHrmyGNIOd|Y2jWx_7$$8|MmLYoiCa`oZxaPkGBD8U7eZk@ zH4v5C6_X82IAe#4q{W)qWZOkhuZ2muX_hwms*5i}Q>CPw2(GBl5! z{|3d`w{bwpZ*(UGILEB?-ROf>FQ{Vm#-7tILIv8Fu12f&X=eIkY>(J#(<~L zgmpTIt=rE%Jhrg)Yu=gZ;%(@{9VotXawuY41@z!hq^iLgHMtT(FznDWkv(+$4zh$h zlp_;_G5ZrD0B;?c@XlT#R7nSj4x4B!3%5;rnNU5kZ!dyJ_<8mjTk@1aP+*U0b?+ke zA;s}(V=>7+%9obDi-rgokqtP@?WP8<^CpSb_1Sw>z_|jf=RBbBS67(2n=2gW&77<2 z^#M@cZo=PPmz{aJ18C;K;! zH?pA*B5y_h*8m;s(F#8ts+XbUrq`57`2`Q`)(n=!&Z_Ua5&^42s zde7k^<-Z$=$wdPlB|6ERbdSK`Kd^!zk5LX6{1BW4Oy3!Fc817!kK{Wh>kpJ-0eDl4 z0)U~1PHDxjbAEmO2ek0dP(Vs3Y5&q6tpf9(!JeG|h8CO*Y@F@vtexoo3tSL3a5j-Q zaQqqUNi1ROYG7?){LhpBOSd2=pp?DJ2phE2!kNZJ}=DYcn%ElN4lQq?9@wG;mnwdj0)*dZB|$E<)~T8vV{ zrGXi;Q6$|W80}mWB%#4fV1r~N*Jivbc|zUK1|gFOI*v2vp7@IvFJ58duiH3Tj52~L zmfSkkRa=_#qZrZGdS09ck`M~-2#K_~J4OCqqkx+|znVaLHfyVET;BEEZ!nZ7^1I%& zQJ`^a>`84Kd(!D)Q#|L%C{zBAT2OXSn_7!$0eL}Fyy2NI37PU8YEYe`| zc>~chIAsn2)ui+Z*prKK4I1PZkdNaDOS}++RRqZgk{}vrV>o)guyIRFrYclxpT+QP z`sP6*UmrtZ0|YlclU$9iG3_C=Ti6+e9ms*dF<$k{L+|in@vt#^$n0O zI7BmkLGb)90AFOoW&Vl$--K&S*D-F}(IbsJJ$@X&W`$~_J*d;k_aY_C6&6T<)L7a} zWVZTTfLMiQT=hUA*l=&qT!|66wwsN3C5oVpHhdV>;RJ7$?e)kvQYbMf1)U_$4G z=%5SmJ%-}#+*&XoE9cRmoj&mqwa$!*7nyh=DHN}y;=(qxK{CG~kB6*6hrf9F4rRv* zdCa6b%Gq?`gimWJNS1&?HQ4sH0h?2gQD%UFuOi z@}q;y?eG)pA7Geany8)a2L&I!R*;>LVt<-U+0L-x3kS(!A6Ih~|o3WlS5N}Z9=>@k?i@&ion zXgX-!#!nc;28N}3A|Tf|hb<3h@+DhXM4n4dy+b2sVCJ!AwBWiXT*W*t70RHV-SU;|{|E(so4h8_=1^0hU8vjqwQqaK3!brl_-o^R9PnUl= zmfDpYvKh*^Ohaem8Z<<3FhGDQMgE%gHgmH&_-_e+L}u>%?NPnep}+Cbz%cGu^%K zoio;7cRPIBfU_ZdL$d)*vC_~c;%dKfYQi-TX2NfTUkHC8XyBL?u>Z_~n;y2uMH{-V zX`6avys8C^Ntx@dTh zjb(H0DnF=3&y0`Vx6#-^aG(gidZ}UW!5V%xeBt%|eb5k#XBqCE%3Oz1 zbe472=YrGAgtaPb7MIs>1;}LtL(ysLxtg(Ny=zs5#cq;aVlYWW(S+N!G?`YTA+H>uRd`s#4mJYi1G{ z1mXt6QVGMNjQXbt7iKQnrKV0t?ZJ>fD;J)>$rnZiiWF*M442CY?48+KHaaGay6`AC zR6dVuylhD-m*_aSu)$HO#A)Ec+Jlx{s6Tqj(~X*0e_1wT+qmaOccE2@@`GXF9_0(h zQT8VI#MG>M{4>?4^s4Xf1NXa3xgf@Z{<7E`-CgKRn57B>_Rr!O(Q%ceFvC9l0olmg zwVvj%#!A+uQ)34I;F}>du%}7B3_|OX<+8b_E)oKU-s3<$qql;oQgHEmPb>jU^JJoW zv<UnFH3g2adzx4)e z7sb@KyT~;~;$gz{b#SC{Gz@~EyfL&uaS<=nxNLP&L$(N8t48{CPv-9K<@>&)^(8W; zqgm4>8XJVZ#@2H1Zqy5K`?e#IRP)0N8oaXV4t~p$Yf3FFYXs#V;-hge+Wm6SAIN+Q zvk&-gF#(nCcKM-4;o^UuVVw7sKz(E34sV@6YxdAUOBf0d(m;Jfk^}S(gkY@HT;=|N z!F-5P`$j1M^$unST%VRza;@xw8)bZXsgYC?GP^$8BY{_VeEeYW0Sw z%!S~)`J-I-r;fHh^MMh|N{v2}IySxMCemB|ccUXGr^AFK$kyXJc({(eu|qEHV?wD&v>hGca4MX)Pb+TTWaIYgUV z@w@4LZ6v~#anNN3ru02=rf(E*8sy2L!uf>(w9uOF6QI{jl~v!otW>~#nOIXOjEvjOMnQBCxlcz#aR0v!E&e-XX&K^c zU^;f>axxYdkx~`Je^*C#@NqsOkdNRHVM*Os92fWp3pdmDn7nbJGAzPflJR;DQyVAC(<(HSbs_L{Aiak@Aae*vq$sg@b7cGmB~jg{!Wn zO{&^sCgw1WaIJV{eS_sUXq1oSeG>m#iHRuW4tDSrn&MvA6|kb3@Y?T#k zhQP1OPkFL6?u)8!40&p)+kjnoDXYxI=$i74b&+MXPyO*a!v?1RI7b{WAv8=adHW9jV5yB_@CRkE5 zO)1IaeOM`GSP2H3V8FzZ>?Ex+2^5O#Gi8QzW!o4?VSQ|H9dzUR5<2A?dL`sSP_4eW zn|8CAOK@=@i;%;5!r*>9%HV3fyO%^HO{^iHTV1eD^vDqyg}WF^temUFk$Wf!vpzJ_ z=ubD|)C*zgsnV2Q&EOvf;Td+(HYh34sOAUS<@upa48#DEwDDxYs0KQ zyb;wu`e0|VMg(!02rRr4b3z12MTZOK>)P`lj3F=XWX=V1N;8Mx0D8c*|R!^ zgCh{#0N#ZF9Zju334Vn-qiGjp&fG3?nj^CJ8q1|^tUHBpTz=|9YHcTCO|uV!ccE6z zP5ZQfiZ~Lq49q*vXk(*j?S2x)CWktaisWIcB1gcAA#Guh4#fxw-kW1A!B(0ls6=AP z{TCt#D<~q13aU#)EaqK|s0FU51)&(Sd0L02yz`wR2?HVGnA9zX%}&E%RN1x3_Oau& zrGfWO#B~63>0S3^UptCDZc=yCDvM2y(jB(>HZO)4Cm+`$OE&UJ9w~b}M7Gz3xfiP5 z@{7xyh(vruF_xmlDKcHJz#YCR(rbS3M=_}4$jHRW>7S>9E~cjck3>na+L{{H z3dZ-;QY1R6ff2nFH?wZAaeV7K1G-@VK>`glpkUw@u;{!vv^Z0Rsj<-dx~yjFS?XV@ zjy8*|Wu1AjJSF_nX^HK(*`Z_$sd9luxjK8h~1KKuvL z;JWEJ7~jK}gy;U7LFm4yUtxTcdLnQTd#>%;PyKiOu)k4A_-t?9N%>emSNET-K3=o| zXkNI{z5?M|z1wj3+5Q6C!`Hswiu&K^LGMbnVfCfmqQLf0EG9iMvOTHzddJ}DJs)8C zdM||8z24YB$T-!Xl>auapprJ3!DRl^Cp57|@lsCm#P=C&<^KpOTfMlcuTpGlW_L z-&3uPf*S7lYGjyvpq6GB@luQ;i%%+!$o*=;Qz~IDQ&q{fSY|8A!A(h!o~IVmlo3~~ zm}#Pt?rA9VGV~Ro6@iMkX~}V7lsLnTq^+hg2*binRI&0kI9$ zk-u?Z%>1xp3r#CwFPCY7Xd!hP>e`$vXE`jwGTwbAo=(BiT7>EX%k@)MpN2SV08VSk zNSxJJz{<;6m$m@WVuNv9x2Zi#4F-z2Ro+TE2+cay zF_M_1t)TECWF0)(7uDS0?rLSVr6sysZP2eQkHKih&qf{oqJ4x(sVXZ!i=fHcxC^e4 zyLkZukzBJTHL_p@q-d;Dftg9FvY!x{qCC2!i~~|_&upJ&Pa&8Datr}2kNdz*qmQZL zmrv#9xF;p^k_`FPn^gtVz01B2JKT6?yyP@hkS70d(NGl&p($_T1;ckb=~NJ66f>*B_@ceS z%O#u9S3%)9Hdy^nOS5-BX%^&6gQ7f*)?9Rxp=mNGpV0o{7mAdqWOMUFW6QZURU6%b+e>$FKqk}xDoM#4Fw9-}{vaN4^cNly;ocu4 ziKs^1sw;+Q?OrkOmqOtU*o4`nscVUP_gq_b(TI`1@Y>ti3p=_gqNCzc=#W?aujmsN z)pMXB9CQy zx`T}`hz6o3lJ+JpycvS`9eQlnFPLpK7F(P27Y!A*_BX2flau^kaLMaKH<3RR8!1Yq z+Ofyq&6QNc!}5x{5My~Y(D?J|9`Sw1fKCO_5zc=f05d=%aBG8!LGUVoDo2ThK;%{qCbb>s2i%e~cy!o2Am42ayB1p7Yuy9^8l zg4e+|)%%>9g3Zo!AQ*r-WIpOAKN60M$5O27%Mpyi8brb1i{2STo-!X9|4KskiS^~v z89?qPmy{-&_QRdKU~~{~6TAj&n-Cv35*i4@m=MiK9HN9L#;a+8U!XqDPIgh6=n7tQ zjuGL-F4fogrp(c~HvG+tm zt-m{6KTJ)aR<630fKImSE;7yc0&{Ch3@#`>t}uKr(C*8w@W1@SJxCJpGZE}00a~tI z-XV;A2Un2S{Ow)}*+@WF6U+IZ=xv{Gd6uG@6xwwV?rX%xt`g|-?65kqfOHvcqBvrB z;LHb{-RzG{#s!9vgPZxL2!3>N-vTl|{zw{!$>tjyj+4> z*m_wtdLhdgd&fri^7sEy5MJ7Ix%?eV=DmV3ze}eywrrd~>rW-V|fl z5__PGE8r{?yJ%Tr@Pt!vcAo2kRZ&yIqFGANbRSfPpg+faqSRc2tS%uANgF^&9ib@M z!`2!EpPcoaARKf?IL0`yBU&uBU|=eAzVr8RGPYtF7er#YRg_^goTv$}==_Rcwa7v2 zSI|({XW^D}gQEc7qp`I7>OIkViRJRYo{Mq){!d`xA2t-xONM{k4`ey|gIf{)J8$?G zuwZ0kY;9p{LMLbMY++~n--tp;!i+5@1N;b|kUr1@Tv3tDdQmVgymp6T4Uft%Vq!^3 zK}T>hvkZALU92n5!o%d}iF~-(Fv^_bV&XYT9*>VKyB-WL->;5uz+G?|I6Q7ci{r0|sN@Vk)G{B25zez@7M+gd2-jcmV>8zHbv9@gf|j6H z(;m54_BHUNv9`dj8#xxKCM3!wr4+;m`zm|*CU>S&cW#qMioelU>6=7Gu*s$-LlRwBqLSJyFL|1&WX2Io2H2jM3jn`J+ggj`cByV~@Kcg9w!Vm}G8 z{o>4w;e7>xZJZ`;%uF^q5x4f*YnQ!AOMbP3_YkTRVA|4V6-2DE5Z(M9nvJLT28A+a zehjuJO(pb|cMV@=iycc>L%z$x!YIS$w}{wPrQIQ|o7GBE7xHT-(tC20s_qjxSzb5D zNg17c@SY|87qsr~5hk>13F>%kxXOkJZ zhMBLHVN^R}YOa=DwA9pFn=e#5(0)Gm_dKuK+8SdHgCP6s((Bx7@9%rQ+Uv=<6<+T% zM1-ZgBwS8eJBkOal&>uz*f%)1PqNQ6!SCwX4P3=jniOBEYd7OB9gNRuAzPtKo|G@K z?d!^ifG)n|(e#NT#>z|iwFn5;^6b(EEfWzFl_T#I9!4G!6S_r*fC(j)+>#q-xD?0y zq!Og@vC=zexS2!3l&GU;>JYO^Zm_I-?G!2DVeXU@FLyvX<+ba40^OoJ!;m!hvRJ7j zw+!x7%C0{`kJ$3<+Ix^8R6I?&K(8;z53`&#if!vcS#2YOlWQk?DB6{GDh&nlskO-& z8h19S6P3y}_cu#jnmyWu_T6FY?m7G#ba7TDo`o9HSio-no$v zKXK1b+67Mm=RAU9WpFxs!SP|Z4%6qF( zBI*n>Gi6I#Mkp&0SA-<~NKduaH_*>|lY2X<3m+|D`dsIRduL|8hLr#2LHWzMiHJ+@ zHYMLqh9H5l@HfC-Fsc~&FDRi<5kcZ?hvMx}yw3C*js(4o9F+tsE(Ww%2CAvSL;!uo zuw@4O(4lw@{NNQ~{%W6o1y9QCz^9ckKw`~wKkiRG*^Y6fITTi!As$&{QphG|w4*6N znHV>z_$@P6lQ>YY6#f!kX3!=Mdqwl0-ba%Vwsi=sDg6)YFw%f6@$#f{s*J5?9(4Fm z8blr`GMsvl5Ma&Xx+R#$+wQEmWfMfvd1s;#_)ePQ90pd0&^7X&e!R}Q#k{&uNYZ3$ zb$>VRvTo80+yqJr!YRO<1!%=5r{=9c);F$kB%x9Ok*!!IM6M)^DQLD@n4iDTa#`PovGx;0oy#|NNS=wc}rhQ4|XV{y*DsudKI zpsmE)&voF)E$#&7hFDspCxR*?Ilvwgd!$MkU3hurRLZgiD-XY!lPnaw04e{^>2iUl zWFw-7nc$=f4?MdEJr`u4&d=yqWEAT_N{KGTJ?S3FatkTuqATUZARQe|#`0OW-DhIQ zs%o>usTKl7uQ~(D+{A|d7oAyikFHSc7-p$wik41Mh9@*kPle>T|G2o_*FU7oM_P)TX?s zKwYWAbTx*(nVf9&JV*FTf^!a&!6WHG60Wd$G@>wr#m++uVZyFO92{u}GZ9%SdUdU) zv-=rp2g;wK$B+VrYBubx^i!NmvBrjMzfAfGM+=>>Pl#?M(Sn4m0shP{JjmI>Ziz*3efmWvHq?`}@Hc2j2i4uQ_ozm^=;?mdnG&rZl z$qk0DBLpyT}k0q%&3b#+LtPX>@8qnkCF zdjxcNCtC7x($qJ{)rp==j@fnm+!mPTdLybEqHW$bcwJpl6@71z!xmC3qJ zTVYtkcFu=;n(Um*8vOy=#% z{i@6v2q5TBViw6OKCzEvtBdsm(%I(Ip-#D*MY5izB} z@lFad;G_G+yh8`K`-SSWF$w25B(+n#()EGii34pD3n$w72*3&p`-QCO$c-Qxec|l! zN+5C9(3CybZsT|cJwUK*T09m(!9iT<1aHTTx|&`nfU(o{fX+i}>a#pqO5B5b%@?oT zcHg6Je7n%9SVzpA;>pB?l31-V~zdMp;+y2;s#P&M|=i%<;q_-^p%>}68`)Qw9be=HS)pgDc6V{!bh!D+Ou)zyoKC7+$VxAS&srJ zE*}cu>Ol7^@gWE~FUjx*Se36RH>vY=Qr9WZIaUGkrd~apDjE zbYXaAWE@a7qQtsfzWz=d*{Vy%G6-ol8Wet$j-6C!c;u0%?I3cY>sg8QBx7;)Jv?hy z6-7<3gBHZ)jxsK$nd*tJ5g`JuB&3?7)d+t8bkPHmJF-Y-`Tkw$PL5B+i^3TV=Lw{> z`4U__C2hbs4+3D$g21Z5PsbzA>8(r~mZ78R`*ch-43--+_GVLMdAY-A|I=)bs6!Nq zmF_PgLLM?6o;^l3rWLew@5SF*;^1eJrZSH02qy(Ar@kH1`bS;-Q&7^rCIhLj3c}Uf zxn$Z2N9M7u>Fl?TD(LC#C#>hBknV4iM!;&i-v*y{vet(gVP;#lXnz0*a)VjnVcaaR zj?#PIzJEp(NGDK~y_LsrBCdOqMt}{O_$mrL!xDKIbFXGFH&(C%m>nu=A&>F!;V77I zaY1`UITk}3&H~M$ZXyqM-?8ZfZn>+>7i;ul;_nFV*H0ytqR|u(aLV4zXg6_eBHVPr z^jhACo)mUPBJ9^1?EXe_?|2*s@PU@ACE#yez;QoW7(J79x{Vtv_Ty5xr9_ENEF3(+ zCRk~u45he+rokj}8zrZ}Au4*i3mXqQqi}~watnqOHa|a;&bMd}E-|y9%*H1!%i%mP z<`-+iE>oRVt|%t#fc&m0@T@58Zpwt6XX)!6FvW5VUgZL=z&}cDCB*fGGt~FKGT!zdNT)X+v>joKUHe;GiO|ZsacV$nV`xQpL6{TV_jxu4%ZW*>f8Tm zPR^XKTZrwn3oU5o^}*te*c}b7%j&+*S+S%??gF`^^o^&&^|a?@@tbJ<_$a!CI{y_f zBmqP%x&`<5IS3H~y(9P>sz}r0;9vFv8-O+>j5$}kSo2OeYxKD%s8hw;D;eu{cw0U9 zb7qh$`w!4;k)C06FPQ^A<*0-##yzJ5`DlgaEDXpt3DkimqiM!w` zLBjb)!MX*%B}}QN`kcUpal{6;B`*ZVP`xbxeXhv4*$C?1;2|A?C*i@nkR;xyw}kXW z{Jn9SVrM^RUGZW9|FE434I~xD|&iPb%6A_Ag>jO(bOHCA*CG7wZ)z*h?RSU;S+hD|{I@)1wLW|R7;B~!%cnK_+BK)XE#h4JK<;XBi` z>$^&VT7_Ng0??v6>Tw0tWDv}%i&1^U7-VYdaj2I5s-`^W*Eox^He22FbL9i=aE;dU z7#VU!Xo!Kbnqg|)AFfi;1zp+v`9O8wt}iGaL#3f&DjXJmK$+Zm&a|#ZFP6bcRTDG6 z7b~>n6l4N|Jy9TljEGZ-qRfk_KtWZZVl40226&=IoCA1*0WN^L*3Xa9Rn^MAppu`! z;#|%v4xIRngwt^Qv1&KHz>HH;JFeP!V$ka#9aU`MfY9EauAB>^-DrU;6nK)DCsmes za>1@fh`xn??Xjo#ZQchwLg-A z{$TjFM`DL<3Vcmdzq_fArnW`l|^(7369vcdn)#`iZ7k zgS>(S+dn3yDSgrcLTy$RR@3!(aC#?<1lGO8Khz*1DRuQt0^Ajo7qWl)*0&(OaKRd$ z$a$`*1_X-OvqV|9C^a>5SHw~V4g0m1G+a#qcSWNfK*4=^mKQ|F0XZ`GHSH`b9(5^A zdI@VvRbHM!(nfIg$)JO`GSi_Ou@2T7?#CN}fBT+%+L9PP<^5-l&^6Vo5L;l!L}=kZ3>RxJS6 zaIEout=*97@GAJF{q9UH@}X+ZvB%YIxRGxF{QGz+l!vefobD#NLcVz;8&cRRzvzVE zNtcI6+h`zO_oay>fc8=R)G*r^>~|zkkZUCfUz=Tqa%#pn?oIp>KeXa)`p=D7aPKC` zju+6uH^};)=5xiINsTnMWVJ(1vBrwXJIjkLsFOCj`I?*1B#*kcG^o7B=xnNwTiP}! zHV+RtS$MB<$m_}%e-nKS#S<@pzo8mYE2y{O_v1B$VDm$tpGJ+)1D$-r`#mV3Lw_NBlB7oVWA!EQQ{onX*6s3xP4lxw z&&GJJu&3uB2(^6aTBC0C4){67LkV8Toz=<^UL3xVG=PU>c^l}R(7TveaTzQei{#-h z$wB!E`B|N}0dWpt6whO2Qu%BR7FB1trA8jB^zie%+!9BoA-UylL#3cqiO+NK?L>%k zMu>Mn4WHX0S9n>A6e!0LM#P3ZxN#cj1`o?2aKYwuc<;lRGn^)he|teqUy){$XxN*U z>>aB8lGy>777Z#p1e5sM?+V5%5b>S}HH`={4G1w+Wz7`%8B(iZ&dW^10?V9Wx|5&! z)9)`+j9m;1v#`gc%!C`OP&h=#R-lM!EmiF6=4W#GD5>G)d%5%*8}6+dJT|5^tgYU) zkCP0W;a3|%K>8X!ZfHo{ZwOw=##icwCx+zG(ei*91tdNJtrrQZ@Oydh-cmGQ6pc?% z>eMKSK2D_}8#74Y`t2|KpqD+&2qWBHN&N-3GdyY9?LftHs}(H)YZ3d#RpnFuGr1;v zDr*VXrXE43e&KU!@C?{a&}ZPIo|co3)ft8>6iVB_H#i~9qtI4Z`gSGFGYimPlr;W% zpC7+c?pMw%eG^!3z*&BBom(kYu55v3a>{RT9!K6!vNtpJ3o(*+kW1IVVT#nPl?A#- zApcdKJZ-#0y?j4~Q#JZ-b(|z*C40$58@Jsu^702O-AXsX5>}q?rEidb1781d?)Z&( zJneq)%dP(tzx>~n%OB3&|3$6zN!XGd;D-;Hxl?uH-m z>4&uX&0?dVH%Wy^=M8{2!LCG!2;4cIv9`su^QR*! zU@U{VSPKO_6*lWvKGelFy!djF#U|_<&7kdRHEvFkm8#Y?i;LFXHXn4m&KbD%vh?6m zHrUkMdyUB>cD1js)9X5GuC_%6N`Q6wQyJfdrW_lW=2mm@TDd*j9{tNqia%$e{(jM1 zb2S=nf1&VJ9*s-p8RA&laq8&#a-S`hTH=LLQWBn%1U4k9IwCbiYBc|CFB%lGZ`Kx! zwAxe5Er~0930|Kbc;H@pzYxuL^etNB}?h^Yn2tS1z@BmFD4;7%tmPe5L^pSLySQr+yQkA ziX#&%lhx2Hvq~|-q?4#IYFzrGrQ`p_?C)lkPOSXFCGUS0^}q4S|81`Su}u9hj$}+U z1LTk4M83_LF@Z{&8^Kd)J%h+0DFQ>tR*9{o)!hg>Bh4Cb0B|KY^{w{2kNv*ryH?(B zf$Kz12cHq(0}FdvLRME4;Y}rMttX*6B^v%FRw! zP&1L4z6@K^z`TQms{z9gC{xVYlCX)Q3oaUD999^Hbs>b141LcQv>QF%R#FL>-qjw7tQ7%t}ea{fof7@%q^o2FNK|o0!>2RJ`iaJ zIfAZ+LX43|g>L3ea8S(OBwwCP^(%7Q@_ae}2)s;WrMXLH)Vj60r7!xgX3z5W0`CUQ z!p0J3&y{(R?04lD#26kcWwGH|x4$yAP0IL_&fXQQ0*B7ltQ%x#-{q**%Mh$g>7dL) z#-+`}ys6a+BKoY&3Z)C|d1|Z8GL9z^nCKBtz*2ON9d2f(QHRXb4bO(naYJhz?y?rl zLV0HHRBV3rVI~;r39ZKbrN>6|CriK~3Qp7-rOJDr^;=7u0h`XkwfiCRxV_*wTXvoM zk+x0$751SWwo8mBS+we?mAV!y+_+f#7%k=Bn{M%P_mCAvaWfe`Xd!eJ zh7p2s1MI?IpJ-%7gSPB6X_#@Q4JRdZE6>%TaxzJ3Y@gTWf$yoE=T)>Vlht%{M>s`% z_#L_XuK)w}@JR%*Ot7*ypz(@=*hpzruH2B! zaryW{x7LVZJ;5taaN^Ad9FD(^&~N>Ti~Juzg=0XA=7K z@|4u_*NFIHi3PJvP%k3ubMX=pn}8=O7 zI|tqpZ49H&MQE^pI_vvVl7ZYm*JDK3cwHS6zBk?Z8NVGkXbi`rOsec}!gRR@D$wF? zg@?$XdmcVtF6T9^d7HcHhWhrQtCd1^SxvUI6PhChUrzPelQMH;W~i&DM(3T7QL=J< z>62tPD5dC~r$=$CWk{8joUB?B`X^^90-$R)Drz#_(6RT%AcN>lj8Q_LiYlm}QU*E{ zH4|4@IB&^fqN}RMNK!7I^7VODCZX99I}Al9+s!p-(?j!93Q?4n3X(Dt*0LEPhZ7ZP zsn#@9lu%(**iz;hGsw_~pfQdR0XYUEgo87YTO5ZI&RHdCN@X}2Iq1-?oVyRPRu&uu zBvK65U^og-OHzugiMUIAmtXtEW$=@q0=vo=Nm{)R5C})j+J_o6bnz1`%FDHDs?w2D z)hc#JT?w*x6~1Vija7}S0UN51b)ZhB7vr^POQ#YmPB1#oh}#M5#ua3i@8`}L>UV#e zo+-|Y7AM!A8=rb{xeQ_thfTKa53+;r&qG*iFC=$W4NLy0kep_$O_Pf#u{ek39&aY0 zs7&7NccPIGDYqh*#{!Or$=zb;EuWGSZ_$%zEJV{KU)I6p4Nmk$!F#xu7ktA#=|5d;!2#>43C;I76-OBqZOkE?97F~{R1LPLd2B80{!nJQjjNsb^V zJPHU*hrv0B3FlJDiInkL>n9mp`bm>d#cNYjdZzAazD#9#-80$377TXkd>AQ8jRBVXcj+0pJo+xWCC$smVtfDIXQqgr{3nxGso{% z?V&PDhGd+2uU3NeO|{Ml8v7-~kHP@7t(N*wj%q2!&p>q~_A60zLP)p9OlOUvHt3c9s`A z(KUDQZ1v|9aJBf&!$r4?-1amu@49EbMuumF_CzsYU;^Ra`>D1^`UfEY>45VHy}kjo z3{kM;*L&5>ApP3gsr68WtbJ=sr1B*B$fagavE*jcb6D)Gqf-3KIV3pX%5!e{#|D@Q+ETHB^ zci>k`9#;3dl{$`#y3Xn5Yx&%@HB9w(ZQ;S>uG>x*x9I^R1ElnAEr$z_l=P<1F9+&* zO<}~1^ieqRrL7rU2Q?FmICSWoO}X#BJ`};iwAG$G2Eii)+=(|7l$T4Bg*u)pELJ#M ztvcK<`!xU}R)6s;7oKhU`AR_-r@Qic zVl;_vG4?#(0j^%wqp`&!biqFp{qz_*!x_^aqR|7{2gMTXKbW*lH`fd zA*B?(RPE~%=_RP4RA6r>8+urLjPKUonWM=!2<%CwWlz{Yin(>k_r ziV3`D8M7%5y!AWS%Tdc|-N&N?0)g~2u;%CcC_JZH4HlR!fPd7d`g3FpUO3$G3H9%A z)y`OlpevNJX@QvFxjn4|XUhP8z9HImBG z!X2A7Bx{YmpG*>&t>!%?)4P`GAWB4*Kb!h11VHCER7i48 z>R*_J)JsWS0iYVj}dLgB$0(2x#M3u4ku#FO)~Db9Q0fI%hamYFg|3aC#H%>3rtB)8H)APcRDQVksT+-w{aW?IILvW>*5*I@%o3Vz&1_><8-t4c-JA ztWp6dD3jxx>a1pZ6|1)Wxde1QER2-c4j&-cFr(M-6-7!bo?k4)ts|TSme6$dwAd(T z&>k+5u9k1+=aT)p$Tkw?-g8vie>i3o>)WmMBs)`mM27kvg2=d!truNsNQ8eWmhJVK z##@>P+dI@5qvA|LTSuX4Hwr`9wD(bK|H+Ix=T_%O|MIkC;jSYQ{OOdKkG$)rVMLqs zKok@ zOAh8k8h)hLIurec!#DrH2B>$43v_$f1*mtx3lp>zzR=y*kEiQq)2{y=fQXZq`6eOw zgJGNTCPF+<^4`kAH)sa>L$zpU?-}$9U;itd595XDYkjMR{FkZ&Q*WqpH$Zhf1Wa=gTGdo$R7Q-^klfbMW)_5#`#=oJ$bsQ7NJA*Fra-rHhDP1`t@HuKK={$CVHV%w^hE{ix8)t0Rji-))iCu;I%TSP z1ahb~Z;5e_&G9$m#O%T4=L_AVmxVpEaWTo^jEYRZ@x3&xE-kfnS+G=;N|QN=v}-aB zMsZ^om1_$l_;z!JQ4*lDN~p6=Pi0QcK;bTX0*?2@2?e{l6HH75rJv{6?QCd53?r_pIyw#w^^l*#sd@9EpREaw{Kv$m`lPl` z0=k|cAKp#3d&uiErPC$m{T>VM{>9-5jPVP;l(k%8h!@rkOt!p2Zl%cD;3^}f+_NH? zRC$0atbt@sA3T#wreZMbGXq>6v6onzQ>X`O@n_E1?Spf6QL!qsEAGPWqTd{T@)Tq5 zz`-ln((uul=Y%JU33p)+rTEAz<(o-U=kg9tz2$taCZGK9He2OOH~Lz#;r zcO~OV*7twpApiWZl@u=vpCbVPxcnd}r2n5kY!0k5c$frltQH zJ0d0W3*tjW7Z|7W4+trEAmL+X0*CMeh@=xI(Q{_>XGDPWYVN2gRPF;+F0-xg10@54 z2y9eWUfH^7U1?fXYi@0+UOcr|ZxlCt-*0ib*^)AyMtVPY?(pn@ZM!kHZw}kdK66i=E&VBK&ZLD3VX;V z?h#|iJ}EHBEw{_k{|e+23H=TI$h&UakVRR$;Jw)wbH}L@it#h=)wI#rHFCQ2%^Xo} zY|=WPPsX%#(mu3nI>Df3`o4>MN9<951j;>sI;yKnotFjT2oWQ7qE0&06l40~R%4Tp zc+%u0vd%h1BP(vhBV^jl>lJ&>q&Q9O)tncM+xW}v&m@knu1z=Y;00#>#Y1{+L!GMs z@_3!@iBq?CZk(!p-z1i|H?Q5p9jQlX*JiO(tF%`aHfl>Zg!} zVoY1O$FPhEnF(|9@hUiFk%V-hssT`|2#)$l6cx}4`ov3VVMTxa{YUAZ8k=(a z1%5j_c7vcH|9N9NDDeg^1W6Y=*#(OeR)hNH;=)3gwGopmDJ|4irWlMK50L_~D;jIP zt@Vz23!PEMKO3mETW#yv_m2G35u=Ia^3=_w$TQ36TI67Q`6mk)dAckjElF#I;}QwE7z&*7RtOItLgeV>xO?AI=T@y*wSK@D!6RU3ir^9{SnQQ?B=Aw^N=`IaD5!j`#3 zAyY&wMs9DLafbjPj$!L4Qo+WDEN;*%N=j})k2pMxDnRb$n*cS=EY*DVdZ`M|n)b0& zstql&3AM6yTv7)l&D+(>SDzu2Oo4 zc?@<{IuIMPsSJBsO0UA~uy}_cW22qxO$~6eWh$DwUg=)7nvyiZy597zSOD$Vg}q-X zS|h4@8K_C+6oCnmWukMB>>?Fi{t|^eof?;%U5j7`WkQwt0b%+ueRulUQI0VTiVRUt zl}L&D!L0Tu*$loi$aBy;stOV->ic8U~tn_S1ug{$?+B=iUt6 z1_V3JzWfQlYl1pUUp5!fMhtA#3M?~)k&|PnnWFCRcbOPYz5LZMuJfx9n(kXR=@2ym z*Lla0$PmdTZ-~9u^a4Q))os_ZAZ%63P&a$@G$!`o==v@%4{=~Z;k`= zvwQbIKHsTLkjFfgwJwb_X4#*1SlyuO!w&d$saJ&VtZSAZSUa|}t!I2t0uo9^qL!R3 z;zfJi%IFmA817cQt}@iHCl4Gsj#k!Alv7jp*r%sWRUCU)bB|D?)L zh4~rZu>Cm7d8_X8W|?(Frtehhf9H9*;rF$<@%x+87X*Y33OiMTA`;Hs z!+Ms;LBjP3NB*`nLW2+GO9^C}lR~z;Vm=~e5vrWgY!q^)niMP`$~!jc5>9-@m#3sk zaR{f^zJ;EbF{FUiU7(TwV6q8z6STWQ@lrZTLs`riHJo!3`OTLi=rV9kI`C~lqKCd} zB+Wub3Y7VeWWbs(i^8kw1EbnZ=v{j`9^c@( zhI<(MKJ0M>mAYmv(qX&B(H2GwP^!4%n~a_80k1@@!zoKY$Zmv?UHsn51IW@sW zmbOYp`k1ygACttZoXXj-lYlu9i$^t$)A4&`&yavMa*YBdA;gp=4~+ub88HqPOX=KQrcI8kerqzMt;<70hF1A6jPVy9HHGXLsRCag;_!A{w^bAkbIzT%^~SXT zrf%2c&C^Rndl)w<)s5mYhcOJ8ZH8O3!O6a>Z7VZ4pK4sXTNX-dq6uR*g0ms|t$7oh zw!sBFiIQHm)LEH04|Y=*leEyJt%%W7b-f>&#~)xYiPDy%J0QQjS5bt12 zqsjXP+@FZ;dqD(~x;WFD10Rtyp$`AYj=5|?W#rFy@3*vF*qtYMQix`~k2F-r!lOG^LOuXJpW zc-duyx$?Vt5!!*WI}uy~`|x4>H8=x@OgXqwVyrC$2L$!tTfJ(Bd{N#!S!=STS<1>H z#!QK={7Z1RbWByIa?S;Te8fO6l5+RCF7lq)Y^j~%*F`1oleu>w$dAzr-C30)XqGzi zCl-))fR}Vx*sU8NNilAb`jV)*NeC}JPy?))R=j3BlLWWpySDrxa8Cw+f}tilw#!vv zKTQF|_8GOYaKQwQFaRw&C;ajn80b|~L>N`1(*i%u>wAx2yXK2q=6q>gw2ZH&!+03K zvXqPrpeO&_8_5DQ(v`H*Eos{##((k%YUy~5cH~vE)Qt(JRS~ZRIKyQBV8eHh3gnuM z!R(~0`GILAQNQT@)8=Ub0%AGXm)$x3EoY5&2gdWdkVR|kr{-$D)eyrhH3YKn`QseS zld5^MFyeefoa&rNX7DQCne?n4@0x~ybW%vnMBlLrE_9eeXb@{@MWce6l=otQr}E{# zb9&)tE4PP^JCW`FirY9EKUj{)6SBfs%i_XeiKS7RWuJLn(1uplhL(@NCeJ>NZdV8< znt+z?1~Fvg!Hp+v{yQS`7SuxDAtz*L=?<8#-C8BH)^(+jo%R6C6RH{i#ZS7XJ=nf; zFF1!D$W|<;yNMV0F{CHeTaik`?}BdOr38I}W!fLS^dYP{>4j`0a6JCxx13|=A zVQSEg@rakHZCuBVR~af3%WmQLerIwzKX<@i2x?M^coVOFD$DcjsnGl`2rz2WfJrKy zt-+JAh%jHRh#!cr=LgDo9XP=h@R%DUmoilXt7o99hq#b%;N16%mjWs66C%wpXu`4g z=%7>2otlwpfMJAdwIWAE36attBuOZ6EDz-4q!a43*5pp$Z`c7#2D@~ltM?Ig`Wu0~ zAoTOEPWkS-^v*~l)(pGWbb0*JF~<3=jQzvGVK=QpE;&wFpMU0fkwekYFqppQASsoc}4JcxJR}fn7C$A}-Y~ z1_LTpN{?OSv9KXU$LUFdzHr?|_qVQ`Nx6f~&BGjmOf^EdkRv1ZimKg_BPUTT^sIuq zt&U3xEIrK?2eI!sU}5I#3mY-e8wSI8g_7v_6#rdkS!}uw*bA0h2%caKCM$CN&7>qg zimViNW-%+nA60rwvpC#n&5+t5g$u#4;~|5W{Td6Nm1LI1e8RIHf#3t{u z;$~CI9NHSvW^1k7O$;!d0P7KAxnSoJ((zbe>S&R-9W^>6Lwka*cmO&;$5QgW#jHrx1LnHLEygCGVUIu-$Dl&Qb(3kC)NHNW$lErc$mQbF=Ll{ z1)=5bzkaE2q|J&tYc9#Q@tr||R*^olE(iVDq)7AUo=fXNYsYon_DZ&r5nj4sP*$_t z^yluPVSEJx0@BwV`2$@yL%xfnPYVFQUI*Za$brXFUxs2)vPI#Ls2p2@FT74n5qoZ& zOkGqpQxNr?oVu%8LI;DyF)xO8lI9`C`DRG1Zbj3hK^1XHiWZlA1o4t3&pr(GEqU^) z*uxt-`j7S4^9n@g6W+mxgbuq4QUf#C7eQYm7|$X%xJ>eQz{8$Yxpc05hfJN|p*@^p zia|TV0jSPrHNjFTGIT{el1TV~dS4weX}6`}Qt<)iOw?o2g;jbn{|t2+#qtXD(%gcP z)aIgJh!WAfRH|OgIXmiA9`xy^}rm`IQG8FV#=gX3+ zRkLYdrpWqiEEbdI%yo9E$_Rh4V|>_7u&fY8&`!VcJC4TPhWga?stxF@W+`S(%A!9K zZh5P^Roa2UDjhU$enxgtPVuv-K@&LGQ=eFa5ATnCp9L zQ7cHl|gHjdG*%z>HbJ2PDT{oqB&Bk20P8;%DKGFV5n2S!j`sJY=RM zMJ659`So0{1zs;3SQFC($muPAW?E!(e>T)JS^FMS%lUCxqwoYMFK)i6OW?=aG=m)d zENX=LQ_vaEcqEvYN~Z?AWH14qzZfU#(C59i#w!exTf~c+qGXNWq%q(;sX2+{$_%?D zmbUq4&>Dp9VbAJZ%HHmn6L&M4V|oUDY0vQ@tU-jssA zxL#rKCtt0ZgI!5i3ht{Rifc+Z?YnY*o!@Rsd=}kAojL-0W=&C;7cdI9P|!Klo#3AwGrfq==NC2Ysw@g#YTybq`v{{bB%xqt>iGTgk|N5GnGr!}n&(t5a2HIm!Lv?m zff*08>Ry(JYIfk2`%~cBWS~=J?_PY4;6A+pqHrXtDorp+|CIT1XqlE%sf0FUTSElr zU(<-!-YAvqMsKav-(&+5TEq@T7K=^K(qJIcTJ2S$pIl|o*W1SVXDtib#o=-Ndo$#+ zMh&r6Pad#3_xncZ>Gl;hBxH*=?4skmQM9guVs)Wi^+bT11YtE@4d0H2d!!3($>o^p z`FOVM%Wvut3#Ar`+Nrj+-F^Hl-?c2q(YCh1kAw&L2?z<1v^QczzUKzNUyBZ*1P&y5 z?o|Vr5-kjoKayYQs@~K>Q1Tt%7LyRX_=K-PPIEkkCl+V=3>aIJRI(ynfz3tMe~9%H zuSoKW&>rVnPOJ)F<2`aFmTvK<#y-Y4ewH?542#lN;iAiN?9Pb}n|>huYoGQHS~%{k z9XR>rNayh74#M*PLkrc+&25cM{@Ve>+)NGNVs32zU%;WdoD$x5Y=IR*A*YdeqwHib zNZk2M=Uy6_GjP$~FRAFXm~&vJ847|0{6ad;1e+q!t3&%$t!nF5lPVo#yiSEse$`uk z`FWcMWsnGUVX9Bwj>q&1p~uI|(@YQO%3Dj1`+?Xf3W zu|38u?Ww{RjT?44IqmNRTx)fF79IBXOYgDfSFn23JgJ6vnG`dd5BjY~Dec``v`Y+s z+S=9{z#1U~K0pp)j z-Mqwvb=_LaJ@YO2mbb31N|!vT6(FE&9R}>|(+PC12E?XzehCC*v>v3z4T=Q;SAY8DQ%V-cbQ6tv)p;N1Q z#E4_2N&MI}nX_T%m8t|$_EzKQiIi;Ea+MWx;xXxtZBsbsA|SVyK=06|(CkM#+iL&f z*1BPR<6h28fL>wFyFnq_nq!aS8wV3QR&)S= z7ai!sPb{U!Mm;N!NKv0s?HyN=hQVm>Stwka9oHrK-62 z2@FQ>6Yfjy5V9XIkrU!Ep%4iOyC78vp%45Pm38TaKwulpk`R(T?2Lwc#zyPR_{Lmu z2R_6$8t z7caW=HS>#_O+5c(i9-qK(svW0V^~F&dvy*3gdGefzk*u8Yum&Gm5qz zS)Xd$=9u(VF)e5hrJijz!pE91$*u2SxmOa^;>Q9e+&DwgiF9?AJKMpfy1^P{uZ+$r z0e&$OrOdvm@>K3|HoUtx;oM;Q#6z0c*h@0Lx})Yimi%w`>raWSbu!aGlzg}%yyg5R z*Z5m8u9rZlA{_(mowO<317qUVDk-%x@tpzZSqHMFJQ_3xrWfU+-Sx_QowU~K{T~Mi z&T$CNpTVq;g;R~QpzH0t;CJE+{iV;hRK-n(`9nxS@a;w0;8{q$wI6AVO46LBJo zE>b|mH^1tmZvJ0K-O8G9pZ`Wo{AV<9Pyh%tzKDq^kRTxB|I27lH~#@pH@5tbCBlC@ zRmP~(ARrM(5J6*~EnhOO5#Y+dsbq#L zu+Lq8P#@%k7{TF@j!k!cak?fm8a@0!Up~-!1#>BorBoOwn(ZhOgtZ6UQB{(Y)Ys;W ztX7xmXYzBL={`k#%tjX#pK-Y89iE~?0SX;YKJ%p~F0bXjq`ZmiES`2=FZ!VmnGD5y zU0nQrv;-q}(WThql-C5j`g1Cy;0v7QAq6^G@HyXE{GEOcA*(or9%WibaRn{3IAwL( z!%!@qIaLkmtG(x;lgUzpV*|gpFl>rNdFSTKIuvBSU-8H*V>rz8~shj+wbirAo z($~?SO2cDBd))%LCyk}qCv&HcdMQkrY~<3!7f<>Q#)UIeRZiYJk@%m9i0A-{4SVpL zu|KS7v*xjwdWvoiotCb&Vx{;NL-^g>aS6|V1ds5hCd@lSw#QQFEhP-2g--d0bvAd2 z^j!Z|1;qXBKbi+zd^tb-rJZv|YqfH~?3jtq#HiV$8IbLb!CA(%m%L8U^tXr%@pO$8 zp-dFm3&d?HkyAK4C6k?{r$A9GNd^azVC{=DgYykj@tPk+wh3u~6%ALOOl^@gD!Kbs zF#q^%Z=Q$Lu$)jdbs4(=6l=w5>774HWAkUGZi8(@nuy9nVM*OL-&~RjxWm)r&d?3e z!y9@}Y-xj$9GI7%vm}wXMB&|hQWq=mpGh-@1g4ZeDMzC?sa_%;>1nqJ>(%gF!jcdk zzKgzx@6RB3er{-xdS&!t&D_I1*7NNx#Zc?u(Sj|G$*we-IMY z99;lk5j|p#c6R2b|8Q-{mB0S}^9@sXF*jE;|1VeY9M%6cR^1?XH{DcHT@Wn@N!=%B zPv9mN7iC0|mJT4LpjCCusz=bp=WF0f@!I#eVHz)y#(xIQ76yZPW(n6G5icGCT}t$@ zJeivIcD$JB5%L3bLZX0!a?lywO*Lo%HrSht3=%*U(fU@{z}q?;gcIH03Cq;!A$j={ zx?lvSya|f66LzA)!y%kSodg-^1~Y6wQa5gXTe$@l2+~u3T0B~;iZ@AEDP+73f-I{R-eCKK5IFp#(Ca2!PUU7o|YyKV$=T( zHN2Pu{G{~(h#cEgX;i2jJXAz4Z9z(E?Kxk}wnOD?1?~ie=sis*S1gFy~Yr>LRZ9c7dEXQo1g6hd~rMHGM(#2&A zn~Y7CL!&xlz%=dAomU1K2i~J%l8miIk%DN7M!LFrNunG+e$o?+GZ%KEL>f5BpKET) zShhQze5xBIefWd_%_vBtpUW*d{pp^=0y~6cbWJ1MSGY8<{RoNkh>>=B0bgZgN^)gl zgd&$e!yc+nXw1{EX~G#+NT;RnyiMt&xChU6UH(o3Ss_{QBNRBXPeXE+zC+Swv}4q8 zJ=#E&ZYh*t+9RoRJl2O>tLo@WSgAueP#eQsVAMUHFxv|-ofwRaL7uE&vPtpAka+l_o z2bu)>=M=g5!c=OivT(j|d>thm1PX>#O)@Mhy#!3*F0@0Eb-Q^Zo;#O4ii$XB-W#~j z>TC3*rxQ{6qYQ2L+;sElDLj? ztc+tB4*0{tvWIr4*Sq?VCyCU%oq7oi~=VdHO{w8I&8)2n{}rs17qMMj|yOOe)gL& zWo2zTM^5HQeOnN1kPd)WgUrQi<*w2cfup_2X0=JdKUl=jIXwdo{+6XooaHe#t0lc$ zgEGY1;GDU5IH%B9pIJ}sip+R3k8|vOvHS#P#S!XDsP{FWStjz?=6P19uainCreTW6 zH*;!`StTsM9o|h|S1MTm+kAV(e~WJENUbDkR+c}AJ%Y^Y)P)Uidy zJg6HxD~?O=Fnc$)t)ix8)ox<;Q`jUQJTdH8uG#ExE{rtYgXuamj}~@W02t=(*d{@& z4(97Olwk1dhOq2()AR&SXot}(wukfsj3?8I)8U0ocn!OYn}zXLDz{im&OPcY`KIy% zgzz?_#8t-7?l!+8jS(36A-h9SI*00=wLLHv*(Xh6jW+_{JIx~+j8%Z$+$@IZ8an{1 zdMFg``@K|Yz z6ws*VhtZcJgWofNn@#l#4SEoHxoq#&ft?X`=$rF59JRL3lBfi&9QbJkJrQWQin0z6 zj?}*goOVB3gv55{7uoDSXS!9L(u`+dvm#X08@uwiaF$a-dTxRb?Ps_yNHKmWm38X? zk1q_?h*>YRKnaJ0Bp9LnLRIgMq&IM)bvg%BD3$aX^8B;Fwz#;vzY=>`84AmzsH@2- zBvY;X%bO;}0Xf+S$)&+`)Yb*ZxTrBYz`gQs8)da_1E6Hzp`h+_;3>^04hP2S-4mLH zrD40|#M%1+6it~oImmIe>x{~oPYeX!&M)`%zNa0Tr87(eQQ;&MmRZmGz`c`I1)__VgLnprEK(xvCp9+Hg**%Rfqb78;fe+B9t!_RQVZL>#Zz?L}>QFs|mS@ zDpX56#sIv9Rqc#ac(X|&0!I*nVh%QLxZ}NbzB#1bw+4!J(36-0T!dcf_LcIP-y#ON z?M=Q6>lxl~x|8_E&Xr~f29SQ=qMr|yNgMdUGc2i%*m!D5F*#Rs54*=~mf~(Sy8+9V zW!Ah%y^`9ui>ss}@%p`g@fwtylG&fH0Cb8TMwNDNY+Hrop^NfY^5}_9bX4M-{u*zKfR@XP%feCZ zDE~;s&*QT^R;!=fF$)--;{Gm31APgmc>hzOHQsA@r~UQ*9RK2U(*7?K^*_GmBCe*^ z*79FgQ~xd~;4qJ71YlF^*`1Zw?ySjVBvGzlJReGHJ+ zkPGlO5qNT)$>UfIp|ya34j4;jp=>E!#UPIg;*9X+Udofk;4_j+ySttxovqBE*tS2E-E z2=xLjcegaz38bN8oPKLQORam!G4wT!@Sm@%`gcdvHO~58yo!weQlGNP|Q9yF=OqDN|b& zAg7Rz?__QAc%7qt{7rkUevsi6uUPdi{s*EIf0d&7u~q)|dE;0{gqgdEv7LjB4Qoe! z8KHb(6rmm7=~iD@y>jjcT;(Zt3`r(|2=pZ(#WjRPcpb@PfA`Fdzo=1;UZ|!_wgWu50BU81o?fJoxWN!ytj!gU*@F-@zgdiVwf-p|`_G z_CBcZ85G2V1X%f?^?7{jl9YSHTYT*z$g+C=W{)s+$R+Df^b$D5w6;!zhAr~bFNC%> z0bAy4>pGbLdyMJYG)`}!qS_nAJ@qv36gB?_>xGeBsvjeITBs@4K`d8dIwU0g8b}%1 zsw-7P?JAdOol;JVgVwrD;RVa4&Hz*`vEEO@f|yK`_L5q+n~I`9H(>{)52$|uME}Us=&0^}^S`b< zeqZ_@!GAUA|FD4j(*D?g*~R|TqyLp&@t>w};^r3C4%Yv&ha1w+|Gub+zO{#FCKwpo zYo)4NLqv@>i_(Kpr4bxST3%E>yKcY=T9{#$X+~cj=Ua8H{{fb#UsY72Usa{#dm3ls zJ)P5(f2z~OWX|$>k?lRx<&o#=aQ8}7=MUm-ZM^bO>IKq!-&k47)$DE;xv+FrBGq#gmBC%p+xoZyd(wz`28m6h4H-8MgkAP!GM z!DI|WsHl`t{TqF%is<{<@KAZ;KeeH`9BP#^hmcY1sZnYD)ETO1;tT+GvjNHdkN_Zu zRU03Ig3KNQJkK^12%_;2Ll%#{zeYR9PEi@F?{B-+OKY;86h4WdG~J<8{1^%aWmcPs76 z7b;8P0l|xzyozU5RzE{eJ`KCMvXhK8GGmX#;0NHtaAKM9&AEr2viBecWJ1*dmZ@P# zG{xzC{=e`_I&nG4M(m&7mfc(t8!*A4Rg9n4dqLcBsM&meUM8D@qnLmb?URA?VY{>X zOrp87UGy1%zpqvmI6k;n8<>N`WWG6A{p}9$#ea=o*@)8zKz=7<9QzS*l^p8`Pj4E6 zbU*qtMuZ@aBm1pRK#Jhq9hAe)TPdrPrA=QO;Rt~$>zu83iGh5tMlz^2I-2Il7yQV> zt?6pW^g*(rF!1y}O`*TXgTB_{$OnB4qaC2nnhP}H_4@4H{2NPO=gD--uCtAs?(>~P z{poTipY)=T>8AuyjstodPB=yzQu0>9dQL@2sIt36 zwL8S%)e^YX3@cO!gw@queGHr?W0vO*F(_OZ4WAf|pj#!cE%>fC;_eLYEskOCjE3P1 zH!=t>IcT4a<-yE&WuiIRhw_9B8&T?XqqTUG<8+3G#BcLw2nGN9nrG!*9nCPtsdBU} zG5P_m8TtV)fYv=wE6qd?PM@V#QuCKDcSN>{UP7k{r((g+g~3;nk6>`Ik?>eHUP0?m zTVUA%{rfa%$TVrWG}gLAzb&r|m-Yf7KCh9vY)(mSqQSUMo9Z@gXW*k~N-Em&kmw)} z1#rWCQb<%Gx>Qs_Pd+3QTkh*9g=9X{W7zDg(k>2)f1M-s@(8*LWwfNP^F2k`LM^@2 z)nhl4cgqc*Y(s2v5FEcGL20Zo{olnV|3D2}la0Pz-#|cIkU>Bg{x$plU+v?6gX7Zb z>dOBPjK_S}1*m_=`FPx%&PWpbCPoPmRqZb^XC)~H#WkaDA_tS1L_ig0)KO%m8tXN) zNaqpVQfhRA;PdZjrRDgv%(h+?W;!dh{8**_OOXq}NyB!Rcm zYB0li+*88EO<0!JHc-WRGW(FqMVvSa*Nd&>F5QFSuh^q|t_&>e z{DC`ykv*#nD>uaEB2=-Tys0#Cq>W%Wu!51Ta*N>kQ5t!o?jt7#nfv|L9)W3B0+MO$ zoey_K|&MH<9YV z>OdkIYz*b32*6?_;u@9 z8LcxgU3hI$EUt4e=_J95-^Lz29jjBn(!K0w6$J_lfyH-=;vM-1oOhP(XI@lr zNxQOy$Z^+?d2 zw0xz?Q7#m_6(5g|=X=6u+ZRLN@n|7eB@1nSIsKWDEK@N2(rO+YT6jxxb{%bY6c*s+i4(KE zYETm594B~m7I+(Bd8Uk3l{rO5f9lzHT9;8Tbgc*~wq?Lo*ZT;)>v-1hz%Dx-NFj5) z^&Zo=lxEeFvMyHGGLFRJ=XmP}O4bU{?o?>oCM#l#J7%4o>@Pn?LKgwboHYoF;S93f(a_E(*$MiwQ#-%gv=0%n7h7qX!%WJ>sf; z-n_L3z5yj{=NtPd_f{Um=Y)0^4`gT7mgNN-j3-bPd*9`6V0Bh|m$mu|9h4K2u?2Hb7<+`_=?=+M@s5@e5ja)majYvHUz*QGv`SK!;2Y-SF zN4-e2E02sACFI!RW^p6&euOJ&9n%a?ZRx_2>U{W5^RWSxrfC?vkWp7bT1~-J?A&qS z#L}&AD|EAdIdZ3PCk9o#M)4Y#r9wcLCg*I8(^ybROksz4DySsWUOW_D8uGfXB*Ytd zB}vlSA6xm?ho?Sn1o5S|Ork{aSE%n{KgD}mL<>l=%4ngKGnL-PR{2cSLZrw{@=a{BlNBU!DfQ1O!y~C5*w3IV|wHtMCE1D zIRN3VXTDxph9Vwnp+#eKzcMZJ*Uc5n{6m1`@YKkAY3WHb&}sc*22)KqKg zQ|!lS&>U!8@9hmwY4J&}xw8vgeh=@#)L^G!4i_xHbgtyPE$s}pE5CCj-#DYw4b;-5 zyAqUi)S1-Q(MNecyxqV2UNmPBin^nJ^VCSQ{sX#rKyundDPZ4^U%LeFD;Pv4g@f4_ zhpTQvv(ON|iImtAiz-rDj_Lc>-i$?eS-w1L=(!S&Ilgdz_WXEskd!Q+9n`*jaK9>F zrF${SO<6HtVpJ8V326_zPJ-@3B3^(9IKJNy7O5B{@WRS%Eo=PqiwV!32#7DX-5`wB zK1LDJI#2a-TvV?{%k7O4X^YNyg6)_CnMuevdpKdcZer_}EI>JH>H!rN=D$%daJ?Z} z=_HF$AVI%$F<)2Y^gADzd$#!F0x_xNL`rsA<3wn5iZz^01B<2gFR5&0<v++QpE2`!WQf2YJL4=YR+ z{srF@iuAlAzHZbSjH;JAF8kY5kYRh&JmUSRk*v9T$gxNd%85`ORGD~l)G3ATBNabZd`U3uE(FeD9ce@kU*H&J5C>3Toe--x+90YnF)hK z?W>r=k?pX-g-1U{y=3oh$WOb2NlC=*B0VnW^vp|Ju8%;0XF92SNBlOWu@{f*ULj}H&wiT6=DxjiEL_q;u%JTJks;D- z%G?lAEH2td2agLL6p8v;2=$R&fdno4__D+ z_LTE2?)CQJmM*vXlP@X-umX|qv`EsQ(G-hJ!`d>Q@H&+C)z^kr`m*43%yURNfq;!216$L)~vkV^9 zsJtsFOt;*b;{%T__{I-v#PViaRQLy#bwm2MvjW|6Wo93^d%Fl-ExYTd_;5wmXPzPa z_*s8pzi9M8*dEPema6GtW^}*gL*nx`uyE9uYK+R$A!!4NxOW<;-ra?zx9(u`Cyhg!u+f3;DZn-@cY8HGmdU2 zAPK7$ZhS_MW#6&>^#=Us9u#dZWV?s?CAwt=0r|3y25~S4Fu7VV{oi}g7wrAdGEn+I zVDEnu6_x11_^2-}37wcHa%FVJGaJMGfdC7pw`<6Nkd_96rz9Z{z(#kLrZi^Gh+sp* zoU{3(s?%(llJ~HEO84ozCqb%H-9`XNpCAA_8&urWLYLf(1EQ;!+xkVUkLApHeREf&>ts)C zpv}_X&Rj4v*-RPSxZ;+-6ZZ(K;-R@VXczMw6Nxs zYm_)`J@qNc(G3Zznb)J3T0$H@u;(>A$ZzY^FV&}uk;){%*&M!PoyZbh6K7pc@ap?} zva7hA(I>b~G3DldHNNZcXzBFRoAucXQ5J2UCtIXsv+CZ#^UC?gV4Lb~Cmzw@32uPv z+$Sk$`9_wnN2>U@_KEJ{ive`ak^Q`P-l$WRoqtw!`_{C_>6;()(mf|1QTz!s{+md* zn%66!dt%z7tT9N)?8F=5&D-sxKIgji9-Q@W{^^ko$|VWOV|@jw&-ki!Yp#al7;dHu9fL^_e%EaOKyyAm89QR~9zYMYW}Q(pZ&6=W3|Vta1h+>09G z`qWHhc^>9tUeb#c+wb z26;HM_Hyt35!l&7zR+WJ!o>3o-$PHGoq9YW3ftwX16-m>5>NH_ES;tj*Io3^)$ zQiq2@*;nJFZtdj{qL*IuJ|5x+rN7+l4}J89&~Nvp(>u#AeDZ^4zu)~F>nkVFU_Hg; z*AQ}zMmM^*|5!gk+4}m`P45hqzigk{!$E9hJw5!$7_P0WsIIl%H270nx3;~gx3)TY zSiN<$cBwskbnC%r1q!S@}~4{qcD~mtVh2D}AnOdF6-$hIOj^!FvEslmJdN z_sWTQ7DH!NT^lR!=fm07RPJ=8a7Sy5_22rnsqL=4QxAF0_A0L+kvbvzYPPejm}NoF z0nNuyUwt?;9a8{RR|m~3p4~t@F#hSUL0yjmi3zN^0#Zmw38i7#4%!uh$@x4<-b512 zqFDkPD7`KuZY*(&J{COi(J0Qmh-4mHKVF&w{-sFk7%|9Sp{{Ns*?!YODXne`?eQz6 zlByn@>s7GZPUbGedQ3W!Wp7-m1@^W066SAz|0H=5j-gRs=5{Qi>IAT(#z3wY8<)p59`nQ#wy6@;oml z)go(r>X&ey?f}n?j30FFOiwSqdm8dIkoPUjYlHN{s!e)38(jlZE0{{N zRM*S-44n(m`iE3#ojg#ki}Uk0%8OZWjMh2>TP9x}BG_RWP8M0ApV|0U@IhA%#Q-h? zr~R0-hW^;3|NZ1lrH~A-k3rzFLx5SuwaOXtKJletD{iaO-Ag!X>n967@L5dR!5o{- z9T+-fI39YS(nc1XVQ*ZYg)KdfT20uQ95JrC*CCQ_XcO~-FZ4sP8yAWylZi-=(g!fm z!oMdxoBVy04MED2T+zsUUnauE3}G+Uy5Fcu1iOj8j29y!p0RYG>wUmgj>{jDYcqeT?laBGEd=3xJM@H8`>x4AOjyE0{1eFn32)b zjc_fDZ^%GQF~JoeWiDvO6mN?Q%8w?_#RqJ+ao{gd@)}G64x_0ma6;bIeeN-ub!8xgE8##;6?`V5op`sW-;G^Ld<^r`; ze%cf>%x=Y4VQ=6UZ{eZUuzH`S?pl@=#s;E6c;$yVr8(t^3p5CkO`4Yn6S!Tk$!vMo ztBsF0A?CGK5lpz&%BE7u7pm0dWF?;}J1YN@tck)kXy56u?4nR|1DYXI%)_+aTWn>{(DD7D6N;|j_xDuT+%4;Og{(qC}qBGLtk z%m`MrBk;z|#aDWKd9tompUxyN=BO2Oaec96x2rAC^bY>{y>|X#OQ%D<{Ds=4!(e%BhIw zI2(6H70MZ4iMuY&fTo^#uAHsMYhr8>v@uI*&C{N0Yn9YY6O^3Z#0iRw;E=|2cn96j z2tnyMy8_j0t+oc^vNRRSsgPA`tGu4*p;k#;qR!RPpR2gyz+=~O+&^|K*{UX^pS^Yj z)5gz8!vsGyq$oDA&;V~=O5-h%x$Y&FRdUq3&xm7U%%Rg=Fr^vQYIJK>0@sYAe%22* zp?cDR%y8T>C?!h}$|;r2i8C%{l2|Yml46_&CYCkA24AC0Cu&Vxdnv1Egng)kV-ZWE zrVDqf9Q7kolio~Dd6!(MVtnNV$~U3g>_*RPY8KN94#6I!$JB`g3uoQrZ0eXN)I9@u zH~2GE+OfU9O`TLvF>x@)Ctban`k}wu!LeW7*eHX!eREdR%FHV5zHZM3W0dFWTvd!N zB+M0NW<;yKHU&qgtz~{zGeW48eaW=nW~nB{A>{Y@b+fFPZjlCPt8rf`>*^ZaktA4N z<9nCBeytf6^ms16zJ7p!%bj9rFp071%5DY+D#CIkSzXd9Ky%;eaW)e7Xq&q5s&EeS zq+ms}y@jx3{ZjxAd{0&V?|@R4OfrwCjzq-lVQo!?qec6hzJ-$p$&0ATunn}^)UOn4 z4Zj6K!{7F05Sqx-NN$HxFeh<8&uYmy}1}148Zo|mZ&C-HD_ulR3X$~|d z>l;;t6!w{AWg~yWASlLU7os*z5i%Wf`WQKP2ocl8kn4?36>>p%2_M#P%tqCJ%>88* zT&QLdAx|X`rA!rz1}U08Es@>V-%sx&>z%@?JiCGk3Ta}j>tX9$Am7P$n&YB@vCI+y z^_Cwb(X|=c>!>55{0Q~Xjhp^G7=neUFJN%(CTuv(X3>?)Qx4KgVNcm!1js4;QLi3!uS0LX#JLY(xxnu>j6qE=y@_h z50z?ImWp0U`CXgw7WMT_;tw@k_!%--!n{e)mde+|Ki<9~JS)*oy9341`Cs`+8@6No zmg?Q#F@^l;lkZ2?Jv_nLFL)X7Knsj-QsS4tg-1_|fW#?CYkbtVs!dMR+TgVE;!~l4 z?NRRN_mng&>oc?tFI`n0XP#fWovJT8daQ6Qv2!{)x;WMZSRHdXG`H_)r=rIf4__fd zYSQcemR?SYIYhoSK|moHS9CLPeCsNn(??QK0|`La&oZjoGpg%Bpv#2P-3Z@RhE)DYR84mUbeDWj^Ig>eFvezv|U{G57-*aaF{aQS+)?cP*Pff!O4)` z3d>-#3@T67HFT@9ynZ`_zj{V4cP4SrZ2>uJ-~StGG+NM`Rwq(}VVgoiXOg zp6FYyIy320ka$Yg!)d5Wm`vx^m^=`Ewl!o?!5EAzlFQ>&8q?Z@rUER=1JcJ&BN~2y zcT7WS{x>rv3d$M>9Vp8mR955SWm(IEBx^&kKu@;DHKwpNcZ^X@y-id}dXPg@CeZIM ze<*z_w(vxQ?cxaVj(%=MA?Ykhj^RY^C0wCQPD*+L(ghX8wb?TSC1y|;%5F>Na-IdG zq~<)vheB}qVz2M`MNl3tTDO(vX{xs*8I&YN?SyuLguGh$OwKn z7=BGd+rBQ)qbZMQpc)InG39xFr0oiQtoqTBsX9xRslBSCvjt!g$7oa*fO@W6Ywq3I740-rT=Sxr&DihN!vP1sDcGr69=1TPecf4_v z4LOfPY@eM!*aXf5p8hYuKM}unVbJMfVx_WpRZ|l6W?c2{e6Bv2WD6Q~ubt4fhI3!& z(2@YC0H&f-euafI?|Zkm34W=CrlXAKXWzd8=GH{LS)nJY(%i@B`orpi6dn68vPUPd zQw0?8Y3anP={D&{dXc3P2K(XirR+`KqoAIR)W)bU5sdO6P3 zC7-1()SYqdUbd#vACI>Vxh=NtXop+IyXV5^`1!{k>$2=4J-;V>nC-o@r;bu`j95L8 zWCEgTBa>mi6Bb5;>VSXY1^S28vC2~<4Fm-F%{Axt`a(5zbo7k8GFN`<#LHUv1$42) zH+hP@>)uwd7qod-MQZ>deW+L3vas?@LQT|;$r#i5C2GF@IsEm%Z0|#fy^`z60N_qU z!=!(Iy0SmnxXa~`7Ng5@!3wMJ1IskmFb|VEr?{1x?--7bmP;b8?hPWAL!f2adSTy} zOagGBeKTa*M6t50q<3N0*RHBtdkHT(>?}LgEO9zMzbHsct1!`=GE7?JN{2Z$3&@Ne&T7=w8SlfnB>jjc8AYOx6yfQ1^6b5ou^b^P;{Fj_` z#hA9FtQ^*BQ`lGQ1;(aO$>hCEWbd1OndSfK>`LIF+}{5bC6!93gcK8HO(7)NvSrJX zwK6d=*~XyK#E=yJc|r4e9UkCktHYQAynr)w3t>Ih=4Q%kQ?;uhDDtPu|$e zay z9`NkyIHOq6npi5=N$V;;fnyzt$EtEU;x zcT)@L3re4skjsV~B^zlb*|j;SP!gu@vr`)PBO>je=HEu18$@n>QQ6Tlr)ZemE&rFV zCT!oXIZmp~q5Iyl7$2E+4nYcACq}8>yI}JnMs=dPXhm-D)L9D3FY9z;<5mt@s$Zd3 z-BI$xHT}Zyp=XsIYL47)-SxZ8F7TL}gvj%0e<$q;NwY0}sBik%+BNr?{)EU=$*@C) zY)-Ma-rYV|A%S8tc=D8z3u78aNH(gEseLi*-OgcY2j2#M&O2%mdDV3H>Jdvi<%Zl> zd$M-Ot5}s?gXHsyww_B>5ZO2(z}mpa-Kkct%5g}WWOY+S+9Juu9*2YX>+GL=F(lnL zKBDRwcSYQLaGO_l&`e3yl_lf8)g6&48XtYnWOI$2Qc;iei+#y{DppeVau0TQMY_J+ zQZl1+uCo2?!Eg1yKX~zc=#yt}4OZ2X zK4pxLQ9Zm|asB>$*PIK3V(79bJ1j43muPvVtF9VW@q{cYFPAE-a7kjto?Oa_BTt@4 z-m7xIyVgK|<;3bg9!GK+_n+=Fzh65(W}8c!*AYAGyyvc#qiT)^+|O>EzMhrj(@J}# zTNe}Ga$U@HiGHP2ncsOamhn^dEq9sY{5({j$XFNdS+>@EdR%R30>i*ks%y=G zN;5`;L7JYb_sqnnEjI%y{nKaKHTkNBZolb1>3-3LHP`Nb)10rZOlNJ(AAKle^vuP- zz0~s69k&`a9;T~59JE}v-YsN%(o3pQ_lrz_eVK7GS>Njth9CYh`BcM*&csVE>{*hp z<_5gJT)>nIlK*7gbtz>sWeo zL~f_m!&4_q#_VR@h+0v*T26Oa>&}rfryo$rJ|^7&^cU6YZgwS|Erq9(7kwMz?m9{#>49s4P03bU6Q|Q+ z^{=dzzv@hPY1jGZeasr8>I93LeGB{-26?Vb&i-)BEt4*rv)Vj5yW+`cDQZ2%G-2V< zAe*3sxBIu<`5MzbY5j4fbi2}n8`9Do^VTW;RhVwkU9x${w&8A&Ac^-t)GV-MQP zDDdl_fz+_@s2Dm`8#YD-QW2B;mPLH!bHm1N%VX7Bp=flB@9-jGhg`H!Mx^)$qFEWmM zH)~m0bNRa_i6^sHq&;9=T(s>|;r#Q3Ga3zxt6H?}9#<{pn$j>5Iu?mVQXy^ zd@fZT^eTGH4DWkAKf`)fUD@MTol4QDiB9C!ANhDYleSV zX&*~HUf0;2-m~XY*^h?S^)Fi&TXla=i0vLx{;_M?w#%@S$XR-dM%Xn{b?}Ug#8mz9 z8S>*=lD8>IoKqNI$f9^vFPgK6o~bz*!Aq}46eHCAiA-Te7NysBu%)0j@iwIbI{^#_KRml=nU zM;zH}>*#Z4wpIbP!TYR4e&fEuzk`!TJJn~VM`^1pR({{YkezKfPv@NY?7&QhMPZf z-Z#{Vl-%94$a?PBCoiNKmCuwPEN*H@4K#{Rk6b;j@Iz6l+T={p;_9_l@5auuU3jL+ z)+mrwM{Nz04KY6&VEks$o#v|SH=a)}{$%6?cmxi)bS21Id0UpW?a8(0$h&tkQ!hSJ z&b+%~QgGT@je|cPJ?z%7Z4Om_{iyN9TFOm(9pxCa=A08virG768-EvN7E>!0Yq>9o zGV!3hyop$#0^24_=cyG&eW;kW{h0ht@!L9&0&cy%Fr;L7h`Qnni`BO*ZqFEN)P7@M zd{&h4&Olw`)2|JUwIB4vdi~om*h;VL)a$8b_fEaLu<>_v*+!4(viQf*e`I3oI)*k# zPnfoL&fYuw7FaF6?xhysP(P>mz|79t(agi=KPYN??k{>fO#ZNL$eh-j`*l11@w+kA zD?<78KC3mFVP|TcW`{lPh##r2?S0prhT4u|U7BJ;O^4RFs6*EeCH-iAXIPf+Zxz;h zQcAJWf_d2?dXmD`J*3foNnY-9?p7DC81I`%Z3;-*JWbBU+(DtdVnADgcC zIQ?m+&*_Q!vr?Ys-OVu>BsX;ld9RMd0h!Z7mrwGBd+XeH=4RCDy?K{g`tFY7iOlwE z@peWpE^ZrfZjIN!3Nq&nP9JdBvwU#I`^%90=Y{G`2cwGqt!#BTxZZzh#mZl^#48g* zmz*L0+OKb>{mj*{ewIf4T-x0w<-U7YWlelmW3@|lR{Z`u6CF?~!= z;mRp9POY?P+dWn8gLT(h^UCY3`&iA=-WLY{iqAJ2xzxJto?g+qtuxXkwS2B_{$9Ff zwcKs3&4%r7CRmHPw_l(1XZP64qSux>UVWv}bi2#^de0JBQA_cc`iG`1+in@WFi5BR zST^NA@s@Zy){)v!McXsq)dM#u1f}dgUVd1_SK&tZy3mqH)lWqdvCPl&#{AVND09DK zt(F_w8J$WWwNO8)!eqMj`qTb5YR1Y1jc!tJJ0Dcy?kPV)BdKYW{KA#bWeYwluirsm zBI{_gLi{2#Z%3EHjU@4V?e(S!ep&n9WVqTaPPl%#N$%+ItxCmr-d}D~y11r7?n%SO zd>y*Ni@-DfVz2A!&Yw$^d#KZ@v?ibO_-cN4S80G@ZivFMtjX4rXQfXZJ^Xc+nbYl{ zR&nnYH9l`|PY5TkUO8T+i=p~v+EF)2Z}D|L9VcqGp1UA-yKS+dmih+Yq{tV{v`>Yu zK?WU5?{z0UzI*MWn5)Shk8CTKl4CZRB64jbQZ{#ce;VsvJvAU?HvNR@)`K$)%cgIx zJ2*{ze(hVvfse~BnEKD5J)3rZ*Xt7B!vUj@oEg?=-q<|&zUn$_Pq`CnvmAd}Y5&|` z^YVw5(eJ^oCRUc~R93B*>zbdev6p6&5cTc7(d7*}H-jmhq1Ag7}d*rcZ zf5}v-7EmCb`FX1rrhuegF18i9^2!w|7@98t~j;fLV?y`E%Wx4b*;Vzoj<>I4{DqgILQ$% zAwM+S%|m}w-j2)wDH%DY)$f%BspuYZ^VsIxnN6Ea|JLk#Vtd;@Vcg7r9Z7@tERn#Yu1gfc=ai zeKbRVahUIBrfKVFrQLm(MCyBW7>N$ADyNi93x)qF27c1$|L%QQOjLqkuR54H+FH$b zb<=XN>O&xr{P~D;Ns~y3IFMr(F}!aq<9h=>WzqYfH$L>f0UK6$Us}%h5^VA1c}WtC zjK5au?`;|G%WNj+33!`*kf{%17zu5xN&V&X;~zLn+Blwbo|KEiVlsq5@Ljdy6dgs6 zj^f>S%uge8tm?^7IKnS4!8tG8M`I8C7ydyCIX&$_Wdy<;0Dq3Pj}nO#z$Z?qH+vtX z18?{qaWAD_f9>yG*lEP`Zam@LP|g&DN1ek+C_)58t~_-aCOW||TC`1x`>>c7g<^o@ zU|gJ?OPsLL#~DXQ_P0!~Mu9fO;FOv&7ZUztF)st7{POEP0qhzc&G7GyL%e{fCjU}h zWo86mDo~fBOCq=rD18DE(A>rieU|4Djtj^$%wR^bZ>dMfn|P!U^|o>HI&ZrQ7ei+T=LO7 z#p**IDC~8saM}R8Z}7JqKqb8oa=FQ%b8h3Hzqjy?YQ^&w=h711clnzW_^8Jqyeq)h z`5`88d1eRBlfoddu1SCF^cf5iK+}L&fz%KhE{GtB+T>KHxPx{naNf-ZV-6XN62ug) zL~$3oV9c=rt$Q0h_OxKY4+;+th{V1|0T+)5Hq(!lpL<$Hl1SUZH5GAGUqH^}w<$1F zjPHDNV+2NrLbU2_6Y+v0FV~Q!29rR>$01MyN7%z+UNOSJvE8M3r|kVVc1#o=tI)|s zjqa$6JAgtC6gA*J*u!Ekazr|Z*B~OQt2l6nl6Te#-GwZ4$Ys!VBZVp8WR~s4MhSW za>`#sK-TVk5T^^5VDjiSUIL4#3V3)s+4L3&)E-nno%=rg$zpC448XlrQn)ptk^2pc zd2b62;Q-M3IM`hjArj<|3n4VV%SL&ni>#}(*>$=r;AcaI)xy!x@W;lESy!(uaB3H_ zH6uKl?!LR$O%ec?MMMplx)Vdz*wG|O zq|mASrGfeifdtT&@!l_`{4b?PmFUuUdEmWqgF^)WH2tTo07+K2Uk}rBOsj{wR?SFy2oTGPr(gHx;ZS9kQM#j%SZNA{Lit zz~oq;;B3S(ydR&uW5PicXTk91;-JOO5~0~Hjpa-1>rJ*{4%ASnoBH?BxRmYBJYfVe zP?*fdk*YcWKl^BZ6{Q@g_jY4jpa+aa3Mwaj`M2RJHXhyp#g&$A7|hf-r{jr+gWR9> z`1#mqNG=kfRJ>bqeX~$^xf6R8>>-1*g8F|XeaRM3Tb8rj^EUQ!FuofbAxq2!BXzra>nf+ z2zH;ql2Oxy`>>edZJ0DLQ$ThQO$p&DP?$-e>^Pbkk!%EPGr`%Rp2Z#(b4w=%%xk^& z;r`K)15MlFd^Il(2IXCcA0BnccMKI{*PIc)Dw4|nplEM=7Ayotr_;&Jz^g5Y7(Y>V z_(4PkQ{y{?MCJ`nf@O_F5^L~h;UOR~4H_|1F@c~sI_(!mhF2uEAtBMBkY5B9F~dmc zmO>}mzrW{zgwH{oz!wW*q(Oow5q*{h69{w_B-L`6YZx6xBcgOrdAq^uL!vQ~H%JH{ zEz(2>@s+pE?D9*fdvF5vfz5%@-N10sSpEt@YA6QSr$pRTnVY?Emss+;42o~nG70T5 z5Zfw%T|CFjMiB}0>XY}AKfHh_zP(@jCm9*YbkH7t9w9F;5Rhkbzlah-3t(5woE8u) zff8or9J#bM99IZ}!X^@U#z&^_lZaH<35>5v$Bz8{_2@FXJ~B>FkO82O!?B0O^s*5ENDCu|3It=ZOumx^L#2YB;LR(^K>&>4jw2Bo4OwK&&g^z5 z2O^*xn2zy>g6Dc?BD4j?KM2~b+-QONnnYN{@kiq|{%&9nhQKv`CUn-D2n(TtQ-P9E z(4YjGg$00nM+*s@nJsJK94d(v2trlCvFzfDVe`g&8?dSHKn5igHD8JRA~D?WI#W0k zc&!IqD95pf#bi=2%)Z#k>EQ~7dhTWVZ9G8bf+yf5+U`$;f&upxtf&(p$Tm^Ek|Ta^ zXFc#W3ZU^R$$t5ODT#1>u3*;pKhe$TgaAJsS`2uXS{q1Yo#Vvp{yTDEA|x^dtKZh$ z3qeusU|&-(u_F5_j3z?%8kQ@aB1BJb7ko8e2s%<5#t&x}M}%W@XzL`HJEZm?Y5Kee zAkZpEn+`bcYBmdjBhGD5xaA}!-v0YQCD)am8a8NI;xCZLPeVo~5=kR`H%4@rKhzZg z{RBp2DU$PMl?Fq$m^PZf$8&ee7TsAOynI*yf0bL zXE3;TWb;N}G%=%Jd)IyxB=Q6#qJ~q(!&D5F*RS0u%a&0C2Aq}+KP{(z1#r;<5T4sh zX&5f%+Z>yT3^&l9p#!rhsvv(vGH_Ac$=Cog=mtxKrZ4uem{<1^Q8{sq=pqQ|P|8oL zBp6@>Oh_kVILJj-9VQ}ild-U_!Zyvg6R2$658B7)uv;u58ZIsJvnP00B!@#Z>$;dL z#GJ6knSXc~@(BuTPa`zy*X;8ei56N#LEUD!VGqvxFSu-rb)ZD~2XUIe0{XPbE2Mo zKOt3Oi$q2k$H8;|nTC)RGN1V?4;VtNp$CB*UojgL6K#ksCWin$3rdK8bO@B>VSxj$ zYM&4{w#WpnH^2{{YHnO2l0fd$*KHKQHA*##`xWPuL7F)XPL7Wsd1XXMZda%OS_Vzj zDr7#;O~A`%!MqCZ>4h~IE^l124-X{j4spnIe!hDr=GG=AQS9iF=bv7$$^Yf%xCwZh4llGIG&cI&e;!GH{qv* zVWM!Q(1xM*ii5i>)8G1h+=;zoj3Hn-LBPWI7r*!6VM6IuS8v}L{*Apf4ekju*M2rQ zaAtz#qV!qk!LCu|I2p(K&d(U@7%5K77G6AjqWo4^4*?8qSs>%k;=U8n%tB~^VQ7_y zJ+~y<2NLb3nknhIfb<=H_(i*Uuxkpx;>BIGf2fZUL(V}9=W&spBSb{T!CS)0+omF59zkzxD49#3j2&_wVSQIUkYU|WbIfrDOTi}~j26K{E z#{3NcQE?&A+{v_X+YNH@{p1OizNj3(?G8~Tf@0d^`8E)5^@iBI_&)FE84&Du@GZPI z9MvTvqG-;pJ^Ddxy`P?Q5PEtCz*_MY@-FCr@~^40RYfSy1)J}UjqW=0flpcJ&f>Kd zWkp1WIKWrGl7%-TN2X3TDThSyOO-!5ib7``@4{@BvB{}mR*%R!Y|8}03I)T$Pj*EE zFg(m&d!r-lHHwU)2wc8LrI7d?pV_~`dzE2n0l&=BP8}?`yNOkFy;~$gXq*`jx+g&} z<4)ZthZlqYq81ZgdnUm|#@V8<2npx3mHTgARqZNX9s%s9L-4_i#3Y1>%(2~pZ0%G> z#uVsxkmNwj_^{APCt`AJt@l!`{+f4|bRu2*5!dbwYS#O}*cL0O~ z$Ua+-=$qHVCc7vpU$)smHiY)^PEa7em1TJXgY3;of|4?W-Fgzt?%k{<+e*NcNf74n zf#^;VhK+eQ&OXQ})(P1!fNIUwCt~YtA&u?^xkHf09u~8zln8AR6de}K&m(a+5{RMq zLGwR{atx?<{Iqb~G!Lcpwm~Pvd%&|YU{2JxXoobiPSESN;qIs%ETF_k>MaS3oihq# zH59B9zi4;iI>rkoFNlWhg?PBih5J|YXj+KCkcG_jbIp?WwGdRiA%2^22MT|J?N|SQ z%~VK!Lz20>!{PmMQ2tUF5Po^A{Sh`8-eQM$-HOcpmwqcAWWTRFzV@(S6i?ts#*ON9 zy+ATpMiQolxFBmyPe}CQIr9LA`$`#}V2`TcA5(B5+0sfJ016Nk2HTQ|aLCoR z4fPN4hs5CxeBFLUWylIBMjJZ(o*nEP+wGz^IjQLX_?#VzCqOe9k^MA|CR- z3WdftO~6wCJiI%c{r3ORyr3QpTH0j}ofV-6F>xsLxbX(2-z9`h-_kDD9qnD?71YW^ zV;OqaO6CU0I1to`A4|EYh~NsVKPx5+=>;wSlUP6ok)h)qcrx`v|374e7$lQ%`^;+~ zlM6nNC$mUggj>_%{he2$CdIsm=>##(R6$oz?&IqMM4KU-g zIvpj_0*Fk4Ak?LasBFWr?Q2*Qy$cD#ME!?z1qfgfaEmW+-Nq9!u^83gDhA47Z`E$l z+Mrwvp1@z=E}4MA^5!s(0ECC;K`oZGuOT5C0U#Ntumoic5VJLiP@GsQB+a6cSGml% zitZY`2$@|ShnTBPM6{$u2BYo60RWAPaUo$J0h6_h7TSZF(gEBQ2Mo6t5!|8|udi{1 zp}U8LvfFw6&w9Qu)~0NLb?Ns;{E~jBKL9ns7SZte(2@p_bjdjWQaRg^2*|cFv>qaC z0~{(f>UIC9Wk6hQhs_-L$-`Z546@f6xUIq7rah8|U_Q-4`zTXojLPmVJi^G z94ZYh9dcmo6Ty+lxUpBlCMI=*^jwj?l32dUr} zeG)DSk%-`+%Qiis8+I)_7egwA9G6zRzykd0B(UXkD3xvRl_A>2SUhc2BQ~QYqi%3G zd>3W=C{e*ttar(1zLQly?uB&dTyTDCDoEm^1b-psI7SGzYZw%vG4|oYJNnw!r^$W= z5zhu^!i!jSJP{N^Io6@H2%`E23rdWL*VK82QBaJKt^vPOab~hijtI*(6ZS#@!(C{9 z=X_6UrU+P_6V%K2I#fxK2#GlD-HIwK>!1X#C1tos4;CdeV)+}HE7Syn3IjvYR=wt@ z>0;o}28!=#xIsT(f`Rdt8hi_#M3X`+&hcA+BN_?*9uJ3SklNQm0fM*Mlt>JiSJE*1qxtu{sSJtQttfWk zQ-Dn$#osGFyB34RM9nRwc_)=*7r1aUJk-qJpBfp7!knxs z^KKJHjxP>zZtx_k72z$AllLixHn$%bAHHxX-NKItO?^&Ro(P33#MFQ8ns8tZZBoax zma`9o!XyEj>&Ft1WH0O6?>-GfgySrH3x{3@h_|{}LPE&V%Q>I~h^Rw_UmD$T zi-^b;08WM#Fy_IF}5IXgPIjPd%8p5?4J}c$<-kI})ArO0E>jnICeF2H|dJsez(*FS|()^16 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 c702fd6e58..e7c7e3a21c 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 8776879308..0000000000 --- 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 8046a0c025..0000000000 --- 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 0000000000..0436ce8812 --- /dev/null +++ b/settings/repository/net.sf/sam-1.49.895.xml @@ -0,0 +1,3 @@ + + + From 0cec2c675939c56b27af83447cd75334805023c4 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Tue, 19 Jul 2011 09:28:51 -0400 Subject: [PATCH 189/214] When sorting samples by date, only use filtered samples to avoid discontinuities in the plot. Add brief documentation for running the R script. From 9a1394d7e7c40e4bf0b1d835ac4c550cf6471165 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Tue, 19 Jul 2011 10:34:50 -0400 Subject: [PATCH 190/214] Clean up MEDIAN_INSERT_SIZE plot for consistency with other plots. From 005adf377fb44cc566e58b2f8673bbba87192255 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Tue, 19 Jul 2011 10:48:45 -0400 Subject: [PATCH 191/214] Derive MEDIAN_INSERT_SIZE plot from base plot with additional faceting. 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 3fe626f770..39358dad5f 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.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 72647c8e15..1db7123537 --- 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 @@ private String variantsToTableCmd(String moreArgs) { @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 0000000000..3a52138688 --- /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 8a7e698883bd4f9ffa5f32efa920e8169863993c Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Tue, 19 Jul 2011 15:28:54 -0400 Subject: [PATCH 195/214] better debug output for plotting. From a3cecf0668c30269ea0fc7f301dcdc0263b704bf Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Tue, 19 Jul 2011 17:20:27 -0400 Subject: [PATCH 196/214] Resolving conflict From eb63b48414185469d55a50333acdda36119b78df Mon Sep 17 00:00:00 2001 From: David Roazen Date: Tue, 19 Jul 2011 18:36:53 -0400 Subject: [PATCH 197/214] Revert "Resolving conflict" This reverts commit 87f0d4a8b0627b3be86acdfef5a9f2fc6ea923ee. 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 | 173 ++++++++++++++---- .../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, 413 insertions(+), 149 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 f4c5653185..59d4968283 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 @@ private void loadReport(File file) { * @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 0e503f92ac..f7ea256966 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 @@ 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 @@ private boolean isValidName(String name) { * @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 GATKReportTable(String tableName, String tableDescription) { * @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 void addPrimaryKey(String primaryKeyName, boolean display) { 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 a189c00b5c..57ea5166a6 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.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 boolean filter(ReferenceContext ref, SAMRecord read) { 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 12b48473d3..2fd62ddf37 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 15b16ca6bb..a1c0433652 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.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 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); + 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 e3910ef11e..89e20dad1f 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 List diff(DiffValue master, DiffValue test) { * 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 @@ protected void addSummaryIfMissing(Map summaries, Difference } 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 @@ protected void printSummaryReport(List sortedSummaries, SummaryRepor 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 @@ protected static int longestCommonPostfix(String[] diffPath1, String[] diffPath2 * 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 static class SummaryReportParams { 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 SummaryReportParams(PrintStream out, int maxItemsToDisplay, int maxCountO 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 8e362dcc42..fba6549fb7 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 void onTraversalDone(Integer sum) { } 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 df2a5cda1e..77a992ce0b 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 DiffElement readFromFile(File file, int maxElementsToRead) { } 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 837f352f8d..9c2a520ef7 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo // 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 1db692e9f5..ac67976093 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.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 void set (VariantContext vcP, byte refBaseP) { 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 void set (VariantContext vcP, byte refBaseP) { 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 void initialize() { 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 @@ else if (!FAMILY_STRUCTURE.isEmpty()) { 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo 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); + + // 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++; } - else - af = Double.valueOf(afo); + 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) - vcfWriter.add(sub, ref.getBase()); } - break; // do only one vc + + //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 @@ private boolean sampleHasVariant(Genotype g) { 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 void onTraversalDone(Integer result) { * @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 @@ private VariantContext subsetRecord(VariantContext vc, Set samples) { 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 @@ private VariantContext subsetRecord(VariantContext vc, Set samples) { 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 8d90af65a7..39358dad5f 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.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 static abstract class Getter { public abstract String get(VariantContext // #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 static List extractFields(VariantContext vc, List fields, 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 5a56710562..2126003607 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 static double computeHardyWeinbergPvalue(VariantContext vc) { /** * 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 static VariantContext sitesOnlyVariantContext(VariantContext vc) { /** * 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 enum FilteredRecordMergeType { * 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec * 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec 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 static VariantContext simpleMerge(GenomeLocParser genomeLocParser, Collec 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 @@ else if ( nVariant == 0 ) // everyone was reference 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 static boolean isTransversion(VariantContext context) { /** * 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 cca1eccb44..77159d9c24 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 String toString() { @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 00ee44f756..904a5b29b4 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 void combineSites(String args, String md5) { @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 void combineSites(String args, String md5) { " -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 72647c8e15..1db7123537 --- 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 @@ private String variantsToTableCmd(String moreArgs) { @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 110b41d3f2..581c479792 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 6a47d4b974..1f4f799939 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 fca420816d..f8218148ec 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-) zNa3xaA5(iwl~J)o;M z7y8@I-m2sJ8TkNsXK$J2b%v?A{#5TviPiq3pmWoH>nLG>mUB0R#@KWq^$15+m-q4` znM-UF(|2jOQSsoOEjDLaLUR>DPR`0?^GIWFUE`J}Ie1uT7R$m@za=3L-d> zM~<4uHx+N>U$T&{rj!{^6D$d<4Q@KAw?|Ubb|p6I?QkkF)AZxmJ331&j&-smnwcC&aDR-r55=v$LHJMx`f0wf{~^}+ zW0i-ZYirGLhcSL+g|0V@v{fC<&S1Dp{8HMt;5-GDFGrB3`0s9Mu#w7Okc#tJDbkMX~s2GG(!qDHytw6v7#Im%aZS4$I8A&?K$2j8qkgL!-`l@ z%wb5KmX+qeORA13keX%FB{SC;_hJ(0q%?_x6>y^3CxkjUl^Afm+OXnoO`4xnuQ^lh zivfnT(SV7ONolm!_I3?7^=8?>lnL$g^9MZHx;Sr->MM$b4jsao`)fQus09Q|Yhrfu z82B6XJYF{xn4=SAZh?#+*(fpNb|m?DVeA^b*>O0%INzBltUQfoZRW^yHdJZ)hUzr0QyVUk2+nZH&xQdWY;l|ezuQ)=MAYTjyol)&TM12=Gb^x zMK>@zCpd={(`P-%qd@J7i}1qw?sSgPpMmp=ii)}k@2X;EL`}?u8_Kq^%Q9|pKDeV5 z#vNXKH_`jF8DisV7LO}>v^L|9T*_>N8P*>x%kkk$&KW4Vw5nblh`Y|PJ@C_F*CdFjYiviu2)eoF@UI`OYrYTfg{j(J-lH}G#g-3s z*v0yIqc@Wl|CGe~#-U*U4g}%HS<9XIfj?F#e?MO)lg^e?G?((aP?&IEmS9J_YffYrYNxm%w8Db}lZ0`|rH71(_PV^~HgC|$tr3-S=A z!0Q`$?Wf=rxs?oD;KX8PgoV7T&DIM1SlbiFp#^_+ae)kXAmcn6aiVLTIx?H*)Cl)v z$@}(G#~0s1wFUFK7&5=l>qf69YqTtpJHg4KWq`N9H8T9p*;<85Xs5O;-0R}c=zWt? zjKt*kEB|azeW@FrcOXOBONav7$(uN0hBs(bYP1O*(RhN~o+$qgU=L+gx0rYGdAJghBCk@r*OtWwP8OgE<}$@PZH}rL^Dp^cs?P z3@>n;Uq7XOwH_t3+(Q7Z`uLi5oR+P`6`0_d!~YlSr0d(u9otpEOnis%6uwYySC4)z zJ~`!uQiL&^^seMY_44N%;!$F@H$DvHg0*I*BPJ}fY-T!>;$+x3ZA5zGoxf2`i{T@1 z+g&@q7f$hb;KIoSa52miyiheMU+vb9`bwBd7NiyYCghjrCQ%ue<~0KGXj+^!FPg&{ z6zrXx9jBA2sZ@_(23GeCj}Heu{JxelJkI+5Yo(&l_A!u;cdRZA;PdSOpL&pnQdv{!L#8Dm)sb3LjLunl zn5($gQ)di3j7jyq7D>Af8X@70WqzOYVF%)&+&d`Af6|hOs2omv!NXn!Dkw!nI!>Vj{A|5O~tt*xyaa(X+2R=}%d)`a!2=#-u zW2p0BO?5>10!L~F7BkWIuxm0&7=3=F76x4kt$zPFYeZ5xSy?RdD@((nDhUMc^Aua>XUg&TqEAMx-hj)1RL$^QVoC?#3D zc>zS9^A?x=6_!te#$W|xrSzJm8CWG0QI)t@s^EacQuZIw`;aLMKcb_?^mii%iZJL1 zI0&Xb$bwQgIRtGi{f(zDraID|U0wbD{CUFd!GlACfuS5(**o$NutB@0prW9ppe|*Y zSjJt3#)bb1O! zoh8i3R&DJ1Ka{Qta}T+1dzPU=xQU{I~{SBAQayKKa(f;OPS05wO!Sjc@{t77ddfB2ShIuUG5sFCutqUgJ#eR)QA;BbTZ1_7 zHzngRo_(l5k~JR!`UHBFE+NBGm~|`TZKGf!Xe7e*_wSruf*hK)Wh$bq3wF{B$-}%v zVqIE;vb~xDKs96&rj}qg4(vFoULxNEBciO@4*>Q|g8W zt#Hi}#uw%O@Bn2`9Z9MySb+}}H`@8;PBCz;04z7Do#yiSyUOL~vpedk&e_4eFeHM%`$V^rqy-B z`GW&I)Q0|-vwegbo7O@T6I#DZA7{=L>~zw7!**Fdx~bLKpPb{1HiVe8IVNz0rQF){ z;>2D+OD6l%qGa7dJcVuc!TP0CW5BK{xk-pICIs7JpUSCWYkW~j{L{wPEE1S-%+j|< z{Kqm=9MD3fJ-HY*&yLw|a$LB3iDW1I=GVI)Q2##1|DapPd-%1c^lt?xOU34^f`iHHcD_`d_}f2n@)b1SHWy9=adUt+ zRDem8GM>hls%Rp=N1W!Gj0)^U;>?-^bUV zzqm_D2=a0bVdk0YnM_qk98&r#1HL5%IPvUf2cRB%K=fx`Q%gAc<`VR`QWOjzYI;n} z{5Hf|Pwuu&%kJ*Hy^0#lt!k@2q~{WAuwcb9t*AyrP3I0Sp8d`= zaCUM5Q%~LLuy7_03|Ljj{+sY{FsDIGotu@r(dvnqAccu{` z%4Ze=6oREP!hZ#5gu|p9Agi&r1Kfo3_!nHce6IO-goo3f@(`XN(zxckp1V)FXB`@k zw`fRqw9-SIrZ+o}Gq1gmHxfS27q9(5T7F%#;Pj@3pJSgfkPWz_q8MhO?g4=rsmO*} zq1xD{_S&J-1FmZQ0PkwR4>y*LL0-b6V2x5gnJrd^4YfKX;@`0#*$qe_e9 z2;gA#f#&G`6bUm9gy&Ly3$r29@?mwr2x&i42O-2`*%TH;9uoI78V)8i4WAwzougSg zZTbTVpXqTbXFrbc#b*ei-6{b-t`YjP=SER>e4LS7SIGsI>9pF7b|Y49t?1LQ?E@PA zsc_>oxu{LEippVQwLG&iC%6iR*dqPoj2JX?xm9daIXR&SsI2d^$y=0~{-cO9*vn$p z>!TZq77;j!JLAj{3u3sZ`-yG%G@h&XqliyJt5FOLgJ&&fdRRaedtN z2iv0Q2j7ySYi^^WLogR^zXwv`QA=FOxG2%7FFSS|U^RS^Qo1GLuxlNB`<{j>b0C|7oQ>Vb@h0{U_J7Rc< zWTPzsQBpH4X=@RQP@#>0Pctq((dV#9Wmh0C6@&&!9)89^2pbUDPfgb@X6e@@w3xm+w>X-+jsc{|^E&352 zPwLk$5nwgauHUryrg$=uG%c;f#_zDt_Se&jvS6{g=@G4&oqJxISg1HRn$5N5FtGiM zP#2rrvWhda?t=@MJS;LF$=zloEa6Vr{_a05dVkdF*>CiG7GW zFIQKsVy;H4p#{c_1V{+G{ox3QAcJbBSP|?9O~AV|M_@WJid+y1q026LW0o{|9|oH} z1B#?byu6^}$$RbH{dspn-8k%?4vHTC;4Fs3#M>u^-7R<2+d1ctPs$jckK5(TcvodY zLHzK?7O>l3_wUc&4|qts1ynYQ`VPOFXA3w^wwf2*mNLJ{rEn2-v<}@Bc6TDsdBAlP?@%B4Vg)YyXdQ z)PEXJsy6D%;)uTJp#JA*h!lp}mrHBN0-@&H-onD)Q?b7vA)}Vg$<{+JA8pBAZxZ|| z@jc~4<2lUy^XpG(_S9BT3QW^5LRu?x!~Mj?#Kl2P_um(k9@!RjF~*<6V6eEUm%YOM z%IHV2%?vRz2Oy zKTcFiGOky2^~R(LCn_6n7t_#D-xNEEXfe80OuqeDcggZ^tRar z@m+dUCh6Cv3AHyxfK^ef<_I5g3Ovxcc}%#hRZRy<)*}mQPMJG?xu{gZ&`NlM~>>SY^LyVzO$@v^I2zmvBCL$fWw6pT($)Akd83u$UE59Qks&+Z!>aoFU%GP=#OH_$F`fytmy!Fs+LDaE(ufe@6+N9pgMm?rdh+@l5 zjL+j(O!)bEKO@7Zor~;^Iaz^qOLF_=YOS^PZg7FcOO? zILG>XqIKe=iJiB(nT-m;e(72%AcN51>8A|!G>Y$_%&JtbrT>jNfk*-2CrrP}UL<6; zQd5Oo=T8o{Luq;w&3V02$*k&#SfCSy!yLO(y!>BoDoec9M%P~ZJ!h5%t42#7d^7hJ z>n-xM*`I}OTA_Mop4=K?dL)xZhW#sVdJtD(Z?mZ_zNHYCiAB#7PEY#Fu6iL_O3+4* z%Zrel++DzF3#gd6>T6JDVxb3=__i=Vsm!#Y-!5PS`~|Yp!j5g&d$92}Stg%z8r?)5 z7c^FV8pD#sn%3IWqH3ma%d?XB4*{WMqbkwH2BwDi)_Wkh=kF&tk(YT^h6tNpq4UcI zF@&8WPX?X6tzlE_wSL4UKQ;)~#1V6K3>62~Qwc|H{pa{MX!jVsqwLncNvnkY*i%Qa z_x0Ixdzh`s@dbNtiOncP@InYo@WMR%c%RmDA8B9p3`oVo> zKW@ea)O0~&01nFbgqqyfnXGSrw#S3v^lkB;Txz6t&>-fM<4CyR-i%(@C^$o3!VPs4 zqjOecqC6))yDok(_I$+R;FVn{VNBY0>Olt2s@9o;;o`4V4uJl2*t@b2&alME`MlH+)kYNUm$KDVE;;H`V_K#ij?Dx%~Os2O5zd}1x-&4o8 zOg!fA$0_IHbLaC^AA>*`|BmnWd*}Fl^)@?wx9cU>FI{(4F_2xUH;lMC6zrNQsn9V@ zVHq*3DMpjbzk_LPgu)@cP|(R8F&4!^#t<}EO%k`hN`0SbsquB$&)+i5_S#K4psuS1 zz})d`@Ql~qO}s(y4;DjGp8(MKaW}D%raUzL5ixh8!^Yk?IR=3_2bU!z-dcTTB;IOb zuzckGA=Be4{`9p0^z}{jk}vf^H4-o70*eE=Y$os)fd0tu8^{Z+)UiB2CCX8f0RsvC zGrixAYn5|NRkG~aI>kg_Vck<|pN&^+ek4np8oxb+vXK(JL5x+^X*izC`5zg=L=Wt( z#TJXPBpi&l8+uNx(bo?ChOry3{S`6^vjAz-#+I6nxj2zjU``jtA>1nD@a-xDJ&0x4&xwJz^z}n zdHI!IJG)BRMxcNm{Zn#};&Bz($TI%kkTl^B6C+y=Ps9}0!B%VjsR{X8F3)>mB2d&Iw3NH`V1q;2RDIB&z=qqGVV&j0Y_qh`QA~~-K_c;%6`0y166b-I z{fV(6AXw)xpvsHQ!RILl+aRBmr;&J|L{`StnFxSZS&z_@1LaN`bx=&%aK9#}b{vsN z14J>)4gRKhcB_+xc%P}*iE>A&c|%KQZiledZ_O$tK=sDmHi)yMG9SkKQpBs+(SB(T zx~6ak$3Wu=A4bJ7%u2b@wXDmG@VRY4SKU`JOHPJQ?P(57E|MjosWEZCw7fq9ZlTMi z6&Gu7rJghX?5x~z@Rm0ampi89O_L&lo1Y^ZMwu9eo;+$;5T`Pbr16_ks#vKlmoROp_?Dc3mW@_mi-i6^x)9^!u;pi z>Cbb0fc_2|1Q;f&x%T{5D}km`!T++RMkJ!8c_g{#$i!;pRQQPZ>~2fZd*DEWDjN6j# z2=x@D+S4|wp2)nNrh6f?Ez8wF;sl=Go5G$xVjvTPj=4c6#>NrreUr-ON`g=r_Rgvjh zow=y*^w3r|w@_+|mmf9|!<8n)Bmfht=HA*4Pqafn$L5ikU{vhDkMTex;DtFeGbxwf zf`oU?N{0L}AY~ahSU^%MhGZsJH;W=B^V|Jujync_B2ETTX972}_5JS!vyjHo`Sq~| z3$3cjwy|sOkIFe+>0=oRH}N&>@`PyZG-;RDjK1C4;N4$H= zzSZLgMZO($cf_wYE?>Z`UU9e23CR_m)}`|t?zycXsLjwO2S=rtXEo+n-t@uN$FhFhS8 z;g81>r=7D=)le4f0h;u|hMO=ek6sIhUYxpDQD&qV!V|5_JbGr;1g&XMl4%onshkl@ zx?|y6o$Tf_9vc&ivNKZ;PxjWgt2}z~-0(*TPGHsi>cOJD(7-(f3cUh>{sgQ>QbkiF z4c`Al*E>bm+I3mDv2EM7v18k|Z6`anZ9CbqZQJIKZRg~x`m4@gb?UUXZq~YZFW$E1 zoMZMe`qN9f42sF?^DW$jh-ZvG#XmzdST;w`oDsT{LglByzU4&&%M7Z7C0-%tMd^Sy zwt&ClE6b8pN&$FeTd@~VJj@^{Lf^E|>U(YQxJI=WdAx`o z%`we)#%CmRMR)oNVcFO$tZ`WyLhsj-nv!H`{l`eAd?UFSeO1lJrCm!exWAM zLCAo=aS9{>R)i`-ZP{iKW{kLshPcC$^B`>>^>sBqBhZ6CU#~Ap@3g@(-5i{os?VyzYzM)cKv&9;y>lY zG-~LT#}7Vd;HQxLw_5JM%ZY!9;{RDr{O3KgS_9G@dkHaz9KR!BC8nBW+Qjg$tMQ1d z;Rt7zltPwp^#w_@k^S!?Y>$I5aq2qF(xVKR`UN%Qte%}Mhe zNtKO3g%1VfwAmgV>pBzE6NI1L?mN?7%-@rl>FoEa9w$9++pqu=>Z9NW?){OmFX32z z=o@szud_f)cafl;Irk8bFS=fS;g?c)OY<*1ppOl3KzEg(@30#^L|tTz7k$86I{nEJ zo~p3z2!*8Nuv!iMVm|ZV%tXlc#zefGME7&*B=t=35`&tu&cUN(kX1<41}c2&kTrR2 zlX9_Rx@^HRs2WYNGDZtN)?k^G^%{Jt1JlT>*8ZR%Y^i_@aYPjr=6gX|V-%QRs9TaW z#jwK8B8iVl!@V7a)IT;_@=n_E-y#@Ep-PsbsVZG^vM`h)C$=Dn>|#P%VWH+Bf?FDd z88-|F&35Nw2_mCAnCsodQs~5f9QCA&+1V6?Ay=qTfdOz&q924^HK2r*XBP|r zJ>&gGrsY|r-Z7-F*4NrfJB&uA#ob0qcr%G{=VW*rm51}H=ux7r*BclY7v=`^MIVq} z^EO$EMv!GPn96W$*XhnrV484UNIFnGehHM)L{&s=C#|g{#V2}FC68hNPa680-Iwwq~{=!uSItjVTQ z7j4hO%NQSRBD|xBzxiQoE&ai7N@8@4Wa1M;a(Y7pNBG!a9oA0XTLG2jP?m>{6iDbl z4$K>6;+N;^kd!;!p7ZtVzGzS3@6v=|$I+2v`n%tSjkDXP=@L!6sA>v9wJK2{pixvp zUnGoEG;Pk}a}4I^=flmv#f?|iUdRdwQY1&(L9km&jLxX3a#ZYSiqDwPSiE~qHWyLu zhK;*3<$)R~!XGuej=Nnen{y4?c8#{8cdz5AjG700|Db!7*gw=n33|*w&-!HvZ zv#D|GYM$VC($oe+5WwRkF_MX9<_4VZ&YzHz{soo{Eh%O(g1W|~<90oJw@XDDm~@O+M|7)g{I*-J|(F%0yqfbFeQSK6wr zC6a)u(*%=ot6%FK97Cz3J*qNfI8=urJfgR;omLaY@nMsbjOwcPfMefSoq*^lW@wIl zZa|=&g6mWzYDVqnK8J9Jqi=GdA;+z*5faOdo)g8up588Pqh*S0+26crce+(Y+OE0? zcjziJ(@;Y^e``?7cG{wCXsG7YV|R7CK8ZqG8ALjITr}HkjOu9hOY$ZTm%6cOl?y;A zA`R>N4I*SOA0V(Q2mLH*4|Ns4n`vJP;?OD#1o|Xl5Ai2{7l4FB94O}_Ct(hd+M7|E5Yd;GpOLVVBk_zH1`e(v(8R_Wx(~UHBGt-Fx;&V1>Tfc(fY%F+X$R-u zIEM?vJxWktjJP62F(z+~X+>D4YMsEBp^0nH?(8HfHQtUY3@O{MgQOL6I=TJ}eHALa z+PD&fCKjfGk}1xrp+_CK6BraMB4rUB&`{?-RyOF~M&X3hAVGHGwb2R6tA(b6(w+H$ z_01moO;-cxy~`;$k859Am(iEe>PZ<88skhZwoq45ujhvcSF!eHXXoJeOSIg3NGVW8 z?b;-?)mn#QdtaCZc+B!D-r}^;kB%<4Dk9xOoUNVeTQo}tA{DrUZY9YT;dT}J^jXv? z9+peakBukY09He7-#5)Bzu?{6I>fi5=qPe!NkGWw{kaHNXA!P;PqENzaZ$B|2aP<7 z>0F{_;;>JpLE}^l5NYIOc`=jl!v42e?ek`KTDb|)GH@c;AMn6G$%;(CyU;DHA3kt9IPvSY?h&LZ)1KR@O%uw zMURTzTvDI_f6lfMasZhKxB^L@>=lO!$KLHql%3%FOOW>>^S~vO=Rui$d_EF0yn?(0 zz_Ks`DaAOzrtUQ$j^AL4Y_jeKH^~E@>oZk_p4I}ogc5}L+6no!6!xqX=I%so0uF$+ z;%p1@V;pQ~?b(8R8V{ek=+1-Rw4@O(tG#9wglK`AL=shO7$sXGBfJhBTgwil&2qdMsD(NPL<4v%b$1s9hB zZ3pw2eOzwc;2m}&?U)6S6ZLxO5n}*ullQ*Yq3(lp?=Gs?HjInyqAfepLH5S{{Z$4BVJg4?z5ipuLoNUm z%eY0^$_jL#9Epokfj%It0|; z3^7O(X}jux9547N{#s--Mq;pB@)lZnF(33MqXG&-l2-ujmmAiu7s=u49Rc<3Li@vfY0kte9{`rLnb8nVjU!Gw>GiM^;+ckO|r;2l|K|$8|l8y)RX!vdlPH9pYXG zLDoJu`TP3b`OkOE8XKqn@FHAfWq zQ#Fg*bjYVsY;*S7;Z~eY7w=7$#m5VJC;>sPABblLy6`b+VW5^moSyH4dW5CG0OPC- z0Di#mOp%x%#}0kp@~Y+iX3!6vYLA62|2-cR&t8}-lb2{YXJglOQP!gog{P*EsG?gv zL{6S_n2Lv{7XtP8!n%%?x)&EBWM?U+P#C)k2Frv*y!zhtW?gKaLwRRF_MvuwFu8;g z?~Q}8E@Vo#VMA}n;-dYDge6ZZuUWIRGgb?11KXyMcNvv8O>-Hdcc_)b&Bx2js(hA_H(vzt`x3Jp7D4v&VAXG1^2L z+CrM5I?ztt(*@{EB?Is?PqvmvuEpQzl4Ki!sDThC)(1{yC$P-%dwF1beRuke90jPF@o)pf z{`{X1M!L(4pku0KOhHkT(xe)O!OBgh=QcC0=DoHOABu}NGq7sojs7XE&NUR75S1-7 z-3pI5%e#awrx4R9Dc zq&GzVBg)8)&~jM^t~GouX}7b@3dfZs5*@OkBUnPCRQ0lfD2vQ(uz^8TBFQl-6|Y?B zj9-Hc@HSUX+Ut~YasKutwl0y8=$6o~mGP%ypI~F*Sh5q<(CLx^UJ)rI!6BJ<#Dj8z}}i6I(Atdo1b=%S1zgmebl{UE~_Azs{u5X-b9WGc79cY-Y&USb7T@po%h zF0+W89D3hiMKy2dT~((SOk356?b&@7NlB1#(QcQmjcEy<{&Njj2O7@}h=S6#TSFa9O zB>9_$n1G&uE(Q)qF!_mA<0_NyygWBfctlZRLAa!FE=0N2`0|#Fto9){ltkUgD&A(Z zZjE`@Fu}eF=;jLo)s!|cSWWuaLc^38wAqF)hk6^x5J+f@K`ksLObWI{keB9jt82ff=`EJglYAs% z@g3iwci~MU>v@OdWcRRspJ7w;B?4%PGWb_1={EOlf zl>GJ{h$y>$vn)ktB|!#DhP)#Y#~bCe3ZBzso|H*1@m|*{QLCsY)bzxdgK{I9Y)tkLv88HergjhhhJ&Pbi264Q6RX#sPZ0J6SPaZEKG$=SkcM5g@cmV32xrmdo zJ%xd64cRLAAxwWkia3P=;&o*hI5^UrxnHLt1>#kWIehRFc*na?`6Kh<+gpBjw|rEb ziw!TKSDpa{8ng(~mv4 z%*8?1*4-it3MUR84hp2wZpDoHa4U{gf4qG`3PX#tqD<-)fjR7)t}1H_DGp>49ISJw zA#MS7-v-hp|-rWwR1~n zY4A5B3jxl~Pc>QIdB1iy2R zxorxio1F8F{QP)K*m8%D9TW!(z+yP1fojS0%b$O?P z_lmt60rA@>zjWl_jg%yBlJgh5v(ZkRF-O+(c8y)Jceqgw`W8sE81xv~j%9r%W2w;TmQ~l{~%CLFCJQ0~@$)|KLm=T6y!JY!M59=+8^ngDx zW-amsBFz~M#z=WZ0W!ov1_1@vNK-Q(ev*2hSBv3yX6Nc$K5ho)H;s2cTZekh>{Df> zU^Xcuc0x8_ar(BnlCc_-fVh$|ojH?{O-sC8rKs{CzC!d#kYrv+DPIc_d(wA4w*-!s z=}Sx{8l_920{`?f2Bs`P0pkyKf${nGkWFI3Yl)5+=<=gnskIrnIvxHdfpH1*o0V2v z@(rZ2C}vT^QWmL%*$jMlX&=w4ToYE7sf5)e2A{#^Z;f`6cPB^!YaaxfLQKCAD~P|d zjg*4!7GPDj+C`DYc8;!PiVFREYa8QVoe+;CR2RpOa{4ItPD6@6gxTMJ89&?CCodNu zhb2egn>_bnD#*^NK7naf(58Gd#BpyQaW3P}dc*0x-D`CAa(c+|<7~2c_DpQ{>1*Y; zzIAtyHKMW3;tD(~7g&6U3QZR{FN;rnQwAIpz)jRShqWw#PjhG+N1{ZB!|>0c%p|5WsER%EN73$kQPz+nClD73e zEh=3+Br*wz@u@qBK1$YOD8D(P-Do>d&JL4}T1r;hOfO$M44FK$xJyd(IJg<&i*az0 z|HF(;O_^Hl(d9lbcqPw+h!s~Lx+#8!@RT#(Sm`YF40|zEnMt0ms8&PoQ-|4GkyViu z!#W=UpID|%$IE23mvt!3lq$tZWTG6`U=>s|e>Vo8&0<2DyyW<3+qr0EMr0|AXqv3s zY5&N=%1k@g`)EmoAtCOw-0EQ^cAQhPHKp~u*kWz5Iyepo@*K)^M(=exY+Bw_4<1nW zc_|baIEP^dw5*XM;v&+PEdqfY{NWBM1C)rcz!ZK@<pvC=;L7!8X% z#mymq{spu&Xo5_YG?p!*tft1yBWp-7&O6(#EX%%6whElbn=} zS74L?iQkO8}4DL z!KyoGEgJ(A)a=1%!Z2AhSv0S{7f#IYbB7ZqN3iMsB~Ga4gET}6?7;ZVo3exl-B(ah zuokPld>}e)e;k@0?|F8lB#Hqk+O8yx0P4(Q9#&Ip$oH`Oh&3|!zIYiv__ATxBT4WR zKo4?b>`i&Sb4)vAtl6v(cO9r(uFbH(sAq&&)+=a~ zrvbDDy%3@5orgcQ$F4cSVmHUp{oKh=nI-vx(A4di*mD^r{Uu3InKyhN$s%tuXgA=r z=;a>lbWEs=mkYn!fh%hhc`eki7Bf&5u{I~a=;hnGoAQ=#u{8cddBZY8i8458S7~*f z>;piR;2ulj9`{$j{N{>@G@94~Ya_p!c;R?=8vQ#>IN&r;bw*)2_TsT>L%vkhdC5CA zVI#R~JsPWRuzU$NxwlGvbaL;s8E!wovy9{m{@pOZws16QkNanl7DtQ*hgu`(lGD8y z+g~ny55)A|C?%ZEDkwJrjVb!x9BS5Z8S$cki`xQDDr4%8#^96gD4O0l37ruZb$YPF zZ|VgA$K9zX(_QX_eGBY?)W=|d#7PfvzN;j?*g*X$naeoTo2DQO2^$zWs=mM5YYv~ z$y;XpA((vC<`~osvS_atMx!-~!|2SZsBbt%X{F8&oWf!`Cl!=;oSs&4+U^l8#hiku z^=-UEa(V`wdVfn7vZ7{c2lzugFib-64-j6sekkAlXqS--+BGWdb~^nI!D z#fuTzsYJ36qd=ru%<1woQt1--YM~SiVc>&<7O}02tF}Xp+a{j>k0)w%bHGVZ56(gpT;&-O# zUAB1FZ^Eq1gX^!zW*ijv<9|DCBf?}0>~7*p7yofcTOHma3-#JPj{C-BxS43Qr<8+6 z2e%fz4RU`axoWvHXvqLhDKeqEZnfUP7?;(Eg~OCX_`*he(c-&vv*=GPf^6}J;%LR| zWt7qlPWHPTx}Yj08$80Fm#sTcs^D;N801THZHruFy`V|OM;@WRexSn^8Cn30bpugz z@08=x;<(|}jY-AQZ7i5Qz!il{B}|6b7S^ldV073L*BB*+bsCKkbks*YRhN_v9_L@?ID-PA+=ignP8ed zMSy1oOg@R!0|U(vdIivKNwr-{S^J$L)QGj;66t^EKwkptxg6%^VrQt{cgEDFiK!By zu08AzbHsi-l3pEWo6%tAfBzirj(=O+Wq&HUyej!?ToIXS5WOZ3;$y3szU-Q8BTXO? zIj+jJ2k45+{Ywea8UxWtY0>-3LiP8?B<5F5%m!`r(Urw&*^BB(`Eg$Z$0iu&v`VU0 zb5ti6RMWYon+40KXU(K}EK!|6GR;V~iUGO`xxf7YD*)u`PL!%#N^P~sdW}~}vfdJm zd;O|(2EpOlfAEITS*g+2w+#evaAmk;(aaDWsa!_z_Bi)E>oocf#nn{RSwh|tO&^Jv zH7reEB{qVHB9YIwX*s~^9DAZQgg%}c`UF(Tv7awYyalP}c2hnuDxK;H=hD2kEsfV)E^qBpQ!9Hk zRmq<#0>|F((jrIvYA2*^dsn>LlOnv+2&+E?SCi`fO`2!O1ZWcMdfrD24|i^GHB?Y& zQ9!NuA0L`II&aw6%;s^;u|JKR8tXCiCWs2p{ZuOMmnCwz!bW~>2u4m`UpgToWytIakG}hp3d#<@`KC){gcZH->p_2uIBra(P&iAxNbf`!8RADo1t=n=a3vzOrzy<%Qsp$>>_ zurx>Dhy?}}_PhEL;|re|L#hnNDER!@+g4h2_Xl$3bmeosgSaawc!UlC-kx_7Yy+uus;N%;$WzMZ9i?J#S)Ib@v9U#ICZ!yd&X9 z%7qlkgp;fU3-q{t-4#JeBwung$vhb6o|xwTg7e4%JGycC?MH5xb*}gX38tri^FrgFBK*b=KAMzt($w>aF0`PZNUbXT6jE|E+iV zpY{GfC(xsRdJaDfJm0JJ>J5r(BM!i1_O;;&6cJbiA_6ipWN9|>2dy=_!rCUO6~q_d zFK|D9y^r6JL1p2-3xofF@Gi&oBVY25w{x7X?|F_nFR%IadVteL1W^ztg%O6UAe?Z+ zh=}`vLE#G_3`F}n1H_>4m>-s+iCV_V+Z8-boTM6LA_-G?XJZv-C>OP_2_` z(020QiK{IM*;hl9t$0YjY?Fvzf zB2}`Hspmiq97{4vq46f2q0wcGZ4DHM0VcJzYr!<^1oZHU60(7g_Ek;2kE~Wy)l~ZK z4Lh1_SJ|a^nKQ6!uyWc@h~Sg1I1!DFfGeX4VJz6EyJD2qnYYGn@@%ryWTUrL8M4`8 zVT*z8q+)|9WS0%gKW;aFGuKoxO8QEG5N88=0FEbGcbljCO&3A3;CEfz6Us0v_l{u# zXMyV0zJRW8;TrSH^9^U-Oi}_PZxuX!A7qHJAdRH=Jxq!0N_T+37I1pHSVp^i>&Z%| zJBV;SUJoT0AX-(_ipVFVmww&>>=fEK1YZ6yHm+DsISH4N@OZaMsHQ!Y=WQ@KilFNt zEA_4T7$}GA;PHL?+)a4))A)O6vhvzMSc7 zRVq%#kj|>hx0+B2==`|~qj0~q#wK=|jM{U)n}88*T<7eJ2t_{{WBK%K*iTDvvySWv z603|m1Rc-q1zXULKJVj(A7JIt8d;<@nCL=*;fs4@?BTbY<63#=Z}&H4pq4 zN@o7xN>QBq{Ndlyp8grI1V2M~ocLK82tS4ylK*3c{1>y~-(h+#vQkn5zYxCIe2S{! zgS3lF@%D#6YjRlR5efnVc6G}(a;L0PT;~DsO-Z{oPc)Yn zQrQcG%M@;=@FpZSN&fE1LY(_i8B$tJw-No!0EhMPkKwoZah>X#Vo)F;95K!?XA%w# zqqEQ)OMjEmn6_%c znRv-+i<>X_CnXHDW%Lskqi7#388>7;Wof_M^F>S{GqNRl7BD2W18|@*gunh*27#=) z^)L0GvqR{|+4^tLg8y#w30asKILg`oV`a5-Bw_r|wqCH3&Ohu8-)XjG8?>}ACPa|@ zet98KK>lA*n8Zje{+I&Doj0?n6e+G2+z<1@bX^Pz^dF$QmEnxTH^3hXAqbcZmr9VrKl7IoeX5z1sGd7+9?Z$rp*hSW9qqz@}ky@P{$L4X<+RJ4WZ8b)J z2~>?NRR>_DpF||$+4t)w-f*~1cn_`E|oUeaG9 zR?)u>cH+co`~>$6%oB|_GE@mOt=CaBiY*q5m1HsrGi}EBhPp|0Om-4>rulH+X2cg( zqVXCDLk*%3V&~7($#VL9Xb{lr0;q1Oa{37VTd_H<<_ko-GUqFzA zeS}EB(hyk4$Rb9+%Lqa15t;@y-!bqQ#u(s_c?stJG`o~9Ew8T+H@h~-pl?*LGOJXr z%V>414PCu=UsqSVocdjLVuE2LoUrd~y6tow=iKi&eK}qE#PT`q00S&nibHfb{6OCK zVCOsMdSwVfZpb{^)_OBxJ4u5GY$5x4X_;P@5wLFAJa}mWS|smXF}*?`wk>v>5sJ4_ z1wprI6|dvBy-Y5Aid%87;p<+1`xArlVF<$7!t4v(eblnx$A`419>8h5DQG;_5%A&l zXSY&^b^LvWw76olX9-J6>k`UnWXXlu*9CqKo(+%yeg?m#oO}39;UQnkOCru^v&#&| zXSM4@m=!(~T8jxES_>H)bOY+Gu*`=wm@0W|;w?hpt&&j_e1p-A*Ux?<u#NdBI>zI&E-0C2aSvuyAy`ER za>L32Tua+(&?&2RgX!oe_|1c<8VdTYI-b{cQ3CFzvcEyKsm0}3!d^zkZ!;Y4#9mZ1 zvH5%*n7ipxm)=5)80!3(f%_S&0tQjk%&?cwoE%jZC17_(vH9>qo#@DBuLQgON$WsW zYSMy}AFV|Tn_dwDLOeKFr!HuVnQh*V{8{tUAx7DmQ-RtyJ~?WvgCFB2#OP1IL@-Rm zcw{1@+y+dP<~BnY>lQ)N^zT_p3^b8Xo8c_sR9@Q=ROQnC49Yc&j@+(rqR_kwC@JI# zed${EtT--MbIiFYO$o1>LiRZ|FXfv?tQSyZRr3B%5OzkJP^c!@hPVe)$m(pJBTv=&4Ni`ebrdyjanThg(FWk+ z<)l9uMr8#=Hl7_eun^(Y(44_XXsu6wja-Q=&6X*%w8bs1SqQ1y677bOfe zbBL#5Je~yTjaGW;(+L8l5mKFLvFmvq^!l;#-&0sv(C!?|RxqVRFQYQ4OA!6C!!lPx zTf@6rX9uC@M(p`lKG0xO(^?_W8#-}n$l|Ltfb1H0tV(k9(pLj@k$Z+8$$SGVjcKT+ z^1^q0dhh{nB2@zfAUb+yjEkei=IsDyefV zWL_H8wZeTJ;f+9_v+S9t4G(0D8?XbWAa$lm!eF56wQndORE$`$e_v(jR3QhH1J+< z8ps&<$&O2>HR)dolZmp*894Yi8h=t*D=sIcar}~{6atk|iJ(SRMZ0OVCLNG5-NpfJ zcUvqdA5U+<9WV+9Hl!qxNoOg^KgzW9*EFvXF?8^OvvfCHl?@V0lvS2wt2<)i<2fO@ z&oU`nK8#>31^r>E#<+33vmju?3*p^#-}46D~&Ec`8Yb zo_fpB!&EXmjH$w&ayG5xQ57GdKu)vm1(cRpY8K2HtaF4C5bWEN&5?k^-^6^zYpfL! z+i|ni2gHi-zY#V|ji4USd`7E|Uha>D#X-K(J$tWf>E(eM0O>F^GuWr~$U+Gb_XQ3k zO$sCQ>sue5@Hbv5?6gl2hgTzJ!JE4e+%^8*DL+W{n9Il)S6WF9;H<5r5KBcd1riyD z1ri{ic$Onv5y*GZ9g+Yanddx`=y?`FF@@pOdT}UIsQc^rb$S!6iCAp{K@=?Ek(^q|b)geCNWY$G9+0E+BHqeu$tn!_W+;O!MX;cA;Hwty^sB{S zWsgU}GIq)gf|?C}+_V)F^d?&*@#6;_9};c`pmLv;dMb}aqF^1Yp!R?{p z=RXXl4_(|-of_fpa>Z-POo+r1NUNjz$WYSA8ifP&h<#5emPzMJ5};a%qpokV0ddC` zap6C%{xL|yG~tUvq^&u76+fiW-P5uzPA+yc(tuiODX>MFIE~KeW>HnHlFnBpQ{tcu zw#RaTXJa+_RV8^~?CD4rV>>AZU)~c*xRD)N=)x5P;Wm9800T!VWpe9YRKOR!6smwn z8Kaz)(4T>V6+?ht4hHRv$B_Q2|C0|s^8Qc_Fml1oUrH~2liyNF#8Yfp!T*G-V zqjY_N))(=3cybDF`J2)4h{cb(62aJuutI~8tyZ_O-mo!ICH1Z)H%aa7nTE0T}mb0v%Fyroi?91Nljs0~g78&4YRbmbH*^Zwd>v1u2NW*F)s%jZw$%IUAyB9- ztLq`x-~n^}Q1V@&)j47-@ho%@pl+aUXNS{xGyL3ruM!j-k_zg&ATM>9qK)uJL88e0 zr8dP{+=-VbtUv3cci)=Y)ovVd8+!nM#^wrOMC1$#{jG8jEfC{k$^9Z%ZmLIXV5PgS zU?2tW#Pg3K&|EF}uA{^^Np!)eES?)J)N4$=Xr-22vO4@5RuVgF%s^}>amAPT9L!W> z2qLIAPG6Y%-Emh;epRoGpqhO~*qi;4PC2>Fyu0H+v7#;zv9RmiaTZ3k9Wi=2Uq1T= z{(lSHe};!MXUV$1e(qh4KSl0O4E6tq^e<@fuiz0MRS73-6@)L*1l9ze?L%P=V$t3f6-(U%g#%rPub5_M?ct@6FF5zyTZw|(XPt^_JH=!!#j z1r+T&QN`gTPP3gkS1Vh3ep|f7J>Q>?>;N+cKjhuR0f=1}U+rXtFnzF<7siPUPE5NX z27Cbs5lm=AXCi#U&&&_?i$Rx8)IOw?*Q<@H4#ERm%xlS$O7luh5oRe(g$|tqrGTVV z1l_qQtEOnwYC%VfF4JwQ6BR8%yS)-mv8iS2t0dwY4+L z<_g=@6cgnJ&KOp%KHm_{rlHCpqtMMn1e^t#t(>^o_{n3XNF*T6O6hb@sP=MB2=qnN zK$f`x6~$p@^ulUWNJ4`md!+V=X3ciiLR+Y)Md|uKl}j$AwO0uy>lL=D zpuj4Crs06kzC-noW`t9RaNGZQ&Ji>Fnz}l3OBRpdhXR83nJ_F{82XD1mLx#t5V0S$Bb6HlS+ z2ADv7L~NEF0~@0Sw52^5AJ}&R^V2A%+lQfOrf283G_Cq<6vr%IWri`GBJSXY2kF@j zq|;C5r=n-V;)9NxVsO{J9{Q~5Fnd5x-MnLpeheY@;ad_5q!{d+egXm#S$fEDz?abj zi!7G~<5OcTu{X1q=JUQlK~72_s%cPmeSn!pmnU{^J<9_c!tkW?k7TV~@gqd8kBxMG z#1{bwKLUmU^N^F4V2Tm4xgJo?8)P7&*qwo1n!lNa>qp@i1)=`&T)@QQ#KaklzX|7G z8EE1_1M>asC5PK2=!muGtrBb*&M*qyf5-5GUgv?*z0Gj!m`?MtNC#(oypcF-E`ZjT^Sm`y%8_cPW%E z0e`7*H;LCC%G8rL5_wz z4nsXQM$Rn_hqdORQ5<{k|H^rDR%(!RT zcJ@@4`u+lO2mEkV+p09PLVNat#nheOBe~2*Xv5ZES88F{qRHOi7D0BAaL#iD1X=2V{)}LQ_bLD%V~;C_kvf#| zx_S0zSH+?G>E8sae>P1aL!A4fAHmAx$8qt0H8=lD$`!J+bvCheCi&S!|B)^KQ@Dy& z()zJkpnR2VxptVur$~t)0#?t{rHb67{3a1MoG(feh6%s5&_vVTyvo=r@9Wv6odehN zxt#--ww7ku1Ai%uGAn69Dx-wwKAz;0IX z)E4S+@4Fy^=o%|IrW=gfEmq35wrN3rNDkanND5a8Z@T#Y>WCO;CK*y(01@qt74)-_blj;Q>C(HHb3u+8DNli^(kc?A=Z7QU{Z&(+}t?I zr+&W7BO^Dacsfh7n-FsFMGQT{%i>mhZ&Tm$plzRD?llVqno z2qr2|cjSIfphlT^{{U^l?ti@Kc_uw=+2qZQ6cu-N(h;E60oN*C_o8ha`Q-I#Xun<@ zysHbVC}sTC%iV^;GMMt%9dCfimABSqO2_E04M*H$`hOUEr|8PsZ4I}oVpPSpZM$OI z=8R`-R&3k0ZQHhOr(&G^d#!WUZo93E)7rcq7julSe;rSMU)x_Gq>RI<=t7D5C*h$- zQ5~`)4w^$afhSBVOhz)9F*>~`f|MgCf5#s@+%uB!caV6xlk>M`zO;iQBBc?hv(geM z$+^gZq(s8G9U@zhcK*DwIykl{Db>cQdW+8eylf@yWOQ^o(3G$0}z*@i8su=zqmMM0{~Z z0}aE1ki*N2&A?n_AN$A(FRm0xE$ek*|SQS#P- zncgvI31`aHx`^M#uy_$ZCmYSc$-;YZis;otRZ@&QQUYD)$jLQ{v5zqg9HiN%i`W&8 zMbH0FvmOLKqU7?+Bi0uAYsu)pkZ`XQ;Y5XaP_@JB(u4 z?hYNV@>2?5IaBhbDOdy)s(}(~6yl1hs~Ye-fZN!1C&swWM^a||*GRd3u!>>AHcM0= zaY+r*vq*6jmvkqZp!zYbF7CfpJ|I4`5bRlI2qB|{!RwqU__PFn%4 z8grUiF=?+cLX6Xb&1pDefrto>iajzD&sMG&u1>69aD7GdeswlAqg>=H)-#Qgz>LBg zlenGxMvV7-I7c-ev%ZPdd~+)4hF1UF#rhLg_KlyBGe^dZ6h-=9@|i-dW9v(?1j4I8 z-n3dORZX)o9?c#M23`LIvt_-4@tbuVi#5*i4s`~njs%Aasnu$TGz({P$a0fO7nmjJ)&mdq%B8@sEooT&u-N8X4vc zsUNDiwP^!N1d!D^=?G`G_TEUR_Pb=TL5qeN6zuSUOK6CaT98fr)QM3|GW|YA63RK* zox)iaH>XZZf|V_YJzoQj7porj3r!s-L#%e=7gKoy&`>V6V9$)ZY?lLv1D4^0^Vd#w zuJn+6d;T88Q%-1-;~OO3 z;tjM{ZuTJvBdyMx(ooqGM%Wu@FjDH0!y7i;@e`O=$(|#ISAg!>(@(FmJ!coep)|V} z_x7CKFTX1CFut9s-5yQo!%Sj6&JW+NQx`06#p-M1RhBy5L~~%#-m1tfj&!45x&fDc zh@k`ps+1lCmi9z>@l8cE5MY^5Q!$vYS@w*0NR3DL&?>|UT&1Dtvz5Y~ACQ5b5$;>) zxJMROmrgs-E#YE9s6onXPO?E%@STp^d zJVd&)UDOv|?_J)qWoE!xjF?rYIK4E{UPiZz>sZnp<8n~Z&@ipU`6QpwEYYl9XgPH0 z*TFDXclDimx~8uSD8GFOBl-Ye%8#`tk(05924`n3uqD>IGQf*=*;MO1w*F)9vRWNm zl8w}wo@|v-m4q>`L*0C5c_MJ7hn~Q`-U#!6sC!kKDQs`TyIi1u1=vp zC?8&uHe!)@Cqy=+lZQ+`pvl>P0^asE`tX12&B?qRPM=z*}l zq>jlDWlh#O@3L?dOZ%8^lPHlx?6K4tAHiFevirgVr&B5Oe6V{tj-}0&c*3Eee`V_! zBcZehi%a*I3jd1B>%lJEr~mtnRER3Cr!QG0Fe9q{)4cwcz7PgR7>&5J79$6RpWq&} zGD%%Wj~sI}XS8TKS0mG)a-2I9G`9JawKZ zxq+(mm;M7kC-!x3OUie!x+=yyP7ubJo_M7R!|O$Q8%>N>7>s({z;S^etQ?o!EiT{{ z9x(NHDqEpT(>_hr8?fG?1j0}``LpPyxiYW?B z|5$k*sDp8Nu)Q+raDqir)_TGNHazO*^>?QA3MH+TO`^A0g)nHE(@($j1 zcle+xU2`$fx}+%fPa%wNC?oxZ)z9p2^#FCC%S}RK!UXqjA?rx4xFtb;&s4v6H=eml zaqaSpp9PDH?SH|KH%!jYUGsC0#hs11b@-93wB%Yie?b3P&d#50rG99b#sz~3a;v_~ z4tovIqT~EiYI?v(*f9xmYk;R2^E=NihHasYCrV#r;>g*tNn0e zMqe0;|8u2Ej{9>q*_1e5)O%Xc+Xne%u6TqkiWt3>e3qmXv#vfPe7l#xocP?_2KIz%0nkrKDi zW(P5qQ0O#_g1V6$r{osj*ZUo(_&J{dxZbtHy=Ru32(39jd^&U%>Tme1?PUwzL3G|h z&0K%dAiY8-?9WM(JS(9^Q|gK*3^AzRn4d5QY=uSUXg$-hCS(-Hn?iW6?Ngm(X^kYz z;CZ70L>V-BIp!DFgG$m>=COYes6G;&!bR#dF5m(Fj%ZYdzsY<48gq)RCH;*t#uqGv zQ8^`2g1O%JwjTC;Zv}>{2jm?t=jjjT9T(#pBwAC3 z)akJz_beR`iwV4a9+De_r`ewT<6NTMyGc$4ZL1_}_Vj;hqzi60L!~dmgX61CqWv#P zIGP&WQLQWifpdek-G|)pW;yOH@b5uStA?FFb2jSaF3X0~Q^BeDxv>x>beA z!T5`z8<9QM3oWF?k;G;{lHi1|d%m1*`&X3wH9#?vQ#MlUC(kE`j@G#T*q>vN>uEy_ z1=^)yVq!L8+?HIUpJv1)LzBVh968J_!*##}_9}rQwWzh@h3BU!)VQ1kdASYP%xewO zf<(T;w&VN^shqtLbY;VUGg?RT!$%6%Lbw+`FS~mrkTL>a__YW==<=%yd#AL ztp5^<6)RoKkSmnA-6u9k7m<%<2X%?ILWYAw%VDmci6E_^s`4b!duPrpv6V(&W{~$c zHUMi4)DArKZow$+%97GuQ>wCh8}R|r5b|k^6O=wtP*I#k#z^r&bd8gVnvW?`tI_Q_ zkHfHgIDvgmg4H0^B_q5>WM|8{W2Cm~$$fq22rvI-loG42Ug&RURE9BzDegynvQ-m6 zc~AGB#@|2My@dzvFlS$lKa;PHOXUa>6$d7-9g!xlUxaNNxU_K4wOoVlZ9tmvIz6xymR zHnCbzdwIN)%P=_IXoO0=QNal=IClH978LhnfU-g@HD_Uio(hBr)`T%}r;zfjq&8(P z!=v;xbzt7HZg&+-lrBc~tl2E(611Fq#-C9~-Iqdhnh?rASSL*a8$E^&Ck}GDcl-TTPVveXdbYpX z-!x*@R}u~x);Y3w9Vy~nH5+6m8PYmBvT_u%Nyrd+FWZ8yCDIH9y%lr4AYl$&SLrX| zMj4lzsXIfP+5URXvbIFRgr9?D77jS3m2#&lD5@|Ma#+Ohmh&>ZEa09_W3oGqd@ zG;Zm1jB<>i&UaVyDniBT%G^IcQToJ6T=4LU>1#&dONNvigFcR5;DcQie1ABCk@ReoC=-2xYU{pOqI@D@j@uCJOe*ab;El` z=Bb$Css->VKXcW7!Mf(jGtT$f-lGn})YKg#Llavf9QKXyb{}S-s<1s3hkPu!^{_*# zsuwX`W8y_P5XD$3Y4|Na$o$iP{id}c=b1aCM!8)u%ATxagN9k5w}h|N?4Xb0MPB|} z3?v;?ZNRVqioo7lJ!PyYjAz?!h<1Jd<4#nNbIi-{?07*m+3VBlfcaS@6r zDW54jL@>tDU;S)->*~fKpu(K10-JwvkzT6G{4`|0H~)4KCZLRd6H%#@dt3e|vl_dP ze?$yTBxnTUqN*Q2HmbX_9hF)T@ygA{432hq$4mH3KF9eN0eBPvxJB^16z(q5lduxm zUI-ri^%e1l0DC6{$yY}Q!E{BOThxX?+#$C10*dVxKZd3{XxiE1Vv7K>3w~Bo;g5TE zm!`xM2;q#l7b+eBUB6juWn#5>xSmolhotxO5vBs$2~?uHpHUk*Es|XCIheQX<{7@M z8*=-Yhv2%`3+bM~T8M2W$J+%`z2wbl)OC}z=*ufBGfl4N^THC`(Cg_aSHKl&K#7-+Rz;NFmn`^IE7Vbuy%`97I{- z$DOjrgz^kmAM7Mi^AmY;s15_&p7>*G-n2p3=S5ePkuRt#(OhX(S{}^)z}zFkmoL7p zi;An;Ib4xclZ14nB-R=ZJx68A30f*sz z30;4@@%TCNJczi31*M*8BBw@j-5_d=EiO(>xs(~kFV_8rJ=DY~2&4vk=|Enoa_MZ; z%@|K{WVPtUJK$A9{{S0|@@VDvfc;zMd#U@l_6oXdhC=pdbHf!H5EV-apyOxIEh})jN^Q3jBAB%NsW;ph2X@^BbJj00h=AsAa>bi)m_j%@6meRGH=8i92>K^5sf%X+8SisCSHCI90Y z`OwWT>QGdD2ZNO9kN;)!@eduluKxQk+SkWc{zb?Bw}#ul6@C6iorwc&EdO69GC^_8 z>dR@6CoSI=Q48}&e0_a1WuZ9!JUo=kHv+kZ(BOPmdUL#&`kJPQu|Zmkwr;d*A~9|d zL;=XZAW!7|#)Tul;YL7lX=79UM>Q#XoVI67IP5=cCnILf7DJkc=JHcyv z2o9rmVv$tPisc@(PihLTUxX1C`foTKi7;iy^nqO*mF``ho=Cfa+VRB=h?OMn`6^aU zTyvhIu9&rSiQI-svXj9jZ_(^5c4=15zJG{aKxLTzLvb(7!H|IC(5u~7)ck4TL)AA7 z=k!X58<6Q^0gg$k(QK9L&qQjK4csMFK|hqG>+!E>+7L*~k=dxp!+BM8K1VXqY{KZ) zbMpILtUQt@CIow6_}pV7+sx26t6KmYt+E#nB)iIc!kWahNjdggn^<(Z!XqhOB4L9~ zID+6V9Blj`nt4hgony#uA@3CPcf+}6I6;oZ&#mY+RC~)aXc4K?$X@{*ly>4rkQ*4J zzNs5n$B=-ozrs2_HQXblz`cxl3DB~+1g+1-ABM=_DEgW57F+N3sM1EDe1xWu~8z51L?S&t+i?wDSXCjZg6LlS1cDs^rSE z)mwf?Sz}Cy+VlM{8$sJI6PZ$|@rbpr5cccq3;X|JA|q*K?QEr@Z)c`&m4> zBPYy%Fdzp^HALn$Hk{^C;pwe27qm4><{(ox!>b`LCOrfiT|tNks?9e5vSpS zMbd$qc3cr&x9f1vqEyGD`mUh0%&h|-IJ68Z566oCD+&QBs-YWErcmOs&%caNXQM^a zeE=cF#@jU0pW$zHEEa~bd3Zi{4qjYt{Db0nB9)4A*l$z(&T@>y8BkwiQ<8}pnN@za z6BaAqI2)`FaJSF@B+CCB#*}5|+`BJfWD3mxPAC5hRsSC?t$#rEfBicV>J|=4OO79r z#+U0U`oupGiKb!Tl9OG{X8;hW?_ls++uDU)W z6wyZdF~~@!=|MC_WcMUwh+dEaXSp%Cq-!;tE1X!YUaPdVE6{}AA6lG^L2>B}X*S#^ zTVBuW9-AIN9uPh*t2#Ts=@EJ13SrAW-MAuk;rT+qV z_HV*N<_HHWrbb`G@utA!!^qyBVm&?u)$@&Dy@}`QZlCt>KR|U88>*7o$*88r_5$!b zL+@(ea-}}!`?H>Jj`+(F3=N)A&r=`wd`;U;cj=@&wDq4awc8puoK3T>jn;B9)|#R$ zv6SWBp&LM2EOSf&VeaMQ=@;r+S{{l$OL3EhVI9z!Y93L(&iF~SD5pWQ>h449^-as+bKCKc_<;|Bxfl)lFNQKssK zC>ste)@UfHTQ?=%v>D1Xn$3oG=0la=RY z99%UTB01&At=5(&V~uWDA3>D+`co|8nY=ADe^k3WHQx6G;~XayW9EIIVG2@NR zriAkV0Q=|x)3GVdyad)r5Xf(jN4F&%t`;i#o(XvnWtrzBPxp%Q$}}|z<+yeoO#5+9 zTKLpINe+nClWKzQD_g^r$s@-#kRJ3{0eE@PIKe*a=QkJ6*n%o$`dAYQ_-2UgWvMZ> zp^3eeUU=nJ#nv8HcC)14I@kA&_-E@D#dl}4x{%TeDP@L8bogs>w>COUF`4}|tdut! z6}S!=Q{=h$;u6!v6JW0*m8-VBLJy)~NTihLMgV&#Pyr2B6#)o~1T<|Z;W+5%*u=E4 zLHy5+b6~$;l{1IYOyc(M{!AW0shTn$5l8KF)KQ%W9$3Aqjr3eQn4RNV8nCfR&WxkZ zaZse_$+NDfWX2Lc4uT8E*(xQ+vdS`UN_L%|R!*#ms-rlaM5mPs7gO>Tz`Sd5~8)pKeXv6l( zzd~AHoB&^cl++u$f7g(#z!MKQ@mLkrx*URY>f(cz*Pw>^B~Q2xv-Q;B#gF%DBZkzp zaEU^p41ushJ12tF36#9KMR~5#Y2!Tg3MtSOzSW%GL{rGD{vrVv5I&OK{QhDTKx)3C z1}O;!A>-$tteMKk<1kf@R{OVV9(j+XbUoWAYD8z&f@xQ6R~0kk4}+8(mHtf9@`%ACRjyXK&HRjZ@# zLiyEfH2#-yPxlDjgP~e2&f+E%=NU3}_W{!xn8rEJEF>1UH?k|jN%3zrj3mNaVYB2k z{ipOu+Luc}$KOp0@qK6_mcKy&t^PfW8YI6+9$j0)ZgwfaHhe*2J)CV+{A9{^lLsb` zz$=H-9N~y;zn==z*uiA+b~LA=sp0QKZmU@CzUr?BektIoZXdu^Q?y(od;DZMqU))n zJ6Uo0zNv3*?QXXNtKvj_sDFMT)@U972o=TI_M|ez?QzsHl{cjU!&OW5gEqN|>T@Jb7%ExL?COZI84K|&(HY1pZ*! z^us9JYsh9{qHllN(k^Fd?&7ZlR!F03@ys!U?^W_w`F{uL@H$D`nKQ78SPQ>yz?yca<^)Y(qFG0=I!gOUG=7AW{uklY zYn8P-f$Ljr+m-w-Lvkr7$<%xpbVu0Z~)cK-_WoF6x`HnR_@UA84U$ zG4~_WzqSvB5XXC>^Z^iK%QG*G20>%NIJ88p$|BUtBIA@qja$N&a4O9R@aGz3`b(}D zWzF3eTo@8XZcaCl99F`T%~$H68ojSwpm_&h70krEA&TmmL**xJzVbrN3nfa+kFH5# zAKv+}RCtUe8RZ!(vkSQR`lt@USHt-y_95B!q6Y-kSCbY}uDFl@+^NOJMW$wk8K<&z zpCI)a&y=;-;rm zPneCuqBXo5(Q&5b_4BYNHb;o$c%L~nXQ+l(|6$tf%ACx65-1ESwMhiCvmcl`ygNmF zRSZ;9v|b$YJ2eZfpjkr_?Z3G?CGMu?3el1srkFfC3$@eo0a(X_yrgP>BDY3}Ie)WT zWlKVwq>8hi_gLHP7iG3JKhnCHY)2=S?VR${9Ob;e)~Bml@a&V`5D$_ced{NFM@dYn zj@K{}hHwzjaI3sWY6i;J(>;HCqf`AsoC1Y5k>-+!JlZ29xW}ym+ctcDyu1s1pmo5) zrFaUq1-~)2?r*XUTj7WrrU2ylZ-;;@m%U|c8 z&G4J!CnO2!r{WH44;o%HOs-#+a=tiq@o+)S$jdO=KeVQ$<_oPCOYQ zZ_T|I-@MDF>og&FX$4W=kTL|^f%T)ducx!mCsEvcb!9fj6ivOWZq?oCCQr3#o5x6I z+a2`o6}B4=avx6o8=nA{*Z90gM#bmP-dn}m^|Sq+tT;?B{_PK_Iv1qJy{wVqPhX@b zRc?Q8qL4R4*^%F|eJ2+WZv?@`mb?!0pfFXa8ptEd|W{dO20?T^7W?XMeI98w45@I-J^9I*psH z`V;TOXl8KIW^Wm+8jsS-nmt$@4%y~P6`UylxCrWauw1%IEyBu zdeJ!bZ?26bqF29s@$VP$cRWV;;;)I(Vl!Rq$*5KvM$9>+7XDP5&lfRsv}s*SG4jV8 zQB=53F7SwK^uq2mCcSYXR#X5DGjdz*G$zWrH$yoW6gu^7WjUyKYTxyjyy$ph=D4{p z$OW&`ALx&EUDqdW3Eb-4EY`%CN!Ah#Z+eErv)%u$t_*xi=_I&H$3js;cWL+?nA5C2 z=@cy{?34p2B#97{_QrGfJYF{}G6n4k=IP1OHF4D=wLjRj>v&~16ave56ik5a;Z7p$ z2!_-%qeG+*Boq}*l%6I0>#9xo*{lX6TNmbv9DY2P19Q_tbi^<`FTpU==4kjB5$1o4 z?&UM?3;^F)l6GwAa^ZFjD?>6a|E|sDrrplQuhtUt@jS7Y$ku!O=sK|K7yw=yhXp>Z zUU*72rdiR!Z8wb#*ll*SJz|CgoFs)4INg9=o!PQpZ066fZdmccS9)I)S}oHsU8%Kk z%}u=hqzKpt6RJA#I>j|U?I>0iG*#+T%X7*OyIY&DwDV$#RqDqa$&R!OyK;n?-j^uw zJDCR0XXu!~`K}=4Gi&hPw4S<7*I+oF*?%gjrg*t(F=8L0(A9YZpo!BDm=S$W+b<-p zA|0$hoOC>7z;GW*Um4n18=Z<>a&!7)W*c4dOyE!|cy9{(c=OKBq9e0FOKLij^=|dk z@z$iQQs$8^)=?Fn`G(7Zd{8n&s{*->1OM~a4)~!CTctG3&Nc>UAC|`8{KVCZUZ^bM7|!I05gwV*ViN4m;K#r9i|L)1jcJhTFp>)a z6%BTYiWor{>qL+xu#08qh?JpiD-=md6$h^v7j05KW$kaw&l@*(WGrKwA{^=7?ruTD zFlUd6!}=7W8?yURF?o@69JMn8Y~4;Q6(#uHTqi`8w{tJIv`urW2(iakXRgqJkLmV` zz}POue4yQgy-d(6U*a2Z$NzQCk||4{kk6O&FFDdP!}_qT7LUA)(eoBbl(}_M9iQ@L zX_Q&tY06<#Voh<7ygP=($dz4773F5rz}VC~-+!vce-J^DSJ4mouhGio7c)ih-};6B za_3XD(f{{kB|!Dr8S86pFf&ms@u1(y($CN@$Z|LlC#ZqIHhmx@4Si^ulGuN`cNudC zq*g>MFM7J(GDmKaRxY&~V%0&?LZce#$9D-$8Fv})W4EUY9-j9co_CPd!07w7ycw~? zgl&87)W=QFN6*K$tq$3jil;W zJ%58kSlqyOQbq*{x)A$vdPpzg{@kgd$BoLyl^uTi?#fLuCOfisR{Ix=@lhJXiz>Vb zaG0{)aRlvMdw&6$Ip8e7j_eZ%qK}<8b+mue&aDHvH$blgy>kGm(}R%Wri}Zw^S1%t zStOUmR9l$2s&8apn9ylHe7TyZo7Al^P^|F?F@*`8fimXVXV!N)5%G9)fE2m)-oZ)sm=Ux*2xkAfz&xUgXBeA0B-B2jv=l~2 zc;+ESn8DF^d@}HiY-C!_sEFQPH9&K16@WGSJ%zCNQsV9|h|WvE*y_$`aPx}ZCTv?= z-K_N_*zs%d&ud>Iptz#12_!08Q%SUNgwn)ovro&k{Vg9wfL&m_m|XvWIbH?KzgQPB zT#xnmJ8?iJ?=-809iq-|jsxDLxmI_WFW|DSU6Pm-8j<(1pKYRTZU31c<1mb{sYdJH zK2#m%0#Ttf+PWrnRWdngdE~{DqBMONs3Ma~{5wKki~~Zz5BO6}h1E=9WH8WD#YE*t z&E$q)EGku2qghA7)fbI+p6662LYuXlZ~Z6-+1l&ji^E*U@fvt@ldjK2aj=OQ(nFIm zs0MI^xA2(U50DU%5swatXON4wvOr-B-K_wK2@9amhF##kFz?2XykM2(=NOmo13q+k z0HiI6)wPZMiG7U;dJn`5(gSh|Zf>&H`iU}vd9F+e%(b9gCa#A1Au2t#1X1u-`if=u zj(x{CgUQt>EA7_f!^@WHE%2RFw!Nb!L$FXjl$0>W0hW=wOlkv!v^Qr$#4$p)D3!l< zAmq>c;RY^6YeXaxV(mZ}IbL}1)3;q~5-%WTuI_TB9VcX-})!p`B-I?@~! z%h~7m)YYcO&p-pC3u2AFk=-$LtunPQO|fp|QpDa*##2E@)R! z&5s8+VU!efa|j8?&GZ$U{`Q8ckIhN5>zifO^$zQQ>TeOoWay0{%+yDZrf6M4$yrs; z?Fi}P(_gtvHVxT5qdaR{Fs;PJczMi7CTx!msX@D3E^)Y;q$iOI zAR9By5wxZe4sTeNgr`tzVu6`LzZ<=e`LOEu;!qJC-}FK3!V@m2A3H3vL*%mrE9 zU$;O~O~V8vyqO>Np_s<&4BoIzK4~!H<3~g>E!i3qy?KC~wi#!)%Jeo_fPb(dxNOwu zOdNS=d?Q+S1VP;vDc>R2SoY&BKPY-SbAG=lY>3JNqI|S&{>JzE!H?&ZsKsVSwOs$B zIi=DW;e{shHPIJlsiVE3&kYwJ0=S)u?SLg}u&|AToYljP*3t$0e8D^);#fcK=y%lG z12D-$OBmNWyJ6{ObMj*2tU*o-_P75*Fp#JVYn)kUka&Y+D=R;Hq76qkr{SyPh^Vii z$fR|REWfszRK>#za)aclLD55`k9yC5OOJq-UCyTy)9zJX_^v=U=U1dfKRB| z0u!ci_ln2^-H}YbtE@&JJmP9_OVCC0kr@@&jwU&Zl&u+ou6e;{@efuefpx%>3WTQL zoN1!y*c_cf*xl>|&j(WTFd1s?H8$$~@aUVFmItz=n@p~iYC+82mlD5$-Q`LqqU1X= z>eDOvpI13Qh+;noin^d_pP(A-DEvrKb($zeHCZ`-Sp#g@kt-_hKoge;JUjFYG6*&z z{`V@;XbEwSaOhXX%*aADj4UDxob^}N$>(ERzQ=NsU-~T|IjJv9#bi@i*#+GX7?x1_ zuVxPEg)P0(%R8a_1chRt%*P|=(UQ-EIqk#M@C2w}Wvq*$wL;?dNUP$*u(TEN<5clS z2&lbf#JdfQEx%fOU^yO21LC+aoWIW^Ra&*}+260K%$DJwP=x-yN=R^l{qg`|Z=pQB zN1U%c7cN53Iy|XgGi*rvnNvKc@id9Q8?3aqn4vSa(l1?0qtP%Vl-_`0#iz6QEq4<^ zzN+bbu%dFv+m^U?>yiO0{n&ylJUjKa3h3U}SXya#(0XaccdQthZhfzlX3gz(DGQj@ zlHvE=V$EGwhq_&+d0uXA>V0Lu{zy%uVB3)2D;f8 zT(-$VTskT6Daa^C>^lRE{p$yJ&KHopS0eRKCe9nQ-S=ThH!>h`tgdJrI{bLIX6!$= zQI?gQgsBTfxA`o0KMxv6?>)yEx%w>54J)&R`52(sBOZX3@)V*hLVv_d!Rx!eEEvC? zZCgJHA=-9uMo5~Ox^59}0%`$y7{?ZOE}Xua2OSmV(p-D$+NUQ+HM3Cnx7%F77q>~8 z#7_a|^$;XO# z2Z2Q={3CD(Y{^?Kfa;Nn4;#IUbxJiA6|jpSgovf86pEIG$hq@7+0$RdLm2ySkufsA|r*Ian;%L&wF@pfh+sZ3moo9~Ri0Qfr?i&fA ziR&z3MM(Dq`zF(N&5xkem!FpB&TS}jXDU+DEhSW=fNZH^{>O69KZ@9|&)!jnp9TMW z&+nfp#);&;fc)3&niBHA=cE5K#SoYM&jiC$Sz2*T1(|1x5tY>!GzeY{-%)cFU2r#k zI=^Sz_t`WfHOe5{qrRZm3mk#K)u<)zyzN9bd(3Lt==%vQ?1U8QhErkKN19Ag+&!;2 zE33=$I@N~zmitkQ%7@( zbd@YqHM5|e5)(7m2)^*ED*9WTaVC@2h$(m$)fLdzLVRPE0&y~#Ls?gzM!MadzpEoJ z0o{!WylJmMpgsR`rLZJv7oa(}ck&Fdg99eP&FHg!f?%^BvTPA_Lc_-TOQ&3HV=3FK9#@Nzz%Yd%d7<&=0Rd+-6kwt@!G52lVk2-1=?vLnkF>8sa!A2NLb>!3q$0du_oo!HrC5FlK)gFQg6 z;1fUJ-q;dVhRm3h$(p&^VYtET0deyRXMh-`KUjqt#t{mMg^QYwLf1FV9skCEk8n-k zyLB*)PJqY&$B5t#qdv$p2>y}tf}azm*zx<*w^Z1Z(J7QQaJ-wMlKvdYPf-it;`gw^ zA0#}*f$FD>2yyj+2>bTSkKR=;-HnZ(MhxM>48qf2rbS#O8%+!karQN`SzO>HID2=azUi+4^w^h! zz4U*nkN-7QwYGEkS}YQ@wzLEoI+$5o5&xqg_%B!cf6&qYS4;38_ZR*DQHT21^tD3y z-z#<%+HL0o!rfFF`2m}jFq=S{R7|P3&_Tpa54A)D)Wi*AXN&t8lTRP-ZZsV!csjU2 z2qe0$5%eibs!-$&&{?UY^RE><=SembldgA{&+pyL#sXKElgE3sr8J@)s7Qd)7XOC&S*r041xWg zlS{@w68GAI%FORrt=*%e^KbEf z6Ngdacqmbgh-!!KbK(C|j)pMUM=UUK~|D_@k-hvMG;;l%bZ8wM5nV z!Pt<~e@pPAKm}sGo)Y>vgzij!@3?@y=~6aAKP4e@wANTRLF!2srkj z+e+bqi`kE=FGiK1%{W;=92fAVb;St3^hAvcv(JtaOcvn-H)WAoq!zdb*|)r8QG56) zQ00+DbdN`ZS1pT9tck#?k23%{G2~Q^U6c|ch)?YE9J@=zTvVH;XN@okB#14#`4!Y# z9NGCNbxnv_*3it*!4I2=SG!9r!gG-R)z|i6p=iSCPiuWIXM}tfdjOMB0KHVaNy&6| zmQpVr-GX%K9$(`HpUB4%XMiUeba)(&0Hc@Wy@6_UkUu{CyyYcPK6eBS_U3Vkc#zbF zjLZNisV5_fS*?KgalVrxw6i#qQfjij(lrK z>i4hXL;YWl&Ohfv$H%z zJs%+-A&2RwlUlpi{2^bkiV|I!?n4kgBem9?749CmHsg+ZVZ>5YrK!Ea;)-J>@iBZ4 ziaf#UvEVMp<9W^%c~HVe>bf4XvE*rJ^S;WK=`mN6_QO@!eLl-^VfG?t^+9_Mm$jwp zx_Kar$Y(XySC=az=B)ji{yWLeCw0l3Leg(}b@fb3E~F;w>+2r{2hQvVyU0f6HTmj| zYIZ+{K3}1K90(h}-dcHuLmS-tJ;mTRBbfQB93g`Zr~#pGM8rYGXNiTk|BR!QD<-C< zkXy+a{pJL%A0F9sso)hhim?%65&fP+Zyx|U$+!%gI;SnTNRxa2!>(d8nXna7vA7ts z`5r(V<^zFWZ0K-aqsW0v}V0#g|AbIo!8z z%wKO0VB|;#G;^Rcu(Q@TqWd>~?eq_B^H0E|6EaY=viVoU(>DUx{hPf})l@}NMgEZa z0SntVz^n(1@m+)tK|Cwa<39tNC-(*GHwRusW9t#8gv5!1R&=bYe7RXQm|t{wUJpQM zmu1gau9D%sz`SU-x~-Wo`V)vJi7f7pr+Yp>9GrJd?LT^ZeV}w}ypbD%MT)sd2SSKa zUNbAzga?xlCKjtThs%eDG})%0N>hstFn(z*=4s&fkL8RN2grwjMurT;$M}=fDj)1#BmvBa#C#f0EP(n~MmVEzB!PGTl$( zZm?Ivg;iLsaOTsBHU#UH9wG|@!MOouHF8yn^})If#Stf^35+8Tf!I!}Rg)ERcFgfg zdx`q}u{k{z?hwy4$V)^Xe?(!KR$Ef&OQm@+7xO&qhL08ZK$Z4>td^0A8662os2XD_ z{;iQyYkERw#q#WRMAJ z6}1+}q%x%jAghUcp8Y$bu*|HmvWXK#3`Am`YQ=XhYXuAYX2h)4SL)FW<%nthW+`^C zpXv03e>-Vla3h&P;W5rf*jiN9wrXGOXhw?`@vq(m!>yruF&d(!19|(zR&x}eDf-Vd ztzTC;sO}I~YeV;c4O)-fJ_b5OpFG%956e(nvbQTs8TP@?#bUP4AvI#SN57B zqu!SvmIBfs!G8)_tM@xp7FBaN6?Ek;%-40}5mJTh5di}IYX<Xn1+kQ>p z+-k6_A61)o;)hw_$`$kAIhi!0n@XG%1ncYz_XTaQBz88D4HmTxTBcvqPKJp1AL%^i z?G%v|m$)B2X7Lcd&TdA@i#zZdjS-!1&e4`=Yvlv$7dv5VBj@TctyCo3Q z@wdcVoe_@xi_y01KjFlT{lcvrEUBq4EOvgj6l{uW41^h!b0XWIQ;^*$n!f$zWy;vi(jxI>TSzLm*>c^_1s zvV7low|eYZ0U}BttvB-4%|}%BnbsWc1$86vO6ON^F%17C;rS$?1N$L>k#1_2A@Er- z>4M!sshj-IF2Yj2-z^NFS8~b|1DQ|I8lT;-)ok9KjRn5O3pETwn||V6XVwNH3Pz)k zI?;tbjI5pAX0@;K^EF7$O<|sd2dkLb8erc6dr)6U;Fb79FT7zNd+HH-dV)-H_w#;k z3U0>`Y2>v8*S&-=;PDmPdH~~GILjUyn%ldNE+^|Bb;T?L=q;rb!3+@FdFhpH+o5!lgVU{q%$*wootnP)u-zN7cg^1szbl{-_b zwAvC{uWd4KVH1xi>8MPfQ8Z5%KK~aw`cLZdr+@(m;;V~*@}&kq{$Em$FEIH({-VNm zcGmyCuqss4t+AAmKPs6rF=R=d=+#df<;e0Ym}Jb!0g@78sg2Rw`C)Xg#E1Q}nc zg|Wgs#0S{a8%RDOO9&`pl;^gOYU7b_KPfyURKL??#t6GKHYB1~^JC^go5}Me&T}5$ z)+c8oSTwUl6_P#M-ZX|UApr3 zK!N0X{e>~bajK@Q?g3i#A-y0_HA7od-GTc%15Nfz1dDZu<*8ZICAi@aG?>@O4z6{p z3H*g3Db`YCLPe)D8FY_Ho$?WXEJ-Ke=7UxuQ30Zsy{C_lXFmUd_KWvi#-YdGY=qDs z+5tT((hI0d>lz7Z$!h>!q}1WEJj7+ms;T9&TE*J_X7sOhT z{|{&H7#->Rtc}jZwr$(CZDV5Fwrx8db7I@JZQIGr$#3)j?z7K_^JcB?k56~jU0qdo z)dkHd2@CFen-IZ5wu75RYEVtR$R8=;&&fOA*AA@(vtYOrUDHxGw^(uvlYI;{8J^&u z$ng8&5j^iQj}MM8BakiPSu&mB)MRq`#`~n5H1QZ?Ssamk0VLv+R_-Cm!XD?k8nU^# z`hdn(&^N9pf9tQm+fo73rf}$JwcOGHy>~uJ0^U~x4R5g#KzJnlYA`opm$W>HHS3j? za$QorYE_>Dvo6;xkT_)9FCzJI-M_$3t@4Bj;;sSwa06O8KSNvG=?r0XboJ2lF^+*)T=yQAAh;A7m}4Ihea6w=WebU`@4J+=E{W4Wym+sxvK9 zQf1I;*UvjtIpa{{4(%he3lefqS)x4Aja@!1gG=bH1uN2NwIp=LJj14ApK4H;E_5a^ zIf1tsHYbswvDxG2{9YR^E8g}6=N-EID$raLP`6&Vt^;s4nlnZMmpiWt%+N~Z%c5Bz zGWV{`-oZM&)22M&GCuQ)-2qSUi_`3q>kQ4f1NV%AJqC}7!_L-+hTTD=xGFhrK68t) z@_15+XDYkXP-RG;ppmxCYdiRokzIG`2Mks7NSOo)a*F%fUvqMds%;mVeodt&SFU=})kwhYfL_^UYPjy1MW zU4->-=9{j!=@TFQS zthz-2jOI+zHJE z=UsqU2%a<;)95R?5V=wd1nkD>=O?+b}VgvL3NyCh6$?(w_iaa zSrm?qJgE*obOWsvM!AG+p8imkw9Q!_D4e<+yEy1DPS^9kUH@E58D~9as zb8hVK`G057bi{9YB{^IeZNaugkLVEd?74%r&2#$_@l09se*6y;U#LoK>hAAj2LC3r z{BJem-zU#bb{uRBj3VDx*8k+Pged9$bI804skWLc3RDF9=t9KRkaQTrFbH}AK$6t( zHkqRvjogjGu4a?dRdap-`b6`6_*-$r8yXBO>wXfio68KZ=^U?{&$iDu>|X4u_uIO| zJqJ*EZ2|JqBSFms|yK+$;M(N{NKg&^K>^O!HZg+y$5*m zfR7$9X;%{1?}@b$K%^bt$q0n-DHVy0#jId2Vu_2*z|;f>5Btm3%ILvgTXAQTFm-}9 z$2vP<^ZTh>CwU&`L+IG;Wx_dRn@We9Jw@r22JZ9x=)mCeZifmES%5*f5uo-Wm0OCQ z`)lJdUc(RE900Hbg)Z$<{X~~5%6Y#RYj{(F0pRI9JZ|&3vnV+eHn;CzhL*knD zL8W$VDOrY5KB+^_e^T~-J>G$j4vBrgL@(&uu@)2<-kr#yJtZ2Udj~GzG zk8$+DmZy#{}`=|b2?74rZfdBjD)+hN)Sy>$;%#R(!5#lG@2V6~xXw0wjru;xe z5ZP5a?cNY+2n_7RRFIC9Wn0&s7oV(e(stQM#=1o*F8@p1`J<2iw6k+X|K!7@(@bJk zR?_F!%#GjA)4sT&+kQhzK^(aaF z?orb)@k8!yf%8@-$6XX>9`ojC!J78Cc(Z29f$j*Zx3H^@8!j4wL}rG`Ji~T|ye1(W z#)v``gJWpNDj==1Ej&U zuT8~>IC2cVsQqTG%UcPn8{SETCiD)wIg7pS6o(cu3054Y9JUZkMl_0M z9L7YBmK;VIFp*(4#b}7;9OfaO*7!xkG|e#0G|f28oQi>Gl#%eOiXkytb@q(9`gVk5Xse%qmSGBtKCkMU4B-#%D`h(gH3)w9+&`L z6Q7CCI+rDG16~7OOKx3mWA1O)>e6bnDzoa7s*~!2W$5LoWwWXot-J<4yDsA^O?qwe zD)p+Q<;rh?N%62;fBYedJt7<)nWmsgKSAIV^;g@%U34mN3&VuyrrA#y zqbc0>KO(jv^}FA}Kkvo``e4g0C{iKbNu@}HLXZGRCZb43NL&Ppgo@=P6(ki;%bi%| zTHN(=6?%44*725$LrStrQ(P2FL`xOY#p}h*XYq@!<+$xCmZghyx@1k-=X|=I9sPZwh4#7g2WNsEl-KeuRDDO_|~Bt(n9Ma{|yx1Pye0t$A$)aFjUB@dSkCoc{>gueIxgY}!8@MePey`gY``|*R|f5}__ zDfIVWjfwh)I`#_UA2kUrk1jA`VI4e&LyS_P(D2pjETMgnB#r^7N;7I?DnQkg8WS}oT>eDh%&T8l^7&o8-u=J|{M3dL!^WTnu60QK+LzihWT znH~E+OkJMi|NXew`GGT>=SmRagw<|f&H=AHz(SK?qB?0FZm5RV90`r(x?4!&h;_Vc zZlAEy>aEwvg9?h;9a$L45sh(t)J8B+2$ROba`4;SS8@RQ^`OiX0necvvwunSm4?w!+e0e5MfQv$(oAbf0=J2Ka}{-e9lzDXc8>NS`CT%h;%qA$ z4yac1xo#gXJ~CdyxEEaj9nA41rdez}7wL>bJy9f5O=4l2I`-dRHISMX_@ys z(S`Ak=8IX^AhQf8uI9R7Z~50y4~NB3@D+ITdo+tNY|{vLgH*M|eP&yk8SF=nv*kmU zY@AfyC1+fI2%ohO`=?yRRlyE^(`(tVbEl+Wb1R;{{^oM6(-2(m(oAOAa8!RNa7sjn~-7n{N%So6}Rl+Q7x< z386`E`4M1_s{G39^ec>QKvM`M`1XxQ)Ja$IFJ2*Q z%3sT4^Y%_A!(;V-NsiDn79Oa-HpTAj665v^g$Dv}jMlDx=EUwC;364z{UO0rVR5`5 z{0M4oi{(cOthO!8_j#DCpH#oYWsJSWm5ZaNeL-Y>>{3Bnq%>FE zIZjnEU`@{~C~i}OOclNs>o-1%ifOtydO{n9@j}LYA;~?fORnVuT0KWk?jZe@ev>K+ zrIq*;xhP?SAQ)rpxa@>pObw3Eh#bi1HcHB`vEHp(G9Is;+%0{n2^3Rl#$5BNdU7;< zpo!+xQ3v}CHVF^*mRd{}i z4khJm;tfk2nd<*SK$`7K?$ziXk!zENwDA-CkaZ3wD9k!lse`i1uK!_%F@ruAa55Xx zAQ;T)fFLF$}$xDUjX={k@BddtQN6rZ!*lKq6+%sr{ zS>dC=nd!_u6|JRXHdc@6XqoEKP?=$4pimU7)XS*^dIB*Fsf(G-@PbFcoJ%$;=s%8} z9P#uCg``Yrg84DxDc$;F-umD(sBZtOf>kEf0MN~e80Sv0b84wXFC6i8l?r34Ji>>G;p~?_n`2W58 z`e%F?N$X$K@Lf(bzIR{5|4TXjKa8IKW0kM2?XL0-i9?Ebr_i1YvFBcXLSuF*MMlDwuK}VA;mc4G4c0ZNN`si${$=$E~{a$+cgWFHQv**I@s&kwOPllZUt;U>y zb`em2zfqi$;``zX{6GikqRCVT>7qJi6|9B!6rQyM>7qQP6}0>In1M(4X+`Pv>?}HP z6QYOqRG;8UJ*Zx*y;9a%HZpNK(8Z77e$W3+~h$xfUPly(m8p z#E0e-Sx{3j@BNk>|4-FVtU$z#W~CfR=A7nvtVTW9EH7*7h4@@^iL8YTW2OY#(`fn3 z@;{i=CZ>tyWY>`h?GQd7L9?!c&vS3M=O$uN_eR1kZPa& zRgf;+4Yv8sdE_H5kvj9{wiC-_u`Or)CAYi0w4BFBb(71)jjJ2k2rX=-=YI1NJ2$T> zAat@Ggq828#7}78dfiT3r={v(JlA+q1}3Y#_0=i6-Nq?%a0931AVUonTdFk{hksj> zeX=W~yp>0x)R=z#Gy(gVyUS6y=i%P6cX#G(m9@l)-+a_lvqE zi1cT&AYYYBHdp6B^5Zp_GTjwd8|dC;;5OV1wx%Q&%~-CwFUo1w9~R^K&13ESCW#-W z6`VBCo1G%?rE`mejLu8>kEhbR5)$V@OQsb<8BGBZ@Z?87oGCF50e;^tKm`CD zQ^jS%nv{lo|xLMErMAx+WWdwpDk(7~AbfHP?46i*zpKZJd;25*;bperdXDI6Y6P(5ynT%`%T&}aN z{1?-Et?)Dys_=nB+}v4vT!WsCPpyA7j)lp?$Oij{%&Mh=UyZ#-$eb`5fsV_Ol0%)O zN6fuM!c7doH`Ak;-=omKb96z`)2t2_Dxtmq$>#?1nqc%W?29Ck36HZu2BVjQ^~Gr)dTm-QQz13Nj%fShDp;XkFw#tN6DEQoLj#Y1q2aLDhF!++T) zOJ83;XI@LpI6S5u+j#~o?rF$}IhW5Ls%9Q&a?@T@(V_Zf4(_-Ozz|oJF%FU4=OORy z9OY< zhUVrzx&TF9S$OpG2i%YD8OUe6Vs0T1cfew=gv#%T+;_;XyQQFWr0GdMQFE+T=jv)| z!`Oe5+umI#UZb?hT8d3_9p7W}o{@&Bqr~T?kiJS9FlM;EToa2VKF^@-#i?7`H?I|L zc&;Z3bSN!1ZPh6XQ7V%Svqp~KTqs2)D7$X}h4PeC$@{+evM_)$l}N3vBPbW@Axl6R zv`0CnLME$}GXDMDE*hX*Df5ajCle8%iGA-UnG@AyDY8|iMtpA2g{4SOy&V3o(IBQ` zwuCi@plT&iR!LOgSe+0gHi6?SFoEMb%M_N=I9U*o%J~_e%6VC600*x#aJA+auZ+4X z<4xa#_)?$JeAjhzl3ZnU+}vR4whK!37ir{+Uqk=z;d#&N(I-3Y-vP1@u&qyYhJL7V z`BnWg50zm;0#>YDN-tx$u*bjuWeog%ZT`l)e3$wE`uk_f|G(m0%uHsBEX+^$@CPFe@Zd{;u{@pnm1IJ1*F#v_h;^n_xtd79|y?2q;Rl@vlIqB!N6bxm>ex7R@%Z@0b5DGV8z_13wW%#ZA(RiBXvV7 zo@U*=&?IduFfFEBJg389a(1o(3Z3%-a<&+brDh@zSF`Fctjgfynex1-oc&qxO6#?AXw*tohzFG5P$xIP?2@YtsIj55e`Oh(SP0;9TYT7_ zuYdg4DMS3*DNpFiA~1ZPjQIDE_y1E<=-(#&3Km8Nj>iAy`0nB4Y+~~d;+%x}-;X3k zMbHlEA8P~xtF$IkRc))KLQzmHO{k|}Mn>}_GKH*s-dzg~v2@dnp*7Jfzx(|@OCEQ& zFU4VY=wYdgfPv{wj|ZQfPWGFr+&}MsfCWI~P7?atVWBm#TO3w~d97DR_qs#C(eSiJ znTrd%VVq1t9fh66uLZhFavIAVsknc1xSdF9*Xo>-6@nF#SFZVA*<*jd^;KxT;!@V1N?>{mNpz-fpMRU!fBMxxEk*fJ180V}d2FyL#T400-5<4z>l%FT+u$314smovZ$=GiupGS+~^^A%pY{I%TJtBWNQP?`AaKyE)!nM9}i^y8Ap@FsokTT05ok z;~AB*?UQ!W?U>+uk*iKeCz*DMwl{IRLY(2f<^({gsiK`8*o3jn(kbZlTw18`Hns89 z?7I8q{xN#pzWSt3EF&~a2?X%xAW@8*^~UHfl}wBNz*9s&UIDV$12&R2xkT>nd?{tb zf(8+Hs4PizQ*??ue+;%pjEU{=B}6(L7xrF@~f%+)04 zNF(qK!E<^7-ygpIu-IrQ5uo_J;)K_&g2jkgG^WSXZ7;bWnQz~|vhqJ`KhI(B#XC0Ko07c{R(r_j^YsRb2!R(D6O!eG~qr6@Ox_BPX3<=#|G%0QX z`t=b9qIY@->x3I0%+bT21F5XlPEY=V8<4zxb*G~Om+&9Bh`cAbdGUqF?VJ3&2`Vp$ zW#uB@l4g96K!{hbJh7mJQ*H0bKB5KfN}@U(l?Lf{ zR~*+h&W+*aaoaFHkk~5O$SG8aAA>I z&*HFPItwGa%`VoP7-G9wuq~*KDo8lJc+58BxyA-d1JFh$3R1$u3m9=(h0CddXZ8Zz zNr($!iOWOl_|}G3lBOoKERT;l#u>;DdRRuvAzk!uB8>B1Bs;8CbNoyilfto9xs=x_ z#ST#H!Zu5J)M(6p+hb9(oiZPuolOR!LRFkSiZeCJOd_`n%(HEw8ZMsi^jhvDyk)M_ z%;yqg@A5*Ghb6+&7+{_=*8FlAymcH@sL3PvKm-(u^-n@N=H*-E6`1tIGjV^{c~Tu- z7c4|73)mA0eKHTQjHa+f^lW*jHvcGR%huot3V^0UixTI~$ubk>YUt;2GErQ3}O@L)W05qVB>^Lap3&mR53i!08J%f_Tl{t2`EMSw8Z zJaeECU&^_+edI!$(@}Fu9je;l(yQ+v9vT~J18c?y|D4ktXLGT^7bhZc+jd}{ zh^p?jFy4JjZJ)yge5BSwQAb1FcJEriN*W7MeK-`Aj>WhIqQKPUm%dF5~kLm(V zW=f-BPs37Yn{QzNoCQ;5yPFwu(JB~{{m6lF?>EGMi35>_q|23AI-MX!N)-BT{0K8a zZ@hc;x@V>S`bQTN(Fa3Pw+*!8-ushhq1hHzIgPxe+gia4?Q$F;#d;D2{-CP*(dpw?5OOfr0?EC_hAF!M7P)~ z*-WcAP2CR=wXeX%5fEni9U24wmQixVb+&r{q}iO#Z~$VE_$f;awSGd4k1$z?@S#;m z`OGL@|7fQ;*;hd7f;hzvX)?fIHC#!1f+MA>Ha~npq(kT#MQMoJxs@a7lq<@K#q{*M zYmX2?EW$}T`4_bDKNA;iQP)h)ZWaKum4t(WsO;d4Xlk^ ztiK`0wr27!&h{?O%Fd1^1~&hZ64fr;kW~@>ZjpRbbCl)9b=2}JY#)d?C#5$-4<9%L>qa#xSeh$KYf{< z%vyT>zTK+-0Ke6RC`!NRv+W$5@MfnAvB%_8tEp?u-!%cPbw03!;B`-F(KEu20f?sF z)1Ye1qoQb1h9C%Lpc4mMwQk2m23kUBGmNy4B@Ri)blFmrQP&Bt{v;2+vKJ2aNdjnh zZvM*JfV!q=rQU6@4hWcJy(&p%sXF9bDQ}yuQeJ5~H~8t-#6Vd$#oheWsm-3vJyvDA zp(UBeCe?lwuUbX`SP&CMKeZY%%#jNchgq}v#CDUP#cnKk5!a3g-%k|BE3;#8DWsdJz8bBFn_zytR_q7LZWid;i8&#iHZ-G zB*;BR86^4wl(W&AYxiLrqv=cBwb>Dp=Eoiml4TrGr^;r3It)Wdg}MaLR!5d@8Yegk=z48Ah>7AoMP);m%9fLIH%I;*&7mPEk?XMGwXKJhIXa%wB!XTAJimbRn8M0@1Z6e)e%tDi0DvD2a&2{Z<@NTnZ$}PAPfe zJC8>s(9_#Jh$Le8`O`as7k*b>1gIzf;%8t)9-_6t8zQz@>ReJ(@H1V(OUuXMmbiXA zqBHV5$lFbcJO+iOf8q129R9Z>I@#DUf+lZR4u{0)%z_)@Ai01ieJ&X`zfsawgMV^* zLp)N$Qvx}|j~#uK!P?#YKw&6RL@2nIL|j<*HG4ef$47@$8TVH`U@FM&JutS-Qr*16 zRr0x5q#mQw5r;98-Umy@@YywoNbkVIAH4EX$tuXC8zN_B$#-Dy7~ir1+=5Cf>6F2Y zTVV4$KxgFf<*Wn?vIt#kiDe*b?bQKw!3O0$$fqzu5=P9^%~aB{wE5=9;Q;02G6R&;BL1=%iQ!WNsEMel;|b zAHtr7z5oKofprrYTwei4OYY#tfGPxc~Jkb+22PaH&=w9T&@<>+YYSHG1 zpCZNdo4^o?r`n1-p{43t=pIlr7$s=6yorAZ(U!?y_F8&7uW8&_tWbzNu<3CYQKGA}3KLrs){TN}4 zkdVC$45|lUMI>lM0-+lfhh?IH3KJGvmL~)2<5D^P= z+EOX$orZ$9ZJW0rwrn)<+HlbC$so5vAm-BDOdTn7K| zM*JV`8~hA>?#^%Bo1AaB*S`S!{;TK+8ag>U8W=hMzYW8xwV=IKj#Bu|j;A+0Hf2Hs zAZ73nP#8$!Ddzq63M3&o(h+2SKrV(5G6(dH!A#4<{~AKSUKVdTZ*SgJL)?(HsoxI* ziBauP-MF&t*cjn!->}`O_OWi+uu+#zc=YS`GGodBIa<;6^E~ZH5G~j95+5{u{umqP%tak_5^N6xPsYx?!DDSEYZf*w z2cI&(LAQK2LFdt`dpWmuQ9yvrM1L0_=YzLC1o$=NyT>#o_qfZ7r#1W&vwFp&J<818 z9PUF02PKk86MmzTuvEs3Yq-kKm`xgwFlT~SMci(pSm;Cwe#t2%&Fldur;^thbLQz* z)VqHAA=t2+2kq1w^4UHntmZhx(YKoC{IGshSpD7*e#I$hI&J)rDJRXnEQ9{#R>?On z4BI1vL6a_y`qGIYdRn$$vR->{FQrpzTL0>Z`i;tiB}#_&_cB!x>%Do>h*mxLm{AFj z(7nG}hq;V(qufcQ3)}_FfX;x3j2K5oG(a0UL53{Vfa)TWq^SJQ@%FX`Sp!>ccoWRy z)6l&89O8vM0GylX<9Vp?fZo~Gj0%>#s2(_E@lWb)DDK5No3m@Mwwtq^^>*)|K}q7W z3R6-HNrN^~L;wbyo!!R#a(9uJveQb5E!l?aY%5o0%XP2oWDt`zyq&q#^*Z8qU5U*_ z?DcIk8<}`d_Ryi#4)z+pMR+NeaW~NCdkP6BCDuk#y|r*jEg|yROo>v2jPOH^3>)s* zR5Od)D4Hm5t%T?8-BXLm`^unK!<`CKBA#)(F;eOEaqRVK3~;@%opm8) z?8SWDQek^bJED{Too6fqE*m!*=%tj&tNO2c5wR{oZ;)G48=jo8=E0=BVo&fK%l`Z6 ztoU*ZCJ|tYrH|`Z!HCpNXB(=RE|~^Pvhs*0)c)`T4%;*Y(9&W`1YkPM(cq-WB4UHc z1H~Q%&K%Gh(qR*XrgdUu_HSo-LPs-wbr>>aV&Sa}4Rso>k3}>P;XxFfP>q>la_tuw z61yJ&n;R1j?N)<**<(sZ>M;#HD_K|)LK#h>8L2f_BdXlV$a)N%E{=NQ)R?LWV`7;H zgN3nicDFJgP9}~11!}{_LDwjAI#vs5F+x@P=+nr`;AC}MPOS)-Eiy(m`rawn$`hPZ zxsypkN{gIy<#ju;O98fAbMrW}->Vn>+u6Cu%qI5wblPZWHrgI|l4`ZHZOE%LEW)2j zma>5PId`VSDNQB?qk1Wk#18Cr<*}`JeUK#-bHj zV`{|EFZ7je6*60{$)?}z2C7c-Zk7aF*vucXvnnY~dW+1bVq6q){LB=hA296!3UF#V z3fN38L7=AIS0TUC+dY`e@)E(mGPhYyPadIjI$*9#gt_dP+?fY-jt=~nK$QnSj661h zRN{Ir#rDbET3`l|73)tn?H&C{5aZOOg%!KNhhqSh2V<7uD%HPw)^{)5D|tK->|~dI zTp5}gR_bG%qBlns-mss_4>@;O#0laTcffY%UYk~A7h+S!-|oxyCYigik#cHOSJ=4d zONlTJ0aq*qSvo0E`NuyAwx4gSaN%A|jcbe2_JDnH`mE;b?;F3Tq+j%$Qrz0`*k>)A zjpmEg3i21Q2Rtbc*OlFqQ{aQ$?B@7~zEBkk;m>)b^>yJ)<*?WLVm!_~(t~{wZ$-T* z=Qph0$pRmh%BNqkxx|b_ZN9aT?h352&Hu1lIm$9%4D+?UfsSE^uRh6%+fL z$H+nb{EoF{HOots*MqSDgO|_lvTb)OOSJS84ZLyH4q8PXK9}Q8182s{blK#jIM$(>|qu} zVp(?5Ppnh@#Tw{iSyYpICbuJ?`4q#kb_o}jTId!z`xGdfCBDt@-!TDj44~Ok)b!~j zq~;E?UJgLD8XOj5K;fvOk0r|6DcdQs8Pa7ktVxi9h}lwsw5GK?Oxv7XmdmwiCSD|1 zwCl;pz@D;sDhwuZc82QU!k1|qmS%a@8vLRQW;?X3N>Yn#oSaosDFOYO3Rx!WeA|Ch z<-0x8m*ksMUrG``jLt4gR0JK5r5pmBaS_inF2Bx?2}eSQEcR|)0q@P3w~IbHuU%R1 zZdd)mZJQ{=l@EdCTE&4sZX$nL7u79pzK}50N(|{{=$7N*xT#rDC4`q(jY;guNv0h} zo;(y)neHvd#B`GX$cnkkS0dN0X$S8uW#P=!5Cz zSi+utKjZjxTY_G|3E6)si_*B1Ftyp-$pYJkyyPWGE(HaEG3+B^T=b?w=Ynv6Fa*79 zW(21($U(3b@-FJ5elzR1+Y-p462#(a%%B~Yf!kBF-Y&WhamO6VRLSSJcB>PWv@-WY zY>5o_sx&Kn@$|=Q0~TyxgX|rz`TddTAqn_4>~d^;b*g+qSMxQBMN^cqic7F}(cx)1 zHsJ|^hqz=~!39d2)fMsKoW3Kg#kcFy0j$MLqC=)s?0ll){Zq7(#SFw7@Iol1!UvDV z01Gbz@PQ)KGlUQ3@BoWbuxS@j1CDtZb=kmD~JLV?ydeQ)6bk zz#ME!GlfZ7X8%bF?j$w0IVE*b))_E|5hv>ctuw@@-O%}wF@8~$1ky#%puifTc=SGv#;UV=ue9;AiFGJA-#w6yVEnUY;N z&WzIA1i3`_AtZ3AR%{?j$|_M8ij2t;=ej19+2^lyK?HRR`y5A)^t8s+ybQirR zRqi&m*d-Ocmm}rI$;Xc%72@XC)Chu6H5J~$rsL8$x|)AEIH}}unqy#NzI09<@0<|# zL0A@4t0sL&>9?&R#GJuloXLd_87|$?X@l*~8M!qdI}&j5-FF=d~d0@2E(R&ZS7-86827VH3oce|1!t7m-D(hyp(Z zX&J^fJ8j1POb@WnMh3^)<;%mP3f};DB&2E)aUx#9QwG3R6!Z*^#_|Fl8N^IC+sB^a zQkZK~PCrKfO6u5@Qrg$I;s;^G3HguMKi2=1ci_*2|2$G-@v?OJ0a<6(=Pr_U_TYf? z77Q#icNEN#PrfK24ik%~9HtUdG5o}$cwP^MA zC%+qfVL%QK>!Vu>WUYv$YxxF>tLYRksj>O34lK~DGH)Ea928UV5p&cHNr^X3hf|c< z0z~i?NLQ$+FtA^-3-M>E-U+J<@aMqZ8EyKzY_Yo{#y^x%0`U8O@q>qdks};%3xw%YKH!V|vJqornfMT^J`N z6(~f0MA1R=SH@G$V1#G*!aN!*t*&D$m(z;1BKX3EI(vlSQSavwb5bxmV@pMS6E8JO zfHW)Her9WviQ@}6?5cNA%5@rWQ8Z= z5C{C?Pjc8Z)W#Ds3%H@gQsdOjjpOM-^&n#N_k)qKA*xuMMWk@Ys;@nq?}k;L5*Xyw z#jr5PR@No z1T=S+2WNQ`n$2>{sN)n+U&a9X=JOr0(aPf=E6oHzOL}Ms0?wdQg1yy@Q;Fbu_(ZM* zYek;Mq1UQpH>+6NLkT#DHsVL|04BVsf;SMXtSO;V!lVO@K>XbXT9}UDT?O;k19+EO zh0eD>D%Dv%EAdF>QN@Id!FjbB=OD1|y)xC)T^G`TvVN*f6dhIk3JMYIG z1Zxvp4N~n+WGG6~_e5rc#5Y z#LG;0;Cn*t5nH%cVR`Q6Vd#G5f0QMb&hfy_3gybV=!m7=(^wuN==L2g4x=uPr8H(# znsd*T@YR%X%m85YMOto$oXKa3Iz0GzC!tRR>q+$-i*b!itoBW;?NYmQsoRIE-{a^_J-kWT9#*zyXe-!gwFRx*s@Wbu zm_q7}fZuwBuRQo{()GbYR?PCMlz+YyF-)nv;R}T8SKRlY%;tD~i2b>8dTYu0c^3$$ z=lrJ>l?&taDz6azP9M_qOP(_OmasaoLMs(WxVr*jV1O}ywQN6daMS=?jJ~`$an5Y2 z2DB&*)%Eq&A%q<3@^82lA9$4?eHRdAPTfbo5E}0CPMqVzPZC}18$gfXn!^K5a;*4L z+rv-f+K9=z1A;C(CMRZFT)ST?{Z@oe=nC21-uPSxJpg*a?$YYvnZ-*I7G_dTi=`JQ z6!$PH(1Phi`O+S2;6hJONR2);HRIbC1>@%gmr=unkR!X#FrNm|JF6a)BLg zmEqevj7~;Y`A=`nglQxUUj7(4eZsJ)n}MG6KfoOGUJBgMWe)uDaUN(OJBEVx2<$*! zLkvxD3z@2;7tP4H0c+$c=m+AY`dX{jcWAA3lZHGC z0n%f`CZXG?@--!Ro?X$}Z%Q*bt!bWqS*HkKFe5lZq39$@Xb?BbM!s6t^<2n!FM zSBjL(;Do^iK4uHmFJP*0ov%t6cv%*HG3_VA z)lr;6D!&x_gQ7}_xIzY=a!C(XNk!OMH!#i091O0|$Q$nx8}3-gL3qEnTG34<+h#0w ze11;})dc+Qa)P*0l3pg`!0u{&So@P75!M%r>`7!3@d%}1J{y|S( ze(m>UqlH8Ky3gvWlFDJrLhY)f{Zj?Ebj>u(#O2alGP`1J`Mw2L77JXKcD?S^axM(R z7s&Mkq}L)m@Kds4m)wHRFVm8-Cpk}O$Ro1`L>8Mr>HFVVi~?8boocFKm8+T*g~wBl zcWrB5UQK|qRgGgYU&!pqtDV|#qWz+Qw_T9nmSzhE6x1;F2-906@%w3#nGegbbsQ1H z*fwQFcK6>t9PTTF=FxAyDQ~vI;}8kn>K_N#jt$yzWktK-kK7FpjCQ@)b%y*lyC&ms(nB&KFWH~N!K+ z_0pd2o9)Pq^nWlO|CQVldTQwHT27e#4n1LUp~G* zCyGi>M(?)m+y-nhU^tz++g>_eKDIu#R;;IU{N8E&n_kTzvh2emTXw6dP&#AMxP@Dx z-I!hC0$ajPedw8QAoj>Qlh)iApRN(E2fWZ`X@)yJrssUGTuO#^HlB-nBkcpC{e{TJc2XiD_>!l(w9=;H#bG-H3@J`v&R0X+NawumOOFqby6d2C3jPTV63LQcWtK zT&s0OrSCR0S3pzBm|9P%N#ms>RHFGTeP$oppb37LZK^qt<5v*1XedGX2^t^SNKb~{EFQOjFg>inzePkB~aWDPdygJ zW7xO0K=mcsbtLBOQY>JvJ(jzc2`$=ROzpsPakcNytS*`JN=ceU90v%eH4JH?al<=O zX;2oCTD!x2r3dli3CU*oobCOQhfvj?6IQc9PhbO9cQ74nPA5xI$aT%0<{(RBQBc*Z zSt@*w-~gKS(yfWN=)ey!R&P{BQ2m8lm&yD4Y_O<+?tl~4>;ZOGZ|E87*XGche9-}D z_k_d-Glf1kR&V$n^;_WMtPBsyKKKj^gJTm=e#4TK41DTWNam}_PnEuz^fSZb6DZ%l zNj6j8@?G`GN5%&$J>LPkFSUW2*X5p-TkucCUvD9uPZ{+N6Rq*Q6;+b&l{?*CzV7ZO zW@bh-%NTJFLuMA4<4#Oi-a>tOET5QubGPcTqt)(7p*@UGZhC(Ls)0lwoJi{o18NH9 z*z5!jdmm+od5Og&OR$RmAG+Q#JhQIL7OskI+qP}nM#Z*Mv2ELS?%1|%+fD_QFHiT| z=k3#{zaRU$ZvL2i?KRiLm}6`gIm+r1vf81J;Ii3lC5Q^>BGetZmd}(Ojhn@A6~66b zr6xAFi>jfmNxUm&EWoAP1sD#uwAb)aM$hk3>;tFU9{WoPU-p-qj?}|se^dJW633qU zeefJ)J9N?(Uw+v)d1R7RgsBAUDK{>^h7j1z+s-j@SY#$KWvV|lUqu~#UW0cBqh8VS zT46?7xFk8cCe&Wt-L6?~-GW0$uVnM0It8VedWAU$fY*iArMoN|sIwu2e-p!HKN8HX zJ*V1P+b=!Kq@qF&!cTyg%EXoloC})cFp+LzeFyL=k(2D=8 zz8G87qUi@iF(9Uz4YQ?8BslGZ6HuZg-*IG7OmELX_zySAHA0h6PnhQL?XK+{08 zPjOBYlY&}jqfCXWv7lQ?vVbCdpLqYAMROjb3MNO$0!cbHFTj8**-TMv24)=c731&F zy-C|Wl&7fz_omq*Qq>f_|D6lJdApGv2r+I%xG>Y@*Z3H9Ug+5$5$b!m@)quQxt z^*QE1t0FJ*3H?-RebE`1isBEkl-lX!m09LMElT*ensc(#=nvn6Uc+2wP%`edw; zV4a)Rm(hvp|5kd&Iq`v+u;{`Rq{>jD%A}^;sifFgQA)_9n5u4#rod%{F#tm3@iUMa z=$*jm>p?`FV4zwaKaps%^nT= z!2Rw6H7^+6!c@$;5<}==LP(iflO;atpnn+MJsR5grKL~Ta1yzB8u@`h$nUi_3aNic zrhj-4^s#C}9BZVH)s`Ojz~q3|#5YBC@ZtVPd%l5X=Z_evsbVq@p%A!}f7Z}K0=Tp<@z)BhT2 zE>`=O;yZ+91C0U@D58~3z6}zeA$0+$C8-x{8VD!|Vv}w^QZq@1gWH18r{MOfC^wer zWz_aNaMs0oP6 zD-1rFdm4-()B=;KePE~v0&W`YJ}8MvQJm=p&cQKBC&eBqrfgd3TokCD-r=4JUW&WM z@g6EC#~M*>MV`_^`XsE3>LF9bBYo)s10xTK@z$+D3DQmKKBeHAcPmE zFO3&V6X{ky?IJ@!T8SOt%-B<+8F{W1Lz7>WuIMCPQT)xFLScts*H_QNNIPOCn~T_7<#uxd6c$0X;=xi{2ZY5r|hSrZ)+xtLj!;y!m67=Hc59ght=)6X`>uAN0tZF{BR=8S>ar&x zl;>|FxiH!uqN!Bh@+hP^gfG`hgxP4$0TgiSqrK1^rp92CebHaZxv;FmWpD)AXl??q zV1KUB!i0C^gTfo4^`9nwj!Er6Ez?MhQ_M3E7Eg+mRwbe6V?mJ?-dd3 zV^#Rww6x0OFAe@uaC+Ld%2Ql?(nM7hz;00QrtKeC5WtP0WS{yOb7u{+f#eDz_BFB% z1(O|i6|)3L5k@O+_d&Xb6v(6ZYMAc0#N*|xfbMUIRd zE6-Fu8yj@j%H#FG5Z$aH4n9jt%Tdv9MPqN+(FhM=Cof)W&M21Icwr+i#ahF_McEof zBE#adu5O^Q)jHPgrrg}BAr^#6vI`~F0fUI&U7(vA?7&z*!zvTHA^a^rZvuoazZ~Tr zpeLQZ3-)|>SCTHm-wr-{k1^F?D4m*E+9jGEE%c(cDK{vz3eH_$3|)4`QRcqGV@@Gh@F&nMdW z3S+bH^cY6ZK+!#jdWRY^)Y3}TJskE5#=OtXBbP-uZ!U&mM(KmUJ{#!7A@50Cv>vF} zpg7nn0MXhAQQ#$Fu?@DfbGS*KuiyV8D5#H&Y2?oZZ-MIvGZiwxCbal99S0AsB3~!vs@!z}k-IbX zsGY~DcVM3fD!|@RQ@?QgeE(aH^$(!N`St^(|2xM5|HhhpLrwl4U-u2D`3FoR?r7&? zuVnJiT*-gsTYub;S5W^Br?58gY#Rq&vC#ZPin`ntQ10KKg^vPG1IPx#D{izb;suOmv7!veg$Cg5g$0&#NByd>LWa$2T!IB z-X0-z6CHnxh&CZ~_F~y5PH!^-5h`$zUE`(pjYri z9gMt&N1^wd4@DZb64-yJ49^I?dSLYQ4ly+Er!x7F3Z~DTuV1Dq>gq^LNre^3TbVV* zH>jm!E7BIKq;nJGb7w}8LK&@%os|nwDUJ>elK@64Q5WW^mKm!%%cM0<;uVdMmCuTZ zTRf;TWs3IOj0+h0L}`>IOcssV)D@IRbmLvZHRv=)<;GAhlN3;G&us&{a8aSH<%A!1UfNG}KwVQbJ<9b|+E z^s<+NYn4Q2Xr^aQ#pE(6FNjW;3e@;YFi8bFCjDG0jHOmnYEGBKJRAoXkE<=4tYaA3 zo03eP442Z1A4-rCTV_V?uF9b8X+4LSrXA$C8WSp1oQd_8Wt7RITyhX(%%L}|DK~D| zAiHv=l8Ui2R9RbBOt6M13%Sh9A7Y3hFD~RgZ4Hh9;2)RoAnW{(R~5ym_@y~E(aAGb zqz5ZJQ(3m*4cEAvd+MvWn>Ey5YD_9NK7s<4tajDf(_E@}$3E>WM&?8!1`EQ@j%F2A zn&g$kA1oJsIF0cOfVxqkM~DQbE*10qW|W+U$mAf?a3D>8yAknQIF4&8B;LSiAfoby z`i7k*tse0#RsO~@^@u33tUoKTjvU zDuBl|$Z0K7RYsQqC29GH8pYI96z|Ei0%t8*Zc$Bdf3nFhE5pycSWt&o|KO%%PcLU< z9Y?Cre3KtiGMwn+5Q-`_^ymVgRuaojyQgwj zC}ybVeN526)%;zioP@iCfN$vCO=^I8ebFvdiiwVif_F__z)IcZz13jhE>;Ta2Usn2 zT0hB62v`0t>_!o{*RBBm-B>8wU0O_ErCYO3T7wDh6ZJl#X)2CTa@5V(7Y6tixZgpNMzd#R z$#Hk+puR&pAW1!qu2{4qrW$Kna|NNqk9pYC*^CYC!8IIrYLvfmrHM=#!Ln&>jyZT!rv?D1lHO?F4c)X(c7@ z3rS<>Z9y)NmU>ThU>Ti>O!_E`jy$(FrGu+EUm6X;2y=_~<(Za9myp){fz0*UAFD$s zjQ)9}jZm91kz~Yd+UkJb1KjfP4uF;27jk0tqcDRM)?qimJ~M#dl6%vG=k4vu#%m9K z3=6#`_s$KyChD3Heu>|{%I}cu*${S1IDR7P8Y#gipbf8_a^U9_AG6xu#Qd()Q*}j@ zoFaryG~fP=!8Jd2=Lh1EqCQbny1+%{2@CY=@~pj5!tfbo{h&W@vgcE>b9aZFQb&x7 zYkQ&6BH;1$OTgD{qCv;;Jmbk;SuzA!QAmh zIk+tjuM4%~Gm=m&%-EATtnv-TW9<{u8P;PF*M>9a#T}TJlyS<*@n_gNLX2`y5!=Kf z_x7YS<@`vz))c>N1g4!MrAW2RhhCoqw^4{7-UW&iiPS6pfXcv1hJT~t*HPXUwWuc- zC%%$CHCOQ+Eu>pnY;3xWWuhTUCai#GoKD4lG|F)fwd{iybXmxL0G>YsCb@<-UWb<` z#g7~0{=s<+UNiwdYM@VW^Zn%!xUn@XL2RqQy^lbp`t0%~V;$DFokI;s> z-{+7Oh{G~$!8Lf%4)}KxLqPuN_xS$P!x@&qi7rl=qAdl=c0dn38U{ha^OUxEPFi@P z)d=&ZT_v)6p&1(F0b>Ve%E%|%O0Q(nV&kLrO6m=MeeFPkKc?a0k`mn&K6@^nM%Pc~ z)oq!S%R2H@=2bE_GiROBlOZxjWgFygI@|a5z1)KYGH_RRazQxFpiJ=lA8W zq`&Ms))4w@2OJtsI6*_n5cvG8y4f8o-5(wS$PV61i z5hvIkj+Y#Q8rTn_x=V5M&FL%}HwH{x7zurayc70@NS~H>wV(pFln$(eTRTKfpJ<0N4@*w|dbG7<~8}<AD=5t2VG_Jl*2HWao+0Y$v)(b70cFd9_QEclJM zB!#Th!znn2i`Jn+UQu!BBhLClPuOx-qt=8Y3V6#=py~By+s#T<_v?#zF3@VggU=&D zwIOg&P)ynAZdn9P%-DfL+u?^uYHHlv?cv8qXOK*CNgKnvjyWL9Cm*UTC7N<=Qi7v4x?5>W83MkX&R_cdpR0~YvWt;Moi%r z>6Bj>T7(-lT@p^>3%LwhXw+ak2Ib#yl{G3jDD=iv!MbCrpKl7ZgMt9eKzvp z;2bnH`Q$_x3qY)CByT3>@>Z5)!u2?o=5P3cvo`_yVqFWokk~V3PnJ^bbo2S<1~F4J zo^Hd9cQQ<#K+}v5JIrY;BE@lhwB;a`UIZLAWlvkBmWKOFBHnrR5V?fYFv5Cc$Z}np z{44!@A5FE0SbA;L1L}yg1eqE@(X=F(U46nH7@_h-uAWS>XHe3WThbN<`B((&JG$e1 z{h~b5-rKqeYZ4b<0eV*B0vmsRv*N9C1s*6rG0Z@Dvg_oO^w*bMp`!}@_;$YE&#uefY3Iaq0aSiyYx z)Ur$Ust&0$Ry-N9F!x%+>GA2F5s^tEB=|+V{sN0)qUo3vBqlRe0qNWZiHqfGgbmj9 zurSv3_uWzdr{JwrxkuVrWkAek5jK8=x>;<{7}QOfPl+=-8~YRXK!Pa<7aoTg*|Z^v ziz^9PE>5mUq_5;|!2YDcq=(o#%^fX zw;g>o*aG~kW9|pO0XgxfN!_UG?Wh1I?5ET1r2adE5ZvFA30HGOx&@yiA4gD!^J$ta_xDlRu>OFDQxZoz@Mdj zGOTMlc^IWi2T&G|8_nM^XhQ?4)#qGgsW9}yT)wPTMMGhLebJ!!gW3M#aJ^bUJwL>Z z$3)Pmn}Dl8js38Q;NGl??hSMwRsG}*FYwNuus=_J# z^!f8c@QJ7Mvr(kS7CswT?&$rG+PEn<;ec7*c(mh2*U|zlCtd4!*yFPFX&lFqdMou| zd}`0IK+kUvY+WvicHJ%AHtVxoms8yA)Dxp6KfGbA`wtuzpPaX2-Krz>x*UBG{vHwD z2W;z;8{%o-NbpzGs5_>TR~)<}e8UXifW!}Fp6RbBFPxqeU*U9L zfByTP1FWx74bK#|FiDW3u4dQ^gUE+_B~We@V^|(|HKS4<$Kokap31JKfWXzcq0FkbZ)ms49 zrbyjO+iGeJ2aBtHPG0Y8r`-4XRK92Po*PH#QmG5hzrHxDaJ^v|AD2hmC!0d-~6M>RL;CacT* z)831Bj1BZV-45!~sGD?ln1?Wrc?ZqhteY6Yq?>xS&r81dR}RXlaW_4Jkq^P_(1${= zu@A}Y6c6d_z=sCG^oK}Z>YsAIp${2?z7L(e*gwI*`b_dpUPrx{IpM@|Ah%7xX1E+D zBB(R79><_Dk#g33q}@iN;RZUcyV$T6u-Yuh-F%_0R1p!2Zz(KE;VYxQDFLjktL; zlbNbDHtUd6LO5Ad3{p$Dq?J8uvn2+Vi{k}a6=PY~OueeX%*N&Br<{q34J@r>Tln%) zhh3=Eu;S5AQzl(XOxCekihg%aVKE7X!wCz^MO$DteRf@mH7MG}E~I~Ch^WM}Uq~j# zE{(x-OccfIG7iKb6g* zKajt{aEct})*cZOZHHfHa&Zyo2eJMlQ8w*|dUl)dY@Qb?C5O$#3NximIF%QRo+4XG zVb=SDgf|oH1Jino0oSe&3x-aF6OAK_Glj#=;pzymzuY%JTAiv7HKHHki(!MyF3ct# zpX)QQcXk})Xy=fLv5mot;Si?}9g5#Q6%Gv9?C9AFMzKc66Hywt{L;fkulXe+y!U#r zbk~ZwaNuuT)w5D}Io?+`XO`JH&3xk{UbhqFhVckAb6TIdJh2tepkzyJ(9!Yua{!mU zDsAiNu6?D}?R{d4PG^V}z2*RH=AwnpD>M_%>!u(6^-dqZzN>2^Y<;n&5O~zJ*e1FB z8;m4T<1*sWQaZe zn4x$wefQarV2$ar4=H8k=%d~%(XZrsqs)!vv88R`xuzQv8zLJr9m0*^M%6}fqim+S zR@*FWRd>iW%q*x`t-(;eRA52jMm37ijVLi}F^o0TsaKyI=lXi+Xkq{;Ab63!y{uCA1QBC%4{b(j!gdz4S zq%eYLYBQ{($aX({wcy--&0H7oz5n&o2D!#(__VIVvsu_ZORu6rL*NZ0M@2QOfU33U zvpW(3?R8+NWjEbfbupy~{cvyEXaq}|3CeNk=TT}sFO3~d3`#C8bwQjS{JJvSx_qJq z{n0F6hUjl|Le$-2UKO#9Q0RxbOh@zd-2R0I>o1LPAF6tPD#uwv{1U?j<9eWVeF~>t z%=Y`Ltj&|ZVE=9_{!?ndF?h%I{$^k5`X;&{`CnYVptXgWt&NGTvyio&k=4K4zQTmm zz&}hXgNwsu-sawmCpFQAdAm}GDhN=5eNrzA9Lwez0$gvZwjhza{qVPigWL-R6n&!C zyqud4zxeoewtoWZ&U%L(5tTI*jZ~vOe_DZ7F{3c|)p948CHOaC9y2)*GsOoP3a!^m zyxpht8YGF_hY1vJ*|K-QEL(WeVjKrjAfCVn=8V?3)034T6%odE@I)?t1py9iSd3Sp zkO)8bqWKSj(@XAV`C|%wm=MBw!WVA;`t@Bwd;C$Jux2UO&`j*ZM_h zhFz67q=^7=@&t?0Scn+a21&C}yF-J#wyvxPJwr}+p|$MW`Z_MYOcmzZVfa+fzFLht zqq_Ac>di@n)tlwne@mqQsSpIt5vEpsFWd9?MgQ;R`&Wg)$i~>(!q$ZTTSn8yz}8si z`}KdSZT!~|a&(j|R6hek@Xo7xb%1W0D`6ORpq?NKh-e@3pmPFJspok2n6K)z%H(#N*!i{x;hg|+4eEmo8pJdlHg8BAzzE6W^g_me0k}0yMI5oSl@;V0K-JaeH&c-ec}B-hW`iqg^Zn% z%fBeWaH9qPu~YPGaouvO^%26=s8<*QR4|`B>`X&Rsz8<~XDS%{R>5%J8t-9;;p@S> z>*u9nvPO~y(lYOR%8h^Y{;=~0$z-#Ou!g8Zv)peR*nCTyG!*>DQ3p;f)J@wsc*#|a z=YHKGS!zxfB6r@1p4gs+V2t9kp);nsdr<#4LfMoNqCxr!BMRSt+w#vI+=&~N z)ctPlTYR^?{^dClc7335%RXx#qa&VYP1SRYUT1u#lB+= zmwe1HVLXR~C(i6Ak1LE_4pH4`&1qWP)Md+-678bB-@!Vd$B2dYF350fqbVz8<+H$K%~XR%Kh`c5 z-3oM8VYY}zi^<)$71h#Wq!umfMA*usV_gd?C(#SWnzPB2q3ts?x6g2wVxBgYBI}EI zIB0o2og+}svB|~{yFlD6$@{a|))Q6IuHP}kG%!l41GPC4otdYW(4b{YH<7Ze+1G8s zkqtyiwPmR+Jrd1n-ED16F-2sEy0v!S-~IV(h# zDK7Bidixo!c)XF+=r|)aKs=3notvOlUQ3_UE_+{b{Wrh}LKcUp;0PXZNemA0U31$r zdRcGKqALaiaamBsM1ds9pi^!xz!(3MiCa60x@c$=u_1i#hh5|c#1(MHU*!FI?@xGR z0P +h>@&v;Kmw_&&yXw{<`tGtw^*C|d>SLL|V7JW>GMuedyrns{7sl`#k|fqk$t zdEmu}XB@?BpB?G4ldx=p>Is`mOh=qwHxOet_R*cAkPYpdNvq6*hshA&F|+mfywr0i zCuH8Q!)3D$lZHShn_TLaq%=)JJkOxTC3!`SXPZ^Ms1dUeU{5|siyH$^awhK&+8H#| zPrs;o@GJI_nT1yyPy07H0m`iVrzFWN<5ccdftPS+qopBw1oh((Ssxhcs1H zMFF`o_J8Q9{C}=IB1_rlO*k&l$LU>-;}kxyZ{3i-p-}23F6Ewo1{s?UE)Y;=%sb~i z1It=^230-wyOK-D>?&7WGG|noSb7A5yk(v0kjD26qICDObPogJ?ef7SYz(5W@`z7p zQT)OB)aES~737JZdMX+#o)LJZ`WOal+x|c%A?5DI$!_TVKy>_~on09yVZ!y)zvkTS zLvUwskA#uQDD4=Tw z@pr^-;;3L?@h`Qw2CH(Y9jMy0c<$;)dm=Eg6sKc6Qj^gk}#3k?uZQL$hQ zQdnpX>ciAn(lk)#G8iuUt&8f?`;~#7l62>RQ&}ncR=0y)EYh2gveHAlC$bu8fu{J~ zEa(eUKmE0yyj$dS1NOF$r<3J*fsPj71m8lSTgb2b_aq%NIVXK(>omH#`?s>k83jAn zs~-I4e^2J$Y(yiU<7tw++J~D?HN?`UhP$+4zRY0WFuyk2HhG=nX++Ib-*CaXR5l-Z z7=|tJhQ5`!SvG4-IbN7TSa0Ec`2GUud68pjB627t#-?+gF+>rUxIfB>1@!L+_16oK&N6oSi#(nA6nR+k z(1{`pwTIe(9h*(9_C=hJt#YZDC~bgZs-DtH;gV^g$pV-QM;F1LAI0!o)OH9sZWHhx zefwpY5xI%UXtk1GRy`{q6vq>Ksrz60%0sKe}o5!!`&?tk0 zJHdCrgBsTYj451Un9?g@ZgC7Lwegn(q|2M|7{hKP0ScePl%U9)DGWd290n!9sKyM_ z4&#WC(+Cqa2$VI5J!I}Xg<6nHZV@1e7&#${7(4n8EGB~z(>Eg>GPHux`;U9_64z4Es}qV0Xc3zD7%M3I7&4HOU|fqwxgG!Y3cf&?^M(=1vs{g~DL z`eE1YeZRcwt-cvf%jBsT+H|WuC~@_8RMlpy^T~QP_e+%fwDkPEk{ENk(+n^FPTR@J z_F>DnrZ1=fJ|DCpHxpAx;O#FGKfSC}2SNyZrcRH*F>?gXD9~H7;q;Et!-ObE&_qFi zLBvaHdgsug4gKw5cmQ>0x~WFAWQ?Sqpnp9p8CN1Es3;~WrWgWmS~4SfAx$2}v5cmZ zv-U4(Q?-r~((@Qaxk>CLk@j*NX@v3CybBpjl>&6Gqo177aiRx*~SRHufstCYKkvJ#)eB0l*d>ux{?sH zpJ+4>ZMi%f_?QP+&B@HM)QH+hN(e4+C+5cKWR}xPg(Fx*=}v8fp6XQMmyTwo@OZn1N~tjG@1rIaLd z5kpf*F}G;ANFy>`03VxmYA(<;h5Ky$k_!TBX4T&$VDgwcf1;@)J91-74B_{IaII#* ztl%qF{n5vMN3SW=BX_7=ibeHTFc^%LRkT9gSM@0>jOI)O|v~aqMZ2HrNOOHy^lKQNn35LRH;Cwesgu5a5CfS5%SrguQt*q z;$cs~=wf1F%H-l8t|oabN8p208g#Qar~LIm>=NB_*a6Adlvr4pBD+`((c~FNS1#9L zEmUM*_8khWPPh z*@wz_+^SY{K}XgFtDVDls4>=D^8j1mG;g#eeZ#pcnpT?I$`H#{jhEx9PW*a~uqEB` zO`-zWi1-&g?f{^E-G=b4BM^QnE%HJf1k!Hr=jylqgXmi? zTyQ>cieO}HLAa8Cy9tQ$R7$@@-(OuPC?-S|*}sjCi>VNgh#Gz3TX3}kq~~{T%ey!T zSdrWrUjVd*TfMTDAJ%zWqa{@^&J(-(GLqKUM4pSF66JA45daQb(ly)fUO zndv(h(G<|D^Y~#PL{iXAiHeeyUctbCQRvli>4D}-!ZlZpRm2aTh9njCcdyXrpJ#-g zWL)L(bK)UK8ino*QS3nugtvsHWdM~sv$x~pN!djdV3Zp=%A{csEP}@q=wq7~6 zdXhR7#m|FB&1Oyw^38+Iak}oB`IFtaReKXF|3iFLjwl94I>#i?M0p@3BtYOpg-dA( zq`CV{uo$LVglDJR)E8`-~V+nq^YW`Hdlys(_-j3>+9XwNA&oY;RnDS)55 zT71U)$O1@8=##E|K_yi{FIO|iy4}0hN>{38Mt0hFG&pjWVJ5*)(_jqZ^78>50%bUR zsGvTSQ$gn<)^k*3x|LkdZwZR_iHHM24q19!>m$+ znB9nZK`bg-xsqkSFA6bzh}bkRhg8++ly>6&__5FP;|KZw-wG<5IJlU6vxon? z`%tX~>7}yN_SMb2kv&F|P687L8zMR-v>KFWFoz%%l~6}Q=Lap!1X(ynGA)C$XsKjHKZUA6v~)nD-z(<6GEm z4C2|?b%N2OKVTm8>h9#X(Ym#pMzgwiAQ#vIQkI}T{^IUO ze;5gKeeclH2O0Pqhy^~kHI<&tJho3VP??DVcbBhQ1TQsWQkHKUE3ddy7B6+|z!B3W z80IxdLH+HODv+Nt!$(T(0%5~Tt6PWG=$*VBe zZa*`)U8ihj>~?12l793c^1f9RuVwszjeloaA8OYjG-|{4Hv7JNVz=Y-)l1&*<_Nd{ zxcdj*3%EPEuO=QmNLgAB5t_R~+0VcptliL8D=>cRTe`rnsaOYobg{txd&s~Ss4sHw4_W*hBPxq<-A#09z>wOI^4Vg9ySO-wW=|9Ca%Rj6Nm@X3 zxCo8r3aV_eAthPNeoGc*M-6$rlsNKPV}Y(WBYJ@}9{_R=tUx(T4#9$Oo&ZV64}S$p z5xPJwj0*u)h{ewwwE$J55n)Ou=lYpdagt8Q#o#gFG^^XW(@KtM8FPaReCteusXlG2 zgCr-cG?lS!e0;{xapegxlIEyBgj|2zeLYogY~}2P?s>2N1Q6|*jvzajZ|2%MqjfN6 zHBu!?$w@p}xFf{g0~ zP?UHlaAEMqc7Jq)ooBRy=H*6u zl)jY^)2zFQa@FL_xLIklyoYJDU|EO&;*p(wTG$&{zdy>lrw>ZyM< z$7Hw5e$i2S7(_v&(am6;(CFO!;>Hxbd6;l?odS#NV2 z-pBO{iUHNYf@#bNU60e^L_=U_F?uMKk#1s%rZCyK@^+dFiBdy|5iYuS+j@_TvQ$>q z);Q=ij&-`+$N>zi2a>%q1elS{wGpIT3)&3yn1L)rS+qq@Ly1hG;2nmzXDK-`02;6& ziDB**j&;qgIp>X($)W~_AR8ILNc*sq4h0gv=<#JME4eLM49(Uw4HAI0LLOlB?mC!Q z?wqI`)rr#2Hg|n0EEr%LPe`SzXm@X}qb>=n74M zFnfZ=&5Vj~M9^up;oBCzvJf-Xs>pG&o~Y*LTx4iJ{}`LrBv^73CNRf`! zLA^5x$Ek1?F!=(B)9cN)Su3&I~9F(aUPoy+~x%^eBRvy zUvZCMpz}f*#ZuXPw&g#k2uv~+wZCZzAbuiCS6|z=kNY~5=og?DRO8y7SdFlefh-$h zrbiCfR0f*V)0{?{%s(aFi7#dDkb<_P6SAFAT$22Wc(?~3Q1`lPgiwym>mH6aF4#%~ zI@&r|BWQ~a6SkG-#V9EmFU#miV(D9uSn4K{uZORn3elt|z_y?s^uxN0lS$!_JqEqp z(O2=buPMknO|T~|iO3NzqDl@@2kQb08fZUV?fVKE?v_o~sS|m(TtU1C)z%g0o}}xh z3^Ye`PA|mF-XS8(Z8dt$JaH$$UB(uYEUEP4E{*!5V9ci+UnqR{nLiwr~Zv z;x_My&4s&X{Q<>Ir(;;Sp}@zR zGoeX777?G()lSg6( zG3v%nMucm(4W+vq`%r&ELLP*hib(4V%&f`*#dX!^IX!%Jd0PXUO-$q_LqaMNyA7or zLo9|x)YFp~mv<~oVDFNkOVsZDwWW@_3pPEYjyi_%oT2DwljF)=UfsbSM@EiJgP7h+eIKL=W`+%^!FTjcFKKLC@4}VK9jM-yc44 zU!ylaAY-$=0zSy=Pjip%^xbFGPx}bIM0vR5$-ireOka5=fU__#eMKXV;I-p$iQ7-s z(XT0A=y^m>`cYr>w!efO#%~zROJv;d&Z_&Xkn5w__0CseL{%{1^*jy67RD+>^aCMq z_xz$)jJB?1sRX{g;PqF5AA~b7_k&<50orJso^_P*h4ds^G0c z9cTQ7`F3-mXB})2nUN6EaOWR6#B4zDBU2F)Te?`e$qG6jZtnr+= zy~j#<1dmj^^O*92?;mFT%>_~YfK}1Da7i3$p(-x(#ueK*Hk+)^&MqutNk|k$n?-*A zHVR+k`zF%oNrtDe@ne~j=l~sn;BcCPkjY`SYQ@JUHC*OADzTpvDWXSAEF#nTm6HU5 z23{6(mZKSe?JDyq$^<%Z+@)dI*{4dT{foEAA2Oj{g`P?&oVnEc7;fklQVnM8QSX6I zs9EM02TJ_BjHIl0K!tz~r{E=uX_n_n)`o(sl%i{c002J zUdBnz&1D%4J$yyD0>^dwazFFwMU4TOGI49Qe*J(LBxSwf3Wk#^$V8t2I*VaQ5wx%@@lYIPdOs>>`5cb%zzv`}I4#tCY zby==e4DbM(aI&c>DyHQz2hmM(C2lwp52N{V&dGEFMjB|{fnSWUwtvbDcXn1cm3nHL z99)=*%tb#dJR>J>Q@A4w?fWjn4+bMWsH}u+m_0h9gJ&X1hg~|u*<~VEu_si7GS%TR z1Cy7hn!K<5!^pX!^}qv74V@hRFv?+a(wec@JYMq7Ka17*SNLFLJ@b6uR zLHB!bCGvW&I*Qq$j0_Enyis6~lu_7L%Vzdzus0-Zr$~+1Cq0NKj-56)=WN>)HV2@x zMjtq{j;oE1y^;mSdJH&j>|NVwb~QW&w5vv29o~i#*KY@n^qxBWWfNF9g?a-)G*Kk< zPT&)j$rY2HTQYy)USG-k#1wzm0@OMIYQ^8d#NQjucTUZBf}W>ho=;}~b{2ku0(!nb z2zaiJdA4EE9H*LHm5ui7(xU+~4v%)pZBEC8IbgVcCMEGKVYpeX7^_ z2?)Gy#K?+iiJB^3m9|tp(sSH9@tHhM621>jp_k#M(iQ|}fU!8QTo-}&XB$137-y10rR)}i*H&UN3Nhzvqgd<=bc_@V$0ZuP zthe%fYSjvDB3q#AnihVmq~0m^_{yB>nAq3VMTxl1t0+*og5%1kSZod~K@C24Rd7%& za{>>J6oU0U0_e3pnN!y~SLw*ca;WE6)qGI!npS@xToR*IxY9b%(w49GB#u)_$?2$3 zRfb4Ec@`6e_OL8^;CsBMzoWv#bZL3n4E?qGjn|}32jsROR*A@HwL90O0_O?WWNATF zCk2OUWucQtZNYvu$5*zDmx`e&pf8?#7Rcj>PsaX0m@y14iMyEZ&&&`aX#Hdc@D}-S z9da8}|AW)!rp_aYS0eSfDY*1L+Tnx$XPIA6tlKvZ==el%d>p<&)uN?g4y!1OoZ`jr zwD#TYehQUTUP)q3IZ53@IWWnWocta-gBnK{Ij4w0Il5!^lSJ0|ve+|Uft6o0(TXPp zL{)>N2O(ByCQ*fCC!)A?@SJk$Q6TQvKmYrWmYc~&E4QN>U1EU>%UF6=(Lya7VeZd&G0Z_t}`$KQp=f#IqlfBNi&138~w|tjaR=OWAxP z6S%-;h9-aibP5EZ?>XUC7m%N2LNJL!yX1bKg&@+oq4S-=&p#7&9;rIcwDUF>2U|=E zQg%vw$^YoX3E}=AU1lxZ)Y-EDNf>*vSi|)EV1EAp=sKq$&4OsnR(IL9ZQHi3ziivK zZQHhO+paF#?yBi~XJY2g#GQzYe8{(aI2n0%?zO%*vuX_}{diNg!?v{8Et^|eWVgDpWo+}` zixUjrA%rWhtp7RFR%{o;EJE|z(LO%){Fgg5wFu<~< zapo691$Wh^972FtB$8devK@GIecFW@Z-*7QBcXrBP<6me}Yw1?uMGm@Ma=l{9o|#*CC`)=H z3$LIM?&{{%QpRy*3-7gA)nh;(YI<8V`TX9Ln_mf>+Gy~qn+bb7xZA@bj*?3a8@B-& zgWoj6hmRlw0S?OZKp+Vgf8>ZL;o;u}DPdP4VLv8(!zsZ8od6{#D1`7=o_VAMpLkh9 znSY_4Vwsxj3+4BBSw3LDE5jFT5;m3=;*0kzLzsMFPSB%8)^Wlm{Q*RRe4kx&{s;Xj z(jK(RhbO{XV$6_*r3%KhtES-`g5t zeTgiX5;))GJ`k{2-`2CK2iU}O-J?E9ieABcX;B9s47jJgYN5Gu)50*-gDB0E^nC{M zctDqQ>*pM0k3~;ahM4IiTS2a{2FKWC}tlv(AMHErl z=SjE|$G{o(i$M3B71qS-*kp^EURxLO!sQyZz_+63@ON9DWt}_X9RHGT2241j{CoY2 zttW7D0IJuydj6NjE8s(3;n#JKi!lz^8!%2}I&~<4hyS%7Pz)jEJPxlE4(^F9eh(+e zLF4*6Y>ohG^*vgTjm_1w+5uz9ncTw(I*(~b{&?esWKoTU&;)({hE@DeTC9)}R8JA@ zV?5pzAI&4(-%Tyk2>nPEHPjTkHC--`G#%tj)G2K^8KyJ#Cv6+UAYZeUz}v-JS~=<# zMb@&!dyc0kGxjs-Vm?jYCbq`KtMGW_xl}hl3Ibqmnqv7NjGW* z&Wk!)f2f~e7nwFNgt8B9=>@}~JuF@NRdY~hp}<`iBNw?XqzcHbgPYiLG%#PLtms#E zCC8q-Jp4-y6ON7e)&}6;w(~-WtoHg9{MLJ<>suFh&7Kq8z%5EZYhl5gwc37(t84IS zK?W0kkZXY#oDh6U} z;-9AW4MO5&b4WFye`_0k{%MWEYtwmZKPD>p7V~SX|4Z|L`z!eU3|}Hj7=iSx$gePD zobA*5DFDuitJYnja!4@`a#cZC|8mwlo`4skV^0)}4Y*(~aH!cTBNq789tQ?p?{s}+ zO(_D78O~cM-9aD1!?IxlmY7N&=d;Yr}! z9G&Prj^#CrItiVR?E?89YzGVV)NtC|TQ#Souq%Rolymk9MW^ z;ec1~b5bB!#ZvEG(Y<=P_u){%IY9M6z-|lM!u?PDi`eEvs1V{adW!$~PtOhiW?{cRblK+(yn(f*t z16~<0`GtmCu7uNL^m&Q9rFXkte;*5qP3MUmZx%Rbh4yx|NR9F3uZmNHs8GQibdMiK zp&w%ZB5{R*IO-Ie#KATiixGPall_H5Ev<{`+&^*7W&904z?2=&_O}Ys0?mIs!N!_k zl5(cFKz7Rc@cq7jeg{rK3#= zY;DQM8<-cylYLKQZ-34rPY+Dm8%i`aL!vXDZCb>UQqIMcr~@gK9a$3F+lDNWEV#XM+YIQoH^)HA@{697_i;UO z7gX{#wD?v38TW@jk?E6G@>JU`0qls!iav)ItGn;2oQHXzHWSa}o3rQ?KAM}~zL}-j z_vuSKE+@4AoWjB!rpyPQ9d=^xk~a6&zpP&$+C8-pVs+xII$9jJWzxG#P19=D~I`?IfglmJ2P|F(i zKZmhxL;Qw(nUex>)3Bh%%?Ftz4o;yIzFCnquepV_Af=oJ-D4mk)@=#wl-L=!_dDBK zueUa}8pi5c(gJ&x%Gs*y6j-P(4Q>t1EXx;{>H~d6>fS$tM5&r9rdn+=rIsdqu#T}V zb_7dn;|v=KtM=qaxnR{9mKx)g%7R&CdQjk&$~`BwF?S^1D$Q2&V@W>|7j_@l7u)`t zfFrora^xP_SK(WZL5v+)2MK|ev{Ji)3`Gz1atHNtD>cdvs^!12j#{~eTDhajQtb(f zkoLBw@XF4C^_9AMe|skL&6_jimml+mmos;(oct3m^FuyXdTzf>ZI<*StW{F&_dxzD zn?R-{x0Nndu44VxR_{Vuo-W?%NyOLdp-F#w#QrExG;YIHF$s^{-R8CmA#DaIL8@9BYh&7p$Z-es#}iX z4vSZL=p!rC`x(il*qrcuekaV*TXdmgFj4{@kB40$Pxgwl)k9API`l5*{V1*n{0L zL8jmGhw5d%BglD|AZL%|k~8y!=R;Q?O)`tgL~-Spjz$hC5QC+;^Rz;T23}B{sGK(q zYXHLdo!WU@G*$<~mT;CCtde%joT^QG<=@UoXbuh&RMU*?Wvv1lxq(3f3{|r!D;-%m zgIPRFzj#wLJ9U%Vi*0*b4li=l{G*2#FV5xd&Ah0@%bs5;s_D!U4cA}YFb{ju%+m>^ ztK)+L>u2n5!>hhO@wpG7-?MHK8EcBTP+_f)n?m@(mjJz_SDi}wY3yR!*Tu!b?jDr7 zSvOVmVCcbj?uzXrZU>gVU)d6W|0Usp?td@+az*{%!L%jU-ag4liegH71Ozz~LQSaE zW5iE&dt5%!CtC3%CgjpRc`)O=XyEj!b?2Cd%T$u}G3?PsLp?U+yeOrK+El)TIz5{g zv<$c^)GYPvtm;9josb{x(rZ^9<2@d7#_v(u18NuS3Pq;HSIXkZLVUtY!Hg`!4F&dIbTncrj#y_P%l$R z(UNmg!KGE9E*D!_;;amyQ!ZOzy>RXn%n@X-AnVj&CDvb?-?5~EY2MeK$@yG`T?1Eo;5^ zbir(^pnel_A@vjT$>gv2c(;7gspA`Bue^NYd)CBLV87ROVZK$@JG!mVeh0sB^_AY4 z=u>mM|Gco}E51?GZ4o}M%BfV~&7V~RzWDtd->J)6Y5T9_t)~!IWwxUGoc&Sise7%= zuk^Wcc|rNy>#2pSGFLui**8^^>*lcnU5oQvXcg!=!K(VVpH=645L7@nx+r{rwA0=K zJUcUFDvQDpM8nA;x@J-37hIcDK$#Z>K4g7-8BpY7N5G{=<@Ukj#Fu6)(6P|fahXTv zwCb%gMA%jqWwCC-1{uG`3rQ{<74}Qc7_&PW9NAo@@*79$&;fCMheZ5wroV^_&+0f5 z!V&Ux=Wi9vRef*zL&xf>{hhv{%imwnD|s%O*P&*&LKcMLIa$lNfC{?|JN3Ljnt+hx z2A!Spre}joTNmEBg|M2O3(MRn%oEy2Y?fyP)%UZlu!=w*p4)i9A&*x)k+4c>oW%aO z%{zg(F8&;TZ!e}$2`<+MkP4T1?zp3QX8Aw+vgB6n`<( zTbCk%F+YEm%G#-LmS4AzWyg|h$SZ`p6QW(OFGRjhfO;658zq_A>?Tk%~{^!emjs~ng zKsDvtmWkQ!vU*&Vtq@6YO_MGF!+diR@+o3#IJhB8m;!gfx>06SA2ul&YG7 zI_O%Sj(!T-J$j7PLZCBN1&RX7u+Gnd=zZ9;o5`B!+E3ul?e;5Kl11pA#h%aUuGehG zsrPHP)9sXzU*9c>KdWU~gy1&nAP}EX<9l^L5t(=UR(}iF4dWdr^1t=ro(Dd%X-?!Z zM#`PJEC&0$@EnFaP~cZ=4vYO?!0=e^bt1QQuwUvBeFIB^Uv2u&{DNPrBH-U^!_03v8gHMD4gipE`P84F>MwC% zKd8ewqC0ftp5HgfZ&fUQNhirHb5MVrz`kwwn+LC2*HLSX*A{qYygIdcbMex0 zSMnrAn8CFdgI@dxA6}BLS&YN58t)a!bL331M{`6P3p)Cn6bbDeh*Ip?D6?^W99~qr zP`rhxrY+=)uVU{Pe7To!Z{;0}D|vYlSgpBl z@xRR_ELELD6eyKaga+g0lf!rnqIvT95;n3L9JxV!u;DH*NUjR z@{p^g|E_j}%H(V_$)A7z`uxvAuPmbmOmjC@8#`%|>l_txGqvQ!W(QTuf(ji=DOk%( zh(bYWUgE5gpasT|6na&TBe65NETMp>d4*M136ksOdS)Sf_~a*tYwG*3E^5I=9zGUh zv-YqXuwtb1(31)SrgyROAqA6atYA%YTM7Hu!84bIlf=L}m;)q2OpJ!Q1#=mA4fXIQ z=;7qpd*jBf*=QurF+Ar}6g5$4tk%lpOsLfC=qBPE*>K5fWLL}jdFoqyd?GEK^ZRLk zS~-eoYPmTl(Xxs!$|AdxI25#2`h!ZBD`3*Bkp`Ej!k!+Gq#@N-GscUU!aCL!vKOq; zHdHV13Hck-fvV9qtCD6{5^qZ*tjvk|k^Ow7=6X$#xc1n^QmA`U5M&SJdn4HRuWd_hFG z_lhSvF3rZW&|K%>$=4+cK?lEsa!&fKQE5z@O>x*t1|=mm0kZP10Zq7m`@IY(0a zy40XM>&|#}>q&oB=yku;+}V|0S>=0$Tv=OQn{O^}uC~{9o1Lin(WNqVq~Oy4(-J-b zFnfwf6^Wguq0;A9ItoGsAVg8Z*BWHJ`esdLXX@*pO4IHpX>B@6U6Bm&k2}=1x>Tyn zDVuZcfOw-D2|lCFC8XFx!HPsue5R}X5V;n|YwbmrN>B`J>+R=90 zsa<6W9cT;PiM2_05ApBF=9Hlal+U0k-)ByA_43BRPL-wFV}J%Sw%m-NuKe+CmMUq} zKR~@!}hs@`?q(Ai>X2^kt(Ii2@6he2Ti4IfnDipL$?x$veG$$SaWEIdEt<#X!n=o@_ zLE7^6V;#A1zq>Mb(ZBju9`|5#{4t?&grYEsWdoKn?{7HIKBLNGL1L}(7i zm103oMq}fn&6x;~9A#Z0JA{%n3DqqdMaR!*+Y)dP8s(BQ3v`npVFgz@M0;KJ@wP5I zl!qd0WA z0%hz9DMO^3)|vgKo^4<(AI4-?S;JO5(CXQkea~j2w>!#NnTF+ods>3t(FNY%mT#b} zq4G>q{3A8J$hQNCU(gL72z=7DT@EO(`%dlX@CO)pqYmEKN$xnW2WA`rdWXJWzsNCb z;i>rXlmxvcRSykZ(0Z#={~)dejy;vuh2;IQa+bZHh&{Qasldh*ky1`XGbvX$1q#W_MM{vHnSMi9(Y%bSk31>H?SLWVuy~`DPff;0&I5 z*lnaEs9SXri$Q$JVUB1W-G{W^QAUOUk2BIXqPX${G38i3%kxKl2@~cVmdNA7e8JBN zw1p+v?v;kdD>K+L+vN`!dHbasg5NmJC&}(NE${`|`lpPhRNeqykSjlEnq&@ia|MX= zGJ}}CDX{w3fm{xpQZ-0BosrOor#p^8Q2BOEyh5QZk!op~5T}$^&~)AA4d`#3Y5ks@ zW*?X}viDrUWsIodJ^aq6xsCsAWXO%h z>vXg6B{%Vg?+vN;pmghJkI2>~=~j_$Bk%eB_A%*J!%9;7)0w61jBHZ7O!!M%!->vX zx6H-%H3V&!0n%1nuE1EX*L+6YJ#O@s2`50eWeL{71xKeEZfA;Yp~xj1W>5R!wo=FL zVSM$g3#shUsEgcTM3FIA@K4?_9^D#uio93H@L-l>yHeSr74&gKj3Cfgs`dlSVKv)l z1~lCF_{=AATx%ago*ZLbu5heI-Vx%f>hVxp_)DA$M4v*_9ZS{Pt$VB|rqG6PCr#=f z3$Rh#xAt0JR4$Et$_@JxO2|N_o&(l;xdSP^JI(3Wzpz!XLoBA4P3`h|{lRXT+mM`k z9vnacJl>v8#v#7|2Oy2d08`3`;U8h`DXTu*5RuwdPH2J=BfP@&!S1$tL;$$uz9ryO924c#RNrgW44pc2{xs^!8{ z$U+tA3&SbrL-11MiEc_Z7(qk9%Yuh3=q(MP^#16Q#G`yr68eZ`m++25Ag6+Bf|`Zc z_64ewCgVaszv9Bf!H1Ga2;O)N^%M;D(io8(mfDgcBViFk?p%y#UyYmpQDd?&||{0Y3gpftE^BVm3acPJ#06H%e5oiE8)=KL zh`WT89=urW47p8q!?+|_KB6_D9lCXeFWXk^wp*sacZT2^0v_9Ev^{ zGMw-)5tV;6r_4fJjRn>q7i%lSaR{q6HDQ237$R4f&2a*-Hpp|^nRcKnk)D1jg%~g5J zE;5F1kI}D6$yK4!~IghBBs-81qf?9*4&?JJ|^9XO#PKGpM>0Yhh%;;l{hoV%;J zL*ztVP);GRc6W<2%abkr@vLs(_SU!aGa4P8-=Ns`B?R)TFyv*UXfHja_NJBVRlKJq zQ{f4LE!IzpynKs|x~5qg*%B05v6k^EDtn@EI?&c=a;+5lLwVV~Q#-AK%56s{E>lfE z&r`NdEGE`0I8sC|Q>WOh`58W#{jD(CEJF`$qC;|3LB`NV{urQC8!adTl`>VYp=e8+ zvWUz`#)6=`KH9XSEH~3@n8BXX&VGXK>7{P~66JBHG4ZwVbrz+g$oeC*Eo;`8DM|OY zq&wjy^xa@{`FI81X~K(8k3MKZsB0y)6GANT5eU^Td<^&@E%9`u$5Qdcy-0klxf#vG z6+Edx#1#NoIv{`SVMFi@jJCg7He^ib8?iGYJU1AHP9Fb-;Nk_uq%vwlGmN&sdY~{BN(#!bddT$J=ty2 z#>ElN5>7gHy($uiDsJ2RO#9|eNBAd8 zVd!0RJh~fIyW#+a5j8$yh0WS*n9tI6F*JzHUy7sWr%-D^4z%l=%neEQW&$`V)Lf0D z?;r`X*z+H=dH3(rn;6_)@?%XO>)1QKg9`Hp%cRz5nC!vh zkXOp^g-GH`-Mj(&GyRFISCue#A~1%iguOnGa=&P9tu*O~>+BZECKxk;pbhQj0=!)1 zE-)}iX^UT>WVEk7($O0LHNxDV6XY}l75I&ZnyvN&A=(SM@ve-h-Fp?g#khKM9HqF7 zumR?K+X%gJur)MG_>@7mZWGnC>jTTl!qv7d*i%C!CHZnp(Cx`3z(3W%l% zXk@ucgH)8UMG*?S0GncRr9VwA!S6#TiA%q|s|-lFBjsNDj@MqNTh7<)ADY))kGs17 zFCZEe-86dJaS+M@JagnElR9r(Y}x0S%5@mf*>jcEQw& zBw{$v4xWxjJGaqVYf70^O#Xv2NfIvzEnvB2VHsKhPT`0Q3Q~yJLyC~k+q{Fn*b$$+(2%g67ybt1k6!|w9r82ie4Ev;QHvIG{@NN% zVbk_5h54wZp82L;p>$R6%r0-^1uPhJ9=dZo2m4z? z3mJ8|C{&>-`zp>xDD|k-62~$Qj}d*s=#iLP!t=CrpMNGQ4wZ@9z*?K3Vd~DbQg5$M z+(@~`GCb41zTPQRju zL6r=B?vZ>jS3?q?mk%|^I#G&`XtBzuvY4u)NG}_Iq*9LVa}%8dlbv5UNMasKQ#Q>a zw#)wH+$f**&MR>oK1yn$P%mq+Ewy#bns47-GM!_lcwDeZ$)Wm!s8o+|p`z~#q4IL5 zi-L2hW{1R3&5E@_;i6Y@h|6V@XFWR5*;!-WX~PI#rr{xQ)N%lWnwnL}hIqCpL@i*$ zKQblonYu6FxTI9Wjv1NS#OZDUxb-ZbGb7oWtJeKvpuP(am)@%St9d563DZ4O*NwDW zBuFe*AA)OF*pQpGb`^z&OWB-?o|Yk}F`aZSh98$J-Wcf6G_nCy=tmNgjAU?hzPIy+ zt5m%6<@=6OF~vcyhl!eOpSY!L0c7>X5-*DI%&P4o?-~i2W3&#(vXV2SId*LC8yL}2b0C4C zL@KH>2&h!GgJo|w7&*nx*1oA|b^^OaFU^LSKSR=KW%JyLB=$-PUm@<;qsq=6Wmqn& zk0okn6jBM|J7&rQw)bu}jD_4teB&MYPLyq}wL8j8D#Cj-s*=f^U~=CsVt}X zf+`*ldMr!OA5(3%z}$tq8!L^js?uYX&}z0CO{OkmpgFy=Rg${~cNSvDjyVfQlwTKj zE2yPQf4vWnCeztMVJfPy=7l>e>Y}Q5F-a=rcn|;OYmjCM->;*+V@G)#Mc?!NNinu$ zvt>`#=h0u**Y!4oyo{BXa^-PVcFKOA7uLthN57G0_iXE7 zB2l;WwwIKBS~8f~Ht{ggijHt;5SFx@?*>t#`w5iYNSPEP&33$tSiU2i&H&W)<$Bi@ zxQ7f*P>IWKGzdY}wWIn^M*1X2joD9PHw0w8>j6x0uf`2#pWN2F$ryd%#hBp-tnlK% z4BlF=6Cu@#{#XTWqEZuRDLbepBZ}f=kH`~lfJir>1ek2WA3Wz-*>b=%_<$&A&t~F_ zBp_uWhaos+>&FT~AOmtFA#BwohOFJelGMOmmEbA_L5%H@oK(BXNnA)vbuiTuLpK2o z-?M}ht4vn(D%@I=uSzqF z`(WlwGnSL8XleLUteAlFPXd6oA6z6=;h5kHDNIq|0qxaM8+^g>Vz1w(Vy`tkK(j#V zQ7D~Q2+B8ZE)%XTZ%z^@ck6sI+S|;NCfXCm1K#AlFZ0=NL0U4Ncq1d#Hqm7z)Y%>Z zloH=6Ef&CwiAg$?ex7?=du+eR5Nm;ajT3=5eN&4+nBB$ThA<|TSYyB++f?9-Ft(Lt zCULUGAiY>pj|u%cWE8}Tl9RSEazi}F0#jIfz$asHyAv~M0_RKdV3heszmRD@=lN4{ zF0vULc~gu*-gd*?9zP~ml3BLWk_lX9YS;?H7giG9PK0&qGyU$h2n^o-IS6JU>})2? z0SYewK8~pb-{{ygSajcE(le0KJ3KL0UjUD2U!Lh8uWT#y4aYy94xO*%NbV)BN;XFJeMJy+A!NK}e9Y0%6NhYBFv?aywRu4x;u z*-xq)at&@tlC&K^nPg&mG|Z5>!%l>3VBsdrtPaK)_RfGY(VWPS)fZ$(HaOTtq)7}K z@miW-NXq&}U+x6A$YBk$k`&7Qo2dTpQb?RlVSn8g(q8W*gSxXOl>D=@R)k&0>bm ziHrfTJ9iaUYQs+IT#44VX!|TSpurw|Fo|VkX=&7)778h!S!^Y%v60o<%4}|Bm9(LT zGS^O8{m-S?*1QU91LvJ|^=7aJLlpn$4WdXj6Uw0*CrJlcO;&{st84bu_Bm+>Rtu^4aM!*wtJKbvsU!B$29k^Bj&A0qh8!DXoe`F^z&^I z81Im=+^gICp8%78Q5WtYxs%F%q@QYwY7KfbzObK5>-2_xT%VvVO^{d0_27#sY@-Coqu(aw=X#l!x8DaTUMAl+3~P{)4k z663QNg2e?Of<=j>ky3#Up@@=>NHH^FUQOrsncx`q=Z%HPk(a3&BcLGyu>*fc5>YHq z3J*j=t8Hm*ZCbvncGYeAtZe2wIg&#U*Ztmm{h9g6_L}o?^Kc`p^LyKl0y4!g5gi{( zi@fLR1wgbR=+Tb0xCb3uiMk`{ojzrSxL09_zKJo4_DnE3`+v3x}*s<5N}}d}|ocKH7x1@XT`q4#;udD+WDJ=1^=+zX1lokLXZs z41N{%)Q{>=ZH#_3_S}!`P}muLs_VmFIfJ;mG<29{cLa~XAv)7P z6j!Fc<@I6jdLd!qU?_N|SWsRWcp>8H9#C;ikEkz<&?tCDFUsq4G%6hZDo}CEQ7F0k zXw*2yFX|k_PiR=cFv;)2(B8lNe7Xtut)j)R?1vlwAm;6{#pCz*iZ1%E<;jsVyU<3w zycl-{R0?oq)L7_gE#;ce{Nvo4*Eo9j14X1QC5f^urL{9;v`ukdvrY6x>JA0LRInGX!U$}P-2xFyzo5olB$d@`M^e>Du-i;Tlq1{6pSd$Lkh|H!MH(SZ-g?w7^4-inb^4tfQx6<6>E`Fykf{Uom{1%S?KINqf1dRnSYIp4I$W(y%sl zf>TFZv5H4bRC=tAiQJNDo zvAZNr$5PxCVXYy|G0M$Z>_u%p38-AfFEp7()z#mCi$Q}Q32afDd*EIXG;_S7GFh24}wTxyPIZvMK<>J!MUxyMaoLLNaRclR<_ZObqo$nz9qvC7KWi6^& z7iW)jVW%pCYvCJ<)XtF~G)qfWHUt}8{Rm_VabG*paGl405IqMihYh|wSuh$E>K>0F zCrp*jO`7CRrHfhSTR9dQ z2@)h7Omz78bIfHOZ;}^T(l#obskp;-7x=_p)M@i~H>{Lc)`-YkXmZ9~jmwpENy#rh zE*!MD`&CO-b6wLGO(v|BD|xqCX_CyZanf&!Co6kT%1r5P7nrkGi0w+awaomkTylg% zB6C_}rw@&VBh{VPD`?9c9q8d6Z~51(U|6PwjN$_#@SR}jV=+r~dE(H!NA-D*N6PL| zVw@hLExDCwr4uo2-3Oyi?<&_Y46_aT+vlxdNXbF%ac%Do#Zpyi*c+-%HHR8ghcQNt zc;eD}G{zd9Y1o^r^*ch2)l#=KY|S>t8zYY4QfFwiHExVICL3dp=~BBiZwxxpj`>or zXNfXqbV!vG9{Hg+-OtXY5C0;|URm4P`4p^h4=~v>=(PGI zRjZaLO`GpoJ*~MzGz)_FX{CMDLeafw5_aC0%aQ9#tt;tMGo8hqJq0G%E$@(eB%4{u zv|?GatX%@sc{H7X&1kdOt#r#iy3WL8X0hDPZ&!DSKFZD1WNxwCE_Q1_;>~!m-Y#v| zdi0&Z&E#aloAZ@-NISKi;LU`w;ID31y@#I^Wqz{YFKyR(2s}E>kh8#B;u#tu^j-RM z2GYYn{5_i+Aa=(B%OzA7Jn|c%i!Qp$7QkyMSy!}}=(u10#>ic{o(m8!{0mOp_o0cB zEx_k?_jGZmsbpuy+$j<(oofrHM8}Bk@q|xNk<0Rc@uAv9;SF|SubzT5fmdcZX9VYqv&#G6LNq&~0o0=(1IhMk0^+2v$&ZG0!iRF;m zT~*#IH}_@z4}~RP=;1|KL2TiVqPsMByb8W3>v(hw0Q`3&QgVD4Q zx*6WkI&pb?zox0#ABV%yEYU-<@GNt*s45h7lNWS#THC~PRCdj66eoe&D;3D)bkf9J zGTTm0g>4uIv#iqgjKf(*@Ca`8Z4c9m_Qw$&eK<6?f_BXl1c#;(9pl^tY{ys-I<_z= z&svT=P8mQ=J6Dqopoe1$hptu-P{b(&NaEHyOV2<#q(xY<%^|fZY#*PrZx`3b_otk^0rsgNhi4!czbzdg zoeJAU57Dwx4pYOWGgS{$BehM{PN8&&1Clu<7pF#i2D52uMFCZuq5v&G7N_bqltUhi z)v(EMOV-k`$%sq((nt-9S+@Y+oM^>T_N`&~5@6r3d}(`5G-F9d+&*}z8W8QADGL=t zrcfOyFyIhOgpLg1jIWCH(N#|7t|LP>FPSAp;lLQfFh2qlcy35$5Fh0PSwc5U4&&-T zXb>K?0m4P+1R<<5O$y_rC{5v{D35Vd7{D+nid?WgLK>Vv_d8gTPAGVRjwqOs&U!F| zt}wWP4h?|{01)Gt8WH+!bASr6*ON8FogbP9dU)bk-iRIkKFIb`n-F0w|v>uuPSv!<-NYLEC>f zEks70Pga!Fjgx(BW{T^P5_W!_F7=>|Xt$%>>J#n`rMv;DV~=Q9CmU2S{-XTD(~N<( z2?LHv8~|4YyN3D1YHK}6WdyE<{n@bU4t5!%UO(WDj2+X~u;Grb9sSxcBiuL5Q&hjh z49U%luAf$h=*7c$^-MFuCyxfsb7?={gevdp`ltRBA@_wR%qVy5Oq*TS zfAQmXjW(9NJ@W9$QGaEyRu57K6IttCu}s@aZCkEQ$*T7Mu(YoM^Y#UQ-y<6 z@Kz+Jp38_eY0^@U_p&7*9pT9odlm(0DJh8F!Y=GAluVdgx}OWsB}u@x8MW;!9HpB| zaELXVS8CK#^RlHc6P#(~NRT>O<+t&5!xrY8x08+UWl324H6jkuGL=RN?B>9YB5M<6 zhV*44!|k|4X0WielbWKPfuqHh9WKmxTWkOjbu@D)%#?&NFCbboHM!sKE_4Tin(1_S zP90xc)pytWc1A6kt$)Q6Qa(GEii;IxnA7DX+;%fQX3$bmlAF6upnFL307o3Cu&}2F zTsukMmP9>-qUWV;n6bHEgX`%r82bL*2pVEyGhIGxf<|LWjWKO55MhGEBYJ7NaMQA8 zqS3cJkNiWnth^V*yC7p)kbl8U;V+;hEhz9*PX==p!GRB?5$MK!Ji{IzHR}2-Do$E} zf`wST{7AjKnBc{iJGoBDWl%gpudV4-1$~=HnKeKm~I@tq0d4)B1XnQ&!~i2R7n1Uhk_dB1U*Eakzhct=iR4!0*;8?@ABw2ybhqy zG>daY*yiZ-E5+a=LZRNT=LvlY#K3g*4giY8xD; z9U6Q=T5L@0fgzyXenOO)Z13Zco2%5P<4iWFA{v_O5b10=R|~Iq5*d#oGhWd*)J%al zm#H@Le1XrZmN*iw9%#-9$OfrDqb;<5hY=fuh5lTXrWrIKHp zgFOQBeNum$5m&7*&vrWHN@SZ8^mK!wAj+LVZO~MlYX54uhf+}ugHl}=WT`4rR;n;6 zt3YQuwYEe;R6a?5Bulw1=}_?sx*cGY6Oou!7_ylTex~oq?w`wUV@Fb!ZMxC!Y1yd5ohmWP zdX%w2;KQUl^a(?%kLo(}njJ4XqC}sg=8u!`1_UgOki%+jZpy;qTPBe@{6SE^t-X8t9bk=`MqH%P;fnptmTpHGor*{j$Jns-7@W=&=bX#% zhoi~7p=6MHO}y#vrYz?MV!n%g@sY5@k742dtQ(nU&P4<^{4wZ8FU6_aCk48`nNM2q zKtc~Aa7pdiS$V2ZfjQO6n@ko{EO~2=a`f`@+6{m!u9mozbe?ddC`eO!I+Yf=`HaVq z3_GDfge*%tZPH}kgd@hw1<_moRp|XUsHx9F1lwNzl>;R6=!-E{>qbkKJzR>2>&`eu z8-rX#K56|DwuKi9+%I&?ZJ;I>u>{QYL$OZt-ycpE8S3eJ2Z^8?xYA_`NgX~81yiXT zOX^3!Gh=Ob@V!IV#($_n5@Mi}yNj3(_|Wm&DNNdJN0#8G|74|^iohj>tE|H%@G2c} zh|H1~C)%{D#RIRA0WR+)aYw;qn{k;dd*f?^kqWCKODY--tB-;u42#(Z9uZHQob ztZ6pw(K_sPOgHQ~RTY^})W>72oK;6hc?{)4a2o2^q8OWKM*%_X)-q6T*xYCq95S^{ zoIQ!z^#w3&)A_27w;3N&PPb4W3_8%)>ZmkasCx`hcAozs(* zD9+HTLqXA}^q9V!Bbo^c>zHXF(s#jOZas$8HfYsAWvYHJQgs=q0<=mn)ppDXkPVEt zM;t!bHr^rK%I>c?MREgsoFoTYmI5`|Hobzdnh?x;RGh1)HeLW-F`(=*arwkc8>PP0bPNIU-Mu%Ggne5UgNJX~2TLdFy zJBCU)sOEf<$1KNAMe%@9cx5)p}BMm1B#n}1S_Wm@X9!X#C(8IF-KNJ=QuE< zQM`|!h<$Ka=eJc9V>?~=o6#@hv@TH06*+0aHaR9yYEzxcX#85hKrLmMIDBlNH3Qj! zkC@(P5=glqRt9B#bOxE>F}vBVjd;l*|01O<<7WZrvCSNRqVe34R5o(Bbvzxm3z3_P za}Vo(g*@Ujbl@~4NkSI$z~pkA9~!$R>2YRe1iOnMe@AtWe1 zS)%eUbiM^`-JP8r(>HmGFJdNMAsDAE!?q13-wbol7;}$7#+~iLYY7wjO!cIX$AJis z>MOnjtn`n(+gs?pYU!D9CZZw?o9g|)+d&-1!5CGzo#UpIkf5B^&^)G7$dn~mwfRjV zOJ@9j#|-^5 z&S!zJ9!5A-lr>TZ2g=91t?4v`Y(Xx9Qv%Obei|Sa-0ADF4}nJLSyAXFi6JJ7zVpw=B}yblBH zpjL?ZO``tF(N3|bz6F=l-K$oAG<>tZA6^yl-IT1vnEMmyP3^iC7{xC$V$BETf+>q9 z5FQu)cIqmkrhI^<*TaXsJSHD|D5x9#6*q$mI)y9W5T{!!=HOldp(ic%FRlndHg4NM z@Z8iUO_*Q0I#8ZEZk#VtobP+!&|v6#UeXw(%&_si%c=XL)@>Q_#|Lt}c~%M7qUMK0 zI%=jY_@?WP4XFmj{$Kp=qp_aRE~?`75z+fX2+0^%Q?iqZF1t(rYS`l zx8qMZD4{)aiB{OZNqaH(-{AvYn2f9i35YM|77(*Rg#7@jZt{mYWDx#_K!@bH8Whs* z75Ty&HQvsu?iEvsU|gY4Zc%za#*>%YLGbyADgUdB3FN+lSk09@<$@3A8x$9iS|$K4 z+n3s-#Na1glQPZl?iWvj;xPlM!;^`tF=49dNU1(0{K1~Vt-=zr*@(_cfUE5pwS9$PY3;}eqzw)*GcBCL$^BG7QbyrVo=q@oYj7Gh0@d~!tg2%Qa!OLmxCo8nc{ zYnMyulL2GySX8@B5x95S!5ub#(ZWGQfZoieb zqUAQtePU5ENxk#99&vMm&P}Djtk&DVw!qv96~+3Qv~Yf_?Gqm<6nV@rIJaUBRNhF7 zQ{cno@*70ZTnqle`{w4z^c*GgTfc3?NKKDUG$+k$i$9KtGA}pp7cghK_~Ld3#{LC? zmZvK0j?@ej--nnx+SYqBo!x&JtIZm&Pbq#x+m%>4=G_N{CnhwbXA$-XFKT_;30~$w zYS#j41IX5JN>-Z=qyz1epaK9d0KlXXcytvVw=|kxbIVQ1dFNe2D^RTYL`=XZ*j6C$ zEaH3q;BBn{huz7)$o&{9W1`G8v9wu_M;po__%MP*T ziIqVUUDeXQlKA~WRO_pqI)n#q61N8QYE=wtQ+#(L;MX#K1frPrODz_vSQgh=R`hCD0i59}+=u+XlY3|v{VuXSL^oyn3PaWGc4x^^)dDaf_U%$>qJ z=*SJk*DtEt|K^W!ix5OI9GPvY0+JRyW;bb1^e)aoYChhUFca@P>FqOn**M?A??i8W zj$aAI33>X|Os6xtQ`YNF;@D^?(E}z^R-_&G8vUkKy7Wu!kom@nvR?at4h=Nbl)A z$X^&RU@FX`DuKQ+G-=Eyw!6Rs8dwE$pW6UF*I$&!Zyg z%dXIJf;DD?TFscafzIodh6kk+wJ`B%FQ0`;!k5J?Z7>GM`v@-Wi=Ee-{0T8z&A86m zkwKd{*U|#@9%>PHUPP~M*aPi2pQ1*eXdRO1Lw*|KL>Qjo!k9r5K53DU62 zg>-G)2#s-RvdI&|>~Iss5woKFZ4yueuE`?D$W~bbS(Tj9kU`cD3CbC8+8l(*ZVyjW zlbDAkM_MURzFobm1Ef3M)ze)>Ec?XsHoF5r+;#JU;&y-QrU|bXzmcxVhU}zB>%C}G zGRKSW( z)z^bP4Tp5QKST^QJnum7WeZr|%gpT&RNm{oAZ_C`eI+Y?XgB9Dv)9VJh3}A}W->_TT_;Y?@fXlGzd z_aDL2%*58t`M2LrXJ%q;K_~Y6@e4jT`JXKG|0#cVt6nG~iy?n!Y)}v4yOA&ii$n*A z;M_#|hjtEuD$_zjNn~W3VxXI{Ha3>EzhRF-AKFz(s#7VC{d5WFl8&8iYoO~_ubWfy zmC%*WyuEvueq`nFeZPOP_*1#(A5dRkh#P8((U>w%j@QGbopGOBJDqCJv0JYq{#zyyLb`MrZH$n3RNE{F2WD!D4M> zLmP{_B^F#}8XF4dz5Vk|XI-y${|I@>IR@D|Ej&+Buq8ns1L@sX2W*RkQkGB7#y9CO zByDJ-d~@r$h|gy|DsE~V_RyT<$Iq>}`m=C-QN+)fU)}eRRmH)^?UN^%Gjz%S%6%)&qaetGwi?Sp$(9f+ z8`5E{#${HjgL~+`zD2oVe@k=I*N3yNc(Basrqr}&vwlkxfUY^FE;7GoyPl=91z+wz zL>6Uu^aiN3EPsf4oxdEWb{6hI`3e^HOgHn5)LDg02F&3+x=ojtG6>3`Ku*a^pf zl8g9-we6@jQ6OzQ@1k#tN&JBM^f&v`taZ;vg;t)Sh@yqhK}@Mja64e>Zyx-SlPLIJr|1v4L8HFGbuL?W$e;gjM7q(>&M~0bPVZ_JvhOB$L!dq9^{tm?x_CFLXM4 zq`K@g6Q7b} z`Rrv83nf0m6xJe>M|^~yLT}KE-h7*&M*-EQ!#hrvJQpTtw>=)|g=*W3O$#x@+ODZJyk_SAU!kiIPWQU;mp$=RQ)AP8eA2oIUF z2GYp*O~1c};>FcXad(Bh(|9lS4$+rnf?iBbwWN5Rv6y6pBTM;r^axqh2HqtwMw)c? zZDRFFU!^|)|6Nc2%gH47T@2OoTSwu4chCRVaRni3J0}wZLu(U>Ul^Hzv)zASWF~RH zQx*KkAv06f^H2pMaq!I+c_yLo0`MR-iO+@71=4>`R|lI<0X@siDc2A8zi%C`IW|Wh zT*2%5{QJ#L86F{R3!F(Hr=491-AAcug3G0(mMhKMXNFbmNh1H^?Q4^gLS&vwSte2R zFf|~HrdEQ$OZ+8_6R~^c+`spE(hA?+=K1gauFIT*KvMdJg`LP-- z!rZ_^&}hYerK|_DYIiozzBz|pn|c0U*e4TlEv62?`$_6AIr9JU=J(Vpb zEEQ}Xwl(9Vse73`Z&axD+w{oD=2>L{@>u{VieyEb)VkosI)lXFdR}(k+f%;0IG;1B zB@F$d1vWkJ$J|-)AAnJZ$dhdlajJaA!L81hZ{BH+m&>VII$z&E`VbPpF5#dGL0Diw zul#@TFw2J00vx=F&5$@rj~plaWTeLo*7ZN5wL6Q6Xo1a4cC%tV+L0FS>iOw&T@^7l zrZ|C8_hYX_A1>y)n$Jud)4iRkuhiSc4$l52W6jj8jUfR3n6FE8G632YnMv>`T>z=v zH5tv=*ww7J2RCQzN!oB{HZe-6($efiMP+m*OhczpZ0K-bZQz`}>1ErHm1i^yeRGo)t4Ak*m6<0 z3FR5iH7Dv#YHCHc$3omCg%0qcNANZEG!@8lV&Qllt{ZJ!T(HiiUSTMgS+AHlzD{c6 zg1=Y*mQRm6zbR%UPq;iJ)Z_4SpV@W@|DIY5ZmaIyJ|wyyCc&;T5*XdPFwmycs#)p)P*taM~t`xQIK>#(pDa5qhkEx{3CU` zyQMO!rI4qw9>SFU;|!-pYma)QbbEHO73Mx30WO36WqC)K1kecYkD83jPqiL7R&5DB z>lhHp*a}k^iR!h7Y~b) z@HJrL@w*EeI|0vxvE0Mn# zKWAx@Lc0J{5I}NaVB#mj@ngEz`40J`AarNx7kF|;b$zqTUZJV`gZ94{?XtT90{P#9 zjrDuo`F~~UDVdm9{a4Laa&|QNUtRy0_-@%jdgPF}jlZ*sMe|- z4333I6muDovsF|3In{jn! zZDxDuP8gAcCP-2=kuT!&?Wg2pLv1N&Ai~>m(){G`IkN3LoGO+@3qe&&zo*V?x7~fn zhK=Zjgdh%X^KJ8kA3`d&>vB&&>Un;BL0O@JzMC^y(C62@?!l35sfL{{l1Q-(Hk`+On&@5>^* za5y0X4*2dlE!qYiZs4G;J}MGi>we@FNY0TpmM z=}KKPS!FEQ&WKzxo0>O>ZReY0bUWD;1B1yA1ajBvGFf~4U@r%;QI2Zy>YWO=~Bj312t!$OM<(JA9W1LMAk*f zGwrxMNp^prfxUMDJU_ZP0`cD*kAZT7>ZQ%!gx|I8 zQP{H)JWCjJMX>0U_A+S_GUr0RhMvX$JIv*QCfcR7_YDBMV3NLBbUT$6PW}P1flKfQ zB1#}6?6Zrlul3g6-}b1^A5+0Scc4%@K<7-^){z`%VP4wOkFmVi3n@Wbbb`DKFBH0T zUgN>)$$ZDY&CmRHRvbIxbe*0u`8*(ge`f}m}u>1fq=4z&FOeql(80=;(MVLxI zDX=5%KEH8;JS@KcaE)MO)ag-R4IM~z?#hdl16_*Ix3GFARVhi~daOG$mK+Ju8IrWs zCMy~pvXR_l2`OolF=~Z1tzvOyGqA>$yDQrvvR+NDf7pl-!rp4CZ0USDWA(+Vsk)o? zMCjgAy*MW;A_jQn`*O3$x5ip#q=jLu)S-nAl>^*lp(f`qu?ThYo;=!AV8ioVIc zlVH$2#00>O|D0qlhml_MS>6MV`b6wHO0U_1BR_ooR}nA7crQ z*}gBaa;A&4V^F4Ky>j*zZy6TQCe){?Z{>oGaEZs6V7HVh`2;7*o#~K&jESGBRMd(T zOp(nAEp_xFQc~lbX3%Zic0_R53<__bb2pMvx-NBM8GXgn-Ey1eQo9PPYVkwodA_aL z(wereHOk2aCq8AK~OgE zLt!Ez3;4R}OVjDlv4oX|FgSqyrZ{^`DAnOKQSNtU^>DW5Yt++yh1VL(V z%mH!ghS%sbNB^-J7G#0`M@Reay6c7eXh7?gO*TXyQ41wco#n`%m8$DafL9E*SKcXX=VW=&^oC7!$#jz|GzV{ThXmn~ zJ$Iq78-UX3X7B_A#gJC&hoo&R(S|m<0kK$7MzNS4L>nBaQo3prN66Q7whVC+0bK?) zb=PrC`|uQbYhK~Qtg;+)=ikY*SThn^>67SE=^KXA?CF|$LA+Bg+$B;GtTw|~fzTTB z0c#oHJ!M*)B@k?3I{$WE_Ht)55|wxO>|l?F^Baj$BC;VQ6-g!0Vr&WMoSz;nNkJRc zGh5D@d7j`ABNq*uRLPr?4`t6ddLQ{T)#!b}^LEcKuw=OVYRa9F8<2W8^*y(8?{GV{ zGl}=$0fb~YCgcvs>xSz2+WFeCmL2&swzCJy(bJ-VjBzn{Y@gt9F^-yhoX5~{xA_A~ zGIzlv;%=~GkFDpyuMwh%oJV(A#?WH@5|QcE?VKpGN9PrC{)`b&iG{7ZO9dzNIF@pI z?ngMP3_?f?GFfJe(fkc*CGIt4{X`VX9Z+%lQ8#7T1uIIkQ-=~0(-y-Al z-&SuaWHR3Xp2}J2V`D)Zq?8{}+)mN$sPZ>EAHnl?jwBMuaIHhmniG0E0pip?Owf-t z*P^CvzN>*|0k}XY`SohT(Eaf_${Lu`n!T+fVrNs@lv$D1`IsPAn3IM~t>AF4aa#-U zeBl~vOPgykZR#0Vt0Ms)(@`Q)x%y|gZ*e>^*eH3=HnLul6_jsyK+MRnB8_eH5Dj!8 zuQ@_lWlKE6yu+sA(LkW0T_-XHIakoFa`!p*-;V~~^5&h?4+EDOW7>;0woHI=VGSG^ zlEwsgMyJNm&Kf#Kj&c&CH`(KHNj4>%)z?OfAQ16W0jO(H)KyQd90}8AheEPTH#Yn%JGa&sQk%Sqze`6@i>@r1Ao0z&gF6L4dWTCErIWaDwB32XS{j}k8vU8$q4|N4^wFb+?2f9RsmdVXxBTyGUGGNcDYo++RC#* z>l}6z9y{%bVug0nqEE4QMwLq*={zgg**QH}Dk3{PiZFeXK#k19-7(0t8~&8t=*mfv zA7Jf;-BDPkmpglqn7pA(Qxo^Im}-2TSUVmiC&wva;R|@T6`pxS=dms5!Nfkw3=}Fc z?@@YKPuD{ zV1}U64v^O6`NM#feaQ<-H{gpivRALIeiMi zMdP3S$mKcx)^HRmIA-|BJhG&Ghsr|k{47IEG)OnIx8U&}S)MYp3t>=Z6s(y+J2wuM zXO~{0VzjUreObr3$|z!Wh^5=F%3Wf91#0OfD+nYQMrrniJ|9Imk_qb$pR+=;stm@3(xvE>*JP z8nyBsTz=h5s02Csn_dCYVNQ3|Mz{CIIQ?M-HRpz4>}SMb3-L=`@G!5Ra_FRq-gbIhuZJyC!)q;#8@C2RlE5dvyQ|`ckx{Iaqv zCUp%2LIWrme&pcIy9s;nX8uK5B47qWuf-=rCtWqj;78$Q#o5R%465)5l4-3V36AW#2gVtLqe&K(iG>|dP%9tn zsO|Iil)p1QwS}hHy|BK-qJD-IR|(-n9Pd?6P4F8&Rq>pH5BbUy&&#of_6g`pHWQ@F zo0OiDb)TD_Nm_9tedNBvG#C2X@R2N0B-YIXy|*0QL4L|D@F-2Nbm^$?v!cEYJZ`4D zou(~gKwb1#WfEc2fVO-DO*W(Uc!~mdOBi6AHS9qcE)QG2bzL9pZpw6%&-yq;*p`U9 zx79(D38hYlK6ACBhnX(zH!24J(imP4cCNWA73>u? zQy@&5pvxKQD@<1bB7W-u)jT<{9so0wVVV?_UL4!ViYT|aW<{?2fBN6Z(u*rO{K^$zeKgDI0> zSj3K;mAs*EY!F)h=MUN!o66!7z&KXP$;rb5GLG{z^Azpd8=5Dn!8=}^??T5PyuLqg zwN@FnI1jv1-9|b3KJHbF?pm*e-48(B7gWyTyl>HRF83Br?vq%XmOdv=p3gIA8Ssv? zVA0=dVo#`nfAhTHM9k4}wwJ{jx|(fbx{~<%@HUrUfBsvA_^%G>Fj6T`BRBwnJ{$l5 z)2|Bg|J@-Kwy?LhvoIF>Psj8>!y#>39P6KRV2ULGd;M`yti1;b;Uw!n@B2@ZnhCa1 z`OW>Y7b6&YFWmvi0i1D`@n?RtzzE(Ly5VPiw82R3KXil7@@S=Kz9fe6S4{vuxP9`P zhGV@t;1wWuoe{bqR4-*c zdTJi7>nm^#>VD%aiAeFlR>*BqcdqG52i@ZE#VU#hP*)jU#oDs^fAi3B{D}rj`+uOadB|+5<6B$c{bJYNt2*tHd8o~{gUhyG%+E{9NBL^^5VC6I?AMltao*^cfxbMB&tV~QtOOmtZJRE`lN=)29Hzz zWXt_y=SWHzW9SJ$w!W5SzP*3ntTYgVfX4#dY#lG-l;2C(5YJL3N^l8>d z7+W^`_`4AMM3N0*u-@JZQ1(Ux!T`soXkK-J3z$ITzGcdEt4khB-L2a$LpS)yU0x6v$77PV!4 z(A1A!ym>+MJSUi>cc`cB6CgSZp1DyBBi?mk6V z+vE7n+rD%mEg5dq6Lk~qw0LPHB(R918Kkw)5l;e)Ev|IQbR+>hSU%cb8gri;w}OQw zrTGG>NN@V4txP7hE`JpVGsesH+#9vsYz(;TE2wouyPORS9F0NoD zd#cqX*}Q6FaX|{?t0}G8Am93E;iQeg?0LLYnLEYs9$|ce`$)e-=2~m_*X)rJ5|IRF zYUOAMY~d`b1pskSu!#GKsTB*sB?x`@{f+x4oEosXx5bl+R zNa!!8pqx9xq^k@ajO~dh_Eb{&w?|GuG0$@MZ(nuTpOsq167*uM9;{47&LG zISV}Hm6eB@=?YrU%==f8@#PbVSR%_}HBw5DmZG-h%(F3vl^@dzt*L{U1<89#&m8XYy#h3k$*4^{A1p6B>k9sELXh54 zb$BHA}k?r5iV)|?pGi~+=B8- zf@b%uLzJD1#V&9gHtkg_^3A59Aeo!5)mc6KAS(;ZnIZ|J9S1VJZJCQ zCXd}8ipg!?-@UfgWsAopB51XraQ}S<_^+;hwFini$ZtN$#&15!??@4*DI zCqm89;05v% zdTY|Labwf1Y|zE^^>xc?5ij=u&5Jq3avKDb!V(lO3#*%j?H7Za55F5ep;yXUnZo;zayBX@?tr&YZemo|yeOcVFiShovzIS`dqyb&*x9+H7C zt)sIR2-00wf=;1OU<2%`5zUxljiS2HvEBOd)6V zyj%!!2N)Q@ZqC(K8;i{?USc03I6BqYm`$#*EWpP-v{ct6p7U3-sT_IvoL41XGUd2b#RpW{ zt|uv&DbDOED_PezvYEg+7wc!o*UQsSkQ?jz>BMC-NiF7O=W1S|YZ@T6hB#cQEQeFB_ zvl1K3(qo-P)jN?lsIX`$NOL@a(wlXRd&FHTn3Py4+GPZb$ItR}8L`1eHj^-y4T@Tm zI;?J%T$^ncdgdjF4S!gLbo~MawCOXz=_E-`Yn}s&rjksHY3!<(tW2$Ios6Z0V6PnC zt9s@n%JBB|<;4~HQd7VTo5JmqfJt4vOugMo(_vuf-$Ns;tldcahrMVKdPtXu)~7~0pV z;d8mcs*Q0cgvU3u{k_6xcLt%#3xs2PcjvODzm>tD?RNoV-S-AYGpY<_lB~zY`B&6^N-LFZ z@pKyzSQWS#N&?ms^5EjV!H<_ycr%`#p`i!{5NNL#xmeg1aI@P9woS_E1Gi%~j3MTL zgq6co2fLx6E((gV$9cb%0rYQaEwzuK4(-GFv#$^C4hdMxJ|G}>-wez*R#!EjVLn(W z@W@ZylqE*e&v!&pr#?ZPinMk@?Zv!fXKIy4A%Yp_#@KqJkM5QVrt2LBL< zEL(z9W!+j*QWRcLL_NdZc6^H1rylWZ$1)95rYQN6yD*@2UlLet;+E@kyASX77o9VZ zi_wDE)Kc=!m}n>xRyB2^!#PeU@V56NMb)D_sTUytQ9RaB;wZ2Z+~vZZ(Lh8hCwJHQX~746$*moG7R zbjv+G4sFXf^N4kp+B7}NC-y##yylB~*Q9Y`jlzqO zg$vahR7LnA!^{-qAG0j&DV(WEZCD%3ADSx3%A+Bb)cP(0zd2B~P4?>v%8UDGi&8OV zTRuV>sZ|&nOue{a82hU3E7^6X?6%?q&~0+cJr->xYK`WK;>ct)&069nWF1ivG!w5g zA5P1awyqv8yMd^eMwN0hC7+H~-ce;fN^Z)QMxptyNTUxOeu6O%CKS31+0}F8vU0gW zcMA_8uA0H!5#5N_;v>V~5JD;qVo?DA0>k)e~(1ojZC2SR}aXvS!4i%a(c6>ld5;(0i3uD9+ z+B8Oc%*=5+78h>{uC&g=ML2sWHX+W$md97MrmSR^$JJu%&`S>@pY;s#GhGH8az|XQ zEZBN8OKY1aFSyaG_)V({%Gg3jgOQ%#qY!3!xCFi#*T|H)sHCnAHKN!&0a*(i6P=Ka zcml)XfMyDPYa&3TAQftZf_C_MvfY4!i+cqB(8_Mr%C}gsKW6ddb>%FQv*coUB4-!U z*n%Oo!sMG>;5}{Fqt4Y)5o9%_v4b7Bm)&8K3|&U)HJU1v70u*tJ5BpivYd%;`|ABfg|6i!S)XLLCfyIo zG5JK1Mu;@CNPZ**xxYrP+)ERzP#9Bo^92#QQU)P=={`yy>C==}1bYL-`en5EbB3p7 z4zm!EOwNRVl z^bM(#=y*d=840Czt8BvrcC6q~l5&M})LW!61-ENqfjdAEpdC$&kJ8_uAEQ-ihhWBb zmY2ws!s=scXGIgE?mE76gfQ(QD0<1=!^n}x*q9qz*U}(uK%EH!A72myWU1i| z1MRdwP5g1%Dx?1s(xUM>bznCJk2=2<6$@j)a1u(ijsO}$0u+L9+MQ$J0i0n^1iKc8 z!d#a(dd?pgJkO|Hdtumz;+#~w(C8csP}0jDSZ%0-3IY_g! zk6A(}6}(dH)`%G{tbf{L#qAQ@sDfOK>U?dcFI7gxjt_m5&wL4=04YE86$m0umg2zA z!y-D_?#l`3g}opy%y^91#G#Xg)hRsQ8=nQUM?pn(#kio`e0 zyC+#ZZF>fttbqzSR0?w8B+m7)G&QR+_5Dj3wVlvvWGlZ|X}JQnBIux@H^gM8e0DGU z`y6jiM_@ZnX~;(Mosg+Yvpq5PXgsyC-h8*c)Jn5%nEyUV{+F1fvP~(L_G`7*!Tzq_=b4JDX3NPT!5&ANK=ha=7>fparus&5vbK$FsDyJ^fQgo8AjDofdF$ zxF^Suw$F}Cm!eGjB|gmOd3GG95^ORBV%bf(AEoYJ8?u~zNu^tVg=W~#xVSx*C3alq zU)*1P$aqGxa@^+O+J5qrba$QT?vJH5KmSSaxz5X>Z^+?1GKJnVM)`z{=^h>brkuoN zuC%{_vh^Mwt8IS%a>5TvcIL5cJ(GM-N?K2CbU(V2whaRL*w5l@-;usJtnR?Wc0x%0 z$@t~>GG@3nqVjzIBjTzXYJ9)bo{E8T8ZJvwW}c(uV2=5lQsGpce#?W!dzLZ)?Hiu z!y%&zu=b~i!DcWI^?EsD0MMoo|Ae0yH5#1Az*?jkmuB3{#Zr1OozprD{9}We1s-_A z*TtxjlO7)Cr3PJDsQ(pSypNL$xl0`y^n(zgq@gNA6jVo(`kE~jR$-W-nhWvIqRG0` z3y9DXPn8*AQ_T0&_DNdd#rZV1VmbgD$KKT{+(FIl6)y9?ER*C)9^=NUEi564ZZpjUbLEv2$5x;CH`u)D6mSmCOaY? z<}5t~Xk`j!V-bO&{KZgVfTd-HR%dX+(W51WC~{NYCAlJ2AaK4oeSEx@(jPVsq|U&K z*gJOkrqQMACXNW3>a9K`OVMV$Rk}P0FJ|7N*k~?uP?#NjrWp&kSy;|LZ-}yFs zyW}1yZbI^Zb1djEWAK!?Vv419OL?>YI=Pq^3)xmQRCa>e!p*DtKcqB#uY>)Am{pqB0tn2eI-_66{z`(?dC4~0*$%u+HE z81atzmenaR2l>XV8v1=qh($P~Xc*a~H^!a}Utv`k(dko@CLN36yW5)kJn0Y8;)8Xr zOgx{Z!Oz(Llv|n=BFBbt)L8a=mL(J;sn6hN%x9O$N{t}Xcwp<_E81g;-5VaHSewX5 zXTk0tnGR3K7Ej+RHqT43Gf8SSBrlPmH>WjcW007ItXkpfT>_#V_0Xp{ET}F|TW3Re z3Wy z^a@sQQkw;8ovI$j2>#?rfyyvNmLP;rn5?wbYhlg8GMNNw;!}A6#kP_mK2bi(y{8KP zl)wgR>*7BPZlpuO&VqrxgK3yu69{Rf)!=|{>lWEVcfHV+Ghz&whO zx=AO0qpdwV^WxMqq{Y#R$@NSM9kQ~HBUlGPV_*+nHl$?^EXkoqjLObCM!9B_z0w@%VLXhBzJg^{3cOIen$h!+YE{sY( zsbff%moy1^zm8*BjOY?UUESUof?&UxOuR@xLIhZ#L2@em1}53*X2TuZ)awM9L!-Zm z`f_%G^eBElGKY8YLb1t{*!py$no;!4`+f7McHoI=$8;=&=~zO`opbm~*dqEaa&&v# z5g`ONJyqltrbqhSQc4?40tCAj7L)~nO;6XWv49+EDa%;!^e5DOlv)8VA^lnvhAc7p zy1Z>6pnisjash+EDlc-B)z?4cWTFx-M*pgN6M7@1P!f$Q9iBOHJ}T6M|AVh{jLq$P z*L7{%wrz9Owr$&PS8dz2xoX?CZFlu_^LO??`O3@NP%%l z33xdAm8WhNX)?8BGSwgkWvDH!QTh2KVQ15B7(Q7eMk^ZcN#ogO7^fJnJ4~u8tCs0` zCb2tgqBE=TxR5`F?pM4Y;Z(mnu1>J(&^W>}&FO^C$FJA>O*s?T#33_GGHQ0VT$i-V zo^E3WG0F)wM(G&d1R3;ojYAPFIkpNx8|`0j&S)|vL&`wKv0?Kj@-5gXi7tRB1kwB_ z42J$f{ilrjm*6sJ?+Y;?h0bYNJr)Cp2?E}tEe4Js5m&@X*&wX34Rbk}fJwPsb=Qz} zHSj6bp(=7A-59$>I!%zbEWiY@tLSK)hIZ;lzrPF;iJ$#(le!npC>lVyrS%5HDlrI) zxjtIFET(`{jHxNq<`i7wUUF`PK3qw~GxR>` za{+-HW)aRuyTo34)_C@A4Q5(dWtQB427X=2iCTC_tHU6~j7&pYyhO}0;l#6`V}r;I z|3`N(eF~XEuWf^+0*_D!V%s*@9w2lH0iXAGv~F4lydY+g%xP_~L~DPFH8lOSt0Jjr zw0YZDT|{C{F~$(=1GVv65*IED1)L)2GF`qDEI$jj23d6-gPoWJe&%jL2x+G@`)SWM zK%p2Vx^!aCG<)zGp?)C^Dv*U&x`8dc`K$4w+8x50O(#_jd8bRNU9hbGIyuj1VuYEw zEVES2;0<3p>{(hH5;8m4^`J2q*#dH+qO>G3GBjC=0@s~v&W39`nN6Wk6Lx_8ZybRX znOtFW>wzrFd^sSnac-fTQN7YQzm{;)*F%62TQ&95OSkv*U!1IN;#T4*kPg z`u0eIf}q!?5zsDWjq0dF0w#=aL&7nXV~py!iG%1(XAOdn_t|U7b;7zaUE0PDXASKs zde5j{$vzmzEb&!didNpgZU>e89SA~90{Z65Zs};Yvj~?FrVCm4d6#phFswF^maxjp zj3$OW!gLE2l;kAY=bb369c9>FO<7i}1O^?PQB~A`5c-@9lH{dZtQ`sT{zH)znDoWL zCh?dlqW7vptvG&Sn3wE(I7(ASv@SAocd_jTPOqU)SzLXh6*~^}!U1aXak|B8kD3ve z9--EtFF)LbOVbslec^?;w;Y4J z{6pf&j=I4%FO_SlipJI*;fdn=mpNk}iDORHioFCOx_VXL?&M7%JZ_5?kZf5iBhA#J zdL3GOo1LphOu@p+1_1wXzEC0Xc->qA0k}QWR}}i(ncH`s$#2L!UGJ0^BYLvSCPcZo zU?)`Va|I8xdnNXAdpHwZBGJhS?rC57p51Gfn{z7S!q>G6X(@6Ny?K9EX87xZ&gcO% ztYYp7wZM_{oTi2Aq`V0xU_L26CXG{GOu@E!L1Qxz2Rl=Q8fS!Y5CTnDgqL)ORH*)J zI3jZ5-?)z|2lmx~KsmU@%(sei`*Chnqok#yQhobO^=*gHnI=2Aa|Fd_>i5isZEd!l7rr^{mB8%-y4fWPt-Ov%`iEA zdGX~AlxBpHhp#UHL0h@N#VnmBa>u3SM%v6&zR8`L?ktE=bZI$I(t)>zl%dc?^c(vj zWLDBy;a-ggq2r^V0g|5is#w9N>EX=U%!S6la&_#UM#{xSG+#=iU3%hAG{fH)yI4;0 z8W{o>`B;P=uzqB{$Y=B*{LoYPFu&d#Fi-q{(mc$cenIyyUlLA40D$Np*#g}^oBmHZ zwULdn_0NXsh3#x?3~Y`6ZS(Su|C1%@jdSGUXV*MmrD|kgJf@yyWL-z1mB6Skz%<-p z4Sm6o5EsvwHh29C%garCa&lai04D&4!ymcEpD-98TsSW)o@Ru$2;C-;Edb3tv1FFS zW}3{#0$CA!|8r-us!6jN9*W=RA^Ya<-y0w3ozJfoJ+cCoPv<10N7>-NtdjhB_*9RD z6d@*`cK2T|5MSy&{NeLIBOXv+Jd&i3&=!9S(_H82BgcyMByRW%AN3x0=Dk|eYzw~Q zx4$JHE-1c2w^mSaoss8i~6|#--kHET*Gx8z9s~+qn8!5q0tQP!VgQ z?X&xzi1sB%M@~?yKTN>K_@QbeZr>Enk&ImKKoxr8)Wly4AoOtdqzX2Bqvxv-*XUK; ztNT;?kh)}>tP*q^S!jjYRXlB=YGV^*Z+_2XOS%)cN;$RnXEIFTHk2wYcNCqex;OT# zF;MzsXSTMsyf7rYUe1m@dM;Gx*^xzwm5k>&kFzF<{W(huf-Iy=ZqVLhtxg(nHWeSY zzsSyiS70vLxO-P;%3)9v^LZ(=?%gX$OP1Cw2QnX*9{RH3o!aWY@&SelQYjk1x@H)T z0!duYk;HVB5^}=Bt%o--`g-jFmm3gtEDEa9%v5Z3I+ z!edh!aFGsC(_Y(N9%<@Tqs}i4y~w1cHaI2Pe$x_zaT}~-UHOr!pO)Eh#Iy`xRk_TM z71_pGnOcs{S0ycTU$==hOxM}WR-M|No7>r(Tisl*Z*QzDY&YjuSAtSKF(toTKr&ya zm##Du2F6E3Gwa07jm#y|wQ)an%VZnw;0ecKKhJxY5^T?y9vo7;JbYpLa;EhuHA4<0iLW3yT#$efp_ zK_ssKK|}VL9>d$aK>)eM4WN$g zqQz)cdP%&mF=exwLl28R^wGJ0>r}_Uf7v@XGFGMJz);SimJh6 zl{_yG9$%loc4f(koBK&2HZ+xrjkr-bp{;qS!Ob&aHzFmIlF@teba84CZ2{L}!=^(T zy0Rw6%1zF33lDE#X`(SIZi38}g-Cx~zJkcA+{SHk)EIZ@*N_$>YNHPk^FBLqek>3( z*Oc;lvhhH*JZst`=48nxyP;O+Ake=2sA(tP71IP;yvd^o+dTSeXe1HH7{HtEJ?oYD zgtI11^hEAt!vjo9kdBIrt`SPCWE1P!!1NqVfRs|4b0}}&y3`#Y(E&2k9L=pq%UX+x z8xXkzxj?D&sy+9Ydg2d|OIF2p)l7)d3Ojf&z8#XE+#C^F1I*41RttRJfQ#p_Uei%1 z3T+y0_ij!afu8^G9jlK_w9ix9E0x};@Vh`I2Ads8IV{TClC{*{&Ep%d zSiQ=w$uMHx)hrt-l8TZ?7v`ywa94`zY94V$R6fDB@|?1*WseFLd}6JXFd4#+!Tkdb zW+KJ03qOOlz}ROC&ZXmIH}Yq!+vW3HP3X26jEadi7YBxv$=CT_D(_Id#g2iAR9}$Y zI21fV9@1tft);b1b}GqudEHRLu94#Ty0yDFiY>{Ovx8_W)Yg@k4863~_ZT;d9_+Ey zpNPqJ07gCWIr49X^PS;#s;_9tc1N-0-kB_|4^vcr+8J`Q7gT-;{KfaUUEroYSifAN zOKwY5dJ=0znL5R+Hf#pxeL?pKiXXT_ZWP~aw=3_>PF)DXlMW!{Chj%^aWO<0u_i#e zY0g|>%uy{Df#jB=NrSGAwr8JrSeV1m4#!BScQf$>;Vbe&`Zg-2hcc<= zEJ$d*x+<`4x@O8h3HXcd`Fg~wzHey&OOcTl8juIUA*aQa-(h@Ik7gbUsk$NMW(nVo zlK=F^?)AB7`zyUgesUnF9FY$u%H5}?$?`Ars=Q5f=@qjN9_i(StN2Fz8CP~Gcmj8P zi5lJt;*P?w_E~nw2@yzy|DFY+o0`&ST>Yr!Uo_$y+;2YIUu;+LxOd=lr=J%WSBPg= z%9#xZ2(f3_*GvyI_PwU73M?T$N?C+|lM3p305~!6IF41UY<8=@0n3>2;62ERJ_~P} z<0UB`TR!i)xoB8!d6H3ceKg@sG&7`K5!JeNWVn1jq}WvFOyuQy+T#8DP|mwV><~{X zb!&(WxnB9ub4Zi`cw`1T=Cr2OH6~W>dn|qIVz_!6vCe?;G!v-aXMkeh$&+Jb$8XNd zzj&Ovhmf+ZpGDu#|{(H)l-c-3L5lEc5G`M^Uo~3M+8E2 zOk^INbGXGb zORs^lSh#YW{lyU5m3hX#Lp_Hyghw}*Um@v>nZmK-v9K`01 z45)j1Q57rQGr95hZ9d3cb+jaqbc|*Y)lzWOMh4@6TBVS!;{G%ncw3JfNewJ@adS9YrXErU4%JFH>bV}lmg^&g?!PI-c#vO`)HVQ2O zdu-q`^{hw^PSlQDx~RRt)r8OeyAlyYF?l(EH0pQ&9gi9{J6QUX>?8uBWc72iCNwe9 z*O>jA_iE#VAV)6sv>V!B^H$-5bd|*wCpEjts)FO3PERXS)S=hSr48oFvhkoLD7$6> zRep)wgeCn6+_$uwv8sZ!+)mHbKbmCCysAQq8GBk}puDbICsSLof55w*Jkkb?z^;Tv zaEgT83I{8TtSQuGD#HiE^cQdKlh`nr zHt^(t04NiUojtkpLGd$FIEAPtQ$2;A=W!K@q6k6&gYsd-Ng>kt`vAl%p?7};TtfIM zrL5iPoq#4cw?^-Nj8a~(-A@-WYa4qY zn#(C7m4C~b&8kOyg^=IWY+(gQpeg_FtT$M(GLpQz6>=&Ubtzd)RaipXi zCO3q#bkKOJl0lv;p~)$FlCQ=oQHe)H$|HJWD`MG^gYeM+PZ4O0; zW^uya6rcBlNGAcY5YQ0BQ8=wZ3`X=)I-)gR;XqVR@`fBI8)UTr^|( zQc#OQoqj6xGC5j>%17ySe+La>PF`JuLn2duP-ZyC@w|?Xl1oGf z*klXb{DCO=6BRZd=gh<}kGS7C!86#bmPVv#B~|W%ns@4*++u=6CmHdwKD7Vq(O%fW zx4j^FZp|@ya#V%LacUx&+LNXI*oUJXs;~1kIpUTXV!GACzg2-d_O|oW3aeL&YdVZ{ zU)W2?&A>ZtC)L58F}L{0+^!e34RK`;O@F$&35K8zGHnI8?E-vPCx{voyygldsu)m} z9k|pMSm>(ns0%*r5u)ytQadJ9;LgS~3H(%|CnaZ}gLjJfk!Ir&XGh@2Jn#{SUx@x5 z`w{8SPq1N|uu~WmcWklQX(p`TN!R3`15aCwE`&ZCnGe#9vM#I?=gHKBzTE+>O(J2Nb&Jekau%K4T$cy(>1%T zucut&3I;Iy0GLPPjNSdak?jKjBQ+B>gDX(S03cZi{0kRID{V_^PNQ+#4)dLY|z49|BaO5Uvp7Sj>M}3p|dqCMVD4_o>Zq7J&uU)a6nAgqrL; zlTzSAs2ssy+nWlXWV#9)2(?f>T^;qhj7* z!?xuWRGy&TNsvv;BKiV5;g*|OBG2fQ*$araKc$wQz#989nxb}uuYVCe_Gk}-Z-{Pt zz}v%`OQX(d#WCoH>`*uGCNG}McFnuqfN2J1pwn_aZ`CGOkt=`jQP(bYva;s+q=`|D&jwk*Z>vRp0b z%_(oN@=*<;DoQqp%I~VU=v^QgLi&mQQKsw%7uNlEa;JbiB1!QSm`dsN2Ic+PfQz*Z zrzdD>Mc|aj(EZXK2>Zf=f#Sf95*gt-Eo^}gq=q!Ye z8pV$tk{#hvXU8tde*c1E8ZXt2X#GJE0sOc})BaP0`PZS%|G-C(DE(MS%Q^l7l2EEwIzMe^5CMPb|*BL@jKV&w4Yx0b9^P0Z~t%f4GKP2{k3SEk}_PvouN9&!3He7 zn27P4t5PsouNDhbiAiIWKU+GRlxnC3P?5)gzN(@c6sRf!f-L4_3@V!;DCv)}j_&WV z1?X7T>?y{O*RaY2hd>V<$C!!&?g%M4X9W|U6v(IZr;dKpD~%I0EgYDOK#21aq% z)TCybdNf)?U-x%DL>toqrILg|V^j`436A~SbLaE5DjI?YSHJIh^02-jTBSk1N886ev^ubo(gp=@tWSw3C3r3 zp+tJfso6^jz}5`&9J}8>?#a8CGSOK#Tw@7NSZ?=C|{Y6gw$it~GN13=al#l}C z+aweQvCGjZLUOopAH@1pVUq9aSYZ8t!9qk`qOdC%`wg+Vl&;k0Nq8#DQZPXSugdo_ zdsV+9$+1PI zjKA`ts^OmC#!wUXgR3a_qv?jvQl^~*r`n@)LK-oUc!z5#Ta_YF_lf8Vyg+(b_(U3# z?l*%#D@U@=Ad*)Uk!j?iR^Mpgl>?GF;^y zD<@RPd&@)SG)dbB{q@cRlexZgmk*3C2nJtGsT;sIav#9glY-bMo64BsYMLB5C2D>R zH$w_-pFG7B_vH8ELWa&vE8Sj_4Wx4R~Mcf6H;x&s0-$E~R%_72H?K?4ak-wCvL zpr0GpsHrDu`(uXrB05 zv;P9ll#b0fCHPk?i@qlIHf1&?Vt!an=mW8+dy$Z9A?#EVKX1dY9K^3E7=V^kI|eWB zgx(+)Komyto(m!YdtR;tU_vAru@`EqN>MU5@tk#}jo=NH0J)Swra`bHH-FVWsFWHE ze9=d62;$tm;@|<{yR~;`hiJ=gCD5 z09e+8{)ISE+p~j;Z0C!EjI7r)BgLPf+ZIh)U-EKD$z70kc8T@jO33t5j)y1k3ib-t z1bZV$_LBF%p#PMi(SOR&C#&Gz5?}xT2|p7@*#FB3C~WRxYxN(a>OQJkPRJ%0zAbCU znaT^8f`LY*JMO-MlkP$=(`TY=oX>j*)O25Cv-$=ed^3wIAdJa6cV2vN_B^%+*gsbO{P~32W!;P>jL}Bnq8mGC2%u){ z*$Lm%kse)BS<_7%dBWHpfYsPaTB?>+2O|?@#1DP{deMUcT`gcT(O(ys^DoRFX{3%( z=`d8|8KKqV^U)4stI7A8r1k1id9GD2uF!D;lo4LpRIk^}nR-(lT0wwyB_9WcjYllK zd=+O2Mm{(YR%1Cevh7>0Bf3bsa$0Ja=yV**pi!95ba{ZWU}Sh<&A&#+l^e*gUVC2H zR$gyB_Fkd&us|ggZq-F#HkN9#?>S7dXklY~6pFmI*sv4BmV|+1wQEXS^Zx_5s6JdDbIVHQ@iIFzi(;WorJKXpdGlpM==(G3me+b8uJ=fCj$`&Lfr zXuwG|?d*_Fa``UWSwM(Z=fu-0{q4ftV5@Gfu7ZwF-Tt;#7y<+d6%;z|*nZ|N4$Z8( zP4|(|I9+gr8dRfCo0cHEGxdgA$|EyFbBMGgkYRzk!X!{detmf5kxP4lndTt~g_(CS zt&23uxnMF;tBTS3*rl6jES(`)p@ht3%T;!gU|`h>w`X*{V6VL5@r5 zEgK?JrhK^DD>6d;9rkm)6~t zP@#Oq@#W@gg5z@XxHwNrDHpnQ0ZWLq{#e3ajrOW{$DhZ@OWur{J|es6^aNmtUP_Pd`M4hp4N*696~lrZ_K8(R;|I z!(;K&U$!2>voquR(7D~t@YW|z;00AaIFQ!G#{Qu!0|YJQQof)rBvnXlVF+tr=z6F~hKjDK9H9 z@d+saaTRz{DTZIcp65*e+}CMd5yM&{UaBrSr{}T>2vrNfwSXqr!jmjQkqBqTrvl9x zXIS;1ooaZ){t{FC+>k@$?AinL1i=K&7pVJ{Ew3cHBf>6r2NlzRIh;YoHT#>b*Dl;9 zYCbwydfL~}gIE6*CKF@;@E(T2TW26nqNGP$T~GQe-2I+03gvr;5Jyw`3-GIIcWvnV zi(Zt(zWoBi^&P3p1qLuHFkpeiD^$lTg_S2vxNR1MdBH!u51VJ9tW^RKPCo+z+kxnc zm0@#g0Y<5!*ODBfB@&BSqW>aE8u2bP#!jEa&p(H&Rj`&m>}e|&(I;ZH?^g4RvBTJ; z3a*yz+K-gY@(Ca)Ai;w`Q;7+F@V&sN-p=6k5lIt<)&cwYb#zkHK6$7|EQy_?ntg1@ z&`Fx9c)>b`2>O5ln7Qq@hGjB^1M15KPG4jb$E2f($Gptd*H0BU+IzCDNwEdu&xV-F z+A_filO1uWU{{Ed_F0r`u*r>CC2rodLk&!FYxZxxpmLWOCc7DgBPG>uL*(3!zwj+q z>t)Za-iv!8yv479aK%cEV+4BT1RB!Q6#|A}NDo$*zrf7O1%3*U0fR6k$Lvo{tO;n7 zi(4h(qimz5R>q(mfIjwC=E|B6BpzV1w)5K3U{Z>aWkmtl;3oJR_=7Jw2zk#%rx9z_FTQ~&(V4Qr<_jBp| z_wT14`d{7O|7?U>*!^Gh(0}vYI|VF+{Qd#)6#xSO;Qw#0OW3LW^ovOt|KrkfQPhz` z7DV9{wn9%qrJ_O=1T0@iGZyq=pt~!c16io39|h)|r8NCDN83$)U`3e4q`SR>Q{9;XG(3*A*KNIUcD6dK@SWcK%9RnK zqDG`yvSzZgVi=|*vO7f)b(AQ%jBP(&xK}3Z)7UCnbmsQQ1MIlUrHB+V5Jpzdl!*&( zMV5tO_lS#>Hx3kPM4l(1o)Zd6l!5KvqlvUc3@O$33mQXqt|NY#|`(B z>Vf@e^cep6cK$ov`(f5g*czL-n>dpE*IywQ3+w;R_@dRIy_J?QzjMi^Wac;G&=gY? z33y~C3Sq?3LsT|^u*?C=^Fn0WWNbGC+9=0pW80^u@-wf`j53K9Y|31mxCGV%^Y%;X z@-t<(vYav>7+-FiOKq!0|DJ3Y(fZWu`Et(Oc%OKE{<-mfIsAa5Z6nXN=5Y^f*#ubsIaz;TfpvagJhpLw$k;+-MQUI+pN%U4czFW=zX%i zjQ?Ucaq7f&YrCW6{A{uAIS9e`I$Gm4aY{AzY(>Xy8v)#G)9!QYe#N_f+W%;qiA1Th5a1N`SuC{ZmYdUZkkZu6PE9>J+IgyN7!$`t zI=b>Zd@XqLH$b34vt%5IY2}-I5lmz@cYCz1*-twN35bB&9f(VA5JolrNcZN>D$;tc zM~$*(4*&Sjr)5Z#B!WLw)wKS;a8c5#O2?wNPp`gvT;v2I9Z=K?>_8ieZqp!@N5u=j z#eqt#DIRYgOQU0`ptC)tUTAFjYfvt0H7xqKMVYChbYUsnJ+fYuT{-|Vh_wi<^2wYDwUNcX z=&2e=DYU?HwzcI#OnF8=F$E3<0_H#$eu&*lYa@CJ$OwE+9Xmmi-7s~oaqQ}_Rp;KR z=&`J~4e=1=)* zwcHrhNimVpt}bXV&mv3`yU^VPE5I^m7xW)_Ok9k ztwj%uF_KEZxix~dwG>dvGXSy3P)0LUyU|kZxv3}3Oc&L@85Eu&n1Wpk>IlD@T};rK z=Kv#@+`W=e;^G0JYBq@nOhs_S)@sE1gJywu57Bw`($WO#%*+L@=!8^#0P}K~p;tla zi}x0EDs>|H&4NU6n}q9V?2Pn2b(;pAz-2_b;&^Bpt?JpwWC48I&9fi`kEXtzdk_Gx1oT)XUH(2~qzH zNHx6iPGPKXS77Ix&;QCSe=ZwaAfzS_%}6Xqs5g0{oN!$3OI7I#R4cx&Eq?{pmA~sq z`Vdm4el3jP-$NrFdp9ZKyFh%%LgKb3f_YIFB3{_IvY#-kV)UrRUO^{+x0>+!EKHz+d{Y|m zM4*S{q3o5$m9oDwf+xR%2!91C>Fawf-CzaWKUpU8)E3A~J_0GtdHPd|Cn~K0Byhk~ zzQAS_q<_%UwSdsT=jjOhoQOI_xpo^tquzb&2pfy&0;7%(+iZ;>A1!M498e>D53}CQ z(}*n*321MgkhziDHqEM8gnNh{Z@UV{gO)0BWs%eAwM!1?ZY_nVt*M1ghip@0uOk4l ztqpXi<5}EHN7bnWH=ZcnJy_5Q%K;L13wyLOhhT#n+&>ejMnC= z#CLh$K5i7v#^W#{B)<1C|NcuJ-be6{kxR#%Vat6zhI?H{xP?SyMmoea2iIWX(|SzC zWnvdgI@aiz1f%g6dW=X>$s5lc{%~TyFqFsg!R17jMly+S)wy%9urzHtF>I5T(2M{- z$6&m5GLcEe)ywIL$;mQxjj5UIC`u@J&&oYliH(v`UnVUa2KL3PrbWGa@Q|6dl<^=1 z9*n6Llm)hjl8&ARs~thHi;)Zw=9adUa}friXH~AwvVCTRC8cMn;6_2Mw8{vZg#uWW z3mI*8oppK=HT{;JpqYER3bx`ZAjFhmj`-rEMnm*@E<6q05KA8$uZeEPWvX{0YLL)P zZL6&YdJN3h5CW&$6u)6UVfx1hj#9Ry1$TKv;tYEAK2)uq=~gY)mn4iY8SQ=;!7HjV zg%m)H;~}u+6Ak$)`nX|#27U7}XM--lr>};)ea^(UuXeV+`Lwfe@b?a)4K6gMMfLs5-j1<1@fcm8%l2DU z&^;A*n@C{{=Wxn60e|iwpePg#_D<=dFn2-(3=qLFkvMTDC}Vx|p!;l5`1|+TB+X_$ zfOO%cxOU;V#+r#z#fNhRIJxQ9q<@S@b;ubis_gfLAzTc-!PCKXbkdw560@L6VWvX7xTT%px(BI~cw& zrZ0rr=5d|f@|^?3T}`0xi%^)U9!%Js*jFc>G;q_X)lAji1NjnAJ>c>`Rj=P8?mHO5 z=D{C=t_NQA;piIWCXZ|$sJuzTZu27)0C#LrQaFsBjg>?G0B`%tO@9LNC)>|8ngH?> z_D%%~2=@L#XKu^Erl5G)^rrq4&6&JB=9RxPh&NlR0h)6-<_t$F4M_lJ%)H`ja{zdA z2LR>xWrr`s2xo-lMnA%+9Uxwh8fyTKH?qVLGqVR`yN~{z?GE*FV4=u6uw=&R1xJ7T zf^@ODa!WK_H*VrUDRw}r5S2Pa(nTbBSCJOBB1*cAfW9Z=0J)8JaTjCW-&ufq0|{Iz zg2lTpnT4j-sNN}i_#0cJbc+b3KDBv8VGl9Z=@W!g3M6+BW1IyuRY4KG1Ct?I9UT2F ztR4?PL{59CIhJwr(-3~VT#D9(B%?9y#2lCn>Edl4(R_1Cu%5%8EC#17@LmM5u)0N2 zGTW-1V_I{rBgnHS#I#8upJrrsd}DL*iD7>g1fG@8e+uVF;l?Yz7j1i1QWvcKb@T;_ zgcFOj#>i?cj4h&2$oRB%9-p#?#mE^RN)-N&kEeVdLAQF=Fv@bpG36^TZ(3enH~0dI zHFuDQJgT)?ov=Oslpl90>ZLOmsyEJQpS!I4B?}ppqZ6baJdR<(2g(yt8&YnakuHtd zwf)_-*YK0rb5%e*udThY8Bqvy%+@IC2Z?kxcI@$zmn9BrJ0Rw4O?R4E0Anh}7HlqW zPE!T2NBU7lI$AzX&3dv_Qw~qyTl4`AbEkqrx)%sERu<&;Pk;we1Qnv-$Uzj5LFFpMg}m^yUkD*3X#tgOuF+}H*n>FGQYwq>a3=?eDY@l7 zcDh|7{XzO2%eRyzw>V^%ux%0BF1ui+%W?8VEwCD8;PS>YFNdL@_9CSv`w%m zP{o%fkXB>!Dx4_VEMT zwQb_XZXsO6a~Yv-jiPPxjn>iUYOd?l#MZH~jiW=r{O$Y$L5&?s@*AY{Eun7lvKOc) zzWi9QhX)kz1kvg+|y&m!~n$U57;kzj?D#AsV9J9F5v&zFnx=o@x;EW{GbtXScl7Tm0o zIT<#xR0kQ9Kc14Nw6KCMrJdE(9Wp_7b=l;^uJh{#>5$ab1|Bpf?eUYpNQ`1SV-hDt z_HDMZMZut|)-6k|TU7@3<#ltfL<-8otE7@sID3lg^@98|6Z2}?8M#faCS%|=&iI@t zEFeY9R;8aaEwrAu^LKC?nXzo!{J#oS=VMT+V%NaiaGkP5#GGM~)thyM@(m0$?1TA} za4`|3toCa-z4JD*+a;mgCyZ~o@Z-p`+1cr(pfg%PcW2xe;BXvj@ zCU*z~$Os=MB#zjXEL66WRHLBNj$7ABOyXx(NAb05r*XB+YlHnt@8n!`Zx3WqR-gVI zdRxU{tiz3YHdUhSwRwJecFDnFEz{PLSaAKJaV0&FxzNHbj1djz67d~4hH0i*8cL0k zJ19LIAx|7znd~nVUIn8gLZ%$;vDxfVFvE4&;+3u@8R?yTje4f2*@r~W9$1{0$nidt zfZC{7c#YAnZ40H%T9~rIS(v6ayM<15(!0D@q&C~vmM8$fX>_LK^><6WGEy_`NHD z{&x<^FswJC9@DJ}kHs#vkPoUH<||f@?Jjo1S4r0^T93^x_iIf6?W*Oj*K1DzVwB~o zy9cFt9_|JR#L~Aw(HKx8E)l1BV{hXPdBiz#)-^Zl}tV7jnef>lC9J= zpADPL;L(>OE)FlIBvI(J-Esm{cxbgbybLGfg{*U(Y2Q1USXOJO6m%4zHs&pyn2345 zN~+RH@)N_f*&V?`Oy!K*b^LN53q2FgS#vrx(VVj!Iq9m*sSI!xv;C{N^4bb0)jTzn zuT>IVQWNVRnn}>TXcRSB=^R&QC?ircuR=0$=8?{%^H;9IV>vCL^m^U4jtOPQ zAOm+~fNk6q$0E@4t|=iRBN;3NnX%0$LcliLgCyRo>G0HsmrPAL^SGE7W(5d2Jhq*z zRe78ABeiMP$_vg7^x`P3Ok|F&wb-;PXtRs`UCD44o|-(Jr6{4hAng&INO!s3M2ODi zjoRUR)}3a4@?bm7+n~ND#R+^%Wqd!NvfkFXa%EZLoy+i2#XpM#ElCoO&@nm9sfRKd z4)S~k%=_)bQs3&jfBCs|dQ29L7fWXDw42Jb-{4w|K>6?4A7Z2NrHq^6Dn?+_IAKty;`>-f-Efk;T^(Nls9u5l_ezvzOLiCV;hn=WoyyGl0KX}f`F>|uD8nwE zDM9cc=JaPB9M%Y+=c);xI3WWK>LU#C5UESTSe13gYr5Uq2%t#NjgmW__sb|jgoe|Eo!dX4L>-Jb(2)+zn2}Sp zGnaYcxuhU0q9QI5#_)}!O7iRzcY}ZBl$4I?3^kK)CJD>Hsf}{2XjwU>kz47&J(%dk z4fG?cFK&5vG#eKB<@>D(m)Yr_+O270+E&y~?u}E@@LjIN5>vkN9fp#a$Yhu=Q^VA;VwoenMe|iZKle(8UmSdf#4z5ZUX*b%ecib_`%mh%Td;Rn%7bg)G}i~8+Sqw zG)KpIYWX@N-z|5f3zPvDiDyOQIZ2Lhsq5P0cygeLs+%lamgFVq;`tkc47Fd>qsCC6 z!aQ9DlkctU-dMCv5>0hJIT{{aRHb}CD+z;mW;gt9Y^B8Q4MGMvk!Y_(yxtgVFMyK8 zMXoUYV%@alm@DNcu5!15yCC&w*PTe9B%EHku14|2CU)TN95%?=>U-=$zOYYK#GkID z&_ooBc|iYRR&y_)tXMo@?-=fh@Aq>8E2d>q$UaI_-POMSOT~FSO6J1!XGlcvr*g>oPu1{0 z3)KHEPLi;;cCq=ft@`)M^M5@E8XMUEu)gFCEdJBHD_iAD3EKq07Y@!5GG6FaUb6`W z5eU^#(DJCz5oa%I*q=n7mo+DMG7-*c?vrVldL*b@^j zXWG`wmRqiw8-3@^*TYS&A8=YIc4!nl(WpLc@E8JL)GipCy0P$T6hScU^XqT57xhC8 z?@7bVA#xf%lRL~vT+jh1J~e$2h~|mez(561QQZuvVU)`|M?FF9z5t*|w=hB+iQiR~ z<pD4LKMjw65CRWX}{Q#=N85+Cw*D7rEHBCwJoXJmHcK67Rl%4;^wgh zIn7&C=(MK!PV_xq#J%^#TNWQpnW*=kpGm3B`B^Wa{seO0-Ay=-t~<;n*^}CEnwBW8 zvu*{5ihZ!k)d=JO(h zS!&bgOmS1|*A_r4H04ba#`6oN4)7}rDxl#YQDkH9V&iO7s%6J zuJKvOM1*N3B7Gbl398VaSrePF^0gmdV~F0*(CXsIw((p)8KK*GX@fUD4>~%(v+li< zC#VYWpg>sPEucZUT(_IYI$6nEQORM1)fdm;6#h%0<1VJq9r_5NCywFin=CaTQX%TV6vgdM7Db9i8Et}wrAj2;xPDv+ zd<(~^B4c4GtKzJqq%uS7yF(HzTDn4vDs`dhJT%6|zyN(72`!|wrm_gKW&zP6`NvF2 zQu$%&QG1ExwrTvxS@uO1Wx!pg-w`wYoO%G zr6?v9b&VGKQv_3)PbR`}dR=4v3P}^{rP0Wv-1ho)zQ%1?aSeZ|@acyF|IL0S63cZD z9{KU#Jm~NfgV#6QX6HygclOhRjUJX>emDWorjij$u4$~TO)G&F6cj~LtZst}FZlZ6C$;D5zIif0D-Z=8V0vpJqFy_D4n zCyQbv>4w-gkKm6on>ak;AA?50_ldywoJl)~zPCwL$kil&Naky2BWpp=;_9CEY!onS zkAL@AW|k&Lfd=Rm?XqY$XO&7gF^v!Y7=8;4=H9ZqKvJ{XhMzED?Cg#BVgFXk+$;3` zbPISrGJQq=e7ym_bB+f&;Qo5W2f7DjCB$I^n(H;d=J?ZO^2a}9Pnq*wjmy1HNZd#P2Di69jt*KkUynw zXv)dw&rF?Rh?{E7HekrK;~$WJCM*J%D=pPy@d!Vzl~!^ULUxu!#Z_ok^?Ky(qIbq3 zE;4FLsE<*zuoWIP0NVS%wUz%SGd#F^{4V-Av{ru>$^U+M{jzX!{NfA!3Kq6DG( z84yIj%~>@gp8<&Iw6Pzd3QmQz-2+#LGmw-d6yZ<$f!!$>MeWbLkNx;2yH-B#K z6(^<0h7h$ZC>it?0MVLrOB>iztfm-hp~{w)UInz99K$FYEe=Yt45zt!%u*~$2}SV; z2x%pQ<#gTcK5f04_ru=`2Ksu~g3p>0|(>9#HsnZ7I;n)ufEmZW_3=@QTV~8@si*mQ$4CCScr@^A%w1z8UE0tYYb1}7p1BOVw5120;m z->q{5x-cw_Vip^f3@a#?-o|TaEQ!BFE6W&_lS$X`jDD$?9OtnLGlMxN8lOr^!n~4F zr);b}#H7;%yB~wJC_k@POzD=(V^pt~9{KH0ot49~W>kg3ZY@n>ULIL|AZ9o?s;Nki zrSlwhsTo@=&7G79bre;UElcj0-(^E8)ZN}@GA0sK!f0VyI3^wVe>i)`AWO7mTe!=% zZQHhO+qKFzx@_CFZQHhu?s9dZyYOo7bM8GmzBu3e@gmmxy&~qy%$alK$T1`UmAbst zRezwza2s>Y?yWW{%-RKg>x&SR8I_la#5F4brP>&{RhI4>=FCGI!yBzBkrekyr}Y_f z+EhdGQ(O^DKyvb@mfRK_>fB<*p*AFbzv~mIa;F7sHyau^xPtJqn`ulk%U-h@k)g~? z<_5b#T1gU`99c+`+>$7OuRVx!ilXc(bLK{8{AA4Ss~IzGnL|Peg`GCa4)~h^mSa8G z*8}2kS@V@fQK}qMW)PjMKfxBNJG_CJKd9jN3?US(IRldL86QA7<66+L(Jbr2_YC>X zbflW5Rm^jj=P9PZKN(KlT|7(=ld;;s*wv%;p-^u@$A*+fBJV+FPs3}zuZ^3>YSe+EO`Ppz>phd`jZeSBh0wOk6-Uii zugZrISIaYYDm2lhe2tF|{KO)J@#Yaf7J2*f-b`Q^5L6i=7jj&J&K*f73E)9E%kK_C za4g8Ul7^__#@O#ttyC?k9-=N%zoj%!UeF7%yo1<&BUI;kzSK~>N)OV}Ej&)y#C5w1 zu1Z~bkWS{W32?Stm8k2#;+_yO2w|VZOJk{r{3JuWN$A>T>bSb991)o7>!~Xlb;sXL z#s0)K&)kzpi-zp}iAXn=Tq9x7e~G=P`x+`;=%gzs=*dRw{i^ZwQI+r=wN6dWFO;2Z zh5M7Y<9PQ-8DEaRjM*=O%_~V}P@~f8;K?96QALhPj2hT+)+JN5fpdcNPI@WxfYw=* zNZ~$vfM}Xn+*o#BY_vO=R)4_R1I>P)tvhV(4r+JUtUIL217dGq?=2MJmWO{>&L_Cf zQ6AEVR{cOFWL2KnDM@r&O1LZi&iTGr%1O9d{}i+&>`Rl_1rn|cmBMXF7h;btv%6;I z5M5hLYTVv~i1QwrQY6R|%`%))s4*ff_-7Gpp zXelJ{)%$<`(?RhsfY6mOcK0tE@z1Xs{r_tt{&%5P1eh2(nF?80IGI@(xd80##GU_Y ztp5cI=BRHuqqw4eu(!z#vfGjX1tv#<$uh7m8ZUoqDQPC##IdbFKW+s0!NF|Ft?#IM zJS*Ia;p16&+yPmzx|$x3U=h4Uxr8G1?OkUsHuDOyyz0&7KIAy}I?tB+zyH~C{x;;1 zEQ(O7Dm&J(=Yg*#wD&96Wl%0-otHYJ>RSasiAZcGIQ=S-cNBq^0c(oUXNO?n5` zD{G9lrnW61jUgp(U&Aw$< zo*Ty`c^{eI+C+`r7KK)XUW2Ht(VftEyh09MGOse?9%`#d+i~g8qp|iK7;TIHv$mZ!k%?1qOA=U$t zb<);%OVLV$6?cTGbp^+LWuggM(12_T`6;-9C)RW_SwV_}@SWZlD2&6s-zSaG>B-BVfxMm=rs(>g>&Sz#2A;Aj{!H9X}SH7Ld zwMgr)4UX7|mYpXagQqf*rZv{P8pZLRkzkpjV8D0*<4Jk$=7zyr=isi%s@K+Uhnslg zL!tt_o1PJIwW`6KC60BiKhD11GaedU(F0sDjVReH9gDf7x-0%#_MLmU^Ib zfG*=Zeolayj|9@z_?!#p7qLkxw?erqqpMDT=KTdNuK`nr@D4OfT9`X$$3P6lULPWg zGU1jlfw{G;a#gUu~pZHHGuagFzMbY0H-71o%B>uz+Qjc%nP05)uV=zee$|sZ3 z{7p%=h!Bhj)`VOPL323A4pGMkB;I_4nWHrOJ!ubsKkX^^$)o61v@N2OmT^nv22FnA zszj0m(Y(ZaDdCQSB8iW?BG~euN~LJENVbc(NC`tUL^VS$Jga$O8>s@O7xtK#iKwsz zAIXFcsp%^*)$S^gZD^L zO3C3$TXe8Gro%D+peot>O zM&S+VMz#C}Y!dAfEzr{blkJeyyn~?B7xp6${U??Gpa12}L4Ny-%p^BQT&Vd)f}{9i zZxj8ev;W_o_peUZ$mwrB)4wXGud1FsiUuOzTGz+)XoQ?34iC^|nJqu;0ZA~nsBoZW zGAL>o;(*BddRG1NE?t*(@C!rtV@ahdsU?ouC5XUxf)LJUuOsf-l{6k_i?eJl7Uvd& z-j4^Yep)+=_`w#|#CG~PocnZ{Bl6P{j=bR-Qa@DA&d&Ol9^+a%hHCpPYndsXE!T&Q z#_x<^jZrXFZ>_`YAP*m*{pWmhaKck?95w1=tC|!v@%D9Jx(N1Na9wtN*OD}hi|jk4 z@2&XSev-P+tv^G1O(1|9&Je(m*~VN4d4MMp0sQ`&yQuRwo^pX>>bPtAKbqZb{D(FH zOo;|}*y`3x_jsOhfnG0*L>tqQ)?q7#ZP=Pu^AFlWYJ+qJDW+jupMCet@_F1tT%>l! zbMRp<#VM1x5%`=p$01zZ$9RcsZb-i*vX6^}#1bzq zp8p~sL-Zv<-b(9U_uKL;WykQ>QqcF19Ky#M@o@=CG)hvx{Vln>oe?IoAM;s*kaTU5 z0-;Kgla(I&k;`gc>CNe z_J{%!r&*@y7P#ducQ5dJAd_Fd2E`ir7%KV+Eo|atOeku#i<8wJCk(@WH!0HPhH^?c zJHg@F`H@G1v{bPZcKUT(K|yIV zC635t#I10rm!292vUF z>)BtAAL5z8Zy9Js&|*EF-kE6E#b=LLB?dDG7|}9YF{)>eQtu)P!a_{dO`16&dGYQ^ ze7q;vt;xmKRwGS4@)k;wxl3BfY9L%s`UPc3-mqtm0a0mz68TEE8rjIg7U#tDa2xd> zj)uJqp*ETnrt1&$;27Ju!18xWx)J?jD;R{Y5QqN6cT!iM1}{>%O_BGP9RHbv{HK^dbkrtF!azCsF{90 zOaM~EmY~c$sDQ^gydo_ffakF&!sjt4;y2D)HMw}q0mMsD^i7wg1f=EWb4PaX8Q^)e$G;s^D#keI?g0=wsAMfpn+4`A;uv{kyxYT1Kc6cP#A1_t9IIWmgzG$OWWj= z)`QA<$kk{;yO7*7(9!4~`u7mqld1U!Fk_kr;0mg#20fl`I>fmcdKgmk?n-1!x{cb( zrV0b7mrRzE#3|lI?HNt3RulWF&53GM@6Brx@QgWS zjRk9g7lC$?;OL`OZ^@}m?Sip<8UgjxLseQke2kt8-589Gdr$QsTwSG+>`;3wO?xFt z)Dbti;=Ci=8dzr>zV;ZLeAfiy1mlQ9)B*btUT7C316cANaT0Oxr4;D#yCKZ;b|UX-BBDKGPq+>+UAKE zSudd~#d(TX@`th9v7(iT6~@J>#A-3Bm=!ycJyEI{V)(XktS&`9kgD)NnWhM?Q3V*j z!%*3^7(mRdSLkjV%l7|?(7!H@3thVC@vn;m3*x^oJ^tN;3%i<|n>m^Ntvsdt5BF?W zRa+GtHB7!Nn?}4xuG$eC9V2*JiyzGOcl#B%A6Zg*${7 zFpFvx!_w*VHn-8ezmDhY2i|Aiv+Of+|Ia^f3g4PEV-8S!tc+3fGBAhE zm~!oK(penFL{Z)4MB`Hiyq!821f0Q7;b_w_M++l(Q;+XMrhNeUhWj)i2G-$j!98T$ z*rQQAPjPOe0E<)at*t_m)=6rXvH=@Tx`st-yGibv{{CFVF5{~4`cS1C;~~2hX0*1W zW~*-Go}*@54w-e+?>d%OzjW0hySUP{*YX*f+dTY>G4ty-v*1G3Yd2$DyN<@~1!yVe>LhfrncS3nWfvv%zgs&5MN1CU((Eu5VuWs&h+#GVgI{|{xh zukAg>&21#L-~NF86As;b^D-l+{Ssk749=OJ)=UlU>10&g=~`;){fR`%;83>@_(1x5 zTdDrcgo*~7`j4C^6fT=z%SCVtl^w45m9AY$BszRrl63oeADUx=qQRbp6K@S+$NkIl zeH{`RXN2v&Lv^?`BHJbx7hfyhM31T|@{Vk3ha#{>;AtMx9wF`1?22VH9&wDw*Odqw z6h7&HRDVMrxV(Jx`i+?oVJ2($yT*fC};M_C7Ce|Gn&Q#^4_oNu8uj0qx z>6Pas%=>WiqL=rF*nA0RF8@cI*_H*P0U>>xu{O{5SDM*d61Q-ck&C^kG0fE9-QQ7= z_>@co zW9F+VwaqXEH17*ZO9Om(rhAw|M-|^-1f)HR%!1w72qJ(sP&LbMx}!a&CLtz-iBs>% zkAOx3mGT&!a_~9Q1q!CsoD}j0Db%B|MkWH zFTLddu;KsJNV>+)NDm33iuY}m%Gui1s42Du#@k^#{FtN`CMAm!d~S0@E{#r#mzBwz z2|?HwiAV}K6xSda%J#mVTYDa(`0lOyoAa58L^d_9O0q9Pq;tyIlW_Ww?uJXXI*O64 zWqAa|=uP!$ywDQg+Gvm*0mqNStRi#%$s<9! zxjjX%B_-54>6nRwJXPDFCpmK-?zApA;oSggXwD|x0ppF%MTCIK`pT@*CfKf>8A<8oL z$V#Xm*VDJ5_vOnFiqZs=G|1RROk^v?3&l_=Vsa>Yo&z+pcG=@$q_jj?TQyNk0 zkNepNJiq+$q@H8bI0SE$5kCo73G|i__p5{@q-QxQMo-;w*AAXY$Veqn#AxDRMv*7l zE1=}Uaid%!$Ha7}K-{?;DqJux7(XvUY-Qx+#^m9WbC8X2${eOnzC!pMTIrH z^;&%4&tmbj<#eI5Mj!2F!xSs)a1}EEb0}!y_eoM%l?>2DN(H0cpbDkrJ)e`g`O&2l zKQ-FQkOirrw)g|!MV8QCaTK9dEMXW93pjpPP}ONPHwP@EDS3>${bg}90){^&xz&F6 zq@Z==(*Nf1WFnQ(1JYBHUzOVD2HGan=a`7s8UFFaM02S^bJ-p|1)3+GYMvxYD6#?> zEqIHN2xLn3MT^YRSk70PmSK(&Xu9N4qM$;!$l{j z;f3cP)Km2j6P*?0DGU@JHznmsgs;>!SzPaSa=G}2+T>s0+YsLVIo(%u;(bNuUo-6g z%Fg@0fp4TN|AyaGcI3bIsXj{SY_w99sRatd%hCP>={5Ar#Vq8@NkV6;E;w-Pz+dgV zwPoZazEJW8aO`>zk?X&F<4?YuUW`IN0@Izo=Gx2dyUAwh`+R!?+oy6XH9V+|VO_P^ z9(rfRUmrgzP+FzqZB(pRG)-UD!#c@hRK+RebMRK~qC>lH-AcpPuyxNbx#^8LNy~{v z#;Y~MTrPSJUK@YUfGzf$tygIe^}mZJYQbp*8?q4rKQx@ThWZuT<|FJBGk^3!q_KD| z!e};W_ARIh1626xH*X{;(UyinUL7{@_JgPa%QPA`#anV0v&)aguabjg#*<18Fnl=a>wSMUOOkm|VbGjWe6KbD$&E zD^m;aG@hnbmD~N1)mp88eREPu4r7j&t&}`)3F+JKO*(@Siq8~Rs=hq1iP;7dU5W&# zb$JxJq#qJKFkoQW1Yq?fMtUJt&N*I_R4+tHEt$&&m^GPWKgJ`w;7%iE5&@!Ig4Rp! z-Rl<-NP9=vn;vsWaSTB=)`!N~PZ<%Ks$ev6#a}q1>vj1hnA5n&hOwAQ6>2!Enp8-7V7QkO?HpnL%Tr$Rb? z#b5w9izD0DnmIW3{{;YcGjam_jrlT&8mrhjhy!fQzKl}MoQz!T|IMPP(e(8B^0fGv z%{rO6PmGrWhK&kdks^#HMLzsaD3c%wIc{hvsAFKRpJ+kO;&@6H*;1pe-P}s=YShqz zRx_}QHbcrp?SfQeYunPQuG6B{l}7KT(p-Gj`(lM3Ie1v1$-a*8)^*CjHwN^%h2HfI>s%u`^u%ov98!&!+k{ga^+CCRf=!ei2cI4UG7%Q;;g&TQ_TQQoniMJ3Mc95kB zup-AMPC9Fsnwl_3)IXXX%KG#;-sJAmv7g+}iP-R;+$$XQ(B3|NEv%C*fHy>ApJMUn z3RLSeZYB^mXOsFR5n)E*XmgfhO^rHpRMDW)hg)AY(A&CN`>5zzuWmFp#}IHMTNBCR zFAC6&ch}I9=Wg}N#$Ap&35VDp|H-jbTNSK_&KY^QP^#%|>XC}FSIQbj@xC-BVlxgr za?Si2p}Vq6tUyq;mQtnPmo>GNqie)y>UNt|FP)#WD&sdB<8qE^>kzuPRnd7-hGZO& zvzk0uE@}C0fm(c!Iqu9er>|%83$P?PW$j@X*ImfI8-+nqD-uB`t*(lGaJBYsiY8VuMQL538F3*0MI;Wh;{IiI~e| z6bW@n$Xj+BjMg=x!8dLy4P_%5K#z2VR(11>3ig=s?BLDut(SsX6W<79&+r+%(UHRn zCOcA+)a|u9zmFin%gLj-`f2?^z%-M=X<1&tK8szdS!-?n>J>(lA8n#*+8#Xak;d09 z#u8YxWK~dSBWqlPC5I!y4L8btL_~)MmNY7UA?z5P=P*;5Uo1E_Vtj6lIrLnkf>PsC z7I?*J5D;oUSm` z%9KKDV9c=~5OJ1bnhOiUcyC6YRk%=uh@u1435BE~SR3n-2l_;*R~U>{XaH}WL8U+# zpIW&*U3wi1#m0eO7NsKGK(#=sU3kFL*s>q3yH0{;8avBun9fno#6sDU*%K{OScU8J z*nyqiG)IZW!7Q_M-i2GN083RmT>zc}x07=V3pG=!DY&xZ@q~Fs!xBi1vN@iCP#}kVi8zG1BAU?%b9A&csu__ai*?gc!}Su0B^OVJ%Yvmq zwSbyi4>pP`Ae3x~`WpD@=Tg7aI0uA(vuzfPRF!=E-}B(lg|-_Mjpi}bD9tcez6 z+)PF8t{|}`e9>_~Qv4@8{$#aSg)cZ{Py#fznwhqO>9}Mb!tehWWmXFBtzVPGp%J)I z49Xg8{6YJ&miFtbW+W{lrHQMZxWu1wnws4ZK!0tuC5TeDQ$zW+SrWP-XoCW_p^J)e zazwj^-m&@<16jwlC`IViNi#u=6D3D3qB$t##cImw7ojIfBA>SmB|4kx_1T&=kGPb) z0X-?tw6-?Qp}^V6_Q<-HE8AepCUW)OFiBWMIlalrNjp*6XexR_;bH zB}|q%r!_F){%4{;Ob;AV!hNzbW+R5B@3|C(N1$#yHsnsNL(>SR(pYSqh1M-qczEV2 z1_@JFqw$Nbk#$+AG*)44c;YtY-!*?(I!9N1xA%_y20--V(WMgi5LU0d!m@Vr>vhE1 z>Ymyyy<)_PPJlDNl#tkk3>0J$9w`V#W;y70`UXvI!V$?EGo+HkOmabv8Qx7TWkU^fne#?iu?>>SOaoVN7g# zVYCTcU+47)bzWcoph!m}-2#Ywuc@X#4Kzzy*G<|D=d#`u_SaWn7 z)N&KZD8=t1l%vSmfpFVrB_m9hJSn>b)gf}(Rbmx6f2<^)D1WoJlp+3T~ zjisag`7PD;1`G(B<1C!#BLRD zIGF}YX4S5VGchg-(b^f%w_Bx7Oz%#6x*hYzQ~_46TlwPuKD2gYkm+|>SRpSx4PLcu zC8gundtU+J=)9uV)ex|d{tW8zzKvhAs`@EX@oUhkYt0H{$!fzoXTKJflXCx&o0lai zy#)gdf{ACJwn1ZRhcm6hS=Q=6Xc|qGf98=Toqw(vgJ8IVoKM$wk4lAO@8b4lc-8QI z9%)w^&$N34OA+JG6g8a zJv$|U_v5&M{DVImef+r-yuN&)3Kn1|T_IaoIjm3YokM14pUcsQQTA-o5M0AUh8-Ab zM!}icn(|9{)ulT8`iKss+>TUSKY2J2a5$1!eldatL^Jo$v+4&*s#$4E)`~i}`0gP% zEo~!3D|0COfECsA6usK0!5_$oqW2SY3Wp9va{!%ts);#5O}~Sn3QDT_&PSB?wL^of zfjxbA!`K=x4J~YK0fGL)n@MkamI%F*a-Vg8^G}1m@bkX)PCCz1V5btY`)0Yf!NfmqGokp8$EOjjB*Os{%eBGDc-@$bIQDV6 zfy5f)E}l&gyVaqarO za%FD{soeCbExJ9TIo7!{fC)?j?u}wWzjnqRw45pJ_M`DXsj{EdR*J6!YAK}gMO;$+n2q5sq7JEaMIwZ%c z)~&e;*^z$_`2OL4p_?i-KeSI>N2{u+K+N6@b5?<}q-dDxBW)!xr9xjSpvWvamO?#* zOv@~5-^U%u@E}imi)tr^CW$(1q_#CRBBUsORummmOr;-mXP(kK{rThbA9TULUc=y% z;%LKPP?yCQ3jY808fO0YYxsZEMRZo_X;P{E3cst{5;>wR4;#wDZVnfhLrs3Ei@1lK zBwop~bg|tDydDN6-u5HhN?_eYvkj2*_YZA%IA8NUTVKx^NQ`}3ov$d0#38cMgmgq{ z1EvMngs!J$)Vo$$@S?2WRk@(VSHya*NdWK`i*B;wrzDTv^n5T+RZp5qiMvO|McXsJ za{;IgAbD-`0`@kL%Iz{$p>)p^)a@mLdK(E$1uTj;SR$s~i^-nxgVZ!?zkwEVXw!6M zOcg3d^K$wAUd^-?B#*#O1$MsL4S1t9VRlS&YFXGgvGG1moc*vyf^3@^C$Icb1M>;> z*`Ltfu*N+hC&ay_e9|igvK{LHQ3DAyD^`AF_uU)mx@gAVArv1JySG#KlGblcK=BJK z=hb4&Q`QQQD2t_M?33W$Newcp)lWECA5Fx0K0I#bmzynLbnC;(5d||Zf5AD8a^Dz1 zt}~DMbjB`Ra9}xz$vIS!7(a)#j(fd|cQE_KGdxLD+UuDYPS&JJf5baA{)5Pz38IZi zP8V0gW3(+wQRh8iat+F9Dv9CK5i=>r4eG(Bu72dzU_h<6sy+0F7s}tjyBx zSkdum9`+2bwJ}p(=cA-hjq!m}Yb;qlUsgaM+5pSLBTOJ>3nK%c>Npn=;|KwNty9i< zTYs1zsRpjzP=9KOhr?P7gE|o}vxwlaewW)48=|m+9!gVK5@KAQo0U`GK{@o48wq=b zQehdF%nCBmb+YFFOm~$T!81fT)E@26(<>ueey1*RuD45e6|H0UCe>Gg##ZZATC5Ts zifCQy@}_)A5~}rVPq>arxL~@3&aChG+aSDxgK4U;lcgQ6X%$3%0@E?07e<8>LPGhx4U!hn1 zMP&ZRp2`0bI{r16v#~d^{&IzJa58gtHZxUmaWXTq6|uK-b}_PZ`M2w5P4brVk|Jv8 z+I2^Xpe0vI5Zc|ha#2Cv0B+mNWO%?(ydsspsc?j*EKZq}FO;1xQYefC?ij=^k`H*E zkSLo_sD%t-wCnbI5GIHnzM*+P1>+xG4g-N_Ywj*s zb!tp+F$DEnPsGEFg4;rTkN!G{7HWPDbo0lx{vTkKMS{jj( zZMhCrVqbyZnK2&s+H%6Ko}^yf&*JPdWqtwd@OzFp=y`2FfAb93_1b5}n&4O1ZLwzd zY>jRRo@KfIaQYQ&<-X~vVx_q8+GjzZhe;4k%KJTqbUW;X^tOK5@QQ%fu&Er~9;?Pg zpNp622mSQHJHe=YtS~q+;>bgck^xa{_U+v_r^T_LaS?ue@lzk(!0dZRY|rH}lkp?Q zg)^z+XnP-Mz~&gscoTnbXm-dC-&~R2gDQ!SQ{M-B;=TJj+hd;ISD5iAetqHIA4lHf z>%QHy^FSU<;$eZEk;6v-Cul>%1oH^C zr_(g)#?4x^!+BP$jOa^Oh?Q#4;jCIPKiVOokj{*FzbEb!mxByT(Z_L*LzRmdB^yOL zZL?lN>XlkrW!8#IjY^J6kxPe^^5ux!PJ3r4#v!lMd_&_OWD?Ky z=<)sy^B-jKugtj$|6Ymmb(d3pWe)j&nZ5j-Ie*jtHJkunD_Q@Zzo`73CVBv6U@}4{ z6jacg65Yz}Zsp<<%a-pVNDS)%ipt@wP)Wu5exr9Y7I;Eqj&I-khWZ@D_0AL(Ex3&Q`;yHlSWSM?i*CK}y_ zUaboW3%NJDee_2H)1BC9L&uuhj%k-CbI{svY*Q{QWxB$c14bTg9Ba8-47bRCUsRib zIrd>b&p7ROk_qTT{Z#fDWmta#nS-Z|YYBlNTeFD8M&nI*oC<6~S+70%(LQR~pnBKV z(Tn(ucD}HpN={=fv3`B}sIEI?#6eYG-*j8)Gr2~YN=@g*l!ES%8 zY8`#N9jQ@&YU616T2+cf6d2(4c;0Te555W8yk8z*j>|Mp9qUWXZnh8V1^Y-+V6xdS zH+?RNEor1K^!dqc0Rmx6z_|&Jn=vAShMHX-k*w7{Cnn@==V@-_W)5(p^Ypi)?`ck* z;+0?0vyNBpF;(O9EHLHPx${&RFG{sd3@L(rkb7JqC5yhYxkABFd#ysCB0dv-3_#01 zjIuqfQl~;^JE~QK9A_gvKB^2L``Uy|Dx-J|Yj+#r7mnzWIG1^+UtZs*Z%*%wy5-66 zjBZ6S+7vp?BN;+m2)!T>N{g0)bvfcBbPvo@(3Oo~8c2?}=nuatpnn3|#D5expQ*-t zYhsnnPY_5GWP7^NQ1Y&7$va+i56?{E7Y8F2P%DADDbQE%Q&_qUD@|D&uviJCl8z^w zel$?+VJrVlb-};l4oyfp{@goSxv$a(T|1)?E^8IUhnJ}D!C%1i6mA{XI*W~|nRj_L z&yGS&zO<`&t$ot_{_80xJBQLWnEM+5oq5c2XAo<dGAXkMU4qQnm5pS{puY1L$a zODOPlAtiqGLQMZ9t-h#C>P9vI)4%b0F()T`CsGwNH?yx4^ZZwarKs3`QJYZxuC*;S zprbKTh^0%2c zUXNl?LR)`eTYMhk2^^=64*MI6`q3a(2IEX=n-@yauv%1pYbxffE8G3x&~v| zG41q+b}3ydc)V^FrvY1hh`iXK!NtdB!Ui{J+4gWbqHkMK`xlB0+3#_FdERk zt}UIkP_nX9c$rKMk!)}ZSkfZ5>FGl(DDDm%Oh@DC>B6B#hmAg)skvt`%FI~|x|lUR z-sg|R%3Ux1+M$ypC^65iUONcAvU)qZCDw+EJ4)ar2m|7t=@J<`s%8 z6S{q(QR)>Wb3|Sxk?@E&7C6(2esh^7{f1V)TWi27ADP4C3ZuqRPQyN($n2YPz=3hh zosF&z)(jD5$VZcbvB2c}kmw5aR_3`LW8*q6=18OTlu8;edqcaNZ7$6g5)k8thh>8w z74KCl&Ypj|DyP6~QW%K+l(#@E%=XVkObI>!N;UpOOmYOfVt`IxpZ@3g=&xwZoQ!33 z_VHLxjPQP`N5Rgo`wz4w zK2;h`hb0zpUINI_mm}2W2S7=#Jp~cPFUn4}6TokVE-i2Qa!XmeN!+x#j2-(rPZzL4yo)&tgJxf+CJ;GIJ#=IdZIx%R59MYN#&k#g+iT#nL2{=K6i=kocQ&+@jBPe2!tg=E0xNY z8ZCJ7xdwxJmQKF5E)nbp?T-w~K@_ua9axx;sU(hglN^jl5u*a?Hr^d&Hi>M4GJ+Nf zD+&G`n`;9{jhZC56pE~p>lUh`frii_b+B?Tdl#$T4yhDuT>8W%_?Go&cx0^a`tCY= zzywfq6YJ{4%=&aUQVF0^m_!{tdYl%Y>Bri!-~UHpU%bi%c*{Qe-dpYbw zli`1E;)H$(?RduFU4j-@hkLEA~cCS)mE zyvh#rM1#JDc~%9z$M{Vq4+D*^HhilnBrlX(Fn7OG5^|9N7nGG%tHHv_!512ESa7#G zZ#z_R$peuKP>r}#hAXwI4JAoLhZ>1-t5|HNj!}3@yOLjzEiPD%*n=6*yfj^hYn_dq_8@`%rIoa) zT79(lL-YPI!xKMHl}N|NRJunOEkj_|qY z6jBKxbl-~$!xQ`rGloeg!!NG69aglOT9v3SS0^(+c{Jfvv zJR>0!Fv2Y;dcWu7U!fNKq#7J!_KLT`5c`&NK8)&kiCL)P4V9sOfW%B} zFlLCU*#U}&V3qW4I;hy^Kc?eo#REdF{=YE({=sU{*W zAO-v0<4S|i#4bzz#8JX)D>w&doVQmZ(a{@qQoq_*RGX7Hdy`UZjoI`*6W{vsn z8_9o8;-7j8|0?uq|GN~Hq5@Tv8s0G#c4SrUd1?ofNaU~~{3N`-+xuk^jh?&S^(58)7V?vR&fc8HZhV5%u> zn=@eU?&kwG{;E=J5`FgK9b|9+5Jtv5*{)x5*q96Jfg_&6z7$5T)4>$IkJylg>+*p$ zw~(LS5Qoe37>DN_9o*h(1LEGnND+2#l?hbuSk#U6OF*pGTRcV_;04LwzxsgU%~yFy z!L|9&qWgtQ=MiSqKhrVKsN2HTW{e@KRsf9g(3xzl@7wEGe3{meK|^TY>Magj-^wiy zp0&ep$lk*<0xzN=#K$Q;e6Ds^h9dI-i&*?|6YB=jxI;&b7)5GRf4wa+7hioqH<6Omp?kW{Jsh#GfA zG=V%4%%u;Y({nK14uDyHykVu7Vc*&`Y5PTbaRqD^5N{i!{k2G+%{m&>aF;L)-;nyH zi!8@8pxH=`2)&L690C`k0~XmiST>3EQ> zT-`dBlk%9&a(lHv&cc-v@T3oJlq=>OupYl8Mt<8&)y%O6 zlwAC_!QKG8{@iZQ&G11jM=>Y0f{P6yS=?cnV}m!(l^yIjp6FHVbw2iMGrd3v6Mwk1 zk))iTTF42DxGqv<{uOM({N35<7wK?A6IklmzEqJ5#Ed2DklbZ#I&AH=T_K9?pn!#Vz!>rHa);HUq9osbknRl;a+04|D_QM$w6^f;BF z^=T>J+RUPax6f)Y9%R@i)fhA;avKdUytX-IoIlkfw2uj@(@w+>2V+UYkZV7**#ri$gNa zkYsk)%PJ-rr5D6TGK;W=i<|eYAj%o%2DBZyfw&*yfnN{uz%9^f!*;{mu;1c$uOUu} zRuOGFFszLG6wo@Dn^$bm3IP7JYy>Q$!GON22Un`PbD}?bix_Ruh-}gPh+2#G>WHm- z#6Glfgoo(w2<431rkur?Vsi{2QV)lLb40o}g44L4pBb-AN0;u1*@;(p|d<>#h~TAo&1ei9`H{G{J0zeu-Fu{Gm3)k+L_VtWi0`PJ&K zLD{{XRLZjs4)xjixlEPXIMW4(ToPwT~)adMUwN2|0NnM>Iop3goO{$jiQq!{qxj zEVtjXKlZ+&H`yGNZ`DnT6a60L^83%!Z4CFPXS^-8(ayEMiCB=c(evLM1j1@od=yVr3|& zjf3GX%7)t544eI*x^RehR`*Eun+YqhoWCgT?_}-4Bh8ozl}?9)(F!GXQ~SCCjdY8B?|{Sx*3AgW1mN6?nVCR$`rU>J8-u zSz1w{p&WHb*3&<;UNhT+CTvnxx{6~ir};CYfcL!2!)T*~|3sgzS3n^16-lW@^zs$e zOP;BiLy7VfDcQxITiTQI&JLPC!TLnJol~)1aAf8ANdbpEHl7_Fc`rVfTOf$%3_meLl&CS zW`N=_{gz+!2RSt3CT9H!&H<+So&v&MTt!H?bZHl9vYPCI{zF5USFkKu<;a0bHn#_9 zZJysm?@wlf*S&F%l#yOpy*diIL3CCF`tf(|Jn$2F;SQ)vFR&JdFzw%mTSw_RF)c)O z+V<+29LI_>b#p*$@ftO4l;t>R%VLjawZ_m%nKtP&0LBribmPDdse$e6X|dJP(DLB}xW}O;G3*BSzZNLpQLs zBUy(dk6CinxMY%#K;Zjr3D=R}A{N9rmc7a>Wr)tht$|obnB;QzZ2KQTwm0RELAR5h zKRm}FN`JCIPP=W==d1b^L2`nrBnPuUFKE-N48TG=?ZKQQ0xRxS6J^qzVf7r+2{mx# zxi!*YnI(pRX#1V_=98b{xU+!wiFPpTw9>Jj1yoqG{*vU%D(onagU>?k1 z$qUKcR>s(A3wneE?ou!TtrlY+y{5fp(!lkiK=(ER*F?e3BBwfHuiupTDfPU*TP||j&0kvZFFqgwr!hFYJL<{y4PBBUb7*Uyh$tFgk621WUrtxe+O4GgLnMy_f)JPMcet6p#5H+Nx4(kf?AJ< z&e2WRY{Zq=pS`?7Rb03$Le(7!n{JvZ?#KiO45~J^!}!3~oI>ewsqcgbhJKP|hacX! zId<<1E;KorHf5q)-m{u9`}=|KE(a$W!y#0}Gp?gGiie-(u#E0`!rP^z8O3#JV^X+x z=V-49=CI6d+e8RdcPZc6Q-=!SZl(Ag#%O)=7Tm&3$#d(@*2%p#9&I1Cbjl{Jx*TX& zj2D_T+kb-XOJyjn)b0i3TjZB9oT(nT-HAr#@ef8cWYF?SiwaSV3Q?5>lx>+dOp@Pz z?XATvC&kdyYS{#Y975kB9&fB1N%PqduL5RoEZk(X|Cxr3_uUCy85a;LH%ydsm+ z=lt*g&9(8Lmf`1-$o#=Klnn5FP$vC92j&00F#2|F{I8bbe^XVHRbkvv|8r8V?`Yso z3qn-Wlkm&sNw|SDh{ncG7on{92_32C#g<`&tisV@?;4=jl>Zq1Xl?C{_Q&cB2bG;N zLPb-<+OmnEqNz$bviZr}vMEC5i-jeF)<|$Nwaf8%({Y;jdGjmN5%~JW+YQreW2d7R9}r@IB}4Hovp;aAfB2)e%qmCAjoMq1cy<+grU<_uLJ<=IjMd z2Sv`8Ci_$N(5GhaQ78!n`*U{$2XM^&W;=e90_(e2D>eeV%=WAj(1s~Fy_|Y%#;#VyvznSI{D|OioM{{L{h&W z@l7Z4^D%>`%ov1n`_!g*IEeze#7mv@*=4T_gEB51WPve=3^HVA-o${*j7a zxkl+GEWN+>Sgl`ceqqU?SVcth;4q1eVk7@Hc}_`sTf2Bf15XP0n6H29&_I`FG2^jk z9Z7*w%=yO~vR}foY0yq>y)orUZHrfBP%>?fK3HD)UVV;jZe6XO-L>DPi%>#U^eD&l z#Ed3$l!?t`RtbKmjx+=MILm}*N+biX;MV=%^kR@5B}_wwdU@UOkDDalnty|Zcw?FO)yJMOIAi=?#SQTsuKY+ zbJw1uLTegVd|LTIF2=YuCf+V@{y?tRZfxOk%|hN|J*q4kK{jVG<{~PLG`BPlZ4j%D zW4_N`7KoVCw^qa)6JI-t5<|&qlG2=E-k{|g@t@=(}3#1aPQO9XX90Ev99 zzZS2jSTd2MQpBvYt(R_>n7gcCqSM` z7)@Rj?QS$#jI!qLJMv|`1|(!Ym>M~oNU3f#8InypM1gHn-q<22Pqcgw+VB?wU51Xj z8&wp3rjhYs8r#$0zRN*I17`~P;f9K8bNX^yaaw88VQJJxxH6VZqpD<{q$w7#*udd1 zCN3|)A}LR_f@!jlt1aU3NlQG>X`1h?pP*ux(W!h>9?c>%?>oH?0)R$AUcQ$On3NB# zkVsFrDy6b0&nvI(lV2(ymS4E(7Fx<%MtQ3Cx@1Y)H*o|-k*(BkGplj3kc-J!Sb`Ov zN)lKpN2>h$3oOveBqc8fkufud1y(Dn<~TkUcHA|9titJwbYamd_%w%X4wW2FG9!O= zS3_ogHI=kVT+WrFD*ckHkFqj>n91F&0N0@fscm0&K_h!1ymTr?RmeusMhg2X;wa^O z?vM@EiDINyQBTZn*qtB~SO&CZd&RDIjczc`3gJ9Zo6Q>M=91>R~<{y;|3Y9E@Tkmb+1Fxozu6y)mU9#(`8hA4o zUdZEex?}+Qx;8EiSPCp>ej|#?bSs!6hW39eJS$`^QB$RklnTrp*LJf;M)3YZJoj%y1{2Z*;ZAz3xNxJAmaGYoYp=Cin_ceuZ5Wui2~yRk4o|PrnmGh zTX~dCC9MXpvxN@D!G;GMvJnd0K?b3nW);tT0@j>%5Qa za{nBlLP_Fl?}57{y&Ipz&r(+7dCCIPhp9Uf@@65wj2)16F;9*OAm8V9!S$_*-RZMe^vB>rp}~l@>$y zkIgk9mS->5NLt6%xY(t%G9Y%QNy*sVf7*X%YSJkDy!Fz6Ak%ziafR(^i=AS^z_erX zqtvi=>>S7K-K_nXnkr~}{l#dSKfpes1N=+l6?jWs{F6x;5Ib=5T9oXS)a0fyY+j*B z%|o~CCiPn?D|8acc{{g7k0c^6J2$mbN1EK#sEgrnBf3sdZnOoi4-a#wERG>??y-CO zvjyhd3l%$2@Pu6{4!Z+q;80LBs|Mre{E;)?n#^pXU~mUrJb@Pu(44@F>b`OFZ=c(< zwNMJY!;mD=aGRX0EH0_kFF4%h*vkP&Yq{}NKH2IOA?y!S8}SJ}Nrr7CoOhY6CZy=6 zd-TO?k)`siQgS}a@zIRw9az3`69DTu`0Li8XWiL~LRt}lHRdzH)rPq8NVTOoBa#r4=& z8dCMC?_D7rpUq4zdHPG@6QrP;l%;bQpg!RHyCZvb#TIqMwQuskTPfvjRq2X6U)0gk-5ro|LEa2jc+>F5{J5Eu^y?mU zH{S6Zdm#7sYe!Fhpn%uj^0R-Sjv=mY&F&`K1p;Iq7-iaclTc{d3#Hi0#MMvqncZQa zYeU+>8}Fei)HCff#j~0UdHza%Eyv&OJ2~@DlN=q`@b{*gs}H=gHbRT?gPt$g`G?d{ ze){K->%d|71l@K0&F%E8lNfl5wKw3`=72bQv98w{`2CKNh47~iLvd_95}DdJ49Y1c zRhME1CZIBUpmozS*by8XYcg#EX2+nZsI$=l1?0&1p55?Wc9OvF(LTu59ld>o|A>0Z zF(*6a6@Ez`IEJhfYUY%n0ZAwIqTSRkkTUxVb_vbc9m3n3A}G@O2HkYF5rty)sMR1- zDLa>;6#S!4K;AS0GjE@dwv+)XIZOZoMwm>qRTUrfd|eA;($s);gnM*L{BtXFZLpkf zwl#G2#CY?1z`m70pGP2!f3(0m4E$Li#0Un#nWpa@vhSVJW{`a|=5jR(w&?AK7@s7L zfZ&G)lxizj>bmnY8wN4B8(QjZFPdsAXzB(c)WSR(yGV*5X!YTY@LHrD8Wn@8PGk*~ zNUIOBYU2FK?_bqKM3>VfzPpA0xb6NM zFeppqTm@Sd^%EWzHl~1RTOohg%piaqu8ZQQVF0!!tQqmJQbr@*Zf?Nnd8MV*-jPjXXR&doT~OzBIEp?kO&AQh;))T(_5V=~8qw_$f) zR^|+0yiH{v;;6oGJkccS-(e}*M=YbeOohGNzL&oLsaE!~Q9NSTMb{f}dO3}S&oEWw z7$7uEf7^x1l_aybvN0JeNW*646mUM7x_9*@<)mnYUFFU*LKCAogSAv{Zp&0FGwvAq z@3maNrt`4c*?|#h#)w(b`ebAb%8?j_+GgcKI|Rns<$m9f7UWnt#GhoGZKn|#E2ksm zy47j<{Epcb{Es>faiV^hTld~uEMB?&-wiUVlcX3;-6Nf;yHl4=6dEX|>s7uM@BXWV z$@*fT;<{-+3>+Q;TT8PJulco7Ygy8~>X0JZId%3Nqb!0cch9R;^-!6JQTnqaIp3gpy$B}z8vA$8n$?BwnGERarsaCj6IT&Y z>cWWKWi-y*{E(g&ZHBCHTr;h@NV;FQ+qqf1@t~CmmIZ*nf$Xe#kM5pVcYnT_y15gJ zvo1ARo9f~wpMhiE!3z7YT4&bjm@GuJLijqK?K8$p*Ptd3G~9Dx%y$weW+6aYFwr;Z zhvUQF>P2drqxzBXPNDPKLA&j|Y1PS^*Z0$Uo$!_v^D^PRw~fl;W&1QADhMJSXm2x` z-WzlYEU;6!(ghA1d_Qk7gC9)o77uXJ#8H;5;`2u&EU<gWFScMm{|~{7cWc~ z*uhBt#9-VWegZUCsO~aSo2Mil5H^MWIOe;ejQ%vJIl~#4V~`ifufIhcS8uG7&j5y@Sz}4GS?j6KvJw{kpl>=<&&l zktoTI_kOrK&|-E9I}xRI^1H7w+5`K7!g^$Hx5MZXpGUZcJ^lW3sq^%E^NfI|tx&HO z%?dAd$hOJOyJptI!wg4jO(cE5rCDNeNI;99S|mru* zI`J5E9+vQhJD-~G9Tb$BPr?2lM?}dkJQL5^Ff7po06#z0V&TiM07oCoTaXzaQ2l65 zk&u8_z!UT_x$}S5BvOXPKhoc#fYk50B=G;JN&mAH{SWTUf1()wcVSYtvDUYg~8xjpu)P(skZY2>M!Tr`M2Cgux8ixgAZWGi|%mSbz&N2n0Vj1=WSY${@qp;II|u zJE?wa4A6bA#sx&v)zRG1TCjw+&tqq~{PjNiy-E z>2Ol^c=gpLCc~zhF$2&#NH7i929W;+Zu{G1--9OdII?w2O`*HOn#X1dN(Ab=M=3S| z3|{)rZhdr}%CqfSO}Sw`mg<8PncB{wBk1Ky;DzF@2H5T*QtqXaSN%>ybcI{JWiJ_)CX$4h(f3~tK-l{{qc+a;2 zL&A8mH)kHwup*AT%6lT<#rpTgb;QFLfBwk^>q(aAY|n9E6XV)cg{ zHMMdf@|95AA7-J*s&#J(CFrDxUdIg`+@+fp&5E^%qM(sXJX-6Kr276MOZANvunF3= zq>XE56fy%-b_b2FyxC|VC_%**$UMXi2zmrhzeB4S=cuIFi6`ul?FAG2cVAdDPY~)L zii?W2qD1>c%84hUh{?YsiBAAP>e!%|lRJnYfqT>to5mB1X*j-g$0-L%)4G>hdzK@; z4}E%$N+1ZII@TbLeanb6s*f`M|I=hYX*1~iVEp)T4*0)z(f@tK_Mdn2zY~(WG@!oy z=}Y`TW0UPkBV=(szaRcY#H9MVU@}G${qwbnU}m}WiDOdC%u;{T^zy4T&esikR4xOo zn=ELY%ZTa1*{huD)GoUj*4Mk5{#jJyj6d@~cdaF0AkXdq8M<9}x}GyVr@y}MHdnXf zrWqbV5vis&e8AxOVVw>>&SBjjeA@)Ef>fJ5nfZ0vSh~Aa>R9W$Rr*-GyVWws#MEK? zhG{y$^_>D0hi91xeyCeZ)J6PqMwb&xi=<^u9}1$1_^K02r2T9|1eN zoo`96IjPIH(acVX(;OYISvnSnANcKAJ7lrK#A9^x9xaWZV(7lH3&gxd_nuvg{VnaU z>`0d`2tBbo*GC99zqY*8NY@y)Tt~mdm3&vFFz(6Sy+nZAU8qTWk+1X&c!#lPUM(5d zNQGC<_amF{_6%6eK4I4=xG`?0lAl4T*T8R5ac%}d!nIuct9};2twKU9`dxvSG*Awz zK@Mifp5u9<9~8h(o=A{7Vrpb0pY&2WopV3W_8ycW7k10X(Ah&6%P@W*W#gj&WSAJ0 zaOWY5tvPvboYq}>J(nIlw2T^x5)mf-D~&BteER6D$q_^%YFN2-vV|52(a{n8G@KL< zS-cNb%nW;d!G!GnH*ngnl7*X{DV24r>Yn2-Pefr+&4wO!YIbrSO%ywM2ArX9EnR^9 z_C%prh9VRRrg8ZyGK)fF0$yZ7pBXiNEGfogVSoJZ$2~R1xfMiP4xuLL#C*70GuM7U zh|B1@t8Arok1@!_csH{iI*BTAlKHMN$Yz{4>tjavsp6Mou*ql9z!$sp5W*NL;NX}BG$#g$9lrg15qzH<2*TI3hq{^vpF^w3G2Qm~%%6PxBd5w}V zX*MfZ|AX|+BWozPVV{y5NPZOo$y%@rc1FTdHM&=nUP-)KXpD>9qnPV2lD#KAYTVeL zLN9?xFpsD2GOdAIkPCP5h}H^W)6E46h*hyvOyKn)dZjSJb|ahHRidofCmYbQ%7(>6 z8KNvkitBOTF#S3^3$}&s@hCJ$ZIYcv&l%C^@-68Y2=L8Ty1l=3RTS$cq#DvA3|q(u z;3OS^;k90xSuskgoaPkXAM&S(DKr19gF_jD8f*Z!xmD(!=bpl%Ee{4`DdS$jJCu*y zNnpRH%Jj_mt%@E*q5>uewTW1nE(!Vu7MS+ont%C$S^;CsWr{Pz5U*I7j7xLRSdgQf z>6w3*@oLU}5dEtKN)CG>6CEiGEDMP!Hhfx6BJGV@{KmNq+sw>X|x( zm0(pYRBMMUY^(E1f%}*>F&tf1; z$><^M{>Q-6WCe7PCXGENZNse0;2 z109Vj%r#~uiD;r3Z@oGlQ`WCSLIVv&F0W8__A6dcqfH6WPJ{Z$tT83Vc%iLXN|l%< zlH<_*Iwiz#2+c?CGlZd4O`V})GlaF*gsOSqg{UYH|7Hvf0VlqWT|V(?Jhj9E9WgfS?)M?&Y4$5mZ! zTD<0>&}39xVtJ9@2nKhXjR^~&>d_E1w^gPE!XeF|zY}THh#ubVngt8TOz->_LP`ql zZ<&X`WD-1!1}_lBhSt@Hw?3Kl=jP=j3K~*;4aF>$-H>s7E4OkvUUVeSn_h_L`);#b z)rbb@ZuJ#kz9 zh{e^jubu#30x^%`^G{ztJT@?=T%KvJ(J4%Y4;47xRkTL%I)<&$DZ#}474)d;YZw24B%B?~%XaN&G z%?=Bqz`1rpvO!vD%lYIIjv`UAj!_$}0@E3>X9Fq_>i5E$#=R2<;whTSD72++$$tL~ z?Y#^K-Bf`NrOstR!9!^*p9sOz+{c3;0k1&L!`#Rz9|2x5x0h2?_Wj&1qg@iGlGv+a zPcJ71?@2KPsU4EL)=0kb#uHd&aMRD9ih8WRV&GZZUgx!24qSxX^|h~gvA}x}g0C=N z+B=`25&k_>XP@cs`9e<7siTmzw;X4F{zek7v&;r|i*+T`k5oSZ@h>AFgx5RI7w#G% zqAbKdGe_JR^zb4r!B>E97Fu96jP0#$w5@}&YWTYws0 z{E^ha-)&NZ(Z7_+2e@rW(AHAT!3$2JCi;~>=O)Acl_k-da)_zy4?k<1W ztnZ+@C*@YVorAA8;&!~;D=lv*tG@@pvU^y3@B~&=Ub#35SNuZ=jd7-gxCQVl-{dAk zkgSpr-icyAYd@Ip6Xgr5xrqyeNoI&m-yJ}oZh=dTLXXtufkIK_=sa=q-iSJ)wd8}^Y_-TRrjslYSG@1;$ZEEp9))p1L z8BbvzB)DP+y=-e8oCp%581VgVg#*ny2x_DrR)mGl^4>~i|G&Kc?$Tp%yGHUwPi<&F zzCCy)?oC2D$BAywczvaiMaW>|H&BEZGaRZRIVPMC2-yBlcA?a`ia)7(mIBBPtJIXV znW@!9ln>SWA7Yd#m&uU(__%a?FV;CTvAx#a;%zXGxqbyW@5K>@6$O}89!~I8YP+ae4>`>c3zA`T>a2$QNsB3Y6oQ*s6{>>F zNqCgwDyBp2ouAG;PevYc;p-766`YVqf&37C&Z-c{f`2N3#U0?_k)@_?>0=I;_}L{jzGh2MZT{G8#VvDIrO^Xa>h(pM4y9$OqA*K!R)G5+v~snDP;Si zbmGxByCX9!+Pd;i2hu;W^h*AECzM`AsTzOj#ry3;k!(lur~3#*4Z$!wduTyY*pdB&~#kQL#_{ylnAwFx<@TveoY>x&^o))L`M z6$jLz7JJM(k1e-HN5h@MCCcz)y7VRVL1F{c0?OXq=wR5!@vxfJ3!IJry7>AU7hFO( zH)-;hHb?D#t$F0RM6Kw#_gHc!?9sr!LJgU`UhvUP-uf1EC9`u>x;$GRIE+rx#CB%P zU0SDN3=e>erQ5_22wZ9c1pHSR=twq2ej4pYzcazu87gvOomy zKPAzd{^*!E2?ml<351@Y6H^n*TrtefABuurE3{q8?-1m1Fa4u`EA`lsc`kkKdSH6| zHe4D1C^I=dKlgzF@=Z05@?|+1}=pw z8v#Ws56|6=if4>sUSlTnS%nL33GwUU+3QHzY9VH!ebqgL*}MJxEWJ5i;r#NMTq3&w z3WQmHEe*dc_>yt1v(o*KR|4fb+!05VL-KW5_;O-|sR9EHaTGHsnY9Bc(bc$49L=~H&q0ExP|(?RU^4VH`Xuh<68OF#Pw(*y#*Xga%q7zd{l;@GZY4Cx zYJAcouF6_`|Dxj;mm&M3Dy&Rz&j`MCZuPD@x+{ zivH*NVk9wlh&917XBM&3Cv{JOzd(#|FL19`*thwP z&~UR4SXMyp&dB#(1TDZTlx@fD>Vhs@D%QY?OL$=22dPlOE;NGpPO1>rRh~{%vg5j^ zePVk9Xc*Ml%#OY9pPh#8jfjmB$s6I#vMw!!Nv%*)fgE2%p$`bsQ|TA*05_zu0kgfE*R!rwOAO!~d;D009&!qEgj42pS=<826y+s-?847|(S-{# zcH0@|$X$xzEMufIVJzxUeUf1y`^c<4u5U}_^A%`t+LtPoE;uTl1S;-dt12XKJ|;~7 z>6BA^`#AFtCEmraYeEho&y*U9ffd7Bad_Nco2Jzh>Z{PNCC7ut(0l~OrS>w*{LGt&7 zN9_Dae%VDp+PxYOJt3;dcG+???T^OA#tJ!|*ahZAtygY-%Ux&z274*7Z5q*7g84~5 zSRf&{5-~q*Z_N033!@m{FY}>;n@_5b$pqtgV@!&aN8G8^Rgvd#T=wZG@0^kx&A|#f z3VVrBd)UYCE#a|IOlT`Ju9k%&%!=+TgEg2vEZU*Drl8O7o@V0bg?y~-4sgjM_z6v^ z8Jt|Sefa4_l@ZB`0dF-jMz}AGr-fIsQlkmNrAFe#mHuFQ9{<(0aG=-@cF=btC}}- zjnU@0$+)Ehd{mE8`}x!?diE(?^R0on+2U(=x$EY#xvG6*P@)9OEvvGh-8B~E9zhr5 z=BRcud=RvC{OEmy=zWEDbaN+kk$1t ztO6NwN~$v%I#;f^Axo}96+iRS*NL`b&_^cGpQAJulXlS1Tt9; z$Fb&5d(bBt_FkDkYL18zKrq!!2h>3d@Cq(T3heP`)qb*0|H8)j5v`GHPc*A0d_YJ0WX%c%AA1*90jhZvkv4l`?HVk^tRa8FKL~;Q}~*sW@_u* z+YV{c*~1o96tc?=fiajokH?wz7HEb0f95mqh7ZRhrOJX1f|jS-Ki6IRC#h`J>8|g5 z+DnI-#4!rIdJ2cti-oNCwIhV=;sUA^Ae)I^f@3PI7>sDN65!*||CN2nzIF2h@9E32 zNDJ7!F;5r~K$rFSol{)$My?Z7R(Y^S>-7BSx&PD(J)irm@H$zu-E8X~paXig<>ImB zurNg?Hr*Z+FW}23wTbCro%L6XG}ADzP1(fN z+#jxg$U@DjbVZvwbC&Icp6oK|k8C(a1GdK{-cWUAa}IPo68@cJc!BfIsMZJ8>?3!l ztKJ-ShSUIMyg*xSqHza15^Y7VJCcO8{YPI&$<%~#oeIX!z>I$;i1Bar%33kw$#N+- zZQ9L&Ujz`G?$e!GhcB~OXaYEgY@T{6sNH|Xgdi8D+(FPQ8N1Te7!Y9etR0(FEJx)c7J%-$Wq7hWTiB37M#)tYK@h~37p)5vVw4vOzK$DVi?!E0_Ba<049 zzRToML6H5~Y-N>^*V~4swVF>x9S1|df^fMp?+4NA0=kF$@KFj)$ma z0mLYDqT5Y4>)4xz}GWkQ3fnsz^QW_1IftK3%hym7W$ z4nDe@6y?ov`vr9ie!XIOm|0_O_0Qa_;9mWA(9?euvfDSAI@{k0*%tI4Kgj+ci>Chq zL;S~fDzES0_`kRiS^v{aHdDzk0M;)6A|XJINJyH-XeF30YRvXmgc3r(gz z>t?k`GuN#loNH?>o@;xYe}`5p&U0xNJBCky=MvBx`^q&BnVXd-cTW%wfr^)#?Ly&x z02_Y}ars6OF4jVvGTem%z{+#nk9o0ND+a}1eIiHc-(~Swh$7b}pMTMfBUiD+V)2q@ z;H^^CT)4;et~J1*<%Z8dc^8T8b1DShZ0060#Xys)^M|{JdV7Vnv--WDp9A$)6?=Q} zCMBeW?PB4^lESB;kiEQX2XM<4Os&j6!6FbYVW;V4(KAoj|u|6im+3QorVNA zVB#gW%fyBKb#Me?+1DBjvJoZTMUN?u1$(|!H6`_ECZlH_hAL-VNROz283wWBnqU^m z0q!oUW2_b%8_O0I3!Z)uFHXtc&4v#ftr`IY&u8NGNa)pBDO{n$c!8l#1y=!+jsd?l zW873jQLhdSv>Y|D2?p64K3tYKumDH*PS!I*s5=`CSZ*&?C+bp180pX|K$fDVAN@cF zZzQSaOXBx-f||z|1a+RM0HF)8XvLp?Hgk^;})AY}1qAelSv{e#IBSSQX)GEi{du7#C3Zl#idat)}lEfd|U5{E0V~X`iWLp88B3qybdxa zD(WI1VJ+0?7hk<#`b&8T?u5Nii;mGji(%(O2(q+VOy-vm~ho!!1@dE#Sg1g*5QEf{KQ!TshQx^6c_B6J-g9S-C>GqN+jbOi_(Bov=)v9JIY zN-f9$F7#;QRm2*@Df@b>C*=0ynrRv69>`?NiTn)Fzpckv&2jdJBPD-2I`CyZ+SjlO zC)5u7Qao$i26vc)8efdFw(7uB?HtuU@^__GYWKmXW5g7lOQowJ96fR4(UDFw0op;} z{x=wAOD$AtGrtVTo9873fs;MNi^FnYSJ9Ql41jR3B1AXI>oQ_+YH2J=(8AZl?zN_;{SG zP&8uTFWP=C4Un^fR@hXKJ$9_{Q2|x0lNGfrs2>=Xiu7<)+|t%|mALiAS|atFA^pZl zpHC^Fn=8ltW$qh&aYqePlty4x)RTv1ma+b$n^)^UrG;+Tw`nUyR)HT)9Lq33UFvI& z=xl2D4&Os=k3Rj>?=nhHPpj5DH-yEBz@8R}UA;+;GCeG0m};Gjd*)Z=m7>A*4+fgKjpX~l+h>{|B{>9u#-#usvnQE9zemIhw!|e zCZ3svH?keJOC+NiGpJx-Xnxiozx0k-4kR1V!!oHia;YD)+~;YuNVZNWsB&tC_QvGq5P@tAnu{Z+sjVzx#-nc|z&tNEjA{AA?`GJv(9UK>%t zi=~*w27MDhjY` zVfPQoqa)O)hHT__DLDa=rKbjyd$0HQP!%u#Dhs5_9+`t`vypK|ow=6xp&hiM&+XvY z_cS)Am+)G%d(t@ei8lSfd{6nll{s7Foe`R~2pM$*nlEpgVOZ@rDpbJ41-EXsjX zBees6_XnXVRK~?`CAV)nX)hTiGu6mK8N(E}iQJ9|Gj#{_C8TEfgYq0O4Sz!*a0U3+ zCJdndD(0^9P>Q`uE6xrZ3*pZ~UGmTl#-pq>+Csg&aJI%Z^8Hx#fBkuF)~zW>BlOJL`wl4R7d-dR`8 z@b3ixNCr`JIEU12CgaQ;PD<8VVR~LeyU%;P5r|xlr>m?r_z9HL>*pFOpONM%X$?EN zZqc6gml!ssNLG36FykVpE6|lQut_+P{Vjbhfty15M8PzGc9svsQUpotxXp$^z_TaP ze(NK#`5xBX74b)?Sr{kyFBlV+4+S3@l1fO#CP54{XE_D7kA~m?D9#aGBGJRz_#j zp@wco?xySYSp180%ADZsgo-ZCN37si8YL<{yldf7nqiD!;Tl)*m$;sx|^o7rU%$|9i;;P5QX@40eVTpciW{g!@42lti zXkGX}Bb8Vih5qv!4dG9KVJE&R)|Sj;oum@U<$tr#VSP6U8?5it`QLdISDfELn*XOk z_@Ar^Yhxz|b3;c4ng8+pkJ9IV@M*F%p}bI!)_k+q49PQ~Muhy1w65Y%0!6eCWjINQ z^gzryQ;mfG%RomGVA^#)SKg#jtFxHitT99rR;pIvr(s!9wN(C{om8b!)x|^k_xh`o z#gincZnq#k`3KCTI@la_=R7u29A*18SaT#rdW|#buZ+mffSLEuD3Md38KH zy9Yb+pL^(4Um|l6E=g!^Y=so1IkxLO#?M~f;!Za@m{=R9`sh*|rHE|=!_>y-kaNUyI z6^Hgs(<_)>RiVq!!=%2#_&cZxH7E%+E3XiNJ;pcD!K|4*);BWsUwB!z>~4|Mnn#m# z5WXwBn#Kq0fwmaaSBR6Y<7OFsJ1j5sfjtaKTXg5V%y0gE{EM$*5Icr9T@YWZyZ>Oj zcXlr!`1NiAA^44M1|ax}AwA%>iDn7d+)6qL7TiKeWvi7k6kyK8;r;*9NihBQjO0D|hGM_&l)viGS)_HCL=6{20xUpiC*n&{T zUO^~2iLj+zM*PiPdM?4?=H%l{wE8l75LcW%qs^tiCM?fV z7TL>%v*9NVarXOUGc!0Kk(=sxob~(Ck7!aFe?;`!GeC+Bj0H=_B&eVN&5Sg#&h;=8 z=ESzRxY8nssDY}E4HBuWTh=quX2efv>pGDRfG#cz-8C-3%fH(N<4bz`+t9XyteIwudYW4PXZTtFZfF&eBay)XN@ zmNsMWCpXME1dBkHZ~py)v^8ic&imEZz`8ch!Cv8wUIENVxzZ1Lov_FK2ZxVxGGJp! zd%~WY(hJN;?ZlEo#Fwgk8d7to}mHRF#q5A4;rqPR&WeRMkPT zxdC8LLBvIGxG_Z(FLA004V8@U(!yqpodrXI$K~XM{u^gpWzkGJ7!o^wpKZKPtPsQ@ zCNdVgwLMqKYaA<7{phcYB6$;<>DHKvreMVnGgueNe4FUzXT=tf9ZV_u;Nf+L#i~gN z5bXG>D<>-BQ}y2cFsMKD^Wh&JR8yJ3S4R^mY65* zr{1Pu$r1qELug4LFQxyV(Sl78DZc;}U>BvHGkpLjah+a<%w|-Ae`eNSITGR)i`j_L zbJ*d71u$RAh?QC+uZ40WG0JZ2G{#oJZ?fT`~hmvty}qgZjj0mhByZz zMmIL%W&+4V*OB1Y{kRgYWjtFrsQ5Sw^s!`z)xs(#7+R(S{ia(tyTn4`M4MdOG^a!! zn_^p{iL}nx3MZfGL*OfTqOYi2`aAJgrulnnThkcBErawYS&!8n%{xt@WTGz}P0gJx zgw{8SjJ#)9Hj$H_zuz-)HA4Os_!W+-ch~c> zLz&i>dq$bcwp0zqO>*xZHui-?=S^&Ii;(g|<}-;O#fN{UfR08Bny7v3ANYwcIAxlb zA3{C|HX(-6!ev)ke0>$bx<<+J+nyWXWHbY&r9vNi#UKIl#$UqBdu-*0NW(5o9V* ztr)GpztZufWf2O7b3ch6{nB*4Hq=TdH|;aC_Zw5W7|}>n%&vqJB3qKPQfN$dIGjwo zcRBDTMqfB2ujy)R%BkMQ2QQMG;`|-7^b=XU%qqICdfz(#LvW@URFAScLP{KP{r?g6 zj?uYv+uCky+qUf)&e*nXn=`g;+qRt<+qUiGlewL{1Eue^g;X&(p_HfOcvA+1yMu^u#kiH$Onri))zLWr zmootdtOy(F!TMO?2X>ORK88C}V7aZ^Raju+%ut(U^NX}~>ydD4B})_Hnix!RnnoQA z8N3ETs@9~V6t5PZ=DI`#7gOrBX+;i-o%dxY3u4L136mdY3K->Mhx zmI5EOZeD%}a(RN>ByTyTsG!U=P1&?!{b7e~;QSnB(mf|x#pklT2W#*Ypq8mpmq_wK z2&ja0SgXblFeuTYuew?erN3-c(QOK=)@T{Qj}@iXVwv0^?#jr_nPGJn-@N^XJ-#jx zJ>{rxHdb_`oNu-uFABEY%(Y3h9U1qtn*I!8I71$QxFAp=(Byfs-OE~jQy5T0@>0dg zYpjyqQpEIty6|3n&e|It<3mIPCc#SAAD_&yPOP6zugQ8*X1_2jiae-}K#PNJwSYH0 zURxY*HLH<=zC66L7_(i~w0@yk9{#Qmt{Qb+exOD1o4Vu3+Q?|kJIy9aR2C#iI0a6&U zWYO>uw?|2RVRJFT`Pc{i0{Nca{Y%1py0ZHefn!VS$`F6i91zeQN!t+~hK}!ZN7t#b zDI;({D(|$asHO6T8Yy;p5pLZKG|zBWticQLcLlni zgGd+uNO%)5jf$$yvkp4ZnqVdAe??WglOApVO~;RZbymM0O4ZF_&5_nQ)ne?CpX`Zx zl~%vM*7I>(@`8>U#;|6{-X4-j#KAzEq}UYDYL944#yxNg%uLIpW_IH9OMq)fm8Ivr zr5SOAg9S}8G^g7PMxFN;X_?1$+fHk!hqW!fp4Dc%BAY1~3!4iWQ*Taiii)1rv#apD zM_G_x;>0eG?3Q&kOmU5W~$<#8mCM1N)n2N?pL&@DhV+VS}I`dmYxX4K>d2nJ5iM~M8 z+%)>1yOgex+UHvTa%q~zv5lank$I!+>>}%D0BcPob;+Q{D+H|T7(UH?v@e(?@)PlO z?&LMB=fXz^TfVHE#3I0H09dzr9)p(2F-^CQ8{T1;)1*C2ZgU7l!yy?gs=J&&fEx8B zW^TQwj!*F|l_?@tgbf?Vji__a8F!JtA{B0ALV`ed_s`4HHS}MxQH(?IU&Ugk@hi)4Rg@IG2+B1OTHjtJbHHHwyWk-pcN zh1ui7@rq7s8XP?GUk-a9*K7zAYmU3f-Hy-Q>0l{$heY>zI>Fv6=m3_{VyJ?y_M14~_ykzN7B@7*@xg*E5Py0%J0y5ym|#?^ zP;RCP3YpjP!!`~0jB0Jdl$!$1ga$bEvKV~lcuPmR z5VT{#yGB1TMM%VV)ln)C@sw7YOGL9r{>;?zXJOHh?#b0%BWjK;q@0jGj_ZIo;&Ad% zFHv=RL#>nP(Fxo(=jvJu!LI(BEYl;u{?P`7KRs*Nyy^p>GsJlAGHW#I09DAVT*zBh zhvJZ_GaI3#DBm4mQY=c!)NhNXQ}QQ<%y?4Mbv7!h zdpx>(yt%`@BD$+n&!K*>zWz_GW;5H^xcJKrzjgTn^m8CbMd3P~OUGvg>0S!zXUs0A zz;k=m2t&2LHMC=f=`~UF?Ed28p(PS4hOFG=;Y=WP9`Ti7wCiFrkHG*KgKu9?;fvq5IM;r(K$Z?cw zvF=>8XhB=uVXZBoh}U$#do~-<^Q`f^V9J7?g4W-=F=wqU2+07L5Yp!L*(UW(OEQ0dKhJ0FUV7jb-~ReW$^C+xim^* zo)QXVN_teiW$3~VR$ZR$$FFcyfg2%r;8#y8W+kEw5M{(=$BBx^#ngZ2t%%dpZb+B} zrG_PS>C}j6UeIy17ZGV6JRq;1MIwOFop^WjfJ~Px2$s-W^cuoLF!U>P60gb^eCTd4Xxl2TE@d8y&xg zth<7cIiCl)wHUnm&(R&v6URat@T~rGGrrH|r-B4THQI1|V3>%h5rE}<84)yTaQ+10 zF+)G&UA|JDYr^$=8W_zvjBbG75M^!72ZE^D@?y-JCjS5yffC-oCRZsl+r@(4ap0p$ zyj+T+=+prUS?Z?Nb^FX%kDLs~ZKWUflT-fU9T};FeI7C8n~IqIL+i%LOwVmM!BV)K zzo~d#<{?l}heFMDi&7dZo)BF=|I!(_>~~ZBjtt91JWSqC(_Wwe9W76C5uO_bBnQ`; z!eTG~nLq?Q#`9=d=?dCPc6e^}n_vGaKGG`fl-fT(bR9ZMOzAWPExq>2&(dkE?`gLL zL~mPLXU<5{I>^#Lo=)L98PI2u3^i1Q6d#$yDUw*9BtO5yl-YT_(E&wDfO@4(H>Hq4 z-YmQ-9(K-i)y%Y24*1)VXBEexV3oCk1$(@eH_T>bJAP8gb%cnlc3LSXU7Yzflw1Q> z-bb;WuVm9M+>m1Qr3Fl#`Aq>1n9%A$D1xr4X*8r!Arynuwo?P{jggnq?$|G&prISo zN1b`&MItbSL&r%AP5yFH>-`(NOm|bc3AqK!#5hN&NV+CSvL-qg?m3{aWG|t6h36q~ zvgA=lEH?_Mc$H0(^k-Fw8Ay25t-meTTUfBYpt!Vk^cXNp91i9d6%AeaI&bU@wr*Rb zfNBAQXSDyv{*cLx4Vu0MKPVJ}KMv1W(Pa4#aaB=;nDJE#fu0u$>zz{B!{($(C?xd! z)_fqZq*oES_t20Y2XbU(ziUb;?;As;KZfQ zt;{WSKKL$liG1nkluwKc&xI%61Q+UOd5aTX${87aZ-+HD#Dc{-uck!R;07~!WRJ3Q z>jWcPXy}eqWx&^Tqja`&+8Ad#YmzN~Y!7LDsL-A?Q5rIFs#BfoJt|&vZ}rBEFM@xw z8yYKmM*(+3qBA=GVn(;ml|2!0=*tOkIKlr8r8D&Cg@ZrAXmc=`s{Oa3Pa64!Gu!r< z)r-955WVgRDreC4cI<;Uryu|B^n()Iov+10#%5lkO*>-(yU~3kuWF~(g-W!MxmEJ~ zK!$c${u1tDdlK?eK*l2G#^e%{SJg9adU@*ry6O3q=u)U#?LCm*KJsV+SMdc(6jb+T z68~AEdl>P+5;yAucEsH)Yagn6%N}@p=Y??i`93Nd+&y9+@hjR8eEZ^svSKOxe8w+J z6!{dCEq0N+6zldK%V=odjL0*#4eCYa;j7;A&e%+$=!s?lDt6YWN-QEzFmYDS8qY?u ziR*U-zcAHt_>1D&5E;5W;k9TG&0;yExyw2Sn!T2{00Y6;D-Xyq6u~rSxyYm0chM~x zX!NO4{*F5i`;1xASOgCGnsWW=$#2hRyeki!<5`@fv7bMcx1Q%O^d6fXv<7%& zp5@)Ef9TU#$`@YI3QPCp2(67j2qg4Rr*qhyi(G4YTpU3<{l)A{ER^; z|J3j;mwPkpaA@)0SD&g=XQCwH9Zc4Ez*|u*IO6k6vSIJ2@ zq|+ozWf~r}nG!s<0$z;oM!rB$2bRFQ6yPoazI+_4z@lFOp;wWxD@}Js-yd3d$5d&N ze7oaKTbMd#s|$ifD!`UoN$C8~6i@77w|a4QrHzff$Mny|ot>?vwd*s`Uc0g!B5abO0J#MmYP>V$VXkORTPe*^V`?1LO6P*7>zi~j zc|_YeSaWoxABiz=@Pk zO4a^n3N2<1`2*u}_^qLndsAB{D1&*hVkV(je@g1Fy?U12vSeYTF{mMaJy#tH;{PA@6YkSEH|;?DUcbWNjNq zfLK6;C@6j<7Qe^5d_($bQbZo!m;TxweK%Jz9DQ;}e(cBa+-Un7K?VfMHk$>8k!)}5LS*rp8ajmI1ei{CLyU{_zgY3}11f}kE` z7;D>+2NqY+CD4eeC=~CzTJ{OQ2i2yG>QyEOH5MJ-+%bj5PLah~V>J*}?n2=(%8849 zABf|P5Sg?RH6aa0z6L7TkuD-Yf6A68j7{Q_Z_h1 zIHlqnlWkG)(w6m*AwO6wMMM-NDElcYTALSHtz*zq^{FH(w{sU7}@ zyud%S!R%ha(w?7hk_iR?!2R=GjE$V>t<9b24IFIsjp+YR71BlD!Ti4vJM@w^wyriR z|2*0_{Zot-GuAiyzg>$}ivL1pNVaIUC)Pkw2rGT`x(KKs1|a$yK>DLdYYk+;uU~3} zGDLy0iYty07OUT@;Su!;xO)d?$z_7z(HtoHYovm81kUNZ>nh{2*IBdMrt%ugev7^N z&?72|bv%#lEZ9-bS%^HAz*@1_RcN}NT|J_ns^afYJu7ha&ONWoznR(->7aa_V9zd! z)5U45#U!hQYDsIt>M{*)|DA&Z96yy_zs-bQuxk>i>#EH}h)*y1l=VRf?g)0q73VpD zxK*Y%$$Hgf;7ROjaJ5ntoIK6-i|)mM7OBOtUxW-Mx;e>_#SC8uzN|S?Pi8uZbdhWykSUtn zAPPG?)Tj`x9zYOKFrz{*h0+_|H;dlGxr}jF_4T^S!p^V1GbvXkw)BeP<)S)qDInTW zAG|QL+2zo_N}0zem7$W2_yyX?>U%)$);2yGT)_`fY?zS=%8)=jg%6Uc1hNr+t&!Az zH*NyrZk)4?Y+@rp=8C3|~0=96<8bJ4RUlg_cTN8GVZr*QRag&Thy z%8NmQE)?f(A|0v~r;eS%sFc?b&XV(`w4IBp+Z9x`DOE;(ZNYHnH8_bJD~C((W2sjw zmLwV0ueloaKmeo^hVB$o;FFFGAChW~M4>nwS;D^xQ@Mk&@57OfIncXP2jPtM2-mHb zK_zaH{9Lc}*vR+@S+2ACw?#We<3AN@$%%fqJcpmq(R--wO!)o}dzEDk@#^!lFPwg; zF~a{}_Db--qY%Yy?3|tc#X}_dXLBeSJ6N0B{MW|$SJA#o$x?P+55-4kscM}9y(P>+ zzBAV*S4pnZ2!ygAaA+J!BbmmBz!-(*Nw7V6o0J%_VD@Ge-JBdZeM?pkFAt`h!6{HfK~f4Qb9@cp1yxhHQ!a&R1IKF-(xL zurB+;qU$2+P-#^)y;;+^W^gy@dL0b4o%J+~^|oPbdA2Di>WEcSC0anfy9z~1^Fi`y zaQAiN0YxLOd*5vaK6Q5owwh9l`lCyM96a!Z)5w$)4Ks}0m9g?{xDI{L;I`cvWJa=b zYsN~{CS1qqMBMrHHo(-6nT7ibh^ zNoT}<-0q%Uy)2f;E-?6j-bpZ71qZW^6GFg8167+{p` zqS?BuY%8WtxP-T1M8Smhl-Y)ei|~epihKdp7(ZkMhA+@DVhEfWXDGV}AITBp)~Hzy z*>#c$O({YFc7kZxNF1W3Z}?WRH?e;>R)%8xfUAb2u<3!ic*4CAmtVpusCO9Oj=_EZgFx)? zWB9+Bm3E4L)Q^IGI48XS|At?{z|qM;-_Yql9l(D$=PVUV#dQ^gU;XumqY?&qWbk(c zjV#T7Lg!`>a#64)gbWivkQH*Rsn+``SefFCk>+|9;4jgc6-~J2Yd+<(u5`x0B9XW- zr%$%JT&LSSU7jVrj<@-~ff)X{Qi0uw4LQ@??{kC3D36X(j#h-~1x1ll8Mu}25oJ@V z83!~&Th-LvYW1~;b2wbQ`Bh{KxZ*H4gp-rDkm#>_YkgZl>DnAc4th=Nizlv5) zVaQ^hfc0K>c+6L19)HVLX3DJZo}Q{!Zg`ZcyW$cV^R`;vTJaxndCi@R41_*3=-b+d zAkpH&jRQH1GHgrMjw7&^Xw_l-wbFjN5XNq+R2h$66xeMvE~EHGneG;Te44GfMP1UjgCctgT?vU$;MbFJjpC<$?ebaNSWF_@BIfru zaQ&!F%~8o(!TQ8PS(99R*M9ahQOmAim41gofCb(&0Xh4@0h3Ta>9i7bQ?Mda*HPEw z7G2MXAj`%eEi9=KYofrH5TL`-nl_nVWLgTt#wn%4o^k;FSvmg?&OR8*g+wHwR^dh?V1VjeZDA)rPaofwg(Pn725rGr z5&ykCmH{I*ymCn3jc)(A7QB`U&e%|0DbX~W0TQy@Wky++WV+fx^LM9Ad~Gt%e1#8o zOE@cXuiX_lvA}gtZbh~Pn89>AQizLxfX-%^2ZQljrN5p?-g*ZG5?M4K<(K9jj&x*n zdy`84ewH}lRrxns^j%3Wig0**@Wr2r+ljFSmE`fCR^=u;2kMDI#<~@vb|kq*>9?aX z*Ark)07&+ebDW~MYRX@>2~Cj*p8%x49QG0B@L4YV34SSK0cLeC?Y9aw2u#BYy?`Jz z$TCWi@Vvvg&XP)Qd>KuM83xWseN(G5MY+yPJ53gYr$ZdZ5ZK}nc?FIRpAe#yg`JG6 zA)}|u`P$-d6YJ>`N4mc;#}d|8LJ(ihzUl{>;|yU0Arf0ZQ)uzBNf7$V?8-ni(?i(f zC;0IDCZHBGItF40=N*d1*x4H%Af%+XdIfS+IoG@(Mn|#D3dKFjOq^OeAbU%b3>Nl; zQD>ILLO6%QfjB(;Er6G$h%HGBGew!g!rS45R720(eulF#WeA`*&yk1WR+h*Xv}2v`d8qz12*(B(z1}SNbewC7 z9KUq@3D1`w!!?Ld&++1v0mybJSZpl`!}b^Wf0uxRw2`3G{_*e?KSq%DfAR4DT>?(t z+1SBd$=&Y%wBP;1m0bJbO489Lri8=Iytb>d17<0+KOv>&Ia(3w?*zuhdaF_CXiHN{ zQj&dDgpFx6TixFKEYv$vtCL_6TRTks`gQC+ zNs$~h>yH7e=pd|A35JO7LmL`+6NAd54`Hn|&f29$*IE4dPUi||8KTP(pwVc3Wu+!k zGQbT}7C)(7)llIanY?bJiF=v!brofPOKWpsXZpp*G=WgI0If;t?bx8^BPrihY`bXo zDqh1#aqryqkSAv>=8NOcWT&U5oo7gyh6P4$+vsYRIva0(@6ggTnU!8=J&Qg>TzSFN zDV6*b1uWD6<0)Iw9&LVY9FoSSV!;kuVZ%|ZcQrrJJiABa`X}9FEUo#pnpsL~t}V43 zdF|6`t}?H@%@o^anUIW<5~)vX{w$#3xE8cyeOz1fj>{ZEbzQq;OgLK!PKgd$2X%js zM7nfzr_A3J270+rl`-I$>T1VkJCdlFh)xQKG593c3e0!jV!eFnFz!A|@e{`6{Sotp=Qjx)=O^x$;waD#Ho)ImjbGFQv>Q)%jjl$Z zLsTRlfTUd~4>_^ejKW+3HyDKU5ED8Gw?K>6 zpu~T4QN(|71;Mt7wzTeE>lb>!xH#$Sm2KY;qVePm!qy2VCe;PjeH{EpgXlk*^Hs5i zT?IG*fEL344(0w~peh-=IsGdW`!APF@?W!LM*sRn%G~Dvwv4K3s$wsrenqp)oiO>u z0tSd92PtG&G7P4GFo=NZ8v*wdT<&Ar?ZG(n>*&2|A>Z|DV8*e z$6mHhTq@$ffxpd!e1%oJEJ~kWF(V;`s>%H z+Raa)Yri0&zt@M>xXDdV>+D|F+>I=2y>R*V^iF#XM4;ay`Fbf1PJH~Ort3WGZ+SUt zd3|%$dZ~uq-oL-Te}(_udDI7gON>|(;TDj`#acdUFPx!ZfJuwj)mRzome8l#Jx&lb zZ!U~2G2UK%0s}rW7d~5*b3S*N7&k`pSbe(VrqpJ3APZ-_CsEmkQxucOZu`JXiQu|sWq9r`SrmDmbF}yfm3I7;;bnx0k<(pcNr{)9hAF6l8Zan9oRp9}K!YelVNT@4KuY~c z1(EwY-hnbTI%A47B4?{Qdq?RlC=8?}bB~A8vK?tU;V94rW97~;kcMP(--o(t%CS5? zGNC)%Tqv4Wo&g=8n1+mZ+;6rRrI@W`ZB9cgjnDe53Y7iq>(8csAt zCyDOQL?2>q@sdj!+f5f|D|E=oMSMxLyF@K9%;U5vqo!1*{JX%lF5Fi}IO1IbIPsGa zL`Yx`(V{#MUaE8GLjL}Qlcbpt9f^DaNZVb?;J5g`z9?$6xyDElCL2iVm%6}~TVzPS zA#S9neE^~P&-t|7xU@!*KC!~Z2??HBy?R(P6E~n>^%5VtU353ue)`+)KxMeU9&P=) zKXpQRj%4Ko5PlVD3rvYFCB3vxacsc){pA-wJ|CeJCVqjdU(>+CK;>k+RJ@5dnw{i( zu1MK^tdPrfBIqSre*$CdqLwBAfRt{57^%{s!|_^kv7iAV@g3*RM{j9;%z-GC*~?~r zI4next$n064!@+Ir=byBNW6f;@Au(je``vG{iUa3G&JR3r%xAUH=3N8j!lAr^X4o= zTHvjaG*D09@Nm&#C;!L}p|y=S^I#KP#cb~Mf_In}-XKdyBcEgsu z;KqQpi4wVEZ^5BSWuy+gIx~$e=8t~Z^{lU|M)Y1rJ|=Eq7Da08xX)}jdqX0R2^SSe zE;ta_o=LhuP9x`9T2clut!QoGX2Zkt3pblXW?qqbmy&6*aW>7CUa3n0;>ZR z%yl>-DebK$Zn5fILVcWoU$<2Iq3hf)YS|j=)jbBFNeOHH2IRAp5TM&*3;E=7|1#id z;{m%@J|2gp&lIu`vbL=G$$4eXrgzH)yZ-`~W2tZL;@qxUKubV6WIHLq6Lf3+W~TZX z9@mF5Bs{EH#xo{X=uldzYM>>2O($>jT6ciX1)0@4a;dt-8)h5JVmqWmnxON%pD<75 zr1PHcYfYW{;pH5M^Ww^xh2x52OThBodI8xdz*iP7>ca>Q{*_N?9|uoofEdRa)pj1t z(r(4mhET6S#` zE=U9MILKcn@F^zty}!Uo?scQ(dJOp0wHBR&A1{83J3=ZUJ+&T7lXwQ;D+5-6%5{ur zdL=6b93~>GVaPZ75Cae3Cs1F%twbocD1Qn#VJW@)(F`*2H26{ane|5umV+Q;tB84r z#CF@n@h*r7L^5HiKv(+gfqPnmEUBSp&Wk0rb+Yz}XkSt2*ZFUBWd^Bzr(Wgq?Q^04 zvg!^Q_vL9t8`Lu0qfcp(MV-B1i8I)%LG7aWL5dwdL%p?Ot-*ga|i-qH(xX37{$vF7O39yJ0Eg>C;gI7S!SxTF`Ge zx}FiXZQgRWnOj3FEWtN%us@lHw5{wI!9 z(bme?O<&&m2ZrwCE@W%-!$AMhC;r!|QT} zVWnn!k##tR6Q5c>RAc@QnavsPO4U9L8A&!--}zTi*G>Nb8-LYGqbkW4oK7slp1WY; z_1f@QIny7~^?yWQUAwPwbiY5AW2ON!`yA+jIFLo?`kz-JP%@LUTMFH)JM5sQQ2W+7 z=<)CG>Q<5y>RRr$=yU^lx(7dq07Ezu@Knp9Ju@*u`GX~PSAlsjw5rmUTqk z_>pi`$vK&_N9CBLb%@&Jakm(}yeKwirLKI5tL+et&s&|gex|M5XNiF%_IXT5Ew&Tr zU+@!DBh`e&sn+^QLeUlE>LFUmC;^#bm&;GJ{ zEY)8+HZgY9o@de&nPlA_0FjO9r|*IunGNx|xz9)CPkhn~!QCIr$EY@p$J_1_)5jo= z?_OR!8-=NoDx9f;Ks0U*^_-g>9|=NT z=sKH(hvK$$4=mW{#iQXCYWC(CxYu{*P1wEqO{_6GQnddn1jC7a`a;*fIjM`!y;FaI zG6r-U<{3?NOt}MeKG`tjj-)5B z$UaX^sak@A6+f34;v2`vM0FuHjSJ$@159xN90d6g44ilXpq*Q32uuk1Z~`E;`bT~P z0A7S3Dl%oGP*uj6r8RbRRKN%ci7a9CaQqn21UI6d%{4M#VjKkBwnXjKQj^2+g!E3JfCq$?-9Ma(t@){bl^m+==o3%-1Pc%g+BK_%`fI zRcK}R#vF2pcZ;Jlm8=qfa{=G=q22d1oy!x%n(J;S7otM!ox;C33G&?Wl$#mgyuB>lnlHMrFLV<&C-{7{7lSe+S zEm>pyPIMW~TxOtg>kcGh`t@4o=VH@KU!&1~SNCip z*t4IMQdG27?DOKC%rI6OVkJk1xDCpEc*1i@r$$eTr6$S!86pTV5!PI~ovBm|7U|ZT zQT57U!iyn7WW@N)NWaA09fV2velkdXje!Q&9m9|^erj7z$l{?)Vm~*vD-xAYM#rQw zrBMlM=Y5XP$|F@+(m|+{tkp%NVTpoVJ9KPZ|BI1CPl{R35rY^GR+b}%2(04^%KcI8 z9egMLrJx%t!_G(W$rOhfFXUYo|M$T-xo|CoGk*2A&me+BYaq~&ywon+5O*U8YPj-W z!#D$2%Ua4}yFY8AB$JJ?+h#&SbFrz3g*|NCkigBX!GhXeqaLk0jK`d?PtKTAzX|EIkD|JJm# zRKt8x7ID92o>C|4#ncG+3-uAoIU$QfSt!`T_yrUAGyH@>xK^dufHTrsxx)sR%B`zh zHBqaUfT#DAL1RF|!mECjc3r=BpZm_lSigOCrCGtD-ONvuyI)Uw_T0a7Z>_g{d0sdJ zJi2j5i)@tc7aMp1uus@UL~HJc?yzCn#Oyb`WJXVq*n?j!*sJ0+*bxY-XmRuM;_ZIF zIDgF8x5RE^4E$p9B@Fg7?v@RvA7)f7WF0?)+rS?HX5_&rDGzbNi7dd08N4yW5q6^q z9x?VI3Z@_PqKGEHRf3T{cO#32+9=*%#puQvaOBF4DL`u(vf~IQCVC3O(23k7#ibvq z)1VOD=LlCd;vnNTu6LA zSSr_dX*fUNnZIq$NE4v`%_oGF-_@LSI%b~Q(qLV~X|!Z4MXtSkYHUs3B_lM4jaQ46 zg*Q~sND!rC#NFJYBUGC2&=G9cux@CcI&Z?QGNR|(l61+`!Mq{f+(yaVu=#iG4%aHU zi#LO5d>v<^V&ZY>@UPFbGjm%zon_Cmaj~#kczQu{f`Y@cN~YCHVixVDXH{ZLb$#rk z$FTDpOV*d|QHp6X_g^1lHNd^m*cXmZ288N7isdT(TX8Gt0GHyC@#^~^S48S^3$lf* z?6kFI8#s!RG=D4!FW+WPe=~U8qKJn?O|EW{OKco^?n=VhGY*wzPQxPyH2rd#9j~3U zTvOAtQiGtqLP$c{Ks4@vPvk#Pmkq(7_QtCAGIi7(fju}P0!$#lyl+=dRBG65oW6U8_$WgWAVPZ?Xm zpOlup4cex-mP*P>8_!1y^Tg}v{yKl9%z`v6r?fjv7GL|x&5g2Tb&DBfspjO4u01OQ z+N(_1Or?L()IV9KZl5vOxx|P~;Lm0Dmj_9Vja5?&l8dhoz^+X{<#UZlTilkvd1mpt zwg;@DOz51sTrIq5Q6`hkKqV`WNl_rJgi1p;>LmmRm6T%aetH0H_p&=@itT8+MbKSY z&D~ytbO&6^B%Fbh{kh(K$C^qzwJO089Pd(dK&ld1BUletZ}MHw3~6| zno>?0t73K%t5S%>&hkrC^fuWI_eXZV)vyUtWiL9c&_sFx{wmcUP?D#e z|6TUM`d0ZFygeLQVO29-8%#4|m+0BQY*=C)<88ak7DBbzXs9bqPohOs*Ege=StjQE zAwF>SU6Sqe!TG0Wrv~x^);GoPTWBC(QJKZjslMe++F0jLbuV{`x;}w9Hvtk1v#Hpk zM1AvK4pwp|-D~k;-1e)}ho#{1!|>FwQfbw#e@r?saPqv6HtHn#c0+>ej=1xT5x0qp z+gvKAxulfh;;C-(ypoL8VJCkITBKi%9d?RSrRPe6gSJgX)Asg~oJL(k*$#Iuha0$9 z{q1Cbv9f2dr&+P3Bo$lE6~|EsR=cCNJ%tAuO1j%^EN z`t3wg73F5s{1o)uat2uHsT(vXx_ft2=4X(_^7$UI_P6>gV}Ut=2XSL%!IZ2#saj`?0!0@>SFpjRFlm%jB$5DDdtltUH9El<#a$NpF1!_*6E&^&& zFf>(Fn0*EcS}GI!15j#x`oE6sIx&W{l6H_1k)GIqI+J#EMBZtEG6=x}HoD>{eoZ8x zhfOegVc5>qxR4T$-$S>}mv!>RiQa&;*GlJk0IgHjgnC5p6R!wd7P$eY7?Km)1wok{ z{G_LKlF*aB;1m7d!%$aO*`WaS2M~^QIhcPEKJNB2lomS5Y~erOD9{F!npIvE?$DBt zX=$c4TM23r4y5fxA9`?&daKXMQxK@kIl}8BQhvi5ye`OP{z42V#qpB~1S;ct9(fUco?`m>*LCaY&*!e_0A8h_c45RwQ53 z+ZtmC_9*}mJVqW%gAULS2(TN1SjMYG%AMzdIq>*kJ_pMO#Xg&vaXMV}(XE|k{gQuY zLSN$9y&3`3aDPPdijiDmEEi^&NWtk+$Yma>x9T0b=!Db1zc}W&u*_sKaCal{H@TKX zRSdvFkl5{7K2x&ZvOM9Kvc6$NuCBlYC28Zr5`ucqg0NaBs!syR3JT)P%U?NM zkC6J?3r__!LU%?M~a{I+ZIZ=u8+fKz;wmQ@TMtuYH}ac7swgm^LTqKgfi8WNLxQ&7inKncc((mLdOZEt4Kn^&E~iG!$GQG zZX3o;oKHtz2UIY(1k&JQN&+yT?#wgw6ZxAX^_x&0KttAzol(${nwkpSzIWkX@dmg! zyTsT)&RE_3mSusoxWgr*D-y$JdsrJi5uv;PG%F!(MgV(FC|7lgg{O%1RsWG!=oAb$ zEbU9}H)XXh??c*a&GAXmCq={{^UXZbjf$DqENg?L(Xfl^7yPIeDpejKA6}Ie;;LS> z&x$_JJAFCeP~^+pp1Y-7{bUi|%pJdAK2fO+S}EEJ#6$%bxnWFKztW}ppR$0}oTz1k zKP`7u@Bjd0|4XR&lcmWy*qS=%TmOrn{ja1XN>yDI`xw&)EKnpA5VCG?#aRlOo}kt| zv(em2uxb=zLcm{4jdFFA0G2>Ay^opLVvcQdesh!ERaWKS=@8dm` z$9(c>Yx^nMqs68i!gkVRQGEk!+aGNOdp6xsnggr_HxI%L=|j5ezorg&`?EtIR*VgH zO|?ic1S*=1RnD3Pc zi}gz?+V?R6nGc|aRknHP+Cp;+95P>@f0<|vENM?9+x|vzy-b>k3yrnQPw--+_sa0#`QT%UM4!w2eugw+vi5ZbTF;-tg)d z9&n*b7Ef=;DYm)H4m@jAt~fPONBJ$}44qeU&=VyFJ*+ZR&V9)sni;U2KOE&@ELp=; z10@sriLZPUNyD3Up+A16TvAntu2O?Zs(MGMV(IBA3q^$8-Y{GGJXLoKqr4idSffzV zFB#d*AZeoBG9mfK1^aM)G`Q?fzGe>2qGQyq^r#WjtTr&~uiPRzTog`GoaX{Q4MB=U zR-3;|BEss0JYDvZ9BjMKU5O04J@m}th2Ns|;U`3qi^BSW(4sbXX~yya(Zce9!8dD% zXs+^QATuC)%bXp~Nq6clpt*44_#rq%&-ww?f*R?gB*B7GTexfPr7}=6!NndrjQklDz+}q$6x+5NdOxYjs zEGp#aReEALvjB}VwB`}9GnN~M%R+46!3@@r&x#^-bzKTfM2$_hb!9$) |!MVlA< z8%z2Evuop`{6)u2p}ERdk*kvX9#z!kwE^(*Ofp=rU@wjlpVnHr;$Yt@9uW)5BQH*E zvr_$VJUw%j>9N4jI%|Dv?1h65`|8*owl- zXW;eLw5|)oG;uzu7=FqFi7ra=H_7sRp%zh9fG5i=82o)UDobeh)i_};$9WD z;s;Yw#$s;@xU`^YAgsdjWX}xy1Ku6s?0Bc@*7IXGsNz!e!{DmJ8!>6*?mSx z-c6A7VNOV;pE-u5Kjzu23Rv+miVnevLMJb=RDx8z1$+KlioHEy0(o7H$9suRm?sif z{GJ7vb+shCWCG@}VDNrK#aq0)J^2ONFSq==tHrhabXyBX`L5vJmwS{st!pSf3xA(M zgN2P41aBdS-RRfl#dC@lNOg;eCjmqlj*Z_O5K`3uQl$t|rG9P@QfZ1D!2R0x{|8@ddSZJEui-n(90uRh7JedI0f7wmV&)D zM^TZGsM((`#{N${Y z`<4!@LEOc2uemk+%?CcfAmiW~F4%_H1$jZl1_a`-6NKkHsD(A|SNBJUyJiQ)bhI@-yr@lKxZeZE~KU1N3>lC7(m6$PawD!l4`hr8vX0m7*bq3M-_KOQl{IDPPV&YNyYBeI_xNE; zx5xJbgdqkLmULq|ckfSdNa|t4Juf?24qKc&+c!$=Z4()3%9z!F_~T@ZXeT;DIKI>AFF5N>6VlM1_#wlqvN(f zi5OB`w1;@y9|T9oro}uSxlE#1>}az3js%6`k_VR3Cyi#&3bj23UhSys)Bi)+I|q06 zK3k)i*!;w{ZA~V&ZQFJ-v29Om+qP}noESIX^E>w*yyw)dw`y1I{r}UwpYGLbt%gz~ z0-IYYP|W3bq#*gF88y~^t(y5!(a!|a=7YgZHP`3UmnYRlgOgkC&Tof>E`vpWqY*w4 zcG)m|h@eeZ#l}9Lx;t22aZIxHLsOP0L{)Mj6OD10H?3_bi_UlR?s}U z;~3{|5r#qdIv4blT5!)ugZ0j8jdU%7d7IFiIR7_wLm3f=A64Zd%MaF*230p-^;_mK zx*MzdD=JOhX=T~4vso4pRYsZ{Dv^=AVSmf7vxP|*r>plu=J<21X(ti-xmAUYd#*~! zSI$|?ez&4~BO%bJJ(L?`zp6Z5qh2mt^6(|4)Rof20kUCeD~9A5bj?k*f+)*mHv1$C zLzLnY%#Sh`(o5}E7Zv*jg+X(3b1(oMx&FxwtXTgApe>b9BE%AcogYwP=x+N^BzSJW z4s+$Y?x)>4SF<2#2;INFGJU81av#4lfBxul?&!?Hz(x~#XH>=UaS`eLCuTm-1OGRg5qD8K&wNahhXvL>h8v*mE#AsS= zK2yXpFjjTgGAwBfC*Pi`D74bqB7jXSdZ9&HpXthcFEcu3ta1mFoG@OYA+zOhUua+= zQ5x-t1|!%8A~Z@jMF=m-G=)~+|NdhF1p=D_1J zcMD3d&`S3?DlqCW$iJ#ni!)BkiRIC8jLNP%!tt2bnapX^T6GDaM8};(zrXqchY~PJ zAtfzsOwOGV*+_o=_4J;q$i`!zY~JvbMX zcO4;5|AFss-82K5e}JM(L5m{p`Q65E?=4xELla?>N}S#RAwmDOLea=o`)2hq2blc{!ZQ zI4yBy&1NWlmEZ)AcjRU`8sznkUc*ifW`1=2UyC3 zE$I!{mfS8!QjVLzBUcbdu1v%_7+5a$@=tqa&syN4CU>DLPYF(d4{Kd z(%ubb9jM`%IcF=>T$!pgq_GU0G^1R8Gm@G}pqln(Pe`gZF7s_s!^3Vwa~p9Q@2GUl z_q5w(_-)p~j@;S6Vqy53>j`CF_3D5;?c#wbwk-E#Jtz7h?EB!#Lfu@)b%KdmezYFsA673=r%JsAD{HY*8f_w} zDEuV1mBc==QxJO9)=OGNsGvi6aB3*q8FNcIzM9$f!S6WzBcWXS?|3!=h0XJl9!TLc z)3P1RLF1Uqp5;$c+``Ar&!0QjR&feWY)Xl;BQkqF zzzs}huYe^iGh69fe@b>l-i&S3i|W$#~*frWyUW=R+zG zxxrZ&YKw7gm&1M4oUe$s_O?iUFk1i9!O%Np*5VT}PXE(FD^W|yUR(kzk)_OR^T0KJ zTV42{aiKLm;b?x-cxcdY)t`Q)2D4l70^xxnbCyr=!IqCXl=W}BLflS2HJF%J-cq`2 z3d+pbF3Z}u8!M7CD-s^;FfMGUX_3DAIK;Z}$J(xPDc%B!hH#%Ma1fZ;Pt;a6{5ti$$R(jS#8_SzgkHRL;7e%Xd0k9Ei`T3h3iQ62Sa z(%CM)uv`9XlGIyL1^gFm>3C>h75o>V)Vv5AYqvT)I^~AcLEmB5xr2g~3{!nrQ9(C; z)>(_FG+{wkB+Mw%$O@MeVPPOtz;34hK6MzE4K+Ednvho^f62aGRZ?Dm*XD6-<=EbQ zS40UDGXby5-_EQYk#ccVw%#yj7r--az@rMG&gt&1X1>P_O@~lG^6;$5k-I-* zUD=u2{(?kmi|L#AB}|B!C24(`Z{6;hA{8XLoF+}Cl~2Sj{*nIdY?-Wr~*iOMR+CCJp$1yqLJ-09V z~IndM~6Vbki728?`?ef)+0}BU6$_LDcf@k#L7kk zrOuUs+u9x)qA2zEpA514eq*yDhkRgE_b9Z#)NKQIrv1j=3t;4;Sv@{2|J;cJ_r|b$ ze0u)5!>QgdITXsjSD^P!#=fy?V8bonbM$Ltxexz4n%H$AJD*Bfy-{A ztraqNdtvH1x0*INVU^wh2cXOgMNv?W4HzIy(fS3Q*N93KZ?`)GBM=I+C%ZF}TPD|k zKRK~xIgI-A;%Wb5>)PFy_nQ4}HO03BMh_PMgd=dd{f5;`x4$Iw`0yq;ILL-4>fYg* zAKupDIXAjl&q8e>Zus1x#-U_f{bZ)LK%X-N6&GwpDE^7g%#9mDRJ0qw>R{*01FuQm zMILgGmCmWPV9$W|iUkap8=M?03Eg%f_iS?V;^&_mluq4eQKJMmA#&m_BWE4dq{w^e z=Es1J%b0e8ci5@!xyss~Ob?K{c-*QDS_8X}S9g|jZRNs#ZEE*&+B*qG*`Si!lKa!P z=TP#;Rv*F}Y}K&IG6V%$WUSrA%`Cd4xRa}MQ?Xu~anphZ`b)Vq|Bu`~&3qcOx8@Z} zE>_jb#3(bXysa{}i<UFqCBY;aKNL^6c zkf5_ity`i9ty#I~=akw4V(2+zOp~g~A;^wh z?Qp}WC{Z8R7Vf(J-r6i=V)3HN)Ly3n>NTR#*R^Hh!TJdFKvadx&5$76_z~!UXK3p7 zs(aPvl4%dxZ38+|TMzDMR;tDOlDy<$29Y~Aw0w7-fI5Fs*PgL`)XW5ldgwnprvsHT zciCF70^1FJ;?1kjhQu_Icq#V6{9i5uinQycFnlqtw|J$D1_!r4tB!7owUilZP<_bK zr?i@cm>YOg0GV|G!I&B(0fa9`v3ldX5_&6Dvq<|bgdp$sc-w+eQO&1)mNqjMY`lDc zzx9(Rxi=f|&!3J+ierMo=RrfkXC?jtxIvCMwN_k41{7RZOKXAqm%) c}t)RlBWI zsD|=(la|glw2XZp@y9U4T1b*j_<^&zNFE}6<#%#;+kMTb7#Rhbk0zQ+W0;~Wf!Hpo zyco=WmhKro*l-k~|`0IK&|@jTYIKu7rRYrbphgT2MlPR9PKxS6lA0UmN}K ztIW%PVv~aU> zz$wG9hdvX9a?(rrDatuH;T3Y|4n=;;1Uzaqp8vh9`pq3?xXqq zwfgPc2y*{SJ|*g`wzr+9bL5O8nl>LH#2LI#^9;OIFvvvxjMk{TV~&P)oxLML{0hc>4~db+ zAS|6F2FmHrh+`J7Czy*b9L#8{xR-`O*d9@#lnW09v~o7DltX+DJCMO$zgqjof~}#S zV9Rq858do9YN79qGa+1$j(A27Ob{Vq3&SNv7_DP}{U{tBu|DGCiV42(#zyAn43MiM zOCU<=b45RWWF)Ai?ACkxm6BPOuK)OU-K=m)JP{E|iq_4BVPnROR+0aK&f>^;NJ}EX zfMsk9&*paX>ZlFjCz05&yJkonw`zJi`FwK&R^`6Hz@0+zww=>v z<~bmzx8KYYqC$}9U!HAW+#r|x0+#NCV*OaRF8!dS^$q2H#+-k-hc6GnRjC(yIwgN* zm+YDi>jjrrkT0-w+iQz_*zxLB8{XkHuUu;4>)@S>F~3fUbV_smhw-LPE}Id*VXVs zQtOaUV!rY)#^4)}XZaz=@+#dTGT!O&$=0XLY|m;RuWrzqFjFeDn$$s(DXRYNVBVqPfDi+Dd+TG7|n|pjnW8 z=48jcdYmj;#?uJU*5v3+zxMoe3@&vUsdQbCYY6f2=ePD0+(vG1;t`B`)krXv+f29Q z)X{7I2!@2vk?jQmLty3UOAn^hn%6VX?gwYXJo?g6={HP!6zWS33=b?;GaZ>#o7h=- zXGUYDvbAFP&A;xby{n3g2TG(jvkzT)6;>k<+*-Sii8fp{JTH^uXi71yMVAzF_9a!6 zRtw%g=UWe$zFwts&1=seH{u3Jw!>W@usn?~glo|ciUCoIVL8~9p2X?Q} zOKK6D_Ks-rPgxmw{6LS_RV^?6O zgr3o%UJx~eWg(T*Rwwq;OeL4uWz$a+D3l>9oM-0yPh_fpNY6%0k^Z9J97c!l==${^ zk@fGSXG3cvt8ZZwy`ZhNwZ4tfKO(1pEzlA&HZiv`|HnH-*v-(`?w^l;fhSpUlCr>z zh{MId+x;oR{mHk{f9#Xt1=;aSOR)um_H|yMm8@RIU*-AG%97x{1Nl(wOY!do1k{GO zJ0G!s71>_XR|DDoXy+X1VN1ismS9W7RD&xunlqB)a=v~6aRsglmLZ>2fICmZ3y`9| z0}Jq{PHM>r^v-SXz}G805y3<7(2^WG9+YB=XAB4~7up*DF{RX2U?`=8zAKzYJ3WXAMBZ85rR|+3yD*M8=Y>5E zL=_Z`=^kXEP#{q2#jWbuy?hljt-Sr*V6(AD5RDz0&PxCm;htSfWo4AjZ7yr1tTA=$ z4renhds}e_QjZ*~r>m&O3b+Zld(vL#EcoVk7P0n#Yks z-gAe)dI9L2M>7Q^a+=L_HzhG0Xw00JDY(kj3g=(CzM{gl1RgWvh@FvzH=bw%jx^wL zXh@%jPD`RB{%U!LNb^P6-F7^;#g(-zYQ~MCl);TTUXrLYOmm zSC?OLDx#8B&IWC+pt8%kI8|l23mI76inK3Pq`QQXZRd5>E=D}bO z$Eo{wHV4G!Hl#=1j|aRn?324D10-!H{kNJ(!U_*N&$2-ayFu~aMtEYtbErj*8yO=b zy8pp0{U_IeVBK}GAc25vkbr=`cZK}lz{mfVYbs3to@S~qt|;F!(4k~nb-W%J@Qgx? zIW)omVMxL-bu4?`SnCdyUx_^Y7A5m4aMu7bC% z&$;e`;^J*@<|boJTE^p*r_JV#%l4;Dc8`0$WgFlXKi^<`ae~7A5eE0+CeJj7|gKtPN@saL~SKXCbh6BBXM^uBnq@8%_+I3S-!FIC| zuf%6x6Qy$C_tFTm7ymppUCTPbKjEHUh9a1ioO2pWVb(_K#|*|-8Lk?(v(lVTtZ^>a zZ1NK)u(MkIVvAl(iZ*zT)b#*N^1OdLUjnyE;S!=Z* z$7h3OK95Oo=^D+Ie4ftM9Kxb>RckfADLRid-INsNtcmIPG?UB^=Qm}Qj;8vc*0h?E zgTa{9KO{B;5Ur;qW;WwUp7q{>5nzNzgHMMvL_S{;vAt^O4!r@ItLX+ zmKSlOB!|EtycCFeeI1=6nU+9AyT}y`Y{}14zfLejyC(C z>nh%VGdN|4K4}RY=hEp#V6jRShuc3#Wia`#p zcv&^b={!rle>wIapbvak`2CW!;-NTF9rO;~y?D#L>l4Fw@|@rDME)Q{9 z>pRTHa-sHW_-A)Z6S6VpKx`itsEG71iUaZTX<2pP0ds z(XDcYs~R+K5${oS^Sb%8lyOA7A^f3uVp{e%5BZLE|JAes70P{`Nl+r( zJ*UPb>`YG*=j$FRA`m2H$8z)b<^xT2e9EMTn-Yf46lb;4hkIPTWQf{0-E-GF;x-)V zcXs>y4nmfX(+Yh46{#78^G0_%0Yjt)wT8&StF*@q7&Vup9 zEq$du-jX4ti~WjK?iklypI`QuCx6&>xy*ATz0mi%KCN+#tG{=h&Q+{QG&*UO&Uaet zW(C_^JPGIQwn9f|~k@peYf)FxM+X8_Nav=uCbzOn*9=KyR- zLli1{uy7d1ZG}=-4-2nk)HP5L00;dFQQ+&M1nQa40HNwk2j`Pr8=%gv`mNHRsHS}I zFH_lj9g+KF9_Z0c06A?$DHt`C9tX_tawgv^TX6Y)KKBZTwOuWYXGuStlehd`>(D$? z*aM}W;g{!+m#&*j8&w~~IkP{%*MboF)IjYEtH}v;5xO2eGQ*4$c1fdzTv$q0kM{hLPN~*`KjX0REdb+# zeGK%3F}WtC$@j&4937-n{>P-mx=;nj24Uhua_yorDMj&w~<@2D0C?F zbay4wR_+*oi#1pS8lqzOxT(c}peqD5Ov?nM4q=3?zIT+pwqc>R=|=Uv z&xT&mHceUKyA|!BJH0F;i=z3G#b~xlQ0mKnat8cIJLQafS8n=U+be(9_Wz*QHpWi$ zjwbZ~pOEZdj*Z{z$!tvjX}=WylM`T+qP8N6IDj`RE!HUY7n|jb_C9(QQ>26zpBf;P zAlwA*d`ZCX+oDKtuIGdymn@6+E8Mp0r4K|!zv8YJf5*1YrL!4Ra6s*F{PJr3*e7$o zneYASiubpqT1{;KAT0PTb%vz5mdt*5P&tO|KD&#wno(8lF;|8-o1#_GYNBFGT%Qzl zJuqe?A-eKG$T{%Knc}r>HNb7x!+e^Zaz@os*q1FGIFCpV%!lI3%(`kU)TZctM%CEQ z|K54$r0zH8a*3p0uLZf;s3sft`jC0xSt-i>jpbts)B+f0NR} zcLJI5w9j}QZIOjE0w=CK6i+aC&iu|-dX5;6*LmqfVF~8(H+@>O#l!eWwvQRbsL<1& z$R`Mgj>_8QfzB_P&to-Jx2wX3i`lepnr)8A30mh0%Iyt|ney@D8}WB(zv|Ff(iOPH zQ7vm{!z~=POy`0EI)+-5u|w>8hX?^yu(<@WBN_{FNqy4TjxEA(6;V7s4feprRvX`w zT|8H-4dI~4YqqOgD!Zfh2EfQAjFa!*(h5pH6kfq@qz8BZ3Nafn9qB1>zaF8O+7m_! z-VnOj-L^GEv6qUE4_4&aQYE!{srtsX$Z^z6iRl}{p+~$UIQn!_7c$|gUBE{?4yey> zevA0*hfZXgcAb!iHPNRK`@joXCyfAc_MVzIv_94?g5Dv!>BC8{x~MKM33}UDpGwDf zDHllbI#UV<49v_SAd!-~fc#e(Q$eI*piXWX?U}c^{_IFg9g@f$8LfRjznM6ngt)1Y>q^#^#WAh6!@1 zSg+x=8dsJAw+AqVBkI(l1p9efragity{5QB9k|VNjyfaq&^J~EuXr_?IOO>P0n8Np z02gMK9(Hq!;~Svn8-&RQS-c|^G97qf*m+NkiGuv(Je+RC>3uaaZ4sWGSyXN+vWJ6OM*g;hZvHiRQ#3steZ~H8 z+en(ZV&N`|E0q0@{@|Z{?LizuY5xXHuD)|t@PEzM|HENb&e+)UA3^B9c*f%2s&W1A zmi%9>LZPCzB?>=)w^?OKiTT-Bw9RufIkLsv-pW4beMK*%1^ z%HKICTkZBYw-mXHl{gY5&#@8q)!u9;klJF*(!UpSC)&G8Eit_Ya*}F3)Q82(663B8 zW}9Ynafq%_aaH-k=@L_(jKv*84?a8=w9Le(4@kvd-xeEeaOJPsx3kA#XR3~4D|oPL z+?vdd6*9S#k{l|h<=(_zN2yg^jLeL_cbI&%H=nC)XX_Ji#LQDT^2cZ-=f`^y2RBQ|9ktBK@j*I^uNZ&B|P+O!}k_?&hJH&*#ARp z{2NUB|F(yoUVuf^&#Ma)Q&;9)BsDRT5nv<%U=ooimRv|Eie5zgTuA>Ueb;zcE0g`J zz>v8$Dvg}K)^HZW)}b0o1sI{vzt;B3e`++YE&W_rTWYeXZ0gRTSaUQXOW2&GyE(^q zJl^7d@;UZ8{wCq29d~{F1-0k0(c8%#0Qw+^w>8+A(YlKDXLpn73Tj8^eIzEE zAiO4u+|zi2eE*XmdN9d{r{@~~e(Q3>lOgohZ6qe-W2KiN#;!ggBj>qxJVx~6!G_9l*DLbj$=l;wAzFERnBo78abEE@dI^ z=O4ONM20rd06)oK&XZ>z)h1JU!Sq+nI3b(m92A(=BO^Cm8%p{Q)&BhjnIJQDLS>S8 zV}InZ;pkW}prehmVUt~x-N`Zfcd^x)!Vg}$?D;LJVpJg;KwD60<1u2tcSRb^O$6JrpvQ~g8kPRW zj^@`)-@w}Wg&9Z9!*|R6I(cA;mtXwWCE@t+Cdd()3q%t?mp05bYI*HaqfPL)@ z&Dg%fzzlnWnaf%S80C8-i(1c>reJWGEA%spP@ei_4P6hSdSK=Z(XG%z7iEJjk~(j0 zoVq9p>m&ip0QexZgUBQjRP%(URjr~luMLeDiC7M&GgEfLZAZ_ksNgdNBUte1s1qFd zAxCkQ@iPzHazfOQ7p<{oZnjnEX;xOj!npUh3qrp%LU4e3@=s9EtDjNjLRg>gU2=qr1_?{-iBxz11~Zy{&4wJIWm* zs=~eJJkP9KayMi?`8&NbLP(m@?@WeX#Rt%z3+RmMyur4eqA(P@fe$yl8CtGfq*psY^ve zCw&=f{%}Z@34`*X(=0aLDR>cgX$XxC!|evMHMy1Z$h$6$^@_|E{m`HO-Bi!mbgFik z>~L+Bg;@LSiJKTZG+@p}6k;qYtUOgLfXkyplY%&Pk574iLL))5 z)v?p<9ci}6={Y#^bfmJgBaEq6rk$S_g>WnL_R2XGZN!Kp>z@nbInW8V*)G)zI(mrh z3{?u>yDuHwRr`ZV7oPhW_!L**|esB_KN~1sSwW+`C zE$GZc=P9FaMjQJiDAv)dirONh-IQz_#}GBQ3Ub3N%zoZB*oPw6a)+j+z;`t>KDholtDJL018~hcFeo}I9 zu-4LucE-ow8jTsW<;D|&G`JF2$3(_vwQ;dbq0D+LQi%@=_?3#n%M@xYA<@4n&#ZJf z=_u~M-)Et4Ddplo7ObfY)+3+h;6BtEa($`bT9b%azJx#&U)fSkt`Sj{!+3lwEs3a+s(ye$n#=LpH= zMROwb17^lKN#g)dLVL%+?(;j&mfm$zWtm=RFGw$G#+ZzTUS!#0^+|4p=)$E#&0*Ee z66n1isj;8>)5>h0Y>72GXNa*Mc^*QekN=)##!88W;K+&>Tu-@GhbMUh2VvV4P|VQ; z$%Y{jageYMj)aOX->Z;mNJ!W30C6i6Vjhe1h6Gs2&fUxeRPirsD|Hx&j^KyO z<)G>pmiNOnq<6MVFs~2EjiArJ$rH>(y)0motyoQRGkS^Oi#+HbOhBYgv%o-%;iWqxrjyQ+{YYlO^Ug!^V zEE;7xjZ5J)L|P}$ZbG&tZr4$GDpI&2&2c5_@nV{Sl$Bs%|IzY~gFgf+YD+AyRO?w& z;Y@_c7idI9)x*pM$`*vIK_X*zfAepit#dhHgR;e!A18+h9DhSR6Ukm7wCK!E=aG$~ zKX9yG;GM(XKzIQs`ct(;7v{UJkL@O5?eXw+)I9cqvO005BfV*)%_)3r-ZUY2Y=u z?_ac+;F7lI+eY!!&ZLms?Cr3R4&{t{C=V%RC@X4s6Y>s@exH1dT?}Sb;6t?p@dV3b z;!#fvyLwP*(=<T9eG@^e&heZqm#HbAUPM(BJv8TmdM#X)Q;-_s5UwX8|@coV^EcNd!A=omXtUQ(G{pW#6<|dixWP>w1h5= zsma)SaxM%etoujI%kSGDFBwPZke@1D0y;dJ{u!3=3_Ungt;uhW@uQpTN9Q8+%`fE_ z8Kp-(=*}_^20xwQr$3=Oi@X@()hHem%hv;8>ja*jl<=@71l%{>NyyLTG%zc>3lOrc zrd0%K=&elXoJ^wYH<6wKbQ{fzcA~}m@b&iW#)GuA_QOYg-q)cm+Ya{UxEsL0Je24= zZ>hQrPGewTUD=wqz`(DA|OI|NN*30 z9v#qPY(?xiS!S!aLkQy=D#PH%##vBik-v5S3X7EVt~fPe-=ue%`=HP)^>>iWRbPGf&F=F}B%ayjo7?lnq;rjc zT+arac8TcMvemPEQb{5a%0KKpLbrjvgAnMm)eb=NT?r#?Woy3wH^We*i_B2$Z#_-? zcfrs1KNS1_0&f0~M(}@a0#(!<|FI9N$`T4AGOccxMy;)Z`?>^ z7>e)@Doq5oOt@uH zg7Oe6k1P^;B<31QTW>6c0YTv@bMTf8N8~ z1Gqj+0mQq!Yx@w*GD8j6{BPU$R|Y}|YVpmnl+dhFlqKm&JL!vGYx0ff=!+dNr)Y=Y zK9!}>m<6bdGIts9h17s9DLkyJJaRx)nnFZE4I_ZAXlakrF{xdYawop6p$rQPoi&5i z8cSByaN*HJ;RMEkbg57vVcw*7&TXQTrKGcoc(kM_W+14mJIY-q9CRf1O~!g zL9pW+q|NLvtyoxGS(E5pJMU6Mj16hYRj6i(tXCcP2TU%(#S|SC)~I!tuUe!tj+C=2 zyxq+vIr&|1dkm<{SF^A^dw#~hzLX|zbhjw~~aGNxqliYTR} z)TYMp0N5L!phDz|4K2#e;Ax0)d=KP zFeF&jPk*xu#5-eLKNk}XIr+(An`a8yPZBnFAZB_v7nOe;e}Se59xQ9(x4 zGni9s91;_Aq{?q^367jUQQpBekDMN>=om)22JzlOju+Tkdb)B%ShBMyf!DT7mnk=Of$~s>ddNEFguE7}*>9Lw zgRMZVdtbN;{a9Gpc}X5Y)>dOq^etD0eHGCwD)bTW9KH*sj?lmJOc$G zD`-eycd;dkwa?4V_Qw1Pn}WY9Q}mma^_$&SA|;9gy|*Nl>PuQ7R=!B6E)_PH`d6-n z_j&fN+)_y+n7m{a}_|6Kud8!2-~Cz9{? ze}&nilr|maMKE~Jb13AE>^25SNabb&4YmjV`CQc z&>=&Edw#Dy?wzXpg_#g2^LFXRWHmtx@>MYxoerL11srwuD8c|IBnjr1oddTP-edzf z)*gUc=d5kV%obN4PAORhmv5J|M&@14Cd@7T^odv!BXLkgfK`YgjT#QP?P*%wUm3bi zyA+kothjHX?~zAT%DSNe8e{hOpL0^U^L! zIPw%D(InbW^l?yuqtVjrCi@w~G~eb2$w#Vl1XY7w#28WQm!I3vztv4TCF8f(<#)u2 zOIOxyxah80rJFB(qG&d8pM@Q@65kB|V4`KYN!a>Q-QKMjnFf4XvEp=*5= zD_#cP1kwz0sV;i_ps-qx{ywRu6zE!psCmFMp9ZbmhOU{+a&eMLIRd|7CGK((V~9_( zq3Ylzp*P%w1{#AK5}8yrXh+Q#UrFt#}>8>H?Tq47}$lqxUik`p!cj*{$-7EZ~5fj=tm;c zyk1@qOA!bM#>hYjFK_qig>08Vtbt*v4l$&tibejmsg+_z#)Klz?%+vE3&NLs>l?!Q z`A$Xk30D9ptly3p3>st&*Luft#Km)eSy3m z!2Ni2h%PJy$SV1WMEXdG_F~{nT%!YNP!Vqeny#AGl>>zWsAY3yko*H+WqV6)4NVr8 zHt3qxmWy=IBVSo>TN525AcY^K?yl}n*`8Oc)1CBP?}I3^D6<^IAX-nHeFzDjcTD3L0_C$0t@Ak{4BNx~sH1$!(quxbHC#U6=O zQz_@uD3ckt7E;kDo0rZqb&e?*(y%Tm>>E9}DN2uggCThx=|;D!OrCY6GK`C*$z_jo z0M@}hMH<${mc5hN{35Q&h}n4>=eEKk&9Wf{W*SySvgx`7E6QUvi>kt@8l}pHsfGph z07o9SB=VT4NQjgvbD|ed2MXZ7*F&+A3Oi7w=-{#{H!?XvQ6zPhZh1NMW%9#6u z+A*bL&r+xYFp*xZMh&x-lJo-1x&7wuh1*t|c+490X zrn*T5ba8Hz(iR{b+tR?owZla&$x3t~b~TIqLb~Kqus(i8xt0Nil(CL+8t2vqX+>@Q zGU`sJ&bBcHRn0Rjezyc30x8|51=WrRW#`JC_9=yB%`mW!A}SHl^2UXFvGQ_$7HsW?aPf+jai({;iqt6ne#LT#%9EH7V6jUb8Nh z(O<<=Or2rA+M-Q1!KL$*H zsPL=Ps!WyUFUYA?%>qK_Ls6ULt8U|hWwOVng6+r*{^8n8s+bho zzg>l&Mx}f(MEE0HKNE*_rT(faeoQLhtDjvbzp8Ed7?jC6>Vtjim-?ok>2g|?`DUEe z<4ncf-Q!Fp-O0f}#oyV%AB($_guIEp2*cybeW9(0-ZG4^tXNX?*TBXY8-;O5F-BQc z>tiJwAEX8^Gda-qn__m-1^i{zRE7?BdHn;KaG8JJK* z`?(y7pZ-lk9BW+E4P+Zw$ykcL{;$G~FlQ>0S`4_Fs=DBbXYKFhLN0`tsbnL9+DM$MdwnxS$8JcTy(Iiw00&P@k&UdzfEnu%+aEpFO{|PIFc1y@p^|*>ieXlbs>MlG5VJ90000xXeUEQ^UVf z`d+RYVQ4RRrRK_@Xf)2Snu~8`DXHV6XFW;VlPUJ$tJ$MESx$=rPLF_9F}L#VcO~yn z{!jVP&3HW;8tY=_Vp0s7#hIRWJQxOJSyTmS5M>F^v6B)~DRoPsl~g4+jHXiqWose; z3|Sr{KjkbA_`5v$7`Z-l$&4G}O6Bc>3-vk+;&CP@DR`U(5fbeo5cflBpnZguiXn;H z?VywhP2z80r^3OZCKBE;PqD|^1xu`p>rtus&-=6CfFA=5>4I^R%wwAlgbqHgjYegk z+d+6DIOkwmYKy|yYuFjAGWF~%!E2fNoR$Phj#i(Kt`m8X7P7i=xUPxh&C+)0Bn25M z#9BgjkaCk@$s-1y#fNFGYl^9Vw;XXN%V3)Hs+u`5zNKVdKg#$E+B)V~xwkN^`gf2D zdG$>eFhNcPtJVVbDCLHKF@MX&{XLoWa0yPWdl?AqSJ=?)2fE3Y`5Un^1f$ReaJ8G3 zD3aXWX)nWOf`!5hzR$Im8>mdafR$E`IUfm$AcNm~BO&P5CXRp9cI2a7fw-kIo0eGA z4(9-C2^!FH9}EjyAAH;D_ONlEl^BB@=AUYHkR8aXxJLpp5sGoAcrs&I^!dr?mJ{|z z(8JXzJsYj*WqC+|c~&B1im=ICrV-U-jS-nX3Y`wdTIeaAdI+UOL=cwX%|}!&crEUW z4P$MH8`0WWF|X()FnjhYA`SzAFfVLPDVl{w$+p!0L)SZni4tvFnmcXVwr$(SPTRI^ z+qP}nHh0>#GdoY+>aObgZau|Ayv2%$HRfD%{9}Ipm35Ik1ZEl233O;pXFwq%cvL>) zXB{%k#vKt$L@w)V2C4>D#K_k?+5wf$$r(VWZupGvN0{Z!_hO#B#iDyQoK4ISViU9| zAj!>;`tp{&w7I)DpJt65b5|D+s--zNqXT-(RGq@ zf~1^bhR-DiPcUKQG4!O~0gm$ah(s`J5p^o=h0i)y8euT71m|S3Fj@>Ni!`B_uu-I@ z{um)v{X3zxGG$ET3AF$5Ep%aXIRrrrv@W&xp&RNuqm-;G8y@}*(;@u={t1qgbXTRVrU)XU81)Tr|Ev=xe{&^$_>-aE-J{B*a zsDVe0$iTQn0HcM8sXYOQ70FGfsfcv}6!zKCNJ%{o-wgC~hJ} zf3vI;q?DMkv~$q<({@94Pca6Jt}S%-*-T(nc{Bo9KL0Ba!4s?SreQR}W;E&(eO)04 z`9Qc~5HqjNjP9S4VHg%iQ#CLzQNF_7S@gb8d@_HO7&P6pr}rqtvx`L7!Wr<9%)M!E zt?9l-{I3F1R4ALIvhC4EciC8uF>x<1(A9T00J-}+X5MX6XlBqiH<(%x-d!fZ5xqkS zUPJJmQ>GBi!4CW#5tumm>^k#1jKOFG-fspxVPYTb$7T`eh{V5%Iz$X3@7O#=g=KVZ*^UM(s!XAHR`lWtlalzxfx8xQJ45c>D)g|{V9Y_wfoOkW zW_%8k2{WUnSiA#mZ~#iGgYc5WPo^~0thG;mneD2jFwyMxu@60B#In^#D0X{0{;;yr zA+e9BJ1?R|iXY3oT_)07P`sPNQ1208LqzP2yG91~iW;f)vi5&y%*a~<;3 zbJPg%>fKvuQ{4PZRPfqJcCwG>7RR%^GGdbe<7)ebK>i(O_|p=PoFQzqMqxE@Ec#>n zE8?#M@(Jk48R)R;&;0cA6n!}2vVHi=tfP2l=^JzJ{NMS;bMER244i3urxRSsF z)&6>x78yp_{wcd7eHPSlobFIn|Ioof_pd4s@*_70jML%gD^FQ34XFK(051l^kNd{* ziGcL=Z7jLBi1pd<$DRBzU|xQ`B;f1BrrDU#;*ahd@amNWDs_Kz%BK$$jAW`8iW!=% zGh%BGD-UIomuh#*x^!?7=Z}|yuqpFY8CVc9Sy|?}r%?mTRmvn6QCv2>RnSikZteyR zC@T{d-6>Jg5hSGVFiJ6(&4j3Ubh=-?Y98+Xa?hGd?+NkNgeqbwMK5}7QKsFR^BQIV zAhB$h-QBVFKzWdYHoEqC!$!<&x>d&B40-kl40Vt@CY&&t(0A=fFQy$anP543jcAG9 z_5tACn2g!|y9|axqppHo>x7On!sKC`D-#0WGxo#|0;}u~f!fe?&NFNrHPJEmN{ZD* zsAgBIQrwZ|sGVg8;$pDCu%g1iFf)&}9E;I`(nazY2hY!Y1~Cl)^A|=pXLx*~7HCdQ z2}CC*ho<;*?w1I*7mfcE3~qx=5}*E1q&dU}f}v_s5;f!cte&U^{#LB%tSDMX=1>T7 z?-eG4?+uwM$1ors0Yf27ZsGLmch|5#*Wi8){eF}+pUjeCp6@$6`UTr_?h=nE1|&$6jm zaSgtX#vsAk&h$boY^Y3eoH-GIS<#J*FovUzjmAA z5{oL<(R)O4ogMB8Q%#+0ARA2HyLV6#aeaBBl9f{LK;tzZoV0~Q}%c}0~5 zyf4OpDBi42V#)yR3(c?)MtPCB-b01F`1-*6lUR_sbC6Xg8M5n+=EaxV2y$5@_F;_tm6>C4;CJb&z@fl#U0ou!6JAj#dN_TL{tKkf?s5PvVx^ob$cigcFV%-sVae&IKZ;|Irw`n3N45 zQ^J9fX+dBhj=D_0Fug=qQvRZPe;@9RaIm=-CQcRhJYxht6Conyoz$UcBTNhv!2tneXYm1lsUTAICm$vPP+ z5(a~uRM>17;T`ivRHT=vG~#psv?;r^(DwrcJm7#v{U3=2bEXtRg+|N3av`|8?t1<@ z9)#*8i|8<+&w5sza^wy|_}Gqq()ObqgpEHlEFnno(RSbVME%TH8m ztAq|k)!r>VX~?llGBw^K9x0t_sXuFJ;LaGU_@UF zyOGpd0LCuV+)*}4_}7fq&(f}a>37f&eU_?*I&}>Cm3hMPg`zG>S^z1kDp)M}e2>l4 z<>F_9R6Jdy>Hu4&Mr@YAe~x~JAyAd8c~L=%H5V?%_w6wKS?bLqp95e~;3u@rwT_r- zSZnSuGNUYaOXcQ*aUS|gOgs2kG0vRZA>}0H&Q01PXJ{>AL{>Lj=hitr#e5Xq1=-Th zpn7!fzxdmVX%HJ~C98y)-I>kD|7Lm5>&j=G0k1%o&QVi3@91~h+{?6ebj*bW8PRr} zdfcXdyNJjlX!lqR-0|s%V>MSiQlFIBtAgK$_R+a-^W|OC8@<@-+;`#}4F_k~XRZxO zF>RF@y{h7Ktt}}Nx&OVlDE^qP%tEqMY;6rTh=x^Q(i*@wSX5&fZF|-N3^;#57_S?+ zTc@!Oj~)nfy9d-xJH|%+CQ~?-4Qn{q@hB;hDXjkrs=@k>tn56Rw6yeG@Nf?SIzsBP z#HwU?8WFUP*E1AOeH{YHnu!<`Az|DhS~cM%nvDt4 zSS8JPqHwMDmWyQ}#L}-Pyt=#PY*&?)O6gH`X?_ZoAJI6&iH9ha#w5cNo#MYN*LUBy zOS&f!;FLrdF6YTPtFxNKj&ee3hK_W})vymxmGmX=J9NB9IQjQ|xL_DjjK-X1>zhrY ztIjL{5xotdmXz(*XQ-`+$it0Y}x*P(T4 zdUhy5ej0NU)dufs1bS}t&02x)&2+K#AXQ5e9^j3$51>Jh7>JD$2B!IV)?jE$s1WvL zpv=Onux@)C|9pKJzw&NYWo|A_Y-S|tJ}sOqO~eG%GLI}$5l1)EdSUF`x>?Xf_GkKX zu&U0*I!EzKMb4$raIfKUyX{+N#$@X6JxIv>O3rD?ztIw>5@V6>D^GD-`hRmh8w?AB zF*l(JHT114P5)vdF@>IKR<<6iiIjR5q(fHQ^QaM5SIN(5acXY7-%VY#W|(ISjGr0> z(A)svS>2seBC_Lro$Yma>}S0+Pa)N;+e%`(P^qQg=D5xvlpcL<&`vKB zO3>>Bf0ob|&u9S@Obd<_NCRBGcuXDm`|fFgIaRzB8}_cqS93T&q!pa9&tMko+&r4k zlS7vGFP7}S$cPU{$g`o62m4A%>&o0L_uOJfz^9#E*s~(U6LVwn)k!-y#$Ivd7Fv5| z=v{GUp;*@jMd{(Vz#DY6WW#j-g*vD7;-OtO6$;z!sl$jj6Rm(cAKPYE#EeeV64vgQ zHUEr2w<$DX>y%JhmDnKv+IV+L{D1&s43V?$afzrCQ97G5dUDGMJkM|k%%${8e*O(%=BTh7p@sh#VsXouJ~%u z!<4`hSfV@fAatTy=9by-3$Bl80n3lv|`CCPb+;|)ZoAeU&*gLhPdZ;B>!j&J+dz1|c~ z=AX}FHb7=MXoBV`UvZ*r^`@+M1 zg$sAzMczi0<%N5okXP80eg>ohhjgIyzgG@pA=z`8o>%&(fL$+Hp}tV5SH(~)m_N1# z8(&8fD!C9(HSj#S#uprJi5_fRZ#J^Cu8zaPeuc4%7>ot1ECXqW5)3t*mF!gGoaG!{ zle9CSJFJPnC<6!XMD9%r&yV?5C?2!q_KNQtz2ly_+VCH|i`Ag>_o3eBY zk{=nhWo!9CeEHet;qqN-2kUwSUgl!Ycs-PULt?F-9ndB6Jy?_4wUo4n?!J+=Z{+5m ze0rco70)u{*ZMF`Z;#5{nXB`;#mdrI>cK1xO#Rn%;+`Xl+JNwc26Hv9bIA_xXVLWe zYVa)yKpF5mV(?c5;wHbKI^y*5jyE;eMmF(Bxaw&53MC$CWlD7ie10TtT>(>Qr6B$) zNRIi*T68)pZDwB}7WN!+NQ-O_g>^Y_WZxr%E7^lCZgu39NXT~EhIPDo>r@Q z#yXt3))n`L8H6Qrb?8&f7v!JS*6k4kP9k$V+Uh$P!cz0b`*mjCxs4m(+tA4Z> z8E4N=^mQVmxyaKgQz>Y{_*aBoW6@p@#B-o{GeWxKo^YeumzYg8@anYE&0NMl8Q4$7 zRR%xDBcsVcF{xBPzMEhV^Bl)A{C9-?hZ)9HBRy(I=)_qbmwL5=SX~TZBITyQQ5a}u zbTEWE;?H60Vi2Q0QT7Nfq{|%r%O~UB<2katCmz4S$NWFL^yqCJH;$Y}t}n{Z2mr()T3UV&A#5M>+O*-$jG>DAl&dC$xDUdp_q2yL^k$#e)m$KM zztCI!=@awaBfEDTUkI;fz2WLl<01UN^r=6)wfG(kL5mU`!dKLqunL{12UZ-|!aalF zDX@$DiM32ndYhEeJw8iw-?<99Wtn(`HoI8XcXwUk#?)c+H!liE>IfOB3ynroeP|?x zA>q!jy%jvkoo3TI8k@tM**OieEX(VE7E9SZ=~$?$^Gxd9gOtfNM6ZNZCy@z5hU*xT?ioLSQYBrZ~x~7%uX5>;G6w%hEQQJJ!b$%ZYx_ z0SsL+Z}B`RdLC!Uc1-!Ud#=;jB>lO-*QOTn;2MCo0>x3YDvq}iSKHt{gk0}ap%qWF zYo1h3Ss!WGNOa&uV=w9=9_FSm4EXX$CgwY(p;5buXq(Oi7n4R_mCS#=aR!spb+Umg4iz>;N9jv*QX?K5h zv!10l*6NT|cnQ}ha%Am0wil$9#xWUF6zK}10xsKlR$fi9d2v02k1$N8K|c59iB!p)U1DZHf)|-+EMzS zS6TzZE>i`kG>6Bb))%Gj>Pddj!Xd2Ho@~z~#47DCT_oG(m~pC_n{8uY|8D1SA&c=Y zSLkJK`pEM%Z9XX1r&gHU*`Kp9AGWfpJ(Dt#tSic3nmr3WH6Os2x_aLjWlOJV)|of0%Pq z(&{2(4={CS7A-J{#w(-7tlAuD5#r{nMO&53BY2kd!jbYKe%-l^d<6(VB)!c3adx?% zDcKHDIh$QOa)Afutwjk_Gdp@lJeiUU1>mu#^WmZ!tGZp9Lw_~H?hxuf3&(*r=-WNZ zSL3+P%m?^`l#iR!qUlTuT{Tq~#Zm6q7_X0{Qf{!zS14v|0h<)l&`b|k&MHR+f>w4Y zQ3JZ|VsW@sy|tV3UM%5ci>5$QaR^OSf+HRr?cxFw3X~m(O(pAO)*R&_wbF9PtlpRgcz1O#q^G^ia=slwApIc9H&#rr z^i1GEJIEaYD2!|D1@wJSc!Mn{q0ZkpzmHSQo?M#)>$s6C@FtfzrB864+1LfDPxP;J zSAyLQq0l!9&IvjEwT;lYa|yi%=-B-)t!c1VC!Z9{H;%NP6MaA3KOuDeuRQ~;4{)!v z-vq=TD&MrdBeDI!H%Ga8&#|xOK8d=AxfU|!g<6L)AuE1X!2ST$Or%p^7S&Lsd{<_% z6pA^Ji#o@)mRIo`JT5Ll8{V8;4X+glVu70)&vSZ zC4+XsXL)k$adC3k!k{ImXo_JM$c$CEWw{_5JIroe6BpiiHnTVd)Ad)L3()`yL-o;| zLQTc8vqXsZxPO&@vIDC^HceqfV{ZR7GRwTI2e3(_P^#uBfwtt2v zJE^ZEj+yPA?}GOyUD~GaqLA555T0ig+`OgNkg><=Ir^79o*A(P`=DAHGxJ4;2SD0KE4&oEy9nC4@^~S)^r!^P{W)0d8Ex@iqIJ@txtO z-(IJzUgsqmMs{Uq~?1Uuf8_KocBxyaB$JUu}Ebfot{)pbD3r8t>r_z=ebMnIb za4xwBud#gj{hUE^wq(l@I&=FlN%@dR_zK9BU#`0_QZe$OuX3q~WY4;*iybd|_0J8O z@lgQ150|#*yxUbigSm7UC-!(g;*lfH8jQ3)J$-OLKNt{+@5XM~^aFZ!q$?O@MPnon zn0cNMEJG4&F|$mN^7_%jUsd-w(m)TYn|y|Z2-Td^u1|l(Dys~mb4K4??P)SJg8Nr0!7N!yIGJV5lB9@riMt{^;sDSxToOvfB0I zkyEd$fTZ4}4OtQValBz$pUlcn#R?U1q-BJhBH6-9OXE#~C`$4$c~B}4&6WO53NQte zOL`kcA#*Yo+5@pbITCF1z-i|a;8ZrH4ryPUug3Ec00k&Q z1n-HButLtgdEXi^H79^;LUm4fT8TJG(sgnVuSB6F50kF*NE!MdC@#y5O#{7h5e`?c zWT_Y62GYSl5??i2vZC~-6sGcw{%5*-z8a;iVWyARw!uFbXXI3JlBeGt6KG}h>$G`5 zn`2uNJGFspSsHu3s-Q%&l#j{*rGZd9FW_M(j~2G(z;?dsYxS6L6EtD*W#;b8^ zjDarmpdYXPi^gP=ILPI>g%?X_a{-v|85shuW$8^S(*;)+tlo0d#bk5;YAwz{oKd?g zj_2i;yxxl|3SU%sPAY=8)L3qfn$gp@7-K4qx@5CQ)hboIvN?0{lm&bQtB+ITp1R93 zUcH+`_~fU{4R5*PTf;@&Um?TOr2jXIz1Pp_)Z-~e{ zP~KZ|*a(?9cY*JWlYG-c@PR6?i-p2|zfzscpR9Kyu#luwB5;a%3Dv=q4RYSeSq{=y z+NR+sI7i}qS*c6E>LlHA48zG2u_OAx+R`goK8|K(1o`gZ_cB#Zj3fSKP%I~f36?`e z|86P&oCd5xMHj=g7C^{H^gLIin?bSjFe5zIzRd~!)d#P+`KQ&qk2--0@ff%r^48k6 zXC*x!jDTD`8KH!F-1gO25p=Q3LN+CZ5xGn9gHl2v+x7jf(0@LlhCBKVrdzAdBePme z|72##T@BvQ%3RZHK74yZeH2J1ce+A-+_Q{*lR*hz=#Ca*lYOgKf1-W9Rd27ewf6DT zbFK~i^BrYdDQ#(fTR z$Sd~`&Q!6c@7_~+6p58;_NFphg;@%9=(0Y9KAI>Vi1h!M;iKIVH@m9dYo9RaIpYGU znj)rPvrBw==e1^sOu0_WEj-DcoyDHRe<2N7jTapmV1k>Qmr^&!+%J1jDq@x8Zh&KS zryZ9~!jEXlVlAmSMR#P_sOlELJ{fyRYR~#OQ^hK@-Z?!v=T!IfN6zWgT<=0HoAl^x zkGocMx@C4`zLa^smY(Z;7j8`CmRWzwJz0OJcF3VrTuJPVFP7Kx&X4ag#JSGfMt;mY z7124*Jqj>`oQ<2A{lFK=QZ>s>oxH@YbwPKN@9U1~I_k6ejD_{g^D}eOJ5wqpEm15T z`YiJ%yZhb8jQyR2bFaXrt?TQ|j-4{sxeU+8%D~V#tQl7K0obmghzO;x;25JEZx1w;y+< zTy-?@gZ6i#=6f2IOvJk^nKpo3!kyx48KKhRGH@x-s3KJF9XCXsM{sbt(2kwUyut&z zpgB@wnYTmSSyB2bUuyXPy#0AWZ7GprksWm8o5csmawscHY2LWwIRv(-MkamIQoCxp zu!=YIRBIe;mibK#Jmlym9S2ZU-*k9^*EE-Z6Zlh{O7+bKv%=aabn(k|+Z(#`seaPN zd!Nzg84T>B{Kt#np;Yjgs^}T6e48|M%>mmbw{eJ%32Vx?Ur#Xgg7NgexAXiSX6*7> z>a5|LR)By``9t8*RN(Ps*EUCt^PX^jJJqcGouFE^R#CWH^kV74DcK{?M&6dN=L=$g z)Afw^33a>nUy14RtkMq2*3D@`*tR1@0G}yRmg=H~PonSsp}F_ir4sWyeKgx!X)qJ^ znRn!lOO{#X1CAgs>%(7wVa~IM;vAfZXq=7tx421?;?bF6ADQ-Zwk4^r6pzXm#q_A4 z772(kIfA5{1V5|&w_Wa$?m@oBUjIJ8cgXnj$)khNSTjpIOO-Zh(4MGCLECS`69kd%So<``y|15=rF8@9!KW0 ztsSq$fX_wcdvo~<=&iYpxCk3FwQJ++VRuk#Ucf3+YK}$c%gb8j?@rCB%AOY%Im!>t z&9TZ~ip4;&%0+?dU*5r-QFiCxC}niJB{7PB0G&JX&0^wZOfg7l7^opJIglB;n*NOy zSHj?J8$A|qMRg@%kP4$AId?Hb4H@#V`!F8Y{nOOhDueuE6gBpZXdqL zd@q_NRnL}wUoQXn7vSB7#w6J;m}4tIkpIn_HJjv-vtMB>^s~U^Y`2v>bSz7Ix6kKN zWriGQjvyZ;FG-B{S(-hS`-%pjn7^qN`JuxcPe4u}d46HTlt6O#?H>0X?(4l1n|W&Y zQYYf(H8OOva34O>mYW&92%Z=+7{6!$@ogaKrwr~ z0k!ml(J!}jSOoxDltRAEGlYd|3x(l5uFJpHAI$P5o-L)~a&MCcXqK@yh%s~42JLt$ zaCD-$ifk8dElzqyEemh@y+nrb6wwq<_G1Y3)#@)zqRVziBRFL!h(1I)0RA;=XUL#s ztvE$AgtlfFnO8OB?lzMyN{y1p$UOlp{HI*J{4dX4T&h~pM zeuYvxF+9PJ_WJoMhhh0iTQsE+^WnsceDE;fIx&+;mN(1(o@1Mgj8VGf72J1Ex@Hbg zW{K^Bg0pUFZJY=*#ogt8EM)ZbBlbLaK^K1p*a%`KiI8@6M&yp1Hh8wqj4;&!j+wy?<;8$Aq)3#>MxF$qGI_S;rnkJVx%+NGp% zi<)r9iRNo1O!ONQi8Fa4*}=0iJ~#;8vi-5yGun>tC zI~I~PbW`np2x=vH`u-%-4HF3{b3Y#lz!AStr1hgmbdsSnxI3i4UDcw$&_-bM?L$PNlM8qxdQj?u+9K z!1^T}Lr*ZkiDo5>!}Iy=*|n$pg=4SQ*QXO~mq4pp5O_4;ksWtPBWrgt5nv1;3N&7T z6&!@)8@;mN%uY2ds_df~&jOLqhl6zVlXNJ3JMC5&%&tRZ9_@LdsJ zcM88$Aa=6-WPF`rcZAw-Hy%GIfvQ0)6nxD%{D089)qnn>-oXlaQ?BzcC-K(T`qrJy zg)8su>42_`$}bw8ru-7C!m3b^Lyjo4XHH7rAHDiz*GmZH9@j#~=QeyLbCQrUs$xl` zNlGa&xb~=7pfDUxjmjj;4LhvRqy^XC^loTh8ZC&u>^WcH#S^i7>hyjS)GvMr-%~l` zCbh<{CH^iSDnzf<4?+VFTBc3>kzsqnI#%DWGN@=sslz@I4u=F*Zq*$h2bsoIm{J&2 zyrKvx)~=}8@IfRe9J z%*dxMc#^oI&QjvrQn4kAg9ra4n|=wJ@Sn41BzP{vQ5Rg6zGacsoY`Nh=E&GE-9(FJ zxQ?z%i*pUcFs55alQ6LfTT+dGQ}`Gn7n!K{P)^3owK{?y4->F)F9VGei=4$o9Ow@b`rv@b(IVV(ldc$X=83r-NZD zRo66=VdN?t)-oEbj0v;YqPq+>l_BuGm{S&IhgK1L`gJ%#(atbJZVhmV^r<#Ttb{tlY)QOArJ$#Cr2oo5 zot$P7CR-6zDG2T(Zqsq0uejl+2$5&)%|#rwk*~8mJHFj?=+C|_O)Fqw^N5gU`2B9mjK?){XDq?@1s3n@uVelQ&;Bl}T^2roe$9{%p zVxptib%%(Y6yk-yt4KUNMJar_{wT8NSfyyl_IG0#JHqsgqEyq8@HDgOrr0O)-xD(8 zUM(=kB{*ZhFZzFo|CS1`D_!XpL4;aWgAFpi4~)Y89KUzwN2Ldxyh#&bPELZ9N{LKi zm?-A#s_hXzn%JahC{~KkXqUMAXJnw$O#%7LS_^5N-GmE@`;^QvLzL%rq<9YTeG809h zqqodiL9h}IX=WYUo95)bvF>M=3=O3ix#4cEoy)j|})nnhN z?y^?U7CwUpVl3xbLwb`M* z78r2;LTdcp9RGoTs};M|-AKbP$PGu&w(u{2nXlQx%pjzG_x)4N zjh8gpd=^2I)VRW@@H5$Wqn-*|z2gCf^=$`99t0XRo(-jWL9H~FAVf5RjqutkTF?@E zxC^qz**UG6V3$S@%W>7GNGLH*A7ILZdBTHf-GxiZgK19CWRIDt#R-F(J?-d}QSX6^ zlT8h(L2k+9q~YbXVRF`_fV$}D6l2E;fSq$yRdxWk6uRLRZHIK(vB-;a&3K~A6+$Gt ziSzY;XcM{ta*W4cOCsAZH~7D^B>u(>EBzY5HZ_z|PDb$3yjfFnjZh|o?R zEu!2>l5{Xp1s_GFe4OLrIcM_jkh{6m{ptF|=`&uVXfk9Df3YJ8hm9(>13e%mRWyre zA(N3Vjtk4Gq-hH=M`EH-N0-^-G+90u1!PNhl;UVjPFJ$&A1Wn1mZ1jc@1tz1c{HVR zfgj_?$8hs$JFJ!35stSx>q9x!wKGnGW4-t9#_`Z08A~-mwdFwJAhQNFvdBjQ9EqXB zgUTug`x|dOt7|G>acOEd&D% zcO&-7YuJVDp?J=9O9q6_z0>D!1uSHjZt0vpNP``K6sm0D<^bchy1IabUYWlebBtx^ zy}T&YiCqpPE<{Ho)fbtF=Z9|^ZWfFE>VRop7LF~do%d?_Y5CXI0GfKU9Uk1;ggumQ zK~YyNwO93XZ+`{<4TBSk8JBcJ)3ba^xy%lOUpfNP4x|?Mv76#^RmR+8`hu&h`oDd2 zWAJHUtaKo=V{x-f0fD|K4Xt@HlykM0fVB!nU zjFuslywLlEvr`7x99u(wj_IRBqUd1{tJCQTD;?3CK?F~v2VYZn)55bP&^0twa01aQ zR_=fvC}L6_dIvs{WJZ__BPN&d*sEQZ9Cq27hVF=@4=AEulPFo2pQ=Whz(}u9HW(PQ z`JqVDog>z3;}4pC&E^vdhHl|MStNm|IdP?Ei&{$b3BHAz(igF7;JxVxqujX_sWK7M zIVqwfHY=HIPJmR9Wu)-0@OUcyJ4_nQrTpGuu{h$)ZyEgAD*dFo{RM>8OLy7cS>mnp zcHRznXWm_%qetaD^=g$_-No6a8HBz4lWoxpmLA9!%cvF0&z2E)(yje|vCcTTr(5PV zoa}yPQg-U7^DNtM|66#~f6AI9J`N}E-(N@nuP!F}ziDD2D_cin2NfrCtN-#&1}j@D z{VHM~8&*4^21F3x%IYOllAtkFjcQDO0+e7-|%?Jv917Tc7*| z46duyZ{kv=k1Z(!L_`Y{huQX%oQEvOT+f;BubZ3S_}!sdd*R#ep(FO1T?_25F;e>A zGhh=t8JblR6QnSGSwgZqAwYWeOYXD)w(4&tgF--G5Y@$zUxv72eb6FsobqyV5=9L8`Y~keAVO50w7R zC>cv6b1JG_{s-ls9bXGAlrGN88XA9HC-hZGSi6#)lZ&t9^LkMW1RiYU zq3n1-T73^aRt6TL)r?J;_nF(jClzEkjfEppc0-xpSM$ znzL)pBXY3_0qt9Wu&#eaM>)4SVU!JPo%ZDY!J^x_3Hv-dQ7a|EPq}ADM z4^7sV@d5h^O-A9l=A644P>Qf@I)2I}jEix$powmaVBI(5JOg!lbkYQnJcP!s9f(;1 zmOo^?f>Jy!dy_AP&({-b<8Pf*ChjkIOgGdrpZkVX&+`a=xvOXomdH%j5?{no52lnJ z%GAleuxi;QfaAEaz!9P^E5l5)ojZk6B(4h=tveE+Y;9(~o;-F(E?9@Z##&6T0V<&HeBFIEG zl?r|q1J0QUdA0pb?TP@!?*3x%mhL~Gs0Y!Ny%uoiA|2{N?oB$J^MmWgGwG__HN*Gd z4zLNnnxM}fXzFJL+lJoatbb{v>?qxNgCq}jxG$HbOJqP8t|`NxZCGhpHx)%s=|$Qc zDW>X+S*o$^;^x}WpS9gLp|>ZET^saaN*;mOjWlW8XKLJ! z)Fn@sJkWSpdJ(Gfm@sBy?QZ)=;oR7DawIS%h8V-ng(1>&f{3Z~kS`^77!$V+MI(Gz zG^8jK&j>7LNS9*3L>Ggz(CBv6k2pH*Bl-#vxvM7TzLU=B4MOT%#Z?4^YCgC-w()gG zEB>Pj7P$*cmri$*VZTAB;8E-7s+p1dTOoPmOqivvQkS;}{JH6d(N47&21i|}i-QM^ zwIV-xzNBY5LWtl%bx9LqYzr|K1vNN=nwX_VUyDqVMbe(*>86v9@jb51(Sh6HChI0IHPniWi+LwxuMrJOg~#peB$Ma7W=07 zFfKAXDQl9aZ%hLEonos#i7>p zc^E}_q6DP0BqPhrW=H8Wv{o%$vduUcWUvzSbZJIwu9JrNU?O{WZ=g`9&!a;(NDG6O zr!r{KWNwx!AXXcJXZZ@@Q?YM~=@Wy7oTWwR2J&35g|^x3!JLds?+BSeN?V)gp`1Ep zLQRxBzFN%KlI=WBKx9gcQSEra{0Z2*bV~&dUI&9|leo94w|C!sj_DJq$?}QXTUh4m z7{*j>k|fCuV>`&=RK;e<{HcQs!a7fd`Hk=TsSv`aFF%-T{EUY2eXjM*22$EXsm=0< z^D|ec&0HnY8sfX}f%3C(OZY8gV&(=xXXb{%rTiHhT@O6X+!cURB{}?W5m_&^gghda z!!swKBlv`-O6ur>@o(i!nIm@U%e%@TmmLw)(;5zrw3&9;%_0(ZhmrbDA*GKD1i8RQ zS(5!xL{~|fqnpgzU5FW>!WELU}68Qm2zPM>7$K={pE-BMFl} zSu)gVMnj_^WczstN_fuIO|GpY2g8u$H1e3WEI z6hfm?D`}h9tL=F0{h#8T!`+dwlbtgolTyp?=Y|uSjvR)XI;Y7uk`is_ShRHW%{*ns zSk6;6w^hx?i{{scC2O=QiR*g^o!38b4Joh6!{whM^$~b0CxwW-XW*Yx&k{;?xmVAQ ztOiBuRgbDQX*! zaKH5oEBC!fSJ&v;Tp)@c_D-PXGYh`$$>BCL>5kA_Qt3o7YOfk&*Ej7jXjAb}vb6Pe zUpU!&8P@PQA|_7Y{XTEiSD9gT6CM71lkNZjXMBReN8$Fbf5@Za1agMV$!0mAA9;r& zTw{re2xAG6>?p_NTVOBdgy9N1BOPJR+cCmHvG>B*Fi^6OxX%NAgKCFSGV5_(<%(pU zES^7@+hSd53#o56sX&)G@}oejpJ3uQMsHmWCTFeoy+p8!1m_pz+ETTVgafR$pz=bffZFzdpyZ1V}5s}y%&~(eQ=&#!ZS>fR@(F!*5+X1}0Uzj-6wul2OJ@wUW=Gg8Rz&&u75AW-qKC+ z{wKhnXTA{p{RO;${O86Ycvp5RVk6cf-srq5VyXx#R?mGYJIe>X@jYw#{Mh8p zVBzIg{2G`8*wpmLjG|@zkz5SfwrEcl08+pmLTU)Yw*EmQp9=X+(3Qi^??YH_RQNJS zu={G`G_fpJ3Oci!!HQNmS{&`tA@ysT1du+~6{r*4Z!`P@b|tm5&4rD^6K-?1+lugyrzHT2AbB z^G)}X>@5Ch=-I9}JH*HMwb)wg2qd-62+j>L!k3db)B2YVS9YiN)bi(wTkiD!OXoBD zhwZVCy%dTUong*)r;U4j6D8S~jkC4p2#XiVam# ze{)R)Mm&krP&$_a#TD0Yli=6Zpkn-RV4mX@!oYPt&oOwdE(=_4?%_=3-8&e)Q$N8T zVmv%{oLUxz^ma#Z??UE&p{F&Abl>_(KXYD5>j_Qc{XMqsp^NVj^A9ab__3#9OuAbx zntJs^Fka&ee+FkX;>#?oiaYG#xlkHffjgJK(yrsn*{&1jY|t(BDS$Ud4pkQBKYt2*|NO!GZ|dM*9sOVE{QuI=)!zSu9(3FO(!*xU=q^E;7){+* z7fS8tm*>Y14p1QB7bH@L8e)Vf+Q^U?rjE9ypy^sY*PG!}o4>C?SyQ<0L1~k>FG|@XH!P!URay`mky+jr9HCj>79Fv< zs2;T=Am^%Rp9&}Ww$1C+F*ctYWVp7uyszsp#wr$(CZQHhO+qP}nc21m=++0-sFSlwQy83mdYj*GY z*4kZLU|DYfJU0Z)UKJnhaeM=>3J=9`d?R_QZ%mkesz-D0`j~y&Q+~pIb4m|JbbbN8 zub=vqeEjOZf+KPj?h9jjhkQk4c}q)E7hh;!X%}B8-&B;kD{of3>f?HHM}4P#1&3|Q zK0*6_V)=H84_=ku0!Mc5`MEy{k!;>ya$j?Q|F(|)9G=|0J%)(?WJ?VpQO4vMQX(ysrOOW0DNW@WmZpx0H|0>B z*(Ubc>)3UXnz{{J)utaJk-80OGh6s&PrXD^)Tr+xEF0oK{(cI_s3(t-MvU-&TQvZ~ z2rhe$L@awFR%$FSfIpk}778FqEe$g^Y*S(S+(()(4nsCR`Ua{;STAgQL{yd-qRgT< zWUA|g;2WYmb8S$q%J;R9qch}c%05KeE!Vf}z`haig4l zfu!}8wd|X!<{jogTRO?1>p=T2_Y6g=;=!BQ!Ql@In&Oj)t^MWwGuc}-=L ziAs47+jPFZ$&dt$lp0%gRh?#Qb*sTc=LuESrKMW6LBA!2v9g=XsHb2K529xN8!Qtz zGqsE05*Btf`kuazgOHERP^3!?OOz$16=tQ?DvR>UntosBlAu{IX{?u52X&#;akCIMTd*#B$dUIi=1IXf5ePgYyj?&CyN^tNWK9fH|+r^^5 zHo}t_Z^ldv^TYUD3Jm~_msPT&oSBxG2!1!3!e@5X6`Jj~8Y(tMGlMQsmzAhUd(c~H zEVMeROXPd%H`o@*_f%Nonyt8yy%lwuzuL7JHeS$0`IUI{SEH`$19LdSQjwMz8LCwp zon-D0Z%_^ymK7<4^><6Epu*6S-)*bvnmS8uqohKJfX=Xn#Ap$f7V>x%78s~B)=`(9 zT2Bd?X9)-O*m@2qHQK7G8q$ww-BBtKy%HDZP$3$a0$662Ja1iiM(Bnh+|<|5O(GtI zq5_6(%-B$_tRYZ$RWTK>;+iI+?Tw{nq{x?iS0oyi92#H+yvtirF2;Fl0js<6*yfPJ zP#1=Kbd~1E&RP4pWA&?J_41;!swy5?i#%<#h-Z9d zO{BqKPtPLpHRZ7@jv#w7qih~GR)xlLp5@SSAaN(T^#RLRYv;zSC55dB{RMj|8#8L` z8;i*7kopT86`t|k&|Tcb%{PIdBVaxF3uuwH_0o6i#1s}&8#AdlX<@sp*p?iggI4+p zBC-r#B-OikICACT8T>k+1yM~wo`hOip;hoM5v11xV<)d6{Z6c$D8d^9#t3`oYOT7B zVd?>9muJzegy)2ccys{pIv47Mw^#rxfOyGMVNN0*CyZ!X96;AYN>E7`H7E=donof# z`K<;5Y#oHnd0f)E)fH?@J(Nh%a$8nP9xS5r97DF@n1j<=b0~!Rg<_T-n(d@?(vA|O z9c+_Um~z_fjn$@v0P>u0Sxz3)yIeKSb~c9mTm$wmXe2rB*kTc+Bt{^bx_9SnWl}7R z24i)Xpg(055X?Q~TSj#QY z1!-bLH|OuSaO%2svY@rm1BvvhN$~GBgWK6c4Pz%XG%pzyw2iw_ebkp3>=+9t+T{(v zQ=@{~-T(9?=0bh1BHg)hU?%>!m z6u7IkWpTwr^)KGqGcPZRG$PI*Ft;Jx+OymkU;+)e8&f~pY5`h$A(D4?8D^f3X-gsT z(T_KUCmc6`PvVUUSWU^fVrg|A)f!F4Pe~z)IGI@;`u;U=tx{h_iHiTOJnoKKgI+1> z8;2&TkuwGps@6ZR>eSRy07}Oq)MF@HKZ10nB(K#s^U5EBK~HF>aStA@;emIsm`+V5 z1_Rk>7_i9zPeZ0O9>s>)Wd{xt%+{?q1cOr8?(r~E?JFFBidvBQI5Gtyk5VlFPjpdT zzeatnjVjXVG4DLm5lx#4hcKuilWeYO9l_s*W(`MuV(9gzh7yrCUJkcexG&YMCfzIv z(=_3yi*h}<&UXdsG?&N1d>yrax>%+e6YgtlA`(8eb)I0jA?#=wE?Eh!r0<;%*`mj1 zCyIuIaLLqxnyIzD6D{*L6T-zm5H4)UEvbQ+jRa%kRJRhuaBE%vOm1)9i??3C9{ zfQ25RR+5vK#HNK5*)*ye%%RaySfa10==&pV>tgef)-*=y!hv4a*7n&FW^%wz`!tct@J zq_ez(^g-$+>E`G?=E8)rX?UJRD3QwPX#b-CQ?8Q51D#Z-tEzwgCoEc zxur81>zk6e86~-G9K-f+3k3NH0cSXdZZ_Uerxy|I(I^oxfM#}ab|$19-x7!cl!he+ zb~0nr<;uiK-uzU1bJC>x<5BQbAZ%e~niso}hPDfdQftN+LjjF~A8^;`DE#6k97N8@ zI9X;wc2-mdG}y*DP@Y6L%$=ioL*``5i;d)nwql!DU|5dW&h;C(4I`-nS2PE!@^)Tv z9Zs1Bsz-m0ii8i6mIIXJ`BCetROXdwz4uy(530||w>IL5qVIbAXLX4Q8Y5MyS)y~xSW_HjJ^z{3#h z9(;Cu6MQ?0S}w3($13T0)52O3tm zGtrD$*^;z9(3zXNY~YZCfU`JCR<8Y0|H#r z9?mF52hy#=CsNmj*;->Yi$esRFZt_v4<@^X5n0^jVOkyT$=ZdD73FPy`nUtD1}!uo z@NwH=(}plGhe8^i+9&5)qw0g?#@Vrlht74Wq3uE2m64-sK^<;_7mGs)9d44`)e)vc zjlcAr?y)-K`ojrq_w%yR)d?Ska#c`clOi_lJSJ5@%>cK-bg{fwOTZOwKR3T|#DcO?pR*`BDFd zPhqKt|L|%cyIEW}Lhnmx`s;HA1sGbkX_J{1Qd$GeJAr76&&qF{^It!g7kYk7}?GccLU1 zL`W|Or3u#%7(>O-xGBkW7eebpvb#KdJ%sCYm-zsWrr{Go^F#Do9oZ88%DRS; z`3m9RTNvr`hQ^p8&zU=Ha(VH3$esP3zU_y%iZ^A5zJk~?$5h*jfbeRr!aAzYwXf$` z-o=e>mMn3Z+6ls^`PHdpk^W9p@EyQ75Hq8?VCR#V{c;olH;{^Ntel z4m2|XS~MXxMJuLn<;x+&Hw5Kd16c80%CaS${V2aHnryhUzJ`H^jYZ}Ma%pxB@MAVC z*oGwpqA4qm%m7i|I^M`kr^J$|3wjXt_Yvdymno#DL+>J~QeCf@D{{T?7?cv(fv>J)DTD0K_d=#(5VRO*U!$sUu+ zuMl(AoJnLphin=${>c!_~SqG zB(2V}{dxA~JnbBdO$_8h4f<+qm!b+NakE5`rA=PzJ)MUnr($qD=~j}NwZ%ur!wct< z!u7oCCb(w6T!K3c#BD6-qI=QCS_E_pX#p9^k|P)19GyVBq1E@SBuZ+H=D|iWGr|{a zfz31M(KgqYHg*ZCtpw7yvXND7OQ#y73;Mn~6Qs~g6q^IDqqv7`{RP0~pV}KeOWX3o z6N|BjYy*iz5%FAc#PN3H;fYn}oL<4pNn+uot8A>xcsgpnzf<0+-X#NOZ;8u3)EswD zo&gi7{W860QaSF?ftjJNVWe#B=A|`NF+@Tm1 z#N9(N#z+RxNw)@SbvJ}QL~?ur|5AtmGsmSi*%}?On3s5pp{7@8DCv&`n@anvG@h^; zmbC{o?&a4|kO1?o&>MI0&q9iI1sWK2#C14}rJbQ0%i3QyFp+i;W?co+W?Uakg3Dl3 zPzey0m6sNEnMHZ&2OVHQS|JChER)F-!;n3#32b7^_()=*fmxw}cG;Um&UGJ~Pqt(E z-v;PN9byFCDq%>CuwU}p(mX0y5Fd@UAFGIGt;iIAT%H_vIGb>b3Qq#JW(_o7*1Apu zb_vZK2!m0?vSWI*;th`gLnJKdcGV^?>LZy8aheOZIETcTK+v>!7|EMfo^s{n46t5J z3Ue$~pNDnhXJpNQvj%4g^)Qs>fXRWU9yoJ^(ZdWVl*5YUSoG5udpzzFJL8s@|^*1^`n9+ae`;EBs6CN3`k3S(B{~koLxcImLfyH zTwUWGgD3AZB$X}BDSsFsXOg#X8vi4$ySgl)7IVL2Yu&w79UqP|=&a z9ws}ZbJq-ufnp$AkEp6cSn}=|I!uK!89rKwppC>jgN%e|3reVMaash$$-2)}G5Crx zhsa>Y1`*Yae06&feY~USL$TzW|Qqa2c zqw*G$BCN7Ne_Hd``ELmF6Y``8io!2gcHJmMTvc9KrX4&bR*r@|m<=PB$wo~0I4+2mA$m+S*1zZ- zrh!lQ{1cd{EAHupatYdnNbrQ$wf(FrX?aW)U*suLR#(N(N(9;Tv1S#u5%g#a^E$o_ zf*PC9Id(NGYdF%*ee4Y0`g&>(uCb+EO}gwA{X;rDbD%zrAYBximdxpPA^W8#XZ|mz z2M6|(!ciauBJsdkwEfOJ^X_6*;mB}PkOxy#r!LgkIan4>OG7uZW5-z6vj92Fbt@^B zp~9insIrthLwtIK`RTfCt^LcDP-Yh?Zkd4XeVx(wI!mdu|3qBPA|`%9wwPDU3sgLj z9+ZV-;n-Gp!Cq_)BQ&kVJwsqC%wrPa&l)QfM@i-uC{g&d6Bjh!~5F+bgKr0dei98rQXqcT=m1fvfeE zm9?wwqJ6V3za15mpSGdJauJCl5}y=*SN1m(p&7#`B4D$<;yZZyV`{DHy2x1D!6{q%sl<^I+$~%(2vT|q!~u2MSz|8;|*x1f)t5(Elxw@WPlP0du4y}m5_}41(h9v+!qRGlM^mT?x-EPAP&JW^|H`h_~dI`IEGESyAR}?I7d#tgGH_7nZ zWmgwF3}h&cUT&3pE9xV9NL@3Oesz*$A%d*Q(t{`G_djzD>UjoLbHg7F*Kh7P%++&^ zJ$W(D9I>xt>>qO`Pxl@1Gj9DV88=YaH!Bg}_ZY|xA*|jk>UzdibfX`LT0N*&WSf^{ z20gQ?bz`1EHND7JQ`XNX>UPa5S@pexs(KO6Dy<)u)p^!cbpw4Z<8VBAgzrbrl4O2z zEL(js_W)?~3OUtvY<@zgpD@)L->voZhc+p5Hg9bU!BOe%4oq&N ze=AnE$$Fw_NL-}zMmdr*C`!h1ItkXlzv(g}{=3KW2~r}sDDUCT`fSieXM>H7)UJ|) zvjdM?^8P3P^7~WbLDd5AYDZJ8^x3tciVir_0oH^-wgHq5MAISm!Z_@alm}eZp?&1R z*oGY2K~x87>>;;7uMS+nhj`{;|J6g_`ZMhdxY8QVv8kJ!HPk!?t<79}BSQ!&X!p}H z0|O?Vv>507(>gXmhm z=38414GSJZ8hn^o^~oPhVin~^CBkiuIYlIgxt}Aj`iY--99< zPKkF1BDeL&BiKE2h{h8Fy>2^zOMg=t*H0^wVR8jofVqY@HZO-A?X^&|L|hPeSx{cRiCRa6fN2z_5+pPrH?)ua`~uG!^3=v#40*eR^Acu1R!)+c)9HFFADdi)ID zCP=~&B;kl*w#?qW11fB|VYcW_D>E^-oe%8JL(11j7=mnjZQvX;tm_W!khpmU$FBqF)sn3PjU!w8s6xR zxE4aX)3!-dAUr#^3$+1-UL)Rr@tq;{W0{AT#c^EHqWpGyh@V0LUU{za6wGfv41qBOTIAg0I%WJ{5Q(Pf3$+O^6k zW~5>=(ztoSb*&A1@yyVD=|~T9060ao0hb&{T!OoxBM7#VG2aDS*XTk5Gf3I0%W$TCs(DF9E8Sn# zW7buEL`b}-Zf@QMlQowfz-f(&hMBTgoc+T4<4kjXr~Jx`{-Xmf;nisP$v-9of)(co zGm8~E%zGL0%}hL-GR7X@bmq7H^TV#pP+sSbT?0~dD(PKrdQVMlU5@RasUca=2!*-> zb@8|Bjdz@U^pu3g=>zVkkzF9&Ah=5b(`){1-l=KKfYl37fftD7nnPmW8M_l3a@`2L zte+iy78G7HpSY}{2Ye2RG%_A)9Vs>NiQhX0s(kdt2c`tmOVLQqCt?BANKPx;Ct!!d zv|6mx@+ccYiOeu`o6+rUhQ7z}?Z_UHY&M+YP=-cXW>5ZyIf8%(7tz8vu*z%#k${=^&|3*kSwiQ9lG zh1V4(kSABw+a`;#1h`C0@v_$LcrMod(CS1>McD(%{T{MQFvPkojD4%`cIQ#i!fgxz zAFcie5LD{dkN!d+ZGuN2g;xZ?8{l!BNA5pY0x%gL&LBVe(gZYKjR!+eyX$GCx!jbe zemV1J#R+^-z9&q-dek@b1*Q0?3aw^?eJwiL`!nA`Cf@?C+I^HE4{qZ$cMfydY^Eno zdq=Q!h{pcl64lp~h#1$jP;1;(*i0KJ#Y-tTgO3fuV$Ct>e?A%0?v9|F&e$W__VS1Hh_+mz-JOS&?OT*uy8jUA_FTI5~$xER{I z8@th+vsGE79P58lu4t*2%8U2$kB7GfZk;vqY?Y|;C0Fd1c z1$jH-j*}L`8$IY~FawYsNYb+jwO6 zGZh=0d{ZGiL+84a@J8b`blta}Y`_U3x#tQ#Ge0Fk-t392DHNG};#Q5ZK;?X~CfqqH zoGBKWz`1}FDUr{nt`~8xM)0vxp2Sj~)Y5A3SZ(k)ZGisC^BL3vfHedy22rc(X<;aaID$yqB-*zDX(r(wzp-egoU`KN1-XR+MDz?^L)Y?GV3ZfU4x;%spw$df3ly~FENGO@-`Y0;#sh!DltS2NjL@}|qPMw` zryk*l5CQ=c_RLZK4TaU(LbdR{mTSyX^4FlmI2K*|)Mc=&XxQyQ9_=SHac&_iY9}K4 zo9+K=hnk3)M9r6Q@>*JaMT>>&$EcH$So^A!|F=xo<42yHPkiF?LRQrczluvo&9v0+T8HN4hGW#AjnXK-UZLdIL@dC>f+ zh$|{>I@nV1d1Bg^lxl_#$Wdau2#H)>)oKC{+bj6*GX(6#kotpFn(a=JGe7F;CzuW%YKaBICTL#R%DDt_ys(Eb-aHR~sxdIMS- zQP_Z+`jDE*;Z#-C=%;m%9rpXk2Uceb)Xrvh&TKf_bM*H7Dt_k_p?ss-^LDIGi*VZy z`15uu&Jma$YGJm|@N;&bWs}0FOfFrb$hM*|-JsiiV=7VAf9>&8kbV2w)ts=L!`jX$ zPxxBO1NI6wHcAAjR@Dfn>Tkm;(e3WuT%=e}njhCQB$(Kz>*dH%+l2zRCl`xfih&cW< zP@*S;8f$yd7jIrK&us(1Yqw{H43+@1OrNovt!R`;0o;ukQT^ZxyqPA>E+i=_cKRs9{3;&ot0FZ7ARijp)QZ7bMeE!Oe3K->1cFHwqsj*;wyrqnI- zEMBUDAZ-!nbKfh7qjQlUzACq&JwcW9@YCR3mw=iJWgYUwbhN zbh{Xhg65P&NZzwW;9})AS(gd9RN>U~6S0gIbzd}y;!e9c1xdA);ox5SX*wKTKw@ESex zpv=ryl{Cg>{x>Ri!T&B6fRS;)p zx{th&>K>TWMDd3{=|vS>>H2dsPeCp}9xqV?d0AG>5#u7NWoGQB;|o@p4e^MUtB@>T z@@2B$@_dts{W#m?fcR!q)R4oPG5hlQsOEV3j-EEb845$stg? zz!%OfGM=XF6(V`6B3Z_^$;2_O&}E}dmI;tX{udZ4GH#$jd0KgQ*Jv_q~nTWPhEHwSF$^exPU^TWFe^L7`#X-_<^1{h8 z9aiGO&2$4`TcHi^R`}nJie4`ssq%GD*IIlE59n+D?fu!O*Z%I<0WWOT!sEx)2V9?q zzz{_QjxhPVXj&BZ* zVoGH?_Ed|bZy#3UCdetXhfO-h3g^iq*lJqoNPW;5)KP+E)To8jmWtzp-D2Z%^|xp$ z>B07=#f1Z+AZ_L8RuT)B6F6F9la_0_PlsYu)P|dnRi#*!R8(Rp+jHxD31lJ&xOmXJ zhl`zyI0T;Li{-XKdma5Y0j{-VlxNg$#{E;89BgxeGA2FP>Do3=OK#>z3Q6MD4%@kV z^Wqi@{W=Gkr)t7uQ&;F_ROy2Thcjs6q#zmRmHd(zOwW zAxWQ!vZ2VS%gCCv7^x|AfQfaZc~APV+NIfgbdA1E#sJ=rS3$m?i!;7Xajj)ISGxh` z+*^1ZkZ~PWbugxJZ$p=G`@)6Z2B)Wy=$4WlQBG6O(Y{#}m;qRV?vF^o!RxKfr}Hn6 zQ^4)3e{sQ{qmu350fQa;t;&EACFL6bpCt3hw`RBgmiG*{y+iYP3<1=<*9MmviGc-{5p`)K2xvaZh8hdp5w>5V1pn5P~}W>nGwEFTExWV z&@mf}FC*`w4n`+4uswJt^9%7Aug+@6IlDcXRlV$y z9kc9F9pPsIi_7TQTnVE@TSm@CkjQt6W zGq#AmURlSe0hh#mjN^=VZb zRkiUj1wa+>L6TE-@hHW*+IWoW{qqE7&D(kk&tLC#A-1kguoVly1C(Dkq#GauU_1)w z7!#la zzH_eH3>}BDp2G-Wx1Q5@nClG&z%RrhV;S&%><@A^Icv0T5s=A+t`}I{bw2U7FLDu< zJg;Ed4+H2)o?z}H9eRy7Y*LEf5cUaFxk_)a%A}gPEtmn*X*e5Y*golr)q2qv8m<_X zr=-b!Hs!tziW8lRiQscRwu+IG3SCxhX#?rXm}=z(b@k;nAxn@>p(#l!vgys>VJB*; zlq7D{gQ_)?Ha|u5Vz;B-zA?^^+P=Z4ACXChivGX+mX;AA%jq;@{khR(4ag~a-i3D@ z9EjP6IO<(-My5;!YdgiK5BIJy^H=t*9?`BfVWXBZ4Y`ZeB-{Q=*>&ox2|NC`9Qch@ zrGC#z2K|L}-#p+ftLCDPZ-NS*IrBNE)-$Y|ch#<&)-%HKQ4(%6WEMEcW$*NA)P6%3 z^lBw2fmKHY?US=Uexk~EFZbcl+IcM)&C z_1#e~^0wdMeq?`wx!b)Q(2q2!r`mo~7ehf|nBUIH=E+lkUsBif2JG449NMknJLA0y z3zNF9f+hHEG0zU1$H6~?_ zsS?GEssH=OzRaQ`UN>ol{skyX6LL{ymP!l!&NF@FP-JURpZty-T6e=DSP3n#>2duu zv5Pe;V6QF1kWn9j96}bxm`ouV6Vp9vVN%`3NaJmY^wWYL-sv?HH>0u_$J`OEDmE*Z zgwC{>-W`t*mvqUVPW~jxW{nko*vWdQVdg0no_>c<^PR4(NN6>JYJOTSpf(Ta;&R2l zTA4ruCr+$_S--=jw0b!%nANgIy>1T7%_TOwUJlgOvWI;SC*G|ZT0d+HX09^YAk`(| zTTdtYcPXtwe(o@!CC`)^*1EY11(ix#6NV*`Rz7RP%B7@sr&@!|rKNUf)`pBFRF@b` z)7T2@OLb=gjy%z|$}{r|TT6~lwQK#)Z-}hU^$E}g39m@>-TE0@wCIKwfvu9j%VMwJRZDR6V@*i=U5GToqM53VnE_u)+kV%RXU8J*?|$zfVf5IBb5$W7Az%b-Ts&>@ zn^2FAKpsPnfF5DzT#+|NGWm4{pjK~sAN6$(5UFSnQw#>2;FPA4-*g0a*12ftt{zlsfXhesJ1I5kIWncGcul*Di=MC9czwzET zHm0zcd>DXBQY)gFP2`~m&N1@8#EcRhK9#*7nIEig%YFQ*AF#*ecZ1~5JmrdeVVKWA z=88YCJC|biu^$Z9YJ4GE%YK7GmuB}&&ra?-|Jc4n{spR3>S=BKxVGz>CjE7pN2c=6 zBkZF#d5q|#E&;cX+@3&tyr9nJf;6`#{DI}IVBZ^^@;Gd8lqo8~(i;Dk>VIX4He~-J zYMK_U9^FBz({oyo@D5h6%DmO|aEI+%Yt-fBKH*B<7>v$5C$Aun{*+4Qnp(o)m2ML> z<;(1m>tWBXjfl$^xIglAa%1;V1~-FLGMqNzwN5^5dKK-?)1(c0ZT;7FoWd5m9*-&ER&?)VAXzS3ga$d|D%!T1kZ^B3V)*ZRlsANfO~j+<(yH z{H2crXB7U}bM(fQ@S+}(`GZW@rCy=~*mLIUhZsOp+(-H?X57~I(!opID6FGh)pC_X zUx-#{yg2k5)%iMal7E4|6s@!z3YB5_L){lY$-y-$k1f-0j{eCm+tXo=vszH5HBj)6 zl|g0!*8#ot*t2!d+9Q}SIM7{X=#i%mP(|AL9{d3Phd9FgC61^T-uZQY$$fED008p; z5J&$vz5IW4f8W^$Q3h{GQi?H& znK^}=0y&YH21o)aQ9fT}D=Q<*`P`T^C*yAbI7n1C@I$~np`s)~xd=Z#Ox?XGwW6~3 z!&u+t;>ly4X24sH)17oCGhw^BY0K+v(_HW8_0x^rozv-h*qkhY`LGx0r9+SBH`C|H z-X9>B_JMx2dO2=e=6XOql+G;YZR>s1ZOY{~h?%wF?Hj>Pp`kUH+HbC+4WGG z92y@RG+PUs3!6KY{9)weR+Gh!?vz=(W<{dbH2rkQ%2MgBEgUO`B1-Zr>ke-zFF852 zxzya$Ue^!xs(eLq3-?Cdz4;UOd)Y_108d-Soas7+{hErM^8U3{iS_6TqKsCyXz1sy z4c;m~5g8RRQri+%&5dI8E=fIKtwb*NA|jhJEJq-ip^5es8RqEYq>9j1Wk+}R4BYPI zAYxQEYYs2R; z^~2~Sd0iT|q!iyOzQG#6nHb3djXY-Ol)>wYZ+QEOU6F{7j51B8s zbJ2{_Qe?PP3pq{S6;mn>OO-Q9Q$S>l1eVGV#;)Oh|B>+M`IMy1&N@vUE=#AXpu?i_ z3DY+9U^U*3WioTBnZc^838=LEHC~T|nThVE>=tC(>yk_sU2GZkNR0X*Y+rHkwzek7 z4RR3TOl*j8TOHY56O3-`^ofp>eDP@0&ZN&e6UvhGDS0I}TnSeVVc9k59JT3*pN&q} z*N}p?2!AKJCopKqa>?Vz$O*UIM9&V!B#TkY zNXlXUm|=NSMG3|S3ND`XGhWKD#0~;8G@1%!(=-|2XbK#vfE~W9Gqm?;`-x}Bn1Gv% zLU~s+#|dx7q|>sVj0Ed#-85tykJ;#+8u$%*2ijStg-~=2vqK7Q8$)O@nP{j9K|Zg^ z6Ccc6h6n0grU!0adIt#B%yf9rp#9D#)6y0f;ta{~-H!1PIyBmA0_&5ZAzN<)B)UVA z2lov6V3uyfLzQk)5=r(P0{Ioi>0%|X!9aKCd>v)5O zl);RE`XnCBbjH&|dU;%B5X8kh`8f$RdrMQHfqJv!!viyAv)Ejo${69YJRs`y$*;)LuFR}Ce6}^>d7)o zoa^b|!wm7MV|G`R`G?wL`n z`bG^axH%L?8pf%>1`TC~fQQ5lw#ye`v#J!^o@SHKP^Fjn98$M`hFyoC$Bh+3HYvvP z(-Yej(3z8}mKXe1-#0%uA*vih(^ffmxx}e{Z-%tCQ(%OAw{p zPwLKAHsjz`AKk(ORj@toHDc#@Ew+ar&hFn2*M}ZBm_}#FHtIzE8MzqptjaY;+6Y%8 zutOe$nK|<0g6#A$yd^nk;obbkz-i1+xcX^(S6${sYwBqtgsG-E?xTm;mS#MA>5^?v zIZMsQIQb>7IEuu>7}gGk=c74&wQ1ID***o+FY7^OV)af$2+bUC+ZU@P*_-1@_sfZ}q2yj6xc`>Vg9!$d7t#H4Q1Wn?UO_+*!bfs1>et!Yi9GrPxeSj(( z;->o&s=G6)dqS$)adz5)v>eD3zgoJ1+#FtTXL0+r+T{p2rBQG66KRbSC4p5%tmDuc zcy0};h!ZU9l7%aMlJ^EriX$h%b;n3ab&Rm(64_(sF=mR|6FUKnI@5$LjYT_+E#Am5 zatjWk9`{g3stl^|Ly5sqla+s>S`5RZVx$ts#z_UPIZ2y5`6`K!=B}ix*or-gkdDAZ zmK~H1)Y^lLF_(p2G!vc(ba0sYad!M_Q;eJzh8XpfX$!V zFb455iotz|9l(8LP9Dog#SWrb(88s}85q=4BP`?kUs_SZWP+J%cH%t+p85s{_I7^6 zV-km;J`fdIIxs-vaL~A4crL1tHE^7LXO`B@W)1pAr zApHFYjpu?C*zzmu%Ok&614VMZDGJ;Z)Y2n+41izaKA)C?J0mo1> znHTy16w8Q0OW%S3{2`PblDamfOERyc*Q;B+WqG`iNgZS;J+Zka4(N+^v!|+a0DGVn z^$7BcL~A#4m+OG$QPNp$}lU@|U`0Ykeq6%~L-57Bpa*{U7(Ue z{=Q6sw_@VSemW8b)yibycMCP3towbYaWCS#tcS4h;d(&`a-42wZ|&G=GfN{%)d zlcehAML`CaC`?6Tg@rTK5QY}=yCUHZ|0Obc40aioV8Y65{+qpp0s^K9!1wSw9_E5! zb9XDZs|TK20W=;z-X<;Gwd*>wS7e>pXvuf!)q=d~zZ1T?JH;R^87FUGoo_@rUl1v8 zOi6EO(_?xHL46W$VC~tnfs>O##nF1F#u*VtqW%}yf`FE1@STe^3+2HpR3%fy=T7RE zv1#wx6Ay|)zZGGRR4#7rBwRk1*IDLQ$6+qPzc1atBRvUh@Zr+b?7)3z;9RoKgbcBn zqc3t6IO6Zr->tU+k9pr-4NxEW;X@Fq>CniX8)_f>R8_ z#ndPZ!{r<5@k2aLvs2GvIpq~Z%i_XSioH}M6(xmnE3LCI-1PHdJVD%E2~m#`V?qcp zA-Uixwdy`RtmWfjOcF%~>@;_%QqUNB{;}ilGA6SnHgJ=I&g@v@X*9|kN;zg9~JSYgBs^}dF>qg=1!e#N!$ip!aN6!`-Bw9Fpgr;*7ZPn2difP z^TW5#K|sg9HnHSOH=Edo`weU8Wy8O}_n#8|zoh_N`aZ)hz`tTG$p2rCCnz8zVQXyS zE@WrxY+~#Dzx8>Fs+Jm-3i7wCEm9)IJoE5kWHa+7Jo$nr9WvB_B|Y$#vSzuaTp|Rt zwCTC=A?42ynxBB4cexdW`jzARGT2Yx&u~lkwUa400fwXw^{k7Zm!DUj9ohR)o}Mp| zJ&G)}kovU{VjczgDEx5Zdh&2Rb?BTC`Y?@ygBG+2h?`-!k%Dz^xDklkh`roECB1gk z5pQqw0hM>nen6ldda}n3^`%Uh08M(S=^4zfwWUm`@KLMkn)OVzrOAzf)HHN;KfFyd z!I6lPljDqM?F3e=3C7I!*S6w7wME=x>Vt8O?44Et1xJ_R zoLHf`a$EhNmG))VV0>e~A{kAN5@~_Y=2ewTc|j(y>}#n2G9z)o(MNYv1nUNHEM|6* zWQ}F)j3Fq)!E@FHrV{8pBfoLA@J!(%a#NwbMtfU8i zU`{DNsM$4Vb)(h-Ps8IxzYHmj<^7m`>OXJ`%RD2X?v|aArP_rI7tzzuV{2b%U}?3a zi!wVc<&JZnER*wzeUhrOZoaH=RYKEF(t%?n5v*+UuZV0!H*Nb!q$8(iK{>J49j-)I zxWyDzF;7=i810CBrXRLHrmyGNIOd|Y2jWx_7$$8|MmLYoiCa`oZxaPkGBD8U7eZk@ zH4v5C6_X82IAe#4q{W)qWZOkhuZ2muX_hwms*5i}Q>CPw2(GBl5! z{|3d`w{bwpZ*(UGILEB?-ROf>FQ{Vm#-7tILIv8Fu12f&X=eIkY>(J#(<~L zgmpTIt=rE%Jhrg)Yu=gZ;%(@{9VotXawuY41@z!hq^iLgHMtT(FznDWkv(+$4zh$h zlp_;_G5ZrD0B;?c@XlT#R7nSj4x4B!3%5;rnNU5kZ!dyJ_<8mjTk@1aP+*U0b?+ke zA;s}(V=>7+%9obDi-rgokqtP@?WP8<^CpSb_1Sw>z_|jf=RBbBS67(2n=2gW&77<2 z^#M@cZo=PPmz{aJ18C;K;! zH?pA*B5y_h*8m;s(F#8ts+XbUrq`57`2`Q`)(n=!&Z_Ua5&^42s zde7k^<-Z$=$wdPlB|6ERbdSK`Kd^!zk5LX6{1BW4Oy3!Fc817!kK{Wh>kpJ-0eDl4 z0)U~1PHDxjbAEmO2ek0dP(Vs3Y5&q6tpf9(!JeG|h8CO*Y@F@vtexoo3tSL3a5j-Q zaQqqUNi1ROYG7?){LhpBOSd2=pp?DJ2phE2!kNZJ}=DYcn%ElN4lQq?9@wG;mnwdj0)*dZB|$E<)~T8vV{ zrGXi;Q6$|W80}mWB%#4fV1r~N*Jivbc|zUK1|gFOI*v2vp7@IvFJ58duiH3Tj52~L zmfSkkRa=_#qZrZGdS09ck`M~-2#K_~J4OCqqkx+|znVaLHfyVET;BEEZ!nZ7^1I%& zQJ`^a>`84Kd(!D)Q#|L%C{zBAT2OXSn_7!$0eL}Fyy2NI37PU8YEYe`| zc>~chIAsn2)ui+Z*prKK4I1PZkdNaDOS}++RRqZgk{}vrV>o)guyIRFrYclxpT+QP z`sP6*UmrtZ0|YlclU$9iG3_C=Ti6+e9ms*dF<$k{L+|in@vt#^$n0O zI7BmkLGb)90AFOoW&Vl$--K&S*D-F}(IbsJJ$@X&W`$~_J*d;k_aY_C6&6T<)L7a} zWVZTTfLMiQT=hUA*l=&qT!|66wwsN3C5oVpHhdV>;RJ7$?e)kvQYbMf1)U_$4G z=%5SmJ%-}#+*&XoE9cRmoj&mqwa$!*7nyh=DHN}y;=(qxK{CG~kB6*6hrf9F4rRv* zdCa6b%Gq?`gimWJNS1&?HQ4sH0h?2gQD%UFuOi z@}q;y?eG)pA7Geany8)a2L&I!R*;>LVt<-U+0L-x3kS(!A6Ih~|o3WlS5N}Z9=>@k?i@&ion zXgX-!#!nc;28N}3A|Tf|hb<3h@+DhXM4n4dy+b2sVCJ!AwBWiXT*W*t70RHV-SU;|{|E(so4h8_=1^0hU8vjqwQqaK3!brl_-o^R9PnUl= zmfDpYvKh*^Ohaem8Z<<3FhGDQMgE%gHgmH&_-_e+L}u>%?NPnep}+Cbz%cGu^%K zoio;7cRPIBfU_ZdL$d)*vC_~c;%dKfYQi-TX2NfTUkHC8XyBL?u>Z_~n;y2uMH{-V zX`6avys8C^Ntx@dTh zjb(H0DnF=3&y0`Vx6#-^aG(gidZ}UW!5V%xeBt%|eb5k#XBqCE%3Oz1 zbe472=YrGAgtaPb7MIs>1;}LtL(ysLxtg(Ny=zs5#cq;aVlYWW(S+N!G?`YTA+H>uRd`s#4mJYi1G{ z1mXt6QVGMNjQXbt7iKQnrKV0t?ZJ>fD;J)>$rnZiiWF*M442CY?48+KHaaGay6`AC zR6dVuylhD-m*_aSu)$HO#A)Ec+Jlx{s6Tqj(~X*0e_1wT+qmaOccE2@@`GXF9_0(h zQT8VI#MG>M{4>?4^s4Xf1NXa3xgf@Z{<7E`-CgKRn57B>_Rr!O(Q%ceFvC9l0olmg zwVvj%#!A+uQ)34I;F}>du%}7B3_|OX<+8b_E)oKU-s3<$qql;oQgHEmPb>jU^JJoW zv<UnFH3g2adzx4)e z7sb@KyT~;~;$gz{b#SC{Gz@~EyfL&uaS<=nxNLP&L$(N8t48{CPv-9K<@>&)^(8W; zqgm4>8XJVZ#@2H1Zqy5K`?e#IRP)0N8oaXV4t~p$Yf3FFYXs#V;-hge+Wm6SAIN+Q zvk&-gF#(nCcKM-4;o^UuVVw7sKz(E34sV@6YxdAUOBf0d(m;Jfk^}S(gkY@HT;=|N z!F-5P`$j1M^$unST%VRza;@xw8)bZXsgYC?GP^$8BY{_VeEeYW0Sw z%!S~)`J-I-r;fHh^MMh|N{v2}IySxMCemB|ccUXGr^AFK$kyXJc({(eu|qEHV?wD&v>hGca4MX)Pb+TTWaIYgUV z@w@4LZ6v~#anNN3ru02=rf(E*8sy2L!uf>(w9uOF6QI{jl~v!otW>~#nOIXOjEvjOMnQBCxlcz#aR0v!E&e-XX&K^c zU^;f>axxYdkx~`Je^*C#@NqsOkdNRHVM*Os92fWp3pdmDn7nbJGAzPflJR;DQyVAC(<(HSbs_L{Aiak@Aae*vq$sg@b7cGmB~jg{!Wn zO{&^sCgw1WaIJV{eS_sUXq1oSeG>m#iHRuW4tDSrn&MvA6|kb3@Y?T#k zhQP1OPkFL6?u)8!40&p)+kjnoDXYxI=$i74b&+MXPyO*a!v?1RI7b{WAv8=adHW9jV5yB_@CRkE5 zO)1IaeOM`GSP2H3V8FzZ>?Ex+2^5O#Gi8QzW!o4?VSQ|H9dzUR5<2A?dL`sSP_4eW zn|8CAOK@=@i;%;5!r*>9%HV3fyO%^HO{^iHTV1eD^vDqyg}WF^temUFk$Wf!vpzJ_ z=ubD|)C*zgsnV2Q&EOvf;Td+(HYh34sOAUS<@upa48#DEwDDxYs0KQ zyb;wu`e0|VMg(!02rRr4b3z12MTZOK>)P`lj3F=XWX=V1N;8Mx0D8c*|R!^ zgCh{#0N#ZF9Zju334Vn-qiGjp&fG3?nj^CJ8q1|^tUHBpTz=|9YHcTCO|uV!ccE6z zP5ZQfiZ~Lq49q*vXk(*j?S2x)CWktaisWIcB1gcAA#Guh4#fxw-kW1A!B(0ls6=AP z{TCt#D<~q13aU#)EaqK|s0FU51)&(Sd0L02yz`wR2?HVGnA9zX%}&E%RN1x3_Oau& zrGfWO#B~63>0S3^UptCDZc=yCDvM2y(jB(>HZO)4Cm+`$OE&UJ9w~b}M7Gz3xfiP5 z@{7xyh(vruF_xmlDKcHJz#YCR(rbS3M=_}4$jHRW>7S>9E~cjck3>na+L{{H z3dZ-;QY1R6ff2nFH?wZAaeV7K1G-@VK>`glpkUw@u;{!vv^Z0Rsj<-dx~yjFS?XV@ zjy8*|Wu1AjJSF_nX^HK(*`Z_$sd9luxjK8h~1KKuvL z;JWEJ7~jK}gy;U7LFm4yUtxTcdLnQTd#>%;PyKiOu)k4A_-t?9N%>emSNET-K3=o| zXkNI{z5?M|z1wj3+5Q6C!`Hswiu&K^LGMbnVfCfmqQLf0EG9iMvOTHzddJ}DJs)8C zdM||8z24YB$T-!Xl>auapprJ3!DRl^Cp57|@lsCm#P=C&<^KpOTfMlcuTpGlW_L z-&3uPf*S7lYGjyvpq6GB@luQ;i%%+!$o*=;Qz~IDQ&q{fSY|8A!A(h!o~IVmlo3~~ zm}#Pt?rA9VGV~Ro6@iMkX~}V7lsLnTq^+hg2*binRI&0kI9$ zk-u?Z%>1xp3r#CwFPCY7Xd!hP>e`$vXE`jwGTwbAo=(BiT7>EX%k@)MpN2SV08VSk zNSxJJz{<;6m$m@WVuNv9x2Zi#4F-z2Ro+TE2+cay zF_M_1t)TECWF0)(7uDS0?rLSVr6sysZP2eQkHKih&qf{oqJ4x(sVXZ!i=fHcxC^e4 zyLkZukzBJTHL_p@q-d;Dftg9FvY!x{qCC2!i~~|_&upJ&Pa&8Datr}2kNdz*qmQZL zmrv#9xF;p^k_`FPn^gtVz01B2JKT6?yyP@hkS70d(NGl&p($_T1;ckb=~NJ66f>*B_@ceS z%O#u9S3%)9Hdy^nOS5-BX%^&6gQ7f*)?9Rxp=mNGpV0o{7mAdqWOMUFW6QZURU6%b+e>$FKqk}xDoM#4Fw9-}{vaN4^cNly;ocu4 ziKs^1sw;+Q?OrkOmqOtU*o4`nscVUP_gq_b(TI`1@Y>ti3p=_gqNCzc=#W?aujmsN z)pMXB9CQy zx`T}`hz6o3lJ+JpycvS`9eQlnFPLpK7F(P27Y!A*_BX2flau^kaLMaKH<3RR8!1Yq z+Ofyq&6QNc!}5x{5My~Y(D?J|9`Sw1fKCO_5zc=f05d=%aBG8!LGUVoDo2ThK;%{qCbb>s2i%e~cy!o2Am42ayB1p7Yuy9^8l zg4e+|)%%>9g3Zo!AQ*r-WIpOAKN60M$5O27%Mpyi8brb1i{2STo-!X9|4KskiS^~v z89?qPmy{-&_QRdKU~~{~6TAj&n-Cv35*i4@m=MiK9HN9L#;a+8U!XqDPIgh6=n7tQ zjuGL-F4fogrp(c~HvG+tm zt-m{6KTJ)aR<630fKImSE;7yc0&{Ch3@#`>t}uKr(C*8w@W1@SJxCJpGZE}00a~tI z-XV;A2Un2S{Ow)}*+@WF6U+IZ=xv{Gd6uG@6xwwV?rX%xt`g|-?65kqfOHvcqBvrB z;LHb{-RzG{#s!9vgPZxL2!3>N-vTl|{zw{!$>tjyj+4> z*m_wtdLhdgd&fri^7sEy5MJ7Ix%?eV=DmV3ze}eywrrd~>rW-V|fl z5__PGE8r{?yJ%Tr@Pt!vcAo2kRZ&yIqFGANbRSfPpg+faqSRc2tS%uANgF^&9ib@M z!`2!EpPcoaARKf?IL0`yBU&uBU|=eAzVr8RGPYtF7er#YRg_^goTv$}==_Rcwa7v2 zSI|({XW^D}gQEc7qp`I7>OIkViRJRYo{Mq){!d`xA2t-xONM{k4`ey|gIf{)J8$?G zuwZ0kY;9p{LMLbMY++~n--tp;!i+5@1N;b|kUr1@Tv3tDdQmVgymp6T4Uft%Vq!^3 zK}T>hvkZALU92n5!o%d}iF~-(Fv^_bV&XYT9*>VKyB-WL->;5uz+G?|I6Q7ci{r0|sN@Vk)G{B25zez@7M+gd2-jcmV>8zHbv9@gf|j6H z(;m54_BHUNv9`dj8#xxKCM3!wr4+;m`zm|*CU>S&cW#qMioelU>6=7Gu*s$-LlRwBqLSJyFL|1&WX2Io2H2jM3jn`J+ggj`cByV~@Kcg9w!Vm}G8 z{o>4w;e7>xZJZ`;%uF^q5x4f*YnQ!AOMbP3_YkTRVA|4V6-2DE5Z(M9nvJLT28A+a zehjuJO(pb|cMV@=iycc>L%z$x!YIS$w}{wPrQIQ|o7GBE7xHT-(tC20s_qjxSzb5D zNg17c@SY|87qsr~5hk>13F>%kxXOkJZ zhMBLHVN^R}YOa=DwA9pFn=e#5(0)Gm_dKuK+8SdHgCP6s((Bx7@9%rQ+Uv=<6<+T% zM1-ZgBwS8eJBkOal&>uz*f%)1PqNQ6!SCwX4P3=jniOBEYd7OB9gNRuAzPtKo|G@K z?d!^ifG)n|(e#NT#>z|iwFn5;^6b(EEfWzFl_T#I9!4G!6S_r*fC(j)+>#q-xD?0y zq!Og@vC=zexS2!3l&GU;>JYO^Zm_I-?G!2DVeXU@FLyvX<+ba40^OoJ!;m!hvRJ7j zw+!x7%C0{`kJ$3<+Ix^8R6I?&K(8;z53`&#if!vcS#2YOlWQk?DB6{GDh&nlskO-& z8h19S6P3y}_cu#jnmyWu_T6FY?m7G#ba7TDo`o9HSio-no$v zKXK1b+67Mm=RAU9WpFxs!SP|Z4%6qF( zBI*n>Gi6I#Mkp&0SA-<~NKduaH_*>|lY2X<3m+|D`dsIRduL|8hLr#2LHWzMiHJ+@ zHYMLqh9H5l@HfC-Fsc~&FDRi<5kcZ?hvMx}yw3C*js(4o9F+tsE(Ww%2CAvSL;!uo zuw@4O(4lw@{NNQ~{%W6o1y9QCz^9ckKw`~wKkiRG*^Y6fITTi!As$&{QphG|w4*6N znHV>z_$@P6lQ>YY6#f!kX3!=Mdqwl0-ba%Vwsi=sDg6)YFw%f6@$#f{s*J5?9(4Fm z8blr`GMsvl5Ma&Xx+R#$+wQEmWfMfvd1s;#_)ePQ90pd0&^7X&e!R}Q#k{&uNYZ3$ zb$>VRvTo80+yqJr!YRO<1!%=5r{=9c);F$kB%x9Ok*!!IM6M)^DQLD@n4iDTa#`PovGx;0oy#|NNS=wc}rhQ4|XV{y*DsudKI zpsmE)&voF)E$#&7hFDspCxR*?Ilvwgd!$MkU3hurRLZgiD-XY!lPnaw04e{^>2iUl zWFw-7nc$=f4?MdEJr`u4&d=yqWEAT_N{KGTJ?S3FatkTuqATUZARQe|#`0OW-DhIQ zs%o>usTKl7uQ~(D+{A|d7oAyikFHSc7-p$wik41Mh9@*kPle>T|G2o_*FU7oM_P)TX?s zKwYWAbTx*(nVf9&JV*FTf^!a&!6WHG60Wd$G@>wr#m++uVZyFO92{u}GZ9%SdUdU) zv-=rp2g;wK$B+VrYBubx^i!NmvBrjMzfAfGM+=>>Pl#?M(Sn4m0shP{JjmI>Ziz*3efmWvHq?`}@Hc2j2i4uQ_ozm^=;?mdnG&rZl z$qk0DBLpyT}k0q%&3b#+LtPX>@8qnkCF zdjxcNCtC7x($qJ{)rp==j@fnm+!mPTdLybEqHW$bcwJpl6@71z!xmC3qJ zTVYtkcFu=;n(Um*8vOy=#% z{i@6v2q5TBViw6OKCzEvtBdsm(%I(Ip-#D*MY5izB} z@lFad;G_G+yh8`K`-SSWF$w25B(+n#()EGii34pD3n$w72*3&p`-QCO$c-Qxec|l! zN+5C9(3CybZsT|cJwUK*T09m(!9iT<1aHTTx|&`nfU(o{fX+i}>a#pqO5B5b%@?oT zcHg6Je7n%9SVzpA;>pB?l31-V~zdMp;+y2;s#P&M|=i%<;q_-^p%>}68`)Qw9be=HS)pgDc6V{!bh!D+Ou)zyoKC7+$VxAS&srJ zE*}cu>Ol7^@gWE~FUjx*Se36RH>vY=Qr9WZIaUGkrd~apDjE zbYXaAWE@a7qQtsfzWz=d*{Vy%G6-ol8Wet$j-6C!c;u0%?I3cY>sg8QBx7;)Jv?hy z6-7<3gBHZ)jxsK$nd*tJ5g`JuB&3?7)d+t8bkPHmJF-Y-`Tkw$PL5B+i^3TV=Lw{> z`4U__C2hbs4+3D$g21Z5PsbzA>8(r~mZ78R`*ch-43--+_GVLMdAY-A|I=)bs6!Nq zmF_PgLLM?6o;^l3rWLew@5SF*;^1eJrZSH02qy(Ar@kH1`bS;-Q&7^rCIhLj3c}Uf zxn$Z2N9M7u>Fl?TD(LC#C#>hBknV4iM!;&i-v*y{vet(gVP;#lXnz0*a)VjnVcaaR zj?#PIzJEp(NGDK~y_LsrBCdOqMt}{O_$mrL!xDKIbFXGFH&(C%m>nu=A&>F!;V77I zaY1`UITk}3&H~M$ZXyqM-?8ZfZn>+>7i;ul;_nFV*H0ytqR|u(aLV4zXg6_eBHVPr z^jhACo)mUPBJ9^1?EXe_?|2*s@PU@ACE#yez;QoW7(J79x{Vtv_Ty5xr9_ENEF3(+ zCRk~u45he+rokj}8zrZ}Au4*i3mXqQqi}~watnqOHa|a;&bMd}E-|y9%*H1!%i%mP z<`-+iE>oRVt|%t#fc&m0@T@58Zpwt6XX)!6FvW5VUgZL=z&}cDCB*fGGt~FKGT!zdNT)X+v>joKUHe;GiO|ZsacV$nV`xQpL6{TV_jxu4%ZW*>f8Tm zPR^XKTZrwn3oU5o^}*te*c}b7%j&+*S+S%??gF`^^o^&&^|a?@@tbJ<_$a!CI{y_f zBmqP%x&`<5IS3H~y(9P>sz}r0;9vFv8-O+>j5$}kSo2OeYxKD%s8hw;D;eu{cw0U9 zb7qh$`w!4;k)C06FPQ^A<*0-##yzJ5`DlgaEDXpt3DkimqiM!w` zLBjb)!MX*%B}}QN`kcUpal{6;B`*ZVP`xbxeXhv4*$C?1;2|A?C*i@nkR;xyw}kXW z{Jn9SVrM^RUGZW9|FE434I~xD|&iPb%6A_Ag>jO(bOHCA*CG7wZ)z*h?RSU;S+hD|{I@)1wLW|R7;B~!%cnK_+BK)XE#h4JK<;XBi` z>$^&VT7_Ng0??v6>Tw0tWDv}%i&1^U7-VYdaj2I5s-`^W*Eox^He22FbL9i=aE;dU z7#VU!Xo!Kbnqg|)AFfi;1zp+v`9O8wt}iGaL#3f&DjXJmK$+Zm&a|#ZFP6bcRTDG6 z7b~>n6l4N|Jy9TljEGZ-qRfk_KtWZZVl40226&=IoCA1*0WN^L*3Xa9Rn^MAppu`! z;#|%v4xIRngwt^Qv1&KHz>HH;JFeP!V$ka#9aU`MfY9EauAB>^-DrU;6nK)DCsmes za>1@fh`xn??Xjo#ZQchwLg-A z{$TjFM`DL<3Vcmdzq_fArnW`l|^(7369vcdn)#`iZ7k zgS>(S+dn3yDSgrcLTy$RR@3!(aC#?<1lGO8Khz*1DRuQt0^Ajo7qWl)*0&(OaKRd$ z$a$`*1_X-OvqV|9C^a>5SHw~V4g0m1G+a#qcSWNfK*4=^mKQ|F0XZ`GHSH`b9(5^A zdI@VvRbHM!(nfIg$)JO`GSi_Ou@2T7?#CN}fBT+%+L9PP<^5-l&^6Vo5L;l!L}=kZ3>RxJS6 zaIEout=*97@GAJF{q9UH@}X+ZvB%YIxRGxF{QGz+l!vefobD#NLcVz;8&cRRzvzVE zNtcI6+h`zO_oay>fc8=R)G*r^>~|zkkZUCfUz=Tqa%#pn?oIp>KeXa)`p=D7aPKC` zju+6uH^};)=5xiINsTnMWVJ(1vBrwXJIjkLsFOCj`I?*1B#*kcG^o7B=xnNwTiP}! zHV+RtS$MB<$m_}%e-nKS#S<@pzo8mYE2y{O_v1B$VDm$tpGJ+)1D$-r`#mV3Lw_NBlB7oVWA!EQQ{onX*6s3xP4lxw z&&GJJu&3uB2(^6aTBC0C4){67LkV8Toz=<^UL3xVG=PU>c^l}R(7TveaTzQei{#-h z$wB!E`B|N}0dWpt6whO2Qu%BR7FB1trA8jB^zie%+!9BoA-UylL#3cqiO+NK?L>%k zMu>Mn4WHX0S9n>A6e!0LM#P3ZxN#cj1`o?2aKYwuc<;lRGn^)he|teqUy){$XxN*U z>>aB8lGy>777Z#p1e5sM?+V5%5b>S}HH`={4G1w+Wz7`%8B(iZ&dW^10?V9Wx|5&! z)9)`+j9m;1v#`gc%!C`OP&h=#R-lM!EmiF6=4W#GD5>G)d%5%*8}6+dJT|5^tgYU) zkCP0W;a3|%K>8X!ZfHo{ZwOw=##icwCx+zG(ei*91tdNJtrrQZ@Oydh-cmGQ6pc?% z>eMKSK2D_}8#74Y`t2|KpqD+&2qWBHN&N-3GdyY9?LftHs}(H)YZ3d#RpnFuGr1;v zDr*VXrXE43e&KU!@C?{a&}ZPIo|co3)ft8>6iVB_H#i~9qtI4Z`gSGFGYimPlr;W% zpC7+c?pMw%eG^!3z*&BBom(kYu55v3a>{RT9!K6!vNtpJ3o(*+kW1IVVT#nPl?A#- zApcdKJZ-#0y?j4~Q#JZ-b(|z*C40$58@Jsu^702O-AXsX5>}q?rEidb1781d?)Z&( zJneq)%dP(tzx>~n%OB3&|3$6zN!XGd;D-;Hxl?uH-m z>4&uX&0?dVH%Wy^=M8{2!LCG!2;4cIv9`su^QR*! zU@U{VSPKO_6*lWvKGelFy!djF#U|_<&7kdRHEvFkm8#Y?i;LFXHXn4m&KbD%vh?6m zHrUkMdyUB>cD1js)9X5GuC_%6N`Q6wQyJfdrW_lW=2mm@TDd*j9{tNqia%$e{(jM1 zb2S=nf1&VJ9*s-p8RA&laq8&#a-S`hTH=LLQWBn%1U4k9IwCbiYBc|CFB%lGZ`Kx! zwAxe5Er~0930|Kbc;H@pzYxuL^etNB}?h^Yn2tS1z@BmFD4;7%tmPe5L^pSLySQr+yQkA ziX#&%lhx2Hvq~|-q?4#IYFzrGrQ`p_?C)lkPOSXFCGUS0^}q4S|81`Su}u9hj$}+U z1LTk4M83_LF@Z{&8^Kd)J%h+0DFQ>tR*9{o)!hg>Bh4Cb0B|KY^{w{2kNv*ryH?(B zf$Kz12cHq(0}FdvLRME4;Y}rMttX*6B^v%FRw! zP&1L4z6@K^z`TQms{z9gC{xVYlCX)Q3oaUD999^Hbs>b141LcQv>QF%R#FL>-qjw7tQ7%t}ea{fof7@%q^o2FNK|o0!>2RJ`iaJ zIfAZ+LX43|g>L3ea8S(OBwwCP^(%7Q@_ae}2)s;WrMXLH)Vj60r7!xgX3z5W0`CUQ z!p0J3&y{(R?04lD#26kcWwGH|x4$yAP0IL_&fXQQ0*B7ltQ%x#-{q**%Mh$g>7dL) z#-+`}ys6a+BKoY&3Z)C|d1|Z8GL9z^nCKBtz*2ON9d2f(QHRXb4bO(naYJhz?y?rl zLV0HHRBV3rVI~;r39ZKbrN>6|CriK~3Qp7-rOJDr^;=7u0h`XkwfiCRxV_*wTXvoM zk+x0$751SWwo8mBS+we?mAV!y+_+f#7%k=Bn{M%P_mCAvaWfe`Xd!eJ zh7p2s1MI?IpJ-%7gSPB6X_#@Q4JRdZE6>%TaxzJ3Y@gTWf$yoE=T)>Vlht%{M>s`% z_#L_XuK)w}@JR%*Ot7*ypz(@=*hpzruH2B! zaryW{x7LVZJ;5taaN^Ad9FD(^&~N>Ti~Juzg=0XA=7K z@|4u_*NFIHi3PJvP%k3ubMX=pn}8=O7 zI|tqpZ49H&MQE^pI_vvVl7ZYm*JDK3cwHS6zBk?Z8NVGkXbi`rOsec}!gRR@D$wF? zg@?$XdmcVtF6T9^d7HcHhWhrQtCd1^SxvUI6PhChUrzPelQMH;W~i&DM(3T7QL=J< z>62tPD5dC~r$=$CWk{8joUB?B`X^^90-$R)Drz#_(6RT%AcN>lj8Q_LiYlm}QU*E{ zH4|4@IB&^fqN}RMNK!7I^7VODCZX99I}Al9+s!p-(?j!93Q?4n3X(Dt*0LEPhZ7ZP zsn#@9lu%(**iz;hGsw_~pfQdR0XYUEgo87YTO5ZI&RHdCN@X}2Iq1-?oVyRPRu&uu zBvK65U^og-OHzugiMUIAmtXtEW$=@q0=vo=Nm{)R5C})j+J_o6bnz1`%FDHDs?w2D z)hc#JT?w*x6~1Vija7}S0UN51b)ZhB7vr^POQ#YmPB1#oh}#M5#ua3i@8`}L>UV#e zo+-|Y7AM!A8=rb{xeQ_thfTKa53+;r&qG*iFC=$W4NLy0kep_$O_Pf#u{ek39&aY0 zs7&7NccPIGDYqh*#{!Or$=zb;EuWGSZ_$%zEJV{KU)I6p4Nmk$!F#xu7ktA#=|5d;!2#>43C;I76-OBqZOkE?97F~{R1LPLd2B80{!nJQjjNsb^V zJPHU*hrv0B3FlJDiInkL>n9mp`bm>d#cNYjdZzAazD#9#-80$377TXkd>AQ8jRBVXcj+0pJo+xWCC$smVtfDIXQqgr{3nxGso{% z?V&PDhGd+2uU3NeO|{Ml8v7-~kHP@7t(N*wj%q2!&p>q~_A60zLP)p9OlOUvHt3c9s`A z(KUDQZ1v|9aJBf&!$r4?-1amu@49EbMuumF_CzsYU;^Ra`>D1^`UfEY>45VHy}kjo z3{kM;*L&5>ApP3gsr68WtbJ=sr1B*B$fagavE*jcb6D)Gqf-3KIV3pX%5!e{#|D@Q+ETHB^ zci>k`9#;3dl{$`#y3Xn5Yx&%@HB9w(ZQ;S>uG>x*x9I^R1ElnAEr$z_l=P<1F9+&* zO<}~1^ieqRrL7rU2Q?FmICSWoO}X#BJ`};iwAG$G2Eii)+=(|7l$T4Bg*u)pELJ#M ztvcK<`!xU}R)6s;7oKhU`AR_-r@Qic zVl;_vG4?#(0j^%wqp`&!biqFp{qz_*!x_^aqR|7{2gMTXKbW*lH`fd zA*B?(RPE~%=_RP4RA6r>8+urLjPKUonWM=!2<%CwWlz{Yin(>k_r ziV3`D8M7%5y!AWS%Tdc|-N&N?0)g~2u;%CcC_JZH4HlR!fPd7d`g3FpUO3$G3H9%A z)y`OlpevNJX@QvFxjn4|XUhP8z9HImBG z!X2A7Bx{YmpG*>&t>!%?)4P`GAWB4*Kb!h11VHCER7i48 z>R*_J)JsWS0iYVj}dLgB$0(2x#M3u4ku#FO)~Db9Q0fI%hamYFg|3aC#H%>3rtB)8H)APcRDQVksT+-w{aW?IILvW>*5*I@%o3Vz&1_><8-t4c-JA ztWp6dD3jxx>a1pZ6|1)Wxde1QER2-c4j&-cFr(M-6-7!bo?k4)ts|TSme6$dwAd(T z&>k+5u9k1+=aT)p$Tkw?-g8vie>i3o>)WmMBs)`mM27kvg2=d!truNsNQ8eWmhJVK z##@>P+dI@5qvA|LTSuX4Hwr`9wD(bK|H+Ix=T_%O|MIkC;jSYQ{OOdKkG$)rVMLqs zKok@ zOAh8k8h)hLIurec!#DrH2B>$43v_$f1*mtx3lp>zzR=y*kEiQq)2{y=fQXZq`6eOw zgJGNTCPF+<^4`kAH)sa>L$zpU?-}$9U;itd595XDYkjMR{FkZ&Q*WqpH$Zhf1Wa=gTGdo$R7Q-^klfbMW)_5#`#=oJ$bsQ7NJA*Fra-rHhDP1`t@HuKK={$CVHV%w^hE{ix8)t0Rji-))iCu;I%TSP z1ahb~Z;5e_&G9$m#O%T4=L_AVmxVpEaWTo^jEYRZ@x3&xE-kfnS+G=;N|QN=v}-aB zMsZ^om1_$l_;z!JQ4*lDN~p6=Pi0QcK;bTX0*?2@2?e{l6HH75rJv{6?QCd53?r_pIyw#w^^l*#sd@9EpREaw{Kv$m`lPl` z0=k|cAKp#3d&uiErPC$m{T>VM{>9-5jPVP;l(k%8h!@rkOt!p2Zl%cD;3^}f+_NH? zRC$0atbt@sA3T#wreZMbGXq>6v6onzQ>X`O@n_E1?Spf6QL!qsEAGPWqTd{T@)Tq5 zz`-ln((uul=Y%JU33p)+rTEAz<(o-U=kg9tz2$taCZGK9He2OOH~Lz#;r zcO~OV*7twpApiWZl@u=vpCbVPxcnd}r2n5kY!0k5c$frltQH zJ0d0W3*tjW7Z|7W4+trEAmL+X0*CMeh@=xI(Q{_>XGDPWYVN2gRPF;+F0-xg10@54 z2y9eWUfH^7U1?fXYi@0+UOcr|ZxlCt-*0ib*^)AyMtVPY?(pn@ZM!kHZw}kdK66i=E&VBK&ZLD3VX;V z?h#|iJ}EHBEw{_k{|e+23H=TI$h&UakVRR$;Jw)wbH}L@it#h=)wI#rHFCQ2%^Xo} zY|=WPPsX%#(mu3nI>Df3`o4>MN9<951j;>sI;yKnotFjT2oWQ7qE0&06l40~R%4Tp zc+%u0vd%h1BP(vhBV^jl>lJ&>q&Q9O)tncM+xW}v&m@knu1z=Y;00#>#Y1{+L!GMs z@_3!@iBq?CZk(!p-z1i|H?Q5p9jQlX*JiO(tF%`aHfl>Zg!} zVoY1O$FPhEnF(|9@hUiFk%V-hssT`|2#)$l6cx}4`ov3VVMTxa{YUAZ8k=(a z1%5j_c7vcH|9N9NDDeg^1W6Y=*#(OeR)hNH;=)3gwGopmDJ|4irWlMK50L_~D;jIP zt@Vz23!PEMKO3mETW#yv_m2G35u=Ia^3=_w$TQ36TI67Q`6mk)dAckjElF#I;}QwE7z&*7RtOItLgeV>xO?AI=T@y*wSK@D!6RU3ir^9{SnQQ?B=Aw^N=`IaD5!j`#3 zAyY&wMs9DLafbjPj$!L4Qo+WDEN;*%N=j})k2pMxDnRb$n*cS=EY*DVdZ`M|n)b0& zstql&3AM6yTv7)l&D+(>SDzu2Oo4 zc?@<{IuIMPsSJBsO0UA~uy}_cW22qxO$~6eWh$DwUg=)7nvyiZy597zSOD$Vg}q-X zS|h4@8K_C+6oCnmWukMB>>?Fi{t|^eof?;%U5j7`WkQwt0b%+ueRulUQI0VTiVRUt zl}L&D!L0Tu*$loi$aBy;stOV->ic8U~tn_S1ug{$?+B=iUt6 z1_V3JzWfQlYl1pUUp5!fMhtA#3M?~)k&|PnnWFCRcbOPYz5LZMuJfx9n(kXR=@2ym z*Lla0$PmdTZ-~9u^a4Q))os_ZAZ%63P&a$@G$!`o==v@%4{=~Z;k`= zvwQbIKHsTLkjFfgwJwb_X4#*1SlyuO!w&d$saJ&VtZSAZSUa|}t!I2t0uo9^qL!R3 z;zfJi%IFmA817cQt}@iHCl4Gsj#k!Alv7jp*r%sWRUCU)bB|D?)L zh4~rZu>Cm7d8_X8W|?(Frtehhf9H9*;rF$<@%x+87X*Y33OiMTA`;Hs z!+Ms;LBjP3NB*`nLW2+GO9^C}lR~z;Vm=~e5vrWgY!q^)niMP`$~!jc5>9-@m#3sk zaR{f^zJ;EbF{FUiU7(TwV6q8z6STWQ@lrZTLs`riHJo!3`OTLi=rV9kI`C~lqKCd} zB+Wub3Y7VeWWbs(i^8kw1EbnZ=v{j`9^c@( zhI<(MKJ0M>mAYmv(qX&B(H2GwP^!4%n~a_80k1@@!zoKY$Zmv?UHsn51IW@sW zmbOYp`k1ygACttZoXXj-lYlu9i$^t$)A4&`&yavMa*YBdA;gp=4~+ub88HqPOX=KQrcI8kerqzMt;<70hF1A6jPVy9HHGXLsRCag;_!A{w^bAkbIzT%^~SXT zrf%2c&C^Rndl)w<)s5mYhcOJ8ZH8O3!O6a>Z7VZ4pK4sXTNX-dq6uR*g0ms|t$7oh zw!sBFiIQHm)LEH04|Y=*leEyJt%%W7b-f>&#~)xYiPDy%J0QQjS5bt12 zqsjXP+@FZ;dqD(~x;WFD10Rtyp$`AYj=5|?W#rFy@3*vF*qtYMQix`~k2F-r!lOG^LOuXJpW zc-duyx$?Vt5!!*WI}uy~`|x4>H8=x@OgXqwVyrC$2L$!tTfJ(Bd{N#!S!=STS<1>H z#!QK={7Z1RbWByIa?S;Te8fO6l5+RCF7lq)Y^j~%*F`1oleu>w$dAzr-C30)XqGzi zCl-))fR}Vx*sU8NNilAb`jV)*NeC}JPy?))R=j3BlLWWpySDrxa8Cw+f}tilw#!vv zKTQF|_8GOYaKQwQFaRw&C;ajn80b|~L>N`1(*i%u>wAx2yXK2q=6q>gw2ZH&!+03K zvXqPrpeO&_8_5DQ(v`H*Eos{##((k%YUy~5cH~vE)Qt(JRS~ZRIKyQBV8eHh3gnuM z!R(~0`GILAQNQT@)8=Ub0%AGXm)$x3EoY5&2gdWdkVR|kr{-$D)eyrhH3YKn`QseS zld5^MFyeefoa&rNX7DQCne?n4@0x~ybW%vnMBlLrE_9eeXb@{@MWce6l=otQr}E{# zb9&)tE4PP^JCW`FirY9EKUj{)6SBfs%i_XeiKS7RWuJLn(1uplhL(@NCeJ>NZdV8< znt+z?1~Fvg!Hp+v{yQS`7SuxDAtz*L=?<8#-C8BH)^(+jo%R6C6RH{i#ZS7XJ=nf; zFF1!D$W|<;yNMV0F{CHeTaik`?}BdOr38I}W!fLS^dYP{>4j`0a6JCxx13|=A zVQSEg@rakHZCuBVR~af3%WmQLerIwzKX<@i2x?M^coVOFD$DcjsnGl`2rz2WfJrKy zt-+JAh%jHRh#!cr=LgDo9XP=h@R%DUmoilXt7o99hq#b%;N16%mjWs66C%wpXu`4g z=%7>2otlwpfMJAdwIWAE36attBuOZ6EDz-4q!a43*5pp$Z`c7#2D@~ltM?Ig`Wu0~ zAoTOEPWkS-^v*~l)(pGWbb0*JF~<3=jQzvGVK=QpE;&wFpMU0fkwekYFqppQASsoc}4JcxJR}fn7C$A}-Y~ z1_LTpN{?OSv9KXU$LUFdzHr?|_qVQ`Nx6f~&BGjmOf^EdkRv1ZimKg_BPUTT^sIuq zt&U3xEIrK?2eI!sU}5I#3mY-e8wSI8g_7v_6#rdkS!}uw*bA0h2%caKCM$CN&7>qg zimViNW-%+nA60rwvpC#n&5+t5g$u#4;~|5W{Td6Nm1LI1e8RIHf#3t{u z;$~CI9NHSvW^1k7O$;!d0P7KAxnSoJ((zbe>S&R-9W^>6Lwka*cmO&;$5QgW#jHrx1LnHLEygCGVUIu-$Dl&Qb(3kC)NHNW$lErc$mQbF=Ll{ z1)=5bzkaE2q|J&tYc9#Q@tr||R*^olE(iVDq)7AUo=fXNYsYon_DZ&r5nj4sP*$_t z^yluPVSEJx0@BwV`2$@yL%xfnPYVFQUI*Za$brXFUxs2)vPI#Ls2p2@FT74n5qoZ& zOkGqpQxNr?oVu%8LI;DyF)xO8lI9`C`DRG1Zbj3hK^1XHiWZlA1o4t3&pr(GEqU^) z*uxt-`j7S4^9n@g6W+mxgbuq4QUf#C7eQYm7|$X%xJ>eQz{8$Yxpc05hfJN|p*@^p zia|TV0jSPrHNjFTGIT{el1TV~dS4weX}6`}Qt<)iOw?o2g;jbn{|t2+#qtXD(%gcP z)aIgJh!WAfRH|OgIXmiA9`xy^}rm`IQG8FV#=gX3+ zRkLYdrpWqiEEbdI%yo9E$_Rh4V|>_7u&fY8&`!VcJC4TPhWga?stxF@W+`S(%A!9K zZh5P^Roa2UDjhU$enxgtPVuv-K@&LGQ=eFa5ATnCp9L zQ7cHl|gHjdG*%z>HbJ2PDT{oqB&Bk20P8;%DKGFV5n2S!j`sJY=RM zMJ659`So0{1zs;3SQFC($muPAW?E!(e>T)JS^FMS%lUCxqwoYMFK)i6OW?=aG=m)d zENX=LQ_vaEcqEvYN~Z?AWH14qzZfU#(C59i#w!exTf~c+qGXNWq%q(;sX2+{$_%?D zmbUq4&>Dp9VbAJZ%HHmn6L&M4V|oUDY0vQ@tU-jssA zxL#rKCtt0ZgI!5i3ht{Rifc+Z?YnY*o!@Rsd=}kAojL-0W=&C;7cdI9P|!Klo#3AwGrfq==NC2Ysw@g#YTybq`v{{bB%xqt>iGTgk|N5GnGr!}n&(t5a2HIm!Lv?m zff*08>Ry(JYIfk2`%~cBWS~=J?_PY4;6A+pqHrXtDorp+|CIT1XqlE%sf0FUTSElr zU(<-!-YAvqMsKav-(&+5TEq@T7K=^K(qJIcTJ2S$pIl|o*W1SVXDtib#o=-Ndo$#+ zMh&r6Pad#3_xncZ>Gl;hBxH*=?4skmQM9guVs)Wi^+bT11YtE@4d0H2d!!3($>o^p z`FOVM%Wvut3#Ar`+Nrj+-F^Hl-?c2q(YCh1kAw&L2?z<1v^QczzUKzNUyBZ*1P&y5 z?o|Vr5-kjoKayYQs@~K>Q1Tt%7LyRX_=K-PPIEkkCl+V=3>aIJRI(ynfz3tMe~9%H zuSoKW&>rVnPOJ)F<2`aFmTvK<#y-Y4ewH?542#lN;iAiN?9Pb}n|>huYoGQHS~%{k z9XR>rNayh74#M*PLkrc+&25cM{@Ve>+)NGNVs32zU%;WdoD$x5Y=IR*A*YdeqwHib zNZk2M=Uy6_GjP$~FRAFXm~&vJ847|0{6ad;1e+q!t3&%$t!nF5lPVo#yiSEse$`uk z`FWcMWsnGUVX9Bwj>q&1p~uI|(@YQO%3Dj1`+?Xf3W zu|38u?Ww{RjT?44IqmNRTx)fF79IBXOYgDfSFn23JgJ6vnG`dd5BjY~Dec``v`Y+s z+S=9{z#1U~K0pp)j z-Mqwvb=_LaJ@YO2mbb31N|!vT6(FE&9R}>|(+PC12E?XzehCC*v>v3z4T=Q;SAY8DQ%V-cbQ6tv)p;N1Q z#E4_2N&MI}nX_T%m8t|$_EzKQiIi;Ea+MWx;xXxtZBsbsA|SVyK=06|(CkM#+iL&f z*1BPR<6h28fL>wFyFnq_nq!aS8wV3QR&)S= z7ai!sPb{U!Mm;N!NKv0s?HyN=hQVm>Stwka9oHrK-62 z2@FQ>6Yfjy5V9XIkrU!Ep%4iOyC78vp%45Pm38TaKwulpk`R(T?2Lwc#zyPR_{Lmu z2R_6$8t z7caW=HS>#_O+5c(i9-qK(svW0V^~F&dvy*3gdGefzk*u8Yum&Gm5qz zS)Xd$=9u(VF)e5hrJijz!pE91$*u2SxmOa^;>Q9e+&DwgiF9?AJKMpfy1^P{uZ+$r z0e&$OrOdvm@>K3|HoUtx;oM;Q#6z0c*h@0Lx})Yimi%w`>raWSbu!aGlzg}%yyg5R z*Z5m8u9rZlA{_(mowO<317qUVDk-%x@tpzZSqHMFJQ_3xrWfU+-Sx_QowU~K{T~Mi z&T$CNpTVq;g;R~QpzH0t;CJE+{iV;hRK-n(`9nxS@a;w0;8{q$wI6AVO46LBJo zE>b|mH^1tmZvJ0K-O8G9pZ`Wo{AV<9Pyh%tzKDq^kRTxB|I27lH~#@pH@5tbCBlC@ zRmP~(ARrM(5J6*~EnhOO5#Y+dsbq#L zu+Lq8P#@%k7{TF@j!k!cak?fm8a@0!Up~-!1#>BorBoOwn(ZhOgtZ6UQB{(Y)Ys;W ztX7xmXYzBL={`k#%tjX#pK-Y89iE~?0SX;YKJ%p~F0bXjq`ZmiES`2=FZ!VmnGD5y zU0nQrv;-q}(WThql-C5j`g1Cy;0v7QAq6^G@HyXE{GEOcA*(or9%WibaRn{3IAwL( z!%!@qIaLkmtG(x;lgUzpV*|gpFl>rNdFSTKIuvBSU-8H*V>rz8~shj+wbirAo z($~?SO2cDBd))%LCyk}qCv&HcdMQkrY~<3!7f<>Q#)UIeRZiYJk@%m9i0A-{4SVpL zu|KS7v*xjwdWvoiotCb&Vx{;NL-^g>aS6|V1ds5hCd@lSw#QQFEhP-2g--d0bvAd2 z^j!Z|1;qXBKbi+zd^tb-rJZv|YqfH~?3jtq#HiV$8IbLb!CA(%m%L8U^tXr%@pO$8 zp-dFm3&d?HkyAK4C6k?{r$A9GNd^azVC{=DgYykj@tPk+wh3u~6%ALOOl^@gD!Kbs zF#q^%Z=Q$Lu$)jdbs4(=6l=w5>774HWAkUGZi8(@nuy9nVM*OL-&~RjxWm)r&d?3e z!y9@}Y-xj$9GI7%vm}wXMB&|hQWq=mpGh-@1g4ZeDMzC?sa_%;>1nqJ>(%gF!jcdk zzKgzx@6RB3er{-xdS&!t&D_I1*7NNx#Zc?u(Sj|G$*we-IMY z99;lk5j|p#c6R2b|8Q-{mB0S}^9@sXF*jE;|1VeY9M%6cR^1?XH{DcHT@Wn@N!=%B zPv9mN7iC0|mJT4LpjCCusz=bp=WF0f@!I#eVHz)y#(xIQ76yZPW(n6G5icGCT}t$@ zJeivIcD$JB5%L3bLZX0!a?lywO*Lo%HrSht3=%*U(fU@{z}q?;gcIH03Cq;!A$j={ zx?lvSya|f66LzA)!y%kSodg-^1~Y6wQa5gXTe$@l2+~u3T0B~;iZ@AEDP+73f-I{R-eCKK5IFp#(Ca2!PUU7o|YyKV$=T( zHN2Pu{G{~(h#cEgX;i2jJXAz4Z9z(E?Kxk}wnOD?1?~ie=sis*S1gFy~Yr>LRZ9c7dEXQo1g6hd~rMHGM(#2&A zn~Y7CL!&xlz%=dAomU1K2i~J%l8miIk%DN7M!LFrNunG+e$o?+GZ%KEL>f5BpKET) zShhQze5xBIefWd_%_vBtpUW*d{pp^=0y~6cbWJ1MSGY8<{RoNkh>>=B0bgZgN^)gl zgd&$e!yc+nXw1{EX~G#+NT;RnyiMt&xChU6UH(o3Ss_{QBNRBXPeXE+zC+Swv}4q8 zJ=#E&ZYh*t+9RoRJl2O>tLo@WSgAueP#eQsVAMUHFxv|-ofwRaL7uE&vPtpAka+l_o z2bu)>=M=g5!c=OivT(j|d>thm1PX>#O)@Mhy#!3*F0@0Eb-Q^Zo;#O4ii$XB-W#~j z>TC3*rxQ{6qYQ2L+;sElDLj? ztc+tB4*0{tvWIr4*Sq?VCyCU%oq7oi~=VdHO{w8I&8)2n{}rs17qMMj|yOOe)gL& zWo2zTM^5HQeOnN1kPd)WgUrQi<*w2cfup_2X0=JdKUl=jIXwdo{+6XooaHe#t0lc$ zgEGY1;GDU5IH%B9pIJ}sip+R3k8|vOvHS#P#S!XDsP{FWStjz?=6P19uainCreTW6 zH*;!`StTsM9o|h|S1MTm+kAV(e~WJENUbDkR+c}AJ%Y^Y)P)Uidy zJg6HxD~?O=Fnc$)t)ix8)ox<;Q`jUQJTdH8uG#ExE{rtYgXuamj}~@W02t=(*d{@& z4(97Olwk1dhOq2()AR&SXot}(wukfsj3?8I)8U0ocn!OYn}zXLDz{im&OPcY`KIy% zgzz?_#8t-7?l!+8jS(36A-h9SI*00=wLLHv*(Xh6jW+_{JIx~+j8%Z$+$@IZ8an{1 zdMFg``@K|Yz z6ws*VhtZcJgWofNn@#l#4SEoHxoq#&ft?X`=$rF59JRL3lBfi&9QbJkJrQWQin0z6 zj?}*goOVB3gv55{7uoDSXS!9L(u`+dvm#X08@uwiaF$a-dTxRb?Ps_yNHKmWm38X? zk1q_?h*>YRKnaJ0Bp9LnLRIgMq&IM)bvg%BD3$aX^8B;Fwz#;vzY=>`84AmzsH@2- zBvY;X%bO;}0Xf+S$)&+`)Yb*ZxTrBYz`gQs8)da_1E6Hzp`h+_;3>^04hP2S-4mLH zrD40|#M%1+6it~oImmIe>x{~oPYeX!&M)`%zNa0Tr87(eQQ;&MmRZmGz`c`I1)__VgLnprEK(xvCp9+Hg**%Rfqb78;fe+B9t!_RQVZL>#Zz?L}>QFs|mS@ zDpX56#sIv9Rqc#ac(X|&0!I*nVh%QLxZ}NbzB#1bw+4!J(36-0T!dcf_LcIP-y#ON z?M=Q6>lxl~x|8_E&Xr~f29SQ=qMr|yNgMdUGc2i%*m!D5F*#Rs54*=~mf~(Sy8+9V zW!Ah%y^`9ui>ss}@%p`g@fwtylG&fH0Cb8TMwNDNY+Hrop^NfY^5}_9bX4M-{u*zKfR@XP%feCZ zDE~;s&*QT^R;!=fF$)--;{Gm31APgmc>hzOHQsA@r~UQ*9RK2U(*7?K^*_GmBCe*^ z*79FgQ~xd~;4qJ71YlF^*`1Zw?ySjVBvGzlJReGHJ+ zkPGlO5qNT)$>UfIp|ya34j4;jp=>E!#UPIg;*9X+Udofk;4_j+ySttxovqBE*tS2E-E z2=xLjcegaz38bN8oPKLQORam!G4wT!@Sm@%`gcdvHO~58yo!weQlGNP|Q9yF=OqDN|b& zAg7Rz?__QAc%7qt{7rkUevsi6uUPdi{s*EIf0d&7u~q)|dE;0{gqgdEv7LjB4Qoe! z8KHb(6rmm7=~iD@y>jjcT;(Zt3`r(|2=pZ(#WjRPcpb@PfA`Fdzo=1;UZ|!_wgWu50BU81o?fJoxWN!ytj!gU*@F-@zgdiVwf-p|`_G z_CBcZ85G2V1X%f?^?7{jl9YSHTYT*z$g+C=W{)s+$R+Df^b$D5w6;!zhAr~bFNC%> z0bAy4>pGbLdyMJYG)`}!qS_nAJ@qv36gB?_>xGeBsvjeITBs@4K`d8dIwU0g8b}%1 zsw-7P?JAdOol;JVgVwrD;RVa4&Hz*`vEEO@f|yK`_L5q+n~I`9H(>{)52$|uME}Us=&0^}^S`b< zeqZ_@!GAUA|FD4j(*D?g*~R|TqyLp&@t>w};^r3C4%Yv&ha1w+|Gub+zO{#FCKwpo zYo)4NLqv@>i_(Kpr4bxST3%E>yKcY=T9{#$X+~cj=Ua8H{{fb#UsY72Usa{#dm3ls zJ)P5(f2z~OWX|$>k?lRx<&o#=aQ8}7=MUm-ZM^bO>IKq!-&k47)$DE;xv+FrBGq#gmBC%p+xoZyd(wz`28m6h4H-8MgkAP!GM z!DI|WsHl`t{TqF%is<{<@KAZ;KeeH`9BP#^hmcY1sZnYD)ETO1;tT+GvjNHdkN_Zu zRU03Ig3KNQJkK^12%_;2Ll%#{zeYR9PEi@F?{B-+OKY;86h4WdG~J<8{1^%aWmcPs76 z7b;8P0l|xzyozU5RzE{eJ`KCMvXhK8GGmX#;0NHtaAKM9&AEr2viBecWJ1*dmZ@P# zG{xzC{=e`_I&nG4M(m&7mfc(t8!*A4Rg9n4dqLcBsM&meUM8D@qnLmb?URA?VY{>X zOrp87UGy1%zpqvmI6k;n8<>N`WWG6A{p}9$#ea=o*@)8zKz=7<9QzS*l^p8`Pj4E6 zbU*qtMuZ@aBm1pRK#Jhq9hAe)TPdrPrA=QO;Rt~$>zu83iGh5tMlz^2I-2Il7yQV> zt?6pW^g*(rF!1y}O`*TXgTB_{$OnB4qaC2nnhP}H_4@4H{2NPO=gD--uCtAs?(>~P z{poTipY)=T>8AuyjstodPB=yzQu0>9dQL@2sIt36 zwL8S%)e^YX3@cO!gw@queGHr?W0vO*F(_OZ4WAf|pj#!cE%>fC;_eLYEskOCjE3P1 zH!=t>IcT4a<-yE&WuiIRhw_9B8&T?XqqTUG<8+3G#BcLw2nGN9nrG!*9nCPtsdBU} zG5P_m8TtV)fYv=wE6qd?PM@V#QuCKDcSN>{UP7k{r((g+g~3;nk6>`Ik?>eHUP0?m zTVUA%{rfa%$TVrWG}gLAzb&r|m-Yf7KCh9vY)(mSqQSUMo9Z@gXW*k~N-Em&kmw)} z1#rWCQb<%Gx>Qs_Pd+3QTkh*9g=9X{W7zDg(k>2)f1M-s@(8*LWwfNP^F2k`LM^@2 z)nhl4cgqc*Y(s2v5FEcGL20Zo{olnV|3D2}la0Pz-#|cIkU>Bg{x$plU+v?6gX7Zb z>dOBPjK_S}1*m_=`FPx%&PWpbCPoPmRqZb^XC)~H#WkaDA_tS1L_ig0)KO%m8tXN) zNaqpVQfhRA;PdZjrRDgv%(h+?W;!dh{8**_OOXq}NyB!Rcm zYB0li+*88EO<0!JHc-WRGW(FqMVvSa*Nd&>F5QFSuh^q|t_&>e z{DC`ykv*#nD>uaEB2=-Tys0#Cq>W%Wu!51Ta*N>kQ5t!o?jt7#nfv|L9)W3B0+MO$ zoey_K|&MH<9YV z>OdkIYz*b32*6?_;u@9 z8LcxgU3hI$EUt4e=_J95-^Lz29jjBn(!K0w6$J_lfyH-=;vM-1oOhP(XI@lr zNxQOy$Z^+?d2 zw0xz?Q7#m_6(5g|=X=6u+ZRLN@n|7eB@1nSIsKWDEK@N2(rO+YT6jxxb{%bY6c*s+i4(KE zYETm594B~m7I+(Bd8Uk3l{rO5f9lzHT9;8Tbgc*~wq?Lo*ZT;)>v-1hz%Dx-NFj5) z^&Zo=lxEeFvMyHGGLFRJ=XmP}O4bU{?o?>oCM#l#J7%4o>@Pn?LKgwboHYoF;S93f(a_E(*$MiwQ#-%gv=0%n7h7qX!%WJ>sf; z-n_L3z5yj{=NtPd_f{Um=Y)0^4`gT7mgNN-j3-bPd*9`6V0Bh|m$mu|9h4K2u?2Hb7<+`_=?=+M@s5@e5ja)majYvHUz*QGv`SK!;2Y-SF zN4-e2E02sACFI!RW^p6&euOJ&9n%a?ZRx_2>U{W5^RWSxrfC?vkWp7bT1~-J?A&qS z#L}&AD|EAdIdZ3PCk9o#M)4Y#r9wcLCg*I8(^ybROksz4DySsWUOW_D8uGfXB*Ytd zB}vlSA6xm?ho?Sn1o5S|Ork{aSE%n{KgD}mL<>l=%4ngKGnL-PR{2cSLZrw{@=a{BlNBU!DfQ1O!y~C5*w3IV|wHtMCE1D zIRN3VXTDxph9Vwnp+#eKzcMZJ*Uc5n{6m1`@YKkAY3WHb&}sc*22)KqKg zQ|!lS&>U!8@9hmwY4J&}xw8vgeh=@#)L^G!4i_xHbgtyPE$s}pE5CCj-#DYw4b;-5 zyAqUi)S1-Q(MNecyxqV2UNmPBin^nJ^VCSQ{sX#rKyundDPZ4^U%LeFD;Pv4g@f4_ zhpTQvv(ON|iImtAiz-rDj_Lc>-i$?eS-w1L=(!S&Ilgdz_WXEskd!Q+9n`*jaK9>F zrF${SO<6HtVpJ8V326_zPJ-@3B3^(9IKJNy7O5B{@WRS%Eo=PqiwV!32#7DX-5`wB zK1LDJI#2a-TvV?{%k7O4X^YNyg6)_CnMuevdpKdcZer_}EI>JH>H!rN=D$%daJ?Z} z=_HF$AVI%$F<)2Y^gADzd$#!F0x_xNL`rsA<3wn5iZz^01B<2gFR5&0<v++QpE2`!WQf2YJL4=YR+ z{srF@iuAlAzHZbSjH;JAF8kY5kYRh&JmUSRk*v9T$gxNd%85`ORGD~l)G3ATBNabZd`U3uE(FeD9ce@kU*H&J5C>3Toe--x+90YnF)hK z?W>r=k?pX-g-1U{y=3oh$WOb2NlC=*B0VnW^vp|Ju8%;0XF92SNBlOWu@{f*ULj}H&wiT6=DxjiEL_q;u%JTJks;D- z%G?lAEH2td2agLL6p8v;2=$R&fdno4__D+ z_LTE2?)CQJmM*vXlP@X-umX|qv`EsQ(G-hJ!`d>Q@H&+C)z^kr`m*43%yURNfq;!216$L)~vkV^9 zsJtsFOt;*b;{%T__{I-v#PViaRQLy#bwm2MvjW|6Wo93^d%Fl-ExYTd_;5wmXPzPa z_*s8pzi9M8*dEPema6GtW^}*gL*nx`uyE9uYK+R$A!!4NxOW<;-ra?zx9(u`Cyhg!u+f3;DZn-@cY8HGmdU2 zAPK7$ZhS_MW#6&>^#=Us9u#dZWV?s?CAwt=0r|3y25~S4Fu7VV{oi}g7wrAdGEn+I zVDEnu6_x11_^2-}37wcHa%FVJGaJMGfdC7pw`<6Nkd_96rz9Z{z(#kLrZi^Gh+sp* zoU{3(s?%(llJ~HEO84ozCqb%H-9`XNpCAA_8&urWLYLf(1EQ;!+xkVUkLApHeREf&>ts)C zpv}_X&Rj4v*-RPSxZ;+-6ZZ(K;-R@VXczMw6Nxs zYm_)`J@qNc(G3Zznb)J3T0$H@u;(>A$ZzY^FV&}uk;){%*&M!PoyZbh6K7pc@ap?} zva7hA(I>b~G3DldHNNZcXzBFRoAucXQ5J2UCtIXsv+CZ#^UC?gV4Lb~Cmzw@32uPv z+$Sk$`9_wnN2>U@_KEJ{ive`ak^Q`P-l$WRoqtw!`_{C_>6;()(mf|1QTz!s{+md* zn%66!dt%z7tT9N)?8F=5&D-sxKIgji9-Q@W{^^ko$|VWOV|@jw&-ki!Yp#al7;dHu9fL^_e%EaOKyyAm89QR~9zYMYW}Q(pZ&6=W3|Vta1h+>09G z`qWHhc^>9tUeb#c+wb z26;HM_Hyt35!l&7zR+WJ!o>3o-$PHGoq9YW3ftwX16-m>5>NH_ES;tj*Io3^)$ zQiq2@*;nJFZtdj{qL*IuJ|5x+rN7+l4}J89&~Nvp(>u#AeDZ^4zu)~F>nkVFU_Hg; z*AQ}zMmM^*|5!gk+4}m`P45hqzigk{!$E9hJw5!$7_P0WsIIl%H270nx3;~gx3)TY zSiN<$cBwskbnC%r1q!S@}~4{qcD~mtVh2D}AnOdF6-$hIOj^!FvEslmJdN z_sWTQ7DH!NT^lR!=fm07RPJ=8a7Sy5_22rnsqL=4QxAF0_A0L+kvbvzYPPejm}NoF z0nNuyUwt?;9a8{RR|m~3p4~t@F#hSUL0yjmi3zN^0#Zmw38i7#4%!uh$@x4<-b512 zqFDkPD7`KuZY*(&J{COi(J0Qmh-4mHKVF&w{-sFk7%|9Sp{{Ns*?!YODXne`?eQz6 zlByn@>s7GZPUbGedQ3W!Wp7-m1@^W066SAz|0H=5j-gRs=5{Qi>IAT(#z3wY8<)p59`nQ#wy6@;oml z)go(r>X&ey?f}n?j30FFOiwSqdm8dIkoPUjYlHN{s!e)38(jlZE0{{N zRM*S-44n(m`iE3#ojg#ki}Uk0%8OZWjMh2>TP9x}BG_RWP8M0ApV|0U@IhA%#Q-h? zr~R0-hW^;3|NZ1lrH~A-k3rzFLx5SuwaOXtKJletD{iaO-Ag!X>n967@L5dR!5o{- z9T+-fI39YS(nc1XVQ*ZYg)KdfT20uQ95JrC*CCQ_XcO~-FZ4sP8yAWylZi-=(g!fm z!oMdxoBVy04MED2T+zsUUnauE3}G+Uy5Fcu1iOj8j29y!p0RYG>wUmgj>{jDYcqeT?laBGEd=3xJM@H8`>x4AOjyE0{1eFn32)b zjc_fDZ^%GQF~JoeWiDvO6mN?Q%8w?_#RqJ+ao{gd@)}G64x_0ma6;bIeeN-ub!8xgE8##;6?`V5op`sW-;G^Ld<^r`; ze%cf>%x=Y4VQ=6UZ{eZUuzH`S?pl@=#s;E6c;$yVr8(t^3p5CkO`4Yn6S!Tk$!vMo ztBsF0A?CGK5lpz&%BE7u7pm0dWF?;}J1YN@tck)kXy56u?4nR|1DYXI%)_+aTWn>{(DD7D6N;|j_xDuT+%4;Og{(qC}qBGLtk z%m`MrBk;z|#aDWKd9tompUxyN=BO2Oaec96x2rAC^bY>{y>|X#OQ%D<{Ds=4!(e%BhIw zI2(6H70MZ4iMuY&fTo^#uAHsMYhr8>v@uI*&C{N0Yn9YY6O^3Z#0iRw;E=|2cn96j z2tnyMy8_j0t+oc^vNRRSsgPA`tGu4*p;k#;qR!RPpR2gyz+=~O+&^|K*{UX^pS^Yj z)5gz8!vsGyq$oDA&;V~=O5-h%x$Y&FRdUq3&xm7U%%Rg=Fr^vQYIJK>0@sYAe%22* zp?cDR%y8T>C?!h}$|;r2i8C%{l2|Yml46_&CYCkA24AC0Cu&Vxdnv1Egng)kV-ZWE zrVDqf9Q7kolio~Dd6!(MVtnNV$~U3g>_*RPY8KN94#6I!$JB`g3uoQrZ0eXN)I9@u zH~2GE+OfU9O`TLvF>x@)Ctban`k}wu!LeW7*eHX!eREdR%FHV5zHZM3W0dFWTvd!N zB+M0NW<;yKHU&qgtz~{zGeW48eaW=nW~nB{A>{Y@b+fFPZjlCPt8rf`>*^ZaktA4N z<9nCBeytf6^ms16zJ7p!%bj9rFp071%5DY+D#CIkSzXd9Ky%;eaW)e7Xq&q5s&EeS zq+ms}y@jx3{ZjxAd{0&V?|@R4OfrwCjzq-lVQo!?qec6hzJ-$p$&0ATunn}^)UOn4 z4Zj6K!{7F05Sqx-NN$HxFeh<8&uYmy}1}148Zo|mZ&C-HD_ulR3X$~|d z>l;;t6!w{AWg~yWASlLU7os*z5i%Wf`WQKP2ocl8kn4?36>>p%2_M#P%tqCJ%>88* zT&QLdAx|X`rA!rz1}U08Es@>V-%sx&>z%@?JiCGk3Ta}j>tX9$Am7P$n&YB@vCI+y z^_Cwb(X|=c>!>55{0Q~Xjhp^G7=neUFJN%(CTuv(X3>?)Qx4KgVNcm!1js4;QLi3!uS0LX#JLY(xxnu>j6qE=y@_h z50z?ImWp0U`CXgw7WMT_;tw@k_!%--!n{e)mde+|Ki<9~JS)*oy9341`Cs`+8@6No zmg?Q#F@^l;lkZ2?Jv_nLFL)X7Knsj-QsS4tg-1_|fW#?CYkbtVs!dMR+TgVE;!~l4 z?NRRN_mng&>oc?tFI`n0XP#fWovJT8daQ6Qv2!{)x;WMZSRHdXG`H_)r=rIf4__fd zYSQcemR?SYIYhoSK|moHS9CLPeCsNn(??QK0|`La&oZjoGpg%Bpv#2P-3Z@RhE)DYR84mUbeDWj^Ig>eFvezv|U{G57-*aaF{aQS+)?cP*Pff!O4)` z3d>-#3@T67HFT@9ynZ`_zj{V4cP4SrZ2>uJ-~StGG+NM`Rwq(}VVgoiXOg zp6FYyIy320ka$Yg!)d5Wm`vx^m^=`Ewl!o?!5EAzlFQ>&8q?Z@rUER=1JcJ&BN~2y zcT7WS{x>rv3d$M>9Vp8mR955SWm(IEBx^&kKu@;DHKwpNcZ^X@y-id}dXPg@CeZIM ze<*z_w(vxQ?cxaVj(%=MA?Ykhj^RY^C0wCQPD*+L(ghX8wb?TSC1y|;%5F>Na-IdG zq~<)vheB}qVz2M`MNl3tTDO(vX{xs*8I&YN?SyuLguGh$OwKn z7=BGd+rBQ)qbZMQpc)InG39xFr0oiQtoqTBsX9xRslBSCvjt!g$7oa*fO@W6Ywq3I740-rT=Sxr&DihN!vP1sDcGr69=1TPecf4_v z4LOfPY@eM!*aXf5p8hYuKM}unVbJMfVx_WpRZ|l6W?c2{e6Bv2WD6Q~ubt4fhI3!& z(2@YC0H&f-euafI?|Zkm34W=CrlXAKXWzd8=GH{LS)nJY(%i@B`orpi6dn68vPUPd zQw0?8Y3anP={D&{dXc3P2K(XirR+`KqoAIR)W)bU5sdO6P3 zC7-1()SYqdUbd#vACI>Vxh=NtXop+IyXV5^`1!{k>$2=4J-;V>nC-o@r;bu`j95L8 zWCEgTBa>mi6Bb5;>VSXY1^S28vC2~<4Fm-F%{Axt`a(5zbo7k8GFN`<#LHUv1$42) zH+hP@>)uwd7qod-MQZ>deW+L3vas?@LQT|;$r#i5C2GF@IsEm%Z0|#fy^`z60N_qU z!=!(Iy0SmnxXa~`7Ng5@!3wMJ1IskmFb|VEr?{1x?--7bmP;b8?hPWAL!f2adSTy} zOagGBeKTa*M6t50q<3N0*RHBtdkHT(>?}LgEO9zMzbHsct1!`=GE7?JN{2Z$3&@Ne&T7=w8SlfnB>jjc8AYOx6yfQ1^6b5ou^b^P;{Fj_` z#hA9FtQ^*BQ`lGQ1;(aO$>hCEWbd1OndSfK>`LIF+}{5bC6!93gcK8HO(7)NvSrJX zwK6d=*~XyK#E=yJc|r4e9UkCktHYQAynr)w3t>Ih=4Q%kQ?;uhDDtPu|$e zay z9`NkyIHOq6npi5=N$V;;fnyzt$EtEU;x zcT)@L3re4skjsV~B^zlb*|j;SP!gu@vr`)PBO>je=HEu18$@n>QQ6Tlr)ZemE&rFV zCT!oXIZmp~q5Iyl7$2E+4nYcACq}8>yI}JnMs=dPXhm-D)L9D3FY9z;<5mt@s$Zd3 z-BI$xHT}Zyp=XsIYL47)-SxZ8F7TL}gvj%0e<$q;NwY0}sBik%+BNr?{)EU=$*@C) zY)-Ma-rYV|A%S8tc=D8z3u78aNH(gEseLi*-OgcY2j2#M&O2%mdDV3H>Jdvi<%Zl> zd$M-Ot5}s?gXHsyww_B>5ZO2(z}mpa-Kkct%5g}WWOY+S+9Juu9*2YX>+GL=F(lnL zKBDRwcSYQLaGO_l&`e3yl_lf8)g6&48XtYnWOI$2Qc;iei+#y{DppeVau0TQMY_J+ zQZl1+uCo2?!Eg1yKX~zc=#yt}4OZ2X zK4pxLQ9Zm|asB>$*PIK3V(79bJ1j43muPvVtF9VW@q{cYFPAE-a7kjto?Oa_BTt@4 z-m7xIyVgK|<;3bg9!GK+_n+=Fzh65(W}8c!*AYAGyyvc#qiT)^+|O>EzMhrj(@J}# zTNe}Ga$U@HiGHP2ncsOamhn^dEq9sY{5({j$XFNdS+>@EdR%R30>i*ks%y=G zN;5`;L7JYb_sqnnEjI%y{nKaKHTkNBZolb1>3-3LHP`Nb)10rZOlNJ(AAKle^vuP- zz0~s69k&`a9;T~59JE}v-YsN%(o3pQ_lrz_eVK7GS>Njth9CYh`BcM*&csVE>{*hp z<_5gJT)>nIlK*7gbtz>sWeo zL~f_m!&4_q#_VR@h+0v*T26Oa>&}rfryo$rJ|^7&^cU6YZgwS|Erq9(7kwMz?m9{#>49s4P03bU6Q|Q+ z^{=dzzv@hPY1jGZeasr8>I93LeGB{-26?Vb&i-)BEt4*rv)Vj5yW+`cDQZ2%G-2V< zAe*3sxBIu<`5MzbY5j4fbi2}n8`9Do^VTW;RhVwkU9x${w&8A&Ac^-t)GV-MQP zDDdl_fz+_@s2Dm`8#YD-QW2B;mPLH!bHm1N%VX7Bp=flB@9-jGhg`H!Mx^)$qFEWmM zH)~m0bNRa_i6^sHq&;9=T(s>|;r#Q3Ga3zxt6H?}9#<{pn$j>5Iu?mVQXy^ zd@fZT^eTGH4DWkAKf`)fUD@MTol4QDiB9C!ANhDYleSV zX&*~HUf0;2-m~XY*^h?S^)Fi&TXla=i0vLx{;_M?w#%@S$XR-dM%Xn{b?}Ug#8mz9 z8S>*=lD8>IoKqNI$f9^vFPgK6o~bz*!Aq}46eHCAiA-Te7NysBu%)0j@iwIbI{^#_KRml=nU zM;zH}>*#Z4wpIbP!TYR4e&fEuzk`!TJJn~VM`^1pR({{YkezKfPv@NY?7&QhMPZf z-Z#{Vl-%94$a?PBCoiNKmCuwPEN*H@4K#{Rk6b;j@Iz6l+T={p;_9_l@5auuU3jL+ z)+mrwM{Nz04KY6&VEks$o#v|SH=a)}{$%6?cmxi)bS21Id0UpW?a8(0$h&tkQ!hSJ z&b+%~QgGT@je|cPJ?z%7Z4Om_{iyN9TFOm(9pxCa=A08virG768-EvN7E>!0Yq>9o zGV!3hyop$#0^24_=cyG&eW;kW{h0ht@!L9&0&cy%Fr;L7h`Qnni`BO*ZqFEN)P7@M zd{&h4&Olw`)2|JUwIB4vdi~om*h;VL)a$8b_fEaLu<>_v*+!4(viQf*e`I3oI)*k# zPnfoL&fYuw7FaF6?xhysP(P>mz|79t(agi=KPYN??k{>fO#ZNL$eh-j`*l11@w+kA zD?<78KC3mFVP|TcW`{lPh##r2?S0prhT4u|U7BJ;O^4RFs6*EeCH-iAXIPf+Zxz;h zQcAJWf_d2?dXmD`J*3foNnY-9?p7DC81I`%Z3;-*JWbBU+(DtdVnADgcC zIQ?m+&*_Q!vr?Ys-OVu>BsX;ld9RMd0h!Z7mrwGBd+XeH=4RCDy?K{g`tFY7iOlwE z@peWpE^ZrfZjIN!3Nq&nP9JdBvwU#I`^%90=Y{G`2cwGqt!#BTxZZzh#mZl^#48g* zmz*L0+OKb>{mj*{ewIf4T-x0w<-U7YWlelmW3@|lR{Z`u6CF?~!= z;mRp9POY?P+dWn8gLT(h^UCY3`&iA=-WLY{iqAJ2xzxJto?g+qtuxXkwS2B_{$9Ff zwcKs3&4%r7CRmHPw_l(1XZP64qSux>UVWv}bi2#^de0JBQA_cc`iG`1+in@WFi5BR zST^NA@s@Zy){)v!McXsq)dM#u1f}dgUVd1_SK&tZy3mqH)lWqdvCPl&#{AVND09DK zt(F_w8J$WWwNO8)!eqMj`qTb5YR1Y1jc!tJJ0Dcy?kPV)BdKYW{KA#bWeYwluirsm zBI{_gLi{2#Z%3EHjU@4V?e(S!ep&n9WVqTaPPl%#N$%+ItxCmr-d}D~y11r7?n%SO zd>y*Ni@-DfVz2A!&Yw$^d#KZ@v?ibO_-cN4S80G@ZivFMtjX4rXQfXZJ^Xc+nbYl{ zR&nnYH9l`|PY5TkUO8T+i=p~v+EF)2Z}D|L9VcqGp1UA-yKS+dmih+Yq{tV{v`>Yu zK?WU5?{z0UzI*MWn5)Shk8CTKl4CZRB64jbQZ{#ce;VsvJvAU?HvNR@)`K$)%cgIx zJ2*{ze(hVvfse~BnEKD5J)3rZ*Xt7B!vUj@oEg?=-q<|&zUn$_Pq`CnvmAd}Y5&|` z^YVw5(eJ^oCRUc~R93B*>zbdev6p6&5cTc7(d7*}H-jmhq1Ag7}d*rcZ zf5}v-7EmCb`FX1rrhuegF18i9^2!w|7@98t~j;fLV?y`E%Wx4b*;Vzoj<>I4{DqgILQ$% zAwM+S%|m}w-j2)wDH%DY)$f%BspuYZ^VsIxnN6Ea|JLk#Vtd;@Vcg7r9Z7@tERn#Yu1gfc=ai zeKbRVahUIBrfKVFrQLm(MCyBW7>N$ADyNi93x)qF27c1$|L%QQOjLqkuR54H+FH$b zb<=XN>O&xr{P~D;Ns~y3IFMr(F}!aq<9h=>WzqYfH$L>f0UK6$Us}%h5^VA1c}WtC zjK5au?`;|G%WNj+33!`*kf{%17zu5xN&V&X;~zLn+Blwbo|KEiVlsq5@Ljdy6dgs6 zj^f>S%uge8tm?^7IKnS4!8tG8M`I8C7ydyCIX&$_Wdy<;0Dq3Pj}nO#z$Z?qH+vtX z18?{qaWAD_f9>yG*lEP`Zam@LP|g&DN1ek+C_)58t~_-aCOW||TC`1x`>>c7g<^o@ zU|gJ?OPsLL#~DXQ_P0!~Mu9fO;FOv&7ZUztF)st7{POEP0qhzc&G7GyL%e{fCjU}h zWo86mDo~fBOCq=rD18DE(A>rieU|4Djtj^$%wR^bZ>dMfn|P!U^|o>HI&ZrQ7ei+T=LO7 z#p**IDC~8saM}R8Z}7JqKqb8oa=FQ%b8h3Hzqjy?YQ^&w=h711clnzW_^8Jqyeq)h z`5`88d1eRBlfoddu1SCF^cf5iK+}L&fz%KhE{GtB+T>KHxPx{naNf-ZV-6XN62ug) zL~$3oV9c=rt$Q0h_OxKY4+;+th{V1|0T+)5Hq(!lpL<$Hl1SUZH5GAGUqH^}w<$1F zjPHDNV+2NrLbU2_6Y+v0FV~Q!29rR>$01MyN7%z+UNOSJvE8M3r|kVVc1#o=tI)|s zjqa$6JAgtC6gA*J*u!Ekazr|Z*B~OQt2l6nl6Te#-GwZ4$Ys!VBZVp8WR~s4MhSW za>`#sK-TVk5T^^5VDjiSUIL4#3V3)s+4L3&)E-nno%=rg$zpC448XlrQn)ptk^2pc zd2b62;Q-M3IM`hjArj<|3n4VV%SL&ni>#}(*>$=r;AcaI)xy!x@W;lESy!(uaB3H_ zH6uKl?!LR$O%ec?MMMplx)Vdz*wG|O zq|mASrGfeifdtT&@!l_`{4b?PmFUuUdEmWqgF^)WH2tTo07+K2Uk}rBOsj{wR?SFy2oTGPr(gHx;ZS9kQM#j%SZNA{Lit zz~oq;;B3S(ydR&uW5PicXTk91;-JOO5~0~Hjpa-1>rJ*{4%ASnoBH?BxRmYBJYfVe zP?*fdk*YcWKl^BZ6{Q@g_jY4jpa+aa3Mwaj`M2RJHXhyp#g&$A7|hf-r{jr+gWR9> z`1#mqNG=kfRJ>bqeX~$^xf6R8>>-1*g8F|XeaRM3Tb8rj^EUQ!FuofbAxq2!BXzra>nf+ z2zH;ql2Oxy`>>edZJ0DLQ$ThQO$p&DP?$-e>^Pbkk!%EPGr`%Rp2Z#(b4w=%%xk^& z;r`K)15MlFd^Il(2IXCcA0BnccMKI{*PIc)Dw4|nplEM=7Ayotr_;&Jz^g5Y7(Y>V z_(4PkQ{y{?MCJ`nf@O_F5^L~h;UOR~4H_|1F@c~sI_(!mhF2uEAtBMBkY5B9F~dmc zmO>}mzrW{zgwH{oz!wW*q(Oow5q*{h69{w_B-L`6YZx6xBcgOrdAq^uL!vQ~H%JH{ zEz(2>@s+pE?D9*fdvF5vfz5%@-N10sSpEt@YA6QSr$pRTnVY?Emss+;42o~nG70T5 z5Zfw%T|CFjMiB}0>XY}AKfHh_zP(@jCm9*YbkH7t9w9F;5Rhkbzlah-3t(5woE8u) zff8or9J#bM99IZ}!X^@U#z&^_lZaH<35>5v$Bz8{_2@FXJ~B>FkO82O!?B0O^s*5ENDCu|3It=ZOumx^L#2YB;LR(^K>&>4jw2Bo4OwK&&g^z5 z2O^*xn2zy>g6Dc?BD4j?KM2~b+-QONnnYN{@kiq|{%&9nhQKv`CUn-D2n(TtQ-P9E z(4YjGg$00nM+*s@nJsJK94d(v2trlCvFzfDVe`g&8?dSHKn5igHD8JRA~D?WI#W0k zc&!IqD95pf#bi=2%)Z#k>EQ~7dhTWVZ9G8bf+yf5+U`$;f&upxtf&(p$Tm^Ek|Ta^ zXFc#W3ZU^R$$t5ODT#1>u3*;pKhe$TgaAJsS`2uXS{q1Yo#Vvp{yTDEA|x^dtKZh$ z3qeusU|&-(u_F5_j3z?%8kQ@aB1BJb7ko8e2s%<5#t&x}M}%W@XzL`HJEZm?Y5Kee zAkZpEn+`bcYBmdjBhGD5xaA}!-v0YQCD)am8a8NI;xCZLPeVo~5=kR`H%4@rKhzZg z{RBp2DU$PMl?Fq$m^PZf$8&ee7TsAOynI*yf0bL zXE3;TWb;N}G%=%Jd)IyxB=Q6#qJ~q(!&D5F*RS0u%a&0C2Aq}+KP{(z1#r;<5T4sh zX&5f%+Z>yT3^&l9p#!rhsvv(vGH_Ac$=Cog=mtxKrZ4uem{<1^Q8{sq=pqQ|P|8oL zBp6@>Oh_kVILJj-9VQ}ild-U_!Zyvg6R2$658B7)uv;u58ZIsJvnP00B!@#Z>$;dL z#GJ6knSXc~@(BuTPa`zy*X;8ei56N#LEUD!VGqvxFSu-rb)ZD~2XUIe0{XPbE2Mo zKOt3Oi$q2k$H8;|nTC)RGN1V?4;VtNp$CB*UojgL6K#ksCWin$3rdK8bO@B>VSxj$ zYM&4{w#WpnH^2{{YHnO2l0fd$*KHKQHA*##`xWPuL7F)XPL7Wsd1XXMZda%OS_Vzj zDr7#;O~A`%!MqCZ>4h~IE^l124-X{j4spnIe!hDr=GG=AQS9iF=bv7$$^Yf%xCwZh4llGIG&cI&e;!GH{qv* zVWM!Q(1xM*ii5i>)8G1h+=;zoj3Hn-LBPWI7r*!6VM6IuS8v}L{*Apf4ekju*M2rQ zaAtz#qV!qk!LCu|I2p(K&d(U@7%5K77G6AjqWo4^4*?8qSs>%k;=U8n%tB~^VQ7_y zJ+~y<2NLb3nknhIfb<=H_(i*Uuxkpx;>BIGf2fZUL(V}9=W&spBSb{T!CS)0+omF59zkzxD49#3j2&_wVSQIUkYU|WbIfrDOTi}~j26K{E z#{3NcQE?&A+{v_X+YNH@{p1OizNj3(?G8~Tf@0d^`8E)5^@iBI_&)FE84&Du@GZPI z9MvTvqG-;pJ^Ddxy`P?Q5PEtCz*_MY@-FCr@~^40RYfSy1)J}UjqW=0flpcJ&f>Kd zWkp1WIKWrGl7%-TN2X3TDThSyOO-!5ib7``@4{@BvB{}mR*%R!Y|8}03I)T$Pj*EE zFg(m&d!r-lHHwU)2wc8LrI7d?pV_~`dzE2n0l&=BP8}?`yNOkFy;~$gXq*`jx+g&} z<4)ZthZlqYq81ZgdnUm|#@V8<2npx3mHTgARqZNX9s%s9L-4_i#3Y1>%(2~pZ0%G> z#uVsxkmNwj_^{APCt`AJt@l!`{+f4|bRu2*5!dbwYS#O}*cL0O~ z$Ua+-=$qHVCc7vpU$)smHiY)^PEa7em1TJXgY3;of|4?W-Fgzt?%k{<+e*NcNf74n zf#^;VhK+eQ&OXQ})(P1!fNIUwCt~YtA&u?^xkHf09u~8zln8AR6de}K&m(a+5{RMq zLGwR{atx?<{Iqb~G!Lcpwm~Pvd%&|YU{2JxXoobiPSESN;qIs%ETF_k>MaS3oihq# zH59B9zi4;iI>rkoFNlWhg?PBih5J|YXj+KCkcG_jbIp?WwGdRiA%2^22MT|J?N|SQ z%~VK!Lz20>!{PmMQ2tUF5Po^A{Sh`8-eQM$-HOcpmwqcAWWTRFzV@(S6i?ts#*ON9 zy+ATpMiQolxFBmyPe}CQIr9LA`$`#}V2`TcA5(B5+0sfJ016Nk2HTQ|aLCoR z4fPN4hs5CxeBFLUWylIBMjJZ(o*nEP+wGz^IjQLX_?#VzCqOe9k^MA|CR- z3WdftO~6wCJiI%c{r3ORyr3QpTH0j}ofV-6F>xsLxbX(2-z9`h-_kDD9qnD?71YW^ zV;OqaO6CU0I1to`A4|EYh~NsVKPx5+=>;wSlUP6ok)h)qcrx`v|374e7$lQ%`^;+~ zlM6nNC$mUggj>_%{he2$CdIsm=>##(R6$oz?&IqMM4KU-g zIvpj_0*Fk4Ak?LasBFWr?Q2*Qy$cD#ME!?z1qfgfaEmW+-Nq9!u^83gDhA47Z`E$l z+Mrwvp1@z=E}4MA^5!s(0ECC;K`oZGuOT5C0U#Ntumoic5VJLiP@GsQB+a6cSGml% zitZY`2$@|ShnTBPM6{$u2BYo60RWAPaUo$J0h6_h7TSZF(gEBQ2Mo6t5!|8|udi{1 zp}U8LvfFw6&w9Qu)~0NLb?Ns;{E~jBKL9ns7SZte(2@p_bjdjWQaRg^2*|cFv>qaC z0~{(f>UIC9Wk6hQhs_-L$-`Z546@f6xUIq7rah8|U_Q-4`zTXojLPmVJi^G z94ZYh9dcmo6Ty+lxUpBlCMI=*^jwj?l32dUr} zeG)DSk%-`+%Qiis8+I)_7egwA9G6zRzykd0B(UXkD3xvRl_A>2SUhc2BQ~QYqi%3G zd>3W=C{e*ttar(1zLQly?uB&dTyTDCDoEm^1b-psI7SGzYZw%vG4|oYJNnw!r^$W= z5zhu^!i!jSJP{N^Io6@H2%`E23rdWL*VK82QBaJKt^vPOab~hijtI*(6ZS#@!(C{9 z=X_6UrU+P_6V%K2I#fxK2#GlD-HIwK>!1X#C1tos4;CdeV)+}HE7Syn3IjvYR=wt@ z>0;o}28!=#xIsT(f`Rdt8hi_#M3X`+&hcA+BN_?*9uJ3SklNQm0fM*Mlt>JiSJE*1qxtu{sSJtQttfWk zQ-Dn$#osGFyB34RM9nRwc_)=*7r1aUJk-qJpBfp7!knxs z^KKJHjxP>zZtx_k72z$AllLixHn$%bAHHxX-NKItO?^&Ro(P33#MFQ8ns8tZZBoax zma`9o!XyEj>&Ft1WH0O6?>-GfgySrH3x{3@h_|{}LPE&V%Q>I~h^Rw_UmD$T zi-^b;08WM#Fy_IF}5IXgPIjPd%8p5?4J}c$<-kI})ArO0E>jnICeF2H|dJsez(*FS|()^16 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 c702fd6e58..e7c7e3a21c 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 8776879308..0000000000 --- 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 8046a0c025..0000000000 --- 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 0000000000..0436ce8812 --- /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 0000000000..7644c96037 --- /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 0000000000..6399a0e6d6 --- /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 0000000000..c713f3963c --- /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 0000000000..bfed900bba --- /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 0000000000..3f6850e371 --- /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 0000000000..0ef0a129b0 --- /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 zqzmpj_%TT}#Z-G3$TCyIL?wGp7a77@hLn{-Y~nr88wKVozQd~uRMJTC4fFRF@LL=< zna-y)@54t+lh1%LFmy@2kjbwBk^~PS2$^oR2}a!I@QG2$`Dz!_a@B$5I>)wU{R$%g z092yj2-7MWYtxD_t=WK*R+MS&1d_CVg&?Fg(WWJtqo-ufb7EvFo|H;F<4&yKdQvyy zndijbw4N+9@k}_e7~G}oRzjDv4k}g3ZY6Yu22QXT)j=-mnV#c)v^DHGI#=lYy>XWQ zI~)Tm={bV`^`0Z-_Z%VHa|8~d)d*e9euSOKjreOi5#4j-{G*=ZT2NzM(e@k~rh5(z z(>;fV>7GNwbkCt-y64a^-E(M|?m09}_Z%9gdkzi%H}o7=Q`=R3&!O?&bkCu&-*agE zpYJ(Xy8ptSgX})obI>=d=Lo%z-Xai(oke~iUB;ELb$4V3=n@_7*jiNYWC)?|IB`CG z5}cUQ;FC*UV-YU3YMc`&C)xN2eB6a#l5{7phTHoQqfDVQP~~{VB00mJ6&FxTU|&+Y;p=6RnbyM;O|>AgkD zQ#C5`hLQ5LUXi8@+dA&tBD6fo+Zko~x$xGxT_L`bTWsps+*aH6way7VNw%vf=Ya0_ zHL!{v!Er}``%kfv)9GZV9MhdL_n%@N9rWdnQ@j?7zPhW9*PnnC@;gHD2A<-St~%bh z8GcYe0lMmV6a8&h9dFh_x~q=2XjCq3dAzkuD0NpIZ?6=jyXts$R~;YCi0rBh&{fCB zaQ|HPR&wc2Hd4auswrMBzepp#?5ZVQcGdB*I}ldrdKF6$Ua-~iDz!}LUwW1~-cVf% zAt%reYA-bfRE0@z_%rxh#0?p*ip=$fOc6I^tOqw_int+TJ+Kwv6n9%F8!`oJ9IslZ z7b;krcDo*zJ-iy7HrDyKqU5~Vbxgb0tG@-qZjXC)-iT{i4p21rWxNIkp#Ai?FJn>C z0P zMHmn6%VBeM+W$>5+d%{H zMrj>(7I0t2qG`pLu6d)+K=J5(nPTkASPU6v7IR<5c*wqt$9)-Zj812s_k0)7*gGVh zg$3M~@j7%^R}uGRya{PFE-S{qjKQ)mQ-BqGZ=x=qRWP_7ND*;qH4%3v+<`xh1%pX{ zWRZ4yQ~wP!c8}XL-ZY(p<8gb&qL9b!8H-$x+cVzLn$q*QJ>yN+DCu!~#-bvR+cOrG zVNkQt@n$eFY|nVyp7CbtcqxzDGZs~Q+@7(h-sAR+H%n7CdEB0{sLkW{j5k|{jrO=b zaP*AxEP2qT(NMKONi=pP`CP{{xh{9%W0{4(4e>t3m zWx0hfk;h!}D6%}hiIp~sLYlt`bG_q8Smb?#Th{+!UVt3N0hOrFyP?|yN%JJ}+r4;+_;5Xnk_;`c{W-1P<2fqOM z;if-0u$~N3-(Za6l4u5^K8S$bUGyHSPQ@h^mv| zI(#V>SJ^^^CQwLpn(&P2B0hso-FmTytWjU4zp`e8^|IZQ-I)hWzREdNu;;_5iLs(a+(WSRT-pqIn|hl|lN#saI{DRL+$(D{dMi9rr_ch1OA=7YV9Ij? ztL(GzO1V_Gz==m%4c$NuodHM<-9&M&2B;O?3JmVqzoT|PHDurqx7UlRZ)UE(&zNgA zIqDWB_$m>ap1nLzR(lkbCq?#Iwpn;nY)8WZ>tAp__o9rbobYV0hqaRX(si6h?;(19u|@L$dGe%VIPz{398a83t{Z z(W~!dF&Y^Dp^Vs3bQuO~Eu)tv=Ob%*%-Wt02@hPMGP?!I)ov5_cFW^07m`O>Jp;o( zR2b^{0mI;+W%LG*Y50r=hJPfZe#79emeHGo3NjfD4F5<*?j~JODf3soz9fs$!0?Y` z)MgmWvyA@4H}?Fj+3=Yr{397z2CFQi*WSotG%)-l8C_%;?6r*EKB6#FqJiNb$*9jT z_?~5SXjc}af#Dy?=#XLHZq`aye||EH(ZKMJWK?e$bXrD-%g`qH${ra0VT_u0o5;U5 ze^-M=3)<;QX?U(e+t7l}RipcWMqF(vU%beYMv9qloAW!C2O0`V_ zqr6#c2C;$mMRaWe=P&39T)lyI0a{EhgF0Kaz*k?S|Ngxgg!@wX`mZm8{yR3%^x9{* zWf?jT*)0Pr>O5H9{@0x|Ocg;fCyJn&6U9-@DU9-@DU9(V&x*NRHyJn%0vO^cF zGP`D>0lQ|Q0lQ|Q0lQ|Q0lQ|Q0lQ|Q0lQ|Q0lQ|QIc66RyJj(Nm4(b!S?E5hB+jj} z(EVCFPQ0`k=mD)9H_olHP{vl-8br|BFWw#)BW*f&msn-QrG1DmmqEq1P_K06$V%sc zWjij=Mf3t4SLIxPRnDz{6%6t^LauC}#km>d+6}Y>R^?o~ffnZmnrk=E;@m)U?FL$c zLoe5EpvAd?=GqOkI5*JT^r~E(8)$BN11*6?8Q0%H^MXOWfhJkvsvO1h_{9x0@y*&m zb7cc9=|(FKBRsLyiB^&YmI4x-zC^QE<)W!45SUCxhp$6>lFwDSXcd|3Rk?hw%2^Mt z%H_X`2Euw^vA`+lwoq2(5^J1jwN5XTSetgcajwcmvsdM!weKSBh|83dozbZ)F-MAX zAt!1Va^hUbu_zShLXJgloC`ToyO0w<4SitLF66|ykYiC%oC`S?l_j{46P>}tu#gky zLQd2!O+{=$&h+X;>AXWG&nXK5D88#<19;>5d{@$#O>>MR|)cftQ`O@cg{)3slw!<~!~tG- zOKyu8d$rnzW@4U+X@_CAfr4*o4d#J$wTjM#b5Yu2rmM)K>R3QoBUyDELVF2eqpP|A zt~d@cWjUpX@a}omPI{0IvOLx>l{_?dwdas_E#Y?v z*{Etb6OCVODT&uH^eMm!Hpgl`VL2*@I3{46S-#jJ7j>$Z`xZKIE8#-un^pCB z{0j5yT@cs5&aapF^;>>DjjzfS^f7`ZE~PyJtVgi44gX$*svUd(3;g@C_|NhAS0=Ic z(SU~Qd^WGaJ%_fJqw0NvYTN)ST8@BwpzLxi1qv97p+)UU2-fgbz>2S=VeR#4=M!gu zkUv?g3BQH$O8Mq>sA|GyUKb#$^#yG5?j%6f7QkMv@iNA{U@au)GE?JK8F2TG;tfmD zxCwE&tVezFJP>YJ1}3r$wd+K{Nz0LZie_@*g@B`00LsekMQl)i1z7h}MPjf1XMPkG*?}4_Spz7*Z z;j3;b66r;ldYZ2z58Dj*7X(!9g+Tim%F@2p=&UuBsF8HF7OeL;k<=3GJA7 zf&NPkyvJnD)f5qT8l)LI3t##uR>WnwM%>fr&EsAXmqi(I8A%4UG=tn-KtcGPPqIf~ zT@m*(I@w*ea!wn*{B}fEs+Duv@D&97x1QkTW+t zdG$Hgpplo4Q!=r}ab#YVl;ae!rc21bs?6inXNyu!;4cs));yQVBx9{Fq?2jON~YZ; zlg}H_v5|X(7Y+kFk1WMTeTA{xVq+GeA@g_rzZ9o$=Wtn%F*_pUh!crbDLdPa?r;Zn)BQCWOaVe}`Z3rCATpaNlJPJZy`%@q+ zjGvApjDfvwyHgc@QT_%B1Bj{$^ML|| zSK>QVcnIIFF2u4Zna@}$WD@0w-|~{60`N=rs+z~} zS4vvdP&^ojw@C;zD$AFFrU`44gEN+Lrq`d5N|&TUc7ZCM?x4VdZscFpaGp`b-$lpN zjs(H?@l|YvD&a<#$l;XcXrf>#3a;4qFZzNcq-MiA$gkoR%q+81!pQV08}u@`mJNOb z-}pq_C*de9Vv*FS;D$6qP3r+;XslK-!2-SaZTpy~E@qhH+>9=ey=XZvma2S3ckMcK z#tRuKU(r^t0WO!JdA>~lO4lR&aY~!7c;NY)z?HX>zEHyXBLPF#aRXN4t-zIzA3m}d z;p;I5*1^97O!01>j#DjZR-H-dB5ph6iEV(540~9sX9>Lfjqs^UN#r=EfcT3bl( za%>|80Y@`Qv6dBpdgHK$bl+m=xx()rz&KX!Q<#@K)fia`z1~%bxU>)5>lb}rnCa>7 zj}R%N&aqoCh{X74xRk+X z=)4To z4ZRT81%qnD-NcsbtMIMHBE@D_=JyCN@Y=%63_BZN4F?cm3L-SJSyZ2-sWr*&@h-M> zt3i`GL=}MFWo+$kWh|$e=h`pKMGWj99Ixnwu^3xjp0jD$1qV*5*Q;Gr(J7*$exsUt zQsMJmFyc!QRkF*ykScP{!I(`ncB)pw!L6;LF$*`eipDHliQ>GP7Bo?{8Lktq66VfW zu;MEfx;Q7WM!f(po!A5>R&lP?_#~a!0j=>PsPP^IQn8blfZe?S4Q)ku6B!Jth-p;p zi|~cM;eCejKA!riJP+QY9^N2?dJbFl6g@>zYs7lh=Me`-;7~Bqrj(#i#OO2Hs5-TT z5$;f(CQscr=)4_?B!25LGp8Z^OKhB8hnLRVmzcLLAA_L6{Z6(*-vVsqnMHM1+PK7= z?xs0CM`8$a55*s{9p!&7`SvmEJ%A&mGuX!zLwow(I=88hV%Y zup@TBXrV#@V#{BqWHnzHZp*eNmgK?}<)B~mt0S_JtSNktf;X8{FS|crOitnG< z*4AlbsrE7S5f2g#;?3t&ssuBQE8r^M3CDGCw0<1Put{huC8M{Q%%1?Ac6#=Tr}khS z0Nes*EZc9hY;Q*Frk&KnqtwDXfTJ$D4laE9%-?QAXxz!X|F9X}O>dL@hpc7aJ0D*u zrwj~HtUn@$_vqy`bi(g4CbSf%EM7kf1-I@K@E<)7*+Ah`BcEDO&E{AKcfq|}!@1qMEK?%dU3+lZ=62lWn`tLU&$LU~E zA*UWfVx(`vuR@MJgcQRjUx4m`jZ%)H&0Pp6Nq<%+-Di`IxYUBQ2CM^lyMSCLwghhR zWV<1rNhh`yZuycBa*~i3Zbrd9HuKWO*vv~8W4S3AGMkc;*WcK<@8cyGv`(t-arm%( zI%}BDmvh~t7**fRGEWSJISLOq zgwQlQIXoSnGqQ(HePwGjoje_$)4^18xDOTKU05eaU*viW&S=sdzCuCC+zxQ7=%sgN zV%(Xr9^9FUaXHm`aAziteIy-0c4oXaj$8c_;$x@4Tbp*fxm-bTYi3D^=j8Cbv|IZo z)9!Wa>tHFlYv{pn@S`pP+5yk_GsMd-w9^g?O<9TVM(QVVH&EqAeKUfLb~Q>aLv zmyYASw8fBNW}N4xjfb3<&gFS&cZ^PFUheZ!*V-xSXYearQHdSfww#d zv@DME(gw?UX%FY6-HEz*RynTwETwR1HLm**+&Mfi?M^xq9_E#o9G)F^PdN$6n`LS36CS`IG2H7K2DxoSB#DIr z1IrS;t{N*cFqPnS)mX8C^$A{Ajg=VKmf&^OSgC;>30_x?l^NKXP>?G&*ua?yURR9` zF>qdj*HvTX1};qSx@xRaeG>8qs=5-qt{O|JO9ZY;@VaVjxXDp(g4b1JwFYiZd}S_R zz4|277pU5nxNjz4lRjOG>#7M}SB*8xZB|}aP4K#EtVQj?A8x!ScwIF%QhiqNMJmDT zsni>0{#^trMI{#B%bv2OsOplk2Ln`>35w-^$(Xoi&x-^#pvSSttb#LUlGXTW*e(PK46k)<#h_BTVWvEJdcvHumvLo`l%uJfT$wQE=q$UQOqdPwa%IA7P}0NPH0NGP zv&_kn33Cp&Dx4mBo(sbgxPf| zaE?rvbMAoCbv*=?$c#8g1;+rCvL1^7PKiux;lCj5&-z_9r~%&?m&t59N0EE*Y?9a< z4e@ylmRWUs1r^{?>$V}zWFCNioe6BYA|S( zC(cxgD*gtCB{JAeu}@J8Qj-}~!d^$%FbqP6lkm7tVm{Dj_)If@Yrt%XY*aMU8l9@% zGDH!N8hYG;NEooG9`YP56{O!pz4RsqVJr@kFM~~r8}(`wlNz)OGGU}NivDWBFyvBN z>f_+g1KI*M639-lz-s_&UB)}MZh6Yzy^lZ9W?O=oA^T@;+Z7FbXKPJIg-In6TEXTLojB(2)`GKWGd4| z`aAffWNI%qHu+)%%Ir0Vbe{oC$<#jQTEO1}R_&!)A&Ag#`xM!_F74WNXTd#KruI7d z-~))1VS*!W1h%rgxtCG#s>dZb6%GG}yYO`@0JOA~S{kIB&kBWehxuE3Dc%H$LBb^{ zhBCU&fKMY0z15JMWB#i0K}W&6u>xPG8^4VuKoMe5kzYOIi(tC>}= z4M^n-VkN2SWr(RLP79~vXL<;Y1{>xpo%~>#Yif0>A!vY0rGiLJ8-huRltM-gtyY&a zFH;qbVV=puYqx1;$3Rxjc0_+iQQmjqllmlM95o9xLoY`l@_7_X`*r|b10}2-(|%ns z1pXedM$Vs4V^V9;p$&sh1l&&`avseV;g^6lV%XD}ND?!ARviJ;31CeE&I4#&Olf9p z2Vro}?K^62NW(`F+Qg#ROAQ_~7a1A!E?`w^Fti$hZvF;}wj>;lSAmqqHg5<>b0(1V zXMj#KJ$H+z_CWN0z+sriok8I?Bc|!OSQOHqc}|jAYv&v$dO3STrP?`%iC$p<=P=RT z8Wf<N$~Dxt&GA6FhWfTS9w^sP-!{hs?;t~&(KP%XrxWohH=L)@frvwj_UoF_& zHpc_y8t>J&&GA6F#^$y;9w^t?+&0Gp<+Qf+J0*CaoYHgP7yUjQc%b|_NnhS6*$HRt zMtI9@bJrZcbnl~fZ1Ub6hS| zCsN)?+#B+aTZFHZmw-J7f1f5Y7s5kcis%#_=6W-_flgy2>a;uLEhp(xF5K`KTwpg7UiK(rL|n!* zx8FI<&#i8RN1{HrZes{U+;_{Zci;u_lbki@j-Vp#zFTgCMqYAdkCWSYq!8+Tx7;Re z^m^aTqLkiu%WW}qwXNBaxTW*JzOYghoj%Osh@0L43Q|f)U+=)#RruW@)Cyf-ueK%?&;!;@s zAdc+2pVy+1 ze%vOnHB7Em`o?@-`wLnKdE6#%6pJ_gxJ}+@MzoLH68hn!qW$56pM zl`ARou6*8D&YKd+#PG9W)CFA4NmP+sujUkRHOG2zHK%~9Io1OU2u@+Qg|eEHT!Xi( zb$&w0wQ0A${hpAuXemgp<|Jxeq?zbV)K5U4Et_}=d;2}f4m;7n09qSYb1c%g-z_RD zq+KS&`1Gs91zgQB9n$n7>)`~D5T+Pvn zFdpDhUBK0xgzB{Z*gq#};RJA3!nv-bnl+1SUrJ}?r zt;5bFS92_yR*2P{#OOIF9=)1Vh}9g6A;Zi()!(eosu-NZ)?9NZ)?9s4U4t(}@{O%-()a*hABD``sda z``sda`#mvBr=V}YTcmHlC+wkVx&5BtaWbT!Z@(wzXq0_uIx+WT>Xj>4iBlFqpdz{b zuJ_J^xmUvn6(X3&E|SgZy0jZ_Q#rweZZFN=c`&&Y^u=<0I%Ka;{~TT=yl@?wt2hQK z;e~6s#h=%w;ihCL5Hc(M6bw>zV3>!}ao$1XG7O2wDY`)7V6YmS1Ca;GPaFiMn$8;D zgBLGe>I9AwUd3{~I%Ka`FF>%C;YyKVNcs1{uKXc>-Al%pV!w<2N;POvZl{;yoMrxE znteSu@DAn(%AroIT!%A(Bbbz0FcgFRMoBfL&Y|#)TKJtN_FZJfXHnUx`cxm&hyrwpTw^VsHNcTd{I1| z)6CyHKt%sK*;c$>@*cki6RxR@bc4h>61ZBXt2fG!Zy7KY-GK&ngsNwL{!OVa!|-Xc zNh-48)0le5nbagh{!ED3Ve%M&W!GT_f>a7f_!EMq_~jrCTd&6s4-dj?cnM(5Jg5yn zw5tY_)6?*wRMX*(=|+II)Owhry`j_rBh%OJBpv#h&tT#TT76slbw&3K_~~rFF4^8q zj2*+*6;t>H5!-fPN;u{QV4U@QU9oB04phyyQN1bnyTJ7qF!8?#_1}Tpx>zhyp?z# z8NMg!-v!(bj(zxjn6My__P}?y)x`XHsM;z#icMu)bOy2(Z}3 z-GXqgm;?h9vX@Y7ClsK8ehIjK0|gBSIDnbE7lO!v^_;+rC`IYt-Y(}|BY_UY=gHVn zedW+?9vF%B<^^bR7b2oFsvjX0Age;b50Uii#k$HRUzdLtiH&Ds8kc;IvRO19sD8B{ zdOAa;L^btc;8Dp6^b<&cTg8n57JS|3;oS@GeUu1O^X33cd^WtD;ji6;Z+v?C^xtY! z@{uCT7ZA=$qtTy%svwC*HGN>mZP?L)K|!3TzZD2=f<~tS;ZxHO8XQegH6jJJPq_l} z%Q9pRkL)eLn1Y{(J0D8Sr5VkH)H0w_&KOlfQ@c~8j0vqbf4778Hs%h3-6e+c3{xAS zZd(NUDN6Mk!k;}L?9oJE^&%goAw@b_>czeAV_P>_vHaJ40V>+U=#!=G3t%~=j(3iL zmw?GPhd(MV2YpjR#aH_{ z9ZYi`y?XIGrIf;{*$G&U%JV73q2+hLPG{>9NqP)sk&>6*`$&yu#{9*P-i}47WaOov zd@omX(!S%F+O=QN@oqJL)ipL{XF?mZv_^6C)o)6B@qSId5b55C4P<>P`;}`EEj4(~{74NX!ip)x%-_C;AY&d>b0`)g=BJ;6!fgsns&U+~Z7q zk}8!zyeQrBd>7DK3RVJhY?;DT*HJ%n0Gm+*;_`*} z7(194J!2f2HmJ{1-(!>&OOxzpmY`Tbj^6t$;Z3jU^g2i{^THlTkJtr-;+*_4)EgWoH70l}0tPR2f+?ms7z5c9eV_*pc&DgY zEV!FwICQ{d`WxRtI6gUF!v&^d*h%J)lHMAKr-aMX>g5*^>v=65q=_7dQs z8Ud3J0Gz{zOd#G;f-MGolK^Yp60!h!YbHBEe*_w}H|02wB6~w&_n&8MRwQv8{Vm7o z91AJ>L82bG8bsyu0Ly1ka}tsohLHR2&JH<}app1PjtqK7ym!<4TbbSsY9WeAy`~Nr zeQ*ChxZ`s!lK*K5@-JP?VGcN(9)YsN=nhlTEreophiL{65#B;(hpEcmZv)D(_b>+> z`vF^|p?aO6t&ak3WvL6i9gu^}H^{dEk~B*pyvah?1UTv-1iu#2RB=Qj9h@`D8IBeX zer%{c@q3basA+>g=>~~kO)p?Il|DpF@im>#5z3>e_bRp1WVqo8M8>D#yRcByd_9KW zC*!(b!B3CtG_Ly|u#D?8z809B_m?G!vd7S0h@LdwOf2I#jjtz`v7E*a0qe2cR}{x` zGa->4%Y9X{um)Jha`!2Y<^Dp5R{MUHf>BQW0g#l@12VmM5Liz)H2yQOjPxE<9O;et zp&jXcP3e)|q3xskprbJI%<co?18|Eaa)klhVu|cF;5V>0?+SK% zn64(!Uj>|pkc6wZR4#=cxuuePQj&AF9@Kw(Ye0BDszI=^13tlH@HG?vL;OOa;l=j0 zcFfrW&Tha6e<)Ksv3L;S4`o^uii9IXp9UG$$|AqXKsXqoPnt#Dz{O0frJh6l~Ud+3b2?~<94AC=9KeVUvW zZa#QCpcC=bk4cX;a30W!i4+)^^msrgQfOeA#{)W%A_G$%59maS4XpQg zKqpdSV4KGSI+0QXJ3JoH!KD+OP^YJ=00$d5)8hf1$PfePc|4#KDK~JTch*$EN>zpu z4ODe`JfIUvsY-#XJRZ=A3^zII^>{!hQfuI5j|X%j^{QVoxXt4Mok)}V1|auoJRZ=A zG%K{3z~?KE2XrDWsv5kxPvh}`PGqDSE%+kk@qkWbqIy~AcPozvbRyFf%bEvtJRZ=A z9BuGk0_TJ z?*1%*ip0{*;{lyWUydBmiQGr+M0h|aa=%s-v`;lYp!MWNI3A7c*9D&hqu+v2+zmo| zL9$~OjjhMsUm{F=XItMwnkL_qhu!gK5p(27jhlNh2=GLJo5w7`q7pcBX54N92j3F9 z#LYUIn_LL`q`H=kS&n3LU_IQ9wuKjHaDhdI>3AI;`773;9S+liN1)yo6mn!6xgJSk zWV^ixJ-N$_Ek+pfM45`&Sma#J%qvyQ#vHS=5(kW_zc!cOdj|Q)?WgeNHR2hEXvO17D1?rUV4kbq;4?I0l~6b_&VND; z3_!CN{~YvhQ8La0pB9xxIfe{1ip+B0(>;uw7!TPZa35Kc_K+agz*56YL{CCA>#p|tL62PP_xc*eVhkALoFIL#ktNBYSXAK z#ucGZ``;zA9WiVXghpu{cE&g)wrE-uTLhue*Fr^liy(?E0*fKT%qX`AjE8Iy#5w#9 zjnV1Mi$C85G&Tq`4pc3Saf=|-p~JddZV`kgq}8}Aiout`vPBTX7C~sDE}m8B!Pvos zU0O}p-3hlG_zX=t5+3Hjr>7ob&0L_qjRb9VNV00-^8{)a{d035fI5Lv9EBQ_`wF9+ z@O^}QoA9cHIl_1hk^jFeH||hb&HFoYjE&P8BGy z6112R_lh)OcMIHM_aJBr=qyylOsGa#X}A0ozW6)^`afb2prx)Ri;X`4yq{@QQ|fmJ zMQVW`M?{^cYD(~X!d&tec=XS(ld#HBwd5JZVqNkXGO8utA0aF`q07RdPeE)|(;xpnrq(0v7@1?^+aoI1BX}K!YORIhg zu(Y=uqsLxW@3#RHoAIi^Mk?rzUqTwO0fBE2ioOJ1^(%~-#0CVGiQ2`P6qSo}Yg)ZNV+dtwO9{N`=Dcf zil7>PPC#9kapM17P_Ih=s05onwxJw8{?nf$szS*Gs`N3Ra7v93sE_<ACED6};2O zeDHHbQv{o1KK}zhM|8BLFUNegp#H|DKyMLuC!Kq!LQZ>f8g~Q7_u`BHyetibDoGZmoacknR6bCLb;stM4XEy%+2MT$D*VjsrtWs#Db8c1!aWH>AEOMrz%KRp`36PX2$XR*=TK>Aj74tx$6UOUi|^3#tP z*O8~lB&YAnen+0@9t3R$%9kAofxibV;fd5Xa-08qH07xpe9gmGSq;-^-vGJFCWv#1 zPNZ0!LRhT^qk-CKQnqc;Mc_eyEkPA?bpT!>fuQIgtONot0Tc;p80%r6(w#`Wv=3ie zf?8jKS|fqJQ9p>o_|WCF45bF?t6>J{t6>^A#}&gUowG3(cJ(y>S%}YRe#*3;U(HpL zv+G8Ha9;{vnI|W+f3q$4&wu32{H)t_@RVtHa1Wgy{8_hb`?GIUZiL3{86)G?59sm;*Cm{e)_~D-l*IU z-sz?kZ&dzJ@PFSMm6SexViIpu{#epSQ##;{N~*-XQK_|K->B5ev2RprW$@?R&PIfY z`vtI<*C?4UdF6(_v=8z9o%Kbdrf&nDh6n+D8?b{;eH&2PWPKZuQSd6I{#iG9l`{Ra zZhVz8{j+ZJDrNd--Q-ou^v}Aq(?9DbuTn-vX}#R;%Bz(A&${td%8Z|N z`{1jT6wl+=hrddxf7UIjZdr^9U!!d8z0K6(*mF1-!nRL#PpauW30?&lEXvEA>XZU( zt!n3j!hWWr_z#+ZFLmPJqw!}S{01Kj z#|v-_IR%cX&-1bX94qKp1INX5@Mj3V35QdD4#l1?6$-!V2Qe|2J^oeXjn4ue&l16D zpXW$)nxe?TZ6uQXooe%Us?MLIPUT}uCFnCwm)s$n+JS6p2XeQFxvN|QE<@jg6hq&{ z7dCZ$w^K$r4w!8I;8}_QkzaryImjNH`}+X~*TC^A9W8KFy$F(Va6CgtCmeJC2*)fq zK0(KPI39#!7*#e5gLZzBwaC`$cMv4W52h%Amk=OR9A~#Tlf)uc^OErA!y4 z95kd$|G*%}xeX*&VYs4A>S*d|>dSzzg`=sNTL7wI)oKROi$FEZ^IoPjTOs0L-kz&` z1%lm7>8`<7VXDq#@jLLBEY5t@WN{50%;M#6NEUx;B-)EeYTa+3I6nhF2a(R=_kJhh zI)_NL+NVhUN&IUmR3|10YPJZ}1Mduhb|XY|p8sbf&`vt2^Uu>kfxZKW2z0PtC)H1O zt9b*(PcCr?VWRU3Fb?6T4Lxe6&KHsbpQO5gT5ngqM$9N;L5ePbg2o+wy#Q;(sU6f+V9@mt|H{qX={R0S$eU_l#@2zQpZ(<^(%E-jWL_Nk(dW$axSJG4s6KL-Qj5Gw znY@Ld451thZA7Sh-!wvv{)-XnWI8C+IdDjs9C%LHI`a@otqy>tFVrI-(n5Xec}=yK zR2lWadrSQ5d4y&ZhDz94df#p>6{)|ooVKXocfnOR7n^N!v6=cWM&qCzXlFLF-6-CG z>am&aWAO$CN=vyIerJ)sWHJ22l`6q@;K#)eEsb`d=(GbZjdq}=IbYgQ)YK~|%P*vj z>;I$9%*9%x&WXsx>|AR%PgBIh@RA3p)YG(^H~$JK8=6m(aM|0ist3sMX$p9Na99JW<7pAF_Xb$+<$uah$zmw=P6>?1-c%m=>|}IEJd9R2j|WWu&kI zwIXcCgC8Q$UWAB1Pk~$n+U^>GzCs5DdI=5@sP7dmkkiJbuE`SU2T?1KHH0owWmL(c zmXzOF`Zayis=$MXfqGPA;mQEJ*~ZYh@{p%Ms{fK zGi=B9#0LfH8f^s1!zEb}=rKBIH}BIyfyN9r0`=;i!RbdNwfa=DOAB->h;%Kt8tfcH zv3-hHNnr%q&9LnWn8ZLs?nj6i^4K9ppl9fyK&spbR1Jq{=ws~6@M#;%q+ZSv=qeCt zf%@LmRK29i(9o|*!A2SW(sb6~O=Z97oL`CL*mS-?2b<3C4K?ZRMBl+ravV5*YALgk zRz!6QTt&Jm=tKDFBGsiAXHl(7Qynx^dr5WWJy}%ukxH7*YtYT`bBI(KP3QZhkWU$V zk~UM}E<(G*&&*-USy70FkKM)}0Hh;XF&qwdD>JI#U?=k!9qe+h#}4^mc0ikJk!f}@ zchJFZrnyd;HX4&jwS9m72McdELZt962CZ0Adp#U1yaja7nr?!lhU4&lvRS>CY|_em z9)V6RLp#SKG{bsYM@WvOe)TeJ#}Ne|6ksnxM1XA|7XejWK zWTiK~8C)eaIT4|k-jfyjxpXLhX-!@Ecvk4k3>9VVWoU*~%)pHa1aX*ukU<~lE|Qas zo_2#$^z;ilsHb=7U_p&+HFD1bv066^X5?$*Tm$QaRNeN(y=ksD_j4Llka*YY{}h4{+#R{Q3gE3R6cw1Dr`8Jqr2dO!{&?|b2fjB0lq^L~AEpwWTFEA*`|1a>IN4+|cbt)|jSfn7 z0v(j>VmR>e*q2s;pLsl47L+*n7aVg+8P?48)$rw9q*AJx>#N}_G;qEO;|Ms9RHm0y zk6ogdR1ct==jXKP`tMyMLAWo4um6@MRk<%5dX%}#UR~8I#`ZVRKY=XC8f(}yOOX0j zdN})cfWq0o0~F5w9iVXb?*N6fe+MX>{X0P6?B4+jXa5dRIQw^i{^@oV7a9X*jTPHf zPYXH#q8SqZ8v0}UGPlEsZwyUHl z?XC3i9QB5zk2ThaI~VzkxL3eKcB%&a5;}Dxchkf7Yjx?n>EQ>ow)EZf@P4f6vjFqMbsm{B>PNZ+dg#5aT*DZboE8it^DN+Cbn9T^D?>ZRBS-vxCNDfguFK`&R! z-IH}n`f9nmP$PY{+&x7jeYM;@jgjota`$u{rmvQ}i!|cZa&hr$xqC(pA|yPw`&;;n ztL5$zO~tF_)~&CWyGun}d$rtMb`@jJb5~x9w!!-@+A4PyodF#Gt0U_k&B^t?-VL-` zBhRbp@=?o1|!aOrks25R#zAljhA zI^=4sd#2{n=`CXl8?O{OXF?OqHhyLV-+|j1wCQm;^A+yD^n<2gE{=yyRm`{whLN*^ zS-wXgNRMe59ts{#;T_15nx;OF`1ziip(@Zp7R|*8S=(OV*Fe%BR5Z;8u2Y!56p?4C zR}i^aeGeH?b8&Ocw2Xy$3X-66LreS}a4nGo3v(3PBz2#ids<0#|4x|6&=bc zJCb6}Q8bVh#P^Z;97R6&01uK!i;k7>!O1R!X}3Cc5W1jah3g=6q1pwVkpF7O4WT+BgHDIM1?3l>uD?R3XQh&QO)WGminDKshwt za4e{Cwn(GEd>{z5ScG_J0nn0mM|DZEzZHnXTpI2<5uAoHU5$@C3DoPlQ5CyIi-V>v<;jg7I9X@}lv4Jy!w1MN7 zSsPd!qz#N%Zf#((7(Q&EbOu&c77O!x89JB}E)G(Vz@FqFlzO)WmgC-(c8y&Dt(=*L zR{~ZZWGo$AAuZ67U>qENi?E6xNr43SA&U(wfv+Q8sxuZxQp7C(4P{2*T-{L1Gk-u@D&pN9pb>!G@iMJN%7Ts9X?_$!liUq zifSs>0ZZwwl=ugL%hxT(0`)3U&WY=R7sIeM%-w+1qX@O|a_~0H9{8!6HyKy0H{_zno#IgrecvUVwroV=%N=#Mpq@=kxAp*tE7r1% zekI=b!n^hmJO>xk^VuM6J&2=?Ada{k4Mkj*^$<0N;e`P)_MOJak42-!&*;s{c@V2L z+Sv00H1_A0Cj^`5TLPt>}+f71p)R! zF!o_z>4r!J!W~y9hb1VX4NbDqDiYE+5S4~kER@Hehkg_lp+rjs%hxWc1lqagW401# zT;a0BwYzFN%10_iX@K4GK4Pg9rIOe?z|?w~u>aEzZ2%he?gXt=m_ZU+_HkgTFdA2$ z&$uYS!NTfgz>3G1$H79L_X*&8m`RNT7XW|B$G-<=l^P<{^FK-IE>LTH+J(S;|H$C# zi+~^Y!$TJXOO?~~?x(;FHKJV9f953!Ehcq^aKDYX!pEPu6jy;ZNA2fc7qgc zyhgeO7%og6M2KzyhD*#Ddr-wUGQmTEg7M1Xrz!Hk!r@fSu|KFf`!j#L4>a=R|@o zNbq%u^$4gm7mY_=4Z2#V(^lH21Ae8gQ@1eUYigdUnireDUqPflf^mH}hBAjalzD}0 zhNwBDe>b4$wc8L+n64!mbB%Heu%M^w^*e!!1CH}N{Pe&@<8!Yy_4Xa9x061NVCl90 zCc^I{mV(uI+jYP)4$@d%54@i;XuKb|;#R8v@6wFS{|xZi4A=MtV(AIq6aMGjfD%XL zeqYcan7?-M*T=N$7EsWT9qBZG22{z3iBdt%J}Nmav2IREjJuqA3IwT@${R&dn;Cda zP!!c^6l9k{R)XZBw4!DQsi<4vrxm5~w}53tH(Pr1=NK%Cnk_A{dlRrIO5;XgXN11V z!YQp%Be+D9bAS4$j`sdaz;NKbFl=Xd~8@_)qzFpS$ zane3-eD_-4E9m>2@!e^BswV3^*9f_TNqoZi_MdNjhp@%nXIWmJ!SV|>;WDS8jvODo)+BtTq2e^-hn5QB zJx!`%`!!YnR!!9~oI;PH2|(x-9^AyxN0_#pNEb4=W~n9fQQ*Rh503e$PQ(Zso z>w7n^ZC$!)OY72&o7cCT@b8JVX^S)C*b`Gno{$>Z(mu9je0xh<%NR%PRQXOaC+H4w zYurNgjt-v2smUvh2lIyH<>UC$i8)Ek!2;DzJU$to7;2O_!Mq9aiE%DRhsLX*OP~P4 zu0v-ToH?2vV-XV($1>amcwm)}e;5~Ui3juIaYP9-c05<}4bLjEr(EA>al*lFl{dc5u%h$|`fF3cfwvZI z6)=)~{CZVq4msj#iX{)A!XE8MAe=rr9iMPUg=#N6F=t`?6sdYM!%jO`%%U$j(%*4r zQ!GD$W5|)Bk-?k{elVuFK6IR8<7h(gqgvp2TpaC(*RvIR9 zg2@AD2p1p`Q>8HSGAWv{lQL2eMV_3_p}>V{h>V>=sVK&&T2kzd_}s8omdOhv!*o(D!ZW^=10*j3=a6%K2v+>R$H3(jE1t> zHk38KrAQlN8_HVomr9^BUgr~Pk9yxD-B6Cm^0PW?$nvFyHQI)p}@iZCd$Lz_H1v`L^>N%#63 z2$|+m210&u*WqB6?KTRKbwfo>6lPLoHqAxZ$}XmEq%(k|CBC9)4y8W)-=eqDjNUk7 z0EyvarbY|0HCmY2hZp%}U4=86schc0z6sDG zGFquj+pEu@LK-7%1#Yl4yfL#UW)*45@IXi2?2j~BjDV;-l(#j55Z!j0pVI$`N&0oz z&T>#(td*Xv!@0H&=Ve+PXEqsiIGJg2`5$I+87Asm94fUn0No@O`9+V}kI@_?l9`W9 z5EYq*hOX5{w$|vIXgs^vt(k%q3t>pMNtOEvF|@)j6U>OTK@HVyUMjnthH2_{dbn+x zVUF6T+PD8q%fbZ~Ei?pymNU%}DcAWUIvQ2Iu1X`w6LXpjDG{~Nmy(>Ctc}9-^cb?m zX9lzLssBgp>_5?E7}G?(!9j(A_LX6K1(~f?p>3^-K4=}qeyQuO!7zb6`NY}|%V=PD z!-skwtkpjxU7*tZ`OOs?Jh4nu!LgkuC2SxYJTpI{Z4EVrXhM-1ry;}q^fMbmSe3PT z#;r1(jS*KHRtBQU({m&}gurw7+7LggiA!f^KvjXYr4xl+`Awe5h}6a=A5gMpLfh%K zNP~e!FvI3(p>4iB(zx4wh>@4AHlzH8b2JI4W;+=ili`7;Gh^(fO&U)_*}65wV~YQ5 zV&ad4LV5rc&a}B4+cwew&1#WZE22*{(G2>Azg>^@%-5BH0{N>_`lHZ-$h)c7UMn0oRdbC%4uw$3(* zn0jc#$nF#{`^c;@4YtN)b?&BXmn8|Aus3JgEj#zL;SaQTYtwkF$+ydooG{x$WeNZP zVYtraPs#AW;dPxFh;>cj14H*){AZOy)w z4(LGY{LIsu?cmeI_UFim=Jz@oljKbAM#IZ=3RvK@S|Mw;(?&^zV!bS8Gc+~TBr6>| zK$VQqk{O?(L1k#QZK)BW?bag?nKRq&V2rOyU;42bO}Q-ejZ4=mfgL`?{5g|YmN~V} zrAtO8_A;9`nSn5qGO`MIgzc0jXSM~}bg;^4*U7V4cBZ9}ig2V4vF>T|PThh3R3H9( z$5*!L4%w#LpN?nu0ujHGu@`XtxxDOHU_$P9WN|x%w^MQy6(i;9t|QO3GC0ZU*HY3meq@qDyx+*n)k{7gf8K44hVFMh&&UE>S1(zBK>{5p`SHAsc!cfB7} zV(lTLk0#SHKMjmcZC%6YG%X~!eCUwJ7W)5ZU5gdnv!V|i)>sLkIOCM|B$=stUo$j0 z)2lG!16P7*fmEI)q4F{rWsVfM0+i9>VdBW~cD5>gR{y|UZ4UnRI<%ZWXqZ;5|Gp`B zrV6rknW2D!41GXvg<2n&Ecq>Eb$>mlr<^a+L56|>Kx0@+=X1Uug*mP~Uy=S(SgiEatG3m~> zHtBwC=Vhnfwzjc*wc12p*}Z01p-hARX~SpB`(JNKx?ujJ>$3l7pqJhQx63!Ewtl-> zm|2&(&Pdgm4#%&NS;Gkq^b8e^#Wrz>Bu$*rr-6fvu>#68Ty)Ja#Qf;#xF3lu?P88$ znK2!g^+#*=nYNSi>xf=`WD%QWhsSh@lgAA$gopa@2q5#0ItjH*W61 zkqyRnqJitoxujsV3WUHFUVk0KAk0t7)G>ju_G`m|Pw|VXW40X8+ICDpAz%-7Z2}H| zl;wj$E!nuCds*w|4I9>OYMs-we#^GjZ5?A5j~(6GyJqF4*44|_EN*WZ+tRkUePnCT z`lV~PEL-lhuHCS-du{8M%{^;dSK^e(=$26}ZLLds*0;8_wBq;)Jq?%UE$i2;->`Lk z^IEcQUb%ittEL8J`k&$3y0o!ThyF`aNK4CuGB$}NJ)1Y_Q!we^e?evpujUm!+mBjcfRo&~?cgx|OC0o0l*8g}BK+904<80Wta&*m+gmoLWO^(z;5ukBg6e%fQ)n)TqTX7BAhfenrnpO$7SxjdX*}q$OK=)^2X@Sud7rIccU~rX$$2aAprr4?vhS zpPu!bwR_3>&A5*PHwLb_ubOt?Nnh*kUc9n<^YX3TXTw7)VDY+TaN|%it5}kULh%Vc z5m2E(@S2c&GtPFreC{LxE8u?h+!b(N6`CaONn=`pu8z2O0=}@#Js;@$2*Y03#yB_O z<*kF~xhZ)3@Lcz6dz;+v&1sr^3_|`NckcpURdMZ)@3RN(C>oJ~Qg81yzA7q@B!E1U z!$UyG0}QW_@H&R%)Z&5U1O@kq?>N-aKPL{#$td~C z@WZ%!F)68$XND*7nEHNu@*wV?8{Q>msSe+fJSaz_Ux**b@y@lF; zei-3>`y-MN2b9ph{ShL1$GP<2&nXDO6+2W1|C}nU6C;khiR^+X3jZi-#lL;vBx*g8 zJSe`{do4 z_53a+lHEy+tSde}+`W!!|42#e)9BfcBP8A(p!a=85&Xls?j)-6m82qgND1yMO8k!u zpMVFyO!k1%0}6g4Ns|7gs`Ey&_`U_Jaoay!_KA;ggD@lFyW42Izjzjj=)2pf6N8c@ z@#1DVfSYF|J$P|5JvgKuJiD0?esvy|Kaik0UxFke;(Hq53kur;WdTuqw|Q3PbY}g zADu@k_n8C<;?oNGryBV&h5S>6{H#Jgq>vA*)}Bf2uNA^)WUY8?n50o0P&Ip1 z&6B$3J*wtORr66@6I&bN>(GtGU1F-NbtjJK?M9a$8`dYjc{ZtPUrL$G&y?2nr3&lu z^cUwI6t6~_X9$6xm(w0&Rrf7+y=flm9x|M#{JEtS(sPaooQHZsO$c zcAZ7cy`z-*f1O22{_Zw1_d6BgcR~1)y|{g6xGd(*{u#Jkt{f>ZpD{2~_WqXa{e+tY z>La(R9{t=UeShRuQm*%08lUc4Pj<`13Gt7e^0+&e{LEd$$Wni=eDhty$P4^I`Q|&6 zoB4w(@A&{3*QqVa*zZ=3`IK_Zy&tF*Ul^u3_KoDg4v_nlARYeKTTTLgRJpK!RW9sy z<-+~~@4XvOo*Ax`;w9kx7`HDANmzroxL4DB@hzdA4&IVfH{?VIZ|M_T;k0C{7=B!& z+{+{4ja%vQ-Dhjpb80Jf^6s-$hi@SZ`nhWT5!L#CoJ}2gV5=S~Rp|kR@N4zp<6D(? zP~{(2<+lk!xb0Tz#(PSNw<#(9T$S&+MGmaOllzC0w*H4wu=|G-#;=n-rONkzUL3{< zyW>f}p2awwUo4VtA@%M%=j+mewgH;KzGZHoYa1XV_@=r2n!f#pxjmq7ziw{-N#8zi zZokz={&Mhq_bO`cTWutm!ShMIev|B}7vH$my*4sEXV#%h_ld7}p4`zUkIqQWM4eq( zfcX1pmNK&6Z&K{tnWenJA2uoOcIvx7>AM~J?mzWim%e*X-)+}- zw<&dh_`ELhb8VnIRKX{_f}N`10bM}4d#5V+m{;&oRdAnIuuB#6dIk5Wf_uG!p0USy&N-D>fKyTkU^tO9> zwus3td2r_AVq4+N_V%OQcLCVZy;(ehNV9LIERl`koMN%Lu)nvr_mI5ei0qb!PAuwO zzGmWJQTKDR7Od_+a=Z9c=W%h~Ns+8g%FB0@EUI3#<%Ij;>~|Ktk&@ZtqjF_~TlNULLr$b1CpuAQ3e_pS^rd<$KY}mC^pel_le&m5Gu{C_tr*Mhl{qw~GpyoYb=R6Wea9{B5*S9>Sw; zS>j$k>cq;rRQ z3UDZuJc*xH)`*6vz9CmIyVi_rcBJ$dGK%3TNgaVpXcr?7|8m(K*Q|*) zJhWL(E~$^MOo>EsWp9a$7E~T86P_fs>vWlD^xy;Y(hEz5Sw1c70LQ9h4`E>c&r&SIddFb&K^_Nq)$NVa{8XX_JEgzjU4|&&(kY%bUYmRUKzbjrV<|&TPki5 zTl*4~GWL=?Hv7rlVt?mBq;8Ijr#rh6;)rutJlWY*0yXFoU+JvfKQZxK(cp74iz=bW z1JLm<@e)3=`;2-rSZ5xM8xYqY7R4vU^_ZB8E5!A+^zTm{d~xS7VEoicif22qbU$}M z40QGlRu*8nJpSlDIrE4+?!tEQPfqc|BdHlj)MLSBAbs-Wb_l$?kO8xG*>;w}Utr~2hY@wU@fDL&** zh{#dmn;l)^`H1Y3m-i+|*(Pr)-!$tKmqc%#}y` z_sJ(u^}b2E+#^mng#ZdqZN9OxH+N<46R^YqIj8%#gR-)Hdw+qLT_|=$Z*WGce=u4pz7|0sHB+YUji$!6iJk0p}H!563#0c& z<Bj~Mx6%-R81r_8d>C?JB>y5x)HhR z`RME48COzysC(bk=F*bY(>H&ot-Dw5TU9AXPZ6zhf*3JDtnU*SL&$%)6-w9RerDLn z9PvBH?Tkz;sLVUkFQW*W9xg54^60pk

<>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 0000000000..1ccbef0d41 --- /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 0000000000..0c44e430ac --- /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 0000000000..302ff8e31e --- /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 0000000000..8b2a2640e1 --- /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 0000000000..ebbc8c1b82 --- /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 0000000000..16e713bf69 --- /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 0000000000..e97d7a56ff --- /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 0000000000..1a1e1197dd --- /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 0000000000..ddbf784f57 --- /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 0000000000..73441cb6a4 --- /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 0000000000..cd78009007 --- /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 0000000000..8631c42d88 --- /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 0000000000..347d4344ff --- /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 0000000000..ae6e222211 --- /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 0000000000..879ecb5fb3 --- /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 0000000000..92c603335a --- /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 0000000000..c59546bbb1 --- /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 0000000000..81186c53ea --- /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 0000000000..3784643c0b --- /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 0000000000..60cf1e425a --- /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 0000000000..1d97fec797 --- /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 0000000000..17296c31cf --- /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 0000000000..7f8c48253d --- /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 0000000000..64a595419d --- /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 0000000000..f24baf7669 --- /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 0000000000..b3867ebfea --- /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 0000000000..bc0a5b63d6 --- /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 0000000000..268b11ac4d --- /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 0000000000..92bb713f05 --- /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 0000000000..13714de1ed --- /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 0000000000..dba3633d1a --- /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 0000000000..c109841459 --- /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 0000000000..972fc2a157 --- /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 0000000000..6681e37ec0 --- /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 0000000000..c62f40e512 --- /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 0000000000..8211c97d82 --- /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 0000000000..beed21b49a --- /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 0000000000..c07766ee18 --- /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 0000000000..9d78536955 --- /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 c1c17bda52..0000000000 --- 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 fde233b5de..0000000000 --- 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 3a52138688..466c1aee35 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 @@ */ @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 Integer map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentCo // 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 Integer reduce(Integer i, Integer j) { 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 0000000000..dafaf3ffe5 --- /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 850a3113e4..0000000000 --- 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 0000000000..6528f57957 --- /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 57ea5166a6..78b6e7c04c 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 void initialize() { 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 78b6e7c04c..b10486e508 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 b10486e508..2b7db8d341 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 void initialize() { if (!sampleNames.isEmpty()) samplesToChoose.addAll(sampleNames); - if(samplesToChoose.isEmpty()) { - NO_SAMPLES_SPECIFIED = true; + if(!samplesToChoose.isEmpty()) { + SAMPLES_SPECIFIED = true; } } @@ -112,7 +112,7 @@ public boolean filter(ReferenceContext ref, SAMRecord read) { 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 2b7db8d341..7e1dcd707e 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 boolean filter(ReferenceContext ref, SAMRecord read) { } 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 d3a8363491942ed341cb571c38a8b694ba8dba9b Mon Sep 17 00:00:00 2001 From: Roger Zurawicki Date: Wed, 20 Jul 2011 10:49:50 -0400 Subject: [PATCH 204/214] Changed MRAV to ADAV Updated ReducedBAMEvaluation to allow multiple parameters to be tested Fixed previous error From c09f92cceeb5bce53d03dac445ce9bda7e015259 Mon Sep 17 00:00:00 2001 From: Mauricio Carneiro Date: Wed, 20 Jul 2011 11:39:04 -0400 Subject: [PATCH 205/214] Fixing the illegal character accidently entered From f14f20d718b1570f52b2cb4805ff469b00549354 Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Wed, 20 Jul 2011 14:48:33 -0400 Subject: [PATCH 206/214] Fix bug involving reuse of the sample variable. Cleaned up some otherwise unused comments and code. 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 6528f57957..1829e9549a 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 @@ */ 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 void testWikiExample() { 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 void testWikiExampleNoBWA() { 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 c4684f4659c9a91ad4a8973b42c4becc21a37626 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 21 Jul 2011 11:20:46 -0400 Subject: [PATCH 208/214] A true oneoff: walker that reads in vcf with multiallelic PL's in wrong ordering and flips them around to output in correct order From 84c66d4b92c9ee7275523b547cc3c47bb2d03233 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Thu, 21 Jul 2011 11:52:51 -0400 Subject: [PATCH 209/214] Bug fixes 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 14d4625185..7e39d26584 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 Integer reduce(Integer i, Integer j) { } 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 1829e9549a..95f4ac0ae3 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 @@ */ 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 void testWikiExampleNoBWA() { 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 7e39d26584..cb03d4c618 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 Integer reduce(Integer i, Integer j) { } 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 | 199 +++++++++--------- .../queue/engine/shell/ShellJobRunner.scala | 6 +- .../queue/function/CommandLineFunction.scala | 4 +- .../function/JavaCommandLineFunction.scala | 8 +- .../examples/HelloWorldPipelineTest.scala | 14 +- 13 files changed, 194 insertions(+), 170 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 aa6303a6fd..77db34cbcf 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.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 void testClusterName() { @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 71970a36bf..05c1a1775a 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 2fbfab5ec4..2e31081368 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 d2be4939a8..30187f7e23 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 4b4d449886..de5fbde054 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 8ed3f84c11..a52e9c5618 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 82edf6221c..8c639b5bb0 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 c0fff91255..23ddab619a 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 ac2f036b4a..46dd083325 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,8 +188,44 @@ object Lsf706JobRunner extends Logging { } } - for (runner <- runners.diff(updatedRunners)) { - checkUnknownStatus(runner) + updatedRunners + } + + private def updateRunnerStatus(runner: Lsf706JobRunner, jobInfo: LibBat.jobInfoEnt) { + val jobStatus = jobInfo.status + val exitStatus = jobInfo.exitStatus + val exitInfo = jobInfo.exitInfo + val endTime = jobInfo.endTime + + logger.debug("Job Id %s status / exitStatus / exitInfo: 0x%02x / 0x%02x / 0x%02x".format(runner.jobId, jobStatus, exitStatus, exitInfo)) + + runner.updateStatus( + if (Utils.isFlagSet(jobStatus, LibBat.JOB_STAT_DONE)) { + // Done successfully. + RunnerStatus.DONE + } else if (Utils.isFlagSet(jobStatus, LibBat.JOB_STAT_EXIT) && !willRetry(exitInfo, endTime)) { + // Exited function that (probably) won't be retried. + RunnerStatus.FAILED + } else { + // Note that we still saw the job in the system. + RunnerStatus.RUNNING + } + ) + } + + /** + * Returns true if LSF is expected to retry running the function. + * @param exitInfo The reason the job exited. + * @param endTime THe time the job exited. + * @return true if LSF is expected to retry running the function. + */ + private def willRetry(exitInfo: Int, endTime: NativeLong) = { + exitInfo match { + case LibBat.EXIT_NORMAL => false + case _ => { + val seconds = LibC.difftime(LibC.time(null), endTime) + (seconds <= retryExpiredSeconds) + } } } @@ -217,6 +249,19 @@ object Lsf706JobRunner extends Logging { } } + /** 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. @@ -224,89 +269,45 @@ object Lsf706JobRunner extends Logging { * @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) = { + private def getRlimitRun(queueName: String) = { lsfLibLock.synchronized { - if (queue == null) { - if (defaultQueue != null) { - queueRlimitRun(defaultQueue) - } else { - // Get the info on the default queue. + 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(null, numQueues, null, null, 0) + 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 the default queue")) - defaultQueue = queueInfo.queue + throw new QException(LibBat.lsb_sperror("Unable to get LSF queue info for queue: " + queue)) val limit = queueInfo.rLimits(LibLsf.LSF_RLIMIT_RUN) - queueRlimitRun += defaultQueue -> limit + queueRlimitRun += queue -> 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 - } } } } - private def updateRunnerStatus(runner: Lsf706JobRunner, jobInfo: LibBat.jobInfoEnt) { - val jobStatus = jobInfo.status - val exitStatus = jobInfo.exitStatus - val exitInfo = jobInfo.exitInfo - val endTime = jobInfo.endTime - - logger.debug("Job Id %s status / exitStatus / exitInfo: 0x%02x / 0x%02x / 0x%02x".format(runner.jobId, jobStatus, exitStatus, exitInfo)) - - runner.updateStatus( - if (Utils.isFlagSet(jobStatus, LibBat.JOB_STAT_DONE)) { - // Done successfully. - RunnerStatus.DONE - } else if (Utils.isFlagSet(jobStatus, LibBat.JOB_STAT_EXIT) && !willRetry(exitInfo, endTime)) { - // Exited function that (probably) won't be retried. - RunnerStatus.FAILED - } else { - // Note that we still saw the job in the system. - RunnerStatus.RUNNING + 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 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. - * @param endTime THe time the job exited. - * @return true if LSF is expected to retry running the function. - */ - private def willRetry(exitInfo: Int, endTime: NativeLong) = { - exitInfo match { - case LibBat.EXIT_NORMAL => false - case _ => { - val seconds = LibC.difftime(LibC.time(null), endTime) - (seconds <= retryExpiredSeconds) - } - } - } + 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 603511a309..128d8773c6 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 2b1abb2d03..c62fdcd7ce 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 72445442ec..e8279f62bc 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 0871e769bd..7c76823da5 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 6afe63690d3e1f2ec6012a032914823488f347a9 Mon Sep 17 00:00:00 2001 From: Guillermo del Angel Date: Fri, 22 Jul 2011 08:13:05 -0400 Subject: [PATCH 213/214] Two more true oneoffs (committed mostly for didactic purposes): codec that reads Mills/Devine indel table into a vcf and another (in progress) that will read indel chip genotype data and produce a vcf 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 c713f3963c..b3631a28df 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 3f6850e371..00f5aa5bcd 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 0ef0a129b0..2d26ec6509 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 dafaf3ffe5..a6af034cb0 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 @@ 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" +