import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import os
import math
sticsvPath=r'E:\數據文件\3-23DataComplete\CIRCLE\STIM01trian'
path2=r'E:\\數據文件\\3-23DataComplete\\CIRCLE\\STIMCrossMartix'
#遍歷該文件夾下所有.csv文件
def get_file(path): # 創建一個空列表
files = os.listdir(path)
list = []
for file in files:
if not os.path.isdir(path + file): # 判斷該文件是否是一個文件夾
f_name = str(file)
# print(f_name)
tr = '\\' # 多增加一個斜杠
filename = path + tr + f_name
#filename = f_name
list.append(filename)#得到所有
return list
etm=np.zeros(4096)#第一個電極行為0
td=np.zeros(4096)
stiName=get_file(sticsvPath)#得到每個存放總csv數據的文件
for sn in stiName:#循環讀取每個stim
filename = os.path.basename(sn) # 截取文件名
s = filename.split('\\')[-1] # 不帶后綴的文件名(截取)
newpath = path2 + '\\' + s # .csv文件的路徑+名字
#os.makedirs(newpath)
scsv=get_file(sn)#獲得該stim下所有.csv文件的名
for cFile in scsv:#一個.csv的文件,一個刺激時間點下的4096個電極的0-1序列
k = 0
data = pd.read_csv(cFile, header=None)
data = np.array(data)
data = np.transpose(data)
csvname = os.path.basename(cFile) # 截取文件名
csv = csvname.split('.')[0] # 不帶后綴的文件名(截取)
savePath=newpath +'\\'+csv
for i in data:
ref=i#參考電極
ind1 = [d for d, x in enumerate(ref) if x == 1] # 找到電極的位置
maxvalueTrain=[]
timeDelayTrain=[]
if len(ind1) == 0: # 如果電極沒有spike,則為0
maxvalueTrain = np.zeros(4096)#互相關系數矩陣
timeDelayTrain = np.zeros(4096)#延遲時間矩陣
else:
for j in data:#目標電極
target=j
ind2 = [d for d, x in enumerate(target) if x == 1] # 找到電極的位置
spikebin = np.array(range(100))
for s1 in ind1:#循環參考電極中1的位置
if s1-50<0:#參考電極的位置<50
cha = abs(s1 - 50)#補充50-s1長度的0
cha1 = np.zeros(cha)
cha1 = np.r_[cha1, target[:s1 + 50]]#填充0與0-目標位置+50
else:
if s1 + 50 > 200:
cha1 = np.zeros(s1 - 150)#右邊補充0的長度
cha1 = np.r_[target[s1 - 50:], cha1]
else:
cha1 = target[s1 - 50:s1 + 50]
spikebin=np.row_stack((spikebin,cha1))#將每次spike得到的序列添加到下一行
spikebin = np.delete(spikebin, 0, axis=0)#得到該參考電極的每個spike100長度的序列
a = []
for b in range(100):
p = spikebin[:, b] # 取出每一列進行相加
a.append(sum(p))
a = np.array(a)
if len(ind2) == 0:#如果目標電極沒有spike,則不需要歸一化
a = a
else:
c = math.sqrt(len(ind1) * len(ind2))
a = a / c
maxvalue=max(a)
maxvalueTrain.append(maxvalue) # 找到參考電極與目標電極歸一化后最大的數值
maxind= [d for d, x in enumerate(a) if x == maxvalue] # 找到歸一化后最大值的位置
timeDelay=maxind[0]-50#計算最大值與中間位置之間的差值為延遲時間
timeDelayTrain.append(timeDelay)
timeDelayTrain = np.array(timeDelayTrain)
maxvalueTrain=np.array(maxvalueTrain)#所有目標電極的最大值
etm = np.row_stack((etm, maxvalueTrain))#將每個電極的最大值添加一行
td=np.row_stack((td,timeDelayTrain))#將每個延遲時間添加一行
#print(i)
k=k+1
print(k)
spiketrainAll1 = pd.DataFrame(data=etm[1:])
spiketrainAll1.to_csv(savePath+'maxMatrix.csv', index=False, header=None) # 進行數據的保存
spiketrainAll2 = pd.DataFrame(data=td[1:])
spiketrainAll2.to_csv(savePath+'TDMatrix.csv', index=False, header=None)