Changelog
[v0.8.0]
Migration to ome-zarr-converters-tools v1 and ngio 1.1, plus a rework of the Yokogawa
converters. Written OME-Zarr output is unchanged for Operetta, ScanR, ImageXpress and
CustomTiff; Yokogawa plates change in channel labels, plate suffixes and vendor metadata.
Features
- Sharded OME-Zarr output:
Converter Options → OME-Zarr Options → Sharding Strategy(Multiple of Chunksgroups a fixed number of chunks per axis into one shard). RequiresNgff Version"0.5". Available in every task viaome-zarr-converters-tools1.1.0. - The Dask writer modes stream the image block by block instead of materialising it first,
so peak memory no longer scales with the image size (
ome-zarr-converters-tools1.1.0). - Conversion errors name the image, tile and source file they concern, with the expected
and actual values (
ome-zarr-converters-tools1.1.1). - Yokogawa (CQ3K, CellVoyager): channel labels, wavelength ids (
A{action}_C{channel}) and colours are now read from the acquisition's.mesprotocol file (#27). - Yokogawa (CQ3K, CellVoyager):
advanced.channelsentries carry aChannel Key(thebts:Chchannel number), so channels the protocol declares but the acquisition never used need no placeholder entry; an acquired channel left without an entry is reported as a warning. - New
z_processingacquisition option on CQ3K, CellVoyager and MD ImageXpress, selecting which Z-image processing outputs to convert without resorting to a path regex filter. - Yokogawa (CQ3K, CellVoyager): the acquisition's
.mlf,.mrf,.mes,.wpiand.wppare copied verbatim into<plate>.zarr/metadata/, so the vendor metadata the converters do not model travels with the converted plate (#46).
API Breaking Changes
- Yokogawa
advanced.channelsentries now carry a requiredChannel Key(thebts:Chnumber) and override only that channel; the positional, full-length list is no longer accepted, andAdvancedisYokogawaAcquisitionOptionswithYokogawaChannelInfoUIentries. - CellVoyager acquisitions tagged
bts:ZImageProcessingnow split into one plate per algorithm (_MIP/_MinIP/_SIP), with the samez_processingselection as CQ3K; the attribute was previously dropped, overlapping the tiles of both plates. z_processingis now a top-level acquisition field on CQ3K, CellVoyager and MD ImageXpress instead of an advanced option, sharing oneZ Processing Selectionshape per converter; the Yokogawa switchZ slicesis renamedRaw.- MD ImageXpress
advanced.convert_only_projectionsis removed in favour ofz_processing, whereMIPreadsexperimentandRawprefersexperiment_z_stack; the two cannot be enabled together, since MD reads a single source directory. - Yokogawa default channel labels are no longer
channel_Nbut the.meschannel target, falling back to the wavelength id when no.mesis available. Withreindex_channelsdisabled, instrument channels the acquisition did not use are now written as empty planes. - CQ3K projection plates are now suffixed
_MIP/_MinIP/_SIPinstead of the rawbts:ZImageProcessingvalues_Maximum/_Minimum/_Sum; an unrecognised value is still used verbatim (#45). fractal_uzh_converters.{cq3k,cellvoyager}move tofractal_uzh_converters.yokogawa.{cq3k,cellvoyager}, which unifies the two behind one shared parser. Package-root imports are unchanged; the old submodule paths are not.- CustomTiff
acquisition_details.tomlkeys renamed (follows the v1 field renames):pixelsize→xy_pixel_size,start_z_coo/start_t_coo→start_z_space/start_t_space(and any other*_coo→*_space). Existing useracquisition_details.tomlfiles must be updated. Seedocs/converters/custom_tiff.md. Advancedis now the last acquisition field in all seven converters instead of the second.- Require
ome-zarr-converters-tools[s3]>=1.1.1,<2.0.0andngio>=1.1.2. The[s3]extra is now mandatory because v1 makess3fsoptional ands3://inputs must keep working. Thengiofloor is 1.1.2 because earlier 1.1.x releases could silently lose pixels in Dask writes (fixed upstream inngio1.1.2, required byome-zarr-converters-tools1.1.0).
Fix
- All converters: strip whitespace from channel labels and wavelength ids — ngio treats
"DAPI"and"DAPI "as two distinct channels, so a stray space silently broke per-name channel matching downstream. - Yokogawa: the tile channel index is now 0-based like the Z and time indices, so an
advanced.channelsoverride no longer fails with a channel-index validation error (#27). - Yokogawa: build one
AcquisitionDetailsper plate rather than per field of view, so fields merged into a single image cannot disagree on it. - Yokogawa: each well's
bts:TimePointvalues map onto a dense 0-based time axis; the raw value counts timelines, so it left leading frames empty. - Yokogawa: a
bts:Type="ERR"record no longer makes the whole.mlfunparsable. Such records are skipped, with one warning per acquisition (#41). - Yokogawa: warn when the
.mrfchannels disagree on pixel size or frame size — channel 1's geometry is applied to all of them. - CQ3K: a single-record
.mlfnow converts, and unknownbts:attributes are ignored rather than rejected. Both already held on CellVoyager. - ScanR, Operetta:
pathaccepts a Windows-style...\data/...\Imagesdirectory; the trailing component is stripped the same way on every host (#58). - ImageXpress:
pathgiven as the.mxprotocolfile now works fors3://URLs and Windows paths — the oldpathlibstrip mangled both. - Bug in extended testing using the wrong api
- Fix typo in the conversion log message (
Successfully).
Chores
- All converters: what a converter reports about the input data is now a
warnings.warnunder aConverterWarninghierarchy instead of alogger.warning, so a caller can filter or escalate it; the init tasks keep it visible in the task log. - Drop the
ngff_version=argument from all sevensetup_images_for_conversion(...)calls (removed inome-zarr-converters-tools1.1.0; the value already came fromconverter_options). - Adopt the v1
AcquisitionDetailsrenames in all builders:pixelsize=→xy_pixel_size=andstart_*_coo=/length_*_coo=→*_space=(values unchanged). ImportBackendTypefrom the package root instead of the privatemodels._converter_options. - Regenerate
__FRACTAL_MANIFEST__.jsonagainst the v1AcquisitionOptionsschema (new built-in filters,grouping/tiling split,remove_*stage corrections, schedulermode). - Regenerate
pixi.lockfrom PyPI releases only (the previous lock pointed at a local editable path); ngio 1.x no longer pulls in thedistributeddependency cluster. - Replace the Yokogawa CQ3K test data with BSSE-CQ3000 acquisitions, the previous data not
being redistributable; add an extended CellVoyager suite and rename the Yokogawa
extended datasets to the canonical
hcs_…convention. - Tests: rename the stale
init_task_kwargsparametrize variable toapi_kwargs. - Tests: register the
ConverterWarningignore fromconftest.pyinstead of the pytest ini, which imported the package before coverage started and under-reported coverage by ~37 points. - Load the shared snapshot-testing plugin via
pytest_pluginsintests/conftest.pyinstead of-pinpytestaddopts, matching the sibling converters. - Align repository tooling with
ome-zarr-converters-tools: adopt its.pre-commit-config.yaml(validate-pyprojectv0.25,crate-ci/typos,astral-sh/ruff-pre-commitv0.15.17,nbstripout) with a per-repo_typos.toml, add achorespixi task, bump GitHub Actions pins (checkoutv7,codecov-actionv7,action-gh-releasev3,setup-pythonv6), and trimCLAUDE.md.
Documentation
- Document Yokogawa channel handling: where the labels come from, and that an
advanced.channelsoverride is indexed by instrument channel number rather than by the channels present in the output. - Document the Yokogawa vendor-metadata copy on both converter pages, and drop the limited-testing caveats now that both converters have an extended test suite.
- Bring the shared converter-options reference up to date with the v1 schema, including the new sharding strategies and runtime settings.
- Fix
tests/data_intake_instructions.mdandtests/cleanup_test_data.sh: snapshots are JSON, not YAML, and the extended-test template was outdated.
[0.7.1]
Fix
- Remove passing explicit
logger_nameto therun_fractal_taskwrapper.
[0.7.0]
Features
- Add Python API functions (
convert_cellvoyager,convert_cq3k,convert_operetta,convert_imagexpress_hcs,convert_hcs_tiff,convert_single_tiff) for programmatic use outside Fractal, following the existingconvert_scanrpattern. - Update test utilities to call the high-level API functions, providing end-to-end coverage of both the API layer and the underlying init/compute tasks.
Docs
- Add "How to Run the Converters" page documenting the Python API with usage examples, common parameters, and per-converter code snippets.
- Add Python API section to each converter page with a copy-paste ready code example.
Chores
- Remove
custom_tiff/_setup.pyand its import:ome-zarr-converters-tools>=0.10.0now ships a built-insetup_singleimagehandler forSingleImagecollections, making the local copy redundant. - Bump to
ome-zarr-converters-tools>=0.10.0,<0.11.0 - Rename internal modules to
_{module_name}.pyacross all converter packages andcommon/to signal they are private implementation details.
[0.6.0]
Features
- Add
custom_tiffconverter: two new tasks for converting plain TIFF data (HCS plate and single-image) to OME-Zarr.
Fix
- Fix
get_attributes_from_condition_tableto dynamically exclude the acquisition column from results.
Chores
- Bump to
ome-zarr-converters-tools>=0.9.0,<0.10.0