/*
* The MIT License
*
* Copyright (c) 2014 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 picard.sam.markduplicates;
import htsjdk.samtools.SAMRecord;
import htsjdk.samtools.SamReader;
import htsjdk.samtools.SamReaderFactory;
import htsjdk.samtools.util.CloseableIterator;
import htsjdk.samtools.util.CloserUtil;
import org.testng.annotations.Test;
import java.io.File;
/**
* This class defines the individual test cases to run. The actual running of the test is done
* by AbstractMarkDuplicatesCommandLineProgramTester or children thereof (see getTester).
*/
public abstract class AbstractMarkDuplicatesCommandLineProgramTest {
protected abstract AbstractMarkDuplicatesCommandLineProgramTester getTester();
protected final static int DEFAULT_BASE_QUALITY = 10;
@Test
public void testSingleUnmappedFragment() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addUnmappedFragment(-1, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testSingleUnmappedPair() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addUnmappedPair(-1, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testSingleMappedFragment() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(1, 1, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedFragments() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(0, 1, false, DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 1, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testSingleMappedPair() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testSingleMappedFragmentAndSingleMappedPair() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(1, 1, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testThreeMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testSingleMappedFragmentAndTwoMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(1, 1, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testTwoMappedPairsAndTerminalUnmappedFragment() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addUnmappedFragment(-1, DEFAULT_BASE_QUALITY); // unmapped fragment at end of file
tester.runTest();
}
@Test
public void testTwoMappedPairsAndTerminalUnmappedPair() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addUnmappedPair(-1, DEFAULT_BASE_QUALITY); // unmapped pair at end of file
tester.runTest();
}
@Test
public void testOpticalDuplicateFinding() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
// explicitly creating 1 expected optical duplicate pair
tester.setExpectedOpticalDuplicate(1);
// pass in the read names manually, in order to control duplicates vs optical duplicates
tester.addMatePair("READ0:1:1:1:1", 1, 1, 100, false, false, false, false, "50M", "50M", false, true, false,
false, false, DEFAULT_BASE_QUALITY); // non-duplicate mapped pair to start
tester.addMatePair("READ1:1:1:1:300", 1, 1, 100, false, false, true, true, "50M", "50M", false, true, false,
false, false, DEFAULT_BASE_QUALITY); // duplicate pair, NOT optical duplicate (delta-Y > 100)
tester.addMatePair("READ2:1:1:1:50", 1, 1, 100, false, false, true, true, "50M", "50M", false, true, false,
false, false, DEFAULT_BASE_QUALITY); // duplicate pair, expected optical duplicate (delta-X and delta-Y < 100)
tester.runTest();
}
@Test
public void testOpticalDuplicateClusterSamePositionNoOpticalDuplicates() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(0);
tester.addMatePair("RUNID:7:1203:2886:82292", 1, 485253, 485253, false, false, true, true, "42M59S", "59S42M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:7:1203:2884:16834", 1, 485253, 485253, false, false, false, false, "59S42M", "42M59S", true, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testOpticalDuplicateClusterSamePositionNoOpticalDuplicatesWithinPixelDistance() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(0);
tester.addMatePair("RUNID:7:1203:2886:16834", 1, 485253, 485253, false, false, true, true, "42M59S", "59S42M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:7:1203:2884:16835", 1, 485253, 485253, false, false, false, false, "59S42M", "42M59S", true, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testOpticalDuplicateClusterSamePositionOneOpticalDuplicatesWithinPixelDistance() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(1);
tester.addMatePair("RUNID:7:1203:2886:16834", 1, 485253, 485253, false, false, true, true, "45M", "45M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:7:1203:2884:16835", 1, 485253, 485253, false, false, false, false, "45M", "45M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testOpticalDuplicateClusterOneEndSamePositionOneCluster() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(1);
tester.addMatePair("RUNID:7:2205:17939:39728", 1, 485328, 485312, false, false, false, false, "55M46S", "30S71M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:7:2205:17949:39745", 1, 485328, 485328, false, false, true, true, "55M46S", "46S55M", false, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedPairsAndMappedSecondaryFragment() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedFragment(1, 200, false, DEFAULT_BASE_QUALITY, true); // mapped non-primary fragment
tester.runTest();
}
@Test
public void testMappedFragmentAndMappedPairFirstOfPairNonPrimary() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(1, 1, false,DEFAULT_BASE_QUALITY);
tester.addMatePair(1, 200, 0, false, true, false, false, "54M22S", null, false, false, true, true, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedPairsMatesSoftClipped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 10022, 10051, false, false, "76M", "8S68M", false, true, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 10022, 10063, false, false, "76M", "5S71M", false, true, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedPairsWithSoftClipping() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
// NB: no duplicates
// 5'1: 2, 5'2:46+73M=118
// 5'1: 2, 5'2:51+68M=118
tester.addMappedPair(1, 2, 46, false, false, "6S42M28S", "3S73M", false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 2, 51, true, true, "6S42M28S", "8S68M", false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testTwoMappedPairsWithSoftClippingFirstOfPairOnlyNoMateCigar() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setNoMateCigars(true);
// NB: no duplicates
// 5'1: 2, 5'2:46+73M=118
// 5'1: 2, 5'2:51+68M=118
tester.addMappedPair(1, 12, 46, false, false, "6S42M28S", null, true, DEFAULT_BASE_QUALITY); // only add the first one
tester.addMappedPair(1, 12, 51, false, false, "6S42M28S", null, true, DEFAULT_BASE_QUALITY); // only add the first one
tester.runTest();
}
@Test
public void testTwoMappedPairsWithSoftClippingBoth() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 10046, 10002, true, true, "3S73M", "6S42M28S", true, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 10051, 10002, false, false, "8S68M", "6S48M22S", true, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testMatePairSecondUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10049, 10049, false, true, false, false, "11M2I63M", null, false, false, false, false, false, DEFAULT_BASE_QUALITY); // neither are duplicates
tester.runTest();
}
@Test
public void testMatePairFirstUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10056, 10056, true, false, false, false, null, "54M22S", false, false, false, false, false, DEFAULT_BASE_QUALITY); // neither are duplicates
tester.runTest();
}
@Test
public void testMappedFragmentAndMatePairSecondUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10049, 10049, false, true, false, false, "11M2I63M", null, false, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedFragment(1, 10049, true, DEFAULT_BASE_QUALITY); // duplicate
tester.runTest();
}
@Test
public void testMappedFragmentAndMatePairFirstUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10049, 10049, true, false, false, false, null, "11M2I63M", false, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedFragment(1, 10049, true, DEFAULT_BASE_QUALITY); // duplicate
tester.runTest();
}
@Test
public void testMappedPairAndMatePairSecondUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10040, 10040, false, true, true, false, "76M", null, false, false, false, false, false, DEFAULT_BASE_QUALITY); // second a duplicate,
// second end unmapped
tester.addMappedPair(1, 10189, 10040, false, false, "41S35M", "65M11S", true, false, false, DEFAULT_BASE_QUALITY); // mapped OK
tester.runTest();
}
@Test
public void testMappedPairAndMatePairFirstUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10040, 10040, true, false, false, true, null, "76M", false, false, false, false, false, DEFAULT_BASE_QUALITY); // first a duplicate,
// first end unmapped
tester.addMappedPair(1, 10189, 10040, false, false, "41S35M", "65M11S", true, false, false, DEFAULT_BASE_QUALITY); // mapped OK
tester.runTest();
}
// TODO: fails on MarkDuplicatesWithMateCigar
@Test
public void testMappedPairAndMatePairFirstOppositeStrandSecondUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
// first end mapped OK -, second end unmapped
tester.addMatePair(1, 484071, 484071, false, true, false, false, "66S35M", null, true, false, false, false, false, DEFAULT_BASE_QUALITY);
// mapped OK +/-
tester.addMappedPair(1, 484105, 484075, false, false, "35M66S", "30S71M", false, true, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testMappedPairAndMappedFragmentAndMatePairSecondUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10040, 10040, false, true, true, false, "76M", null, false, false, false, false, false, DEFAULT_BASE_QUALITY); // first a duplicate,
// second end unmapped
tester.addMappedPair(1, 10189, 10040, false, false, "41S35M", "65M11S", true, false, false, DEFAULT_BASE_QUALITY); // mapped OK
tester.addMappedFragment(1, 10040, true, DEFAULT_BASE_QUALITY); // duplicate
tester.runTest();
}
@Test
public void testMappedPairAndMappedFragmentAndMatePairFirstUnmapped() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMatePair(1, 10040, 10040, true, false, false, true, null, "76M", false, false, false, false, false, DEFAULT_BASE_QUALITY); // first a duplicate,
// first end unmapped
tester.addMappedPair(1, 10189, 10040, false, false, "41S35M", "65M11S", true, false, false, DEFAULT_BASE_QUALITY); // mapped OK
tester.addMappedFragment(1, 10040, true, DEFAULT_BASE_QUALITY); // duplicate
tester.runTest();
}
@Test
public void testTwoMappedPairsWithOppositeOrientations() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 10182, 10038, true, true, "32S44M", "66M10S", true, false, false, DEFAULT_BASE_QUALITY); // -/+
tester.addMappedPair(1, 10038, 10182, false, false, "70M6S", "32S44M", false, true, false, DEFAULT_BASE_QUALITY); // +/-, both are duplicates
tester.runTest();
}
@Test
public void testTwoMappedPairsWithOppositeOrientationsNumberTwo() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 10038, 10182, false, false, "70M6S", "32S44M", false, true, false, DEFAULT_BASE_QUALITY); // +/-, both are duplicates
tester.addMappedPair(1, 10182, 10038, true, true, "32S44M", "66M10S", true, false, false, DEFAULT_BASE_QUALITY); // -/+
tester.runTest();
}
@Test
public void testThreeMappedPairsWithMatchingSecondMate() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
// Read0 and Read2 are duplicates
// 10181+41=10220, 10058
tester.addMappedPair(1, 10181, 10058, false, false, "41S35M", "47M29S", true, false, false, DEFAULT_BASE_QUALITY); // -/+
// 10181+37=10216, 10058
tester.addMappedPair(1, 10181, 10058, true, true, "37S39M", "44M32S", true, false, false, DEFAULT_BASE_QUALITY); // -/+
// 10180+36=10216, 10058
tester.addMappedPair(1, 10180, 10058, false, false, "36S40M", "50M26S", true, false, false, DEFAULT_BASE_QUALITY); // -/+, both are duplicates
tester.runTest();
}
@Test
public void testMappedPairWithSamePosition() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 4914, 4914, false, false, "37M39S", "73M3S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.runTest();
}
@Test
public void testMappedPairWithSamePositionSameCigar() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(1, 4914, 4914, false, false, "37M39S", "37M39S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.runTest();
}
@Test
public void testTwoMappedPairWithSamePosition() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 5604914, 5604914, false, false, "37M39S", "73M3S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.addMappedPair(0, 5604914, 5604914, true, true, "37M39S", "73M3S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.runTest();
}
@Test
public void testTwoMappedPairWithSamePositionDifferentStrands() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 5604914, 5604914, false, false, "50M", "50M", true, false, false, DEFAULT_BASE_QUALITY); // +/-
tester.addMappedPair(0, 5604914, 5604914, true, true, "50M", "50M", false, true, false, DEFAULT_BASE_QUALITY); // -/+
tester.runTest();
}
@Test
public void testTwoMappedPairWithSamePositionDifferentStrands2() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 5604914, 5604915, false, false, "50M", "50M", true, false, false, DEFAULT_BASE_QUALITY); // +/-
tester.addMappedPair(0, 5604915, 5604914, true, true, "50M", "50M", false, true, false, DEFAULT_BASE_QUALITY); // -/+
tester.runTest();
}
@Test
public void testMappedPairWithFirstEndSamePositionAndOther() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 5604914, 5605914, false, false, "37M39S", "73M3S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.addMappedPair(0, 5604914, 5604914, false, false, "37M39S", "73M3S", false, false, false, DEFAULT_BASE_QUALITY); // +/+
tester.runTest();
}
@Test
public void testTwoGroupsOnDifferentChromosomesOfTwoFragments() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(0, 1, false, DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 1, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedFragment(1, 1, false, DEFAULT_BASE_QUALITY);
tester.addMappedFragment(1, 1, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testTwoGroupsOnDifferentChromosomesOfTwoMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(0, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testTwoGroupsOnDifferentChromosomesOfThreeMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(0, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(0, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testThreeGroupsOnDifferentChromosomesOfThreeMappedPairs() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(0, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(0, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, false, false, DEFAULT_BASE_QUALITY);
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(1, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(2, 1, 100, false, false , DEFAULT_BASE_QUALITY);
tester.addMappedPair(2, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.addMappedPair(2, 1, 100, true, true, DEFAULT_BASE_QUALITY); // duplicate!!!
tester.runTest();
}
@Test
public void testBulkFragmentsNoDuplicates() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
for(int position = 1; position <= 10000; position += 1) {
tester.addMappedFragment(0, position, false, "100M", DEFAULT_BASE_QUALITY);
}
tester.runTest();
}
@Test
public void testBulkFragmentsWithDuplicates() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
for(int position = 1; position <= 10000; position += 1) {
tester.addMappedFragment(0, position, false, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, position, true, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, position, true, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, position, true, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, position, true, "100M", DEFAULT_BASE_QUALITY);
}
tester.runTest();
}
@Test
public void testStackOverFlowPairSetSwap() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
File input = new File("testdata/picard/sam/MarkDuplicates/markDuplicatesWithMateCigar.pairSet.swap.sam");
SamReader reader = SamReaderFactory.makeDefault().open(input);
tester.setHeader(reader.getFileHeader());
for (final SAMRecord record : reader) {
tester.addRecord(record);
}
CloserUtil.close(reader);
tester.setExpectedOpticalDuplicate(1);
tester.runTest();
}
@Test
public void testSecondEndIsBeforeFirstInCoordinate() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedPair(0, 108855339, 108855323, false, false, "33S35M", "17S51M", true, true, false, DEFAULT_BASE_QUALITY); // +/-
tester.runTest();
}
@Test
public void testPathologicalOrderingAtTheSamePosition() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(1);
tester.addMatePair("RUNID:3:1:15013:113051", 0, 129384554, 129384554, false, false, false, false, "68M", "68M", false, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:3:1:15029:113060", 0, 129384554, 129384554, false, false, true, true, "68M", "68M", false, false, false, false, false, DEFAULT_BASE_QUALITY);
// Create the pathology
CloseableIterator<SAMRecord> iterator = tester.getRecordIterator();
int[] qualityOffset = {20, 30, 10, 40}; // creates an interesting pathological ordering
int index = 0;
while (iterator.hasNext()) {
final SAMRecord record = iterator.next();
byte[] quals = new byte[record.getReadLength()];
for (int i = 0; i < record.getReadLength(); i++) {
quals[i] = (byte)(qualityOffset[index] + 10);
}
record.setBaseQualities(quals);
index++;
}
iterator.close();
// Run the test
tester.runTest();
}
@Test
public void testDifferentChromosomesInOppositeOrder() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(1);
tester.addMatePair("RUNID:6:101:17642:6835", 0, 1, 123989, 18281, false, false, true, true, "37S64M", "52M49S", false, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:6:101:17616:6888", 1, 0, 18281, 123989, false, false, false, false, "52M49S", "37S64M", false, false, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testOpticalDuplicateClustersAddingSecondEndFirstSameCoordinate() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.setExpectedOpticalDuplicate(1);
tester.addMatePair("RUNID:1:1:15993:13361", 2, 41212324, 41212310, false, false, false, false, "33S35M", "19S49M", true, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.addMatePair("RUNID:1:1:16020:13352", 2, 41212324, 41212319, false, false, true, true, "33S35M", "28S40M", true, true, false, false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
}