Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tws cnv allow rd #8015

Merged
merged 1 commit into from
Sep 16, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
rd generation and raw-counts output in CollectSVEvidence
tedsharpe committed Sep 15, 2022
commit 76c7648f89f2b010e6366306f4fa88ac77979197
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.broadinstitute.hellbender.tools.sv;

import htsjdk.samtools.util.Locatable;
import org.broadinstitute.hellbender.exceptions.UserException;
import org.broadinstitute.hellbender.utils.Utils;

@@ -24,6 +25,10 @@ public DepthEvidence(final String contig, int start, final int end, final int[]
this.counts = counts;
}

public DepthEvidence( final Locatable loc, final int[] counts ) {
this(loc.getContig(), loc.getStart(), loc.getEnd(), counts);
}

@Override
public String getContig() {
return contig;
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
package org.broadinstitute.hellbender.tools.sv;

import htsjdk.samtools.SAMFileHeader;
import htsjdk.samtools.SAMReadGroupRecord;
import htsjdk.samtools.SAMSequenceDictionary;
import htsjdk.samtools.SAMTextHeaderCodec;
import htsjdk.samtools.util.RuntimeIOException;
import htsjdk.tribble.Feature;
import org.broadinstitute.barclay.argparser.Argument;
import org.broadinstitute.barclay.argparser.CommandLineProgramProperties;
import org.broadinstitute.barclay.argparser.ExperimentalFeature;
import org.broadinstitute.barclay.help.DocumentedFeature;
import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;
import org.broadinstitute.hellbender.cmdline.programgroups.StructuralVariantDiscoveryProgramGroup;
import org.broadinstitute.hellbender.engine.*;
import org.broadinstitute.hellbender.exceptions.UserException;
import org.broadinstitute.hellbender.tools.copynumber.formats.metadata.SampleLocatableMetadata;
import org.broadinstitute.hellbender.tools.copynumber.formats.records.SimpleCount;
import org.broadinstitute.hellbender.utils.codecs.copynumber.SimpleCountCodec;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.List;

/**
* <p>Prints (and optionally subsets) an rd (DepthEvidence) file or a counts file
* as one or more (for multi-sample DepthEvidence files) counts files for CNV determination.</p>
*
* <h3>Inputs</h3>
*
* <ul>
* <li>
* A locus-sorted DepthEvidence file (name ends with ".rd.txt", ".rd.txt.gz", or "rd.bci"),
* or a counts file (name ends with ".counts.tsv", or ".counts.tsv.gz").
* </li>
* </ul>
*
* <h3>Output</h3>
*
* <ul>
* <li>
* A counts file (or files) for use by one of the CNV-calling tools.
* </li>
* </ul>
* <p>The output files are named "{output-prefix}{sample-name}.counts.tsv"</p>
*
* <h3>Usage example</h3>
*
* <pre>
* gatk PrintCNVCounts \
* -F input.rd.txt.gz \
* -L chr1
* </pre>
*
* @author Ted Sharpe &lt;tsharpe@broadinstitute.org&gt;
*/
@CommandLineProgramProperties(
summary = "Prints count files for CNV determination.",
oneLineSummary = "Prints count files for CNV determination.",
programGroup = StructuralVariantDiscoveryProgramGroup.class
)
@ExperimentalFeature
@DocumentedFeature
public class PrintReadCounts extends FeatureWalker<Feature> {
public static final String INPUT_ARGNAME = "input-counts";
public static final String OUTPUT_PREFIX_ARGNAME = "output-prefix";
public static final String OUTPUT_FILES_ARGNAME = "output-file-list";

@Argument(
doc = "Input file of counts",
fullName = INPUT_ARGNAME,
shortName = StandardArgumentDefinitions.FEATURE_SHORT_NAME
)
private GATKPath inputPath;

@Argument(
doc = "Output file path prefix. Paths have the form \"{output-prefix}{sample-name}.counts.tsv\". " +
"Default is the current working directory.",
fullName = OUTPUT_PREFIX_ARGNAME,
optional = true
)
private String outputPrefix = "";

@Argument(
doc = "Two-column list of outputs in the form <sample-name>\\t<output file path>",
fullName = OUTPUT_FILES_ARGNAME,
shortName = StandardArgumentDefinitions.OUTPUT_SHORT_NAME,
optional = true
)
private String outputFilesFilename;

private BufferedWriter[] writers;
private List<String> sampleNames;

@Override
public GATKPath getDrivingFeaturePath() {
return inputPath;
}

@Override
protected boolean isAcceptableFeatureType( final Class<? extends Feature> featureType ) {
return featureType.equals(DepthEvidence.class) || featureType.equals(SimpleCount.class);
}

@Override
public void onTraversalStart() {
final Object header = getDrivingFeaturesHeader();
if ( header instanceof SampleLocatableMetadata ) {
initializeWriter((SampleLocatableMetadata)header);
} else if ( header instanceof SVFeaturesHeader ) {
initializeWriters((SVFeaturesHeader)header);
} else {
throw new UserException("Input file has no header.");
}
}

@Override
public void apply( final Feature feature,
final ReadsContext readsContext,
final ReferenceContext referenceContext,
final FeatureContext featureContext ) {
if ( feature instanceof DepthEvidence ) {
apply((DepthEvidence)feature);
} else {
apply((SimpleCount)feature);
}
}

@Override
public Object onTraversalSuccess() {
final int nSamples = sampleNames.size();
for ( int idx = 0; idx != nSamples; ++idx ) {
try {
writers[idx].close();
} catch ( final IOException ioe ) {
throw new UserException("Failed to close output file for sample " + sampleNames.get(idx), ioe);
}
}
return null;
}

private void initializeWriter( final SampleLocatableMetadata metadata ) {
final String sampleName = metadata.getSampleName();
sampleNames = Collections.singletonList(sampleName);
writers = new BufferedWriter[1];
try ( final BufferedWriter outputFilesWriter =
outputFilesFilename == null ? null :
new BufferedWriter(new FileWriter(outputFilesFilename)) ) {
writers[0] = createWriter(sampleName, metadata.toHeader(), outputFilesWriter);
} catch ( final IOException ioe ) {
throw new UserException("Can't open list of output files " + outputFilesFilename, ioe);
}
}

private void initializeWriters( final SVFeaturesHeader featuresHeader ) {
sampleNames = featuresHeader.getSampleNames();
SAMSequenceDictionary dictionary = featuresHeader.getDictionary();
if ( dictionary == null ) {
dictionary = getMasterSequenceDictionary();
if ( dictionary == null ) {
throw new UserException("No dictionary available. Supply one with --sequence-dictonary.");
}
}
final int nSampleNames = sampleNames.size();
writers = new BufferedWriter[nSampleNames];
try ( final BufferedWriter outputFilesWriter =
outputFilesFilename == null ? null :
new BufferedWriter(new FileWriter(outputFilesFilename)) ) {
for ( int idx = 0; idx != nSampleNames; ++idx ) {
final SAMFileHeader samFileHeader = new SAMFileHeader(dictionary);
final SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("GATKCopyNumber");
final String sampleName = sampleNames.get(idx);
readGroupRecord.setSample(sampleName);
samFileHeader.addReadGroup(readGroupRecord);
writers[idx] = createWriter(sampleName, samFileHeader, outputFilesWriter);
}
} catch ( final IOException ioe ) {
throw new UserException("Can't open list of output files " + outputFilesFilename, ioe);
}
}

private BufferedWriter createWriter( final String sampleName,
final SAMFileHeader header,
final BufferedWriter outputFilesWriter ) {
final String filename = outputPrefix + sampleName + ".counts.tsv";
if ( outputFilesWriter != null ) {
try {
outputFilesWriter.write(sampleName + "\t" + filename);
outputFilesWriter.newLine();
} catch ( final IOException ioe ) {
throw new UserException("Can't write to list of output files " + outputFilesFilename, ioe);
}
}

final BufferedWriter writer;
try {
writer = new BufferedWriter(new FileWriter(filename));
} catch ( final IOException ioe ) {
throw new UserException("Can't open " + filename + " for output.", ioe);
}
try {
new SAMTextHeaderCodec().encode(writer, header, true);
} catch ( final RuntimeIOException ioe ) {
throw new UserException("Can't write header to " + filename, ioe);
}
try {
writer.write("CONTIG\tSTART\tEND\tCOUNT");
writer.newLine();
} catch ( final IOException ioe ) {
throw new UserException("Can't writer column header to " + filename, ioe);
}
return writer;
}

private void apply( final SimpleCount simpleCount ) {
final BufferedWriter writer = writers[0];
try {
writer.write(SimpleCountCodec.encode(simpleCount));
writer.newLine();
} catch ( final IOException ioe ) {
throw new UserException("Can't write record to output.", ioe);
}
}

private void apply( final DepthEvidence depthEvidence ) {
// don't use DepthEvidence codec to encode--we want 1-based coordinates
final String intervalFields =
depthEvidence.getContig() + "\t" + depthEvidence.getStart() + "\t" + depthEvidence.getEnd() + "\t";
final int[] counts = depthEvidence.getCounts();
for ( int idx = 0; idx != writers.length; ++idx ) {
try {
writers[idx].write(intervalFields + counts[idx]);
writers[idx].newLine();
} catch ( final IOException ioe ) {
throw new UserException("Can't write to output file for sample " + sampleNames.get(idx), ioe);
}
}
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -98,5 +98,11 @@ public TabixFormat getTabixFormat() {
TABIX_FORMAT_META_CHARACTER,
0);
}
}

public static String encode( final SimpleCount simpleCount ) {
return simpleCount.getContig() + "\t" +
simpleCount.getStart() + "\t" +
simpleCount.getEnd() + "\t" +
simpleCount.getCount();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.broadinstitute.hellbender.tools.sv;

import org.broadinstitute.hellbender.CommandLineProgramTest;
import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;
import org.broadinstitute.hellbender.testutils.ArgumentsBuilder;
import org.broadinstitute.hellbender.testutils.IntegrationTestSpec;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.Collections;

public class PrintReadCountsIntegrationTest extends CommandLineProgramTest {
private static final String myTestDir = toolsTestDir + "sv/";

@Test
public void testRD() throws IOException {
final ArgumentsBuilder argsBuilder = new ArgumentsBuilder();
argsBuilder.add(StandardArgumentDefinitions.INTERVALS_SHORT_NAME, "chr1:10414291-10416290");
argsBuilder.add(StandardArgumentDefinitions.SEQUENCE_DICTIONARY_NAME, myTestDir + "chr1.dict");
argsBuilder.add(StandardArgumentDefinitions.FEATURE_SHORT_NAME, myTestDir + "test.HG00096.rd.txt.gz");
argsBuilder.add(PrintReadCounts.OUTPUT_PREFIX_ARGNAME, myTestDir + "testCounts.");
final IntegrationTestSpec testSpec =
new IntegrationTestSpec(argsBuilder.getString(), Collections.emptyList());
testSpec.executeTest("testRD", this);
checkOutput(myTestDir + "testCounts.HG00096.counts.tsv",
myTestDir + "expect.HG00096.counts.tsv");
}

@Test
public void testCounts() throws IOException {
final ArgumentsBuilder argsBuilder = new ArgumentsBuilder();
argsBuilder.add(StandardArgumentDefinitions.INTERVALS_SHORT_NAME, "chr1:10414291-10416290");
argsBuilder.add(StandardArgumentDefinitions.FEATURE_SHORT_NAME, myTestDir + "test.HG00096.counts.tsv.gz");
argsBuilder.add(PrintReadCounts.OUTPUT_PREFIX_ARGNAME, myTestDir + "testCounts.");
final IntegrationTestSpec testSpec =
new IntegrationTestSpec(argsBuilder.getString(), Collections.emptyList());
testSpec.executeTest("testCounts", this);
checkOutput(myTestDir + "testCounts.HG00096.counts.tsv",
myTestDir + "expect.HG00096.counts.tsv");
}

@Test
public void testBCI() throws IOException {
final ArgumentsBuilder argsBuilder = new ArgumentsBuilder();
argsBuilder.add(StandardArgumentDefinitions.INTERVALS_SHORT_NAME, "chr1:10414291-10416290");
argsBuilder.add(StandardArgumentDefinitions.FEATURE_SHORT_NAME, myTestDir + "merged.rd.bci");
argsBuilder.add(PrintReadCounts.OUTPUT_PREFIX_ARGNAME, myTestDir + "testCounts.");
final IntegrationTestSpec testSpec =
new IntegrationTestSpec(argsBuilder.getString(), Collections.emptyList());
testSpec.executeTest("testBCI", this);
checkOutput(myTestDir + "testCounts.HG00096.counts.tsv",
myTestDir + "expect.HG00096.counts.tsv");
checkOutput(myTestDir + "testCounts.HG00129.counts.tsv",
myTestDir + "expect.HG00129.counts.tsv");
checkOutput(myTestDir + "testCounts.HG00140.counts.tsv",
myTestDir + "expect.HG00140.counts.tsv");
}

private void checkOutput( final String actualPath, final String expectedPath ) throws IOException {
final File actual = new File(actualPath);
try {
IntegrationTestSpec.assertEqualTextFiles(actual, new File(expectedPath));
} finally {
actual.delete();
}
}
}
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import org.broadinstitute.hellbender.CommandLineProgramTest;
import org.broadinstitute.hellbender.testutils.IntegrationTestSpec;
import org.broadinstitute.hellbender.utils.codecs.DepthEvidenceCodec;
import org.broadinstitute.hellbender.utils.codecs.DiscordantPairEvidenceCodec;
import org.broadinstitute.hellbender.utils.codecs.SiteDepthCodec;
import org.broadinstitute.hellbender.utils.codecs.SplitReadEvidenceCodec;
@@ -16,24 +17,43 @@ public class CollectSVEvidenceIntegrationTest extends CommandLineProgramTest {
public static final String tinyVCF = largeFileTestDir + "CEUTrio.HiSeq.WGS.b37.NA12878.20.21.tiny.vcf";

@Test
public void testPESRCollection() throws Exception {
public void testPECollection() throws Exception {
// these test files were generated by svtk collect-pesr
IntegrationTestSpec spec = new IntegrationTestSpec(
final IntegrationTestSpec spec = new IntegrationTestSpec(
"-I " + NA12878_20_21_WGS_bam + " --sample-name NA12878 -PE %s",
Collections.singletonList(pesrTestDir + "/NA12878" + DiscordantPairEvidenceCodec.FORMAT_SUFFIX + ".gz"));
spec.setOutputFileExtension(DiscordantPairEvidenceCodec.FORMAT_SUFFIX + ".gz");
spec.executeTest("base PESR collection", this);
spec.executeTest("PE collection", this);
}

IntegrationTestSpec spec2 = new IntegrationTestSpec(
@Test
public void testSRCollection() throws Exception {
final IntegrationTestSpec spec = new IntegrationTestSpec(
"-I " + NA12878_20_21_WGS_bam + " --sample-name NA12878 -SR %s",
Collections.singletonList(pesrTestDir + "/NA12878" + SplitReadEvidenceCodec.FORMAT_SUFFIX + ".gz"));
spec2.setOutputFileExtension(SplitReadEvidenceCodec.FORMAT_SUFFIX + ".gz");
spec2.executeTest("base PESR collection", this);
spec.setOutputFileExtension(SplitReadEvidenceCodec.FORMAT_SUFFIX + ".gz");
spec.executeTest("SR collection", this);
}

IntegrationTestSpec spec3 = new IntegrationTestSpec(
"-I " + NA12878_20_21_WGS_bam + " --sample-name NA12878 -F " + tinyVCF + " -AC %s",
@Test
public void testSDCollection() throws Exception {
final IntegrationTestSpec spec = new IntegrationTestSpec(
"-I " + NA12878_20_21_WGS_bam + " --sample-name NA12878 -F " + tinyVCF + " -SD %s",
Collections.singletonList(pesrTestDir + "/NA12878" + SiteDepthCodec.FORMAT_SUFFIX + ".gz"));
spec3.setOutputFileExtension(SiteDepthCodec.FORMAT_SUFFIX + ".gz");
spec3.executeTest("base PESR collection", this);
spec.setOutputFileExtension(SiteDepthCodec.FORMAT_SUFFIX + ".gz");
spec.executeTest("SD collection", this);
}

@Test
public void testRDCollection() throws Exception {
final IntegrationTestSpec spec = new IntegrationTestSpec(
"-I " + NA12878_20_21_WGS_bam +
" --sample-name NA12878" +
" -DI " + pesrTestDir + "/intervals.bed" +
" --" + CollectSVEvidence.MIN_DEPTH_EVIDENCE_MAPQ_ARGUMENT_NAME + " 30" +
" -RD %s",
Collections.singletonList(pesrTestDir + "/NA12878" + DepthEvidenceCodec.FORMAT_SUFFIX + ".gz"));
spec.setOutputFileExtension(DepthEvidenceCodec.FORMAT_SUFFIX + ".gz");
spec.executeTest("RD collection", this);
}
}
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ public void testLocusComparator() {
final SAMFileHeader hdr = ArtificialReadUtils.createArtificialSamHeader();
final SAMSequenceDictionary dict = hdr.getSequenceDictionary();
Assert.assertTrue(dict.getSequences().size() >= 3, "need 3 sequences");
final LocusComparator lComp = new LocusComparatorImpl(dict);
final LocusComparator lComp = new LocusComparator(dict);
final String curContig = dict.getSequence(1).getContig();
final SimpleInterval interval =
new SimpleInterval(curContig, 1001, 2000);
@@ -43,7 +43,7 @@ public void testLocusComparator() {
@Test
public void testEffectOfCigarAndMinQOnAlleleCounting() {
final SAMFileHeader hdr = ArtificialReadUtils.createArtificialSamHeader();
final LocusComparator lComp = new LocusComparatorImpl(hdr.getSequenceDictionary());
final LocusComparator lComp = new LocusComparator(hdr.getSequenceDictionary());
final GATKRead read = ArtificialReadUtils.createArtificialRead(hdr, "30M5D30M5I30M");
final int readQ = read.getBaseQuality(0);
Assert.assertEquals(read.getBase(0), (byte)'A');
@@ -56,12 +56,12 @@ public void testEffectOfCigarAndMinQOnAlleleCounting() {
sites.add(new SiteDepth(contig, start+30, sample, 0, 0, 0, 0));
sites.add(new SiteDepth(contig, start+35, sample, 0, 0, 0, 0));
sites.add(new SiteDepth(contig, start+95, sample, 0, 0, 0, 0));
AlleleCounter.walkReadMatches(read, readQ+1, sites, lComp);
SiteDepthCounter.walkReadMatches(read, readQ+1, sites, lComp);
for ( final SiteDepth sd : sites ) {
// no counts because quality too low
Assert.assertEquals(sd.getDepth(0), 0);
}
AlleleCounter.walkReadMatches(read, readQ, sites, lComp);
SiteDepthCounter.walkReadMatches(read, readQ, sites, lComp);
Assert.assertEquals(sites.get(0).getDepth(0), 0); // upstream, so no count
Assert.assertEquals(sites.get(1).getDepth(0), 1); // in first 30M, 1 count
Assert.assertEquals(sites.get(2).getDepth(0), 0); // in 5D, so no count
@@ -183,4 +183,42 @@ public void testCountSplitRead() {
Mockito.verify(mockSrWriter).write(new SplitReadEvidence(tool.sampleName, "1", 1100, 2, true));
Mockito.verifyNoMoreInteractions(mockSrWriter);
}
}

@Test
public void testCountCounter() {
final int N_GAUSSIAN = 10000;
final int N_OUTLIERS = 30;
final CollectSVEvidence.CountCounter cc = new CollectSVEvidence.CountCounter();
final Random rand = new Random(0);
final int[] values = new int[N_GAUSSIAN + N_OUTLIERS];
for ( int idx = 0; idx != N_GAUSSIAN; ++idx ) {
final int val = (int)Math.round(10 * rand.nextGaussian() + 30);
cc.addCount(values[idx] = val < 0 ? 0 : val);
}
for ( int idx = 0; idx != N_OUTLIERS; ++idx ) {
final int val = (int)Math.round(10000*rand.nextDouble()+200);
cc.addCount(values[idx + N_GAUSSIAN] = val);
}
Arrays.sort(values);
final int[] quartiles = cc.getQuartiles();
Assert.assertEquals(quartiles[0], values[(N_GAUSSIAN + N_OUTLIERS + 3) / 4]);
Assert.assertEquals(quartiles[1], values[(2*(N_GAUSSIAN + N_OUTLIERS) + 3) / 4]);
Assert.assertEquals(quartiles[2], values[(3*(N_GAUSSIAN + N_OUTLIERS) + 3) / 4]);
Assert.assertEquals(quartiles[3], values[values.length-1]);

int nZeroes = 0;
for ( int idx = 0; idx != N_GAUSSIAN + N_OUTLIERS; ++idx ) {
if ( values[idx] != 0 ) {
break;
}
nZeroes += 1;
}
Assert.assertEquals(cc.getNZeroCounts(), nZeroes);

long totalCounts = 0;
for ( int idx = 0; idx != N_GAUSSIAN + N_OUTLIERS; ++idx ) {
totalCounts += values[idx];
}
Assert.assertEquals(cc.getMeanCount(), (double)totalCounts/(N_GAUSSIAN + N_OUTLIERS));
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@HD VN:1.6 SO:unsorted
@SQ SN:chr1 LN:248956422
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@HD VN:1.6
@SQ SN:chr1 LN:248956422
@RG ID:GATKCopyNumber SM:HG00096
CONTIG START END COUNT
chr1 10414291 10416290 455
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@HD VN:1.6
@SQ SN:chr1 LN:248956422
@RG ID:GATKCopyNumber SM:HG00129
CONTIG START END COUNT
chr1 10414291 10416290 320
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@HD VN:1.6
@SQ SN:chr1 LN:248956422
@RG ID:GATKCopyNumber SM:HG00140
CONTIG START END COUNT
chr1 10414291 10416290 481
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
rd_q25_NA12878 709
rd_q50_NA12878 753
rd_q75_NA12878 789
rd_mean_NA12878 738
rd_num_intervals_NA12878 250
rd_intervals_size_NA12878 250000
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
20 10000000 10001000
20 10001000 10002000
20 10002000 10003000
20 10003000 10004000
20 10004000 10005000
20 10005000 10006000
20 10006000 10007000
20 10007000 10008000
20 10008000 10009000
20 10009000 10010000
20 10010000 10011000
20 10011000 10012000
20 10012000 10013000
20 10013000 10014000
20 10014000 10015000
20 10015000 10016000
20 10016000 10017000
20 10017000 10018000
20 10018000 10019000
20 10019000 10020000
20 10020000 10021000
20 10021000 10022000
20 10022000 10023000
20 10023000 10024000
20 10024000 10025000
20 10025000 10026000
20 10026000 10027000
20 10027000 10028000
20 10028000 10029000
20 10029000 10030000
20 10030000 10031000
20 10031000 10032000
20 10032000 10033000
20 10033000 10034000
20 10034000 10035000
20 10035000 10036000
20 10036000 10037000
20 10037000 10038000
20 10038000 10039000
20 10039000 10040000
20 10040000 10041000
20 10041000 10042000
20 10042000 10043000
20 10043000 10044000
20 10044000 10045000
20 10045000 10046000
20 10046000 10047000
20 10047000 10048000
20 10048000 10049000
20 10049000 10050000
20 10050000 10051000
20 10051000 10052000
20 10052000 10053000
20 10053000 10054000
20 10054000 10055000
20 10055000 10056000
20 10056000 10057000
20 10057000 10058000
20 10058000 10059000
20 10059000 10060000
20 10060000 10061000
20 10061000 10062000
20 10062000 10063000
20 10063000 10064000
20 10064000 10065000
20 10065000 10066000
20 10066000 10067000
20 10067000 10068000
20 10068000 10069000
20 10069000 10070000
20 10070000 10071000
20 10071000 10072000
20 10072000 10073000
20 10073000 10074000
20 10074000 10075000
20 10075000 10076000
20 10076000 10077000
20 10077000 10078000
20 10078000 10079000
20 10079000 10080000
20 10080000 10081000
20 10081000 10082000
20 10082000 10083000
20 10083000 10084000
20 10084000 10085000
20 10085000 10086000
20 10086000 10087000
20 10087000 10088000
20 10088000 10089000
20 10089000 10090000
20 10090000 10091000
20 10091000 10092000
20 10092000 10093000
20 10093000 10094000
20 10094000 10095000
20 10095000 10096000
20 10096000 10097000
20 10097000 10098000
20 10098000 10099000
20 10099000 10100000
20 10100000 10101000
20 10101000 10102000
20 10102000 10103000
20 10103000 10104000
20 10104000 10105000
20 10105000 10106000
20 10106000 10107000
20 10107000 10108000
20 10108000 10109000
20 10109000 10110000
20 10110000 10111000
20 10111000 10112000
20 10112000 10113000
20 10113000 10114000
20 10114000 10115000
20 10115000 10116000
20 10116000 10117000
20 10117000 10118000
20 10118000 10119000
20 10119000 10120000
20 10120000 10121000
20 10121000 10122000
20 10122000 10123000
20 10123000 10124000
20 10124000 10125000
20 10125000 10126000
20 10126000 10127000
20 10127000 10128000
20 10128000 10129000
20 10129000 10130000
20 10130000 10131000
20 10131000 10132000
20 10132000 10133000
20 10133000 10134000
20 10134000 10135000
20 10135000 10136000
20 10136000 10137000
20 10137000 10138000
20 10138000 10139000
20 10139000 10140000
20 10140000 10141000
20 10141000 10142000
20 10142000 10143000
20 10143000 10144000
20 10144000 10145000
20 10145000 10146000
20 10146000 10147000
20 10147000 10148000
20 10148000 10149000
20 10149000 10150000
20 10150000 10151000
20 10151000 10152000
20 10152000 10153000
20 10153000 10154000
20 10154000 10155000
20 10155000 10156000
20 10156000 10157000
20 10157000 10158000
20 10158000 10159000
20 10159000 10160000
20 10160000 10161000
20 10161000 10162000
20 10162000 10163000
20 10163000 10164000
20 10164000 10165000
20 10165000 10166000
20 10166000 10167000
20 10167000 10168000
20 10168000 10169000
20 10169000 10170000
20 10170000 10171000
20 10171000 10172000
20 10172000 10173000
20 10173000 10174000
20 10174000 10175000
20 10175000 10176000
20 10176000 10177000
20 10177000 10178000
20 10178000 10179000
20 10179000 10180000
20 10180000 10181000
20 10181000 10182000
20 10182000 10183000
20 10183000 10184000
20 10184000 10185000
20 10185000 10186000
20 10186000 10187000
20 10187000 10188000
20 10188000 10189000
20 10189000 10190000
20 10190000 10191000
20 10191000 10192000
20 10192000 10193000
20 10193000 10194000
20 10194000 10195000
20 10195000 10196000
20 10196000 10197000
20 10197000 10198000
20 10198000 10199000
20 10199000 10200000
20 10200000 10201000
20 10201000 10202000
20 10202000 10203000
20 10203000 10204000
20 10204000 10205000
20 10205000 10206000
20 10206000 10207000
20 10207000 10208000
20 10208000 10209000
20 10209000 10210000
20 10210000 10211000
20 10211000 10212000
20 10212000 10213000
20 10213000 10214000
20 10214000 10215000
20 10215000 10216000
20 10216000 10217000
20 10217000 10218000
20 10218000 10219000
20 10219000 10220000
20 10220000 10221000
20 10221000 10222000
20 10222000 10223000
20 10223000 10224000
20 10224000 10225000
20 10225000 10226000
20 10226000 10227000
20 10227000 10228000
20 10228000 10229000
20 10229000 10230000
20 10230000 10231000
20 10231000 10232000
20 10232000 10233000
20 10233000 10234000
20 10234000 10235000
20 10235000 10236000
20 10236000 10237000
20 10237000 10238000
20 10238000 10239000
20 10239000 10240000
20 10240000 10241000
20 10241000 10242000
20 10242000 10243000
20 10243000 10244000
20 10244000 10245000
20 10245000 10246000
20 10246000 10247000
20 10247000 10248000
20 10248000 10249000
20 10249000 10250000