Spiking neuron model of the basal ganglia (Humphries et al 2006)

 Download zip file 
Help downloading and running models
Accession:83559
A spiking neuron model of the basal ganglia (BG) circuit (striatum, STN, GP, SNr). Includes: parallel anatomical channels; tonic dopamine; dopamine receptors in striatum, STN, and GP; burst-firing in STN; GABAa, AMPA, and NMDA currents; effects of synaptic location. Model demonstrates selection and switching of input signals. Replicates experimental data on changes in slow-wave (<1 Hz) and gamma-band oscillations within BG nuclei following lesions and pharmacological manipulations.
Reference:
1 . Humphries MD, Stewart RD, Gurney KN (2006) A physiologically plausible model of action selection and oscillatory activity in the basal ganglia. J Neurosci 26:12921-42 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Basal ganglia;
Cell Type(s): Neostriatum medium spiny direct pathway GABA cell; Subthalamus nucleus projection neuron; Globus pallidus neuron; Abstract integrate-and-fire leaky neuron;
Channel(s):
Gap Junctions:
Receptor(s): Dopaminergic Receptor;
Gene(s):
Transmitter(s): Dopamine; Gaba; Glutamate;
Simulation Environment: MATLAB;
Model Concept(s): Oscillations; Parkinson's; Action Selection/Decision Making; Sleep; Rebound firing;
Implementer(s): Humphries, Mark D [m.d.humphries at shef.ac.uk];
Search NeuronDB for information about:  Neostriatum medium spiny direct pathway GABA cell; Dopaminergic Receptor; Dopamine; Gaba; Glutamate;
% script to assess LF0 data-fitting
clear all

%%%%%%%%%%%%%%%% URETHANE COMPLETE MODEL %%%%%%%%%%%%%%%%%%%%%%
%% paths
%batchA_path = '../ResultsArchive/LFO-urethane/CompleteModel/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/CompleteModel/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/CompleteModel/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/CompleteModel/ConditionD/';

% Collaterals, no STN 3rd DA: batch of 50 - Normal model
% THIS SET IS THE CONTROL MODEL FOR THE PAPER
%batchA = 'LFO_a_20060407T004326_batch.mat';
%batchB = 'LFO_b_20060407T011449_batch.mat';
%batchC = 'LFO_c_20060407T003124_batch.mat'; 
%batchD = 'LFO_d_20060407T000419_batch.mat';

%%%%%%%%%%%%%%% URETHANE - NO COLLATERALS %%%%%%%%%%%%%%%%%%%%%%%
% % paths
%batchA_path = '../ResultsArchive/LFO-urethane/NoCollaterals/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/NoCollaterals/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/NoCollaterals/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/NoCollaterals/ConditionD/';
% 
% % No Collaterals, no STN 3rd DA - comparison model FOR PAPER
%batchA = 'LFO_5_4a_20060407T005141_batch.mat';
%batchB = 'LFO_5_4b_20060407T015252_batch.mat';
%batchC = 'LFO_5_4c_20060407T003244_batch.mat';
%batchD = 'LFO_5_4d_20060407T004035_batch.mat';

%%%%%%%%%%%%%%%% Complete Model: NO URETHANE %%%%%%%%%%%%%%%%%%%%%%
% % paths
%batchA_path = '../ResultsArchive/LFO-urethane/NoUrethane/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/NoUrethane/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/NoUrethane/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/NoUrethane/ConditionD/';
 
%batchA = 'LFO_5_5a_20060407T011020_batch.mat';
%batchB = 'LFO_5_5b_20060407T012628_batch.mat';
%batchC = 'LFO_5_5c_20060407T005832_batch.mat';
%batchD = 'LFO_5_5d_20060407T001005_batch.mat';

%%%%%%%%%%%%%%%% URETHANE - CA2+ Mechanism omission %%%%%%%%%%%%%%%%%%%%%
batchA_path = '';
batchB_path = '';
batchC_path = '';
batchD_path = '../ResultsArchive/LFO-urethane/NoCa/ConditionD/';
batchD = 'LFO_5_6d_20060407T001016_batch.mat';

%%%%%%%%%%%%%%%% URETHANE - DA MECHANISM ALTERATIONS %%%%%%%%%%%%%%%%%%%%%%

% % No STN or GP DA mechanism
%batchA_path = '../ResultsArchive/LFO-urethane/NoSTNGP_DA/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/NoSTNGP_DA/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/NoSTNGP_DA/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/NoSTNGP_DA/ConditionD/';
% 
%batchA = 'LFO_5_1a_20060407T004613_batch.mat';
%batchB = 'LFO_5_1b_20060407T011920_batch.mat';
%batchC = 'LFO_5_1c_20060407T002948_batch.mat';
%batchD = 'LFO_5_1d_20060407T000456_batch.mat';

