Olympus FluoView OIF / OIB
Olympus FluoView (FV1000 and FV1200 confocal systems) saves an acquisition as an OIB file (one compound file) or an OIF file (a settings file next to a folder of TIFF planes). OpenReadout returns the image with its channels, Z and time planes, pixel sizes, instrument and scan settings, and the thumbnail. Derived from hex dumps and settings-text listings of public data sets (FluoView 4.2), the documentation and source of oiffile (BSD-3-Clause), and black-box comparison with Bio-Formats 8.5.0; Bio-Formats and oiffile are the reference readers. No Olympus/Evident specification or SDK was used. Provenance: docs/provenance/oif.md. Format ids oib and oif, crate openreadout-oif. Every name below is ours.
Containers (store.rs)
FluoView writes one acquisition as a set of files; two containers hold the same set:
- OIF: a main settings file
<name>.oifplus a folder<name>.oif.filesnext to it holding everything else (plane TIFFs,.ptyproperty files,.lutLUTs,.roiROIs, as_Thumb.bmpthumbnail with its.pty). Detection: the.oifextension and a settings-text start (FF FE 5B 00, UTF-16LE[, or a UTF-8[) → definite. - OIB: an OLE2 compound file (Microsoft’s public [MS-CFB], signature
D0 CF 11 E0 A1 B1 1A E1, read withopenreadout_core::cfb). Streams are namedStreamNNNNN; the files of the data folder sit in a storageStorage00001. A root streamOibInfo.txt(settings text) maps names: section[OibSaveInfo]holdsMainFileName=StreamNNNNN(the stream holding the.oiffile),StorageNNNNN=<name>.oif.files, and oneStreamNNNNN=Storage00001/<file name>line per member (Stream00010=Spleenx20.oif,Stream00001=Storage00001/s_C001.tif, …), plusVersion,Compression(Nonein every corpus file),FileCount,FolderCount,ThumbFolderName,ThumbFileName. Detection: the.oibextension and the compound-file signature → definite.
Both are opened as a Store: the parsed main settings (main, main_name), OibInfo.txt (oib_info, OIB only), and the members by lower-case file name, each a Member with its name, size and source (MemberSource::Stream for a compound-file stream, MemberSource::File for a file in the folder). problems lists what is missing (a stream OibInfo.txt names that does not exist, the .oif.files folder).
Settings files (settings.rs)
Every metadata file (.oif, .pty, OibInfo.txt, .roi, .lut) is INI-style text: UTF-16LE with a byte-order mark in every corpus file (UTF-8 accepted when the file starts with [), [Section] lines and Key=Value lines, CR LF line ends. Values are unquoted numbers, "double-quoted" or 'single-quoted' text. .lut files end with a binary [ColorLUTData] tail (after the UTF-16 line [ColorLUTData]\r\n), which is cut off and counted (lut_bytes).
Settings::parse → sections of Section { name, entries } in file order; raw, text (unquoted, empty → none), number, section, to_json (the whole file as {section: {key: value}} with integers, floats and text typed the way they are written, used for vendor), unquote, MAX_SETTINGS_BYTES (16 MiB bound).
Decimal comma. Corpus file zenodo7080902 (the “does not open in ImageJ” test file) holds WidthConvertValue=0,207.0 and EndPosition=211,761.0: numbers written with a decimal comma and a spurious .0. number reads <digits>,<digits>[.0] as <digits>.<digits> (0.207, 211.761); consistent with 1023 × 0.207 = 211.761 and with Bio-Formats’ 0.207 µm (inferred).
Main settings (<name>.oif)
Sections and keys we use (all others are kept in vendor.main):
| section | key | use |
|---|---|---|
Axis Parameter Common |
AxisOrder (XYCZ, XYCT, XYCL, XTC, …) |
extra.axis_order; dimension_order (lambda counts as C; missing axes appended in C, Z, T order) |
Axis n Parameters Common (n = 0..8) |
AxisCode (X, Y, C, Z, T, A, L, P, Q), MaxSize, StartPosition, EndPosition, Interval, PixUnit |
Z step = Interval of the Z axis in PixUnit (nm → µm) when size_z > 1; lambda bands from the L axis (below); the axis numbers of T and Z locate the per-plane positions in .pty files |
Channel n Parameters |
CH Name, DyeName, ExcitationWavelength, EmissionWavelength, LightType |
channel n (the C number of the plane file names): name, fluorophore (None dropped), excitation_nm, emission_nm (0 dropped), acquisition_mode |
Acquisition Parameters Common |
ImageCaputreDate (sic), ImageCaputreDate+MilliSec, ScanMode, Acquisition Device |
acquired_at (local time, no zone; a note says so), extra.scan_mode, instrument model fallback |
Reference Image Parameter |
WidthConvertValue, HeightConvertValue, WidthUnit, HeightUnit, ValidBitCounts |
pixel size fallback when a plane has no .pty; extra.bits_significant fallback |
File Info |
DataName |
image name |
Version Info |
SystemName (FLUOVIEW FV1000), SystemVersion, FileVersion |
instrument.model, instrument.software_version, format_version |
ProfileSaveInfo |
Version, PtyFileName*, LutFileName*, RoiFileName*, ReferenceFrameCount |
format_version fallback; vendor |
Plane files and images (dataset.rs)
Each plane is one TIFF (TIFF 6.0; decoded by openreadout-tiff, from memory for OIB via TiffFile::from_bytes): 16-bit grey in every corpus file, uncompressed or LZW, one strip per few rows, one page. Its name carries the plane’s indices: s_ prefix, then axis letters each followed by a one-based number, e.g. s_C001Z002T003.tif, s_C001L012.tif, s_C001T044.tif; reference images of line scans carry a -R### suffix (s_C001-R001.tif). This convention is documented by oiffile (its series groups TIFF names by their letters and orders them by the numbers) and holds in every corpus file. parse_plane_name → PlaneName { axes, reference }; names without indices (s_Thumb.tif if present) are listed, not exposed.
Files are grouped into images by (reference mark, axis letters, values of unmapped letters): main acquisitions first, then reference images (extra.kind = "reference", name <DataName> [reference]). Within an image the distinct numbers of each axis, sorted, become the ordinals; the letters map as AXIS_CHANNEL (C), AXIS_Z (Z), AXIS_TIME (T) and AXIS_LAMBDA (L, folded into C channel-major: c = channel ordinal × n_lambda + lambda ordinal, as for OIR); any other letter makes its own image (extra.other_indices; inferred, no corpus file). REFERENCE_MARK is R. Geometry and sample type come from the first plane’s TIFF header; every plane is checked against it when read.
Lambda scans (ScanMode="XYL"): band i (1-based L number) starts at StartPosition + (i − 1) × Interval of the L axis and is Resolution nm wide (Interval when absent): emission_range_nm = [lo, lo + width], emission_nm its centre; extra.lambda_index lists the L numbers. Corpus: 420–550 nm in 25 bands of 10 nm every 5 nm, matching the file name 420-550.
Line scans (ScanMode="XT", AxisOrder="XTC"): each plane TIFF is X × lines (228 × 10000); rows are successive lines in time (the plane’s .pty gives HeightUnit="ms"), so no Y pixel size is reported; the reference images (s_C00n-R00n.tif, 256 × 256) are the overview frame the line was drawn on.
Plane property files (.pty)
One per plane (s_C001Z002.pty next to s_C001Z002.tif), settings text:
| section | key | use |
|---|---|---|
Image Parameters |
WidthConvertValue, WidthUnit, HeightConvertValue, HeightUnit, ValidBitCounts, ImageGroup (Normal, Reference) |
pixel size x/y when the unit is a length (um), extra.bits_significant |
Acquisition Parameters Common |
ObjectiveLens Name, Magnification, ObjectiveLens NAValue (9999 = unset), Time Per Line, Time Per Pixel (µs), PMTVoltage |
objective (name whitespace collapsed), extra.line_time_us, extra.pixel_dwell_us, frame detector_voltage |
Axis n Parameters |
AbsPositionValue of the T axis (ms since the start) and of the Z axis (nm) |
frame delta_t_s, stage_z_um; time_increment_s = (last − first time) / (T − 1) from the first channel and z |
Normalized model
size_x/size_y, pixel_type, samples_per_pixel from the TIFF; size_c/z/t from the plane names; physical_size from the first plane’s .pty (else the main file); instrument = Olympus / FluoView / SystemName / SystemVersion; extra: axis_order, scan_mode, bits_significant, compression (TIFF compression of the first plane), line_time_us, pixel_dwell_us, kind, lambda_index, other_indices. vendor (info --view full): main_file, main (the main settings), oib_info, first_plane_properties. Frames (info --view full): c, z, t, file, delta_t_s, stage_z_um, detector_voltage. Attachment #0: the thumbnail BMP (s_Thumb.bmp). info --view structure lists planes, the main settings file and every other member (properties, roi, lut, thumbnail).
Differences from Bio-Formats (black-box observations): Bio-Formats reports the X pixel size as Y for line scans; its minimal-metadata mode (-nometa) reports no physical sizes.
check finding codes
| code | severity | meaning |
|---|---|---|
container |
error | a stream named in OibInfo.txt is missing, the compound file is damaged, or the .oif.files folder is missing |
planes |
error | no plane files, or (c, z, t) positions without exactly one plane file |
truncated |
error | a plane TIFF does not parse or decode completely (truncated stream or file) |
geometry |
error | a plane’s size differs from the image’s |
unsupported |
warning | a plane uses a TIFF feature the TIFF reader does not decode |
properties |
warning | a plane has no .pty file |
A truncated OIB whose directory or main settings are unreachable fails to open with exit 4.
Vocabulary (every public identifier in openreadout-oif/src must appear here)
| identifier | meaning |
|---|---|
OibReader, OifReader, OIB_FORMAT_ID, OIF_FORMAT_ID, looks_like_settings |
the two readers, their ids oib and oif, settings-text detection |
FvDataset, open, store, images, files |
an opened data set, open, its container, its images, the files it is made of |
FvImage, info, reference, planes, duplicates |
one image: normalized info, reference-image flag, (c, z, t) → plane file name, repeated indices |
PlaneName, axes, parse_plane_name, AXIS_CHANNEL, AXIS_Z, AXIS_TIME, AXIS_LAMBDA, REFERENCE_MARK |
plane file names and their axis letters |
dimension_order, fluoview_date |
AxisOrder → XYCZT-style order; FluoView date → ISO-8601 local time |
Store, StoreKind (Oib, Oif), format_id, kind, path, main, main_name, oib_info, members, member, problems, read, settings, label |
the container (above) |
Member, MemberSource (Stream, File), name, size, source |
one file of the set |
Settings, Section, sections, entries, lut_bytes, parse, section, raw, text, number, to_json, unquote, MAX_SETTINGS_BYTES |
settings text (above) |
How this reader was derived, file by file: provenance log.