if (name_declared("pkgversions") != 4 ) { execute("strdef pkgversions") } sprint(pkgversions,"%s, ", nrnversion(), pkgversions) sprint(pkgversions,"%sbpap-cell = $Revision: 1.4 $, ",pkgversions) load_file("bpap-data.hoc") load_file("Segment.hoc") load_file("ReferenceAxis.hoc") // // Cell model // // Proc to set Ra in each section from global variable cell_Ra proc cell_set_cell_pars() { forall Ra = cell_Ra } // Proc to turn on cvode and record this in cvode_on so it can be recorded proc cell_set_cvode_active() { cvode_active($1) cvode_on = $1 } // Proc to set cvode atol and save it in cvode_atol so it can be recorded proc cell_set_cvode_atol() { cvode_atol = $1 cvode.atol(cvode_atol) } // Proc to load the cell model strdef cmd proc cell_load_cell_model() { // Load Neuron file sprint(cmd, "load_file(\"%s.hoc\")",$s1) execute1(cmd) } strdef cell_model objref base, apex //create apical_dendrite[93] // COMMENTED OUT BY MR GROEN, double defined objref measure[2] // Procedure to load the cell model and determine some statistics of // the cell proc cell_setup_cell () { ra_adjustment = 0 cell_set_cvode_active(1) cell_load_cell_model(cell_model) cell_set_cell_pars() // This should give a maxium effective L of leas than 0.2 during synaptic stimulation without a spike // and an effective L of less than 0.5 when there is a spike // Verify this with: // forsec "apical" print L/nseg/length_constant(Ra, 1/get_max_g_in_sim(), diam) forsec "apical" cell_set_max_length_by_length_constant(1) cell_statistics() cell_find_erest() cell_measure_impedance() } // Find resting potential erest=0 proc cell_find_erest() { run() erest=v(0.5) } // Procedure to set up some useful lists and do some statistics on // the cell objref sl objref ra objref diams, distances, perp_distances objref segreflist, parents objref trunk_segreflist, trunk_sri objref apical_trunk_list proc cell_statistics() { local aptf, i print "Calculating cell statistics" // Set default section as origin for measuring distances from distance() // Set up the reference axis for measuring perpendicular distance // and distributing synapses ra = new ReferenceAxis() ra.setup_with_segrefs(base, apex, ra_adjustment) apexdist = sqrt(ra.axis.sumsq())+ra.adjustment datalist.appendSetDouble("apexdist ", apexdist) // Make a section list of the apical dendrites sl = new SectionList() forsec "apical" sl.append() // Make a list of the segments from the section list segreflist = new SegmentRefList() // Append only *internal* segments as point processes that use // ca_ion cannot by placed on 0 or 1 segreflist.append_segments_from_section(0.5) segreflist.append_internal_segments_from_seclist(sl) segreflist.parents(parents) // Make a list of inds of segrefs that are on the trunk trunk_segreflist = new SegmentRefList() trunk_segreflist.append_internal_segments_from_seclist(apical_trunk_list) trunk_sri = new Vector() for i=0, trunk_segreflist.count()-1 { trunk_sri.append(segreflist.find_ind_of_segment(trunk_segreflist.srl.o(i))) } // Section diameters and distances diams = new Vector() distances = new Vector() perp_distances = new Vector() // Set number of segments nsegs = segreflist.srl.count() // Go through each segment in turn for i = 0, nsegs-1 { segreflist.srl.object(i).secref.sec { // Write diameters diams.append(diam(segreflist.srl.object(i).x)) // Write distances distances.append(distance(segreflist.srl.object(i).x)) } perp_distances.append(ra.apply_expr_to_segref(segreflist.srl.object(i),"H*l")/ra.apply_expr_to_segref(segreflist.srl.object(i),"l")) } // Write to list datalist.appendVector("diams") datalist.appendVector("distances") datalist.appendVector("perp_distances") datalist.appendVector("parents") datalist.appendVector("trunk_sri") } // Find the theoretical maxium conductance in each section func cell_get_max_gbar() { local gbar gbar = 0 if (ismembrane("hha2")) { gbar += gkbar_hha2 } if (ismembrane("hha2")) { gbar += gnabar_hha2 } if (ismembrane("hha2")) { gbar += gl_hha2 } if (ismembrane("hha_old")) { gbar += gkbar_hha_old } if (ismembrane("hha_old")) { gbar += gnabar_hha_old } if (ismembrane("hha_old")) { gbar += gl_hha_old } if (ismembrane("pas")) { gbar += g_pas } if (ismembrane("h")) { gbar += gbar_h } if (ismembrane("kap")) { gbar += gkabar_kap } if (ismembrane("kad")) { gbar += gkabar_kad } if (ismembrane("km")) { gbar += gbar_km * 1E-4 } if (ismembrane("cal")) { gbar += gcalbar_cal } if (ismembrane("cat")) { gbar += gcatbar_cat } if (ismembrane("somacar")) { gbar += gcabar_somacar } if (ismembrane("kca")) { gbar += gbar_kca } if (ismembrane("mykca")) { gbar += gkbar_mykca } if (ismembrane("calH")) { gbar += gcalbar_calH } return(gbar) } // Find the maximum possible value of g in each channel after a run // This will be an overestimate, since not all channels will have been // at their most open at the same time func cell_get_max_g_in_run() { local gmax gmax = 0 if (ismembrane("hha2")) { gmax += gmax_hha2 } if (ismembrane("hha_old")) { gmax += gmax_hha_old } if (ismembrane("pas")) { gmax += g_pas } if (ismembrane("h")) { gmax += gmax_h } if (ismembrane("kap")) { gmax += gmax_kap } if (ismembrane("kad")) { gmax += gmax_kad } if (ismembrane("km")) { gmax += gmax_km } if (ismembrane("cal")) { gmax += gmax_cal } if (ismembrane("cat")) { gmax += gmax_cat } if (ismembrane("somacar")) { gmax += gmax_somacar } if (ismembrane("kca")) { gmax += gmax_kca } if (ismembrane("mykca")) { gmax += gmax_mykca } if (ismembrane("calH")) { gmax += gmax_calH } return(gmax) } // // length_constant(Ri, Rm, d) // Compute the length constant in um in a section where the units of // Ri are Ohm-cm // Rm is Ohm-cm2 // diam is um func cell_length_constant() { local Ri, Rm , d Ri = $1 * 1E4 // Convert Ohm-cm to Ohm-um Rm = $2 * 1E8 // Convert Ohm-cm2 to Ohm-um2 d = $3 return(sqrt(Rm*d/(4*Ri))) } func cell_get_length_by_length_constant() { return(L/nseg/cell_length_constant(Ra, 1/cell_get_max_gbar(), diam)) } // Set the maxumum length as a fraction of the length constant by increaseing the number of segments proc cell_set_max_length_by_length_constant() { local lmax, l, n lmax = $1 // Maximum allowed length in terms of length constant l = cell_get_length_by_length_constant() // Actual length of each segment if (l > lmax) { nseg = nseg * l / lmax // Increase nseg if (nseg % 2) { nseg += 1 } // Ensure nseg is odd } } // The business objref imp objref transimp, inputimp transimp = new Vector() inputimp = new Vector() proc cell_measure_impedance() { local i, maxntestsegs // We seem to need to initialise the cell first init() maxntestsegs = segreflist.srl.count() // New impedance object imp = new Impedance() // Locate voltage electrode in soma imp.loc(0) // Compute transfer impdeance at 0Hz between this point and all other points imp.compute(0) // Now get the transfer impedance for each segment in turn transimp.resize(maxntestsegs) inputimp.resize(maxntestsegs) for i= 0, maxntestsegs - 1 { segreflist.srl.object(i).secref.sec { transimp.x(i) = imp.transfer(segreflist.srl.object(i).x) inputimp.x(i) = imp.input(segreflist.srl.object(i).x) } } datalist.appendVector("transimp") datalist.appendVector("inputimp") } proc cell_print_trunk_distances() { local i for i=0, trunk_sri.size()-1 { segreflist.srl.o(trunk_sri.x(i)).print_distance() } }