Search in sources :

Example 56 with MetadataStore

use of loci.formats.meta.MetadataStore in project bioformats by openmicroscopy.

the class FEIReader 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);
    CoreMetadata m = core.get(0);
    LOGGER.info("Reading file header");
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        in.skipBytes(44);
        float magnification = in.readFloat();
        float kV = in.readFloat() / 1000;
        float wd = in.readFloat();
        in.skipBytes(12);
        float spot = in.readFloat();
        addGlobalMeta("Magnification", magnification);
        addGlobalMeta("kV", kV);
        addGlobalMeta("Working distance", wd);
        addGlobalMeta("Spot", spot);
    }
    in.seek(514);
    m.sizeX = in.readShort() - INVALID_PIXELS;
    m.sizeY = in.readShort();
    in.skipBytes(4);
    headerSize = in.readShort();
    // always one grayscale plane per file
    m.sizeZ = 1;
    m.sizeC = 1;
    m.sizeT = 1;
    m.imageCount = 1;
    m.littleEndian = true;
    m.pixelType = FormatTools.UINT8;
    m.rgb = false;
    m.indexed = false;
    m.interleaved = false;
    m.dimensionOrder = "XYCZT";
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata)

Example 57 with MetadataStore

use of loci.formats.meta.MetadataStore in project bioformats by openmicroscopy.

