Skip to content

Commit 295c9ab

Browse files
committed
Fix up code.
1 parent 6533ba2 commit 295c9ab

File tree

2 files changed

+165
-10
lines changed

2 files changed

+165
-10
lines changed

analysis/compare_tedana_aroma.py

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
"""Compare the results of TEDANA and AROMA."""
2+
3+
import os
4+
from glob import glob
5+
6+
import matplotlib.pyplot as plt
7+
import pandas as pd
8+
import seaborn as sns
9+
10+
11+
if __name__ == "__main__":
12+
in_dir = "/cbica/projects/pafin/derivatives/tedana+aroma"
13+
out_dir = "../figures"
14+
15+
files = sorted(
16+
glob(
17+
os.path.join(
18+
in_dir,
19+
"sub-*",
20+
"ses-1",
21+
"func",
22+
"*_desc-tedana+aroma_metrics.tsv",
23+
)
24+
)
25+
)
26+
group_df = pd.DataFrame(
27+
columns=[
28+
"file",
29+
"subject",
30+
"denoising",
31+
"n_components",
32+
"n_accepted",
33+
"n_rejected_aroma",
34+
"n_rejected_tedana",
35+
"n_rejected_both",
36+
"varex_accepted",
37+
"varex_rejected_aroma",
38+
"varex_rejected_tedana",
39+
"varex_rejected_both",
40+
"varex_unmodeled",
41+
],
42+
)
43+
for file in files:
44+
df = pd.read_table(file)
45+
subject = os.path.basename(file).split("_")[0]
46+
file_dict = {
47+
"file": os.path.basename(file),
48+
"subject": subject,
49+
"denoising": "NORDIC" if "nordic" in os.path.basename(file) else "None",
50+
"n_components": df.shape[0],
51+
"n_accepted": df[df["classification"] == "accepted"].shape[0],
52+
"varex_accepted": df[df["classification"] == "accepted"][
53+
"total_variance_explained"
54+
].sum(),
55+
"varex_unmodeled": 1 - df["total_variance_explained"].sum(),
56+
}
57+
58+
rejected_df = df.loc[df["classification"] == "rejected"]
59+
rejected_both_df = rejected_df.loc[
60+
rejected_df["classification_tags"].str.contains("TEDANA")
61+
& rejected_df["classification_tags"].str.contains("AROMA")
62+
]
63+
rejected_aroma_df = rejected_df.loc[
64+
rejected_df["classification_tags"].str.contains("AROMA")
65+
& ~rejected_df["classification_tags"].str.contains("TEDANA")
66+
]
67+
rejected_tedana_df = rejected_df.loc[
68+
~rejected_df["classification_tags"].str.contains("AROMA")
69+
& rejected_df["classification_tags"].str.contains("TEDANA")
70+
]
71+
72+
file_dict["n_rejected_both"] = rejected_both_df.shape[0]
73+
file_dict["n_rejected_aroma"] = rejected_aroma_df.shape[0]
74+
file_dict["n_rejected_tedana"] = rejected_tedana_df.shape[0]
75+
file_dict["varex_rejected_both"] = rejected_both_df["total_variance_explained"].sum()
76+
file_dict["varex_rejected_aroma"] = rejected_aroma_df["total_variance_explained"].sum()
77+
file_dict["varex_rejected_tedana"] = rejected_tedana_df["total_variance_explained"].sum()
78+
79+
group_df = group_df.append(file_dict, ignore_index=True)
80+
81+
group_df.to_csv("../data/bold_denoising_metrics.tsv", index=False, sep="\t")
82+
83+
# Boxplot of variance explained, organized as "accepted", "rejected by AROMA",
84+
# "rejected by TEDANA", "rejected by both", "unmodeled" across runs
85+
df_varex = group_df.melt(
86+
id_vars=["subject", "denoising"],
87+
value_vars=[
88+
"varex_accepted",
89+
"varex_rejected_aroma",
90+
"varex_rejected_tedana",
91+
"varex_rejected_both",
92+
"varex_unmodeled",
93+
],
94+
value_name="Variance Explained",
95+
var_name="Classification",
96+
)
97+
98+
sns.set_theme(style="ticks")
99+
f, ax = plt.subplots(figsize=(7, 6))
100+
sns.boxenplot(
101+
df_varex,
102+
x="Variance Explained",
103+
y="Classification",
104+
hue="denoising",
105+
palette="vlag",
106+
)
107+
ax.xaxis.grid(True)
108+
ax.set_xlim(0, 1)
109+
ax.set(ylabel="")
110+
sns.despine(trim=True, left=True)
111+
f.savefig(os.path.join(out_dir, "bold_denoising_variance_explained.png"))
112+
plt.close()
113+
114+
# Boxplot of number of components, organized as "accepted", "rejected by AROMA",
115+
# "rejected by TEDANA", "rejected by both" across runs
116+
df_ncomps = group_df.melt(
117+
id_vars=["subject", "denoising"],
118+
value_vars=[
119+
"n_accepted",
120+
"n_rejected_aroma",
121+
"n_rejected_tedana",
122+
"n_rejected_both",
123+
],
124+
value_name="Number of Components",
125+
var_name="Classification",
126+
)
127+
128+
sns.set_theme(style="ticks")
129+
f, ax = plt.subplots(figsize=(7, 6))
130+
sns.boxenplot(
131+
df_ncomps,
132+
x="Number of Components",
133+
y="Classification",
134+
hue="denoising",
135+
palette="vlag",
136+
)
137+
ax.xaxis.grid(True)
138+
ax.set_xlim(0, None)
139+
ax.set(ylabel="")
140+
sns.despine(trim=True, left=True)
141+
f.savefig(os.path.join(out_dir, "bold_denoising_n_components.png"))
142+
plt.close()

processing/run_tedana.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -262,22 +262,35 @@ def run_tedana_aroma(raw_dir, aroma_dir, tedana_out_dir, tedana_aroma_out_dir):
262262
for i_row, aroma_row in aroma_df.iterrows():
263263
aroma_clf = aroma_row["classification"]
264264
tedana_rationale = tedana_df.loc[i_row, "classification_tags"]
265+
tedana_rationales = tedana_rationale.split(";")
265266

267+
aroma_rationales = []
266268
if aroma_clf == "rejected":
267269
aroma_rationales = aroma_row["rationale"].split(";")
268-
aroma_rationales = [
269-
f"AROMA {aroma_rationale}" for aroma_rationale in aroma_rationales
270-
]
271-
aroma_rationale = ";".join(aroma_rationales)
272-
tedana_rationale += f";{aroma_rationale}"
273-
rationales = tedana_rationale.split(";")
274-
rationales = [
275-
r for r in rationales if r not in ["low variance", "accept borderline"]
270+
aroma_rationales = [f"AROMA {rationale}" for rationale in aroma_rationales]
271+
272+
# Remove tags equivalent to "ignored" classification, for MIR
273+
tedana_rationales = [
274+
r for r in tedana_rationales if r not in ["low variance", "accept borderline"]
276275
]
277-
tedana_rationale = ";".join(rationales)
278276

279277
tedana_df.iloc[i_row, "classification"] = "rejected"
280-
tedana_df.iloc[i_row, "classification_tags"] = tedana_rationale
278+
279+
tedana_rationales = [f"TEDANA {rationale}" for rationale in tedana_rationales]
280+
rationales = tedana_rationales + aroma_rationales
281+
tedana_df.iloc[i_row, "classification_tags"] = ";".join(rationales)
282+
283+
# Add other columns from aroma_df to tedana_df
284+
other_cols = [
285+
"edge_fract",
286+
"csf_fract",
287+
"max_RP_corr",
288+
"HFC",
289+
"model_variance_explained",
290+
"total_variance_explained",
291+
]
292+
for col in other_cols:
293+
tedana_df.loc[i_row, col] = aroma_row[col]
281294

282295
# Save the combined classifications
283296
tedana_aroma_run_out_dir = os.path.join(

0 commit comments

Comments
 (0)