@Test(enabled = !DEBUG, dataProvider = "SoftClipsDataProvider") public void testSoftClipsData(final byte[] qualsOfSoftClipsOnLeft, final int middleSize, final String middleOp, final byte[] qualOfSoftClipsOnRight, final int qualThreshold, final int numExpected) { final int readLength = (middleOp.equals("D") ? 0 : middleSize) + qualOfSoftClipsOnRight.length + qualsOfSoftClipsOnLeft.length; final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(header, "myRead", 0, 1, readLength); final byte[] bases = Utils.dupBytes((byte) 'A', readLength); final byte[] matchBytes = middleOp.equals("D") ? new byte[]{} : Utils.dupBytes((byte)30, middleSize); final byte[] quals = ArrayUtils.addAll(ArrayUtils.addAll(qualsOfSoftClipsOnLeft, matchBytes), qualOfSoftClipsOnRight); // set the read's bases and quals read.setReadBases(bases); read.setBaseQualities(quals); final StringBuilder cigar = new StringBuilder(); if (qualsOfSoftClipsOnLeft.length > 0 ) cigar.append(qualsOfSoftClipsOnLeft.length + "S"); if (middleSize > 0 ) cigar.append(middleSize + middleOp); if (qualOfSoftClipsOnRight.length > 0 ) cigar.append(qualOfSoftClipsOnRight.length + "S"); read.setCigarString(cigar.toString()); final int actual = AlignmentUtils.calcNumHighQualitySoftClips(read, (byte) qualThreshold); Assert.assertEquals(actual, numExpected, "Wrong number of soft clips detected for read " + read.getSAMString()); }
private void calcPileupElementRefVsNonRefLikelihoodAndCount(final byte refBase, final int likelihoodCount, final double log10Ploidy, final RefVsAnyResult result, final PileupElement element, final byte qual, final MathUtils.RunningAverage hqSoftClips) { final boolean isAlt = element.getBase() != refBase || element.isDeletion() || element.isBeforeDeletionStart() || element.isAfterDeletionEnd() || element.isBeforeInsertion() || element.isAfterInsertion() || element.isNextToSoftClip(); final double referenceLikelihood; final double nonRefLikelihood; if (isAlt) { nonRefLikelihood = QualityUtils.qualToProbLog10(qual); referenceLikelihood = QualityUtils.qualToErrorProbLog10(qual) + MathUtils.LOG_ONE_THIRD; result.AD_Ref_Any[1]++; } else { referenceLikelihood = QualityUtils.qualToProbLog10(qual); nonRefLikelihood = QualityUtils.qualToErrorProbLog10(qual) + MathUtils.LOG_ONE_THIRD; result.AD_Ref_Any[0]++; } // Homozygous likelihoods don't need the logSum trick. result.genotypeLikelihoods[0] += referenceLikelihood + log10Ploidy; result.genotypeLikelihoods[likelihoodCount - 1] += nonRefLikelihood + log10Ploidy; // Heterozyougs likelihoods need the logSum trick: for (int i = 1, j = likelihoodCount - 2; i < likelihoodCount - 1; i++, j--) result.genotypeLikelihoods[i] += MathUtils.approximateLog10SumLog10( referenceLikelihood + MathUtils.Log10Cache.get(j), nonRefLikelihood + MathUtils.Log10Cache.get(i)); if (isAlt && hqSoftClips != null && element.isNextToSoftClip()) hqSoftClips.add(AlignmentUtils.calcNumHighQualitySoftClips(element.getRead(), HQ_BASE_QUALITY_SOFTCLIP_THRESHOLD)); }