%pylab inline
from IPython.display import Image
import os.path as op
import nibabel as nb
data_dir = '/home/jovyan/work/data/ds000114/'
def plot_nii(in_file):
nb.load(in_file).orthoview()
Populating the interactive namespace from numpy and matplotlib
Hint: use nipype.pipeline.engine.MapNode
from nipype import MapNode
from nipype.interfaces import fsl
bet_node = MapNode(fsl.BET(), name='bet', iterfield=['in_file'])
bet_node.inputs.in_file = [
op.join(data_dir, 'sub-01', 'anat', 'sub-01_T1w.nii.gz'),
op.join(data_dir, 'sub-02', 'anat', 'sub-02_T1w.nii.gz'),
]
res = bet_node.run()
print(res.outputs.out_file)
170330-20:36:05,222 workflow INFO: Executing node bet in dir: /tmp/tmpb5tzx_03/bet 170330-20:36:05,397 workflow INFO: Executing node _bet0 in dir: /tmp/tmpb5tzx_03/bet/mapflow/_bet0 170330-20:36:05,477 workflow INFO: Running: bet /home/jovyan/work/data/ds000114/sub-01/anat/sub-01_T1w.nii.gz /tmp/tmpb5tzx_03/bet/mapflow/_bet0/sub-01_T1w_brain.nii.gz 170330-20:36:19,357 workflow INFO: Executing node _bet1 in dir: /tmp/tmpb5tzx_03/bet/mapflow/_bet1 170330-20:36:19,428 workflow INFO: Running: bet /home/jovyan/work/data/ds000114/sub-02/anat/sub-02_T1w.nii.gz /tmp/tmpb5tzx_03/bet/mapflow/_bet1/sub-02_T1w_brain.nii.gz ['/tmp/tmpb5tzx_03/bet/mapflow/_bet0/sub-01_T1w_brain.nii.gz', '/tmp/tmpb5tzx_03/bet/mapflow/_bet1/sub-02_T1w_brain.nii.gz']
plot_nii(res.outputs.out_file[0])
plot_nii(res.outputs.out_file[1])
Hint: iterables + MapNodes
# Solution 1: only MapNode
import glob
mcflirt_node = MapNode(fsl.MCFLIRT(), name='mcflirt', iterfield=['in_file'])
mcflirt_node.base_dir = 'nipype_101'
mcflirt_node.inputs.in_file = glob.glob(op.join(data_dir, 'sub-0[1,2]', 'func', '*_bold.nii.gz'))
res = mcflirt_node.run()
res.outputs.out_file
170330-20:36:31,499 workflow INFO: Executing node mcflirt in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt 170330-20:36:31,676 workflow INFO: Executing node _mcflirt0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt0 170330-20:36:31,817 workflow INFO: Running: mcflirt -in /home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-fingerfootlips_bold.nii.gz -out /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt0/sub-01_task-fingerfootlips_bold_mcf.nii.gz 170330-20:37:41,970 workflow INFO: Executing node _mcflirt1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt1 170330-20:37:42,10 workflow INFO: Running: mcflirt -in /home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-linebisection_bold.nii.gz -out /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt1/sub-01_task-linebisection_bold_mcf.nii.gz 170330-20:38:38,301 workflow INFO: Executing node _mcflirt2 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt2 170330-20:38:38,342 workflow INFO: Running: mcflirt -in /home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-fingerfootlips_bold.nii.gz -out /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt2/sub-02_task-fingerfootlips_bold_mcf.nii.gz 170330-20:39:22,888 workflow INFO: Executing node _mcflirt3 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt3 170330-20:39:22,915 workflow INFO: Running: mcflirt -in /home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-linebisection_bold.nii.gz -out /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt3/sub-02_task-linebisection_bold_mcf.nii.gz
['/home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt0/sub-01_task-fingerfootlips_bold_mcf.nii.gz', '/home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt1/sub-01_task-linebisection_bold_mcf.nii.gz', '/home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt2/sub-02_task-fingerfootlips_bold_mcf.nii.gz', '/home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipype_101/mcflirt/mapflow/_mcflirt3/sub-02_task-linebisection_bold_mcf.nii.gz']
# Solution 2: iterables + MapNode
from nipype import Workflow, Node
from nipype.interfaces.utility import Function
def _get_bolds(subject_id, data_dir):
import glob
import os.path as op
return glob.glob(op.join(data_dir, 'sub-%s' % subject_id, 'func', '*_bold.nii.gz'))
dg_node = Node(Function(input_names=['subject_id', 'data_dir'], output_names=['out_files'], function=_get_bolds),
name='datagrabber')
mcflirt_node = MapNode(fsl.MCFLIRT(), name='mcflirt', iterfield=['in_file'])
wf = Workflow('task2')
wf.base_dir = 'workdir_task2'
wf.connect(dg_node, 'out_files', mcflirt_node, 'in_file')
dg_node.iterables = ('subject_id', ['01', '02'])
dg_node.inputs.data_dir = data_dir
wf.run()
170330-20:40:17,253 workflow INFO: Workflow task2 settings: ['check', 'execution', 'logging'] 170330-20:40:17,274 workflow INFO: Running serially. 170330-20:40:17,277 workflow INFO: Executing node datagrabber.aI.a1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_02/datagrabber 170330-20:40:17,292 workflow INFO: Collecting precomputed outputs 170330-20:40:17,313 workflow INFO: Executing node bet.a1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_02/bet 170330-20:40:17,351 workflow INFO: Executing node datagrabber.aI.a0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_01/datagrabber 170330-20:40:17,360 workflow INFO: Collecting precomputed outputs 170330-20:40:17,378 workflow INFO: Executing node bet.a0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_01/bet
<networkx.classes.digraph.DiGraph at 0x7fe322d92160>
170330-20:40:17,451 workflow INFO: Workflow task2 settings: ['check', 'execution', 'logging'] 170330-20:40:17,469 workflow INFO: Running serially. 170330-20:40:17,473 workflow INFO: Executing node datagrabber.aI.a1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_02/datagrabber 170330-20:40:17,489 workflow INFO: Collecting precomputed outputs 170330-20:40:17,509 workflow INFO: Executing node bet.a1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_02/bet 170330-20:40:17,543 workflow INFO: Executing node datagrabber.aI.a0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_01/datagrabber 170330-20:40:17,556 workflow INFO: Collecting precomputed outputs 170330-20:40:17,577 workflow INFO: Executing node bet.a0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/workdir_task2/task2/_subject_id_01/bet
<networkx.classes.digraph.DiGraph at 0x7fe325f40f28>
from bids.grabbids import BIDSLayout
layout = BIDSLayout(data_dir)
print('Number of subjects is %d' % len(layout.get_subjects()))
Number of subjects is 2
def get_info(subject_id, dataset_dir):
from bids.grabbids import BIDSLayout
layout = BIDSLayout(dataset_dir)
t1w = layout.get(type='T1w',
subject=subject_id,
extensions=['nii', 'nii.gz'],
return_type='file')
epi = [f.filename for f in layout.get(type='bold', subject=subject_id, extensions=['nii', 'nii.gz'])]
return t1w, epi
# Test get_info:
print(get_info('01', data_dir))
print(get_info('0[12]', data_dir))
(['/home/jovyan/work/data/ds000114/sub-01/anat/sub-01_T1w.nii.gz'], ['/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-fingerfootlips_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-linebisection_bold.nii.gz']) (['/home/jovyan/work/data/ds000114/sub-01/anat/sub-01_T1w.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/anat/sub-02_T1w.nii.gz'], ['/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-fingerfootlips_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-linebisection_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-fingerfootlips_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-linebisection_bold.nii.gz'])
node_bids = Node(Function(input_names=['subject_id', 'dataset_dir'], output_names=['t1w', 'epi'],
function=get_info), name='bids_ds')
node_bids.inputs.subject_id = '0[12]'
node_bids.inputs.dataset_dir = data_dir
# Test this node
res = node_bids.run()
print(res.outputs.t1w)
print(res.outputs.epi)
170330-20:50:46,470 workflow INFO: Executing node bids_ds in dir: /tmp/tmp608t576i/bids_ds ['/home/jovyan/work/data/ds000114/sub-01/anat/sub-01_T1w.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/anat/sub-02_T1w.nii.gz'] ['/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-fingerfootlips_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-01/func/sub-01_task-linebisection_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-fingerfootlips_bold.nii.gz', '/home/jovyan/work/data/ds000114/sub-02/func/sub-02_task-linebisection_bold.nii.gz']
# We will need this little function
def _flatten(inlist):
return [el for l in inlist for el in l]
print(_flatten([[1, 2], [3], [4, 5]]))
[1, 2, 3, 4, 5]
def _vol_mean(in_file):
import nibabel as nb
import numpy as np
nii = nb.load(in_file)
data = nii.get_data()
voxvol = np.prod(nii.header.get_zooms()[:3])
volume = sum(data > 0) * voxvol
mean = data[data > 0].mean()
return volume, mean
from nipype.interfaces.utility import IdentityInterface, Rename
from nipype.interfaces.io import DataSink
inputs_node = Node(IdentityInterface(fields=['subject_id']), name='inputnode')
bids_node = MapNode(Function(input_names=['subject_id', 'dataset_dir'], output_names=['t1w', 'epi'],
function=get_info),
name='bids_ds',
iterfield=['subject_id']
)
bet_node = MapNode(fsl.BET(functional=True, mask=True), name='bet', iterfield=['in_file'])
mcflirt_node = MapNode(fsl.MCFLIRT(), name='mcflirt', iterfield=['in_file'])
applymsk_node = MapNode(fsl.ApplyMask(), name='mask', iterfield=['in_file', 'mask_file'])
volmean_node = MapNode(Function(input_names=['in_file'], output_names=['vol', 'mean'],
function=_vol_mean), name='volmean', iterfield=['in_file'])
ds_node = Node(DataSink(
base_directory='/home/jovyan/work/workshops/170327-'
'nipype/notebooks/nipype_101_tasks/nipype_outputs'),
name='datasink')
wf = Workflow('task_5')
wf.base_dir = 'nipypework'
wf.connect(inputs_node, 'subject_id', bids_node, 'subject_id')
wf.connect(bids_node, ('epi', _flatten), bet_node, 'in_file')
wf.connect(bids_node, ('epi', _flatten), mcflirt_node, 'in_file')
wf.connect(bet_node, 'mask_file', applymsk_node, 'mask_file')
wf.connect(mcflirt_node, 'out_file', applymsk_node, 'in_file')
wf.connect(applymsk_node, 'out_file', ds_node, 'epi')
wf.connect(applymsk_node, 'out_file', volmean_node, 'in_file')
Image(wf.write_graph())
170330-21:00:13,265 workflow INFO: Generated workflow graph: nipypework/task_5/graph.dot.png (graph2use=hierarchical, simple_form=True).
# Time to run it
wf.inputs.inputnode.subject_id = ['01', '02']
wf.inputs.bids_ds.dataset_dir = data_dir
wf.run()
170330-21:00:13,321 workflow INFO: Workflow task_5 settings: ['check', 'execution', 'logging'] 170330-21:00:13,343 workflow INFO: Running serially. 170330-21:00:13,347 workflow INFO: Executing node bids_ds in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/bids_ds 170330-21:00:13,378 workflow INFO: Executing node _bids_ds0 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/bids_ds/mapflow/_bids_ds0 170330-21:00:15,56 workflow INFO: Executing node _bids_ds1 in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/bids_ds/mapflow/_bids_ds1 170330-21:00:16,601 workflow INFO: Executing node bet in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/bet 170330-21:00:16,693 workflow INFO: Executing node mcflirt in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/mcflirt 170330-21:00:16,781 workflow INFO: Executing node mask in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/mask 170330-21:00:16,863 workflow INFO: Executing node volmean in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/volmean 170330-21:00:16,949 workflow INFO: Executing node datasink in dir: /home/jovyan/work/workshops/170327-nipype/notebooks/nipype_101_tasks/nipypework/task_5/datasink
<networkx.classes.digraph.DiGraph at 0x7fe32302a438>
!tree nipype_outputs/
nipype_outputs/ ├── epi │ ├── _mcflirt0 │ │ └── sub-01_task-fingerfootlips_bold_mcf.nii.gz │ ├── _mcflirt1 │ │ └── sub-01_task-linebisection_bold_mcf.nii.gz │ ├── _mcflirt2 │ │ └── sub-02_task-fingerfootlips_bold_mcf.nii.gz │ └── _mcflirt3 │ └── sub-02_task-linebisection_bold_mcf.nii.gz └── t1w ├── _bet0 │ └── sub-01_T1w_brain.nii.gz └── _bet1 └── sub-02_T1w_brain.nii.gz 8 directories, 6 files
from nipype import JoinNode
from nipype.interfaces.utility import Merge
Merge??
Init signature: Merge(numinputs=1, **inputs) Source: class Merge(IOBase): """Basic interface class to merge inputs into a single list ``Merge(1)`` will merge a list of lists Examples -------- >>> from nipype.interfaces.utility import Merge >>> mi = Merge(3) >>> mi.inputs.in1 = 1 >>> mi.inputs.in2 = [2, 5] >>> mi.inputs.in3 = 3 >>> out = mi.run() >>> out.outputs.out [1, 2, 5, 3] >>> merge = Merge() # Or Merge(1) >>> merge.inputs.in_lists = [1, [2, 5], 3] >>> out = merge.run() >>> out.outputs.out [1, 2, 5, 3] """ input_spec = MergeInputSpec output_spec = MergeOutputSpec def __init__(self, numinputs=1, **inputs): super(Merge, self).__init__(**inputs) self._numinputs = numinputs if numinputs > 1: input_names = ['in%d' % (i + 1) for i in range(numinputs)] elif numinputs == 1: input_names = ['in_lists'] else: input_names = [] add_traits(self.inputs, input_names) def _list_outputs(self): outputs = self._outputs().get() out = [] if self._numinputs < 1: return outputs elif self._numinputs == 1: values = self.inputs.in_lists else: getval = lambda idx: getattr(self.inputs, 'in%d' % (idx + 1)) values = [getval(idx) for idx in range(self._numinputs) if isdefined(getval(idx))] if self.inputs.axis == 'vstack': for value in values: if isinstance(value, list) and not self.inputs.no_flatten: out.extend(value) else: out.append(value) else: lists = [filename_to_list(val) for val in values] out = [[val[i] for val in lists] for i in range(len(lists[0]))] outputs['out'] = out return outputs File: /opt/conda/lib/python3.5/site-packages/nipype/interfaces/utility/base.py Type: type