diff --git a/nipype/pipeline/engine/base.py b/nipype/pipeline/engine/base.py index 51449632ba..0883023f63 100644 --- a/nipype/pipeline/engine/base.py +++ b/nipype/pipeline/engine/base.py @@ -84,9 +84,12 @@ def clone(self, name): A clone of node or workflow must have a new name """ if name == self.name: - raise ValueError('Cloning requires a new name, "%s" is in use.' % name) + raise ValueError('Cloning requires a new name, "%s" is ' + 'in use.' % name) clone = deepcopy(self) clone.name = name + if hasattr(clone, '_id'): + clone._id = name return clone def _check_outputs(self, parameter): diff --git a/nipype/pipeline/engine/tests/test_base.py b/nipype/pipeline/engine/tests/test_base.py index 54356fd6c5..fd87aa6878 100644 --- a/nipype/pipeline/engine/tests/test_base.py +++ b/nipype/pipeline/engine/tests/test_base.py @@ -6,6 +6,8 @@ import pytest from ..base import EngineBase from ....interfaces import base as nib +from ....interfaces import utility as niu +from ... import engine as pe class InputSpec(nib.TraitedSpec): @@ -64,3 +66,24 @@ def test_clone(): with pytest.raises(ValueError): base.clone('nodename') + +def test_clone_node_iterables(tmpdir): + tmpdir.chdir() + + def addstr(string): + return ('%s + 2' % string) + + subject_list = ['sub-001', 'sub-002'] + inputnode = pe.Node(niu.IdentityInterface(fields=['subject']), + name='inputnode') + inputnode.iterables = [('subject', subject_list)] + + node_1 = pe.Node(niu.Function(input_names='string', + output_names='string', + function=addstr), name='node_1') + node_2 = node_1.clone('node_2') + + workflow = pe.Workflow(name='iter_clone_wf') + workflow.connect([(inputnode, node_1, [('subject', 'string')]), + (node_1, node_2, [('string', 'string')])]) + workflow.run()