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')])
])