Model of memory linking through memory allocation (Kastellakis et al. 2016)

 Download zip file 
Help downloading and running models
Accession:206249
Here, we present a simplified, biophysically inspired network model that incorporates multiple plasticity processes and explains linking of information at three different levels: (a) learning of a single associative memory (b) rescuing of a weak memory when paired with a strong one and (c) linking of multiple memories across time. By dissecting synaptic from intrinsic plasticity and neuron-wide from dendritically restricted protein capture, the model reveals a simple, unifying principle: Linked memories share synaptic clusters within the dendrites of overlapping populations of neurons
Reference:
1 . Kastellakis G, Silva AJ, Poirazi P (2016) Linking Memories across Time via Neuronal and Dendritic Overlaps in Model Neurons with Active Dendrites. Cell Rep 17:1491-1504 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Abstract integrate-and-fire leaky neuron with dendritic subunits;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program; C or C++ program (web link to model);
Model Concept(s): Active Dendrites;
Implementer(s): Kastellakis, George [gkastel at gmail.com];
/
stdmodel
distributionPlot
exportfig
figs
mtrand
README
allgraphs.m
allrun.m
an_brtest.m
an_stats.m
anmulti.py
ansims.py
barwitherr.m *
btagstats.m *
CImg.h *
constructs.cpp
constructs.h
defaults.m
dir2.m *
getspikedata.m *
getsynstate.m *
getsynstate2.m *
graphs.m *
hist_percents.m *
hist_with_errs.m *
interact.m *
intexp_constructs.cpp
job_sims.sh
kurtos.m *
lamodel.cpp
LICENSE *
make_graphs.m *
Makefile *
matlab.mat *
mtest.py
mtrand.cpp *
mtrand.h *
multi.py
multistats.m *
nextplot.m *
pairstrong.m *
repeated.m *
rotateXLabels.m *
run_1.sh
run_2strong.sh
run_2weak.sh
run_3.sh
run_all.sh
run_brov.sh
run_brtest.sh
run_btag.sh
run_dir.sh
run_ep.sh
run_gp.sh
run_gp2.sh
run_mult.sh
run_Nsparse.sh
run_pairstrong.sh
run_rep.sh
run_sims.sh
run_sparse.sh
run_sparseS2.sh
runloc.sh
runmany.sh
S2sparse.m *
savefig.m *
scratch.m *
sensitivity.m *
stats.m *
stats.py *
stderr.m *
strong2.m *
strongstrong.m *
submit_lamodel.sh *
three.m *
trevrolls.m *
vis.py *
weastrong.m *
wxglmodel *
wxglmodel.cpp *
wxglmodel.h *
wxmodel.cpp *
wxmodel.h *
                            
defaults

close all



npatterns=10
nruns =10


%CONDITION='multiL';
%ISI=60


spks = zeros(npatterns, npyrs, nruns);
pops = zeros(npatterns, npyrs, nruns);
corr_spk = zeros(npatterns, npatterns, nruns);
corr_pop = zeros(npatterns, npatterns, nruns);

branch_syns = zeros(ninputs, npyrs*nbranches, nruns);
br_hists = zeros(ninputs, 12, nruns);
clustering = zeros(ninputs, nruns);
brstrengths = zeros(ninputs, npyrs*nbranches);

brweights = zeros(ninputs, npyrs*nbranches, nruns);
nrnweights = zeros(ninputs, npyrs, nruns);
brweightcors = zeros(ninputs, ninputs, nruns);
brsyncors= zeros(ninputs, ninputs, nruns);
nrnweightcors = zeros(ninputs, ninputs, nruns);

brcommon = zeros(ninputs, ninputs, nruns);


clust_all = {};
clust_all = cell(9,1);

for run = 1:nruns
    sprintf('./data/%s_%d_%d/spikesperpattern.dat', CONDITION, ISI,run-1)
    spk = load( sprintf('./data/%s_%d_%d/spikesperpattern.dat', CONDITION, ISI,run-1));
    
    recallspikes = spk(:, 1:npyrs)/(stimduration/1000); 
