Skip to content

Commit

Permalink
chore: add test
Browse files Browse the repository at this point in the history
feat: add wrapping counting filter
  • Loading branch information
yfarjoun committed Feb 15, 2025
1 parent fed40cf commit 8159088
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,51 +28,43 @@
import htsjdk.samtools.filter.*;
import htsjdk.samtools.metrics.MetricsFile;
import htsjdk.samtools.util.*;
import htsjdk.utils.ValidationUtils;
import htsjdk.variant.variantcontext.Allele;
import htsjdk.variant.variantcontext.VariantContext;
import htsjdk.variant.variantcontext.filter.*;
import htsjdk.variant.vcf.VCFContigHeaderLine;
import htsjdk.variant.vcf.VCFFileReader;
import htsjdk.variant.vcf.VCFHeader;
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 picard.PicardException;
import picard.analysis.replicates.IndependentReplicateMetric;
import picard.cmdline.CommandLineProgram;
import picard.cmdline.StandardOptionDefinitions;
import picard.cmdline.programgroups.DiagnosticsAndQCProgramGroup;
import picard.filter.CountingFilterWrapper;
import picard.filter.CountingMapQFilter;
import picard.filter.CountingPairedFilter;
import picard.util.SequenceDictionaryUtils;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static picard.cmdline.StandardOptionDefinitions.MINIMUM_MAPPING_QUALITY_SHORT_NAME;

