|
| 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