/* Relating dendritic geometry and signal propagation */
/* Philipp Vetter, Arnd Roth and Michael Hausser */
/* help.hoc Version 1.0 11.10.1999 */
/***************************************************************************
Online Help
***************************************************************************/
proc hlp() { local n
/* print help for function/procedure $s1 */
/* if numarg()==0, then print names of all functions/procedures */
n = numarg()
notfound = 1
helpinfo = " "
if (n==0) { fxnscan("parse.hoc",helpstr)
fxnscan("neuronprefs.hoc",helpstr)
fxnscan("electrophysiology.hoc",helpstr)
fxnscan("geometry.hoc",helpstr)
fxnscan("impedance.hoc",helpstr)
fxnscan("output.hoc",helpstr)
fxnscan("graphics.hoc",helpstr)
fxnscan("statistics.hoc",helpstr)
fxnscan("forward.hoc",helpstr)
fxnscan("help.hoc",helpstr)
fxnscan("gui.hoc",helpstr)
}
if (n==2) { fxnscan("parse.hoc",helpstr,1)
fxnscan("neuronprefs.hoc",helpstr,1)
fxnscan("electrophysiology.hoc",helpstr,1)
fxnscan("geometry.hoc",helpstr,1)
fxnscan("impedance.hoc",helpstr,1)
fxnscan("output.hoc",helpstr,1)
fxnscan("graphics.hoc",helpstr,1)
fxnscan("statistics.hoc",helpstr,1)
fxnscan("forward.hoc",helpstr,1)
fxnscan("help.hoc",helpstr,1)
fxnscan("gui.hoc",helpstr,1)
}
if (n==1) {
helpstr = $s1
sprint(helpstr,"%s()",$s1)
if (notfound) hlpscan("parse.hoc",helpstr)
if (notfound) hlpscan("neuronprefs.hoc",helpstr)
if (notfound) hlpscan("electrophysiology.hoc",helpstr)
if (notfound) hlpscan("geometry.hoc",helpstr)
if (notfound) hlpscan("impedance.hoc",helpstr)
if (notfound) hlpscan("output.hoc",helpstr)
if (notfound) hlpscan("graphics.hoc",helpstr)
if (notfound) hlpscan("statistics.hoc",helpstr)
if (notfound) hlpscan("forward.hoc",helpstr)
if (notfound) hlpscan("help.hoc",helpstr)
if (notfound) hlpscan("gui.hoc",helpstr)
if (notfound) print "function/procedure not found"
}
}
proc hlpscan() { /* subprocedure used for hlp */
fileob.ropen($s1)
while (!fileob.eof() && (notfound)) {
fileob.scanstr(str1)
if (strcmp(str1,"proc") == 0 || strcmp(str1,"func") == 0) {
fileob.scanstr(str1)
if (strcmp(str1,helpstr) == 0) { /* found it */
while (strcmp(str1,"/*") != 0) fileob.scanstr(str1)
hlpfound() }}}
}
proc hlpfound() { local slength
/* subprocedure called by hlpscan which is a subprocedure of hlp() */
while (strcmp(str1,"*/") != 0) { fileob.scanstr(str1)
sprint(helpinfo,"%s %s",helpinfo,str1) }
slength = strob.len(helpinfo)
strob.left(helpinfo,slength-2)
fileob.scanstr(str1)
printf(" %s\n", helpinfo)
helpinfo = ""
if (strcmp(str1,"/*") == 0) { hlpfound()}
notfound = 0
}
proc fxnscan() { local n
/* subprocedure used by hlp */
n = numarg()
print "\n",$s1
fileob.ropen($s1)
while (!fileob.eof()) {
fileob.scanstr(str1)
if (strcmp(str1,"proc") == 0 || strcmp(str1,"func") == 0) {
fileob.scanstr(str1)
sprint(str1," %s",str1)
print str1
if (n>2) {
while (strcmp(str1,"/*") != 0) fileob.scanstr(str1)
hlpfound()
if (notfound) print "function/procedure not found" else printf("\n")
}
}}
}
/***************************************************************************
Debugging tools
***************************************************************************/
proc check() { local i /* print vector sizes - used to spot inconsistencies in the code */
sim_calc(1)
i = electrotonicL
L_switch(0)
print "Physical distances\n "
consistency()
L_switch(1)
print "\n\nElectrotonic distances\n"
consistency()
L_switch(i)
}
proc consistency() { local d /* print vector sizes - used to spot inconsistencies in the code */
d = gdist.size()
if (d == 0) print "gdist is empty" else print "gdist ", gdist.size()
if (d != Ar.size) print d, " != ", Ar.size(), "\t gdist - Ar"
if (d != dAr.size) print d, " != ", dAr.size(), "\t gdist - dAr"
if (d != sections.size) print d, " != ", sections.size(), "\t gdist - sections"
if (d != mdiam.size) print d, " != ", mdiam.size(), "\t gdist - mdiam"
if (d != cdiam.size) print d, " != ", cdiam.size(), "\t gdist - cdiam"
if (d != rdiam.size) print d, " != ", rdiam.size(), "\t gdist - rdiam"
print "adist.max ", adist.max
print "_______________________\n"
d = dist.size()
if (d == 0) print "dist is empty" else print "dist ", dist.size()
if (d != vpk.size) print d, " != ", vpk.size(), "\t dist - vpk"
if (d != amp.size) print d, " != ", amp.size(), "\t dist - amp"
if (d != vmax.size) print d, " != ", vmax.size(), "\t dist - vmax"
if (d != plat.size) print d, " != ", plat.size(), "\t dist - plat"
if (d != olat.size) print d, " != ", olat.size(), "\t dist - olat"
if (d != half.size) print d, " != ", half.size(), "\t dist - half"
d = somadist.size()
if (d==0) print "somadist is empty" else print "somadist ",somadist.size()
if (d!=updst.size) print d," != ",updst.size(),"\tsomadist - updst"
if (d!=branchpointdiam.size) print d," != ",branchpointdiam.size(),"\t somadist - branchpointdiam"
if (d!=ralldiam.size) print d," != ",ralldiam.size(), "\t somadist - ralldiam"
if (d!=relareadiam.size) print d," != ",relareadiam.size(),"\t somadist - relareadiam"
if (terminationdist.size() == 0) print "terminationdist is empty"
}
proc get_parents() { /* print a list of upstream parents */
access $o1
this_section() Parent = new SectionRef()
root = 0
while (!root) { Parent.sec print secname()
Parent.sec get_parent() }
Parent.sec print secname()
}
proc find_section() { local M,m, A,a, B,b, C,c
/* finds & prints section with greatest lambda */
L_switch(1)
m = 0
forsec all {
m = fdistance(1)
if (m>M) { M = m
print "max electrotonic Length",secname(), "\t", M}
for(x) if (diam(x) < 0.2) print secname(), "\tdiam ", diam(x), x
}
}
proc traces() { local i
simpass()
i = 0
forall if (onset_pk-Soma.sec.onset_pk < 0) { this_section() sref = new SectionRef()
print secname()
recvec[i] = new Vector()
recvec[i].record(&sref.sec.v(0.5),time)
i +=1 }
simpass()
for i = 0,20 { sprint(str1,"aponset%g",i)
writevecs(str1,time,recvec[i*2],recvec[2*i].c.deriv().div(0.025),recvec[2*i].c.deriv().deriv().div(0.025*0.025))
}}
func fxarea() { /* return membrane area within distance $1 from soma */
/* this one is used for the geometry calculations */
/* includes spinescale corrections */
I = 0
forsec all I+= sectest($1,1)*spine_pk
return I
}
func sectest() { local g, min, max, areavar,y, Max, Min
/* return membrane area of a given section within distance $1 from soma */
areavar = 0
Min = mn(fdistance(1),fdistance(0))
Max = Min + flength()
if (numarg() == 2) { Min = 0 /* exception soma */
Max = mx(fdistance(0),fdistance(1))
}
if(Max<$1) {for(x) areavar +=area(x) /* section completely within */
print secname(), "\t", areavar, "\t", Min,"\t",Max
}
if(Min < $1 && $1 <= Max) { /* section partly within */
for g =0,nseg-1 {
min = Min + (Max-Min)*g/nseg
max = Min + (Max-Min)*(g+1)/nseg
y = (g+.5)/nseg
if (max < $1) areavar += area(y)
if (min < $1 && max >= $1) areavar += area(y)*($1-min)/(max-min)
}
if (numarg() == 2) { // special case soma
areavar = 0
for g =0,nseg-1 {
y = (g+.5)/nseg
min = mx(fdistance(y) - .5*L/nseg,0)
max = fdistance(y) + .5*L/nseg
if (max < $1) areavar += area(y)
if (min < $1 && max >= $1) areavar += area(y)*($1-min)/(max-min)
if (electrotonicL) { for(x) areavar += area(x)
areavar *= $1/Max }
}
}
print secname(), "\t", areavar, "\t", Min,"\t",Max, "\thalf"
}
return areavar
}
proc which() { /* print the name of the data number */
clabel($1)
print str1 }