load('ampullary.mat')
load('electroreceptor_stimulus.mat')
sample_rate = 20000; % Hz
max_time = 10;

%% create instantaneous firing rate on the basis of the interspike intervals
t = times{1};
firing_rate = [0 1./diff(t)];
start = 1;
response = zeros(1, round(max_time * sample_rate));
for i = 1:length(t)
    response(1,start:round(t(i) * sample_rate)) = firing_rate(i);
    start = round(t(i) * sample_rate);
end
fig = figure();
set(gcf, 'PaperUnits', 'centimeters');
set(gcf, 'PaperSize', [11.7 9.0]);
set(gcf, 'PaperPosition',[0.0 0.0 11.7 9.0]);
set(gcf,'Color', 'white')
plot((1/sample_rate:1/sample_rate:max_time), response)
xlabel('time [s]')
ylabel('firing rate [Hz]')
ylim([0 300])
xlim([0 1])
title('instanataneous firing rate')
saveas(fig, 'isi.pdf','pdf')


%% create PSTH using the binning method
bin_width = 0.0125; % s
edges = 0:bin_width:max_time;
firing_rate = [];
for i = 1:size(times,2)
    t = times{i};
    [n, time] = hist(t, edges);
    if isempty(firing_rate)
        firing_rate = n / bin_width / size(times,2);
    else
        firing_rate = firing_rate + (n / bin_width / size(times,2));
    end
end

response = zeros(1, round(max_time * sample_rate));
start_index = 1;
for i = 1:length(edges)
    end_index = round(edges(i) * sample_rate);
    response(start_index:end_index) = firing_rate(i);
    start_index = end_index +1; 
end

fig = figure();
set(gcf, 'PaperUnits', 'centimeters');
set(gcf, 'PaperSize', [11.7 9.0]);
set(gcf, 'PaperPosition',[0.0 0.0 11.7 9.0]);
set(gcf,'Color', 'white')
plot(0:1/sample_rate:max_time-1/sample_rate, response)
ylim([0 300])
xlim([0 1])
xlabel('time [s]')
ylabel('firing rate [Hz]')
title('binning method')
saveas(fig, 'binning.pdf', 'pdf')


%% create PSTH using the kernel-convolution method
kernel_width = 0.0125; %s
binary_spikes = zeros(size(times,2), round(max_time*sample_rate));
responses = zeros(size(binary_spikes));
window = hann(kernel_width*sample_rate,'symmetric');
window = window/sum(window);

for i = 1:size(times,2)
    t = times{i};
    temp = round(t*sample_rate);
    if temp(1) <= 0 
      temp(1) = 1;
    end
    binary_spikes(i, temp) = 1;
    responses(i,:) = conv(binary_spikes(i,:), window, 'same')*sample_rate;
end
fig = figure();
set(gcf, 'PaperUnits', 'centimeters');
set(gcf, 'PaperSize', [11.7 9.0]);
set(gcf, 'PaperPosition',[0.0 0.0 11.7 9.0]);
set(gcf,'Color', 'white')

subplot(2,1,1)
plot((1/sample_rate:1/sample_rate:max_time), mean(responses,1))
ylim([0 300])
xlim([0 1])
xlabel('time [s]')
ylabel('firing rate [Hz]')
title('convolution method')

subplot(2,1,2)
plot(stimulus_strong(:,1), stimulus_strong(:,2))
ylim([-1 1])
xlim([0 1])
xlabel('time [s]')
ylabel('stimulus intensity [arb. units]')
