Olfactory bulb network: neurogenetic restructuring and odor decorrelation (Chow et al. 2012)

 Download zip file 
Help downloading and running models
Adult neurogenesis in the olfactory bulb has been shown experimentally to contribute to perceptual learning. Using a computational network model we show that fundamental aspects of the adult neurogenesis observed in the olfactory bulb -- the persistent addition of new inhibitory granule cells to the network, their activity-dependent survival, and the reciprocal character of their synapses with the principal mitral cells -- are sufficient to restructure the network and to alter its encoding of odor stimuli adaptively so as to reduce the correlations between the bulbar representations of similar stimuli. The model captures the experimentally observed role of neurogenesis in perceptual learning and the enhanced response of young granule cells to novel stimuli. Moreover, it makes specific predictions for the type of odor enrichment that should be effective in enhancing the ability of animals to discriminate similar odor mixtures. NSF grant DMS-0719944.
1 . Chow SF, Wick SD, Riecke H (2012) Neurogenesis drives stimulus decorrelation in a model of the olfactory bulb. PLoS Comput Biol 8:e1002398 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell;
Gap Junctions:
Simulation Environment: MATLAB;
Model Concept(s): Activity Patterns; Rate-coding model neurons; Sensory processing; Apoptosis; Neurogenesis; Olfaction;
Implementer(s): Chow, Siu-Fai ;
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell;
function [S, coord, metric, name] = gara(Ns,MCperGlom,name_list,sim,range)
    % read raw pattern
    name_list = strrep(name_list,' ','#');
    rem = name_list;
    [token, rem] = strtok(rem,'#');
    temp = get_odor(token);
    odor = zeros(Ns,size(temp,1),size(temp,2));
    odor(1,:,:) = temp;
    i = 1;
    while length(rem)>1
        i = i+1;
        [token, rem] = strtok(rem,'#');
        temp = get_odor(token);
        odor(i,:,:) = temp;
    raw_Ns = size(odor,1);
    name_list = strrep(name_list,'(_)','(-)');
    name_list = strrep(name_list,'_',' ');
    rem = name_list;
    [token,rem] = strtok(rem,'#');
    max_length = length(token);
    for i = 2:raw_Ns
        [token,rem] = strtok(rem,'#');
        if length(token)>max_length
            max_length = length(token);
    rem = name_list;
    name = cell(1,raw_Ns);
    for i = 1:raw_Ns
        [token, rem] = strtok(rem,'#');
        temp = token;
        name{i} = temp;
%     % plot original image
%     figure(1000); clf;
%     for i = 1:Ns
%         subplot(3,4,i);
%         imagesc(reshape(odor(i,:,:),size(odor,2),size(odor,3)));
%         caxis([min(min(min(odor))) max(max(max(odor)))]);
%         axis off; axis image;
%         title(name{i});
%     end

    % chop image
    if nargin > 4
        odor = odor(:,range(1):range(2), range(3):range(4));
%         for i = 1:raw_Ns
%             subplot(2,8,8+i);
%             imagesc(reshape(odor(i,:,:),size(odor,2),size(odor,3)));
%             caxis([min(min(min(odor))) max(max(max(odor)))]);
%             axis off; axis image;
%         end
    % reduce pix
    for sti = 1:raw_Ns
        odorsti = reshape(odor(sti,:,:),size(odor,2),size(odor,3));
        for i = 1:sim
            tempi = odorsti(i:sim:sim*floor(end/sim), i:sim:sim*floor(end/sim));
            if i==1
                temp = tempi;
                temp = max(temp, tempi);
        if sti == 1
            odor_redu = zeros(raw_Ns,size(temp,1),size(temp,2));
            odor_redu(1,:,:) = temp;
            odor_redu(sti,:,:) = temp;
    % find revalent pix
    odor_sum = reshape(sum(odor_redu,1),size(odor_redu,2),size(odor_redu,3));
    odor_sum_1d = reshape(odor_sum, 1, size(odor_sum,1)*size(odor_sum,2));
    IX = find(odor_sum_1d>-3);
    odor_sum_1d = odor_sum_1d(IX);
    % cal coord1mc
    coord1mc1 = (ones(size(odor_sum,2),1)*(size(odor_sum,1):-1:1))';
    coord1mc2 = ((1:size(odor_sum,2))'*ones(1,size(odor_sum,1)))';
    coord1mc1 = reshape(coord1mc1,1,size(coord1mc1,1)*size(coord1mc1,2));
    coord1mc2 = reshape(coord1mc2,1,size(coord1mc2,1)*size(coord1mc2,2));
    coord1mc = [coord1mc2; coord1mc1];
    coord1mc = coord1mc(:,IX);
    % select relavent pix for each odor
    for sti = 1:raw_Ns
        if sti == 1
            odor_redu1d = zeros(raw_Ns,length(IX));
        temp = reshape(odor_redu(sti,:,:),1,size(odor_sum,1)*size(odor_sum,2));
        odor_redu1d(sti,:) = temp(IX);
    % sort according to strength
    % [temp,IX] = sort(sum(odor_redu1d));
    [temp,IX] = sort(mean(odor_redu1d(1:2,:))-mean(odor_redu1d(3:4,:))+0.01*sum(odor_redu1d));
    odor_redu1d = odor_redu1d(:,IX(end:-1:1));
    coord1mc = coord1mc(:,IX(end:-1:1));
    % metric
    metric1mc = zeros(size(odor_redu1d,2),size(odor_redu1d,2));
    for i = 1:size(odor_redu1d,2)
        for j = 1:size(odor_redu1d,2)
            metric1mc(i,j) = norm(coord1mc(:,i)-coord1mc(:,j));
    % return
    S1mc = odor_redu1d'/max(max(odor_redu1d));
    S1mc = S1mc(:,1:Ns);
    % mult. MC per glom
    coord = zeros(2,MCperGlom*size(coord1mc,2));
    metric = zeros(MCperGlom*size(metric1mc,1));
    S = zeros(MCperGlom*size(S1mc,1),size(S1mc,2));
    for i = 1:MCperGlom
        coord(:,i:MCperGlom:end) = coord1mc;
        S(i:MCperGlom:end,:) = S1mc;
        metric(i:MCperGlom:end, 1:MCperGlom:end) = metric1mc;
    for i = 2:MCperGlom
        metric(:, i:MCperGlom:end) = metric(:, 1:MCperGlom:end);

Loading data, please wait...