认识Experiment Builder


随着我对EB软件了解的深入,我就越是能感受到作者对这个软件所倾注的心血!——Charlie


Experiment Builder软件在首次安装时,会附带时长为30天Demo License。即30天之内是可以不用加密狗就可以打开Experiment Builder软件的。

但需要注意的是,Demo License下编写的实验程序和加密狗的正式授权存在文件不互通的问题。换句话说,在Demo License下编写的实验程序无法在查了加密狗的条件下打开。而且在Demo License下运行的程序会有一个去不掉的红色水印,不能用于正式实验。


1. 软件界面

EB_shotcut

Experiment Builder使用的是Windows软件的典型构架,由菜单栏、工具栏、工作区和一些辅助面板构成。下面我们来依次介绍:

1.1 菜单栏

eb_menu_ba

Experiment Builder 菜单栏
├── File                    
|  ├── New                      # 新建一个新的Project
|  ├── Open                     # 打开一个现有的Project
|  ├── Recent                   # 最近打开过的Project
|  ├── Examples                 # EB自带的模板
|  ├── Save                     # 保存当前Project
|  ├── Save As                  # 将当前Project另存
|  ├── Unlock Project           # 解锁当前Project
|  ├── Package                  # 将当前Project压缩为.ebz文件
|  ├── Unpack                   # 解压缩一个.ebz文件
|  ├── Set Restore Point        # 设置回溯点
|  ├── Restore                  # 回溯当前Project
|  └── Exit                     # 退出EB
├── Edit
|  ├── Undo                     # 撤销
|  ├── Redo                     # 重做
|  ├── Cut                      # 剪切
|  ├── Copy                     # 复制
|  ├── Paste                    # 粘贴
|  ├── Paste Multiple           # 粘贴多个
|  ├── Delete                   # 删除
|  ├── Refresh Custom Class     # 刷新重置Custom Class
|  ├── Preferences              # 首选项
|  ├── Library Manager          # 素材库管理器
|  ├── Reference Manager        # 引用管理器
|  ├── Node Groups              # 节点组
|  └── Select All               # 全选
├── View
|  ├── Overview                 # 显示/隐藏Overview面板
|  ├── Structure                # 显示/隐藏Structure面板
|  ├── Properties               # 显示/隐藏Properties面板
|  ├── Connections              # 显示/隐藏Connections面板
|  ├── Navigator                # 显示/隐藏Navigator面板
|  ├── Restore Default Views    # 显示/隐藏重置视图设置
|  ├── Back                     # 上一个节点
|  ├── Forward                  # 下一个节点
|  ├── Zoom Selected            # 聚焦到选中的节点
|  ├── Zoom In                  # 放大
|  ├── Zoom Out                 # 缩小
|  ├── Fit Content              # 铺满屏幕
|  ├── Layout Options           # 排列设置
|  ├── Arrange Layout           # 自动排列
|  ├── Export Node              # 导出节点
|  └── Import Node              # 导入节点
├── Experiment
|  ├── Clean                    # 清空当前Project
|  ├── Build                    # 编译当前Project
|  ├── Test Run                 # 编译并试运行当前Project
|  └── Deploy                   # 编译并导出当前Project为可执行文件
└── Help
   ├── Contents                 # 电子版用户手册
   ├── About                    # 关于
   └── License                  # 许可证书

1.2 工具栏

eb_tool_ba

工具栏的按钮基本都是菜单栏里面常用功能的快捷按钮,因此不做过多解释。

但最后一个下拉菜单不是快捷按钮,是Datasource的快捷导航,这部分内容详见Recording层这篇文章。

1.3 Overview面板

eb_overview_panne

Overview面板实际上是工作区内实验流程图的一个缩略图,当实验流程图非常长时,方便我们快速导航到希望的位置。

1.4 Structure面板

eb_structure_panne

Structure面板从三个层次来解析实验的结构——逻辑关系控件硬件。这三个层次依次显示在Structure面板的左下角。

  • Experiment - 将实验的所有控件按照树状图的机构显示出来。
  • Components - 将实验中所用到的空间按类型归类后显示。
  • Device - 将实验中涉及到的硬件设备罗列出来。

其中最值得一提的是Device中的Eyelink,这部分所指代的内容是眼动仪,我们可以在这里设置眼动仪的型号和工作模式。

1.5 Properties面板

eb_properties_panne

Properties面板顾名思义,这里显示的是特定对象的属性。

当我们在Experiment Builder中选择任意一个对象时,该对象的属性都会显示在Properties面板中。

1.6 Note面板

eb_note_panne-w235

和前面的Properties面板类似,Note面板里面显示的是选中对象的备注信息。

1.7 工作区标签

eb_tab_panne