the class FV1000Reader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    super.initFile(id);
    parser.setCommentDelimiter(null);
    isOIB = checkSuffix(id, OIB_SUFFIX);
    if (isOIB) {
        initPOIService();
    }
    // mappedOIF is used to distinguish between datasets that are being read
    // directly (e.g. using ImageJ or showinf), and datasets that are being
    // imported through omebf. In the latter case, the necessary directory
    // structure is not preserved (only relative file names are stored in
    // OMEIS), so we will need to use slightly different logic to build the
    // list of associated files.
    boolean mappedOIF = !isOIB && !new File(id).getAbsoluteFile().exists();
    wavelengths = new ArrayList<Double>();
    illuminations = new ArrayList<String>();
    channels = new ArrayList<ChannelData>();
    planes = new ArrayList<PlaneData>();
    String oifName = null;
    if (isOIB) {
        oifName = mapOIBFiles();
    } else {
        // make sure we have the OIF file, not a TIFF
        if (!checkSuffix(id, OIF_SUFFIX)) {
            currentId = findOIFFile(id);
            initFile(currentId);
        }
        oifName = currentId;
    }
    String oifPath = new Location(oifName).getAbsoluteFile().getAbsolutePath();
    if (mappedOIF) {
        oifPath = oifName.substring(0, oifName.lastIndexOf(File.separator) + 1);
    }
    String path = isOIB ? "" : oifPath.substring(0, oifPath.lastIndexOf(File.separator) + 1);
    try {
        RandomAccessInputStream s = getFile(oifName);
        s.close();
    } catch (IOException e) {
        oifName = oifName.replaceAll(".oif", ".OIF");
    }
    // parse key/value pairs from the OIF file
    code = new String[NUM_DIMENSIONS];
    size = new String[NUM_DIMENSIONS];
    pixelSize = new Double[NUM_DIMENSIONS];
    previewNames = new ArrayList<String>();
    SortedMap<Integer, String> previewFileNames = new TreeMap<Integer, String>();
    boolean laserEnabled = true;
    IniList f = getIniFile(oifName);
    IniTable saveInfo = f.getTable("ProfileSaveInfo");
    String[] saveKeys = saveInfo.keySet().toArray(new String[saveInfo.size()]);
    for (String key : saveKeys) {
        String value = saveInfo.get(key).toString();
        value = sanitizeValue(value).trim();
        if (key.startsWith("IniFileName") && key.indexOf("Thumb") == -1 && !isPreviewName(value)) {
            filenames.put(new Integer(key.substring(11)), value);
        } else if (key.startsWith("RoiFileName") && key.indexOf("Thumb") == -1 && !isPreviewName(value)) {
            try {
                roiFilenames.put(new Integer(key.substring(11)), value);
            } catch (NumberFormatException e) {
            }
        } else if (key.equals("PtyFileNameS"))
            ptyStart = value;
        else if (key.equals("PtyFileNameE"))
            ptyEnd = value;
        else if (key.equals("PtyFileNameT2"))
            ptyPattern = value;
        else if (key.indexOf("Thumb") != -1) {
            if (thumbId == null)
                thumbId = value.trim();
        } else if (key.startsWith("LutFileName")) {
            lutNames.add(path + value);
        } else if (isPreviewName(value)) {
            try {
                RandomAccessInputStream s = getFile(path + value.trim());
                if (s != null) {
                    s.close();
                    Integer previewIndex = getPreviewNameIndex(key);
                    if (previewIndex != null) {
                        previewFileNames.put(previewIndex, path + value.trim());
                    } else {
                        previewNames.add(path + value.trim());
                    }
                }
            } catch (FormatException e) {
                LOGGER.debug("Preview file not found", e);
            } catch (IOException e) {
                LOGGER.debug("Preview file not found", e);
            }
        }
    }
    // Store sorted list of preview names
    previewNames.addAll(previewFileNames.values());
    if (filenames.isEmpty())
        addPtyFiles();
    for (int i = 0; i < NUM_DIMENSIONS; i++) {
        IniTable commonParams = f.getTable("Axis " + i + " Parameters Common");
        code[i] = commonParams.get("AxisCode");
        size[i] = commonParams.get("MaxSize");
        double end = Double.parseDouble(commonParams.get("EndPosition"));
        double start = Double.parseDouble(commonParams.get("StartPosition"));
        pixelSize[i] = end - start;
    }
    IniTable referenceParams = f.getTable("Reference Image Parameter");
    imageDepth = Integer.parseInt(referenceParams.get("ImageDepth"));
    pixelSizeX = referenceParams.get("WidthConvertValue");
    pixelSizeY = referenceParams.get("HeightConvertValue");
    String ripValidBitCounts = referenceParams.get("ValidBitCounts");
    if (ripValidBitCounts != null) {
        validBits = Integer.parseInt(ripValidBitCounts);
    }
    int index = 0;
    IniTable laser = f.getTable("Laser " + index + " Parameters");
    while (laser != null) {
        laserEnabled = laser.get("Laser Enable").equals("1");
        if (laserEnabled) {
            wavelengths.add(new Double(laser.get("LaserWavelength")));
        }
        creationDate = laser.get("ImageCaputreDate");
        if (creationDate == null) {
            creationDate = laser.get("ImageCaptureDate");
        }
        index++;
        laser = f.getTable("Laser " + index + " Parameters");
    }
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        index = 1;
        IniTable guiChannel = f.getTable("GUI Channel " + index + " Parameters");
        while (guiChannel != null) {
            ChannelData channel = new ChannelData();
            channel.gain = DataTools.parseDouble(guiChannel.get("AnalogPMTGain"));
            channel.voltage = DataTools.parseDouble(guiChannel.get("AnalogPMTVoltage"));
            channel.barrierFilter = channel.getFilter(guiChannel.get("BF Name"));
            channel.active = Integer.parseInt(guiChannel.get("CH Activate")) != 0;
            channel.name = guiChannel.get("CH Name");
            channel.dyeName = guiChannel.get("DyeName");
            channel.emissionFilter = channel.getFilter(guiChannel.get("EmissionDM Name"));
            channel.emWave = DataTools.parseDouble(guiChannel.get("EmissionWavelength"));
            channel.excitationFilter = channel.getFilter(guiChannel.get("ExcitationDM Name"));
            channel.exWave = DataTools.parseDouble(guiChannel.get("ExcitationWavelength"));
            channels.add(channel);
            index++;
            guiChannel = f.getTable("GUI Channel " + index + " Parameters");
        }
        index = 1;
        IniTable channel = f.getTable("Channel " + index + " Parameters");
        while (channel != null) {
            String illumination = channel.get("LightType");
            if (illumination != null)
                illumination = illumination.toLowerCase();
            if (illumination == null) {
            // Ignored
            } else if (illumination.indexOf("fluorescence") != -1) {
                illumination = "Epifluorescence";
            } else if (illumination.indexOf("transmitted") != -1) {
                illumination = "Transmitted";
            } else
                illumination = null;
            illuminations.add(illumination);
            index++;
            channel = f.getTable("Channel " + index + " Parameters");
        }
        HashMap<String, String> iniMap = f.flattenIntoHashMap();
        metadata.putAll(iniMap);
    }
    LOGGER.info("Initializing helper readers");
    if (previewNames.size() > 0) {
        final List<String> v = new ArrayList<String>();
        for (int i = 0; i < previewNames.size(); i++) {
            String ss = previewNames.get(i);
            ss = replaceExtension(ss, "pty", "tif");
            if (ss.endsWith(".tif"))
                v.add(ss);
        }
        previewNames = v;
        if (previewNames.size() > 0) {
            core.clear();
            core.add(new CoreMetadata());
            core.add(new CoreMetadata());
            IFDList ifds = null;
            CoreMetadata ms1 = core.get(1);
            for (String previewName : previewNames) {
                RandomAccessInputStream preview = getFile(previewName);
                TiffParser tp = new TiffParser(preview);
                ifds = tp.getIFDs();
                preview.close();
                tp = null;
                ms1.imageCount += ifds.size();
            }
            ms1.sizeX = (int) ifds.get(0).getImageWidth();
            ms1.sizeY = (int) ifds.get(0).getImageLength();
            ms1.sizeZ = 1;
            ms1.sizeT = 1;
            ms1.sizeC = ms1.imageCount;
            ms1.rgb = false;
            int bits = ifds.get(0).getBitsPerSample()[0];
            while ((bits % 8) != 0) bits++;
            bits /= 8;
            ms1.pixelType = FormatTools.pixelTypeFromBytes(bits, false, false);
            ms1.dimensionOrder = "XYCZT";
            ms1.indexed = false;
        }
    }
    CoreMetadata ms0 = core.get(0);
    ms0.imageCount = filenames.size();
    tiffs = new ArrayList<String>(getImageCount());
    thumbReader = new BMPReader();
    if (thumbId != null) {
        thumbId = replaceExtension(thumbId, "pty", "bmp");
        thumbId = sanitizeFile(thumbId, path);
    }
    LOGGER.info("Reading additional metadata");
    // open each INI file (.pty extension) and build list of TIFF files
    String tiffPath = null;
    ms0.dimensionOrder = "XY";
    final Map<String, String> values = new HashMap<String, String>();
    final List<String> baseKeys = new ArrayList<String>();
    for (int i = 0, ii = 0; ii < getImageCount(); i++, ii++) {
        String file = filenames.get(i);
        while (file == null) file = filenames.get(++i);
        file = sanitizeFile(file, path);
        if (file.indexOf(File.separator) != -1) {
            tiffPath = file.substring(0, file.lastIndexOf(File.separator));
        } else
            tiffPath = file;
        Location ptyFile = new Location(file);
        if (!isOIB && !ptyFile.exists()) {
            LOGGER.warn("Could not find .pty file ({}); guessing at the " + "corresponding TIFF file.", file);
            String tiff = replaceExtension(file, "pty", "tif");
            Location tiffFile = new Location(tiff);
            if (tiffFile.exists()) {
                tiffs.add(ii, tiffFile.getAbsolutePath());
                continue;
            } else {
                if (!tiffFile.getParentFile().exists()) {
                    String realOIFName = new Location(currentId).getName();
                    String basePath = tiffFile.getParentFile().getParent();
                    if (mappedOIF) {
                        tiffPath = basePath + File.separator + realOIFName + ".files";
                        ptyFile = new Location(tiffPath, ptyFile.getName());
                        file = ptyFile.getAbsolutePath();
                    } else {
                        Location newFile = new Location(basePath, realOIFName + ".files");
                        ptyFile = new Location(newFile, ptyFile.getName());
                        file = ptyFile.getAbsolutePath();
                        tiffPath = newFile.getAbsolutePath();
                    }
                }
            }
        } else if (!isOIB) {
            file = ptyFile.getAbsolutePath();
        }
        IniList pty = getIniFile(file);
        IniTable fileInfo = pty.getTable("File Info");
        file = sanitizeValue(fileInfo.get("DataName"));
        if (!isPreviewName(file)) {
            while (file.indexOf("GST") != -1) {
                file = removeGST(file);
            }
            if (isOIB) {
                file = tiffPath + File.separator + file;
            } else
                file = new Location(tiffPath, file).getAbsolutePath();
            file = replaceExtension(file, "pty", "tif");
            tiffs.add(ii, file);
        }
        PlaneData plane = new PlaneData();
        for (int dim = 0; dim < NUM_DIMENSIONS; dim++) {
            IniTable axis = pty.getTable("Axis " + dim + " Parameters");
            if (axis == null)
                break;
            boolean addAxis = Integer.parseInt(axis.get("Number")) > 1;
            if (dim == 2) {
                if (addAxis && getDimensionOrder().indexOf('C') == -1) {
                    ms0.dimensionOrder += 'C';
                }
            } else if (dim == 3) {
                if (addAxis && getDimensionOrder().indexOf('Z') == -1) {
                    ms0.dimensionOrder += 'Z';
                }
                final Double number = Double.valueOf(axis.get("AbsPositionValue"));
                plane.positionZ = new Length(number, UNITS.REFERENCEFRAME);
            } else if (dim == 4) {
                if (addAxis && getDimensionOrder().indexOf('T') == -1) {
                    ms0.dimensionOrder += 'T';
                }
                // divide by 1000, as the position is in milliseconds
                // and DeltaT is in seconds
                plane.deltaT = Double.parseDouble(axis.get("AbsPositionValue")) / 1000;
            } else if (dim == 7) {
                try {
                    String xPos = axis.get("AbsPositionValueX");
                    if (xPos != null) {
                        final Double number = Double.valueOf(xPos);
                        plane.positionX = new Length(number, UNITS.REFERENCEFRAME);
                    }
                } catch (NumberFormatException e) {
                }
                try {
                    String yPos = axis.get("AbsPositionValueY");
                    if (yPos != null) {
                        final Double number = Double.valueOf(yPos);
                        plane.positionY = new Length(number, UNITS.REFERENCEFRAME);
                    }
                } catch (NumberFormatException e) {
                }
            }
        }
        ms0.bitsPerPixel = validBits;
        planes.add(plane);
        IniTable acquisition = pty.getTable("Acquisition Parameters Common");
        if (acquisition != null) {
            magnification = acquisition.get("Magnification");
            lensNA = acquisition.get("ObjectiveLens NAValue");
            objectiveName = acquisition.get("ObjectiveLens Name");
            workingDistance = acquisition.get("ObjectiveLens WDValue");
            pinholeSize = acquisition.get("PinholeDiameter");
            String validBitCounts = acquisition.get("ValidBitCounts");
            if (validBitCounts != null) {
                ms0.bitsPerPixel = Integer.parseInt(validBitCounts);
            }
        }
        if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
            for (IniTable table : pty) {
                String[] keys = table.keySet().toArray(new String[table.size()]);
                for (String key : keys) {
                    values.put("Image " + ii + " : " + key, table.get(key));
                    if (!baseKeys.contains(key))
                        baseKeys.add(key);
                }
            }
        }
    }
    for (String key : baseKeys) {
        if (key.equals("DataName") || key.indexOf("FileName") >= 0)
            break;
        boolean equal = true;
        String first = values.get("Image 0 : " + key);
        for (int i = 1; i < getImageCount(); i++) {
            if (!first.equals(values.get("Image " + i + " : " + key))) {
                equal = false;
                break;
            }
        }
        if (equal) {
            addGlobalMeta(key, first);
        } else {
            for (int i = 0; i < getImageCount(); i++) {
                String k = "Image " + i + " : " + key;
                addGlobalMeta(k, values.get(k));
            }
        }
    }
    if (tiffs.size() != getImageCount()) {
        ms0.imageCount = tiffs.size();
    }
    usedFiles = new ArrayList<String>();
    if (tiffPath != null) {
        usedFiles.add(isOIB ? id : oifName);
        if (!isOIB) {
            Location dir = new Location(tiffPath);
            if (!mappedOIF && !dir.exists()) {
                throw new FormatException("Required directory " + tiffPath + " was not found.");
            }
            String[] list = mappedOIF ? Location.getIdMap().keySet().toArray(new String[0]) : dir.list(true);
            for (int i = 0; i < list.length; i++) {
                if (mappedOIF)
                    usedFiles.add(list[i]);
                else {
                    String p = new Location(tiffPath, list[i]).getAbsolutePath();
                    String check = p.toLowerCase();
                    if (!check.endsWith(".tif") && !check.endsWith(".pty") && !check.endsWith(".roi") && !check.endsWith(".lut") && !check.endsWith(".bmp")) {
                        continue;
                    }
                    usedFiles.add(p);
                }
            }
        }
    }
    LOGGER.info("Populating metadata");
    // calculate axis sizes
    int realChannels = 0;
    for (int i = 0; i < NUM_DIMENSIONS; i++) {
        int ss = Integer.parseInt(size[i]);
        if (pixelSize[i] == null)
            pixelSize[i] = 1.0;
        if (code[i].equals("X"))
            ms0.sizeX = ss;
        else if (code[i].equals("Y") && ss > 1)
            ms0.sizeY = ss;
        else if (code[i].equals("Z")) {
            if (getSizeY() == 0) {
                ms0.sizeY = ss;
            } else {
                ms0.sizeZ = ss;
                // Z size stored in nm
                pixelSizeZ = Math.abs((pixelSize[i].doubleValue() / (getSizeZ() - 1)) / 1000);
            }
        } else if (code[i].equals("T")) {
            if (getSizeY() == 0) {
                ms0.sizeY = ss;
            } else {
                ms0.sizeT = ss;
                pixelSizeT = Math.abs((pixelSize[i].doubleValue() / (getSizeT() - 1)) / 1000);
            }
        } else if (ss > 0) {
            if (getSizeC() == 0)
                ms0.sizeC = ss;
            else
                ms0.sizeC *= ss;
            if (code[i].equals("C"))
                realChannels = ss;
        }
    }
    if (getSizeZ() == 0)
        ms0.sizeZ = 1;
    if (getSizeC() == 0)
        ms0.sizeC = 1;
    if (getSizeT() == 0)
        ms0.sizeT = 1;
    if (getImageCount() == getSizeC() && getSizeY() == 1) {
        ms0.imageCount *= getSizeZ() * getSizeT();
    } else if (getImageCount() == getSizeC()) {
        ms0.sizeZ = 1;
        ms0.sizeT = 1;
    }
    if (getSizeZ() * getSizeT() * getSizeC() != getImageCount()) {
        int diff = (getSizeZ() * getSizeC() * getSizeT()) - getImageCount();
        if (diff == previewNames.size() || diff < 0) {
            diff /= getSizeC();
            if (getSizeT() > 1 && getSizeZ() == 1)
                ms0.sizeT -= diff;
            else if (getSizeZ() > 1 && getSizeT() == 1)
                ms0.sizeZ -= diff;
        } else
            ms0.imageCount += diff;
    }
    if (getSizeC() > 1 && getSizeZ() == 1 && getSizeT() == 1) {
        if (getDimensionOrder().indexOf('C') == -1)
            ms0.dimensionOrder += 'C';
    }
    if (getDimensionOrder().indexOf('Z') == -1)
        ms0.dimensionOrder += 'Z';
    if (getDimensionOrder().indexOf('C') == -1)
        ms0.dimensionOrder += 'C';
    if (getDimensionOrder().indexOf('T') == -1)
        ms0.dimensionOrder += 'T';
    ms0.pixelType = FormatTools.pixelTypeFromBytes(imageDepth, false, false);
    try {
        RandomAccessInputStream thumb = getFile(thumbId);
        byte[] b = new byte[(int) thumb.length()];
        thumb.read(b);
        thumb.close();
        Location.mapFile("thumbnail.bmp", new ByteArrayHandle(b));
        thumbReader.setId("thumbnail.bmp");
        for (int i = 0; i < getSeriesCount(); i++) {
            core.get(i).thumbSizeX = thumbReader.getSizeX();
            core.get(i).thumbSizeY = thumbReader.getSizeY();
        }
        thumbReader.close();
        Location.mapFile("thumbnail.bmp", null);
    } catch (IOException e) {
        LOGGER.debug("Could not read thumbnail", e);
    } catch (FormatException e) {
        LOGGER.debug("Could not read thumbnail", e);
    }
    // initialize lookup table
    lut = new short[getSizeC()][3][65536];
    byte[] buffer = new byte[65536 * 4];
    int count = (int) Math.min(getSizeC(), lutNames.size());
    for (int c = 0; c < count; c++) {
        Exception exc = null;
        try {
            RandomAccessInputStream stream = getFile(lutNames.get(c));
            stream.seek(stream.length() - 65536 * 4);
            stream.read(buffer);
            stream.close();
            for (int q = 0; q < buffer.length; q += 4) {
                lut[c][0][q / 4] = (short) ((buffer[q + 2] & 0xff) * 257);
                lut[c][1][q / 4] = (short) ((buffer[q + 1] & 0xff) * 257);
                lut[c][2][q / 4] = (short) ((buffer[q] & 0xff) * 257);
            }
        } catch (IOException e) {
            exc = e;
        } catch (FormatException e) {
            exc = e;
        }
        if (exc != null) {
            LOGGER.debug("Could not read LUT", exc);
            lut = null;
            break;
        }
    }
    for (int i = 0; i < getSeriesCount(); i++) {
        CoreMetadata ms = core.get(i);
        ms.rgb = false;
        ms.littleEndian = true;
        ms.interleaved = false;
        ms.metadataComplete = true;
        ms.indexed = lut != null;
        ms.falseColor = true;
        int nFiles = i == 0 ? tiffs.size() : previewNames.size();
        for (int file = 0; file < nFiles; file++) {
            RandomAccessInputStream plane = getFile(i == 0 ? tiffs.get(file) : previewNames.get(file));
            if (plane == null) {
                ifds.add(null);
                continue;
            }
            try {
                TiffParser tp = new TiffParser(plane);
                IFDList ifd = tp.getIFDs();
                ifds.add(ifd);
            } finally {
                plane.close();
            }
        }
    }
    // populate MetadataStore
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this, true);
    if (creationDate != null) {
        creationDate = creationDate.replaceAll("'", "");
        creationDate = DateTools.formatDate(creationDate, DATE_FORMAT);
    }
    for (int i = 0; i < getSeriesCount(); i++) {
        // populate Image data
        store.setImageName("Series " + (i + 1), i);
        if (creationDate != null)
            store.setImageAcquisitionDate(new Timestamp(creationDate), i);
    }
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        populateMetadataStore(store, path);
    }
}
Also used : IniList(loci.common.IniList) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Timestamp(ome.xml.model.primitives.Timestamp) IOException(java.io.IOException) TreeMap(java.util.TreeMap) CoreMetadata(loci.formats.CoreMetadata) FormatException(loci.formats.FormatException) DependencyException(loci.common.services.DependencyException) FormatException(loci.formats.FormatException) IOException(java.io.IOException) NonNegativeInteger(ome.xml.model.primitives.NonNegativeInteger) MetadataStore(loci.formats.meta.MetadataStore) Length(ome.units.quantity.Length) IniTable(loci.common.IniTable) IFDList(loci.formats.tiff.IFDList) TiffParser(loci.formats.tiff.TiffParser) RandomAccessInputStream(loci.common.RandomAccessInputStream) ByteArrayHandle(loci.common.ByteArrayHandle) File(java.io.File) Location(loci.common.Location)

Example 58 with MetadataStore

use of loci.formats.meta.MetadataStore in project bioformats by openmicroscopy.

the class DNGReader method initFile.

// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
    super.initFile(id);
    original = ifds.get(0);
    if (cfaPattern != null) {
        original.putIFDValue(IFD.COLOR_MAP, (int[]) cfaPattern);
    }
    ifds.set(0, original);
    CoreMetadata m = core.get(0);
    m.imageCount = 1;
    m.sizeT = 1;
    if (ifds.get(0).getSamplesPerPixel() == 1) {
        m.interleaved = true;
    }
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) CoreMetadata(loci.formats.CoreMetadata)

Example 59 with MetadataStore

use of loci.formats.meta.MetadataStore in project bioformats by openmicroscopy.

the class BioRadGelReader 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);
    String check = in.readString(48);
    if (check.indexOf("Intel Format") != -1) {
        in.order(true);
    }
    in.seek(START_OFFSET);
    boolean codeFound = false;
    int skip = 0;
    long baseFP = 0;
    while (!codeFound) {
        short code = in.readShort();
        if (code == 0x81)
            codeFound = true;
        short length = in.readShort();
        in.skipBytes(2 + 2 * length);
        if (codeFound) {
            baseFP = in.getFilePointer() + 2;
            if (length > 1) {
                in.seek(in.getFilePointer() - 2);
            }
            skip = in.readInt() - 32;
        } else {
            if (length == 1)
                in.skipBytes(12);
            else if (length == 2)
                in.skipBytes(10);
        }
    }
    diff = BASE_OFFSET - baseFP;
    skip += diff;
    double physicalWidth = 0d, physicalHeight = 0d;
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        if (baseFP + skip - 8187 > 0) {
            in.seek(baseFP + skip - 8187);
            String scannerName = in.readCString();
            in.skipBytes(8);
            in.readCString();
            in.skipBytes(8);
            String imageArea = in.readCString();
            imageArea = imageArea.substring(imageArea.indexOf(':') + 1).trim();
            int xIndex = imageArea.indexOf('x');
            if (xIndex > 0) {
                int space = imageArea.indexOf(' ');
                if (space >= 0) {
                    String width = imageArea.substring(1, space);
                    int nextSpace = imageArea.indexOf(" ", xIndex + 2);
                    if (nextSpace > xIndex) {
                        String height = imageArea.substring(xIndex + 1, nextSpace);
                        physicalWidth = Double.parseDouble(width.trim()) * 1000;
                        physicalHeight = Double.parseDouble(height.trim()) * 1000;
                    }
                }
            }
        }
    }
    in.seek(baseFP + skip - 298);
    String date = in.readString(17);
    date = DateTools.formatDate(date, "dd-MMM-yyyy HH:mm");
    in.skipBytes(73);
    String scannerName = in.readCString();
    addGlobalMeta("Scanner name", scannerName);
    in.seek(baseFP + skip);
    CoreMetadata m = core.get(0);
    m.sizeX = in.readShort() & 0xffff;
    m.sizeY = in.readShort() & 0xffff;
    if (getSizeX() * getSizeY() > in.length()) {
        in.order(true);
        in.seek(in.getFilePointer() - 4);
        m.sizeX = in.readShort();
        m.sizeY = in.readShort();
    }
    in.skipBytes(2);
    int bpp = in.readShort();
    m.pixelType = FormatTools.pixelTypeFromBytes(bpp, false, false);
    offset = in.getFilePointer();
    m.sizeZ = 1;
    m.sizeC = 1;
    m.sizeT = 1;
    m.imageCount = 1;
    m.dimensionOrder = "XYCZT";
    m.rgb = false;
    m.interleaved = false;
    m.indexed = false;
    m.littleEndian = in.isLittleEndian();
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this);
    if (date != null) {
        store.setImageAcquisitionDate(new Timestamp(date), 0);
    }
    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
        Length sizeX = FormatTools.getPhysicalSizeX(physicalWidth / getSizeX());
        Length sizeY = FormatTools.getPhysicalSizeY(physicalHeight / getSizeY());
        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) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata) Timestamp(ome.xml.model.primitives.Timestamp)

