diff --git a/sc/experiment/classes/@ScFile/get_triggables.m b/sc/experiment/classes/@ScFile/get_triggables.m new file mode 100644 index 0000000..6705961 --- /dev/null +++ b/sc/experiment/classes/@ScFile/get_triggables.m @@ -0,0 +1,18 @@ +function triggable = get_triggables(obj) + +triggable = {}; + +for i=1:obj.signals.n + + signal = obj.signals.get(i); + + if signal.waveforms.n > 0 + triggable = add_to_list(triggable, signal); + end + +end + +triggable = concat_list(triggable, obj.stims.cell_list); +triggable = concat_list(triggable, obj.textchannels.cell_list); + +end \ No newline at end of file diff --git a/sc/experiment/classes/@ScSignal/ScSignal.m b/sc/experiment/classes/@ScSignal/ScSignal.m index f41618d..0a39a68 100644 --- a/sc/experiment/classes/@ScSignal/ScSignal.m +++ b/sc/experiment/classes/@ScSignal/ScSignal.m @@ -1,4 +1,5 @@ -classdef ScSignal < ScChannel & ScDynamicClass & sc_experiment.EmptyClassPlaceholder +classdef ScSignal < ScChannel & ScDynamicClass & sc_experiment.EmptyClassPlaceholder & ... + sc_experiment.Triggable methods (Static) empty_class = make_empty_class() diff --git a/sc/experiment/classes/@ScSignal/get_tags.m b/sc/experiment/classes/@ScSignal/get_tags.m new file mode 100644 index 0000000..6793eba --- /dev/null +++ b/sc/experiment/classes/@ScSignal/get_tags.m @@ -0,0 +1,5 @@ +function val = get_tags(obj) + +val = obj.waveforms.values('tag'); + +end \ No newline at end of file diff --git a/sc/experiment/classes/ScStim.m b/sc/experiment/classes/ScStim.m index 2eafb0a..2d816be 100644 --- a/sc/experiment/classes/ScStim.m +++ b/sc/experiment/classes/ScStim.m @@ -1,51 +1,88 @@ -classdef ScStim < ScChannel - +classdef ScStim < ScChannel & sc_experiment.Triggable + properties + triggers istrigger + end - + methods + function obj = ScStim(parent, channelname,varargin) + obj.parent = parent; obj.channelname = channelname; obj.istrigger = false; + for k=1:2:numel(varargin) obj.(varargin{k}) = varargin{k+1}; end + end - + + function sc_loadtimes(obj) + obj.triggers = ScList(); + if isempty(who('-file',obj.parent.filepath,obj.channelname)) + fprintf('Warning: Could not find channel %s in file %s\n',obj.channelname,obj.parent.filepath); return + end - d = load(obj.parent.filepath,obj.channelname); + + d = load(obj.parent.filepath, obj.channelname); times = d.(obj.channelname).times; + if isfield(d.(obj.channelname),'codes') + codes = d.(obj.channelname).codes; uniquecodes = unique(codes,'rows'); + for i=1:size(uniquecodes,1) + rows = all(codes == repmat(uniquecodes(i,:),size(codes,1),1),2); tag = num2str(uniquecodes(i,:)); pos = isspace(tag); tag = tag(~pos); - obj.triggers.add(ScSpikeTrain(tag,times(rows))); + obj.triggers.add(ScSpikeTrain(tag, times(rows))); + end + else - obj.triggers.add(ScSpikeTrain(obj.tag,times)) + + obj.triggers.add(ScSpikeTrain(obj.tag, times)) + end + end - + + function sc_clear(obj) + obj.triggers = ScList; + end - + + + function val = get_tags(obj) + + val = obj.triggers.values('tag'); + + end + end + methods (Static) + function obj = loadobj(a) + obj = loadobj@ScChannel(a); + end + end + end diff --git a/sc/experiment/classes/ScTextMark.m b/sc/experiment/classes/ScTextMark.m index 69617ba..d47839f 100644 --- a/sc/experiment/classes/ScTextMark.m +++ b/sc/experiment/classes/ScTextMark.m @@ -1,37 +1,54 @@ classdef ScTextMark < ScChannel & ScTriggerParent methods + function obj = ScTextMark(parent, channelname,varargin) - obj.parent = parent; + + obj.parent = parent; obj.channelname = channelname; - obj.triggers = ScList; + obj.triggers = ScList; + for k=1:2:numel(varargin) obj.(varargin{k}) = varargin{k+1}; end + end + %Load digital channel values function sc_loadtimes(obj) + obj.triggers = ScList; + if isempty(who('-file',obj.parent.filepath,obj.channelname)) + fprintf('Warning: Could not find channel %s in file %s\n',obj.channelname,obj.parent.filepath); return + end + d = load(obj.parent.filepath,obj.channelname); + if isfield(d.(obj.channelname),'text') + times = d.(obj.channelname).times; text = d.(obj.channelname).text; cellstr = cell(size(times)); + for i=1:numel(cellstr) cellstr(i) = {deblank(text(i,:))}; end + tags = unique(cellstr); obj.triggers = ScList; + for i=1:numel(tags) + pos = cellfun(@(x) strcmp(x,tags{i}), cellstr); tagtimes = times(pos); if obj.parent.stims.has('tag','DigMark') + trigger = obj.parent.stims.get('tag','DigMark').triggers.get('tag','1000'); if isempty(trigger) @@ -39,17 +56,35 @@ function sc_loadtimes(obj) end digmarktimes = obj.parent.stims.get('tag','DigMark').triggers.get('tag','1000').gettimes(-inf,inf); + for j=1:numel(tagtimes) + [~,ind] = min(abs(tagtimes(j)-digmarktimes)); tagtimes(j) = digmarktimes(ind); + end + end + obj.triggers.add(ScSpikeTrain(tags{i},tagtimes)); + end + end + + end + + + function val = get_tags(obj) + + val = obj.triggers.values('tag'); + end + end + methods (Static) + function obj = loadobj(a) obj = loadobj@ScChannel(a); end diff --git a/sc/viewer/classes/panels/@AmplitudeComputedChannel/AmplitudeComputedChannel.m b/sc/viewer/classes/panels/@AmplitudeComputedChannel/AmplitudeComputedChannel.m index de00924..b8d996a 100644 --- a/sc/viewer/classes/panels/@AmplitudeComputedChannel/AmplitudeComputedChannel.m +++ b/sc/viewer/classes/panels/@AmplitudeComputedChannel/AmplitudeComputedChannel.m @@ -21,7 +21,7 @@ function plot_amplitude(obj) start = intra_get_amplitude_pseudo_start(amplitude); stop = intra_get_amplitude_pseudo_stop(amplitude, obj.gui.main_channel.v); - is_pseudo = intra_is_amplitude_data_pseudo(amplitude); + is_pseudo = ~amplitude.valid_data; rise = intra_get_amplitude_pseudo_rise(start, stop, is_pseudo, ... amplitude, obj.gui.main_channel.v); middle = intra_get_middle_index(rise, .1); diff --git a/sc2/+sc_experiment/Triggable.m b/sc2/+sc_experiment/Triggable.m new file mode 100644 index 0000000..813b1a7 --- /dev/null +++ b/sc2/+sc_experiment/Triggable.m @@ -0,0 +1,7 @@ +classdef Triggable < handle + + methods (Abstract) + varargout = get_tags(varargin) + end + +end \ No newline at end of file diff --git a/sc2/sc-viewer/panels/+sc_viewer/@ScExperimentPanel/ScExperimentPanel.m b/sc2/sc-viewer/panels/+sc_viewer/@ScExperimentPanel/ScExperimentPanel.m index e1fac54..a95d990 100644 --- a/sc2/sc-viewer/panels/+sc_viewer/@ScExperimentPanel/ScExperimentPanel.m +++ b/sc2/sc-viewer/panels/+sc_viewer/@ScExperimentPanel/ScExperimentPanel.m @@ -127,7 +127,13 @@ function signal1_callback(obj) function signal2_callback(obj) indx = get(obj.ui_signal2, 'Value'); - obj.viewer.set_signal2(obj.viewer.file.signals.get(indx)); + signals = obj.viewer.file.signals; + + if indx <= length(signals) + obj.viewer.set_signal2(signals(indx)); + else + obj.viewer.set_signal2([]); + end end @@ -175,7 +181,9 @@ function file_listener(obj) end else + set(obj.ui_file, 'Visible', 'off'); + end end @@ -226,20 +234,17 @@ function signal1_listener(obj) function signal2_listener(obj) - if ~isempty(obj.viewer.signal2) + str = obj.viewer.file.signals.values('tag'); + str = add_to_list(str, '#none'); - str = obj.viewer.file.signals.values('tag'); - indx = find(@(x) strcmp(x, obj.viewer.signal2.tag), str); + if ~isempty(obj.viewer.signal2) - if ~isempty(indx) - set(obj.ui_signal2, 'String', str, 'Value', indx, 'Visible', 'on'); - else - set(obj.ui_signal2, 'Visible', 'off'); - end + indx = find(@(x) strcmp(x, obj.viewer.signal2.tag), str); + set(obj.ui_signal2, 'String', str, 'Value', indx, 'Visible', 'on'); else - set(obj.ui_signal2, 'Visible', 'off'); + set(obj.ui_signal2, 'String', str, 'Value', length(str), 'Visible', 'on'); end diff --git a/sc2/sc-viewer/panels/+sc_viewer/@ScTriggerPanel/ScTriggerPanel.m b/sc2/sc-viewer/panels/+sc_viewer/@ScTriggerPanel/ScTriggerPanel.m index c68440b..f0576da 100644 --- a/sc2/sc-viewer/panels/+sc_viewer/@ScTriggerPanel/ScTriggerPanel.m +++ b/sc2/sc-viewer/panels/+sc_viewer/@ScTriggerPanel/ScTriggerPanel.m @@ -17,7 +17,7 @@ function ui_panel = get_panel(viewer) - ui_panel = uipanel(viewer.button_window, 'Title', 'Experiment'); + ui_panel = uipanel(viewer.button_window, 'Title', 'Trigger'); panel = sc_viewer.ScTriggerPanel(ui_panel, viewer); mgr = sc_layout.PanelLayoutManager(ui_panel); @@ -39,11 +39,6 @@ panel.ui_tot_trigger_nbr = mgr.add(sc_ctrl('text', ''), 200); mgr.newline(); - mgr.add(sc_ctrl('text', 'Trigger #'), 100); - panel.ui_trigger_indx = mgr.add(sc_ctrl('edit', [], ... - @(~,~) panel.trigger_indx_callback(), 'Visible', 'off'), 100); - mgr.newline(); - mgr.add(sc_ctrl('text', 'trigger_increment'), 100); panel.ui_trigger_increment = mgr.add(sc_ctrl('edit', [], ... @(~,~) panel.trigger_increment_callback(), 'Visible', 'off'), 100); @@ -74,30 +69,18 @@ mgr.trim(); - sc_addlistener(viewer, 'trigger_parent', ... - @(~,~) panel.trigger_parent_listener(), ui_panel); - - sc_addlistener(viewer, 'trigger_tag', ... - @(~,~) panel.trigger_tag_listener(), ui_panel); - - sc_addlistener(viewer, 'trigger_time', ... - @(~,~) panel.trigger_time_listener(), ui_panel); - - sc_addlistener(viewer, 'pretrigger', ... - @(~,~) panel.pretrigger_listener(), ui_panel); - - sc_addlistener(viewer, 'posttrigger', ... - @(~,~) panel.posttrigger_listener(), ui_panel); - - sc_addlistener(viewer, 'trigger_increment', ... - @(~,~) panel.incremnent_listener(), ui_panel); - panel.trigger_parent_listener(); panel.trigger_tag_listener(); panel.trigger_time_listener(); panel.pretrigger_listener(); panel.posttrigger_listener(); + sc_addlistener(panel.viewer, 'trigger_parent', @(~,~) panel.trigger_parent_listener, ui_panel); + sc_addlistener(panel.viewer, 'trigger_tag', @(~,~) panel.trigger_tag_listener, ui_panel); + sc_addlistener(panel.viewer, 'trigger_time', @(~,~) panel.trigger_time_listener, ui_panel); + sc_addlistener(panel.viewer, 'pretrigger', @(~,~) panel.pretrigger_listener, ui_panel); + sc_addlistener(panel.viewer, 'posttrigger', @(~,~) panel.posttrigger_listener, ui_panel); + end end @@ -113,27 +96,82 @@ methods (Access = protected) function trigger_parent_listener(obj) - error('Not implemented'); + + triggables = obj.viewer.file.get_triggables(); + str = get_values(triggables, 'tag'); + str = add_to_list(str, '#none'); + + if isempty(obj.viewer.trigger_parent) + indx = length(str); + else + indx = find(cellfun(@(x) x == obj.viewer.trigger_parent, triggables)); + end + + set(obj.ui_trigger_parent, 'String',str, 'Value', indx, ... + 'Visible', 'on'); + end function trigger_tag_listener(obj) - error('Not implemented'); + + if isempty(obj.viewer.trigger_tag) + + set(obj.ui_trigger_tag, 'Visible', 'off'); + return + + end + + str = obj.viewer.trigger_parent.get_tags(); + indx = find(cellfun(@(x) strcmp(x, obj.viewer.trigger_tag), str)); + + set(obj.ui_trigger_tag, 'String', str, ... + 'Value', indx, 'Visible', 'on'); + end function trigger_time_listener(obj) - error('Not implemented'); + + set(obj.ui_trigger_time, 'String', obj.viewer.trigger_time); + end function pretrigger_listener(obj) - error('Not implemented'); + + set(obj.ui_trigger_time, 'String', obj.viewer.pretrigger); + end function posttrigger_listener(obj) - error('Not implemented'); + + set(obj.ui_trigger_time, 'String', obj.viewer.pretrigger); + + end + + + function trigger_parent_callback(obj) + + indx = get(obj.ui_trigger_parent, 'Value'); + triggables = obj.viewer.file.get_triggables(); + + if indx > length(triggables) + obj.viewer.set_trigger_parent([]); + else + obj.viewer.set_trigger_parent(triggables{indx}); + end + + end + + + function trigger_tag_callback(obj) + + indx = get(obj.ui_trigger_parent, 'Value'); + tags = obj.viewer.trigger_parent.get_tags(); + obj.viewer.set_trigger_tag(tags{indx}); + end end diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScButtonViewer/show.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScButtonViewer/show.m index df8990d..0a456bb 100644 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScButtonViewer/show.m +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScButtonViewer/show.m @@ -6,22 +6,22 @@ function show(obj) end set(obj.button_window, 'ToolBar', 'None', 'MenuBar', 'none'); -set(obj.button_window, 'CloseRequestFcn', @(~,~) obj.close_request); +set(obj.plot_window, 'CloseRequestFcn', @(~,~) obj.close_request); set(obj.button_window, 'Tag', sc_viewer.ScViewer.figure_tag) if isempty(obj.plot_window) || ~ishandle(obj.plot_window) obj.plot_window = figure; end -clf(obj.plot_window, 'reset'); -set(obj.plot_window, 'Tag', sc_viewer.ScViewer.figure_tag) +clf(obj.plot_window, 'reset'); +set(obj.plot_window, 'Tag', sc_viewer.ScViewer.figure_tag) mgr = sc_layout.FigureLayoutManager(obj.button_window); mgr.add(sc_viewer.ScUserInfoPanel.get_panel(obj), 200); mgr.newline(); mgr.add(sc_viewer.ScExperimentPanel.get_panel(obj), 200); -%mgr.newline(); -%mgr.add(sc_viewer.ScTriggerPanel.get_panel(obj)); +mgr.newline(); +mgr.add(sc_viewer.ScTriggerPanel.get_panel(obj), 200); mgr.trim(); diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScPlotViewer/close_request.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScPlotViewer/close_request.m new file mode 100644 index 0000000..76640cf --- /dev/null +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScPlotViewer/close_request.m @@ -0,0 +1,14 @@ +function close_request(obj) + + +if obj.has_unsaved_changes + + error('Not implemented yet') + +else + + delete(obj.plot_window); + +end + +end \ No newline at end of file diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/ScViewer.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/ScViewer.m index f18a267..3982239 100644 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/ScViewer.m +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/ScViewer.m @@ -7,6 +7,7 @@ % User info text user_info + has_unsaved_changes = false end diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_experiment.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_experiment.m deleted file mode 100644 index 1cd3e0a..0000000 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_experiment.m +++ /dev/null @@ -1,23 +0,0 @@ -function set_experiment(obj, experiment) - -if ischar(experiment) - - sc_settings.set_last_experiment(experiment); - experiment = load_experiment(experiment); - -end - -obj.experiment = experiment; - -if isempty(experiment) - - obj.set_file([]); - -else - - file = get_set_val(obj.experiment.list, obj.file, 1); - obj.set_file(file); - -end - -end diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_file.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_file.m index f09a89c..7a9c199 100644 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_file.m +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_file.m @@ -6,6 +6,10 @@ function set_file(obj, file) if isempty(file) obj.set_sequence([]); + obj.set_signal1([]); + obj.set_signal2([]); + obj.set_trigger_parent([]); + return end @@ -21,18 +25,22 @@ function set_file(obj, file) sequence = ScSequence(file, tag, tmin, tmax); file.add(sequence); -elseif file.contains(obj.sequence) - - obj.set_sequence(obj.sequence); - -elseif sc_contains(file.values('tag'), 'full') - - obj.set_sequence(obj.file.get('tag', 'full')); - -else +end + +obj.set_sequence(get_set_val(obj.file.list, obj.sequence, 'full')); + +signal1 = get_set_val(obj.file.signals.list, obj.signal1, 'patch'); +obj.set_signal1(signal1); + +if ~isempty(obj.signal2) - obj.set_sequence(obj.file.get(1)); + signal2 = get_set_val(obj.file.signals.list, obj.signal2, 'patch2'); + obj.set_signal2(signal2); end +trigger_parents = obj.file.get_triggables(); +trigger_parent = get_set_val(trigger_parents, obj.trigger_parent); +obj.set_trigger_parent(trigger_parent); + end diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_sequence.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_sequence.m index e69de29..81620fc 100644 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_sequence.m +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_sequence.m @@ -0,0 +1,9 @@ +function set_sequence(obj, sequence) + +if isempty(obj.file) + obj.sequence = []; +else + obj.sequence = get_item(obj.file.list, sequence); +end + +end \ No newline at end of file diff --git a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_trigger_parent.m b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_trigger_parent.m index 2452846..f0e9fd0 100644 --- a/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_trigger_parent.m +++ b/sc2/sc-viewer/viewer/+sc_viewer/@ScViewer/set_trigger_parent.m @@ -8,7 +8,7 @@ function set_trigger_parent(obj, val) else - trigger_tag = get_set_val(obj.trigger_parent.triggers.values('tag'), ... + trigger_tag = get_set_val(obj.trigger_parent.get_tags, ... obj.trigger_tag, 1); end diff --git a/scripts/intra-analysis/intra_compare_amplitude_heights.m b/scripts/intra-analysis/intra_compare_amplitude_heights.m new file mode 100644 index 0000000..fc040e3 --- /dev/null +++ b/scripts/intra-analysis/intra_compare_amplitude_heights.m @@ -0,0 +1,50 @@ +clear + +sc_settings.set_current_settings_tag(sc_settings.get_intra_analysis_tag()); +sc_debug.set_mode(true); + +intra_load_settings +intra_load_constants + +reset_fig_indx(); + +for i=1:length(neurons) + + signal = sc_load_signal(neurons(i)); + + incr_fig_indx(); + clf + + h1 = subplot(10, 1, 2:10); + hold on + + response_rate = nan(size(str_stims)); + + for j=1:length(str_stims) + + amplitude = signal.amplitudes.get('tag', str_stims{j}); + heights = amplitude.height; + + plot(j*ones(size(heights)), heights, 'k+'); + response_rate(j) = length(heights) / amplitude.N; + + end + + set(gca, 'XTick', 1:length(str_stims), 'XTickLabel', str_stims, ... + 'XTickLabelRotation', 270); + ylabel('EPSP amplitude [mV]') + grid on + + h2 = subplot(10, 1, 1); + bar(100*response_rate) + set(gca, 'XTick', []); + title(neurons(i).file_tag) + + linkaxes([h1 h2], 'x'); + + xlim([0 (length(str_stims)+1)]) + ylabel('Response rate %'); + +end + + \ No newline at end of file diff --git a/scripts/intra-analysis/intra_compare_avg_to_manual.m b/scripts/intra-analysis/intra_compare_avg_to_manual.m new file mode 100644 index 0000000..90edc8c --- /dev/null +++ b/scripts/intra-analysis/intra_compare_avg_to_manual.m @@ -0,0 +1,87 @@ +clear + +sc_settings.set_current_settings_tag(sc_settings.get_intra_analysis_tag()); +sc_debug.set_mode(true); + +intra_load_settings +intra_load_constants + +reset_fig_indx(); + +load intra_data.mat + +str_first_stims = arrayfun(@(x) x.stim_electrodes(1).tag, intra_patterns.patterns, 'UniformOutput', false); + +for i=1:length(neurons) + + neuron = neurons(i); + + signal = sc_load_signal(neuron); + + v = signal.get_v(true, false, false, false); + + incr_fig_indx(); + clf + + for j=1:length(str_first_stims) + + sc_square_subplot(length(str_first_stims), j) + hold on + + first_amplitude = signal.amplitudes.get('tag', str_first_stims{j}); + + [sweeps, times] = sc_get_sweeps(v, 0, first_amplitude.stimtimes, -.1, .5, signal.dt); + + [~, ind_zero] = min(abs(times)); + + for kk=1:size(sweeps, 2) + + sweeps(:, kk) = sweeps(:, kk) - sweeps(ind_zero, kk); + %plot(times, sweeps(:, kk)) + + end + + msweeps = mean(sweeps, 2); + plot(times, msweeps, 'LineWidth', 2) + + pattern = get_pattern(first_amplitude); + + str_pattern_stims = get_items(str_stims, @get_pattern, pattern); + + for k=1:length(str_pattern_stims) + + amplitude = signal.amplitudes.get('tag', str_pattern_stims{k}); + + ind = cellfun(@(x) strcmp(str_pattern_stims{k}, x), {intra_patterns.stim_electrodes.tag}); + offset = intra_patterns.stim_electrodes(ind).time; + [~, ind_offset] = min(abs(times - offset)); + + x0 = offset + amplitude.latency; + y0 = zeros(size(x0)); + + x1 = x0 + amplitude.width; + y1 = y0 + amplitude.height; + + ind = find(amplitude.valid_data); + +% for m=1:min(length(ind), 5) +% +% indx = times > x0(m) & times < x1(m); +% +% h = plot(times(indx), sweeps(indx, ind(m))); +% +% plot(x0(m), sweeps(ind_offset, ind(m))+ y0(m), '+', 'Color', get(h, 'Color')); +% plot(x1(m), sweeps(ind_offset, ind(m))+ y1(m), '+', 'Color', get(h, 'Color')); +% +% end + plot(x1, y1, '+', 'Tag', amplitude.tag) + + end + + title([neuron.file_tag ': ' pattern]) + grid on + %add_legend() + + end + +end \ No newline at end of file diff --git a/scripts/intra-analysis/intra_generate_figs.m b/scripts/intra-analysis/intra_generate_figs.m index cdad33a..503ae80 100644 --- a/scripts/intra-analysis/intra_generate_figs.m +++ b/scripts/intra-analysis/intra_generate_figs.m @@ -11,7 +11,7 @@ load intra_data.mat str_first_stims = arrayfun(@(x) x.stim_electrodes(1).tag, intra_patterns.patterns, 'UniformOutput', false); - +return stim_exists = false(size(str_first_stims)); for i=1:length(str_first_stims) diff --git a/scripts/paired-recordings/paired_compare_pairs.m b/scripts/paired-recordings/paired_compare_pairs.m new file mode 100644 index 0000000..6ca5ba3 --- /dev/null +++ b/scripts/paired-recordings/paired_compare_pairs.m @@ -0,0 +1,23 @@ +function dist = paired_compare_pairs(neuron_pair_1, neuron_pair_2) + +f1 = get_f(neuron_pair_1); +f2 = get_f(neuron_pair_2); + +%dist = min(sum(abs(f1-f2)), sum(abs(f1-f2(length(f2):-1:1)))); +dist = min(sqrt( sum( (f1-f2).^2 ) ), sqrt( sum( (f1-f2(length(f2):-1:1)).^2 ))); + +end + + +function f = get_f(neuron_pair) + +pretrigger = -1; +posttrigger = 1; +kernelwidth = 1e-3; +binwidth = 1e-3; + +[t1, t2] = paired_get_neuron_spiketime(neuron_pair); +f = sc_kernelfreq(t1, t2, pretrigger, posttrigger, 10*kernelwidth, binwidth); +f = zscore(f); + +end diff --git a/scripts/paired-recordings/paired_compare_triplets.m b/scripts/paired-recordings/paired_compare_triplets.m new file mode 100644 index 0000000..e64891c --- /dev/null +++ b/scripts/paired-recordings/paired_compare_triplets.m @@ -0,0 +1,120 @@ +clear +paired_setup + +reset_fig_indx() + +pretrigger = -1; +posttrigger = 1; +kernelwidth = 1e-3; +binwidth = 1e-3; + +file_tags = unique({ec_neurons.file_tag}); + +triplet_file_tags = file_tags(arrayfun(@(y) nnz(arrayfun(@(x) strcmp(x.file_tag, y), ec_neurons))>1, file_tags)); + +triplets_list = {}; + +for i=1:length(triplet_file_tags) + + triplets = ec_neurons(arrayfun(@(x) strcmp(x.file_tag, triplet_file_tags{i}), ec_neurons)); + + triplets_list = add_to_list(triplets_list, triplets); + + incr_fig_indx() + clf + + for j=1:length(triplets) + + tmp_triplet_1 = triplets(j); + [t1, t2] = paired_get_neuron_spiketime(tmp_triplet_1); + + sc_square_subplot(2*length(triplets), 2*j-1); + hold on + sc_kernelhist(t1, t2, pretrigger, posttrigger, kernelwidth, binwidth); + [~, ~, h_plot] = sc_kernelhist(t1, t2, pretrigger, posttrigger, 10*kernelwidth, binwidth); + set(h_plot, 'LineWidth', 2); + grid on + title([tmp_triplet_1.file_tag ': ' tmp_triplet_1.template_tag{1} ' - ' tmp_triplet_1.template_tag{2}]) + + sc_square_subplot(2*length(triplets), 2*j); + hold on + sc_kernelhist(t2, t1, pretrigger, posttrigger, kernelwidth, binwidth); + [~, ~, h_plot] = sc_kernelhist(t2, t1, pretrigger, posttrigger, 10*kernelwidth, binwidth); + set(h_plot, 'LineWidth', 2); + grid on + + end + +end + +ind1 = 0; + +labels = {}; + +clear dist + +avg_dist_same = []; +avg_dist_different = []; + +for i=1:length(triplets_list) + + sc_debug.print(i, length(triplets_list)); + + tmp_triplet_list_1 = triplets_list{i}; + + for j=1:length(tmp_triplet_list_1) + + tmp_triplet_1 = tmp_triplet_list_1(j); + ind1 = ind1 + 1; + ind2 = 0; + labels = add_to_list(labels, tmp_triplet_1.file_tag); + + for k=1:length(triplets_list) + + tmp_triplet_list_2 = triplets_list{k}; + + for m=1:length(tmp_triplet_list_2) + + tmp_triplet_2 = tmp_triplet_list_2(m); + ind2 = ind2+1; + + d = paired_compare_pairs(tmp_triplet_1, tmp_triplet_2); + dist(ind1, ind2) = d; + + if length(tmp_triplet_list_1) == length(tmp_triplet_list_2) && ... + all(tmp_triplet_list_1 == tmp_triplet_list_2) + + if ind1 ~= ind2 + avg_dist_same = add_to_list(avg_dist_same, d); + end + else + avg_dist_different = add_to_list(avg_dist_different, d); + end + + end + + end + + end + +end + +incr_fig_indx(); +clf +fill_matrix(dist); +colorbar +set(gca, 'XTick', (1:length(labels)), 'XTickLabel', labels, ... + 'YTick', (1:length(labels)), 'YTickLabel', labels, ... + 'XTickLabelRotation', 270); + +incr_fig_indx +clf +plot(avg_dist_same, ones(size(avg_dist_same)), '+') +hold on +plot(avg_dist_different, 2*ones(size(avg_dist_different)), '+') +ylim([0 3]) +plot(mean(avg_dist_different), 2, 'o') +plot(mean(avg_dist_same), 1, 'o') +plot(median(avg_dist_different), 2, '^') +plot(median(avg_dist_same), 1, '^') +