工作区标签显示在整工作区的上方,提示了当前的工作区显示的是哪个对象的内容,并且允许用户在各个对象之间快速切换。

1.8 控件库

eb_node_library

控件库中是Experiment Builder中可以用来构建实验的全部功能控件。

Experiment Builder将所有控件分为三类:ActionTriggerOther

  • Action - 命令主试机、被试机或者眼动仪执行某一个特定的命令。
  • Trigger - 控制Action的开始和结束。
  • Other - 除上述两种以外的辅助控件。

详细列表如下:

控件库
├── Action                  
|  ├── DisplayScreen                # 显示特定内容
|  ├── DriftCorrection              # 漂移检查
|  ├── CameraSetup                  # 执行相机校准
|  ├── AddToLog                     # 将文本内容添加到运行日志中
|  ├── SendEyelikMessage            # 将文本内容以Message的形式发送到.edf文件中
|  ├── EyelinkCommand               # 将文本命令发送给主试机
|  ├── AddToAccumulator             # 添加到累加器
|  ├── PrepareSequence              # 准备下一个试次的刺激材料
|  ├── Sequence                     # 序列
|  ├── UpdateAttribute              # 更新属性
|  ├── Play Sound                   # 播放声音
|  ├── Play Sound Control           # 声音播放控制
|  ├── Record Sound                 # 录制声音
|  ├── Record Sound Control         # 声音录制控制
|  ├── AddToResultFile              # 将特定变量添加到ResultFile中
|  ├── SetTTL                       # 设置TTL设备针脚电平
|  ├── Biometric TTL                # 控制被试机向其他设备发送TTL信号
|  ├── serialPortWriteMessageTip    # 控制串口发送消息
|  ├── Reset                        # 重置某一特定控件
|  ├── Terminate                    # 终断实验
|  ├── Recycle Data Line            # 挂起当前Datsouce数据行稍后执行
|  └── Null action                  # 啥也不干
├── Trigger
|  ├── Timer                        # 计时器
|  ├── InvisibleBoundry             # 当注视位置落入特定边界内触发
|  ├── Conditional                  # 条件触发
|  ├── EyeLinkButton                # Eyelink反应手柄触发
|  ├── CedrusInput                  # Cedrus反应盒触发
|  ├── Keyboard                     # 键盘触发
|  ├── TTL                          # 接收到特定TTL信号的时候触发
|  ├── triggerSerialPortMessageTip  # 穿口信号触发
|  ├── Mouse                        # 鼠标点击触发
|  ├── Fixation                     # 发生注视时触发
|  ├── Saccade                      # 发生扫视时触发
|  ├── Blink                        # 发生眨眼时触发
|  ├── SampleVelocity               # 眼球运动达到特定速度时触发
|  └── Voice Key                    # 采集到声音时触发
└── Other
   ├── Accumulator                  # 加法器
   ├── Variable                     # 定义变量
   └── ResultFile                   # 创建一个ResultFile

1.9 工作区

eb_workspace

这一部分非常简单,工作区就是编辑实验的地方,具体内容和1.7 工作区标签对应。

1.10 导航器

eb_navigator_panne

帮助我们快速了解当前工作区的上级结构。


2. 查阅操作手册

遇事不决查Manual。——王治国

关于Experiment Builder的全部问题,在Manual里面几乎都可以找到答案。

在我学习软件的时候,曾经将英文手册翻译为中文。虽然后面没有再查阅过中文的操作手册,但是英译汉的过程给我带来了极大的技能提升。

在我们安装好Experiment Builder时,Manual就已经被同步拷贝到我们的电脑上了。

您可以通过一下两种方式打开用户手册:

eb_call_content

  • 如上图所示,在Experiment Builder中打开。点击菜单栏“Help -> Content”,或者直接按F1打开电子版操作手册。

eb_start_manua

  • 或者您也可以在开始菜单中找到.pdf格式的用户手册。如上图所示,依次点击“开始 -> SR Research -> ExperimentBuilder User Manual”即可打开。

3. 实验程序编写逻辑

3.1 基本流程图

在介绍Experiment Builder时,我会说这是一个功能强大的可视化编程工具。

提起编程,我们可能以为是下面这样的:

def click_load_button():

    global log_file_path

    log_fp = filedialog.askopenfilename()

    # 设置显示的路径内容
    find_index = log_fp.count('/') - 3
    count_num = 0
    for i in range(0,len(log_fp)):
        if log_fp[i] == '/':
            count_num = count_num + 1
            if count_num == find_index:
                break
    path_2_show = '...' + log_fp[i:len(log_fp)]
    ttk.Label(monty3, text="             ").grid(column=4, row=0, columnspan=2, sticky='W')
    ttk.Label(monty3, text=path_2_show).grid(column=4, row=0, columnspan=6, sticky='W')

    # 获取文件的绝对路径
    find_index = log_fp.count('/')
    count_num = 0
    for i in range(0,len(log_fp)):
        if log_fp[i] == '/':
            count_num = count_num + 1
            if count_num == find_index:
                break
    log_file_path = log_fp[0:(i+1)]

