感谢Toki在我学习Python过程中提供的帮助与支持,特此鸣谢!

下载链接:vac(0zur)

vac是Charlie编程时自用的小工具,计算结果仅供参考。同时也欢迎大家进行对比计算,帮助Charlie提高计算准确性。


0. 简介

tools_vac_teaser

Charlie由于工作的缘故,经常会涉及到各种各样的编程任务,其中不乏大量的视觉搜索范式和文字范式。

阅读任务中,选择合适的字号大小,保证三个字母占一度视角。

三个字母占一度视角到底是多大的字号?这简直让人头秃。

视觉搜索任务中,所有Target在屏幕上以一个直径为10°视角的圆均匀分布。

一部分理解这句话的同学会立即拿出铅笔,在小本本上疯狂计算。还有一部分同学完全不知道该怎么计算所有Target在屏幕上呈现的坐标。最后几个聪明的同学找到了自己学理工类专业的男朋友帮忙;P

当然这些对于Charlie来说都不是大问题,根据需要算出来就好。可问题是这个东西即使知道如何计算,还是要耗费精力来计算。而且手算容易有错误,反复检查又太耗精力。

受到某校的字号计算Excl启发,Charlie决定自制一个小计算器VAC来让自己轻松一下,顺便学习下Python。

这就是制作这个小工具的初衷。


1. 字号计算器

tools_vac_teaser

精细阅读任务中,无论是常规的篇章阅读还是边界触发等范式,我们通常会控制字体的大小来控制被试在阅读过程中所能获得信息的水平。其中控制每度视角3-4个英文字符或者每度视角1-2个中文字符比较常见。

阅读任务大多使用固定头部的采集模式,来确保被试到显示器的距离恒定。

依次在VAC中输入:

  • 显示器的分辨率 - 实验编程时设置的分辨率,单位像素 - 1024×768为例
  • 物理尺寸 - 实验运行起来后显示范围的物理尺寸,单位毫米 - 375mm×305mm为例
  • 被试眼睛到显示器的距离 - 单位毫米 - 625mm为例
  • 字符类型 - 中文/英文 - 英文为例
  • 每度视角的字符个数 - 3字符/°为例

tools_vac_character_size_calculator


2. 环形排列计算器

tools_vac_surround

2.1 单个Target

这种情况适用于将特定Target放到特定的位置的情况。我们需要提前知道这个位置关于屏幕的极坐标,即距屏幕中心的距离是多少,与屏幕中心的连线偏离12点钟方向多少度。

以上图的蓝点为例,蓝点距离屏幕中心5.1°视角,与屏幕中心的连线偏离12点方向90度。蓝点本身是一个直径为2°的圆。

假设屏幕尺寸和被试距屏幕的距离和上节相同,我们可以这样填写:

tools_vac_surround_single_target

注意“Target Count”填“1”,即1个Target。

结果中的坐标为Target的坐标,大小为Target的宽和高。

有些时候呈现大的面孔图片会不需要计算Target Size,那么直接随便填写为1就好,近参考坐标数据。

细心的同学可能注意到,明明我们设置的Target大小为谁平竖直都是2°,为什么计算出来的结果水平和竖直的像素大小不同呢?

这是由于液晶显示器的物理特性导致的,显示器上面每一个像素都不是正方形,而是一个竖着的长方形。因此我们想要显示一个正方形时,就需要水平方向的像素大小略大于竖直方向。

2.2 多个Target

当然视觉搜索任务是不会只呈现一个Target的,通常为4-8个,那么我们来增加Target的数量。

以6个为例,将Target Count设置为6,将“顺时针偏移角度”设置为0。

tools_vac_surround_multi_target

可以看到计算出了6个Target各自的坐标和各自的大小。


3. Message Savior

在这里Charlie要强调的是,这个功能属于补救性措施,为了救救孩子而存在,结果仅供参考。

“宋工,我的数据忘记打Message了,是不是废了!?”

“莫慌,宋工有办法”

对于初学者总会犯的一个错误就是没有在编程的时候设置Message,导致数据中没有标记,不能做数据分段,自然也就无法处理数据。

Charlie为了帮助这些同学也是操碎了心,开发了这个Message Savior的功能,只要是使用EB软件编写的程序,即使开始的时候没有打Message,Charlie也能帮你把Message找回来。

首先我来构建一个EB程序,非常简单的“学习-再认”范式。首先被试会看四幅面孔的图片,稍厚会再呈现一张,被试需要判断新出现的图片是否在刚刚呈现过的四张中。

tools_vac_learn_n_recognize

在这样饿任务中,我们需要将数据分割成“学习”和“再认”两个InterestPeriod来处理。如果没有提前设置Message的话,就没办法分割IP。

