@Test(enabled = !DEBUG, dataProvider = "LeftAlignIndelDataProvider") public void testLeftAlignIndelData(final Cigar originalCigar, final Cigar expectedCigar, final byte[] reference, final byte[] read, final int repeatLength) { final Cigar actualCigar = AlignmentUtils.leftAlignIndel(originalCigar, reference, read, 0, 0, true); Assert.assertTrue(expectedCigar.equals(actualCigar), "Wrong left alignment detected for cigar " + originalCigar.toString() + " to " + actualCigar.toString() + " but expected " + expectedCigar.toString() + " with repeat length " + repeatLength); }
@Override public Alignment align_smith_waterman(byte[] seq, byte[] ref) { Sequence sSeq = new Sequence("seq", new String(seq)); Sequence sRef = new Sequence("ref", new String(ref)); jaligner.Alignment jaln = SmithWatermanGotoh.align(sRef, sSeq, matrix, gapOpen, gapExtend); Alignment alignment = new Alignment(jaln.getStart1(), alignmentToCigar(jaln).toString()); return alignment; } private static Matrix createMatrix(int match, int mismatch, int ambiguous) {
@Test(enabled = !DEBUG, dataProvider = "AlignmentByteArrayOffsetDataProvider") public void testAlignmentByteArrayOffsetData(final Cigar cigar, final int offset, final int expectedResult, final boolean isDeletion, final int lengthOfSoftClip) { final int actual = AlignmentUtils.calcAlignmentByteArrayOffset(cigar, isDeletion ? -1 : offset, isDeletion, 20, 20 + offset - lengthOfSoftClip); Assert.assertEquals(actual, expectedResult, "Wrong alignment offset detected for cigar " + cigar.toString()); }
@Test(enabled = !DEBUG, dataProvider = "CigarHasZeroElement") public void testCigarHasZeroSize(final Cigar cigar, final boolean hasZero) { Assert.assertEquals(AlignmentUtils.cigarHasZeroSizeElement(cigar), hasZero, "Cigar " + cigar.toString() + " failed cigarHasZeroSizeElement"); }
@Test(dataProvider = "filteringIteratorTestData") public void testCigarRefactoring (final String originalCigarString, final String expectedString) { Cigar originalCigar = CigarUtils.cigarFromString(originalCigarString); String actualString = filter.refactorNDNtoN(originalCigar).toString(); Assert.assertEquals(actualString, expectedString, "ciagr string "+ originalCigarString+" should become: "+expectedString+" but got: "+actualString); }
@Test(dataProvider = "OddNoAlignment", enabled = true) public void testOddNoAlignment(final String reference, final String read, final int match, final int mismatch, final int gap, final int gap_extend, final int expectedStart, final String expectedCigar) { final SWPairwiseAlignment sw = new SWPairwiseAlignment(reference.getBytes(), read.getBytes(), match, mismatch, gap, gap_extend); Assert.assertEquals(sw.getAlignmentStart2wrt1(), expectedStart); Assert.assertEquals(sw.getCigar().toString(), expectedCigar); }
@Test(dataProvider="addData") public void addingSoftClippedBasesTest(final String testName, final String cigar, final boolean negativeStrand, final int threePrimeEnd, final int fivePrimeEnd, final String expectedCigar) throws IOException { Assert.assertEquals(CigarUtil.addSoftClippedBasesToEndsOfCigar(TextCigarCodec.decode(cigar), negativeStrand, threePrimeEnd, fivePrimeEnd).toString(), expectedCigar, testName); }
@Test(enabled = true) public void testDegenerateAlignmentWithIndelsAtBothEnds() { logger.warn("testDegenerateAlignmentWithIndelsAtBothEnds"); final String ref = "TGTGTGTGTGTGTGACAGAGAGAGAGAGAGAGAGAGAGAGAGAGA"; final String alt = "ACAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGA"; final int expectedStart = 14; final String expectedCigar = "31M20S"; final SWPairwiseAlignment sw = new SWPairwiseAlignment(ref.getBytes(), alt.getBytes(), SWParameterSet.STANDARD_NGS); sw.printAlignment(ref.getBytes(), alt.getBytes()); Assert.assertEquals(sw.getAlignmentStart2wrt1(), expectedStart); Assert.assertEquals(sw.getCigar().toString(), expectedCigar); }
@Test(dataProvider = "ComplexReadAlignedToRef", enabled = true) public void testReadAlignedToRefComplexAlignment(final String reference, final String read, final int expectedStart, final String expectedCigar) { final SWPairwiseAlignment sw = new SWPairwiseAlignment(reference.getBytes(), read.getBytes()); Assert.assertEquals(sw.getAlignmentStart2wrt1(), expectedStart); Assert.assertEquals(sw.getCigar().toString(), expectedCigar); }
@Test public void testConsolidateCigar() throws Exception { Assert.assertEquals(makeHCForCigar("AGCT", "4M").getConsolidatedPaddedCigar(0).toString(), "4M"); Assert.assertEquals(makeHCForCigar("AGCT", "4M").getConsolidatedPaddedCigar(1).toString(), "5M"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1M").getConsolidatedPaddedCigar(0).toString(), "1M2I1M"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1M").getConsolidatedPaddedCigar(1).toString(), "1M2I2M"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1M").getConsolidatedPaddedCigar(2).toString(), "1M2I3M"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1I").getConsolidatedPaddedCigar(0).toString(), "1M3I"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1I").getConsolidatedPaddedCigar(1).toString(), "1M3I1M"); Assert.assertEquals(makeHCForCigar("AGCT", "1M1I1I1I").getConsolidatedPaddedCigar(2).toString(), "1M3I2M"); }
@Test(enabled = true) public void testIndelsAtStartAndEnd() { final String match = "CCCCC"; final String reference = "AAA" + match; final String read = match + "GGG"; final int expectedStart = 3; final String expectedCigar = "5M3S"; final SWPairwiseAlignment sw = new SWPairwiseAlignment(reference.getBytes(), read.getBytes()); sw.printAlignment(reference.getBytes(), read.getBytes()); Assert.assertEquals(sw.getAlignmentStart2wrt1(), expectedStart); Assert.assertEquals(sw.getCigar().toString(), expectedCigar); }
public static GATKSAMRecord createArtificialRead(Cigar cigar) { int length = cigar.getReadLength(); byte [] base = {'A'}; byte [] qual = {30}; byte [] bases = Utils.arrayFromArrayWithLength(base, length); byte [] quals = Utils.arrayFromArrayWithLength(qual, length); SAMFileHeader header = ArtificialSAMUtils.createArtificialSamHeader(); return ArtificialSAMUtils.createArtificialRead(header, "default_read", 0, 10000, bases, quals, cigar.toString()); }
@Test(enabled = !DEBUG, dataProvider = "ReadToAlignmentByteArrayDataProvider") public void testReadToAlignmentByteArrayData(final Cigar cigar, final int expectedLength, final char middleOp, final int startOfIndelBases, final int lengthOfDeletion) { final byte[] read = Utils.dupBytes((byte)'A', cigar.getReadLength()); final byte[] alignment = AlignmentUtils.readToAlignmentByteArray(cigar, read); Assert.assertEquals(alignment.length, expectedLength, "Wrong alignment length detected for cigar " + cigar.toString()); for ( int i = 0; i < alignment.length; i++ ) { final byte expectedBase; if ( middleOp == 'D' && i >= startOfIndelBases && i < startOfIndelBases + lengthOfDeletion ) expectedBase = PileupElement.DELETION_BASE; else if ( middleOp == 'I' && i == startOfIndelBases - 1 ) expectedBase = PileupElement.A_FOLLOWED_BY_INSERTION_BASE; else expectedBase = (byte)'A'; Assert.assertEquals(alignment[i], expectedBase, "Wrong base detected at position " + i); } }
@Test(dataProvider = "longCigarsData") public void testSetCigarStringRemovesCgTagWhenStillLong(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); final List<CigarOperator> cigarOperatorsForTest = getCigarOperatorsForTest(numOps); cigarOperatorsForTest.add(CigarOperator.H); final Cigar cigar2 = Cigar.fromCigarOperators(cigarOperatorsForTest); frag1.setCigarString(cigar2.toString()); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }
@Test(dataProvider = "longCigarsData") public void testLongCigarsOneRead(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }
@Test(dataProvider = "longCigarsData") public void testSetCigarRemovesCgTagWhenNoLongerLong(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); frag1.setCigarString(String.format("%dM", cigar.getReadLength())); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }
@Test(dataProvider = "longCigarsData") public void testSetCigarStringRemovesCgTagWhenNoLongerLong(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); frag1.setCigarString(String.format("%dM", cigar.getReadLength())); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }
@Test(dataProvider = "longCigarsData") public void testSetCigarRemovesCgTagWhenStillLong(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); final List<CigarOperator> cigarOperatorsForTest = getCigarOperatorsForTest(numOps); cigarOperatorsForTest.add(CigarOperator.H); final Cigar cigar2 = Cigar.fromCigarOperators(cigarOperatorsForTest); frag1.setCigar(cigar2); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }
/** * Make a read fom the CIGAR * * @param cigar the CIGAR * @param lengthChange change in read length relative the CIGAR length * @return artificial read */ public static GATKSAMRecord makeReadFromCigar(Cigar cigar, int lengthChange) { int readLength = cigar.getReadLength(); if ( readLength >= -lengthChange ) { readLength += lengthChange; } return ArtificialSAMUtils.createArtificialRead(Utils.arrayFromArrayWithLength(BASES, readLength), Utils.arrayFromArrayWithLength(QUALS, readLength), cigar.toString()); }
@Test(dataProvider = "longCigarsData") public void testLongCigarsZerolengthRead(final int numOps) throws Exception { final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); final SAMRecord sam = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); sam.setReadBases(new byte[]{}); sam.setBaseQualityString(""); // in htsjdk only secondary alignments are allowed to have read-length zero (doesn't validate otherwise) sam.setSecondaryAlignment(true); testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); }