csn-le / wave_clus

A fast and unsupervised algorithm for spike detection and sorting using wavelets and super-paramagnetic clustering
121 stars 65 forks source link

Wave_clus does not detect spikes #230

Closed yrg19 closed 1 year ago

yrg19 commented 1 year ago

Hello,

I have been trying to load my raw data into the wave_clus figure and I repeatedly get this error:

Wave_clus didn't find a sampling rate in file. It will use the input parameter or set_parameters.m Error using wave_clus>load_data_button_Callback Less than 15 spikes detected

Error in gui_mainfcn (line 95) feval(varargin{:});

Error in wave_clus (line 63) gui_mainfcn(gui_State, varargin{:});

Error while evaluating UIControl Callback.

I have set my parameters to be:

% LOAD PARAMS
par.segments_length = 0.5; % length (in minutes) of segments in which the data is cutted (default 5min).
par.sr = 25000; % sampling rate (in Hz). This parameter will be only used if the data file don't have a sr.

% PLOTTING PARAMETERS
par.cont_segment = true;
par.max_spikes_plot = 1000; % max. number of spikes to be plotted
par.print2file = true; % If is not true, print the figure (only for batch scripts).
par.cont_plot_samples = 100000; % number of samples used in the one-minute (maximum) sample of continuous data to plot.
par.to_plot_std = 1; % # of std from mean to plot
par.all_classes_ax = 'mean'; % 'mean'/'all'. If it's 'mean' only the mean waveforms will be ploted in the axes with all the classes par.plot_feature_stats = false;

% SPC PARAMETERS
par.mintemp = 0.00; % minimum temperature for SPC
par.maxtemp = 0.251; % maximum temperature for SPC
par.tempstep = 0.01; % temperature steps
par.SWCycles = 100; % SPC iterations for each temperature (default 100)
par.KNearNeighb = 11; % number of nearest neighbors for SPC
par.min_clus = 20; % minimum size of a cluster (default 20)
par.randomseed = 0; % if 0, random seed is taken as the clock value (default 0)
%par.randomseed = 147; % If not 0, random seed
%par.temp_plot = 'lin'; % temperature plot in linear scale
par.temp_plot = 'log'; % temperature plot in log scale

par.c_ov = 0.7; % Overlapping coefficient to use for the inclusion criterion.
par.elbow_min = 0.4; %Thr_border parameter for regime border detection.

% DETECTION PARAMETERS
par.tmax = 'all'; % maximum time to load
%par.tmax= 180; % maximum time to load (in sec)
par.tmin= 0; % starting time for loading (in sec)
par.w_pre = 20; % number of pre-event data points stored (default 20)
par.w_post = 44; % number of post-event data points stored (default 44))
par.alignment_window = 10; % number of points around the sample expected to be the maximum
par.stdmin = 4; % minimum threshold for detection
par.stdmax = 50; % maximum threshold for detection
par.detect_fmin = 30; % high pass filter for detection
par.detect_fmax = 3000; % low pass filter for detection (default 3000)
par.detect_order = 1; % filter order for detection. 0 to disable the filter.
par.sort_fmin = 30; % high pass filter for sorting
par.sort_fmax = 3000; % low pass filter for sorting (default 3000)
par.sort_order = 1; % filter order for sorting. 0 to disable the filter.
par.ref_ms = 1; % detector dead time, minimum refractory period (in ms)
%par.detection = 'pos'; % type of threshold ('pos','neg','both')
% par.detection = 'neg';
par.detection = 'both';

% INTERPOLATION PARAMETERS
par.int_factor = 5; % interpolation factor
par.interpolation = 'y'; % interpolation with cubic splines (default 'y')
% par.interpolation = 'n';

% FEATURES PARAMETERS
par.min_inputs = 10; % number of inputs to the clustering
par.max_inputs = 0.75; % number of inputs to the clustering. if < 1 it will the that proportion of the maximum.
par.scales = 4; % number of scales for the wavelet decomposition
par.features = 'wav'; % type of feature ('wav' or 'pca')
%par.features = 'pca'

% FORCE MEMBERSHIP PARAMETERS
par.template_sdnum = 3; % max radius of cluster in std devs.
par.template_k = 10; % # of nearest neighbors
par.template_k_min = 10; % min # of nn for vote
%par.template_type = 'mahal'; % nn, center, ml, mahal
par.template_type = 'center'; % nn, center, ml, mahal
par.force_feature = 'spk'; % feature use for forcing (whole spike shape)
%par.force_feature = 'wav'; % feature use for forcing (wavelet coefficients).
par.force_auto = true; %automatically force membership (only for batch scripts).

% TEMPLATE MATCHING
par.match = 'y'; % for template matching
%par.match = 'n'; % for no template matching
par.max_spk = 40000; % max. # of spikes before starting templ. match.
par.permut = 'y'; % for selection of random 'par.max_spk' spikes before starting templ. match.
% par.permut = 'n'; % for selection of the first 'par.max_spk' spikes before starting templ. match.

% HISTOGRAM PARAMETERS
par.nbins = 100; % # of bins for the ISI histograms
par.bin_step = 1; % percentage number of bins to plot

I have got spikes (attached an image below). 30s recording with spikes

These parameters work when using amp_detect and correctly identifies all the spikes (see the second image). amp_detect 30sec recording

My input variable is a structure containing 'data' which has the raw EEG recording.

I have tried playing around with all of the parameters listed in other responses about this issue and nothing seems to work. I also find that from the simulated datasets, C_Difficult1_noise015 causes the same error, while no other simulation does however I have not been able to figure out why.

Really appreciate your help with this!

All the best, Yuval

ferchaure commented 1 year ago

Hi Yuval,

The input is a structure containing data or a file containing the variable data (https://github.com/csn-le/wave_clus/wiki/Input-Files)? That could be the issue, mat_wc_reader.m doesn't have a nice error handling when the files are not well formated.

In the case of the simulation maybe increasing par.stdmax to 100 can help.

Best Fernando

yrg19 commented 1 year ago

Yes, the issue was it was a .mat file with a structure rather than matrix variables! Thank you so much for your help!

All the best, Yuval