# Example: infinite_cableΒΆ

An (almost) infinite cable with pulse injection in the middle.

from brian2 import *

defaultclock.dt = 0.001*ms

# Morphology
diameter = 1*um
Cm = 1*uF/cm**2
Ri = 100*ohm*cm
N = 500
morpho = Cylinder(diameter=diameter, length=3*mm, n=N)

# Passive channels
gL = 1e-4*siemens/cm**2
EL = -70*mV
eqs = '''
Im = gL * (EL-v) : amp/meter**2
I : amp (point current)
'''

neuron = SpatialNeuron(morphology=morpho, model=eqs, Cm=Cm, Ri=Ri)
neuron.v = EL

taum = Cm / gL # membrane time constant
print "Time constant", taum
rm = 1/(gL * pi * diameter) # membrane resistance per unit length
ra = (4 * Ri) / (pi * diameter**2) # axial resistance per unit length
la = sqrt(rm / ra) # space length
print "Characteristic length", la

# Monitors
mon = StateMonitor(neuron, 'v', record=range(0, N/2, 20))

neuron.I[len(neuron) / 2] = 1*nA # injecting in the middle
run(0.02*ms)
neuron.I = 0*amp
run(10*ms, report='text')

t = mon.t
plot(t/ms, mon.v.T/mV, 'k')
# Theory (incorrect near cable ends)
for i in range(0, len(neuron)/2, 20):
x = (len(neuron)/2 - i) * morpho.length[0]*meter
theory = 1/(la*Cm*pi*diameter) * sqrt(taum / (4*pi*(t+defaultclock.dt))) * \
exp(-(t+defaultclock.dt)/taum - taum / (4*(t+defaultclock.dt))*(x/la)**2)
theory = EL + theory*1*nA*0.02*ms
plot(t/ms, theory/mV, 'r')
xlabel('Time (ms)')
ylabel('v (mV')
show()