This repository has been archived on 2021-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
scientificComputing/projects/project_populationvector/code/generatedata.py

106 lines
3.5 KiB
Python

import numpy as np
from scipy.io import savemat
import matplotlib.pyplot as plt
def lifadaptspikes(stimulus, gain=10.0, trials=50, duration=200.0, before=200.0, after=400.0):
dt = 0.1
s0 = 9.5
tau = 10.0
D = 1.0
taua = 60.0
da = 100.0
Vth = 10.0
n = int((duration+before+after)/dt)
delay = 10.0
sig = np.zeros(n) + s0
n1 = int((before+delay)/dt)
n2 = int((before+duration+delay)/dt)
sig[n1:n2] += (gain * stimulus - 1.0) * np.exp(-np.arange(n2-n1)*dt/0.4/duration)
spikes = []
for j in range(trials):
noise = np.sqrt(2.0*D/dt)*np.random.randn(n)
V = np.random.rand()*Vth
A = 0.0
s = s0
As = np.zeros(n)
times = []
for k in range(n):
As[k] = A
V += (-V-A+sig[k]+noise[k])*dt/tau
A += (-A)*dt/taua
if V >= Vth:
V = 0.0
A += da/taua
times.append(k*dt-before)
spikes.append(np.array(times))
#plt.plot(np.arange(n)*dt-before, As)
#plt.plot(np.arange(n)*dt-before, sig)
#return spikes
return spikes
def firingrate(spikes, tmin, tmax):
rates = []
for st in spikes:
times = st[(st>=tmin)&(st<=tmax)]
r = len(times)/(tmax-tmin)
rates.append(1000.0*r)
return np.mean(rates), np.std(rates)
"""
nangles = 12
angles = 180.0*np.arange(nangles)/nangles
rates = np.zeros(nangles)
ratessd = np.zeros(nangles)
allspikes = []
for k, angle in enumerate(angles):
spikes = lifadaptspikes(0.5*(1.0-np.cos(2.0*np.pi*angle/180.0)))
rm, rsd = firingrate(spikes, 0.0, 200.0)
rates[k] = rm
ratessd[k] = rsd
allspikes.append(spikes)
#plt.subplot(2, 5, k+1)
#plt.title('%g' % (angle/2.0/np.pi))
#plt.eventplot(spikes, colors=['r'])
plt.plot(angles, rates, 'r', lw=2)
plt.plot(angles, rates+ratessd, 'b')
plt.plot(angles, rates-ratessd, 'b')
plt.show()
"""
# tuning curves:
nunits = 6
unitphases = np.linspace(0.0, 1.0, nunits) + 0.05*np.random.randn(nunits)/float(nunits)
unitgains = 15.0 + 5.0*(2.0*np.random.rand(nunits)-1.0)
nangles = 12
angles = 180.0*np.arange(nangles)/nangles
for unit, (phase, gain) in enumerate(zip(unitphases, unitgains)):
print '%.1f %.0f' % (gain, phase*180.0)
allspikes = []
for k, angle in enumerate(angles):
spikes = lifadaptspikes(0.5*(1.0-np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
allspikes.append(spikes)
spikesobj = np.zeros((len(allspikes), len(allspikes[0])), dtype=np.object)
for k in range(len(allspikes)):
for j in range(len(allspikes[k])):
spikesobj[k, j] = 0.001*allspikes[k][j]
savemat('unit%d.mat'%(unit+1), mdict={'angles': angles, 'spikes': spikesobj})
# population activity:
nangles = 50
angles = 180.0*np.random.rand(nangles)
for k, angle in enumerate(angles):
print '%.0f' % angle
allspikes = []
for unit, (phase, gain) in enumerate(zip(unitphases, unitgains)):
spikes = lifadaptspikes(0.5*(1.0-np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
allspikes.append(spikes)
spikesobj = np.zeros((len(allspikes), len(allspikes[0])), dtype=np.object)
for i in range(len(allspikes)):
for j in range(len(allspikes[i])):
spikesobj[i, j] = 0.001*allspikes[i][j]
savemat('population%02d.mat'%(k+1), mdict={'spikes': spikesobj,
'angle': angle,
'phases': unitphases,
'gains': unitgains})