Skip to content

Commit 2558d8f

Browse files
committed
enh: add ants labeling and stat extraction
1 parent 7c24d8c commit 2558d8f

File tree

1 file changed

+67
-1
lines changed

1 file changed

+67
-1
lines changed

mindboggle/mindboggle123

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,18 @@ Copyright 2017, Mindboggle team (http://mindboggle.info), Apache v2.0 License
2929

3030
import os
3131
import argparse
32+
from glob import glob
3233

3334
from nipype import config, logging
34-
from nipype.pipeline.engine import Workflow, Node
35+
from nipype.pipeline.engine import Workflow, Node, MapNode
3536
from nipype.interfaces.utility import Function as Fn
37+
from nipype.interfaces.utility import Merge
3638
from nipype.interfaces.freesurfer import ReconAll
3739
from nipype.interfaces.ants.segmentation import CorticalThickness
40+
from nipype.interfaces.ants import (ApplyTransforms, AntsJointFusion,
41+
LabelGeometry)
42+
from nipype.utils.misc import human_order_sorted
43+
3844

3945
from mindboggle.version import __version__ as mbversion
4046
mindboggle_version = 'mindboggle version {0}'.format(mbversion)
@@ -274,6 +280,66 @@ Mindboggle.inputs.antsdir = ants_output
274280
if args.skip_ants:
275281
Mindboggle.inputs.antsseg = PREFIX + 'BrainSegmentation.nii.gz'
276282
else:
283+
comps = TDIR.split(os.sep)
284+
IDIR = os.sep.join(comps[:(-2 if not comps[-1] else -1)] +
285+
['OASIS-TRT_brains_to_OASIS_Atropos_template'])
286+
LDIR = os.sep.join(comps[:(-2 if not comps[-1] else -1)] +
287+
['OASIS-TRT_labels_to_OASIS_Atropos_template'])
288+
T1s = human_order_sorted(glob(os.path.join(IDIR, '*.nii.gz')))
289+
labels = human_order_sorted(glob(os.path.join(LDIR, '*.nii.gz')))
290+
291+
# ----------------------------------------------------------------------
292+
# Create workflow to label ANTs output with JointFusion and derive stats
293+
# ----------------------------------------------------------------------
294+
merge_transforms = Node(Merge(2), name="merge_transforms")
295+
296+
# label_wf = Workflow('labelflow')
297+
transformer = MapNode(ApplyTransforms(), iterfield=['input_image'],
298+
name="transformer")
299+
transformer.inputs.reference_image = IMAGE
300+
transformer.inputs.input_image = T1s
301+
transformer.inputs.dimension = 3
302+
transformer.inputs.invert_transform_flags = [False, False]
303+
transformer.inputs.interpolation = 'BSpline'
304+
305+
transformer_nn = MapNode(ApplyTransforms(), iterfield=['input_image'],
306+
name="transformer_nn")
307+
transformer_nn.inputs.reference_image = IMAGE
308+
transformer_nn.inputs.dimension = 3
309+
transformer_nn.inputs.invert_transform_flags = [False, False]
310+
transformer_nn.inputs.input_image = labels
311+
transformer_nn.inputs.interpolation = 'NearestNeighbor'
312+
313+
labeler = Node(AntsJointFusion(), name='labeler')
314+
labeler.inputs.dimension = 3
315+
labeler.inputs.target_image = [IMAGE]
316+
labeler.inputs.out_label_fusion = 'label.nii.gz'
317+
if args.num_threads and args.num_threads > 1:
318+
labeler.inputs.num_threads = args.num_threads
319+
320+
tocsv = Node(LabelGeometry(), name='get_measures')
321+
tocsv.inputs.output_file = os.path.join(ants_output, ID,
322+
'antslabelstats.csv')
323+
324+
mbFlow.connect(corticalthickness, 'TemplateToSubject1GenericAffine',
325+
merge_transforms, 'in1')
326+
mbFlow.connect(corticalthickness, 'TemplateToSubject0Warp',
327+
merge_transforms, 'in2')
328+
mbFlow.connect(merge_transforms, 'out', transformer, 'transforms')
329+
mbFlow.connect(merge_transforms, 'out', transformer_nn, 'transforms')
330+
mbFlow.connect(corticalthickness, 'BrainExtractionMask', labeler,
331+
'mask_image')
332+
mbFlow.connect(corticalthickness, 'CorticalThickness',
333+
tocsv, 'intensity_image')
334+
335+
mbFlow.connect(transformer, 'output_image', labeler, 'atlas_image')
336+
mbFlow.connect(transformer_nn, 'output_image', labeler,
337+
'atlas_segmentation_image')
338+
mbFlow.connect(labeler, 'out_label_fusion', tocsv, 'label_image')
339+
340+
# ----------------------------------------------------------------------------
341+
# Connect ants to Mindboggle
342+
# ----------------------------------------------------------------------------
277343
mbFlow.connect(corticalthickness, 'BrainSegmentation',
278344
Mindboggle, 'antsseg')
279345
Mindboggle.inputs.out = mindboggle_output

0 commit comments

Comments
 (0)