Skip to content

Commit 204cb1d

Browse files
committed
more concise and flexible parameter passing, increased parametrization
1 parent ff36588 commit 204cb1d

File tree

4 files changed

+38
-31
lines changed

4 files changed

+38
-31
lines changed

nipype/interfaces/fsl/model.py

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class Level1DesignInputSpec(BaseInterfaceInputSpec):
4141
traits.Dict(traits.Enum(
4242
'dgamma'), traits.Dict(traits.Enum('derivs'), traits.Bool)),
4343
traits.Dict(traits.Enum('gamma'), traits.Dict(
44-
traits.Enum('derivs'), traits.Bool)),
44+
traits.Enum('derivs', 'gammasigma', 'gammadelay'))),
45+
traits.Dict(traits.Enum('none'), traits.Dict()),
4546
traits.Dict(traits.Enum('none'), traits.Enum(None)),
4647
mandatory=True,
4748
desc=("name of basis function and options e.g., "
@@ -122,7 +123,7 @@ def _create_ev_file(self, evfname, evinfo):
122123
f.close()
123124

124125
def _create_ev_files(
125-
self, cwd, runinfo, runidx, usetd, contrasts,
126+
self, cwd, runinfo, runidx, ev_parameters, contrasts,
126127
do_tempfilter, basis_key):
127128
"""Creates EV files from condition and regressor information.
128129
@@ -134,16 +135,25 @@ def _create_ev_files(
134135
about events and other regressors.
135136
runidx : int
136137
Index to run number
137-
usetd : int
138-
Whether or not to use temporal derivatives for
139-
conditions
138+
ev_parameters : dict
139+
A dictionary containing the model parameters for the
140+
given design type.
140141
contrasts : list of lists
141142
Information on contrasts to be evaluated
142143
"""
143144
conds = {}
144145
evname = []
145146
if basis_key == "dgamma":
146147
basis_key = "hrf"
148+
elif basis_key == "gamma":
149+
try:
150+
_ = ev_parameters['gammasigma']
151+
except KeyError:
152+
ev_parameters['gammasigma'] = 3
153+
try:
154+
_ = ev_parameters['gammadelay']
155+
except KeyError:
156+
ev_parameters['gammadelay'] = 6
147157
ev_template = load_template('feat_ev_'+basis_key+'.tcl')
148158
ev_none = load_template('feat_ev_none.tcl')
149159
ev_ortho = load_template('feat_ev_ortho.tcl')
@@ -174,22 +184,18 @@ def _create_ev_files(
174184
evinfo.insert(j, [onset, cond['duration'][j], amp])
175185
else:
176186
evinfo.insert(j, [onset, cond['duration'][0], amp])
177-
if basis_key == "none":
178-
ev_txt += ev_template.substitute(
179-
ev_num=num_evs[0],
180-
ev_name=name,
181-
tempfilt_yn=do_tempfilter,
182-
cond_file=evfname)
187+
ev_parameters['ev_num'] = num_evs[0]
188+
ev_parameters['ev_name'] = name
189+
ev_parameters['tempfilt_yn'] = do_tempfilter
190+
ev_parameters['cond_file'] = evfname
191+
try:
192+
ev_parameters['temporalderiv'] = ev_parameters.pop('derivs')
193+
except KeyError:
194+
pass
183195
else:
184-
ev_txt += ev_template.substitute(
185-
ev_num=num_evs[0],
186-
ev_name=name,
187-
tempfilt_yn=do_tempfilter,
188-
temporalderiv=usetd,
189-
cond_file=evfname)
190-
if usetd:
191196
evname.append(name + 'TD')
192197
num_evs[1] += 1
198+
ev_txt += ev_template.substitute(ev_parameters)
193199
elif field == 'regress':
194200
evinfo = [[j] for j in cond['val']]
195201
ev_txt += ev_none.substitute(ev_num=num_evs[0],
@@ -297,10 +303,8 @@ def _run_interface(self, runtime):
297303
prewhiten = 0
298304
if isdefined(self.inputs.model_serial_correlations):
299305
prewhiten = int(self.inputs.model_serial_correlations)
300-
usetd = 0
301306
basis_key = list(self.inputs.bases.keys())[0]
302-
if basis_key in ['dgamma', 'gamma']:
303-
usetd = int(self.inputs.bases[basis_key]['derivs'])
307+
ev_parameters = dict(self.inputs.bases[basis_key])
304308
session_info = self._format_session_info(self.inputs.session_info)
305309
func_files = self._get_func_files(session_info)
306310
n_tcon = 0
@@ -316,7 +320,7 @@ def _run_interface(self, runtime):
316320
do_tempfilter = 1
317321
if info['hpf'] == np.inf:
318322
do_tempfilter = 0
319-
num_evs, cond_txt = self._create_ev_files(cwd, info, i, usetd,
323+
num_evs, cond_txt = self._create_ev_files(cwd, info, i, ev_parameters,
320324
self.inputs.contrasts,
321325
do_tempfilter, basis_key)
322326
nim = load(func_files[i])
@@ -348,10 +352,8 @@ def _list_outputs(self):
348352
cwd = os.getcwd()
349353
outputs['fsf_files'] = []
350354
outputs['ev_files'] = []
351-
usetd = 0
352355
basis_key = list(self.inputs.bases.keys())[0]
353-
if basis_key in ['dgamma', 'gamma']:
354-
usetd = int(self.inputs.bases[basis_key]['derivs'])
356+
ev_parameters = dict(self.inputs.bases[basis_key])
355357
for runno, runinfo in enumerate(
356358
self._format_session_info(self.inputs.session_info)):
357359
outputs['fsf_files'].append(os.path.join(cwd, 'run%d.fsf' % runno))
@@ -365,7 +367,11 @@ def _list_outputs(self):
365367
cwd, 'ev_%s_%d_%d.txt' % (name, runno,
366368
len(evname)))
367369
if field == 'cond':
368-
if usetd:
370+
try:
371+
ev_parameters['temporalderiv'] = ev_parameters.pop('derivs')
372+
except KeyError:
373+
pass
374+
else:
369375
evname.append(name + 'TD')
370376
outputs['ev_files'][runno].append(
371377
os.path.join(cwd, evfname))

nipype/interfaces/fsl/tests/test_Level1Design_functions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ def test_level1design():
1010
'duration':[10, 10]}],regress=[])
1111
runidx = 0
1212
contrasts = Undefined
13-
usetd = False
1413
do_tempfilter = False
14+
ev_parameters = {"temporalderiv":False}
1515
for key, val in [('hrf', 3), ('dgamma', 3), ('gamma', 2), ('none', 0)]:
1616
output_num, output_txt = Level1Design._create_ev_files(l, os.getcwd(),
1717
runinfo, runidx,
18-
usetd, contrasts,
18+
ev_parameters,
19+
contrasts,
1920
do_tempfilter,
2021
key)
2122
assert "set fmri(convolve1) {0}".format(val) in output_txt

nipype/interfaces/script_templates/feat_ev_gamma.tcl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ set fmri(deriv_yn$ev_num) $temporalderiv
3333
set fmri(custom$ev_num) "$cond_file"
3434

3535
# Gamma sigma
36-
set fmri(gammasigma$ev_num) 3
36+
set fmri(gammasigma$ev_num) $gammasigma
3737

3838
# Gamma delay
39-
set fmri(gammadelay$ev_num) 6
39+
set fmri(gammadelay$ev_num) $gammadelay

nipype/interfaces/script_templates/feat_ev_none.tcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ set fmri(evtitle$ev_num) "$ev_name"
88
# 3 : Custom (3 column format)
99
# 4 : Interaction
1010
# 10 : Empty (all zeros)
11-
set fmri(shape$ev_num) 2
11+
set fmri(shape$ev_num) 3
1212

1313
# Convolution
1414
# 0 : None

0 commit comments

Comments
 (0)