Skip to content

Commit

Permalink
Tidy up the setup instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
htwangtw committed Mar 24, 2023
1 parent 04e623a commit cadb13d
Show file tree
Hide file tree
Showing 11 changed files with 435 additions and 102 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ atlas:

data:
@echo "Download input data to build the report"
if [ ! -d inputs/denoise-metrics ]; then wget -c -O denoise-metrics.tar.gz "https://zenodo.org/record/7362211/files/denoise-metrics.tar.gz?download=1" && mkdir -p inputs && tar xf denoise-metrics.tar.gz -C inputs && rm denoise-metrics.tar.gz; fi
if [ ! -d inputs/denoise-metrics ]; then wget -c -O denoise-metrics.tar.gz "https://zenodo.org/record/7764979/files/denoise-metrics.tar.gz?download=1" && mkdir -p inputs && tar xf denoise-metrics.tar.gz -C inputs && rm denoise-metrics.tar.gz; fi

book: inputs/denoise-metrics
jb build content --all
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ make book
- `inputs/` is reserved to store data for building the JupyterBook.
To build the book, one will need all the metrics from the study.
The metrics are here:
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7221351.svg)](https://doi.org/10.5281/zenodo.7221351)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7764979.svg)](https://doi.org/10.5281/zenodo.7764979)

- Custom code is located in `fmriprep_denoise/`. This project is installable.

Expand Down
5 changes: 5 additions & 0 deletions content/docs/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,8 @@ I separate the template fetching from template flowset up as the computing node
```
If this step is computational too intensive, you can run it in on a computing node.

3. Calculate the centroid of the customised DiFuMo

```bash
python scripts/calculate_centroids.py
```
18 changes: 8 additions & 10 deletions fmriprep_denoise/visualization/mean_framewise_displacement.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def _statistic_report_group(dataset, baseline_group, data):
{i: {"t_stats": t_stats, "p_value": pval, "df": df}}
)

male = baseline[baseline['gender']==0]
female = baseline[baseline['gender']==1]
male = baseline[baseline["gender"] == 0]
female = baseline[baseline["gender"] == 1]

t_stats, pval, df = ttest_ind(
male["mean_framewise_displacement"],
Expand Down Expand Up @@ -73,8 +73,8 @@ def plot_stats(stats):
sns.set_palette("colorblind")
palette = sns.color_palette(n_colors=7)
colors_fd = {
'ds000228': [palette[0], palette[1]],
'ds000030': [palette[0]] + palette[2:5]
"ds000228": [palette[0], palette[1]],
"ds000030": [palette[0]] + palette[2:5],
}
colors_sex = palette[5:]
for ax, dataset in zip(axs[0], datasets):
Expand All @@ -93,7 +93,7 @@ def plot_stats(stats):
data=df,
ax=ax,
order=group_order[dataset],
palette=colors_fd[dataset]
palette=colors_fd[dataset],
)
ax.set_xticklabels(
group_order[dataset],
Expand Down Expand Up @@ -125,7 +125,7 @@ def plot_stats(stats):
df = df.rename(
columns={
"mean_framewise_displacement": "Mean Framewise Displacement (mm)",
"gender": "Sex"
"gender": "Sex",
}
)
sns.boxplot(
Expand All @@ -134,15 +134,13 @@ def plot_stats(stats):
data=df,
ax=ax,
order=["Male", "Female"],
palette=colors_sex
palette=colors_sex,
)
ax.set_xticklabels(
["Male", "Female"],
# rotation=45, ha="right", rotation_mode="anchor"
)
ax.set_title(
f"Sex difference in {datasets_baseline[dataset]}"
)
ax.set_title(f"Sex difference in {datasets_baseline[dataset]}")
# statistical annotation
max_value = df["Mean Framewise Displacement (mm)"].max()
notation = _get_pvalue_star(stats[dataset]["stats_sex"]["p_value"])
Expand Down
57 changes: 39 additions & 18 deletions fmriprep_denoise/visualization/motion_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,24 +90,20 @@ def plot_stats(data, measure):
ax=axs[i],
order=strategy_order,
ci=95,
palette=paired_palette
palette=paired_palette,
)
axs[i].set_title(dataset)
axs[i].set_ylim(measure["ylim"])
axs[i].set_xticklabels(
strategy_order, rotation=45, ha="right", rotation_mode="anchor"
)
for i, bar in enumerate(axs[i].patches):
if i > 0 and i % 2 == 0 and i!=8: # only give gsr hatch
bar.set_hatch('///')
if i > 0 and i % 2 == 0 and i != 8: # only give gsr hatch
bar.set_hatch("///")
labels = ["No GSR", "With GSR"]
hatches = ["", "///"]
handles = [
mpatches.Patch(
edgecolor='black',
facecolor='white',
hatch=h, label=l
)
mpatches.Patch(edgecolor="black", facecolor="white", hatch=h, label=l)
for h, l in zip(hatches, labels)
]
axs[1].legend(handles=handles)
Expand All @@ -116,19 +112,44 @@ def plot_stats(data, measure):

def plot_joint_scatter(path_root, dataset, fmriprep_version):
"""Joint scatter plot for mean frame wise displacement against network modularity."""
parcel = 'atlas-difumo_nroi-64'
path_data = path_root / dataset/ fmriprep_version/ f"dataset-{dataset}_{parcel}_modularity.tsv"
modularity = pd.read_csv(path_data, sep='\t', index_col=0)
path_data = path_root / dataset/ fmriprep_version/ f"dataset-{dataset}_desc-movement_phenotype.tsv"
motion = pd.read_csv(path_data, sep='\t', index_col=0)
parcel = "atlas-difumo_nroi-64"
path_data = (
path_root
/ dataset
/ fmriprep_version
/ f"dataset-{dataset}_{parcel}_modularity.tsv"
)
modularity = pd.read_csv(path_data, sep="\t", index_col=0)
path_data = (
path_root
/ dataset
/ fmriprep_version
/ f"dataset-{dataset}_desc-movement_phenotype.tsv"
)
motion = pd.read_csv(path_data, sep="\t", index_col=0)
data = pd.concat([modularity, motion.loc[modularity.index, :]], axis=1)

data = data.drop('groups', axis=1)
data.index.name ='participants'
data = data.drop("groups", axis=1)
data.index.name = "participants"
data = data.reset_index()
data = data.loc[:, ['participants', 'mean_framewise_displacement', 'baseline', 'scrubbing.2', 'scrubbing.2+gsr']]
data = data.melt(id_vars=['participants', 'mean_framewise_displacement'], var_name='Strategy', value_name='Modularity quality (a.u.)')
data = data.rename(columns={'mean_framewise_displacement': 'Mean Framewise Displacement (mm)'})
data = data.loc[
:,
[
"participants",
"mean_framewise_displacement",
"baseline",
"scrubbing.2",
"scrubbing.2+gsr",
],
]
data = data.melt(
id_vars=["participants", "mean_framewise_displacement"],
var_name="Strategy",
value_name="Modularity quality (a.u.)",
)
data = data.rename(
columns={"mean_framewise_displacement": "Mean Framewise Displacement (mm)"}
)

palette = sns.color_palette("colorblind", n_colors=3)
p = sns.jointplot(
Expand Down
96 changes: 61 additions & 35 deletions fmriprep_denoise/visualization/strategy_ranking.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,83 +7,109 @@


strategy_order = list(utils.GRID_LOCATION.values())
fmriprep_versions = ['fmriprep-20.2.1lts', 'fmriprep-20.2.5lts']
datasets = ['ds000228', 'ds000030']
fmriprep_versions = ["fmriprep-20.2.1lts", "fmriprep-20.2.5lts"]
datasets = ["ds000228", "ds000030"]

def load_data(path_root, datasets, criteria_name='stringent'):

def load_data(path_root, datasets, criteria_name="stringent"):
mean_total_ranking = []
for v in fmriprep_versions:
dof = degrees_of_freedom_loss.load_data(
path_root, datasets, criteria_name, v)
dof = degrees_of_freedom_loss.load_data(path_root, datasets, criteria_name, v)
for d in dof:
df_data = pd.DataFrame()
current_ranking = {}
for s in strategy_order:
m = dof[d].loc[:, (s, 'total')].mean()
m = dof[d].loc[:, (s, "total")].mean()
current_ranking[s] = [m]
order = pd.DataFrame(current_ranking).T.sort_values(0)
order.index = order.index.set_names(['strategy'])
order.index = order.index.set_names(["strategy"])
order = order.reset_index()
order['version'] = v
order['dataset'] = d
order['loss_df'] = list(range(1, order.shape[0] + 1))
order["version"] = v
order["dataset"] = d
order["loss_df"] = list(range(1, order.shape[0] + 1))
order = order.drop(0, axis=1)
df_data = pd.concat([df_data, order], axis=0)
df_data = df_data.set_index(['strategy', 'version', 'dataset'])
df_data = df_data.set_index(["strategy", "version", "dataset"])

metrics = pd.DataFrame()
for m in ['p_values', 'median', 'distance', 'modularity']:
for m in ["p_values", "median", "distance", "modularity"]:
data, measure = motion_metrics.load_data(
path_root, datasets, criteria_name, v, measure_name=m)
ascending = m != 'modularity'
r = data[d].groupby('strategy')[measure['label']].describe()['mean'].sort_values(ascending=ascending)
path_root, datasets, criteria_name, v, measure_name=m
)
ascending = m != "modularity"
r = (
data[d]
.groupby("strategy")[measure["label"]]
.describe()["mean"]
.sort_values(ascending=ascending)
)
rk = pd.DataFrame(list(range(1, 12)), index=r.index, columns=[m])
rk = rk.reset_index()
rk['version'] = v
rk['dataset'] = d
rk = rk.set_index(['strategy', 'version', 'dataset'])
rk["version"] = v
rk["dataset"] = d
rk = rk.set_index(["strategy", "version", "dataset"])
metrics = pd.concat([metrics, rk], axis=1)
df_data = pd.concat([df_data, metrics], axis=1)
mean_total_ranking.append(df_data)
mean_total_ranking = pd.concat(mean_total_ranking).reset_index()
mean_total_ranking = mean_total_ranking.melt(
id_vars=['strategy', 'version', 'dataset'],
var_name='metrics',
value_name='ranking')
return pd.pivot_table(mean_total_ranking, columns='strategy', index=['dataset', 'version', 'metrics'], fill_value='ranking')
id_vars=["strategy", "version", "dataset"],
var_name="metrics",
value_name="ranking",
)
return pd.pivot_table(
mean_total_ranking,
columns="strategy",
index=["dataset", "version", "metrics"],
fill_value="ranking",
)


def plot_ranking(data):
"""Plot the ranking of 4 selected metrics as bubble heatmaps."""
fig, axs = plt.subplots(2, 2, figsize=(11, 4.8), sharex=True, sharey=True, constrained_layout=True)
fig, axs = plt.subplots(
2, 2, figsize=(11, 4.8), sharex=True, sharey=True, constrained_layout=True
)
fig.suptitle(
"Ranking of all strategies per dataset per fMRIPrep version",
weight="heavy",
fontsize="x-large",
)
for i, d in enumerate(datasets):
for j, v in enumerate(fmriprep_versions):
mat = data.xs(d, level='dataset', drop_level=True)
mat = mat.xs(v, level='version', drop_level=True)
mat = data.xs(d, level="dataset", drop_level=True)
mat = mat.xs(v, level="version", drop_level=True)
mat = mat.droplevel(None, axis=1)
mat = mat.loc[['modularity', 'distance', 'median', 'p_values'], strategy_order]
mat = mat.loc[
["modularity", "distance", "median", "p_values"], strategy_order
]

x, y = np.meshgrid(np.arange(mat.shape[1]), np.arange(mat.shape[0]))

R = (12 - mat) / 12 / 2
circles = [plt.Circle((j,i), radius=r) for r, j, i in zip(R.values.flat, x.flat, y.flat)]
circles = [
plt.Circle((j, i), radius=r)
for r, j, i in zip(R.values.flat, x.flat, y.flat)
]
col = PatchCollection(circles, array=mat.values.flatten(), cmap="rocket_r")
axs[i, j].add_collection(col)

axs[i, j].set(xticks=np.arange(mat.shape[1]), yticks=np.arange(mat.shape[0]),
axs[i, j].set(
xticks=np.arange(mat.shape[1]),
yticks=np.arange(mat.shape[0]),
xticklabels=mat.columns,
yticklabels=['Average network modularity', 'DM-FC', 'QC-FC: median', 'QC-FC: significant']
)
axs[i, j].set_xticklabels(mat.columns, rotation=45, ha='right')
axs[i, j].set_xticks(np.arange(mat.shape[1] + 1)-0.5, minor=True)
axs[i, j].set_yticks(np.arange(mat.shape[0] + 1)-0.5, minor=True)
axs[i, j].grid(which='minor')
yticklabels=[
"Average network modularity",
"DM-FC",
"QC-FC: median",
"QC-FC: significant",
],
)
axs[i, j].set_xticklabels(mat.columns, rotation=45, ha="right")
axs[i, j].set_xticks(np.arange(mat.shape[1] + 1) - 0.5, minor=True)
axs[i, j].set_yticks(np.arange(mat.shape[0] + 1) - 0.5, minor=True)
axs[i, j].grid(which="minor")
axs[i, j].set_title(f"{d}: {v}")

fig.colorbar(col)
return fig
return fig
Loading

0 comments on commit cadb13d

Please sign in to comment.