Search in sources :

Example 36 with Location

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

the class VolocityReader 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[] zct = getZCTCoords(no);
    Stack stack = stacks.get(getSeries());
    if (!new Location(stack.pixelsFiles[zct[1]]).exists()) {
        Arrays.fill(buf, (byte) 0);
        return buf;
    }
    RandomAccessInputStream pix = new RandomAccessInputStream(stack.pixelsFiles[zct[1]]);
    int padding = zct[2] * stack.planePadding;
    long planeSize = FormatTools.getPlaneSize(this);
    int planesInFile = (int) (pix.length() / planeSize);
    int planeIndex = no / getEffectiveSizeC();
    if (planesInFile == getSizeT()) {
        planeIndex = zct[2];
        int block = stack.blockSize;
        padding = block - (int) (planeSize % block);
        if (padding == block) {
            padding = 0;
        }
        padding *= zct[2];
    }
    long offset = (long) stack.blockSize + planeIndex * planeSize + padding;
    if (offset >= pix.length()) {
        pix.close();
        return buf;
    }
    pix.seek(offset);
    if (stack.clippingData) {
        pix.seek(offset - 3);
        ByteArrayHandle v = new ByteArrayHandle();
        while (v.length() < FormatTools.getPlaneSize(this) && pix.getFilePointer() < pix.length()) {
            try {
                byte[] b = new LZOCodec().decompress(pix, null);
                pix.skipBytes(4);
                v.write(b);
            } catch (IOException e) {
            }
        }
        RandomAccessInputStream s = new RandomAccessInputStream(v);
        s.seek(0);
        readPlane(s, x, y, w, h, buf);
        s.close();
    } else {
        if (pix.getFilePointer() + planeSize > pix.length()) {
            pix.close();
            return buf;
        }
        readPlane(pix, x, y, w, h, buf);
    }
    pix.close();
    if (getRGBChannelCount() == 4) {
        // stored as ARGB, need to swap to RGBA
        for (int i = 0; i < buf.length / 4; i++) {
            byte a = buf[i * 4];
            buf[i * 4] = buf[i * 4 + 1];
            buf[i * 4 + 1] = buf[i * 4 + 2];
            buf[i * 4 + 2] = buf[i * 4 + 3];
            buf[i * 4 + 3] = a;
        }
    }
    return buf;
}
Also used : LZOCodec(loci.formats.codec.LZOCodec) RandomAccessInputStream(loci.common.RandomAccessInputStream) IOException(java.io.IOException) ByteArrayHandle(loci.common.ByteArrayHandle) Location(loci.common.Location)

Example 37 with Location

use of loci.common.Location 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 38 with Location

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

the class TrestleReader method isThisType.

// -- IFormatReader API methods --
/* @see loci.formats.IFormatReader#isThisType(String, boolean) */
@Override
public boolean isThisType(String name, boolean open) {
    if (super.isThisType(name, open))
        return true;
    if (!checkSuffix(name, "tif") && open) {
        Location current = new Location(name).getAbsoluteFile();
        Location parent = current.getParentFile();
        String tiff = current.getName();
        int index = tiff.lastIndexOf(".");
        if (index >= 0) {
            tiff = tiff.substring(0, index);
        }
        tiff += ".tif";
        Location tiffFile = new Location(parent, tiff);
        return tiffFile.exists() && isThisType(tiffFile.getAbsolutePath(), open);
    }
    return false;
}
Also used : Location(loci.common.Location)

Example 39 with Location

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

the class TrestleReader method initStandardMetadata.

