Fronto-parietal visuospatial WM model with HH cells (Edin et al 2007)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:98017
1) J Cogn Neurosci: 3 structural mechanisms that had been hypothesized to underlie vsWM development during childhood were evaluated by simulating the model and comparing results to fMRI. It was concluded that inter-regional synaptic connection strength cause vsWM development. 2) J Integr Neurosci: Given the importance of fronto-parietal connections, we tested whether connection asymmetry affected resistance to distraction. We drew the conclusion that stronger frontal connections are beneficial. By comparing model results to EEG, we concluded that the brain indeed has stronger frontal-to-parietal connections than vice versa.
Reference:
1 . Edin F, Macoveanu J, Olesen P, Tegnér J, Klingberg T (2007) Stronger synaptic connectivity as a mechanism behind development of working memory-related brain activity during childhood. J Cogn Neurosci 19:750-60 [PubMed]
2 . Edin F, Klingberg T, Stödberg T, Tegnér J (2007) Fronto-parietal connection asymmetry regulates working memory distractibility. J Integr Neurosci 6:567-96 [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: Neocortex;
Cell Type(s): Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell; Abstract Wang-Buzsaki neuron;
Channel(s):
Gap Junctions: Gap junctions;
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Working memory; Attractor Neural Network;
Implementer(s):
Search NeuronDB for information about:  Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell;
function netChar3D( filename, DoPrint, lab, meas, rows, cols )

% netChar3D takes a file name beginning with netCharSERIE. This
% file contains names of catalogues with simulation series. These
% series can have arbitrary names as long as they contain the word
% SERIES. Every catalogue is represented by a four-dimensional
% index based on the following criteria:
% drift, measured as the standard deviation of a diffusion process
%        of the population vector
% distractibility, measured as total current needed to extinguish
% the bump or move it more than halfway towards the distracting
% stimulus
% variance of the spontaneous activity
% variance of the delay activity

% remember to change path names to your destination directory.
% those places are marked by % CHANGE %

% filename: name of the netCharSERIE file
% DoPrint = 0, only display
% DoPrint = 1, print
% lab = 0 or nothing: Incrementing label
% lab = 1: Specified label
% meas: A vector with the indices to be calculated. If the vector is
%           empty, all measures will be calculated.
% rows: Number of rasterplot rows per page
% cols: Number of rasterplot columns per page

% Author: Fredrik Edin, 2004
% email: freedin@nada.kth.se

if nargin < 1 | nargin > 6
    disp( 'usage 1: netChar3D( filename, DoPrint )' )
    disp( 'filename: Name of the netCharSERIE file' )
    disp( 'DoPrint = 0: Display only' )
    disp( 'DoPrint = 1: Print and display' )
    disp( ' ' )
    disp( 'usage 2: netChar3D( filename, DoPrint, lab )' )
    disp( 'lab = 0: Incrementing integers as labels' )
    disp( 'lab = 1: Prespecified labels from filename' )
    disp( ' ' )
    disp( 'usage 3: netChar3D( filename, DoPrint, lab )' )
    disp( 'meas: A vector with indices to be calculated' )
    disp( ' ' )
    disp( 'usage 4: netChar3D( filename, DoPrint, lab, rows, cols )' )
    disp( 'rows: Number of rasterplot rows per page' )
    disp( 'cols: Number of rasterplot columns per page' )
    disp( ' ' )
    return
end
if nargin < 4
    meas = [ 1:6 ];
elseif isempty( meas )
    meas = [ 1:6 ];
end
if nargin < 6
    rows = 4; % Rows of plots per page
    cols = 3;
end

homedir = pwd;
filesdir = '/afs/nada.kth.se/home/o/u1sxc4xo/Neuron/Program/STANDARDFILER'; % CHANGE %
if nargin < 3
    lab = 0
end
if lab
    [ filer, beg, fin, labv ] = textread( filename, '%s %d %d %s', 'commentstyle', 'shell' );
else
    [ filer, beg, fin ] = textread( filename, '%s %d %d', 'commentstyle', 'shell' );
end
len = length( filer );

% How many pages? Position of windows, subplots, etc.
pages = 2 * ( floor( (len-1) / (rows*cols) ) + 1 );
for i = 1 : pages/2
    figure ( i )
    clf
    set( i,'Position', [ 550 * mod( ( i ), 2 ) 100 720 852 ] );
end
figure( pages+10 )
clf
handl = zeros( 1, len*2 ); % subplot handles
height = 0.93 / rows;
width = 0.90 / cols;
for ind = 1 : len
    page = floor( (ind-1) / ( rows*cols ) ) + 1;
    subp = ind - ( page-1 ) * rows * cols; 
    figure( page )
    if subp == 1
        clf
    end
    bottom = 1 - height * ( floor( (subp-1) / cols ) + 1 );
    left = 0.1 + mod( (subp-1), cols ) * width;
    handl( ind ) = subplot( 'Position', [ left bottom width-0.05 height-0.07 ] );
    figure( page+pages/2 )
    if subp == 1
        clf
    end
    handl( ind+len ) = subplot( 'Position', [ left bottom width-0.05 height-0.07 ] );
end


% Below are the different measures for determining the performance of each
% network. A file with filename containing the string netCharSERIE contains
% data for the different points, see that file for more information.
% Several simulations can be used to characterize a single simulation, and
% which simulations is indicated in the entCharSERIE file.
INDEX = [];
errv = [];
labt = [];
images = [];
for kat = 1:length( filer )
    savefile = filer{kat};
    last = find( savefile == '/' );
    savedir = savefile(1:last(end));
    cd( savedir )
    savefile = strcat( 'netCharINDEX-to-', savefile(last(end)+1:end),':',int2str(beg(kat)),'-',int2str(fin(kat)),'.mat');
    if exist( savefile ) > 1
        % Network already characterized, no need to recalculate
        load( savefile );
        INDEX = [ INDEX NetCharINDEX ]
        errv = [ errv NetCharINDEX.err ];
        binwfinal = NetCharINDEX.binwf;
        binw = NetCharINDEX.binw;
        images = [ images NetCharINDEX.im ];
        drfinal = NetCharINDEX.drf;
        dr = NetCharINDEX.dr;
    else

        % Parse text from simulation series file.
        serie = [];
        txt = [ textread( filer{kat}, '%s', 'commentstyle', 'shell', 'delimiter', '\n' ) ]';
        ind = 1;
        while ind <= length( txt )
            posb = find( txt{ind} == '/' );
            if isempty( posb )
                txt(ind) = [];
            else
                ind = ind+1;
            end
        end
        if isempty( txt )
            disp( 'Error: Your file does not contain any series' )
            return
        end 
        if( beg( kat ) == 0 | fin(kat) == 0 )
            beg(kat) = 1;
            fin(kat) = length( txt );
        end    
        for ind = beg(kat):fin( kat )
            tx = txt{ ind };
            posb = find( tx == '/' );
            pose = length( tx );
            serie = [ serie ; struct( 'name', tx(posb(1):pose ) ) ];
            disp( [ tx(posb(1):pose ) filer{kat} ] )
        end
        if length( serie ) == 0
            disp( 'No data in this catalog' )
            return
        end
    
        delta = [];
        ampwidth = [];   
        distS = 0;
        s2S = zeros( length( serie ), 1 );
        for fil = 1:length( serie )
            simdir = serie(fil).name;
            cd( simdir )
            
            if fil == 1
                % Index no 1: Drift as a diffusion process
                % The population vector is measured for time interval
                % t(i)-t(i+1). Drift is measured as mean square drift. To
                % find the correct time bin, see where drift levels off and
                % pick that value.
                load APs
                x = APs(:,1);
                y = APs(:,2);
                load Q
                load Params
		if Params(1) == 2
		  tStart = 0;
		  Icelltyp = 1;
		  tmp = [ Params(1:3) tStart Params(4:5) ];
		  for i = 1:nmod
		    tmp = [ tmp Icelltyp Params(3+3*i:5+3*i) ];
		  end
		  Params = tmp;
		elseif version == 3
		  tStart = Params(4);
		end
		cd( filesdir )
                begin = Q(1)+Q(2);
                finish = Params(5);
                NN = 0;
                ind = [];
                ang = [];
                for j = 10:4:length( Params ) 
                    N = sum(Params(j-1:j));
                    ind = [ ind'  [ NN+Params(j-1) : NN+N-1 ] ]';
                    ang = [ ang ; [ 0:2*pi/Params(j):2*pi*(1-1/Params(j))]' ];
                    NN = NN + N;
                end
                ang = [ ind ang ];
                dr = [];
                b = 1:11;
                binw =2.^b;
                figure(pages+2)
                clf
                for bb = 1:length(b)
    		        subplot( length(b), 1, bb )
                    dr = [ dr driftdiffusion( x, y, ang, binw(bb), [ begin finish ] ) ];
                end
                ind = find( dr == -1 );
                dr(ind) = [];
                binw(ind) = [];
                ddr = diff( dr );
                rddr = abs( ddr./dr(1:end-1) );
                ind = find( rddr == min( rddr ) );
                binwfinal = binw( ind );
                if isempty( dr )
                    drfinal = -1;
                else
                    drfinal = dr(ind);
                end
                
                % Index no 5: Drift measured by linear regression. Since we're measuring 
                % from a ring, we need to first find a proper cut in the ring
                yang = zeros( size( y ) );
                for j = 1:size( ang, 1 )
                    angind = find( y == ang( j, 1 ) ); 
                    if ~isempty( angind )
                        yang( angind ) = ang( j, 2 );
                    end
                end
                [ tmp, cut ] = popvec(  x, y, ang,  [ begin finish ] );
                tmp = find( yang > cut );
                yang( tmp ) = yang( tmp ) - 2 * pi; 
                A = [ ones( size( x ) ), x ];
                linrg = A\yang;
                
                
                % Index no 2 and no 3: Variance of spontaneous activity and
                % bump activity
                window = 500;
                [  tmp, s2, vars ] = isbump( x, y, [ begin finish ], ind, window, Q(1) );
                s2S(fil) = vars;

                
                
            else
                %Distractability
                %1. All simulations in a series
                %    For every simulation, do
                %2. Measure population vector last 500ms before distracter
                %3. Add distracter 180 degrees away from bump
                %4. During analysis, check popvec 250 ms before cue. Chect
                %    popvec one more time 1 second later. Store difference delta.
                %    Find simulation where smallest current makes delta >
                %    90 degrees. This is index of distractability.
                load APs
                load Params
		if Params(1) == 2
		  tStart = 0;
		  Icelltyp = 1;
		  tmp = [ Params(1:3) tStart Params(4:5) ];
		  for i = 1:nmod
		    tmp = [ tmp Icelltyp Params(3+3*i:5+3*i) ];
		  end
		  Params = tmp;
		elseif version == 3
		  tStart = Params(4);
		end
                load X
                cd( filesdir )
                finish = Params(5);
                for j = 10:4:length( Params ) 
                    N = sum(Params(j-1:j));
                    ind = [ ind ; [ NN +Params(j-1) : NN + N - 1 ]' ];
                    ang = [ ang ; [ 0:2*pi/Params(j):2*pi(1-1/Params(j))]' ];
                    NN = NN + N;
                end
                x = APs(:,1);
                y = APs(:,2);
                isAlive = 1;
                window = 500;
                tid = [ X(2)-window X(2) ];
                [  isAlive, tmp2, vars ] = isbump( x, y, tid, ind, window, Q(1) )
                s2S(fil) = vars;
                if isAlive
                    window = 500;
                    tid = [ X(2)-window X(2) X(2)+X(3)+1010-window X(2)+X(3)+1010 ]';
                    [ distIsAlive, tmp2, vars ] = isbump( x, y, tid(3:4), ind, window, Q(1), vars )
                    if distIsAlive
                        popv = zeros( 2, 1 );
                        popv(1) = popvec( x, y, ang, tid(1:2) );
                        popv(2) = popvec( x, y, ang, tid(3:4) );
                        delta = [ delta min( diff( popv ), 2*pi-diff(popv) ) ];
                        ampwidth = [ ampwidth X(5)*X(4) ];
                    else
                        delta = [ delta pi ];
                        ampwidth = [ ampwidth X(5)*X(4) ];
                    end
               end
            end
        end
        
        % Find weakest effective distracter. Err is one if either all
        % distracters are unable to distract or all distracters are able.
        % Then no threshold is found.
        dind = find( delta >= pi/2 );
	    dind2 = find( delta < pi/2 );
        err = 0;
        if isempty( dind ) | isempty( dind2 ) 
            if isempty( delta )
                dind = -1;
            elseif isempty( dind )
                dind = length( delta(end) );
            end
            err = 1;
            images = [ images 1 ];
       else
            images = [ images dind(1) ];
        end
        errv = [ errv err ];
        if dind(1)>0
            ind2 = ampwidth(dind(1));
        else
            ind2 = -1;
        end
        
        % Putting together index.
        ind1 = drfinal; % Drift as diffusion process
        ind3 = mean( s2S ); % Spontaneous activity
        ind4 = s2; % Bump activity
        ind5 = linrg(2); % Drift using linear regression
        position = [ ind1 ind2 ind3 ind4 ind5 ];
        num = kat;
        % Save index for this nat
        cd( savedir )
        if lab
            INDEX = [ INDEX struct( 'num', num, 'pos', position, 'im', images(kat), 'serie', serie, 'err', err, 'binwf', binwfinal, 'binw', binw, 'drf', drfinal, 'dr', dr, 'lab', labv( kat ) ) ];
        else
            INDEX = [ INDEX struct( 'num', num, 'pos', position, 'im', images(kat), 'serie', serie, 'err', err, 'binwf', binwfinal, 'binw', binw, 'drf', drfinal, 'dr', dr, 'lab', int2str( num ) ) ];
        end
        NetCharINDEX = INDEX(kat);
        save( savefile, 'NetCharINDEX' );
        im = images(kat);
    end
    
    % Plotting
    % Choose a simulation with a threshold distracter, if there is one. 
    % Add index with a number in a 3D-plot. Save both pictures in this
    % folder.
    cd( savedir )
    cd( INDEX(kat).serie(INDEX(kat).im).name )
    load Q
    load Params
    load APs
    x = APs(:,1);
    y = APs(:,2);
    page = floor( (kat-1) / ( rows*cols ) ) + 1;
    subp = kat - ( page-1 ) * rows * cols;
    figure( page ) 
    subplot( handl( kat ) )
    % specify call-back routine so that one can click on a picture to
    % get a big display. 
    str = strcat( 'showBig(  ''serie(ind).name,'' )' );
    set( handl( kat ), 'ButtonDownFcn', str );

    % plot the rastergrams of the cell
    str = sprintf( 'Net # %s', INDEX(kat).lab );
    title( str, 'Fontsize', 14 )
    hold on
    plot( x, y, '.', 'MarkerSize', 1 )
    set( gca, 'box', 'on' )
    if Params(1) == 1
        NI = 2^( ceil( log2( max( y )/5 ) ) );
        NE = 4*NI;
        N = NI+NE;
        ipos = NI;
        epos = N;
        xpos = NI;
        tStop = 100 * ceil( max( x )/100 );
        tQ = 1000;
        xQ = find( x<tQ );
        line( [0 tStop], [NI-0.5 NI-0.5], 'Color', 'k', 'LineWidth', 2 )
        fS = length( find( y(xQ)>=NI ) )/(tQ/1000*NE); 
        fE = length( find( y>=NI ) )/(tStop/1000*NE);
        fI = length( find( y<NI ) )/(tStop/1000*NI);
    else
        if Params(1) == 2
	  tStart = 0;
	  Icelltyp = 1;
	  tmp = [ Params(1:3) tStart Params(4:5) ];
	  for i = 1:nmod
	    tmp = [ tmp Icelltyp Params(3+3*i:5+3*i) ];
	  end
	  Params = tmp;
	elseif version == 3
	  tStart = Params(4);
	end
        N = 0;
        tStop = Params(5);
        tQ = Q(1);
        xQ = find( x<tQ );
        for i = 1:Params(2)
            NI = Params(5+4*i);
            NE = Params(6+4*i);
            ipos(i) = N+NI;
            epos(i) = N+NE+NI;
            xpos(i) = N+NI;
            fS(i) = length( find( y(xQ)>=NI ) )/(tQ/1000*NE); 
            fE(i) = length( find( y>=NI ) )/(tStop/1000*NE);
            fI(i) = length( find( y<NI ) )/(tStop/1000*NI);
            line( [0 tStop], [N+NI-0.5 N+NI-0.5], 'Color', 'k', 'LineWidth', 2 )
            if i>1
                line( [0 tStop], [N-0.5 N-0.5], 'Color', 'k', 'LineWidth', 2 )
            end
            N = N+NI+NE;
        end
    end
        
    set( gca, 'YLim', [0 N] )
    set( gca, 'FontSize', 14 )
    for i = 1:length(ipos)
        tI(i) = text( 0.1*tStop, ipos(i), 'I', 'FontSize', 16, 'FontWeight', 'Bold', 'VerticalAlignment', 'top' ); 
        tE(i) = text( 0.1*tStop, epos(i), 'E', 'FontSize', 16, 'FontWeight', 'Bold', 'VerticalAlignment', 'top' );
        str = sprintf( 'fE: %.1f\nfS: %.1f\nfI: %.1f\nbin: %d\n', fE(i), fS(i), fI(i), binwfinal );
        tx(ind) = text( 0.1*tStop, xpos(i), str, 'FontSize', 12, 'VerticalAlignment', 'bottom' );
    end
    if mod((subp-1), cols )
        set( gca, 'YTickLabel', [] )
    end
    
    % plot drift as function of step size
    if ~isempty( dr )
        page = pages/2+floor( (kat-1) / (rows*cols) ) + 1
        figure( page )
        subplot( handl(kat+len) )
        semilogx( binw, dr )
        str = sprintf( 'Net # %s', INDEX(kat).lab );
        title( str, 'Fontsize', 14 )
        set( gca, 'YLim', [ 0 max( dr ) ] )
    end
    
    % plot the 3D-plot. Choose any index you wish
    figure( pages+10 )
    px = INDEX(kat).pos(1);
    py = INDEX(kat).pos(4);
    pz = INDEX(kat).pos(3);
    if errv(kat)
        plot3( px, py, pz,'ro', 'Markersize', 5 );
    else
        plot3( px, py, pz, 'x', 'MarkerSize', 5); %fixa label
    end
    hold on
    grid on
    title( 'Scatterplot av 1-modulsnatverks performance' )
    xlabel( 'drift (celler/sek)' )
    ylabel( 'varians av delayaktivitet (Hz2)' )
    zlabel( 'varians av spontanaktivitet (Hz2)' )
    labt = [ labt text( px, py, pz, INDEX(kat).lab) ]; 
    clear savedir savefile
end


% Print or save pictures
if DoPrint
    for i = 1 : pages
        figure( i )    
        set( gcf, 'PaperUnits', 'centimeters' );
        set( gcf, 'PaperType', 'A4');
        papersize = get( gcf, 'PaperSize' );
        left = 0.02;
        bottom = 0.02;
        width = papersize( 1 ) - 2 * left;
        height = papersize( 2 ) - 2 * left;
        myfiguresize = [ left, bottom, width, height ];
        set( gcf, 'PaperPosition', myfiguresize );
        print
    end
    figure( pages+10 )
        set( gcf, 'PaperUnits', 'centimeters' );
        set( gcf, 'PaperType', 'A4');
        papersize = get( gcf, 'PaperSize' );
        left = 0.02;
        bottom = 0.02;
        width = papersize( 1 ) - 2 * left;
        height = papersize( 2 ) - 2 * left;
        myfiguresize = [ left, bottom, width, height ];
        set( gcf, 'PaperPosition', myfiguresize );
        print
end


   cd( homedir )