查看: 49849|回复: 75
打印 上一主题 下一主题

[Python] Python心理学实验编程入门【视频课程】 ? [复制链接]

Rank: 3Rank: 3

水晶
350
心级
81
精华
1
主题
3
帖子
19
跳转到指定楼层
楼主
发表于 2016-8-2 17:53:53 |只看该作者 |倒序浏览
本帖最后由 mianwangming 于 2016-11-17 19:54 编辑

Python是一门易学、易用的高级语言,在心理学实验研究中的应用日渐广泛。使用Python,我们可以实现E-Prime等商业软件所无法实现的复杂实验功能。自2014年起,我们一直在杭州师范大学开设免费的暑期课程。今年,我们把相关课程的主要内容录制视频,并上传至Youku和百度云。所有课件、视频、代码都是免费开源的,欢迎感兴趣的同学下载、学习和散播。


目前视频涵盖的内容主要有:

1. 使用Pygame和Psychopy生成和控制视、听觉刺激。

2. 收集被试的反应和记录实验数据。

3. 使用Python完成眼动实验(Eyelink,以及部分与ASL相关的内容)。

4. 与脑电(EEG)和核磁共振(MRI)设备的整合(串口、并口通讯)。


目前的视频课程主要介绍一些入门的技术,内容仍在不断扩充之中。欢迎大家就自己感兴趣的实验技术发邮件请求,我们会录制相关视频并上传示例代码。


Youku播单地址:http://list.youku.com/albumlist/ ... &ascending=1&page=1

视频的云盘下载地址:https://pan.baidu.com/s/1pKQdZzP

课件、代码下载地址:http://pan.baidu.com/s/1slQWihJ

QQ群:370824713(示例代码更新及时)


更新:
2016.08.04:如果软件安装方面出现问题,请参考第24段视频“PsyPy_24: 安装psychopy”,有演示和解答。

2016.08.09:眼动仪厂商ASL于近期破产,碰巧Macquarie有一台Eye-Trac 6。已经在QQ群上传代码来实现Python与ASL的交互。这些代码主要涉及:a)从串口读取ASL传出来的眼动数据(ASL_routine.py);b) 从ASL主机通过串口通讯控制被试机呈现calibration targets(calibration_trigger_demo.py);c)通过并口通讯从被试机控制ASL打开/关闭数据文件、开始/停止记录数据(trial segmentation),以及发送event marker(ASL_XDAT_demo.py);d) 通过串口传送head-tracker(Optrotrak或其他motion-tracking设备)的位置信息,以实现不受头动限制的眼动追踪(write_transformations_2ASL.py)。

2016.08.12:Pygame的Mac安装问题“ImportError: dlopen(pygame/base.so, 2)。该问题是因为Mac操作系统引入了“System Integrity Protection”,需要禁用。具体见:http://stackoverflow.com/questions/33196196/pygame-broke-down

2016.10.10:使用Psychopy时Eyelink的校准(calibration)是个难题。使用Pygame时,可以使用pylink自带的EyelinkCoreGraphicsPygame。根据这个库文件,使用Psychopy编写的校准routine,已经上传到QQ群共享。欢迎大家试用。

2016.11.17:EPD在Enthought的官网已经无法下载。有同学询问在Windows环境下,如何使用Canopy + IDLE来写代码。具体的解决方案已经上传到QQ群共享(文件名:psychopy_installation.txt)。

王治国

杭州师范大学认知与脑疾病研究中心研究员

Email: z.wang@hznu.edu.cn

RG Profile: https://www.researchgate.net/profile/Zhiguo_Wang6














附件: 你需要登录才可以下载或查看附件。没有帐号?注册

点评

hcp4715 ?经常更新,太赞了!? 发表于 2016-8-15 05:45:51
已有 16 人评分心级 水晶 收起 理由
多云的地盘 + 1 赞一个!
benpao + 1 赞一个!
飞翔的红色火车 + 1 谢谢分享
tok255 + 1 很给力!
闲看花落 + 1 赞一个!
溥淬竹语 + 1 很给力!
gw0205 + 1 谢谢分享
hsdcn + 5 赞一个!
吱嗯_吱咀哟 + 1 刚好需要 赞!
alma2004 + 1 很给力!

总评分:?心级 + 5? 水晶 + 161? ?查看全部评分

转发到微博

Rank: 3Rank: 3

水晶
2282
心级
432
精华
0
主题
75
帖子
356
沙发
发表于 2016-8-2 20:34:47 |只看该作者
点个赞
不以物喜,不以己悲。

Rank: 7Rank: 7Rank: 7

水晶
6173
心级
2741
精华
4
主题
38
帖子
2336
板凳
发表于 2016-8-3 05:29:54 |只看该作者
支持,顺便提一下我原来写的一个示例程序,请各位滴油不吝批评指正用PsychoPy编写实验程序的示例(爱荷华赌博任务)
空里流霜不觉飞,汀上白沙看不见。

Rank: 3Rank: 3

水晶
350
心级
81
精华
1
主题
3
帖子
19
地板
发表于 2016-8-3 06:58:34 |只看该作者
空里流霜 发表于 2016-8-3 05:29
支持,顺便提一下我原来写的一个示例程序,请各位滴油不吝批评指正用PsychoPy编写实验程序的示例(爱荷华赌 ...

代码写得不错,这个任务很复杂,代码已经比较精简了。几点建议,1) 可以创建一个draw card的函数,这样代码可以更精简一点;2) trial control建议先定义一个trial list,像E-prime那样,这样随机起来非常方便。我在这里贴一段简要的示例代码,主要演示一下整个实验的structure,希望能有所启示。

