From df3e4e1abd41c47ac95a0197b41761255d6fa8c4 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 11:22:35 -0400 Subject: [PATCH 01/21] First working code to use SamRecordFactory to produce objects of our own design in SAMFileReader --- .../gatk/datasources/reads/SAMDataSource.java | 4 + .../sting/utils/sam/GATKSamRecordFactory.java | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java 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 74d39ecb0..96d8d7e1a 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 @@ -43,6 +43,7 @@ import org.broadinstitute.sting.utils.baq.BAQ; import org.broadinstitute.sting.utils.baq.BAQSamIterator; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.GATKSamRecordFactory; import java.io.File; import java.lang.reflect.InvocationTargetException; @@ -57,6 +58,8 @@ import java.util.*; * Converts shards to SAM iterators over the specified region */ public class SAMDataSource { + final private static GATKSamRecordFactory factory = new GATKSamRecordFactory(); + /** Backing support for reads. */ protected final ReadProperties readProperties; @@ -756,6 +759,7 @@ public class SAMDataSource { public SAMReaders(Collection readerIDs, SAMFileReader.ValidationStringency validationStringency) { for(SAMReaderID readerID: readerIDs) { SAMFileReader reader = new SAMFileReader(readerID.samFile); + reader.setSAMRecordFactory(factory); reader.enableFileSource(true); reader.enableIndexMemoryMapping(false); if(!enableLowMemorySharding) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java new file mode 100644 index 000000000..7c98a68e6 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.sam; + +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import net.sf.samtools.SAMRecordFactory; +import net.sf.samtools.BAMRecord; +import org.broadinstitute.sting.utils.exceptions.UserException; + +/** + * Factory interface which allows plugging in of different classes for generating instances of + * SAMRecord and BAMRecord when reading from SAM/BAM files. + * + * @author Tim Fennell + */ +public class GATKSamRecordFactory implements SAMRecordFactory { + + /** Create a new SAMRecord to be filled in */ + public SAMRecord createSAMRecord(SAMFileHeader header) { + throw new UserException.BadInput("The GATK now longer supports input SAM files"); + } + + /** Create a new BAM Record. */ + public BAMRecord createBAMRecord(final SAMFileHeader header, + final int referenceSequenceIndex, + final int alignmentStart, + final short readNameLength, + final short mappingQuality, + final int indexingBin, + final int cigarLen, + final int flags, + final int readLen, + final int mateReferenceSequenceIndex, + final int mateAlignmentStart, + final int insertSize, + final byte[] variableLengthBlock) { + return new BAMRecord(header, + referenceSequenceIndex, + alignmentStart, + readNameLength, + mappingQuality, + indexingBin, + cigarLen, + flags, + readLen, + mateReferenceSequenceIndex, + mateAlignmentStart, + insertSize, + variableLengthBlock); + } +} From 7928b287fcb76d80bcc1e6889f0474f782d2fe08 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 13:15:27 -0400 Subject: [PATCH 02/21] GATKSamRecord now produced by SAMFileReaders by default -- Removed all of the unnecessary caching operations in GATKSAMRecord -- GATKSAMRecord renamed to GATKSamRecord for consistency --- .../gatk/datasources/reads/SAMDataSource.java | 4 +- .../iterators/ReadFormattingIterator.java | 26 +- ...elGenotypeLikelihoodsCalculationModel.java | 6 +- .../recalibration/CountCovariatesWalker.java | 6 +- .../recalibration/RecalDataManager.java | 8 +- .../TableRecalibrationWalker.java | 4 +- .../sting/utils/sam/GATKSAMRecord.java | 368 +----------------- .../sting/utils/sam/GATKSamRecordFactory.java | 26 +- .../sting/utils/sam/ReadUtils.java | 18 +- 9 files changed, 81 insertions(+), 385 deletions(-) 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 96d8d7e1a..8452aadfd 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 @@ -647,7 +647,9 @@ public class SAMDataSource { BAQ.QualityMode qmode, IndexedFastaSequenceFile refReader, byte defaultBaseQualities) { - wrappedIterator = new ReadFormattingIterator(wrappedIterator, useOriginalBaseQualities, defaultBaseQualities); + if ( useOriginalBaseQualities || defaultBaseQualities >= 0 ) + // only wrap if we are replacing the original qualitiies or using a default base quality + wrappedIterator = new ReadFormattingIterator(wrappedIterator, useOriginalBaseQualities, defaultBaseQualities); // NOTE: this (and other filtering) should be done before on-the-fly sorting // as there is no reason to sort something that we will end of throwing away 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 2f30d12a8..9a89d2086 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/iterators/ReadFormattingIterator.java @@ -2,7 +2,6 @@ package org.broadinstitute.sting.gatk.iterators; import net.sf.samtools.SAMRecord; import org.apache.log4j.Logger; -import org.broadinstitute.sting.utils.sam.GATKSAMRecord; /** * An iterator which does post-processing of a read, including potentially wrapping @@ -78,7 +77,30 @@ public class ReadFormattingIterator implements StingSAMIterator { * no next exists. */ public SAMRecord next() { - return new GATKSAMRecord(wrappedIterator.next(), useOriginalBaseQualities, defaultBaseQualities); + SAMRecord rec = wrappedIterator.next(); + + // if we are using default quals, check if we need them, and add if necessary. + // 1. we need if reads are lacking or have incomplete quality scores + // 2. we add if defaultBaseQualities has a positive value + if (defaultBaseQualities >= 0) { + byte reads [] = rec.getReadBases(); + byte quals [] = rec.getBaseQualities(); + if (quals == null || quals.length < reads.length) { + byte new_quals [] = new byte [reads.length]; + for (int i=0; i attributes = record.getAttributes(); - for ( SAMTagAndValue attribute : attributes ) - setAttribute(attribute.tag, attribute.value); - - // if we are using default quals, check if we need them, and add if necessary. - // 1. we need if reads are lacking or have incomplete quality scores - // 2. we add if defaultBaseQualities has a positive value - if (defaultBaseQualities >= 0) { - byte reads [] = record.getReadBases(); - byte quals [] = record.getBaseQualities(); - if (quals == null || quals.length < reads.length) { - byte new_quals [] = new byte [reads.length]; - for (int i=0; i getAttributes() { return mRecord.getAttributes(); } - - public SAMFileHeader getHeader() { return mRecord.getHeader(); } - - public void setHeader(SAMFileHeader samFileHeader) { mRecord.setHeader(samFileHeader); } - - public byte[] getVariableBinaryRepresentation() { return mRecord.getVariableBinaryRepresentation(); } - - public int getAttributesBinarySize() { return mRecord.getAttributesBinarySize(); } - - public String format() { return mRecord.format(); } - - public List getAlignmentBlocks() { return mRecord.getAlignmentBlocks(); } - - public List validateCigar(long l) { return mRecord.validateCigar(l); } - @Override public boolean equals(Object o) { if (this == o) return true; // note -- this forbids a GATKSAMRecord being equal to its underlying SAMRecord - if (!(o instanceof GATKSAMRecord)) return false; + if (!(o instanceof GATKSamRecord)) return false; // note that we do not consider the GATKSAMRecord internal state at all - return mRecord.equals(((GATKSAMRecord)o).mRecord); - } - - public int hashCode() { return mRecord.hashCode(); } - - public List isValid() { return mRecord.isValid(); } - - public Object clone() throws CloneNotSupportedException { return mRecord.clone(); } - - public String toString() { return mRecord.toString(); } - - public SAMFileSource getFileSource() { return mRecord.getFileSource(); } - - /** - * Sets a marker providing the source reader for this file and the position in the file from which the read originated. - * @param fileSource source of the given file. - */ - @Override - protected void setFileSource(final SAMFileSource fileSource) { - try { - Method method = SAMRecord.class.getDeclaredMethod("setFileSource",SAMFileSource.class); - method.setAccessible(true); - method.invoke(mRecord,fileSource); - } - catch(Exception ex) { - throw new ReviewedStingException("Unable to invoke setFileSource method",ex); - } + return super.equals(o); } } diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java index 7c98a68e6..9076f06ae 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -57,18 +57,18 @@ public class GATKSamRecordFactory implements SAMRecordFactory { final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) { - return new BAMRecord(header, - referenceSequenceIndex, - alignmentStart, - readNameLength, - mappingQuality, - indexingBin, - cigarLen, - flags, - readLen, - mateReferenceSequenceIndex, - mateAlignmentStart, - insertSize, - variableLengthBlock); + return new GATKSamRecord(header, + referenceSequenceIndex, + alignmentStart, + readNameLength, + mappingQuality, + indexingBin, + cigarLen, + flags, + readLen, + mateReferenceSequenceIndex, + mateAlignmentStart, + insertSize, + variableLengthBlock); } } 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 d1e9a236f..f91d77244 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -274,10 +274,10 @@ public class ReadUtils { * @param adaptorLength length of adaptor sequence * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec, int adaptorLength) { + public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec, int adaptorLength) { Pair adaptorBoundaries = getAdaptorBoundaries(rec, adaptorLength); - GATKSAMRecord result = (GATKSAMRecord)rec; + GATKSamRecord result = (GATKSamRecord)rec; if ( adaptorBoundaries != null ) { if ( rec.getReadNegativeStrandFlag() && adaptorBoundaries.second >= rec.getAlignmentStart() && adaptorBoundaries.first < rec.getAlignmentEnd() ) @@ -290,7 +290,7 @@ public class ReadUtils { } // return true if the read needs to be completely clipped - private static GATKSAMRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { + private static GATKSamRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { if ( stopPosition >= oldRec.getAlignmentEnd() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -298,9 +298,9 @@ public class ReadUtils { return null; } - GATKSAMRecord rec; + GATKSamRecord rec; try { - rec = (GATKSAMRecord)oldRec.clone(); + rec = (GATKSamRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -370,7 +370,7 @@ public class ReadUtils { return rec; } - private static GATKSAMRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { + private static GATKSamRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { if ( startPosition <= oldRec.getAlignmentStart() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -378,9 +378,9 @@ public class ReadUtils { return null; } - GATKSAMRecord rec; + GATKSamRecord rec; try { - rec = (GATKSAMRecord)oldRec.clone(); + rec = (GATKSamRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -598,7 +598,7 @@ public class ReadUtils { * @param rec original SAM record * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec) { + public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec) { return hardClipAdaptorSequence(rec, DEFAULT_ADAPTOR_SIZE); } From 1b38aa1a7e67deeb4f426b16cf7eaa8d6016e938 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 15:46:44 -0400 Subject: [PATCH 03/21] Cleaning up reduced read code accessors --- .../sting/utils/sam/ReadUtils.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) 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 f91d77244..9fa8fc544 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -55,6 +55,7 @@ public class ReadUtils { public static final String REDUCED_READ_CONSENSUS_COUNTS_TAG = "CC"; public final static byte[] getReducedReadQualityTagValue(final SAMRecord read) { + // TODO -- warning of performance problem. Should be cached in GATKSamRecord return read.getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); } @@ -70,21 +71,6 @@ public class ReadUtils { return getReducedReadQualityTagValue(read)[i]; } - public final static SAMRecord reducedReadWithReducedQuals(final SAMRecord read) { - if ( ! isReducedRead(read) ) throw new IllegalArgumentException("read must be a reduced read"); - return read; -// try { -// SAMRecord newRead = (SAMRecord)read.clone(); -// byte reducedQual = (byte)(int)getReducedReadQualityTagValue(read); -// byte[] newQuals = new byte[read.getBaseQualities().length]; -// Arrays.fill(newQuals, reducedQual); -// newRead.setBaseQualities(newQuals); -// return newRead; -// } catch ( CloneNotSupportedException e ) { -// throw new ReviewedStingException("SAMRecord no longer supports clone", e); -// } - } - // ---------------------------------------------------------------------------------------------------- // // General utilities From 52345f0aec828aca04af8e84259d68ad21ca69c9 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 15:47:36 -0400 Subject: [PATCH 04/21] Meaningful documentation string --- .../sting/utils/sam/GATKSamRecordFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java index 9076f06ae..adde2e293 100644 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSamRecordFactory.java @@ -31,10 +31,10 @@ import net.sf.samtools.BAMRecord; import org.broadinstitute.sting.utils.exceptions.UserException; /** - * Factory interface which allows plugging in of different classes for generating instances of - * SAMRecord and BAMRecord when reading from SAM/BAM files. + * Factory interface implementation used to create GATKSamRecords + * from SAMFileReaders with SAM-JDK * - * @author Tim Fennell + * @author Mark DePristo */ public class GATKSamRecordFactory implements SAMRecordFactory { From bba69701b505dec882ff8eee978be0451ec5b335 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:49:17 -0400 Subject: [PATCH 05/21] Now creates GATKSamRecords now SamRecords --- .../org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 2dcdd5ce6..b6b671360 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -146,7 +146,7 @@ public class ArtificialSAMUtils { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); - SAMRecord record = new SAMRecord(header); + SAMRecord record = new GATKSamRecord(header); record.setReadName(name); record.setReferenceIndex(refIndex); record.setAlignmentStart(alignmentStart); From 3227143a1c930db8a243f1be264840a7e76ea7fc Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:50:27 -0400 Subject: [PATCH 06/21] Systematic test code for FragmentPileup -- Creates all combinatinos of overlapping and non-overlapping read pair pileups in all orientations and first/second pairings to validate fragment detection. --- .../utils/pileup/FragmentPileupUnitTest.java | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java new file mode 100644 index 000000000..778259528 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.pileup; + +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.*; + +/** + * Test routines for read-backed pileup. + */ +public class FragmentPileupUnitTest extends BaseTest { + private static SAMFileHeader header; + + private class FragmentPileupTest extends TestDataProvider { + List states = new ArrayList(); + + private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); + + for ( int pos = leftStart; pos < rightStart + readLen; pos++) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, rightStart, readLen); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + boolean posCoveredByLeft = pos >= left.getAlignmentStart() && pos <= left.getAlignmentEnd(); + boolean posCoveredByRight = pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd(); + + if ( posCoveredByLeft || posCoveredByRight ) { + List reads = new ArrayList(); + List offsets = new ArrayList(); + + if ( posCoveredByLeft ) { + reads.add(left); + offsets.add(pos - left.getAlignmentStart()); + } + + if ( posCoveredByRight ) { + reads.add(right); + offsets.add(pos - right.getAlignmentStart()); + } + + boolean shouldBeFragment = posCoveredByLeft && posCoveredByRight; + ReadBackedPileup pileup = new ReadBackedPileupImpl(null, reads, offsets); + TestState testState = new TestState(shouldBeFragment, pileup); + states.add(testState); + } + } + } + } + + private class TestState { + boolean shouldBeFragment; + ReadBackedPileup pileup; + + private TestState(final boolean shouldBeFragment, final ReadBackedPileup pileup) { + this.shouldBeFragment = shouldBeFragment; + this.pileup = pileup; + } + } + + @DataProvider(name = "fragmentPileupTest") + public Object[][] createTests() { + for ( boolean leftIsFirst : Arrays.asList(true, false) ) { + for ( boolean leftIsNegative : Arrays.asList(true, false) ) { + // Overlapping pair + // ----> [first] + // <--- [second] + new FragmentPileupTest("overlapping-pair", 10, 1, 5, leftIsFirst, leftIsNegative); + + // Non-overlapping pair + // ----> + // <---- + new FragmentPileupTest("nonoverlapping-pair", 10, 1, 15, leftIsFirst, leftIsNegative); + } + } + + return FragmentPileupTest.getTests(FragmentPileupTest.class); + } + + @Test(enabled = true, dataProvider = "fragmentPileupTest") + public void testMe(FragmentPileupTest test) { + for ( TestState testState : test.states ) { + ReadBackedPileup rbp = testState.pileup; + FragmentPileup fp = new FragmentPileup(rbp); + Assert.assertEquals(fp.getTwoReadPileup().size(), testState.shouldBeFragment ? 1 : 0); + Assert.assertEquals(fp.getOneReadPileup().size(), testState.shouldBeFragment ? 0 : 1); + } + } + + + @BeforeTest + public void setup() { + header = ArtificialSAMUtils.createArtificialSamHeader(1,1,1000); + } +} From 999a8998ae4d007847f9c2fdd99b4ef3217cc9fe Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Wed, 19 Oct 2011 17:51:48 -0400 Subject: [PATCH 07/21] Constructor for GATKSamRecord with header only, for unit testing --- .../sting/utils/sam/GATKSAMRecord.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 56e6e74be..7956ac388 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -36,6 +36,16 @@ public class GATKSamRecord extends BAMRecord { // These attributes exist in memory only, and are never written to disk. private Map temporaryAttributes; + /** + * HACK TO CREATE GATKSAMRECORD WITH ONLY A HEADER FOR TESTING PURPOSES ONLY + * @param header + */ + public GATKSamRecord(final SAMFileHeader header) { + super(header, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START, + (short)0, (short)255, 0, 1, 0, 1, 0, 0, 0, null); + } + + public GATKSamRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, @@ -57,17 +67,20 @@ public class GATKSamRecord extends BAMRecord { // *** The following methods are overloaded to cache the appropriate data ***// /////////////////////////////////////////////////////////////////////////////// + @Override public String getReadString() { if ( mReadString == null ) mReadString = super.getReadString(); return mReadString; } + @Override public void setReadString(String s) { super.setReadString(s); mReadString = s; } + @Override public SAMReadGroupRecord getReadGroup() { if ( !retrievedReadGroup ) { SAMReadGroupRecord tempReadGroup = super.getReadGroup(); From 94e1898d8f48185593d5717395888ce08abe13f7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:37:45 -0400 Subject: [PATCH 08/21] A canonical set of NGS platforms as enums with convenient manipulation methods --- .../sting/utils/NGSPlatform.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java diff --git a/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java b/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java new file mode 100644 index 000000000..3ab9e1655 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/NGSPlatform.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils; + +import net.sf.samtools.SAMReadGroupRecord; +import net.sf.samtools.SAMRecord; + +/** + * A canonical, master list of the standard NGS platforms. These values + * can be obtained (efficiently) from a GATKSamRecord object with the + * getNGSPlatform method. + * + * @author Mark DePristo + * @since 2011 + */ +public enum NGSPlatform { + ILLUMINA("ILLUMINA", "SLX", "SOLEXA"), + SOLID("SOLID"), + LS454("454"), + COMPLETE_GENOMICS("COMPLETE"), + PACBIO("PACBIO"), + ION_TORRENT("IONTORRENT"), + UNKNOWN("UNKNOWN"); + + /** + * Array of the prefix names in a BAM file for each of the platforms. + */ + private final String[] BAM_PL_NAMES; + + NGSPlatform(final String... BAM_PL_NAMES) { + for ( int i = 0; i < BAM_PL_NAMES.length; i++ ) + BAM_PL_NAMES[i] = BAM_PL_NAMES[i].toUpperCase(); + this.BAM_PL_NAMES = BAM_PL_NAMES; + } + + /** + * Returns a representative PL string for this platform + * @return + */ + public final String getDefaultPlatform() { + return BAM_PL_NAMES[0]; + } + + /** + * Convenience constructor -- calculates the NGSPlatfrom from a SAMRecord. + * Note you should not use this function if you have a GATKSamRecord -- use the + * accessor method instead. + * + * @param read + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromRead(SAMRecord read) { + return fromReadGroup(read.getReadGroup()); + } + + /** + * Returns the NGSPlatform corresponding to the PL tag in the read group + * @param rg + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromReadGroup(SAMReadGroupRecord rg) { + return fromReadGroupPL(rg.getPlatform()); + } + + /** + * Returns the NGSPlatform corresponding to the PL tag in the read group + * @param plFromRG -- the PL field (or equivalent) in a ReadGroup object + * @return an NGSPlatform object matching the PL field of the header, of UNKNOWN if there was no match + */ + public static final NGSPlatform fromReadGroupPL(final String plFromRG) { + if ( plFromRG == null ) return UNKNOWN; + + // todo -- algorithm could be implemented more efficiently, as the list of all + // todo -- names is known upfront, so a decision tree could be used to identify + // todo -- a prefix common to PL + final String pl = plFromRG.toUpperCase(); + for ( final NGSPlatform ngsPlatform : NGSPlatform.values() ) { + for ( final String bamPLName : ngsPlatform.BAM_PL_NAMES ) { + if ( pl.contains(bamPLName) ) + return ngsPlatform; + } + } + + return UNKNOWN; + } +} From ed74ebcfa11ad90c85694dd6666c5d96af807393 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:38:41 -0400 Subject: [PATCH 09/21] GATKSamRecords with efficiency NGSPlatform method --- .../utils/sam/GATKSAMReadGroupRecord.java | 23 +++++++++++++++++++ .../sting/utils/sam/GATKSAMRecord.java | 16 +++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) 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 c7ffcab0c..ff7d12f09 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,7 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.SAMReadGroupRecord; +import org.broadinstitute.sting.utils.NGSPlatform; /** * @author ebanks @@ -15,16 +16,28 @@ public class GATKSAMReadGroupRecord extends SAMReadGroupRecord { // the SAMReadGroupRecord data we're caching private String mSample = null; private String mPlatform = null; + private NGSPlatform mNGSPlatform = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedSample = false; private boolean retrievedPlatform = false; + private boolean retrievedNGSPlatform = false; + public GATKSAMReadGroupRecord(final String id) { + super(id); + } public GATKSAMReadGroupRecord(SAMReadGroupRecord record) { super(record.getReadGroupId(), record); } + public GATKSAMReadGroupRecord(SAMReadGroupRecord record, NGSPlatform pl) { + super(record.getReadGroupId(), record); + setPlatform(pl.getDefaultPlatform()); + mNGSPlatform = pl; + retrievedPlatform = retrievedNGSPlatform = true; + } + /////////////////////////////////////////////////////////////////////////////// // *** The following methods are overloaded to cache the appropriate data ***// /////////////////////////////////////////////////////////////////////////////// @@ -55,5 +68,15 @@ public class GATKSAMReadGroupRecord extends SAMReadGroupRecord { super.setPlatform(s); mPlatform = s; retrievedPlatform = true; + retrievedNGSPlatform = false; // recalculate the NGSPlatform + } + + public NGSPlatform getNGSPlatform() { + if ( ! retrievedNGSPlatform ) { + mNGSPlatform = NGSPlatform.fromReadGroupPL(getPlatform()); + retrievedNGSPlatform = true; + } + + return mNGSPlatform; } } \ No newline at end of file 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 7956ac388..037545a78 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -1,6 +1,7 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.*; +import org.broadinstitute.sting.utils.NGSPlatform; import java.util.HashMap; import java.util.Map; @@ -25,7 +26,7 @@ import java.util.Map; public class GATKSamRecord extends BAMRecord { // the SAMRecord data we're caching private String mReadString = null; - private SAMReadGroupRecord mReadGroup = null; + private GATKSAMReadGroupRecord mReadGroup = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedReadGroup = false; @@ -81,17 +82,22 @@ public class GATKSamRecord extends BAMRecord { } @Override - public SAMReadGroupRecord getReadGroup() { + public GATKSAMReadGroupRecord getReadGroup() { if ( !retrievedReadGroup ) { SAMReadGroupRecord tempReadGroup = super.getReadGroup(); - mReadGroup = (tempReadGroup == null ? tempReadGroup : new GATKSAMReadGroupRecord(tempReadGroup)); + mReadGroup = (tempReadGroup == null ? null : new GATKSAMReadGroupRecord(tempReadGroup)); retrievedReadGroup = true; } return mReadGroup; } - public void setReadGroup(SAMReadGroupRecord record) { - mReadGroup = record; + public NGSPlatform getNGSPlatform() { + return getReadGroup().getNGSPlatform(); + } + + public void setReadGroup( final GATKSAMReadGroupRecord readGroup ) { + mReadGroup = readGroup; + retrievedReadGroup = true; } /** From be797a8a1f4eb72fe5843864decc45d2e7d852e8 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:39:21 -0400 Subject: [PATCH 10/21] Recalibrator now uses the much more efficient NGSPlatform in the cycle covariates system --- ivy.xml | 2 +- .../walkers/recalibration/CycleCovariate.java | 130 ++---------------- .../recalibration/RecalDataManager.java | 8 +- 3 files changed, 14 insertions(+), 126 deletions(-) diff --git a/ivy.xml b/ivy.xml index 96c1de844..0737b676d 100644 --- a/ivy.xml +++ b/ivy.xml @@ -10,7 +10,7 @@ - + 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 e117454f9..857f74155 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 @@ -2,9 +2,12 @@ package org.broadinstitute.sting.gatk.walkers.recalibration; import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.utils.BaseUtils; +import org.broadinstitute.sting.utils.NGSPlatform; import org.broadinstitute.sting.utils.exceptions.UserException; +import org.broadinstitute.sting.utils.sam.GATKSamRecord; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; /* @@ -46,6 +49,9 @@ import java.util.List; */ public class CycleCovariate implements StandardCovariate { + private final static EnumSet DISCRETE_CYCLE_PLATFORMS = EnumSet.of(NGSPlatform.ILLUMINA, NGSPlatform.SOLID, NGSPlatform.PACBIO, NGSPlatform.COMPLETE_GENOMICS); + private final static EnumSet FLOW_CYCLE_PLATFORMS = EnumSet.of(NGSPlatform.LS454, NGSPlatform.ION_TORRENT); + // Initialize any member variables using the command-line arguments passed to the walkers public void initialize( final RecalibrationArgumentCollection RAC ) { if( RAC.DEFAULT_PLATFORM != null ) { @@ -58,122 +64,6 @@ public class CycleCovariate implements StandardCovariate { } } - /* - // Used to pick out the covariate's value from attributes of the read - public final Comparable getValue( final SAMRecord read, final int offset ) { - - int cycle = 1; - - //----------------------------- - // ILLUMINA and SOLID - //----------------------------- - - if( read.getReadGroup().getPlatform().equalsIgnoreCase( "ILLUMINA" ) || read.getReadGroup().getPlatform().equalsIgnoreCase( "SLX" ) || // Some bams have "illumina" and others have "SLX" - read.getReadGroup().getPlatform().equalsIgnoreCase( "SOLID" ) || read.getReadGroup().getPlatform().equalsIgnoreCase( "ABI_SOLID" )) { // Some bams have "solid" and others have "ABI_SOLID" - cycle = offset + 1; - if( read.getReadNegativeStrandFlag() ) { - cycle = read.getReadLength() - offset; - } - } - - //----------------------------- - // 454 - //----------------------------- - - else if( read.getReadGroup().getPlatform().contains( "454" ) ) { // Some bams have "LS454" and others have just "454" - final byte[] bases = read.getReadBases(); - - // BUGBUG: Consider looking at degradation of base quality scores in homopolymer runs to detect when the cycle incremented even though the nucleotide didn't change - // For example, AAAAAAA was probably read in two flow cycles but here we count it as one - if( !read.getReadNegativeStrandFlag() ) { // Forward direction - int iii = 0; - while( iii <= offset ) - { - while( iii <= offset && bases[iii] == (byte)'T' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'A' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'C' ) { iii++; } - while( iii <= offset && bases[iii] == (byte)'G' ) { iii++; } - if( iii <= offset ) { cycle++; } - if( iii <= offset && !BaseUtils.isRegularBase(bases[iii]) ) { iii++; } - - } - } else { // Negative direction - int iii = bases.length-1; - while( iii >= offset ) - { - while( iii >= offset && bases[iii] == (byte)'T' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'A' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'C' ) { iii--; } - while( iii >= offset && bases[iii] == (byte)'G' ) { iii--; } - if( iii >= offset ) { cycle++; } - if( iii >= offset && !BaseUtils.isRegularBase(bases[iii]) ) { iii--; } - } - } - } - - //----------------------------- - // SOLID (unused), only to be used in conjunction with PrimerRoundCovariate - //----------------------------- - - //else if( read.getReadGroup().getPlatform().equalsIgnoreCase( "SOLID" ) ) { - // // The ligation cycle according to http://www3.appliedbiosystems.com/cms/groups/mcb_marketing/documents/generaldocuments/cms_057511.pdf - // int pos = offset + 1; - // if( read.getReadNegativeStrandFlag() ) { - // pos = read.getReadLength() - offset; - // } - // cycle = pos / 5; // integer division - //} - - //----------------------------- - // UNRECOGNIZED PLATFORM - //----------------------------- - - else { // Platform is unrecognized so revert to the default platform but warn the user first - if( defaultPlatform != null) { // The user set a default platform - if( !warnedUserBadPlatform ) { - Utils.warnUser( "Platform string (" + read.getReadGroup().getPlatform() + ") unrecognized in CycleCovariate. " + - "Defaulting to platform = " + defaultPlatform + "." ); - } - warnedUserBadPlatform = true; - - read.getReadGroup().setPlatform( defaultPlatform ); - return getValue( read, offset ); // A recursive call - } else { // The user did not set a default platform - throw new StingException( "Platform string (" + read.getReadGroup().getPlatform() + ") unrecognized in CycleCovariate. " + - "No default platform specified. Users must set the default platform using the --default_platform argument." ); - } - } - - // Differentiate between first and second of pair. - // The sequencing machine cycle keeps incrementing for the second read in a pair. So it is possible for a read group - // to have an error affecting quality at a particular cycle on the first of pair which carries over to the second of pair. - // Therefore the cycle covariate must differentiate between first and second of pair reads. - // This effect can not be corrected by pulling out the first of pair and second of pair flags into a separate covariate because - // the current sequential model would consider the effects independently instead of jointly. - if( read.getReadPairedFlag() && read.getSecondOfPairFlag() ) { - cycle *= -1; - } - - return cycle; - } - */ - - // todo -- this should be put into a common place in the code base - private static List ILLUMINA_NAMES = Arrays.asList("ILLUMINA", "SLX", "SOLEXA"); - private static List SOLID_NAMES = Arrays.asList("SOLID"); - private static List LS454_NAMES = Arrays.asList("454"); - private static List COMPLETE_GENOMICS_NAMES = Arrays.asList("COMPLETE"); - private static List PACBIO_NAMES = Arrays.asList("PACBIO"); - private static List ION_TORRENT_NAMES = Arrays.asList("IONTORRENT"); - - private static boolean isPlatform(SAMRecord read, List names) { - String pl = read.getReadGroup().getPlatform().toUpperCase(); - for ( String name : names ) - if ( pl.contains( name ) ) - return true; - return false; - } - // Used to pick out the covariate's value from attributes of the read public void getValues(SAMRecord read, Comparable[] comparable) { @@ -181,7 +71,8 @@ public class CycleCovariate implements StandardCovariate { // Illumina, Solid, PacBio, and Complete Genomics //----------------------------- - if( isPlatform(read, ILLUMINA_NAMES) || isPlatform(read, SOLID_NAMES) || isPlatform(read, PACBIO_NAMES) || isPlatform(read, COMPLETE_GENOMICS_NAMES) ) { + final NGSPlatform ngsPlatform = ((GATKSamRecord)read).getNGSPlatform(); + if( DISCRETE_CYCLE_PLATFORMS.contains(ngsPlatform) ) { final int init; final int increment; if( !read.getReadNegativeStrandFlag() ) { @@ -227,8 +118,7 @@ public class CycleCovariate implements StandardCovariate { //----------------------------- // 454 and Ion Torrent //----------------------------- - - else if ( isPlatform(read, LS454_NAMES) || isPlatform(read, ION_TORRENT_NAMES)) { // Some bams have "LS454" and others have just "454" + else if( FLOW_CYCLE_PLATFORMS.contains(ngsPlatform) ) { final int readLength = read.getReadLength(); final byte[] bases = read.getReadBases(); @@ -273,8 +163,6 @@ public class CycleCovariate implements StandardCovariate { else { throw new IllegalStateException("This method hasn't been implemented yet for " + read.getReadGroup().getPlatform()); } - - } // Used to get the covariate's value from input csv file in TableRecalibrationWalker 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 bd949aa81..a8a829801 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 @@ -35,6 +35,7 @@ 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.AlignmentUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMReadGroupRecord; import org.broadinstitute.sting.utils.sam.GATKSamRecord; import java.util.ArrayList; @@ -228,8 +229,7 @@ public class RecalDataManager { * @param RAC The list of shared command line arguments */ public static void parseSAMRecord( final SAMRecord read, final RecalibrationArgumentCollection RAC ) { - - SAMReadGroupRecord readGroup = read.getReadGroup(); + GATKSAMReadGroupRecord readGroup = ((GATKSamRecord)read).getReadGroup(); // If there are no read groups we have to default to something, and that something could be specified by the user using command line arguments if( readGroup == null ) { @@ -241,7 +241,7 @@ public class RecalDataManager { warnUserNullReadGroup = true; } // There is no readGroup so defaulting to these values - readGroup = new SAMReadGroupRecord( RAC.DEFAULT_READ_GROUP ); + readGroup = new GATKSAMReadGroupRecord( RAC.DEFAULT_READ_GROUP ); readGroup.setPlatform( RAC.DEFAULT_PLATFORM ); ((GATKSamRecord)read).setReadGroup( readGroup ); } else { @@ -251,7 +251,7 @@ public class RecalDataManager { if( RAC.FORCE_READ_GROUP != null && !readGroup.getReadGroupId().equals(RAC.FORCE_READ_GROUP) ) { // Collapse all the read groups into a single common String provided by the user final String oldPlatform = readGroup.getPlatform(); - readGroup = new SAMReadGroupRecord( RAC.FORCE_READ_GROUP ); + readGroup = new GATKSAMReadGroupRecord( RAC.FORCE_READ_GROUP ); readGroup.setPlatform( oldPlatform ); ((GATKSamRecord)read).setReadGroup( readGroup ); } From 2403e9606201070f6c38039d6b5d2fcff1ea5e7c Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 09:59:24 -0400 Subject: [PATCH 11/21] Renamed GATKSamRecord -> GATKSAMRecord for consistency. Better docs. --- ...elGenotypeLikelihoodsCalculationModel.java | 4 +- .../recalibration/CountCovariatesWalker.java | 6 +-- .../walkers/recalibration/CycleCovariate.java | 4 +- .../recalibration/RecalDataManager.java | 10 ++-- .../TableRecalibrationWalker.java | 4 +- .../sting/utils/NGSPlatform.java | 4 +- .../sting/utils/sam/ArtificialSAMUtils.java | 2 +- .../sting/utils/sam/GATKSAMRecord.java | 53 ++++++++++++++----- .../sting/utils/sam/GATKSamRecordFactory.java | 2 +- .../sting/utils/sam/ReadUtils.java | 20 +++---- 10 files changed, 67 insertions(+), 42 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 1eafcfb10..aea63b61d 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 @@ -39,7 +39,7 @@ 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.sam.GATKSamRecord; +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; @@ -125,7 +125,7 @@ public class IndelGenotypeLikelihoodsCalculationModel extends GenotypeLikelihood for ( ExtendedEventPileupElement p : indelPileup.toExtendedIterable() ) { //SAMRecord read = p.getRead(); - GATKSamRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); + GATKSAMRecord read = ReadUtils.hardClipAdaptorSequence(p.getRead()); if (read == null) continue; if(ReadUtils.is454Read(read)) { 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 424d4cdd6..1bdb70bdd 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 @@ -41,7 +41,7 @@ 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.pileup.PileupElement; -import org.broadinstitute.sting.utils.sam.GATKSamRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import java.io.PrintStream; import java.util.ArrayList; @@ -352,7 +352,7 @@ public class CountCovariatesWalker extends LocusWalker adaptorBoundaries = getAdaptorBoundaries(rec, adaptorLength); - GATKSamRecord result = (GATKSamRecord)rec; + GATKSAMRecord result = (GATKSAMRecord)rec; if ( adaptorBoundaries != null ) { if ( rec.getReadNegativeStrandFlag() && adaptorBoundaries.second >= rec.getAlignmentStart() && adaptorBoundaries.first < rec.getAlignmentEnd() ) @@ -276,7 +276,7 @@ public class ReadUtils { } // return true if the read needs to be completely clipped - private static GATKSamRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { + private static GATKSAMRecord hardClipStartOfRead(SAMRecord oldRec, int stopPosition) { if ( stopPosition >= oldRec.getAlignmentEnd() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -284,9 +284,9 @@ public class ReadUtils { return null; } - GATKSamRecord rec; + GATKSAMRecord rec; try { - rec = (GATKSamRecord)oldRec.clone(); + rec = (GATKSAMRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -356,7 +356,7 @@ public class ReadUtils { return rec; } - private static GATKSamRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { + private static GATKSAMRecord hardClipEndOfRead(SAMRecord oldRec, int startPosition) { if ( startPosition <= oldRec.getAlignmentStart() ) { // BAM representation issue -- we can't clip away all bases in a read, just leave it alone and let the filter deal with it @@ -364,9 +364,9 @@ public class ReadUtils { return null; } - GATKSamRecord rec; + GATKSAMRecord rec; try { - rec = (GATKSamRecord)oldRec.clone(); + rec = (GATKSAMRecord)oldRec.clone(); } catch (Exception e) { return null; } @@ -584,7 +584,7 @@ public class ReadUtils { * @param rec original SAM record * @return a new read with adaptor sequence hard-clipped out or null if read is fully clipped */ - public static GATKSamRecord hardClipAdaptorSequence(final SAMRecord rec) { + public static GATKSAMRecord hardClipAdaptorSequence(final SAMRecord rec) { return hardClipAdaptorSequence(rec, DEFAULT_ADAPTOR_SIZE); } From b863390cb1a4c89d8a77cdc6a20c76aa5f810ac8 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Fri, 21 Oct 2011 13:28:05 -0400 Subject: [PATCH 13/21] Moving reduced read functionality into GATKSAMRecord -- More functions take / produce GATKSAMRecords instead of SAMRecord --- .../indels/PairHMMIndelErrorModel.java | 2 +- .../sting/utils/pileup/PileupElement.java | 7 +-- .../sting/utils/sam/ArtificialSAMUtils.java | 11 +++-- .../sting/utils/sam/GATKSAMRecord.java | 48 ++++++++++++++++++- .../sting/utils/sam/ReadUtils.java | 18 ------- .../sting/utils/ReadUtilsUnitTest.java | 12 ++--- .../utils/ReservoirDownsamplerUnitTest.java | 5 +- 7 files changed, 67 insertions(+), 36 deletions(-) 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 9edf5b5d4..3a824cdfe 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 @@ -393,7 +393,7 @@ public class PairHMMIndelErrorModel { for (PileupElement p: pileup) { // > 1 when the read is a consensus read representing multiple independent observations - final boolean isReduced = ReadUtils.isReducedRead(p.getRead()); + final boolean isReduced = p.isReducedRead(); readCounts[readIdx] = isReduced ? p.getReducedCount() : 1; // check if we've already computed likelihoods for this pileup element (i.e. for this read at this location) 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 f6ed792a5..e47b6ada7 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -4,6 +4,7 @@ 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.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; /** @@ -82,16 +83,16 @@ public class PileupElement { // -------------------------------------------------------------------------- public boolean isReducedRead() { - return ReadUtils.isReducedRead(getRead()); + return ((GATKSAMRecord)read).isReducedRead(); } public int getReducedCount() { if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced count for non-reduced read " + getRead().getReadName()); - return ReadUtils.getReducedCount(getRead(), offset); + return ((GATKSAMRecord)read).getReducedCount(offset); } public byte getReducedQual() { if ( ! isReducedRead() ) throw new IllegalArgumentException("Cannot get reduced qual for non-reduced read " + getRead().getReadName()); - return ReadUtils.getReducedQual(getRead(), offset); + return getQual(); } } \ No newline at end of file diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 85011f2e0..4eba32383 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -134,6 +134,7 @@ public class ArtificialSAMUtils { /** * Create an artificial read based on the parameters. The cigar string will be *M, where * is the length of the read * + * * @param header the SAM header to associate the read with * @param name the name of the read * @param refIndex the reference index, i.e. what chromosome to associate it with @@ -142,11 +143,11 @@ public class ArtificialSAMUtils { * * @return the artificial read */ - public static SAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, int length ) { + public static GATKSAMRecord createArtificialRead(SAMFileHeader header, String name, int refIndex, int alignmentStart, int length) { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); - SAMRecord record = new GATKSAMRecord(header); + GATKSAMRecord record = new GATKSAMRecord(header); record.setReadName(name); record.setReferenceIndex(refIndex); record.setAlignmentStart(alignmentStart); @@ -166,6 +167,7 @@ public class ArtificialSAMUtils { if (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { record.setReadUnmappedFlag(true); } + return record; } @@ -181,16 +183,17 @@ public class ArtificialSAMUtils { * * @return the artificial read */ - public static SAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, byte[] bases, byte[] qual ) { + public static GATKSAMRecord createArtificialRead( SAMFileHeader header, String name, int refIndex, int alignmentStart, byte[] bases, byte[] qual ) { if (bases.length != qual.length) { throw new ReviewedStingException("Passed in read string is different length then the quality array"); } - SAMRecord rec = createArtificialRead(header, name, refIndex, alignmentStart, bases.length); + GATKSAMRecord rec = createArtificialRead(header, name, refIndex, alignmentStart, bases.length); rec.setReadBases(bases); rec.setBaseQualities(qual); if (refIndex == -1) { rec.setReadUnmappedFlag(true); } + return rec; } 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 c363f2072..d50f2ff03 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -45,9 +45,11 @@ public class GATKSAMRecord extends BAMRecord { // the SAMRecord data we're caching private String mReadString = null; private GATKSAMReadGroupRecord mReadGroup = null; + private byte[] reducedReadCounts = null; // because some values can be null, we don't want to duplicate effort private boolean retrievedReadGroup = false; + private boolean retrievedReduceReadCounts = false; // These temporary attributes were added here to make life easier for // certain algorithms by providing a way to label or attach arbitrary data to @@ -60,8 +62,27 @@ public class GATKSAMRecord extends BAMRecord { * @param header */ public GATKSAMRecord(final SAMFileHeader header) { - super(header, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START, - (short)0, (short)255, 0, 1, 0, 1, 0, 0, 0, null); + this(new SAMRecord(header)); + } + + /** + * HACK TO CREATE GATKSAMRECORD BASED ONLY A SAMRECORD FOR TESTING PURPOSES ONLY + * @param read + */ + public GATKSAMRecord(final SAMRecord read) { + super(read.getHeader(), read.getMateReferenceIndex(), + read.getAlignmentStart(), + read.getReadName() != null ? (short)read.getReadNameLength() : 0, + (short)read.getMappingQuality(), + 0, + read.getCigarLength(), + read.getFlags(), + read.getReadLength(), + read.getMateReferenceIndex(), + read.getMateAlignmentStart(), + read.getInferredInsertSize(), + new byte[]{}); + super.clearAttributes(); } public GATKSAMRecord(final SAMFileHeader header, @@ -121,6 +142,29 @@ public class GATKSAMRecord extends BAMRecord { retrievedReadGroup = true; } + // + // + // Reduced read functions + // + // + + public byte[] getReducedReadCounts() { + if ( ! retrievedReduceReadCounts ) { + reducedReadCounts = getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); + retrievedReduceReadCounts = true; + } + + return reducedReadCounts; + } + + public boolean isReducedRead() { + return getReducedReadCounts() != null; + } + + public final byte getReducedCount(final int i) { + return getReducedReadCounts()[i]; + } + /** * Checks whether an attribute has been set for the given key. * 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 16abbe498..f8e4927ed 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -52,24 +52,6 @@ public class ReadUtils { // ---------------------------------------------------------------------------------------------------- public static final String REDUCED_READ_QUALITY_TAG = "RQ"; - public static final String REDUCED_READ_CONSENSUS_COUNTS_TAG = "CC"; - - public final static byte[] getReducedReadQualityTagValue(final SAMRecord read) { - // TODO -- warning of performance problem. Should be cached in GATKSAMRecord - return read.getByteArrayAttribute(ReadUtils.REDUCED_READ_QUALITY_TAG); - } - - public final static boolean isReducedRead(final SAMRecord read) { - return getReducedReadQualityTagValue(read) != null; - } - - public final static byte getReducedQual(final SAMRecord read, final int i) { - return read.getBaseQualities()[i]; - } - - public final static byte getReducedCount(final SAMRecord read, final int i) { - return getReducedReadQualityTagValue(read)[i]; - } // ---------------------------------------------------------------------------------------------------- // diff --git a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java index cc0007439..59a6ecb8d 100755 --- a/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/ReadUtilsUnitTest.java @@ -5,6 +5,7 @@ import net.sf.samtools.SAMRecord; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.utils.pileup.PileupElement; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; import org.testng.Assert; import org.testng.annotations.BeforeTest; @@ -12,7 +13,7 @@ import org.testng.annotations.Test; public class ReadUtilsUnitTest extends BaseTest { - SAMRecord read, reducedRead; + GATKSAMRecord read, reducedRead; final static String BASES = "ACTG"; final static String QUALS = "!+5?"; final private static byte[] REDUCED_READ_COUNTS = new byte[]{10, 20, 30, 40}; @@ -47,13 +48,12 @@ public class ReadUtilsUnitTest extends BaseTest { @Test public void testReducedReads() { - Assert.assertFalse(ReadUtils.isReducedRead(read), "isReducedRead is false for normal read"); - Assert.assertEquals(ReadUtils.getReducedReadQualityTagValue(read), null, "No reduced read tag in normal read"); + Assert.assertFalse(read.isReducedRead(), "isReducedRead is false for normal read"); + Assert.assertEquals(read.getReducedReadCounts(), null, "No reduced read tag in normal read"); - Assert.assertTrue(ReadUtils.isReducedRead(reducedRead), "isReducedRead is true for reduced read"); + Assert.assertTrue(reducedRead.isReducedRead(), "isReducedRead is true for reduced read"); for ( int i = 0; i < reducedRead.getReadLength(); i++) { - Assert.assertEquals(ReadUtils.getReducedQual(reducedRead, i), read.getBaseQualities()[i], "Reduced read quality not set to the expected value at " + i); - Assert.assertEquals(ReadUtils.getReducedCount(reducedRead, i), REDUCED_READ_COUNTS[i], "Reduced read count not set to the expected value at " + i); + Assert.assertEquals(reducedRead.getReducedCount(i), REDUCED_READ_COUNTS[i], "Reduced read count not set to the expected value at " + i); } } diff --git a/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java index 76dd5d341..0f19e2f90 100644 --- a/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/ReservoirDownsamplerUnitTest.java @@ -1,5 +1,6 @@ package org.broadinstitute.sting.utils; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.testng.Assert; import org.testng.annotations.Test; import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; @@ -28,7 +29,7 @@ public class ReservoirDownsamplerUnitTest { @Test public void testOneElementWithPoolSizeOne() { - List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); + List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); ReservoirDownsampler downsampler = new ReservoirDownsampler(1); downsampler.addAll(reads); @@ -40,7 +41,7 @@ public class ReservoirDownsamplerUnitTest { @Test public void testOneElementWithPoolSizeGreaterThanOne() { - List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); + List reads = Collections.singletonList(ArtificialSAMUtils.createArtificialRead(header,"read1",0,1,76)); ReservoirDownsampler downsampler = new ReservoirDownsampler(5); downsampler.addAll(reads); From 42bf9adede112282e8e8e45bf987ab01305b0a7e Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 22 Oct 2011 21:36:37 -0400 Subject: [PATCH 14/21] Initial version of "fast" FragmentPileup code -- Uses mayOverlapRoutine in ReadUtils -- Attempts to be smart when doing overlap calculation, to avoid unnecessary allocations -- PileupElement now comparable (sorts on offset than on start) -- Caliper microbenchmark to assess performance --- .../sting/utils/pileup/FragmentPileup.java | 124 ++++++++++++++++-- .../sting/utils/pileup/PileupElement.java | 16 ++- .../sting/utils/sam/ReadUtils.java | 48 +++++++ .../UnifiedGenotyperIntegrationTest.java | 12 +- .../utils/pileup/FragmentPileupBenchmark.java | 108 +++++++++++++++ .../utils/pileup/FragmentPileupUnitTest.java | 60 +++++---- 6 files changed, 323 insertions(+), 45 deletions(-) create mode 100644 public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java 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 f7d237401..f9a94989b 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -1,9 +1,10 @@ package org.broadinstitute.sting.utils.pileup; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; +import org.broadinstitute.sting.utils.sam.ReadUtils; + +import java.util.*; /** * An easy to access fragment-based pileup, which contains two separate pileups. The first @@ -16,28 +17,46 @@ import java.util.Map; * TODO -- technically we could generalize this code to support a pseudo-duplicate marking * TODO -- algorithm that could collect all duplicates into a single super pileup element * + * Oct 21: note that the order of the oneReadPileup and twoReadPileups are not + * defined. The algorithms that produce these lists are in fact producing + * lists of Pileup elements *NOT* sorted by alignment start position of the underlying + * reads. + * * User: depristo * Date: 3/26/11 * Time: 10:09 PM */ public class FragmentPileup { - final Collection oneReadPile; - final Collection twoReadPile = new ArrayList(); + Collection oneReadPile = null; + Collection twoReadPile = null; /** * Create a new Fragment-based pileup from the standard read-based pileup * @param pileup */ public FragmentPileup(ReadBackedPileup pileup) { - Map nameMap = new HashMap(); + //oldSlowCalculation(pileup); + fastNewCalculation(pileup); + } + + protected FragmentPileup(ReadBackedPileup pileup, boolean useOldAlgorithm) { + if ( useOldAlgorithm ) + oldSlowCalculation(pileup); + else + fastNewCalculation(pileup); + } + + private final void oldSlowCalculation(final ReadBackedPileup pileup) { + final Map nameMap = new HashMap(); // build an initial map, grabbing all of the multi-read fragments - for ( PileupElement p : pileup ) { - String readName = p.getRead().getReadName(); + for ( final PileupElement p : pileup ) { + final String readName = p.getRead().getReadName(); - PileupElement pe1 = nameMap.get(readName); + final PileupElement pe1 = nameMap.get(readName); if ( pe1 != null ) { // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); twoReadPile.add(new TwoReadPileupElement(pe1, p)); nameMap.remove(readName); } else { @@ -45,17 +64,96 @@ public class FragmentPileup { } } - // now set the one Read pile to the values in the nameMap with only a single read oneReadPile = nameMap.values(); } + /** + * @param pileup + */ + private final void fastNewCalculation(final ReadBackedPileup pileup) { + Map nameMap = null; // lazy initialization + + for ( final PileupElement p : pileup ) { + final SAMRecord read = p.getRead(); + + switch (ReadUtils.readMightOverlapMate(read) ) { + // we know for certain this read doesn't have an overlapping mate + case NO: { + addToOnePile(p); + break; + } + + // we know that we overlap our mate, so put the read in the nameMap in + // case our mate shows up + case LEFT_YES: { + nameMap = addToNameMap(nameMap, p); + break; + } + + // read starts at the same position, so we are looking at either the first or + // the second read. In the first, add it to the map, in the second grab it + // from the map and create a fragment + case SAME_START: { + final PileupElement pe1 = getFromNameMap(nameMap, p); + if ( pe1 != null ) { + addToTwoPile(pe1, p); + nameMap.remove(p.getRead().getReadName()); + } else { + nameMap = addToNameMap(nameMap, p); + } + break; + } + + + // in this case we need to see if our mate is already present, and if so + // grab the read from the list + case RIGHT_MAYBE: { + final PileupElement pe1 = getFromNameMap(nameMap, p); + if ( pe1 != null ) { + addToTwoPile(pe1, p); + nameMap.remove(p.getRead().getReadName()); + } else { + addToOnePile(p); + } + break; + } + } + } + + if ( nameMap != null && ! nameMap.isEmpty() ) // could be slightly more optimally + for ( final PileupElement p : nameMap.values() ) + addToOnePile(p); + } + + private final Map addToNameMap(Map map, final PileupElement p) { + if ( map == null ) map = new HashMap(); + map.put(p.getRead().getReadName(), p); + return map; + } + + private final PileupElement getFromNameMap(Map map, final PileupElement p) { + return map == null ? null : map.get(p.getRead().getReadName()); + } + + + private final void addToOnePile(final PileupElement p) { + if ( oneReadPile == null ) oneReadPile = new ArrayList(); + oneReadPile.add(p); + } + + private final void addToTwoPile(final PileupElement p1, final PileupElement p2) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); + twoReadPile.add(new TwoReadPileupElement(p1, p2)); + } + /** * Gets the pileup elements containing two reads, in no particular order * * @return */ public Collection getTwoReadPileup() { - return twoReadPile; + return twoReadPile == null ? Collections.emptyList() : twoReadPile; } /** @@ -64,7 +162,7 @@ public class FragmentPileup { * @return */ public Collection getOneReadPileup() { - return oneReadPile; + return oneReadPile == null ? Collections.emptyList() : oneReadPile; } /** 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 e47b6ada7..3d6b6f4b9 100755 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/PileupElement.java @@ -13,7 +13,7 @@ import org.broadinstitute.sting.utils.sam.ReadUtils; * Date: Apr 14, 2009 * Time: 8:54:05 AM */ -public class PileupElement { +public class PileupElement implements Comparable { public static final byte DELETION_BASE = BaseUtils.D; public static final byte DELETION_QUAL = (byte) 16; public static final byte A_FOLLOWED_BY_INSERTION_BASE = (byte) 87; @@ -76,6 +76,20 @@ public class PileupElement { return isDeletion() ? DELETION_QUAL : read.getBaseQualities()[offset]; } + @Override + public int compareTo(final PileupElement pileupElement) { + if ( offset < pileupElement.offset ) + return -1; + else if ( offset > pileupElement.offset ) + return 1; + else if ( read.getAlignmentStart() < pileupElement.read.getAlignmentStart() ) + return -1; + else if ( read.getAlignmentStart() > pileupElement.read.getAlignmentStart() ) + return 1; + else + return 0; + } + // -------------------------------------------------------------------------- // // Reduced read accessors 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 f8e4927ed..f093e6539 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -214,6 +214,54 @@ public class ReadUtils { return state; } + /** + * s1 e1 + * |-----------------------> [record in hand] + * s2 + * <-----------------------| + * + * s1, e1, and s2 are all in the record. Assuming that s1 < s2 (we are the left most read), + * we can compute whether we overlap with our mate by seeing if s2 <= e1 or no. If e1 < + * s2 then we known that we cannot over. + * + * If we are looking at the right read + * + * s1 + * |-----------------------> + * s2 e2 + * <-----------------------| [record in hand] + * + * we know the position of s1 and s2, but we don't know e1, so we cannot tell if we + * overlap with our mate or not, so in this case we return MAYBE. + * + * Note that if rec has an unmapped mate or is unpaired we certainly know the answer + * + * @param rec + * @return + */ + public static ReadOverlapsMateType readMightOverlapMate(final SAMRecord rec) { + if ( ! rec.getReadPairedFlag() || rec.getMateUnmappedFlag() ) { + return ReadOverlapsMateType.NO; + } else { // read is actually paired + final int recStart = rec.getAlignmentStart(); + final int recEnd = rec.getAlignmentEnd(); + final int mateStart = rec.getMateAlignmentStart(); + + if ( recStart < mateStart ) { + // we are the left most read + return mateStart <= recEnd ? ReadOverlapsMateType.LEFT_YES: ReadOverlapsMateType.NO; + } else if ( recStart == mateStart ) { + // we are the left most read + return ReadOverlapsMateType.SAME_START; + } else { + // we are the right most read, so we cannot tell + return ReadOverlapsMateType.RIGHT_MAYBE; + } + } + } + + public enum ReadOverlapsMateType { LEFT_YES, NO, SAME_START, RIGHT_MAYBE } + private static Pair getAdaptorBoundaries(SAMRecord rec, int adaptorLength) { int isize = rec.getInferredInsertSize(); if ( isize == 0 ) 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 6b6346447..7d6cfc7ad 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 @@ -224,7 +224,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("0bece77ce6bc447438ef9b2921b2dc41")); + Arrays.asList("eeba568272f9b42d5450da75c7cc6d2d")); executeTest(String.format("test indel caller in SLX"), spec); } @@ -252,7 +252,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { " -o %s" + " -L 1:10,000,000-10,500,000", 1, - Arrays.asList("790b1a1d6ab79eee8c24812bb8ca6fae")); + Arrays.asList("19ff9bd3139480bdf79dcbf117cf2b24")); executeTest(String.format("test indel calling, multiple technologies"), spec); } @@ -262,7 +262,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec1 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("408d3aba4d094c067fc00a43992c2292")); + Arrays.asList("118918f2e9e56a3cfc5ccb2856d529c8")); executeTest("test MultiSample Pilot2 indels with alleles passed in", spec1); } @@ -272,7 +272,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { baseCommandIndels + " --output_mode EMIT_ALL_SITES --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "indelAllelesForUG.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,100,000", 1, - Arrays.asList("5e4e09354410b76fc0d822050d84132a")); + Arrays.asList("a20799237accd52c1b8c2ac096309c8f")); executeTest("test MultiSample Pilot2 indels with alleles passed in and emitting all sites", spec2); } @@ -282,7 +282,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec3 = new WalkerTest.WalkerTestSpec( baseCommandIndels + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "ALL.wgs.union_v2.20101123.indels.sites.vcf -I " + validationDataLocation + "pilot2_daughters.chr20.10k-11k.bam -o %s -L 20:10,000,000-10,080,000", 1, - Arrays.asList("c599eedbeb422713b8a28529e805e4ae")); + Arrays.asList("18ef8181157b4ac3eb8492f538467f92")); executeTest("test MultiSample Pilot2 indels with complicated records", spec3); } @@ -291,7 +291,7 @@ public class UnifiedGenotyperIntegrationTest extends WalkerTest { WalkerTest.WalkerTestSpec spec4 = new WalkerTest.WalkerTestSpec( baseCommandIndelsb37 + " --genotyping_mode GENOTYPE_GIVEN_ALLELES -alleles " + validationDataLocation + "ALL.wgs.union_v2_chr20_100_110K.20101123.indels.sites.vcf -I " + validationDataLocation + "phase1_GBR_realigned.chr20.100K-110K.bam -o %s -L 20:100,000-110,000", 1, - Arrays.asList("37d908a682ac269f8f19dec939ff5b01")); + Arrays.asList("ad884e511a751b05e64db5314314365a")); executeTest("test MultiSample 1000G Phase1 indels with complicated records emitting all sites", spec4); } diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java new file mode 100644 index 000000000..fe1ca305f --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2011, The Broad Institute + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.broadinstitute.sting.utils.pileup; + +import com.google.caliper.Param; +import com.google.caliper.SimpleBenchmark; +import com.google.caliper.runner.CaliperMain; +import net.sf.samtools.SAMFileHeader; +import net.sf.samtools.SAMRecord; +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; + +import java.util.*; + +/** + * Caliper microbenchmark of fragment pileup + */ +public class FragmentPileupBenchmark extends SimpleBenchmark { + final int N_PILEUPS_TO_GENERATE = 100; + List pileups = new ArrayList(N_PILEUPS_TO_GENERATE); + + @Param({"10", "100", "1000"}) // , "10000"}) + int pileupSize; // set automatically by framework + + @Param({"150", "400"}) + int insertSize; // set automatically by framework + + @Override protected void setUp() { + SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); + GenomeLocParser genomeLocParser; + genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); + final int pos = 50; + GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", pos); + + final Random ran = new Random(); + final int readLen = 100; + final boolean leftIsFirst = true; + final boolean leftIsNegative = false; + final int insertSizeVariation = insertSize / 10; + + for ( int pileupN = 0; pileupN < N_PILEUPS_TO_GENERATE; pileupN++ ) { + List pileupElements = new ArrayList(); + for ( int i = 0; i < pileupSize / 2; i++ ) { + final String readName = "read" + i; + final int leftStart = new Random().nextInt(49) + 1; + final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); + final int rightStart = leftStart + fragmentSize - readLen; + + if ( rightStart <= 0 ) continue; + + List pair = FragmentPileupUnitTest.createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + SAMRecord left = pair.get(0); + SAMRecord right = pair.get(1); + + pileupElements.add(new PileupElement(left, pos - leftStart)); + + if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { + pileupElements.add(new PileupElement(right, pos - rightStart)); + } + } + + Collections.sort(pileupElements); + pileups.add(new ReadBackedPileupImpl(loc, pileupElements)); + } + } + + public void timeNaiveNameMatch(int rep) { + int nFrags = 0; + for ( int i = 0; i < rep; i++ ) { + for ( ReadBackedPileup rbp : pileups ) + nFrags += new FragmentPileup(rbp, true).getTwoReadPileup().size(); + } + } + + public void timeFastNameMatch(int rep) { + int nFrags = 0; + for ( int i = 0; i < rep; i++ ) + for ( ReadBackedPileup rbp : pileups ) + nFrags += new FragmentPileup(rbp, false).getTwoReadPileup().size(); + } + + public static void main(String[] args) { + CaliperMain.main(FragmentPileupBenchmark.class, args); + } +} diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java index 778259528..be4ecc0c6 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -43,37 +43,48 @@ import java.util.*; public class FragmentPileupUnitTest extends BaseTest { private static SAMFileHeader header; + public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); + + left.setReadPairedFlag(true); + right.setReadPairedFlag(true); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + return Arrays.asList(left, right); + } + private class FragmentPileupTest extends TestDataProvider { List states = new ArrayList(); private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); + List pair = createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + SAMRecord left = pair.get(0); + SAMRecord right = pair.get(1); + for ( int pos = leftStart; pos < rightStart + readLen; pos++) { - SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, leftStart, readLen); - SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, "readpair", 0, rightStart, readLen); - - left.setProperPairFlag(true); - right.setProperPairFlag(true); - - left.setFirstOfPairFlag(leftIsFirst); - right.setFirstOfPairFlag(! leftIsFirst); - - left.setReadNegativeStrandFlag(leftIsNegative); - left.setMateNegativeStrandFlag(!leftIsNegative); - right.setReadNegativeStrandFlag(!leftIsNegative); - right.setMateNegativeStrandFlag(leftIsNegative); - - left.setMateAlignmentStart(right.getAlignmentStart()); - right.setMateAlignmentStart(left.getAlignmentStart()); - - left.setMateReferenceIndex(0); - right.setMateReferenceIndex(0); - - int isize = rightStart + readLen - leftStart; - left.setInferredInsertSize(isize); - right.setInferredInsertSize(-isize); - boolean posCoveredByLeft = pos >= left.getAlignmentStart() && pos <= left.getAlignmentEnd(); boolean posCoveredByRight = pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd(); @@ -139,7 +150,6 @@ public class FragmentPileupUnitTest extends BaseTest { } } - @BeforeTest public void setup() { header = ArtificialSAMUtils.createArtificialSamHeader(1,1,1000); From 166174a551860fa18e8092f3dbe56e0ef28eb884 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 24 Oct 2011 14:04:53 -0400 Subject: [PATCH 15/21] Google caliper example execution script -- FragmentPileup with final performance testing --- .../sting/utils/pileup/FragmentPileup.java | 93 +++++++++++++++++-- .../utils/pileup/FragmentPileupBenchmark.java | 34 ++++--- 2 files changed, 105 insertions(+), 22 deletions(-) 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 f9a94989b..e811db355 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -30,6 +30,13 @@ public class FragmentPileup { Collection oneReadPile = null; Collection twoReadPile = null; + public enum FragmentMatchingAlgorithm { + ORIGINAL, + FAST_V1, + skipNonOverlapping, + skipNonOverlappingNotLazy + } + /** * Create a new Fragment-based pileup from the standard read-based pileup * @param pileup @@ -39,15 +46,17 @@ public class FragmentPileup { fastNewCalculation(pileup); } - protected FragmentPileup(ReadBackedPileup pileup, boolean useOldAlgorithm) { - if ( useOldAlgorithm ) - oldSlowCalculation(pileup); - else - fastNewCalculation(pileup); + protected FragmentPileup(ReadBackedPileup pileup, FragmentMatchingAlgorithm algorithm) { + switch ( algorithm ) { + case ORIGINAL: oldSlowCalculation(pileup); break; + case FAST_V1: fastNewCalculation(pileup); break; + case skipNonOverlapping: skipNonOverlapping(pileup); break; + case skipNonOverlappingNotLazy: skipNonOverlappingNotLazy(pileup); break; + } } private final void oldSlowCalculation(final ReadBackedPileup pileup) { - final Map nameMap = new HashMap(); + final Map nameMap = new HashMap(pileup.size()); // build an initial map, grabbing all of the multi-read fragments for ( final PileupElement p : pileup ) { @@ -104,7 +113,6 @@ public class FragmentPileup { break; } - // in this case we need to see if our mate is already present, and if so // grab the read from the list case RIGHT_MAYBE: { @@ -120,9 +128,74 @@ public class FragmentPileup { } } - if ( nameMap != null && ! nameMap.isEmpty() ) // could be slightly more optimally - for ( final PileupElement p : nameMap.values() ) - addToOnePile(p); + if ( nameMap != null && ! nameMap.isEmpty() ) { + if ( oneReadPile == null ) + oneReadPile = nameMap.values(); + else + oneReadPile.addAll(nameMap.values()); + } + } + + /** + * @param pileup + */ + private final void skipNonOverlappingNotLazy(final ReadBackedPileup pileup) { + oneReadPile = new ArrayList(pileup.size()); + twoReadPile = new ArrayList(); + final Map nameMap = new HashMap(pileup.size()); + + // build an initial map, grabbing all of the multi-read fragments + for ( final PileupElement p : pileup ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + oneReadPile.add(p); + } else { + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + nameMap.put(readName, p); + } + } + } + + oneReadPile.addAll(nameMap.values()); + } + + private final void skipNonOverlapping(final ReadBackedPileup pileup) { + Map nameMap = null; + + // build an initial map, grabbing all of the multi-read fragments + for ( final PileupElement p : pileup ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); + oneReadPile.add(p); + } else { + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + nameMap = addToNameMap(nameMap, p); + } + } + } + + if ( oneReadPile == null ) + oneReadPile = nameMap == null ? Collections.emptyList() : nameMap.values(); + else if ( nameMap != null ) + oneReadPile.addAll(nameMap.values()); } private final Map addToNameMap(Map map, final PileupElement p) { diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java index fe1ca305f..6a5378d46 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -39,16 +39,17 @@ import java.util.*; * Caliper microbenchmark of fragment pileup */ public class FragmentPileupBenchmark extends SimpleBenchmark { - final int N_PILEUPS_TO_GENERATE = 100; - List pileups = new ArrayList(N_PILEUPS_TO_GENERATE); + List pileups; - @Param({"10", "100", "1000"}) // , "10000"}) + @Param({"0", "4", "30", "150", "1000"}) int pileupSize; // set automatically by framework - @Param({"150", "400"}) + @Param({"200", "400"}) int insertSize; // set automatically by framework @Override protected void setUp() { + final int nPileupsToGenerate = 100; + pileups = new ArrayList(nPileupsToGenerate); SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); GenomeLocParser genomeLocParser; genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); @@ -61,7 +62,7 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { final boolean leftIsNegative = false; final int insertSizeVariation = insertSize / 10; - for ( int pileupN = 0; pileupN < N_PILEUPS_TO_GENERATE; pileupN++ ) { + for ( int pileupN = 0; pileupN < nPileupsToGenerate; pileupN++ ) { List pileupElements = new ArrayList(); for ( int i = 0; i < pileupSize / 2; i++ ) { final String readName = "read" + i; @@ -87,19 +88,28 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { } } - public void timeNaiveNameMatch(int rep) { + private void run(int rep, FragmentPileup.FragmentMatchingAlgorithm algorithm) { int nFrags = 0; for ( int i = 0; i < rep; i++ ) { for ( ReadBackedPileup rbp : pileups ) - nFrags += new FragmentPileup(rbp, true).getTwoReadPileup().size(); + nFrags += new FragmentPileup(rbp, algorithm).getTwoReadPileup().size(); } } - public void timeFastNameMatch(int rep) { - int nFrags = 0; - for ( int i = 0; i < rep; i++ ) - for ( ReadBackedPileup rbp : pileups ) - nFrags += new FragmentPileup(rbp, false).getTwoReadPileup().size(); + public void timeOriginal(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.ORIGINAL); + } + + public void timeFullOverlapPotential(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.FAST_V1); + } + + public void timeSkipNonOverlapping(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlapping); + } + + public void timeSkipNonOverlappingNotLazy(int rep) { + run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlappingNotLazy); } public static void main(String[] args) { From 502592671d7bfdbb9cff0575e94ca3c0946d000d Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Mon, 24 Oct 2011 14:40:05 -0400 Subject: [PATCH 16/21] Cleanup FragmentPileup before main repo commit -- removed intermiate functions. Now only original version and best optimized new version remain -- Moved general artificial read backed pileup creation code into ArtificialSamUtils --- .../sting/utils/pileup/FragmentPileup.java | 163 +++--------------- .../sting/utils/sam/ArtificialSAMUtils.java | 91 +++++++++- .../sting/utils/sam/ReadUtils.java | 48 ------ .../utils/pileup/FragmentPileupBenchmark.java | 40 +---- .../utils/pileup/FragmentPileupUnitTest.java | 33 +--- 5 files changed, 116 insertions(+), 259 deletions(-) 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 e811db355..4eda7c7cd 100644 --- a/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java +++ b/public/java/src/org/broadinstitute/sting/utils/pileup/FragmentPileup.java @@ -14,9 +14,6 @@ import java.util.*; * * Based on the original code by E. Banks * - * TODO -- technically we could generalize this code to support a pseudo-duplicate marking - * TODO -- algorithm that could collect all duplicates into a single super pileup element - * * Oct 21: note that the order of the oneReadPileup and twoReadPileups are not * defined. The algorithms that produce these lists are in fact producing * lists of Pileup elements *NOT* sorted by alignment start position of the underlying @@ -30,11 +27,9 @@ public class FragmentPileup { Collection oneReadPile = null; Collection twoReadPile = null; - public enum FragmentMatchingAlgorithm { + protected enum FragmentMatchingAlgorithm { ORIGINAL, - FAST_V1, skipNonOverlapping, - skipNonOverlappingNotLazy } /** @@ -42,16 +37,14 @@ public class FragmentPileup { * @param pileup */ public FragmentPileup(ReadBackedPileup pileup) { - //oldSlowCalculation(pileup); - fastNewCalculation(pileup); + skipNonOverlapping(pileup); } + /** For performance testing only */ protected FragmentPileup(ReadBackedPileup pileup, FragmentMatchingAlgorithm algorithm) { switch ( algorithm ) { case ORIGINAL: oldSlowCalculation(pileup); break; - case FAST_V1: fastNewCalculation(pileup); break; case skipNonOverlapping: skipNonOverlapping(pileup); break; - case skipNonOverlappingNotLazy: skipNonOverlappingNotLazy(pileup); break; } } @@ -76,58 +69,36 @@ public class FragmentPileup { oneReadPile = nameMap.values(); } - /** - * @param pileup - */ - private final void fastNewCalculation(final ReadBackedPileup pileup) { - Map nameMap = null; // lazy initialization + private final void skipNonOverlapping(final ReadBackedPileup pileup) { + Map nameMap = null; + // build an initial map, grabbing all of the multi-read fragments for ( final PileupElement p : pileup ) { final SAMRecord read = p.getRead(); + final int mateStart = read.getMateAlignmentStart(); - switch (ReadUtils.readMightOverlapMate(read) ) { - // we know for certain this read doesn't have an overlapping mate - case NO: { - addToOnePile(p); - break; - } - - // we know that we overlap our mate, so put the read in the nameMap in - // case our mate shows up - case LEFT_YES: { - nameMap = addToNameMap(nameMap, p); - break; - } - - // read starts at the same position, so we are looking at either the first or - // the second read. In the first, add it to the map, in the second grab it - // from the map and create a fragment - case SAME_START: { - final PileupElement pe1 = getFromNameMap(nameMap, p); - if ( pe1 != null ) { - addToTwoPile(pe1, p); - nameMap.remove(p.getRead().getReadName()); - } else { - nameMap = addToNameMap(nameMap, p); - } - break; - } - - // in this case we need to see if our mate is already present, and if so - // grab the read from the list - case RIGHT_MAYBE: { - final PileupElement pe1 = getFromNameMap(nameMap, p); - if ( pe1 != null ) { - addToTwoPile(pe1, p); - nameMap.remove(p.getRead().getReadName()); - } else { - addToOnePile(p); - } - break; + if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { + // if we know that this read won't overlap its mate, or doesn't have one, jump out early + if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); // lazy init + oneReadPile.add(p); + } else { + // the read might overlap it's mate, or is the rightmost read of a pair + final String readName = p.getRead().getReadName(); + final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); + if ( pe1 != null ) { + // assumes we have at most 2 reads per fragment + if ( twoReadPile == null ) twoReadPile = new ArrayList(); // lazy init + twoReadPile.add(new TwoReadPileupElement(pe1, p)); + nameMap.remove(readName); + } else { + if ( nameMap == null ) nameMap = new HashMap(pileup.size()); // lazy init + nameMap.put(readName, p); } } } + // add all of the reads that are potentially overlapping but whose mate never showed + // up to the oneReadPile if ( nameMap != null && ! nameMap.isEmpty() ) { if ( oneReadPile == null ) oneReadPile = nameMap.values(); @@ -136,90 +107,6 @@ public class FragmentPileup { } } - /** - * @param pileup - */ - private final void skipNonOverlappingNotLazy(final ReadBackedPileup pileup) { - oneReadPile = new ArrayList(pileup.size()); - twoReadPile = new ArrayList(); - final Map nameMap = new HashMap(pileup.size()); - - // build an initial map, grabbing all of the multi-read fragments - for ( final PileupElement p : pileup ) { - // if we know that this read won't overlap its mate, or doesn't have one, jump out early - final SAMRecord read = p.getRead(); - final int mateStart = read.getMateAlignmentStart(); - if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { - oneReadPile.add(p); - } else { - final String readName = p.getRead().getReadName(); - final PileupElement pe1 = nameMap.get(readName); - if ( pe1 != null ) { - // assumes we have at most 2 reads per fragment - twoReadPile.add(new TwoReadPileupElement(pe1, p)); - nameMap.remove(readName); - } else { - nameMap.put(readName, p); - } - } - } - - oneReadPile.addAll(nameMap.values()); - } - - private final void skipNonOverlapping(final ReadBackedPileup pileup) { - Map nameMap = null; - - // build an initial map, grabbing all of the multi-read fragments - for ( final PileupElement p : pileup ) { - // if we know that this read won't overlap its mate, or doesn't have one, jump out early - final SAMRecord read = p.getRead(); - final int mateStart = read.getMateAlignmentStart(); - if ( mateStart == 0 || mateStart > read.getAlignmentEnd() ) { - if ( oneReadPile == null ) oneReadPile = new ArrayList(pileup.size()); - oneReadPile.add(p); - } else { - final String readName = p.getRead().getReadName(); - final PileupElement pe1 = nameMap == null ? null : nameMap.get(readName); - if ( pe1 != null ) { - // assumes we have at most 2 reads per fragment - if ( twoReadPile == null ) twoReadPile = new ArrayList(); - twoReadPile.add(new TwoReadPileupElement(pe1, p)); - nameMap.remove(readName); - } else { - nameMap = addToNameMap(nameMap, p); - } - } - } - - if ( oneReadPile == null ) - oneReadPile = nameMap == null ? Collections.emptyList() : nameMap.values(); - else if ( nameMap != null ) - oneReadPile.addAll(nameMap.values()); - } - - private final Map addToNameMap(Map map, final PileupElement p) { - if ( map == null ) map = new HashMap(); - map.put(p.getRead().getReadName(), p); - return map; - } - - private final PileupElement getFromNameMap(Map map, final PileupElement p) { - return map == null ? null : map.get(p.getRead().getReadName()); - } - - - private final void addToOnePile(final PileupElement p) { - if ( oneReadPile == null ) oneReadPile = new ArrayList(); - oneReadPile.add(p); - } - - private final void addToTwoPile(final PileupElement p1, final PileupElement p2) { - // assumes we have at most 2 reads per fragment - if ( twoReadPile == null ) twoReadPile = new ArrayList(); - twoReadPile.add(new TwoReadPileupElement(p1, p2)); - } - /** * Gets the pileup elements containing two reads, in no particular order * diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java index 4eba32383..1b3641128 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ArtificialSAMUtils.java @@ -2,11 +2,15 @@ package org.broadinstitute.sting.utils.sam; import net.sf.samtools.*; 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.ReviewedStingException; +import org.broadinstitute.sting.utils.pileup.PileupElement; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileup; +import org.broadinstitute.sting.utils.pileup.ReadBackedPileupImpl; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @author aaron @@ -29,7 +33,7 @@ public class ArtificialSAMUtils { File outFile = new File(filename); SAMFileWriter out = new SAMFileWriterFactory().makeBAMWriter(header, true, outFile); - + for (int x = startingChromosome; x < startingChromosome + numberOfChromosomes; x++) { for (int readNumber = 1; readNumber < readsPerChomosome; readNumber++) { out.addAlignment(createArtificialRead(header, "Read_" + readNumber, x - startingChromosome, readNumber, DEFAULT_READ_LENGTH)); @@ -145,7 +149,7 @@ public class ArtificialSAMUtils { */ public static GATKSAMRecord createArtificialRead(SAMFileHeader header, String name, int refIndex, int alignmentStart, int length) { if( (refIndex == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart != SAMRecord.NO_ALIGNMENT_START) || - (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) + (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && alignmentStart == SAMRecord.NO_ALIGNMENT_START) ) throw new ReviewedStingException("Invalid alignment start for artificial read, start = " + alignmentStart); GATKSAMRecord record = new GATKSAMRecord(header); record.setReadName(name); @@ -197,6 +201,37 @@ public class ArtificialSAMUtils { return rec; } + public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { + SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); + SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); + + left.setReadPairedFlag(true); + right.setReadPairedFlag(true); + + left.setProperPairFlag(true); + right.setProperPairFlag(true); + + left.setFirstOfPairFlag(leftIsFirst); + right.setFirstOfPairFlag(! leftIsFirst); + + left.setReadNegativeStrandFlag(leftIsNegative); + left.setMateNegativeStrandFlag(!leftIsNegative); + right.setReadNegativeStrandFlag(!leftIsNegative); + right.setMateNegativeStrandFlag(leftIsNegative); + + left.setMateAlignmentStart(right.getAlignmentStart()); + right.setMateAlignmentStart(left.getAlignmentStart()); + + left.setMateReferenceIndex(0); + right.setMateReferenceIndex(0); + + int isize = rightStart + readLen - leftStart; + left.setInferredInsertSize(isize); + right.setInferredInsertSize(-isize); + + return Arrays.asList(left, right); + } + /** * create an iterator containing the specified read piles * @@ -258,4 +293,52 @@ public class ArtificialSAMUtils { return new ArtificialSAMQueryIterator(startingChr, endingChr, readCount, unmappedReadCount, header); } + + private final static int ranIntInclusive(Random ran, int start, int stop) { + final int range = stop - start; + return ran.nextInt(range) + start; + } + + /** + * Creates a read backed pileup containing up to pileupSize reads at refID 0 from header at loc with + * reads created that have readLen bases. Pairs are sampled from a gaussian distribution with mean insert + * size of insertSize and variation of insertSize / 10. The first read will be in the pileup, and the second + * may be, depending on where this sampled insertSize puts it. + * @param header + * @param loc + * @param readLen + * @param insertSize + * @param pileupSize + * @return + */ + public static ReadBackedPileup createReadBackedPileup(final SAMFileHeader header, final GenomeLoc loc, final int readLen, final int insertSize, final int pileupSize) { + final Random ran = new Random(); + final boolean leftIsFirst = true; + final boolean leftIsNegative = false; + final int insertSizeVariation = insertSize / 10; + final int pos = loc.getStart(); + + final List pileupElements = new ArrayList(); + for ( int i = 0; i < pileupSize / 2; i++ ) { + final String readName = "read" + i; + final int leftStart = ranIntInclusive(ran, 1, pos); + final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); + final int rightStart = leftStart + fragmentSize - readLen; + + if ( rightStart <= 0 ) continue; + + List pair = createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + final SAMRecord left = pair.get(0); + final SAMRecord right = pair.get(1); + + pileupElements.add(new PileupElement(left, pos - leftStart)); + + if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { + pileupElements.add(new PileupElement(right, pos - rightStart)); + } + } + + Collections.sort(pileupElements); + return new ReadBackedPileupImpl(loc, pileupElements); + } } 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 f093e6539..f8e4927ed 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/ReadUtils.java @@ -214,54 +214,6 @@ public class ReadUtils { return state; } - /** - * s1 e1 - * |-----------------------> [record in hand] - * s2 - * <-----------------------| - * - * s1, e1, and s2 are all in the record. Assuming that s1 < s2 (we are the left most read), - * we can compute whether we overlap with our mate by seeing if s2 <= e1 or no. If e1 < - * s2 then we known that we cannot over. - * - * If we are looking at the right read - * - * s1 - * |-----------------------> - * s2 e2 - * <-----------------------| [record in hand] - * - * we know the position of s1 and s2, but we don't know e1, so we cannot tell if we - * overlap with our mate or not, so in this case we return MAYBE. - * - * Note that if rec has an unmapped mate or is unpaired we certainly know the answer - * - * @param rec - * @return - */ - public static ReadOverlapsMateType readMightOverlapMate(final SAMRecord rec) { - if ( ! rec.getReadPairedFlag() || rec.getMateUnmappedFlag() ) { - return ReadOverlapsMateType.NO; - } else { // read is actually paired - final int recStart = rec.getAlignmentStart(); - final int recEnd = rec.getAlignmentEnd(); - final int mateStart = rec.getMateAlignmentStart(); - - if ( recStart < mateStart ) { - // we are the left most read - return mateStart <= recEnd ? ReadOverlapsMateType.LEFT_YES: ReadOverlapsMateType.NO; - } else if ( recStart == mateStart ) { - // we are the left most read - return ReadOverlapsMateType.SAME_START; - } else { - // we are the right most read, so we cannot tell - return ReadOverlapsMateType.RIGHT_MAYBE; - } - } - } - - public enum ReadOverlapsMateType { LEFT_YES, NO, SAME_START, RIGHT_MAYBE } - private static Pair getAdaptorBoundaries(SAMRecord rec, int adaptorLength) { int isize = rec.getInferredInsertSize(); if ( isize == 0 ) diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java index 6a5378d46..8b797def4 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupBenchmark.java @@ -53,38 +53,12 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(1, 1, 1000); GenomeLocParser genomeLocParser; genomeLocParser = new GenomeLocParser(header.getSequenceDictionary()); - final int pos = 50; - GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", pos); - - final Random ran = new Random(); + GenomeLoc loc = genomeLocParser.createGenomeLoc("chr1", 50); final int readLen = 100; - final boolean leftIsFirst = true; - final boolean leftIsNegative = false; - final int insertSizeVariation = insertSize / 10; for ( int pileupN = 0; pileupN < nPileupsToGenerate; pileupN++ ) { - List pileupElements = new ArrayList(); - for ( int i = 0; i < pileupSize / 2; i++ ) { - final String readName = "read" + i; - final int leftStart = new Random().nextInt(49) + 1; - final int fragmentSize = (int)(ran.nextGaussian() * insertSizeVariation + insertSize); - final int rightStart = leftStart + fragmentSize - readLen; - - if ( rightStart <= 0 ) continue; - - List pair = FragmentPileupUnitTest.createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); - SAMRecord left = pair.get(0); - SAMRecord right = pair.get(1); - - pileupElements.add(new PileupElement(left, pos - leftStart)); - - if ( pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd() ) { - pileupElements.add(new PileupElement(right, pos - rightStart)); - } - } - - Collections.sort(pileupElements); - pileups.add(new ReadBackedPileupImpl(loc, pileupElements)); + ReadBackedPileup rbp = ArtificialSAMUtils.createReadBackedPileup(header, loc, readLen, insertSize, pileupSize); + pileups.add(rbp); } } @@ -100,18 +74,10 @@ public class FragmentPileupBenchmark extends SimpleBenchmark { run(rep, FragmentPileup.FragmentMatchingAlgorithm.ORIGINAL); } - public void timeFullOverlapPotential(int rep) { - run(rep, FragmentPileup.FragmentMatchingAlgorithm.FAST_V1); - } - public void timeSkipNonOverlapping(int rep) { run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlapping); } - public void timeSkipNonOverlappingNotLazy(int rep) { - run(rep, FragmentPileup.FragmentMatchingAlgorithm.skipNonOverlappingNotLazy); - } - public static void main(String[] args) { CaliperMain.main(FragmentPileupBenchmark.class, args); } diff --git a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java index be4ecc0c6..c42c01c65 100644 --- a/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/pileup/FragmentPileupUnitTest.java @@ -43,44 +43,13 @@ import java.util.*; public class FragmentPileupUnitTest extends BaseTest { private static SAMFileHeader header; - public final static List createPair(SAMFileHeader header, String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { - SAMRecord left = ArtificialSAMUtils.createArtificialRead(header, name, 0, leftStart, readLen); - SAMRecord right = ArtificialSAMUtils.createArtificialRead(header, name, 0, rightStart, readLen); - - left.setReadPairedFlag(true); - right.setReadPairedFlag(true); - - left.setProperPairFlag(true); - right.setProperPairFlag(true); - - left.setFirstOfPairFlag(leftIsFirst); - right.setFirstOfPairFlag(! leftIsFirst); - - left.setReadNegativeStrandFlag(leftIsNegative); - left.setMateNegativeStrandFlag(!leftIsNegative); - right.setReadNegativeStrandFlag(!leftIsNegative); - right.setMateNegativeStrandFlag(leftIsNegative); - - left.setMateAlignmentStart(right.getAlignmentStart()); - right.setMateAlignmentStart(left.getAlignmentStart()); - - left.setMateReferenceIndex(0); - right.setMateReferenceIndex(0); - - int isize = rightStart + readLen - leftStart; - left.setInferredInsertSize(isize); - right.setInferredInsertSize(-isize); - - return Arrays.asList(left, right); - } - private class FragmentPileupTest extends TestDataProvider { List states = new ArrayList(); private FragmentPileupTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { super(FragmentPileupTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); - List pair = createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); + List pair = ArtificialSAMUtils.createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); SAMRecord left = pair.get(0); SAMRecord right = pair.get(1); From 9eaa62f3f31b28d1278f9cb6860d1fc3ed237fa5 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 15:15:52 -0400 Subject: [PATCH 17/21] Tmp. SAM-JDK rev. Better google caliper example --- settings/repository/net.sf/sam-1.52.944.jar | Bin 548617 -> 0 bytes settings/repository/net.sf/sam-1.52.944.xml | 3 --- 2 files changed, 3 deletions(-) delete mode 100644 settings/repository/net.sf/sam-1.52.944.jar delete mode 100644 settings/repository/net.sf/sam-1.52.944.xml diff --git a/settings/repository/net.sf/sam-1.52.944.jar b/settings/repository/net.sf/sam-1.52.944.jar deleted file mode 100644 index 7037c7a9603b83a0f1aaf2f2ba712b7211ca8f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548617 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�Hq@#HA482V!J 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�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%0DQnz6f)D z7`zfUqINH!jYO}VgNbn@xX<^|ds%>7jHl^oUV?krC*X{LeLnis16bKcI07}~Nc4-oLrhhQMY0yD9L3Q0!$~#>pYwdN8`t*8R-1N2#Xd9{C!u)Vg$DR(fQPxq zlX-occ*raR!KRTjgrAgW$}plFnF@k$o_1e!t4unC&WG1AJy!@R1xUAURZEG%cIJr*@AR z%EKLI*5GB9I^3ZQA2E&PArG@7%JfNc$rCh?-%UrzNxpak$o>J`_mAMve}b3GI|xyE z7t7I~F&zFPktYWp2R?l@!mD^_Zjrba!-ERmg_Z_|gfG9JJh$P;J}-varg%RNk@sS8 z>m!cbA?93mzsP0ZX>wUm(ISW8mg{iMgRxKNpkIgLeIeclq)Of-jY{o8!-mUr z08?eeMHgnaiBgS3iQ5BQgnEN-3LQUERMXuo4^C&ZtavKJNM1u{TN||z>ZfE)8n&PI z=jvk(PzBixP|>-9!yd74rK71Ly+fUVsDFYb8#o7i#}2Wg7Mx{ zi5DdTDVD?hw$dL0Qyj-#fYC(&aS*I7rp2cZ<`lE$(n@c_J;H#Siv`I~sN`n}fYKog zV;q@lf#z@vu-rH>kjp@F8SbM%Qv_Jk<&lyD$)sXYH%zO5X*Jq65*Uq=z?HmGWB~W! zS}~|XUQ`mVW|o0-K6p`=EEP#ODPQ6D*kL$1zv=j!E8j+)K=PESQLjaB{3cN<%h+XY)lNCYJjt>17bW5;0|KRpNNBMcxe)ofZ`}? zL~`)uaK2383rsABn8#T26e5w`u{Ngmt(dB*8&NPI%#Vds-_k}BgwiuMzjNIxI`79> zlP$X5*aUxT*RtVm%*sv@@GK2T1=>I$63W#xx3FTl;oWQ9qe~VCCM;W4(A3h<+}Rjg z9BYHBC5k`_HW$nnyZ;Rx^Hv*Yd?UL+qr5-aSa1Zm9=IIQFlhtk2y*r8oK~pFW$9{a z;zD2rV0h9mtuOL|3r}tk7zJ@=REV(~_zb=%ozQSx5|69H0embm0zRWewdmft6 z@N#68105etAZmNa96`ah*!t#ZL#&2ph)v2!TjJO`S0h^I#s6J#&UL zMKLl@;M;1j0*Wz=D%OaXjVlMhRdjo*WF0Hv}ASIBKo{ z(=@k$gSn#N8&A&~0Ir4p#Uc?g>Kua_$$pTK;9-${A3k}&cn!A!ux7$hGHaFrhrZc^ z)YDoe+Q#}j$TLykbsfA#=2ph%Fhy7o9I&UBdTtTJ_+=V>(0CIU9PDeo^5kJ&gUlGZ zPu@~mVtV4Ooan187NA+!))0$W-X||6NAwoTn9Sh)an3?a

*G#*3os|U}IFz!1JcMZce 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 YWP=KR2sey?+#&|SJ?J;XFd@YM0GGU0XaE2J diff --git a/settings/repository/net.sf/sam-1.52.944.xml b/settings/repository/net.sf/sam-1.52.944.xml deleted file mode 100644 index 2229395b2..000000000 --- a/settings/repository/net.sf/sam-1.52.944.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - From 0f44066640d75a05f456f0f5e7c4e5284076e368 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:26:46 -0400 Subject: [PATCH 18/21] Ignore common files --- .gitignore | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..be613e7d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +/*.bam +/*.bai +/*.bed +*.idx +*~ +/*.vcf +/*.txt +/*.csh +/.* +/*.pdf +/*.eval +*.ipr +*.iws +queueScatterGather +/foo* +/bar* +integrationtests/ From 221c944ee07e47688db54e36b7adc1cb488bb1c7 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:29:17 -0400 Subject: [PATCH 19/21] Including private parts --- ivy.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ivy.xml b/ivy.xml index 0737b676d..96c1de844 100644 --- a/ivy.xml +++ b/ivy.xml @@ -10,7 +10,7 @@ - + From 05730884c637905680b04fadb06f1cdd037313b1 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:29:35 -0400 Subject: [PATCH 20/21] More ignores --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index be613e7d6..744a93f45 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ queueScatterGather /foo* /bar* integrationtests/ +public/testdata/onTheFlyOutputTest.vcf \ No newline at end of file From af3613cc5ff24436715c5af42c5c0dbb324f9ae2 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Tue, 25 Oct 2011 20:52:56 -0400 Subject: [PATCH 21/21] GATKSAMRecord commit branch summary First, I'm sure there's a better way to do this, but I wanted to create a single commit summarizing the changes from my branch SamRecordFactory. What's the best way to do this? Rebase? Now, on to the changes here: -- Picard added a SamRecordFactory that is used to create instances the subclass SamRecord or BAMRecord. This factory allows us to have low-level picard readers (SamFileReader) create objects of type GATKSamRecord. The abomination of the extends and contains GATKSamRecord is now gone. GATKSamRecords are now produced by this factory, the GATK provides this factory to our SamFileReaders, and everything works with GATKSamRecord just extending BAMRecord. This results in up to a 2x performance improvement in writing BAMs and a ~10% improvement when reading BAMs files. -- As a consequence of this, we no longer officially support SAM records. Attempting to create SAMRecord objects with the factory will throw a user exception. -- Created a standard NGSPlatform enum, and GATKSamRecords support efficiently obtaining this value. The real BQSR (not the copy indel version) got the efficient code to use this. Please add all future platforms to this enum. -- GATKSamRecord no longer supports using the OQ or defaultBaseQuality. This is performed in a wrapper iterator that's only added when these command line options are used. -- ReducedRead code has been moved from ReadUtils until efficiency caching assessors in GATKSamRecord. -- ArtificialSamUtils creates GATKSamRecords now, just SAMRecords. Added code here to create artifical pairs and using that code to create artificial ReadBackedPileups with specific properties -- New smarter algorithm for FragmentPileup. This new code is up to 3x faster than the previous version, and is lazy so is more efficient when no overlapping pairs are actually in the pileup. Created extensive DataProvider driven UnitTest. Added Caliper-based benchmarking system to characterize the performance differences between the old and new algorithms. TODO still remains to make a efficient version that works for non-pileups for the HaplotypeCaller --- .../src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java | 1 + 1 file changed, 1 insertion(+) 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 d50f2ff03..d6c0b68b8 100755 --- a/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java +++ b/public/java/src/org/broadinstitute/sting/utils/sam/GATKSAMRecord.java @@ -40,6 +40,7 @@ import java.util.Map; * IMPORTANT NOTE: Because ReadGroups are not set through the SAMRecord, * if they are ever modified externally then one must also invoke the * setReadGroup() method here to ensure that the cache is kept up-to-date. + * */ public class GATKSAMRecord extends BAMRecord { // the SAMRecord data we're caching