Search in sources :

Example 26 with FormatException

use of loci.formats.FormatException in project bioformats by openmicroscopy.

the class I2IReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
public void initFile(String id) throws FormatException, IOException {
    super.initFile(id);
    in = new RandomAccessInputStream(id);
    CoreMetadata m = core.get(0);
    char pixelType = (char) in.readByte();
    switch(pixelType) {
        case 'I':
            m.pixelType = FormatTools.INT16;
            break;
        case 'R':
            m.pixelType = FormatTools.FLOAT;
            break;
        case 'C':
            throw new FormatException("Complex pixel data not yet supported");
        default:
            throw new FormatException("Invalid pixel type: " + pixelType);
    }
    if ((char) in.readByte() != ' ') {
        throw new FormatException("Expected space after pixel type character");
    }
    m.sizeX = getDimension(in);
    m.sizeY = getDimension(in);
    m.sizeZ = getDimension(in);
    m.littleEndian = (char) in.readByte() != 'B';
    in.order(isLittleEndian());
    short minPixelValue = in.readShort();
    short maxPixelValue = in.readShort();
    short xCoordinate = in.readShort();
    short yCoordinate = in.readShort();
    int n = in.readShort();
    // reserved for future use
    in.skipBytes(33);
    for (int i = 0; i < 15; i++) {
        String history = in.readString(64);
        addGlobalMetaList("Image history", history.trim());
    }
    addGlobalMeta("Minimum intensity value", minPixelValue);
    addGlobalMeta("Maximum intensity value", maxPixelValue);
    addGlobalMeta("Image position X", xCoordinate);
    addGlobalMeta("Image position Y", yCoordinate);
    // needs to be adjusted to reflect the true Z count
    if (n > 0) {
        m.sizeZ /= n;
    }
    // the user defines what the N dimension means
    // in practice, it could be timepoints, channels, etc. but we have no
    // way of knowing based on the file metadata
    m.sizeT = n;
    m.imageCount = getSizeZ() * getSizeT();
    m.sizeC = 1;
    m.rgb = false;
    m.dimensionOrder = "XYZTC";
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata) FormatException(loci.formats.FormatException)

Example 27 with FormatException

use of loci.formats.FormatException in project bioformats by openmicroscopy.

the class PCIReader method getOptimalTileWidth.

/* @see loci.formats.IFormatReader#getOptimalTileWidth() */
@Override
public int getOptimalTileWidth() {
    FormatTools.assertId(currentId, true, 1);
    String file = imageFiles.get(0);
    try {
        if (poi == null) {
            initPOIService();
        }
        RandomAccessInputStream s = poi.getDocumentStream(file);
        TiffParser tp = new TiffParser(s);
        if (tp.isValidHeader()) {
            IFD ifd = tp.getFirstIFD();
            s.close();
            return (int) ifd.getTileWidth();
        }
        s.close();
    } catch (FormatException e) {
        LOGGER.debug("Could not retrieve tile width", e);
    } catch (IOException e) {
        LOGGER.debug("Could not retrieve tile width", e);
    }
    return super.getOptimalTileWidth();
}
Also used : IFD(loci.formats.tiff.IFD) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream) IOException(java.io.IOException) FormatException(loci.formats.FormatException)

Example 28 with FormatException

use of loci.formats.FormatException in project bioformats by openmicroscopy.

