@Override public void setReadNegativeStrandFlag(final boolean flag) { if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) { initializedFlags.add(LazyFlag.READ_NEGATIVE_STRAND); } super.setReadNegativeStrandFlag(flag); }
@Override public void setReadNegativeStrandFlag(final boolean flag) { if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) { initializedFlags.add(LazyFlag.READ_NEGATIVE_STRAND); } super.setReadNegativeStrandFlag(flag); }
@Override public void setReadNegativeStrandFlag(final boolean flag) { if ( isStrandless() ) throw new IllegalStateException("Cannot set the strand of a strandless read"); super.setReadNegativeStrandFlag(flag); }
private static SAMRecord primaryAlignmentForSupplementary(SAMRecord r) { if (r.getSupplementaryAlignmentFlag()) { SAMRecord record = SAMRecordUtil.clone(r); List<ChimericAlignment> calist = ChimericAlignment.getChimericAlignments(r); if (calist.size() > 0) { ChimericAlignment ca = calist.get(0); record.setReferenceName(ca.rname); record.setAlignmentStart(ca.pos); record.setReadNegativeStrandFlag(ca.isNegativeStrand); record.setCigar(ca.cigar); record.setMappingQuality(ca.mapq); record.setReadBases(SAMRecord.NULL_SEQUENCE); record.setBaseQualities(SAMRecord.NULL_QUALS); return record; } } return r; } public static void main(String[] argv) {
@Test(dataProvider = "mismatchBisulfiteCountsDataProvider") public void testMismatchBisulfiteCounts(final String readString, final String cigar, final String reference, final boolean positiveStrand, final int expectedMismatches) { final byte baseQuality = 30; final SAMRecord rec = new SAMRecord(null); rec.setReadName("test"); rec.setReadString(readString); rec.setReadNegativeStrandFlag(!positiveStrand); final byte[] byteArray = new byte[readString.length()]; Arrays.fill(byteArray,baseQuality); rec.setBaseQualities(byteArray); rec.setCigarString(cigar); final byte[] refBases = StringUtil.stringToBytes(reference); final int nExact = SequenceUtil.countMismatches(rec, refBases, -1, true, false); Assert.assertEquals(nExact, expectedMismatches); final int sumMismatchesQualityExact = SequenceUtil.sumQualitiesOfMismatches(rec, refBases, -1, true); Assert.assertEquals(sumMismatchesQualityExact, expectedMismatches * baseQuality); }
@Test public void testUnmappedRecords() throws IOException { final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder(); for (int i = 0; i < 4; i++) { samBuilder.addUnmappedFragment(String.valueOf(i)); } final Iterator<SAMRecord> records = samBuilder.iterator(); records.next().setReadNegativeStrandFlag(true); records.next().setSecondaryAlignment(true); records.next().setMappingQuality(10); records.next().setCigarString("36M"); final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE); Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_NOT_PRIM_ALIGNMENT.getHistogramString()).getValue(), 1.0); Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_MAPPING_QUALITY.getHistogramString()).getValue(), 1.0); }
public void addAlignment(int sampleIdx, SAMRecordWrapper samRecord, int chromosomeChunkIdx) { Feature chunk = this.chromosomeChunker.getChunks().get(chromosomeChunkIdx); SAMRecord read = samRecord.getSamRecord(); // Only output reads with original start pos within specified chromosomeChunk // Avoids reads being written in 2 different chunks int origAlignmentStart = read.getAlignmentStart(); String yo = read.getStringAttribute("YO"); if (yo != null) { String[] fields = yo.split(":"); origAlignmentStart = Integer.parseInt(fields[1]); } if (origAlignmentStart >= chunk.getStart() && origAlignmentStart <= chunk.getEnd()) { if (samRecord.isUnalignedRc() && read.getReadUnmappedFlag()) { // This read was reverse complemented, but not updated. // Change it back to its original state. read.setReadString(rc.reverseComplement(read.getReadString())); read.setBaseQualityString(rc.reverse(read.getBaseQualityString())); read.setReadNegativeStrandFlag(!read.getReadNegativeStrandFlag()); } writers[sampleIdx][chromosomeChunkIdx].addAlignment(read); } }
@Test(dataProvider = "homopolymerStratifierData") public void testHomopolymerLength(final int offset, final boolean readStrandPositive, final byte referenceBase, final Object expectedStratum, final ReadBaseStratification.RecordAndOffsetStratifier<?> recordAndOffsetStratifier) { final SAMSequenceRecord samSequenceRecord = new SAMSequenceRecord("chr1", 200); final SAMFileHeader samFileHeader = new SAMFileHeader(); final SAMRecord samRecord = new SAMRecord(samFileHeader); samRecord.setReadBases("CATGGGGAAAAAAAAA".getBytes()); samRecord.setReadUnmappedFlag(false); samRecord.setReadNegativeStrandFlag(!readStrandPositive); samRecord.setAlignmentStart(1); SamLocusIterator.RecordAndOffset recordAndOffset = new SamLocusIterator.RecordAndOffset(samRecord, offset); SamLocusIterator.LocusInfo locusInfo = new SamLocusIterator.LocusInfo(samSequenceRecord, 1); final SAMLocusAndReference locusAndReference = new SAMLocusAndReference(locusInfo, referenceBase); Assert.assertEquals(recordAndOffsetStratifier.stratify(recordAndOffset, locusAndReference), expectedStratum); }
@Override public String getRemoteEvidenceID() { SAMRecord remote = this.getSAMRecord().deepCopy(); remote.setReferenceName(remoteAlignment.rname); remote.setAlignmentStart(remoteAlignment.pos); remote.setReadUnmappedFlag(false); remote.setReadNegativeStrandFlag(remoteAlignment.isNegativeStrand); remote.setCigar(remoteAlignment.cigar); remote.setAttribute(SAMTag.SA.name(), new ChimericAlignment(this.getSAMRecord()).toString()); SplitReadEvidence remoteEvidence = SplitReadEvidence.create(source, remote).get(0); return source.getContext().getEvidenceIDGenerator().getEvidenceID(remoteEvidence); } @Override
private SAMRecord makeSamRecord(final SAMFileHeader header, final int alignmentStart, final int readLength, final boolean reverse, final boolean firstOfPair) { final SAMRecord rec = new SAMRecord(header); rec.setReferenceIndex(0); final StringBuilder sb = new StringBuilder(); final byte[] quals = new byte[readLength]; for (int i = 0; i < readLength; ++i) { sb.append("A"); quals[i] = 20; } rec.setReadString(sb.toString()); rec.setBaseQualities(quals); rec.setAlignmentStart(alignmentStart); rec.setCigarString(readLength + "M"); rec.setReadPairedFlag(true); rec.setReadNegativeStrandFlag(reverse); if (firstOfPair) rec.setFirstOfPairFlag(true); else rec.setSecondOfPairFlag(true); return rec; }
public static void makeReadUnmapped(final SAMRecord rec) { if (rec.getReadNegativeStrandFlag()) { SAMRecordUtil.reverseComplement(rec); rec.setReadNegativeStrandFlag(false); } rec.setDuplicateReadFlag(false); rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR); rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY); rec.setInferredInsertSize(0); rec.setNotPrimaryAlignmentFlag(false); rec.setProperPairFlag(false); rec.setReadUnmappedFlag(true); }
@Test public void testSimpleErrorCalculator() { final SAMSequenceRecord samSequenceRecord = new SAMSequenceRecord("chr1", 200); final SAMFileHeader samFileHeader = new SAMFileHeader(); samFileHeader.addSequence(samSequenceRecord); final SAMRecord samRecord = new SAMRecord(samFileHeader); samRecord.setReadBases("CgTGtGGAcAAAgAAA".getBytes()); final byte[] refBases = "CATGGGGAAAAAAAAA".getBytes(); final int n = refBases.length; samRecord.setReadUnmappedFlag(false); samRecord.setReadNegativeStrandFlag(true); samRecord.setAlignmentStart(1); samRecord.setReferenceIndex(0); final SimpleErrorCalculator baseErrorCalculator = new SimpleErrorCalculator(); for (int i = 0; i < n; i++) { SamLocusIterator.LocusInfo locusInfo = new SamLocusIterator.LocusInfo(samSequenceRecord, i + 1); final SAMLocusAndReference locusAndReference = new SAMLocusAndReference(locusInfo, refBases[i]); SamLocusIterator.RecordAndOffset recordAndOffset = new SamLocusIterator.RecordAndOffset(samRecord, i); baseErrorCalculator.addBase(recordAndOffset, locusAndReference); } final BaseErrorMetric metric = baseErrorCalculator.getMetric(); metric.calculateDerivedFields(); Assert.assertEquals(metric.TOTAL_BASES, n); Assert.assertEquals(metric.ERROR_BASES, 4L); }
SAMRecord firstSAMRecord(SAMFileHeader header) { SAMRecord r = new SAMRecord(header); r.setReadName(evidenceRecord.getReadName()); r.setReferenceName(evidenceRecord.Chromosome); r.setAlignmentStart(Integer.valueOf(evidenceRecord.OffsetInReference) + 1); r.setMappingQuality(Integer.valueOf(evidenceRecord.ScoreAllele0)); r.setReadPairedFlag(true); r.setReadUnmappedFlag(false); r.setReadNegativeStrandFlag(negative); r.setFirstOfPairFlag(evidenceRecord.side == 0); r.setSecondOfPairFlag(!r.getFirstOfPairFlag()); r.setCigar(new Cigar(Utils.toCigarOperatorList(firstHalf.samCigarElements))); r.setReadBases(Utils.toByteArray(firstHalf.readBasesBuf)); r.setBaseQualities(Utils.toByteArray(firstHalf.readScoresBuf)); r.setAttribute("GC", Utils.toString(firstHalf.gcList)); r.setAttribute("GS", Utils.toString(firstHalf.gsBuf)); r.setAttribute("GQ", SAMUtils.phredToFastq(Utils.toByteArray(firstHalf.gqBuf))); return r; }
/** * Strip mapping information from a SAMRecord. * <p> * WARNING: by clearing the secondary and supplementary flags, * this may have the affect of producing multiple distinct records with the * same read name and flags, which may lead to invalid SAM/BAM output. * Callers of this method should make sure to deal with this issue. */ public static void makeReadUnmapped(final SAMRecord rec) { if (rec.getReadNegativeStrandFlag()) { rec.reverseComplement(true); rec.setReadNegativeStrandFlag(false); } rec.setDuplicateReadFlag(false); rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR); rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY); rec.setInferredInsertSize(0); rec.setSecondaryAlignment(false); rec.setSupplementaryAlignmentFlag(false); rec.setProperPairFlag(false); rec.setReadUnmappedFlag(true); }
SAMRecord secondSAMRecord(SAMFileHeader header) { SAMRecord r = new SAMRecord(header); r.setReadName(evidenceRecord.getReadName()); r.setReferenceName(evidenceRecord.Chromosome); r.setAlignmentStart(Integer.valueOf(evidenceRecord.MateOffsetInReference) + 1); r.setMappingQuality(Integer.valueOf(evidenceRecord.ScoreAllele0)); r.setReadPairedFlag(true); r.setReadUnmappedFlag(false); r.setReadNegativeStrandFlag(negative); r.setFirstOfPairFlag(evidenceRecord.side == 1); r.setSecondOfPairFlag(!r.getFirstOfPairFlag()); r.setCigar(new Cigar(Utils.toCigarOperatorList(secondHalf.samCigarElements))); r.setReadBases(Utils.toByteArray(secondHalf.readBasesBuf)); r.setBaseQualities(Utils.toByteArray(secondHalf.readScoresBuf)); r.setAttribute("GC", Utils.toString(secondHalf.gcList)); r.setAttribute("GS", Utils.toString(secondHalf.gsBuf)); r.setAttribute("GQ", SAMUtils.phredToFastq(Utils.toByteArray(secondHalf.gqBuf))); return r; }
private static void copyFlags(final CramCompressionRecord cramRecord, final SAMRecord samRecord) { samRecord.setReadPairedFlag(cramRecord.isMultiFragment()); samRecord.setProperPairFlag(cramRecord.isProperPair()); samRecord.setReadUnmappedFlag(cramRecord.isSegmentUnmapped()); samRecord.setReadNegativeStrandFlag(cramRecord.isNegativeStrand()); samRecord.setFirstOfPairFlag(cramRecord.isFirstSegment()); samRecord.setSecondOfPairFlag(cramRecord.isLastSegment()); samRecord.setSecondaryAlignment(cramRecord.isSecondaryAlignment()); samRecord.setReadFailsVendorQualityCheckFlag(cramRecord.isVendorFiltered()); samRecord.setDuplicateReadFlag(cramRecord.isDuplicate()); samRecord.setSupplementaryAlignmentFlag(cramRecord.isSupplementary()); }
private static void copyFlags(final CramCompressionRecord cramRecord, final SAMRecord samRecord) { samRecord.setReadPairedFlag(cramRecord.isMultiFragment()); samRecord.setProperPairFlag(cramRecord.isProperPair()); samRecord.setReadUnmappedFlag(cramRecord.isSegmentUnmapped()); samRecord.setReadNegativeStrandFlag(cramRecord.isNegativeStrand()); samRecord.setFirstOfPairFlag(cramRecord.isFirstSegment()); samRecord.setSecondOfPairFlag(cramRecord.isLastSegment()); samRecord.setSecondaryAlignment(cramRecord.isSecondaryAlignment()); samRecord.setReadFailsVendorQualityCheckFlag(cramRecord.isVendorFiltered()); samRecord.setDuplicateReadFlag(cramRecord.isDuplicate()); samRecord.setSupplementaryAlignmentFlag(cramRecord.isSupplementary()); }
@Test public void canPrintDNARead() throws InvalidGenomicCoordsException, IOException, InvalidColourException { GenomicCoords gc= new GenomicCoords("chr7:5566778-5566798", 80, samSeqDict, fastaFile); SAMRecord rec= new SAMRecord(null); rec.setAlignmentStart(5566780); rec.setCigarString("24M"); rec.setReadNegativeStrandFlag(true); rec.setReadBases("AACCGGTTAACCGGTTAACCGGTT".getBytes()); TextRead textRead= new TextRead(rec, gc, false); assertEquals(textRead.getTextStart(), 3); assertEquals(textRead.getTextEnd(), 21); assertEquals("AACCGGTTAACCGGTTAAC".length(), textRead.getTextEnd() - textRead.getTextStart() + 1); System.out.println(textRead.getPrintableTextRead(false, true, false)); assertEquals("a,ccgg,t,acc,gtt,ac", textRead.getPrintableTextRead(false, true, false)); assertEquals("a,ccgg,t,uccmgtt,ac", textRead.getPrintableTextRead(true, true, false)); gc= new GenomicCoords("chr7:5566778-5566798", 80, samSeqDict, null); textRead= new TextRead(rec, gc, false); assertEquals("aaccggttaaccggttaac", textRead.getPrintableTextRead(false, true, false)); gc= new GenomicCoords("chr7:5566780-5566782", 80, samSeqDict, fastaFile); textRead= new TextRead(rec, gc, false); System.out.println(textRead.getPrintableTextRead(true, true, false)); System.out.println(textRead.getPrintableTextRead(true, false, false)); }
private void addAlignmentForMostStrategy( final SAMFileWriter writer, final SAMRecord unmappedRecord, final MostDistantStrategyAlignmentSpec spec, final boolean reverse) { final SAMRecord alignedRecord = new SAMRecord(writer.getFileHeader()); alignedRecord.setReadName(unmappedRecord.getReadName()); alignedRecord.setReadBases(unmappedRecord.getReadBases()); alignedRecord.setBaseQualities(unmappedRecord.getBaseQualities()); alignedRecord.setReferenceName(spec.sequence); alignedRecord.setAlignmentStart(spec.alignmentStart); alignedRecord.setReadNegativeStrandFlag(reverse); alignedRecord.setCigarString(unmappedRecord.getReadBases().length + "M"); alignedRecord.setMappingQuality(spec.mapQ); alignedRecord.setReadPairedFlag(unmappedRecord.getReadPairedFlag()); alignedRecord.setFirstOfPairFlag(unmappedRecord.getFirstOfPairFlag()); alignedRecord.setSecondOfPairFlag(unmappedRecord.getSecondOfPairFlag()); alignedRecord.setMateUnmappedFlag(true); writer.addAlignment(alignedRecord); }
private void addAlignmentsForBestFragmentMapqStrategy( final SAMFileWriter writer, final SAMRecord unmappedRecord, final String sequence, final int[] mapqs) { boolean reverse = false; int alignmentStart = 1; for (final int mapq : mapqs) { final SAMRecord alignedRecord = new SAMRecord(writer.getFileHeader()); alignedRecord.setReadName(unmappedRecord.getReadName()); alignedRecord.setReadBases(unmappedRecord.getReadBases()); alignedRecord.setBaseQualities(unmappedRecord.getBaseQualities()); alignedRecord.setReferenceName(sequence); alignedRecord.setAlignmentStart(alignmentStart); alignmentStart += 10; // Any old position will do alignedRecord.setReadNegativeStrandFlag(reverse); reverse = !reverse; alignedRecord.setCigarString(unmappedRecord.getReadBases().length + "M"); alignedRecord.setMappingQuality(mapq); alignedRecord.setReadPairedFlag(unmappedRecord.getReadPairedFlag()); alignedRecord.setFirstOfPairFlag(unmappedRecord.getFirstOfPairFlag()); alignedRecord.setSecondOfPairFlag(unmappedRecord.getSecondOfPairFlag()); alignedRecord.setMateUnmappedFlag(true); writer.addAlignment(alignedRecord); } }