# Simon effect
# import libraries
import sys, random, os, time
from psychopy import visual, core, event
from sys import maxint

##from ctypes import windll
### routine to send event triggers to EEG
##p = windll.inpout32
##def send_code(code):
##? ? p.Out32(0x378, code)
##? ? time.sleep(0.006)
##? ? p.Out32(0x378, 0)
##? ? time.sleep(0.01)
def send_code(code): pass

# get subject info
def get_subj_info():
? ? subj_id = raw_input('Subject ID: ')
? ? subj_name = raw_input('Subject Name: ')
? ? subj_gender = raw_input('Subject Gender (m/f): ')
? ? subj_age = raw_input('Subject Age: ')
? ? return [subj_id, subj_name, subj_gender, subj_age]
subj = get_subj_info()

# create a window
win = visual.Window((1024, 768), units='pix', fullscr=False)

# some constants
left = (-200, 0)
right = (200, 0)
red = (1.0, -1.0, -1.0)
blue = (-1.0, -1.0, 1.0)
black = (-1.0,-1.0,-1.0)
white = (1.0,1.0,1.0)

random.seed = 1000

# trial list
trials = [['L', 'R', 'z', 1],
? ?? ?? ? ['L', 'B', '/', 2],
? ?? ?? ? ['R', 'R', 'z', 3],
? ?? ?? ? ['R', 'B', '/', 4]]

text_msg = visual.TextStim(win, text='message')
tar_stim = visual.GratingStim(win, tex='None', mask='circle', size=60.0)

# run a single trial
def run_trial(pars, data_file, subj_info):
? ? """ pars should be list that specifies the
? ? location and color of the stimulus, as well as
? ? the correct key response, such as ['R', 'B', '/']"""
? ? l, c, cor_resp, trig = pars
? ? if l == 'R': loc = right
? ? if l == 'L': loc = left
? ? if c == 'R': col = red
? ? if c == 'B': col = blue

? ? # present the fixation
? ? text_msg.setText('+')
? ? text_msg.draw()
? ? win.flip()
? ? core.wait(0.750)

? ? # present the target
? ? tar_stim.setColor(col)
? ? tar_stim.setPos(loc)
? ? tar_stim.draw()
? ? win.flip()
? ? send_code(trig)
? ? tar_resp = event.waitKeys(1500, ['z', 'slash'],timeStamped=True)
? ? print tar_resp

? ? # write data to file
? ? trial_data = subj_info + pars + list(tar_resp[0])
? ? trial_data = map(str, trial_data)
? ? trial_data = ','.join(trial_data) + '\n'
? ? data_file.write(trial_data)
? ?
? ? win.setColor(black)
? ? win.flip()
? ? core.wait(0.500)

#### real experiment starts here
# open a data file
if not os.path.exists('data_file'): os.mkdir('data_file')
d_file = open('data_file/' + '_'.join(subj[:2]) +'.csv', 'w')

# show the instructions
text_msg.setText('Press Z to RED, press / to BLUE. Press to start')
text_msg.draw()
win.flip()
event.waitKeys(maxint, keyList=['space'])

test_trials = trials[:]*2
random.shuffle(test_trials)

for t in test_trials:
? ? run_trial(t, d_file, subj)

# close data file
d_file.close()

# exit
sys.exit()
已有 2 人评分水晶 收起 理由
lxr0624 + 1 很给力!
admin + 40 谢谢分享

总评分:?水晶 + 41? ?查看全部评分

Rank: 7Rank: 7Rank: 7

水晶
6173
心级
2741
精华
4
主题
38
帖子
2336
5
发表于 2016-8-3 07:02:43 |只看该作者
mianwangming 发表于 2016-8-2 17:58
代码写得不错,这个任务很复杂,代码已经比较精简了。几点建议,1) 可以创建一个draw card的函数,这样代 ...

多谢老师指点!O(∩_∩)O
空里流霜不觉飞,汀上白沙看不见。

Rank: 3Rank: 3

水晶
4223
心级
369
精华
0
主题
10
帖子
277
6
发表于 2016-8-3 08:36:02 |只看该作者
王老师大赞!
已有之事,后必再有!

新滴友

weird

Rank: 2

水晶
1048
心级
78
精华
0
主题
0
帖子
43
7
发表于 2016-8-3 09:14:45 |只看该作者
好棒!学起~
努力成为科学家~

Rank: 3Rank: 3

水晶
5069
心级
364
精华
0
主题
13
帖子
210

红企鹅 Medal No.1 Medal No.2 Medal No.3 Medal No.4 Medal No.5 魔棒

8
发表于 2016-8-3 09:29:20 |只看该作者
赞一个先。

Rank: 3Rank: 3

水晶
409
心级
125
精华
0
主题
6
帖子
106
9
发表于 2016-8-3 09:30:00 |只看该作者
必须赞赞赞赞~~~~~~~~~~~~~~~~~~

Rank: 3Rank: 3

水晶
1021
心级
330
精华
0
主题
17
帖子
242
10
发表于 2016-8-3 20:31:52 |只看该作者
谢谢老师的教程,先收藏了,回学校就好好研究下
try my best
您需要登录后才可以回帖 登录 | 注册

bottom

Powered by Discuz! X2

? 2001-2011 Template By Yeei. Comsenz Inc.

回顶部