@Test(enabled = !DEBUG, expectedExceptions = IllegalArgumentException.class) public void testOutOfOrder() { final List<GATKSAMRecord> pair = ArtificialSAMUtils.createPair(header, "readpair", 100, 1, 50, true, true); final GATKSAMRecord left = pair.get(0); final GATKSAMRecord right = pair.get(1); final List<GATKSAMRecord> reads = Arrays.asList(right, left); // OUT OF ORDER! final List<Integer> offsets = Arrays.asList(0, 50); final ReadBackedPileup pileup = new ReadBackedPileupImpl(null, reads, offsets); FragmentUtils.create(pileup); // should throw exception }
List<GATKSAMRecord> pair = createPair(header, readName, readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); final GATKSAMRecord left = pair.get(0); final GATKSAMRecord right = pair.get(1);
private FragmentUtilsTest(String name, int readLen, int leftStart, int rightStart, boolean leftIsFirst, boolean leftIsNegative) { super(FragmentUtilsTest.class, String.format("%s-leftIsFirst:%b-leftIsNegative:%b", name, leftIsFirst, leftIsNegative)); List<GATKSAMRecord> pair = ArtificialSAMUtils.createPair(header, "readpair", readLen, leftStart, rightStart, leftIsFirst, leftIsNegative); GATKSAMRecord left = pair.get(0); GATKSAMRecord right = pair.get(1); for ( int pos = leftStart; pos < rightStart + readLen; pos++) { boolean posCoveredByLeft = pos >= left.getAlignmentStart() && pos <= left.getAlignmentEnd(); boolean posCoveredByRight = pos >= right.getAlignmentStart() && pos <= right.getAlignmentEnd(); if ( posCoveredByLeft || posCoveredByRight ) { List<GATKSAMRecord> reads = new ArrayList<>(); List<Integer> 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 ? 0 : 1, shouldBeFragment ? 1 : 0, pileup, null); statesForPileup.add(testState); } TestState testState = left.getAlignmentEnd() >= right.getAlignmentStart() ? new TestState(0, 1, null, pair) : new TestState(2, 0, null, pair); statesForReads.add(testState); } } }
@Test public void testSecondaryAlignmentsDoNotInterfere() { final List<GATKSAMRecord> properReads = ArtificialSAMUtils.createPair(header, "foo", 1, 10, 30, true, false); final GATKSAMRecord read1 = properReads.get(0); read1.setAlignmentStart(8); // move the read read1.setFlags(99); // first in proper pair, mate negative strand final GATKSAMRecord read2Primary = properReads.get(1); read2Primary.setFlags(147); // second in pair, mate unmapped, not primary alignment Assert.assertEquals(read1.getInferredInsertSize(), 21); final GATKSAMRecord read2NonPrimary = new GATKSAMRecord(read2Primary); read2NonPrimary.setFlags(393); // second in proper pair, on reverse strand final ConstrainedMateFixingManager manager = new ConstrainedMateFixingManager(null, genomeLocParser, 1000, 1000, 1000); manager.addRead(read1, true, false); manager.addRead(read2NonPrimary, false, false); manager.addRead(read2Primary, false, false); Assert.assertEquals(manager.getNReadsInQueue(), 3); for ( final SAMRecord read : manager.getReadsInQueueForTesting() ) { if ( read.getFirstOfPairFlag() ) { Assert.assertEquals(read.getFlags(), 99); Assert.assertEquals(read.getInferredInsertSize(), 23); } else if ( read.getNotPrimaryAlignmentFlag() ) { Assert.assertEquals(read.getFlags(), 393); Assert.assertEquals(read.getInferredInsertSize(), -21); } else { Assert.assertEquals(read.getFlags(), 147); Assert.assertEquals(read.getInferredInsertSize(), -23); } } }
@Test public void testSecondaryAlignmentsDoNotCauseAccidentalRemovalOfMate() { final List<GATKSAMRecord> properReads = ArtificialSAMUtils.createPair(header, "foo", 1, 530, 1594, true, false); final GATKSAMRecord read1 = properReads.get(0); read1.setFlags(99); // first in proper pair, mate negative strand final GATKSAMRecord read2Primary = properReads.get(1); read2Primary.setFlags(147); // second in pair, mate unmapped, not primary alignment read2Primary.setAlignmentStart(1596); // move the read final GATKSAMRecord read2NonPrimary = new GATKSAMRecord(read2Primary); read2NonPrimary.setReadName("foo"); read2NonPrimary.setFlags(393); // second in proper pair, on reverse strand read2NonPrimary.setAlignmentStart(451); read2NonPrimary.setMateAlignmentStart(451); final ConstrainedMateFixingManager manager = new ConstrainedMateFixingManager(null, genomeLocParser, 10000, 200, 10000); manager.addRead(read2NonPrimary, false, false); manager.addRead(read1, false, false); for ( int i = 0; i < ConstrainedMateFixingManager.EMIT_FREQUENCY; i++ ) manager.addRead(ArtificialSAMUtils.createArtificialRead(header, "foo" + i, 0, 1500, 10), false, false); Assert.assertTrue(manager.forMateMatching.containsKey("foo")); }
@Test public void testSupplementaryAlignmentsDoNotCauseBadMateFixing() { final List<GATKSAMRecord> properReads = ArtificialSAMUtils.createPair(header, "foo", 1, 1000, 2000, true, false); final GATKSAMRecord read1 = properReads.get(0); read1.setFlags(99); // first in pair, negative strand