Skip to content

Commit 7c8f110

Browse files
authored
Merge pull request #328 from mgxd/new/reports
ENH: Use nireports report generation
2 parents f6ad255 + 07eece0 commit 7c8f110

File tree

6 files changed

+29
-84
lines changed

6 files changed

+29
-84
lines changed

nibabies/cli/run.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,6 @@ def main():
139139
config.execution.unique_labels,
140140
config.execution.nibabies_dir,
141141
config.execution.run_uuid,
142-
config=pkgrf("nibabies", "data/reports-spec.yml"),
143-
packagename="nibabies",
144142
)
145143
write_derivative_description(config.execution.bids_dir, config.execution.nibabies_dir)
146144
write_bidsignore(config.execution.nibabies_dir)

nibabies/cli/workflow.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ def build_workflow(config_file):
5555
config.execution.unique_labels,
5656
nibabies_dir,
5757
config.execution.run_uuid,
58-
config=pkgrf("nibabies", "data/reports-spec.yml"),
59-
packagename="nibabies",
6058
)
6159
return retval
6260

nibabies/data/reports-spec.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,17 @@ sections:
2323
static: false
2424
subtitle: Spatial normalization of the anatomical T1w reference
2525
- bids: {datatype: figures, desc: reconall, suffix: T1w}
26+
caption: Surfaces (white and pial) reconstructed with FreeSurfer (<code>recon-all</code>)
27+
overlaid on the participant's T1w template.
28+
subtitle: Surface reconstruction
29+
- bids: {datatype: figures, desc: infantfs, suffix: T1w}
2630
caption: Surfaces (white and pial) reconstructed with FreeSurfer (<code>infant_recon_all</code>)
2731
overlaid on the participant's T1w template.
2832
subtitle: Surface reconstruction
33+
- bids: {datatype: figures, desc: mcribs, suffix: T2w}
34+
caption: Surfaces (white and pial) reconstructed with M-CRIB-S (<code>MCRIBReconAll</code>)
35+
overlaid on the participant's T2w template.
36+
subtitle: Surface reconstruction
2937

3038
- name: <em>B<sub>0</sub></em> field mapping
3139
ordering: session,acquisition,run,fmapid

nibabies/reports/core.py

Lines changed: 11 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,16 @@
1-
from itertools import product
21
from pathlib import Path
32

4-
from niworkflows.reports.core import Report as _Report
5-
from pkg_resources import resource_filename as pkgrf
3+
from nireports.assembler.report import Report
64

7-
8-
class Report(_Report):
9-
# niworkflows patch to preserve `out_filename` even if subject_id is present
10-
def __init__(
11-
self,
12-
out_dir,
13-
run_uuid,
14-
config=None,
15-
out_filename=None,
16-
packagename=None,
17-
reportlets_dir=None,
18-
subject_id=None,
19-
):
20-
self.root = Path(reportlets_dir or out_dir)
21-
22-
# Initialize structuring elements
23-
self.sections = []
24-
self.errors = []
25-
self.out_dir = Path(out_dir)
26-
self.run_uuid = run_uuid
27-
self.packagename = packagename
28-
self.subject_id = subject_id
29-
if subject_id is not None:
30-
self.subject_id = subject_id[4:] if subject_id.startswith("sub-") else subject_id
31-
# ensure set output filename is preserved
32-
if not out_filename:
33-
out_filename = f"sub-{self.subject_id}.html"
34-
35-
self.out_filename = out_filename or "report.html"
36-
37-
# Default template from niworkflows
38-
self.template_path = Path(pkgrf("niworkflows", "reports/report.tpl"))
39-
self._load_config(Path(config or pkgrf("niworkflows", "reports/default.yml")))
40-
assert self.template_path.exists()
41-
42-
# TODO: Upstream ``Report._load_config`` to niworkflows
43-
def _load_config(self, config):
44-
from yaml import safe_load as load
45-
46-
settings = load(config.read_text())
47-
self.packagename = self.packagename or settings.get("package", None)
48-
49-
# Removed from here: Appending self.packagename to self.root and self.out_dir
50-
# In this version, pass reportlets_dir and out_dir with nibabies in the path.
51-
52-
if self.subject_id is not None:
53-
self.root = self.root / "sub-{}".format(self.subject_id)
54-
55-
if "template_path" in settings:
56-
self.template_path = config.parent / settings["template_path"]
57-
58-
self.index(settings["sections"])
59-
60-
61-
#
62-
# The following are the interface used directly by NiBabies
63-
#
5+
from nibabies.data import load_resource
646

