// This template is used to create a band of sections by // randomly selecting sections within a specified region (in // interval [lo hi]). Sections can be selected with or without // repetition and synapses can be allocated at predifined // locations along these sections // written by Yiota Poirazi, July 2001, poirazi@LNC.usc.edu objref synapse_band_shape, gaba_band_shape synapse_band_shape=new Shape() // shape graph to plot AMPA and NMDA synapses gaba_band_shape=new Shape() // shape graph to plot GABA_A and GABA_B synapses begintemplate SynapseBand public pick_and_salloc, pick_and_SALLOC, pick, pick_and_remove, pick_and_SALLOC_GABAa, pick_and_SALLOC_GABAb objref all_secs, secs_in_band, selected_secs, rnum, ltmp strdef exec_str proc init () { all_secs=$o1 // list of all sections to choose from lo=$2 // minimum distance from soma hi=$3 // maximum distance from soma actual_res=$4 // obsolete. Used only if more than one synapses are to be placed at a specific location desired_res=$5 // obsolete. Used only if more than one synapses are to be placed at a specific location PID=$6 // random number generator seed // print "choosing sections that are between ", lo, " and ", hi, " microns from the soma" secs_in_band=new List() if (PID < 0) { PID=-PID // if PID < 0 choose sections branchwise sprint(exec_str,"choose_secs_branchwise(%s,%s,%g,%g,%g,%g)", all_secs,secs_in_band,lo,hi,actual_res,desired_res) } else { sprint(exec_str,"choose_secs(%s,%s,%g,%g,%g,%g)", all_secs,secs_in_band,lo,hi,actual_res,desired_res) } execute1(exec_str) // use ../lib/choose-secs.hoc to choose sections and store them in "secs_in_band" rnum=new Random(PID) } proc cdto() { // Access a given section ltmp=secs_in_band.object(num) access ltmp.section_ref.sec // print secname(), "accessed by SynapseBand.pick()" } proc cdto_rm() { // Remove the section just accessed ltmp=secs_in_band.object(num) access ltmp.section_ref.sec // print secname(), " accessed by SynapseBand.pick(). cdto_rm() is removing it." secs_in_band.remove(num) } proc pick() { //randomly (uniformly) pick a section in band and access it num=rnum.uniform(0,secs_in_band.count()-1) cdto(num) } proc pick_and_remove() { //randomly (uniform) pick a section in band, access and remove it num=rnum.uniform(0,secs_in_band.count()-1) cdto_rm(num) } proc pick_and_salloc() { // randomly pick a section in band, access it and allocate a synapse (AMPA or NMDA) on it pick() sprint(exec_str,"salloc(%s,%s,%g)", $o1,$o2,ltmp.range_ref) // in ../lib/salloc.hoc execute1(exec_str) sprint(exec_str,"synapse_band_shape.point_mark(%s,%d)", $o1,$3) // make a shape graph and print a execute1(exec_str) // dot at the location of the synapse } proc pick_and_SALLOC() { // same as above but made to work with both AMPA/NMDA and GABA synapses (not used) pick() sprint(exec_str,"SALLOC(%s,%s,%g,%d)", $o1,$o2,ltmp.range_ref,$4) // in ../lib/salloc.hoc execute1(exec_str) sprint(exec_str,"synapse_band_shape.point_mark(%s,%d)", $o1,$3) execute1(exec_str) } proc pick_and_SALLOC_GABAa() { // Used if only GABA_A synapses will be allocated pick() sprint(exec_str,"SALLOC_GABAa(%s,%g,%d,%g)", $o1,ltmp.range_ref, $3, $4) // in ../lib/salloc.hoc execute1(exec_str) sprint(exec_str,"gaba_band_shape.point_mark(%s,%d)", $o1, $2) execute1(exec_str) } proc pick_and_SALLOC_GABAb() { // Used if only GABA_B synapses will be allocated pick() sprint(exec_str,"SALLOC_GABAb(%s,%g,%d,%g)", $o1,ltmp.range_ref, $3, $4) // in ../lib/salloc.hoc execute1(exec_str) sprint(exec_str,"gaba_band_shape.point_mark(%s,%d)", $o1,$2) execute1(exec_str) } endtemplate SynapseBand