lfp_analysis3.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. '''
  2. description: offline analysis of kiap data
  3. author: Ioannis Vlachos
  4. date: 16.04.2019
  5. Copyright (c) 2019 Ioannis Vlachos.
  6. All rights reserved.'''
  7. import re
  8. import os
  9. import glob
  10. import importlib
  11. import urllib
  12. import time
  13. import numpy as np
  14. import matplotlib.pyplot as plt
  15. import matplotlib as mpl
  16. from scipy import signal
  17. from scipy import stats
  18. # from cachetools import cached, LRUCache, TTLCache
  19. from neo.io.blackrockio import BlackrockIO
  20. # from mne.connectivity import spectral_connectivity
  21. import aux
  22. from analytics import analytics1
  23. importlib.reload(analytics1)
  24. # @cached(cache={})
  25. def read_data():
  26. '''returns first array1 and then array2 channels'''
  27. data = reader.get_analogsignal_chunk(i_stop=eval(str(params.lfp.i_stop)),
  28. channel_indexes=params.lfp.array1 + params.lfp.array2)
  29. return data
  30. params = aux.load_config()
  31. ch_nr1 = len(params.lfp.array1)
  32. ch_nr2 = len(params.lfp.array2)
  33. psth_win = params.lfp.psth_win
  34. # file_name = '/home/vlachos/data_kiap/20190321-135311/20190321-135311-001'
  35. # path = '/home/kiap/Documents/kiap/k01/20190414-123429/'
  36. path = '/media/vlachos/kiap_backup/Recordings/K01/Recordings/20190414-123429/'
  37. file_name0 = '20190414-123429-001.ns2'
  38. file_name = path + file_name0
  39. plt.ioff()
  40. # if not 'data0' in locals():
  41. Sxx1_tot = np.zeros((999, ch_nr1, 479, 75))
  42. for fid in range(1, 76):
  43. # for fid in range(1,76):
  44. # for fid in range(62,63):
  45. file_name0 = f'20190414-123429-{fid:03d}.ns2'
  46. file_name = path + file_name0
  47. print(file_name)
  48. reader = BlackrockIO(filename=file_name)
  49. data0 = read_data() # (samples, channels)
  50. data0 = data0.copy().astype(np.float64)
  51. # trials_msk = get_valid_trials(triggers_no_ns2, triggers_yes_ns2)
  52. array1 = params.lfp.array1
  53. array2 = params.lfp.array2
  54. # data1[data1 > params.lfp.artifact_thr] = 0
  55. # data1[data1 < -params.lfp.artifact_thr] = 0
  56. # data0 = data0 - np.mean(data0, 1)[:, np.newaxis]
  57. # reader.nev_data['Comments'][0]
  58. data0 = stats.zscore(data0)
  59. data01 = data0[:, :len(array1)]
  60. data02 = data0[:, len(array1):len(array1) + len(array2)]
  61. data1 = np.zeros((data01.shape[0], data01.shape[1], 3)) # (samples, channels, 3)
  62. data2 = np.zeros((data02.shape[0], data02.shape[1], 3)) # (samples, channels, 3)
  63. # Y1 = np.zeros((data01.shape[0], data01.shape[1], 3))
  64. # data1[:, :, 0], _, _ = analytics1.bw_filter(data01.T, params.lfp.filter_fc_lb, params.lfp.fs, params.lfp.filter_order_lb, plot=params.lfp.plot.filters)
  65. # data1[:, :, 1], _, _ = analytics1.bw_filter(data01.T, params.lfp.filter_fc_mb, params.lfp.fs, params.lfp.filter_order_mb, plot=params.lfp.plot.filters)
  66. # data1[:, :, 2], _, _ = analytics1.bw_filter(data01.T, params.lfp.filter_fc_hb, params.lfp.fs, params.lfp.filter_order_hb, plot=params.lfp.plot.filters)
  67. # data2[:, :, 0], _, _ = analytics1.bw_filter(data02.T, params.lfp.filter_fc_lb, params.lfp.fs, params.lfp.filter_order_lb, plot=params.lfp.plot.filters)
  68. # data2[:, :, 1], _, _ = analytics1.bw_filter(data02.T, params.lfp.filter_fc_mb, params.lfp.fs, params.lfp.filter_order_mb, plot=params.lfp.plot.filters)
  69. # data2[:, :, 2], _, _ = analytics1.bw_filter(data02.T, params.lfp.filter_fc_hb, params.lfp.fs, params.lfp.filter_order_hb, plot=params.lfp.plot.filters)
  70. # Y01, ff01 = analytics1.calc_fft(data01, params.lfp.fs, i_stop=1e5, axis=0)
  71. # Y02, ff02 = analytics1.calc_fft(data02, params.lfp.fs, i_stop=1e5, axis=0)
  72. # Y1, ff1 = analytics1.calc_fft(data1, params.lfp.fs, i_stop=1e5, axis=0)
  73. # Y2, ff2 = analytics1.calc_fft(data2, params.lfp.fs, i_stop=1e5, axis=0)
  74. # SPECTROGRAMS
  75. # ----------------------------------
  76. nperseg = 5000
  77. ff, tt, Sxx1 = signal.spectrogram(data01, params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.5))
  78. # ff, tt, Sxx2 = signal.spectrogram(data02, params.lfp.fs, axis=0, nperseg=nperseg, noverlap=int(nperseg * 0.5))
  79. print(f'{fid}, Sxx1 shape: {Sxx1.shape}, {Sxx1_tot.shape}')
  80. f_idx = (ff>0) & (ff<200)
  81. Sxx1_tot[:, :, :Sxx1.shape[2], fid - 1] = Sxx1[f_idx, :]
  82. # fig1 = plt.figure(1, figsrize=(14,10))
  83. # plt.clf()
  84. # for ii in range(1):
  85. # # plt.plot()
  86. # ax = plt.subplot(8,8,ii+1)
  87. # # plt.plot(ff01[fidx], Y01[fidx])
  88. # plt.pcolormesh(tt, ff[f_idx], np.log10(Sxx1[f_idx, ii, :]))
  89. # # plt.pcolormesh(tt, ff[f_idx], np.log10(Sxx2[f_idx, ii, :]))
  90. # # plt.pcolormesh(tt, ff[f_idx], np.log10(Sxx1[f_idx, ii, :]/Sxx1[f_idx,:,:].mean(1)))
  91. # print(ii)
  92. # if ii<56:
  93. # ax.set_xticks([])
  94. # if np.mod(ii,8)!=0:
  95. # ax.set_yticks([])
  96. # fname = path + os.path.splitext(file_name0)[0]+'-arr3.png'
  97. # fig1.savefig(fname)
  98. # plt.show()
  99. # con, freqs, times, epochs, tapers = mne.connectivity.spectral_connectivity(
  100. # sig.values[None, :, :], sfreq=freq, indices=indices)
  101. # save individual plots
  102. fig1 = plt.figure(1)
  103. plt.ioff()
  104. for ii in range(4):
  105. aa = Sxx1_tot[:, ii, :, :]
  106. # bb = np.reshape(aa,(1999,239*75), order='F')
  107. bb = np.reshape(aa, (999, 479 * 75), order='F')
  108. plt.clf()
  109. # plt.pcolormesh(np.arange(239*75),ff[f_idx],np.log10(bb))
  110. plt.pcolormesh(np.arange(479 * 75), ff[f_idx], np.log10(bb))
  111. fname = path + f'total/ch_{ii}_2.png'
  112. fig1.savefig(fname)
  113. print(ii)