the class PCORAWReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    if (checkSuffix(id, "rec")) {
        paramFile = new Location(id).getAbsolutePath();
        String base = new Location(id).getAbsoluteFile().getAbsolutePath();
        base = base.substring(0, base.lastIndexOf("."));
        id = base + ".pcoraw";
        if (!new Location(id).exists()) {
            throw new FormatException("Could not find image file.");
        }
    }
    super.initFile(id);
    imageFile = new Location(id).getAbsolutePath();
    reader.close();
    reader.setMetadataStore(getMetadataStore());
    reader.setId(id);
    core = reader.getCoreMetadataList();
    metadata = reader.getGlobalMetadata();
    in = new RandomAccessInputStream(id);
    try {
        if (in.length() >= Math.pow(2, 32)) {
            // even though BigTIFF is likely being used, the offsets
            // are still recorded as though only 32 bits are available
            long add = 0;
            long prevOffset = 0;
            for (IFD ifd : reader.ifds) {
                long[] offsets = ifd.getStripOffsets();
                for (int i = 0; i < offsets.length; i++) {
                    offsets[i] += add;
                    if (offsets[i] < prevOffset) {
                        add += 0x100000000L;
                        offsets[i] += 0x100000000L;
                    }
                    prevOffset = offsets[i];
                }
                ifd.put(IFD.STRIP_OFFSETS, offsets);
            }
        }
    } finally {
        in.close();
    }
    if (paramFile == null) {
        String base = imageFile.substring(0, imageFile.lastIndexOf("."));
        base += ".rec";
        if (new Location(base).exists()) {
            paramFile = base;
        }
    }
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this, true);
    if (paramFile != null) {
        // parse extra metadata from the parameter file
        store.setInstrumentID(MetadataTools.createLSID("Instrument", 0), 0);
        String detector = MetadataTools.createLSID("Detector", 0, 0);
        store.setDetectorID(detector, 0, 0);
        String[] lines = DataTools.readFile(paramFile).split("\n");
        for (int i = 0; i < lines.length; i++) {
            String line = lines[i];
            int sep = line.indexOf(':');
            if (sep < 0) {
                continue;
            }
            String key = line.substring(0, sep).trim();
            String value = line.substring(sep + 1).trim();
            addGlobalMeta(key, value);
            if (key.equals("Exposure / Delay")) {
                // set the exposure time
                String exp = value.substring(0, value.indexOf(' '));
                Double parsedExp = new Double(exp);
                Time exposure = null;
                if (parsedExp != null) {
                    exposure = new Time(parsedExp / 1000, UNITS.SECOND);
                }
                for (int plane = 0; plane < getImageCount(); plane++) {
                    store.setPlaneExposureTime(exposure, 0, plane);
                }
            } else if (key.equals("Camera serial number")) {
                // set the serial number
                store.setDetectorSerialNumber(value, 0, 0);
            } else if (key.equals("Binning horz./vert.")) {
                store.setDetectorSettingsID(detector, 0, 0);
                value = value.charAt(1) + value;
                value = value.substring(0, 3);
                store.setDetectorSettingsBinning(getBinning(value), 0, 0);
            } else if (key.equals("Comment")) {
                final StringBuilder description = new StringBuilder();
                for (int j = i + 1; j < lines.length; j++) {
                    lines[j] = lines[j].trim();
                    if (lines[j].length() > 0) {
                        description.append(lines[j]);
                        description.append(" ");
                    }
                }
                store.setImageDescription(description.toString().trim(), 0);
                break;
            }
        }
    }
}
Also used : IFD(loci.formats.tiff.IFD) Time(ome.units.quantity.Time) FormatException(loci.formats.FormatException) MetadataStore(loci.formats.meta.MetadataStore) RandomAccessInputStream(loci.common.RandomAccessInputStream) Location(loci.common.Location)

Example 29 with FormatException

use of loci.formats.FormatException in project bioformats by openmicroscopy.