% No STN DA mechanism
%batchA_path = '../ResultsArchive/LFO-urethane/NoSTN_DA/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/NoSTN_DA/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/NoSTN_DA/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/NoSTN_DA/ConditionD/';
% 
%batchA = 'LFO_5_2a_20060407T004637_batch.mat';
%batchB = 'LFO_5_2b_20060407T070147_batch.mat';
%batchC = 'LFO_5_2c_20060407T061658_batch.mat';
%batchD = 'LFO_5_2d_20060407T000453_batch.mat';

% No GP DA mechanism
%batchA_path = '../ResultsArchive/LFO-urethane/NoGP_DA/ConditionA/';
%batchB_path = '../ResultsArchive/LFO-urethane/NoGP_DA/ConditionB/';
%batchC_path = '../ResultsArchive/LFO-urethane/NoGP_DA/ConditionC/';
%batchD_path = '../ResultsArchive/LFO-urethane/NoGP_DA/ConditionD/'; 

%batchA = 'LFO_5_3a_20060407T004251_batch.mat';
%batchB = 'LFO_5_3b_20060407T011649_batch.mat';
%batchC = 'LFO_5_3c_20060407T003058_batch.mat';
%batchD = 'LFO_5_3d_20060407T000413_batch.mat';
 
%%%%%%%%%%%%%%% KETAMINE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% batchA_path = '../ResultsArchive/LFO-ketamine/CompleteModel/ConditionA/';
% batchB_path = '';
% batchC_path = '';
% batchD_path = '';
% 
% batchA = 'LFO_k_a_20060112T143950_batch.mat';

%% reference data: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
data_Da_means = [8.1; 18; 5.7; 17];     % STN, GP, STN, GP
data_Da_SD = [2.9; 6.3; 4.3; 8.3];  
data_Da_LFO = [100; 0; 0; 0];

data_noDa_means = [18.9; 21.7; 5.8; 18.7];     % STN, GP, STN, GP
data_noDa_SD = [12.2; 8.6; 4.2; 7.3];  
data_noDa_LFO = [100; 89; 20; 15];

%%% for correlations
data_means = [data_Da_means; data_noDa_means];
data_LFO = [data_Da_LFO; data_noDa_LFO];

%% set paths for interactive sessions
[a host] = system('hostname');

%%% set requisite paths!
if findstr(host, 'iceberg'); % on iceberg
     fprintf('\n On ICEBERG \n');
     system_os = 'unix';
     ice_path1 = genpath('/home1/pc/pc1mdh/BG spiking model');
     ice_path2 = genpath('/home1/pc/pc1mdh/Matlab Tools');
     path(path, ice_path1);
     path(path, ice_path2);
elseif (findstr(host, 'node') | findstr(host,'ace')) % on ACE
     system_os = 'unix';
     ace_path1 = genpath('/home/mark/SpikingModel');
     path(path, ace_path1);
     fprintf('\n On ACE \n');
else
     system_os = 'xp';
     fprintf('\n On XP \n');
end

%% load batch lists find the number of batches
n_batches = [];
if exist('batchA_path') & ~isempty(batchA_path)
    load([batchA_path batchA]); 
    batchA_list = batch_analysis_list;
    [n c] = size(batchA_list);
    n_batches = [n_batches n];
end


if exist('batchB_path') & ~isempty(batchB_path)
    load([batchB_path batchB]);
    batchB_list = batch_analysis_list;
    [n c] = size(batchB_list);
    n_batches = [n_batches n];
end

if exist('batchC_path') & ~isempty(batchC_path)
    load([batchC_path batchC]);
    batchC_list = batch_analysis_list;
    [n c] = size(batchC_list);
    n_batches = [n_batches n];
end

if exist('batchD_path') & ~isempty(batchD_path)
    load([batchD_path batchD]);
    batchD_list = batch_analysis_list;
    [n c] = size(batchD_list);
    n_batches = [n_batches n];
end

n_batches = min(n_batches);

model_Da_means = zeros(4,n_batches);
model_Da_SD = zeros(4,n_batches);
model_Da_LFO = zeros(4,n_batches);
model_noDa_means = zeros(4,n_batches);
model_noDa_SD = zeros(4,n_batches);
model_noDa_LFO = zeros(4,n_batches);
num_sig_fits_means = 0;
num_sig_fits_LFO = 0;
batch_fits_means = zeros(n_batches,2);
batch_fits_LFO = zeros(n_batches,2);

