Skill Tracer
Skills › Scientific Agent Skills › pathml › data_management.md

data_management.md

390 lines · skills/pathml/references/data_management.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# Data management, h5path, manifests, datasets, and provenance
2
3This reference targets **PathML 3.0.8 stable** and a local, de-identified research
4workflow.
5

Data management, h5path, manifests, datasets, and provenance

This reference targets PathML 3.0.8 stable and a local, de-identified research workflow.

Raw lines 1 to 5
6## Data boundaries
7
8Separate four classes of data:
9
101. **Source slides** — immutable, access-controlled originals.
112. **Linkage data** — direct identifiers and the pseudonym mapping, held outside
12 the analysis workspace by an authorized custodian.
133. **Analysis data** — pseudonymous manifests, tiles, masks, counts, graphs, and
14 features.
154. **Reports/models** — potentially identifying derived artifacts that still
16 require governance.
18Do not assume derived images or embeddings are anonymous. Rare morphology,
19scanner metadata, dates, or cohort combinations can re-identify a participant.
20Apply the minimum-necessary principle and institutional retention policy.

Data boundaries

Separate four classes of data:

  1. Source slides — immutable, access-controlled originals.
  2. Linkage data — direct identifiers and the pseudonym mapping, held outside the analysis workspace by an authorized custodian.
  3. Analysis data — pseudonymous manifests, tiles, masks, counts, graphs, and features.
  4. Reports/models — potentially identifying derived artifacts that still require governance.

Do not assume derived images or embeddings are anonymous. Rare morphology, scanner metadata, dates, or cohort combinations can re-identify a participant. Apply the minimum-necessary principle and institutional retention policy.

Raw lines 6 to 21
22## Manifest first
24Use one row per slide. Recommended columns:
26```text
27slide_id,patient_id,specimen_id,path,split,stain,backend,site,scanner
28```
30Rules:
32- IDs are pseudonyms, not MRNs, accessions, initials, dates, or names.
33- `slide_id` is unique.
34- one `patient_id` maps to exactly one split;
35- one slide path maps to one slide ID;
36- paths are local, relative to a declared root where possible;
37- URLs and symlinks are rejected;
38- split values are a fixed allowlist such as `train`, `validation`, `test`;
39- serial sections, rescans, and multiple blocks from one patient remain together.
41Validate before PathML:
43```bash
44python scripts/slide_manifest.py validate \
45 --manifest metadata/manifest.csv \
46 --root .
47```
49The validator checks strict CSV structure, duplicate IDs/paths, missing local
50files, unsafe paths, supported suffixes, and patient/slide leakage. It does not
51upload data or inspect arbitrary clinical fields.
52If the `split` column is present, every row must supply it. Without that column,
53the report explicitly leaves patient split isolation unchecked.

Manifest first

Use one row per slide. Recommended columns:

slide_id,patient_id,specimen_id,path,split,stain,backend,site,scanner

Rules:

  • IDs are pseudonyms, not MRNs, accessions, initials, dates, or names.
  • slide_id is unique.
  • one patient_id maps to exactly one split;
  • one slide path maps to one slide ID;
  • paths are local, relative to a declared root where possible;
  • URLs and symlinks are rejected;
  • split values are a fixed allowlist such as train, validation, test;
  • serial sections, rescans, and multiple blocks from one patient remain together.

Validate before PathML:

python scripts/slide_manifest.py validate \
  --manifest metadata/manifest.csv \
  --root .

The validator checks strict CSV structure, duplicate IDs/paths, missing local files, unsafe paths, supported suffixes, and patient/slide leakage. It does not upload data or inspect arbitrary clinical fields. If the split column is present, every row must supply it. Without that column, the report explicitly leaves patient split isolation unchecked.

Raw lines 22 to 54
Runs code python scripts/slide_manifest.py :44
55## h5path format
57PathML processes slides into an HDF5-based `.h5path` file. Stable documentation
58describes:
60```text
61root/
62├── fields/
63│ ├── labels/ # slide-level attributes
64│ └── slide_type/ # stain/platform flags
65├── masks/ # slide-level masks
66├── counts/ # AnnData-like counts storage
67└── tiles/
68 ├── attributes # tile_shape, tile_stride
69 └── "(i, j)"/
70 ├── array
71 ├── masks/
72 ├── labels/
73 └── attributes # coords, name
74```
76Write and reopen through public APIs:
78```python
79from pathml.core import SlideData
81slide.write("derived/slide-001.h5path")
82reopened = SlideData("derived/slide-001.h5path")
83```
85There is no stable `to_hdf5()`, `from_hdf5()`, or
86`load_tiles_from_hdf5()` API. `SlideDataset.write(directory, filenames=None)`
87calls each slide's `write()`.
89Released `h5pathManager.add_tile()` explicitly casts both tile images and tile
90masks to `float16`. Integers through 2048 are exact, but 2049 rounds to 2048 and
91large values can overflow beyond 65504. Thus distinct instance IDs can merge;
92intensity values can also lose precision. This is a storage limitation, even
93when Bio-Formats read with `normalize=False`.
95Preserve authoritative quantitative images and integer instance maps in a
96separate lossless, typed format. Check actual label identity and dtype after a
97small h5path round trip before downstream counting. Binary masks are not subject
98to the same instance-ID loss. Record tolerances for float measurements, but
99require exact equality for categorical labels.

h5path format

PathML processes slides into an HDF5-based .h5path file. Stable documentation describes:

root/
├── fields/
│   ├── labels/          # slide-level attributes
│   └── slide_type/      # stain/platform flags
├── masks/               # slide-level masks
├── counts/              # AnnData-like counts storage
└── tiles/
    ├── attributes       # tile_shape, tile_stride
    └── "(i, j)"/
        ├── array
        ├── masks/
        ├── labels/
        └── attributes   # coords, name

Write and reopen through public APIs:

from pathml.core import SlideData

slide.write("derived/slide-001.h5path")
reopened = SlideData("derived/slide-001.h5path")

There is no stable to_hdf5(), from_hdf5(), or load_tiles_from_hdf5() API. SlideDataset.write(directory, filenames=None) calls each slide's write().

Released h5pathManager.add_tile() explicitly casts both tile images and tile masks to float16. Integers through 2048 are exact, but 2049 rounds to 2048 and large values can overflow beyond 65504. Thus distinct instance IDs can merge; intensity values can also lose precision. This is a storage limitation, even when Bio-Formats read with normalize=False.

Preserve authoritative quantitative images and integer instance maps in a separate lossless, typed format. Check actual label identity and dtype after a small h5path round trip before downstream counting. Binary masks are not subject to the same instance-ID loss. Record tolerances for float measurements, but require exact equality for categorical labels.

Raw lines 55 to 100
101## h5path trust boundary
103Treat `.h5path` as a structured binary input, not harmless data:
105- HDF5 parsers have a large attack surface; open third-party files in isolation.
106- PathML 3.0.8 `TileDataset` and core h5path/tile code dynamically interpret the
107 stored `tile_shape` attribute as a Python expression. Never open an untrusted
108 `.h5path`, including through `SlideData`.
109- Labels can contain sensitive values. Do not copy direct identifiers into HDF5.
110- A malformed file can request large allocations. Check file size and schema
111 before loading.
112- Do not edit HDF5 concurrently from multiple processes unless the access pattern
113 is explicitly designed and tested.
115Use a sidecar JSON manifest for provenance rather than relying on arbitrary HDF5
116labels. Keep the JSON strict, bounded, pseudonymous, and versioned.

h5path trust boundary

Treat .h5path as a structured binary input, not harmless data:

  • HDF5 parsers have a large attack surface; open third-party files in isolation.
  • PathML 3.0.8 TileDataset and core h5path/tile code dynamically interpret the stored tile_shape attribute as a Python expression. Never open an untrusted .h5path, including through SlideData.
  • Labels can contain sensitive values. Do not copy direct identifiers into HDF5.
  • A malformed file can request large allocations. Check file size and schema before loading.
  • Do not edit HDF5 concurrently from multiple processes unless the access pattern is explicitly designed and tested.

Use a sidecar JSON manifest for provenance rather than relying on arbitrary HDF5 labels. Keep the JSON strict, bounded, pseudonymous, and versioned.

Raw lines 101 to 117
118## PyTorch tile dataset
120The canonical stable import is:
122```python
123from pathml.datasets import TileDataset
124from torch.utils.data import DataLoader
126tiles = TileDataset("derived/slide-001.h5path")
127loader = DataLoader(
128 tiles,
129 batch_size=8,
130 shuffle=False,
131 num_workers=0,
133```
135Each item is:
137```text
138(tile_image, tile_masks, tile_labels, slide_labels)
139```
141Shapes:
143- RGB/multichannel 3-D input becomes `(C, H, W)`.
144- 5-D PathML input `(i, j, z, c, t)` becomes `(T, C, Z, W, H)` in stable
145 source; verify axis semantics before use.
146- masks are stacked as `(n_masks, tile_height, tile_width)` when present.
147- values returned by the dataset are NumPy arrays; the PyTorch loader collates
148 them to tensors. Missing masks are `None`, which default collation cannot
149 handle; use a custom `collate_fn` for missing masks or nonstandard labels.
151`TileDataset` does not return coordinates explicitly. Keep a parallel mapping
152from sample index to its stored tile key/coords (HDF5 iteration is not a numeric
153row/column sort), or include validated coordinate metadata in a custom dataset.
155Do not assume mask dictionary order carries semantics. Persist ordered mask names
156in a separate schema and assert them when loading.
158`pathml.ml.TileDataset` is also exported in 3.0.8, but
159`pathml.datasets.TileDataset` is the documented dataset API.

PyTorch tile dataset

The canonical stable import is:

from pathml.datasets import TileDataset
from torch.utils.data import DataLoader

tiles = TileDataset("derived/slide-001.h5path")
loader = DataLoader(
    tiles,
    batch_size=8,
    shuffle=False,
    num_workers=0,
)

Each item is:

(tile_image, tile_masks, tile_labels, slide_labels)

Shapes:

  • RGB/multichannel 3-D input becomes (C, H, W).
  • 5-D PathML input (i, j, z, c, t) becomes (T, C, Z, W, H) in stable source; verify axis semantics before use.
  • masks are stacked as (n_masks, tile_height, tile_width) when present.
  • values returned by the dataset are NumPy arrays; the PyTorch loader collates them to tensors. Missing masks are None, which default collation cannot handle; use a custom collate_fn for missing masks or nonstandard labels.

TileDataset does not return coordinates explicitly. Keep a parallel mapping from sample index to its stored tile key/coords (HDF5 iteration is not a numeric row/column sort), or include validated coordinate metadata in a custom dataset.

Do not assume mask dictionary order carries semantics. Persist ordered mask names in a separate schema and assert them when loading.

pathml.ml.TileDataset is also exported in 3.0.8, but pathml.datasets.TileDataset is the documented dataset API.

Raw lines 118 to 160
161## SlideDataset
163`SlideDataset(slides)` accepts a list of already constructed `SlideData` objects:
165```python
166from pathml.core import HESlide, SlideDataset
168slides = [
169 HESlide("data/slide-001.svs", backend="openslide"),
170 HESlide("data/slide-002.svs", backend="openslide"),
172cohort = SlideDataset(slides)
173cohort.run(pipeline, distributed=False, tile_size=512, level=0)
174cohort.write("derived")
175```
177It does not accept a glob/path list plus tiling arguments as a constructor.
178Preserve a deterministic manifest order and map output filenames explicitly.

SlideDataset

SlideDataset(slides) accepts a list of already constructed SlideData objects:

from pathml.core import HESlide, SlideDataset

slides = [
    HESlide("data/slide-001.svs", backend="openslide"),
    HESlide("data/slide-002.svs", backend="openslide"),
]
cohort = SlideDataset(slides)
cohort.run(pipeline, distributed=False, tile_size=512, level=0)
cohort.write("derived")

It does not accept a glob/path list plus tiling arguments as a constructor. Preserve a deterministic manifest order and map output filenames explicitly.

Raw lines 161 to 179
180## Public data modules
182Stable `pathml.datasets` exports:
184```python
185from pathml.datasets import DeepFocusDataModule, PanNukeDataModule
186```

Public data modules

Stable pathml.datasets exports:

from pathml.datasets import DeepFocusDataModule, PanNukeDataModule
Raw lines 180 to 187
188### PanNuke
190```python
191pannuke = PanNukeDataModule(
192 data_dir="approved_data/pannuke",
193 download=False,
194 shuffle=True,
195 nucleus_type_labels=True,
196 split=1,
197 batch_size=8,
198 hovernet_preprocess=True,
200```
202- 7,901 256-pixel patches, 19 tissue types, five nucleus categories plus
203 background.
204- `download=False` is the safe default.
205- `download=True` downloads three ZIPs from
206 `https://warwick.ac.uk/fac/cross_fac/tia/data/pannuke/fold_{1,2,3}.zip` and
207 extracts them. These are binary GETs, without authentication or pagination.
208- `split` must be 1, 2, 3, or `None`; each integer rotates the three published
209 folds across train/validation/test.
210- `split=None` exposes the whole dataset; do not use it for performance
211 estimation.
213Published folds are not a substitute for verifying patient/source-slide
214independence for the intended claim.

