use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.
the class InCellReader method openBytes.
/**
* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int)
*/
@Override
public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) throws FormatException, IOException {
FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h);
int[] coordinates = getZCTCoords(no);
int well = getWellFromSeries(getSeries());
int field = getFieldFromSeries(getSeries());
int timepoint = oneTimepointPerSeries ? getSeries() % channelsPerTimepoint.size() : coordinates[2];
int image = getIndex(coordinates[0], coordinates[1], 0);
if (imageFiles[well][field][timepoint][image] == null)
return buf;
String filename = imageFiles[well][field][timepoint][image].filename;
if (filename == null || !(new Location(filename).exists()))
return buf;
if (imageFiles[well][field][timepoint][image].isTiff) {
try {
tiffReader.setId(filename);
return tiffReader.openBytes(0, buf, x, y, w, h);
} catch (FormatException e) {
LOGGER.debug("", e);
} catch (IOException e) {
LOGGER.debug("", e);
}
return buf;
}
// pixels are stored in .im files
RandomAccessInputStream s = new RandomAccessInputStream(filename);
if (s.length() > FormatTools.getPlaneSize(this)) {
s.seek(128);
readPlane(s, x, y, w, h, buf);
}
s.close();
return buf;
}
use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.
the class GatanReader method initFile.
// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
super.initFile(id);
in = new RandomAccessInputStream(id);
pixelOffset = 0;
CoreMetadata m = core.get(0);
LOGGER.info("Verifying Gatan format");
m.littleEndian = false;
pixelSizes = new ArrayList<Double>();
units = new ArrayList<String>();
shapes = new ArrayList<ROIShape>();
in.order(isLittleEndian());
// only support version 3
version = in.readInt();
if (version != 3 && version != 4) {
throw new FormatException("invalid header");
}
LOGGER.info("Reading tags");
in.skipBytes(4);
skipPadding();
m.littleEndian = in.readInt() != 1;
in.order(isLittleEndian());
// TagGroup instance
in.skipBytes(2);
skipPadding();
int numTags = in.readInt();
if (numTags > in.length()) {
m.littleEndian = !isLittleEndian();
in.order(isLittleEndian());
adjustEndianness = false;
}
LOGGER.debug("tags ({}) {", numTags);
try {
parseTags(numTags, null, " ");
} catch (Exception e) {
throw new FormatException("Unable to parse metadata tag", e);
}
LOGGER.debug("}");
LOGGER.info("Populating metadata");
m.littleEndian = true;
if (getSizeX() == 0 || getSizeY() == 0) {
throw new FormatException("Dimensions information not found");
}
if (m.sizeZ == 0) {
m.sizeZ = 1;
}
m.sizeC = 1;
m.sizeT = 1;
m.dimensionOrder = "XYZTC";
m.imageCount = getSizeZ() * getSizeC() * getSizeT();
int bytes = (int) (numPixelBytes / (getSizeX() * getSizeY() * (long) getImageCount()));
if (bytes != FormatTools.getBytesPerPixel(getPixelType())) {
m.pixelType = FormatTools.pixelTypeFromBytes(bytes, signed, false);
}
m.rgb = false;
m.interleaved = false;
m.metadataComplete = true;
m.indexed = false;
m.falseColor = false;
// The metadata store we're working with.
MetadataStore store = makeFilterMetadata();
MetadataTools.populatePixels(store, this, true);
if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
int index = 0;
if (pixelSizes.size() > 4) {
index = pixelSizes.size() - 3;
} else if (pixelSizes.size() == 4) {
if (Math.abs(pixelSizes.get(0) - 1.0) < Constants.EPSILON) {
index = pixelSizes.size() - 2;
}
}
if (index + 2 < pixelSizes.size() && Math.abs(pixelSizes.get(index + 1) - pixelSizes.get(index + 2)) < Constants.EPSILON) {
if (Math.abs(pixelSizes.get(index) - pixelSizes.get(index + 1)) > Constants.EPSILON && getSizeY() > 1) {
index++;
}
}
if (index < pixelSizes.size() - 1) {
Double x = pixelSizes.get(index);
Double y = pixelSizes.get(index + 1);
String xUnits = index < units.size() ? units.get(index) : "";
String yUnits = index + 1 < units.size() ? units.get(index + 1) : "";
Length sizeX = FormatTools.getPhysicalSizeX(x, convertUnits(xUnits));
Length sizeY = FormatTools.getPhysicalSizeY(y, convertUnits(yUnits));
if (sizeX != null) {
store.setPixelsPhysicalSizeX(sizeX, 0);
}
if (sizeY != null) {
store.setPixelsPhysicalSizeY(sizeY, 0);
}
if (index < pixelSizes.size() - 2) {
Double z = pixelSizes.get(index + 2);
String zUnits = index + 2 < units.size() ? units.get(index + 2) : "";
Length sizeZ = FormatTools.getPhysicalSizeZ(z, convertUnits(zUnits));
if (sizeZ != null) {
store.setPixelsPhysicalSizeZ(sizeZ, 0);
}
}
}
String instrument = MetadataTools.createLSID("Instrument", 0);
store.setInstrumentID(instrument, 0);
store.setImageInstrumentRef(instrument, 0);
String objective = MetadataTools.createLSID("Objective", 0, 0);
store.setObjectiveID(objective, 0, 0);
store.setObjectiveCorrection(getCorrection("Unknown"), 0, 0);
store.setObjectiveImmersion(getImmersion("Unknown"), 0, 0);
store.setObjectiveNominalMagnification(mag, 0, 0);
store.setObjectiveSettingsID(objective, 0);
String detector = MetadataTools.createLSID("Detector", 0, 0);
store.setDetectorID(detector, 0, 0);
store.setDetectorSettingsID(detector, 0, 0);
store.setDetectorSettingsVoltage(new ElectricPotential(voltage, UNITS.VOLT), 0, 0);
if (info == null)
info = "";
String[] scopeInfo = info.split("\\(");
for (String token : scopeInfo) {
token = token.trim();
if (token.startsWith("Mode")) {
token = token.substring(token.indexOf(' ')).trim();
String mode = token.substring(0, token.indexOf(' ')).trim();
if (mode.equals("TEM"))
mode = "Other";
store.setChannelAcquisitionMode(getAcquisitionMode(mode), 0, 0);
}
}
store.setPlanePositionX(posX, 0, 0);
store.setPlanePositionY(posY, 0, 0);
store.setPlanePositionZ(posZ, 0, 0);
for (int i = 0; i < getImageCount(); i++) {
store.setPlaneExposureTime(new Time(sampleTime, UNITS.SECOND), 0, i);
}
}
if (getMetadataOptions().getMetadataLevel() != MetadataLevel.NO_OVERLAYS && shapes.size() > 0) {
for (int i = 0; i < shapes.size(); i++) {
String roi = MetadataTools.createLSID("ROI", i);
store.setROIID(roi, i);
store.setImageROIRef(roi, 0, i);
String shapeID = MetadataTools.createLSID("Shape", i, 0);
ROIShape shape = shapes.get(i);
switch(shape.type) {
case LINE:
store.setLineID(shapeID, i, 0);
store.setLineX1(shape.x1, i, 0);
store.setLineY1(shape.y1, i, 0);
store.setLineX2(shape.x2, i, 0);
store.setLineY2(shape.y2, i, 0);
store.setLineText(shape.text, i, 0);
store.setLineFontSize(shape.fontSize, i, 0);
store.setLineStrokeColor(shape.strokeColor, i, 0);
break;
case TEXT:
store.setLabelID(shapeID, i, 0);
store.setLabelX(shape.x1, i, 0);
store.setLabelY(shape.y1, i, 0);
store.setLabelText(shape.text, i, 0);
store.setLabelFontSize(shape.fontSize, i, 0);
store.setLabelStrokeColor(shape.strokeColor, i, 0);
break;
case ELLIPSE:
store.setEllipseID(shapeID, i, 0);
double radiusX = (shape.x2 - shape.x1) / 2;
double radiusY = (shape.y2 - shape.y1) / 2;
store.setEllipseX(shape.x1 + radiusX, i, 0);
store.setEllipseY(shape.y1 + radiusY, i, 0);
store.setEllipseRadiusX(radiusX, i, 0);
store.setEllipseRadiusY(radiusY, i, 0);
store.setEllipseText(shape.text, i, 0);
store.setEllipseFontSize(shape.fontSize, i, 0);
store.setEllipseStrokeColor(shape.strokeColor, i, 0);
break;
case RECTANGLE:
store.setRectangleID(shapeID, i, 0);
store.setRectangleX(shape.x1, i, 0);
store.setRectangleY(shape.y1, i, 0);
store.setRectangleWidth(shape.x2 - shape.x1, i, 0);
store.setRectangleHeight(shape.y2 - shape.y1, i, 0);
store.setRectangleText(shape.text, i, 0);
store.setRectangleFontSize(shape.fontSize, i, 0);
store.setRectangleStrokeColor(shape.strokeColor, i, 0);
break;
default:
LOGGER.warn("Unknown ROI type: {}", shape.type);
}
}
}
}
use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.
the class HISReader method initFile.
// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
super.initFile(id);
in = new RandomAccessInputStream(id);
in.order(true);
in.skipBytes(14);
int nSeries = in.readShort();
pixelOffset = new long[nSeries];
String[] date = new String[nSeries];
String[] binning = new String[nSeries];
double[] offset = new double[nSeries];
double[] exposureTime = new double[nSeries];
boolean adjustedBitDepth = false;
in.seek(0);
core.clear();
for (int i = 0; i < nSeries; i++) {
CoreMetadata ms = new CoreMetadata();
core.add(ms);
String checkString = in.readString(2);
if (!checkString.equals("IM") && i > 0) {
if (getBitsPerPixel() == 12) {
core.get(i - 1).bitsPerPixel = 16;
int prevSkip = (getSizeX() * getSizeY() * getSizeC() * 12) / 8;
int totalBytes = FormatTools.getPlaneSize(this);
in.skipBytes(totalBytes - prevSkip);
adjustedBitDepth = true;
}
}
setSeries(i);
int commentBytes = in.readShort();
ms.sizeX = in.readShort();
ms.sizeY = in.readShort();
in.skipBytes(4);
int dataType = in.readShort();
switch(dataType) {
case 1:
ms.pixelType = FormatTools.UINT8;
break;
case 2:
ms.pixelType = FormatTools.UINT16;
break;
case 6:
ms.pixelType = FormatTools.UINT16;
ms.bitsPerPixel = adjustedBitDepth ? 16 : 12;
break;
case 11:
ms.pixelType = FormatTools.UINT8;
ms.sizeC = 3;
break;
case 12:
ms.pixelType = FormatTools.UINT16;
ms.sizeC = 3;
break;
case 14:
ms.pixelType = FormatTools.UINT16;
ms.sizeC = 3;
ms.bitsPerPixel = adjustedBitDepth ? 16 : 12;
break;
}
in.skipBytes(50);
String comment = in.readString(commentBytes);
if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
String[] data = comment.split(";");
for (String token : data) {
int eq = token.indexOf('=');
if (eq != -1) {
String key = token.substring(0, eq);
String value = token.substring(eq + 1);
addSeriesMeta(key, value);
if (key.equals("vDate")) {
date[i] = value;
} else if (key.equals("vTime")) {
date[i] += " " + value;
date[i] = DateTools.formatDate(date[i], "yyyy/MM/dd HH:mm:ss");
} else if (key.equals("vOffset")) {
offset[i] = Double.parseDouble(value);
} else if (key.equals("vBinX")) {
binning[i] = value;
} else if (key.equals("vBinY")) {
binning[i] += "x" + value;
} else if (key.equals("vExpTim1")) {
exposureTime[i] = Double.parseDouble(value) * 100;
}
}
}
}
pixelOffset[i] = in.getFilePointer();
ms.littleEndian = true;
if (ms.sizeC == 0)
ms.sizeC = 1;
ms.sizeT = 1;
ms.sizeZ = 1;
ms.imageCount = 1;
ms.rgb = ms.sizeC > 1;
ms.interleaved = isRGB();
ms.dimensionOrder = "XYCZT";
in.skipBytes((getSizeX() * getSizeY() * getSizeC() * getBitsPerPixel()) / 8);
}
MetadataStore store = makeFilterMetadata();
MetadataTools.populatePixels(store, this, true);
String instrumentID = MetadataTools.createLSID("Instrument", 0);
store.setInstrumentID(instrumentID, 0);
if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
for (int i = 0; i < nSeries; i++) {
store.setImageInstrumentRef(instrumentID, i);
if (date[i] != null) {
store.setImageAcquisitionDate(new Timestamp(date[i]), i);
}
store.setPlaneExposureTime(new Time(exposureTime[i], UNITS.SECOND), i, 0);
String detectorID = MetadataTools.createLSID("Detector", 0, i);
store.setDetectorID(detectorID, 0, i);
store.setDetectorOffset(offset[i], 0, i);
store.setDetectorType(getDetectorType("Other"), 0, i);
store.setDetectorSettingsID(detectorID, i, 0);
store.setDetectorSettingsBinning(getBinning(binning[i]), i, 0);
}
}
}
use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.
the class HamamatsuVMSReader method openBytes.
/**
* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int)
*/
@Override
public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) throws FormatException, IOException {
FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h);
int startCol = x / MAX_JPEG_SIZE;
int startRow = y / MAX_JPEG_SIZE;
String file = null;
switch(getCoreIndex()) {
case 0:
file = tileFiles[no][startRow][startCol];
break;
case 1:
file = macroFile;
break;
case 2:
file = mapFile;
break;
}
if (getSizeX() <= MAX_SIZE || getSizeY() <= MAX_SIZE) {
JPEGReader reader = new JPEGReader();
reader.setId(file);
reader.openBytes(0, buf, x, y, w, h);
reader.close();
return buf;
}
if (service == null) {
service = new JPEGTurboServiceImpl();
}
try {
Region image = new Region(x, y, w, h);
for (int row = startRow; row < nRows; row++) {
for (int col = startCol; col < nCols; col++) {
Region tile = new Region(col * MAX_JPEG_SIZE, row * MAX_JPEG_SIZE, col == nCols - 1 ? getSizeX() % MAX_JPEG_SIZE : MAX_JPEG_SIZE, row == nRows - 1 ? getSizeY() % MAX_JPEG_SIZE : MAX_JPEG_SIZE);
if (!tile.intersects(image)) {
continue;
}
file = tileFiles[no][row][col];
if (initializedSeries != getCoreIndex() || initializedPlane != no || !file.equals(initializedFile)) {
service.close();
if (restartMarkers.containsKey(file)) {
service.setRestartMarkers(restartMarkers.get(file));
} else {
service.setRestartMarkers(null);
}
// closing the service will close this file
RandomAccessInputStream s = new RandomAccessInputStream(file);
service.initialize(s, tile.width, tile.height);
restartMarkers.put(file, service.getRestartMarkers());
initializedSeries = getCoreIndex();
initializedPlane = no;
initializedFile = file;
}
Region intersection = tile.intersection(image);
int tileX = intersection.x % MAX_JPEG_SIZE;
int tileY = intersection.y % MAX_JPEG_SIZE;
int rowLen = intersection.width * getRGBChannelCount();
byte[] b = new byte[rowLen * intersection.height];
service.getTile(b, tileX, tileY, intersection.width, intersection.height);
for (int tileRow = 0; tileRow < intersection.height; tileRow++) {
int src = tileRow * rowLen;
int dest = (((intersection.y + tileRow - y) * w) + (intersection.x - x)) * getRGBChannelCount();
System.arraycopy(b, src, buf, dest, rowLen);
}
}
}
} catch (ServiceException e) {
throw new FormatException(e);
}
return buf;
}
use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.
the class HamamatsuVMSReader method initFile.
// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
super.initFile(id);
in = new RandomAccessInputStream(id);
IniParser parser = new IniParser();
IniList layout = parser.parseINI(new BufferedReader(new InputStreamReader(in, Constants.ENCODING)));
IniTable slideInfo = layout.getTable("Virtual Microscope Specimen");
int nLayers = Integer.parseInt(slideInfo.get("NoLayers"));
nRows = Integer.parseInt(slideInfo.get("NoJpegRows"));
nCols = Integer.parseInt(slideInfo.get("NoJpegColumns"));
String imageFile = slideInfo.get("ImageFile");
mapFile = slideInfo.get("MapFile");
String optimisationFile = slideInfo.get("OptimisationFile");
macroFile = slideInfo.get("MacroImage");
Double physicalWidth = new Double(slideInfo.get("PhysicalWidth"));
Double physicalHeight = new Double(slideInfo.get("PhysicalHeight"));
Double magnification = new Double(slideInfo.get("SourceLens"));
Double macroWidth = new Double(slideInfo.get("PhysicalMacroWidth"));
Double macroHeight = new Double(slideInfo.get("PhysicalMacroHeight"));
for (String key : slideInfo.keySet()) {
addGlobalMeta(key, slideInfo.get(key));
}
Location dir = new Location(id).getAbsoluteFile().getParentFile();
if (imageFile != null) {
imageFile = new Location(dir, imageFile).getAbsolutePath();
files.add(imageFile);
}
tileFiles = new String[nLayers][nRows][nCols];
tileFiles[0][0][0] = imageFile;
for (int layer = 0; layer < nLayers; layer++) {
for (int row = 0; row < nRows; row++) {
for (int col = 0; col < nCols; col++) {
String f = slideInfo.get("ImageFile(" + col + "," + row + ")");
if (f != null) {
f = new Location(dir, f).getAbsolutePath();
tileFiles[layer][row][col] = f;
files.add(f);
}
}
}
}
if (mapFile != null) {
mapFile = new Location(dir, mapFile).getAbsolutePath();
files.add(mapFile);
}
if (optimisationFile != null) {
optimisationFile = new Location(dir, optimisationFile).getAbsolutePath();
files.add(optimisationFile);
}
if (macroFile != null) {
macroFile = new Location(dir, macroFile).getAbsolutePath();
files.add(macroFile);
}
int seriesCount = 3;
core.clear();
for (int i = 0; i < seriesCount; i++) {
String file = null;
switch(i) {
case 0:
file = tileFiles[0][nRows - 1][nCols - 1];
break;
case 1:
file = macroFile;
break;
case 2:
file = mapFile;
break;
}
int[] dims;
try (RandomAccessInputStream s = new RandomAccessInputStream(file);
JPEGTileDecoder decoder = new JPEGTileDecoder()) {
dims = decoder.preprocess(s);
}
CoreMetadata m = new CoreMetadata();
if (i == 0) {
m.sizeX = (MAX_JPEG_SIZE * (nCols - 1)) + dims[0];
m.sizeY = (MAX_JPEG_SIZE * (nRows - 1)) + dims[1];
} else {
m.sizeX = dims[0];
m.sizeY = dims[1];
}
m.sizeZ = 1;
m.sizeC = 3;
m.sizeT = 1;
m.rgb = true;
m.imageCount = 1;
m.dimensionOrder = "XYCZT";
m.pixelType = FormatTools.UINT8;
m.interleaved = m.sizeX > MAX_SIZE && m.sizeY > MAX_SIZE;
m.thumbnail = i > 0;
core.add(m);
}
CoreMetadata ms0 = core.get(0);
MetadataStore store = makeFilterMetadata();
MetadataTools.populatePixels(store, this);
String path = new Location(currentId).getAbsoluteFile().getName();
store.setImageName(path + " full resolution", 0);
store.setImageName(path + " macro", 1);
store.setImageName(path + " map", 2);
if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
Length sizeX = FormatTools.getPhysicalSizeX(physicalWidth / ms0.sizeX);
Length sizeY = FormatTools.getPhysicalSizeY(physicalHeight / ms0.sizeY);
Length macroSizeX = FormatTools.getPhysicalSizeX(macroWidth / core.get(1).sizeX);
Length macroSizeY = FormatTools.getPhysicalSizeY(macroHeight / core.get(1).sizeY);
if (sizeX != null) {
store.setPixelsPhysicalSizeX(sizeX, 0);
}
if (sizeY != null) {
store.setPixelsPhysicalSizeY(sizeY, 0);
}
if (macroSizeX != null) {
store.setPixelsPhysicalSizeX(macroSizeX, 1);
}
if (macroSizeY != null) {
store.setPixelsPhysicalSizeY(macroSizeY, 1);
}
String instrumentID = MetadataTools.createLSID("Instrument", 0);
store.setInstrumentID(instrumentID, 0);
store.setImageInstrumentRef(instrumentID, 0);
String objectiveID = MetadataTools.createLSID("Objective", 0, 0);
store.setObjectiveID(objectiveID, 0, 0);
store.setObjectiveNominalMagnification(magnification, 0, 0);
store.setObjectiveSettingsID(objectiveID, 0);
}
}
Aggregations