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.
This commit is contained in:
parent
bba69701b5
commit
3227143a1c
|
|
@ -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<TestState> states = new ArrayList<TestState>();
|
||||||
|
|
||||||
|
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<SAMRecord> reads = new ArrayList<SAMRecord>();
|
||||||
|
List<Integer> offsets = new ArrayList<Integer>();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue