@@ -47,7 +47,16 @@ def init_anat_fsLR_resampling_wf(
47
47
iterables = [('hemi' , ['L' , 'R' ])],
48
48
)
49
49
50
- outputnode = pe .Node (niu .IdentityInterface (fields = ['fsLR_midthickness' ]), name = 'outputnode' )
50
+ outputnode = pe .Node (
51
+ niu .IdentityInterface (
52
+ fields = [
53
+ 'fsLR_midthickness' ,
54
+ 'cifti_morph' ,
55
+ 'cifti_metadata' ,
56
+ ]
57
+ ),
58
+ name = 'outputnode' ,
59
+ )
51
60
52
61
# select white, midthickness and pial surfaces based on hemi
53
62
select_surfaces = pe .Node (CiftiSelect (), name = 'select_surfaces' )
@@ -96,50 +105,33 @@ def init_anat_fsLR_resampling_wf(
96
105
else :
97
106
morph_grayords_wf = init_morph_grayords_wf (grayord_density )
98
107
99
- workflow .connect (
100
- [
101
- (
102
- inputnode ,
103
- select_surfaces ,
104
- [("surfaces" , "surfaces" ), ("sphere_reg_fsLR" , "spherical_registrations" )],
105
- ),
106
- (itersource , select_surfaces , [("hemi" , "hemi" )]),
107
- # Downsample midthickness to fsLR density
108
- (
109
- select_surfaces ,
110
- downsampled_midthickness ,
111
- [
112
- ("midthickness" , "surface_in" ),
113
- ("sphere_reg" , "current_sphere" ),
114
- ("template_sphere" , "new_sphere" ),
115
- ],
116
- ),
117
- (downsampled_midthickness , joinnode , [("surface_out" , "fsLR_midthickness" )]),
118
- (joinnode , outputnode , [("surface_out" , "fsLR_midthickness" )]),
119
- # resample surfaces
120
- (
121
- inputnode ,
122
- morph_grayords_wf ,
123
- [
124
- ("subject_id" , "inputnode.subject_id" ),
125
- ("subjects_dir" , "inputnode.subjects_dir" ),
126
- ],
127
- ),
128
- (
129
- morph_grayords_wf ,
130
- outputnode ,
131
- [
132
- ("outputnode.cifti_morph" , "cifti_morph" ),
133
- ("outputnode.cifti_metadata" , "cifti_metadata" ),
134
- ],
135
- ),
136
- ]
137
- )
108
+ # fmt:off
109
+ workflow .connect ([
110
+ (inputnode , select_surfaces , [
111
+ ("surfaces" , "surfaces" ),
112
+ ("sphere_reg_fsLR" , "spherical_registrations" )]),
113
+ (itersource , select_surfaces , [("hemi" , "hemi" )]),
114
+ # Downsample midthickness to fsLR density
115
+ (select_surfaces , downsampled_midthickness , [
116
+ ("midthickness" , "surface_in" ),
117
+ ("sphere_reg" , "current_sphere" ),
118
+ ("template_sphere" , "new_sphere" )]),
119
+ (downsampled_midthickness , joinnode , [("surface_out" , "fsLR_midthickness" )]),
120
+ (joinnode , outputnode , [("surface_out" , "fsLR_midthickness" )]),
121
+ # resample morphometrics to fsLR 32k
122
+ (inputnode , morph_grayords_wf , [
123
+ ("subject_id" , "inputnode.subject_id" ),
124
+ ("subjects_dir" , "inputnode.subjects_dir" )]),
125
+ (morph_grayords_wf , outputnode , [
126
+ ("outputnode.cifti_morph" , "cifti_morph" ),
127
+ ("outputnode.cifti_metadata" , "cifti_metadata" )]),
128
+ ])
129
+ # fmt:on
138
130
return workflow
139
131
140
132
141
133
def init_mcribs_morph_grayords_wf (
142
- grayord_density : ty .Literal ['91k' , '170k' ],
134
+ grayord_density : ty .Literal ['91k' ], # Only 91k supported ATM
143
135
name : str = "morph_grayords_wf" ,
144
136
):
145
137
"""
@@ -180,21 +172,17 @@ def init_mcribs_morph_grayords_wf(
180
172
Paths to JSON files containing metadata corresponding to ``cifti_morph``
181
173
182
174
"""
183
- import templateflow .api as tf
184
- from nipype .interfaces .io import FreeSurferSource
185
175
from nipype .interfaces .workbench import MetricResample
186
176
from niworkflows .engine .workflows import LiterateWorkflow as Workflow
187
177
from smriprep .interfaces .cifti import GenerateDScalar
188
178
189
179
workflow = Workflow (name = name )
190
180
workflow .__desc__ = f"""\
191
181
*Grayordinate* "dscalar" files [@hcppipelines] containing { grayord_density } samples were
192
- also generated using the highest-resolution ``fsaverage` ` as an intermediate standardized
182
+ also generated using `M-CRIB-S ` as an intermediate standardized
193
183
surface space.
194
184
"""
195
185
196
- fslr_density = "32k" if grayord_density == "91k" else "59k"
197
-
198
186
inputnode = pe .Node (
199
187
niu .IdentityInterface (
200
188
fields = [
@@ -213,17 +201,12 @@ def init_mcribs_morph_grayords_wf(
213
201
name = "outputnode" ,
214
202
)
215
203
216
- get_surfaces = pe .Node (FreeSurferSource (), name = "get_surfaces" )
217
-
218
204
surfmorph_list = pe .Node (
219
205
niu .Merge (3 , ravel_inputs = True ),
220
206
name = "surfmorph_list" ,
221
207
run_without_submitting = True ,
222
208
)
223
209
224
- # TODO: Extract L/R midthickness from surfaces
225
- # TODO: Coerce morphometrics into curv-L, curv-R, sulc-L, sulc-R, thickness-L, thickness-R
226
-
227
210
# Setup Workbench command. LR ordering for hemi can be assumed, as it is imposed
228
211
# by the iterfield of the MapNode in the surface sampling workflow above.
229
212
resample = pe .MapNode (
@@ -244,7 +227,6 @@ def init_mcribs_morph_grayords_wf(
244
227
str (atlases / 'mcribs' / 'lh.sphere.reg.dHCP42.surf.gii' ),
245
228
str (atlases / 'mcribs' / 'rh.sphere.reg.dHCP42.surf.gii' ),
246
229
] * 3
247
- # current area: FreeSurfer (M-CRIB-S) midthickness
248
230
resample .inputs .new_sphere = [
249
231
str (atlases / 'dHCP' / 'dHCP.week42.L.sphere.surf.gii' ),
250
232
str (atlases / 'dHCP' / 'dHCP.week42.R.sphere.surf.gii' ),
@@ -267,23 +249,23 @@ def init_mcribs_morph_grayords_wf(
267
249
268
250
# fmt: off
269
251
workflow .connect ([
270
- (inputnode , get_surfaces , [
271
- ('subject_id' , 'subject_id' ),
272
- ('subjects_dir' , 'subjects_dir' ),
252
+ (inputnode , resample , [
253
+ ("fsLR_midthickness" , "new_area" ),
254
+ (('surfaces' , _get_surf , "midthickness" , 3 ), "current_area" )]),
255
+ (inputnode , surfmorph_list , [
256
+ (('morphometrics' , _get_surf , "curv" ), "in1" ),
257
+ (('morphometrics' , _get_surf , "sulc" ), "in2" ),
258
+ (('morphometrics' , _get_surf , "thickness" ), "in3" ),
273
259
]),
274
- (get_surfaces , surfmorph_list , [
275
- (('curv' , _sorted_by_basename ), 'in1' ),
276
- (('sulc' , _sorted_by_basename ), 'in2' ),
277
- (('thickness' , _sorted_by_basename ), 'in3' ),
278
- ]),
279
- # (surfmorph_list, surf2surf, [('out', 'source_file')]),
280
- # (surf2surf, resample, [('out_file', 'in_file')]),
281
- (inputnode , resample , [("fsLR_midthickness" , "new_area" )]),
282
260
(resample , gen_cifti , [
283
261
(("out_file" , _collate ), "scalar_surfs" )]),
284
262
(gen_cifti , outputnode , [("out_file" , "cifti_morph" ),
285
263
("out_metadata" , "cifti_metadata" )]),
286
264
])
287
265
# fmt: on
288
-
289
266
return workflow
267
+
268
+
269
+ def _get_surf (surfaces , name , mult = 1 ):
270
+ "Select a specific surface by name, and optionally multiple it."
271
+ return [surf for surf in _sorted_by_basename (surfaces ) if name in surf ] * mult
0 commit comments