PanNuke

pannuke = PanNukeDataModule(
    data_dir="approved_data/pannuke",
    download=False,
    shuffle=True,
    nucleus_type_labels=True,
    split=1,
    batch_size=8,
    hovernet_preprocess=True,
)
  • 7,901 256-pixel patches, 19 tissue types, five nucleus categories plus background.
  • download=False is the safe default.
  • download=True downloads three ZIPs from https://warwick.ac.uk/fac/cross_fac/tia/data/pannuke/fold_{1,2,3}.zip and extracts them. These are binary GETs, without authentication or pagination.
  • split must be 1, 2, 3, or None; each integer rotates the three published folds across train/validation/test.
  • split=None exposes the whole dataset; do not use it for performance estimation.

Published folds are not a substitute for verifying patient/source-slide independence for the intended claim.

Raw lines 188 to 215
216### DeepFocus
218```python
219deepfocus = DeepFocusDataModule(
220 data_dir="approved_data/deepfocus",
221 download=False,
222 shuffle=True,
223 batch_size=8,
225```
227- focus classification patches derived from four slides/patients and four stains;
228- `download=True` GETs
229 `https://zenodo.org/record/1134848/files/outoffocus2017_patches5Classification.h5`
230 without authentication/pagination;
231- the integrity method checks a fixed MD5 before reusing a local file, but the
232 download method does not perform a second post-download check. Verify the
233 completed file independently before use.
235MD5 here is an upstream integrity check, not a modern provenance guarantee.
236Record a SHA-256 and dataset license/source separately.
238PathML 3.0.8 does **not** export `TCGADataModule`. Use a separately governed data
239acquisition process for TCGA/GDC and document its API/version/consent terms.

DeepFocus

deepfocus = DeepFocusDataModule(
    data_dir="approved_data/deepfocus",
    download=False,
    shuffle=True,
    batch_size=8,
)
  • focus classification patches derived from four slides/patients and four stains;
  • download=True GETs https://zenodo.org/record/1134848/files/outoffocus2017_patches5Classification.h5 without authentication/pagination;
  • the integrity method checks a fixed MD5 before reusing a local file, but the download method does not perform a second post-download check. Verify the completed file independently before use.

MD5 here is an upstream integrity check, not a modern provenance guarantee. Record a SHA-256 and dataset license/source separately.

PathML 3.0.8 does not export TCGADataModule. Use a separately governed data acquisition process for TCGA/GDC and document its API/version/consent terms.

Raw lines 216 to 240
241## Download consent
243Before changing any `download` flag to `True`, tell the user:
245- exact host and expected dataset;
246- approximate transfer and expanded sizes (review-time HEAD responses for the
247 three PanNuke ZIPs total 2,077,087,715 bytes; processing/expansion needs much
248 more disk, with upstream docs estimating ~37.33 GB; the DeepFocus HDF5 is
249 10,027,826,144 bytes);
250- destination and available disk;
251- dataset license/terms and citation;
252- whether the environment logs outbound IP/account metadata; and
253- that no local slide or clinical data will be uploaded.
255Require explicit opt-in. Never place downloaded archives inside the repository.
257Review-time HEAD checks reached all four source URLs; DeepFocus redirected from
258`/record/` to `/records/`. No bodies were downloaded, so this establishes endpoint
259availability, not content integrity, license acceptance, or working extraction.
260The common download helper skips any existing file by name, including a partial
261one; independently verify size/checksum before treating such a file as complete.

Download consent

Before changing any download flag to True, tell the user:

  • exact host and expected dataset;
  • approximate transfer and expanded sizes (review-time HEAD responses for the three PanNuke ZIPs total 2,077,087,715 bytes; processing/expansion needs much more disk, with upstream docs estimating ~37.33 GB; the DeepFocus HDF5 is 10,027,826,144 bytes);
  • destination and available disk;
  • dataset license/terms and citation;
  • whether the environment logs outbound IP/account metadata; and
  • that no local slide or clinical data will be uploaded.

Require explicit opt-in. Never place downloaded archives inside the repository.

Review-time HEAD checks reached all four source URLs; DeepFocus redirected from /record/ to /records/. No bodies were downloaded, so this establishes endpoint availability, not content integrity, license acceptance, or working extraction. The common download helper skips any existing file by name, including a partial one; independently verify size/checksum before treating such a file as complete.

Raw lines 241 to 262
263## Graph datasets and unsafe `.pt` files
265`pathml.datasets.EntityDataset` assembles cell graphs, tissue graphs, and
266assignment matrices. Stable source opens `.pt` files using PyTorch object
267deserialization with unrestricted object loading.
269Consequences:
271- only load artifacts created by the trusted project;
272- never load an emailed/downloaded `.pt` file merely to inspect it;
273- verify SHA-256, producer, code revision, PyTorch/PyG versions, and schema;
274- prefer non-executable interchange formats for exchange;
275- run legacy artifacts in a disposable, network-disabled environment if review is
276 unavoidable.
278The bundled inference planner and graph validator never load `.pt`, `.pth`,
279`.ckpt`, pickle, ONNX, or other model/graph binaries.

Graph datasets and unsafe .pt files

pathml.datasets.EntityDataset assembles cell graphs, tissue graphs, and assignment matrices. Stable source opens .pt files using PyTorch object deserialization with unrestricted object loading.

Consequences:

  • only load artifacts created by the trusted project;
  • never load an emailed/downloaded .pt file merely to inspect it;
  • verify SHA-256, producer, code revision, PyTorch/PyG versions, and schema;
  • prefer non-executable interchange formats for exchange;
  • run legacy artifacts in a disposable, network-disabled environment if review is unavoidable.

The bundled inference planner and graph validator never load .pt, .pth, .ckpt, pickle, ONNX, or other model/graph binaries.

Raw lines 263 to 280
281## Split design and leakage
283Create the split column once, before tiling:
285```text
286patient → specimen/block → slide/rescan/serial section → region → tile
287```
289Everything below a patient follows the patient's split unless the scientific
290design explicitly requires a stricter grouping.
292Common leakage paths:
294- overlapping tiles from one slide in different splits;
295- serial sections or rescans assigned separately;
296- stain reference fitted on all slides;
297- QC threshold chosen after viewing test failures;
298- normalization/scaling fit before split;
299- graph neighborhoods crossing a split boundary;
300- duplicated public patches;
301- institution/scanner confounding;
302- selecting a checkpoint on the test metric.
304The manifest validator reports patient and slide leakage, but it cannot discover
305unknown biological relatedness. Document grouping assumptions.

Split design and leakage

Create the split column once, before tiling:

patient → specimen/block → slide/rescan/serial section → region → tile

Everything below a patient follows the patient's split unless the scientific design explicitly requires a stricter grouping.

Common leakage paths:

  • overlapping tiles from one slide in different splits;
  • serial sections or rescans assigned separately;
  • stain reference fitted on all slides;
  • QC threshold chosen after viewing test failures;
  • normalization/scaling fit before split;
  • graph neighborhoods crossing a split boundary;
  • duplicated public patches;
  • institution/scanner confounding;
  • selecting a checkpoint on the test metric.

The manifest validator reports patient and slide leakage, but it cannot discover unknown biological relatedness. Document grouping assumptions.

Raw lines 281 to 306
307## Provenance sidecar
309Recommended strict JSON fields:
311```json
313 "schema_version": "1.0",
314 "pathml_version": "3.0.8",
315 "source_sha256": "hex-digest",
316 "slide_id": "slide-001",
317 "patient_id": "patient-001",
318 "split": "train",
319 "backend": "openslide",
320 "level": 0,
321 "downsample": 1.0,
322 "mpp_x": null,
323 "mpp_y": null,
324 "tile_size_ij": [512, 512],
325 "tile_stride_ij": [512, 512],
326 "tile_pad": false,
327 "pipeline_id": "he-v1",
328 "code_revision": "project-commit",
329 "created_utc": "RFC3339 timestamp"
331```
333Do not put a direct identifier in these fields. Add:
335- ordered transform parameters and fitted stain arrays;
336- mask/label schema;
337- QC counts and exclusion reasons;
338- dependency lock hash;
339- model artifact SHA-256 and license;
340- random seed manifest;
341- coordinate units and conversion;
342- output hashes and software/hardware details.
344Use SHA-256 for provenance:
346```python
347import hashlib
348from pathlib import Path
350def sha256_file(path: Path, chunk_bytes: int = 1024 * 1024) -> str:
351 digest = hashlib.sha256()
352 with path.open("rb") as handle:
353 for chunk in iter(lambda: handle.read(chunk_bytes), b""):
354 digest.update(chunk)
355 return digest.hexdigest()
356```
358Hash only authorized local files and expect full-slide hashing to be I/O-heavy.
359Do not print paths containing identifiers.

Provenance sidecar

Recommended strict JSON fields:

{
  "schema_version": "1.0",
  "pathml_version": "3.0.8",
  "source_sha256": "hex-digest",
  "slide_id": "slide-001",
  "patient_id": "patient-001",
  "split": "train",
  "backend": "openslide",
  "level": 0,
  "downsample": 1.0,
  "mpp_x": null,
  "mpp_y": null,
  "tile_size_ij": [512, 512],
  "tile_stride_ij": [512, 512],
  "tile_pad": false,
  "pipeline_id": "he-v1",
  "code_revision": "project-commit",
  "created_utc": "RFC3339 timestamp"
}

Do not put a direct identifier in these fields. Add:

  • ordered transform parameters and fitted stain arrays;
  • mask/label schema;
  • QC counts and exclusion reasons;
  • dependency lock hash;
  • model artifact SHA-256 and license;
  • random seed manifest;
  • coordinate units and conversion;
  • output hashes and software/hardware details.

Use SHA-256 for provenance:

import hashlib
from pathlib import Path

def sha256_file(path: Path, chunk_bytes: int = 1024 * 1024) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for chunk in iter(lambda: handle.read(chunk_bytes), b""):
            digest.update(chunk)
    return digest.hexdigest()

Hash only authorized local files and expect full-slide hashing to be I/O-heavy. Do not print paths containing identifiers.

Raw lines 307 to 360
361## Storage and lifecycle checklist
363- Estimate raw, temporary, `.h5path`, mask, count, graph, and model storage.
364- Write to a same-filesystem temporary destination, validate, then atomically
365 rename where possible.
366- Do not overwrite source slides.
367- Use private permissions and encrypted storage/backups.
368- Verify output counts, shapes, dtypes, coordinates, and hashes.
369- Record partial failures and retry policy.
370- Test disaster recovery and retention/deletion.
371- Do not commit slide data, model binaries, linkage files, or manifests with PHI.

Storage and lifecycle checklist

  • Estimate raw, temporary, .h5path, mask, count, graph, and model storage.
  • Write to a same-filesystem temporary destination, validate, then atomically rename where possible.
  • Do not overwrite source slides.
  • Use private permissions and encrypted storage/backups.
  • Verify output counts, shapes, dtypes, coordinates, and hashes.
  • Record partial failures and retry policy.
  • Test disaster recovery and retention/deletion.
  • Do not commit slide data, model binaries, linkage files, or manifests with PHI.
Raw lines 361 to 372
373## Sources and further reading
375API baseline reviewed 2026-10-01 using the released wheel/tag; hosted docs may lag.
377- Stable h5path guide:
378 https://pathml.readthedocs.io/en/stable/h5path.html
379- Stable datasets guide:
380 https://pathml.readthedocs.io/en/stable/datasets.html
381- Stable datasets API:
382 https://pathml.readthedocs.io/en/stable/api_datasets_reference.html
383- Stable `TileDataset`/`EntityDataset` source:
384 https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/datasets.py
385- Stable PanNuke source:
386 https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/pannuke.py
387- Stable DeepFocus source:
388 https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/deepfocus.py
389- PanNuke extension paper: https://arxiv.org/abs/2003.10778
390- DeepFocus paper: https://doi.org/10.1371/journal.pone.0205387

Sources and further reading

API baseline reviewed 2026-10-01 using the released wheel/tag; hosted docs may lag.

  • Stable h5path guide: https://pathml.readthedocs.io/en/stable/h5path.html
  • Stable datasets guide: https://pathml.readthedocs.io/en/stable/datasets.html
  • Stable datasets API: https://pathml.readthedocs.io/en/stable/api_datasets_reference.html
  • Stable TileDataset/EntityDataset source: https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/datasets.py
  • Stable PanNuke source: https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/pannuke.py
  • Stable DeepFocus source: https://github.com/Dana-Farber-AIOS/pathml/blob/v3.0.8/pathml/datasets/deepfocus.py
  • PanNuke extension paper: https://arxiv.org/abs/2003.10778
  • DeepFocus paper: https://doi.org/10.1371/journal.pone.0205387
Raw lines 373 to 390