/** * Record any index information for a given BAM record * * @param rec The BAM record. Requires rec.getFileSource() is non-null. */ public void processAlignment(final SAMRecord rec) { // metadata indexStats.recordMetaData(rec); if (rec.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) { return; // do nothing for records without coordinates, but count them } // various checks final int reference = rec.getReferenceIndex(); if (reference != currentReference) { throw new SAMException( "Unexpected reference " + reference + " when constructing index for " + currentReference + " for record " + rec); } binningIndexBuilder.processFeature( new BinningIndexBuilder.FeatureToBeIndexed() { @Override public int getStart() { return rec.getAlignmentStart(); } @Override public int getEnd() { return rec.getAlignmentEnd(); } @Override public Integer getIndexingBin() { final Integer binNumber = rec.getIndexingBin(); return (binNumber == null ? rec.computeIndexingBin() : binNumber); } @Override public Chunk getChunk() { final SAMFileSource source = rec.getFileSource(); if (source == null) { throw new SAMException( "No source (virtual file offsets); needed for indexing on BAM Record " + rec); } return ((BAMFileSpan) source.getFilePointer()).getSingleChunk(); } }); }