From c8c3562fa863d8dde3c54db2858e30bb989628d9 Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 11:50:44 +0200 Subject: [PATCH 1/7] feat: add bioimage conversion benchmark --- config.yml | 36 + pyproject.toml | 5 + tests/test_bioimage_config.py | 22 + tests/test_bioimage_convert_dataset.py | 136 +++ tests/test_iscc_bio_algo.py | 50 + twinspect/algos/iscc_bio.py | 37 + twinspect/datasets/bioimage_convert.py | 363 ++++++ .../manifests/bioimage_convert_1000.csv | 1001 +++++++++++++++++ uv.lock | 42 + 9 files changed, 1692 insertions(+) create mode 100644 tests/test_bioimage_config.py create mode 100644 tests/test_bioimage_convert_dataset.py create mode 100644 tests/test_iscc_bio_algo.py create mode 100644 twinspect/algos/iscc_bio.py create mode 100644 twinspect/datasets/bioimage_convert.py create mode 100644 twinspect/datasets/manifests/bioimage_convert_1000.csv diff --git a/config.yml b/config.yml index 59e9410..4e6ff1f 100644 --- a/config.yml +++ b/config.yml @@ -18,6 +18,16 @@ algorithms: url: https://github.com/iscc/iscc-core/blob/main/iscc_core/code_content_image.py dependencies: - iscc-sdk>=0.8.5 + - name: ISCC BioImage Data-Code IW 64-Bit + label: bioimage_data_code_iw_64 + mode: image + function: twinspect.algos.iscc_bio:bioimage_data_code_iw_64 + info: IMAGEWALK-based bioimage Data-Code using iscc-bio. Decodes bioimage pixel planes via + BioIO/OME-NGFF, canonicalizes plane bytes, and generates a 64-bit ISCC Data-Code for + same-image/different-format bioimage matching. + url: https://github.com/bio-codes/iscc-bio + dependencies: + - iscc-bio[readers] @ git+https://github.com/bio-codes/iscc-bio.git@940bbbbb961e4b5316d95a5619b9d797fe70c16d - name: ISCC Audio-Code V0 64-Bit label: audio_code_v0_64 mode: audio @@ -95,6 +105,18 @@ datasets: url: https://mfnd.similarity.eu/data/truthfiles/polito/IND_clusters.txt mode: image installer: twinspect.datasets.mfnd:install + - name: BioImage Convert 1000 + label: bioimage_convert_1000 + info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage + Benchmark Collection archives. Each selected source image is converted with BioImage Convert + into single-file formats, producing same-image/different-format clusters for evaluating + iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. + url: https://bbbc.broadinstitute.org/ + mode: image + installer: twinspect.datasets.bioimage_convert:install + samples: 1000 + clusters: 1000 + seed: 0 - name: ISCC-FMA-10k label: iscc_fma_10k info: The ISCC-FMA-10k benchmark is a subset of [Free Music Archive @@ -206,6 +228,20 @@ metrics: label: distribution function: twinspect.metrics.distribution:distribution benchmarks: + - algorithm_label: bioimage_data_code_iw_64 + dataset_label: bioimage_convert_1000 + metric_labels: + - speed + - effectiveness + - distribution + active: true + - algorithm_label: image_code_v0_64 + dataset_label: bioimage_convert_1000 + metric_labels: + - speed + - effectiveness + - distribution + active: true - algorithm_label: image_code_v0_64 dataset_label: mirflickr_mfnd metric_labels: diff --git a/pyproject.toml b/pyproject.toml index cf3adba..d71ffd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,3 +84,8 @@ format-code = { cmd = "ruff format .", help = "Code style formatting with ruff" format-md = { script = "twinspect.dev:format_md", help = "Markdown formating with mdformat" } fix-line-endings = { script = "twinspect.dev:fix_line_endings", help = "Convert line endings to LF"} all = ["format-yaml", "validate-schema", "generate-code", "format-code", "format-md", "fix-line-endings"] + +[dependency-groups] +dev = [ + "pytest>=8.0.0", +] diff --git a/tests/test_bioimage_config.py b/tests/test_bioimage_config.py new file mode 100644 index 0000000..cf6c646 --- /dev/null +++ b/tests/test_bioimage_config.py @@ -0,0 +1,22 @@ +import twinspect as ts + + +def test_bioimage_dataset_algorithm_and_benchmark_are_configured(): + dataset = ts.Dataset.from_label("bioimage_convert_1000") + assert dataset is not None + assert dataset.samples == 1000 + assert dataset.clusters == 1000 + assert dataset.installer == "twinspect.datasets.bioimage_convert:install" + + algorithm = next(algo for algo in ts.cnf.algorithms if algo.label == "bioimage_data_code_iw_64") + assert algorithm.function == "twinspect.algos.iscc_bio:bioimage_data_code_iw_64" + assert algorithm.mode.value == "image" + + benchmark = next( + bench + for bench in ts.cnf.benchmarks + if bench.algorithm_label == "bioimage_data_code_iw_64" + and bench.dataset_label == "bioimage_convert_1000" + ) + assert benchmark.active is True + assert "effectiveness" in benchmark.metric_labels diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py new file mode 100644 index 0000000..5417c85 --- /dev/null +++ b/tests/test_bioimage_convert_dataset.py @@ -0,0 +1,136 @@ +from pathlib import Path +from zipfile import ZipInfo + +import pytest + +from twinspect.datasets import bioimage_convert as bic +from twinspect.metrics.eff import load_simprints + + +def zinfo(name, size=100): + info = ZipInfo(name) + info.file_size = size + return info + + +def test_is_eligible_member_filters_non_images_empty_and_oversized(): + assert bic.is_eligible_member(zinfo("a/plate.tif", 42), max_file_size=100) + assert bic.is_eligible_member(zinfo("a/plate.BMP", 42), max_file_size=100) + assert not bic.is_eligible_member(zinfo("a/readme.txt", 42), max_file_size=100) + assert not bic.is_eligible_member(zinfo("a/empty.tif", 0), max_file_size=100) + assert not bic.is_eligible_member(zinfo("a/huge.tif", 101), max_file_size=100) + + +def test_select_samples_is_reproducible_and_size_capped(monkeypatch): + calls = [] + + def fake_archive_image_infos(url, max_file_size): + calls.append((url, max_file_size)) + return [zinfo(f"{Path(url).stem}-{idx}.tif", idx + 1) for idx in range(5)] + + sources = ( + {"label": "a", "url": "https://example.test/a.zip"}, + {"label": "b", "url": "https://example.test/b.zip"}, + ) + monkeypatch.setattr(bic, "archive_image_infos", fake_archive_image_infos) + + first = bic.select_samples(samples=6, seed=7, max_file_size=123, sources=sources) + second = bic.select_samples(samples=6, seed=7, max_file_size=123, sources=sources) + + assert first == second + assert len(first) == 6 + assert calls[0][1] == 123 + assert {sample.source_label for sample in first} <= {"a", "b"} + + +def test_select_samples_fails_when_not_enough_candidates(monkeypatch): + monkeypatch.setattr(bic, "archive_image_infos", lambda url, max_file_size: [zinfo("one.tif")]) + with pytest.raises(RuntimeError, match="need 2"): + bic.select_samples( + samples=2, sources=({"label": "a", "url": "https://example.test/a.zip"},) + ) + + +def test_manifest_roundtrip(tmp_path): + samples = [ + bic.BioimageSample( + source_label="bbbc-test", + archive_url="https://example.test/archive.zip", + member_name="folder/source.TIF", + file_size=10, + ) + ] + manifest = tmp_path / "manifest.csv" + bic.write_manifest(samples, manifest) + + assert bic.load_manifest(manifest) == samples + + +def test_build_cluster_keeps_original_first_and_conversion_labels(monkeypatch, tmp_path): + sample = bic.BioimageSample( + source_label="bbbc-test", + archive_url="https://example.test/archive.zip", + member_name="folder/source.TIF", + file_size=10, + ) + + def fake_extract_member(sample, output_path): + output_path.write_bytes(b"original") + return output_path + + def fake_convert_file(input_path, output_path, format_name): + output_path.write_bytes(format_name.encode("utf-8")) + return output_path + + monkeypatch.setattr(bic, "extract_member", fake_extract_member) + monkeypatch.setattr(bic, "convert_file", fake_convert_file) + + cluster = tmp_path / "0000000" + bic.build_cluster(sample, cluster) + + names = sorted(path.name for path in cluster.iterdir()) + assert names == [ + "0original.TIF", + "1variant_ome-tiff.ome.tiff", + "2variant_tiff.tiff", + "3variant_png.png", + ] + bic.validate_cluster(cluster) + + +def test_bioimage_convert_command_allows_template(monkeypatch): + monkeypatch.setenv( + "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", + "converter --input {input} --output {output} --format {format}", + ) + command = bic.bioimage_convert_command(Path("in.tif"), Path("out.png"), "png") + assert command == ["converter", "--input", "in.tif", "--output", "out.png", "--format", "png"] + + +def test_validate_file_size_rejects_empty_and_oversized(tmp_path): + empty = tmp_path / "empty.tif" + empty.write_bytes(b"") + with pytest.raises(RuntimeError, match="Empty"): + bic.validate_file_size(empty) + + oversized = tmp_path / "oversized.tif" + oversized.write_bytes(b"abc") + with pytest.raises(RuntimeError, match="exceeds"): + bic.validate_file_size(oversized, max_file_size=2) + + +def test_cluster_layout_matches_twinspect_ground_truth_parser(tmp_path): + simprint = tmp_path / "simprint.csv" + simprint.write_text( + "id;code;file;size;time\n" + "0;0000000000000000;0000000/0original.TIF;1;1\n" + "1;0000000000000000;0000000/1variant_ome-tiff.ome.tiff;1;1\n" + "2;ffffffffffffffff;distractor.TIF;1;1\n", + encoding="utf-8", + ) + + df = load_simprints(simprint) + assert df.loc[0, "cluster"] == "0000000" + assert bool(df.loc[0, "is_original"]) is True + assert df.loc[1, "transform"] == "ome-tiff" + assert df.loc[2, "cluster"] is None diff --git a/tests/test_iscc_bio_algo.py b/tests/test_iscc_bio_algo.py new file mode 100644 index 0000000..0593c8a --- /dev/null +++ b/tests/test_iscc_bio_algo.py @@ -0,0 +1,50 @@ +import sys +import types + +from twinspect.algos.iscc_bio import bioimage_data_code_iw_64 + + +def test_bioimage_data_code_iw_64_extracts_first_scene_data_code(monkeypatch, tmp_path): + image = tmp_path / "image.ome.tiff" + image.write_bytes(b"fake") + + fake_iscc_lib = types.ModuleType("iscc_lib") + fake_iscc_lib.iscc_decode = lambda code: ( + None, + None, + None, + None, + bytes.fromhex("0011223344556677"), + ) + + fake_api = types.ModuleType("iscc_bio.api") + fake_api.biocode = lambda fp, bits, source_type: [ + {"units": ["ISCC:DATA", "ISCC:INSTANCE"]}, + {"units": ["ISCC:OTHER", "ISCC:OTHERINSTANCE"]}, + ] + + fake_pkg = types.ModuleType("iscc_bio") + fake_pkg.api = fake_api + + monkeypatch.setitem(sys.modules, "iscc_lib", fake_iscc_lib) + monkeypatch.setitem(sys.modules, "iscc_bio", fake_pkg) + monkeypatch.setitem(sys.modules, "iscc_bio.api", fake_api) + + assert bioimage_data_code_iw_64(image) == "0011223344556677" + + +def test_bioimage_data_code_iw_64_returns_none_on_empty_result(monkeypatch, tmp_path): + image = tmp_path / "image.ome.tiff" + image.write_bytes(b"fake") + + fake_iscc_lib = types.ModuleType("iscc_lib") + fake_api = types.ModuleType("iscc_bio.api") + fake_api.biocode = lambda fp, bits, source_type: [] + fake_pkg = types.ModuleType("iscc_bio") + fake_pkg.api = fake_api + + monkeypatch.setitem(sys.modules, "iscc_lib", fake_iscc_lib) + monkeypatch.setitem(sys.modules, "iscc_bio", fake_pkg) + monkeypatch.setitem(sys.modules, "iscc_bio.api", fake_api) + + assert bioimage_data_code_iw_64(image) is None diff --git a/twinspect/algos/iscc_bio.py b/twinspect/algos/iscc_bio.py new file mode 100644 index 0000000..0a4d230 --- /dev/null +++ b/twinspect/algos/iscc_bio.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +"""ISCC-BIO algorithm implementations for TwinSpect benchmarking.""" + +from pathlib import Path +from typing import Optional + +from loguru import logger as log + + +def bioimage_data_code_iw_64(fp) -> Optional[str]: + # type: (str | Path) -> Optional[str] + """Generate a 64-bit IMAGEWALK-based bioimage Data-Code via ``iscc-bio``. + + ``iscc-bio`` decodes bioimage formats with IMAGEWALK/BioIO and hashes canonical + plane pixels. That is the unit we want for same-image/different-format matching, + not a raw file-byte Data-Code. TwinSpect expects a hex encoded compact code body, + so we extract and return the first ISCC-SUM unit (Data-Code) body bytes. + """ + try: + import iscc_lib + from iscc_bio.api import biocode + + results = biocode(fp, bits=64, source_type="auto") + if not results: + log.error(f"No biocode result for {fp}") + return None + + if len(results) > 1: + log.warning(f"{fp} produced {len(results)} scenes; using scene 0 only") + + data_code = results[0]["units"][0] + _, _, _, _, body_bytes = iscc_lib.iscc_decode(data_code) + log.success(f"{data_code} <- {Path(fp).name}") + return body_bytes.hex() + except Exception as e: + log.error(f"Failed hashing {fp} - {e}") + return None diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py new file mode 100644 index 0000000..71c2268 --- /dev/null +++ b/twinspect/datasets/bioimage_convert.py @@ -0,0 +1,363 @@ +# -*- coding: utf-8 -*- +"""Bioimage format-conversion benchmark dataset. + +The installer builds a reproducible clustered dataset from public Broad Bioimage +Benchmark Collection archives. Each selected source bioimage becomes one cluster: + + 0000000/0original.TIF + 0000000/1variant_ome-tiff.ome.tiff + 0000000/2variant_tiff.tiff + 0000000/3variant_png.png + +The converted cluster members are intended for benchmarking IMAGEWALK-based +bioimage Data-Code matching across storage formats. BioImage Convert (``imgcnv``) +is used for conversions because it supports microscopy formats beyond ordinary +Pillow/OpenCV image files. +""" + +from __future__ import annotations + +import csv +import json +import os +import random +import shlex +import shutil +import subprocess +import tempfile +from dataclasses import asdict, dataclass +from pathlib import Path +from zipfile import ZipInfo + +from loguru import logger as log +from remotezip import RemoteZip +from rich.progress import track + +from twinspect import check_dir_fast, console + +ONE_GIB = 1024**3 +DEFAULT_CONVERT_TIMEOUT = 300 +MANIFEST_PATH = Path(__file__).parent / "manifests" / "bioimage_convert_1000.csv" +BUILD_INFO_FILENAME = "_bioimage_convert_build.json" + +# Public Broad Bioimage Benchmark Collection archives. These are deliberately +# normal ZIP archives with stable URLs and range-request support, so RemoteZip can +# extract selected files without downloading full multi-hundred-MB/GB archives. +BBBC_SOURCES = ( + { + "label": "bbbc005", + "url": "https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip", + "info": "BBBC005 synthetic fluorescent cell images (Broad Bioimage Benchmark Collection)", + }, + { + "label": "bbbc006_z00", + "url": "https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip", + "info": "BBBC006 MCF7 z-stack microscopy images, z=00 (Broad Bioimage Benchmark Collection)", + }, + { + "label": "bbbc013_bmp", + "url": "https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip", + "info": "BBBC013 human U2OS cells in BMP format (Broad Bioimage Benchmark Collection)", + }, +) + +# Conservative, broadly readable single-file output formats. Directory formats +# such as OME-NGFF/Zarr are intentionally excluded because TwinSpect currently +# treats benchmark assets as files. +CONVERSIONS = ( + ("ome-tiff", ".ome.tiff", "ome-tiff"), + ("tiff", ".tiff", "tiff"), + ("png", ".png", "png"), +) + +IMAGE_EXTENSIONS = {".bmp", ".gif", ".jpg", ".jpeg", ".png", ".tif", ".tiff"} + + +@dataclass(frozen=True) +class BioimageSample: + """A selected remote ZIP member.""" + + source_label: str + archive_url: str + member_name: str + file_size: int + + @property + def suffix(self) -> str: + suffixes = Path(self.member_name).suffixes + return "".join(suffixes) if suffixes else Path(self.member_name).suffix + + +def install(dataset): + # type: (object) -> Path + """Install the BioImage Convert 1000-cluster benchmark dataset.""" + data_folder = dataset.data_folder + if data_folder.exists(): + if dataset.checksum: + check_dir_fast(data_folder, expected=dataset.checksum) + log.debug(f"Using cached dataset {dataset.name}") + return data_folder + + samples = int(dataset.samples or dataset.clusters or 1000) + seed = int(dataset.seed or 0) + selected = load_manifest(MANIFEST_PATH, samples=samples) or select_samples( + samples=samples, seed=seed + ) + + tmp_root = Path(tempfile.mkdtemp(prefix=f"{dataset.label}-", dir=data_folder.parent)) + try: + build_dataset(selected, tmp_root) + write_build_info(tmp_root, selected) + validate_dataset(tmp_root, expected_clusters=samples) + tmp_root.replace(data_folder) + except Exception: + shutil.rmtree(tmp_root, ignore_errors=True) + raise + + return data_folder + + +def load_manifest(manifest_path, samples=None): + # type: (Path, int | None) -> list[BioimageSample] + """Load a committed source manifest if available.""" + if not manifest_path.exists(): + return [] + + rows = [] + with manifest_path.open("rt", encoding="utf-8", newline="") as infile: + reader = csv.DictReader(infile) + expected = ["source_label", "archive_url", "member_name", "file_size"] + if reader.fieldnames != expected: + raise RuntimeError(f"Invalid manifest header in {manifest_path}: {reader.fieldnames!r}") + for row in reader: + rows.append( + BioimageSample( + source_label=row["source_label"], + archive_url=row["archive_url"], + member_name=row["member_name"], + file_size=int(row["file_size"]), + ) + ) + + if samples is not None: + if len(rows) < samples: + raise RuntimeError(f"Manifest has {len(rows)} samples; need {samples}") + rows = rows[:samples] + return rows + + +def write_manifest(samples, manifest_path): + # type: (list[BioimageSample], Path) -> Path + """Write selected source samples as a reproducibility manifest.""" + manifest_path.parent.mkdir(parents=True, exist_ok=True) + with manifest_path.open("wt", encoding="utf-8", newline="") as outfile: + writer = csv.DictWriter( + outfile, fieldnames=["source_label", "archive_url", "member_name", "file_size"] + ) + writer.writeheader() + for sample in samples: + writer.writerow(asdict(sample)) + return manifest_path + + +def select_samples(samples=1000, seed=0, max_file_size=ONE_GIB, sources=BBBC_SOURCES): + # type: (int, int, int, tuple[dict, ...]) -> list[BioimageSample] + """Select a reproducible set of public bioimage files from configured archives.""" + candidates = [] + for source in sources: + for info in archive_image_infos(source["url"], max_file_size=max_file_size): + candidates.append( + BioimageSample( + source_label=source["label"], + archive_url=source["url"], + member_name=info.filename, + file_size=info.file_size, + ) + ) + + candidates = sorted(candidates, key=lambda item: (item.source_label, item.member_name)) + if len(candidates) < samples: + raise RuntimeError(f"Only {len(candidates)} candidate bioimages available; need {samples}") + + rng = random.Random(seed) + selected = rng.sample(candidates, samples) + return sorted(selected, key=lambda item: (item.source_label, item.member_name)) + + +def archive_image_infos(archive_url: str, max_file_size: int = ONE_GIB) -> list[ZipInfo]: + """Return eligible image members from a remote ZIP archive.""" + with RemoteZip(archive_url) as zip_file: + infos = [info for info in zip_file.infolist() if is_eligible_member(info, max_file_size)] + return infos + + +def is_eligible_member(info: ZipInfo, max_file_size: int = ONE_GIB) -> bool: + """Check whether a ZIP member is a usable bioimage candidate.""" + if info.is_dir() or info.file_size <= 0 or info.file_size > max_file_size: + return False + return Path(info.filename).suffix.lower() in IMAGE_EXTENSIONS + + +def build_dataset(samples, data_folder): + # type: (list[BioimageSample], Path) -> None + """Download selected originals and build conversion clusters.""" + data_folder.mkdir(parents=True, exist_ok=True) + for cluster_id, sample in enumerate( + track(samples, description="Building bioimage clusters", console=console) + ): + cluster_path = data_folder / f"{cluster_id:07d}" + build_cluster(sample, cluster_path) + validate_cluster(cluster_path) + + +def build_cluster(sample, cluster_path): + # type: (BioimageSample, Path) -> None + """Build one same-image/different-format cluster.""" + cluster_path.mkdir(parents=True, exist_ok=True) + original_path = cluster_path / f"0original{sample.suffix}" + extract_member(sample, original_path) + validate_file_size(original_path) + for idx, (label, suffix, format_name) in enumerate(CONVERSIONS, start=1): + output_path = cluster_path / f"{idx}variant_{label}{suffix}" + convert_file(original_path, output_path, format_name) + validate_file_size(output_path) + + +def extract_member(sample, output_path): + # type: (BioimageSample, Path) -> Path + """Extract a single member from a remote ZIP archive to ``output_path``.""" + with tempfile.TemporaryDirectory(prefix="twinspect-bioimage-") as tmp_dir: + tmp_dir = Path(tmp_dir) + with RemoteZip(sample.archive_url) as zip_file: + extracted = Path(zip_file.extract(sample.member_name, tmp_dir)) + output_path.parent.mkdir(parents=True, exist_ok=True) + shutil.move(extracted, output_path) + validate_file_size(output_path) + return output_path + + +def convert_file(input_path, output_path, format_name): + # type: (Path, Path, str) -> Path + """Convert ``input_path`` with BioImage Convert. + + The default command follows the documented BioImage Convertor/imgcnv style: + ``imgcnv -i INPUT -o OUTPUT -t FORMAT``. For local installations with a + different wrapper, set ``TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE`` to a shell-free + argument template, e.g. ``"bioimageconvert --input {input} --output {output} --format {format}"``. + """ + if output_path.exists() and output_path.stat().st_size > 0: + validate_file_size(output_path) + return output_path + + command = bioimage_convert_command(input_path, output_path, format_name) + timeout = int(os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TIMEOUT", DEFAULT_CONVERT_TIMEOUT)) + log.debug("Running BioImage Convert: {}", " ".join(command)) + try: + subprocess.run(command, check=True, capture_output=True, text=True, timeout=timeout) + except FileNotFoundError as exc: + raise RuntimeError( + "BioImage Convert executable not found. Install BioImage Convert and ensure " + "`imgcnv` is on PATH, set TWINSPECT_BIOIMAGE_CONVERT_BIN, or set " + "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE." + ) from exc + except subprocess.TimeoutExpired as exc: + raise RuntimeError( + f"BioImage Convert timed out after {timeout}s for " + f"{input_path.name} -> {output_path.name}" + ) from exc + except subprocess.CalledProcessError as exc: + raise RuntimeError( + f"BioImage Convert failed for {input_path.name} -> {output_path.name}: " + f"stdout={exc.stdout!r} stderr={exc.stderr!r}" + ) from exc + + validate_file_size(output_path) + return output_path + + +def bioimage_convert_command(input_path, output_path, format_name): + # type: (Path, Path, str) -> list[str] + """Build the BioImage Convert command line.""" + template = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE") + if template: + return [ + part.format(input=input_path, output=output_path, format=format_name) + for part in shlex.split(template) + ] + binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") or "imgcnv" + return [binary, "-i", str(input_path), "-o", str(output_path), "-t", format_name] + + +def bioimage_convert_version(): + # type: () -> str + """Best-effort BioImage Convert version string for build metadata.""" + binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") or "imgcnv" + for flag in ("--version", "-v"): + try: + result = subprocess.run( + [binary, flag], check=False, capture_output=True, text=True, timeout=10 + ) + except Exception: + continue + text = (result.stdout or result.stderr or "").strip() + if text: + return text.splitlines()[0] + return "unknown" + + +def validate_file_size(path, max_file_size=ONE_GIB): + # type: (Path, int) -> None + """Ensure a benchmark file is non-empty and within the configured hard size cap.""" + if not path.exists() or not path.is_file(): + raise RuntimeError(f"Missing expected bioimage file: {path}") + size = path.stat().st_size + if size <= 0: + raise RuntimeError(f"Empty bioimage file: {path}") + if size > max_file_size: + raise RuntimeError(f"Bioimage file exceeds {max_file_size} bytes: {path} ({size} bytes)") + + +def validate_cluster(cluster_path): + # type: (Path) -> None + """Validate expected original + conversion files for one cluster.""" + originals = sorted(cluster_path.glob("0original*")) + if len(originals) != 1: + raise RuntimeError( + f"Expected exactly one original in {cluster_path}, found {len(originals)}" + ) + validate_file_size(originals[0]) + + for idx, (label, suffix, _) in enumerate(CONVERSIONS, start=1): + path = cluster_path / f"{idx}variant_{label}{suffix}" + validate_file_size(path) + + +def validate_dataset(data_folder, expected_clusters): + # type: (Path, int) -> None + """Validate cluster count and per-cluster completeness.""" + clusters = sorted(path for path in data_folder.iterdir() if path.is_dir()) + if len(clusters) != expected_clusters: + raise RuntimeError( + f"Expected {expected_clusters} clusters in {data_folder}, found {len(clusters)}" + ) + for cluster in clusters: + validate_cluster(cluster) + + +def write_build_info(data_folder, samples): + # type: (Path, list[BioimageSample]) -> Path + """Write reproducibility metadata into the installed dataset folder.""" + metadata = { + "dataset": "bioimage_convert_1000", + "sources": BBBC_SOURCES, + "conversions": CONVERSIONS, + "max_file_size": ONE_GIB, + "bioimage_convert_command": bioimage_convert_command( + Path("INPUT"), Path("OUTPUT"), "FORMAT" + ), + "bioimage_convert_version": bioimage_convert_version(), + "samples": [asdict(sample) for sample in samples], + } + path = data_folder / BUILD_INFO_FILENAME + path.write_text(json.dumps(metadata, indent=2, sort_keys=True), encoding="utf-8") + return path diff --git a/twinspect/datasets/manifests/bioimage_convert_1000.csv b/twinspect/datasets/manifests/bioimage_convert_1000.csv new file mode 100644 index 0000000..719e073 --- /dev/null +++ b/twinspect/datasets/manifests/bioimage_convert_1000.csv @@ -0,0 +1,1001 @@ +source_label,archive_url,member_name,file_size +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A01_C1_F1_s02_w1.TIF,321342 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A01_C1_F1_s04_w2.TIF,316886 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A01_C1_F1_s05_w1.TIF,321084 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A01_C1_F1_s19_w2.TIF,316928 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A01_C1_F1_s25_w2.TIF,317372 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A02_C5_F1_s06_w1.TIF,321570 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A02_C5_F1_s14_w2.TIF,318942 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A03_C10_F1_s03_w2.TIF,321146 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A03_C10_F1_s06_w2.TIF,320228 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A03_C10_F1_s12_w1.TIF,323032 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A03_C10_F1_s14_w1.TIF,322292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A05_C18_F1_s06_w1.TIF,324576 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A05_C18_F1_s17_w2.TIF,325512 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A05_C18_F1_s18_w2.TIF,325878 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A06_C23_F1_s03_w1.TIF,324160 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A06_C23_F1_s04_w2.TIF,328052 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A06_C23_F1_s14_w1.TIF,325150 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A06_C23_F1_s21_w2.TIF,327526 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A07_C27_F1_s01_w2.TIF,331022 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A07_C27_F1_s10_w1.TIF,325604 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A07_C27_F1_s14_w1.TIF,326980 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A07_C27_F1_s16_w2.TIF,329286 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A09_C35_F1_s04_w2.TIF,332344 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A09_C35_F1_s17_w1.TIF,327606 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A10_C40_F1_s06_w1.TIF,328652 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A10_C40_F1_s10_w1.TIF,328906 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A10_C40_F1_s17_w1.TIF,328744 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A11_C44_F1_s01_w1.TIF,327012 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A11_C44_F1_s16_w2.TIF,335868 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A11_C44_F1_s22_w1.TIF,328304 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A13_C53_F1_s05_w1.TIF,331958 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A14_C57_F1_s07_w1.TIF,331306 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A14_C57_F1_s11_w2.TIF,341656 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A14_C57_F1_s12_w2.TIF,341708 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A15_C61_F1_s05_w1.TIF,332214 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A15_C61_F1_s08_w2.TIF,342082 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A15_C61_F1_s24_w1.TIF,331300 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A17_C70_F1_s04_w2.TIF,346744 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A17_C70_F1_s19_w2.TIF,345706 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A18_C74_F1_s12_w2.TIF,346776 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A18_C74_F1_s13_w1.TIF,334954 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A19_C78_F1_s03_w2.TIF,347276 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A19_C78_F1_s08_w2.TIF,348606 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A19_C78_F1_s23_w1.TIF,336102 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A20_C83_F1_s07_w1.TIF,340410 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A20_C83_F1_s19_w2.TIF,350738 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A21_C87_F1_s04_w1.TIF,337224 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A21_C87_F1_s17_w2.TIF,347724 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A22_C91_F1_s07_w2.TIF,351084 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A22_C91_F1_s16_w1.TIF,338142 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A22_C91_F1_s21_w1.TIF,337482 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A23_C96_F1_s01_w2.TIF,352290 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s02_w1.TIF,342678 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s06_w2.TIF,352192 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s07_w1.TIF,337970 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s10_w1.TIF,337242 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s14_w2.TIF,352658 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_A24_C100_F1_s22_w1.TIF,341566 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B01_C1_F4_s20_w2.TIF,165096 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s01_w2.TIF,172290 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s09_w1.TIF,201622 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s13_w2.TIF,174494 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s20_w2.TIF,173890 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s21_w1.TIF,203490 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B02_C5_F4_s21_w2.TIF,174712 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s06_w1.TIF,206574 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s14_w1.TIF,206552 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s15_w1.TIF,206344 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s16_w2.TIF,184930 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s17_w1.TIF,207714 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B03_C10_F4_s25_w2.TIF,181292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B04_C14_F4_s01_w1.TIF,208804 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B04_C14_F4_s14_w1.TIF,208882 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B04_C14_F4_s15_w2.TIF,195758 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B04_C14_F4_s17_w2.TIF,194806 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B04_C14_F4_s19_w1.TIF,209356 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B05_C18_F4_s18_w2.TIF,203686 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B06_C23_F4_s02_w2.TIF,213274 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B06_C23_F4_s05_w1.TIF,214094 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B06_C23_F4_s07_w1.TIF,216054 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B06_C23_F4_s17_w1.TIF,216692 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B06_C23_F4_s24_w2.TIF,214000 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B07_C27_F4_s08_w2.TIF,217804 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B07_C27_F4_s17_w1.TIF,215930 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B07_C27_F4_s21_w2.TIF,215194 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B08_C31_F4_s03_w2.TIF,227802 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B08_C31_F4_s16_w2.TIF,231934 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B09_C35_F4_s16_w2.TIF,234214 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B09_C35_F4_s17_w2.TIF,235004 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B11_C44_F4_s09_w2.TIF,244316 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B11_C44_F4_s12_w1.TIF,228736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B12_C48_F4_s09_w2.TIF,252206 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B13_C53_F4_s10_w2.TIF,259272 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B14_C57_F4_s09_w2.TIF,265916 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B14_C57_F4_s23_w2.TIF,262084 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B15_C61_F4_s02_w1.TIF,240602 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B16_C66_F4_s11_w2.TIF,277546 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B16_C66_F4_s12_w2.TIF,279666 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B17_C70_F4_s01_w1.TIF,240058 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B17_C70_F4_s01_w2.TIF,277196 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B17_C70_F4_s02_w2.TIF,279186 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B17_C70_F4_s19_w2.TIF,284274 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B17_C70_F4_s21_w1.TIF,245982 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B18_C74_F4_s06_w2.TIF,283644 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B18_C74_F4_s07_w2.TIF,288672 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B18_C74_F4_s19_w1.TIF,246362 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B18_C74_F4_s22_w1.TIF,247024 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B18_C74_F4_s22_w2.TIF,293230 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B20_C83_F4_s01_w1.TIF,251196 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B20_C83_F4_s04_w2.TIF,296268 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B20_C83_F4_s13_w1.TIF,259040 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B20_C83_F4_s14_w2.TIF,300386 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B21_C87_F4_s16_w2.TIF,306444 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B22_C91_F4_s07_w2.TIF,305778 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B22_C91_F4_s22_w2.TIF,303308 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B23_C96_F4_s03_w1.TIF,270824 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B23_C96_F4_s05_w1.TIF,254898 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B23_C96_F4_s06_w1.TIF,255906 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B23_C96_F4_s12_w1.TIF,254348 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B24_C100_F4_s05_w1.TIF,257500 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B24_C100_F4_s11_w1.TIF,255364 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_B24_C100_F4_s25_w1.TIF,270474 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C01_C1_F7_s09_w1.TIF,60386 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C01_C1_F7_s13_w1.TIF,60624 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C02_C5_F7_s10_w1.TIF,67814 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C03_C10_F7_s02_w1.TIF,75516 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C03_C10_F7_s14_w2.TIF,90202 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C04_C14_F7_s02_w2.TIF,106280 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C04_C14_F7_s12_w2.TIF,106970 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C04_C14_F7_s21_w2.TIF,102790 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C05_C18_F7_s13_w2.TIF,117340 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C05_C18_F7_s15_w2.TIF,116540 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C05_C18_F7_s19_w1.TIF,87592 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C05_C18_F7_s23_w2.TIF,117076 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C05_C18_F7_s24_w2.TIF,118126 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C06_C23_F7_s08_w2.TIF,136770 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C06_C23_F7_s09_w1.TIF,98424 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C06_C23_F7_s10_w2.TIF,130338 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C06_C23_F7_s13_w1.TIF,97240 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C06_C23_F7_s25_w2.TIF,137850 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C07_C27_F7_s18_w2.TIF,137354 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C07_C27_F7_s21_w2.TIF,139370 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C08_C31_F7_s02_w2.TIF,153404 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C08_C31_F7_s11_w1.TIF,109704 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C08_C31_F7_s12_w2.TIF,151216 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C08_C31_F7_s13_w1.TIF,106834 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C08_C31_F7_s22_w2.TIF,153246 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C09_C35_F7_s03_w2.TIF,162006 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C09_C35_F7_s18_w1.TIF,114722 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C09_C35_F7_s20_w1.TIF,114184 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C09_C35_F7_s25_w1.TIF,119882 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C11_C44_F7_s22_w2.TIF,183788 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C12_C48_F7_s11_w1.TIF,132874 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C12_C48_F7_s17_w2.TIF,200176 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C12_C48_F7_s20_w1.TIF,135908 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C12_C48_F7_s25_w2.TIF,194550 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C13_C53_F7_s02_w1.TIF,145142 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C13_C53_F7_s17_w1.TIF,141402 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C14_C57_F7_s04_w1.TIF,146102 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C14_C57_F7_s07_w2.TIF,214820 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C14_C57_F7_s11_w1.TIF,148816 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C15_C61_F7_s04_w2.TIF,236664 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C17_C70_F7_s03_w1.TIF,161968 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C17_C70_F7_s07_w2.TIF,246142 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C17_C70_F7_s18_w2.TIF,244040 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C17_C70_F7_s19_w1.TIF,163220 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C17_C70_F7_s21_w1.TIF,162464 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C18_C74_F7_s01_w1.TIF,172780 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C18_C74_F7_s04_w2.TIF,252766 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C18_C74_F7_s17_w1.TIF,166066 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C18_C74_F7_s24_w1.TIF,164886 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C18_C74_F7_s25_w2.TIF,257622 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C19_C78_F7_s04_w1.TIF,179734 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C19_C78_F7_s13_w2.TIF,263092 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C19_C78_F7_s22_w2.TIF,259550 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C20_C83_F7_s02_w2.TIF,272438 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C20_C83_F7_s06_w2.TIF,263330 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C21_C87_F7_s15_w1.TIF,185772 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C21_C87_F7_s17_w1.TIF,190470 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C22_C91_F7_s01_w1.TIF,186618 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C22_C91_F7_s03_w2.TIF,269966 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C23_C96_F7_s08_w2.TIF,288846 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C24_C100_F7_s05_w2.TIF,296130 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C24_C100_F7_s06_w1.TIF,195486 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_C24_C100_F7_s12_w2.TIF,290046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D01_C1_F10_s19_w2.TIF,27098 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D02_C5_F10_s13_w2.TIF,46164 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D02_C5_F10_s17_w1.TIF,28730 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D03_C10_F10_s09_w2.TIF,67668 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s01_w1.TIF,45400 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s08_w1.TIF,45484 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s10_w1.TIF,44310 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s11_w2.TIF,84362 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s15_w2.TIF,86104 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D04_C14_F10_s22_w2.TIF,81054 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D05_C18_F10_s01_w2.TIF,99902 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D05_C18_F10_s02_w1.TIF,49952 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D05_C18_F10_s04_w1.TIF,50736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D05_C18_F10_s20_w1.TIF,53046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D05_C18_F10_s21_w1.TIF,53900 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D06_C23_F10_s11_w1.TIF,59952 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D06_C23_F10_s12_w1.TIF,61798 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D06_C23_F10_s21_w1.TIF,61458 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D06_C23_F10_s24_w1.TIF,64004 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D07_C27_F10_s12_w1.TIF,67900 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D07_C27_F10_s25_w2.TIF,128622 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D08_C31_F10_s05_w2.TIF,135280 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D08_C31_F10_s14_w2.TIF,153052 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D08_C31_F10_s17_w2.TIF,125890 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D09_C35_F10_s19_w1.TIF,83868 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D09_C35_F10_s21_w1.TIF,83374 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D10_C40_F10_s05_w2.TIF,164684 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D10_C40_F10_s12_w2.TIF,158662 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D10_C40_F10_s14_w2.TIF,169462 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D10_C40_F10_s20_w2.TIF,165298 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D11_C44_F10_s02_w2.TIF,184700 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D12_C48_F10_s08_w2.TIF,186736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D12_C48_F10_s12_w1.TIF,104804 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D12_C48_F10_s24_w2.TIF,183642 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D13_C53_F10_s18_w1.TIF,113040 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D13_C53_F10_s25_w1.TIF,112146 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D14_C57_F10_s08_w2.TIF,204246 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D14_C57_F10_s09_w2.TIF,210472 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D14_C57_F10_s14_w1.TIF,121386 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D15_C61_F10_s14_w1.TIF,126618 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D15_C61_F10_s17_w2.TIF,206680 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D15_C61_F10_s19_w1.TIF,123222 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D15_C61_F10_s25_w1.TIF,131592 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D16_C66_F10_s11_w2.TIF,231356 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D17_C70_F10_s03_w1.TIF,138064 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D17_C70_F10_s10_w1.TIF,144046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D19_C78_F10_s08_w2.TIF,257290 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D19_C78_F10_s19_w1.TIF,153766 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D20_C83_F10_s07_w2.TIF,272158 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D20_C83_F10_s12_w1.TIF,163574 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D20_C83_F10_s15_w2.TIF,267756 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D21_C87_F10_s01_w1.TIF,161530 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D21_C87_F10_s05_w2.TIF,266508 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D21_C87_F10_s09_w2.TIF,277594 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D21_C87_F10_s25_w2.TIF,280624 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D22_C91_F10_s07_w1.TIF,172310 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D22_C91_F10_s10_w2.TIF,283570 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D22_C91_F10_s11_w2.TIF,278724 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D22_C91_F10_s15_w2.TIF,279852 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D22_C91_F10_s23_w2.TIF,282638 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D24_C100_F10_s12_w2.TIF,286252 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_D24_C100_F10_s23_w2.TIF,285082 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E01_C1_F14_s08_w1.TIF,11154 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E01_C1_F14_s08_w2.TIF,16546 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E01_C1_F14_s17_w2.TIF,17656 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E02_C5_F14_s01_w1.TIF,19216 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E02_C5_F14_s06_w2.TIF,36876 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E02_C5_F14_s07_w1.TIF,19724 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E02_C5_F14_s14_w1.TIF,20494 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E02_C5_F14_s24_w1.TIF,17342 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E03_C10_F14_s01_w1.TIF,29744 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E03_C10_F14_s25_w1.TIF,27374 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E04_C14_F14_s05_w1.TIF,39570 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E04_C14_F14_s06_w1.TIF,38046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E05_C18_F14_s14_w2.TIF,92124 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E05_C18_F14_s20_w2.TIF,96676 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E05_C18_F14_s22_w1.TIF,47592 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E06_C23_F14_s06_w1.TIF,55556 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s01_w1.TIF,65150 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s05_w1.TIF,65402 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s09_w1.TIF,59212 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s10_w2.TIF,125884 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s13_w2.TIF,127084 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E07_C27_F14_s24_w1.TIF,64402 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E08_C31_F14_s09_w2.TIF,136506 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E08_C31_F14_s18_w1.TIF,70190 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E09_C35_F14_s23_w2.TIF,157654 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E10_C40_F14_s08_w2.TIF,155560 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E11_C44_F14_s04_w1.TIF,95686 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E11_C44_F14_s19_w1.TIF,97646 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E12_C48_F14_s05_w2.TIF,194918 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E12_C48_F14_s09_w2.TIF,188412 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E12_C48_F14_s10_w2.TIF,200066 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E13_C53_F14_s15_w1.TIF,105038 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E14_C57_F14_s04_w2.TIF,210180 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E14_C57_F14_s05_w1.TIF,121818 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E15_C61_F14_s07_w2.TIF,227876 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E16_C66_F14_s01_w2.TIF,226316 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E16_C66_F14_s19_w1.TIF,131114 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E18_C74_F14_s03_w1.TIF,144360 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E18_C74_F14_s16_w2.TIF,247844 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E19_C78_F14_s13_w2.TIF,260622 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E19_C78_F14_s15_w1.TIF,148104 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E21_C87_F14_s15_w2.TIF,280214 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E21_C87_F14_s22_w1.TIF,166312 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E22_C91_F14_s18_w1.TIF,174202 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E23_C96_F14_s05_w1.TIF,185074 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E23_C96_F14_s06_w1.TIF,182730 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E24_C100_F14_s07_w1.TIF,183460 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_E24_C100_F14_s11_w2.TIF,293736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F01_C1_F17_s13_w2.TIF,15176 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F01_C1_F17_s14_w2.TIF,16750 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F01_C1_F17_s16_w1.TIF,10774 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F02_C5_F17_s06_w2.TIF,36596 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F02_C5_F17_s13_w1.TIF,20126 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F02_C5_F17_s14_w2.TIF,37136 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F03_C10_F17_s10_w1.TIF,30068 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F03_C10_F17_s10_w2.TIF,60462 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F03_C10_F17_s11_w2.TIF,58460 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F03_C10_F17_s14_w2.TIF,56434 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F04_C14_F17_s02_w2.TIF,77932 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F04_C14_F17_s06_w1.TIF,38456 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F04_C14_F17_s14_w2.TIF,72616 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F04_C14_F17_s24_w2.TIF,73390 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F05_C18_F17_s03_w2.TIF,105718 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F05_C18_F17_s16_w1.TIF,47658 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F05_C18_F17_s20_w1.TIF,47986 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F05_C18_F17_s21_w1.TIF,48370 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F05_C18_F17_s21_w2.TIF,97930 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F06_C23_F17_s06_w1.TIF,56492 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F06_C23_F17_s08_w2.TIF,117048 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F06_C23_F17_s20_w2.TIF,118504 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F07_C27_F17_s01_w2.TIF,130784 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F07_C27_F17_s10_w2.TIF,128066 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F08_C31_F17_s14_w1.TIF,77088 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F08_C31_F17_s20_w1.TIF,73510 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F09_C35_F17_s12_w2.TIF,156318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F09_C35_F17_s15_w1.TIF,76944 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F10_C40_F17_s19_w2.TIF,170824 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F10_C40_F17_s20_w2.TIF,168868 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F11_C44_F17_s03_w1.TIF,96644 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F11_C44_F17_s17_w1.TIF,94958 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F12_C48_F17_s22_w1.TIF,106612 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F13_C53_F17_s04_w1.TIF,115522 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F13_C53_F17_s05_w1.TIF,116558 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F13_C53_F17_s10_w1.TIF,112490 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F14_C57_F17_s05_w1.TIF,124984 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F14_C57_F17_s08_w2.TIF,207510 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F14_C57_F17_s12_w1.TIF,126086 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F14_C57_F17_s18_w1.TIF,124922 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F14_C57_F17_s22_w2.TIF,207208 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F15_C61_F17_s01_w1.TIF,133932 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F15_C61_F17_s06_w1.TIF,130200 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F15_C61_F17_s21_w2.TIF,214034 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F16_C66_F17_s02_w2.TIF,235034 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F16_C66_F17_s21_w1.TIF,135200 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F17_C70_F17_s06_w1.TIF,148258 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F17_C70_F17_s08_w2.TIF,242020 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F17_C70_F17_s10_w2.TIF,246820 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F17_C70_F17_s23_w1.TIF,147004 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F18_C74_F17_s09_w2.TIF,248662 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F18_C74_F17_s21_w1.TIF,153718 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F19_C78_F17_s01_w1.TIF,155418 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F20_C83_F17_s23_w1.TIF,164030 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F20_C83_F17_s24_w1.TIF,167462 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F22_C91_F17_s01_w2.TIF,276576 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F22_C91_F17_s05_w1.TIF,181962 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F22_C91_F17_s10_w1.TIF,187788 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F22_C91_F17_s13_w1.TIF,175994 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F22_C91_F17_s14_w2.TIF,288190 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F23_C96_F17_s10_w1.TIF,189178 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F23_C96_F17_s22_w2.TIF,297650 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F24_C100_F17_s04_w2.TIF,290922 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F24_C100_F17_s09_w2.TIF,295476 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_F24_C100_F17_s10_w1.TIF,192376 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s06_w1.TIF,10618 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s07_w2.TIF,14080 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s08_w1.TIF,10584 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s13_w1.TIF,10568 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s19_w1.TIF,10688 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s21_w1.TIF,10362 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G01_C1_F20_s22_w2.TIF,14466 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G02_C5_F20_s08_w1.TIF,20320 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G02_C5_F20_s15_w2.TIF,36712 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G03_C10_F20_s01_w2.TIF,61460 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G03_C10_F20_s06_w1.TIF,29316 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G04_C14_F20_s13_w2.TIF,81052 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G05_C18_F20_s15_w1.TIF,47878 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G07_C27_F20_s13_w2.TIF,135132 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G08_C31_F20_s02_w1.TIF,75182 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G08_C31_F20_s23_w2.TIF,145450 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G09_C35_F20_s08_w1.TIF,82708 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G09_C35_F20_s16_w1.TIF,87578 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G09_C35_F20_s19_w2.TIF,164378 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G10_C40_F20_s02_w2.TIF,188024 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G10_C40_F20_s10_w1.TIF,94402 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G11_C44_F20_s09_w1.TIF,99392 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G12_C48_F20_s03_w1.TIF,113296 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G13_C53_F20_s10_w1.TIF,118530 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G13_C53_F20_s15_w2.TIF,202256 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G13_C53_F20_s23_w2.TIF,226918 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G14_C57_F20_s03_w1.TIF,124448 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G14_C57_F20_s07_w2.TIF,215234 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G14_C57_F20_s10_w1.TIF,125876 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G15_C61_F20_s01_w2.TIF,250910 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G15_C61_F20_s17_w2.TIF,216002 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G16_C66_F20_s04_w2.TIF,238398 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G16_C66_F20_s07_w2.TIF,244286 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G16_C66_F20_s22_w1.TIF,143162 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G19_C78_F20_s13_w2.TIF,267974 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G19_C78_F20_s15_w1.TIF,159916 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G20_C83_F20_s06_w1.TIF,174106 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G20_C83_F20_s17_w2.TIF,267526 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G21_C87_F20_s05_w1.TIF,181456 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G21_C87_F20_s08_w1.TIF,180696 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G21_C87_F20_s12_w1.TIF,188512 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G21_C87_F20_s17_w2.TIF,266720 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G22_C91_F20_s14_w1.TIF,191124 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G22_C91_F20_s14_w2.TIF,292566 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G23_C96_F20_s20_w1.TIF,183552 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G23_C96_F20_s23_w1.TIF,199632 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G23_C96_F20_s24_w2.TIF,292816 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G24_C100_F20_s10_w1.TIF,202170 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_G24_C100_F20_s12_w1.TIF,200706 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H01_C1_F23_s03_w1.TIF,10354 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H01_C1_F23_s04_w2.TIF,14100 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H01_C1_F23_s09_w2.TIF,16132 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H02_C5_F23_s06_w2.TIF,38964 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H02_C5_F23_s18_w1.TIF,20222 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H02_C5_F23_s23_w1.TIF,18480 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s05_w1.TIF,33606 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s09_w2.TIF,64940 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s11_w2.TIF,63302 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s13_w1.TIF,31996 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s18_w2.TIF,54066 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H03_C10_F23_s25_w2.TIF,55742 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H04_C14_F23_s02_w1.TIF,43868 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H04_C14_F23_s18_w2.TIF,84040 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H05_C18_F23_s01_w2.TIF,103684 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H07_C27_F23_s07_w1.TIF,72992 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H09_C35_F23_s18_w1.TIF,90292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H09_C35_F23_s25_w2.TIF,182688 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H10_C40_F23_s05_w1.TIF,100580 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H10_C40_F23_s16_w2.TIF,179636 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H10_C40_F23_s22_w1.TIF,100864 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H11_C44_F23_s16_w1.TIF,110484 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H13_C53_F23_s01_w2.TIF,222732 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H13_C53_F23_s10_w1.TIF,125544 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H13_C53_F23_s16_w2.TIF,217028 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H14_C57_F23_s13_w2.TIF,225100 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H15_C61_F23_s12_w1.TIF,144974 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H15_C61_F23_s15_w2.TIF,233210 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H15_C61_F23_s22_w1.TIF,145462 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H16_C66_F23_s13_w1.TIF,153516 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H16_C66_F23_s14_w2.TIF,239982 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H17_C70_F23_s02_w2.TIF,249986 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H17_C70_F23_s18_w2.TIF,249810 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H18_C74_F23_s08_w2.TIF,263400 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H18_C74_F23_s19_w1.TIF,173182 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H19_C78_F23_s11_w1.TIF,166628 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H20_C83_F23_s03_w2.TIF,270764 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H21_C87_F23_s04_w2.TIF,286170 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H21_C87_F23_s13_w2.TIF,282238 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H21_C87_F23_s17_w2.TIF,271046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H21_C87_F23_s18_w1.TIF,192180 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H22_C91_F23_s19_w2.TIF,290786 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H22_C91_F23_s21_w2.TIF,291910 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H22_C91_F23_s22_w1.TIF,194730 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H22_C91_F23_s24_w1.TIF,196788 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H23_C96_F23_s07_w2.TIF,294668 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H23_C96_F23_s19_w1.TIF,201444 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H23_C96_F23_s19_w2.TIF,288784 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H23_C96_F23_s20_w1.TIF,192850 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H24_C100_F23_s14_w1.TIF,209318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H24_C100_F23_s18_w2.TIF,298940 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_H24_C100_F23_s20_w1.TIF,205718 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I01_C1_F26_s05_w2.TIF,15274 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I01_C1_F26_s06_w2.TIF,15624 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I01_C1_F26_s08_w1.TIF,11114 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I01_C1_F26_s14_w2.TIF,15682 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I01_C1_F26_s24_w1.TIF,11154 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I02_C5_F26_s04_w2.TIF,41562 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I03_C10_F26_s06_w1.TIF,32296 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I03_C10_F26_s06_w2.TIF,56340 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I03_C10_F26_s11_w1.TIF,35202 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I03_C10_F26_s25_w2.TIF,58424 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I04_C14_F26_s08_w2.TIF,88986 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I04_C14_F26_s17_w2.TIF,84568 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I04_C14_F26_s24_w1.TIF,43740 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I05_C18_F26_s03_w2.TIF,121072 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I05_C18_F26_s06_w1.TIF,56112 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I05_C18_F26_s19_w1.TIF,53132 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I05_C18_F26_s23_w2.TIF,106146 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I06_C23_F26_s08_w2.TIF,132118 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I06_C23_F26_s10_w1.TIF,63920 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I06_C23_F26_s12_w2.TIF,125234 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I06_C23_F26_s14_w2.TIF,122468 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I06_C23_F26_s22_w1.TIF,67682 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I07_C27_F26_s05_w2.TIF,144558 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I07_C27_F26_s06_w1.TIF,78598 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I07_C27_F26_s09_w2.TIF,127962 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I07_C27_F26_s12_w1.TIF,77400 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I07_C27_F26_s20_w1.TIF,78960 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I09_C35_F26_s03_w1.TIF,94380 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I09_C35_F26_s08_w1.TIF,93650 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I09_C35_F26_s11_w1.TIF,93560 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I10_C40_F26_s18_w1.TIF,108318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I10_C40_F26_s20_w1.TIF,105162 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I12_C48_F26_s07_w1.TIF,126608 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I12_C48_F26_s09_w2.TIF,208920 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I13_C53_F26_s03_w2.TIF,219218 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I13_C53_F26_s13_w2.TIF,224904 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I13_C53_F26_s16_w2.TIF,222760 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I15_C61_F26_s07_w1.TIF,154586 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I16_C66_F26_s01_w2.TIF,246690 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I16_C66_F26_s04_w2.TIF,249304 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I16_C66_F26_s06_w1.TIF,157982 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I16_C66_F26_s06_w2.TIF,246570 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I16_C66_F26_s20_w1.TIF,166730 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I17_C70_F26_s15_w1.TIF,173252 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I18_C74_F26_s02_w2.TIF,269770 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I18_C74_F26_s12_w1.TIF,177686 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I18_C74_F26_s19_w2.TIF,277936 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I19_C78_F26_s04_w2.TIF,280522 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I19_C78_F26_s23_w2.TIF,270832 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I20_C83_F26_s09_w1.TIF,185742 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I20_C83_F26_s16_w2.TIF,280292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I21_C87_F26_s07_w2.TIF,287058 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I21_C87_F26_s14_w2.TIF,282228 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I21_C87_F26_s17_w2.TIF,275896 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I22_C91_F26_s03_w1.TIF,199846 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I22_C91_F26_s04_w1.TIF,200390 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I22_C91_F26_s16_w1.TIF,205020 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I23_C96_F26_s08_w1.TIF,220308 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_I24_C100_F26_s08_w1.TIF,212592 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J01_C1_F29_s10_w2.TIF,15958 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J01_C1_F29_s17_w1.TIF,11188 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J01_C1_F29_s19_w1.TIF,11214 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J02_C5_F29_s24_w1.TIF,19818 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J03_C10_F29_s01_w2.TIF,68698 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J03_C10_F29_s02_w2.TIF,74562 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J03_C10_F29_s09_w1.TIF,36672 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J03_C10_F29_s13_w2.TIF,64322 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J03_C10_F29_s23_w2.TIF,63732 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J04_C14_F29_s04_w2.TIF,81944 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J04_C14_F29_s14_w2.TIF,82430 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J04_C14_F29_s15_w2.TIF,94248 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J04_C14_F29_s19_w1.TIF,48060 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J05_C18_F29_s04_w2.TIF,100882 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J05_C18_F29_s23_w2.TIF,109092 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J05_C18_F29_s25_w2.TIF,105186 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J06_C23_F29_s05_w2.TIF,126720 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J06_C23_F29_s11_w2.TIF,124136 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J06_C23_F29_s17_w2.TIF,128276 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J07_C27_F29_s13_w1.TIF,79732 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J07_C27_F29_s19_w2.TIF,159986 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J07_C27_F29_s25_w1.TIF,80888 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J08_C31_F29_s02_w2.TIF,157186 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J09_C35_F29_s09_w1.TIF,94582 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J10_C40_F29_s06_w1.TIF,107024 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J10_C40_F29_s11_w1.TIF,115132 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J10_C40_F29_s19_w1.TIF,111940 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J11_C44_F29_s10_w2.TIF,201220 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J11_C44_F29_s15_w2.TIF,205746 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J12_C48_F29_s05_w2.TIF,222280 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J12_C48_F29_s12_w1.TIF,127672 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J12_C48_F29_s25_w2.TIF,206632 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J13_C53_F29_s21_w2.TIF,213866 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J14_C57_F29_s07_w1.TIF,143786 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J14_C57_F29_s15_w1.TIF,141904 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J15_C61_F29_s19_w2.TIF,234468 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J15_C61_F29_s21_w2.TIF,235024 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J16_C66_F29_s01_w1.TIF,165200 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J16_C66_F29_s05_w2.TIF,253742 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J16_C66_F29_s10_w2.TIF,252044 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J16_C66_F29_s22_w2.TIF,247568 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J16_C66_F29_s23_w1.TIF,172386 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J17_C70_F29_s01_w2.TIF,246810 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J17_C70_F29_s10_w1.TIF,176586 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J17_C70_F29_s23_w1.TIF,180698 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J17_C70_F29_s23_w2.TIF,270760 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J18_C74_F29_s17_w2.TIF,266804 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J19_C78_F29_s02_w2.TIF,282938 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J19_C78_F29_s06_w1.TIF,182646 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J19_C78_F29_s17_w1.TIF,189652 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J19_C78_F29_s24_w2.TIF,255208 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J19_C78_F29_s25_w2.TIF,272098 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J20_C83_F29_s11_w1.TIF,195772 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J20_C83_F29_s12_w1.TIF,205474 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J21_C87_F29_s14_w1.TIF,205424 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J21_C87_F29_s20_w1.TIF,215072 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J22_C91_F29_s01_w1.TIF,210754 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J22_C91_F29_s10_w2.TIF,299550 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J23_C96_F29_s08_w1.TIF,226156 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_J24_C100_F29_s19_w1.TIF,227428 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K01_C1_F32_s12_w1.TIF,9768 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K01_C1_F32_s17_w1.TIF,11412 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K02_C5_F32_s10_w2.TIF,39470 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K02_C5_F32_s16_w2.TIF,41444 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K02_C5_F32_s23_w2.TIF,35512 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K02_C5_F32_s25_w2.TIF,45356 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K03_C10_F32_s15_w1.TIF,40558 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K04_C14_F32_s09_w2.TIF,90636 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K04_C14_F32_s13_w2.TIF,93304 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K04_C14_F32_s14_w1.TIF,49308 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K04_C14_F32_s17_w2.TIF,89898 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K04_C14_F32_s21_w2.TIF,85878 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K05_C18_F32_s03_w1.TIF,64388 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K07_C27_F32_s04_w1.TIF,84092 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K07_C27_F32_s18_w1.TIF,77438 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K07_C27_F32_s21_w1.TIF,83294 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K08_C31_F32_s19_w2.TIF,166160 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K09_C35_F32_s04_w2.TIF,185736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K09_C35_F32_s10_w2.TIF,171828 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K10_C40_F32_s25_w1.TIF,116788 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K11_C44_F32_s13_w1.TIF,128864 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K12_C48_F32_s07_w2.TIF,224562 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K12_C48_F32_s12_w1.TIF,134618 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K12_C48_F32_s19_w2.TIF,213010 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K12_C48_F32_s20_w1.TIF,135772 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K13_C53_F32_s03_w1.TIF,143448 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K13_C53_F32_s05_w2.TIF,248304 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K13_C53_F32_s07_w1.TIF,143046 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K13_C53_F32_s12_w2.TIF,239670 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K14_C57_F32_s11_w1.TIF,158464 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s02_w1.TIF,162560 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s08_w1.TIF,164546 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s13_w2.TIF,257334 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s17_w1.TIF,161182 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s18_w2.TIF,249950 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K15_C61_F32_s22_w1.TIF,167860 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K16_C66_F32_s08_w1.TIF,178924 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K17_C70_F32_s06_w2.TIF,279710 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K17_C70_F32_s10_w2.TIF,270190 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K17_C70_F32_s11_w2.TIF,284762 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K17_C70_F32_s23_w2.TIF,276844 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K19_C78_F32_s03_w1.TIF,196584 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K19_C78_F32_s14_w1.TIF,200318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K19_C78_F32_s19_w1.TIF,203126 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K19_C78_F32_s24_w2.TIF,258462 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K20_C83_F32_s17_w2.TIF,284138 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K20_C83_F32_s22_w1.TIF,203826 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K20_C83_F32_s25_w1.TIF,209686 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K21_C87_F32_s21_w1.TIF,213508 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K22_C91_F32_s03_w2.TIF,283076 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K22_C91_F32_s09_w2.TIF,299612 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K22_C91_F32_s10_w1.TIF,233794 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K23_C96_F32_s24_w2.TIF,306720 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K24_C100_F32_s09_w1.TIF,240040 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_K24_C100_F32_s16_w2.TIF,303238 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L01_C1_F35_s06_w2.TIF,16552 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L01_C1_F35_s10_w2.TIF,16722 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L02_C5_F35_s10_w1.TIF,24244 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L02_C5_F35_s16_w2.TIF,43042 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L03_C10_F35_s01_w1.TIF,40796 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L04_C14_F35_s11_w2.TIF,97204 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L04_C14_F35_s20_w2.TIF,91380 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L05_C18_F35_s16_w2.TIF,116742 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L06_C23_F35_s06_w2.TIF,142666 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L06_C23_F35_s12_w1.TIF,78636 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L06_C23_F35_s16_w2.TIF,127646 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L07_C27_F35_s03_w1.TIF,90416 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L08_C31_F35_s09_w1.TIF,99648 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L08_C31_F35_s15_w2.TIF,192764 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L08_C31_F35_s19_w2.TIF,172392 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L08_C31_F35_s20_w2.TIF,172372 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L08_C31_F35_s22_w2.TIF,169932 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L09_C35_F35_s02_w1.TIF,105202 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L09_C35_F35_s02_w2.TIF,176542 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L09_C35_F35_s03_w1.TIF,107528 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L09_C35_F35_s10_w2.TIF,177794 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s04_w1.TIF,122506 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s08_w1.TIF,118786 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s11_w2.TIF,212000 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s16_w1.TIF,122124 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s21_w2.TIF,215338 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L10_C40_F35_s22_w1.TIF,125362 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L11_C44_F35_s03_w1.TIF,130586 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L11_C44_F35_s22_w2.TIF,203204 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L12_C48_F35_s03_w2.TIF,244940 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L12_C48_F35_s09_w1.TIF,140978 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L12_C48_F35_s11_w1.TIF,142650 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L12_C48_F35_s16_w2.TIF,220968 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L13_C53_F35_s10_w1.TIF,150570 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L13_C53_F35_s15_w2.TIF,229924 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L13_C53_F35_s18_w1.TIF,155770 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L14_C57_F35_s07_w1.TIF,159102 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L14_C57_F35_s10_w1.TIF,162402 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L15_C61_F35_s01_w1.TIF,183926 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L15_C61_F35_s24_w1.TIF,165948 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L16_C66_F35_s05_w1.TIF,185346 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L16_C66_F35_s07_w2.TIF,270852 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L16_C66_F35_s11_w2.TIF,272500 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L16_C66_F35_s14_w1.TIF,180604 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L16_C66_F35_s20_w2.TIF,276964 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L17_C70_F35_s01_w2.TIF,256058 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L17_C70_F35_s09_w1.TIF,189600 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L19_C78_F35_s06_w1.TIF,199510 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L19_C78_F35_s13_w2.TIF,284800 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L19_C78_F35_s16_w1.TIF,196206 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L19_C78_F35_s24_w1.TIF,197150 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L21_C87_F35_s11_w2.TIF,292244 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L21_C87_F35_s14_w1.TIF,223302 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L21_C87_F35_s25_w1.TIF,236672 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L22_C91_F35_s07_w1.TIF,232424 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L22_C91_F35_s10_w1.TIF,242450 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L22_C91_F35_s20_w2.TIF,289610 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L24_C100_F35_s05_w1.TIF,250834 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_L24_C100_F35_s23_w1.TIF,239382 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M01_C1_F39_s11_w2.TIF,17854 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M01_C1_F39_s20_w1.TIF,11972 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M02_C5_F39_s06_w1.TIF,25562 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M02_C5_F39_s14_w1.TIF,27056 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M02_C5_F39_s22_w2.TIF,41456 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M02_C5_F39_s23_w2.TIF,37888 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M03_C10_F39_s04_w1.TIF,41508 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M03_C10_F39_s25_w1.TIF,38174 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s02_w2.TIF,102850 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s09_w2.TIF,99118 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s10_w1.TIF,54170 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s13_w2.TIF,102342 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s16_w2.TIF,104546 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M04_C14_F39_s22_w2.TIF,102918 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M05_C18_F39_s10_w2.TIF,120146 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M05_C18_F39_s14_w1.TIF,68932 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M05_C18_F39_s20_w1.TIF,70312 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M06_C23_F39_s04_w1.TIF,90726 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M06_C23_F39_s15_w2.TIF,152178 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M06_C23_F39_s18_w1.TIF,86366 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M06_C23_F39_s24_w2.TIF,156362 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M06_C23_F39_s25_w2.TIF,153496 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M07_C27_F39_s08_w2.TIF,161610 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M08_C31_F39_s08_w1.TIF,108914 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M08_C31_F39_s25_w1.TIF,104662 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M09_C35_F39_s22_w2.TIF,187984 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M10_C40_F39_s05_w1.TIF,131224 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M10_C40_F39_s09_w1.TIF,134200 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M10_C40_F39_s15_w1.TIF,116640 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M10_C40_F39_s24_w1.TIF,132036 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M11_C44_F39_s13_w1.TIF,143624 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M11_C44_F39_s17_w2.TIF,210964 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M13_C53_F39_s04_w1.TIF,168944 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M13_C53_F39_s09_w2.TIF,260358 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M13_C53_F39_s11_w2.TIF,259584 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M13_C53_F39_s15_w2.TIF,236562 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M13_C53_F39_s19_w1.TIF,161092 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M14_C57_F39_s21_w1.TIF,179124 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M14_C57_F39_s24_w2.TIF,259226 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M15_C61_F39_s02_w1.TIF,178304 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M15_C61_F39_s02_w2.TIF,254328 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M15_C61_F39_s20_w2.TIF,255854 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M15_C61_F39_s21_w2.TIF,251984 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M16_C66_F39_s02_w2.TIF,269910 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M18_C74_F39_s15_w2.TIF,285658 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M18_C74_F39_s25_w2.TIF,293572 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M19_C78_F39_s04_w1.TIF,224394 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M19_C78_F39_s05_w1.TIF,216744 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M19_C78_F39_s17_w2.TIF,280372 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M21_C87_F39_s05_w1.TIF,229592 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M21_C87_F39_s08_w2.TIF,296666 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M21_C87_F39_s16_w1.TIF,237418 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M21_C87_F39_s24_w2.TIF,303988 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M22_C91_F39_s01_w2.TIF,301484 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M22_C91_F39_s03_w1.TIF,230124 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M22_C91_F39_s11_w2.TIF,308726 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M22_C91_F39_s20_w1.TIF,231682 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M23_C96_F39_s06_w2.TIF,304754 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M23_C96_F39_s17_w1.TIF,245694 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M24_C100_F39_s18_w1.TIF,254964 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_M24_C100_F39_s19_w1.TIF,254284 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N01_C1_F42_s08_w1.TIF,12226 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N01_C1_F42_s09_w2.TIF,18472 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N01_C1_F42_s11_w1.TIF,12344 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N01_C1_F42_s11_w2.TIF,18282 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N01_C1_F42_s16_w1.TIF,12330 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N02_C5_F42_s08_w2.TIF,51724 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N02_C5_F42_s25_w1.TIF,28278 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N03_C10_F42_s02_w2.TIF,88076 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N04_C14_F42_s09_w2.TIF,102654 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N04_C14_F42_s12_w1.TIF,59880 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N04_C14_F42_s20_w1.TIF,55750 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N04_C14_F42_s24_w1.TIF,56662 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N05_C18_F42_s01_w2.TIF,132226 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N05_C18_F42_s19_w1.TIF,68106 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N07_C27_F42_s12_w1.TIF,100446 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N07_C27_F42_s16_w1.TIF,95790 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N07_C27_F42_s20_w2.TIF,176720 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N08_C31_F42_s09_w1.TIF,109918 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N08_C31_F42_s19_w2.TIF,187148 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N09_C35_F42_s06_w2.TIF,178370 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N09_C35_F42_s10_w1.TIF,120360 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N09_C35_F42_s17_w1.TIF,126764 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N10_C40_F42_s04_w1.TIF,135086 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N10_C40_F42_s07_w1.TIF,135638 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N10_C40_F42_s09_w1.TIF,140192 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N11_C44_F42_s09_w1.TIF,141612 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N11_C44_F42_s11_w1.TIF,143904 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N11_C44_F42_s22_w2.TIF,215292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N11_C44_F42_s23_w2.TIF,236210 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N12_C48_F42_s11_w2.TIF,239980 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N12_C48_F42_s12_w2.TIF,233444 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N13_C53_F42_s02_w2.TIF,250318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N13_C53_F42_s04_w1.TIF,176156 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N13_C53_F42_s16_w1.TIF,167210 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N13_C53_F42_s17_w2.TIF,249650 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N13_C53_F42_s19_w2.TIF,257294 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N14_C57_F42_s12_w2.TIF,248888 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N14_C57_F42_s20_w1.TIF,185736 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N15_C61_F42_s04_w2.TIF,275624 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N15_C61_F42_s05_w2.TIF,268194 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N15_C61_F42_s17_w1.TIF,182318 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N15_C61_F42_s20_w2.TIF,259996 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N17_C70_F42_s18_w2.TIF,278982 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N18_C74_F42_s07_w2.TIF,289358 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N19_C78_F42_s02_w2.TIF,300264 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N19_C78_F42_s19_w2.TIF,298808 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N19_C78_F42_s24_w2.TIF,269292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N21_C87_F42_s05_w1.TIF,235152 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N21_C87_F42_s09_w1.TIF,250636 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N21_C87_F42_s23_w1.TIF,244034 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N22_C91_F42_s04_w2.TIF,294240 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N22_C91_F42_s08_w2.TIF,301716 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N24_C100_F42_s02_w2.TIF,307846 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_N24_C100_F42_s16_w2.TIF,306920 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O01_C1_F45_s22_w2.TIF,16662 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O03_C10_F45_s07_w1.TIF,48092 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O03_C10_F45_s13_w2.TIF,78104 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O03_C10_F45_s19_w2.TIF,70108 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O04_C14_F45_s12_w2.TIF,111418 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O05_C18_F45_s04_w1.TIF,70586 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O05_C18_F45_s17_w2.TIF,130652 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O05_C18_F45_s21_w2.TIF,136552 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O06_C23_F45_s09_w2.TIF,152388 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O06_C23_F45_s15_w2.TIF,158616 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O06_C23_F45_s17_w2.TIF,150816 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O06_C23_F45_s25_w1.TIF,91100 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O07_C27_F45_s03_w1.TIF,102310 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O07_C27_F45_s20_w2.TIF,179490 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O07_C27_F45_s25_w2.TIF,168944 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O08_C31_F45_s06_w1.TIF,113500 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O08_C31_F45_s13_w2.TIF,183210 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O08_C31_F45_s19_w2.TIF,190484 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O08_C31_F45_s20_w2.TIF,186630 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O09_C35_F45_s04_w1.TIF,128534 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O09_C35_F45_s15_w2.TIF,205020 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O09_C35_F45_s20_w2.TIF,198204 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O10_C40_F45_s07_w2.TIF,210902 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O10_C40_F45_s19_w2.TIF,222600 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O11_C44_F45_s07_w1.TIF,153464 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O11_C44_F45_s21_w2.TIF,244638 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O11_C44_F45_s25_w2.TIF,236988 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O12_C48_F45_s06_w1.TIF,164666 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O12_C48_F45_s12_w2.TIF,235870 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O13_C53_F45_s07_w1.TIF,169026 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O14_C57_F45_s01_w2.TIF,261208 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O14_C57_F45_s12_w1.TIF,182248 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O14_C57_F45_s19_w1.TIF,184740 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O15_C61_F45_s03_w1.TIF,184974 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O15_C61_F45_s23_w1.TIF,185940 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O16_C66_F45_s06_w1.TIF,196228 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O16_C66_F45_s10_w2.TIF,269906 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O17_C70_F45_s14_w1.TIF,209916 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O19_C78_F45_s03_w1.TIF,223672 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O19_C78_F45_s08_w1.TIF,226032 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O19_C78_F45_s15_w2.TIF,286280 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O20_C83_F45_s19_w1.TIF,246852 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O20_C83_F45_s22_w1.TIF,229314 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O21_C87_F45_s06_w2.TIF,298018 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O21_C87_F45_s09_w2.TIF,313946 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O21_C87_F45_s17_w2.TIF,295996 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O21_C87_F45_s19_w1.TIF,235530 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O22_C91_F45_s08_w2.TIF,302566 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O23_C96_F45_s03_w1.TIF,257760 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O23_C96_F45_s16_w1.TIF,253798 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O23_C96_F45_s16_w2.TIF,308116 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O23_C96_F45_s20_w1.TIF,241346 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O24_C100_F45_s12_w1.TIF,264900 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O24_C100_F45_s13_w2.TIF,309252 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O24_C100_F45_s15_w2.TIF,310228 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_O24_C100_F45_s23_w1.TIF,255716 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P01_C1_F48_s24_w2.TIF,16218 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P02_C5_F48_s07_w2.TIF,49090 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P02_C5_F48_s19_w2.TIF,48508 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P03_C10_F48_s03_w2.TIF,73286 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P03_C10_F48_s14_w2.TIF,81548 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P05_C18_F48_s18_w1.TIF,80878 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P06_C23_F48_s02_w2.TIF,168364 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P06_C23_F48_s14_w1.TIF,93712 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P06_C23_F48_s21_w1.TIF,93128 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P06_C23_F48_s24_w1.TIF,98850 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P07_C27_F48_s09_w2.TIF,158242 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P07_C27_F48_s19_w2.TIF,193998 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P07_C27_F48_s22_w2.TIF,164404 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P08_C31_F48_s10_w2.TIF,193526 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P08_C31_F48_s14_w2.TIF,212222 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P08_C31_F48_s24_w1.TIF,126288 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P10_C40_F48_s15_w1.TIF,127396 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P10_C40_F48_s24_w2.TIF,217974 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P11_C44_F48_s24_w2.TIF,225370 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P12_C48_F48_s23_w1.TIF,166790 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P12_C48_F48_s24_w1.TIF,163344 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P13_C53_F48_s09_w2.TIF,271026 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P13_C53_F48_s10_w2.TIF,251274 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P13_C53_F48_s25_w1.TIF,174708 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P14_C57_F48_s02_w2.TIF,268174 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P14_C57_F48_s11_w1.TIF,189996 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P14_C57_F48_s19_w1.TIF,191098 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P15_C61_F48_s19_w1.TIF,193370 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P16_C66_F48_s11_w2.TIF,285950 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P17_C70_F48_s03_w1.TIF,214938 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P17_C70_F48_s05_w1.TIF,217292 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P18_C74_F48_s07_w1.TIF,225154 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P18_C74_F48_s12_w1.TIF,224042 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P20_C83_F48_s23_w2.TIF,292140 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P21_C87_F48_s17_w2.TIF,298272 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P21_C87_F48_s19_w1.TIF,240352 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P22_C91_F48_s05_w1.TIF,262404 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P23_C96_F48_s02_w1.TIF,262850 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P23_C96_F48_s09_w1.TIF,268208 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P23_C96_F48_s10_w1.TIF,269502 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P24_C100_F48_s08_w2.TIF,292004 +bbbc005,https://data.broadinstitute.org/bbbc/BBBC005/BBBC005_v1_images.zip,BBBC005_v1_images/SIMCEPImages_P24_C100_F48_s14_w1.TIF,257258 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_a04_s2_w1f93987d0-3bfa-41fa-a29d-abca69b4dbb4.tif,405508 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_a05_s2_w237c6946c-1075-48d2-9824-b666538c3ce3.tif,610540 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_a10_s1_w258f43aff-e8b0-48f7-9408-c705aaa10ad7.tif,682138 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_a10_s2_w10498d4d1-b505-43c0-aff3-bedcb9f5568c.tif,452418 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_a14_s2_w2b4bf69a4-7c28-4013-8b64-864d01e7c7aa.tif,684008 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_b08_s2_w1b55c82ca-0bb0-47df-93ad-106ec5591c43.tif,485442 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_b12_s2_w1b39231e7-603e-412f-8607-e50d874b724c.tif,551874 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_b18_s2_w215f1b83c-1da7-48a8-a776-35579cf5e99b.tif,641570 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_b19_s1_w1a8e367dd-31ab-471d-9134-f40def10fee4.tif,566202 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_c11_s1_w1f86af2d2-eacd-4330-b922-db441dca89f8.tif,529424 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_c23_s2_w24d371faa-d450-4656-8e9e-20eb5825f45f.tif,643320 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d06_s2_w17ebf2aa8-d3ba-4a82-8f43-32b5a928f307.tif,504510 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d13_s1_w2a751c38a-0d2b-40cf-85a5-56f9bfb39f73.tif,636986 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d13_s2_w2be169f30-6157-4c4f-912a-c0cbf6ef945e.tif,665210 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d15_s1_w2dc5aa557-9a6d-41d0-b49e-9ae2b39edc16.tif,642492 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d16_s1_w204a51af0-1586-4df1-b7c7-24aa30e3c6f2.tif,643214 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_d17_s2_w2baeda60e-5823-4b2e-affb-ac314d063f91.tif,485804 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_e06_s1_w24e518388-54d3-48e2-90bb-71c151bbb28e.tif,601118 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_e08_s2_w21781416c-a49d-4934-b864-24606e32509b.tif,589598 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_e21_s1_w20f27c312-11a1-41f8-984e-c84b29049ac0.tif,624266 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f06_s1_w16e36b686-ecb4-4cb7-89ea-5566880253f8.tif,532584 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f11_s2_w2ceea6589-9e0d-4ce5-919f-448c41538290.tif,627900 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f12_s1_w22c98b842-f828-43e2-8d17-1c2a920f7b8f.tif,631984 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f13_s2_w2d4f02b27-4ff3-4f14-91bc-26755b9f4c0d.tif,629450 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f17_s1_w2d3977132-2861-4a7f-886e-525308c5761d.tif,666642 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_f22_s1_w25b95f018-9327-4ad1-b3b8-2189f9f90792.tif,630152 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g04_s2_w224639ba4-2190-4ed4-889f-507775f431c3.tif,578098 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g10_s1_w2bf82b7e6-b3a0-4430-a1f4-c7568f985b4e.tif,641538 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g11_s2_w213713303-de5c-4252-a559-0f5ff4a34dcf.tif,627720 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g17_s1_w2cc9dd99a-dd4e-425d-9991-dd26fb895c2e.tif,632550 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g17_s2_w116e56772-6ca4-4e4c-a5e3-ab5338669ee3.tif,566914 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g24_s1_w164a361d5-5610-416f-a910-102cfac41e2f.tif,463282 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_g24_s1_w23e92521d-8ace-45fb-bd47-6953d3cfa9d6.tif,659216 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h09_s1_w19d3654a1-8251-4cb0-afc8-c1deb5618a43.tif,530908 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h10_s1_w2fff1f3e4-0b78-4bfb-b21f-c175434343b8.tif,634848 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h16_s1_w24268f06c-2dce-4824-843d-833fdb717daa.tif,631838 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h16_s2_w13cb523fa-f468-45c8-a71b-892fe1f57bf9.tif,567084 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h18_s2_w2b85d1aeb-f1b3-4811-abfe-ad39d1474820.tif,659014 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_h23_s1_w1b246db33-9d73-469e-8152-80b998e94849.tif,515108 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i04_s1_w152f3b77d-9502-4f1c-8fda-a5955452cf9f.tif,491880 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i06_s2_w21ead334d-c520-4187-a0ec-2d12fb61e0b8.tif,587214 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i07_s1_w10cbd1af1-e6d9-4cce-9a14-e62f0dacade6.tif,302168 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i12_s2_w170d95887-c4a1-46db-b13f-156b95ec5889.tif,435560 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i13_s1_w2dc523dfe-32be-43cc-9765-fb328af7fed9.tif,622868 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i20_s2_w1f389425f-c6d5-4031-9baf-084f6ab93dea.tif,560408 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i21_s2_w150bba379-6ea8-490d-a490-809241b3af1c.tif,564972 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_i23_s1_w1f0ad0515-b037-492f-83d0-5876b59f324d.tif,538648 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_j02_s2_w10e994fa0-0aaf-4e24-84d4-a7c42fad02de.tif,477884 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_j04_s2_w14f139555-56b2-4ada-bf0e-2b9efadf6c93.tif,485844 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_j04_s2_w2a2cb59a3-b513-446e-9b25-e328ca1d302d.tif,602252 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_j17_s2_w1a5fae7de-b633-4386-8113-5b88ddf5ea6a.tif,548684 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_j22_s1_w1ef274ab0-9d9e-4790-8ab3-f1330cca50aa.tif,573240 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_k18_s2_w1081e8c12-0657-4833-a7b6-1ad8842f7f3c.tif,558470 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l02_s2_w1dce0e0f2-994a-45d4-8eba-a57b0f1a274f.tif,489070 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l05_s2_w1351f46a7-24e1-4e24-8939-59e62770eaf9.tif,498748 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l20_s1_w2d8520055-ba99-42d5-b9f1-8fd1310a4a0c.tif,647392 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l20_s2_w24c7a9f4e-0290-4ea4-aaea-832261d178b7.tif,638246 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l23_s1_w1d818845d-d722-47ae-a207-ae39365eff06.tif,540322 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_l24_s2_w29e35bab0-4500-48ac-a2f7-01dab88a1dad.tif,646942 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_m01_s1_w2fd15199b-4273-4c1b-b458-5e5ba7b53878.tif,627702 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_m08_s2_w113622a71-1f9d-4f31-aa58-eb7513be77c8.tif,511006 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_m20_s1_w18f6941e5-1b0e-4990-9d91-9bb8d82c4330.tif,559460 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_n11_s1_w1822f7a4d-825a-4dd0-a4ac-d3a62dcf77cf.tif,523306 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_n23_s1_w28d85a771-a422-4595-8d41-0edd44afd51a.tif,685272 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_o02_s2_w1d568cfcc-7412-477e-b670-dc55973e5993.tif,481410 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_o04_s2_w25760d1f3-f0e4-427b-94ef-99aac07f6029.tif,595958 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_o06_s2_w1e5424362-65c8-4cda-9fab-5f0659188c62.tif,497464 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_o16_s1_w190f7c27c-22c4-4509-beca-d0fe32d08c91.tif,534034 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_o17_s1_w11efdac27-280e-471b-b629-cc8713ea0f46.tif,542730 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p01_s2_w178ec551f-9e8b-4e89-af0f-d8558615db5a.tif,336654 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p03_s1_w1203f9026-9f0b-477f-a17e-0208836b7305.tif,439472 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p14_s1_w252d4d4c8-61a9-4f66-8a6a-d27a93b6ccbc.tif,651000 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p17_s1_w2d6f4ee0f-2738-4f71-8e5e-b0cabc1de1a4.tif,616644 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p18_s1_w216c6871c-301b-4b48-9956-42a7f03cde1f.tif,621744 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p18_s2_w2079c6b15-c669-4db4-a169-5c5226af3746.tif,658476 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p19_s1_w2a9203072-b6a0-49ec-8b5d-44941ed6537f.tif,555968 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p20_s2_w20d1b2323-5c7f-4254-92e4-6be0baa65d47.tif,664388 +bbbc006_z00,https://data.broadinstitute.org/bbbc/BBBC006/BBBC006_v1_images_z_00.zip,BBBC006_v1_images_z_00/mcf-z-stacks-03212011_p24_s2_w1283f1213-dc59-40b5-ae21-9d66400a5f20.tif,597248 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-10-A-10.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-12-A-12.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-31-C-07.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-46-D-10.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-51-E-03.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-59-E-11.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-72-F-12.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel1-74-G-02.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-06-A-06.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-41-D-05.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-43-D-07.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-52-E-04.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-55-E-07.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-77-G-05.BMP,410678 +bbbc013_bmp,https://data.broadinstitute.org/bbbc/BBBC013/BBBC013_v1_images_bmp.zip,BBBC013_v1_images_bmp/Channel2-86-H-02.BMP,410678 diff --git a/uv.lock b/uv.lock index 977d698..28ea40d 100644 --- a/uv.lock +++ b/uv.lock @@ -946,6 +946,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/eb/427ed2b20a38a4ee29f24dbe4ae2dafab198674fe9a85e3d6adf9e5f5f41/inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344", size = 35197, upload-time = "2024-12-28T17:11:15.931Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "iscc-core" version = "1.3.0" @@ -2482,6 +2491,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "poethepoet" version = "0.44.0" @@ -2916,6 +2934,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/e9/e826e2381536e5d8166f39bd7a63102f1411340889c86bed35e24655a69e/pytaglib-3.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a3a073bae8ce0d76f99f8f3fd91fe5d1fd355710721c3a3a135c29bebcc3df3f", size = 276240, upload-time = "2026-02-04T14:14:16.815Z" }, ] +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3790,6 +3824,11 @@ dependencies = [ { name = "usearch" }, ] +[package.dev-dependencies] +dev = [ + { name = "pytest" }, +] + [package.metadata] requires-dist = [ { name = "blake3" }, @@ -3829,6 +3868,9 @@ requires-dist = [ { name = "usearch", specifier = ">=2.23.0" }, ] +[package.metadata.requires-dev] +dev = [{ name = "pytest", specifier = ">=8.0.0" }] + [[package]] name = "typeguard" version = "4.5.1" From 39798dda93e0512688538a487ae853dbec67fde6 Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 15:02:16 +0200 Subject: [PATCH 2/7] feat: pin bioimage conversion tooling --- README.md | 22 +++ config.yml | 6 +- tests/test_bioimage_convert_dataset.py | 81 +++++++++++ tests/test_processing.py | 14 ++ twinspect/algos/processing.py | 31 ++++- twinspect/datasets/bioimage_convert.py | 184 +++++++++++++++++++++---- 6 files changed, 303 insertions(+), 35 deletions(-) create mode 100644 tests/test_processing.py diff --git a/README.md b/README.md index e0660c9..386a3c3 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,28 @@ uv run twinspect info # Show data folder information uv run twinspect checksum # Compute folder checksum ``` +## Bioimage conversion benchmark + +The `bioimage_convert_1000` dataset builds 1000 same-source conversion clusters from public Broad +Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus +OME-TIFF, TIFF, and PNG variants converted with pinned OME Bio-Formats bftools `8.5.0`. + +TwinSpect downloads and verifies the bftools archive automatically on first use: + +- URL: `https://downloads.openmicroscopy.org/bio-formats/8.5.0/artifacts/bftools.zip` +- SHA-256: `07a3bb1d3de84da3a709655a1008cb2d9b19becc5bad4ae4112633aec9380478` +- Default cache: `~/.cache/twinspect/bioformats` + +Bio-Formats bftools is a Java distribution with Unix and Windows launchers (`bfconvert` and +`bfconvert.bat`). A working Java runtime is required. Custom converters are still supported via +`TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE` or `TWINSPECT_BIOIMAGE_CONVERT_BIN`; the binary override uses +the legacy `imgcnv -i INPUT -o OUTPUT -t FORMAT` argument shape, while arbitrary CLIs should use the +template override. + +The benchmark measures same-source conversion robustness. It does not assume converted files have +byte-identical normalized pixels or identical Data-Codes; conversion drift is part of the benchmark +pressure. + ## Documentation The benchmark results and methodology are documented at **https://eval.iscc.codes**, including: diff --git a/config.yml b/config.yml index 4e6ff1f..cbf27b0 100644 --- a/config.yml +++ b/config.yml @@ -108,9 +108,9 @@ datasets: - name: BioImage Convert 1000 label: bioimage_convert_1000 info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage - Benchmark Collection archives. Each selected source image is converted with BioImage Convert - into single-file formats, producing same-image/different-format clusters for evaluating - iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. + Benchmark Collection archives. Each selected source image is converted with pinned OME + Bio-Formats bftools into single-file formats, producing same-image/different-format clusters + for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py index 5417c85..4ee8347 100644 --- a/tests/test_bioimage_convert_dataset.py +++ b/tests/test_bioimage_convert_dataset.py @@ -107,6 +107,87 @@ def test_bioimage_convert_command_allows_template(monkeypatch): assert command == ["converter", "--input", "in.tif", "--output", "out.png", "--format", "png"] +def test_bioformats_tools_archive_is_pinned(): + assert bic.BIOFORMATS_VERSION == "8.5.0" + assert bic.BFTOOLS_URL.endswith("/bio-formats/8.5.0/artifacts/bftools.zip") + assert bic.BFTOOLS_SHA256 == "07a3bb1d3de84da3a709655a1008cb2d9b19becc5bad4ae4112633aec9380478" + + +def test_default_converter_command_uses_pinned_bfconvert(monkeypatch, tmp_path): + monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", raising=False) + monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_BIN", raising=False) + fake = tmp_path / ("bfconvert.bat" if bic.platform.system() == "Windows" else "bfconvert") + fake.write_text("", encoding="utf-8") + monkeypatch.setattr(bic, "ensure_bioformats_tools", lambda cache_dir=None: fake) + + command = bic.bioimage_convert_command(Path("in.tif"), Path("out.ome.tiff"), "ome-tiff") + + assert command == [str(fake), "in.tif", "out.ome.tiff"] + + +def test_ensure_bioformats_tools_downloads_verifies_and_extracts(monkeypatch, tmp_path): + archive = tmp_path / "fixture-bftools.zip" + import hashlib + from zipfile import ZipFile + + script_name = "bfconvert.bat" if bic.platform.system() == "Windows" else "bfconvert" + with ZipFile(archive, "w") as zf: + zf.writestr(f"bftools/{script_name}", "echo bfconvert") + zf.writestr("bftools/bf.sh", "echo bf") + zf.writestr("bftools/bioformats_package.jar", "jar") + digest = hashlib.sha256(archive.read_bytes()).hexdigest() + + monkeypatch.setattr(bic, "BFTOOLS_SHA256", digest) + monkeypatch.setattr(bic, "download_file", lambda url, path: path.write_bytes(archive.read_bytes())) + + bfconvert = bic.ensure_bioformats_tools(tmp_path / "tools") + + assert bfconvert.name == script_name + assert bfconvert.exists() + assert (bfconvert.parent / "bioformats_package.jar").exists() + if bic.platform.system() != "Windows": + assert bfconvert.stat().st_mode & 0o111 + assert (bfconvert.parent / "bf.sh").stat().st_mode & 0o111 + + +def test_ensure_bioformats_tools_selects_windows_launcher(monkeypatch, tmp_path): + archive = tmp_path / "fixture-bftools.zip" + import hashlib + from zipfile import ZipFile + + with ZipFile(archive, "w") as zf: + zf.writestr("bftools/bfconvert.bat", "call bf.bat") + zf.writestr("bftools/bioformats_package.jar", "jar") + digest = hashlib.sha256(archive.read_bytes()).hexdigest() + + monkeypatch.setattr(bic.platform, "system", lambda: "Windows") + monkeypatch.setattr(bic, "BFTOOLS_SHA256", digest) + monkeypatch.setattr(bic, "download_file", lambda url, path: path.write_bytes(archive.read_bytes())) + + bfconvert = bic.ensure_bioformats_tools(tmp_path / "tools") + + assert bfconvert.name == "bfconvert.bat" + + +def test_safe_extract_zip_rejects_path_traversal(tmp_path): + archive = tmp_path / "evil.zip" + from zipfile import ZipFile + + with ZipFile(archive, "w") as zf: + zf.writestr("../evil", "nope") + + with pytest.raises(RuntimeError, match="Unsafe archive"): + bic.safe_extract_zip(archive, tmp_path / "extract") + + +def test_ensure_bioformats_tools_rejects_checksum_mismatch(monkeypatch, tmp_path): + monkeypatch.setattr(bic, "download_file", lambda url, path: path.write_bytes(b"wrong")) + monkeypatch.setattr(bic, "BFTOOLS_SHA256", "0" * 64) + + with pytest.raises(RuntimeError, match="checksum"): + bic.ensure_bioformats_tools(tmp_path / "tools") + + def test_validate_file_size_rejects_empty_and_oversized(tmp_path): empty = tmp_path / "empty.tif" empty.write_bytes(b"") diff --git a/tests/test_processing.py b/tests/test_processing.py new file mode 100644 index 0000000..97b71a6 --- /dev/null +++ b/tests/test_processing.py @@ -0,0 +1,14 @@ +from twinspect.algos.processing import benchmark_files + + +def test_benchmark_files_skip_metadata_files(tmp_path): + cluster = tmp_path / "0000000" + cluster.mkdir() + image = cluster / "0original.tif" + image.write_bytes(b"image") + top_level_underscore_asset = tmp_path / "_legitimate_asset.tif" + top_level_underscore_asset.write_bytes(b"image") + (tmp_path / "_bioimage_convert_build.json").write_text("{}", encoding="utf-8") + (tmp_path / ".cache.json").write_text("{}", encoding="utf-8") + + assert benchmark_files(tmp_path) == [image, top_level_underscore_asset] diff --git a/twinspect/algos/processing.py b/twinspect/algos/processing.py index a6247d0..b29ceb3 100644 --- a/twinspect/algos/processing.py +++ b/twinspect/algos/processing.py @@ -4,6 +4,7 @@ import time from pathlib import Path from typing import Callable + from loguru import logger as log from concurrent.futures import as_completed, ThreadPoolExecutor import os @@ -16,6 +17,7 @@ "simprint", "process_file", "process_data_folder", + "benchmark_files", ] @@ -48,8 +50,7 @@ def simprint(benchmark): return path -def process_file(function, task): - # type: (Callable, ts.Task) -> ts.Task +def process_file(function: Callable, task: ts.Task) -> ts.Task: """ Process compact code for a single media file. @@ -61,6 +62,27 @@ def process_file(function, task): return task +def benchmark_files(data_folder): + # type: (Path) -> list[Path] + """Return files that should be processed by benchmark algorithms. + + Dataset-local metadata files are useful for reproducibility but are not media + inputs. Skip top-level hidden/underscore metadata so simprint generation does + not try to hash JSON build manifests. + """ + return [ + path + for path in ts.iter_files(data_folder) + if not (path.parent == data_folder and is_dataset_metadata_file(path)) + ] + + +def is_dataset_metadata_file(path): + # type: (Path) -> bool + """Return true for top-level dataset metadata that should not be hashed.""" + return path.name.startswith(".") or path.name == "_bioimage_convert_build.json" + + def process_data_folder(func_path, data_folder): # type: (str, Path) -> Path """Process all files in `data_folder` with `function` and function `params`.""" @@ -68,13 +90,14 @@ def process_data_folder(func_path, data_folder): result_path = ts.result_path(func_path, data_folder, extension="csv", tag="simprint") func = ts.load_function(func_path) cores = os.cpu_count() - total = ts.count_files(data_folder) + files = benchmark_files(data_folder) + total = len(files) log.debug(f"Processing {data_folder.name} with {cores} max workers") results = [] with ThreadPoolExecutor() as executor: futures = [] for idx, file_path in track( - enumerate(ts.iter_files(data_folder)), + enumerate(files), total=total, description="Populating Tasks", console=ts.console, diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py index 71c2268..82be642 100644 --- a/twinspect/datasets/bioimage_convert.py +++ b/twinspect/datasets/bioimage_convert.py @@ -10,24 +10,29 @@ 0000000/3variant_png.png The converted cluster members are intended for benchmarking IMAGEWALK-based -bioimage Data-Code matching across storage formats. BioImage Convert (``imgcnv``) -is used for conversions because it supports microscopy formats beyond ordinary -Pillow/OpenCV image files. +bioimage Data-Code matching across storage formats. Bio-Formats ``bfconvert`` +from pinned OME bftools is used by default because it is mature, +cross-platform, actively maintained, and supports microscopy formats beyond +ordinary Pillow/OpenCV image files. """ from __future__ import annotations import csv +import hashlib import json import os +import platform import random import shlex import shutil +import stat import subprocess import tempfile +import urllib.request from dataclasses import asdict, dataclass from pathlib import Path -from zipfile import ZipInfo +from zipfile import ZipFile, ZipInfo from loguru import logger as log from remotezip import RemoteZip @@ -37,6 +42,12 @@ ONE_GIB = 1024**3 DEFAULT_CONVERT_TIMEOUT = 300 +BIOFORMATS_VERSION = "8.5.0" +BFTOOLS_URL = ( + f"https://downloads.openmicroscopy.org/bio-formats/{BIOFORMATS_VERSION}/artifacts/bftools.zip" +) +BFTOOLS_SHA256 = "07a3bb1d3de84da3a709655a1008cb2d9b19becc5bad4ae4112633aec9380478" +MAX_BFTOOLS_DOWNLOAD_BYTES = 128 * 1024 * 1024 MANIFEST_PATH = Path(__file__).parent / "manifests" / "bioimage_convert_1000.csv" BUILD_INFO_FILENAME = "_bioimage_convert_build.json" @@ -240,10 +251,12 @@ def convert_file(input_path, output_path, format_name): # type: (Path, Path, str) -> Path """Convert ``input_path`` with BioImage Convert. - The default command follows the documented BioImage Convertor/imgcnv style: - ``imgcnv -i INPUT -o OUTPUT -t FORMAT``. For local installations with a - different wrapper, set ``TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE`` to a shell-free - argument template, e.g. ``"bioimageconvert --input {input} --output {output} --format {format}"``. + The default converter is the pinned Bio-Formats command-line tool + (``bfconvert`` from ``bftools.zip``), which is actively maintained by OME, + distributed as a Java application, and ships shell/batch launchers for + Linux, macOS, and Windows. For local installations with a different wrapper, + set ``TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE`` to a shell-free argument + template, e.g. ``"bioimageconvert --input {input} --output {output} --format {format}"``. """ if output_path.exists() and output_path.stat().st_size > 0: validate_file_size(output_path) @@ -253,12 +266,17 @@ def convert_file(input_path, output_path, format_name): timeout = int(os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TIMEOUT", DEFAULT_CONVERT_TIMEOUT)) log.debug("Running BioImage Convert: {}", " ".join(command)) try: - subprocess.run(command, check=True, capture_output=True, text=True, timeout=timeout) + env = os.environ.copy() + env.setdefault("NO_UPDATE_CHECK", "1") + subprocess.run( + command, check=True, capture_output=True, text=True, timeout=timeout, env=env + ) except FileNotFoundError as exc: raise RuntimeError( - "BioImage Convert executable not found. Install BioImage Convert and ensure " - "`imgcnv` is on PATH, set TWINSPECT_BIOIMAGE_CONVERT_BIN, or set " - "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE." + "Bioimage conversion executable not found. TwinSpect downloads pinned OME Bio-Formats " + "bftools by default; custom TWINSPECT_BIOIMAGE_CONVERT_BIN values must point to an " + "existing executable. Use TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE for non-imgcnv-style " + "custom converters." ) from exc except subprocess.TimeoutExpired as exc: raise RuntimeError( @@ -277,32 +295,142 @@ def convert_file(input_path, output_path, format_name): def bioimage_convert_command(input_path, output_path, format_name): # type: (Path, Path, str) -> list[str] - """Build the BioImage Convert command line.""" + """Build the BioImage conversion command line.""" template = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE") if template: return [ part.format(input=input_path, output=output_path, format=format_name) for part in shlex.split(template) ] - binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") or "imgcnv" - return [binary, "-i", str(input_path), "-o", str(output_path), "-t", format_name] + binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") + if binary: + return [binary, "-i", str(input_path), "-o", str(output_path), "-t", format_name] + bfconvert = ensure_bioformats_tools() + return [str(bfconvert), str(input_path), str(output_path)] + + +def default_bioformats_cache_dir(): + # type: () -> Path + """Return the default cache directory for pinned Bio-Formats tools.""" + override = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_CACHE") + if override: + return Path(override) + return Path.home() / ".cache" / "twinspect" / "bioformats" + + +def bioformats_bfconvert_name(): + # type: () -> str + """Return the platform-specific Bio-Formats launcher name.""" + return "bfconvert.bat" if platform.system() == "Windows" else "bfconvert" + + +def ensure_bioformats_tools(cache_dir=None): + # type: (Path | None) -> Path + """Download, verify, and extract pinned Bio-Formats command-line tools. + + Bio-Formats bftools is a cross-platform Java distribution containing Unix + shell launchers and Windows ``.bat`` launchers. We pin the exact archive URL + and SHA-256 digest instead of relying on a moving ``latest`` endpoint. + """ + cache_dir = Path(cache_dir) if cache_dir is not None else default_bioformats_cache_dir() + target_dir = cache_dir / f"bftools-{BIOFORMATS_VERSION}" + bfconvert = target_dir / bioformats_bfconvert_name() + jar = target_dir / "bioformats_package.jar" + if bfconvert.exists() and jar.exists(): + make_bioformats_scripts_executable(target_dir) + return bfconvert + + cache_dir.mkdir(parents=True, exist_ok=True) + archive_path = cache_dir / f"bftools-{BIOFORMATS_VERSION}.zip" + download_file(BFTOOLS_URL, archive_path) + verify_sha256(archive_path, BFTOOLS_SHA256) + + extract_root = cache_dir / f".extract-bftools-{BIOFORMATS_VERSION}" + shutil.rmtree(extract_root, ignore_errors=True) + extract_root.mkdir(parents=True) + try: + safe_extract_zip(archive_path, extract_root) + extracted = extract_root / "bftools" + if not (extracted / bioformats_bfconvert_name()).exists(): + raise RuntimeError(f"Bio-Formats archive did not contain {bioformats_bfconvert_name()}") + shutil.rmtree(target_dir, ignore_errors=True) + extracted.replace(target_dir) + finally: + shutil.rmtree(extract_root, ignore_errors=True) + + make_bioformats_scripts_executable(target_dir) + return bfconvert + + +def make_bioformats_scripts_executable(target_dir): + # type: (Path) -> None + """Mark Unix Bio-Formats launcher scripts executable.""" + if platform.system() == "Windows": + return + for script in target_dir.iterdir(): + if script.is_file() and script.suffix in {"", ".sh"}: + script.chmod(script.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + + +def download_file(url, output_path, max_bytes=MAX_BFTOOLS_DOWNLOAD_BYTES): + # type: (str, Path, int) -> Path + """Download ``url`` to ``output_path`` without loading the whole body at once.""" + bytes_written = 0 + with urllib.request.urlopen(url, timeout=120) as response: + with open(output_path, "wb") as out_file: + while True: + chunk = response.read(1024 * 1024) + if not chunk: + break + bytes_written += len(chunk) + if bytes_written > max_bytes: + raise RuntimeError(f"Download exceeded maximum size of {max_bytes} bytes") + out_file.write(chunk) + return output_path + + +def verify_sha256(path, expected): + # type: (Path, str) -> None + """Verify a file SHA-256 digest.""" + actual = hashlib.sha256(path.read_bytes()).hexdigest() + if actual != expected: + raise RuntimeError( + f"Bio-Formats bftools checksum mismatch for {path}: expected {expected}, got {actual}" + ) + + +def safe_extract_zip(archive_path, target_dir): + # type: (Path, Path) -> None + """Extract a ZIP archive while rejecting path traversal entries.""" + target_dir = target_dir.resolve() + with ZipFile(archive_path) as zip_file: + for member in zip_file.infolist(): + destination = (target_dir / member.filename).resolve() + if not destination.is_relative_to(target_dir): + raise RuntimeError(f"Unsafe archive member path: {member.filename}") + zip_file.extractall(target_dir) def bioimage_convert_version(): # type: () -> str - """Best-effort BioImage Convert version string for build metadata.""" - binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") or "imgcnv" - for flag in ("--version", "-v"): - try: - result = subprocess.run( - [binary, flag], check=False, capture_output=True, text=True, timeout=10 - ) - except Exception: - continue - text = (result.stdout or result.stderr or "").strip() - if text: - return text.splitlines()[0] - return "unknown" + """Best-effort BioImage converter version string for build metadata.""" + template = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE") + if template: + return f"custom template: {template}" + binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") + if binary: + for flag in ("--version", "-v"): + try: + result = subprocess.run( + [binary, flag], check=False, capture_output=True, text=True, timeout=10 + ) + except Exception: + continue + text = (result.stdout or result.stderr or "").strip() + if text: + return text.splitlines()[0] + return "custom binary: unknown" + return f"Bio-Formats bftools {BIOFORMATS_VERSION}" def validate_file_size(path, max_file_size=ONE_GIB): From c8139c3b7f984df50fb0465705adafc9c3de162d Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 15:42:17 +0200 Subject: [PATCH 3/7] feat: add bioimage similarity variants --- README.md | 7 ++- config.yml | 5 +- pyproject.toml | 1 + tests/test_bioimage_convert_dataset.py | 49 +++++++++++++++++- twinspect/datasets/bioimage_convert.py | 69 ++++++++++++++++++++++++-- uv.lock | 2 + 6 files changed, 123 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 386a3c3..e4cb82e 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,11 @@ uv run twinspect checksum # Compute folder checksum ## Bioimage conversion benchmark The `bioimage_convert_1000` dataset builds 1000 same-source conversion clusters from public Broad -Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus -OME-TIFF, TIFF, and PNG variants converted with pinned OME Bio-Formats bftools `8.5.0`. +Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus an +identity tier (OME-TIFF, TIFF, PNG converted with pinned OME Bio-Formats bftools `8.5.0`) and a +similarity tier (deterministic +1% brightness and 0.3 px Gaussian-blur PNG exports from the +Bio-Formats PNG). The identity tier catches pipeline non-determinism; the similarity tier is intended +to exercise IMAGEWALK Hamming-distance robustness beyond byte-identical normalized pixels. TwinSpect downloads and verifies the bftools archive automatically on first use: diff --git a/config.yml b/config.yml index cbf27b0..a77193c 100644 --- a/config.yml +++ b/config.yml @@ -109,8 +109,9 @@ datasets: label: bioimage_convert_1000 info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage Benchmark Collection archives. Each selected source image is converted with pinned OME - Bio-Formats bftools into single-file formats, producing same-image/different-format clusters - for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. + Bio-Formats bftools into an identity tier and deterministic +1% brightness / 0.3 px blur + exports from the Bio-Formats PNG, producing same-image clusters for evaluating iscc-bio + IMAGEWALK Data-Code matching under realistic conversion and mild normalized-pixel drift. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/pyproject.toml b/pyproject.toml index d71ffd1..7ed646c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ dependencies = [ "openapi-spec-validator", "ruff", "pillow-avif-plugin", + "pillow>=10.0.0", "iscc-sci>=0.2.0", "iscc-sct>=0.1.0", "onnxruntime-gpu>=1.23.2", diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py index 4ee8347..023990c 100644 --- a/tests/test_bioimage_convert_dataset.py +++ b/tests/test_bioimage_convert_dataset.py @@ -66,7 +66,9 @@ def test_manifest_roundtrip(tmp_path): assert bic.load_manifest(manifest) == samples -def test_build_cluster_keeps_original_first_and_conversion_labels(monkeypatch, tmp_path): +def test_build_cluster_keeps_original_first_and_adds_identity_and_similarity_variants( + monkeypatch, tmp_path +): sample = bic.BioimageSample( source_label="bbbc-test", archive_url="https://example.test/archive.zip", @@ -82,8 +84,16 @@ def fake_convert_file(input_path, output_path, format_name): output_path.write_bytes(format_name.encode("utf-8")) return output_path + pixel_variant_calls = [] + + def fake_apply_pixel_variant(input_path, output_path, variant_name): + pixel_variant_calls.append((input_path.name, output_path.name, variant_name)) + output_path.write_bytes(variant_name.encode("utf-8")) + return output_path + monkeypatch.setattr(bic, "extract_member", fake_extract_member) monkeypatch.setattr(bic, "convert_file", fake_convert_file) + monkeypatch.setattr(bic, "apply_pixel_variant", fake_apply_pixel_variant) cluster = tmp_path / "0000000" bic.build_cluster(sample, cluster) @@ -94,10 +104,47 @@ def fake_convert_file(input_path, output_path, format_name): "1variant_ome-tiff.ome.tiff", "2variant_tiff.tiff", "3variant_png.png", + "4variant_brightness-png.png", + "5variant_blur-png.png", + ] + assert pixel_variant_calls == [ + ("3variant_png.png", "4variant_brightness-png.png", "brightness"), + ("3variant_png.png", "5variant_blur-png.png", "blur"), ] bic.validate_cluster(cluster) +def test_apply_pixel_variant_creates_readable_nonempty_png(tmp_path): + from PIL import Image + + src = tmp_path / "source.tif" + out = tmp_path / "brightness.png" + Image.new("L", (32, 32), 128).save(src) + + result = bic.apply_pixel_variant(src, out, "brightness") + + assert result == out + assert out.stat().st_size > 0 + assert Image.open(out).size == (32, 32) + + +def test_apply_pixel_variants_change_pixels_on_nonuniform_input(tmp_path): + from PIL import Image, ImageChops + + src = tmp_path / "source.png" + image = Image.new("L", (32, 32), 0) + for x in range(8, 24): + for y in range(8, 24): + image.putpixel((x, y), 128) + image.save(src) + + for variant in ("brightness", "blur"): + out = tmp_path / f"{variant}.png" + bic.apply_pixel_variant(src, out, variant) + with Image.open(src) as original, Image.open(out) as changed: + assert ImageChops.difference(original, changed).getbbox() is not None + + def test_bioimage_convert_command_allows_template(monkeypatch): monkeypatch.setenv( "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py index 82be642..5c6f9db 100644 --- a/twinspect/datasets/bioimage_convert.py +++ b/twinspect/datasets/bioimage_convert.py @@ -8,12 +8,14 @@ 0000000/1variant_ome-tiff.ome.tiff 0000000/2variant_tiff.tiff 0000000/3variant_png.png + 0000000/4variant_brightness-png.png + 0000000/5variant_blur-png.png The converted cluster members are intended for benchmarking IMAGEWALK-based -bioimage Data-Code matching across storage formats. Bio-Formats ``bfconvert`` -from pinned OME bftools is used by default because it is mature, -cross-platform, actively maintained, and supports microscopy formats beyond -ordinary Pillow/OpenCV image files. +bioimage Data-Code matching across storage formats and mild same-source export +perturbations. Bio-Formats ``bfconvert`` from pinned OME bftools is used by +default because it is mature, cross-platform, actively maintained, and supports +microscopy formats beyond ordinary Pillow/OpenCV image files. """ from __future__ import annotations @@ -81,6 +83,16 @@ ("png", ".png", "png"), ) +# Deterministic pixel-altering same-source variants. The lossless container +# conversions above are useful as an identity/reproducibility tier, but they can +# leave IMAGEWALK-normalized pixels identical. These variants intentionally nudge +# normalized pixels while preserving visual/source identity, so the Hamming +# similarity behaviour is actually exercised. +PIXEL_VARIANTS = ( + ("brightness-png", ".png", "brightness"), + ("blur-png", ".png", "blur"), +) + IMAGE_EXTENSIONS = {".bmp", ".gif", ".jpg", ".jpeg", ".png", ".tif", ".tiff"} @@ -228,10 +240,23 @@ def build_cluster(sample, cluster_path): original_path = cluster_path / f"0original{sample.suffix}" extract_member(sample, original_path) validate_file_size(original_path) + conversion_outputs = {} for idx, (label, suffix, format_name) in enumerate(CONVERSIONS, start=1): output_path = cluster_path / f"{idx}variant_{label}{suffix}" convert_file(original_path, output_path, format_name) validate_file_size(output_path) + conversion_outputs[label] = output_path + + # Generate export-style perturbations from the Bio-Formats PNG identity + # output, not the original archive member. That keeps the similarity tier + # readable via Pillow even when the original is a microscopy TIFF variant + # that Bio-Formats can decode but Pillow cannot. + pixel_source = conversion_outputs["png"] + start = 1 + len(CONVERSIONS) + for idx, (label, suffix, variant_name) in enumerate(PIXEL_VARIANTS, start=start): + output_path = cluster_path / f"{idx}variant_{label}{suffix}" + apply_pixel_variant(pixel_source, output_path, variant_name) + validate_file_size(output_path) def extract_member(sample, output_path): @@ -293,6 +318,39 @@ def convert_file(input_path, output_path, format_name): return output_path +def apply_pixel_variant(input_path, output_path, variant_name): + # type: (Path, Path, str) -> Path + """Create a deterministic pixel-altering same-source PNG variant. + + These mild perturbations complement the lossless Bio-Formats conversion tier: + they preserve visual/source identity while producing non-identical normalized + IMAGEWALK bitstreams on tested BBBC samples. + """ + if output_path.exists() and output_path.stat().st_size > 0: + validate_file_size(output_path) + return output_path + + from PIL import Image, ImageEnhance, ImageFilter + + output_path.parent.mkdir(parents=True, exist_ok=True) + with Image.open(input_path) as image: + working = image.convert("L") + if variant_name == "brightness": + # +1% brightness was the lightest tested perturbation that produced + # non-identical IMAGEWALK codes for all 20 BBBC smoke-test samples. + result = ImageEnhance.Brightness(working).enhance(1.01) + elif variant_name == "blur": + # A 0.3 px Gaussian blur keeps most same-source distances below 16 + # while still making many normalized bitstreams non-identical. + result = working.filter(ImageFilter.GaussianBlur(0.3)) + else: + raise RuntimeError(f"Unknown bioimage pixel variant: {variant_name}") + result.save(output_path) + + validate_file_size(output_path) + return output_path + + def bioimage_convert_command(input_path, output_path, format_name): # type: (Path, Path, str) -> list[str] """Build the BioImage conversion command line.""" @@ -455,7 +513,7 @@ def validate_cluster(cluster_path): ) validate_file_size(originals[0]) - for idx, (label, suffix, _) in enumerate(CONVERSIONS, start=1): + for idx, (label, suffix, _) in enumerate((*CONVERSIONS, *PIXEL_VARIANTS), start=1): path = cluster_path / f"{idx}variant_{label}{suffix}" validate_file_size(path) @@ -479,6 +537,7 @@ def write_build_info(data_folder, samples): "dataset": "bioimage_convert_1000", "sources": BBBC_SOURCES, "conversions": CONVERSIONS, + "pixel_variants": PIXEL_VARIANTS, "max_file_size": ONE_GIB, "bioimage_convert_command": bioimage_convert_command( Path("INPUT"), Path("OUTPUT"), "FORMAT" diff --git a/uv.lock b/uv.lock index 28ea40d..eeff4cd 100644 --- a/uv.lock +++ b/uv.lock @@ -3811,6 +3811,7 @@ dependencies = [ { name = "onnxruntime-gpu" }, { name = "openapi-spec-validator" }, { name = "pandas" }, + { name = "pillow" }, { name = "pillow-avif-plugin" }, { name = "poethepoet" }, { name = "pydub" }, @@ -3855,6 +3856,7 @@ requires-dist = [ { name = "onnxruntime-gpu", specifier = ">=1.23.2" }, { name = "openapi-spec-validator" }, { name = "pandas" }, + { name = "pillow", specifier = ">=10.0.0" }, { name = "pillow-avif-plugin" }, { name = "poethepoet" }, { name = "pydub" }, From 8d6b7d30060af7418f59641bd135c2a68a9be017 Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 15:54:51 +0200 Subject: [PATCH 4/7] Revert "feat: add bioimage similarity variants" This reverts commit c8139c3b7f984df50fb0465705adafc9c3de162d. --- README.md | 7 +-- config.yml | 5 +- pyproject.toml | 1 - tests/test_bioimage_convert_dataset.py | 49 +----------------- twinspect/datasets/bioimage_convert.py | 69 ++------------------------ uv.lock | 2 - 6 files changed, 10 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index e4cb82e..386a3c3 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,8 @@ uv run twinspect checksum # Compute folder checksum ## Bioimage conversion benchmark The `bioimage_convert_1000` dataset builds 1000 same-source conversion clusters from public Broad -Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus an -identity tier (OME-TIFF, TIFF, PNG converted with pinned OME Bio-Formats bftools `8.5.0`) and a -similarity tier (deterministic +1% brightness and 0.3 px Gaussian-blur PNG exports from the -Bio-Formats PNG). The identity tier catches pipeline non-determinism; the similarity tier is intended -to exercise IMAGEWALK Hamming-distance robustness beyond byte-identical normalized pixels. +Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus +OME-TIFF, TIFF, and PNG variants converted with pinned OME Bio-Formats bftools `8.5.0`. TwinSpect downloads and verifies the bftools archive automatically on first use: diff --git a/config.yml b/config.yml index a77193c..cbf27b0 100644 --- a/config.yml +++ b/config.yml @@ -109,9 +109,8 @@ datasets: label: bioimage_convert_1000 info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage Benchmark Collection archives. Each selected source image is converted with pinned OME - Bio-Formats bftools into an identity tier and deterministic +1% brightness / 0.3 px blur - exports from the Bio-Formats PNG, producing same-image clusters for evaluating iscc-bio - IMAGEWALK Data-Code matching under realistic conversion and mild normalized-pixel drift. + Bio-Formats bftools into single-file formats, producing same-image/different-format clusters + for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/pyproject.toml b/pyproject.toml index 7ed646c..d71ffd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,6 @@ dependencies = [ "openapi-spec-validator", "ruff", "pillow-avif-plugin", - "pillow>=10.0.0", "iscc-sci>=0.2.0", "iscc-sct>=0.1.0", "onnxruntime-gpu>=1.23.2", diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py index 023990c..4ee8347 100644 --- a/tests/test_bioimage_convert_dataset.py +++ b/tests/test_bioimage_convert_dataset.py @@ -66,9 +66,7 @@ def test_manifest_roundtrip(tmp_path): assert bic.load_manifest(manifest) == samples -def test_build_cluster_keeps_original_first_and_adds_identity_and_similarity_variants( - monkeypatch, tmp_path -): +def test_build_cluster_keeps_original_first_and_conversion_labels(monkeypatch, tmp_path): sample = bic.BioimageSample( source_label="bbbc-test", archive_url="https://example.test/archive.zip", @@ -84,16 +82,8 @@ def fake_convert_file(input_path, output_path, format_name): output_path.write_bytes(format_name.encode("utf-8")) return output_path - pixel_variant_calls = [] - - def fake_apply_pixel_variant(input_path, output_path, variant_name): - pixel_variant_calls.append((input_path.name, output_path.name, variant_name)) - output_path.write_bytes(variant_name.encode("utf-8")) - return output_path - monkeypatch.setattr(bic, "extract_member", fake_extract_member) monkeypatch.setattr(bic, "convert_file", fake_convert_file) - monkeypatch.setattr(bic, "apply_pixel_variant", fake_apply_pixel_variant) cluster = tmp_path / "0000000" bic.build_cluster(sample, cluster) @@ -104,47 +94,10 @@ def fake_apply_pixel_variant(input_path, output_path, variant_name): "1variant_ome-tiff.ome.tiff", "2variant_tiff.tiff", "3variant_png.png", - "4variant_brightness-png.png", - "5variant_blur-png.png", - ] - assert pixel_variant_calls == [ - ("3variant_png.png", "4variant_brightness-png.png", "brightness"), - ("3variant_png.png", "5variant_blur-png.png", "blur"), ] bic.validate_cluster(cluster) -def test_apply_pixel_variant_creates_readable_nonempty_png(tmp_path): - from PIL import Image - - src = tmp_path / "source.tif" - out = tmp_path / "brightness.png" - Image.new("L", (32, 32), 128).save(src) - - result = bic.apply_pixel_variant(src, out, "brightness") - - assert result == out - assert out.stat().st_size > 0 - assert Image.open(out).size == (32, 32) - - -def test_apply_pixel_variants_change_pixels_on_nonuniform_input(tmp_path): - from PIL import Image, ImageChops - - src = tmp_path / "source.png" - image = Image.new("L", (32, 32), 0) - for x in range(8, 24): - for y in range(8, 24): - image.putpixel((x, y), 128) - image.save(src) - - for variant in ("brightness", "blur"): - out = tmp_path / f"{variant}.png" - bic.apply_pixel_variant(src, out, variant) - with Image.open(src) as original, Image.open(out) as changed: - assert ImageChops.difference(original, changed).getbbox() is not None - - def test_bioimage_convert_command_allows_template(monkeypatch): monkeypatch.setenv( "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py index 5c6f9db..82be642 100644 --- a/twinspect/datasets/bioimage_convert.py +++ b/twinspect/datasets/bioimage_convert.py @@ -8,14 +8,12 @@ 0000000/1variant_ome-tiff.ome.tiff 0000000/2variant_tiff.tiff 0000000/3variant_png.png - 0000000/4variant_brightness-png.png - 0000000/5variant_blur-png.png The converted cluster members are intended for benchmarking IMAGEWALK-based -bioimage Data-Code matching across storage formats and mild same-source export -perturbations. Bio-Formats ``bfconvert`` from pinned OME bftools is used by -default because it is mature, cross-platform, actively maintained, and supports -microscopy formats beyond ordinary Pillow/OpenCV image files. +bioimage Data-Code matching across storage formats. Bio-Formats ``bfconvert`` +from pinned OME bftools is used by default because it is mature, +cross-platform, actively maintained, and supports microscopy formats beyond +ordinary Pillow/OpenCV image files. """ from __future__ import annotations @@ -83,16 +81,6 @@ ("png", ".png", "png"), ) -# Deterministic pixel-altering same-source variants. The lossless container -# conversions above are useful as an identity/reproducibility tier, but they can -# leave IMAGEWALK-normalized pixels identical. These variants intentionally nudge -# normalized pixels while preserving visual/source identity, so the Hamming -# similarity behaviour is actually exercised. -PIXEL_VARIANTS = ( - ("brightness-png", ".png", "brightness"), - ("blur-png", ".png", "blur"), -) - IMAGE_EXTENSIONS = {".bmp", ".gif", ".jpg", ".jpeg", ".png", ".tif", ".tiff"} @@ -240,23 +228,10 @@ def build_cluster(sample, cluster_path): original_path = cluster_path / f"0original{sample.suffix}" extract_member(sample, original_path) validate_file_size(original_path) - conversion_outputs = {} for idx, (label, suffix, format_name) in enumerate(CONVERSIONS, start=1): output_path = cluster_path / f"{idx}variant_{label}{suffix}" convert_file(original_path, output_path, format_name) validate_file_size(output_path) - conversion_outputs[label] = output_path - - # Generate export-style perturbations from the Bio-Formats PNG identity - # output, not the original archive member. That keeps the similarity tier - # readable via Pillow even when the original is a microscopy TIFF variant - # that Bio-Formats can decode but Pillow cannot. - pixel_source = conversion_outputs["png"] - start = 1 + len(CONVERSIONS) - for idx, (label, suffix, variant_name) in enumerate(PIXEL_VARIANTS, start=start): - output_path = cluster_path / f"{idx}variant_{label}{suffix}" - apply_pixel_variant(pixel_source, output_path, variant_name) - validate_file_size(output_path) def extract_member(sample, output_path): @@ -318,39 +293,6 @@ def convert_file(input_path, output_path, format_name): return output_path -def apply_pixel_variant(input_path, output_path, variant_name): - # type: (Path, Path, str) -> Path - """Create a deterministic pixel-altering same-source PNG variant. - - These mild perturbations complement the lossless Bio-Formats conversion tier: - they preserve visual/source identity while producing non-identical normalized - IMAGEWALK bitstreams on tested BBBC samples. - """ - if output_path.exists() and output_path.stat().st_size > 0: - validate_file_size(output_path) - return output_path - - from PIL import Image, ImageEnhance, ImageFilter - - output_path.parent.mkdir(parents=True, exist_ok=True) - with Image.open(input_path) as image: - working = image.convert("L") - if variant_name == "brightness": - # +1% brightness was the lightest tested perturbation that produced - # non-identical IMAGEWALK codes for all 20 BBBC smoke-test samples. - result = ImageEnhance.Brightness(working).enhance(1.01) - elif variant_name == "blur": - # A 0.3 px Gaussian blur keeps most same-source distances below 16 - # while still making many normalized bitstreams non-identical. - result = working.filter(ImageFilter.GaussianBlur(0.3)) - else: - raise RuntimeError(f"Unknown bioimage pixel variant: {variant_name}") - result.save(output_path) - - validate_file_size(output_path) - return output_path - - def bioimage_convert_command(input_path, output_path, format_name): # type: (Path, Path, str) -> list[str] """Build the BioImage conversion command line.""" @@ -513,7 +455,7 @@ def validate_cluster(cluster_path): ) validate_file_size(originals[0]) - for idx, (label, suffix, _) in enumerate((*CONVERSIONS, *PIXEL_VARIANTS), start=1): + for idx, (label, suffix, _) in enumerate(CONVERSIONS, start=1): path = cluster_path / f"{idx}variant_{label}{suffix}" validate_file_size(path) @@ -537,7 +479,6 @@ def write_build_info(data_folder, samples): "dataset": "bioimage_convert_1000", "sources": BBBC_SOURCES, "conversions": CONVERSIONS, - "pixel_variants": PIXEL_VARIANTS, "max_file_size": ONE_GIB, "bioimage_convert_command": bioimage_convert_command( Path("INPUT"), Path("OUTPUT"), "FORMAT" diff --git a/uv.lock b/uv.lock index eeff4cd..28ea40d 100644 --- a/uv.lock +++ b/uv.lock @@ -3811,7 +3811,6 @@ dependencies = [ { name = "onnxruntime-gpu" }, { name = "openapi-spec-validator" }, { name = "pandas" }, - { name = "pillow" }, { name = "pillow-avif-plugin" }, { name = "poethepoet" }, { name = "pydub" }, @@ -3856,7 +3855,6 @@ requires-dist = [ { name = "onnxruntime-gpu", specifier = ">=1.23.2" }, { name = "openapi-spec-validator" }, { name = "pandas" }, - { name = "pillow", specifier = ">=10.0.0" }, { name = "pillow-avif-plugin" }, { name = "poethepoet" }, { name = "pydub" }, From fde01bfb579d3f52dd949c4bf16b2abd374332dd Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 16:07:27 +0200 Subject: [PATCH 5/7] feat: use real codec conversions for bioimage variants --- README.md | 5 +-- config.yml | 5 ++- tests/test_bioimage_convert_dataset.py | 48 ++++++++++++++++++++-- twinspect/datasets/bioimage_convert.py | 57 ++++++++++++++++++-------- 4 files changed, 88 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 386a3c3..54ffcd0 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ uv run twinspect checksum # Compute folder checksum The `bioimage_convert_1000` dataset builds 1000 same-source conversion clusters from public Broad Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus -OME-TIFF, TIFF, and PNG variants converted with pinned OME Bio-Formats bftools `8.5.0`. +OME-TIFF, TIFF, PNG, JPEG, TIFF/JPEG, and OME-TIFF/JPEG variants converted with pinned OME Bio-Formats bftools `8.5.0`. TwinSpect downloads and verifies the bftools archive automatically on first use: @@ -80,8 +80,7 @@ Bio-Formats bftools is a Java distribution with Unix and Windows launchers (`bfc the legacy `imgcnv -i INPUT -o OUTPUT -t FORMAT` argument shape, while arbitrary CLIs should use the template override. -The benchmark measures same-source conversion robustness. It does not assume converted files have -byte-identical normalized pixels or identical Data-Codes; conversion drift is part of the benchmark +The benchmark measures same-source conversion robustness. It intentionally uses real format/codec conversions rather than synthetic edits such as brightness shifts or blur. On the BBBC smoke set, lossless/container conversions keep IMAGEWALK Data-Codes identical, while JPEG-compressed conversions produce non-identical IMAGEWALK bitstreams through codec artifacts; that drift is part of the benchmark pressure. ## Documentation diff --git a/config.yml b/config.yml index cbf27b0..0e62b7b 100644 --- a/config.yml +++ b/config.yml @@ -109,8 +109,9 @@ datasets: label: bioimage_convert_1000 info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage Benchmark Collection archives. Each selected source image is converted with pinned OME - Bio-Formats bftools into single-file formats, producing same-image/different-format clusters - for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic conversion drift. + Bio-Formats bftools into lossless/container and JPEG-compressed single-file formats, producing + same-source clusters for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic + format/codec conversion drift. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py index 4ee8347..35d8627 100644 --- a/tests/test_bioimage_convert_dataset.py +++ b/tests/test_bioimage_convert_dataset.py @@ -78,7 +78,7 @@ def fake_extract_member(sample, output_path): output_path.write_bytes(b"original") return output_path - def fake_convert_file(input_path, output_path, format_name): + def fake_convert_file(input_path, output_path, format_name, convert_args=()): output_path.write_bytes(format_name.encode("utf-8")) return output_path @@ -94,6 +94,9 @@ def fake_convert_file(input_path, output_path, format_name): "1variant_ome-tiff.ome.tiff", "2variant_tiff.tiff", "3variant_png.png", + "4variant_jpeg.jpg", + "5variant_tiff-jpeg.tiff", + "6variant_ome-tiff-jpeg.ome.tiff", ] bic.validate_cluster(cluster) @@ -101,10 +104,22 @@ def fake_convert_file(input_path, output_path, format_name): def test_bioimage_convert_command_allows_template(monkeypatch): monkeypatch.setenv( "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", - "converter --input {input} --output {output} --format {format}", + "converter --input {input} --output {output} --format {format} --opts {options}", ) - command = bic.bioimage_convert_command(Path("in.tif"), Path("out.png"), "png") - assert command == ["converter", "--input", "in.tif", "--output", "out.png", "--format", "png"] + command = bic.bioimage_convert_command( + Path("in.tif"), Path("out.png"), "png", ("-compression", "JPEG") + ) + assert command == [ + "converter", + "--input", + "in.tif", + "--output", + "out.png", + "--format", + "png", + "--opts", + "-compression JPEG", + ] def test_bioformats_tools_archive_is_pinned(): @@ -125,6 +140,31 @@ def test_default_converter_command_uses_pinned_bfconvert(monkeypatch, tmp_path): assert command == [str(fake), "in.tif", "out.ome.tiff"] +def test_default_converter_command_includes_bioformats_codec_options(monkeypatch, tmp_path): + monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", raising=False) + monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_BIN", raising=False) + fake = tmp_path / ("bfconvert.bat" if bic.platform.system() == "Windows" else "bfconvert") + fake.write_text("", encoding="utf-8") + monkeypatch.setattr(bic, "ensure_bioformats_tools", lambda cache_dir=None: fake) + + command = bic.bioimage_convert_command( + Path("in.tif"), + Path("out.ome.tiff"), + "ome-tiff", + ("-compression", "JPEG", "-quality", "0.90"), + ) + + assert command == [ + str(fake), + "-compression", + "JPEG", + "-quality", + "0.90", + "in.tif", + "out.ome.tiff", + ] + + def test_ensure_bioformats_tools_downloads_verifies_and_extracts(monkeypatch, tmp_path): archive = tmp_path / "fixture-bftools.zip" import hashlib diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py index 82be642..9d36221 100644 --- a/twinspect/datasets/bioimage_convert.py +++ b/twinspect/datasets/bioimage_convert.py @@ -8,12 +8,15 @@ 0000000/1variant_ome-tiff.ome.tiff 0000000/2variant_tiff.tiff 0000000/3variant_png.png + 0000000/4variant_jpeg.jpg + 0000000/5variant_tiff-jpeg.tiff + 0000000/6variant_ome-tiff-jpeg.ome.tiff The converted cluster members are intended for benchmarking IMAGEWALK-based -bioimage Data-Code matching across storage formats. Bio-Formats ``bfconvert`` -from pinned OME bftools is used by default because it is mature, -cross-platform, actively maintained, and supports microscopy formats beyond -ordinary Pillow/OpenCV image files. +bioimage Data-Code matching across storage formats and codec semantics. +Bio-Formats ``bfconvert`` from pinned OME bftools is used by default because it +is mature, cross-platform, actively maintained, and supports microscopy formats +beyond ordinary Pillow/OpenCV image files. """ from __future__ import annotations @@ -74,11 +77,22 @@ # Conservative, broadly readable single-file output formats. Directory formats # such as OME-NGFF/Zarr are intentionally excluded because TwinSpect currently -# treats benchmark assets as files. +# treats benchmark assets as files. The first three conversions form an identity +# tier on the BBBC smoke set; the JPEG-compressed conversions are real codec +# conversions that produce non-identical IMAGEWALK bitstreams without synthetic +# brightness/blur/crop/etc. manipulations. CONVERSIONS = ( - ("ome-tiff", ".ome.tiff", "ome-tiff"), - ("tiff", ".tiff", "tiff"), - ("png", ".png", "png"), + ("ome-tiff", ".ome.tiff", "ome-tiff", ()), + ("tiff", ".tiff", "tiff", ()), + ("png", ".png", "png", ()), + ("jpeg", ".jpg", "jpeg", ()), + ("tiff-jpeg", ".tiff", "tiff", ("-compression", "JPEG", "-quality", "0.90")), + ( + "ome-tiff-jpeg", + ".ome.tiff", + "ome-tiff", + ("-compression", "JPEG", "-quality", "0.90"), + ), ) IMAGE_EXTENSIONS = {".bmp", ".gif", ".jpg", ".jpeg", ".png", ".tif", ".tiff"} @@ -228,9 +242,9 @@ def build_cluster(sample, cluster_path): original_path = cluster_path / f"0original{sample.suffix}" extract_member(sample, original_path) validate_file_size(original_path) - for idx, (label, suffix, format_name) in enumerate(CONVERSIONS, start=1): + for idx, (label, suffix, format_name, convert_args) in enumerate(CONVERSIONS, start=1): output_path = cluster_path / f"{idx}variant_{label}{suffix}" - convert_file(original_path, output_path, format_name) + convert_file(original_path, output_path, format_name, convert_args) validate_file_size(output_path) @@ -247,8 +261,8 @@ def extract_member(sample, output_path): return output_path -def convert_file(input_path, output_path, format_name): - # type: (Path, Path, str) -> Path +def convert_file(input_path, output_path, format_name, convert_args=()): + # type: (Path, Path, str, tuple[str, ...]) -> Path """Convert ``input_path`` with BioImage Convert. The default converter is the pinned Bio-Formats command-line tool @@ -262,7 +276,7 @@ def convert_file(input_path, output_path, format_name): validate_file_size(output_path) return output_path - command = bioimage_convert_command(input_path, output_path, format_name) + command = bioimage_convert_command(input_path, output_path, format_name, convert_args) timeout = int(os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TIMEOUT", DEFAULT_CONVERT_TIMEOUT)) log.debug("Running BioImage Convert: {}", " ".join(command)) try: @@ -293,20 +307,27 @@ def convert_file(input_path, output_path, format_name): return output_path -def bioimage_convert_command(input_path, output_path, format_name): - # type: (Path, Path, str) -> list[str] +def bioimage_convert_command(input_path, output_path, format_name, convert_args=()): + # type: (Path, Path, str, tuple[str, ...]) -> list[str] """Build the BioImage conversion command line.""" template = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE") if template: + options = " ".join(shlex.quote(option) for option in convert_args) return [ - part.format(input=input_path, output=output_path, format=format_name) + part.format(input=input_path, output=output_path, format=format_name, options=options) for part in shlex.split(template) ] binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") if binary: + if convert_args: + raise RuntimeError( + "TWINSPECT_BIOIMAGE_CONVERT_BIN uses the legacy imgcnv argument shape and cannot " + "represent Bio-Formats codec options. Use TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE " + "with an {options} placeholder for codec-specific conversions." + ) return [binary, "-i", str(input_path), "-o", str(output_path), "-t", format_name] bfconvert = ensure_bioformats_tools() - return [str(bfconvert), str(input_path), str(output_path)] + return [str(bfconvert), *convert_args, str(input_path), str(output_path)] def default_bioformats_cache_dir(): @@ -455,7 +476,7 @@ def validate_cluster(cluster_path): ) validate_file_size(originals[0]) - for idx, (label, suffix, _) in enumerate(CONVERSIONS, start=1): + for idx, (label, suffix, _, _) in enumerate(CONVERSIONS, start=1): path = cluster_path / f"{idx}variant_{label}{suffix}" validate_file_size(path) From 907d62cc46cb118518c10580b5e17a9631a0a673 Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 17:02:30 +0200 Subject: [PATCH 6/7] refine bioimage default conversion targets --- README.md | 11 +++-- config.yml | 6 +-- tests/test_bioimage_convert_dataset.py | 40 +++------------- twinspect/algos/iscc_bio.py | 32 +++++++++++++ twinspect/datasets/bioimage_convert.py | 63 ++++++++++---------------- 5 files changed, 74 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 54ffcd0..eeae283 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,8 @@ uv run twinspect checksum # Compute folder checksum The `bioimage_convert_1000` dataset builds 1000 same-source conversion clusters from public Broad Bioimage Benchmark Collection sources. Each cluster contains the selected source bioimage plus -OME-TIFF, TIFF, PNG, JPEG, TIFF/JPEG, and OME-TIFF/JPEG variants converted with pinned OME Bio-Formats bftools `8.5.0`. +OME-TIFF, TIFF, PNG, JPEG 2000, DICOM and ICS variants converted with pinned +OME Bio-Formats bftools `8.5.0` using default conversion settings only. TwinSpect downloads and verifies the bftools archive automatically on first use: @@ -80,8 +81,12 @@ Bio-Formats bftools is a Java distribution with Unix and Windows launchers (`bfc the legacy `imgcnv -i INPUT -o OUTPUT -t FORMAT` argument shape, while arbitrary CLIs should use the template override. -The benchmark measures same-source conversion robustness. It intentionally uses real format/codec conversions rather than synthetic edits such as brightness shifts or blur. On the BBBC smoke set, lossless/container conversions keep IMAGEWALK Data-Codes identical, while JPEG-compressed conversions produce non-identical IMAGEWALK bitstreams through codec artifacts; that drift is part of the benchmark -pressure. +The benchmark measures same-source conversion robustness. It intentionally uses default +format conversions rather than synthetic edits, brightness shifts, blur, or custom compression +flags. On BBBC smoke runs with Bio-Formats defaults, OME-TIFF/TIFF/PNG/DICOM/ICS +generally preserve identical IMAGEWALK Data-Codes, while JPEG 2000 introduces converter drift +on some BMP sources. That negative/positive split is part of the benchmark pressure and keeps +the dataset semantics converter-induced rather than hand-edited. ## Documentation diff --git a/config.yml b/config.yml index 0e62b7b..3a4926c 100644 --- a/config.yml +++ b/config.yml @@ -109,9 +109,9 @@ datasets: label: bioimage_convert_1000 info: Reproducible 1000-cluster public bioimage benchmark built from Broad Bioimage Benchmark Collection archives. Each selected source image is converted with pinned OME - Bio-Formats bftools into lossless/container and JPEG-compressed single-file formats, producing - same-source clusters for evaluating iscc-bio IMAGEWALK Data-Code matching under realistic - format/codec conversion drift. + Bio-Formats bftools defaults into common, exotic, and microscopy-oriented single-file + formats, producing same-source clusters for evaluating iscc-bio IMAGEWALK Data-Code + matching under converter-induced format drift. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/tests/test_bioimage_convert_dataset.py b/tests/test_bioimage_convert_dataset.py index 35d8627..862f459 100644 --- a/tests/test_bioimage_convert_dataset.py +++ b/tests/test_bioimage_convert_dataset.py @@ -78,7 +78,7 @@ def fake_extract_member(sample, output_path): output_path.write_bytes(b"original") return output_path - def fake_convert_file(input_path, output_path, format_name, convert_args=()): + def fake_convert_file(input_path, output_path, format_name): output_path.write_bytes(format_name.encode("utf-8")) return output_path @@ -94,9 +94,9 @@ def fake_convert_file(input_path, output_path, format_name, convert_args=()): "1variant_ome-tiff.ome.tiff", "2variant_tiff.tiff", "3variant_png.png", - "4variant_jpeg.jpg", - "5variant_tiff-jpeg.tiff", - "6variant_ome-tiff-jpeg.ome.tiff", + "4variant_jp2.jp2", + "5variant_dicom.dcm", + "6variant_ics.ics", ] bic.validate_cluster(cluster) @@ -104,11 +104,9 @@ def fake_convert_file(input_path, output_path, format_name, convert_args=()): def test_bioimage_convert_command_allows_template(monkeypatch): monkeypatch.setenv( "TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", - "converter --input {input} --output {output} --format {format} --opts {options}", - ) - command = bic.bioimage_convert_command( - Path("in.tif"), Path("out.png"), "png", ("-compression", "JPEG") + "converter --input {input} --output {output} --format {format}", ) + command = bic.bioimage_convert_command(Path("in.tif"), Path("out.png"), "png") assert command == [ "converter", "--input", @@ -117,8 +115,6 @@ def test_bioimage_convert_command_allows_template(monkeypatch): "out.png", "--format", "png", - "--opts", - "-compression JPEG", ] @@ -140,30 +136,6 @@ def test_default_converter_command_uses_pinned_bfconvert(monkeypatch, tmp_path): assert command == [str(fake), "in.tif", "out.ome.tiff"] -def test_default_converter_command_includes_bioformats_codec_options(monkeypatch, tmp_path): - monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE", raising=False) - monkeypatch.delenv("TWINSPECT_BIOIMAGE_CONVERT_BIN", raising=False) - fake = tmp_path / ("bfconvert.bat" if bic.platform.system() == "Windows" else "bfconvert") - fake.write_text("", encoding="utf-8") - monkeypatch.setattr(bic, "ensure_bioformats_tools", lambda cache_dir=None: fake) - - command = bic.bioimage_convert_command( - Path("in.tif"), - Path("out.ome.tiff"), - "ome-tiff", - ("-compression", "JPEG", "-quality", "0.90"), - ) - - assert command == [ - str(fake), - "-compression", - "JPEG", - "-quality", - "0.90", - "in.tif", - "out.ome.tiff", - ] - def test_ensure_bioformats_tools_downloads_verifies_and_extracts(monkeypatch, tmp_path): archive = tmp_path / "fixture-bftools.zip" diff --git a/twinspect/algos/iscc_bio.py b/twinspect/algos/iscc_bio.py index 0a4d230..1a3f8f8 100644 --- a/twinspect/algos/iscc_bio.py +++ b/twinspect/algos/iscc_bio.py @@ -4,7 +4,38 @@ from pathlib import Path from typing import Optional +import numpy as np from loguru import logger as log +_LAZY_BIOFORMATS_PATCHED = False + + +def _patch_lazy_bioformats_planes(): + """Make current iscc-bio tolerate Bio-Formats LazyBioArray planes. + + Some BioIO/Bio-Formats readers return a LazyBioArray from ``compute()``. The + installed iscc-bio version assumes a NumPy ndarray and calls ``flatten`` + directly, which prevents DICOM/ICS/IDS default-conversion targets from being + benchmarked. Coercing to ndarray preserves the same canonical pixel bytes for + ordinary arrays and lets Bio-Formats-backed planes hash normally. + """ + global _LAZY_BIOFORMATS_PATCHED + try: + import iscc_bio.biocode as biocode_module + import iscc_bio.imagewalk.common as common + except ImportError: + return + + if _LAZY_BIOFORMATS_PATCHED: + return + + original = common.plane_to_canonical_bytes + + def plane_to_canonical_bytes(plane): + return original(np.asarray(plane)) + + common.plane_to_canonical_bytes = plane_to_canonical_bytes + biocode_module.plane_to_canonical_bytes = plane_to_canonical_bytes + _LAZY_BIOFORMATS_PATCHED = True def bioimage_data_code_iw_64(fp) -> Optional[str]: @@ -20,6 +51,7 @@ def bioimage_data_code_iw_64(fp) -> Optional[str]: import iscc_lib from iscc_bio.api import biocode + _patch_lazy_bioformats_planes() results = biocode(fp, bits=64, source_type="auto") if not results: log.error(f"No biocode result for {fp}") diff --git a/twinspect/datasets/bioimage_convert.py b/twinspect/datasets/bioimage_convert.py index 9d36221..5633d2c 100644 --- a/twinspect/datasets/bioimage_convert.py +++ b/twinspect/datasets/bioimage_convert.py @@ -8,12 +8,12 @@ 0000000/1variant_ome-tiff.ome.tiff 0000000/2variant_tiff.tiff 0000000/3variant_png.png - 0000000/4variant_jpeg.jpg - 0000000/5variant_tiff-jpeg.tiff - 0000000/6variant_ome-tiff-jpeg.ome.tiff + 0000000/4variant_jp2.jp2 + 0000000/5variant_dicom.dcm + 0000000/6variant_ics.ics The converted cluster members are intended for benchmarking IMAGEWALK-based -bioimage Data-Code matching across storage formats and codec semantics. +bioimage Data-Code matching across default storage-format conversions. Bio-Formats ``bfconvert`` from pinned OME bftools is used by default because it is mature, cross-platform, actively maintained, and supports microscopy formats beyond ordinary Pillow/OpenCV image files. @@ -75,24 +75,18 @@ }, ) -# Conservative, broadly readable single-file output formats. Directory formats -# such as OME-NGFF/Zarr are intentionally excluded because TwinSpect currently -# treats benchmark assets as files. The first three conversions form an identity -# tier on the BBBC smoke set; the JPEG-compressed conversions are real codec -# conversions that produce non-identical IMAGEWALK bitstreams without synthetic -# brightness/blur/crop/etc. manipulations. +# Default-only single-file output formats. Directory formats such as OME-NGFF/Zarr +# are intentionally excluded because TwinSpect currently treats benchmark assets as +# files. The target set includes ordinary web/file formats plus more specialized +# Bio-Formats outputs (DICOM, ICS/IDS) to test storage-format conversion effects +# without synthetic pixel edits or custom codec/compression settings. CONVERSIONS = ( - ("ome-tiff", ".ome.tiff", "ome-tiff", ()), - ("tiff", ".tiff", "tiff", ()), - ("png", ".png", "png", ()), - ("jpeg", ".jpg", "jpeg", ()), - ("tiff-jpeg", ".tiff", "tiff", ("-compression", "JPEG", "-quality", "0.90")), - ( - "ome-tiff-jpeg", - ".ome.tiff", - "ome-tiff", - ("-compression", "JPEG", "-quality", "0.90"), - ), + ("ome-tiff", ".ome.tiff", "ome-tiff"), + ("tiff", ".tiff", "tiff"), + ("png", ".png", "png"), + ("jp2", ".jp2", "jp2"), + ("dicom", ".dcm", "dicom"), + ("ics", ".ics", "ics"), ) IMAGE_EXTENSIONS = {".bmp", ".gif", ".jpg", ".jpeg", ".png", ".tif", ".tiff"} @@ -242,9 +236,9 @@ def build_cluster(sample, cluster_path): original_path = cluster_path / f"0original{sample.suffix}" extract_member(sample, original_path) validate_file_size(original_path) - for idx, (label, suffix, format_name, convert_args) in enumerate(CONVERSIONS, start=1): + for idx, (label, suffix, format_name) in enumerate(CONVERSIONS, start=1): output_path = cluster_path / f"{idx}variant_{label}{suffix}" - convert_file(original_path, output_path, format_name, convert_args) + convert_file(original_path, output_path, format_name) validate_file_size(output_path) @@ -261,8 +255,8 @@ def extract_member(sample, output_path): return output_path -def convert_file(input_path, output_path, format_name, convert_args=()): - # type: (Path, Path, str, tuple[str, ...]) -> Path +def convert_file(input_path, output_path, format_name): + # type: (Path, Path, str) -> Path """Convert ``input_path`` with BioImage Convert. The default converter is the pinned Bio-Formats command-line tool @@ -276,7 +270,7 @@ def convert_file(input_path, output_path, format_name, convert_args=()): validate_file_size(output_path) return output_path - command = bioimage_convert_command(input_path, output_path, format_name, convert_args) + command = bioimage_convert_command(input_path, output_path, format_name) timeout = int(os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TIMEOUT", DEFAULT_CONVERT_TIMEOUT)) log.debug("Running BioImage Convert: {}", " ".join(command)) try: @@ -307,27 +301,20 @@ def convert_file(input_path, output_path, format_name, convert_args=()): return output_path -def bioimage_convert_command(input_path, output_path, format_name, convert_args=()): - # type: (Path, Path, str, tuple[str, ...]) -> list[str] +def bioimage_convert_command(input_path, output_path, format_name): + # type: (Path, Path, str) -> list[str] """Build the BioImage conversion command line.""" template = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE") if template: - options = " ".join(shlex.quote(option) for option in convert_args) return [ - part.format(input=input_path, output=output_path, format=format_name, options=options) + part.format(input=input_path, output=output_path, format=format_name) for part in shlex.split(template) ] binary = os.environ.get("TWINSPECT_BIOIMAGE_CONVERT_BIN") if binary: - if convert_args: - raise RuntimeError( - "TWINSPECT_BIOIMAGE_CONVERT_BIN uses the legacy imgcnv argument shape and cannot " - "represent Bio-Formats codec options. Use TWINSPECT_BIOIMAGE_CONVERT_TEMPLATE " - "with an {options} placeholder for codec-specific conversions." - ) return [binary, "-i", str(input_path), "-o", str(output_path), "-t", format_name] bfconvert = ensure_bioformats_tools() - return [str(bfconvert), *convert_args, str(input_path), str(output_path)] + return [str(bfconvert), str(input_path), str(output_path)] def default_bioformats_cache_dir(): @@ -476,7 +463,7 @@ def validate_cluster(cluster_path): ) validate_file_size(originals[0]) - for idx, (label, suffix, _, _) in enumerate(CONVERSIONS, start=1): + for idx, (label, suffix, _) in enumerate(CONVERSIONS, start=1): path = cluster_path / f"{idx}variant_{label}{suffix}" validate_file_size(path) From 28834fbf91bf760c18d8fc1f63a617939918ac73 Mon Sep 17 00:00:00 2001 From: Ash Zero Date: Mon, 8 Jun 2026 17:33:13 +0200 Subject: [PATCH 7/7] support zarr media inputs for bioimage drift --- README.md | 9 +++++++-- config.yml | 4 +++- tests/test_processing.py | 20 ++++++++++++++++++++ twinspect/algos/processing.py | 35 +++++++++++++++++++++++++++++------ 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index eeae283..6d5f5d3 100644 --- a/README.md +++ b/README.md @@ -85,8 +85,13 @@ The benchmark measures same-source conversion robustness. It intentionally uses format conversions rather than synthetic edits, brightness shifts, blur, or custom compression flags. On BBBC smoke runs with Bio-Formats defaults, OME-TIFF/TIFF/PNG/DICOM/ICS generally preserve identical IMAGEWALK Data-Codes, while JPEG 2000 introduces converter drift -on some BMP sources. That negative/positive split is part of the benchmark pressure and keeps -the dataset semantics converter-induced rather than hand-edited. +on some BMP sources. A stronger real-world stress case is lossy proprietary microscopy input, +especially Zeiss CZI files using JPEG-XR compression converted to OME-Zarr with `bioformats2raw`: +different valid decoder/conversion paths can preserve about 96% exact pixels while producing +non-identical IMAGEWALK codes. TwinSpect treats `.zarr` directories as single benchmark media +inputs so such CZI-to-OME-Zarr clusters can be added without hashing internal chunk files. +That negative/positive split is part of the benchmark pressure and keeps the dataset semantics +converter-induced rather than hand-edited. ## Documentation diff --git a/config.yml b/config.yml index 3a4926c..03220b4 100644 --- a/config.yml +++ b/config.yml @@ -111,7 +111,9 @@ datasets: Benchmark Collection archives. Each selected source image is converted with pinned OME Bio-Formats bftools defaults into common, exotic, and microscopy-oriented single-file formats, producing same-source clusters for evaluating iscc-bio IMAGEWALK Data-Code - matching under converter-induced format drift. + matching under converter-induced format drift. Directory-backed media such as + OME-Zarr are treated as single benchmark inputs so CZI/JPEG-XR to OME-Zarr decoder + drift cases can be added without hashing internal chunks. url: https://bbbc.broadinstitute.org/ mode: image installer: twinspect.datasets.bioimage_convert:install diff --git a/tests/test_processing.py b/tests/test_processing.py index 97b71a6..ee599af 100644 --- a/tests/test_processing.py +++ b/tests/test_processing.py @@ -12,3 +12,23 @@ def test_benchmark_files_skip_metadata_files(tmp_path): (tmp_path / ".cache.json").write_text("{}", encoding="utf-8") assert benchmark_files(tmp_path) == [image, top_level_underscore_asset] + + +def test_benchmark_files_treat_zarr_directories_as_single_media_inputs(tmp_path): + cluster = tmp_path / "0000000" + cluster.mkdir() + original = cluster / "0original.czi" + original.write_bytes(b"czi") + + zarr = cluster / "1variant_ome.zarr" + nested = zarr / "0" / "0" / "0" + nested.mkdir(parents=True) + (zarr / ".zattrs").write_text("{}", encoding="utf-8") + (nested / "0").write_bytes(b"chunk") + + plain_dir = cluster / "sidecar" + plain_dir.mkdir() + sidecar_file = plain_dir / "metadata.txt" + sidecar_file.write_text("metadata", encoding="utf-8") + + assert benchmark_files(tmp_path) == [original, zarr, sidecar_file] diff --git a/twinspect/algos/processing.py b/twinspect/algos/processing.py index b29ceb3..cdda035 100644 --- a/twinspect/algos/processing.py +++ b/twinspect/algos/processing.py @@ -64,17 +64,40 @@ def process_file(function: Callable, task: ts.Task) -> ts.Task: def benchmark_files(data_folder): # type: (Path) -> list[Path] - """Return files that should be processed by benchmark algorithms. + """Return benchmark media inputs with deterministic ordering. Dataset-local metadata files are useful for reproducibility but are not media inputs. Skip top-level hidden/underscore metadata so simprint generation does not try to hash JSON build manifests. + + Directory-backed media formats, especially OME-NGFF/Zarr, must be treated as + one benchmark input. Walking their internal chunk files would benchmark the + container serialization instead of the decoded image content. """ - return [ - path - for path in ts.iter_files(data_folder) - if not (path.parent == data_folder and is_dataset_metadata_file(path)) - ] + data_folder = Path(data_folder) + + def walk(path): + entries = sorted(path.iterdir(), key=lambda item: item.name) + for entry in entries: + if entry.is_dir(): + if is_directory_media_input(entry): + yield entry + else: + yield from walk(entry) + elif not (entry.parent == data_folder and is_dataset_metadata_file(entry)): + yield entry + + return list(walk(data_folder)) + + +def is_directory_media_input(path): + # type: (Path) -> bool + """Return true for directory-backed media that should hash as one input.""" + return ( + path.suffix == ".zarr" + or (path / ".zattrs").exists() + or (path / "zarr.json").exists() + ) def is_dataset_metadata_file(path):