但实际上,在程序的运行过程中会有一个.log日志文件,在这个文件中记录了何时运行了哪一个控件,因此我们可以透过这个日志文件来计算出什么时候被试在学习四幅面孔,什么时候在再认。

在和每个.edf相同的路径下,都有一个叫做eb_messages.log的文件,打开后可以看到里面的内容如下:

8342.900 ********************************************************
8342.981 ** Session beginning Tuesday May 26, 2020 11:02:42 AM **
8342.992 ** ExperimentBuilder Project : Test **
8343.001 ** ExperimentBuilder Version : 2.2.299 **
8343.010 ** ExperimentBuilder Build   : Jan  7 2020 **
8343.018 ********************************************************
8343.029 TRACKER_TIME 0 1006848.521
8762.134 DISPLAY_SCREEN DISPLAY_SCREEN (BEGIN) 
8776.086 DISPLAY_SCREEN DISPLAY_SCREEN
15156.996 KEYBOARD KEYBOARD
15177.044 Choose_Trial Block.Choose_Trial (BEGIN) 
15192.773 Choose_Trial Block.Choose_Trial
15871.535 KEYBOARD Block.KEYBOARD
15871.637 CONDITIONAL Block.CONDITIONAL_FALSE
15871.742 CONDITIONAL[1] Block.CONDITIONAL[1]_FALSE
15871.806 CONDITIONAL[2] Block.CONDITIONAL[2]_TRUE
248045.644 TRACKER_TIME 1 1246551.215
248045.662 EL_CAMERA_SETUP Block.EL_CAMERA_SETUP
248062.648 Blank Block.Blank (BEGIN) 
248076.768 Blank Block.Blank
248096.065 Choose_Trial Block.Choose_Trial (BEGIN) 
248110.138 Choose_Trial Block.Choose_Trial
250636.884 KEYBOARD Block.KEYBOARD
250636.952 CONDITIONAL Block.CONDITIONAL_TRUE
250661.681 Greet_of_Img Block.Greet_of_Img (BEGIN) 
250676.772 Greet_of_Img Block.Greet_of_Img
278406.999 KEYBOARD[2] Block.KEYBOARD[2]
278407.143 SetValueAction 
278407.169 SetValueAction 
……

“250636.884 KEYBOARD Block.KEYBOARD”即为在250636.884ms时,名为KEYBOARD,路径为Block.KEYBOARD的控件工作了。

所以我们从中找到我们在EB中设置好的控件名称:

311497.320 DRIFT_CORRECT Block.Img.DRIFT_CORRECT
311594.595 Learn Block.Img.Img_Recording.Learn (BEGIN) 
311610.285 Learn Block.Img.Img_Recording.Learn
316585.344 TIMER Block.Img.Img_Recording.TIMER
316594.659 Recognize Block.Img.Img_Recording.Recognize (BEGIN) 
316610.302 Recognize Block.Img.Img_Recording.Recognize
318541.213 KEYBOARD Block.Img.Img_Recording.KEYBOARD

其中:

  • Block.Img.Img_Recording.Learn - 学习阶段的开始
  • Block.Img.Img_Recording.TIMER - 学习阶段结束
  • Block.Img.Img_Recording.Recognize - 再认阶段开始
  • Block.Img.Img_Recording.KEYBOARD - 再认阶段结束

所以我们把这四条内容分别填入VAC-MessageSavior的四行中,注意不要填“(BEGIN)”的部分。

后面对应填入我们想要补的Message内容,根据个人习惯添加。

tools_vac_ms_fill_table

随后点击Load,找到需要补Message的.edf的路径,选中eb_message.log加载。

tools_vac_ms_choose_logfile

可以看到已经加载到了.log文件。由于Charlie是用MacOS来编写教程,界面和能有差异,但在Win上的操作都是相同的。

tools_vac_ms_loaded

点击Run,很快会提示“已完成”。

tools_vac_ms_runed

这个时候我们可以看到文件路径下增加了一个“msg_add.txt”的文件。

在DV中右键点击目标.edf文件,选择“Import Message List”,选中刚刚生成的”msg_add.txt”,点击OK,就可以看到我们补救的Message了。

可以看到相较于程序的Message,我们补救的Message会有几毫秒的误差,对数据的影响可以忽略不计。

tools_vac_ms_mesages

需要注意的是,我们需要对忘记打Message的实验的每个.edf单独进行Message补救,如果您采集了50个被试,就需要执行50次Run和50次AddMessageList。虽然麻烦点,但总比数据废掉好多了。


以上。

分类:

更新时间: