diff --git a/.github/workflows/conda-env-create.yml b/.github/workflows/conda-env-create.yml index d6809f0c0..67d488704 100644 --- a/.github/workflows/conda-env-create.yml +++ b/.github/workflows/conda-env-create.yml @@ -23,6 +23,14 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ["3.12", "3.13", "3.14"] + include: + - os: ubuntu-latest + conda-subdir: linux-64 + - os: windows-latest + conda-subdir: win-64 + - os: macos-latest + conda-subdir: osx-64 # Forces Rosetta emulation index on Apple Silicon + runs-on: ${{ matrix.os }} timeout-minutes: 30 @@ -37,6 +45,9 @@ jobs: # ✅ Install via micromamba - uses: mamba-org/setup-micromamba@v3 + env: + MAMBA_NO_CACHE: "true" # Forces libmamba to fetch completely fresh metadata + CONDA_SUBDIR: ${{ matrix.conda-subdir }} # Native for Win/Linux, Rosetta for Mac with: environment-name: tiatoolbox environment-file: requirements/requirements.conda.generated.yml diff --git a/pyproject.toml b/pyproject.toml index a3ec388a6..6cb0f5b3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "tqdm>=4.64.1", "transformers>=5.15.0", "umap-learn>=0.5.3", - "wsidicom>=0.18.0, <0.36.0", + "wsidicom>=0.36.1", "zarr>=3.2.1", ] diff --git a/tests/test_wsireader.py b/tests/test_wsireader.py index a8e2723ce..0f0ef8fd1 100644 --- a/tests/test_wsireader.py +++ b/tests/test_wsireader.py @@ -3323,8 +3323,12 @@ def test_read_dicom_with_metadata(remote_sample: Callable) -> None: assert wsi.info.objective_power == 40.0 wsi = DICOMWSIReader(wsi_path) + + # Trigger _optical_path_sequence access + _ = hasattr(wsi.wsi.levels.base_level.datasets[0], "_optical_path_sequence") + # Force delete attribute for objective power. - delattr(wsi.wsi.levels.base_level.datasets[0], "OpticalPathSequence") + delattr(wsi.wsi.levels.base_level.datasets[0], "_optical_path_sequence") wsi._info() # Assert objective power inferred from mpp. diff --git a/tiatoolbox/wsicore/wsireader/dicom.py b/tiatoolbox/wsicore/wsireader/dicom.py index 5f12ddf6f..abcaec390 100644 --- a/tiatoolbox/wsicore/wsireader/dicom.py +++ b/tiatoolbox/wsicore/wsireader/dicom.py @@ -61,7 +61,7 @@ def _info(self: DICOMWSIReader) -> WSIMeta: mpp = (mm_per_pixel.width * 1e3, mm_per_pixel.height * 1e3) objective_power = None - ops_seq = getattr(dataset, "OpticalPathSequence", None) + ops_seq = getattr(dataset, "_optical_path_sequence", None) if ops_seq: ops = ops_seq[0] if hasattr(ops, "ObjectiveLensPower"): @@ -73,6 +73,7 @@ def _info(self: DICOMWSIReader) -> WSIMeta: mpp=mpp, ) + vendor = getattr(dataset.base_metadata.equipment, "manufacturer", "Unknown") return WSIMeta( slide_dimensions=level_dimensions[0], level_dimensions=level_dimensions, @@ -81,7 +82,7 @@ def _info(self: DICOMWSIReader) -> WSIMeta: mpp=mpp, objective_power=objective_power, level_count=len(level_dimensions), - vendor=dataset.Manufacturer, + vendor=vendor, file_path=self.input_path, )