📄 wave_clus.m
字号:
function varargout = wave_clus(varargin)% WAVE_CLUS M-file for wave_clus.fig% WAVE_CLUS, by itself, creates a new WAVE_CLUS or raises the existing% singleton*.%% H = WAVE_CLUS returns the handle to a new WAVE_CLUS or the handle to% the existing singleton*.%% WAVE_CLUS('Property','Value',...) creates a new WAVE_CLUS using the% given property value pairs. Unrecognized properties are passed via% varargin to wave_clus_OpeningFcn. This calling syntax produces a% warning when there is an existing singleton*.%% WAVE_CLUS('CALLBACK') and WAVE_CLUS('CALLBACK',hObject,...) call the% local function named CALLBACK in WAVE_CLUS.M with the given input% arguments.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one% instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help wave_clus% Last Modified by GUIDE v2.5 02-Feb-2005 20:30:47% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @wave_clus_OpeningFcn, ... 'gui_OutputFcn', @wave_clus_OutputFcn, ... 'gui_LayoutFcn', [], ... 'gui_Callback', []);if nargin & isstr(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});endif nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before wave_clus is made visible.function wave_clus_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% varargin unrecognized PropertyName/PropertyValue pairs from the% command line (see VARARGIN)% Choose default command line output for wave_clushandles.output = hObject;handles.datatype ='CSC data (pre-clustered)';set(handles.isi1_accept_button,'value',1);set(handles.isi2_accept_button,'value',1);set(handles.isi3_accept_button,'value',1);set(handles.spike_shapes_button,'value',1);set(handles.force_button,'value',0);set(handles.plot_all_button,'value',1);set(handles.plot_average_button,'value',0);set(handles.fix1_button,'value',0);set(handles.fix2_button,'value',0);set(handles.fix3_button,'value',0);% Update handles structureguidata(hObject, handles);% UIWAIT makes wave_clus wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.function varargout = wave_clus_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structurevarargout{1} = handles.output;clus_colors = [0 0 1; 1 0 0; 0 0.5 0; 0 0.75 0.75; 0.75 0 0.75; 0.75 0.75 0; 0.25 0.25 0.25];set(0,'DefaultAxesColorOrder',clus_colors)% --- Executes on button press in load_data_button.function load_data_button_Callback(hObject, eventdata, handles)set(handles.isi1_accept_button,'value',1);set(handles.isi2_accept_button,'value',1);set(handles.isi3_accept_button,'value',1);set(handles.isi1_reject_button,'value',0);set(handles.isi2_reject_button,'value',0);set(handles.isi3_reject_button,'value',0);set(handles.isi1_nbins,'string','Auto');set(handles.isi1_bin_step,'string','Auto');set(handles.isi2_nbins,'string','Auto');set(handles.isi2_bin_step,'string','Auto');set(handles.isi3_nbins,'string','Auto');set(handles.isi3_bin_step,'string','Auto');set(handles.isi0_nbins,'string','Auto');set(handles.isi0_bin_step,'string','Auto');set(handles.force_button,'value',0);set(handles.force_button,'string','Force');set(handles.fix1_button,'value',0);set(handles.fix2_button,'value',0);set(handles.fix3_button,'value',0);pack;switch char(handles.datatype) case 'Simulator' [filename, pathname] = uigetfile('C_*.mat','Select file'); set(handles.file_name,'string',['Loading: ' pathname filename]); cd(pathname); load([pathname filename]); %Load data x.data=data; x.sr=1000./samplingInterval; handles.par = set_parameters_simulation(x.sr,filename,handles); % Load parameters set(handles.min_clus_edit,'string',num2str(handles.par.min_clus)); [spikes,thr,index] = amp_detect_wc(x.data,handles); % Detection with amp. thresh. [inspk] = wave_features_wc(spikes,handles); % Extract spike features. %Interaction with SPC set(handles.file_name,'string','Running SPC ...'); handles.par.fname_in = 'tmp_data'; fname_in = handles.par.fname_in; save([fname_in],'inspk','-ascii'); %Input file for SPC handles.par.fname = [handles.par.fname '_wc']; %Output filename of SPC handles.par.fnamespc = handles.par.fname; handles.par.fnamesave = handles.par.fnamespc; [clu,tree] = run_cluster(handles); USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{4} = clu; USER_DATA{5} = tree; USER_DATA{7} = inspk; set(handles.wave_clus_figure,'userdata',USER_DATA) case 'CSC data' %neuralynks (CSC files) [filename, pathname] = uigetfile('*.Ncs','Select file'); set(handles.file_name,'string',['Loading: ' pathname filename]); cd(pathname); if length(filename) == 8 channel = filename(4); else channel = filename(4:5); end f=fopen(filename,'r','l'); fseek(f,16384,'bof'); %Skip Header, put pointer to the first record TimeStamps=fread(f,inf,'int64',(4+4+4+2*512)); %Read all TimeStamps fseek(f,16384+8+4+4+4,'bof'); %put pointer to the beginning of data time0 = TimeStamps(1); timeend = TimeStamps(end); delta_time=(TimeStamps(2)-TimeStamps(1)); sr = 512*1e6/delta_time; handles.par = set_parameters_CSC(sr,filename,handles); % Load parameters set(handles.min_clus_edit,'string',num2str(handles.par.min_clus)); %Load continuous data if strcmp(handles.par.tmax,'all') %Loads all data index_all=[]; spikes_all=[]; lts = length(TimeStamps); %Segments the data in par.segments pieces handles.par.segments = ceil((timeend - time0) / ... (handles.par.segments_length * 1e6 * 60)); %number of segments in which data is cutted segmentLength = floor (lts/handles.par.segments); tsmin = 1 : segmentLength :lts; tsmin = tsmin(1:handles.par.segments); tsmax = tsmin - 1; tsmax = tsmax (2:end); tsmax = [tsmax, lts]; recmax=tsmax; recmin=tsmin; tsmin = TimeStamps(int64(tsmin)); tsmax = TimeStamps(int64(tsmax)); for j=1:length(tsmin) Samples=fread(f,512*(recmax(j)-recmin(j)+1),'512*int16=>int16',8+4+4+4); x=double(Samples(:))'; clear Samples; %GETS THE GAIN AND CONVERTS THE DATA TO MICRO V. eval(['scale_factor=textread(''CSC' num2str(channel) '.Ncs'',''%s'',41);']); x=x*str2num(scale_factor{41})*1e6; handles.flag = j; %flag for plotting only in the 1st loop [spikes,thr,index] = amp_detect_wc(x,handles); %detection with amp. thresh. index = index*1e6/sr+tsmin(j); index_all = [index_all index]; spikes_all = [spikes_all; spikes]; end index = (index_all-time0)/1000; spikes = spikes_all; USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{2}=spikes; USER_DATA{3}=index; set(handles.wave_clus_figure,'userdata',USER_DATA); else %Loads a data segment tsmin = time0 + handles.par.tmin*1e6; %min time to read (in micro-sec) tsmax = time0 + handles.par.tmax*1e6; %max time to read (in micro-sec) index_tinitial = find(tsmin > TimeStamps); if isempty(index_tinitial) ==1; index_tinitial = 0; else index_tinitial = index_tinitial(end); end index_tfinal = find(tsmax < TimeStamps); if isempty(index_tfinal) ==1; index_tfinal = timeend; else index_tfinal = index_tfinal(1); end fseek(f,16384+8+4+4+4+index_tinitial,'bof'); %put pointer to the correct time Samples=fread(f,512*(index_tfinal-index_tinitial+1),'512*int16=>int16',8+4+4+4); x=double(Samples(:))'; clear Samples; [spikes,thr,index] = amp_detect_wc(x,handles); %Detection with amp. thresh. end fclose(f); [inspk] = wave_features_wc(spikes,handles); %Extract spike features. if handles.par.match == 'y'; naux = min(handles.par.max_spk,size(inspk,1)); inspk_aux = inspk(1:naux,:); else inspk_aux = inspk; end %Interaction with SPC set(handles.file_name,'string','Running SPC ...'); fname_in = handles.par.fname_in; save([fname_in],'inspk_aux','-ascii'); %Input file for SPC handles.par.fnamesave = [handles.par.fname '_ch' ... num2str(channel)]; %filename if "save clusters" button is pressed handles.par.fname = [handles.par.fname '_wc']; %Output filename of SPC handles.par.fnamespc = handles.par.fname; [clu,tree] = run_cluster(handles); USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{4} = clu; USER_DATA{5} = tree; USER_DATA{7} = inspk; set(handles.wave_clus_figure,'userdata',USER_DATA) case 'CSC data (pre-clustered)' %neuralynks (CSC files) [filename, pathname] = uigetfile('*.Ncs','Select file'); set(handles.file_name,'string',['Loading: ' pathname filename]); cd(pathname); if length(filename) == 8 channel = filename(4); else channel = filename(4:5); end f=fopen(filename,'r','l'); fseek(f,16384,'bof'); %Skip Header, put pointer to the first record TimeStamps=fread(f,inf,'int64',(4+4+4+2*512)); %Read all TimeStamps time0 = TimeStamps(1); timeend = TimeStamps(end); sr = 512*1e6/(TimeStamps(2)-TimeStamps(1)); clear TimeStamps; handles.par = set_parameters_CSC(sr,filename,handles); %Load parameters set(handles.min_clus_edit,'string',num2str(handles.par.min_clus)); %Load spikes and parameters eval(['load times_CSC' num2str(channel) ';']); index=cluster_class(:,2)'; %Load clustering results fname = [handles.par.fname '_ch' num2str(channel)]; %filename for interaction with SPC clu=load([fname '.dg_01.lab']); tree=load([fname '.dg_01']); handles.par.fnamespc = fname; handles.par.fnamesave = handles.par.fnamespc; USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{2} = spikes; USER_DATA{3} = index; USER_DATA{4} = clu; USER_DATA{5} = tree; if exist('inspk'); USER_DATA{7} = inspk; end set(handles.wave_clus_figure,'userdata',USER_DATA) % LOAD CSC DATA (for plotting) fseek(f,16384+8+4+4+4,'bof'); %put pointer to the beginning of data Samples=fread(f,ceil(sr*60),'512*int16=>int16',8+4+4+4); x=double(Samples(:))'; clear Samples; fclose(f); %GETS THE GAIN AND CONVERTS THE DATA TO MICRO V. eval(['scale_factor=textread(''CSC' num2str(channel) '.Ncs'',''%s'',41);']); x=x*str2num(scale_factor{41})*1e6; [spikes,thr,index] = amp_detect_wc(x,handles); %Detection with amp. thresh. case 'Sc data' [filename, pathname] = uigetfile('*.Nse','Select file'); set(handles.file_name,'string',['Loading: ' pathname filename]); cd(pathname); if length(filename) == 7 channel = filename(3); else channel = filename(3:4); end eval(['[index, Samples] = Nlx2MatSE(''Sc' num2str(channel) '.Nse'',1,0,0,0,1,0);']); spikes(:,:)= Samples(:,1,:); clear Samples; spikes = spikes'; handles.par = set_parameters_Sc(filename,handles); %Load parameters set(handles.min_clus_edit,'string',num2str(handles.par.min_clus)); axes(handles.cont_data); cla [inspk] = wave_features_wc(spikes,handles); %Extract spike features. if handles.par.match == 'y'; naux = min(handles.par.max_spk,size(inspk,1)); inspk_aux = inspk(1:naux,:); else inspk_aux = inspk; end %Interaction with SPC set(handles.file_name,'string','Running SPC ...'); handles.par.fname_in = 'tmp_data'; fname_in = handles.par.fname_in; save([fname_in],'inspk','-ascii'); %Input file for SPC handles.par.fnamesave = [handles.par.fname '_ch' ... num2str(channel)]; %filename if "save clusters" button is pressed handles.par.fname = [handles.par.fname '_wc']; %Output filename of SPC handles.par.fnamespc = handles.par.fname; [clu,tree] = run_cluster(handles); USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{2} = spikes; USER_DATA{3} = index/1000; USER_DATA{4} = clu; USER_DATA{5} = tree; USER_DATA{7} = inspk; set(handles.wave_clus_figure,'userdata',USER_DATA) case 'Sc data (pre-clustered)' [filename, pathname] = uigetfile('*.Nse','Select file'); set(handles.file_name,'string',['Loading: ' pathname filename]); cd(pathname); if length(filename) == 7 channel = filename(3); else channel = filename(3:4); end eval(['[index, Samples] = Nlx2MatSE(''Sc' num2str(channel) '.Nse'',1,0,0,0,1,0);']); spikes(:,:)= Samples(:,1,:); clear Samples; spikes = spikes'; handles.par = set_parameters_Sc(filename,handles); %Load parameters set(handles.min_clus_edit,'string',num2str(handles.par.min_clus)); axes(handles.cont_data); cla %Load clustering results fname = [handles.par.fname '_ch' num2str(channel)]; %filename for interaction with SPC clu=load([fname '.dg_01.lab']); tree=load([fname '.dg_01']); handles.par.fnamespc = fname; handles.par.fnamesave = handles.par.fnamespc; USER_DATA = get(handles.wave_clus_figure,'userdata'); USER_DATA{2} = spikes;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -