objref diamV
//xopen("../plot_morph_info.hoc")
proc MSN_fixDiams() { local i, xstp, xoff, xprev, xend
// print "Adjusting dendrite diameters"
// first, correct any really narrow dendrites
forall { if( diam < 0.5 ) diam = 0.5 }
// now use a 3-pt avg to smooth all dendrites with nseg>0
forsec "dend" {
if( nseg > 3 ) {
// printf("\n\nSection %s, nseg %d\n",secname(),nseg)
xstp = 1/nseg
xoff = xstp/2
// print output to check this.
diamV = new Vector(nseg+2)
// forward difference
// printf("start: diamV.x[0] = (diam(0)+diam(%g)+diam(%g)) / 3\n",xstp-xoff,2*xstp-xoff)
diamV.x[0] = (diam(0)+diam(xstp-xoff)+diam(2*xstp-xoff)) / 3
for i = 1, nseg {
if( i== 1 ) { xprev = 0 } else { xprev = xstp*(i-1)-xoff }
if( i== nseg ) { xend = 1 } else { xend = xstp*(i+1)-xoff }
//printf("Average diamV.x[%d] = ( diam(%g) + diam(%g) + diam(%g) ) / 3\n",i,xprev,xstp*i-xoff,xend)
diamV.x[i] = ( diam(xprev) + diam(xstp*i-xoff) + diam(xend) ) / 3
}
// backward difference
// printf("end: diamV.x[%d] = (diam(1)+diam(%g)+diam(%g)) / 3\n",nseg+1,1-xoff,1-xoff-xstp)
diamV.x[nseg+1] = (diam(1)+diam(1-xoff)+diam(1-xoff-xstp)) / 3
// printf("\n\nAdjusting diameter in section %s, nseg %d\n",secname(),nseg)
// for(x) { printf("\t(%g, %g)",x,diam(x)) }
// printf("\n")
// for i=0, nseg+1 { printf("\t(%g, %g)",i*xstp-xoff,diamV.x[i]) }
// printf("----done %s\n",secname())
i=0
for(x) {
diam(x) = diamV.x[i]
i = i+1
}
}
}
}
MSN_fixDiams()