if (other.cigar != null) return false; } else if (!cigar.equals(other.cigar)) return false; if (isNegativeStrand != other.isNegativeStrand)
return false; if (!Arrays.equals(mBaseQualities, samRecord.mBaseQualities)) return false; if (mCigar != null ? !mCigar.equals(samRecord.mCigar) : samRecord.mCigar != null) return false; if (mMateReferenceName != null ? !mMateReferenceName.equals(samRecord.mMateReferenceName) : samRecord.mMateReferenceName != null)
@Override public boolean equals(final Object o) { if (this == o) return true; if (!(o instanceof SAMRecord)) return false; final SAMRecord samRecord = (SAMRecord) o; // First check all the elements that do not require decoding if (mAlignmentStart != samRecord.mAlignmentStart) return false; if (mFlags != samRecord.mFlags) return false; if (mInferredInsertSize != samRecord.mInferredInsertSize) return false; if (mMappingQuality != samRecord.mMappingQuality) return false; if (mMateAlignmentStart != samRecord.mMateAlignmentStart) return false; if (mMateReferenceIndex != null ? !mMateReferenceIndex.equals(samRecord.mMateReferenceIndex) : samRecord.mMateReferenceIndex != null) return false; if (mReferenceIndex != null ? !mReferenceIndex.equals(samRecord.mReferenceIndex) : samRecord.mReferenceIndex != null) return false; eagerDecode(); samRecord.eagerDecode(); if (mReadName != null ? !mReadName.equals(samRecord.mReadName) : samRecord.mReadName != null) return false; if (mAttributes != null ? !mAttributes.equals(samRecord.mAttributes) : samRecord.mAttributes != null) return false; if (!Arrays.equals(mBaseQualities, samRecord.mBaseQualities)) return false; if (mCigar != null ? !mCigar.equals(samRecord.mCigar) : samRecord.mCigar != null) return false; if (mMateReferenceName != null ? !mMateReferenceName.equals(samRecord.mMateReferenceName) : samRecord.mMateReferenceName != null) return false; if (!Arrays.equals(mReadBases, samRecord.mReadBases)) return false; if (mReferenceName != null ? !mReferenceName.equals(samRecord.mReferenceName) : samRecord.mReferenceName != null) return false; return true; }
return false; if (!Arrays.equals(mBaseQualities, samRecord.mBaseQualities)) return false; if (mCigar != null ? !mCigar.equals(samRecord.mCigar) : samRecord.mCigar != null) return false; if (mMateReferenceName != null ? !mMateReferenceName.equals(samRecord.mMateReferenceName) : samRecord.mMateReferenceName != null)
@Test(dataProvider = "StartsOrEndsWithInsertionOrDeletionData", enabled = true) public void testRemoveTrailingDeletions(final String cigar, final boolean expected) { final Cigar originalCigar = TextCigarCodec.decode(cigar); final Cigar newCigar = AlignmentUtils.removeTrailingDeletions(originalCigar); Assert.assertEquals(originalCigar.equals(newCigar), !cigar.endsWith("D")); }
public void setCigar(Cigar cigar, boolean fixClippedCigar) { if ( cigar == null ) { newCigar = null; return; } if ( fixClippedCigar && getReadBases().length < read.getReadLength() ) cigar = reclipCigar(cigar); // no change? if ( read.getCigar().equals(cigar) ) { newCigar = null; return; } // no indel? String str = cigar.toString(); if ( !str.contains("D") && !str.contains("I") ) { logger.debug("Modifying a read with no associated indel; although this is possible, it is highly unlikely. Perhaps this region should be double-checked: " + read.getReadName() + " near " + read.getReferenceName() + ":" + read.getAlignmentStart()); // newCigar = null; // return; } newCigar = cigar; }
private SAMRecord cleanCigar(SAMRecord next) { Cigar cigar = next.getCigar(); if (cigar != null && cigar.getCigarElements().size() > 0) { Cigar newCigar = new Cigar(CigarUtil.clean(cigar.getCigarElements(), true)); if (!cigar.equals(newCigar)) { if (!MessageThrottler.Current.shouldSupress(log, "minimal CIGAR representation")) { log.warn(String.format("Cigar %s of read %s is not a minimal representation.", cigar, next.getReadName())); } next.setCigar(newCigar); } } return next; }
@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); }
if (convertedCigar.equals(updatedRead.getCigar())) { isEquivalent = true;
@Test public void testSimpleClippingOfRecord() { // setup the record final SAMFileHeader header = new SAMFileHeader(); header.addSequence(new SAMSequenceRecord("1", 1000)); final SAMRecord record = new SAMRecord(header); record.setReadPairedFlag(true); record.setCigar(TextCigarCodec.decode("10M")); record.setReferenceIndex(0); record.setAlignmentStart(1); record.setMateReferenceIndex(0); record.setMateAlignmentStart(6); // should overlap 5M record.setReadBases("AAAAAAAAAA".getBytes()); final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record); Assert.assertEquals(numToClip, 5); SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("5M5S"))); }
@Test public void testClippingOfRecordWithSoftClipBasesAtTheEnd() { /** * Tests that if we need to clip a read with soft-clipping at the end, it does the right thing. */ // setup the record final SAMFileHeader header = new SAMFileHeader(); header.addSequence(new SAMSequenceRecord("1", 1000)); final SAMRecord record = new SAMRecord(header); record.setReadPairedFlag(true); record.setCigar(TextCigarCodec.decode("5M5S")); record.setReferenceIndex(0); record.setAlignmentStart(1); record.setMateReferenceIndex(0); record.setMateAlignmentStart(5); // should overlap 1M5S record.setReadBases("AAAAAAAAAA".getBytes()); final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record); Assert.assertEquals(numToClip, 1); SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S"))); }
@Test public void testClippingOfRecordWithDeletion() { /** * Tests that if we need to clip a read with an deletion that overlaps */ // setup the record final SAMFileHeader header = new SAMFileHeader(); header.addSequence(new SAMSequenceRecord("1", 1000)); final SAMRecord record = new SAMRecord(header); record.setReadPairedFlag(true); record.setCigar(TextCigarCodec.decode("5M1D5M")); record.setReferenceIndex(0); record.setAlignmentStart(1); record.setMateReferenceIndex(0); record.setMateAlignmentStart(5); // should overlap the 1M1D5M record.setReadBases("AAAAAAAAAA".getBytes()); final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record); Assert.assertEquals(numToClip, 6); SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S"))); }
@Test public void testClippingOfRecordWithInsertion() { /** * Tests that if we need to clip a read with an insertion that overlaps */ // setup the record final SAMFileHeader header = new SAMFileHeader(); header.addSequence(new SAMSequenceRecord("1", 1000)); final SAMRecord record = new SAMRecord(header); record.setReadPairedFlag(true); record.setCigar(TextCigarCodec.decode("5M1I5M")); record.setReferenceIndex(0); record.setAlignmentStart(1); record.setMateReferenceIndex(0); record.setMateAlignmentStart(5); // should overlap the 1M1I5M record.setReadBases("AAAAAAAAAAA".getBytes()); final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record); Assert.assertEquals(numToClip, 7); SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M7S"))); }
if ( !newCigar.equals(originalCigar) && newCigar.numCigarElements() > 1 ) { int difference = originalIndex - newCigar.getCigarElement(0).getLength(); VariantContext newVC = new VariantContextBuilder(vc).start(vc.getStart()-difference).stop(vc.getEnd()-difference).make();