Skip to content

Commit 59a38db

Browse files
Update all measurements for the inner ear analysis
1 parent e0dfda6 commit 59a38db

File tree

5 files changed

+131
-84
lines changed

5 files changed

+131
-84
lines changed

scripts/inner_ear/analysis/analyze_distances.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def _plot_all(distances):
3232
plt.show()
3333

3434

35-
# TODO rename the method names.
3635
# We only care about the following distances:
3736
# - MP-V -> PD, AZ (Boundary)
3837
# - Docked-V -> PD, AZ
@@ -98,7 +97,7 @@ def _plot(pool_name, distance_col, structure_name, ax):
9897

9998

10099
def for_tomos_with_annotation(plot_all=True):
101-
manual_assignments, semi_automatic_assignments, automatic_assignments = get_measurements_with_annotation()
100+
manual_assignments, semi_automatic_assignments, proofread_assignments = get_measurements_with_annotation()
102101

103102
manual_distances = manual_assignments[
104103
["tomogram", "pool", "ribbon_distance [nm]", "pd_distance [nm]", "boundary_distance [nm]"]
@@ -110,38 +109,38 @@ def for_tomos_with_annotation(plot_all=True):
110109
]
111110
semi_automatic_distances["approach"] = ["semi_automatic"] * len(semi_automatic_distances)
112111

113-
automatic_distances = automatic_assignments[
112+
proofread_distances = proofread_assignments[
114113
["tomogram", "pool", "ribbon_distance [nm]", "pd_distance [nm]", "boundary_distance [nm]"]
115114
]
116-
automatic_distances["approach"] = ["automatic"] * len(automatic_distances)
115+
proofread_distances["approach"] = ["proofread"] * len(proofread_distances)
117116

118-
distances = pd.concat([manual_distances, semi_automatic_distances, automatic_distances])
117+
distances = pd.concat([manual_distances, semi_automatic_distances, proofread_distances])
119118
if plot_all:
120-
distances.to_excel("./results/distances_with_manual_annotations.xlsx", index=False)
119+
distances.to_excel("./results/distances_tomos_with_manual_annotations.xlsx", index=False)
121120
_plot_all(distances)
122121
else:
123-
_plot_selected(distances, save_path="./results/selected_distances_manual_annotations.xlsx")
122+
_plot_selected(distances, save_path="./results/selected_distances_tomos_with_manual_annotations.xlsx")
124123

125124

126125
def for_all_tomos(plot_all=True):
127-
semi_automatic_assignments, automatic_assignments = get_all_measurements()
126+
semi_automatic_assignments, proofread_assignments = get_all_measurements()
128127

129128
semi_automatic_distances = semi_automatic_assignments[
130129
["tomogram", "pool", "ribbon_distance [nm]", "pd_distance [nm]", "boundary_distance [nm]"]
131130
]
132131
semi_automatic_distances["approach"] = ["semi_automatic"] * len(semi_automatic_distances)
133132

134-
automatic_distances = automatic_assignments[
133+
proofread_distances = proofread_assignments[
135134
["tomogram", "pool", "ribbon_distance [nm]", "pd_distance [nm]", "boundary_distance [nm]"]
136135
]
137-
automatic_distances["approach"] = ["automatic"] * len(automatic_distances)
136+
proofread_distances["approach"] = ["proofread"] * len(proofread_distances)
138137

139-
distances = pd.concat([semi_automatic_distances, automatic_distances])
138+
distances = pd.concat([semi_automatic_distances, proofread_distances])
140139
if plot_all:
141-
distances.to_excel("./results/distances_all_tomograms.xlsx", index=False)
140+
distances.to_excel("./results/distances_all_tomos.xlsx", index=False)
142141
_plot_all(distances)
143142
else:
144-
_plot_selected(distances, save_path="./results/selected_distances_all_tomograms.xlsx")
143+
_plot_selected(distances, save_path="./results/selected_distances_all_tomos.xlsx")
145144

146145

147146
def main():

scripts/inner_ear/analysis/analyze_vesicle_diameters.py

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from synaptic_reconstruction.imod.export import load_points_from_imodinfo
1111
from synaptic_reconstruction.file_utils import get_data_path
1212

13+
from common import get_finished_tomos
14+
1315
sys.path.append("../processing")
1416

1517

16-
def aggregate_radii(data_root, table, save_path, get_tab):
18+
def aggregate_radii(data_root, table, save_path, get_tab, include_names):
1719
if os.path.exists(save_path):
1820
return
1921

@@ -24,6 +26,14 @@ def aggregate_radii(data_root, table, save_path, get_tab):
2426
continue
2527

2628
tomo_name = os.path.relpath(folder, os.path.join(data_root, "Electron-Microscopy-Susi/Analyse"))
29+
if (
30+
tomo_name in ("WT strong stim/Mouse 1/modiolar/1", "WT strong stim/Mouse 1/modiolar/2") and
31+
(row["EM alt vs. Neu"] == "neu")
32+
):
33+
continue
34+
if tomo_name not in include_names:
35+
continue
36+
2737
tab_path = get_tab(folder)
2838
if tab_path is None:
2939
continue
@@ -38,7 +48,7 @@ def aggregate_radii(data_root, table, save_path, get_tab):
3848
radius_table.to_excel(save_path, index=False)
3949

4050

41-
def aggregate_radii_imod(data_root, table, save_path):
51+
def aggregate_radii_imod(data_root, table, save_path, include_names):
4252
if os.path.exists(save_path):
4353
return
4454

@@ -49,6 +59,15 @@ def aggregate_radii_imod(data_root, table, save_path):
4959
continue
5060

5161
tomo_name = os.path.relpath(folder, os.path.join(data_root, "Electron-Microscopy-Susi/Analyse"))
62+
tomo_name = os.path.relpath(folder, os.path.join(data_root, "Electron-Microscopy-Susi/Analyse"))
63+
if (
64+
tomo_name in ("WT strong stim/Mouse 1/modiolar/1", "WT strong stim/Mouse 1/modiolar/2") and
65+
(row["EM alt vs. Neu"] == "neu")
66+
):
67+
continue
68+
if tomo_name not in include_names:
69+
continue
70+
5271
annotation_folder = os.path.join(folder, "manuell")
5372
if not os.path.exists(annotation_folder):
5473
annotation_folder = os.path.join(folder, "Manuell")
@@ -84,7 +103,7 @@ def aggregate_radii_imod(data_root, table, save_path):
84103
radius_table.to_excel(save_path, index=False)
85104

86105

87-
def get_tab_automatic(folder):
106+
def get_tab_semi_automatic(folder):
88107
tab_name = "measurements_uncorrected_assignments.xlsx"
89108
res_path = os.path.join(folder, "korrektur", tab_name)
90109
if not os.path.exists(res_path):
@@ -94,7 +113,7 @@ def get_tab_automatic(folder):
94113
return res_path
95114

96115

97-
def get_tab_semi_automatic(folder):
116+
def get_tab_proofread(folder):
98117
tab_name = "measurements.xlsx"
99118
res_path = os.path.join(folder, "korrektur", tab_name)
100119
if not os.path.exists(res_path):
@@ -121,11 +140,22 @@ def main():
121140
table_path = os.path.join(data_root, "Electron-Microscopy-Susi", "Übersicht.xlsx")
122141
table = parse_table(table_path, data_root)
123142

124-
# TODO get the radii from imod
125-
aggregate_radii(data_root, table, save_path="./results/vesicle_radii_automatic.xlsx", get_tab=get_tab_automatic)
126-
aggregate_radii(data_root, table, save_path="./results/vesicle_radii_semi_automatic.xlsx", get_tab=get_tab_semi_automatic) # noqa
127-
aggregate_radii(data_root, table, save_path="./results/vesicle_radii_manual.xlsx", get_tab=get_tab_manual)
128-
aggregate_radii_imod(data_root, table, save_path="./results/vesicle_radii_imod.xlsx")
143+
all_tomos = get_finished_tomos()
144+
aggregate_radii(
145+
data_root, table, save_path="./results/vesicle_radii_semi_automatic.xlsx", get_tab=get_tab_semi_automatic,
146+
include_names=all_tomos
147+
)
148+
149+
aggregate_radii(
150+
data_root, table, save_path="./results/vesicle_radii_proofread.xlsx", get_tab=get_tab_proofread,
151+
include_names=all_tomos
152+
)
153+
154+
# aggregate_radii(data_root, table, save_path="./results/vesicle_radii_manual.xlsx", get_tab=get_tab_manual)
155+
aggregate_radii_imod(
156+
data_root, table, save_path="./results/vesicle_radii_manual.xlsx",
157+
include_names=all_tomos
158+
)
129159

130160

131161
if __name__ == "__main__":

scripts/inner_ear/analysis/analyze_vesicle_pools.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,68 +35,67 @@ def plot_pools(data, errors):
3535

3636

3737
def for_tomos_with_annotation():
38-
manual_assignments, semi_automatic_assignments, automatic_assignments = get_measurements_with_annotation()
38+
manual_assignments, semi_automatic_assignments, proofread_assignments = get_measurements_with_annotation()
3939

4040
manual_counts = manual_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
4141
semi_automatic_counts = semi_automatic_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
42-
automatic_counts = automatic_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
42+
proofread_counts = proofread_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
4343

4444
manual_stats = manual_counts.agg(["mean", "std"]).transpose().reset_index()
4545
semi_automatic_stats = semi_automatic_counts.agg(["mean", "std"]).transpose().reset_index()
46-
automatic_stats = automatic_counts.agg(["mean", "std"]).transpose().reset_index()
46+
proofread_stats = proofread_counts.agg(["mean", "std"]).transpose().reset_index()
4747

4848
data = pd.DataFrame({
4949
"Pool": manual_stats["pool"],
5050
"Semi-automatic": semi_automatic_stats["mean"],
51-
"Automatic": automatic_stats["mean"],
51+
"Proofread": proofread_stats["mean"],
5252
"Manual": manual_stats["mean"],
5353
})
5454
errors = pd.DataFrame({
5555
"Pool": manual_stats["pool"],
5656
"Semi-automatic": semi_automatic_stats["std"],
57-
"Automatic": automatic_stats["std"],
57+
"Proofread": proofread_stats["std"],
5858
"Manual": manual_stats["std"],
5959
})
6060

6161
plot_pools(data, errors)
6262

63-
output_path = "./results/vesicle_pools_with_manual_annotations.xlsx"
63+
output_path = "./results/vesicle_pools_tomos_with_manual_annotations.xlsx"
6464
data.to_excel(output_path, index=False, sheet_name="Average")
6565
with pd.ExcelWriter(output_path, engine="openpyxl", mode="a") as writer:
6666
errors.to_excel(writer, sheet_name="StandardDeviation", index=False)
6767

6868

6969
def for_all_tomos():
70-
semi_automatic_assignments, automatic_assignments = get_all_measurements()
70+
semi_automatic_assignments, proofread_assignments = get_all_measurements()
7171

72-
automatic_counts = automatic_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
73-
automatic_stats = automatic_counts.agg(["mean", "std"]).transpose().reset_index()
72+
proofread_counts = proofread_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
73+
proofread_stats = proofread_counts.agg(["mean", "std"]).transpose().reset_index()
7474

7575
semi_automatic_counts = semi_automatic_assignments.groupby(["tomogram", "pool"]).size().unstack(fill_value=0)
7676
semi_automatic_stats = semi_automatic_counts.agg(["mean", "std"]).transpose().reset_index()
7777

7878
data = pd.DataFrame({
79-
"Pool": automatic_stats["pool"],
79+
"Pool": proofread_stats["pool"],
8080
"Semi-automatic": semi_automatic_stats["mean"],
81-
"Automatic": automatic_stats["mean"],
81+
"Proofread": proofread_stats["mean"],
8282
})
8383
errors = pd.DataFrame({
84-
"Pool": automatic_stats["pool"],
84+
"Pool": proofread_stats["pool"],
8585
"Semi-automatic": semi_automatic_stats["std"],
86-
"Automatic": automatic_stats["std"],
86+
"Proofread": proofread_stats["std"],
8787
})
8888

8989
plot_pools(data, errors)
9090

91-
output_path = "./results/vesicle_pools_all_tomograms.xlsx"
91+
output_path = "./results/vesicle_pools_all_tomos.xlsx"
9292
data.to_excel(output_path, index=False, sheet_name="Average")
9393
with pd.ExcelWriter(output_path, engine="openpyxl", mode="a") as writer:
9494
errors.to_excel(writer, sheet_name="StandardDeviation", index=False)
9595

9696

97-
# TODO: export the ribbon and pd stats (first need to discuss this with Fid)
9897
def main():
99-
# for_tomos_with_annotation()
98+
for_tomos_with_annotation()
10099
for_all_tomos()
101100

102101

scripts/inner_ear/analysis/common.py

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,51 @@
11
# import os
22
import sys
33

4+
import numpy as np
45
import pandas as pd
56

67
sys.path.append("../processing")
78

89
from parse_table import get_data_root # noqa
910

1011

12+
def get_finished_tomos():
13+
# data_root = get_data_root()
14+
# val_table = os.path.join(data_root, "Electron-Microscopy-Susi", "Validierungs-Tabelle-v3.xlsx")
15+
16+
val_table = "/home/pape/Desktop/sfb1286/mboc_synapse/misc/Validierungs-Tabelle-v3-passt.xlsx"
17+
val_table = pd.read_excel(val_table)
18+
19+
val_table = val_table[val_table["Kommentar 22.11.24"] == "passt"]
20+
n_tomos = len(val_table)
21+
assert n_tomos > 0
22+
23+
tomo_names = []
24+
for _, row in val_table.iterrows():
25+
name = "/".join([
26+
row.Bedingung, f"Mouse {int(row.Maus)}",
27+
row["Ribbon-Orientierung"].lower().rstrip("?"),
28+
str(int(row["OwnCloud-Unterordner"]))]
29+
)
30+
tomo_names.append(name)
31+
32+
return tomo_names
33+
34+
1135
def get_manual_assignments():
12-
result_path = "../results/20240917_1/fully_manual_analysis_results.xlsx"
36+
result_path = "../results/20241124_1/fully_manual_analysis_results.xlsx"
1337
results = pd.read_excel(result_path)
1438
return results
1539

1640

17-
def get_semi_automatic_assignments(tomograms):
18-
result_path = "../results/20240917_1/automatic_analysis_results.xlsx"
41+
def get_proofread_assignments(tomograms):
42+
result_path = "../results/20241124_1/automatic_analysis_results.xlsx"
1943
results = pd.read_excel(result_path)
2044
results = results[results["tomogram"].isin(tomograms)]
2145
return results
2246

2347

24-
def get_automatic_assignments(tomograms):
48+
def get_semi_automatic_assignments(tomograms):
2549
result_path = "../results/fully_automatic_analysis_results.xlsx"
2650
results = pd.read_excel(result_path)
2751
results = results[results["tomogram"].isin(tomograms)]
@@ -30,48 +54,29 @@ def get_automatic_assignments(tomograms):
3054

3155
def get_measurements_with_annotation():
3256
manual_assignments = get_manual_assignments()
33-
manual_tomograms = pd.unique(manual_assignments["tomogram"])
34-
semi_automatic_assignments = get_semi_automatic_assignments(manual_tomograms)
3557

36-
tomograms = pd.unique(semi_automatic_assignments["tomogram"])
37-
manual_assignments = manual_assignments[manual_assignments["tomogram"].isin(tomograms)]
38-
assert len(pd.unique(manual_assignments["tomogram"])) == len(pd.unique(semi_automatic_assignments["tomogram"]))
58+
# Get the tomos with manual annotations and the ones which are fully done in proofreading.
59+
manual_tomos = pd.unique(manual_assignments["tomogram"])
60+
finished_tomos = get_finished_tomos()
61+
# Intersect them to get the tomos we are using.
62+
tomos = np.intersect1d(manual_tomos, finished_tomos)
3963

40-
automatic_assignments = get_automatic_assignments(tomograms)
41-
filtered_tomograms = pd.unique(manual_assignments["tomogram"])
42-
assert len(filtered_tomograms) == len(pd.unique(automatic_assignments["tomogram"]))
64+
manual_assignments = manual_assignments[manual_assignments["tomogram"].isin(tomos)]
65+
semi_automatic_assignments = get_semi_automatic_assignments(tomos)
66+
proofread_assignments = get_proofread_assignments(tomos)
4367

44-
print("Tomograms with manual annotations:", len(filtered_tomograms))
45-
return manual_assignments, semi_automatic_assignments, automatic_assignments
68+
print("Tomograms with manual annotations:", len(tomos))
69+
return manual_assignments, semi_automatic_assignments, proofread_assignments
4670

4771

4872
def get_all_measurements():
49-
# data_root = get_data_root()
50-
# val_table = os.path.join(data_root, "Electron-Microscopy-Susi", "Validierungs-Tabelle-v3.xlsx")
51-
52-
val_table = "/home/pape/Desktop/sfb1286/mboc_synapse/misc/Validierungs-Tabelle-v3-passt.xlsx"
53-
val_table = pd.read_excel(val_table)
54-
55-
val_table = val_table[val_table["Kommentar 22.11.24"] == "passt"]
56-
n_tomos = len(val_table)
57-
print("All tomograms:", n_tomos)
58-
assert n_tomos > 0
59-
tomo_names = []
60-
for _, row in val_table.iterrows():
61-
name = "/".join([
62-
row.Bedingung, f"Mouse {int(row.Maus)}",
63-
row["Ribbon-Orientierung"].lower().rstrip("?"),
64-
str(int(row["OwnCloud-Unterordner"]))]
65-
)
66-
tomo_names.append(name)
67-
68-
semi_automatic_assignments = get_semi_automatic_assignments(tomo_names)
69-
filtered_tomo_names = pd.unique(semi_automatic_assignments["tomogram"]).tolist()
73+
tomos = get_finished_tomos()
74+
print("All tomograms:", len(tomos))
7075

71-
automatic_assignments = get_automatic_assignments(tomo_names)
72-
assert len(filtered_tomo_names) == len(pd.unique(automatic_assignments["tomogram"]))
76+
semi_automatic_assignments = get_semi_automatic_assignments(tomos)
77+
proofread_assignments = get_proofread_assignments(tomos)
7378

74-
return semi_automatic_assignments, automatic_assignments
79+
return semi_automatic_assignments, proofread_assignments
7580

7681

7782
def main():

0 commit comments

Comments
 (0)