/** returns the first cigar element */ public CigarElement getFirstCigarElement() { return isEmpty() ? null : this.cigarElements.get(0); }
/** returns the first cigar element */ public CigarElement getFirstCigarElement() { return isEmpty() ? null : this.cigarElements.get(0); }
/** returns the last cigar element */ public CigarElement getLastCigarElement() { return isEmpty() ? null : this.cigarElements.get(this.numCigarElements() - 1 ); }
/** returns the last cigar element */ public CigarElement getLastCigarElement() { return isEmpty() ? null : this.cigarElements.get(this.numCigarElements() - 1 ); }
/** * Convert from Cigar class representation to String. * @param cigar in Cigar class format * @return CIGAR in String form ala SAM text file. "*" means empty CIGAR. */ public static String encode(final Cigar cigar) { if (cigar.isEmpty()) { return SAMRecord.NO_ALIGNMENT_CIGAR; } final StringBuilder ret = new StringBuilder(); for (final CigarElement cigarElement : cigar.getCigarElements()) { ret.append(cigarElement.getLength()); ret.append(cigarElement.getOperator()); } return ret.toString(); }
/** * Temporarily implement getCigarString() for debugging; the TextCigarCodec is unfortunately * package-protected. * @return */ public String getCigarString() { Cigar cigar = getCigar(); if(cigar.isEmpty()) return "*"; StringBuilder cigarString = new StringBuilder(); for(CigarElement element: cigar.getCigarElements()) { cigarString.append(element.getLength()); cigarString.append(element.getOperator()); } return cigarString.toString(); }
/** * Convert from Cigar class representation to String. * @param cigar in Cigar class format * @return CIGAR in String form ala SAM text file. "*" means empty CIGAR. */ public String encode(final Cigar cigar) { if (cigar.isEmpty()) { return SAMRecord.NO_ALIGNMENT_CIGAR; } final StringBuilder ret = new StringBuilder(); for (final CigarElement cigarElement : cigar.getCigarElements()) { ret.append(cigarElement.getLength()); ret.append(cigarElement.getOperator()); } return ret.toString(); }
/** * Convert from Cigar class representation to String. * @param cigar in Cigar class format * @return CIGAR in String form ala SAM text file. "*" means empty CIGAR. */ public static String encode(final Cigar cigar) { if (cigar.isEmpty()) { return SAMRecord.NO_ALIGNMENT_CIGAR; } final StringBuilder ret = new StringBuilder(); for (final CigarElement cigarElement : cigar.getCigarElements()) { ret.append(cigarElement.getLength()); ret.append(cigarElement.getOperator()); } return ret.toString(); }
protected Range<Long> rangeOf(long startOffset, Cigar cigar) { int refLength = (cigar == null || cigar.isEmpty()) ? 1 : cigar.getReferenceLength(); return Range.closedOpen(startOffset, startOffset + refLength); }
/** returns true if the cigar string ends With a clipping operator */ public boolean isRightClipped() { return !isEmpty() && isClippingOperator(getLastCigarElement().getOperator()); }
/** returns true if the cigar string starts With a clipping operator */ public boolean isLeftClipped() { return !isEmpty() && isClippingOperator(getFirstCigarElement().getOperator()); }
/** returns true if the cigar string ends With a clipping operator */ public boolean isRightClipped() { return !isEmpty() && isClippingOperator(getLastCigarElement().getOperator()); }
/** returns true if the cigar string starts With a clipping operator */ public boolean isLeftClipped() { return !isEmpty() && isClippingOperator(getFirstCigarElement().getOperator()); }
/** * Does cigar start or end with a deletion operation? * * @param cigar a non-null cigar to test * @return true if the first or last operator of cigar is a D */ public static boolean startsOrEndsWithInsertionOrDeletion(final Cigar cigar) { if ( cigar == null ) throw new IllegalArgumentException("Cigar cannot be null"); if ( cigar.isEmpty() ) return false; final CigarOperator first = cigar.getCigarElement(0).getOperator(); final CigarOperator last = cigar.getCigarElement(cigar.numCigarElements()-1).getOperator(); return first == CigarOperator.D || first == CigarOperator.I || last == CigarOperator.D || last == CigarOperator.I; }
if( c.isEmpty() ) { return false;
/** Replaces hard clips with soft clips and fills in bases and qualities with dummy values as needed. */ private void replaceHardWithSoftClips(final SAMRecord rec) { if (rec.getReadUnmappedFlag()) return; if (rec.getCigar().isEmpty()) return; List<CigarElement> elements = rec.getCigar().getCigarElements(); final CigarElement first = elements.get(0); final CigarElement last = elements.size() == 1 ? null : elements.get(elements.size()-1); final int startHardClip = first.getOperator() == CigarOperator.H ? first.getLength() : 0; final int endHardClip = (last != null && last.getOperator() == CigarOperator.H) ? last.getLength() : 0; if (startHardClip + endHardClip > 0) { final int len = rec.getReadBases().length + startHardClip + endHardClip; // Fix the basecalls final byte[] bases = new byte[len]; Arrays.fill(bases, (byte) 'N'); System.arraycopy(rec.getReadBases(), 0, bases, startHardClip, rec.getReadBases().length); // Fix the quality scores final byte[] quals = new byte[len]; Arrays.fill(quals, (byte) 2 ); System.arraycopy(rec.getBaseQualities(), 0, quals, startHardClip, rec.getBaseQualities().length); // Fix the cigar! elements = new ArrayList<CigarElement>(elements); // make it modifiable if (startHardClip > 0) elements.set(0, new CigarElement(first.getLength(), CigarOperator.S)); if (endHardClip > 0) elements.set(elements.size()-1, new CigarElement(last.getLength(), CigarOperator.S)); // Set the update structures on the new record rec.setReadBases(bases); rec.setBaseQualities(quals); rec.setCigar(new Cigar(elements)); } }
/** Replaces hard clips with soft clips and fills in bases and qualities with dummy values as needed. */ private void replaceHardWithSoftClips(final SAMRecord rec) { if (rec.getReadUnmappedFlag()) return; if (rec.getCigar().isEmpty()) return; List<CigarElement> elements = rec.getCigar().getCigarElements(); final CigarElement first = elements.get(0); final CigarElement last = elements.size() == 1 ? null : elements.get(elements.size()-1); final int startHardClip = first.getOperator() == CigarOperator.H ? first.getLength() : 0; final int endHardClip = (last != null && last.getOperator() == CigarOperator.H) ? last.getLength() : 0; if (startHardClip + endHardClip > 0) { final int len = rec.getReadBases().length + startHardClip + endHardClip; // Fix the basecalls final byte[] bases = new byte[len]; Arrays.fill(bases, (byte) 'N'); System.arraycopy(rec.getReadBases(), 0, bases, startHardClip, rec.getReadBases().length); // Fix the quality scores final byte[] quals = new byte[len]; Arrays.fill(quals, (byte) 2 ); System.arraycopy(rec.getBaseQualities(), 0, quals, startHardClip, rec.getBaseQualities().length); // Fix the cigar! elements = new ArrayList<CigarElement>(elements); // make it modifiable if (startHardClip > 0) elements.set(0, new CigarElement(first.getLength(), CigarOperator.S)); if (endHardClip > 0) elements.set(elements.size()-1, new CigarElement(last.getLength(), CigarOperator.S)); // Set the update structures on the new record rec.setReadBases(bases); rec.setBaseQualities(quals); rec.setCigar(new Cigar(elements)); } }
@Test public void testMakeCigarFromOperators() { final List<CigarOperator> cigarOperators = Arrays.asList( CigarOperator.S, CigarOperator.M, CigarOperator.M, CigarOperator.M, CigarOperator.I, CigarOperator.M, CigarOperator.D, CigarOperator.M ); final Cigar cigar = Cigar.fromCigarOperators(cigarOperators); Assert.assertFalse(cigar.isEmpty()); Assert.assertEquals(cigar.numCigarElements(), 6); Assert.assertEquals(cigar.toString(),"1S3M1I1M1D1M"); Assert.assertFalse(cigar.containsOperator(CigarOperator.N)); Assert.assertTrue(cigar.containsOperator(CigarOperator.D)); Assert.assertTrue(cigar.isLeftClipped()); Assert.assertFalse(cigar.isRightClipped()); Assert.assertTrue(cigar.isClipped()); }
} else if( cigar.isEmpty() ) { throw new IllegalStateException("Smith-Waterman alignment failure. Cigar = " + cigar + " with reference length " + cigar.getReferenceLength() + " but expecting reference length of " + refHaplotype.getCigar().getReferenceLength());
if( !cigarToAlign.isEmpty() ) { for( final CigarElement toAdd : cigarToAlign.getCigarElements() ) { cigarToReturn.add(toAdd);