From d3bcef5b7984e3e2004218e283e29667c0ee5b4a Mon Sep 17 00:00:00 2001 From: weygoldt <88969563+weygoldt@users.noreply.github.com> Date: Wed, 18 Jan 2023 09:14:33 +0100 Subject: [PATCH] added chatgpt solution --- code/chirpdetection.py | 51 +++++++++--------- code/modules/timestamps.py | 106 +++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 code/modules/timestamps.py diff --git a/code/chirpdetection.py b/code/chirpdetection.py index 194bbdf..c167425 100644 --- a/code/chirpdetection.py +++ b/code/chirpdetection.py @@ -12,6 +12,7 @@ from sklearn.preprocessing import normalize from modules.filters import bandpass_filter, envelope, highpass_filter from modules.filehandling import ConfLoader, LoadData from modules.plotstyle import PlotStyle +from modules.timestamps import group_timestamps, group_timestamp_v2 ps = PlotStyle() @@ -317,10 +318,10 @@ def main(datapath: str) -> None: search_freq = config.default_search_freq print(f"Search frequency: {search_freq}") - #----------- chrips on the two best electrodes----------- + # ----------- chrips on the two best electrodes----------- chirps_electrodes = [] - electrodes_of_chirps = [] - + electrodes_of_chirps = [] + # iterate through electrodes for el, electrode in enumerate(best_electrodes): print(el) @@ -541,7 +542,6 @@ def main(datapath: str) -> None: timestamps)] timestamps = timestamps[np.argsort(timestamps)] - # # get chirps # diff = np.empty(timestamps.shape) # diff[0] = np.inf # always retain the 1st element @@ -549,7 +549,6 @@ def main(datapath: str) -> None: # mask = diff < config.chirp_window_threshold # shared_peak_indices = timestamp_idx[mask] - current_chirps = [] bool_timestamps = np.ones_like(timestamps, dtype=bool) for bo, tt in enumerate(timestamps): @@ -561,12 +560,10 @@ def main(datapath: str) -> None: current_chirps.append(np.mean(timestamps[cm])) electrodes_of_chirps.append(el) bool_timestamps[cm] = False - # for checking if there are chirps on multiple electrodes chirps_electrodes.append(current_chirps) - - + for ct in current_chirps: axs[0, el].axvline(ct, color='r', lw=1) @@ -586,17 +583,19 @@ def main(datapath: str) -> None: np.ones_like((time_oi)[baseline_peaks]) * 600, c=ps.red, ) - # make one array + # make one array chirps_electrodes = np.concatenate(chirps_electrodes) # make shure they are numpy arrays chirps_electrodes = np.asarray(chirps_electrodes) electrodes_of_chirps = np.asarray(electrodes_of_chirps) # sort them - sort_chirps_electrodes = chirps_electrodes[np.argsort(chirps_electrodes)] - sort_electrodes = electrodes_of_chirps[np.argsort(chirps_electrodes)] + sort_chirps_electrodes = chirps_electrodes[np.argsort( + chirps_electrodes)] + sort_electrodes = electrodes_of_chirps[np.argsort( + chirps_electrodes)] bool_vector = np.ones(len(sort_chirps_electrodes), dtype=bool) - # make index vector + # make index vector index_vector = np.arange(len(sort_chirps_electrodes)) the_real_chirps = [] @@ -605,16 +604,20 @@ def main(datapath: str) -> None: continue else: cm = index_vector[(sort_chirps_electrodes >= seoc) & ( - sort_chirps_electrodes <= seoc + config.chirp_window_threshold)] - - if set([0,1]).issubset(sort_electrodes[cm]): - the_real_chirps.append(np.mean(sort_chirps_electrodes[cm])) - elif set([1,0]).issubset(sort_electrodes[cm]): - the_real_chirps.append(np.mean(sort_chirps_electrodes[cm])) - elif set([0,2]).issubset(sort_electrodes[cm]): - the_real_chirps.append(np.mean(sort_chirps_electrodes[cm])) - elif set([1,2]).issubset(sort_electrodes[cm]): - the_real_chirps.append(np.mean(sort_chirps_electrodes[cm])) + sort_chirps_electrodes <= seoc + config.chirp_window_threshold)] + + if set([0, 1]).issubset(sort_electrodes[cm]): + the_real_chirps.append( + np.mean(sort_chirps_electrodes[cm])) + elif set([1, 0]).issubset(sort_electrodes[cm]): + the_real_chirps.append( + np.mean(sort_chirps_electrodes[cm])) + elif set([0, 2]).issubset(sort_electrodes[cm]): + the_real_chirps.append( + np.mean(sort_chirps_electrodes[cm])) + elif set([1, 2]).issubset(sort_electrodes[cm]): + the_real_chirps.append( + np.mean(sort_chirps_electrodes[cm])) bool_vector[cm] = False for ct in the_real_chirps: @@ -623,10 +626,6 @@ def main(datapath: str) -> None: plt.show() - - - - if __name__ == "__main__": datapath = "../data/2022-06-02-10_00/" main(datapath) diff --git a/code/modules/timestamps.py b/code/modules/timestamps.py new file mode 100644 index 0000000..a342271 --- /dev/null +++ b/code/modules/timestamps.py @@ -0,0 +1,106 @@ +import numpy as np +from typing import List, Union + + +def group_timestamps(timestamps: List[Union[int, float]], time_threshold: float = 0.05) -> List[float]: + """ + Group timestamps that are less than a certain time threshold apart. + + Parameters + ---------- + timestamps : list of float or int + List of timestamps to group + time_threshold : float, optional + The threshold for time difference between two consecutive timestamps in milliseconds. Default is 0.05 milliseconds. + + Returns + ------- + list of float + List of mean of each group of timestamps + + Examples + -------- + >>> timestamps = [1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65] + >>> group_timestamps(timestamps) + [1.275, 1.425, 1.575] + """ + # Create an empty list to store the groups of timestamps + groups = [] + # Create a variable to store the current group of timestamps + current_group = [] + # Iterate through the timestamps + for i in range(len(timestamps)): + # If the current timestamp is less than 50 milliseconds away from the previous timestamp + if i > 0 and timestamps[i] - timestamps[i-1] < time_threshold: + # Add the current timestamp to the current group + current_group.append(timestamps[i]) + else: + # If the current timestamp is not part of the current group + if current_group: + # Add the current group to the list of groups + groups.append(current_group) + # Reset the current group + current_group = [] + # Add the current timestamp to a new group + current_group.append(timestamps[i]) + # If there is a group left after the loop + if current_group: + # Add the current group to the list of groups + groups.append(current_group) + # Compute the mean of each group and return it + return [np.mean(group) for group in groups] + + +def group_timestamps_v2(sublists: List[List[Union[int, float]]], n: int, time_threshold: float = 0.05) -> List[float]: + """ + Group timestamps that are less than a certain time threshold apart and occur in at least n sublists. + + Parameters + ---------- + sublists : list of list of float or int + List of sublists containing timestamps + n : int + Minimum number of sublists in which a timestamp should occur to be considered + time_threshold : float, optional + The threshold for time difference between two consecutive timestamps in milliseconds. Default is 0 + + Returns + ------- + list of float + List of mean of each group of timestamps + + Examples + -------- + >>> sublists = [[1.2, 1.25, 1.3, 1.35, 1.4], [1.3, 1.35, 1.4, 1.45, 1.5], [1.4, 1.45, 1.5, 1.55, 1.6]] + >>> group_timestamps_v2(sublists, 2) + [1.325, 1.45] + """ + + # Create an empty list to store the groups of timestamps + groups = [] + # Create a variable to store the current group of timestamps + current_group = [] + # Create a set to store the timestamps that occur in at least n of the sublists + common_timestamps = set.intersection(*[set(lst) for lst in sublists]) + # Iterate through the timestamps + for i in range(len(common_timestamps)): + # If the current timestamp is less than 50 milliseconds away from the previous timestamp + if i > 0 and common_timestamps[i] - common_timestamps[i-1] < time_threshold: + # Add the current timestamp to the current group + current_group.append(common_timestamps[i]) + else: + # If the current timestamp is not part of the current group + if current_group: + # Add the current group to the list of groups + groups.append(current_group) + # Reset the current group + current_group = [] + # Add the current timestamp to a new group + current_group.append(common_timestamps[i]) + # If there is a group left after the loop + if current_group: + # Add the current group to the list of groups + groups.append(current_group) + # Compute the mean of each group and return it + return [np.mean(group) for group in groups] +