the class PDSReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    if (!checkSuffix(id, "hdr")) {
        String headerFile = id.substring(0, id.lastIndexOf(".")) + ".hdr";
        if (!new Location(headerFile).exists()) {
            headerFile = id.substring(0, id.lastIndexOf(".")) + ".HDR";
            if (!new Location(headerFile).exists()) {
                throw new FormatException("Could not find matching .hdr file.");
            }
        }
        initFile(headerFile);
        return;
    }
    super.initFile(id);
    String[] headerData = DataTools.readFile(id).split("\r\n");
    if (headerData.length == 1) {
        headerData = headerData[0].split("\r");
    }
    Length xPos = null, yPos = null;
    Double deltaX = null, deltaY = null;
    String date = null;
    CoreMetadata m = core.get(0);
    for (String line : headerData) {
        int eq = line.indexOf('=');
        if (eq < 0)
            continue;
        int end = line.indexOf('/');
        if (end < 0)
            end = line.length();
        String key = line.substring(0, eq).trim();
        String value = line.substring(eq + 1, end).trim();
        if (key.equals("NXP")) {
            m.sizeX = Integer.parseInt(value);
        } else if (key.equals("NYP")) {
            m.sizeY = Integer.parseInt(value);
        } else if (key.equals("XPOS")) {
            final Double number = Double.valueOf(value);
            xPos = new Length(number, UNITS.REFERENCEFRAME);
            addGlobalMeta("X position for position #1", xPos);
        } else if (key.equals("YPOS")) {
            final Double number = Double.valueOf(value);
            yPos = new Length(number, UNITS.REFERENCEFRAME);
            addGlobalMeta("Y position for position #1", yPos);
        } else if (key.equals("SIGNX")) {
            reverseX = value.replaceAll("'", "").trim().equals("-");
        } else if (key.equals("SIGNY")) {
            reverseY = value.replaceAll("'", "").trim().equals("-");
        } else if (key.equals("DELTAX")) {
            deltaX = new Double(value);
        } else if (key.equals("DELTAY")) {
            deltaY = new Double(value);
        } else if (key.equals("COLOR")) {
            int color = Integer.parseInt(value);
            if (color == 4) {
                m.sizeC = 3;
                m.rgb = true;
            } else {
                m.sizeC = 1;
                m.rgb = false;
                lutIndex = color - 1;
                m.indexed = lutIndex >= 0;
            }
        } else if (key.equals("SCAN TIME")) {
            long modTime = new Location(currentId).getAbsoluteFile().lastModified();
            String year = DateTools.convertDate(modTime, DateTools.UNIX, "yyyy");
            date = value.replaceAll("'", "") + " " + year;
            date = DateTools.formatDate(date, DATE_FORMAT);
        } else if (key.equals("FILE REC LEN")) {
            recordWidth = Integer.parseInt(value) / 2;
        }
        addGlobalMeta(key, value);
    }
    m.sizeZ = 1;
    m.sizeT = 1;
    m.imageCount = 1;
    m.dimensionOrder = "XYCZT";
    m.pixelType = FormatTools.UINT16;
    m.littleEndian = true;
    String base = currentId.substring(0, currentId.lastIndexOf("."));
    pixelsFile = base + ".IMG";
    if (!new Location(pixelsFile).exists()) {
        pixelsFile = base + ".img";
    }
    boolean minimumMetadata = getMetadataOptions().getMetadataLevel() == MetadataLevel.MINIMUM;
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this, !minimumMetadata);
    if (date != null) {
        store.setImageAcquisitionDate(new Timestamp(date), 0);
    }
    if (!minimumMetadata) {
        store.setPlanePositionX(xPos, 0, 0);
        store.setPlanePositionY(yPos, 0, 0);
        Length sizeX = FormatTools.getPhysicalSizeX(deltaX);
        Length sizeY = FormatTools.getPhysicalSizeY(deltaY);
        if (sizeX != null) {
            store.setPixelsPhysicalSizeX(sizeX, 0);
        }
        if (sizeY != null) {
            store.setPixelsPhysicalSizeY(sizeY, 0);
        }
    }
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) Length(ome.units.quantity.Length) CoreMetadata(loci.formats.CoreMetadata) Timestamp(ome.xml.model.primitives.Timestamp) FormatException(loci.formats.FormatException) Location(loci.common.Location)

Example 30 with FormatException

use of loci.formats.FormatException in project bioformats by openmicroscopy.

