func fieldrec() { local I, Phi, PhiAll, r, x, y, z, x1, x2, y1, y2, z1, z2, dS, h, l, r2
sigma = 25*0.3 // uS/um
PhiAll = 0
forall {
if (ismembrane("extracellular")) {
I = 0
for (x,0) { I += i_membrane(x)*area(x) }
if( n3d() != 2 ) print "n3d() not 2, line approximation is invalid, section: ", secname()
// coordinates of the line ends:
x1 = x3d(0)
x2 = x3d(1)
y1 = y3d(0)
y2 = y3d(1)
z1 = z3d(0)
z2 = z3d(1)
dS = arc3d(1)
// distances:
h = (1/dS) * ( (Ex - x2)*(x2 - x1) + (Ey - y2)*(y2 - y1) + (Ez - z2)*(z2 - z1) )
r2 = (Ex - x2)^2 + (Ey - y2)^2 + (Ez - z2)^2 - h^2
l = h + dS
if (h<0 && l<0) { Phi = (I/(4*PI*sigma*dS)) * log( (sqrt(h^2 + r2) - h) / (sqrt(l^2 + r2) - l) ) }
if (h<0 && l>0) { Phi = (I/(4*PI*sigma*dS)) * log( (sqrt(h^2 + r2) - h) * ( l + sqrt(l^2 + r2) ) / r2) }
if (h>0 && l>0) { Phi = (I/(4*PI*sigma*dS)) * log( (l + sqrt(l^2 + r2) ) / ( sqrt(h^2 + r2) + h )) }
ifsec "soma" { //treat it as a sphere
x = (x2 + x1)/2
y = (y2 + y1)/2
z = (z2 + z1)/2
r = sqrt( (Ex-x)^2 + (Ey-y)^2 + (Ez-z)^2 )
Phi = I/(4*PI*sigma*r)
}
PhiAll += Phi
}
}
return PhiAll
}
func totalI() { local I
I = 0
forall {
if (ismembrane("extracellular")) {
for (x,0) { I += i_membrane(x)*area(x) }
}
}
return I
}
vrec = 0
//irec = 0
proc init() {
finitialize(v_init)
fcurrent()
vrec = fieldrec()
// irec = totalI()
}
proc advance() {
fadvance()
vrec = fieldrec()
// irec = totalI()
}
objref Vrec
Vrec = new Vector()
Vrec.record(&vrec,0.2) // Dt=0.2 ms, so sampling f=5 KHz
proc writeLFP() { localobj fout
// arg $1 must be file name, e.g. "myfile.ext"
fout=new File()
fout.wopen($s1)
Vrec.printf(fout, "%4.2f\t")
fout.close()
}