Mapping function onto neuronal morphology (Stiefel and Sejnowski 2007)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:93398
"... We used an optimization procedure to find neuronal morphological structures for two computational tasks: First, neuronal morphologies were selected for linearly summing excitatory synaptic potentials (EPSPs); second, structures were selected that distinguished the temporal order of EPSPs. The solutions resembled the morphology of real neurons. In particular the neurons optimized for linear summation electrotonically separated their synapses, as found in avian nucleus laminaris neurons, and neurons optimized for spike-order detection had primary dendrites of significantly different diameter, as found in the basal and apical dendrites of cortical pyramidal neurons. ..."
Reference:
1 . Stiefel KM, Sejnowski TJ (2007) Mapping function onto neuronal morphology. J Neurophysiol 98:513-26 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Influence of Dendritic Geometry; Methods; Unsupervised Learning;
Implementer(s): Stiefel, Klaus [stiefel at salk.edu];
/*



*/

begintemplate thegenome
public gene, newgene, makegene, nextgeneration
public pointmutate, dubmutate, delmutate

objref dice, gene, newgene, genemean, genesd, syn

/* ------------------------------------------------------------------------------------
	Manipulations of the genome
	all mutation procs work on NEWGENOME !
*/

proc init() {
	genel = 14
	setvalues()
	dice = new Random($1)
	makegene(4)
}

proc nextgeneration() {
	newgene	= gene.c
}

// sets the values for the genes
proc setvalues() {
	genemean = new Vector()
	genesd = new Vector()

	genemean.append(32, 300, 100, 200, .5, 100, 100, PI/10, 10, 100, 10, 1/25, PI/2, 0)		
	genesd.append(16, 100, 10, 100, .2, 10, 10, PI/10000, 10, 10, 2, 1/250, 4*PI, 4*PI)
	/*
	mean and standard deviation values for:
	m0, length0, my length, sigmal length, assymetry0, my asymetry, sigma asymetry, 
	branching0, my branching, sigma branching, diameter0, delta diameter, alpha0, beta0
	*/
}

// makes a random genome
// $1: nr of gene blocks (branches)
proc makegene() { local index 
	gene = new Vector(genel*int(dice.normal(1, 0.05)*$1))
	newgene = new Vector(genel*int(dice.normal(1, 0.05)*$1))

	for genenr = 0, gene.size()-1 {
		index = genenr-genel*int(genenr/genel)
		gene.x[genenr] = dice.normal(genemean.x[index], genesd.x[index]/10)
		if (index == 0) { gene.x[genenr] = int(gene.x[genenr]) }
	}	
	newgene = gene.c
}

// changes the value of 1 gene
proc pointmutate() { local target, index
	target = int(dice.uniform(0, newgene.size()-1))
//	index = target-genel*int(target/genel)		
	newgene.x[target] = newgene.x[target]*dice.normal(1, .25)
	if (target/genel == int(target/genel)) { newgene.x[target] = int(newgene.x[target]) }
	// print "Point mutation at position ", target, " to value ", newgene.x[target]
}

// dublicates a gene block
proc dubmutate(){local target
	target = int(dice.uniform(0, newgene.size()/genel-1))
	newgene.append(newgene.at(target*genel, target*genel+13))
	// print "Dublication of genes ", target*genel, " to ", target*genel+13
}

// deletes a gene block
proc delmutate(){local target
	if (newgene.size() > genel) {
		target = int(dice.uniform(0, newgene.size()/genel-1))
		newgene.remove(target*genel, target*genel+13)
	}
	// print "Deletion of genes ", target*genel, target*genel+13
}

endtemplate thegenome

Loading data, please wait...