f_post_simulation_analysis.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import numpy as np
  2. from scipy.signal import find_peaks_cwt
  3. from scipy.signal import argrelextrema
  4. from scipy.optimize import curve_fit
  5. ################important define!
  6. global precision_convergence_ss
  7. precision_convergence_ss=0.00001
  8. def tic():
  9. #Homemade version of matlab tic and toc functions
  10. import time
  11. global startTime_for_tictoc
  12. startTime_for_tictoc = time.time()
  13. def toc():
  14. import time
  15. if 'startTime_for_tictoc' in globals():
  16. print( "Elapsed time is " + str(time.time() - startTime_for_tictoc) + " seconds.")
  17. else:
  18. print( "Toc: start time not set")
  19. def detect_peaks(signal, threshold=0.5, spacing=3):#https://github.com/MonsieurV/py-findpeaks/blob/master/tests/libs/tony_beltramelli_detect_peaks.py
  20. limit=None
  21. data=signal
  22. len = data.size
  23. x = np.zeros(len+2*spacing)
  24. x[:spacing] = data[0]-1.e-6
  25. x[-spacing:] = data[-1]-1.e-6
  26. x[spacing:spacing+len] = data
  27. peak_candidate = np.zeros(len)
  28. peak_candidate[:] = True
  29. for s in range(spacing):
  30. start = spacing - s - 1
  31. h_b = x[start : start + len] # before
  32. start = spacing
  33. h_c = x[start : start + len] # central
  34. start = spacing + s + 1
  35. h_a = x[start : start + len] # after
  36. peak_candidate = np.logical_and(peak_candidate, np.logical_and(h_c > h_b, h_c > h_a))
  37. peak_indexes = np.argwhere(peak_candidate)
  38. peak_indexes = peak_indexes.reshape(peak_indexes.size)
  39. if limit is not None:
  40. peak_indexes = ind[data[ind] > limit]
  41. return peak_indexes
  42. def firing_rate(t,V):
  43. fr=np.zeros(size(t))
  44. t_sp=np.zeros(size(t))
  45. d=[]
  46. sp=[]
  47. i_n=[]
  48. d=detect_peaks(V)
  49. if d==[] or len(d)<2:
  50. fr=np.zeros(size(t))
  51. t_sp=np.zeros(size(t))
  52. else:
  53. sp=V[d]>thresh
  54. if np.count_nonzero(sp)>2:
  55. i=np.transpose(sp)*d
  56. i_n=i[np.nonzero(i)]
  57. t_sp=t[i_n]
  58. t_sp=t_sp.reshape(size(t_sp),1)
  59. fr=1/(np.diff(t_sp, n=1, axis=0)/1000)
  60. t_sp=t_sp[1:]
  61. else:
  62. fr=np.zeros(size(t))
  63. t_sp=t
  64. return t_sp,fr,i_n
  65. def extract_spike_ampl(V, i_nn,compress=[]):
  66. c=0
  67. sp_V_max=[]
  68. sp_V_min=[]
  69. sp_ampl=[]
  70. if compress !=[]:
  71. i_n=[int(i/compress) for i in i_nn]
  72. else:
  73. i_n=i_nn
  74. d_i_ni=int(i_n[0]/2)
  75. for i in i_n:
  76. if c<len(i_n)-1:
  77. d_i_nd=int((i_n[c+1]-i)/2)
  78. else:
  79. d_i_nd=int((len(V)-i)/2)
  80. sp_V_max.append(max(V[i-d_i_ni:i+d_i_nd]))
  81. sp_V_min.append(min(V[i-d_i_ni:i+d_i_nd]))
  82. sp_ampl.append(max(V[i-d_i_ni:i+d_i_nd])-min(V[i-d_i_ni:i+d_i_nd]))
  83. c+=1
  84. d_i_ni=int((i_n[c-1]-i)/2)
  85. return sp_ampl,sp_V_max,sp_V_min
  86. def doub_expon_fun_2(t,tau1,tau2,a,b,c):
  87. if b > 0 and a > 0 and c>0 and tau1>0 and tau2>0:## Constraint to have all values positive
  88. return a * np.exp(-t/tau1 ) + b * np.exp(-t/tau2 )+c
  89. else:
  90. return 1e10
  91. def doub_expon_fit_2(t,x,p=[],std_error=False):
  92. x=np.array(x)
  93. t=np.array(t)
  94. perr=[]
  95. im=np.argmax(x)
  96. popt=[]
  97. tad=[]
  98. tpeak=[]
  99. adapt=False
  100. if x[-1]<x[im]:
  101. adapt=True
  102. if adapt:
  103. tad=t[im:]-t[im]
  104. frad=x[im:]
  105. frad02=x[im:]
  106. frad01=x[im:int(len(x[im:])/10)]
  107. half02=(max(frad02)-min(frad02))/2
  108. half01=(max(frad01)-min(frad01))/2
  109. halfid01=(np.abs(frad01-(max(frad01)-half01))).argmin()
  110. halfid02=(np.abs(frad02-(max(frad02)-half02))).argmin()
  111. ss_data01=frad[-int(len(frad01)/5):]
  112. ss_data02=frad[-int(len(frad02)/5):]
  113. ss_data01=ss_data01[abs(ss_data01 - np.mean(ss_data01)) < 2 * np.std(ss_data01)]
  114. ss_data02=ss_data02[abs(ss_data02 - np.mean(ss_data02)) < 2 * np.std(ss_data02)]
  115. if p!=[]:
  116. popt,pcov=curve_fit(doub_expon_fun_2,tad.flatten(),frad.flatten(), p0=p)
  117. else:
  118. popt,pcov=curve_fit(doub_expon_fun_2,tad.flatten(),frad.flatten(), p0=[tad[halfid01],tad[halfid02]*10,x[im]-mean(ss_data01[-int(len(ss_data01)/5):]),(x[im]-mean(ss_data02[-int(len(ss_data02)/5):])),mean(ss_data02[-int(len(ss_data02)/5):])])
  119. tpeak=t[im]
  120. perr=np.sqrt(np.diag(pcov))
  121. if std_error:
  122. return tad, popt,tpeak, perr
  123. else:
  124. return tad, popt,tpeak