#================================================================================
#
#  PyPCSIM is freely available from www.igi.tugraz.at/pcsim
#
#  Authors: Dejan Pecevski, dejan@igi.tugraz.at
#           Thomas Natschlaeger, thomas.natschlaeger@scch.at
#
#  Date: March 2008
#
#================================================================================

from pypcsim import *

net = SingleThreadNetwork( )

input_spike_times = [ 0.01, 0.02, 0.03, 0.05, 0.1, 0.15 ]

inp_model = SpikingInputNeuron( [ 0.01, 0.02, 0.03, 0.05, 0.1, 0.15 ] )
nrn_model = LifNeuron( Cm=2e-10, Rm=1e8, Vthresh=-50e-3, Inoise=0.8e-9 )
syn_model = DynamicSpikingSynapse( W=2e-8, tau=5e-3, delay=1e-3 )

inp_handle = net.create( inp_model )
nrn_handle = net.create( nrn_model )

syn_handle = net.connect( inp_handle, nrn_handle, syn_model )

net.simulate(0.2)

#
# record spike times
#
st_rec_handle = net.record( nrn_handle, SpikeTimeRecorder() )

#
# record Vm
#
vm_rec_handle = net.record( nrn_handle, "Vm", AnalogRecorder() )

#
# record PSC
#
ps_rec_handle = net.record( syn_handle, "psr", AnalogRecorder() )

#
# now simulate with attached recorders
#
net.reset()
net.simulate(0.2)

#
# plot the result
#
from pylab import *
from numpy import *

clf()
dt = net.simParameter().dt.in_sec()
t  = arange( 0, 0.2-dt, dt )

subplot(4,1,1)
stem( input_spike_times, ones_like(input_spike_times) )
xlim( 0, 0.2 ); xticks( [] )
title('input spikes')

subplot(4,1,2)
psc = net.object( ps_rec_handle ).getRecordedValues()
plot( t, psc )
xlim( 0, 0.2 ); xticks( [] )
title('postsynaptic current [A]')

subplot(4,1,3)
vm = net.object( vm_rec_handle ).getRecordedValues()
plot(t,vm)
xlim( 0, 0.2 ); ylim( -0.07, -0.04 ); xticks( [] )
title('membrane voltage [V]')

subplot(4,1,4)
recorded_spike_times = net.object( st_rec_handle ).getSpikeTimes()
stem( recorded_spike_times, ones_like(recorded_spike_times) )
xlim( 0, 0.2 )
xlabel( 'time [sec]' )
title('recorded spikes')

show()

print net.object( nrn_handle ).getVm()
print net.object( syn_handle ).psr

