Skip to content

Commit efeaf4c

Browse files
committed
syn_per_IHC for segmentation table
1 parent ae1670f commit efeaf4c

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import argparse
2+
import os
3+
4+
import numpy as np
5+
import pandas as pd
6+
7+
from flamingo_tools.s3_utils import get_s3_path, BUCKET_NAME, SERVICE_ENDPOINT
8+
9+
COCHLEAE = {
10+
"M_LR_000226_L": {"seg_name": "IHC_v4c", "component_list": [1]},
11+
"M_LR_000226_R": {"seg_name": "IHC_v4c", "component_list": [1]},
12+
"M_LR_000227_L": {"seg_name": "IHC_v4c", "component_list": [1]},
13+
"M_LR_000227_R": {"seg_name": "IHC_v4c", "component_list": [1]},
14+
"M_AMD_OTOF1_L": {"seg_name": "IHC_v4b", "component_list": [3, 11]},
15+
}
16+
17+
COCHLEA_DIR = "/mnt/vast-nhr/projects/nim00007/data/moser/cochlea-lightsheet"
18+
OUT_DIR = f"{COCHLEA_DIR}/mobie_project/cochlea-lightsheet/tables/syn_per_ihc"
19+
20+
21+
def add_syn_per_ihc(args):
22+
syn_limit = 25
23+
24+
if args.output_folder is None:
25+
out_dir = OUT_DIR
26+
else:
27+
out_dir = args.output_folder
28+
29+
for cochlea in args.cochlea:
30+
if args.seg_version is None:
31+
seg_version = COCHLEAE[cochlea]["seg_name"]
32+
else:
33+
seg_version = args.seg_version
34+
35+
print(f"Evaluating cochlea {cochlea}.")
36+
37+
ihc_version = seg_version.split("_")[1]
38+
syn_per_ihc_dir = f"{COCHLEA_DIR}/predictions/synapses/ihc_counts_{ihc_version}"
39+
40+
if args.component_list is None:
41+
component_list = COCHLEAE[cochlea]["component_list"]
42+
else:
43+
component_list = args.component_list
44+
45+
s3_path = os.path.join(f"{cochlea}", "tables", seg_version, "default.tsv")
46+
tsv_path, fs = get_s3_path(s3_path, bucket_name=BUCKET_NAME,
47+
service_endpoint=SERVICE_ENDPOINT)
48+
with fs.open(tsv_path, 'r') as f:
49+
ihc_table = pd.read_csv(f, sep="\t")
50+
51+
# synapse_table
52+
syn_path = os.path.join(syn_per_ihc_dir, f"ihc_count_{cochlea}.tsv")
53+
with open(syn_path, 'r') as f:
54+
syn_table = pd.read_csv(f, sep="\t")
55+
56+
syn_per_IHC = [-1 for _ in range(len(ihc_table))]
57+
ihc_table.loc[:, "syn_per_IHC"] = syn_per_IHC
58+
59+
ihc_table.loc[ihc_table['component_labels'].isin(component_list), 'syn_per_IHC'] = 0
60+
zero_syn = ihc_table[ihc_table["syn_per_IHC"] == 0]
61+
print(f"Total IHC in component: {len(zero_syn)}")
62+
63+
for label_id, syn_count in zip(list(syn_table["label_id"]), list(syn_table["synapse_count"])):
64+
ihc_table.loc[ihc_table["label_id"] == label_id, "syn_per_IHC"] = syn_count
65+
zero_syn = ihc_table[ihc_table["syn_per_IHC"] > syn_limit]
66+
print(f"IHC in component with more than 25 synapses: {len(zero_syn)}")
67+
zero_syn = ihc_table[ihc_table["syn_per_IHC"] == 0]
68+
print(f"IHC in component without synapses: {len(zero_syn)}")
69+
70+
syn_per_IHC = list(ihc_table.loc[ihc_table['component_labels'].isin(component_list), 'syn_per_IHC'])
71+
72+
if args.ihc_syn:
73+
syn_per_IHC = [s for s in syn_per_IHC if s != 0]
74+
75+
print(f"Mean syn_per_IHC: {round(sum(syn_per_IHC) / len(syn_per_IHC), 2)}")
76+
print(f"Stdv syn_per_IHC: {round(np.std(syn_per_IHC), 2)}")
77+
out_path = os.path.join(out_dir, cochlea + "_syn-per-ihc.tsv")
78+
ihc_table.to_csv(out_path, sep="\t", index=False)
79+
80+
81+
def main():
82+
83+
parser = argparse.ArgumentParser()
84+
parser.add_argument("-c", "--cochlea", type=str, nargs="+", default=COCHLEAE, help="Cochlea(e) to process.")
85+
parser.add_argument("-o", "--output_folder", type=str, default=None, help="Path to output folder.")
86+
parser.add_argument("-s", "--seg_version", type=str, default=None, help="Path to output folder.")
87+
parser.add_argument("--ihc_syn", action="store_true", help="Consider only IHC with synapses.")
88+
parser.add_argument("--component_list", type=int, nargs="+", default=None,
89+
help="List of IHC components.")
90+
91+
args = parser.parse_args()
92+
93+
add_syn_per_ihc(args)
94+
95+
96+
if __name__ == "__main__":
97+
main()

0 commit comments

Comments
 (0)