final int right = Math.max(Math.max(firstEnd.alignmentStart, firstEnd.getAlignmentEnd()), Math.max(secondEnd.alignmentStart, secondEnd.getAlignmentEnd())); final int left = Math.min(Math.min(firstEnd.alignmentStart, firstEnd.getAlignmentEnd()), Math.min(secondEnd.alignmentStart, secondEnd.getAlignmentEnd())); final int tlen = right - left + 1; if (firstEnd.getAlignmentEnd() != right) firstEnd.templateSize = tlen; else if (firstEnd.isFirstSegment()) if (secondEnd.getAlignmentEnd() != right) secondEnd.templateSize = tlen; else if (secondEnd.isFirstSegment())
/** * The method is similar in semantics to * {@link htsjdk.samtools.SamPairUtil#computeInsertSize(SAMRecord, SAMRecord) * computeInsertSize} but operates on CRAM native records instead of * SAMRecord objects. * * @param firstEnd first mate of the pair * @param secondEnd second mate of the pair * @return template length */ public static int computeInsertSize(final CramCompressionRecord firstEnd, final CramCompressionRecord secondEnd) { if (firstEnd.isSegmentUnmapped() || secondEnd.isSegmentUnmapped()) { return 0; } if (firstEnd.sequenceId != secondEnd.sequenceId) { return 0; } final int firstEnd5PrimePosition = firstEnd.isNegativeStrand() ? firstEnd.getAlignmentEnd() : firstEnd.alignmentStart; final int secondEnd5PrimePosition = secondEnd.isNegativeStrand() ? secondEnd.getAlignmentEnd() : secondEnd.alignmentStart; final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1; return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment; } }
/** * The method is similar in semantics to * {@link htsjdk.samtools.SamPairUtil#computeInsertSize(SAMRecord, SAMRecord) * computeInsertSize} but operates on CRAM native records instead of * SAMRecord objects. * * @param firstEnd first mate of the pair * @param secondEnd second mate of the pair * @return template length */ public static int computeInsertSize(final CramCompressionRecord firstEnd, final CramCompressionRecord secondEnd) { if (firstEnd.isSegmentUnmapped() || secondEnd.isSegmentUnmapped()) { return 0; } if (firstEnd.sequenceId != secondEnd.sequenceId) { return 0; } final int firstEnd5PrimePosition = firstEnd.isNegativeStrand() ? firstEnd.getAlignmentEnd() : firstEnd.alignmentStart; final int secondEnd5PrimePosition = secondEnd.isNegativeStrand() ? secondEnd.getAlignmentEnd() : secondEnd.alignmentStart; final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1; return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment; } }
/** * The method is similar in semantics to * {@link htsjdk.samtools.SamPairUtil#computeInsertSize(SAMRecord, SAMRecord) * computeInsertSize} but operates on CRAM native records instead of * SAMRecord objects. * * @param firstEnd * first mate of the pair * @param secondEnd * second mate of the pair * @return template length */ public static int computeInsertSize(final CramCompressionRecord firstEnd, final CramCompressionRecord secondEnd) { if (firstEnd.isSegmentUnmapped() || secondEnd.isSegmentUnmapped()) { return 0; } if (firstEnd.sequenceId != secondEnd.sequenceId) { return 0; } final int firstEnd5PrimePosition = firstEnd.isNegativeStrand() ? firstEnd.getAlignmentEnd() : firstEnd.alignmentStart; final int secondEnd5PrimePosition = secondEnd.isNegativeStrand() ? secondEnd.getAlignmentEnd() : secondEnd.alignmentStart; final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1; return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment; } }
} else if (record.alignmentStart != SAMRecord.NO_ALIGNMENT_START) { minAlStart = Math.min(record.alignmentStart, minAlStart); maxAlEnd = Math.max(record.getAlignmentEnd(), maxAlEnd);
for (final CramCompressionRecord record : records) { if (!record.isSegmentUnmapped() || record.readBases == null) { int end = record.getAlignmentEnd(); if (record.alignmentStart > SAMRecord.NO_ALIGNMENT_START && end >= record.alignmentStart) addSpan(record.sequenceId, record.alignmentStart, end - record.alignmentStart + 1, 1, map);
maxAlEnd = Math.max(record.getAlignmentEnd(), maxAlEnd);
r.alignmentStart = 1; r.setSegmentUnmapped(true); Assert.assertEquals(r.getAlignmentEnd(), SAMRecord.NO_ALIGNMENT_START); r.readLength = readLength; r.setSegmentUnmapped(false); Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1); String softClip = "AAA"; r.readFeatures.add(new SoftClip(1, softClip.getBytes())); Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - softClip.length()); int deletionLength = 5; r.readFeatures.add(new Deletion(1, deletionLength)); Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 + deletionLength); String insertion = "CCCCCCCCCC"; r.readFeatures.add(new Insertion(1, insertion.getBytes())); Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - insertion.length()); r.readFeatures = new ArrayList<>(); r.readFeatures.add(new InsertBase(1, (byte) 'A')); Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - 1);
if (location != null && r.sequenceId == location.sequenceId && r.getAlignmentEnd() < location.start) continue;