/************************************************************ Christina Weaver August 2011 auxiliary procedures for loading data, and model fitting. ************************************************************/ print "top of aux_procs.hoc" /* * Adds spines to a cell on all dendrites that are part of the specified SectionList. * pattern. The * global variable flag_spines is ignored, since this method only makes sense * to call when spine processing is desired. * * Arguments: * \$o1: SectionList to loop over * \$2: Surface area of a single spine * \$3: spine density for branches in the SectionList * * written by Christina Weaver, Jan 2012 */ proc applySubtreeConstantSpineDensity() { local total_surface_area, dend_surface_area, \ surface_area_one_spine, surface_area_all_spines, spine_dens, mean_diam print "top of Subtree proc." // Ensure that NEURON evaluates the cell in 3D mode when calling diam(), by // using a side effect of the area() call. It doesn't matter which section // is used for the call, and the return value of area() can be discarded. forall { area(0.5) } // This used to be at the end of the function. I'm trying to move it to the // top, where it makes more sense, since the for(x) construct gets used to // do the spine adjustment. geom_nseg(100, 0.1) // nseg according to frequency // geom_nseg(100, 0.1) // nseg according to frequency forall { nseg *= 5 } surface_area_one_spine = \$2 spine_dens = \$3 printf("Adding spines to %s, density %.3f, spine SA %g\n",\$o1,\$2,\$3) dendrite_count = 0 total_surface_area = 0 forsec \$o1 { printf("\t%s\n",secname() ) dendrite_count = dendrite_count + 1 temp = area(0.5) num_spines = L * spine_dens dend_surface_area = 0 mean_diam = 0 for (x) { dend_surface_area = dend_surface_area + area(x) if( x > 0 && x < 1 ) mean_diam += diam(x) } mean_diam /= nseg total_surface_area = total_surface_area + dend_surface_area // adjusted by Christina Weaver, 5 Jan 12. Still some error, but better than using // Patrick's method which sets the diam throughout the section to whatever it is in the // middle of the section. // if (dend_surface_area > 0 && num_spines > 0) { surface_area_all_spines = (surface_area_one_spine * num_spines) factor = (dend_surface_area + surface_area_all_spines) / dend_surface_area L = L * (factor^(2/3)) diam = mean_diam * (factor^(1/3)) } } printf("Dendrite_count: %d\n", dendrite_count) printf("total surface area before spine correction: %f\n", total_surface_area) }