Hotspots of dendritic spine turnover facilitates new spines and NN sparsity (Frank et al 2018)

 Download zip file 
Help downloading and running models
Accession:227087
Model for the following publication: Adam C. Frank, Shan Huang, Miou Zhou, Amos Gdalyahu, George Kastellakis, Panayiota Poirazi, Tawnie K. Silva, Ximiao Wen, Joshua T. Trachtenberg, and Alcino J. Silva Hotspots of Dendritic Spine Turnover Facilitate Learning-related Clustered Spine Addition and Network Sparsity
Reference:
1 . Frank AC, Huang S, Zhou M, Gdalyahu A, Kastellakis G, Silva TK, Lu E, Wen X, Poirazi P, Trachtenberg JT, Silva AJ (2018) Hotspots of dendritic spine turnover facilitate clustered spine addition and learning and memory. Nat Commun 9:422 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Connectionist Network;
Brain Region(s)/Organism:
Cell Type(s): Abstract integrate-and-fire leaky neuron with dendritic subunits;
Channel(s):
Gap Junctions:
Receptor(s): NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: C or C++ program; MATLAB;
Model Concept(s): Active Dendrites; Synaptic Plasticity;
Implementer(s): Kastellakis, George [gkastel at gmail.com];
Search NeuronDB for information about:  NMDA;
/
tomodel
data
distributionPlot
exportfig
fig
figs
mtrand
README
.exrc *
an_m_to.m
an_to.m
barwitherr.m *
btagstats.m *
CImg.h *
constructs. *
constructs.cpp *
constructs.h
csvgraph.m
defaults.m
dir2.m *
gconstructs.cpp *
getspikedata.m *
getsynstate.m *
getsynstate2.m *
graphs.m *
hist_percents.m *
hist_with_errs.m *
interact.m *
kurtos.m *
lamodel
lamodel.cpp
LICENSE *
make_graphs.m *
Makefile *
matlab.mat *
mtrand.cpp *
mtrand.h *
multistats.m *
nextplot.m *
pairstrong.m *
repeated.m *
rotateXLabels.m *
run_to.sh
S2sparse.m *
savefig.m *
scratch.m *
sensitivity.m *
stats.m *
stats.py *
stderr.m *
strong2.m *
strongstrong.m *
submit_lamodel.sh *
three.m *
to.cpp
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;