Search in sources :

Example 31 with RandomAccessInputStream

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

the class PerkinElmerReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    if (currentId != null && (id.equals(currentId) || isUsedFile(id)))
        return;
    LOGGER.info("Finding HTML companion file");
    if (!checkSuffix(id, HTM_SUFFIX)) {
        Location parent = new Location(id).getAbsoluteFile().getParentFile();
        String[] ls = parent.list();
        for (String file : ls) {
            if (checkSuffix(file, HTM_SUFFIX) && !file.startsWith(".")) {
                id = new Location(parent.getAbsolutePath(), file).getAbsolutePath();
                break;
            }
        }
    }
    super.initFile(id);
    allFiles = new ArrayList<String>();
    // get the working directory
    Location tmpFile = new Location(id).getAbsoluteFile();
    Location workingDir = tmpFile.getParentFile();
    if (workingDir == null)
        workingDir = new Location(".");
    String workingDirPath = workingDir.getPath();
    if (!workingDirPath.equals(""))
        workingDirPath += File.separator;
    String[] ls = workingDir.list(true);
    if (!new Location(id).exists()) {
        ls = Location.getIdMap().keySet().toArray(new String[0]);
        workingDirPath = "";
    }
    LOGGER.info("Searching for all metadata companion files");
    // check if we have any of the required header file types
    String cfgFile = null, anoFile = null, recFile = null;
    String timFile = null, csvFile = null, zpoFile = null;
    String htmFile = null;
    final List<PixelsFile> tempFiles = new ArrayList<PixelsFile>();
    int dot = id.lastIndexOf(".");
    String check = dot < 0 ? id : id.substring(0, dot);
    check = check.substring(check.lastIndexOf(File.separator) + 1);
    // locate appropriate .tim, .csv, .zpo, .htm and .tif files
    String prefix = null;
    Arrays.sort(ls);
    for (int i = 0; i < ls.length; i++) {
        // make sure that the file has a name similar to the name of the
        // specified file
        int d = ls[i].lastIndexOf(".");
        while (d == -1 && i < ls.length - 1) {
            i++;
            d = ls[i].lastIndexOf(".");
        }
        String s = d < 0 ? ls[i] : ls[i].substring(0, d);
        if (s.startsWith(check) || check.startsWith(s) || ((prefix != null) && (s.startsWith(prefix)))) {
            prefix = ls[i].substring(0, d);
            if (cfgFile == null && checkSuffix(ls[i], CFG_SUFFIX))
                cfgFile = ls[i];
            if (anoFile == null && checkSuffix(ls[i], ANO_SUFFIX))
                anoFile = ls[i];
            if (recFile == null && checkSuffix(ls[i], REC_SUFFIX))
                recFile = ls[i];
            if (timFile == null && checkSuffix(ls[i], TIM_SUFFIX))
                timFile = ls[i];
            if (csvFile == null && checkSuffix(ls[i], CSV_SUFFIX))
                csvFile = ls[i];
            if (zpoFile == null && checkSuffix(ls[i], ZPO_SUFFIX))
                zpoFile = ls[i];
            if (htmFile == null && checkSuffix(ls[i], HTM_SUFFIX))
                htmFile = ls[i];
            dot = ls[i].lastIndexOf(".");
            PixelsFile f = new PixelsFile();
            f.path = workingDirPath + ls[i];
            if (checkSuffix(ls[i], TiffReader.TIFF_SUFFIXES)) {
                if (dot - 4 >= 0 && dot - 4 < ls[i].length() && ls[i].charAt(dot - 4) == '_') {
                    f.firstIndex = Integer.parseInt(ls[i].substring(dot - 3, dot));
                } else {
                    f.firstIndex = -1;
                }
                if (dot - 9 >= 0 && dot - 9 < ls[i].length() && ls[i].charAt(dot - 9) == '_') {
                    f.extIndex = Integer.parseInt(ls[i].substring(dot - 8, dot - 4));
                } else {
                    f.firstIndex = i;
                    f.extIndex = 0;
                }
                tempFiles.add(f);
            } else {
                try {
                    if (dot - 4 >= 0 && dot - 4 < ls[i].length() && ls[i].charAt(dot - 4) == '_') {
                        f.firstIndex = Integer.parseInt(ls[i].substring(dot - 3, dot));
                    } else {
                        f.firstIndex = -1;
                    }
                    String ext = dot + 1 < ls[i].length() ? ls[i].substring(dot + 1) : "";
                    f.extIndex = Integer.parseInt(ext, 16);
                    isTiff = false;
                    tempFiles.add(f);
                } catch (NumberFormatException exc) {
                    LOGGER.debug("Failed to parse file extension", exc);
                }
            }
        }
    }
    files = tempFiles.toArray(new PixelsFile[tempFiles.size()]);
    // determine the number of different extensions we have
    LOGGER.info("Finding image files");
    List<Integer> foundExts = new ArrayList<Integer>();
    for (PixelsFile f : files) {
        if (!foundExts.contains(f.extIndex)) {
            foundExts.add(f.extIndex);
        }
    }
    extCount = foundExts.size();
    foundExts = null;
    CoreMetadata ms0 = core.get(0);
    ms0.imageCount = 0;
    for (PixelsFile f : files) {
        allFiles.add(f.path);
        ms0.imageCount++;
        if (f.firstIndex < 0 && files.length > extCount) {
            ms0.imageCount += ((files.length - 1) / (extCount - 1)) - 1;
        }
    }
    tiff = new MinimalTiffReader();
    // we always parse the .tim and .htm files if they exist, along with
    // either the .csv file or the .zpo file
    LOGGER.info("Parsing metadata values");
    addUsedFile(workingDirPath, cfgFile);
    addUsedFile(workingDirPath, anoFile);
    addUsedFile(workingDirPath, recFile);
    addUsedFile(workingDirPath, timFile);
    if (timFile != null)
        timFile = allFiles.get(allFiles.size() - 1);
    addUsedFile(workingDirPath, csvFile);
    if (csvFile != null)
        csvFile = allFiles.get(allFiles.size() - 1);
    addUsedFile(workingDirPath, zpoFile);
    if (zpoFile != null)
        zpoFile = allFiles.get(allFiles.size() - 1);
    addUsedFile(workingDirPath, htmFile);
    if (htmFile != null)
        htmFile = allFiles.get(allFiles.size() - 1);
    if (timFile != null)
        parseTimFile(timFile);
    if (csvFile != null)
        parseCSVFile(csvFile);
    if (zpoFile != null && csvFile == null)
        parseZpoFile(zpoFile);
    // be aggressive about parsing the HTML file, since it's the only one that
    // explicitly defines the number of wavelengths and timepoints
    final List<Double> exposureTimes = new ArrayList<Double>();
    final List<Double> zPositions = new ArrayList<Double>();
    final List<Double> emWaves = new ArrayList<Double>();
    final List<Double> exWaves = new ArrayList<Double>();
    if (htmFile != null) {
        String[] tokens = DataTools.readFile(htmFile).split(HTML_REGEX);
        for (int j = 0; j < tokens.length; j++) {
            if (tokens[j].indexOf('<') != -1)
                tokens[j] = "";
        }
        for (int j = 0; j < tokens.length - 1; j += 2) {
            if (tokens[j].indexOf("Exposure") != -1) {
                addGlobalMeta("Camera Data " + tokens[j].charAt(13), tokens[j]);
                int ndx = tokens[j].indexOf("Exposure") + 9;
                String exposure = tokens[j].substring(ndx, tokens[j].indexOf(" ", ndx)).trim();
                if (exposure.endsWith(",")) {
                    exposure = exposure.substring(0, exposure.length() - 1);
                }
                exposureTimes.add(new Double(Double.parseDouble(exposure) / 1000));
                if (tokens[j].indexOf("nm") != -1) {
                    int nmIndex = tokens[j].indexOf("nm");
                    int paren = tokens[j].lastIndexOf("(", nmIndex);
                    int slash = tokens[j].lastIndexOf("/", nmIndex);
                    if (slash == -1)
                        slash = nmIndex;
                    emWaves.add(new Double(tokens[j].substring(paren + 1, slash).trim()));
                    if (tokens[j].indexOf("nm", nmIndex + 3) != -1) {
                        nmIndex = tokens[j].indexOf("nm", nmIndex + 3);
                        paren = tokens[j].lastIndexOf(" ", nmIndex);
                        slash = tokens[j].lastIndexOf("/", nmIndex);
                        if (slash == -1)
                            slash = nmIndex + 2;
                        exWaves.add(new Double(tokens[j].substring(paren + 1, slash).trim()));
                    }
                }
                j--;
            } else if (tokens[j + 1].trim().equals("Slice Z positions")) {
                for (int q = j + 2; q < tokens.length; q++) {
                    if (!tokens[q].trim().equals("")) {
                        try {
                            zPositions.add(new Double(tokens[q].trim()));
                        } catch (NumberFormatException e) {
                        }
                    }
                }
            } else if (!tokens[j].trim().equals("")) {
                tokens[j] = tokens[j].trim();
                tokens[j + 1] = tokens[j + 1].trim();
                parseKeyValue(tokens[j], tokens[j + 1]);
            }
        }
    } else {
        throw new FormatException("Valid header files not found.");
    }
    if (details != null) {
        String[] tokens = details.split("\\s");
        int n = 0;
        for (String token : tokens) {
            if (token.equals("Wavelengths"))
                ms0.sizeC = n;
            else if (token.equals("Frames"))
                ms0.sizeT = n;
            else if (token.equals("Slices"))
                ms0.sizeZ = n;
            try {
                n = Integer.parseInt(token);
            } catch (NumberFormatException e) {
                n = 0;
            }
        }
    }
    LOGGER.info("Populating metadata");
    if (files.length == 0) {
        throw new FormatException("TIFF files not found.");
    }
    if (isTiff) {
        tiff.setId(getFile(0));
        ms0.pixelType = tiff.getPixelType();
    } else {
        RandomAccessInputStream tmp = new RandomAccessInputStream(getFile(0));
        int bpp = (int) (tmp.length() - 6) / (getSizeX() * getSizeY());
        tmp.close();
        if (bpp % 3 == 0)
            bpp /= 3;
        ms0.pixelType = FormatTools.pixelTypeFromBytes(bpp, false, false);
    }
    if (getSizeZ() <= 0)
        ms0.sizeZ = 1;
    if (getSizeC() <= 0)
        ms0.sizeC = 1;
    if (getSizeT() <= 0 || getImageCount() % (getSizeZ() * getSizeC()) == 0) {
        ms0.sizeT = getImageCount() / (getSizeZ() * getSizeC());
    } else {
        ms0.imageCount = getSizeZ() * getSizeC() * getSizeT();
        if (getImageCount() > files.length) {
            ms0.imageCount = files.length;
            ms0.sizeT = getImageCount() / (getSizeZ() * getSizeC());
        }
    }
    ms0.dimensionOrder = "XYCTZ";
    ms0.rgb = isTiff ? tiff.isRGB() : false;
    ms0.interleaved = false;
    ms0.littleEndian = isTiff ? tiff.isLittleEndian() : true;
    ms0.metadataComplete = true;
    ms0.indexed = isTiff ? tiff.isIndexed() : false;
    ms0.falseColor = false;
    if (getImageCount() != getSizeZ() * getSizeC() * getSizeT()) {
        ms0.imageCount = getSizeZ() * getSizeC() * getSizeT();
    }
    if (!isTiff && extCount > getSizeT()) {
        extCount = getSizeT() * getSizeC();
    }
    // Populate metadata store
    // The metadata store we're working with.
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this, true);
    // populate Image element
    if (finishTime != null) {
        Timestamp timestamp = Timestamp.valueOf(DateTools.formatDate(finishTime, DATE_FORMAT));
        if (timestamp != null)
            store.setImageAcquisitionDate(timestamp, 0);
    }
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        // populate Dimensions element
        Length sizeX = FormatTools.getPhysicalSizeX(pixelSizeX);
        Length sizeY = FormatTools.getPhysicalSizeY(pixelSizeY);
        if (sizeX != null) {
            store.setPixelsPhysicalSizeX(sizeX, 0);
        }
        if (sizeY != null) {
            store.setPixelsPhysicalSizeY(sizeY, 0);
        }
        // link Instrument and Image
        String instrumentID = MetadataTools.createLSID("Instrument", 0);
        store.setInstrumentID(instrumentID, 0);
        store.setImageInstrumentRef(instrumentID, 0);
        // populate LogicalChannel element
        for (int i = 0; i < getEffectiveSizeC(); i++) {
            if (i < emWaves.size()) {
                Length em = FormatTools.getEmissionWavelength(emWaves.get(i));
                if (em != null) {
                    store.setChannelEmissionWavelength(em, 0, i);
                }
            }
            if (i < exWaves.size()) {
                Length ex = FormatTools.getExcitationWavelength(exWaves.get(i));
                if (ex != null) {
                    store.setChannelExcitationWavelength(ex, 0, i);
                }
            }
        }
        // populate PlaneTiming and StagePosition
        long start = 0, end = 0;
        if (startTime != null) {
            start = DateTools.getTime(startTime, DATE_FORMAT);
        }
        if (finishTime != null) {
            end = DateTools.getTime(finishTime, DateTools.ISO8601_FORMAT);
        }
        double secondsPerPlane = (double) (end - start) / getImageCount() / 1000;
        for (int i = 0; i < getImageCount(); i++) {
            int[] zct = getZCTCoords(i);
            store.setPlaneDeltaT(new Time(i * secondsPerPlane, UNITS.SECOND), 0, i);
            if (zct[1] < exposureTimes.size() && exposureTimes.get(zct[1]) != null) {
                store.setPlaneExposureTime(new Time(exposureTimes.get(zct[1]), UNITS.SECOND), 0, i);
            }
            if (zct[0] < zPositions.size()) {
                final Double zPosition = zPositions.get(zct[0]);
                final Length xl = new Length(0d, UNITS.REFERENCEFRAME);
                final Length yl = new Length(0d, UNITS.REFERENCEFRAME);
                final Length zl;
                if (zPosition == null) {
                    zl = null;
                } else {
                    zl = new Length(zPosition, UNITS.REFERENCEFRAME);
                }
                store.setPlanePositionX(xl, 0, i);
                store.setPlanePositionY(yl, 0, i);
                store.setPlanePositionZ(zl, 0, i);
            }
        }
    }
}
Also used : ArrayList(java.util.ArrayList) Time(ome.units.quantity.Time) CoreMetadata(loci.formats.CoreMetadata) Timestamp(ome.xml.model.primitives.Timestamp) FormatException(loci.formats.FormatException) MetadataStore(loci.formats.meta.MetadataStore) Length(ome.units.quantity.Length) RandomAccessInputStream(loci.common.RandomAccessInputStream) Location(loci.common.Location)