% these only needed for other fit-testing options 2+3
%batch_fit_data = zeros(n_batches,2);
%batch_fit_max = zeros(n_batches,2);
%num_sig_fits = zeros(n_batches,2);
%overall_error_per_condition = zeros(n_batches,2);

for loop1 = 1:n_batches
    % get Control data
    %load([batchA_path batchA_list{loop1,2}{1}]); % load first analysis file
    %n_STN_A = length(mean_STN) * length(batchA_list{loop1,2});      % number of STN cells
        
    if exist('batchA_path') & ~isempty(batchA_path)
        load([batchA_path batchA_list{loop1,1}]) 
        model_Da_means(1,loop1) = STN_Hz;
        model_Da_SD(1,loop1) = std_STN;
        model_Da_LFO(1,loop1) = STN_LFO_count ./ n_STN * 100;

        %n_GPe_A = length(mean_GPe) * length(batchA_list{loop1,2});      % number of STN cells
        model_Da_means(2,loop1) = GPe_Hz;
        model_Da_SD(2,loop1) = std_GPe;
        model_Da_LFO(2,loop1) = GPe_LFO_count ./ n_GPe * 100;
    end
    
    % get DA, no Ctx data
    %load([batchB_path batchB_list{loop1,2}{1}]); % load first analysis file
    %n_STN_B = length(mean_STN) * length(batchB_list{loop1,2});      % number of STN cells
    if exist('batchB_path') & ~isempty(batchB_path)
        load([batchB_path batchB_list{loop1,1}]) 

        model_Da_means(3,loop1) = STN_Hz;
        model_Da_SD(3,loop1) = std_STN;
        model_Da_LFO(3,loop1) = STN_LFO_count ./ n_STN * 100;

        %n_GPe_B = length(mean_GPe) * length(batchB_list{loop1,2}); 
        model_Da_means(4,loop1) = GPe_Hz;
        model_Da_SD(4,loop1) = std_GPe;
        model_Da_LFO(4,loop1) = GPe_LFO_count./ n_GPe * 100;;
    end
    
    % get no DA, Ctx data
    if exist('batchC_path') & ~isempty(batchC_path)
        load([batchC_path batchC_list{loop1,1}]) 
        %load([batchC_path batchC_list{loop1,2}{1}]); % load first analysis file
        %n_STN_C = length(mean_STN) * length(batchC_list{loop1,2});      % number of STN cells

        model_noDa_means(1,loop1) = STN_Hz;
        model_noDa_SD(1,loop1) = std_STN;
        model_noDa_LFO(1,loop1) = STN_LFO_count./ n_STN * 100;

        %n_GPe_C = length(mean_GPe) * length(batchC_list{loop1,2}); 
        model_noDa_means(2,loop1) = GPe_Hz;
        model_noDa_SD(2,loop1) = std_GPe;
        model_noDa_LFO(2,loop1) = GPe_LFO_count./ n_GPe * 100;
    end
    
    % get no DA, no Ctx data
    if exist('batchD_path') & ~isempty(batchD_path)
        load([batchD_path batchD_list{loop1,1}]) 
        %load([batchD_path batchD_list{loop1,2}{1}]); % load first analysis file
        %n_STN_D = length(mean_STN) * length(batchD_list{loop1,2});      % number of STN cells

        model_noDa_means(3,loop1) = STN_Hz;
        model_noDa_SD(3,loop1) = std_STN;
        model_noDa_LFO(3,loop1) = STN_LFO_count./ n_STN * 100;

        %n_GPe_D = length(mean_GPe) * length(batchD_list{loop1,2}); 
        model_noDa_means(4,loop1) = GPe_Hz;
        model_noDa_SD(4,loop1) = std_GPe;
        model_noDa_LFO(4,loop1) = GPe_LFO_count./ n_GPe * 100;
    end
    
    %% compute overall fit to mean firing rate and LFO frequency data!
    
    % create vectors of fitted data
    model_means = [model_Da_means(:,loop1); model_noDa_means(:,loop1)];
    model_LFO = [model_Da_LFO(:,loop1); model_noDa_LFO(:,loop1)];
    
    %%%% option 1: compute separate correlations, using Spearman's rank and
    %%%% doing one-tailed test for direction
    [r_mean,p_mean] = corr(data_means,model_means,'tail','gt','type','Spearman');
    [r_LFO,p_LFO] = corr(data_LFO,model_LFO,'tail','gt','type','Spearman');
    
    batch_fit_means(loop1,:) = [r_mean^2,p_mean];
    batch_fit_LFO(loop1,:) = [r_LFO^2,p_LFO];
    
    %   find significance
    if p_mean < 0.05
        num_sig_fits_means = num_sig_fits_means +1;
    end
    
     if p_LFO < 0.05
        num_sig_fits_LFO = num_sig_fits_LFO +1;
    end
    

    
