脑机接口基础学习15—救救孩子吧,怎样注释连续数据

这篇文章主要介绍如何向原始(Raw)对象添加注释,以及在数据处理的后期阶段如何使用注释
Raw:原始对象
Annotations:注释
在实践过程中我遇到了非常多的问题,所以请诸大神看到后救救孩子吧

####导入工具包
import os
from datetime import datetime
import mne



sample_data_folder=r'E:脑机接口资料MNE-sample-data'
sample_data_raw_file=os.path.join(sample_data_folder,'MEG','sample',
                                 'sample_audvis_raw.fif')
raw=mne.io.read_raw_fif(sample_data_raw_file,verbose=False)
#只截取60s的数据
raw.crop(tmax=60).load_data()

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
MNE-Python中的注释是一种存储关于原始对象的时间跨度的短字符串信息的方法。注释是类似列表的对象,其中每个元素包含三部分信息:起始时间(以秒为单位)、持续时间(也以秒为单位)和描述(文本字符串),此外,annotation对象本身也跟踪orig_time,它是一个POSIX时间戳,表示相对于注释开始的真实时间

##########通过代码创建注释
如果事先知道要注释的原始对象的跨度,可以通过编程来创建注释,甚至可以将列表或数组传递给Annotations的构造函数来同时注释多个跨度:
my_annot=mne.Annotations(onset=[3,5,7],
                        duration=[1,0.5,0.25],
                        description=['AAA','BBB','CCC'])
print(my_annot)

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
注意,orig_time是None,因为我们还没有指定它。在这些情况下,当您将注释添加到原始(Raw)对象时,假设orig_time与记录的第一个样本的时间相匹配,因此将设置orig_time以匹配记录的测量日期(Raw.info['means_date’])

raw.set_annotations(my_annot)
print(raw.annotations)

#构建事件戳
meas_date=raw.info['meas_date']+raw.info['meas_date']/ 1e6
orig_time=raw.annotations.orig_time
print(meas_date==orig_time)

然鹅到这里就出现了问题
脑机接口基础学习15—救救孩子吧,怎样注释连续数据
谁能告诉我应该怎么解决呢

由于示例数据来自Neuromag系统,该系统在记录开始之前就开始对样品编号进行计数,因此将my_annot添加到Raw对象还涉及另一个自动更改:偏移量等于第一个记录的样品的时间(raw.first_samp/raw.info[‘sfreq’)
已添加到每个注释的初始值中

time_of_first_sample=raw.first_samp/raw.info['sfreq']
print(my_annot.onset+time_of_first_sample)
print(raw.annotations.onset)

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
如果知道注释的开始时间是相对于其他时间的,则可以在调用set_annotations()之前设置orig_time,然后开始时间将根据指定的orig_time与raw.info[‘meas_date’]之间的时差进行调整。这里我们将使用ISO 8601格式的字符串,并将其设置为比raw.info[‘meas_date’]晚50秒

time_format='%Y-%m-%d %H:%M:%S.%f'
new_orig_time = datetime.utcfromtimestamp(meas_date+ 50).strftime(time_format)
print(new_orig_time)


later_annot=mne.Annotations(onset=[3,5,7],
                           duration=[1,0.5,0.25],
                           description=['DDD','EEE','FFF'],
                           orig_time=new_orig_time)

raw2=raw.copy().set_annotations(later_annot)
print(later_annot.onset)
print(raw2.annotations.onset)

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
相似的问题又出现了

####可视化原始对象
fig=raw.plot(start=2,duration=6)
fig.show()

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
这三个注释显示为不同颜色的矩形,因为它们具有不同的描述值(沿绘图区域的顶部边缘打印)。在绘图窗口底部可以看到彩色跨度出现在绘图窗口底部的小滚动条中,这有助于快速查看注释在Raw对象中的位置

####交互式注释原始对象

也可以通过在绘图窗口中单击并拖动鼠标以交互方式将注释添加到Raw对象。要做到这一点,
首先进入“注释模式”,将调出注释窗口,注释控件窗口

'''

%matplotlib auto
fig.canvas.key_press_event('a')
####对注释对象的操作

#只要注释对象共享相同的orig_time,就可以通过简单地用+运算符来组合注释对象:

new_annot=mne.Annotations(onset=3.75,duration=0.75,description='AAA')
raw.set_annotations(my_annot+new_annot)
raw.plot(start=2,duration=6)

脑机接口基础学习15—救救孩子吧,怎样注释连续数据
遇到的问题一直在困扰着我,希望有大神看到后可以帮忙解答一下

匿名

发表评论

匿名网友