657

668
def run_reports(
679
out_dir,
68-
subject_label,
10+
subject,
6911
run_uuid,
70-
config=None,
71-
out_filename='report.html',
12+
session=None,
13+
out_filename=None,
7214
reportlets_dir=None,
7315
packagename=None,
7416
):
@@ -78,10 +20,9 @@ def run_reports(
7820
return Report(
7921
out_dir,
8022
run_uuid,
81-
config=config,
82-
out_filename=out_filename,
83-
subject_id=subject_label,
84-
packagename=packagename,
23+
subject=subject,
24+
session=session,
25+
bootstrap_file=load_resource('reports-spec.yml'),
8526
reportlets_dir=reportlets_dir,
8627
).generate_report()
8728

@@ -90,7 +31,6 @@ def generate_reports(
9031
sub_ses_list,
9132
output_dir,
9233
run_uuid,
93-
config=None,
9434
work_dir=None,
9535
packagename=None,
9636
):
@@ -100,17 +40,13 @@ def generate_reports(
10040
reportlets_dir = Path(work_dir) / "reportlets"
10141

10242
report_errors = []
103-
for subject_label, session in sub_ses_list:
104-
html_report = ''.join(
105-
[f"sub-{subject_label}", f"_ses-{session}" if session else "", ".html"]
106-
)
43+
for subject, session in sub_ses_list:
10744
report_errors.append(
10845
run_reports(
10946
output_dir,
110-
subject_label,
47+
subject,
11148
run_uuid,
112-
config=config,
113-
out_filename=html_report,
49+
session=session,
11450
packagename=packagename,
11551
reportlets_dir=reportlets_dir,
11652
)

nibabies/workflows/anatomical/outputs.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,25 +233,29 @@ def init_anat_reports_wf(
233233
if not surface_recon:
234234
return workflow
235235

236-
# TODO: Separate report for MCRIBS?
237236
from smriprep.interfaces.reports import FSSurfaceReport
238237

239238
recon_report = pe.Node(FSSurfaceReport(), name="recon_report")
240239
recon_report.interface._always_run = True
241240

241+
if surface_recon == "freesurfer":
242+
recon_desc = "reconall"
243+
elif surface_recon == "infantfs":
244+
recon_desc = "infantfs"
245+
elif surface_recon == "mcribs":
246+
recon_desc = "mcribs"
247+
242248
ds_recon_report = pe.Node(
243-
DerivativesDataSink(base_directory=output_dir, desc="reconall", datatype="figures"),
249+
DerivativesDataSink(base_directory=output_dir, desc=recon_desc, datatype="figures"),
244250
name="ds_recon_report",
245251
run_without_submitting=True,
246252
)
247-
# fmt: off
248253
workflow.connect([
249254
(inputnode, recon_report, [('subjects_dir', 'subjects_dir'),
250255
('subject_id', 'subject_id')]),
251256
(recon_report, ds_recon_report, [('out_report', 'in_file')]),
252257
(inputnode, ds_recon_report, [('source_file', 'source_file')])
253-
])
254-
# fmt: on
258+
]) # fmt: skip
255259

256260
return workflow
257261

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ dependencies = [
2222
'importlib_resources; python_version < "3.9"',
2323
"nibabel >= 5.0.0",
2424
"nipype >= 1.8.5",
25+
"nireports >= 23.2.0",
2526
"nitime",
2627
"nitransforms >= 23.0.1",
2728
"niworkflows >= 1.9.0",

0 commit comments

Comments
 (0)