Skip to content

Molecular Devices ImageXpress / MetaXpress plates

Molecular Devices ImageXpress screening systems, run by MetaXpress (earlier MetaMorph), save a plate as a folder of TIFF images, usually with an .HTD plate description. OpenReadout reads the plate into the shared plate model (hcs.md): wells, sites, channels, time points and Z planes with their pixel data and calibration. Derived from public plates written by MetaMorph 6.2 and MetaXpress 6.6, checked against the HTD parsed as text, tifffile on every plane file, and Bio-Formats 8.5.0 run as a black box. Format id imagexpress, crate openreadout-hcs (module imagexpress). Provenance: docs/provenance/imagexpress.md. Every name below is ours.

A MetaXpress plate is a folder of TIFFs named <plate>_<well>[_s<site>][_w<wave>][<GUID>].tif (thumbnails add _thumb), usually with an .HTD plate description; time points and Z planes may sit in TimePoint_<t>/ and ZStep_<z>/ sub-folders. Open the .HTD or the folder. A folder without HTD is read from the file names alone: its wells, sites and wavelengths are what is on disk, so missing planes cannot be detected.

Detection. A folder holding an HTD (or whose TimePoint_1/ holds one) is an ImageXpress plate (definite). A folder without HTD is claimed (likely) only on positive evidence: (1) the folder is not one another reader owns, by its name (.oif.files, .oib.files, *.files, .d/.D, .raw, .fid, .zarr, .wiff.scan) or by a marker file in it (a MetaMorph .nd, an Olympus .oif/.oib/.oir, Micro-Manager metadata.txt/*_metadata.txt/DisplaySettings.json, a CellVoyager MeasurementData.mlf, a Harmony Index.*.xml, .companion.ome, .xdce, .vsi); (2) at least two non-thumbnail plane files share one plate prefix and spell the well as MetaXpress does (row letters and a two-digit column: A01, not C001); (3) the first of them carries MetaMorph metadata (MetaSeries <MetaData> XML in its ImageDescription, or the STK UIC1 tag). Olympus FluoView s_C001.tif channel files, for example, parse as prefix s and well C1 but fail all three. The corpus test detect_matches_manifest (crates/openreadout-corpus-tests/tests/detect.rs) checks every folder of the development corpus.

HTD (text: quoted key, comma-separated values; "HTSInfoFile", Version 1.0 first, "EndFile" last)

key our use
HTSInfoFile format_version (HTSInfoFile 1.0)
Description plate name / description (bytes decoded as UTF-8, invalid bytes replaced)
PlateType plate.extra.plate_type_code (a number; meaning not known)
XWells, YWells columns, rows
WellsSelection<row> TRUE/FALSE per column: the wells expected (declared_wells)
Sites, XSites, YSites, SiteSelection<row> sites per well: the number of TRUE cells, numbered 1.. in reading order (inferred from files named _s1…_s4 for 4 selected cells); plate.extra.sites, site_grid
Waves, NWavelengths, WaveName<w>, WaveCollect<w> channels: wavelengths 1..N, named by WaveName, left out when WaveCollect is 0
TimePoints T
ZSeries, ZSteps, ZProjection Z (ZStep_<z> folders); plate.extra.z_projection
UniquePlateIdentifier plate.extra.unique_plate_identifier

Every expected plane (selected wells x sites x collected waves x Z x T) whose file is not found is missing; files outside the expectation are included with a note.

Plane files

Parsed right to left: extension, then a trailing GUID (36 characters, or _[GUID]), _thumb, _w<n>, _s<n>, _<well>; the rest is the plate prefix (the HTD’s file stem; without HTD, the most common prefix). One plane file per wavelength is opened in info for its MetaMorph metadata (the TIFF crate decodes both conventions, docs/formats/tiff.md § MetaMorph):

source (MetaSeries XML / STK tags) our field
_IllumSetting_ / image-name / STK name channel name when the HTD has no WaveName; plate.extra.channels[].illumination_setting
wavelength / STK wavelength emission_nm (the recorded wavelength; which side of the filter it describes is not documented: inferred)
spatial-calibration-x/y (µm, when calibration is on) / STK calibration in um physical_size
_MagSetting_, _MagNA_ objective.model (20X Plan Apo Lambda), nominal_magnification (the leading number of the setting), lens_na
Exposure: <n> ms in the description exposure_ms
stage-position-x/y, z-position / STK stage and absolute Z frames[].stage_*_um (read per plane by frames)
acquisition-time-local frames[].acquired_at (local time, no zone)
ApplicationName/ApplicationVersion, Software Version: line, TIFF Software instrument.software
Barcode: line plate id (else the HTD stem, else the file prefix)
Plate Name: line plate name
Instrument Serial Number plate.extra.instrument_serial, experiment.instrument.serial

Vocabulary (module imagexpress)

our name meaning
IMAGEXPRESS_FORMAT_ID imagexpress
looks_like_htd, find_htd detection; the HTD of a folder (or of its TimePoint_1/)
plate_folder_without_htd detection of a plate folder without HTD (see § Detection); the number of plane files seen
Htd (entries, get, values, uint, flag), parse_htd the parsed HTD: (key, values) in file order
IxName (prefix, row, column, site, wave, thumb), parse_name a plane file name taken apart
plane_meta per-plane time, stage position and exposure of one plane file (for frames)
PlaneMeta what plane_meta returns: acquisition time, stage X/Y/Z (µm), exposure (ms)
parse an HTD or a folder into an HcsPlate

Validation (2026-09-24)

corpus id plate ours vs oracle
hcs-imagexpress-idr0081-htd 384 wells, no sites, 2 wavelengths (DAPI, FITC), 2048 x 2048, 1.72 µm; partial copy 3 planes bit-exact vs tifffile; 765 missing reported; Bio-Formats 3/3 planes equal, 384 series mapped
hcs-imagexpress-jump-a1170383-folder folder without HTD, well A01, 2 sites, 5 wavelengths (Cy5, Texas Red, Cy3, FITC, DAPI), 0.7032 µm 10 planes bit-exact vs tifffile; channel names and pixel size equal to tifffile’s MetaSeries parse; no Bio-Formats comparison (it needs the HTD)

How this reader was derived, file by file: provenance log.