Example 32 with RandomAccessInputStream

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

the class PhotoshopTiffReader 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 {
    if (getSeries() == 0)
        return super.openBytes(no, buf, x, y, w, h);
    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h);
    int offsetIndex = 0;
    for (int i = 1; i < getSeries(); i++) {
        offsetIndex += core.get(i).sizeC;
    }
    tag.seek(layerOffset[offsetIndex]);
    int bpp = FormatTools.getBytesPerPixel(getPixelType());
    if (compression[getSeries() - 1] == PACKBITS || compression[getSeries() - 1] == ZIP) {
        Codec codec = compression[getSeries() - 1] == ZIP ? new ZlibCodec() : new PackbitsCodec();
        CodecOptions options = new CodecOptions();
        options.maxBytes = FormatTools.getPlaneSize(this) / getSizeC();
        ByteArrayHandle pix = new ByteArrayHandle();
        for (int c = 0; c < getSizeC(); c++) {
            int index = channelOrder[getSeries() - 1][c];
            tag.seek(layerOffset[offsetIndex + index]);
            pix.write(codec.decompress(tag, options));
        }
        RandomAccessInputStream plane = new RandomAccessInputStream(pix);
        plane.seek(0);
        readPlane(plane, x, y, w, h, buf);
        plane.close();
        pix = null;
    } else
        readPlane(tag, x, y, w, h, buf);
    return buf;
}
Also used : ZlibCodec(loci.formats.codec.ZlibCodec) PackbitsCodec(loci.formats.codec.PackbitsCodec) Codec(loci.formats.codec.Codec) PackbitsCodec(loci.formats.codec.PackbitsCodec) ZlibCodec(loci.formats.codec.ZlibCodec) CodecOptions(loci.formats.codec.CodecOptions) RandomAccessInputStream(loci.common.RandomAccessInputStream) ByteArrayHandle(loci.common.ByteArrayHandle)

