/** * Provides a list of bins that contain bases at requested positions * @param referenceIndex sequence of desired SAMRecords * @param startPos 1-based start of the desired interval, inclusive * @param endPos 1-based end of the desired interval, inclusive * @return a list of bins that contain relevant data */ @Override public BinList getBinsOverlapping(int referenceIndex, int startPos, int endPos) { long refLength = recordRangeInfo.getReferenceLengthsAligned().get(referenceIndex); // convert to chunk address space within reference long refStartPos = startPos - 1; long refEndPos = endPos; if (refEndPos >= refLength) { throw new RuntimeException("refEndPos is larger than reference length"); } int firstBinNumber = (int)refStartPos / SRA_BIN_SIZE; int lastBinNumber = (int)(refEndPos - 1) / SRA_BIN_SIZE; int numberOfBins = ((int)refLength / SRA_BIN_SIZE) + 1; BitSet binBitSet = new BitSet(); binBitSet.set(0, SRA_BIN_INDEX_OFFSET, false); if (firstBinNumber > 0) { binBitSet.set(SRA_BIN_INDEX_OFFSET, SRA_BIN_INDEX_OFFSET + firstBinNumber, false); } binBitSet.set(SRA_BIN_INDEX_OFFSET + firstBinNumber, SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, true); if (lastBinNumber + 1 < numberOfBins) { binBitSet.set(SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, SRA_BIN_INDEX_OFFSET + numberOfBins, false); } return new BinList(referenceIndex, binBitSet); }
/** * Provides a list of bins that contain bases at requested positions * @param referenceIndex sequence of desired SAMRecords * @param startPos 1-based start of the desired interval, inclusive * @param endPos 1-based end of the desired interval, inclusive * @return a list of bins that contain relevant data */ @Override public BinList getBinsOverlapping(int referenceIndex, int startPos, int endPos) { long refLength = recordRangeInfo.getReferenceLengthsAligned().get(referenceIndex); // convert to chunk address space within reference long refStartPos = startPos - 1; long refEndPos = endPos; if (refEndPos >= refLength) { throw new RuntimeException("refEndPos is larger than reference length"); } int firstBinNumber = (int)refStartPos / SRA_BIN_SIZE; int lastBinNumber = (int)(refEndPos - 1) / SRA_BIN_SIZE; int numberOfBins = ((int)refLength / SRA_BIN_SIZE) + 1; BitSet binBitSet = new BitSet(); binBitSet.set(0, SRA_BIN_INDEX_OFFSET, false); if (firstBinNumber > 0) { binBitSet.set(SRA_BIN_INDEX_OFFSET, SRA_BIN_INDEX_OFFSET + firstBinNumber, false); } binBitSet.set(SRA_BIN_INDEX_OFFSET + firstBinNumber, SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, true); if (lastBinNumber + 1 < numberOfBins) { binBitSet.set(SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, SRA_BIN_INDEX_OFFSET + numberOfBins, false); } return new BinList(referenceIndex, binBitSet); }
/** * @return a position where aligned fragments end */ @Override public long getStartOfLastLinearBin() { int numberOfReferences = recordRangeInfo.getReferenceLengthsAligned().size(); long refOffset = recordRangeInfo.getReferenceOffsets().get(numberOfReferences - 1); long lastChunkNumber = recordRangeInfo.getReferenceLengthsAligned().get(numberOfReferences - 1) / SRA_CHUNK_SIZE; return lastChunkNumber * SRA_CHUNK_SIZE + refOffset; }
/** * @param run opened read collection * @param header sam header * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader * @param recordRangeInfo info about record ranges withing SRA archive * @param chunk used to determine which alignments the iterator should return */ public SRAAlignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences, final SRAIterator.RecordRangeInfo recordRangeInfo, final Chunk chunk) { this.accession = accession; this.run = run; this.header = header; this.cachedReferences = cachedReferences; this.referencesLengths = recordRangeInfo.getReferenceLengthsAligned(); referencesChunksIterator = getReferenceChunks(chunk).iterator(); try { nextReference(); } catch (final Exception e) { throw new RuntimeException(e); } }
/** * @param run opened read collection * @param header sam header * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader * @param recordRangeInfo info about record ranges withing SRA archive * @param chunk used to determine which alignments the iterator should return */ public SRAAlignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences, final SRAIterator.RecordRangeInfo recordRangeInfo, final Chunk chunk) { this.accession = accession; this.run = run; this.header = header; this.cachedReferences = cachedReferences; this.referencesLengths = recordRangeInfo.getReferenceLengthsAligned(); referencesChunksIterator = getReferenceChunks(chunk).iterator(); try { nextReference(); } catch (final Exception e) { throw new RuntimeException(e); } }
private BAMFileSpan getSpanContained(int sequenceIndex, long start, long end) { if (recordRangeInfo.getTotalRecordRangeLength() <= 0) { throw new RuntimeException("Cannot create file span - SRA file is empty"); } long sequenceOffset = recordRangeInfo.getReferenceOffsets().get(sequenceIndex); long sequenceLength = recordRangeInfo.getReferenceLengthsAligned().get(sequenceIndex); if (end == -1) { end = sequenceLength; } if (start > sequenceLength) { throw new IllegalArgumentException("Sequence start position is larger than its length"); } if (end > sequenceLength) { throw new IllegalArgumentException("Sequence end position is larger than its length"); } return new BAMFileSpan(new Chunk(sequenceOffset + start, sequenceOffset + end)); } }
private BAMFileSpan getSpanContained(int sequenceIndex, long start, long end) { if (recordRangeInfo.getTotalRecordRangeLength() <= 0) { throw new RuntimeException("Cannot create file span - SRA file is empty"); } long sequenceOffset = recordRangeInfo.getReferenceOffsets().get(sequenceIndex); long sequenceLength = recordRangeInfo.getReferenceLengthsAligned().get(sequenceIndex); if (end == -1) { end = sequenceLength; } if (start > sequenceLength) { throw new IllegalArgumentException("Sequence start position is larger than its length"); } if (end > sequenceLength) { throw new IllegalArgumentException("Sequence end position is larger than its length"); } return new BAMFileSpan(new Chunk(sequenceOffset + start, sequenceOffset + end)); } }
/** * @return a position where aligned fragments end */ @Override public long getStartOfLastLinearBin() { int numberOfReferences = recordRangeInfo.getReferenceLengthsAligned().size(); long refOffset = recordRangeInfo.getReferenceOffsets().get(numberOfReferences - 1); long lastChunkNumber = recordRangeInfo.getReferenceLengthsAligned().get(numberOfReferences - 1) / SRA_CHUNK_SIZE; return lastChunkNumber * SRA_CHUNK_SIZE + refOffset; }