Search in sources :

Example 51 with RandomAccessInputStream

use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.

the class ZeissLSMReader 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);
    if (getSeriesCount() > 1) {
        in.close();
        in = new RandomAccessInputStream(getLSMFileFromSeries(getSeries()));
        in.order(!isLittleEndian());
        tiffParser = new TiffParser(in);
    } else if (tiffParser == null) {
        tiffParser = new TiffParser(in);
    }
    IFDList ifds = ifdsList.get(getSeries());
    if (splitPlanes && getSizeC() > 1 && ifds.size() == getSizeZ() * getSizeT()) {
        int bpp = FormatTools.getBytesPerPixel(getPixelType());
        int plane = no / getSizeC();
        int c = no % getSizeC();
        Region region = new Region(x, y, w, h);
        if (prevPlane != plane || prevBuf == null || prevBuf.length < w * h * bpp * getSizeC() || !region.equals(prevRegion)) {
            prevBuf = new byte[w * h * bpp * getSizeC()];
            tiffParser.getSamples(ifds.get(plane), prevBuf, x, y, w, h);
            prevPlane = plane;
            prevRegion = region;
        }
        ImageTools.splitChannels(prevBuf, buf, c, getSizeC(), bpp, false, false, w * h * bpp);
        prevChannel = c;
    } else {
        tiffParser.getSamples(ifds.get(no), buf, x, y, w, h);
        prevChannel = getZCTCoords(no)[1];
    }
    if (getSeriesCount() > 1)
        in.close();
    return buf;
}
Also used : IFDList(loci.formats.tiff.IFDList) Region(loci.common.Region) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream)

Example 52 with RandomAccessInputStream

use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.

the class ZeissLSMReader method getExtraSeries.

private int getExtraSeries(String file) throws FormatException, IOException {
    if (in != null)
        in.close();
    in = new RandomAccessInputStream(file, 16);
    boolean littleEndian = in.read() == TiffConstants.LITTLE;
    in.order(littleEndian);
    tiffParser = new TiffParser(in);
    IFD ifd = tiffParser.getFirstIFD();
    RandomAccessInputStream ras = getCZTag(ifd);
    if (ras == null)
        return 1;
    ras.order(littleEndian);
    ras.seek(264);
    dimensionP = ras.readInt();
    dimensionM = ras.readInt();
    ras.close();
    int nSeries = dimensionM * dimensionP;
    return nSeries <= 0 ? 1 : nSeries;
}
Also used : IFD(loci.formats.tiff.IFD) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream)

Example 53 with RandomAccessInputStream

use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.

