Skip to content

Commit 1534270

Browse files
committed
ENH: Add PET report support in fmriprep
1 parent bc19502 commit 1534270

File tree

5 files changed

+72
-2
lines changed

5 files changed

+72
-2
lines changed

fmriprep/cli/workflow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def build_workflow(config_file, retval):
8686
if config.execution.reports_only:
8787
build_log.log(25, 'Running --reports-only on participants %s', ', '.join(subject_list))
8888
session_list = (
89-
config.execution.bids_filters.get('bold', {}).get('session')
89+
config.execution.bids_filters.get('pet', config.execution.bids_filters.get('bold', {})).get('session')
9090
if config.execution.bids_filters
9191
else None
9292
)

fmriprep/data/reports-spec-pet.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package: fmriprep
2+
title: PET report for participant '{subject}', session '{session}' - fMRIPrep
3+
sections:
4+
- name: PET
5+
ordering: session
6+
reportlets:
7+
- bids: {datatype: figures, desc: summary, suffix: pet}
8+
- bids: {datatype: figures, desc: validation, suffix: pet}
9+
- bids: {datatype: figures, desc: carpetplot, suffix: pet}
10+
- bids: {datatype: figures, desc: confoundcorr, suffix: pet}
11+
- bids: {datatype: figures, suffix: pet}
12+
- name: About
13+
reportlets:
14+
- bids: {datatype: figures, desc: about, suffix: T1w}

fmriprep/data/reports-spec.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ sections:
106106
effects and can inform decisions about feature orthogonalization prior to
107107
confound regression.
108108
subtitle: Correlations among nuisance regressors
109+
- name: PET
110+
ordering: session
111+
reportlets:
112+
- bids: {datatype: figures, desc: summary, suffix: pet}
113+
- bids: {datatype: figures, desc: validation, suffix: pet}
114+
- bids: {datatype: figures, desc: carpetplot, suffix: pet}
115+
- bids: {datatype: figures, desc: confoundcorr, suffix: pet}
116+
- bids: {datatype: figures, suffix: pet}
109117
- name: About
110118
nested: true
111119
reportlets:

fmriprep/reports/core.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def generate_reports(
119119
# we separate the functional reports per session
120120
if session_list is None:
121121
all_filters = config.execution.bids_filters or {}
122-
filters = all_filters.get('bold', {})
122+
filters = all_filters.get("pet", all_filters.get("bold", {}))
123123
session_list = config.execution.layout.get_sessions(
124124
subject=subject_label, **filters
125125
)
@@ -145,4 +145,21 @@ def generate_reports(
145145
if report_error is not None:
146146
errors.append(report_error)
147147

148+
bootstrap_file = data.load('reports-spec-pet.yml')
149+
html_report = f'sub-{subject_label}_ses-{session_label}_pet.html'
150+
151+
report_error = run_reports(
152+
output_dir,
153+
subject_label,
154+
run_uuid,
155+
bootstrap_file=bootstrap_file,
156+
out_filename=html_report,
157+
reportlets_dir=reportlets_dir,
158+
errorname=f'report-{run_uuid}-{subject_label}-pet.err',
159+
subject=subject_label,
160+
session=session_label,
161+
)
162+
if report_error is not None:
163+
errors.append(report_error)
164+
148165
return errors

fmriprep/reports/tests/test_reports.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
'sub-001_ses-003_func.html',
2424
'sub-001_ses-004_func.html',
2525
'sub-001_ses-005_func.html',
26+
'sub-001_ses-001_pet.html',
27+
'sub-001_ses-003_pet.html',
28+
'sub-001_ses-004_pet.html',
29+
'sub-001_ses-005_pet.html',
2630
],
2731
),
2832
(4, ['sub-001.html']),
@@ -109,3 +113,30 @@ def mock_session_list(*args, **kwargs):
109113
assert 'One or more execution steps failed' in html_content, (
110114
f'The file {expected_files[0]} did not contain the reported error.'
111115
)
116+
117+
118+
def test_pet_report(tmp_path, monkeypatch):
119+
fake_uuid = 'fake_uuid'
120+
121+
pet_source = data_dir / 'work/reportlets/fmriprep'
122+
sub_dir = tmp_path / 'sub-01' / 'figures'
123+
sub_dir.mkdir(parents=True)
124+
125+
shutil.copy2(pet_source / 'sub-001/figures/sub-001_desc-about_T1w.html', sub_dir / 'sub-01_desc-about_T1w.html')
126+
shutil.copy2(pet_source / 'sub-001/figures/sub-001_ses-001_task-qct_dir-LR_part-mag_desc-summary_bold.html', sub_dir / 'sub-01_ses-baseline_desc-summary_pet.html')
127+
shutil.copy2(pet_source / 'sub-001/figures/sub-001_ses-001_task-qct_dir-LR_part-mag_desc-validation_bold.html', sub_dir / 'sub-01_ses-baseline_desc-validation_pet.html')
128+
shutil.copy2(pet_source / 'sub-001/figures/sub-001_ses-001_task-qct_dir-LR_part-mag_desc-carpetplot_bold.svg', sub_dir / 'sub-01_ses-baseline_desc-carpetplot_pet.svg')
129+
shutil.copy2(pet_source / 'sub-001/figures/sub-001_ses-001_task-qct_dir-LR_part-mag_desc-confoundcorr_bold.svg', sub_dir / 'sub-01_ses-baseline_desc-confoundcorr_pet.svg')
130+
shutil.copy2(pet_source / 'sub-01/func/sub-01_task-mixedgamblestask_run-01_bold_bbr.svg', sub_dir / 'sub-01_ses-baseline_pet.svg')
131+
132+
config.execution.aggr_ses_reports = 4
133+
config.execution.layout = BIDSLayout(data_dir / 'pet')
134+
monkeypatch.setattr(config.execution, 'bids_filters', {'pet': {'session': ['baseline']}})
135+
136+
failed_reports = generate_reports(['01'], tmp_path, fake_uuid)
137+
138+
assert not failed_reports
139+
html_file = tmp_path / 'sub-01.html'
140+
assert html_file.is_file()
141+
html_content = html_file.read_text()
142+
assert '<div id="PET"' in html_content

0 commit comments

Comments
 (0)