private int readZoomHeaders(SeekableStream fis, long fileOffset, int zoomLevels, boolean isLowToHigh) { int level = 0; BBZoomLevelHeader zoomLevelHeader; if(zoomLevels < 1) return 0; // create zoom headers and data containers zoomLevelHeaders = new ArrayList<BBZoomLevelHeader>(); // get zoom header information for each zoom levelsRead for(int index = 0; index < zoomLevels; ++index) { level = index + 1; // read zoom level header - read error is returned as Runtime Exception zoomLevelHeader = new BBZoomLevelHeader(fis, fileOffset, level, isLowToHigh); zoomLevelHeaders.add(zoomLevelHeader); fileOffset += BBZoomLevelHeader.ZOOM_LEVEL_HEADER_SIZE; } return level; }
public void printZoomHeaders() { // note if successfully read - should always be correct if(zoomLevelHeaders.size() == zoomLevelsCount) log.debug("Zoom level headers read for " + zoomLevelsCount + " levels:"); else log.error("Zoom level headers not successfully read for " + zoomLevelsCount + "levels."); for( int index = 0; index < zoomLevelHeaders.size(); ++index) { // zoom level headers print themselves zoomLevelHeaders.get(index).print(); } }
public BBZoomLevelHeader(SeekableStream fis, long fileOffset, int zoomLevel, boolean isLowToHigh){ this.fis = fis; zoomLevelHeaderOffset = fileOffset; this.zoomLevel = zoomLevel; readZoomLevelHeader(zoomLevelHeaderOffset, this.zoomLevel, isLowToHigh); }
zoomDataOffset = zoomLevelHeaders.get(index).getDataOffset(); long dataSize = zoomLevelHeaders.get(index).getIndexOffset() - zoomDataOffset - BBZoomLevelFormat.ZOOM_FORMAT_HEADER_SIZE; zoomIndexOffset = zoomLevelHeaders.get(index).getIndexOffset();
protected List<LocusScore> getZoomSummaryScores(String chr, int start, int end, int zoom) { Chromosome c = genome.getChromosome(chr); if (c == null) return null; double nBins = Math.pow(2, zoom); double scale = c.getLength() / (nBins * 700); BBZoomLevelHeader zlHeader = getZoomLevelForScale(scale); if (zlHeader == null) return null; int bbLevel = zlHeader.getZoomLevel(); int reductionLevel = zlHeader.getReductionLevel(); // If we are at the highest precomputed resolution compare to the requested resolution. If they differ // by more than a factor of 2 compute "on the fly" String tmp = chrNameMap.get(chr); String querySeq = tmp == null ? chr : tmp; if (reader.isBigBedFile() || bbLevel > 1 || (bbLevel == 1 && (reductionLevel / scale) < 2)) { ArrayList<LocusScore> scores = new ArrayList(1000); ZoomLevelIterator zlIter = reader.getZoomLevelIterator(bbLevel, querySeq, start, querySeq, end, false); while (zlIter.hasNext()) { ZoomDataRecord rec = zlIter.next(); float v = getValue(rec); BasicScore bs = new BasicScore(rec.getChromStart(), rec.getChromEnd(), v); scores.add(bs); } return scores; } else { // No precomputed scores for this resolution level return null; } }
/** * Return the zoom level that most closely matches the given resolution. Resolution is in BP / Pixel. * * @param resolution * @return */ private BBZoomLevelHeader getZoomLevelForScale(double resolution) { if (levels == null) return null; final ArrayList<BBZoomLevelHeader> headers = levels.getZoomLevelHeaders(); for (int i = headers.size() - 1; i >= 0; i--) { BBZoomLevelHeader zlHeader = headers.get(i); int reductionLevel = zlHeader.getReductionLevel(); if (reductionLevel < resolution) { return zlHeader; } } return headers.get(0); }
lowestResHeader.getZoomLevel(), firstChr, 0, lastChr, Integer.MAX_VALUE, false);
zoomDataOffset = zoomLevelHeaders.get(index).getDataOffset(); long dataSize = zoomLevelHeaders.get(index).getIndexOffset() - zoomDataOffset - BBZoomLevelFormat.ZOOM_FORMAT_HEADER_SIZE; zoomIndexOffset = zoomLevelHeaders.get(index).getIndexOffset();
private void init() throws IOException { FileUtils.checkPath(this.bigWigFilePath); bbFileReader = new BBFileReader(this.bigWigFilePath.toString()); zoomWindowSizes = new ArrayList<>(); for (int zoomLevel = 1; zoomLevel <= bbFileReader.getZoomLevelCount(); zoomLevel++) { zoomWindowSizes.add(bbFileReader.getZoomLevels().getZoomLevelHeader(zoomLevel).getReductionLevel()); } }
int z = zoomLevelHeader.getZoomLevel(); ZoomLevelIterator zlIter = reader.getZoomLevelIterator(z); if (zlIter.hasNext()) {
zoomDataOffset = zoomLevelHeaders.get(index).getDataOffset(); long dataSize = zoomLevelHeaders.get(index).getIndexOffset() - zoomDataOffset - BBZoomLevelFormat.ZOOM_FORMAT_HEADER_SIZE; zoomIndexOffset = zoomLevelHeaders.get(index).getIndexOffset();
public void printZoomHeaders() { // note if successfully read - should always be correct if(zoomLevelHeaders.size() == zoomLevelsCount) log.debug("Zoom level headers read for " + zoomLevelsCount + " levels:"); else log.error("Zoom level headers not successfully read for " + zoomLevelsCount + "levels."); for( int index = 0; index < zoomLevelHeaders.size(); ++index) { // zoom level headers print themselves zoomLevelHeaders.get(index).print(); } }
public BBZoomLevelHeader(SeekableStream fis, long fileOffset, int zoomLevel, boolean isLowToHigh){ this.fis = fis; zoomLevelHeaderOffset = fileOffset; this.zoomLevel = zoomLevel; readZoomLevelHeader(zoomLevelHeaderOffset, this.zoomLevel, isLowToHigh); } /*
private int readZoomHeaders(SeekableStream fis, long fileOffset, int zoomLevels, boolean isLowToHigh) { int level = 0; BBZoomLevelHeader zoomLevelHeader; if(zoomLevels < 1) return 0; // create zoom headers and data containers zoomLevelHeaders = new ArrayList<BBZoomLevelHeader>(); // get zoom header information for each zoom levelsRead for(int index = 0; index < zoomLevels; ++index) { level = index + 1; // read zoom level header - read error is returned as Runtime Exception zoomLevelHeader = new BBZoomLevelHeader(fis, fileOffset, level, isLowToHigh); zoomLevelHeaders.add(zoomLevelHeader); fileOffset += BBZoomLevelHeader.ZOOM_LEVEL_HEADER_SIZE; } return level; }
public BigWigDataSource(BBFileReader reader, Genome genome) throws IOException { super(genome); this.reader = reader; this.levels = reader.getZoomLevels(); this.wholeGenomeScores = new HashMap<>(); if (reader.isBigWigFile()) initMinMax(); // Assume 1000 pixel screen, pick visibility level to be @ highest resolution zoom. // TODO -- something smarter, like scaling by actual density if (levels != null && levels.getZoomHeaderCount() > 0) { BBZoomLevelHeader firstLevel = levels.getZoomLevelHeaders().get(0); // Highest res featureVisiblityWindow = firstLevel.getReductionLevel() * 2000; } if (genome != null) { Collection<String> chrNames = reader.getChromosomeNames(); for (String chr : chrNames) { String igvChr = genome.getCanonicalChrName(chr); if (igvChr != null && !igvChr.equals(chr)) { chrNameMap.put(igvChr, chr); } } } bedCodec = new IGVBEDCodec(genome); }
@Test public void testBigBed() throws IOException { String path = TestUtils.DATA_DIR + "bb/chr21.refseq.bb"; BBFileReader bbReader = new BBFileReader(path); BBFileHeader bbFileHdr = bbReader.getBBFileHeader(); assertTrue(bbFileHdr.isBigBed()); String chr = "chr21"; int start = 26490012; int end = 42182827; for (BBZoomLevelHeader header : bbReader.getZoomLevels().getZoomLevelHeaders()) { assertNotNull(header); ZoomLevelIterator zlIter = bbReader.getZoomLevelIterator(header.getZoomLevel(), chr, start, chr, end, false); while (zlIter.hasNext()) { ZoomDataRecord rec = zlIter.next(); int n = rec.getBasesCovered(); if (n > 0) { assertEquals(chr, rec.getChromName()); assertTrue(rec.getChromEnd() >= start && rec.getChromStart() <= end); } } } }
public void printZoomHeaders() { // note if successfully read - should always be correct if(zoomLevelHeaders.size() == zoomLevelsCount) log.debug("Zoom level headers read for " + zoomLevelsCount + " levels:"); else log.error("Zoom level headers not successfully read for " + zoomLevelsCount + "levels."); for( int index = 0; index < zoomLevelHeaders.size(); ++index) { // zoom level headers print themselves zoomLevelHeaders.get(index).print(); } }
public BBZoomLevelHeader(SeekableStream fis, long fileOffset, int zoomLevel, boolean isLowToHigh){ this.fis = fis; zoomLevelHeaderOffset = fileOffset; this.zoomLevel = zoomLevel; readZoomLevelHeader(zoomLevelHeaderOffset, this.zoomLevel, isLowToHigh); } /*
private int readZoomHeaders(SeekableStream fis, long fileOffset, int zoomLevels, boolean isLowToHigh) { int level = 0; BBZoomLevelHeader zoomLevelHeader; if(zoomLevels < 1) return 0; // create zoom headers and data containers zoomLevelHeaders = new ArrayList<BBZoomLevelHeader>(); // get zoom header information for each zoom levelsRead for(int index = 0; index < zoomLevels; ++index) { level = index + 1; // read zoom level header - read error is returned as Runtime Exception zoomLevelHeader = new BBZoomLevelHeader(fis, fileOffset, level, isLowToHigh); zoomLevelHeaders.add(zoomLevelHeader); fileOffset += BBZoomLevelHeader.ZOOM_LEVEL_HEADER_SIZE; } return level; }