Example 33 with RandomAccessInputStream

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

the class IPWReader method getOptimalTileWidth.

/* @see loci.formats.IFormatReader#getOptimalTileWidth() */
@Override
public int getOptimalTileWidth() {
    FormatTools.assertId(currentId, true, 1);
    try {
        RandomAccessInputStream stream = poi.getDocumentStream(imageFiles.get(0));
        TiffParser tp = new TiffParser(stream);
        IFD ifd = tp.getFirstIFD();
        stream.close();
        return (int) ifd.getTileWidth();
    } catch (FormatException e) {
        LOGGER.debug("Could not retrieve tile width", e);
    } catch (IOException e) {
        LOGGER.debug("Could not retrieve tile height", 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 34 with RandomAccessInputStream

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

the class IPWReader method get8BitLookupTable.

/* @see loci.formats.IFormatReader#get8BitLookupTable() */
@Override
public byte[][] get8BitLookupTable() throws FormatException, IOException {
    FormatTools.assertId(currentId, true, 1);
    RandomAccessInputStream stream = poi.getDocumentStream(imageFiles.get(0));
    TiffParser tp = new TiffParser(stream);
    IFD firstIFD = tp.getFirstIFD();
    int[] bits = firstIFD.getBitsPerSample();
    if (bits[0] <= 8) {
        int[] colorMap = tp.getColorMap(firstIFD);
        if (colorMap == null) {
            return null;
        }
        byte[][] table = new byte[3][colorMap.length / 3];
        int next = 0;
        for (int j = 0; j < table.length; j++) {
            for (int i = 0; i < table[0].length; i++) {
                table[j][i] = (byte) (colorMap[next++] >> 8);
            }
        }
        return table;
    }
    return null;
}
Also used : IFD(loci.formats.tiff.IFD) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream)

Example 35 with RandomAccessInputStream

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

the class IPWReader 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 (poi == null) {
        initPOIService();
    }
    RandomAccessInputStream stream = poi.getDocumentStream(imageFiles.get(no));
    TiffParser tp = new TiffParser(stream);
    IFD ifd = tp.getFirstIFD();
    tp.getSamples(ifd, buf, x, y, w, h);
    stream.close();
    return buf;
}
Also used : IFD(loci.formats.tiff.IFD) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream)

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