dcccpy 0.1.8__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcccpy
3
- Version: 0.1.8
3
+ Version: 0.2.0
4
4
  Summary: Python wrapper for the DCCCcore PET biomarker command-line tool
5
5
  Author: DCCCSlicer contributors
6
6
  License-Expression: CC-BY-NC-ND-4.0
@@ -17,17 +17,17 @@ Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  Requires-Dist: nibabel>=5
19
19
  Provides-Extra: linux-runtime
20
- Requires-Dist: dcccpy-linux-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "linux-runtime"
21
- Requires-Dist: dcccpy-linux-arm64-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "linux-runtime"
20
+ Requires-Dist: dcccpy-linux-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "linux-runtime"
21
+ Requires-Dist: dcccpy-linux-arm64-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "linux-runtime"
22
22
  Provides-Extra: windows-runtime
23
- Requires-Dist: dcccpy-windows-runtime==0.1.1; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "windows-runtime"
23
+ Requires-Dist: dcccpy-windows-runtime==0.1.2; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "windows-runtime"
24
24
  Provides-Extra: macos-runtime
25
- Requires-Dist: dcccpy-macos-runtime==0.1.1; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "macos-runtime"
25
+ Requires-Dist: dcccpy-macos-runtime==0.1.2; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "macos-runtime"
26
26
  Provides-Extra: runtime
27
- Requires-Dist: dcccpy-linux-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "runtime"
28
- Requires-Dist: dcccpy-linux-arm64-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "runtime"
29
- Requires-Dist: dcccpy-windows-runtime==0.1.1; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "runtime"
30
- Requires-Dist: dcccpy-macos-runtime==0.1.1; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "runtime"
27
+ Requires-Dist: dcccpy-linux-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "runtime"
28
+ Requires-Dist: dcccpy-linux-arm64-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "runtime"
29
+ Requires-Dist: dcccpy-windows-runtime==0.1.2; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "runtime"
30
+ Requires-Dist: dcccpy-macos-runtime==0.1.2; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "runtime"
31
31
 
32
32
  # dcccpy
33
33
 
@@ -109,6 +109,7 @@ Common helpers mirror `DCCCcore` subcommands:
109
109
  dcccpy.centiloid("amyloid.nii", suvr=True)
110
110
  dcccpy.centaurz("tau.nii", report_detailed_regions=True)
111
111
  dcccpy.fillstates("fdg.nii", tracer="fdg")
112
+ dcccpy.adni_pet_core("fdg.nii", tracer="fdg")
112
113
  dcccpy.normalize("pet.nii", iterative=True)
