How to use JoinNode with iterable defined at runtime?

28 views
Skip to first unread message

Michael

unread,
Jan 2, 2014, 6:03:02 PM1/2/14
to nipy...@googlegroups.com
JoinNode is a great addition to NiPype (many thanks Fred) and i'd like to use it instead of a succession of MapNode. With MapNode i can have my inputnode defined at runtime in this way:

import nipype.pipeline.engine as pe
inputnode = pe.Node(interface=util.IdentityInterface(fields=['myBinputVer1','myBinputVer2','myBinputVer3']),name="inputnode")
outputnode = pe.Node(interface=util.IdentityInterface(fields=['myCoutputVer1','myCoutputVer2','myCoutputVer3']),name="outputnode")
a = pe.Node(interface=util.Merge(3), name="a")
b = pe.MapNode(interface=B(), name="b",iterfield=['myBinput'])
c = pe.MapNode(interface=C(), name="c",iterfield=['myCinput'])
d = pe.Node(interface=util.Split(splits=[1,1,1]),name="d")
my_workflow = pe.Workflow(name="my_workflow")
my_workflow.connect([
                       (a,b,[('out','myBinput')]),
                       (b,c,[('myBoutput','myCinput')]),
                       (c,d,[('myCoutput','inlist')]),
                       (d,outputnode,
                        [('out1','myCoutputVer1'),
                         ('out2','myCoutputVer2'),
                         ('out3','myCoutputVer3')])
                    ])

Whereas with JoinNode i have no idea how to set the iterable so that its inputs are defined at runtime. In the code below, the variable  inputnode.inputs.myBinputVerX are empty at initialization (only defined at runtime) and therefore the following would fail:

import nipype.pipeline.engine as pe
inputnode = pe.Node(interface=util.IdentityInterface(fields=['myBinputVer1','myBinputVer2','myBinputVer3']),name="inputnode")
outputnode = pe.Node(interface=util.IdentityInterface(fields=['myCinputVer1','myCinputVer2','myCinputVer3']),name="outputnode")
a = pe.Node(interface=util.Merge(3), name="a")
b = pe.Node(interface=B(), name="b")
b.iterables = ("myBinput", [inputnode.inputs.myBinputVer1,inputnode.inputs.myBinputVer2,inputnode.inputs.myBinputVer3])
c = pe.Node(interface=C(), name="c")
d = pe.JoinNode(interface=util.Split(splits=[1,1,1]), joinsource="b",
                joinfield="myBinput", name="d")

my_workflow = pe.Workflow(name="my_workflow")
my_workflow.connect([
                       (a,b,[('out','myBinput')]),
                       (b,c,[('myBoutput','myCinput')]),
                       (c,d,[('myCoutput','inlist')]),
                       (d,outputnode,
                        [('out1','myCoutputVer1'),
                         ('out2','myCoutputVer2'),
                         ('out3','myCoutputVer3')])
                    ])
Reply all
Reply to author
Forward
0 new messages