/*
* 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 picard.PicardException;
import org.testng.annotations.Test;
/**
* This class defines the individual test cases to run. The actual running of the test is done
* by MarkDuplicatesWithMateCigarTester (see getTester).
* @author nhomer@broadinstitute.org
*/
public class MarkDuplicatesWithMateCigarTest extends AbstractMarkDuplicatesCommandLineProgramTest {
protected AbstractMarkDuplicatesCommandLineProgramTester getTester() {
return new MarkDuplicatesWithMateCigarTester();
}
// TODO: test program record chaining, including failures. Use MarkDuplicate's facility.
// TODO: check if one mate is dup, the other is as well, only if both are mapped
// NB: this test should return different results than MarkDuplicatesWithMateCigar, as we have the mate cigar
@Test
public void testTwoMappedPairsWithSoftClippingFirstOfPairOnly() {
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(0, 12, 46, false, false, "6S42M28S", "3S73M", true, 50); // only add the first one
// NB: this next record should not be a duplicate in MarkDuplicates, but is here, because have the mate cigar
tester.addMappedPair(0, 12, 51, true, true, "6S42M28S", "8S68M", true, 50); // only add the first one
tester.runTest();
}
@Test
public void testTwoFragmentsLargeSoftClipWithMinimumDistanceOK() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addArg("MINIMUM_DISTANCE=990");
tester.addMappedFragment(0, 1000, false, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 2000, false, "10S100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 3000, true, "2000S100M", DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test(expectedExceptions = PicardException.class)
public void testTwoFragmentsLargeSoftClipWithMinimumDistanceFailure() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addArg("MINIMUM_DISTANCE=989");
tester.addMappedFragment(0, 1000, false, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 2000, false, "10S100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 3000, true, "2000S100M", DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test(expectedExceptions = PicardException.class)
public void testTwoFragmentsLargeSoftClip() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(0, 1000, false, "100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 2000, false, "10S100M", DEFAULT_BASE_QUALITY);
tester.addMappedFragment(0, 3000, true, "2000S100M", DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testScoringStrategyForReadNameComparison() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
tester.addMappedFragment(0, 1, false, DEFAULT_BASE_QUALITY); // Ref lengths, MapQs equal. First read name in lex order called dup.
tester.addMappedFragment(0, 1, true, DEFAULT_BASE_QUALITY);
tester.runTest();
}
@Test
public void testScoringStrategyForMateReferenceLengthComparison() {
final AbstractMarkDuplicatesCommandLineProgramTester tester = getTester();
// READY pair are both duplicates because (sum of reference length) for both reads is less than for READX
// MarkDuplicates and SUM_OF_BASE_QUALITIES scoring strategy would mark READX pair a duplicate, as all reads have equal quals
// If this scoring strategy did not account for mate reference length, READX pair would be marked a duplicate
tester.addMatePair("READY", 1, 1, 105, false, false, true, true, "50M", "5I45M", false, true, false,
false, false, DEFAULT_BASE_QUALITY); // duplicate pair. Both reads should be duplicates!!!
tester.addMatePair("READX", 1, 1, 100, false, false, false, false, "50M", "50M", false, true, false,
false, false, DEFAULT_BASE_QUALITY);
tester.runTest();
}
}