NWB转换脚本和教程。
项目描述
tank-lab-to-nwb
NWB转换脚本和教程。与Tank实验室合作,由Simons基金会资助。
安装
$ pip install tank-lab-to-nwb
用法
转换Neuropixel和Virmen行为数据有两种方法。
(1) 主处理流程通过TTL脉冲同步任务数据与电生理数据,并将动作电位输出写入相同的NWB文件。
相关函数的使用所需的参数在转换脚本相应部分的注释中注明。这包括要转换为NWB格式的数据文件或文件夹位置,以及一些可选字段,如受试者信息(物种/年龄/体重)。
在终端中编辑转换脚本convert_towers.py
,并使用Neuropixel和行为数据的正确路径后,可以在终端中执行转换
$ cd tank-lab-to-nwb
$ python tank_lab_to_nwb/convert_towers_task/convert_towers.py
或者,可以使用定制的jupyter笔记本spikeinterface_pipeline.ipynb
执行转换,该笔记本可以从终端启动
$ jupyter notebook notebooks/spikeinterface_pipeline.ipynb
(2) 可以通过Python脚本读取NWBFile进行审查
from pynwb import NWBHDF5IO
file_path = 'TowersTask_stub.nwb'
io = NWBHDF5IO(file_path, 'r')
nwb = io.read()
print(nwb)
或者,在jupyter笔记本中使用nwb-jupyter-widgets
可视化NWB数据
$ jupyter notebook notebooks/towers_task_custom_widget.ipynb
from pynwb import NWBHDF5IO
from nwbwidgets import nwb2widget
from tank_lab_to_nwb.nwbwidgets import custom_timeseries_widget_for_behavior
from nwbwidgets.view import default_neurodata_vis_spec
import pynwb
file_path = 'TowersTask_stub.nwb'
io = NWBHDF5IO(file_path, 'r')
nwb = io.read()
default_neurodata_vis_spec[pynwb.TimeSeries] = custom_timeseries_widget_for_behavior
nwb2widget(nwb)
背景
行为数据映射
行为数据包含在类似以下的.mat
文件中: PoissonBlocksReboot4_cohort4_Bezos3_E65_T_20180202.mat
这个Matlab文件包含一个struct(log
),其中包含与转换相关的多个字段。可以从下面的列表中找到从该struct中提取的字段列表。
NWBFile
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
log.session.start |
nwb.session_start_time |
datetime 当会话开始时 |
[文件中不存在] | nwb.session_description |
关于会话的附加信息(可选) |
[文件名] | nwb.session_id |
会话的唯一标识符 |
受试者
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
log.session.start |
nwb.subject.age |
年龄(天数),以 isoformat 格式表示(可选) |
[文件中不存在] | nwb.species |
关于物种的信息(可选) |
log.animal.name |
nwb.subject_id |
受试者的标识符 |
[文件中不存在] | nwb.genotype |
关于基因型的信息(可选) |
[文件中不存在] | nwb.sex |
关于受试者性别的信息(可选) |
LabMetaData
在 tank_lab_to_nwb/convert_towers_task/virmenbehaviordatainterface.py
中填充特定于实验室的元数据,使用用于扩展 NWB LabMetaData 架构的必要字段的自定义扩展 ndx-tank-metadata
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
log.version.code |
nwb.lab_meta_data['LabMetaData'].experiment_name |
运行的实验名称 |
log.version.name |
nwb.lab_meta_data['LabMetaData'].world_file_name |
运行的世界名称 |
log.animal.protocol |
nwb.lab_meta_data['LabMetaData'].protocol_name |
运行的协议名称 |
log.animal.stimulusBank |
nwb.lab_meta_data['LabMetaData'].stimulus_bank_path |
刺激库文件路径 |
log.version.repository |
nwb.lab_meta_data['LabMetaData'].commit_id |
会话运行的提交 ID |
log.session.end |
nwb.lab_meta_data['LabMetaData'].session_end_time |
datetime 会话结束时 |
log.version.rig.rig |
nwb.lab_meta_data['LabMetaData'].location |
运行会话的机器名称 |
[文件中不存在] | nwb.lab_meta_data['LabMetaData'].num_trials |
会话中的试验次数 |
[文件中不存在] | nwb.lab_meta_data['LabMetaData'].session_performance |
正确响应的性能百分比(可选) |
log.version.rig |
nwb.lab_meta_data['LabMetaData'].rig.fields |
机器信息 |
log.version.mazes |
nwb.lab_meta_data['LabMetaData'].mazes.to_dataframe() |
迷宫信息 |
- 可以从
virmenbehaviordatainterface.py
编辑 session_performance。
机器
将 log.version.rig
结构对象转换为字典,如下例所示
{'rig': 'NPX',
'simulationMode': 1,
'hasDAQ': 1,
'hasSyncComm': 0,
'minIterationDT': 0.01,
'arduinoPort': 'COM18',
'sensorDotsPerRev': array([2469.2, 2469.2, 2469.2, 2469.2]),
'ballCircumference': 63.8,
'toroidXFormP1': 0.3879,
'toroidXFormP2': 0.392,
'colorAdjustment': array([0. , 0.4, 0.5]),
'soundAdjustment': 0.2,
'nidaqDevice': 1,
'nidaqPort': 1,
'nidaqLines': array([ 0, 11], dtype=int32),
'syncClockChannel': 5,
'syncDataChannel': 6,
'rewardChannel': 0,
'rewardSize': 0.004,
'rewardDuration': 0.05,
'laserChannel': 1,
'rightPuffChannel': 2,
'leftPuffChannel': 3}
迷宫
迷宫信息转换为 DynamicTable 对象,可以通过调用 .to_dataframe()
转换为 pandas 数据框,如下例所示
id | world | lStart | lCue | lMemory | cueDuration | cueVisibleAt | cueProbability | ... | blockPerform |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 5 | 45 | 10 | nan | inf | inf | ... | 0.7 |
1 | 1 | 30 | 120 | 20 | nan | inf | inf | ... | 0.7 |
2 | 1 | 30 | 220 | 20 | nan | inf | inf | ... | 0.7 |
3 | 1 | 30 | 300 | 20 | nan | inf | inf | ... | 0.7 |
4 | 1 | 30 | 380 | 20 | nan | inf | inf | ... | 0.7 |
Epochs
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
log.block 结构的索引 |
nwb.intervals['epochs'].id |
会话中的 epoch 数量 |
log.block.mazeID |
nwb.intervals['epochs'].maze_id |
epoch 中的迷宫数量 |
log.block.mainMazeID |
nwb.intervals['epochs'].main_maze_id |
受试者“最高”级别的迷宫数量 |
log.block.easyBlockFlag |
nwb.intervals['epochs'].easy_epoch |
如果块被标记为简单(maze_id < main_maze_id)则为 1 |
log.block.firstTrial |
nwb.intervals['epochs'].first_trial |
epoch 中运行的第一个试验 |
[文件中不存在] | nwb.intervals['epochs'].num_trials |
每个 epoch 的试验次数 |
log.block.start |
nwb.intervals['epochs'].start_time |
相对于会话开始时间的 epoch 开始时间 |
log.block.duration |
nwb.intervals['epochs'].duration |
epoch 持续时间(秒) |
log.block.rewardMiL |
nwb.intervals['epochs'].reward_ml |
epoch 中的奖励 ml |
Trials
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
[文件中不存在] | nwb.intervals['trials'].id |
所有 epoch 的试验的唯一标识符 |
log.block.trial 的索引 |
nwb.intervals['trials'].trial_id |
epoch 内试验的标识符 |
log.block.trial.trialType |
nwb.intervals['trials'].trial_type |
试验类型(L=左,R=右) |
log.block.trial.choice |
nwb.intervals['trials'].choice |
(L=左,R=右,nil=试验违规) |
log.block.trial.start |
nwb.intervals['trials'].start_time |
相对于 epoch 开始时间的试验开始时间 |
log.block.trial.duration |
nwb.intervals['trials'].duration |
试验持续时间(秒) |
log.block.trial.iterations |
nwb.intervals['trials'].iterations |
试验中的帧数 |
log.block.trial.iCueEntry |
nwb.intervals['trials'].iCueEntry |
受试者进入提示区域的迭代编号 |
log.block.trial.iMemEntry |
nwb.intervals['trials'].iMemEntry |
受试者进入记忆区域的迭代编号 |
log.block.trial.iTurnEntry |
nwb.intervals['trials'].iTurnEntry |
受试者进入转向区域的迭代编号 |
log.block.trial.iArmEntry |
nwb.intervals['trials'].iArmEntry |
受试者进入手臂区域的迭代编号 |
log.block.trial.iBlank |
nwb.intervals['trials'].iBlank |
屏幕关闭的迭代编号 |
log.block.trial.cueCombo |
nwb.intervals['trials'].left_cue_presence, nwb.intervals['trials'].right_cue_presence |
指示第n个提示出现在左侧或右侧 |
log.block.trial.cuePosition |
nwb.intervals['trials'].left_cue_position, nwb.intervals['trials'].right_cue_position |
每个提示在迷宫中的位置 |
log.block.trial.cueOnset |
nwb.intervals['trials'].left_cue_onset, nwb.intervals['trials'].right_cue_onset |
提示在试验中出现的迭代编号 |
log.block.trial.cueOffset |
nwb.intervals['trials'].left_cue_offset, nwb.intervals['trials'].right_cue_offset |
提示在试验中消失的迭代编号 |
log.block.trial.excessTravel |
nwb.intervals['trials'].excessTravel |
测量受试者额外跑步距离的参数 |
log.block.trial.rewardScale |
nwb.intervals['trials'].rewardScale |
每次正确试验的奖励乘数 |
行为
位置,视场角,速度,碰撞
在Virmen (.mat)文件中的位置 | 在NWB文件中的位置 | 描述 |
---|---|---|
log.block.trial.time |
nwb.processing['behavior'].data_interfaces['Time'] |
每帧由Virmen测量的时间向量 |
log.block.trial.position |
nwb.processing['behavior'].data_interfaces['Position'].spatial_series |
每帧的位置矩阵(X(cm), Y(cm)) |
log.block.trial.position |
nwb.processing['behavior'].data_interfaces['ViewAngle'].spatial_series |
每帧的视场角(度) |
log.block.trial.velocity |
nwb.processing['behavior'].data_interfaces['Velocity'] |
每帧的速度矩阵(X(cm/s), Y(cm/s)) |
log.block.trial.collision |
nwb.processing['behavior'].data_interfaces['Collision'] |
对于每一帧,1=检测到碰撞 |
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。