Skip to content

Commit

Permalink
FIX: reports were displaying incorrect plots; default contrast_matrix…
Browse files Browse the repository at this point in the history
… plot to vertical
  • Loading branch information
shashankbansal6 committed Oct 21, 2021
1 parent 4a64aab commit 7c94302
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 38 deletions.
11 changes: 5 additions & 6 deletions fitlins/interfaces/afni.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,14 +260,13 @@ def save_remlfit_results(self, maps, contrasts, runtime):
clean_vol_labels.append(x.rsplit('_', 1)[0])
else:
clean_vol_labels.append(x)
for (name, weights, contrast_test) in contrasts:
for (name, weights, cont_ents, contrast_test) in contrasts:
contrast_metadata.append(
{
"name": name,
"contrast": name,
"name": self.inputs.spec['name'],
"level": self.inputs.spec['level'],
"stat": contrast_test,
**self.inputs.spec['entities'],
**cont_ents,
}
)

Expand Down Expand Up @@ -309,7 +308,7 @@ def save_remlfit_results(self, maps, contrasts, runtime):
map_list.append(fname)

# calculate effect variance
for (name, weights, contrast_type), effect_fname, stat_fname in zip(contrasts, effect_maps, stat_maps):
for (name, weights, contrast_entities, contrast_type), effect_fname, stat_fname in zip(contrasts, effect_maps, stat_maps):
map_type = "effect_variance"
effect_img = nb.load(effect_fname)
effect = effect_img.get_fdata()
Expand Down Expand Up @@ -423,7 +422,7 @@ def get_afni_design_matrix(design, contrasts, stim_labels, t_r):

def create_glt_test_info(design, contrasts):

labels, wts_arrays, test_vals = zip(*contrasts)
labels, wts_arrays, cont_ents, test_vals = zip(*contrasts)

# Start defining a list containing the rows for the glt values in the
# afni design matrix header:
Expand Down
10 changes: 6 additions & 4 deletions fitlins/interfaces/bids.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ def _load_graph(self, runtime, graph, node=None, inputs=None, **filters):
'entities': spec.entities,
'level': spec.node.level,
'X': spec.X,
'name': spec.node.name,
'model': spec.node.model,
# Metadata is only used in higher level models; save space
'metadata': spec.metadata if spec.node.level != "run" else None,
Expand Down Expand Up @@ -454,10 +455,11 @@ def _list_outputs(self):
# In some instances, name/contrast could have the following
# format (eg: gain.Range, gain.EqualIndifference).
# This prevents issues when creating/searching files for the report
ents.update({k: str(v).replace('.', '_')
for k, v in ents.items()
if k in ("name", "contrast")})
ents = {k: snake_to_camel(str(v)) for k, v in ents.items()}
for k in ents:
if k in ("name", "contrast"):
ents.update({k: str(ents[k]).replace('.', '_')})
ents.update({k: str(ents[k]).replace('-', '_')})
ents.update({k: snake_to_camel(str(ents[k]))})

out_fname = os.path.join(
base_dir, layout.build_path(
Expand Down
15 changes: 7 additions & 8 deletions fitlins/interfaces/nistats.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def prepare_contrasts(contrasts, all_regressors):
indices = sorter[np.searchsorted(all_regressors, conds, sorter=sorter)]
weights[:, indices] = in_weights

out_contrasts.append((contrast_info['name'], weights, contrast_info['test']))
out_contrasts.append((contrast_info['name'], weights, contrast_info['entities'].copy(), contrast_info['test']))

return out_contrasts

Expand Down Expand Up @@ -225,15 +225,14 @@ def _run_interface(self, runtime):
zscore_maps = []
pvalue_maps = []
contrast_metadata = []
for name, weights, contrast_test in prepare_contrasts(
for name, weights, cont_ents, contrast_test in prepare_contrasts(
spec['contrasts'], mat.columns):
contrast_metadata.append(
{
"name": name,
"contrast": name,
"name": spec['name'],
"level": spec['level'],
"stat": contrast_test,
**out_ents,
**cont_ents,
}
)
if is_cifti:
Expand Down Expand Up @@ -353,13 +352,13 @@ def _run_interface(self, runtime):
model = level2.SecondLevelModel(smoothing_fwhm=smoothing_fwhm)
model.fit(filtered_effects, design_matrix=spec['X'])

for name, weights, contrast_test in contrasts:
for name, weights, cont_ents, contrast_test in contrasts:
contrast_metadata.append(
{
"name": name,
"name": spec['name'],
"level": spec['level'],
"stat": contrast_test,
**out_ents,
**cont_ents,
}
)

Expand Down
2 changes: 1 addition & 1 deletion fitlins/interfaces/visualizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def _visualize(self, data, out_name):

class ContrastMatrixPlotInputSpec(VisualizationInputSpec):
contrast_info = traits.List(traits.Any)
orientation = traits.Enum('horizontal', 'vertical', usedefault=True,
orientation = traits.Enum('vertical', 'horizontal', usedefault=True,
desc='Display orientation of contrast matrix')


Expand Down
46 changes: 27 additions & 19 deletions fitlins/viz/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,36 +71,44 @@ def build_report_dict(deriv_dir, work_dir, graph):
report_node = {'name': node, 'analyses': []}
report['nodes'].append(report_node)
for coll in colls:
ents = coll.entities.copy()
ents["level"] = coll.node.level
contrasts = coll.contrasts
for key in ('datatype', 'desc', 'suffix', 'extension'):
ents.pop(key, None)
for key in graph.layout.get_entities(metadata=True):
ents.pop(key, None)


analysis_dict = {
'entities': {
key: val
for key, val in ents.items()
if key in ('subject', 'session', 'task', 'run') and val},
'contrasts': []
'entities': {},
'contrasts': []
}

for contrast_info in contrasts:
glassbrain = []
if coll.node.level != 'run':
cname = snake_to_camel((contrast_info.name).replace('.', '_'))
ents["name"] = cname
ents.pop("contrast", None)
cents = contrast_info.entities.copy()
cents["level"] = coll.node.level
cents["name"] = coll.node.name

contrasts = coll.contrasts
for key in ('datatype', 'desc', 'suffix', 'extension'):
cents.pop(key, None)
for key in graph.layout.get_entities(metadata=True):
cents.pop(key, None)

glassbrain = fl_layout.get(suffix='ortho', extension='png', **ents)
for k in cents:
if k in ("name", "contrast"):
cents.update({k: str(cents[k]).replace('.', '_')})
cents.update({k: str(cents[k]).replace('-', '_')})
cents.update({k: snake_to_camel(str(cents[k]))})

glassbrain = fl_layout.get(suffix='ortho', extension='png', **cents)

analysis_dict['entities'] = {
key: val for key, val in cents.items()
if key in ('subject', 'session', 'task', 'run') and val
}

analysis_dict['contrasts'].append(
{'name': displayify(contrast_info.name),
'glassbrain': glassbrain[0].path if glassbrain else None}
)


ents = coll.entities.copy()
report_node['analyses'].append(analysis_dict)
# Space doesn't apply to design/contrast matrices, or resolution
for k in ['space', 'res']:
Expand Down

0 comments on commit 7c94302

Please sign in to comment.