f_stimulations_simulations.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. from scipy.signal import butter, lfilter, freqz
  2. ### Class simulation used to store simulationss..
  3. class Simulation():
  4. def __init__(self):
  5. self.c_neuron=[]#Link to neuron or actual instance (Should contain model and parameters used)
  6. self.s_Description=[]#Couple of lines describing the purpose of the simulations
  7. self.d_Protocol={
  8. 's_Type':[],
  9. 's_Stimulus_features':[],
  10. 'v_Stimulus_features':[]
  11. }
  12. self.d_Configuration={
  13. 'n_max_step_integration':[],
  14. 'v_time_integration':[],
  15. 's_ODE_Solver':[],
  16. 'n_compressed_storage_factor':[]
  17. }
  18. self.d_dinSys=[]
  19. self.d_dinSys={
  20. 'b_Convergence':[],
  21. 'n_tConvergence':[],
  22. 'Vars_ss':[],
  23. 'Stable_ss':[],
  24. 'Unstable_ss':[],
  25. 's_Classification':[],
  26. 'm_Jacobian4EqPoints':[],
  27. 's_Stability4EqPoints':[],
  28. 'm_Vect_Field':[],
  29. 'n_resol_Vect_Field':[],
  30. 'n_tempresol_Vect_Field':[],
  31. 'm_Vect_Field_aprox_trajectory':[],
  32. 'sv_state_vars_vectfield':[],
  33. 'm_Vect_Field_firing_mode':[],
  34. 'n_aprox_trajectory_converg_resol':[],
  35. 'm_fr_overview':[]
  36. }
  37. self.a_Results=[]#Results of simulation
  38. self.m_Results_dinSys=[]#Results of simulation
  39. self.fr=[]#Results of simulation
  40. self.Adaptation=[]#If adaptation present.. Some parameters
  41. self.Adaptation={
  42. 'popt':[],
  43. 't_peak':[],
  44. 't_adapt':[],
  45. }
  46. class Results():
  47. def __init__(self,s_Results,v_Results,compress=[],fr=[]):#s_Results contains the strings naming results, and v_Results the actual reults to be stored
  48. a,b=shape(v_Results)
  49. c=len(s_Results)
  50. if compress==[]:
  51. count=0
  52. if b==c:
  53. while count<len(s_Results):
  54. setattr(self, s_Results[count], v_Results[:,count])
  55. count+=1
  56. if a==c:
  57. while count<len(s_Results):
  58. setattr(self, s_Results[count], v_Results[count,:])
  59. count+=1
  60. if a==b:
  61. print("Warning, in Results storage.. columns are taken as the different results")
  62. while count<len(s_Results):
  63. setattr(self, s_Results[count], v_Results[:,count])
  64. count+=1
  65. if c!=a and c!=b:
  66. print("Sorry! couldn't create array of results because s_Results (String of features) doesn't have the same number of entries as v_Results (Matrix with the features)")
  67. while count<len(s_Results):
  68. setattr(self, s_Results[count], v_Results[:,count])
  69. count+=1
  70. else:
  71. count=0
  72. i_spl=[]
  73. i_splv=[]
  74. if fr!=[]:
  75. i_sp=fr[2]
  76. if i_sp!=[]:
  77. i_spl=i_sp.tolist()
  78. i_splv=i_spl
  79. for i in range(-compress,compress):
  80. if i!=0 and i_sp!=[]:
  81. i_sptemp=i_sp+i
  82. i_spl=i_spl+i_sptemp.tolist()
  83. if b==c:
  84. v_normal=arange(0,a-1,compress).tolist()
  85. v_fin=v_normal+i_spl
  86. v_fin1=list(set(v_fin))
  87. v_fin2=sort(v_fin1)
  88. vect_i_sp=[]
  89. for i in i_splv:
  90. vect_i_sp.append(v_fin2.tolist().index(i))
  91. fr1=[]
  92. fr1.append(fr[0])
  93. fr1.append(fr[1])
  94. fr1.append(vect_i_sp)
  95. setattr(self, 'fr', fr1)
  96. while count<len(s_Results):
  97. setattr(self, s_Results[count], v_Results[v_fin2,count])
  98. count+=1
  99. if a==c:
  100. v_normal=arange(0,b-1,compress).tolist()
  101. v_fin=v_normal+i_spl
  102. v_fin1=list(set(v_fin))
  103. v_fin2=sort(v_fin1)
  104. vect_i_sp=[]
  105. for i in i_splv:
  106. vect_i_sp.append(v_fin2.tolist().index(i))
  107. fr1=[]
  108. fr1.append(fr[0])
  109. fr1.append(fr[1])
  110. fr1.append(vect_i_sp)
  111. setattr(self, 'fr', fr1)
  112. while count<len(s_Results):
  113. setattr(self, s_Results[count], v_Results[v_fin2,count])
  114. count+=1
  115. if a==b:
  116. print("Warning, in Results storage.. columns are taken as the different results")
  117. while count<len(s_Results):
  118. setattr(self, s_Results[count], v_Results[:,count])
  119. count+=1
  120. if c!=a and c!=b:
  121. print("Sorry! couldn't create array of results because s_Results (String of features) doesn't have the same number of entries as v_Results (Matrix with the features)")
  122. while count<len(s_Results):
  123. setattr(self, s_Results[count], v_Results[:,count])
  124. count+=1
  125. class Simulation_Light():
  126. def __init__(self):
  127. self.c_neuron=[]#Link to neuron or actual instance (Should contain model and parameters used)
  128. self.fr={
  129. 't':[],
  130. 'sp_c':[],
  131. 'sp_t':[],
  132. 't_I_stim':[],
  133. 's_I_stim':[],
  134. 'Fr':[]
  135. }#Results of simulation
  136. self.state_vars={
  137. 'Na_i':[],
  138. 'K_i':[],
  139. 'K_o':[],
  140. 'i_p':[]
  141. }#Results of simulation
  142. self.d_dinSys={
  143. 'saddle_node_Iapp':[],
  144. 'saddle_node_Iapp_error':[]
  145. }#Results of simulation
  146. self.stim_ft={
  147. 's_Stimulus_features':[],
  148. 'v_Stimulus_features':[]
  149. }
  150. self.d_Configuration={
  151. 'n_max_step_integration':[],
  152. 'v_time_integration':[],
  153. 's_ODE_Solver':[],
  154. 'n_compressed_storage_factor':[]
  155. }
  156. def static_input_simulation(neuron,exp_duration,step_size,interval0=0):
  157. ####Very fast define the stimulation protocol
  158. I_exp1 = lambda t: 0 if t<interval0 else step_size
  159. t=np.linspace(0, exp_duration, exp_duration/resol)
  160. #####Initializa the structure to save results#########
  161. sim=Simulation()
  162. sim.c_neuron=neuron
  163. sim.s_Description="Constant input of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  164. sim.d_Protocol['s_Type']="Static_Input"
  165. sim.d_Protocol['s_Stimulus_features']=["Input_Magnitude","Exp_Duration"]
  166. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration]
  167. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" else "+str(step_size)
  168. sim.d_Configuration['n_max_step_integration']=resol
  169. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  170. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  171. ######Run simulation################
  172. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  173. ######Organize Simulation results into a structure####
  174. res=Results(s_results, v_results)
  175. try:
  176. t_sp,fr,i_n=firing_rate(res.t,res.V)
  177. except:
  178. try:
  179. t_sp,fr,i_n=firing_rate(res.t,res.v)
  180. except:
  181. pass
  182. ######And store them into the structure of results########
  183. sim.fr=[t_sp,fr,i_n]
  184. sim.a_Results=res
  185. return sim
  186. def step_current_simulation(neuron,step_size,exp_duration,interval0=500,compress=[]):
  187. ####Very fast define the stimulation protocol
  188. I_exp1 = lambda t: 0 if t<interval0 else step_size
  189. t=np.linspace(0, exp_duration, exp_duration/resol)
  190. #####Initializa the structure to save results#########
  191. sim=Simulation()
  192. sim.c_neuron=neuron
  193. sim.s_Description="Step current of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  194. sim.d_Protocol['s_Type']="Step_Current"
  195. sim.d_Protocol['s_Stimulus_features']=["Step_size","Exp_Duration","Time_Before_Step"]
  196. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration,interval0]
  197. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" else "+str(step_size)
  198. sim.d_Configuration['n_max_step_integration']=resol
  199. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  200. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  201. ######Run simulation################
  202. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  203. ######Organize Simulation results into a structure####
  204. res=Results(s_results, v_results)
  205. try:
  206. t_sp,fr,i_n=firing_rate(res.t,res.V)
  207. except:
  208. try:
  209. t_sp,fr,i_n=firing_rate(res.t,res.v)
  210. except:
  211. pass
  212. sim.fr=[t_sp,fr,i_n]
  213. if compress !=[]:
  214. res=Results(s_results, v_results,compress,sim.fr)
  215. sim.d_Configuration['n_compressed_storage_factor']=compress
  216. sim.fr=res.fr
  217. ######And store them into the structure of results########
  218. sim.a_Results=res
  219. return sim
  220. def step_current_simulation_small_interval(neuron,step_size,exp_duration,curr0=0,interval0=500,intervalf=3500,compress=[]):
  221. ####Very fast define the stimulation protocol
  222. I_exp1 = lambda t: curr0 if t<interval0 or t>intervalf else step_size
  223. t=np.linspace(0, exp_duration, exp_duration/resol)
  224. #####Initializa the structure to save results#########
  225. sim=Simulation()
  226. sim.c_neuron=neuron
  227. sim.s_Description="Step current of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  228. sim.d_Protocol['s_Type']="Step_Current"
  229. sim.d_Protocol['s_Stimulus_features']=["Step_size","Exp_Duration","Time_Before_Step","Time_Step_Ends","Baseline_Current"]
  230. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration,interval0,intervalf,curr0]
  231. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: "+str(curr0)+" if t<"+str(interval0)+" or t>"+str(intervalf)+" else "+str(step_size)
  232. sim.d_Configuration['n_max_step_integration']=resol
  233. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  234. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  235. ######Run simulation################
  236. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  237. ######Organize Simulation results into a structure####
  238. res=Results(s_results, v_results)
  239. try:
  240. t_sp,fr,i_n=firing_rate(res.t,res.V)
  241. except:
  242. try:
  243. t_sp,fr,i_n=firing_rate(res.t,res.v)
  244. except:
  245. pass
  246. sim.fr=[t_sp,fr,i_n]
  247. if compress !=[]:
  248. res=Results(s_results, v_results,compress,sim.fr)
  249. sim.d_Configuration['n_compressed_storage_factor']=compress
  250. ######And store them into the structure of results########
  251. sim.a_Results=res
  252. return sim
  253. def step_current_simulation_fromNonZeroStart(neuron,ini_step_size,step_size,exp_duration,interval0=500):
  254. ####Very fast define the stimulation protocol
  255. I_exp1 = lambda t: ini_step_size if t<interval0 else step_size
  256. t=np.linspace(0, exp_duration, exp_duration/resol)
  257. #####Initializa the structure to save results#########
  258. sim=Simulation()
  259. sim.c_neuron=neuron
  260. sim.s_Description="Step current of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  261. sim.d_Protocol['s_Type']="Step_Current"
  262. sim.d_Protocol['s_Stimulus_features']=["Step_size","Exp_Duration","Time_Before_Step"]
  263. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration,interval0]
  264. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: "+str(ini_step_size)+" if t<"+str(interval0)+" else "+str(step_size)
  265. sim.d_Configuration['n_max_step_integration']=resol
  266. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  267. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  268. ######Run simulation################
  269. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  270. ######Organize Simulation results into a structure####
  271. res=Results(s_results, v_results)
  272. try:
  273. t_sp,fr,i_n=firing_rate(res.t,res.V)
  274. except:
  275. try:
  276. t_sp,fr,i_n=firing_rate(res.t,res.v)
  277. except:
  278. pass
  279. sim.fr=[t_sp,fr,i_n]
  280. ######And store them into the structure of results########
  281. sim.a_Results=res
  282. return sim
  283. def ramp_current_simulation(neuron,step_size,exp_duration,interval0=500,interval_ramp=100,I0=[]):
  284. ####Very fast define the stimulation protocol
  285. if I0==[]:
  286. I_exp1 = lambda t: 0 if t<interval0 else step_size*t/interval_ramp
  287. else:
  288. I_exp1 = lambda t: I0 if t<interval0 else I0+(step_size-I0)*(t-interval0)/interval_ramp
  289. t=np.linspace(0, exp_duration, exp_duration/resol)
  290. #####Initializa the structure to save results#########
  291. sim=Simulation()
  292. sim.c_neuron=neuron
  293. sim.s_Description="Step current of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  294. sim.d_Protocol['s_Type']="Step_Current"
  295. sim.d_Protocol['s_Stimulus_features']=["Step_size","Exp_Duration","Time_Before_Step"]
  296. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration,interval0]
  297. if I0==[]:
  298. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" else "+str(step_size)+"*t/"+str(interval_ramp)
  299. else:
  300. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: "+str(I0)+" if t<"+str(interval0)+" else "+str(I0)+"+("+str(step_size)+"-"+str(I0)+")*(t-"+str(interval0)+")/"+str(interval_ramp)
  301. sim.d_Configuration['n_max_step_integration']=resol
  302. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  303. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  304. ######Run simulation################
  305. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  306. ######Organize Simulation results into a structure####
  307. res=Results(s_results, v_results)
  308. try:
  309. t_sp,fr,i_n=firing_rate(res.t,res.V)
  310. except:
  311. try:
  312. t_sp,fr,i_n=firing_rate(res.t,res.v)
  313. except:
  314. pass
  315. sim.fr=[t_sp,fr,i_n]
  316. ######And store them into the structure of results########
  317. sim.a_Results=res
  318. return sim
  319. def ramp_current_simulation_discrete(neuron,step_size,exp_duration,interval0=500,interval_ramp=100,dt=20,I0=[]):
  320. ####Very fast define the stimulation protocol
  321. if I0==[]:
  322. I_exp1 = lambda t: 0 if t<interval0 else dt*int(t/dt)*step_size/interval_ramp
  323. else:
  324. I_exp1 = lambda t: I0 if t<interval0 else I0+dt*int((t-interval0)/dt)*(step_size-I0)/interval_ramp*dt
  325. t=np.linspace(0, exp_duration, exp_duration/resol)
  326. #####Initializa the structure to save results#########
  327. sim=Simulation()
  328. sim.c_neuron=neuron
  329. sim.s_Description="Step current of magnitude "+str(step_size)+", to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  330. sim.d_Protocol['s_Type']="Step_Current"
  331. sim.d_Protocol['s_Stimulus_features']=["Step_size","Exp_Duration","Time_Before_Step"]
  332. sim.d_Protocol['v_Stimulus_features']=[step_size,exp_duration,interval0]
  333. if I0==[]:
  334. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" else "+str(dt)+"*int(t/"+str(dt)+")*"+str(step_size)+"/"+str(interval_ramp)
  335. else:
  336. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: "+str(I0)+" if t<"+str(interval0)+" else "+str(I0)+"+"+str(dt)+"*int((t-"+str(interval0)+")/"+str(dt)+")*("+str(step_size)+"-"+str(I0)+")/"+str(interval_ramp)
  337. sim.d_Configuration['n_max_step_integration']=resol
  338. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  339. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  340. ######Run simulation################
  341. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  342. ######Organize Simulation results into a structure####
  343. res=Results(s_results, v_results)
  344. try:
  345. t_sp,fr,i_n=firing_rate(res.t,res.V)
  346. except:
  347. try:
  348. t_sp,fr,i_n=firing_rate(res.t,res.v)
  349. except:
  350. pass
  351. sim.fr=[t_sp,fr,i_n]
  352. ######And store them into the structure of results########
  353. sim.a_Results=res
  354. return sim
  355. def sine_current_simulation(neuron,sine_base,sine_amp,sine_freq,exp_duration,interval0=500,compress=[]):
  356. ####Very fast define the stimulation protocol
  357. freq=sine_freq*0.001
  358. I_exp1 = lambda t: 0 if t<interval0 else sine_base+sine_amp/2+sine_amp/2*np.sin(2 * np.pi * freq * t + (np.pi/2))
  359. t=np.linspace(0, exp_duration, exp_duration/resol)
  360. #####Initializa the structure to save results#########
  361. sim=Simulation()
  362. sim.c_neuron=neuron
  363. sim.s_Description="Sine current of base "+str(sine_base)+", amplitude "+str(sine_amp)+" and frequency"+" to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  364. sim.d_Protocol['s_Type']="Step_Current"
  365. sim.d_Protocol['s_Stimulus_features']=["sine_base","sine_amp","sine_freq","Exp_Duration","Time_Before_Step"]
  366. sim.d_Protocol['v_Stimulus_features']=[sine_base,sine_amp,sine_freq,exp_duration,interval0]
  367. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" else "+str(sine_base)+"+"+str(sine_amp/2)+"+"+str(sine_amp/2)+"*np.sin(2 * np.pi * "+str(freq)+"* t + (np.pi/2))"
  368. sim.d_Configuration['n_max_step_integration']=resol
  369. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  370. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  371. ######Run simulation################
  372. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  373. ######Organize Simulation results into a structure####
  374. res=Results(s_results, v_results)
  375. try:
  376. t_sp,fr,i_n=firing_rate(res.t,res.V)
  377. except:
  378. try:
  379. t_sp,fr,i_n=firing_rate(res.t,res.v)
  380. except:
  381. pass
  382. sim.fr=[t_sp,fr,i_n]
  383. if compress !=[]:
  384. res=Results(s_results, v_results,compress,sim.fr)
  385. sim.d_Configuration['n_compressed_storage_factor']=compress
  386. sim.fr=res.fr
  387. ######And store them into the structure of results########
  388. sim.a_Results=res
  389. return sim
  390. def sine_current_simulation_small_interval(neuron,sine_base,sine_amp,sine_freq,exp_duration,interval0=500,intervalf=3500,compress=[]):
  391. ####Very fast define the stimulation protocol
  392. freq=sine_freq*0.001
  393. I_exp1 = lambda t: 0 if t<interval0 or t>intervalf else sine_base+sine_amp/2+sine_amp/2*np.sin(2 * np.pi * freq * t + (np.pi/2))
  394. t=np.linspace(0, exp_duration, exp_duration/resol)
  395. #####Initializa the structure to save results#########
  396. sim=Simulation()
  397. sim.c_neuron=neuron
  398. sim.s_Description="small interval stimulation with Sine current of base "+str(sine_base)+", amplitude "+str(sine_amp)+" and frequency"+" to "+neuron.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  399. sim.d_Protocol['s_Type']="Sine_Current"
  400. sim.d_Protocol['s_Stimulus_features']=["sine_base","sine_amp","sine_freq","Exp_Duration","Time_Before_Step","intervalf"]
  401. sim.d_Protocol['v_Stimulus_features']=[sine_base,sine_amp,sine_freq,exp_duration,interval0,intervalf]
  402. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<"+str(interval0)+" or t>"+str(intervalf)+" else "+str(sine_base)+"+"+str(sine_amp/2)+"+"+str(sine_amp/2)+"*np.sin(2 * np.pi * "+str(freq)+"* t + (np.pi/2))"
  403. sim.d_Configuration['n_max_step_integration']=resol
  404. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  405. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  406. ######Run simulation################
  407. s_results, v_results = neuron.stimulate_neuron(t,neuron.current_state,I_exp1)
  408. res=Results(s_results, v_results)
  409. try:
  410. t_sp,fr,i_n=firing_rate(res.t,res.V)
  411. except:
  412. try:
  413. t_sp,fr,i_n=firing_rate(res.t,res.v)
  414. except:
  415. pass
  416. sim.fr=[t_sp,fr,i_n]
  417. if compress !=[]:
  418. res=Results(s_results, v_results,compress,sim.fr)
  419. sim.d_Configuration['n_compressed_storage_factor']=compress
  420. sim.fr=res.fr
  421. ######And store them into the structure of results########
  422. sim.a_Results=res
  423. return sim
  424. def butter_lowpass(cutoff, fs, order=5):
  425. nyq = 0.5 * fs
  426. normal_cutoff = cutoff / nyq
  427. b, a = butter(order, normal_cutoff, btype='low', analog=False)
  428. return b, a
  429. def butter_lowpass_filter(data, cutoff, fs, order=5):
  430. b, a = butter_lowpass(cutoff, fs, order=order)
  431. y = lfilter(b, a, data)
  432. return y
  433. def fftnoise(f):
  434. f = np.array(f, dtype='complex')
  435. Np = (len(f) - 1) // 2
  436. phases = np.random.rand(Np) * 2 * np.pi
  437. phases = np.cos(phases) + 1j * np.sin(phases)
  438. f[1:Np+1] *= phases
  439. f[-1:-1-Np:-1] = np.conj(f[1:Np+1])
  440. return np.fft.ifft(f).real
  441. def band_limited_noise(min_freq, max_freq, samples=1024, samplerate=1):
  442. freqs = np.abs(np.fft.fftfreq(samples, 1/samplerate))
  443. f = np.zeros(samples)
  444. idx = np.where(np.logical_and(freqs>=min_freq, freqs<=max_freq))[0]
  445. f[idx] = 1
  446. return fftnoise(f)
  447. def noisy_current_simulation_var(neuron_in,noise_mean,noise_amp,noise_maxfreq,exp_duration,interval0=500,compress=[],light_version=0):
  448. ####Very fast define the stimulation protocol
  449. sim=Simulation()
  450. sim.c_neuron=copy(neuron_in)
  451. time_signal=exp_duration
  452. samples=int(np.ceil(time_signal*(1/resol)))
  453. noisy_signal_raw=band_limited_noise(0.0001, noise_maxfreq,samples,1.0/resol*1000)
  454. #noisy_signal=noise_mean+noise_amp/2.0/max(noisy_signal_raw)*noisy_signal_raw## This is wrong... the correct way is:
  455. noisy_signal=noise_mean+np.sqrt(noise_amp/np.var(noisy_signal_raw))*noisy_signal_raw## to get a signal with var=noise_amp
  456. sim.c_neuron.noisy_current=noisy_signal
  457. try:
  458. I_exp1 = lambda t: 0 if (t<=interval0 or t>time_signal) else sim.c_neuron.noisy_current[int((t-interval0)/resol)]
  459. except:
  460. print("Not working at t="+str(t)+" where int((t-interval0)/resol)="+str(int((t-interval0)/resol))+" for len(sim.c_neuron.noisy_current)="+str(len(sim.c_neuron.noisy_current)))
  461. raise
  462. #####Initializa the structure to save results#########
  463. sim.s_Description="Noisy current of mean "+str(noise_mean)+", amplitude "+str(noise_amp)+" and max frequency "+str(noise_maxfreq)+"Hz to "+neuron_in.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  464. sim.d_Protocol['s_Type']="Noisy_Current"
  465. sim.d_Protocol['s_Stimulus_features']=["noise_mean","noise_amp","noise_maxfreq","Exp_Duration","Time_Before_Step"]
  466. sim.d_Protocol['v_Stimulus_features']=[noise_mean,noise_amp,noise_maxfreq,exp_duration,interval0]
  467. # I_exp1 = lambda t: 0 if t<interval0 else noisy_signal[int((t-interval0)/resol)]
  468. t=np.linspace(0, exp_duration, exp_duration/resol)
  469. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if (t<="+str(interval0)+" or t>"+str(time_signal)+") else sim.c_neuron.noisy_current[int((t-"+str(interval0)+")/"+str(resol)+")]"
  470. sim.d_Configuration['n_max_step_integration']=resol
  471. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  472. sim.d_Configuration['s_ODE_Solver']=sim.c_neuron.ode_solver
  473. ######Run simulation################
  474. s_results, v_results = sim.c_neuron.stimulate_neuron(t,sim.c_neuron.current_state,I_exp1)
  475. ######Organize Simulation results into a structure####
  476. res=Results(s_results, v_results)
  477. try:
  478. t_sp,fr,i_n=firing_rate(res.t,res.V)
  479. except:
  480. try:
  481. t_sp,fr,i_n=firing_rate(res.t,res.v)
  482. except:
  483. pass
  484. sim.fr=[t_sp,fr,i_n]
  485. if compress !=[]:
  486. res=Results(s_results, v_results,compress,sim.fr)
  487. sim.d_Configuration['n_compressed_storage_factor']=compress
  488. sim.fr=res.fr
  489. ######And store them into the structure of results########
  490. if light_version==0:
  491. sim.a_Results=res
  492. if light_version==1:
  493. sim.a_Results=[]
  494. return sim
  495. def noisy_current_simulation_var_plusDepPulses(neuron_in,noise_mean,noise_amp,noise_maxfreq,exp_duration,t_pulse=[700,1000],pulse_length=20.0,pulse_ampl=2.0,interval0=500,compress=[],light_version=0):
  496. ####Very fast define the stimulation protocol
  497. sim=Simulation()
  498. sim.c_neuron=copy(neuron_in)
  499. time_signal=exp_duration
  500. samples=int(np.ceil(time_signal*(1/resol)))
  501. noisy_signal_raw=band_limited_noise(0.0001, noise_maxfreq,samples,1.0/resol*1000)
  502. noisy_signal=noise_mean+noise_amp/2.0/max(noisy_signal_raw)*noisy_signal_raw
  503. for tt_pulse in t_pulse:
  504. for i_tlp in range(0,int(pulse_length/resol)):
  505. noisy_signal[int(tt_pulse/resol+i_tlp)]=noisy_signal[int(tt_pulse/resol+i_tlp)]+pulse_ampl
  506. sim.c_neuron.noisy_current=noisy_signal
  507. try:
  508. I_exp1 = lambda t: 0 if (t<=interval0 or t>time_signal) else sim.c_neuron.noisy_current[int((t-interval0)/resol)]
  509. except:
  510. print("Not working at t="+str(t)+" where int((t-interval0)/resol)="+str(int((t-interval0)/resol))+" for len(sim.c_neuron.noisy_current)="+str(len(sim.c_neuron.noisy_current)))
  511. raise
  512. #####Initializa the structure to save results#########
  513. sim.s_Description="Noisy current of mean "+str(noise_mean)+", amplitude "+str(noise_amp)+" and max frequency "+str(noise_maxfreq)+"Hz to "+neuron_in.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  514. sim.d_Protocol['s_Type']="Noisy_Current"
  515. sim.d_Protocol['s_Stimulus_features']=["noise_mean","noise_amp","noise_maxfreq","Exp_Duration","Time_Before_Step"]
  516. sim.d_Protocol['v_Stimulus_features']=[noise_mean,noise_amp,noise_maxfreq,exp_duration,interval0]
  517. # I_exp1 = lambda t: 0 if t<interval0 else noisy_signal[int((t-interval0)/resol)]
  518. t=np.linspace(0, exp_duration, exp_duration/resol)
  519. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if (t<="+str(interval0)+" or t>"+str(time_signal)+") else sim.c_neuron.noisy_current[int((t-"+str(interval0)+")/"+str(resol)+")]"
  520. sim.d_Configuration['n_max_step_integration']=resol
  521. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  522. sim.d_Configuration['s_ODE_Solver']=sim.c_neuron.ode_solver
  523. ######Run simulation################
  524. s_results, v_results = sim.c_neuron.stimulate_neuron(t,sim.c_neuron.current_state,I_exp1)
  525. ######Organize Simulation results into a structure####
  526. res=Results(s_results, v_results)
  527. try:
  528. t_sp,fr,i_n=firing_rate(res.t,res.V)
  529. except:
  530. try:
  531. t_sp,fr,i_n=firing_rate(res.t,res.v)
  532. except:
  533. pass
  534. sim.fr=[t_sp,fr,i_n]
  535. if compress !=[]:
  536. res=Results(s_results, v_results,compress,sim.fr)
  537. sim.d_Configuration['n_compressed_storage_factor']=compress
  538. sim.fr=res.fr
  539. ######And store them into the structure of results########
  540. if light_version==0:
  541. sim.a_Results=res
  542. if light_version==1:
  543. sim.a_Results=[]
  544. return sim
  545. def noisy_current_simulation_var_fKo(neuron_in,noise_mean,noise_amp,noise_maxfreq,exp_duration,interval0=500,Ko_freq=1.0,Ko_amp=3.0,Ko_mean=3.0,compress=[],light_version=0):
  546. ####Very fast define the stimulation protocol
  547. sim=Simulation()
  548. sim.c_neuron=copy(neuron_in)
  549. time_signal=exp_duration
  550. samples=int(np.ceil(time_signal*(1/resol)))
  551. noisy_signal_raw=band_limited_noise(0.0001, noise_maxfreq,samples,1.0/resol*1000)
  552. noisy_signal=noise_mean+noise_amp/2.0/max(noisy_signal_raw)*noisy_signal_raw
  553. sim.c_neuron.noisy_current=noisy_signal
  554. try:
  555. I_exp1 = lambda t: 0 if (t<=interval0 or t>time_signal) else sim.c_neuron.noisy_current[int((t-interval0)/resol)]
  556. except:
  557. print("Not working at t="+str(t)+" where int((t-interval0)/resol)="+str(int((t-interval0)/resol))+" for len(sim.c_neuron.noisy_current)="+str(len(sim.c_neuron.noisy_current)))
  558. raise
  559. ## Slow Ko wave
  560. try:
  561. f_Ko = lambda t: Ko_mean if (t<=interval0 or t>time_signal) else Ko_mean+Ko_amp*np.sin(2*np.pi*Ko_freq*(t-interval0)/1000.0-np.pi/2)
  562. except:
  563. print("Not working at t="+str(t)+" where int((t-interval0)/resol)="+str(int((t-interval0)/resol))+" for len(sim.c_neuron.noisy_current)="+str(len(sim.c_neuron.noisy_current)))
  564. raise
  565. #####Initializa the structure to save results#########
  566. sim.s_Description="Noisy current of mean "+str(noise_mean)+", amplitude "+str(noise_amp)+" and max frequency "+str(noise_maxfreq)+"Hz to "+neuron_in.s_model_tag+" parameters can be found with sim.self.c_neuron.p"
  567. sim.d_Protocol['s_Type']="Noisy_Current"
  568. sim.d_Protocol['s_Stimulus_features']=["noise_mean","noise_amp","noise_maxfreq","Exp_Duration","Time_Before_Step"]
  569. sim.d_Protocol['v_Stimulus_features']=[noise_mean,noise_amp,noise_maxfreq,exp_duration,interval0]
  570. # I_exp1 = lambda t: 0 if t<interval0 else noisy_signal[int((t-interval0)/resol)]
  571. t=np.linspace(0, exp_duration, exp_duration/resol)
  572. sim.c_neuron.Ko_wave=[f_Ko(ti) for ti in t]
  573. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if (t<="+str(interval0)+" or t>"+str(time_signal)+") else sim.c_neuron.noisy_current[int((t-"+str(interval0)+")/"+str(resol)+")]"
  574. sim.d_Configuration['n_max_step_integration']=resol
  575. sim.d_Configuration['v_time_integration']=[t[0],t[-1]]
  576. sim.d_Configuration['s_ODE_Solver']=sim.c_neuron.ode_solver
  577. ######Run simulation################
  578. s_results, v_results = sim.c_neuron.stimulate_neuron(t,sim.c_neuron.current_state,I_exp1,i_p_f=[],K_o_f=f_Ko)
  579. ######Organize Simulation results into a structure####
  580. res=Results(s_results, v_results)
  581. try:
  582. t_sp,fr,i_n=firing_rate(res.t,res.V)
  583. except:
  584. try:
  585. t_sp,fr,i_n=firing_rate(res.t,res.v)
  586. except:
  587. pass
  588. sim.fr=[t_sp,fr,i_n]
  589. if compress !=[]:
  590. res=Results(s_results, v_results,compress,sim.fr)
  591. sim.d_Configuration['n_compressed_storage_factor']=compress
  592. sim.fr=res.fr
  593. ######And store them into the structure of results########
  594. if light_version==0:
  595. sim.a_Results=res
  596. if light_version==1:
  597. sim.a_Results=[]
  598. return sim
  599. def organizing_experimentalData(neuron,v_t,v_V,interval0=0,resol=resol,compress=[],light_version=0,s_Description=[]):
  600. I_exp1 = lambda t: 0 if t<=interval0 else neuron.noisy_current[int((t-interval0)/resol)-1]
  601. #####Initializa the structure to save results#########
  602. sim=Simulation()
  603. sim.c_neuron=copy(neuron)
  604. sim.c_neuron.s_state_vars=['V']
  605. if s_Description==[]:
  606. sim.s_Description="Input current from experiment to real cell"
  607. else:
  608. sim.s_Description=s_Description
  609. sim.d_Protocol['s_Type']="Stimulation from experiment"
  610. sim.d_Protocol['s_Stimulus_features']=["Exp_Duration","Time_Before_Step"]
  611. exp_duration=v_t[-1]
  612. sim.d_Protocol['v_Stimulus_features']=[exp_duration,interval0]
  613. # I_exp1 = lambda t: 0 if t<interval0 else noisy_signal[int((t-interval0)/resol)]
  614. t=np.linspace(0, exp_duration, exp_duration/resol)
  615. sim.d_Protocol['s_Executable_stimulus']="I_exp1 = lambda t: 0 if t<="+str(interval0)+" else sim.c_neuron.noisy_current[int((t-"+str(interval0)+")/"+str(resol)+")-1]"
  616. sim.d_Configuration['n_max_step_integration']=resol
  617. sim.d_Configuration['v_time_integration']=[v_t[0],v_t[-1]]
  618. sim.d_Configuration['s_ODE_Solver']=neuron.ode_solver
  619. ######Run simulation################
  620. s_results=['V','t']
  621. v_results=np.append(v_V[...,None],v_t[...,None],1)
  622. ######Organize Simulation results into a structure####
  623. res=Results(s_results, v_results)
  624. t_sp,fr,i_n=firing_rate(res.t,res.V)
  625. sim.fr=[t_sp,fr,i_n]
  626. if compress !=[]:
  627. res=Results(s_results, v_results,compress,sim.fr)
  628. sim.d_Configuration['n_compressed_storage_factor']=compress
  629. sim.fr=res.fr
  630. ######And store them into the structure of results########
  631. if light_version==0:
  632. sim.a_Results=res
  633. if light_version==1:
  634. sim.a_Results=[]
  635. return sim