首页 > 解决方案 > Datajoint科学管道:当属性可以改变并且数据来自数组时如何有效地存储数据和设计管道

问题描述

我们需要将神经科学动物行为训练课程的输出加载到我们的数据联合数据库管道中。我们使用一个名为Bpod的平台进行实验,该平台在 Arduino 上实现了一个有限状态机来控制硬件和记录事件。例如,我们希望能够分析每次试验的响应时间,即有限状态机中两个状态之间的时间间隔。

关于状态和事件时间的数据保存在每个试验的 matlab 结构中,每个状态都有一个字段,其中包含一个数组,其中包含该状态的开始和结束时间(状态可以在试验期间多次出现,因此数组例如,试验中的状态可以具有大小(3,2))。

我的问题是将这些数据存储在 datajoint 数据库中的最有效方法是什么?现在,我们有一个导入表 Trials,其中每个 Trial 都有一个条目。将每个状态的开始时间存储在某种部件表中具有浮点值的列中似乎是最有效的,但我不确定如何以编程方式执行此操作,因为(1)状态可以多次发生并且(2)无需为每个状态硬编码一个部分表(可能的状态列表也会随着我们随着时间的推移调整行为范式而变化,并且不必重建整个数据库来添加新状态会很好)。或者,我们最初设想 Trials 表中的每个状态都有一个列,但是数据必须是 blob,我猜这可能效率低得多?任何建议表示赞赏!

标签: pipelineneurosciencedatajoint

解决方案


你似乎走在正确的轨道上。让我们将其描述为具体设计(几种可能之一)。然后您可以发表评论,我们将根据需要进行修改。

一些问题:

  • “事件”是状态转换的同义词吗?
  • 响应时间是否总是在特定类型的事件之间?

首先,你有试炼。假设它们是会话的一部分,因此主键将是对会话的引用和试用 ID。

让我们假设有一个查找表State枚举所有可能的状态。

在试验中,你有事件。让我们假设事件是两个状态之间的同义转换。然后将其定义为零件表Trial.Event。它可以通过试验中的事件时间来识别。我们可以使用开始时间来区分试验中的事件。并不是说我们避免在主键中使用浮点数是因为浮点数的相等条件很困难。

@schema
class Trial(dj.Imported):
    definition = """
    -> Session
    trial_id : smallint unsigned
    ---
    trial_start_time : float  # (s) from session start
    """

    class Event(dj.Part):
        definition = """
        # Trial.Event marks the time of transition into a state 
        -> master
        event_time : decimal(6,3)  # (s) from trial start
        ---
        -> State
        """

    def make(self, key):
        ...

这是一个开始。这可以从 .mat 文件中提取数据。然后,您可以定义一个下游计算表来计算响应时间。

让我知道这是否有帮助,如果您想进一步扩展或修改此设计。


推荐阅读