Example 60 with MetadataStore

use of loci.formats.meta.MetadataStore in project bioformats by openmicroscopy.

the class BioRadSCNReader 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);
    String line = in.readLine();
    String currentBoundary = "";
    String currentType = "";
    int currentLength = 0;
    ArrayList<String> xml = new ArrayList<String>();
    while (in.getFilePointer() < in.length() && line != null) {
        line = line.trim();
        if (line.startsWith("Content-Type")) {
            currentType = line.substring(line.indexOf(' ') + 1);
            int boundary = currentType.indexOf("boundary");
            if (boundary > 0) {
                currentBoundary = currentType.substring(boundary + 10, currentType.length() - 1);
            }
            if (currentType.indexOf(';') > 0) {
                currentType = currentType.substring(0, currentType.indexOf(';'));
            }
        } else if (line.equals("--" + currentBoundary)) {
            currentLength = 0;
        } else if (line.startsWith("Content-Length")) {
            currentLength = Integer.parseInt(line.substring(line.indexOf(' ') + 1));
        } else if (line.length() == 0) {
            if (currentType.equals("application/octet-stream")) {
                pixelsOffset = in.getFilePointer();
                in.skipBytes(currentLength);
            } else if (currentType.equals("text/xml")) {
                String xmlBlock = in.readString(currentLength);
                xml.add(xmlBlock);
            }
        }
        line = in.readLine();
    }
    SCNHandler handler = new SCNHandler();
    for (String block : xml) {
        XMLTools.parseXML(block, handler);
    }
    m.sizeZ = 1;
    m.sizeT = 1;
    m.imageCount = 1;
    m.dimensionOrder = "XYCZT";
    MetadataStore store = makeFilterMetadata();
    MetadataTools.populatePixels(store, this, exposureTime != null);
    store.setInstrumentID(MetadataTools.createLSID("Instrument", 0), 0);
    if (serialNumber != null) {
        store.setMicroscopeSerialNumber(serialNumber, 0);
    }
    if (model != null) {
        store.setMicroscopeModel(model, 0);
    }
    if (imageName != null) {
        store.setImageName(imageName, 0);
    }
    if (acquisitionDate != null) {
        store.setImageAcquisitionDate(new Timestamp(acquisitionDate), 0);
    }
    if (gain != null || binning != null) {
        String detector = MetadataTools.createLSID("Detector", 0, 0);
        store.setDetectorID(detector, 0, 0);
        store.setDetectorSettingsID(detector, 0, 0);
    }
    if (gain != null) {
        store.setDetectorSettingsGain(gain, 0, 0);
    }
    if (binning != null) {
        store.setDetectorSettingsBinning(getBinning(binning), 0, 0);
    }
    if (exposureTime != null) {
        store.setPlaneExposureTime(new Time(exposureTime, UNITS.SECOND), 0, 0);
    }
    if (physicalSizeX != null) {
        store.setPixelsPhysicalSizeX(FormatTools.createLength(physicalSizeX, UNITS.MICROMETER), 0);
    }
    if (physicalSizeY != null) {
        store.setPixelsPhysicalSizeY(FormatTools.createLength(physicalSizeY, UNITS.MICROMETER), 0);
    }
}
Also used : MetadataStore(loci.formats.meta.MetadataStore) ArrayList(java.util.ArrayList) Time(ome.units.quantity.Time) RandomAccessInputStream(loci.common.RandomAccessInputStream) CoreMetadata(loci.formats.CoreMetadata) Timestamp(ome.xml.model.primitives.Timestamp)

Aggregations

MetadataStore (loci.formats.meta.MetadataStore)180 CoreMetadata (loci.formats.CoreMetadata)130 RandomAccessInputStream (loci.common.RandomAccessInputStream)97 Length (ome.units.quantity.Length)82 FormatException (loci.formats.FormatException)66 Timestamp (ome.xml.model.primitives.Timestamp)54 Location (loci.common.Location)51 Time (ome.units.quantity.Time)41 ArrayList (java.util.ArrayList)34 IFD (loci.formats.tiff.IFD)21 DependencyException (loci.common.services.DependencyException)16 IOException (java.io.IOException)15 TiffParser (loci.formats.tiff.TiffParser)15 NonNegativeInteger (ome.xml.model.primitives.NonNegativeInteger)15 ServiceFactory (loci.common.services.ServiceFactory)14 PositiveInteger (ome.xml.model.primitives.PositiveInteger)13 IFDList (loci.formats.tiff.IFDList)12 MetadataRetrieve (loci.formats.meta.MetadataRetrieve)11 ServiceException (loci.common.services.ServiceException)10 Map (java.util.Map)9