lfp_analysis1_2.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import numpy as np
  2. from scipy import signal
  3. import aux
  4. import importlib
  5. import matplotlib.pyplot as plt
  6. import sys
  7. from analytics import lfp_analytics as lfpan
  8. importlib.reload(lfpan)
  9. interactive_off = int(sys.argv[1])
  10. if interactive_off:
  11. plt.ioff()
  12. else:
  13. plt.ion()
  14. # plt.close('all')
  15. params = aux.load_config()
  16. # path = '/home/vlachos/devel/vg/kiapvmdev/data/clinical/neural_new/nsx/'
  17. path = '/media/vlachos/bck_disk1/kiap/recordings/20190705/20190705-143437/'
  18. # file_name0 = '20190607-123832-001.ns2' # motor mapping 1
  19. file_name0 = '20190705-143437-001.ns2' # motor mapping 1
  20. file_name = path + file_name0 # motor session 5
  21. # params.lfp.array1 = np.delete(params.lfp.array1, params.lfp.array1_exclude)
  22. # params.lfp.array2 = np.delete(params.lfp.array2, params.lfp.array2_exclude)
  23. psth_win = params.lfp.psth_win
  24. # file_name = '/home/vlachos/data_kiap/20190321-135311/20190321-135311-001'
  25. # path = '/media/kiap/kiap_backup/Recordings/K01/Recordings/20190326-160445/'
  26. # path = '/kiap/data/clinical/neural_new/nsx/'
  27. # file_name = path + '20190326-160445-001.ns2'
  28. array1 = params.lfp.array1
  29. array2 = params.lfp.array2
  30. color = ['C0', 'C1', 'C2', 'C3', 'C4']
  31. args = {'arr_nr': 2, 'erase': True, 'log': True, 'xmin': 0.01, 'xmax': 20, 'ymin': -1e2, 'ymax': 5e3,
  32. 'save_fig': False}
  33. arr_id = 1
  34. if 'an' not in locals():
  35. an = lfpan.lfp_analytics(params)
  36. an.read_data(file_name)
  37. an.preprocess()
  38. an.get_triggers(speller='feedback')
  39. an.compute_psth(arr_nr=arr_id)
  40. an.calc_stft_psth(arr_nr=arr_id, nperseg=2000)
  41. an.plot_psth_stft(arr_nr=arr_id, ch_ids=range(32), fmax=200, save_fig=True)
  42. xx
  43. an.plot_channels(ch_ids=[], arr_id=args['arr_nr'], save_fig=args['save_fig'], i_stop=-1)
  44. for ii in range(5):
  45. markerline, stemlines, baseline = plt.stem(an.triggers_mapping[ii]/1000, np.arange(an.triggers_mapping[ii].size) * 0+10, color[ii])
  46. plt.setp(stemlines, 'linewidth', 3)
  47. xx
  48. an.plot_psth_time(ch_ids=params.lfp.array21, save_fig=True)
  49. xx
  50. an.calc_stft(arr_nr=2, nperseg=2000)
  51. an.plot_stft(arr_nr=2, save_fig=True)
  52. # an.calc_spectra(arr_nr=args['arr_nr'], nperseg=20000, axis=0, force=True, onesided=True, detrend='constant')
  53. # an.plot_spectra_bands(**args)
  54. # an.calc_cc_time(save_fig=args['save_fig'])
  55. sys.exit(1)
  56. # an.get_triggers(n_triggers=20)
  57. # trials_msk = get_valid_trials(triggers_no_ns2, triggers_yes_ns2)
  58. # data1[data1 > params.lfp.artifact_thr] = 0
  59. # data1[data1 < -params.lfp.artifact_thr] = 0
  60. # data0 = data0 - np.mean(data0, 1)[:, np.newaxis]
  61. # reader.nev_data['Comments'][0]
  62. # ff, tt, S = signal.spectrogram(an.data2[:, :, 0], params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  63. fidx = (ff > 0) & (ff < 2)
  64. plt.figure(1)
  65. plt.clf()
  66. # plt.plot(ff[fidx], np.log10(S[fidx, 4, :]), 'C1')
  67. # plt.pcolormesh(tt, ff[fidx], np.log10(S[fidx, 4, :]))
  68. plt.plot(tt, np.sum(S[fidx, :, :], axis=0))
  69. plt.draw()
  70. plt.show()
  71. # nperseg = 20000
  72. # ff2, Y2 = signal.welch(an.data02, fs=an.params.lfp.fs, axis=0, nperseg=nperseg, detrend=False, scaling='spectrum', return_onesided=False)
  73. # from scipy.fftpack import fftshift
  74. # Y2 = fftshift(Y2)
  75. # ff2 = fftshift(ff2)
  76. plt.xlim(-10,10)
  77. # tidx = tt < 1000
  78. plt.figure(1)
  79. plt.clf()
  80. plt.subplot(121)
  81. band_id = 2
  82. # fidx = (an.ff2 >= 0) & (an.ff2 < 20)
  83. fidx = (an.ff2 >= 0) & (an.ff2 < 200)
  84. plt.plot(an.ff2[fidx], np.log10(an.Y2[fidx, :, band_id]), 'C0')
  85. plt.plot(an.ff2[fidx], np.mean(np.log10(an.Y2[fidx, :, band_id]), axis=1), 'k')
  86. plt.plot(an.ff2[fidx], np.median(np.log10(an.Y2[fidx, :, band_id]), axis=1), 'k--')
  87. plt.ylim(-2, 4)
  88. plt.xlabel('Hz')
  89. plt.ylabel('log spectrum V**2')
  90. plt.title(f'Sensor mapping, 20190606-214850-001.ns2')
  91. plt.draw()
  92. plt.show()
  93. # plt.subplot(122)
  94. # plt.plot(ff2[fidx], np.log10(Y2[fidx, :, 0]), 'C1')
  95. # plt.plot(ff2[fidx], np.mean(np.log10(Y2[fidx, :, 0]), axis=1), 'k')
  96. # plt.plot(ff2[fidx], np.median(np.log10(Y2[fidx, :, 0]), axis=1), 'k--')
  97. # plt.ylim(-2, 4)
  98. # plt.xlabel('Hz')
  99. # plt.ylabel('log spectrum V**2')
  100. # plt.title(f'Motor mapping, 20190607-134213-001.ns2')
  101. # plt.plot(an.ff2[fidx], np.log10(an.Y2[fidx, :, 0].mean(1)), 'k')
  102. # plt.pcolormesh(tt, ff[fidx], np.log10(S[fidx, :, :].mean(1)))
  103. # plt.plot(ff, np.log10(Y[:, :, 2]), 'C0')
  104. # plt.pcolormesh(ff, range(Y.shape[1]), np.log10(Y[:, :, 2].T))
  105. # plt.pcolormesh(ff, tt, np.log10(S[:, 4, :].T))
  106. # plt.colorbar()
  107. # plt.xlim(0,20)
  108. # plt.xlim(, 10)
  109. plt.draw()
  110. plt.show()
  111. xxx
  112. # COMPUTE PSTH
  113. # ----------------------------------
  114. # psth shape: (trials, time, channels)
  115. offset = 600 * params.lfp.fs # offset in sec to get data for normalization
  116. triggers_yes_norm = np.hstack((triggers_yes_ns2 + offset, triggers_yes_ns2 + offset + 10))
  117. triggers_no_norm = np.hstack((triggers_yes_ns2 + offset, triggers_yes_ns2 + offset + 10))
  118. if np.any(triggers_yes_norm > data01.shape[1]):
  119. log.error('triggers_norm outside imported data')
  120. psth_no, psth_yes = compute_psth(triggers_yes_ns2, triggers_no_ns2, arr_nr=1, sub_band=params.lfp.sub_band)
  121. psth_norm1, psth_norm2 = compute_psth(triggers_yes_norm, triggers_no_norm, arr_nr=1, sub_band=params.lfp.sub_band)
  122. # COMPUTE PSTH SPECTROGRAMS
  123. # ----------------------------------
  124. nperseg = params.lfp.spectra.spgr_len
  125. nperseg = min(nperseg, psth_no.shape[1])
  126. # ff, tt, Sxx1 = signal.spectrogram(psth_no.mean(0), params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  127. # ff, tt, Sxx2 = signal.spectrogram(psth_yes.mean(0), params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  128. # Sxx1.shape = (trials, ff, channels, time)
  129. # Sxx1_norm.shape = (ff,time, channels)
  130. ff, tt, Sxx1 = signal.spectrogram(psth_no, params.lfp.fs, axis=1, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  131. ff, tt, Sxx2 = signal.spectrogram(psth_yes, params.lfp.fs, axis=1, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  132. ff, tt, Sxx1_norm = signal.spectrogram(psth_norm1.mean(0), params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  133. ff, tt, Sxx2_norm = signal.spectrogram(psth_norm2.mean(0), params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.9))
  134. # Sxx1 = Sxx1.mean(1)
  135. # Sxx2 = Sxx2.mean(1)
  136. Sxx1_norm = Sxx1_norm.mean(2)
  137. Sxx2_norm = Sxx2_norm.mean(2)
  138. tt = tt + psth_win[0] / params.lfp.fs
  139. t_idx = tt < 1
  140. Sxx1_norm = Sxx1_norm[:, np.newaxis].repeat(len(tt), 1)
  141. Sxx2_norm = Sxx2_norm[:, np.newaxis].repeat(len(tt), 1)
  142. # if params.lfp.normalize:
  143. # Sxx1 = Sxx1 / Sxx1_norm
  144. # Sxx2 = Sxx2 / Sxx2_norm
  145. # 11. PLOT RESULTS
  146. # ----------------------------------
  147. if params.lfp.plot.general:
  148. # plot_spectra()
  149. plot_psth(ff=ff, sub_band=params.lfp.sub_band, ch_id=0, trial_id=0, step=100)
  150. pass
  151. # xxx
  152. plt.ioff()
  153. # for trial_id in range(4, 5):
  154. # for ch_id in range(ch_nr1 - 1, ch_nr1):
  155. # plot_psth(ff=ff, sub_band=0, ch_id=ch_id, trial_id=0, step=100)
  156. # fig2 = plt.gcf()
  157. # fname = path + f'results/trial_{trial_id}_ch_{ch_id}.png'
  158. # # fig2.savefig(fname)
  159. # print(ch_id)