@Override public void setReferenceName(final String value) { if (!initializedFields.contains(LazyField.REFERENCE_NAME)) { initializedFields.add(LazyField.REFERENCE_NAME); } super.setReferenceName(value); }
@Override public void setReferenceName(final String value) { if (!initializedFields.contains(LazyField.REFERENCE_NAME)) { initializedFields.add(LazyField.REFERENCE_NAME); } super.setReferenceName(value); }
/** * Updates the reference index. The record must have a valid SAMFileHeader unless the referenceIndex parameter equals * NO_ALIGNMENT_REFERENCE_INDEX, and the reference index must appear in the header's sequence dictionary. If the * reference index is valid, the reference name will also be resolved and updated to the name for the sequence * dictionary entry corresponding to the index. * * @param referenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the * record must have a SAMFileHeader and the index must exist in the associated sequence * dictionary. * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_INDEX and the * SAMFileHeader is null for this record * @throws IllegalArgumentException if {@code referenceIndex} is not found in the sequence dictionary in the header * for this record. */ public void setReferenceIndex(final int referenceIndex) { // resolveNameFromIndex throws if the index can't be resolved setReferenceName(resolveNameFromIndex(referenceIndex, mHeader)); // setReferenceName does this as a side effect, but set the value here to be explicit mReferenceIndex = referenceIndex; }
/** * Updates the reference index. The record must have a valid SAMFileHeader unless the referenceIndex parameter equals * NO_ALIGNMENT_REFERENCE_INDEX, and the reference index must appear in the header's sequence dictionary. If the * reference index is valid, the reference name will also be resolved and updated to the name for the sequence * dictionary entry corresponding to the index. * * @param referenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the * record must have a SAMFileHeader and the index must exist in the associated sequence * dictionary. * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_INDEX and the * SAMFileHeader is null for this record * @throws IllegalArgumentException if {@code referenceIndex} is not found in the sequence dictionary in the header * for this record. */ public void setReferenceIndex(final int referenceIndex) { // resolveNameFromIndex throws if the index can't be resolved setReferenceName(resolveNameFromIndex(referenceIndex, mHeader)); // setReferenceName does this as a side effect, but set the value here to be explicit mReferenceIndex = referenceIndex; }
@Test(expectedExceptions=IllegalStateException.class) public void testNullHeaderForceIndexResolutionFailure() { // force the internal SAMRecord reference index value to null initial state final SAMRecord sam = new SAMRecord(null); sam.setReferenceName("unresolvable"); sam.getReferenceIndex(); }
@Test(expectedExceptions=IllegalArgumentException.class) public void testSetHeaderStrictInvalidReference() { SAMRecord sam = createTestRecordHelper(); final SAMFileHeader samHeader = sam.getHeader(); sam.setReferenceName("unresolvable"); Assert.assertEquals(new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX), sam.getReferenceIndex()); // throw on force re-resolution of the unresolvable reference name sam.setHeaderStrict(samHeader); }
@Test public void testReferenceName() { SAMRecord sam = createTestRecordHelper(); // NO_ALIGNMENT_NAME sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME); Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)); Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)); // valid reference name sam = createTestRecordHelper(); sam.setReferenceName("chr4"); Assert.assertTrue(sam.getReferenceName().equals("chr4")); Assert.assertTrue(sam.getReferenceIndex().equals(3)); // invalid reference name sets name but leaves ref index invalid sam = createTestRecordHelper(); sam.setReferenceName("unresolvableName"); Assert.assertTrue(sam.getReferenceName().equals("unresolvableName")); Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)); }
@Test public void testNullHeaderReferenceName() { final SAMRecord sam = createTestRecordHelper(); final SAMFileHeader samHeader = sam.getHeader(); Assert.assertTrue(null != samHeader); final String originalRefName = sam.getReferenceName(); // setting header to null retains the previously assigned ref name sam.setHeader(null); Assert.assertTrue(originalRefName.equals(sam.getReferenceName())); // null header allows reference name to be set to NO_ALIGNMENT_REFERENCE_NAME sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME); Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)); Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)); // null header allows reference name to be reset to a valid namw sam.setReferenceName(originalRefName); Assert.assertTrue(sam.getReferenceName().equals(originalRefName)); }
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) {
private static CachingBAMFileIndex getIndexWith200Contigs() throws IOException { List<SAMSequenceRecord> contigs = IntStream.range(1, 200) .mapToObj(i -> new SAMSequenceRecord(String.valueOf(i), 1000)) .collect(Collectors.toList()); final SAMSequenceDictionary dict = new SAMSequenceDictionary(contigs); final SAMFileHeader header = new SAMFileHeader(dict); header.setSortOrder(SAMFileHeader.SortOrder.coordinate); final SAMFileWriterFactory writerFactory = new SAMFileWriterFactory().setCreateIndex(true); final File outBam = File.createTempFile("tmp", ".bam"); try(final SAMFileWriter writer = writerFactory.makeWriter(header, true, outBam, null)){ IntStream.range(1,200).mapToObj(i -> { final SAMRecord record = new SAMRecord(header); record.setReadName("name" + i); record.setReferenceName(String.valueOf(i)); record.setReadUnmappedFlag(false); record.setAlignmentStart(1); record.setCigarString("20M"); return record; }).forEach(writer::addAlignment); } final File indexFile = new File(outBam.getParent(), IOUtil.basename(outBam) + BAMIndex.BAMIndexSuffix); indexFile.deleteOnExit(); outBam.deleteOnExit(); return new CachingBAMFileIndex(indexFile, dict); }
private static SAMRecord createRecord(int start, int mappingQuality) { final SAMRecord rec = new SAMRecord(getHeader()); rec.setReadName("read"); rec.setReferenceName("1"); rec.setAlignmentStart(start); rec.setMappingQuality(mappingQuality); return rec; }
@Test public void testMappedRecords() throws IOException { final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder(); for (int i = 0; i < 2; i++) { samBuilder.addFrag(String.valueOf(i), i, i, false); } final Iterator<SAMRecord> records = samBuilder.iterator(); records.next().setCigarString("25M3S25M"); records.next().setReferenceName("*"); final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE); Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_CIGAR.getHistogramString()).getValue(), 1.0); Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_READ_UNMAPPED.getHistogramString()).getValue(), 1.0); Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_TAG_NM.getHistogramString()).getValue(), 1.0); Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_CIGAR_SEQ_LENGTH.getHistogramString()).getValue(), 1.0); }
@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
@BeforeClass public void init() { header = ArtificialSAMUtils.createArtificialSamHeader(3, 1, ArtificialSAMUtils.DEFAULT_READ_LENGTH * 2); readMapped = createMappedRead("mapped", 1); readNoReference = createUnmappedRead("unmappedNoReference"); readUnmappedFlag = createMappedRead("unmappedFlagged", 2); readUnmappedFlag.setReadUnmappedFlag(true); readUnknownContig = createMappedRead("unknownContig", 3); readUnknownContig.setReferenceName("unknownContig"); readUnknownStart = createMappedRead("unknownStart", 1); readUnknownStart.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); }
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; }
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 void testSingleRecord(byte[] bases, byte[] scores, byte[] ref) throws IOException { SAMFileHeader header = new SAMFileHeader(); header.addReadGroup(new SAMReadGroupRecord("1")); header.addSequence(new SAMSequenceRecord("chr1", ref.length)); SAMRecord s = new SAMRecord(header); s.setReadBases(bases); s.setBaseQualities(scores); s.setFlags(0); s.setAlignmentStart(1); s.setReferenceName("chr1"); s.setReadName("1"); if (bases == SAMRecord.NULL_SEQUENCE) { s.setCigarString("10M"); } else { s.setCigarString(s.getReadLength() + "M"); } testSingleRecord(s, ref); } }
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); } }
private SAMRecord makeRead(final SAMFileHeader alignedHeader, final SAMRecord unmappedRec, final HitSpec hitSpec, final int hitIndex) { final SAMRecord rec = new SAMRecord(alignedHeader); rec.setReadName(unmappedRec.getReadName()); rec.setReadBases(unmappedRec.getReadBases()); rec.setBaseQualities(unmappedRec.getBaseQualities()); rec.setMappingQuality(hitSpec.mapq); if (!hitSpec.primary) rec.setNotPrimaryAlignmentFlag(true); final Cigar cigar = new Cigar(); final int readLength = rec.getReadLength(); if (hitSpec.filtered) { // Add two insertions so alignment is filtered. cigar.add(new CigarElement(readLength-4, CigarOperator.M)); cigar.add(new CigarElement(1, CigarOperator.I)); cigar.add(new CigarElement(1, CigarOperator.M)); cigar.add(new CigarElement(1, CigarOperator.I)); cigar.add(new CigarElement(1, CigarOperator.M)); } else { cigar.add(new CigarElement(readLength, CigarOperator.M)); } rec.setCigar(cigar); rec.setReferenceName(bigSequenceName); rec.setAttribute(SAMTag.HI.name(), hitIndex); rec.setAlignmentStart(hitIndex + 1); return rec; }