Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@ $ scigantic-bil submission-draft ./ctx # one draft per acquisition di

The prior is the same base64 capsule the edge's own `-export-prior` writes; its card holds one `bil-image` context record per Image row of the BIL record, with the Instrument sheet folded in. The draft uses BIL's own column names, so a row pastes into the submission spreadsheet. Measured on 2026-10-17: of 1,004 light-sheet records on BIL, 849 have an Instrument block and about half of those name an objective, detector or wavelength; 808 are LifeCanvas SmartSPIM, whose `metadata.txt` carries every one of those values.

OME-Zarr stores are drafted from the edge's `ome-zarr` records: step sizes from the level-0 scale transform (converted to micrometres from whatever unit the axes name), channels, slices and array size from the shape, `dimensionorder` from the axes names (`CZYX`, `TCZYX`). An acquisition written by the Allen Institute's `voxel` engine is one store per volume and channel under `<root>/volumes/NNNNNN/<profile>/<channel>.ome.zarr` beside a `manifest.json`; those stores collapse into one draft per manifest (matched through the store's sidecar, the manifest's store paths, or the `/volumes/` prefix), with `channels` counted as the distinct `<channel>.ome.zarr` names across volumes. The manifest's `voxel-manifest` record fills the Instrument sheet (instrument name, objective, laser lines, emission bands, camera) and the draft's `acquisition` block carries what the sheets have no column for: store and volume counts, channel names, status, revision and timestamps. The microscope type is set to light-sheet only when the instrument's name says so; voxel's template instrument is a simulator. `fixtures/edge/voxel_run1_index.jsonl` is the edge decoder's own `index.jsonl` over one such run (2 tiles x 2 channels, 10 frames of 128 x 192 uint16), `exaspim_public_index.jsonl` holds hand-written records for two public exaSPIM tiles, and `tests/test_edge.py` reads both.

## Caching

On by default. Metadata responses, directory listings and manifests are cached to `~/.cache/scigantic-bil` (macOS: `~/Library/Caches/scigantic-bil`; override with `SCIGANTIC_BIL_CACHE` or `enable_cache(cache_dir=...)`) and expire after 7 days, since BIL republishes its inventory every few days. Inventory snapshots are immutable once published and are kept as plain TSV files without expiry. Image bytes are never cached.
Expand Down
2 changes: 2 additions & 0 deletions fixtures/edge/exaspim_public_index.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"source": "exaSPIM_851474_2026-07-10_15-23-22/SPIM.ome.zarr/tile_000000_ch_488.zarr", "sizeBytes": 7759, "mtime": 1784108793, "decoded": {"format": "ome-zarr", "summary": "OME-Zarr v2 (NGFF 0.4) multiscales, 7 levels, tczyx 1x1x2560x1330x1774 uint16, 8 x 5.984 x 5.984 micrometer, blosc/zstd", "fields": {"zarrFormat": 2, "ngffVersion": "0.4", "layout": "multiscales", "axes": [{"name": "t", "type": "time", "unit": "millisecond"}, {"name": "c", "type": "channel"}, {"name": "z", "type": "space", "unit": "micrometer"}, {"name": "y", "type": "space", "unit": "micrometer"}, {"name": "x", "type": "space", "unit": "micrometer"}], "levels": 7, "datasetPaths": ["0", "1", "2", "3", "4", "5", "6"], "sizeT": 1, "sizeC": 1, "sizeZ": 2560, "sizeY": 1330, "sizeX": 1774, "dtype": "uint16", "fillValue": 0, "chunkShape": [1, 1, 128, 256, 256], "shardShape": null, "codecs": ["blosc"], "compressor": "blosc/zstd", "compressionLevel": 1, "voxelSizeX": 5.984, "voxelSizeY": 5.984, "voxelSizeZ": 8.0, "voxelSizeUnit": "micrometer", "channelNames": ["Channel:tile_000000_ch_488.zarr:0"], "omeroPresent": true, "presentChunks": 0, "presentChunksIsLowerBound": true, "metadataFiles": [".zgroup", ".zattrs", "0/.zarray", "6/.zarray"], "arrayMetadataMissing": ["1/.zarray", "2/.zarray", "3/.zarray", "4/.zarray", "5/.zarray"], "sidecars": []}}}
{"source": "exaSPIM_2026-08-04_10-27-41/SPIM/tile_000000_ch_488.ome.zarr/zarr.json", "sizeBytes": 1849, "mtime": 1789153861, "decoded": {"format": "ome-zarr", "summary": "OME-Zarr v3 (NGFF 0.5) multiscales, 6 levels, tczyx 1x1x1024x2660x3548 uint16, 20 x 15.04 x 15.04 micrometer, sharded, zstd", "fields": {"zarrFormat": 3, "ngffVersion": "0.5", "layout": "multiscales", "axes": [{"name": "t", "type": "time", "unit": "millisecond"}, {"name": "c", "type": "channel"}, {"name": "z", "type": "space", "unit": "micrometer"}, {"name": "y", "type": "space", "unit": "micrometer"}, {"name": "x", "type": "space", "unit": "micrometer"}], "levels": 6, "datasetPaths": ["0", "1", "2", "3", "4", "5"], "sizeT": 1, "sizeC": 1, "sizeZ": 1024, "sizeY": 2660, "sizeX": 3548, "dtype": "uint16", "fillValue": 0, "chunkShape": [1, 1, 128, 256, 256], "shardShape": [1, 1, 512, 512, 512], "codecs": ["sharding_indexed", "transpose", "bytes", "zstd"], "compressor": "zstd", "compressionLevel": 3, "voxelSizeX": 15.039999977980552, "voxelSizeY": 15.040000146851504, "voxelSizeZ": 20.0, "voxelSizeUnit": "micrometer", "channelNames": ["tile_000000_ch_488"], "omeroPresent": true, "presentChunks": 0, "presentChunksIsLowerBound": true, "metadataFiles": ["zarr.json", "0/zarr.json", "1/zarr.json", "2/zarr.json", "3/zarr.json", "4/zarr.json", "5/zarr.json"], "arrayMetadataMissing": [], "sidecars": []}}}
Loading
Loading