the class TillVisionReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    if (!checkSuffix(id, "vws")) {
        Location pst = new Location(id).getAbsoluteFile();
        String name = pst.getParentFile().getName();
        Location parent = pst.getParentFile().getParentFile();
        Location vwsFile = new Location(parent, name.replaceAll(".pst", ".vws"));
        if (vwsFile.exists() && !vwsFile.isDirectory()) {
            id = vwsFile.getAbsolutePath();
        } else if (vwsFile.isDirectory()) {
            parent = pst.getParentFile();
            String[] list = parent.list(true);
            boolean foundVWS = false;
            for (String f : list) {
                if (checkSuffix(f, "vws")) {
                    id = new Location(parent, f).getAbsolutePath();
                    foundVWS = true;
                    break;
                }
            }
            if (!foundVWS) {
                throw new FormatException("Could not find .vws file.");
            }
        } else
            throw new FormatException("Could not find .vws file.");
    }
    super.initFile(id);
    exposureTimes = new HashMap<Integer, Double>();
    POIService poi = null;
    try {
        ServiceFactory factory = new ServiceFactory();
        poi = factory.getInstance(POIService.class);
    } catch (DependencyException de) {
        throw new FormatException("POI library not found", de);
    }
    poi.initialize(id);
    Vector<String> documents = poi.getDocumentList();
    int nImages = 0;
    final Hashtable<String, Object> tmpSeriesMetadata = new Hashtable<String, Object>();
    for (String name : documents) {
        LOGGER.debug("Reading {}", name);
        if (name.equals("Root Entry" + File.separator + "Contents")) {
            RandomAccessInputStream s = poi.getDocumentStream(name);
            s.order(true);
            boolean specialCImage = false;
            int nFound = 0;
            Long[] cimages = null;
            Location dir = new Location(id).getAbsoluteFile().getParentFile();
            String[] list = dir.list(true);
            boolean hasPST = false;
            for (String f : list) {
                if (checkSuffix(f, "pst")) {
                    hasPST = true;
                    break;
                }
            }
            if (!hasPST) {
                cimages = findImages(s);
                nFound = cimages.length;
                if (nFound == 0) {
                    s.seek(13);
                    int len = s.readShort();
                    String type = s.readString(len);
                    if (type.equals("CImage")) {
                        nFound = 1;
                        cimages = new Long[] { s.getFilePointer() + 6 };
                        specialCImage = true;
                    }
                }
                embeddedImages = nFound > 0;
            }
            LOGGER.debug("Images are {}embedded", embeddedImages ? "" : "not ");
            if (embeddedImages) {
                core.clear();
                embeddedOffset = new long[nFound];
                for (int i = 0; i < nFound; i++) {
                    CoreMetadata ms = new CoreMetadata();
                    core.add(ms);
                    s.seek(cimages[i]);
                    int len = s.read();
                    String imageName = s.readString(len);
                    imageNames.add(imageName);
                    if (specialCImage) {
                        s.seek(1280);
                    } else {
                        while (true) {
                            if (s.readString(2).equals("sB")) {
                                break;
                            } else
                                s.seek(s.getFilePointer() - 1);
                        }
                    }
                    s.skipBytes(20);
                    ms.sizeX = s.readInt();
                    ms.sizeY = s.readInt();
                    ms.sizeZ = s.readInt();
                    ms.sizeC = s.readInt();
                    ms.sizeT = s.readInt();
                    ms.pixelType = convertPixelType(s.readInt());
                    if (specialCImage) {
                        embeddedOffset[i] = s.getFilePointer() + 27;
                    } else {
                        embeddedOffset[i] = s.getFilePointer() + 31;
                    }
                }
                if (in != null)
                    in.close();
                in = poi.getDocumentStream(name);
                s.close();
                break;
            }
            s.seek(0);
            int lowerBound = 0;
            int upperBound = 0x1000;
            while (s.getFilePointer() < s.length() - 2) {
                LOGGER.debug("  Looking for image at {}", s.getFilePointer());
                s.order(false);
                int nextOffset = findNextOffset(s);
                if (nextOffset < 0 || nextOffset >= s.length())
                    break;
                s.seek(nextOffset);
                s.skipBytes(3);
                int len = s.readShort();
                if (len <= 0)
                    continue;
                imageNames.add(s.readString(len));
                if (s.getFilePointer() + 8 >= s.length())
                    break;
                s.skipBytes(6);
                s.order(true);
                len = s.readShort();
                if (nImages == 0 && len > upperBound * 2 && len < upperBound * 4) {
                    lowerBound = 512;
                    upperBound = 0x4000;
                }
                if (len < lowerBound || len > upperBound)
                    continue;
                String description = s.readString(len);
                LOGGER.debug("Description: {}", description);
                // parse key/value pairs from description
                String dateTime = "";
                String[] lines = description.split("[\r\n]");
                for (String line : lines) {
                    line = line.trim();
                    int colon = line.indexOf(':');
                    if (colon != -1 && !line.startsWith(";")) {
                        String key = line.substring(0, colon).trim();
                        String value = line.substring(colon + 1).trim();
                        String metaKey = "Series " + nImages + " " + key;
                        addMeta(metaKey, value, tmpSeriesMetadata);
                        if (key.equals("Start time of experiment")) {
                            // HH:mm:ss aa OR HH:mm:ss.sss aa
                            dateTime += " " + value;
                        } else if (key.equals("Date")) {
                            // mm/dd/yy ?
                            dateTime = value + " " + dateTime;
                        } else if (key.equals("Exposure time [ms]")) {
                            double exp = Double.parseDouble(value) / 1000;
                            exposureTimes.put(nImages, exp);
                        } else if (key.equals("Image type")) {
                            types.add(value);
                        }
                    }
                }
                dateTime = dateTime.trim();
                if (!dateTime.equals("")) {
                    boolean success = false;
                    for (String format : DATE_FORMATS) {
                        try {
                            dateTime = DateTools.formatDate(dateTime, format, ".");
                            success = true;
                        } catch (NullPointerException e) {
                        }
                    }
                    dates.add(success ? dateTime : "");
                }
                nImages++;
            }
            s.close();
        }
    }
    Location directory = new Location(currentId).getAbsoluteFile().getParentFile();
    String[] pixelsFile = new String[nImages];
    if (!embeddedImages) {
        if (nImages == 0) {
            throw new FormatException("No images found.");
        }
        // look for appropriate pixels files
        String[] files = directory.list(true);
        String name = currentId.substring(currentId.lastIndexOf(File.separator) + 1, currentId.lastIndexOf("."));
        int nextFile = 0;
        for (String f : files) {
            if (checkSuffix(f, "pst")) {
                Location pst = new Location(directory, f);
                if (pst.isDirectory() && f.startsWith(name)) {
                    String[] subfiles = pst.list(true);
                    Arrays.sort(subfiles);
                    for (String q : subfiles) {
                        if (checkSuffix(q, "pst") && nextFile < nImages) {
                            pixelsFile[nextFile++] = f + File.separator + q;
                        }
                    }
                }
            }
        }
        if (nextFile == 0) {
            for (String f : files) {
                if (checkSuffix(f, "pst")) {
                    pixelsFile[nextFile++] = new Location(directory, f).getAbsolutePath();
                }
            }
            if (nextFile == 0)
                throw new FormatException("No image files found.");
        }
    }
    Arrays.sort(pixelsFile);
    int nSeries = core.size();
    if (!embeddedImages) {
        core.clear();
        nSeries = nImages;
    }
    pixelsFiles = new String[nSeries];
    infFiles = new String[nSeries];
    Object[] metadataKeys = tmpSeriesMetadata.keySet().toArray();
    IniParser parser = new IniParser();
    for (int i = 0; i < nSeries; i++) {
        CoreMetadata ms;
        if (!embeddedImages) {
            ms = new CoreMetadata();
            core.add(ms);
            setSeries(i);
            // make sure that pixels file exists
            String file = pixelsFile[i];
            file = file.replace('/', File.separatorChar);
            file = file.replace('\\', File.separatorChar);
            String oldFile = file;
            Location f = new Location(directory, oldFile);
            if (!f.exists()) {
                oldFile = oldFile.substring(oldFile.lastIndexOf(File.separator) + 1);
                f = new Location(directory, oldFile);
                if (!f.exists()) {
                    throw new FormatException("Could not find pixels file '" + file);
                }
            }
            file = f.getAbsolutePath();
            pixelsFiles[i] = file;
            // read key/value pairs from .inf files
            int dot = file.lastIndexOf(".");
            String inf = file.substring(0, dot) + ".inf";
            infFiles[i] = inf;
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inf), Constants.ENCODING));
            IniList data = parser.parseINI(reader);
            reader.close();
            IniTable infoTable = data.getTable("Info");
            ms.sizeX = Integer.parseInt(infoTable.get("Width"));
            ms.sizeY = Integer.parseInt(infoTable.get("Height"));
            ms.sizeC = Integer.parseInt(infoTable.get("Bands"));
            ms.sizeZ = Integer.parseInt(infoTable.get("Slices"));
            ms.sizeT = Integer.parseInt(infoTable.get("Frames"));
            int dataType = Integer.parseInt(infoTable.get("Datatype"));
            ms.pixelType = convertPixelType(dataType);
            if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
                HashMap<String, String> iniMap = data.flattenIntoHashMap();
                ms.seriesMetadata.putAll(iniMap);
            }
        } else {
            ms = core.get(i);
            setSeries(i);
        }
        ms.imageCount = ms.sizeZ * ms.sizeC * ms.sizeT;
        ms.rgb = false;
        ms.littleEndian = true;
        ms.dimensionOrder = "XYCZT";
        ms.seriesMetadata = new Hashtable<String, Object>();
        for (Object key : metadataKeys) {
            String keyName = key.toString();
            if (keyName.startsWith("Series " + i + " ")) {
                keyName = keyName.replaceAll("Series " + i + " ", "");
                ms.seriesMetadata.put(keyName, tmpSeriesMetadata.get(key));
            }
        }
    }
    setSeries(0);
    populateMetadataStore();
    poi.close();
    poi = null;
}
Also used : IniParser(loci.common.IniParser) ServiceFactory(loci.common.services.ServiceFactory) IniList(loci.common.IniList) InputStreamReader(java.io.InputStreamReader) Hashtable(java.util.Hashtable) POIService(loci.formats.services.POIService) DependencyException(loci.common.services.DependencyException) CoreMetadata(loci.formats.CoreMetadata) FormatException(loci.formats.FormatException) FileInputStream(java.io.FileInputStream) IniTable(loci.common.IniTable) BufferedReader(java.io.BufferedReader) RandomAccessInputStream(loci.common.RandomAccessInputStream) Location(loci.common.Location)

