From bb556bfc2641f5af50d18e5092ee0e7693a97e98 Mon Sep 17 00:00:00 2001 From: mnoergaard Date: Fri, 25 Jul 2025 09:52:28 +0200 Subject: [PATCH 1/2] ENH: Update segmentation nodes and documentation --- docs/outputs.rst | 9 +++++++-- docs/workflows.rst | 4 ++-- petprep/workflows/pet/base.py | 9 ++++++--- petprep/workflows/pet/segmentation.py | 9 ++++++--- petprep/workflows/pet/tests/test_fit.py | 3 ++- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/docs/outputs.rst b/docs/outputs.rst index c2d66336..f55a1a56 100644 --- a/docs/outputs.rst +++ b/docs/outputs.rst @@ -336,7 +336,10 @@ from an anatomical segmentation. The resulting table has ``FrameTimesStart`` and sub-/ pet/ - sub-_[specifiers]_desc-preproc_timeseries.tsv + sub-_[specifiers]_seg-_desc-preproc_timeseries.tsv + +The ``desc-preproc`` entity indicates that the curves were derived from the +preprocessed PET series. If partial volume correction is applied, the filenames also include the ``_pvc-`` entity, indicating the algorithm used. @@ -347,10 +350,12 @@ table containing the mean uptake within that region:: sub-/ pet/ - sub-_[specifiers]_desc-_ref-_timeseries.tsv + sub-_[specifiers]_seg-_ref-_desc-preproc_timeseries.tsv The ``ref`` entity captures the reference region identifier provided via the :ref:`CLI options ` ``--ref-mask-name`` and ``--ref-mask-index``. +As with the primary TACs, ``desc-preproc`` reflects use of the preprocessed PET +series. When partial volume correction is performed, the ``_pvc-`` entity is also included. diff --git a/docs/workflows.rst b/docs/workflows.rst index f136f8c9..abb78e16 100644 --- a/docs/workflows.rst +++ b/docs/workflows.rst @@ -573,8 +573,8 @@ These workflows rely on pretrained segmentation models distributed with ``petprep.data.segmentation``. The first time a particular model is requested it will be automatically downloaded to the *PETPrep* cache directory, so ensure sufficient disk space is available. Each segmentation produces a labeled NIfTI -image ``desc-_dseg.nii.gz`` and a TSV table of region volumes -``desc-_morph.tsv`` saved under the ``anat/`` derivatives folder. +image ``seg-_dseg.nii.gz`` and a TSV table of region volumes +``seg-_morph.tsv`` saved under the ``anat/`` derivatives folder. For example, the raphe segmentation can be enabled with:: diff --git a/petprep/workflows/pet/base.py b/petprep/workflows/pet/base.py index 29506868..43267b2a 100644 --- a/petprep/workflows/pet/base.py +++ b/petprep/workflows/pet/base.py @@ -700,7 +700,9 @@ def init_pet_wf( DerivativesDataSink( base_directory=petprep_dir, suffix='timeseries', - desc=config.workflow.seg, + seg=config.workflow.seg, + desc='preproc', + allowed_entities=('seg',), TaskName=all_metadata[0].get('TaskName'), **prepare_timing_parameters(all_metadata[0]), ), @@ -732,9 +734,10 @@ def init_pet_wf( DerivativesDataSink( base_directory=petprep_dir, suffix='timeseries', - desc=config.workflow.seg, + seg=config.workflow.seg, + desc='preproc', ref=config.workflow.ref_mask_name, - allowed_entities=('ref',), + allowed_entities=('seg', 'ref'), TaskName=all_metadata[0].get('TaskName'), **prepare_timing_parameters(all_metadata[0]), ), diff --git a/petprep/workflows/pet/segmentation.py b/petprep/workflows/pet/segmentation.py index 7f4b29af..f540f3bf 100644 --- a/petprep/workflows/pet/segmentation.py +++ b/petprep/workflows/pet/segmentation.py @@ -167,7 +167,8 @@ def _build_nodes( nodes['ds_seg'] = pe.Node( DerivativesDataSink( base_directory=config.execution.petprep_dir, - desc=desc, + seg=seg, + allowed_entities=('seg',), suffix='dseg', extension='.nii.gz', compress=True, @@ -217,7 +218,8 @@ def _build_nodes( nodes['ds_dseg_tsv'] = pe.Node( DerivativesDataSink( base_directory=config.execution.petprep_dir, - desc=desc, + seg=seg, + allowed_entities=('seg',), suffix='dseg', extension='.tsv', datatype='anat', @@ -230,7 +232,8 @@ def _build_nodes( nodes['ds_morph_tsv'] = pe.Node( DerivativesDataSink( base_directory=config.execution.petprep_dir, - desc=desc, + seg=seg, + allowed_entities=('seg',), suffix='morph', extension='.tsv', datatype='anat', diff --git a/petprep/workflows/pet/tests/test_fit.py b/petprep/workflows/pet/tests/test_fit.py index 41f75b55..f614f43d 100644 --- a/petprep/workflows/pet/tests/test_fit.py +++ b/petprep/workflows/pet/tests/test_fit.py @@ -243,7 +243,8 @@ def test_refmask_report_connections(bids_root: Path, tmp_path: Path): assert 'ds_ref_tacs' in wf.list_node_names() ds_tacs = wf.get_node('ds_ref_tacs') assert ds_tacs.inputs.ref == 'cerebellum' - assert ds_tacs.inputs.desc == config.workflow.seg + assert ds_tacs.inputs.seg == config.workflow.seg + assert ds_tacs.inputs.desc == 'preproc' edge_tacs = wf._graph.get_edge_data(wf.get_node('pet_ref_tacs_wf'), ds_tacs) assert ('outputnode.timeseries', 'in_file') in edge_tacs['connect'] From e49b27e7d4e0fa0e7380685bc1576ae8785f6f8c Mon Sep 17 00:00:00 2001 From: mnoergaard Date: Fri, 25 Jul 2025 10:16:17 +0200 Subject: [PATCH 2/2] FIX: Update DerivativesDataSink for ds_ref_tacs --- petprep/workflows/pet/fit.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/petprep/workflows/pet/fit.py b/petprep/workflows/pet/fit.py index 89212bfd..2e2e2362 100644 --- a/petprep/workflows/pet/fit.py +++ b/petprep/workflows/pet/fit.py @@ -462,9 +462,10 @@ def init_pet_fit_wf( DerivativesDataSink( base_directory=config.execution.petprep_dir, suffix='timeseries', - desc=config.workflow.seg, + seg=config.workflow.seg, + desc='preproc', ref=config.workflow.ref_mask_name, - allowed_entities=('ref',), + allowed_entities=('seg', 'ref'), TaskName=metadata.get('TaskName'), **timing_parameters, ),