No BSD License  

Highlights from
Synfire

image thumbnail
from Synfire by Thomas Templin
Simplified version of synfire chain in cortical network à la Abeles, Bienenstock, and Diesmann et a

synfire.m
% Simplified version of synfire chain in cortical network  la Abeles, Bienenstock, Diesmann, etc.  


clear all
close all

P = 10;                         % length of network
N = 10;                         % width of network
epoch = .11;
bin_length = .0001;
V_rest = -.07;
V_th = -.06;
V_start = -.061                 % initial potential
tau_m = 0.01;
input_strength = .003;          % external input to set chain in motion
input_jitter = .001;
input_length = .003;            % duration of external input
excitatory_noise = .0002;       % strength of excitatory background noise
inhibitory_noise = .000105;     % strength of inhibitory background noise
excitatory_jitter = .00003;     % variability of excitatory background noise
inhibitory_jitter = .00003;     % variability of inhibitory background noise
conduction_time = .01;
conduction_jitter = .1;
convergence_jitter = .000002;
amplification_factor = .4;      % amplification of convergent input

time_axis = 0:bin_length:epoch;
bin_number = length(time_axis);
input_onset = round(bin_number/10);
input_bins = round(input_length/bin_length);            % duration of external input (bin units)
conduction_bins = round(conduction_time/bin_length);    % conduction time (bin units)
input_offset = input_onset + input_bins;

latency = [];                       % latency of first spike in pool
mean_latency = [];
standard_deviation = [];

crossco_time = [-epoch:bin_length:epoch]; 

p = 1;     % first pool (receives external input)
V = V_start*ones(N,bin_number);
excitatory_background_noise = max(0,normrnd(excitatory_noise,excitatory_jitter,N,bin_number));
inhibitory_background_noise = max(0,normrnd(inhibitory_noise,inhibitory_jitter,N,bin_number));
V = V + excitatory_background_noise - inhibitory_background_noise;


for n = 1:N    % loop for all neurons in first pool

    occurence_spike = 0;

    for bin = 2:bin_number
        
        if bin >= input_onset & bin <= input_offset
            
            input = max(0,normrnd(input_strength,input_jitter,1,1));
            
        else
            
            input = 0;
            
        end;
        
        if V(n,bin-1) < V_th
            
            V_derivative = (V_rest - V(n,bin-1))/tau_m;
            V(n,bin) = V(n,bin-1) + bin_length*V_derivative + input + excitatory_background_noise(n,bin) - inhibitory_background_noise(n,bin);   % membrane potential
            
        else
            
            V(n,bin-1) = .03;     % EPSP
            V(n,bin) = V_rest;
            
            if occurence_spike == 0
                latency = [latency bin];
            end
            
            occurence_spike = 1;
            
         end
            
     end
     
     figure(1)
     subplot(P,1,p), plot(time_axis,V), axis([0 epoch -.1 .1]), title('Membrane Potentials of Neurons in Various Pool Levels'), ylabel('V_m (V)')     % membrane potential over time (first pool)
     
end  

V_1 = V(1,:);
V_2 = V(2,:);
for bin = 1:bin_number
    if V_1(bin) == .03
        V_1(bin) = 1;
    else 
        V_1(bin) = 0;   
    end
    if V_2(bin) == .03
        V_2(bin) = 1;
    else 
        V_2(bin) = 0;
    end
end
crossco = xcov(V_1,V_2);
figure(2)
subplot(P,1,p), plot(crossco_time,crossco), axis([-epoch epoch -.5 Inf]), title('Cross Correlograms')   % cross correlogram of two first neurons of first pool
    
mean_latency = [mean_latency mean(latency)];
standard_deviation = [standard_deviation std(latency)];
latency =[];

level = input_offset;   % beginning of second pool

for p = 2:P     % internally driven pools
    
    clear V_1, clear V_2
    
    potential_cache(:,:) = V(:,:);     % store potential matrix (neurons, bins)

    excitatory_background_noise = max(0,normrnd(excitatory_noise,excitatory_jitter,N,bin_number));
    inhibitory_background_noise = max(0,normrnd(inhibitory_noise,inhibitory_jitter,N,bin_number));
    
    V = V_start*ones(N,bin_number);
    V = V + excitatory_background_noise - inhibitory_background_noise;
   
    input = zeros(N,bin_number);

    for n = 1:N
        
        occurence_spike = 0;
        
        for bin = level:bin_number
        
            potential_transform(n,bin) = potential_cache(n,bin-conduction_bins+round(normrnd(0,conduction_jitter,1,1)));     % introduce conduction delays and conduction jitter
            
        end
        
        for bin = level:bin_number
        
            individual_input(n,bin) = max(0,potential_transform(n,bin));
    
        end
    
        input = sum(individual_input,1);                        % add all imputs from previous pool
        amplified_input = input*amplification_factor;           % adjust (amplify) inputs (e.g., to keep model stable)
        input_rep = repmat(amplified_input,N,1);
        input_rep_var = normrnd(input_rep,convergence_jitter);

        for bin = 2:bin_number
        
            if V(n,bin-1) < V_th
            
                V_derivative = (V_rest - V(n,bin-1))/tau_m;
                
                if bin >= level

                    V(n,bin) = V(n,bin-1) + bin_length*V_derivative + input_rep_var(n,bin) + excitatory_background_noise(n,bin) - inhibitory_background_noise(n,bin);   % membrane potential (after onset of volley)    
            
                else
                    
                    V(n,bin) = V(n,bin-1) + bin_length*V_derivative + excitatory_background_noise(n,bin) - inhibitory_background_noise(n,bin);                          % membrane potential (before onset of volley)
                end
                
             else
            
                 V(n,bin-1) = .03;   % EPSP
                 V(n,bin) = V_rest;
                
                  if occurence_spike == 0
                    
                      latency = [latency bin];
                    
                  end
            
                  occurence_spike = 1;
            
             end
        
        end
   
        figure(1), subplot(P,1,p), plot(time_axis,V), axis([0 epoch -.1 .1]), ylabel('V_m (V)')    % membrane potential over time (internally driven pools)
        if p == P
        xlabel('time (s)')
        end 
    
    end
    
    mean_latency = [mean_latency mean(latency)];
    standard_deviation = [standard_deviation std(latency)];
    latency =[];
    
    level = level + conduction_bins;   % update pool level
     
    V_1 = V(1,:);
    V_2 = V(2,:);
    for bin = 1:bin_number
        if V_1(bin) == .03
            V_1(bin) = 1;
        else 
            V_1(bin) = 0;
        end
        if V_2(bin) == .03
            V_2(bin) = 1;
        else 
            V_2(bin) = 0;
        end
    end
    crossco = xcov(V_1,V_2);
    figure(2)
    subplot(P,1,p), plot(crossco_time,crossco), axis([-epoch epoch -.5 Inf])    % cross correlograms of two first neurons of internally driven pools
    if p == P
    xlabel('time (s)')
    end

end

mean_latency = mean_latency*bin_length                  % print vector of mean latencies of first spikes of pools
standard_deviation = standard_deviation*bin_length      % print vector of standdard deviations of first spikes of pools

figure(3)
plot(mean_latency,standard_deviation,'bs','MarkerFaceColor','b','MarkerSize',6)  % standard deviation vs mean latencies of first spikes of pools
xlabel('mean latency (s)'), ylabel('standard deviation')
lsline
cc = corrcoef(mean_latency,standard_deviation);
correlation_coefficient = cc(1,2)

Contact us at files@mathworks.com