P-unit_model/find_thresholds_for_spike_detection.py
2020-08-22 11:29:26 +02:00

153 lines
6.0 KiB
Python

from CellData import CellData, icelldata_of_dir
from os import listdir
import os
def main():
# choose_thresholds()
precalculate_baseline_spiketimes()
def precalculate_baseline_spiketimes():
threshold_file_path = "data/thresholds.tsv"
thresholds_dict = {}
if os.path.exists(threshold_file_path):
with open(threshold_file_path, "r") as threshold_file:
for line in threshold_file:
line = line.strip()
line = line.split('\t')
name = line[0]
thresh = float(line[1])
min_length = int(line[2])
step_size = int(line[3])
thresholds_dict[name] = [thresh, min_length, step_size]
for cell_data in icelldata_of_dir("data/final/"):
name = os.path.basename(cell_data.get_data_path())
if name not in thresholds_dict.keys():
print("key missing: {}".format(name))
continue
thresh = thresholds_dict[name][0]
min_length = thresholds_dict[name][1]
split_step_size = thresholds_dict[name][2]
cell_data.get_base_spikes(threshold=thresh, min_length=min_length, split_step=split_step_size)
def choose_thresholds():
base_path = "data/final/"
threshold_file_path = "data/thresholds.tsv"
re_choose_thresholds = False
thresholds_dict = {}
if os.path.exists(threshold_file_path):
with open(threshold_file_path, "r") as threshold_file:
for line in threshold_file:
line = line.strip()
line = line.split('\t')
name = line[0]
thresh = float(line[1])
if len(line) > 2:
min_length = int(line[2])
step_size = int(line[3])
thresholds_dict[name] = [thresh, min_length, step_size]
print("Already done:", name)
else:
thresholds_dict[name] = [thresh]
print("Already done (no len/step): ", name)
count = 0
for item in sorted(listdir(base_path)):
if item in thresholds_dict.keys() and thresholds_dict[item][0] != 99 and not re_choose_thresholds:
continue
count += 1
print("cells to do:", count)
for item in sorted(listdir(base_path)):
# starting assumptions:
thresh = 2.5
min_split_length = 5000
split_step_size = 1000
if "thresholds" in item:
continue
if item in thresholds_dict.keys() and thresholds_dict[item][0] != 99 and not re_choose_thresholds:
if len(thresholds_dict[item]) == 1:
thresholds_dict[item] = [thresholds_dict[item][0], min_split_length, split_step_size]
continue
print(item)
item_path = base_path + item
data = CellData(item_path)
trace = data.get_base_traces(trace_type=data.V1)
if len(trace) == 0:
print("NO V1 TRACE FOUND: ", item_path)
continue
data.get_base_spikes(thresh, min_length=min_split_length, split_step=split_step_size, re_calculate=True,
only_first=True)
stop = False
print("Threshold was {:.2f}, Min Length was {:.0f}, Split step size was {:.0f}".format(thresh, min_split_length,
split_step_size))
response = input(
"Choose: 'ok', 'stop', or a number (threshold) or three numbers (threshold, minlength, step_size) seperated with commas")
while response != "ok":
if response == "stop":
stop = True
break
try:
parts = response.split(",")
if len(parts) == 1:
thresh = float(response)
else:
thresh = float(parts[0])
min_split_length = int(parts[1])
split_step_size = int(parts[2])
except ValueError as e:
print("{} could not be parsed as number or ok please try again.".format(response))
print("Threshold was {:.2f}, Min Length was {:.0f}, Split step size was {:.0f}".format(thresh,
min_split_length,
split_step_size))
response = input(
"Choose: 'ok', 'stop', or a number (threshold) or three numbers (threshold, minlength, step_size) seperated with commas")
continue
data.get_base_spikes(thresh, min_length=min_split_length, split_step=split_step_size, re_calculate=True,
only_first=True)
print(
"Threshold was {:.2f}, Min Length was {:.0f}, Split step size was {:.0f}".format(thresh,
min_split_length,
split_step_size))
response = input(
"Choose: 'ok', 'stop', or a number (threshold) or three numbers (threshold, minlength, step_size) seperated with commas")
if stop:
break
thresholds_dict[item] = [thresh, min_split_length, split_step_size]
with open(threshold_file_path, "w") as threshold_file:
for name in sorted(thresholds_dict.keys()):
if len(thresholds_dict[name]) == 1:
threshold_file.write(name + "\t" + str(thresholds_dict[name][0]) + "\n")
else:
line = name + "\t"
line += str(thresholds_dict[name][0]) + "\t"
line += str(thresholds_dict[name][1]) + "\t"
line += str(thresholds_dict[name][2]) + "\n"
threshold_file.write(line)
if __name__ == '__main__':
main()