// Random location template
// Used for placing point processes (typically synapses) at random locations
// within a given SectionList
// List of point processes to be placed at a given location is passed to loc()
// BPG 29-3-10
/*
?2 RandomLocation
rl = new RandomLocation(SectionList, UniformRandomGenerator)
rl.loc(PointProcess)
relocates the PointProcess to a random location with respect to
uniform distribution based on position.
SectionList defines the set of sections to sample.
*/
begintemplate RandomLocation
public loc, locsp
objectvar seclist, ran
proc init() {
seclist = $o1
// ran = new Random($2)
// ran = new Random()
ran = $o2
total_length = 0
forsec seclist { total_length = total_length + L }
}
// randomize location of synapse(s)
proc loc() {local i, l, rpos, secx
//randomize_location.loc(synapse list)
rpos = ran.uniform(0, total_length)
l = 0
distance() // assumes soma is currently accessed
forsec seclist {
l = l + L
if (l > rpos) {
secx = (rpos - l + L)/L
// print secname(), secx
for i=0,$o1.count()-1 {
$o1.o(i).loc(secx)
}
rpos = 1e20 // a break would screw up the stack?
}
}
}
// randomize location of synapse(s) attached to spines
// if required put synapse on spine, scale conductance and onset
proc locsp() {local i, l, rpos, secx
//randomize_location.loc(synapse, snr, shr)
rpos = ran.uniform(0, total_length)
l = 0
distance() // assumes soma is currently accessed
forsec seclist {
l = l + L
if (l > rpos) {
secx = (rpos - l + L)/L
print secname(), secx
connect $o2.sec(0), secx
$o2.sec connect $o3.sec(0), 1
for i=0,$o1.count()-1 {
$o3.sec $o1.o(i).loc(0.5)
}
rpos = 1e20 // a break would screw up the stack?
}
}
}
endtemplate RandomLocation