diff --git a/petprep/data/nipreps.json b/petprep/data/nipreps.json index b3684ec8..78575463 100644 --- a/petprep/data/nipreps.json +++ b/petprep/data/nipreps.json @@ -153,15 +153,21 @@ "name": "cohort", "pattern": "[_/\\\\]+cohort-0*(\\d+)", "dtype": "int" + }, + { + "name": "seg", + "pattern": "[_/\\\\]+seg-([a-zA-Z0-9+]+)" } ], "default_path_patterns": [ - "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_seg-{seg}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_hemi-{hemi}]_from-{from}_to-{to}_mode-{mode|image}_{suffix|xfm}{extension<.txt|.h5>}", "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}]_hemi-{hemi}[_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.surf.gii|.shape.gii>}", "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.dscalar.nii|.json>}", - "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_desc-{desc}_{suffix|mask}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_label-{label}]_desc-{desc}_{suffix|mask}{extension<.nii|.nii.gz|.json>|.nii.gz}", "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_label-{label}[_desc-{desc}]_{suffix|probseg}{extension<.nii|.nii.gz|.json>|.nii.gz}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_seg-{seg}][_desc-{desc}]_{suffix}{extension<.tsv|.json>|.tsv}", + "sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_seg-{seg}][_label-{label}][_desc-{desc}]_{suffix}{extension<.tsv|.json>|.tsv}", "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.nii|.nii.gz|.json>|.nii.gz}", "sub-{subject}[/ses-{session}]/{datatype|func}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_hemi-{hemi}]_from-{from}_to-{to}_mode-{mode|image}[_desc-{desc}]_{suffix|xfm}{extension<.txt|.h5>}", @@ -187,11 +193,11 @@ "sub-{subject}[/ses-{session}]/{datatype|pet}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_trc-{tracer}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_den-{density}][_desc-{desc}]_{suffix}{extension<.dscalar.nii|.json>}", "sub-{subject}[/ses-{session}]/{datatype|pet}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_trc-{tracer}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_desc-{desc}_{suffix|mask}{extension<.nii|.nii.gz|.json>|.nii.gz}", "sub-{subject}[/ses-{session}]/{datatype|pet}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_trc-{tracer}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}]_label-{label}[_desc-{desc}]_{suffix|probseg}{extension<.nii|.nii.gz|.json>|.nii.gz}", - "sub-{subject}[/ses-{session}]/{datatype|pet}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_trc-{tracer}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_part-{part}][_space-{space}][_atlas-{atlas}][_cohort-{cohort}][_desc-{desc}]_{suffix|timeseries}{extension<.json|.tsv>|.tsv}", - "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}[/ses-{session}]/{datatype|pet}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_trc-{tracer}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_part-{part}][_space-{space}][_atlas-{atlas}][_cohort-{cohort}][_seg-{seg}][_label-{label}][_desc-{desc}]_{suffix|timeseries}{extension<.json|.tsv>|.tsv}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_label-{label}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_fmapid-{fmapid}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", - "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", - "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", - "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_trc-{tracer}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg|.png>|.html}" + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_label-{label}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_label-{label}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", + "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_trc-{tracer}][_rec-{reconstruction}][_run-{run}][_space-{space}][_cohort-{cohort}][_label-{label}][_desc-{desc}]_{suffix}{extension<.html|.svg|.png>|.html}" ] } diff --git a/petprep/interfaces/__init__.py b/petprep/interfaces/__init__.py index 88f5d313..b8274bed 100644 --- a/petprep/interfaces/__init__.py +++ b/petprep/interfaces/__init__.py @@ -1,7 +1,11 @@ # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- # vi: set ft=python sts=4 ts=4 sw=4 et: +from json import loads + from niworkflows.interfaces.bids import DerivativesDataSink as _DDSink +from petprep.utils.bids import load_data + from .cifti import GeneratePetCifti from .motion import MotionPlot from .reports import AtlasROIsReport @@ -10,6 +14,10 @@ class DerivativesDataSink(_DDSink): out_path_base = '' + _petprep_spec = loads(load_data.readable('nipreps.json').read_text()) + _config_entities = frozenset({e['name'] for e in _petprep_spec['entities']}) + _config_entities_dict = _petprep_spec['entities'] + _file_patterns = tuple(_petprep_spec['default_path_patterns']) __all__ = ( diff --git a/petprep/workflows/pet/outputs.py b/petprep/workflows/pet/outputs.py index 9f00ada1..220de259 100644 --- a/petprep/workflows/pet/outputs.py +++ b/petprep/workflows/pet/outputs.py @@ -220,7 +220,6 @@ def init_func_fit_reports_wf( desc='ref', label=ref_name, datatype='figures', - allowed_entities=('label',), ), name='ds_report_refmask', run_without_submitting=True, @@ -381,7 +380,6 @@ def init_func_fit_reports_wf( label=ref_name, suffix='pet', datatype='figures', - allowed_entities=('label',), ), name='ds_pet_t1_refmask_report', ) @@ -592,7 +590,6 @@ def init_ds_refmask_wf( suffix='mask', desc='ref', label=ref_name, - allowed_entities=('label',), compress=True, ), name='ds_refmask', @@ -1091,7 +1088,6 @@ def init_refmask_report_wf( desc='ref', label=ref_name, datatype='figures', - allowed_entities=('label',), suffix='pet', ), name='ds_report_refmask', diff --git a/petprep/workflows/pet/reference_mask.py b/petprep/workflows/pet/reference_mask.py index 5e68b27a..071bc8bc 100644 --- a/petprep/workflows/pet/reference_mask.py +++ b/petprep/workflows/pet/reference_mask.py @@ -74,7 +74,6 @@ def init_pet_refmask_wf( base_directory=config.execution.petprep_dir, label=ref_mask_name, desc='ref', - allowed_entities=('label',), suffix='morph', extension='.tsv', datatype='anat', diff --git a/petprep/workflows/pet/segmentation.py b/petprep/workflows/pet/segmentation.py index b8a18c6e..77887c53 100644 --- a/petprep/workflows/pet/segmentation.py +++ b/petprep/workflows/pet/segmentation.py @@ -182,7 +182,6 @@ def _build_nodes( DerivativesDataSink( base_directory=config.execution.petprep_dir, seg=seg, - allowed_entities=('seg',), suffix='dseg', extension='.nii.gz', compress=True, @@ -233,7 +232,6 @@ def _build_nodes( DerivativesDataSink( base_directory=config.execution.petprep_dir, seg=seg, - allowed_entities=('seg',), suffix='dseg', extension='.tsv', datatype='anat', @@ -247,7 +245,6 @@ def _build_nodes( DerivativesDataSink( base_directory=config.execution.petprep_dir, 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 f474f447..3f8e42eb 100644 --- a/petprep/workflows/pet/tests/test_fit.py +++ b/petprep/workflows/pet/tests/test_fit.py @@ -359,8 +359,9 @@ def test_refmask_report_connections(bids_root: Path, tmp_path: Path, pvc_method) ds_tacs = wf.get_node('ds_ref_tacs') assert ds_tacs.inputs.label == 'cerebellum' assert 'label' in ds_tacs.interface._allowed_entities - assert 'seg' not in ds_tacs.interface._allowed_entities - assert not hasattr(ds_tacs.inputs, 'seg') + assert 'seg' in ds_tacs.interface._config_entities + assert hasattr(ds_tacs.inputs, 'seg') + assert ds_tacs.inputs.seg is Undefined 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']