Skip to content

Commit

Permalink
ENH: Produce all output types in nistats interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
effigies committed Apr 18, 2019
1 parent 53e2549 commit af35ba8
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 28 deletions.
90 changes: 63 additions & 27 deletions fitlins/interfaces/nistats.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ class FirstLevelModelInputSpec(BaseInterfaceInputSpec):


class FirstLevelModelOutputSpec(TraitedSpec):
contrast_maps = traits.List(File)
effect_maps = traits.List(File)
variance_maps = traits.List(File)
stat_maps = traits.List(File)
zscore_maps = traits.List(File)
pvalue_maps = traits.List(File)
contrast_metadata = traits.List(traits.Dict)
design_matrix = File()

Expand Down Expand Up @@ -99,25 +103,37 @@ def _run_interface(self, runtime):
mask=mask_file, smoothing_fwhm=smoothing_fwhm)
flm.fit(img, design_matrices=mat)

contrast_maps = []
effect_maps = []
variance_maps = []
stat_maps = []
zscore_maps = []
pvalue_maps = []
contrast_metadata = []
out_ents = self.inputs.contrast_info[0]['entities']
for name, weights, type in prepare_contrasts(
fname_fmt = os.path.join(runtime.cwd, '{}_{}.nii.gz')
for name, weights, contrast_type in prepare_contrasts(
self.inputs.contrast_info, mat.columns.tolist()):
es = flm.compute_contrast(
weights, type, output_type='effect_size')
es_fname = os.path.join(
runtime.cwd, '{}.nii.gz').format(name)
es.to_filename(es_fname)

contrast_maps.append(es_fname)
maps = flm.compute_contrast(weights, contrast_type, output_type='all')
contrast_metadata.append(
{'contrast': name,
'suffix': 'effect',
**out_ents}
)

self._results['contrast_maps'] = contrast_maps
for map_type, map_list in (('effect_size', effect_maps),
('effect_variance', variance_maps),
('z_score', zscore_maps),
('p_value', pvalue_maps),
('stat', stat_maps)):
fname = fname_fmt(name, map_type)
maps[map_type].to_filename(fname)
map_list.append(fname)

self._results['effect_maps'] = effect_maps
self._results['variance_maps'] = variance_maps
self._results['stat_maps'] = stat_maps
self._results['zscore_maps'] = zscore_maps
self._results['pvalue_maps'] = pvalue_maps
self._results['contrast_metadata'] = contrast_metadata

return runtime
Expand All @@ -130,7 +146,11 @@ class SecondLevelModelInputSpec(BaseInterfaceInputSpec):


class SecondLevelModelOutputSpec(TraitedSpec):
contrast_maps = traits.List(File)
effect_maps = traits.List(File)
variance_maps = traits.List(File)
stat_maps = traits.List(File)
zscore_maps = traits.List(File)
pvalue_maps = traits.List(File)
contrast_metadata = traits.List(traits.Dict)
contrast_matrix = File()

Expand All @@ -152,11 +172,14 @@ class SecondLevelModel(NistatsBaseInterface, SimpleInterface):

def _run_interface(self, runtime):
model = level2.SecondLevelModel()
contrast_maps = []
effect_maps = []
variance_maps = []
stat_maps = []
zscore_maps = []
pvalue_maps = []
contrast_metadata = []

entities = self.inputs.contrast_info[0]['entities'] # Same for all
out_ents = {'suffix': 'stat', **entities}
out_ents = self.inputs.contrast_info[0]['entities'] # Same for all
fname_fmt = os.path.join(runtime.cwd, '{}_{}.nii.gz')

# Only keep files which match all entities for contrast
stat_metadata = _flatten(self.inputs.stat_metadata)
Expand All @@ -168,23 +191,36 @@ def _run_interface(self, runtime):
filtered_files.append(f)
names.append(m['contrast'])

for name, weights, type in prepare_contrasts(self.inputs.contrast_info, names):
for name, weights, contrast_type in prepare_contrasts(self.inputs.contrast_info, names):
# Need to add F-test support for intercept (more than one column)
# Currently only taking 0th column as intercept (t-test)
weights = weights[0]
input = (np.array(filtered_files)[weights != 0]).tolist()
inputs = (np.array(filtered_files)[weights != 0]).tolist()
design_matrix = pd.DataFrame({'intercept': weights[weights != 0]})

model.fit(input, design_matrix=design_matrix)

stat = model.compute_contrast(second_level_stat_type=type)
stat_fname = os.path.join(runtime.cwd, '{}.nii.gz').format(name)
stat.to_filename(stat_fname)
model.fit(inputs, design_matrix=design_matrix)

contrast_maps.append(stat_fname)
contrast_metadata.append({'contrast': name, **out_ents})

self._results['contrast_maps'] = contrast_maps
maps = model.compute_contrast(second_level_stat_type=contrast_type,
output_type='all')
contrast_metadata.append(
{'contrast': name,
'suffix': 'stat',
**out_ents})

for map_type, map_list in (('effect_size', effect_maps),
('effect_variance', variance_maps),
('z_score', zscore_maps),
('p_value', pvalue_maps),
('stat', stat_maps)):
fname = fname_fmt(name, map_type)
maps[map_type].to_filename(fname)
map_list.append(fname)

self._results['effect_maps'] = effect_maps
self._results['variance_maps'] = variance_maps
self._results['stat_maps'] = stat_maps
self._results['zscore_maps'] = zscore_maps
self._results['pvalue_maps'] = pvalue_maps
self._results['contrast_metadata'] = contrast_metadata

return runtime
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ nilearn>=0.4.0
pandas>=0.19
nipype>=1.1.6
pybids>=0.8.0
git+https://github.com/nistats/nistats.git@009ce3fddb3dd01e82bca3ad7d2cdbeece0138f2#egg=nistats
git+https://github.com/nistats/nistats.git@51414b8a2bb48dde79de6570074354dcb013c9ae#egg=nistats

0 comments on commit af35ba8

Please sign in to comment.