Skip to content

Commit c2d8f8e

Browse files
Better skull coreg (#68)
* use FLIRT with possible init directly on stereo * if crop_CT flirt to stereo otherwise reg_aladin to native and apply stereo stranfo * added t1_head_auto_mask * no gcc dilate/erode for T1
1 parent aa2d942 commit c2d8f8e

15 files changed

Lines changed: 601 additions & 60 deletions

skullTo3d/pipelines/skull_pipe.py

Lines changed: 108 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,6 +2164,7 @@ def create_skull_ct_pipe(name="skull_ct_pipe", params={}):
21642164
name='outputnode')
21652165

21662166
if "crop_CT" in params:
2167+
21672168
print('crop_CT is in params')
21682169

21692170
assert "args" in params["crop_CT"].keys(), \
@@ -2182,68 +2183,137 @@ def create_skull_ct_pipe(name="skull_ct_pipe", params={}):
21822183
skull_ct_pipe.connect(inputnode, 'ct',
21832184
crop_CT, 'in_file')
21842185

2185-
# align_ct_on_T1
2186-
align_ct_on_T1 = pe.Node(interface=RegAladin(),
2187-
name="align_ct_on_T1")
2186+
align_ct_on_T1 = pe.Node(fsl.FLIRT(), name="align_ct_on_T1")
2187+
align_ct_on_T1.inputs.dof = 6
21882188

2189-
align_ct_on_T1.inputs.rig_only_flag = True
2189+
align_ct_on_T1.inputs.cost = 'normmi'
21902190

2191-
if "crop_CT" in params:
21922191
skull_ct_pipe.connect(
21932192
crop_CT, "roi_file",
2194-
align_ct_on_T1, "flo_file")
2195-
else:
2193+
align_ct_on_T1, 'in_file')
2194+
21962195
skull_ct_pipe.connect(
2197-
inputnode, 'ct',
2198-
align_ct_on_T1, "flo_file")
2196+
inputnode, "stereo_T1",
2197+
align_ct_on_T1, 'reference')
21992198

2200-
skull_ct_pipe.connect(inputnode, "native_T1",
2201-
align_ct_on_T1, "ref_file")
2199+
if "align_ct_on_T1_2" in params:
22022200

2203-
if "align_ct_on_T1_2" in params:
2201+
align_ct_on_T1_2 = pe.Node(fsl.FLIRT(), name="align_ct_on_T1_2")
2202+
align_ct_on_T1_2.inputs.dof = 6
22042203

2205-
# align_ct_on_T1
2206-
align_ct_on_T1_2 = pe.Node(interface=RegAladin(),
2207-
name="align_ct_on_T1_2")
2204+
align_ct_on_T1_2.inputs.cost = 'normmi'
22082205

2209-
align_ct_on_T1_2.inputs.rig_only_flag = True
2206+
skull_ct_pipe.connect(
2207+
crop_CT, "roi_file",
2208+
align_ct_on_T1_2, 'in_file')
22102209

2211-
skull_ct_pipe.connect(align_ct_on_T1, 'res_file',
2212-
align_ct_on_T1_2, "flo_file")
2210+
skull_ct_pipe.connect(
2211+
inputnode, "stereo_T1",
2212+
align_ct_on_T1_2, 'reference')
22132213

2214-
skull_ct_pipe.connect(inputnode, "native_T1",
2215-
align_ct_on_T1_2, "ref_file")
2214+
# initial matrix
2215+
skull_ct_pipe.connect(
2216+
align_ct_on_T1, "out_matrix_file",
2217+
align_ct_on_T1_2, 'in_matrix_file')
22162218

2217-
# align_ct_on_stereo_T1
2218-
align_ct_on_stereo_T1 = pe.Node(
2219-
interface=RegResample(pad_val=0.0),
2220-
name="align_ct_on_stereo_T1")
2219+
if "align_ct_on_T1_2" in params:
2220+
skull_ct_pipe.connect(
2221+
align_ct_on_T1_2, 'out_file',
2222+
outputnode, "stereo_ct")
22212223

2222-
if "align_ct_on_T1_2" in params:
2223-
skull_ct_pipe.connect(align_ct_on_T1_2, 'res_file',
2224-
align_ct_on_stereo_T1, "flo_file")
2224+
else:
2225+
skull_ct_pipe.connect(
2226+
align_ct_on_T1, 'out_file',
2227+
outputnode, "stereo_ct")
22252228

22262229
else:
2227-
skull_ct_pipe.connect(align_ct_on_T1, 'res_file',
2228-
align_ct_on_stereo_T1, "flo_file")
22292230

2230-
skull_ct_pipe.connect(inputnode, 'native_to_stereo_trans',
2231-
align_ct_on_stereo_T1, "trans_file")
2231+
# align_ct_on_T1
2232+
align_ct_on_T1 = pe.Node(
2233+
interface=RegAladin(),
2234+
name="align_ct_on_T1")
22322235

2233-
skull_ct_pipe.connect(inputnode, "stereo_T1",
2234-
align_ct_on_stereo_T1, "ref_file")
2235-
# output node
2236-
skull_ct_pipe.connect(align_ct_on_stereo_T1, "out_file",
2237-
outputnode, "stereo_ct")
2236+
align_ct_on_T1.inputs.rig_only_flag = True
2237+
2238+
if "crop_CT" in params:
2239+
skull_ct_pipe.connect(
2240+
crop_CT, "roi_file",
2241+
align_ct_on_T1, "flo_file")
2242+
else:
2243+
skull_ct_pipe.connect(
2244+
inputnode, 'ct',
2245+
align_ct_on_T1, "flo_file")
2246+
2247+
skull_ct_pipe.connect(
2248+
inputnode, "native_T1",
2249+
align_ct_on_T1, "ref_file")
2250+
2251+
if "align_ct_on_T1_2" in params:
2252+
2253+
# align_ct_on_T1
2254+
align_ct_on_T1_2 = pe.Node(
2255+
interface=RegAladin(),
2256+
name="align_ct_on_T1_2")
2257+
2258+
align_ct_on_T1_2.inputs.rig_only_flag = True
2259+
2260+
skull_ct_pipe.connect(
2261+
align_ct_on_T1, 'res_file',
2262+
align_ct_on_T1_2, "flo_file")
2263+
2264+
skull_ct_pipe.connect(
2265+
inputnode, "native_T1",
2266+
align_ct_on_T1_2, "ref_file")
2267+
2268+
# align_ct_on_stereo_T1
2269+
align_ct_on_stereo_T1 = pe.Node(
2270+
interface=RegResample(pad_val=0.0),
2271+
name="align_ct_on_stereo_T1")
2272+
2273+
if "align_ct_on_T1_2" in params:
2274+
skull_ct_pipe.connect(
2275+
align_ct_on_T1_2, 'res_file',
2276+
align_ct_on_stereo_T1, "flo_file")
2277+
2278+
else:
2279+
skull_ct_pipe.connect(
2280+
align_ct_on_T1, 'res_file',
2281+
align_ct_on_stereo_T1, "flo_file")
2282+
2283+
skull_ct_pipe.connect(
2284+
inputnode, 'native_to_stereo_trans',
2285+
align_ct_on_stereo_T1, "trans_file")
2286+
2287+
skull_ct_pipe.connect(
2288+
inputnode, "stereo_T1",
2289+
align_ct_on_stereo_T1, "ref_file")
2290+
2291+
# output node
2292+
skull_ct_pipe.connect(
2293+
align_ct_on_stereo_T1, "out_file",
2294+
outputnode, "stereo_ct")
22382295

22392296
if "skullmask_ct_pipe" in params:
22402297

22412298
skullmask_ct_pipe = _create_skullmask_ct_pipe(
22422299
name="skullmask_ct_pipe",
22432300
params=params["skullmask_ct_pipe"])
22442301

2245-
skull_ct_pipe.connect(align_ct_on_stereo_T1, "out_file",
2246-
skullmask_ct_pipe, "inputnode.realigned_ct")
2302+
if "crop_CT" in params:
2303+
2304+
if "align_ct_on_T1_2" in params:
2305+
skull_ct_pipe.connect(
2306+
align_ct_on_T1_2, 'out_file',
2307+
skullmask_ct_pipe, "inputnode.realigned_ct")
2308+
2309+
else:
2310+
skull_ct_pipe.connect(
2311+
align_ct_on_T1, 'out_file',
2312+
skullmask_ct_pipe, "inputnode.realigned_ct")
2313+
else:
2314+
2315+
skull_ct_pipe.connect(align_ct_on_stereo_T1, "out_file",
2316+
skullmask_ct_pipe, "inputnode.realigned_ct")
22472317

22482318
skull_ct_pipe.connect(inputnode, "indiv_params",
22492319
skullmask_ct_pipe, "inputnode.indiv_params")

workflows/params_segment_macaque_0p5_ants_4animal_skull.json

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@
8787
{
8888
"headmask_t1_pipe":
8989
{
90+
"t1_head_auto_mask":
91+
{
92+
"kmeans": true,
93+
"operation": "lower",
94+
"index": 2,
95+
"sample_bins": 30,
96+
"distance": 10
97+
},
9098
"t1_head_dilate":
9199
{
92100
"operation": "modal",
@@ -114,17 +122,6 @@
114122
"kernel_shape": "boxv",
115123
"kernel_size": 9.0
116124
},
117-
"t1_skull_gcc_erode":
118-
{
119-
"kernel_shape": "boxv",
120-
"kernel_size": 5.0
121-
},
122-
"t1_skull_gcc_dilate":
123-
{
124-
"operation": "modal",
125-
"kernel_shape": "boxv",
126-
"kernel_size": 5.0
127-
},
128125
"t1_skull_dilate":
129126
{
130127
"operation": "modal",
@@ -140,6 +137,29 @@
140137
{
141138
"brainsize": 45
142139
}
140+
},
141+
142+
143+
"fullskullmask_t1_pipe":
144+
{
145+
"brainmask_expand":
146+
{
147+
"operation": "modal",
148+
"kernel_shape": "boxv",
149+
"kernel_size": 11
150+
},
151+
152+
"fullskull_dilate":
153+
{
154+
"operation": "modal",
155+
"kernel_shape": "boxv",
156+
"kernel_size": 7.0
157+
},
158+
"fullskull_erode":
159+
{
160+
"kernel_shape": "boxv",
161+
"kernel_size": 7.0
162+
}
143163
}
144164
},
145165
"skull_petra_pipe":
@@ -202,6 +222,28 @@
202222
{
203223
"brainsize": 45
204224
}
225+
},
226+
227+
"fullskullmask_petra_pipe":
228+
{
229+
"brainmask_expand":
230+
{
231+
"operation": "modal",
232+
"kernel_shape": "boxv",
233+
"kernel_size": 11
234+
},
235+
236+
"fullskull_dilate":
237+
{
238+
"operation": "modal",
239+
"kernel_shape": "boxv",
240+
"kernel_size": 7.0
241+
},
242+
"fullskull_erode":
243+
{
244+
"kernel_shape": "boxv",
245+
"kernel_size": 7.0
246+
}
205247
}
206248
},
207249

@@ -211,6 +253,32 @@
211253
{
212254
},
213255
"skullmask_ct_pipe":
256+
{
257+
"ct_skull_auto_mask":
258+
{
259+
"kmeans": true,
260+
"sample_bins": 30,
261+
"distance": 10,
262+
"operation": "lower",
263+
"index": 2
264+
},
265+
"ct_skull_dilate":
266+
{
267+
"operation" : "modal",
268+
"kernel_shape" : "boxv",
269+
"kernel_size" : 3.0
270+
},
271+
"ct_skull_erode":
272+
{
273+
"kernel_shape" : "boxv",
274+
"kernel_size" : 3.0
275+
},
276+
"ct_skull_fov":
277+
{
278+
"brainsize" : 45
279+
}
280+
},
281+
"skullmask_ct_pipe":
214282
{
215283
"ct_skull_auto_mask":
216284
{

workflows/params_segment_macaque_0p5_ants_4animal_skullnoisypetra.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@
8787
{
8888
"headmask_t1_pipe":
8989
{
90+
"t1_head_auto_mask":
91+
{
92+
"kmeans": true,
93+
"operation": "lower",
94+
"index": 2,
95+
"sample_bins": 30,
96+
"distance": 10
97+
},
9098
"t1_head_dilate":
9199
{
92100
"operation": "modal",
@@ -139,6 +147,28 @@
139147
{
140148
"brainsize": 45
141149
}
150+
},
151+
152+
"fullskullmask_t1_pipe":
153+
{
154+
"brainmask_expand":
155+
{
156+
"operation": "modal",
157+
"kernel_shape": "boxv",
158+
"kernel_size": 11
159+
},
160+
161+
"fullskull_dilate":
162+
{
163+
"operation": "modal",
164+
"kernel_shape": "boxv",
165+
"kernel_size": 7.0
166+
},
167+
"fullskull_erode":
168+
{
169+
"kernel_shape": "boxv",
170+
"kernel_size": 7.0
171+
}
142172
}
143173
},
144174
"skull_petra_pipe":
@@ -213,6 +243,29 @@
213243
{
214244
"brainsize": 45
215245
}
246+
},
247+
248+
249+
"fullskullmask_petra_pipe":
250+
{
251+
"brainmask_expand":
252+
{
253+
"operation": "modal",
254+
"kernel_shape": "boxv",
255+
"kernel_size": 11
256+
},
257+
258+
"fullskull_dilate":
259+
{
260+
"operation": "modal",
261+
"kernel_shape": "boxv",
262+
"kernel_size": 7.0
263+
},
264+
"fullskull_erode":
265+
{
266+
"kernel_shape": "boxv",
267+
"kernel_size": 7.0
268+
}
216269
}
217270
},
218271

0 commit comments

Comments
 (0)