上面这样就是代码编程,需要系统的学习才可以完成。

好在EB用的并不是这样的方法,EB将常用的功能封装成了名为控件的黑盒,我们只需要在Propreties面板中设置相应控件的参数即可。无需担心控件内部的每一步是怎么工作的。

下图就是EB编写程序的方式——流程图

eb_workspace

在编写实验的过程中,我们将控件托放到工作区,以合适的逻辑关系链接起来,构成实验。

在上图所示的例子中:

  • 实验进程从START开始
  • 然后第二行的DISPLAY_SCREEN工作,呈现我们事先设定好的刺激内容;
  • 刺激内容呈现完毕后,等待第三行中的Trigger被触发。我们可以看,第二行的DISPLAY_SCREEN同时链接了三个TriggerTIMEREL_BUTTONEL_KEYBOARD。三个Trigger会同时等待触发信号,当三个当中的任意一个触发事件发生时,则根据箭头的连接继续进行实验。即运行DISPLAY_BLANK

我们可以总结一下上面几个控件实现的功能:

呈现刺激后,等待被试通过Eyelink反应手柄或者键盘进行行为反馈,接收到反馈信息后,清空显示的内容,呈现空屏幕。但是如果被试没有在规定的限制时间内给予反馈,则计时结束后直接呈现空屏。

Experiment Builder就是通过这样的方式完成实验程序编写的。

3.2 实验的典型结构

打开我们在本文第二节提到的操作手册,可以在“6.1 Hierarchical Organization of Experiment”中看到下图:

eb_hierarchical_org

一个典型的眼动实验就是分为这样四层的套娃结构。

  • Experiment - 代表整个实验,由指导语结束语和一个或多个Block组成。

  • Block - 实验组。当我们由于一些特殊需求将整个实验拆分成多个小块进行时,每个小块就是一个Block。常见的拆分原因有:实验中途需要休息、设定几个试次为练习部分、特殊的实验设计等。单个BlockCamera Setup和多个Trial组成。

  • Trial - 试次,是实验的最小循环单位。包括从电脑读取呈现的材料、呈现刺激材料并记录眼动数据的一整个过程。

  • Recording - 真正记录眼动数据的部分。在这里面编写实验的刺激的内容和被试反馈等。

关于Trial和Recording的关系,我认为有必要拿出来单独讲解一下。

我们假设一个自定步速阅读的实验,一共50个Trial,每个Trial内给被试看一个语篇,被试看完之后按空格出现下一篇。

Trial的定义来看,整个实验的最小循环单位看似是“呈现语篇 -> 被试按键”,实则不然。

从计算机层面来看,实验的最小循环单位是:“加载一会要呈现的语篇 -> 漂移矫正 -> 呈现语篇 -> 被试按键”。

即“呈现语篇 -> 被试按键”的过程仅仅是RecordingTrial要多出一些计算机后台的操作。

那么,在Experiment Builder中编程就是按照自己的实验设计,依照层级结构,将不同的实验控件连接成流程图


4. 创建我的第一个实验

点击菜单栏“File -> New

eb_new_poject

跳出新建窗口:

eb_new_poject_2

四行设置从上到下依次是:

  • Project Name - 实验项目的名称。

  • Project Location - 保存的位置。

  • Templates - 创建实验使用的模板。如果选择None则创建一个空文件,如果选择Eyelink_Template.ebz则打开实验模板。

  • Eyelink Experiment - 是否是一个Eyelink的眼动实验。如果选True,则需要选择眼动仪的具体型号,Current为自动识别。

点击OK则执行创建操作,此时会提示下图所示的窗口,告诉我们不要对实验文件夹内的文件执行新增或者删除的操作。

eb_new_poject_3

这一点很重要,是Experiment BuilderE-Prime的一个很大的区别。

点击确定后,我们的第一个实验就创建好了!

eb_new_poject_4

5. 文件结构

创建好的实验存放在同名的文件夹中,以我的实验为例,我将其储存在桌面的话,桌面就会增加一个名为“my_first_exp”的文件夹。文件夹内详细结构如下:

├── my_first_exp                 
|  ├── datasets                     # Datasource文件
|  ├── library                      # 素材库,包括音频、图片等。
|  ├── myfiles                      # 非程序运行相关的文件
|  ├── results                      # 运行结果文件
|  ├── graph.ebd                    # 实验程序
|  ├── graph.ebd.bak                # 上一次保存的实验程序备份
|  └── Preference.properties        # 偏好设置文件

以上。