113
114
  dcccpy.pet_motion_correct(
114
115
  "dynamic_pet.nii.gz",
@@ -134,8 +135,17 @@ Each helper returns `DCCCResult` with:
134
135
  ```bash
135
136
  dcccpy --help
136
137
  dcccpy centiloid --input amyloid_pet.nii --output result.nii
138
+ dcccpy adni-pet-core --input fdg.nii --output fdg_adni.nii --tracer fdg
137
139
  ```
138
140
 
141
+ `adni_pet_core` deliberately has no default tracer. Use `abeta`, `tau`, or
142
+ `fdg`; FDG selects ADNI's iterative masked global-mean normalization, while
143
+ Aβ and tau retain cerebellar gray normalization.
144
+
145
+ Downloaded ADNI preprocessed FDG DICOMs can differ slightly from the exact
146
+ published iteration. See the repository's
147
+ [ADNI FDG compatibility note](../../docs/adni-fdg-preprocessing-validation.md).
148
+
139
149
  ## Runtime lookup
140
150
 
141
151
  At runtime, `dcccpy` looks for `DCCCcore` in this order:
@@ -179,7 +189,7 @@ the calculation again.
179
189
  Release wheels should vendor the matching `DCCCcore` runtime tree before build:
180
190
 
181
191
  ```bash
182
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-x64
192
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-x64
183
193
  python -m build --wheel
184
194
  ```
185
195
 
@@ -187,7 +197,7 @@ The Linux ARM64 runtime package uses the corresponding release asset:
187
197
 
188
198
  ```bash
189
199
  cd python/dcccpy-linux-arm64-runtime
190
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-arm64
200
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-arm64
191
201
  python -m build --wheel
192
202
  ```
193
203
 
@@ -205,7 +215,7 @@ The preferred distribution layout is:
205
215
 
206
216
  ## Packaging note
207
217
 
208
- The runtime wheels use a PyPI-size profile for DCCCcore version 4.3.0. They omit the
218
+ The runtime wheels use a PyPI-size profile for DCCCcore version 4.4.0. They omit the
209
219
  `fast_and_acc` registration model/config and the ADAD decoupler ONNX ensemble,
210
220
  while keeping the default spatial normalization model and assets needed by
211
221
  common Centiloid/CenTauR/CenTauRz workflows.
@@ -78,6 +78,7 @@ Common helpers mirror `DCCCcore` subcommands:
78
78
  dcccpy.centiloid("amyloid.nii", suvr=True)
79
79
  dcccpy.centaurz("tau.nii", report_detailed_regions=True)
80
80
  dcccpy.fillstates("fdg.nii", tracer="fdg")
81
+ dcccpy.adni_pet_core("fdg.nii", tracer="fdg")
81
82
  dcccpy.normalize("pet.nii", iterative=True)
82
83
  dcccpy.pet_motion_correct(
83
84
  "dynamic_pet.nii.gz",
@@ -103,8 +104,17 @@ Each helper returns `DCCCResult` with:
103
104
  ```bash
104
105
  dcccpy --help
105
106
  dcccpy centiloid --input amyloid_pet.nii --output result.nii
107
+ dcccpy adni-pet-core --input fdg.nii --output fdg_adni.nii --tracer fdg
106
108
  ```
107
109
 
110
+ `adni_pet_core` deliberately has no default tracer. Use `abeta`, `tau`, or
111
+ `fdg`; FDG selects ADNI's iterative masked global-mean normalization, while
112
+ Aβ and tau retain cerebellar gray normalization.
113
+
114
+ Downloaded ADNI preprocessed FDG DICOMs can differ slightly from the exact
115
+ published iteration. See the repository's
116
+ [ADNI FDG compatibility note](../../docs/adni-fdg-preprocessing-validation.md).
117
+
108
118
  ## Runtime lookup
109
119
 
110
120
  At runtime, `dcccpy` looks for `DCCCcore` in this order:
@@ -148,7 +158,7 @@ the calculation again.
148
158
  Release wheels should vendor the matching `DCCCcore` runtime tree before build:
149
159
 
150
160
  ```bash
151
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-x64
161
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-x64
152
162
  python -m build --wheel
153
163
  ```
154
164
 
@@ -156,7 +166,7 @@ The Linux ARM64 runtime package uses the corresponding release asset:
156
166
 
157
167
  ```bash
158
168
  cd python/dcccpy-linux-arm64-runtime
159
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-arm64
169
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-arm64
160
170
  python -m build --wheel
161
171
  ```
162
172
 
@@ -174,7 +184,7 @@ The preferred distribution layout is:
174
184
 
175
185
  ## Packaging note
176
186
 
177
- The runtime wheels use a PyPI-size profile for DCCCcore version 4.3.0. They omit the
187
+ The runtime wheels use a PyPI-size profile for DCCCcore version 4.4.0. They omit the
178
188
  `fast_and_acc` registration model/config and the ADAD decoupler ONNX ensemble,
179
189
  while keeping the default spatial normalization model and assets needed by
180
190
  common Centiloid/CenTauR/CenTauRz workflows.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dcccpy"
7
- version = "0.1.8"
7
+ version = "0.2.0"
8
8
  description = "Python wrapper for the DCCCcore PET biomarker command-line tool"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -31,16 +31,16 @@ Issues = "https://github.com/tctco/DCCCSlicer/issues"
31
31
 
32
32
  [project.optional-dependencies]
33
33
  linux-runtime = [
34
- "dcccpy-linux-runtime==0.1.1; sys_platform == 'linux' and platform_machine == 'x86_64'",
35
- "dcccpy-linux-arm64-runtime==0.1.1; sys_platform == 'linux' and platform_machine == 'aarch64'",
34
+ "dcccpy-linux-runtime==0.1.2; sys_platform == 'linux' and platform_machine == 'x86_64'",
35
+ "dcccpy-linux-arm64-runtime==0.1.2; sys_platform == 'linux' and platform_machine == 'aarch64'",
36
36
  ]
37
- windows-runtime = ["dcccpy-windows-runtime==0.1.1; sys_platform == 'win32' and platform_machine == 'AMD64'"]
38
- macos-runtime = ["dcccpy-macos-runtime==0.1.1; sys_platform == 'darwin' and platform_machine == 'arm64'"]
37
+ windows-runtime = ["dcccpy-windows-runtime==0.1.2; sys_platform == 'win32' and platform_machine == 'AMD64'"]
38
+ macos-runtime = ["dcccpy-macos-runtime==0.1.2; sys_platform == 'darwin' and platform_machine == 'arm64'"]
39
39
  runtime = [
40
- "dcccpy-linux-runtime==0.1.1; sys_platform == 'linux' and platform_machine == 'x86_64'",
41
- "dcccpy-linux-arm64-runtime==0.1.1; sys_platform == 'linux' and platform_machine == 'aarch64'",
42
- "dcccpy-windows-runtime==0.1.1; sys_platform == 'win32' and platform_machine == 'AMD64'",
43
- "dcccpy-macos-runtime==0.1.1; sys_platform == 'darwin' and platform_machine == 'arm64'",
40
+ "dcccpy-linux-runtime==0.1.2; sys_platform == 'linux' and platform_machine == 'x86_64'",
41
+ "dcccpy-linux-arm64-runtime==0.1.2; sys_platform == 'linux' and platform_machine == 'aarch64'",
42
+ "dcccpy-windows-runtime==0.1.2; sys_platform == 'win32' and platform_machine == 'AMD64'",
43
+ "dcccpy-macos-runtime==0.1.2; sys_platform == 'darwin' and platform_machine == 'arm64'",
44
44
  ]
45
45
 
46
46
  [project.scripts]
@@ -409,9 +409,15 @@ def normalize(
409
409
  def adni_pet_core(
410
410
  input: object,
411
411
  output: str | os.PathLike[str] | None = None,
412
+ *,
413
+ tracer: str,
412
414
  **kwargs: object,
413
415
  ) -> DCCCResult:
414
- return _spatial_command("adni-pet-core", input, output, **kwargs)
416
+ """Run tracer-specific ADNI PET Core preprocessing."""
417
+
418
+ extra_args = list(kwargs.pop("extra_args", ()))
419
+ extra_args.extend(["--tracer", tracer])
420
+ return _spatial_command("adni-pet-core", input, output, extra_args=extra_args, **kwargs)
415
421
 
416
422
 
417
423
  def rigid(
@@ -12,7 +12,7 @@ from pathlib import Path
12
12
  from typing import Iterable
13
13
 
14
14
 
15
- DCCCCORE_VERSION = "4.3.0"
15
+ DCCCCORE_VERSION = "4.4.0"
16
16
  RELEASE_REPO = "tctco/DCCCSlicer"
17
17
 
18
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcccpy
3
- Version: 0.1.8
3
+ Version: 0.2.0
4
4
  Summary: Python wrapper for the DCCCcore PET biomarker command-line tool
5
5
  Author: DCCCSlicer contributors
6
6
  License-Expression: CC-BY-NC-ND-4.0
@@ -17,17 +17,17 @@ Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  Requires-Dist: nibabel>=5
19
19
  Provides-Extra: linux-runtime
20
- Requires-Dist: dcccpy-linux-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "linux-runtime"
21
- Requires-Dist: dcccpy-linux-arm64-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "linux-runtime"
20
+ Requires-Dist: dcccpy-linux-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "linux-runtime"
21
+ Requires-Dist: dcccpy-linux-arm64-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "linux-runtime"
22
22
  Provides-Extra: windows-runtime
23
- Requires-Dist: dcccpy-windows-runtime==0.1.1; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "windows-runtime"
23
+ Requires-Dist: dcccpy-windows-runtime==0.1.2; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "windows-runtime"
24
24
  Provides-Extra: macos-runtime
25
- Requires-Dist: dcccpy-macos-runtime==0.1.1; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "macos-runtime"
25
+ Requires-Dist: dcccpy-macos-runtime==0.1.2; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "macos-runtime"
26
26
  Provides-Extra: runtime
27
- Requires-Dist: dcccpy-linux-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "runtime"
28
- Requires-Dist: dcccpy-linux-arm64-runtime==0.1.1; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "runtime"
29
- Requires-Dist: dcccpy-windows-runtime==0.1.1; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "runtime"
30
- Requires-Dist: dcccpy-macos-runtime==0.1.1; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "runtime"
27
+ Requires-Dist: dcccpy-linux-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "x86_64") and extra == "runtime"
28
+ Requires-Dist: dcccpy-linux-arm64-runtime==0.1.2; (sys_platform == "linux" and platform_machine == "aarch64") and extra == "runtime"
29
+ Requires-Dist: dcccpy-windows-runtime==0.1.2; (sys_platform == "win32" and platform_machine == "AMD64") and extra == "runtime"
30
+ Requires-Dist: dcccpy-macos-runtime==0.1.2; (sys_platform == "darwin" and platform_machine == "arm64") and extra == "runtime"
31
31
 
32
32
  # dcccpy
33
33
 
@@ -109,6 +109,7 @@ Common helpers mirror `DCCCcore` subcommands:
109
109
  dcccpy.centiloid("amyloid.nii", suvr=True)
110
110
  dcccpy.centaurz("tau.nii", report_detailed_regions=True)
111
111
  dcccpy.fillstates("fdg.nii", tracer="fdg")
112
+ dcccpy.adni_pet_core("fdg.nii", tracer="fdg")
112
113
  dcccpy.normalize("pet.nii", iterative=True)
113
114
  dcccpy.pet_motion_correct(
114
115
  "dynamic_pet.nii.gz",
@@ -134,8 +135,17 @@ Each helper returns `DCCCResult` with:
134
135
  ```bash
135
136
  dcccpy --help
136
137
  dcccpy centiloid --input amyloid_pet.nii --output result.nii
138
+ dcccpy adni-pet-core --input fdg.nii --output fdg_adni.nii --tracer fdg
137
139
  ```
138
140
 
141
+ `adni_pet_core` deliberately has no default tracer. Use `abeta`, `tau`, or
142
+ `fdg`; FDG selects ADNI's iterative masked global-mean normalization, while
143
+ Aβ and tau retain cerebellar gray normalization.
144
+
145
+ Downloaded ADNI preprocessed FDG DICOMs can differ slightly from the exact
146
+ published iteration. See the repository's
147
+ [ADNI FDG compatibility note](../../docs/adni-fdg-preprocessing-validation.md).
148
+
139
149
  ## Runtime lookup
140
150
 
141
151
  At runtime, `dcccpy` looks for `DCCCcore` in this order:
@@ -179,7 +189,7 @@ the calculation again.
179
189
  Release wheels should vendor the matching `DCCCcore` runtime tree before build:
180
190
 
181
191
  ```bash
182
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-x64
192
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-x64
183
193
  python -m build --wheel
184
194
  ```
185
195
 
@@ -187,7 +197,7 @@ The Linux ARM64 runtime package uses the corresponding release asset:
187
197
 
188
198
  ```bash
189
199
  cd python/dcccpy-linux-arm64-runtime
190
- python scripts/vendor_dccccore.py --version 4.3.0 --release-platform ubuntu-latest-arm64
200
+ python scripts/vendor_dccccore.py --version 4.4.0 --release-platform ubuntu-latest-arm64
191
201
  python -m build --wheel
192
202
  ```
193
203
 
@@ -205,7 +215,7 @@ The preferred distribution layout is:
205
215
 
206
216
  ## Packaging note
207
217
 
208
- The runtime wheels use a PyPI-size profile for DCCCcore version 4.3.0. They omit the
218
+ The runtime wheels use a PyPI-size profile for DCCCcore version 4.4.0. They omit the
209
219
  `fast_and_acc` registration model/config and the ADAD decoupler ONNX ensemble,
210
220
  while keeping the default spatial normalization model and assets needed by
211
221
  common Centiloid/CenTauR/CenTauRz workflows.
@@ -3,31 +3,31 @@ nibabel>=5
3
3
  [linux-runtime]
4
4
 
5
5
  [linux-runtime:sys_platform == "linux" and platform_machine == "aarch64"]
6
- dcccpy-linux-arm64-runtime==0.1.1
6
+ dcccpy-linux-arm64-runtime==0.1.2
7
7
 
8
8
  [linux-runtime:sys_platform == "linux" and platform_machine == "x86_64"]
9
- dcccpy-linux-runtime==0.1.1
9
+ dcccpy-linux-runtime==0.1.2
10
10
 
11
11
  [macos-runtime]
12
12
 
13
13
  [macos-runtime:sys_platform == "darwin" and platform_machine == "arm64"]
14
- dcccpy-macos-runtime==0.1.1
14
+ dcccpy-macos-runtime==0.1.2
15
15
 
16
16
  [runtime]
17
17
 
18
18
  [runtime:sys_platform == "darwin" and platform_machine == "arm64"]
19
- dcccpy-macos-runtime==0.1.1
19
+ dcccpy-macos-runtime==0.1.2
20
20
 
21
21
  [runtime:sys_platform == "linux" and platform_machine == "aarch64"]
22
- dcccpy-linux-arm64-runtime==0.1.1
22
+ dcccpy-linux-arm64-runtime==0.1.2
23
23
 
24
24
  [runtime:sys_platform == "linux" and platform_machine == "x86_64"]
25
- dcccpy-linux-runtime==0.1.1
25
+ dcccpy-linux-runtime==0.1.2
26
26
 
27
27
  [runtime:sys_platform == "win32" and platform_machine == "AMD64"]
28
- dcccpy-windows-runtime==0.1.1
28
+ dcccpy-windows-runtime==0.1.2
29
29
 
30
30
  [windows-runtime]
31
31
 
32
32
  [windows-runtime:sys_platform == "win32" and platform_machine == "AMD64"]
33
- dcccpy-windows-runtime==0.1.1
33
+ dcccpy-windows-runtime==0.1.2
@@ -142,7 +142,7 @@ def test_dccccore_path_can_disable_auto_download(tmp_path: Path, monkeypatch: py
142
142
 
143
143
 
144
144
  def test_dccccore_path_auto_downloads_to_cache(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
145
- asset_root = tmp_path / "asset" / "DCCCcore-4.3.0-ubuntu-latest-x64"
145
+ asset_root = tmp_path / "asset" / "DCCCcore-4.4.0-ubuntu-latest-x64"
146
146
  asset_root.mkdir(parents=True)
147
147
  exe = asset_root / "DCCCcore"
148
148
  exe.write_text("#!/usr/bin/env sh\nprintf 'fake dccccore\\n'\n")
@@ -150,7 +150,7 @@ def test_dccccore_path_auto_downloads_to_cache(tmp_path: Path, monkeypatch: pyte
150
150
 
151
151
  archive = tmp_path / "DCCCcore.zip"
152
152
  with zipfile.ZipFile(archive, "w") as zf:
153
- zf.write(exe, "DCCCcore-4.3.0-ubuntu-latest-x64/DCCCcore")
153
+ zf.write(exe, "DCCCcore-4.4.0-ubuntu-latest-x64/DCCCcore")
154
154
 
155
155
  monkeypatch.delenv("DCCCPY_DCCCCORE", raising=False)
156
156
  monkeypatch.setenv("DCCCPY_AUTO_DOWNLOAD", "1")
@@ -186,10 +186,10 @@ def test_linux_arm64_release_platform() -> None:
186
186
  assert release_platform("linux-arm64") == "ubuntu-latest-arm64"
187
187
 
188
188
 
189
- def test_default_release_targets_dccccore_430() -> None:
190
- assert DCCCCORE_VERSION == "4.3.0"
189
+ def test_default_release_targets_dccccore_440() -> None:
190
+ assert DCCCCORE_VERSION == "4.4.0"
191
191
  assert release_url(platform_name="ubuntu-latest-x64").endswith(
192
- "/releases/download/v4.3.0/DCCCcore-4.3.0-ubuntu-latest-x64.zip"
192
+ "/releases/download/v4.4.0/DCCCcore-4.4.0-ubuntu-latest-x64.zip"
193
193
  )
194
194
 
195
195
 
@@ -262,6 +262,37 @@ def test_pet_motion_correct_forwards_optional_outputs(
262
262
  ]
263
263
 
264
264
 
265
+ def test_adni_pet_core_requires_and_forwards_tracer(
266
+ tmp_path: Path,
267
+ monkeypatch: pytest.MonkeyPatch,
268
+ ) -> None:
269
+ fake_args = tmp_path / "args.txt"
270
+ fake_exe = make_fake_dccccore(tmp_path)
271
+ input_path = tmp_path / "pet.nii"
272
+ output_path = tmp_path / "adni.nii"
273
+ input_path.write_text("fake PET")
274
+ monkeypatch.setenv("DCCCPY_DCCCCORE", str(fake_exe))
275
+ monkeypatch.setenv("DCCCPY_FAKE_ARGS", str(fake_args))
276
+
277
+ result = dcccpy.adni_pet_core(input_path, output_path, tracer="fdg")
278
+
279
+ assert result.returncode == 0
280
+ assert fake_args.read_text().splitlines() == [
281
+ "adni-pet-core",
282
+ "--input",
283
+ str(input_path),
284
+ "--output",
285
+ str(output_path),
286
+ "--tracer",
287
+ "fdg",
288
+ ]
289
+
290
+
291
+ def test_adni_pet_core_python_api_has_no_default_tracer() -> None:
292
+ with pytest.raises(TypeError, match="tracer"):
293
+ dcccpy.adni_pet_core("pet.nii")
294
+
295
+
265
296
  def test_run_adds_macos_security_hint_for_blocked_runtime(
266
297
  tmp_path: Path,
267
298
  monkeypatch: pytest.MonkeyPatch,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes