Datajoint科学管道:当属性可以改变且数据来自数组时,如何高效地存储数据和设计管道

问题描述 投票:0回答:1

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

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

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

pipeline datajoint
1个回答
1
投票

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

一些问题:

  • “事件”与状态转换同义吗?
  • 特定类型事件之间的响应时间是否始终相同?

首先,你要经历考验。假设它们是会话的一部分,因此主键将是对会话的引用和试用 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 文件中获取数据。 然后,您可以定义下游计算表来计算响应时间。

请告诉我这是否有帮助以及您是否想进一步扩展或修改此设计。

© www.soinside.com 2019 - 2024. All rights reserved.