/** * @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; }
/** * @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; }
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)); } }
/** * @param bin Requested bin * @return chunks that represent all bases of requested bin */ private List<Chunk> getBinChunks(Bin bin) { if (bin.containsChunks()) { return bin.getChunkList(); } if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) { throw new RuntimeException("SRA only supports bins from the last level"); } int binNumber = bin.getBinNumber() - SRA_BIN_INDEX_OFFSET; long refOffset = recordRangeInfo.getReferenceOffsets().get(bin.getReferenceSequence()); // move requested position MAX_FRAGMENT_OVERLAP bases behind, so that we take all the reads that overlap requested position int firstChunkCorrection = binNumber == 0 ? 0 : -MAX_FRAGMENT_OVERLAP; long binGlobalOffset = binNumber * SRA_BIN_SIZE + refOffset; long firstChunkNumber = (binGlobalOffset + firstChunkCorrection) / SRA_CHUNK_SIZE; long lastChunkNumber = (binGlobalOffset + SRA_BIN_SIZE - 1) / SRA_CHUNK_SIZE; List<Chunk> chunks = new ArrayList<Chunk>(); for (long chunkNumber = firstChunkNumber; chunkNumber <= lastChunkNumber; chunkNumber++) { chunks.add(new Chunk(chunkNumber * SRA_CHUNK_SIZE, (chunkNumber + 1) * SRA_CHUNK_SIZE)); } return chunks; } }
/** * @param bin Requested bin * @return chunks that represent all bases of requested bin */ private List<Chunk> getBinChunks(Bin bin) { if (bin.containsChunks()) { return bin.getChunkList(); } if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) { throw new RuntimeException("SRA only supports bins from the last level"); } int binNumber = bin.getBinNumber() - SRA_BIN_INDEX_OFFSET; long refOffset = recordRangeInfo.getReferenceOffsets().get(bin.getReferenceSequence()); // move requested position MAX_FRAGMENT_OVERLAP bases behind, so that we take all the reads that overlap requested position int firstChunkCorrection = binNumber == 0 ? 0 : -MAX_FRAGMENT_OVERLAP; long binGlobalOffset = binNumber * SRA_BIN_SIZE + refOffset; long firstChunkNumber = (binGlobalOffset + firstChunkCorrection) / SRA_CHUNK_SIZE; long lastChunkNumber = (binGlobalOffset + SRA_BIN_SIZE - 1) / SRA_CHUNK_SIZE; List<Chunk> chunks = new ArrayList<Chunk>(); for (long chunkNumber = firstChunkNumber; chunkNumber <= lastChunkNumber; chunkNumber++) { chunks.add(new Chunk(chunkNumber * SRA_CHUNK_SIZE, (chunkNumber + 1) * SRA_CHUNK_SIZE)); } return chunks; } }
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)); } }