%% script to assess basic firing stats of simulations...
clear all; close all;

width = 50;
% radius = [0 100 200 300 400];
radius = 0:50:450;

iqrMSNrate = zeros(numel(radius),2); iqrMSNCVisi = zeros(numel(radius),2);
iqrFSrate = zeros(numel(radius),2); iqrFSCVisi = zeros(numel(radius),2);
for loop = 1:numel(radius)
    % fname = ['../Shell input results/500micron_cube/Shell_width' num2str(width) '_innerradius_' num2str(radius(loop)) '.mat'];
    % fname = ['../Shell input results/1mm cube/3%_FSIs/Shell_width' num2str(width) '_innerradius_' num2str(radius(loop)) '.mat']; % 1mm cubed....
    fname = ['../Shell input results/1mm cube/1%_FSIs/Shell_width' num2str(width) '_innerradius_' num2str(radius(loop)) '.mat']; % 1mm cubed....

    load(fname);

    MSspks = out.STms; 
    MSspks(:,1) = MSspks(:,1)+1; % change from zero-base to 1-base index 
    Nmsidxs(loop) = numel(SIMPARAMS.input.shell.MSids);   
    Nms_all = SIMPARAMS.net.MS.N;

    FSspks = out.STfs;
    FSspks(:,1) = FSspks(:,1)+1; % change from zero-base to 1-base index 
    Nfsidxs(loop) = numel(SIMPARAMS.input.shell.FSids);
    Nfs_all = SIMPARAMS.net.FS.N;

    % simulation parameters
    simT = SIMPARAMS.sim.tfinal; % in ms
    T = simT * 1e-3;    % in seconds

    % get stats for all MSNs other than centre
    MSrate = zeros(Nmsidxs(loop),1); MS_CVisi = zeros(Nmsidxs(loop),1);
    for j = 1:Nmsidxs(loop)
        if j ~= SIMPARAMS.input.shell.MScentre
            currix = find(MSspks(:,1) == SIMPARAMS.input.shell.MSids(j));
            % basic rate
            MSrate(j) = numel(currix) / T;

            % ISIs
            ts = MSspks(currix,2)*1e-3; % in seconds
            ISIs = diff(ts);
            MS_CVisi(j) = std(ISIs)/mean(ISIs);
        end
    end
    MS_CVisi(isnan(MS_CVisi)) = 0;
    medianMSNrate(loop) = median(MSrate); medianMSNCVisi(loop) = median(MS_CVisi); meanMSNrate(loop) = mean(MSrate); 
    iqrMSNrate(loop,:) = prctile(MSrate,[25,75]); iqrMSNCVisi(loop,:) = prctile(MS_CVisi,[25,75]);
    
    
    % get stats for all FSIs
    FSrate = zeros(Nfsidxs(loop),1); FS_CVisi = zeros(Nfsidxs(loop),1);
    for j = 1:Nfsidxs(loop)
        currix = find(FSspks(:,1) == SIMPARAMS.input.shell.FSids(j));
        % basic rate
        FSrate(j) = numel(currix) / T;

        % ISIs
        ts = FSspks(currix,2)*1e-3; % in seconds
        ISIs = diff(ts);
        FS_CVisi(j) = std(ISIs)/mean(ISIs);
    end
    FS_CVisi(isnan(FS_CVisi)) = 0;
    medianFSrate(loop) = median(FSrate); medianFSCVisi(loop) = median(FS_CVisi);  meanFSrate(loop) = mean(FSrate); 
    iqrFSrate(loop,:) = prctile(FSrate,[25,75]); iqrFSCVisi(loop,:) = prctile(FS_CVisi,[25,75]);

    %%% centre MSN
    currix = find(MSspks(:,1) == SIMPARAMS.input.shell.MScentre);
    centre_rate(loop) = numel(currix) / T;
    ts = MSspks(currix,2)*1e-3; % in seconds
    ISIs = diff(ts);
    centre_CVisi(loop) = std(ISIs)/mean(ISIs);

    %%% number of connected neurons to centre within shell....
    MSNcnctd = [];
    for j = 1:Nmsidxs(loop)
        % find all MSNs that MSN contacts...
        thisID = SIMPARAMS.input.shell.MSids(j);
        tgts = SIMPARAMS.net.Cmsms(SIMPARAMS.net.Cmsms_b(thisID)+1:SIMPARAMS.net.Cmsms_b(thisID+1))+1;  % add 1 to index cos is 0-base
        blnCnct = find(tgts == SIMPARAMS.input.shell.MScentre);
        if blnCnct MSNcnctd = [MSNcnctd; thisID]; end
    end
    
    FSIcnctd = [];
    for j = 1:Nfsidxs(loop)
        % find all MSNs that MSN contacts...
        thisID = SIMPARAMS.input.shell.FSids(j);
        tgts = SIMPARAMS.net.Cfsms(SIMPARAMS.net.Cfsms_b(thisID)+1:SIMPARAMS.net.Cfsms_b(thisID+1))+1;  % add 1 to index cos is 0-base
        blnCnct = find(tgts == SIMPARAMS.input.shell.MScentre);
        if blnCnct FSIcnctd = [FSIcnctd; thisID]; end
    end

    nMSNcnctd(loop) = numel(MSNcnctd); nFSIcnctd(loop) = numel(FSIcnctd);
    pMSNcnctd(loop) = nMSNcnctd(loop) / Nmsidxs(loop); pFSIcnctd(loop) = nFSIcnctd(loop) / Nfsidxs(loop);
end

figure(1); clf
subplot(311); plot(radius,Nmsidxs,'+-'); hold on; plot(radius,Nfsidxs,'r+-');
xlabel('Inner sphere radius (microns)'); ylabel('Number of neurons in shell');
subplot(312); plot(radius,nMSNcnctd,'+-'); hold on; plot(radius,nFSIcnctd,'r+-');
xlabel('Inner sphere radius (microns)'); ylabel('Number of neurons in shell projecting to centre MSN');
subplot(313); plot(radius,pMSNcnctd,'+-'); hold on; plot(radius,pFSIcnctd,'r+-');
xlabel('Inner sphere radius (microns)'); ylabel('Proportion of neurons in shell projecting to centre MSN');

figure(2); clf
subplot(211); plot(radius,medianMSNrate,'+-'); hold on; plot(radius,iqrMSNrate(:,1),'+:');  plot(radius,iqrMSNrate(:,2),'+:');
plot(radius,medianFSrate,'r+-'); plot(radius,iqrFSrate(:,1),'r+:');  plot(radius,iqrFSrate(:,2),'r+:'); 
xlabel('Inner sphere radius (microns)'); ylabel('Firing rate of neurons projecting to centre MSN (spikes/s)');
subplot(212); plot(radius,medianMSNCVisi,'+-'); hold on; plot(radius,iqrMSNCVisi(:,1),'+:');  plot(radius,iqrMSNCVisi(:,2),'+:');
plot(radius,medianFSCVisi,'r+-'); plot(radius,iqrFSCVisi(:,1),'r+:');  plot(radius,iqrFSCVisi(:,2),'r+:'); 
xlabel('Inner sphere radius (microns)'); ylabel('ISI CV of neurons projecting to centre MSN');

figure(3); clf
subplot(211); plot(radius,centre_rate,'+-');
xlabel('Inner sphere radius (microns)'); ylabel('centre MSN rate (spikes/s)');
subplot(212); plot(radius,centre_CVisi,'+-'); 
xlabel('Inner sphere radius (microns)'); ylabel('centre MSN ISI CV');


save 1prct_FSI_centre_MSN