%     %%%% option 2: rescale to study data
%     % 0.  re-scale study data (could put this outside loop, but left here
%     % for comprehension)
%     data_scaling = max(data_LFO) / max(data_means);
%     data_scaled_means = data_means .* data_scaling;
%     all_data = [data_scaled_means; data_LFO]; 
%     
%     % 1. re-scale model data too, and combine
%     model_means_scaled = model_means .* data_scaling;
%     all_model_data = [model_means_scaled; model_LFO];
%     
%     % 2. do correlation    
%     [r,pval] = corr(all_data,all_model_data,'tail','gt','type','Spearman');
%     
%     batch_fit_data(loop1,:) = [r, pval];
%     
%     % 3. find significance
%     if pval < 0.05
%         num_sig_fits(loop1,1) = num_sig_fits(loop1,1)+1;
%     end
%     
%     % 4. find average error per condition
%     overall_error_per_condition(loop1,1) = sum(abs(all_data - all_model_data)) / length(all_data);
%     
%     %%%% option 3: rescale to maximum mean firing rate in model or data to
%     %%%% ensure that error bounded between 0-100%
%     
%     % 1. re-scale all mean data
%     scaling = max(max(data_LFO),max(model_LFO)) / max(max(data_means),max(model_means));
%     data_scaled_means = data_means .* scaling;
%     all_data = [data_scaled_means; data_LFO]; 
%     model_means_scaled = model_means .* scaling;
%     all_model_data = [model_means_scaled; model_LFO];
%     
%     % 2. do correlation
%     [r_max,p_max] = corr(all_data,all_model_data,'tail','gt','type','Spearman');
%     batch_fit_max(loop1,:) = [r_max, p_max];
%     
%     % 3. find significance
%     if p_max < 0.05
%         num_sig_fits(loop1,2) = num_sig_fits(loop1,2)+1;
%     end
%     
%     % 4. find average error per condition
%     overall_error_per_condition(loop1,2) = sum(abs(all_data - all_model_data)) / length(all_data);
% 
    
    %% save data
%     temp = model_Da_means(:,loop1);
%     save(['batch_' num2str(loop1) '_model_Da_means.txt'],'temp','-ascii')
%     temp = model_Da_SD(:,loop1);
%     save(['batch_' num2str(loop1) '_model_Da_SD.txt'],'temp','-ascii')
%     temp = model_Da_LFO(:,loop1);
%     save(['batch_' num2str(loop1) '_model_Da_LFO.txt'],'temp','-ascii')
%     temp = model_noDa_means(:,loop1);
%     save(['batch_' num2str(loop1) '_model_noDa_means.txt'],'temp','-ascii')
%     temp = model_noDa_SD(:,loop1);
%     save(['batch_' num2str(loop1) '_model_noDa_SD.txt'],'temp','-ascii')
%     temp = model_noDa_LFO(:,loop1);
%     save(['batch_' num2str(loop1) '_model_noDa_LFO.txt'],'temp','-ascii')
end

% save overall matrices of summaries too - useful for SigmaPlot
model_Da_means = model_Da_means';       % transpose so that condition is down column
model_noDa_means = model_noDa_means'; 
model_Da_SD = model_Da_SD'; 
model_noDa_SD = model_noDa_SD'; 
model_Da_LFO = model_Da_LFO';       % transpose so that condition is down column
model_noDa_LFO = model_noDa_LFO'; 

save all_model_DA_means.txt model_Da_means -ascii
save all_model_noDA_means.txt model_noDa_means -ascii
save all_model_DA_SD.txt model_Da_SD -ascii
save all_model_noDA_SD.txt model_noDa_SD -ascii
save all_model_DA_LFO.txt model_Da_LFO -ascii
save all_model_noDA_LFO.txt model_noDa_LFO -ascii

% save fit data
save('batch_fit_means.txt','batch_fit_means','-ascii');
save('batch_fit_LFO.txt','batch_fit_LFO','-ascii');
save('batch_num_sig_fits_means.txt','num_sig_fits_means','-ascii');
save('batch_num_sig_fits_LFO.txt','num_sig_fits_LFO','-ascii');
%% look at problem data - Ctx, no DA GPe LFO count

total_fits = num_sig_fits_means + num_sig_fits_LFO
num_sig_fits_means
num_sig_fits_LFO





Loading data, please wait...