From 09d0db438c8e68fb9e0bcb455e5eed05016d9c47 Mon Sep 17 00:00:00 2001 From: Hannes Mogensen Date: Fri, 30 Jan 2015 17:39:43 +0100 Subject: [PATCH] Changing folders --- {customized/@Eeg => @Eeg}/Eeg.m | 0 {customized/@Eeg => @Eeg}/modify_eeg.m | 0 {customized/@Eeg => @Eeg}/plot_eeg.m | 0 {customized/@Eeg => @Eeg}/save_to_dat.m | 0 README.md | 34 +++- User manual 1.0.5.rtf | Bin 4867 -> 0 bytes customized/NcCell.m | 175 ++++++++++++++++++ customized/NcChild.m | 22 +++ customized/NcParent.m | 14 ++ customized/NcSweep.m | 18 ++ customized/NcType.m | 126 +++++++++++++ customized/rat_neocortex.m | 121 ++++++++++++ .../test_dependency.m | 0 modify_threshold/sc_perieventsweep.m | 5 +- sc.m | 22 ++- sensorimotor/classes/ScSignal.m | 10 +- sensorimotor/functions/sc_nearest.m | 14 +- sc_close_editors.m => util/sc_close_editors.m | 0 util/sc_kernelhist.m | 4 +- util/sc_perieventsweep.m | 9 + util/sc_perieventtimes.m | 1 + viewers/@SequenceViewer/SequenceViewer.m | 2 +- 22 files changed, 556 insertions(+), 21 deletions(-) rename {customized/@Eeg => @Eeg}/Eeg.m (100%) rename {customized/@Eeg => @Eeg}/modify_eeg.m (100%) rename {customized/@Eeg => @Eeg}/plot_eeg.m (100%) rename {customized/@Eeg => @Eeg}/save_to_dat.m (100%) delete mode 100644 User manual 1.0.5.rtf create mode 100644 customized/NcCell.m create mode 100644 customized/NcChild.m create mode 100644 customized/NcParent.m create mode 100644 customized/NcSweep.m create mode 100644 customized/NcType.m create mode 100644 customized/rat_neocortex.m rename test_dependency.m => customized/test_dependency.m (100%) rename sc_close_editors.m => util/sc_close_editors.m (100%) create mode 100644 util/sc_perieventsweep.m diff --git a/customized/@Eeg/Eeg.m b/@Eeg/Eeg.m similarity index 100% rename from customized/@Eeg/Eeg.m rename to @Eeg/Eeg.m diff --git a/customized/@Eeg/modify_eeg.m b/@Eeg/modify_eeg.m similarity index 100% rename from customized/@Eeg/modify_eeg.m rename to @Eeg/modify_eeg.m diff --git a/customized/@Eeg/plot_eeg.m b/@Eeg/plot_eeg.m similarity index 100% rename from customized/@Eeg/plot_eeg.m rename to @Eeg/plot_eeg.m diff --git a/customized/@Eeg/save_to_dat.m b/@Eeg/save_to_dat.m similarity index 100% rename from customized/@Eeg/save_to_dat.m rename to @Eeg/save_to_dat.m diff --git a/README.md b/README.md index 58b6cba..2372a15 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,35 @@ Waveform detection tool: ========================== -In general terms, this is a program for postprocesing analysis of recorded data in one or several analog or digital channels. -More specifically, it has been customized to our needs (data recorded in Spike2 from electrophysiological experiments). It can be modified to be used for other purposes. +>> help sc + +Normal usage: + +>> sc + +Eeg analysis + +>> help Eeg + +Folder structure: +================= + +The classes in the following folders are recreated each time the program is run - no need for backwards compatibility. All files here should be called from sc.m function, otherwise they should be moved to folder /util or folder /customized. Use function customized/test_depency.m to check which files are in use. + +* /channelaxes +* /enumtypes +* /functions +* /layout +* /modify_threshold +* /panelcomponents +* /panels +* /viewers + +The classes in the /sensorimotor folder have to be backward and forward compatible + +/third-party contains files from Mathworks file sharing site + +/util contains generic functions (functions that are useful to a 'general public') + +/customized contains functions that are not called by the sc.m function, but are nevertheless useful for this project - though they are not general enough to be of public use -The program has a graphical user interface so it does not require knowledge of Matlab. Start by typing sc -help in the command prompt. diff --git a/User manual 1.0.5.rtf b/User manual 1.0.5.rtf deleted file mode 100644 index 800b7df3c71c7ec4b4d2d699b3d1d3cbb7b68891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4867 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 R*WS?h2kn}YiXWmr`Zu;R!}tII diff --git a/customized/NcCell.m b/customized/NcCell.m new file mode 100644 index 0000000..c870c85 --- /dev/null +++ b/customized/NcCell.m @@ -0,0 +1,175 @@ +classdef NcCell < ObjectList & NcParent + methods + function add(obj,item) + add@ObjectList(obj,item); + item.parent = obj; + end + function ret = time(obj) + if ~obj.N + ret = []; + else + ret = (0:(obj.N-1))*obj.dt; + end + end + function ret = time_binned(obj) + ret = ((0:floor((obj.N-1))/obj.binwidth)+.5)*obj.binwidth*obj.dt; + end + function ret = N(obj) + ret = 0; + for k=1:obj.n + if obj.get(k).n && obj.get(k).N + ret = obj.get(k).N; + break; + end + end + end + function ret = label_binned(obj,eegopt) + ret = {}; + ind = 0; + for k=1:obj.n + child = obj.get(k); + label_binned = child.label_binned(eegopt); + inds = ind + (1:length(label_binned)); + ret(inds) = label_binned; + ind = inds(end); + end + end + + function plotdata(obj,removeartifacts,eegopt) + for k=1:obj.n + figure(k) + clf + obj.get(k).plotdata(removeartifacts,eegopt); + set(gcf,'Color',[1 1 1]) + set(gcf,'Name',obj.get(k).label); + end + end + function plotall(obj,removeartifacts,eegopt) + clf + for k=1:obj.n + sc_square_subplot(obj.n,k) + cla + nn = obj.get(k).plotall(removeartifacts,eegopt); + set(gca,'FontSize',14) + axis tight + title(sprintf('%s (N = %i)',obj.get(k).label,nn)); + end + set(gcf,'Color',[1 1 1]) + end + function plotavg(obj,removeartifacts,eegopt) + clf + hold on + for k=1:obj.n + obj.get(k).plotavg(removeartifacts,eegopt); + end + axis tight + legend(obj.vals('label')); + set(gcf,'Color',[1 1 1]) + set(gca,'FontSize',14) + title('Average membrane potential') + xlabel('Time [s]'); + ylabel('Voltage [mV]') + end + function binwiseanova(obj,removeartifacts,eegopt) + switch eegopt + case 'all' + keepsweeps = true(size(obj.rising_edge)); + case 'rising' + keepsweeps = obj.rising_edge; + case 'no_rising' + keepsweeps = ~obj.rising_edge; + otherwise + error('Uknown option: %s\n',eegopt); + end + if ~removeartifacts + keeptimes = true(size(obj.time_binned)); + else + keeptimes = ~any(cell2mat(obj.vals('artifacts_binned')')); + end + time_binned = obj.time_binned; + p = nan(size(time_binned(keeptimes))); + v_binned = obj.v_binned(keeptimes,keepsweeps); + label_binned = obj.label_binned(eegopt); + for k=1:length(p) + p(k) = anova1(v_binned(k,:),label_binned,'off'); + end + semilogy(1e3*time_binned(keeptimes),p,'s'); + set(gcf,'Color',[1 1 1]) + set(gca,'FontSize',14) + xlabel('Time(ms)'); + ylabel('p-value'); + title(sprintf('P-value for ANOVA, N = %i',nnz(keepsweeps))); + yl = ylim; + ylim([yl(1) 1]); + end + function doclassify(obj,removeartifacts,eegopt) + if ~removeartifacts + keeptimes = true(size(obj.time_binned)); + else + keeptimes = ~any(cell2mat(obj.vals('artifacts_binned')')); + end + times = obj.time_binned; + times = times(keeptimes); + keeptimes = find(keeptimes); + correct = zeros(size(keeptimes)); + for k=1:length(times) + fprintf('%i out of %i\n',k,length(times)); + sample = []; + training = []; + group = []; + correct_answer = {}; + for j=1:obj.n + type = obj.get(j); + switch eegopt + case 'all' + keepsweeps = true(size(type.rising_edge)); + case 'rising' + keepsweeps = type.rising_edge; + case 'no_rising' + keepsweeps = ~type.rising_edge; + otherwise + error('Uknown option: %s\n',eegopt); + end + v_binned = type.v_binned(); + v_binned = v_binned(keeptimes(1:k),keepsweeps); + labels = type.label_binned(eegopt); + n = size(v_binned,2); + indexes = randperm(n); + top = ceil(5*n/6); + training_ind = indexes(1:top); + sample_ind = indexes(top+1:end); + if isempty(sample_ind) + error('No sample set') + end + training = [training; v_binned(:,training_ind)']; + group = [group; labels(training_ind)']; + sample = [sample; v_binned(:,sample_ind)']; + correct_answer = [correct_answer; labels(sample_ind)']; + end + class = classify(sample,training,group,'quadratic'); + nbr = 0; + for j=1:length(sample) + if strcmp(class{j},correct_answer{j}) + nbr = nbr+1; + end + end + correct(k) = nbr/length(sample); + end + clf + plot(1e3*times,100*correct,'Marker','+') + set(gcf,'Color',[1 1 1]) + set(gca,'FontSize',14) + xlabel('Time (ms)'); + ylabel('% correct classification') + end + function ret = dt(~) + ret = 1e-5; + end + function ret = binwidth(~) + ret = 1e2; + end + function ret = rising_edge(obj) + ret = cell2mat(obj.vals('rising_edge')); + end + end +end \ No newline at end of file diff --git a/customized/NcChild.m b/customized/NcChild.m new file mode 100644 index 0000000..1373307 --- /dev/null +++ b/customized/NcChild.m @@ -0,0 +1,22 @@ +classdef NcChild < handle + properties + parent + end + properties (Dependent) + time + end + methods + function ret = get.time(obj) + ret = obj.parent.time; + end + function ret = time_binned(obj) + ret = obj.parent.time_binned; + end + function ret = binwidth(obj) + ret = obj.parent.binwidth; + end + function ret = dt(obj) + ret = obj.parent.dt; + end + end +end \ No newline at end of file diff --git a/customized/NcParent.m b/customized/NcParent.m new file mode 100644 index 0000000..9deaccc --- /dev/null +++ b/customized/NcParent.m @@ -0,0 +1,14 @@ +classdef NcParent < handle + methods (Abstract) + ret = vals(obj,property) + end + properties (Dependent) + v_binned + end + methods + function ret = get.v_binned(obj) + ret = cell2mat(obj.vals('v_binned')); + end + + end +end \ No newline at end of file diff --git a/customized/NcSweep.m b/customized/NcSweep.m new file mode 100644 index 0000000..8269259 --- /dev/null +++ b/customized/NcSweep.m @@ -0,0 +1,18 @@ +classdef NcSweep < NcChild + properties + v + rising_edge + end + properties (Dependent) + v_binned + end + methods + function ret = get.v_binned(obj) + n = length(obj.time_binned); + ret = zeros(n,1); + for k=1:n + ret(k) = mean(obj.v((k-1)*obj.binwidth+(1:obj.binwidth))); + end + end + end +end \ No newline at end of file diff --git a/customized/NcType.m b/customized/NcType.m new file mode 100644 index 0000000..a2c7252 --- /dev/null +++ b/customized/NcType.m @@ -0,0 +1,126 @@ +classdef NcType < ObjectList & NcChild & NcParent + properties + label + artifacts + end + properties (Dependent) + rising_edge + artifacts_binned + end + methods + function add(obj,item) + add@ObjectList(obj,item); + item.parent = obj; + end + function plotdata(obj,removeartifacts,eegopt) + if ~removeartifacts + keeptimes = true(size(obj.time_binned)); + else + keeptimes = ~obj.artifacts_binned; + end + hold on + time_binned = obj.time_binned; + for k=1:obj.n + sc_square_subplot(obj.n,k); + cla + switch eegopt + case 'all' + do_plot = true; + case 'rising' + do_plot = obj.get(k).rising_edge; + case 'no_rising' + do_plot = ~obj.get(k).rising_edge; + otherwise + error('Uknown option: %s\n',eegopt); + end + if do_plot + plot(time_binned(keeptimes),obj.get(k).v_binned(keeptimes),'*',... + obj.time,obj.get(k).v); + end + set(gca,'FontSize',14) + end + axis tight + end + function plotavg(obj,removeartifacts,eegopt) + switch eegopt + case 'all' + keepsweeps = true(size(obj.list)); + case 'rising' + keepsweeps = cell2mat(obj.vals('rising_edge')); + case 'no_rising' + keepsweeps = ~cell2mat(obj.vals('rising_edge')); + otherwise + error('Uknown option: %s\n',eegopt); + end + if ~removeartifacts + keeptimes = true(size(obj.time_binned)); + else + keeptimes = ~obj.artifacts_binned; + end + time_binned = obj.time_binned; + v_binned = obj.v_binned; + plot(time_binned(keeptimes),mean(v_binned(keeptimes,keepsweeps),2)); + end + function nn = plotall(obj,removeartifacts,eegopt) + switch eegopt + case 'all' + keepsweeps = true(size(obj.list)); + case 'rising' + keepsweeps = cell2mat(obj.vals('rising_edge')); + case 'no_rising' + keepsweeps = ~cell2mat(obj.vals('rising_edge')); + otherwise + error('Uknown option: %s\n',eegopt); + end + if ~removeartifacts + keeptimes = true(size(obj.time_binned)); + else + keeptimes = ~obj.artifacts_binned; + end + hold on + time_binned = obj.time_binned; + for k=1:obj.n + v_binned = obj.get(k).v_binned; + plot(time_binned(keeptimes),v_binned(keeptimes)); + end + v_binned = obj.v_binned; + plot(time_binned(keeptimes),mean(v_binned(keeptimes,keepsweeps),2),'Color','k','LineWidth',2) + nn = nnz(keepsweeps); + end + function ret = N(obj) + if ~obj.n + ret = 0; + else + ret = length(obj.list(1).v); + end + end + function ret = label_binned(obj,eegopt) + switch eegopt + case 'all' + keepsweeps = true(size(obj.list)); + case 'rising' + keepsweeps = cell2mat(obj.vals('rising_edge')); + case 'no_rising' + keepsweeps = ~cell2mat(obj.vals('rising_edge')); + otherwise + error('Uknown option: %s\n',eegopt); + end + ret = cell(size(obj.list)); + for k=1:length(ret) + ret(k) = {obj.label}; + end + ret = ret(keepsweeps); + end + function ret = get.artifacts_binned(obj) + time_binned = obj.time_binned-obj.binwidth*obj.dt*.6; + ret = false(size(time_binned)); + for k=1:length(obj.artifacts) + [~,ind] = sc_nearest(time_binned,obj.artifacts(k),'lower'); + ret(ind) = true; + end + end + function ret = get.rising_edge(obj) + ret = cell2mat(obj.vals('rising_edge')); + end + end +end \ No newline at end of file diff --git a/customized/rat_neocortex.m b/customized/rat_neocortex.m new file mode 100644 index 0000000..dcca647 --- /dev/null +++ b/customized/rat_neocortex.m @@ -0,0 +1,121 @@ +%function nc = rat_neocortex +clear + +removeartifacts = true; +eegopt = 'no_rising'; + +remove_stims_struct(8).remove = [3 6 7 8 12 13 15 17 18 21 25 26 29 31 32 35 36 37 38]; +remove_stims_struct(8).label = 'flat sa'; +remove_stims_struct(1).remove = [2 5 10 14 17 20 22 24 25 32 33 35 36 38]; +remove_stims_struct(1).label = 'flat fa'; +remove_stims_struct(2).remove = [1 2 7 8 9 15 18 22 24 25 26 28 29 30 33 34 35 36 37]; +remove_stims_struct(2).label = '2.0 sa'; +remove_stims_struct(3).remove = [1 2 3 5 6 10 15 16 17 18 19 20 22 23 25 27 32 33 34]; +remove_stims_struct(3).label = '2.0 fa'; +remove_stims_struct(4).remove = [2 3 7 8 10 18 24 25 35 37]; +remove_stims_struct(4).label = '1.0 sa'; +remove_stims_struct(5).remove = [1 2 4 9 10 11 12 13 14 15 16 22 24 25 26 30 31 32 35 37]; +remove_stims_struct(5).label = '1.0 fa'; +remove_stims_struct(6).remove = [2 4 6 8 14 16 18 22 23 25 26 27 29 31 32 33 36 37]; +remove_stims_struct(6).label = '0.5 sa'; +remove_stims_struct(7).remove = [1 2 8 9 11 12 14 15 20 24 28 29 35 36 37 38]; +remove_stims_struct(7).label = '0.5 fa'; + +fname = 'D:\MATLAB\sc_mat filer\BPNR_sc.mat'; +filenbr = 1; +pretrigger = -1e5; +posttrigger = 1e4; +dd = load(fname); +experiment = dd.obj; + + +file = experiment.get(filenbr); +signal = file.signals.get('tag','patch'); +sequence = file.get('tag','proto'); +v = signal.sc_loadsignal(); +v = signal.filter.raw_filt(v); +v = signal.filter.artifact_removal(v,sequence.tmin,sequence.tmax); +v = signal.filter.remove_waveforms(v,sequence.tmin,sequence.tmax); + +spikes1 = signal.waveforms.get(1).gettimes(sequence.tmin,sequence.tmax); +spikes2 = signal.waveforms.get(2).gettimes(sequence.tmin,sequence.tmax); +triggerparents = file.gettriggerparents(0,inf); +triggerparent = triggerparents.get('tag','TextMark'); +triggers = file.gettriggers(sequence.tmin,sequence.tmax); +electrode_stimtimes = cell(10,1); +for k=1:length(electrode_stimtimes) + tag = sprintf('V%i',k); + if triggers.has('tag',tag) + stim = triggers.get('tag',tag); + electrode_stimtimes(k) = {stim.gettimes(sequence.tmin,sequence.tmax)}; + end +end +nc = NcCell; +% figure(101) +% clf +% set(gcf,'Color',[1 1 1]); +% figure(102) +% clf +% set(gcf,'Color',[1 1 1]); +% figure(103) +% clf +% set(gcf,'Color',[1 1 1]); +% figure(104) +% clf +% set(gcf,'Color',[1 1 1]); +for k=1:length(remove_stims_struct) + trigger = triggerparent.triggers.get('tag',remove_stims_struct(k).label); + triggertimes = trigger.gettimes(sequence.tmin,sequence.tmax); +% figure(101) +% sc_square_subplot(length(remove_stims_struct),k); +% sc_perihist(triggertimes,spikes1,-1e-1,1e-1,1e-3); +% title(remove_stims_struct(k).label); +% figure(102) +% sc_square_subplot(length(remove_stims_struct),k); +% sc_kernelhist(triggertimes,spikes1,-1e-1,1e-1,1e-3,'bandwidth',5e-4); +% title(remove_stims_struct(k).label); +% +% figure(103) +% sc_square_subplot(length(remove_stims_struct),k); +% sc_perihist(triggertimes,spikes2,-1e-1,1e-1,1e-3); +% title(remove_stims_struct(k).label); +% figure(104) +% sc_square_subplot(length(remove_stims_struct),k); +% sc_kernelhist(triggertimes,spikes2,-1e-1,1e-1,1e-3,'bandwidth',5e-4); +% title(remove_stims_struct(k).label); +% + type = NcType(); + type.label = remove_stims_struct(k).label; + artifacts = []; + for j=1:length(electrode_stimtimes) + artifacts = [artifacts; sc_perieventtimes(triggertimes,electrode_stimtimes{j},0,posttrigger)]; + end + type.artifacts = unique(artifacts); + [sweeps,time] = sc_perieventsweep(v,round(triggertimes/1e-5)+1,pretrigger,posttrigger-1,1e-5); + vm = nan(length(triggertimes),nnz(time>=0)); + for j=1:size(vm,1) + vm0 = sweeps(j,time<0); + vm0 = mean(vm0(end-10:end)); + vm(j,:) = sweeps(j,time>=0) - vm0;%mean(sweeps(j,time<0)); + end + for j=1:size(vm,1) + sw = NcSweep(); + sw.v = vm(j,:); + sw.rising_edge = any(remove_stims_struct(k).remove == j); + type.add(sw); + end + nc.add(type); +end + +%nc.plotdata(removeartifacts,eegopt); +% figure(11) +% clf +% nc.binwiseanova(removeartifacts,eegopt); +% figure(12) +% clf +% nc.plotavg(removeartifacts,eegopt); +% figure(13) +% clf +% nc.plotall(removeartifacts,eegopt); +% + diff --git a/test_dependency.m b/customized/test_dependency.m similarity index 100% rename from test_dependency.m rename to customized/test_dependency.m diff --git a/modify_threshold/sc_perieventsweep.m b/modify_threshold/sc_perieventsweep.m index d4550f1..5e5280f 100644 --- a/modify_threshold/sc_perieventsweep.m +++ b/modify_threshold/sc_perieventsweep.m @@ -1,4 +1,4 @@ -function sweep = sc_perieventsweep(v,triggerpos,pretrigger,posttrigger) +function [sweep,time] = sc_perieventsweep(v,triggerpos,pretrigger,posttrigger,dt) if size(triggerpos,2)>1 triggerpos = triggerpos'; end @@ -6,4 +6,7 @@ pos(pos<1) = ones(nnz(pos<1),1); pos(pos>length(v)) = length(v)*ones(nnz(pos>length(v)),1); sweep = v(pos); +if nargout>=2 && nargin>=5 + time = (pretrigger*dt):dt:(posttrigger*dt); +end end \ No newline at end of file diff --git a/sc.m b/sc.m index b4a21ab..0b60853 100644 --- a/sc.m +++ b/sc.m @@ -3,6 +3,9 @@ % SC (without arguments) opens file dialog to load experiment file % (i.e. 'ABCD_sc.mat'). % +% SC -ADDPATH update current path (necessary for using other functions +% that also utilizes the ScExperiment classes +% % SC -LOADNEW suppress autoloading of previous experiment file % % SC -VERSION get versioning number @@ -25,10 +28,16 @@ % SC -WHAT print all available information about experiment files in % chosen directory % -% Copyright 2014 Neural Basis of Sensorimotor Control, Lund University +% Copyright 2015 Neural Basis of Sensorimotor Control, Lund University % hannes.mogensen@med.lu.se if nargout, gui = []; end addpath(genpath(fileparts(mfilename('fullpath')))); +if numel(varargin) && strcmpi(varargin{1},'-addpath') + return +elseif numel(varargin) && strcmpi(varargin{1},'-eeg') + gui = Eeg; + return +end if ~sc_version_check return end @@ -75,9 +84,8 @@ end end -if strcmpi(args{1},'-addpath') - return -elseif strcmpi(args{1},'-help') + +if strcmpi(args{1},'-help') help(mfilename) return elseif strcmpi(args{1},'-what') @@ -108,12 +116,6 @@ for i=1:numel(rawdatafiles) fprintf('scanning file %i out of %i\n',i,numel(rawdatafiles)); file = ScFile(experiment, rawdatafiles{i}); -% if strcmpi(args{1},'-newsp2') -% %Look for 'Pontus-style' files with spikes detected in Spike2 -% [~,name] = fileparts(rawdatafiles{i}); -% spikefiles = cellfun(@(x) cell2mat(regexp(x,['^' name '_\w*\.mat.{0,0}'],'match')), rawdatafiles, 'UniformOutput',false); -% file.spikefiles = spikefiles(cellfun(@(x) ~isempty(x), spikefiles)); -% end file.init(); experiment.add(file); end diff --git a/sensorimotor/classes/ScSignal.m b/sensorimotor/classes/ScSignal.m index 3f09c72..84c924d 100644 --- a/sensorimotor/classes/ScSignal.m +++ b/sensorimotor/classes/ScSignal.m @@ -54,7 +54,15 @@ function sc_loadtimes(obj) msgbox('Error: Could not find channel %s in file %s\n',obj.channelname,obj.parent.filepath); return end - d = load(obj.parent.filepath,obj.channelname); + try + d = load(obj.parent.filepath,obj.channelname); + catch exc + warning('Could not read file, probably because it was too large for available RAM. Matlab error: %s\n',exc.message); + obj.dt = 0; + obj.N = 0; + v_raw = []; + return + end obj.dt = d.(obj.channelname).interval; obj.N = d.(obj.channelname).length;%numel(obj.v_raw); v_raw = d.(obj.channelname).values;%(t>tmin & t= appr if isempty(appr), near = []; return; end if nargin<3, options = 'abs'; end @@ -11,6 +16,9 @@ end [~,ind] = min(abs(x-appr)); near = x(ind); - + +if nargout>=2 + index = ind; +end end \ No newline at end of file diff --git a/sc_close_editors.m b/util/sc_close_editors.m similarity index 100% rename from sc_close_editors.m rename to util/sc_close_editors.m diff --git a/util/sc_kernelhist.m b/util/sc_kernelhist.m index 4e076a5..2e43863 100644 --- a/util/sc_kernelhist.m +++ b/util/sc_kernelhist.m @@ -1,6 +1,6 @@ function [f,t,h] = sc_kernelhist(varargin) -%SC_KERNELHIST(stimtimes,spiketimes,pretrigger,posttrigger,binwidth) -%SC_KERNELHIST(axeshandle,stimtimes,spiketimes,pretrigger,posttrigger,binwidth) +%SC_KERNELHIST(stimtimes,spiketimes,pretrigger,posttrigger,binwidth,ksdensityargs) +%SC_KERNELHIST(axeshandle,stimtimes,spiketimes,pretrigger,posttrigger,binwidth,ksdensityargs) %SC_KERNELHIST(...,ksdensityargs) if ishandle(varargin{1}) axeshandle = varargin{1}; diff --git a/util/sc_perieventsweep.m b/util/sc_perieventsweep.m new file mode 100644 index 0000000..d4550f1 --- /dev/null +++ b/util/sc_perieventsweep.m @@ -0,0 +1,9 @@ +function sweep = sc_perieventsweep(v,triggerpos,pretrigger,posttrigger) +if size(triggerpos,2)>1 + triggerpos = triggerpos'; +end +pos = bsxfun(@plus,triggerpos,pretrigger:posttrigger); +pos(pos<1) = ones(nnz(pos<1),1); +pos(pos>length(v)) = length(v)*ones(nnz(pos>length(v)),1); +sweep = v(pos); +end \ No newline at end of file diff --git a/util/sc_perieventtimes.m b/util/sc_perieventtimes.m index c9f0d0a..6e4e6a7 100644 --- a/util/sc_perieventtimes.m +++ b/util/sc_perieventtimes.m @@ -1,4 +1,5 @@ function times = sc_perieventtimes(stimtimes,spiketimes,pretrigger,posttrigger) +%times = sc_perieventtimes(stimtimes,spiketimes,pretrigger,posttrigger) if size(stimtimes,1)>1, stimtimes = stimtimes'; end if size(spiketimes,2)>1, spiketimes = spiketimes'; end if ~numel(stimtimes) || ~numel(spiketimes), diff --git a/viewers/@SequenceViewer/SequenceViewer.m b/viewers/@SequenceViewer/SequenceViewer.m index e268bf5..ffb6660 100644 --- a/viewers/@SequenceViewer/SequenceViewer.m +++ b/viewers/@SequenceViewer/SequenceViewer.m @@ -17,7 +17,7 @@ end methods (Static) function str = version_str() - str = '>1.2.2'; + str = '1.2.3'; end end properties (SetObservable)