the class PSDReader 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);
    CoreMetadata m = core.get(0);
    m.littleEndian = false;
    if (!in.readString(4).equals("8BPS")) {
        throw new FormatException("Not a valid Photoshop file.");
    }
    addGlobalMeta("Version", in.readShort());
    // reserved, set to 0
    in.skipBytes(6);
    m.sizeC = in.readShort();
    m.sizeY = in.readInt();
    m.sizeX = in.readInt();
    int bits = in.readShort();
    addGlobalMeta("Bits per pixel", bits);
    m.pixelType = FormatTools.pixelTypeFromBytes(bits / 8, false, false);
    int colorMode = in.readShort();
    String modeString = null;
    switch(colorMode) {
        case 0:
            modeString = "monochrome";
            break;
        case 1:
            modeString = "gray-scale";
            break;
        case 2:
            modeString = "palette color";
            break;
        case 3:
            modeString = "RGB";
            break;
        case 4:
            modeString = "CMYK";
            break;
        case 6:
            modeString = "Duotone";
            break;
        case 7:
            modeString = "Multichannel color";
            break;
        case 8:
            modeString = "Duotone";
            break;
        case 9:
            modeString = "LAB color";
            break;
    }
    addGlobalMeta("Color mode", modeString);
    // read color mode block, if present
    int modeDataLength = in.readInt();
    long fp = in.getFilePointer();
    if (modeDataLength != 0) {
        if (colorMode == 2) {
            lut = new byte[3][256];
            for (int i = 0; i < lut.length; i++) {
                in.read(lut[i]);
            }
        }
        in.seek(fp + modeDataLength);
    }
    // read image resources block
    in.skipBytes(4);
    while (in.readString(4).equals("8BIM")) {
        int tag = in.readShort();
        int read = 1;
        while (in.read() != 0) read++;
        if (read % 2 == 1)
            in.skipBytes(1);
        int size = in.readInt();
        if (size % 2 == 1)
            size++;
        in.skipBytes(size);
    }
    in.seek(in.getFilePointer() - 4);
    int blockLen = in.readInt();
    if (blockLen == 0) {
        offset = in.getFilePointer();
    } else {
        int layerLen = in.readInt();
        int layerCount = in.readShort();
        if (layerCount < 0) {
            throw new FormatException("Vector data is not supported.");
        }
        if (layerLen == 0 && layerCount == 0) {
            in.skipBytes(2);
            int check = in.readShort();
            in.seek(in.getFilePointer() - (check == 0 ? 4 : 2));
        }
        int[] w = new int[layerCount];
        int[] h = new int[layerCount];
        int[] c = new int[layerCount];
        for (int i = 0; i < layerCount; i++) {
            int top = in.readInt();
            int left = in.readInt();
            int bottom = in.readInt();
            int right = in.readInt();
            w[i] = right - left;
            h[i] = bottom - top;
            c[i] = in.readShort();
            in.skipBytes(c[i] * 6 + 12);
            int len = in.readInt();
            if (len % 2 == 1)
                len++;
            in.skipBytes(len);
        }
        // skip over pixel data for each layer
        for (int i = 0; i < layerCount; i++) {
            if (h[i] < 0) {
                continue;
            }
            int[] lens = new int[h[i]];
            for (int cc = 0; cc < c[i]; cc++) {
                boolean compressed = in.readShort() == 1;
                if (!compressed)
                    in.skipBytes(w[i] * h[i]);
                else {
                    for (int y = 0; y < h[i]; y++) {
                        lens[y] = in.readShort();
                    }
                    for (int y = 0; y < h[i]; y++) {
                        in.skipBytes(lens[y]);
                    }
                }
            }
        }
        long start = in.getFilePointer();
        while (in.read() != '8') ;
        in.skipBytes(7);
        if (in.getFilePointer() - start > 1024) {
            in.seek(start);
        }
        int len = in.readInt();
        if ((len % 4) != 0)
            len += 4 - (len % 4);
        if (len > in.length() - in.getFilePointer() || (len & 0xff0000) >> 16 == 1) {
            in.seek(start);
            len = 0;
        }
        in.skipBytes(len);
        String s = in.readString(4);
        while (s.equals("8BIM")) {
            in.skipBytes(4);
            len = in.readInt();
            if ((len % 4) != 0)
                len += 4 - (len % 4);
            in.skipBytes(len);
            s = in.readString(4);
        }
        offset = in.getFilePointer() - 4;
    }
    m.sizeZ = 1;
    m.sizeT = 1;
    m.rgb = modeString.equals("RGB") || modeString.equals("CMYK");
    m.imageCount = getSizeC() / (isRGB() ? 3 : 1);
    m.indexed = modeString.equals("palette color");
    m.falseColor = false;
    m.dimensionOrder = "XYCZT";
    m.interleaved = false;
    m.metadataComplete = true;
    in.seek(offset);
    compressed = in.readShort() == 1;
    lens = new int[getSizeC()][getSizeY()];
    if (compressed) {
        for (int c = 0; c < getSizeC(); c++) {
            for (int row = 0; row < getSizeY(); row++) {
                lens[c][row] = in.readShort();
            }
        }
    }
    offset = in.getFilePointer();
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata) FormatException(loci.formats.FormatException)

Aggregations

FormatException (loci.formats.FormatException)246 IOException (java.io.IOException)91 CoreMetadata (loci.formats.CoreMetadata)86 RandomAccessInputStream (loci.common.RandomAccessInputStream)73 MetadataStore (loci.formats.meta.MetadataStore)66 Location (loci.common.Location)48 DependencyException (loci.common.services.DependencyException)44 ServiceException (loci.common.services.ServiceException)43 Length (ome.units.quantity.Length)39 ServiceFactory (loci.common.services.ServiceFactory)35 ArrayList (java.util.ArrayList)33 IFD (loci.formats.tiff.IFD)32 TiffParser (loci.formats.tiff.TiffParser)25 OMEXMLService (loci.formats.services.OMEXMLService)23 Time (ome.units.quantity.Time)23 Timestamp (ome.xml.model.primitives.Timestamp)23 ImagePlus (ij.ImagePlus)21 ImageReader (loci.formats.ImageReader)20 IMetadata (loci.formats.meta.IMetadata)18 IFormatReader (loci.formats.IFormatReader)14