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)