跳转到主要内容

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=检测到碰撞

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。

源分发

tank_lab_to_nwb-0.2.0.tar.gz (17.6 kB 查看哈希值)

上传时间

构建分发

tank_lab_to_nwb-0.2.0-py3-none-any.whl (16.8 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面