/**
* A CLP that, tallys the number of UMIs in a duplicate set across the entire bam and produces a histogram.
* A CLP that, tallies the number of UMIs in a duplicate set across the entire bam and produces a histogram.
*
* @author Yossi Farjoun
*/
@DocumentedFeature
@ExperimentalFeature
@CommandLineProgramProperties(
summary = CollectUmiPrevelanceMetrics.USAGE_SUMMARY + CollectUmiPrevelanceMetrics.USAGE_DETAILS,
oneLineSummary = CollectUmiPrevelanceMetrics.USAGE_SUMMARY,
summary = CollectUmiPrevalenceMetrics.USAGE_SUMMARY + CollectUmiPrevalenceMetrics.USAGE_DETAILS,
oneLineSummary = CollectUmiPrevalenceMetrics.USAGE_SUMMARY,
programGroup = DiagnosticsAndQCProgramGroup.class
)
public class CollectUmiPrevelanceMetrics extends CommandLineProgram {
public class CollectUmiPrevalenceMetrics extends CommandLineProgram {

static final String USAGE_SUMMARY = "Tally the counts of UMIs in duplicate sets within a bam. \n";
static final String USAGE_DETAILS = "<p>" +
"This tool estimates <FIX ME>";
"This tool collects the Histogram of the number of duplicate sets that contain a given number of UMIs. " +
"Understanding this distribution can help understand the role that the UMIs have in the determination of " +
"consensus sets, the risk of UMI collisions, and of spurious reads that result from uncorrected UMIs.";


@Argument(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "Input (indexed) BAM/CRAM file.")
Expand All @@ -82,10 +74,7 @@ public class CollectUmiPrevelanceMetrics extends CommandLineProgram {
public File OUTPUT;

@Argument(shortName = MINIMUM_MAPPING_QUALITY_SHORT_NAME, doc = "minimal value for the mapping quality of the reads to be used in the estimation.", optional = true)
public Integer MINIMUM_MQ = 40;

@Argument(doc = "Number of sets to examine before stopping.", optional = true)
public Integer STOP_AFTER = 0;
public Integer MINIMUM_MQ = 30;

@Argument(doc = "Barcode SAM tag.", optional = true)
public String BARCODE_TAG = "RX";
Expand All @@ -104,10 +93,10 @@ public class CollectUmiPrevelanceMetrics extends CommandLineProgram {
doc = "The interval between which progress will be displayed.",
optional = true
)
public int PROGRESS_STEP_INTERVAL = 100000;
public int PROGRESS_STEP_INTERVAL = 1_000_000;


private static final Log log = Log.getInstance(CollectUmiPrevelanceMetrics.class);
private static final Log log = Log.getInstance(CollectUmiPrevalenceMetrics.class);

@Override
protected int doWork() {
Expand All @@ -117,21 +106,23 @@ protected int doWork() {
// get an iterator to reads that overlap the heterozygous sites
final Histogram<Integer> umiCount = new Histogram<>("numUmis", "duplicateSets");
final CountingPairedFilter countingPairedFilter = new CountingPairedFilter();
final CountingFilterWrapper countingAlignedFilter = new CountingFilterWrapper(new AlignedFilter(true));
final CountingMapQFilter countingMapQFilter = new CountingMapQFilter(MINIMUM_MQ);
final CountingFilterWrapper countingSecondaryOrSupplementaryFilter =
new CountingFilterWrapper(new SecondaryOrSupplementaryFilter());
final ProgressLogger progress = new ProgressLogger(log, PROGRESS_STEP_INTERVAL, "examined", "duplicate sets");

try (SamReader in = SamReaderFactory.makeDefault()
.referenceSequence(REFERENCE_SEQUENCE)
.open(INPUT)) {


IOUtil.assertFileIsWritable(OUTPUT);

final SAMRecordIterator samRecordIterator = in.iterator();
final List<SamRecordFilter> samFilters = CollectionUtil.makeList(
new AlignedFilter(true),
new SecondaryOrSupplementaryFilter(),
countingMapQFilter
countingAlignedFilter,
countingMapQFilter,
countingSecondaryOrSupplementaryFilter
);
if (FILTER_UNPAIRED_READS) {
samFilters.add(countingPairedFilter);
Expand All @@ -143,7 +134,7 @@ protected int doWork() {
// get duplicate iterator from iterator above
final DuplicateSetIterator duplicateSets = new DuplicateSetIterator(filteredSamRecordIterator, in.getFileHeader(), false, null, log);

log.info("Starting iteration on reads");
log.info("Starting iteration on duplicate sets");

set:
while (duplicateSets.hasNext()) {
Expand All @@ -159,7 +150,8 @@ protected int doWork() {
continue;
}
if (read.hasAttribute(BARCODE_BQ)) {
final String barcodeBQ = read.getStringAttribute(BARCODE_BQ).replace(" ", "");;
final String barcodeBQ = read.getStringAttribute(BARCODE_BQ).replace(" ", "");
;
final byte[] bytes = SAMUtils.fastqToPhred(barcodeBQ);
final boolean badQuality = IntStream.range(0, bytes.length).map(i -> bytes[i]).anyMatch(q -> q < MINIMUM_BARCODE_BQ);
if (badQuality) {
Expand All @@ -177,7 +169,9 @@ protected int doWork() {
log.info("Iteration done. Emitting metrics.");
log.info(String.format("Processed %d sets", progress.getCount()));
log.info(String.format("Filtered %d unpaired reads", countingPairedFilter.getFilteredRecords()));
log.info(String.format("Filtered %d unaligned reads", countingAlignedFilter.getFilteredRecords()));
log.info(String.format("Filtered %d low mapQ reads", countingMapQFilter.getFilteredRecords()));
log.info(String.format("Filtered %d Secondary or Supplementary reads", countingSecondaryOrSupplementaryFilter.getFilteredRecords()));
// Emit metrics
final MetricsFile<?, Integer> metricsFile = getMetricsFile();
metricsFile.addHistogram(umiCount);
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/picard/filter/CountingFilterWrapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package picard.filter;

import htsjdk.samtools.SAMRecord;
import htsjdk.samtools.filter.SamRecordFilter;

/**
* A CountingFilter that wraps any SamRecordFilter and provides a count of the reads and bases filtered
*/
public class CountingFilterWrapper extends CountingFilter {
private final SamRecordFilter wrappedFilter;
public CountingFilterWrapper(SamRecordFilter wrappedFilter) {
this.wrappedFilter = wrappedFilter;
}

@Override
public boolean reallyFilterOut(SAMRecord record) {
return wrappedFilter.filterOut(record);
}
}
50 changes: 50 additions & 0 deletions src/test/java/picard/analysis/CollectUmiPrevalenceMetricsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package picard.analysis;

import htsjdk.samtools.metrics.MetricsFile;
import htsjdk.samtools.util.Histogram;
import org.testng.Assert;
import org.testng.annotations.Test;
import picard.cmdline.CommandLineProgramTest;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import static org.testng.Assert.*;

public class CollectUmiPrevalenceMetricsTest extends CommandLineProgramTest {

@Override
public String getCommandLineProgramName() { return CollectUmiPrevalenceMetrics.class.getSimpleName();}


@Test
public void integrationTest() throws IOException {
final File TEST_DIR = new File("testdata/picard/independent_replicates/");

final File samFile = new File(TEST_DIR, "twopairsWithManyUmis.sam");
final File metricsFile = File.createTempFile("test", ".umi_hist");
metricsFile.deleteOnExit();

final String[] args = new String[]{
"INPUT=" + samFile.getAbsolutePath(),
"OUTPUT=" + metricsFile.getAbsolutePath(),
"MINIMUM_MQ=20"
};
Assert.assertEquals(runPicardCommandLine(args), 0);

final MetricsFile<?, Integer> output = new MetricsFile<>();
output.read(new FileReader(metricsFile));

final Histogram<Integer> hist = output.getHistogram();

assertNull(hist.get(1));
assertEquals(hist.get(2).getValue(),4);
assertEquals(hist.get(3).getValue(),1);
assertEquals(hist.get(4).getValue(),1);
assertNull(hist.get(5));
assertNull(hist.get(6));
assertEquals(hist.getCount(),6); // sets
assertEquals(hist.getSum(),15); // unique barcodes (in sets)
}
}
30 changes: 30 additions & 0 deletions testdata/picard/independent_replicates/twopairsWithManyUmis.sam
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@HD VN:1.0 SO:coordinate
@SQ SN:chr1 LN:501
@SQ SN:chr2 LN:501
@SQ SN:chr3 LN:501
@SQ SN:chr4 LN:101
@SQ SN:chr5 LN:101
@SQ SN:chr6 LN:101
@SQ SN:chr7 LN:404
@SQ SN:chr8 LN:202
@RG ID:1AAXX.3 SM:test LB:mylib.yossi PL:ILLUMINA
@PG ID:bwa PN:bwa VN:3 CL:bwa aln
@CO manually created file. second pair is a copy of the first pair except that it's marked as a duplicate, and the 10th base of the
@CO first read is modified C->t (lower case for easy view). this corresponds to position 11
@CO 123456789 123456789 123456789 123456789 123456789 1234567890
1AAXX.3.1.1 83 chr1 1 255 101M = 302 0201 CAACAGAAGCCGGTATCTGaGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1AAXX.3.1.2 83 chr1 1 255 101M = 302 0201 CAACAGAAGCtGGNATCTGaGcTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1AAXX.3.1.1 163 chr1 302 255 101M = 1 -201 NCGCGGCATCcCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1AAXX.3.1.2 163 chr1 302 255 101M = 1 -201 NCGCGGCATCcCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1AAXX.3.2.1 99 chr2 1 255 101M = 302 0201 CAACAGAAGCCGGTATCTGaGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1AAXX.3.2.2 163 chr2 1 255 101M = 302 0201 CAACAGAAGCtGGNATCTGaGcTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1AAXX.3.2.1 147 chr2 302 255 101M = 1 -201 NCGCGGCATCcCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1AAXX.3.2.2 83 chr2 302 255 101M = 1 -201 NCGCGGCATCcCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1ACXX.3.3.1 83 chr3 2 255 101M = 303 +201 AACAGAAGCCGGTATCTGaGTTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1ACXX.3.3.2 83 chr3 2 255 101M = 303 +201 AACAGAAGCtGGNATCTGaGcTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1ACXX.3.4.1 83 chr3 2 255 101M = 303 +201 AACAGAAGCCGGTATCTGaGTTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1ACXX.3.4.2 83 chr3 2 255 101M = 303 +201 AACAGAAGCtGGNATCTGaGcTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:GG-GG QX:Z:AA AA
1ACXX.3.3.1 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AA-AA QX:Z:AA AA
1ACXX.3.3.2 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CC-CC QX:Z:AA AA
1ACXX.3.4.1 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:TT-TT QX:Z:AA AA
1ACXX.3.4.2 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:GG-GG QX:Z:AA AA
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
1ACXX.3.3.1 83 chr3 2 255 101M = 303 +201 AACAGAAGCCGGTATCTGaGTTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AAAA QX:Z:AAAA
1ACXX.3.3.2 83 chr3 2 255 101M = 303 +201 AACAGAAGCtGGNATCTGaGcTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCC QX:Z:AAAA
1ACXX.3.4.1 83 chr3 2 20 101M = 303 +201 AACAGAAGCCGGTATCTGaGTTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AAAA QX:Z:AAAA
1ACXX.3.4.2 83 chr3 2 20 101M = 303 +201 AACAGAAGCtGGNATCTGaGcTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCT QX:Z:AAAA
1ACXX.3.4.2 83 chr3 2 20 101M = 303 +201 AACAGAAGCtGGNATCTGaGcTTGTGTTTCgGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAANN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCC QX:Z:AAAA
1ACXX.3.3.1 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AAAA QX:Z:AAAA
1ACXX.3.3.2 163 chr3 303 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCC QX:Z:AAAA
1ACXX.3.4.1 163 chr3 303 20 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AAAT QX:Z:AAAA
1ACXX.3.4.2 163 chr3 303 20 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCG QX:Z:AAAA
1ACXX.3.4.1 163 chr3 303 20 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:AAAA QX:Z:AAAA
1ACXX.3.4.2 163 chr3 303 20 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAAtCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:1AAXX.3 MC:Z:101M RX:Z:CCCC QX:Z:AAAA

0 comments on commit 8159088

Please sign in to comment.