% 
%     figure()
%     imagesc(recallspikes');
%     rsc = recallspikes'
%     rsc = diag(1./sum(rsc,2))*rsc
%     rsc(isnan(rsc)) =0
%     
%     return;
%hist(recallspikes(:),20);
    
    pop = recallspikes>CUTOFF; %Hz
    spks(:, :, run) = recallspikes;
    pops(:, :, run) = pop;
    
    corr_spk(:,:, run) = corrcoef(recallspikes');
    %corr_pop(:,:, run) = corrcoef(pop');
    
    %corr_pop(:,:, run) = corrcoef(pop');
    
    for nk=1:10
        for nl=1:10
            corr_pop(nk,nl,run) = sum(pop(nk,:)&pop(nl,:)) / ((sum(pop(nk, :))+sum(pop(nl,:)) )/2);
        end
    end
    
    ff = sprintf('./data/%s_%d_%d/synstate.dat', CONDITION, ISI,run-1);   
    ss = load(ff);
    
    for i=1:size(ss,1)
        bid=ss(i,2);
        nid=ss(i,3);
        srcid=ss(i,5);
        bstrength = ss(i,6);
        w=ss(i,7);
        if (srcid >= 0 && bid <= npyrs*nbranches)
            brweights(srcid+1, bid+1, run) = brweights(srcid+1, bid+1, run) + w;
            brstrengths(srcid+1, bid+1)=bstrength;
            nrnweights(srcid+1, nid+1,run) = nrnweights(srcid+1, nid+1,run) + w;
        end
        if (srcid >= 0 && bid <= npyrs*nbranches &&  w > 0.7)
            branch_syns(srcid+1, bid+1, run) = branch_syns(srcid+1, bid+1, run)+1;
        end
    end

    for i=1:npatterns
        bs = branch_syns(i, :, run);
        b = bs(bs>0);
        x = 1:12;
        [d, h] = hist(b, x);
        br_hists(i, :, run) = d;
        ss = sum(d(1:end));
        if (ss>0)
            clustering(i,run) = sum(d(2:end))/ss;
        end
    end
    brweightcors(:, :, run) = corrcoef(brweights(:,:, run)'); 
    brsyncors(:, :, run) = corrcoef(branch_syns(:,:, run)'); 
    nrnweightcors(:, :, run) = corrcoef(nrnweights(:,:, run)'); 
    
    brclust = branch_syns(:,:,run)>1;
    for nk=1:10
        for nl=1:10
            brcommon(nk,nl, run) = sum(brclust(nk,:)&brclust(nl,:))/(sum(brclust(nk,:)|(brclust(nl,:))));
        end
    end
    
      
    brclust = branch_syns(:,:,run)>0;
    for nk=1:10
        for nl=1:nk-1
            brtot = branch_syns(nk, :, run) + branch_syns(nl, :, run);
            brl = brtot(find(brclust(nk,:)&brclust(nl,:)));
            clust_all{nk-nl} = [clust_all{nk-nl} brl];
            %brcommon(nk,nl, run) = sum(brclust(nk,:)&brclust(nl,:))/(sum(brclust(nk,:)|(brclust(nl,:))));
        end
    end
end



% figure();
% imagesc(pops(:,:,1)');
% colorbar()
% %title('Firing rates per memory recall (Hz)');
% xlabel('Memory #');
% ylabel('Pyramidal Neuron #');


m = mean(corr_spk, 3);
m_corr = m;
s_corr = std(corr_spk, 0,3);
figure();


imagesc(m, [-0.2, 1.0]);
%colorbar()
title('Similarity between population firing patterns');
axis off
%xlabel('Memory #')
%ylabel('Memory #')


export_fig(sprintf('./figs/%s_ffsim.pdf',CONDITION), '-transparent')



m = mean(corr_pop, 3)';
figure();
imagesc(m, [0, 1.0]);
%colorbar();
axis off
title('Population overlap between memories');
xlabel('Memory #')
ylabel('Memory #')
%colorbar()

export_fig(sprintf('./figs/%s_popoverlap.pdf',CONDITION), '-transparent')


b = zeros(npatterns, 2);
for i=1:npatterns
    cors =  sum(m .* tril(circshift(eye(npatterns), i)));
    cors = cors(1:npatterns-i);
    b(i,1) = mean(cors);
    b(i,2) = stderr(cors);
end

figure()
bars_ovl = 100.0*b(1:end-2,1);
bars_err = 100.0*b(1:end-2,2);
barwitherr(100.0*b(1:end-2,2), 100.0*b(1:end-2,1), COL)
xlabel('Hours between memories')
ylabel('% Overlapping population')
title('Overlap between populations')
ylim([0,100])
export_fig(sprintf('./figs/%s_popsimbar.pdf',CONDITION), '-transparent')



figure()
m = mean(nrnweightcors, 3)';
imagesc(m, [-0.2, 1.0]);
title('Similarity of synaptic projection patterns per neuron')
axis off
%colorbar()
export_fig(sprintf('./figs/%s_nrnw.pdf',CONDITION), '-transparent')


b = zeros(npatterns, 2);
for i=1:npatterns
    cors =  sum(m .* tril(circshift(eye(npatterns), i)));
    cors = cors(1:npatterns-i);
    b(i,1) = mean(cors);
    b(i,2) = stderr(cors);
end

figure()
barwitherr(b(1:end-2,2), b(1:end-2,1), COL)
xlabel('Hours between memories')
ylabel('Average similarity')
title('Similarity of synaptic projection patterns per neuron')

%ylim([,0.8])
export_fig(sprintf('./figs/%s_nrnwbar.pdf',CONDITION), '-transparent')



figure()
m = mean(brweightcors, 3)';
imagesc(m, [-0.2, 1.0]);
title('Similarity of synaptic projection patterns per branch')
axis off
%colorbar()

export_fig(sprintf('./figs/%s_brw.pdf',CONDITION), '-transparent')


b = zeros(npatterns, 2);
for i=1:npatterns
    cors =  sum(m .* tril(circshift(eye(npatterns), i)));
    cors = cors(1:npatterns-i);
    b(i,1) = mean(cors);
    b(i,2) = stderr(cors);
end

figure()
barwitherr(b(1:end-2,2), b(1:end-2,1), COL)
xlabel('Hours between memories')
ylabel('Average similarity')
title('Similarity of synaptic projection patterns per branch')
%ylim([0,0.4])
export_fig(sprintf('./figs/%s_brwbar.pdf',CONDITION), '-transparent')





figure()
tp = sum(pops, 2)*100.0/npyrs;
m_p = mean(tp, 3)
s_p = std(tp, 0, 3)
bar(m_p);
hold on
h=errorbar(m_p', s_p')
set(h(1), 'color', 'red');set(h(1), 'LineStyle', 'None');
hold off;
title('Active population per memory')
%ylabel('Active Pyr. Neurons (%)')
%xlabel('Memory #')





figure()
tp = sum(spks, 2)/npyrs;
m_p = mean(tp, 3)
s_p = std(tp, 0, 3)
bar(m_p);
hold on
h=errorbar(m_p', s_p')
set(h(1), 'color', 'red');set(h(1), 'LineStyle', 'None');
hold off;
title('Avg Firing rate of pyramidal neurons')
%ylabel('Firing Rate [Hz]')
%xlabel('Memory #')

if (0)
    figure()
    nmem =2
    sb = mean(br_hists, 3);
    sbd = std(br_hists,0,3);
    bar(sb(nmem, :))
    hold on
    h = errorbar(sb(nmem, :), sbd(nmem,:));

    set(h(1), 'LineStyle', 'None');
    title('Distribution of potentiated synapses per branch')
    xlabel('Number of potentiated synapses')
    ylabel('Number of branches')
    yl = ylim(); yl(1) = 0; ylim(yl);
    
    %saveas(gcf,'./figs/norep4.eps', 'epsc');
    %imagesc(corrcoef(mp'));

    figure()
    m_clust = mean(clustering, 2)
    s_clust = std(clustering, 0, 2)
    bar(m_clust)
    hold on
    h = errorbar(m_clust, s_clust);
    set(h(1), 'LineStyle', 'None');
    title('Clustered synapses per memory')
    xlabel('Memory number')
    ylabel('Percentage of clustered synapses')



    % figure()
    % m = mean(brweightcors, 3)';
    % imagesc(m, [-0.2, 1.0]);
    % title('Correlation between branches')
    % colorbar()
    % %imagesc(corrcoef(mp'));

    figure()
    m = mean(brsyncors, 3)';
    imagesc(m, [-0.2, 1.0]);
    %title('Correlation between branches')
    %colorbar()

end




figure()
mm=sum(branch_syns(:,1:npyrs*nbranches,:)>0, 1);
mean(mm(:))
std(mm(:))

xbins = [0:10];
mh = zeros(nruns,size(xbins,2))
for i=1:nruns
    [d,h] = hist(mm(:,:,i), xbins);
    mh(i, :) = d;
end

mh = mh/(npyrs*nbranches);
barwitherr(std(mh,0,1), mean(mh, 1), COL)


title(sprintf('Memories represented per branch'))
ylabel('Probability')
xlabel( 'Number of memories represented');
set(gca,'Xtick', [0:11], 'XTickLabel',[0 0:11]);

export_fig(sprintf('./figs/%s_brr.pdf',CONDITION), '-transparent')





figure()
m = (mean(brcommon, 3)') ;
imagesc(m, [0, 1.0]);
title('% Branches with clusters of both memories')
axis off
%colorbar()
export_fig(sprintf('./figs/%s_brcommon.pdf',CONDITION), '-transparent')


b = zeros(npatterns, 2);
for i=1:npatterns
    cors =  sum(m .* tril(circshift(eye(npatterns), i)));
    cors = cors(1:npatterns-i);
    b(i,1) = mean(cors);
    b(i,2) = stderr(cors);
end

figure()
barwitherr(100.*b(1:end-2,2), 100.*b(1:end-2,1), COL)
xlabel('Hours between memories')
ylabel('% branches with clusters')
title('% Branches with clusters of both memories')

%ylim([,0.8])
export_fig(sprintf('./figs/%s_brcommon_bar.pdf',CONDITION), '-transparent')

brovl_err = 100.*b(1:end-2,2);
brovl_mean = 100.*b(1:end-2,1);



figure;
cc=winter(12);
nn = [1,2,3,4,5,6,7,8,9];
color = [0,0,1];

for i=1:length(nn)
    ncase = nn(i);
    
    %diff = diffs(ncase);
    
    
    %aa  = mean(histCSUS(:,ncase,:));
    %bb = stderr(histCSUS(:,ncase,:));
    %aa = aa(:);
    
    %bb =bb(:);
    aa = histc(clust_all{i}, [1:20])/(10*(10-i));
    plot(aa, 'Color',  cc(ncase,:));
    hold on
end
ylim([0,2000]);
xlim([0,15]);
ylabel('Number of clusters of both memories');
xlabel('Synapses per  cluster');

legend({'1 hour', '2 hours', '3 hours', '4', '5','6','7','8', '9'});
export_fig(sprintf('./figs/%s_clustering2.pdf',CONDITION), '-transparent')
hold off;