// -- Internal BaseTiffReader API methods --
/* @see loci.formats.in.BaseTiffReader#initStandardMetadata() */
@Override
protected void initStandardMetadata() throws FormatException, IOException {
    super.initStandardMetadata();
    ifds = tiffParser.getIFDs();
    for (IFD ifd : ifds) {
        tiffParser.fillInIFD(ifd);
    }
    String comment = ifds.get(0).getComment();
    String[] values = comment.split(";");
    for (String v : values) {
        int eq = v.indexOf('=');
        if (eq < 0)
            continue;
        String key = v.substring(0, eq).trim();
        String value = v.substring(eq + 1).trim();
        addGlobalMeta(key, value);
        if (key.equals("OverlapsXY")) {
            String[] overlapValues = value.split(" ");
            overlaps = new int[ifds.size() * 2];
            for (int i = 0; i < overlapValues.length; i++) {
                overlaps[i] = Integer.parseInt(overlapValues[i]);
            }
        }
    }
    int seriesCount = ifds.size();
    core.clear();
    for (int i = 0; i < seriesCount; i++) {
        CoreMetadata c = new CoreMetadata();
        if (i == 0 && !hasFlattenedResolutions()) {
            c.resolutionCount = seriesCount;
        }
        core.add(c);
    }
    for (int s = 0; s < core.size(); s++) {
        CoreMetadata ms = core.get(s);
        IFD ifd = ifds.get(s);
        PhotoInterp p = ifd.getPhotometricInterpretation();
        int samples = ifd.getSamplesPerPixel();
        ms.rgb = samples > 1 || p == PhotoInterp.RGB;
        long numTileRows = ifd.getTilesPerColumn() - 1;
        long numTileCols = ifd.getTilesPerRow() - 1;
        int overlapX = overlaps[s * 2];
        int overlapY = overlaps[s * 2 + 1];
        ms.sizeX = (int) (ifd.getImageWidth() - (numTileCols * overlapX));
        ms.sizeY = (int) (ifd.getImageLength() - (numTileRows * overlapY));
        ms.sizeZ = 1;
        ms.sizeT = 1;
        ms.sizeC = ms.rgb ? samples : 1;
        ms.littleEndian = ifd.isLittleEndian();
        ms.indexed = p == PhotoInterp.RGB_PALETTE && (get8BitLookupTable() != null || get16BitLookupTable() != null);
        ms.imageCount = 1;
        ms.pixelType = ifd.getPixelType();
        ms.metadataComplete = true;
        ms.interleaved = false;
        ms.falseColor = false;
        ms.dimensionOrder = "XYCZT";
        ms.thumbnail = s > 0;
    }
    // look for all of the other associated metadata files
    files = new ArrayList<String>();
    Location baseFile = new Location(currentId).getAbsoluteFile();
    Location parent = baseFile.getParentFile();
    String name = baseFile.getName();
    if (name.indexOf('.') >= 0) {
        name = name.substring(0, name.indexOf('.') + 1);
    }
    roiFile = new Location(parent, name + "ROI").getAbsolutePath();
    roiDrawFile = new Location(parent, name + "ROI-draw").getAbsolutePath();
    String[] list = parent.list(true);
    for (String f : list) {
        if (!f.equals(baseFile.getName())) {
            files.add(new Location(parent, f).getAbsolutePath());
        }
    }
}
Also used : IFD(loci.formats.tiff.IFD) PhotoInterp(loci.formats.tiff.PhotoInterp) CoreMetadata(loci.formats.CoreMetadata) Location(loci.common.Location)

Example 40 with Location

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

the class VarianFDFReader method parseFDF.

