if (name_declared("pkgversions") != 4 ) { execute("strdef pkgversions") } sprint(pkgversions,"%sbpap-dendburst = $Revision: 1.22 $, ",pkgversions) load_file("bpap-cell.hoc") load_file("bpap-record.hoc") load_file("utils.hoc") load_file("PointProcessDistributor.hoc") load_file("NmdaAmpaSynStim.hoc") load_file("NmdaAmpaSpineSynStim.hoc") load_file("bpap-data.hoc") // // Synapses on the SC input to the apical dendrite. This is a similar // situation to Spruston et al. (1995). We would like the inputs to // be distributed within 100 to 450 um measured perpendicular from the // pyramidal cell layer (Megias et al. 2001). To do this we have to use // the routines of Poirazi, perhaps coupled with my PointProcessDistributor // object // objref ppd ppd = new PointProcessDistributor(1) strdef tmpstr objref screc_inputs_sr // These objrefs will be lists that contain NmdaAmpaSpineSynStim (syn) objects objref screc_inputs // SC "Recorded" objref scthin_inputs // SC thin dendrites objref scthickprox_inputs // Proximal SC objref scthickmed_inputs // Medial SC objref scthickdist_inputs // Distal SC objref scall_inputs // All SC // These objrefs will be vectors that contain the indicies of the segrefs // on which the NmdaAmpaSpineSynStim are located objref screc_inputs_sri // SC "Recorded" objref scthin_inputs_sri // SC thin dendrites objref scthickprox_inputs_sri // Proximal SC objref scthickmed_inputs_sri // Medial SC objref scthickdist_inputs_sri // Distal SC objref scall_inputs_sri // All SC // // create_and_distribute_synapses(List synstim, int nsyn, Vector segrefs) // // Function to create the NmdaAmpaSpineSynStim objects, set their parameters // and distribute them using the ppd PointProcessDistributor object. // The list of NmdaAmpaSpineSynStim objects is placed in SYNSTIM, NSYN is the number // of synapses to create, and the indicies of the segment references // in which the NmdaAmpaSpineSynStim objects are located are placed in SEGREFS. // proc create_inputs() { local n, i n = int($2) // Create the synapses for i=$o1.count(), $o1.count() + n - 1 { $o1.append(new NmdaAmpaSpineSynStim(-1)) // -ve arg prevents location $o1.object(i).spine.head { insert cacum insert car_mag } set_input_pars($o1.object(i)) } } proc destroy_inputs() { local nsyn, i nsyn = int($2) // Destroy the synapses for i=0, nsyn-1 { $o1.object($o1.count()-1).destroy() // Destructor method $o1.remove($o1.count()-1) // Remove ref from list } } // // Functions to set parameters // proc set_spine_pars() { $o1.spine.head tau_cacum = tauca $o1.spine.head cai0_cacum = cai0 $o1.spine.head kappa_cacum = kappa // Assuming uniform concentration in the entire spine head is // equivalent to a shell of depth diam/4. The 1E3 is to convert // into nm from um $o1.spine.head.diam = headdiam $o1.spine.head.L = headL $o1.spine.neck.diam = neckdiam $o1.spine.neck.L = neckL $o1.spine.head depth_cacum = ($o1.spine.head.diam/4) * 1E3 $o1.spine.head gmax_car_mag = gmax_car_spine*1E-12/(area(0.5)*1E-8) } proc set_stim_pars() { $o1.netstim.noise = noise if (dendburst_state) { $o1.netstim.start = start } else { $o1.netstim.start = tstop + 1 } $o1.netstim.interval = interval } proc set_syn_pars() { $o1.ampasyn.e = e_ampa $o1.netcon.weight = gsbar_ampa $o1.nmdasyn.e = e_nmda $o1.nmdanetcon.weight = gsbar_nmda } proc set_input_pars() { set_spine_pars($o1) set_stim_pars($o1) set_syn_pars($o1) } proc disable_synapses() { for i=0, scall_inputs.count()-1 { scall_inputs.object(i).netstim.start = tstop + 1 } } // Enable first nsyn synapses proc enable_synapses() { local i for i=0, scall_inputs.count()-1 { scall_inputs.object(i).netstim.number = tstop/interval * 100 } } objref scalefac datalist.appendVector("scalefac") proc set_all_input_pars() { local i for i=0, scall_inputs.count()-1 { set_input_pars(scall_inputs.object(i)) // Schaffer collateral synapses } scalefac = new Vector(scall_inputs_sri.size()) if (ampa_scaled) { cell_measure_impedance() // Make sure the transimp exists scalefac.fill(transimp.ind(scall_inputs_sri).mean()) scalefac.div(transimp.ind(scall_inputs_sri)) for i=0, scall_inputs.count()-1 { scall_inputs.object(i).netcon.weight *= scalefac.x(i) } } else { scalefac.fill(1) } } // At one point (rev 1.18 and under), the idea was to create a number // of synapses and then activate a certain number (nsynmax) of them to // change the number of active synapses. However, now we want to // create a different distribution of synapses over the dendritic tree // for each simulation. This means that we will create all the // synapses required on each simulation run, and destroy them // afterwards. This is not as efficient, but it removes the need to do // the permuations which served to randomise the synapses in the rev // 1.18 and under. // Set up the probability distributions of synapses The dendritic tree // is divided into four different zones: Thin branches, and thick // proximal, medial and distal branches. The fraction of synapses in // each zone are given by thinfrac, thickproxfrac, thickmedfrac, and // thickdistfrac. scall_inputs = new List() objref nsyn_zone, ratio objref screc_inputs, screc_inputs_sri proc create_and_distribute_inputs() { local n, i // We may need to create inputs if (nsyn > scall_inputs.count()) { create_inputs(scall_inputs, nsyn - scall_inputs.count()) } // Or delete excess inputs if (nsyn < scall_inputs.count()) { destroy_inputs(scall_inputs, scall_inputs.count() - nsyn) } // create_and_distribute_screc_inputs() // screc_inputs_sr is a list of the SegmentRefs of the synapses which we wish to record from // it has been created elsewhere (perhaps bpap-interactive.hoc) with commands like // objref screc_inputs_sr // screc_inputs_sr = new SegRefList() // apical_dendrite[57] screc_inputs_sr.append_segements_from_section(0.3) // apical_dendrite[62] screc_inputs_sr.append_segements_from_section(0.5) // Get index of screc_inputs_sr in segfreflist // segreflist.find_ind(screc_inputs_sri, screc_inputs_sr) // Then locate them on the tree n = screc_inputs_sr.count() for i=0, (n - 1) { screc_inputs_sr.srl.object(i).secref.sec scall_inputs.object(i).loc(screc_inputs_sr.srl.object(i).x) } utils.list_copy(screc_inputs, scall_inputs, 0, n - 1) // Find the number of synapses per zone, nsyn_per_zone, given the fraction of synapses in each zone and // the total number of synapses ratio = new Vector(4) ratio.x(0) = thinfrac ratio.x(1) = thickproxfrac ratio.x(2) = thickmedfrac ratio.x(3) = thickdistfrac utils.mul_ratio_round(nsyn_zone, nsyn - n, ratio) // Synapses on thin dendrites sprint(tmpstr, "((d<1.5) && (H<%f))*l" , apexdist) ppd.setup_probs_from_seglist_with_refaxis(segreflist, ra, tmpstr) // create_inputs(scthin_inputs, nsyn_zone.x(0)) utils.list_copy(scthin_inputs, scall_inputs, n, n + nsyn_zone.x(0) - 1) ppd.distribute_pps_from_list(scthin_inputs, scthin_inputs_sri) n = n + nsyn_zone.x(0) // Synapses on thick proximal dendrites sprint(tmpstr, "((d>=1.5) && (H<%f))*l" , apexdist * 100/450) ppd.setup_probs_from_seglist_with_refaxis(segreflist, ra, tmpstr) utils.list_copy(scthickprox_inputs, scall_inputs, n, n + nsyn_zone.x(1) - 1) ppd.distribute_pps_from_list(scthickprox_inputs, scthickprox_inputs_sri) n = n + nsyn_zone.x(1) // Synapses on thick medial dendrites sprint(tmpstr, "((d>=1.5) && (H>=%f) && (H<%f))*l" , apexdist * 100/450, apexdist* 250/450) ppd.setup_probs_from_seglist_with_refaxis(segreflist, ra, tmpstr) utils.list_copy(scthickmed_inputs, scall_inputs, n, n + nsyn_zone.x(2) - 1) ppd.distribute_pps_from_list(scthickmed_inputs, scthickmed_inputs_sri) n = n + nsyn_zone.x(2) // Synapses on thick medial dendrites sprint(tmpstr, "((d>=1.5) && (H>=%f) && (H<%f))*l" , apexdist * 250/450, apexdist) ppd.setup_probs_from_seglist_with_refaxis(segreflist, ra, tmpstr) utils.list_copy(scthickdist_inputs, scall_inputs, n, n + nsyn_zone.x(3) - 1) ppd.distribute_pps_from_list(scthickdist_inputs, scthickdist_inputs_sri) // Make federated list scall_inputs_sri = new Vector() scall_inputs_sri.append(screc_inputs_sri, scthin_inputs_sri, scthickprox_inputs_sri, scthickmed_inputs_sri, scthickdist_inputs_sri) // Set input parameters set_all_input_pars() // Turn on synapses enable_synapses() }