Perturbation sensitivity implies high noise and suggests rate coding in cortex (London et al. 2010)

 Download zip file 
Help downloading and running models
"... The network simulations were also based on a previously published model(Latham et al. 2000), but with modifications to allow the addition and detection of extra spikes (see Supplementary Information, section 7)."
1 . London M, Roth A, Beeren L, Häusser M, Latham PE (2010) Sensitivity to perturbations in vivo implies high noise and suggests rate coding in cortex. Nature 466:123-7 [PubMed]
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):
Gap Junctions:
Simulation Environment: C or C++ program;
Model Concept(s): Activity Patterns;
	returns an array of variables with probability distribution

		p(x) = sum_j rho_j exp(-(mu_j-x_j)^2/2*sigma_j^2)/Z
	where the Gaussian may be truncated and Z is the normalization,
	chosen such that Z=int dx_xa^xb exp(-(mu_j-x_j)^2/2*sigma_j^2) where
	xa and xb are the truncation values. the rho_j sum to 1.

	1. make this float* rather than double*.
	2. add seed, but don't call srand unless seed > 0.
	3. allow nsplit=0.


// headers
#include <math.h>
#include <stdlib.h>

float* setgauss(int n, int nf, float** f, int seed, rgauss& g)
	n elements are assigned randomly to nf groups.

	f[i][4] gets normalized. if any numbers are negative, we just take
	the absolute value.

	n	- total number of elements. output is size n.
	nf	- number of probability distributions.
	f[i][j]	- i labels distribution; it runs from 0 to nf-1.
		  j=0: mean of gaussian.
		    1: sd of gaussian.
		    2: min of gaussian.
		    3: max of gaussian.
		    4: probability that an element gets assigned to this group.
	seed	- if > 0, call srand(seed)

	x[i]	- elements with (sum of gaussian) distribution, as
		  discussed above.

	// ---start random number generator if seed > 0.
	if (seed > 0) srand(seed);

	// ---muck with f
	double* facc = (double*) calloc(nf, sizeof(double));
	for (int i=0; i < nf; i++)
		// ---normalize f[i][4]
		double pacc=0;
		for (int i=0; i < nf; i++)
			f[i][4] = f[i][4] < 0 ? -f[i][4] : f[i][4];
			pacc += f[i][4];
		for (int i=0; i < nf; i++) f[i][4] /= pacc;

		// ---make cumulative distribution
		for (int i=nf-1; i > 0; i--)
			facc[i-1] = facc[i] - f[i][4];

	// ---find out which element is in which group.
	int* dist = (int*) calloc(n, sizeof(int));
	int* cnt = (int*) calloc(nf, sizeof(int));
	for (int i=0; i < n; i++)
		// ---assign neuron to distribution
		double rnum = drand();
		int j;
		for (j=0; j < nf; j++) if (rnum <= facc[j]) break;


	// ---get random numbers
	float** xtmp = (float**) calloc(nf, sizeof(float*));
	for (int i=0; i < nf; i++) xtmp[i] =
		g.ran(f[i][1], cnt[i], f[i][2]-f[i][0], f[i][3]-f[i][0]);

	// ---set x
	float* x = (float*) calloc(n, sizeof(float));
	for (int i=0; i < nf; i++) cnt[i]=0;
	for (int i=0; i < n; i++)
		x[i] = f[dist[i]][0]+xtmp[dist[i]][cnt[dist[i]]++];

	cfree(nf, xtmp);
	return x;

Loading data, please wait...