// -- Helper methods --
private void parseFDF(String file) throws FormatException, IOException {
    in = new RandomAccessInputStream(file);
    CoreMetadata m = core.get(0);
    boolean storedFloats = false;
    boolean multifile = false;
    String data = in.readString(Character.toString((char) 0x0c));
    String[] lines = data.split("\n");
    for (String line : lines) {
        line = line.trim();
        if (line.length() == 0)
            break;
        if (line.startsWith("#"))
            continue;
        int space = line.indexOf(' ');
        int eq = line.indexOf('=');
        String type = line.substring(0, space).trim();
        String var = line.substring(space, eq).trim();
        String value = line.substring(eq + 1, line.indexOf(';')).trim();
        if (var.equals("*storage")) {
            storedFloats = value.equals("\"float\"");
        }
        if (var.equals("bits")) {
            m.bitsPerPixel = Integer.parseInt(value);
            if (value.equals("8")) {
                m.pixelType = FormatTools.UINT8;
            } else if (value.equals("16")) {
                m.pixelType = FormatTools.UINT16;
            } else if (value.equals("32")) {
                if (storedFloats) {
                    m.pixelType = FormatTools.FLOAT;
                } else
                    m.pixelType = FormatTools.UINT32;
            } else
                throw new FormatException("Unsupported bits: " + value);
        } else if (var.equals("matrix[]")) {
            String[] values = parseArray(value);
            m.sizeX = (int) Double.parseDouble(values[0]);
            m.sizeY = (int) Double.parseDouble(values[1]);
            if (values.length > 2) {
                m.sizeZ = (int) Double.parseDouble(values[2]);
            }
        } else if (var.equals("slices")) {
            m.sizeZ = Integer.parseInt(value);
            multifile = true;
        } else if (var.equals("echoes")) {
            m.sizeT = Integer.parseInt(value);
            multifile = true;
        } else if (var.equals("span[]")) {
            String[] values = parseArray(value);
            if (values.length > 0) {
                pixelSizeX = computePhysicalSize(getSizeX(), values[0], units[0]);
            }
            if (values.length > 1) {
                pixelSizeY = computePhysicalSize(getSizeY(), values[1], units[1]);
            }
            if (values.length > 2) {
                pixelSizeZ = computePhysicalSize(getSizeZ(), values[2], units[2]);
            }
        } else if (var.equals("origin[]")) {
            String[] values = parseArray(value);
            if (values.length > 0) {
                final double size = computePhysicalSize(1, values[0], units[0]);
                originX = new Length(size, UNITS.REFERENCEFRAME);
                addGlobalMeta("X position for position #1", originX);
            }
            if (values.length > 1) {
                final double size = computePhysicalSize(1, values[1], units[1]);
                originY = new Length(size, UNITS.REFERENCEFRAME);
                addGlobalMeta("Y position for position #1", originY);
            }
            if (values.length > 2) {
                final double size = computePhysicalSize(1, values[2], units[2]);
                originZ = new Length(size, UNITS.REFERENCEFRAME);
                addGlobalMeta("Z position for position #1", originZ);
            }
        } else if (var.equals("*abscissa[]")) {
            units = parseArray(value);
        } else if (var.equals("bigendian")) {
            m.littleEndian = value.equals("0");
            in.order(isLittleEndian());
        }
        addGlobalMeta(var, value);
    }
    if (multifile && files.isEmpty()) {
        Location thisFile = new Location(file).getAbsoluteFile();
        Location parent = thisFile.getParentFile();
        String[] list = parent.list(true);
        Arrays.sort(list);
        for (String f : list) {
            if (checkSuffix(f, "fdf") && f.length() == thisFile.getName().length()) {
                files.add(new Location(parent, f).getAbsolutePath());
            }
        }
    }
}
Also used : Length(ome.units.quantity.Length) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata) FormatException(loci.formats.FormatException) Location(loci.common.Location)

Aggregations

Location (loci.common.Location)185 CoreMetadata (loci.formats.CoreMetadata)55 MetadataStore (loci.formats.meta.MetadataStore)51 FormatException (loci.formats.FormatException)49 ArrayList (java.util.ArrayList)47 RandomAccessInputStream (loci.common.RandomAccessInputStream)47 Length (ome.units.quantity.Length)34 IOException (java.io.IOException)28 Timestamp (ome.xml.model.primitives.Timestamp)28 Time (ome.units.quantity.Time)20 IFD (loci.formats.tiff.IFD)15 TiffParser (loci.formats.tiff.TiffParser)15 NonNegativeInteger (ome.xml.model.primitives.NonNegativeInteger)15 PositiveInteger (ome.xml.model.primitives.PositiveInteger)15 DependencyException (loci.common.services.DependencyException)13 ServiceException (loci.common.services.ServiceException)12 File (java.io.File)11 ServiceFactory (loci.common.services.ServiceFactory)11 IniList (loci.common.IniList)10 FilePattern (loci.formats.FilePattern)10