Example 54 with RandomAccessInputStream

use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.

the class UnisokuReader 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);
    RandomAccessInputStream dat = new RandomAccessInputStream(datFile);
    dat.order(isLittleEndian());
    readPlane(dat, x, y, w, h, buf);
    dat.close();
    return buf;
}
Also used : RandomAccessInputStream(loci.common.RandomAccessInputStream)

Example 55 with RandomAccessInputStream

use of loci.common.RandomAccessInputStream in project bioformats by openmicroscopy.

the class VGSAMReader 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);
    in.seek(348);
    m.sizeX = in.readInt();
    m.sizeY = in.readInt();
    in.skipBytes(4);
    int bpp = in.readInt();
    addGlobalMeta("Bytes per pixel", bpp);
    m.pixelType = FormatTools.pixelTypeFromBytes(bpp, false, bpp == 4);
    m.littleEndian = false;
    m.sizeZ = 1;
    m.sizeC = 1;
    m.sizeT = 1;
    m.imageCount = 1;
    m.rgb = false;
    m.interleaved = false;
    m.dimensionOrder = "XYZCT";
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata)

Aggregations

RandomAccessInputStream (loci.common.RandomAccessInputStream)246 CoreMetadata (loci.formats.CoreMetadata)108 MetadataStore (loci.formats.meta.MetadataStore)97 FormatException (loci.formats.FormatException)75 TiffParser (loci.formats.tiff.TiffParser)56 IFD (loci.formats.tiff.IFD)51 Length (ome.units.quantity.Length)48 Location (loci.common.Location)47 IOException (java.io.IOException)46 ArrayList (java.util.ArrayList)30 Timestamp (ome.xml.model.primitives.Timestamp)28 Time (ome.units.quantity.Time)21 ByteArrayHandle (loci.common.ByteArrayHandle)18 IFDList (loci.formats.tiff.IFDList)16 CodecOptions (loci.formats.codec.CodecOptions)9 RandomAccessOutputStream (loci.common.RandomAccessOutputStream)8 ServiceException (loci.common.services.ServiceException)7 PhotoInterp (loci.formats.tiff.PhotoInterp)7 TiffSaver (loci.formats.tiff.TiffSaver)7 BufferedReader (java.io.BufferedReader)6