python-3.x - Dual Task 中的同时响应收集
问题描述
我正在尝试执行双重任务。这两个任务都要求判断一个数字。刺激以可变的间隔(a_soa
)一个接一个地出现。我需要收集对键盘上给出的刺激的反应时间(第一个任务:y 或 x 键;第二个任务:或 . 键)。我目前正在努力实现这一点,因为对于第一个任务,程序需要在第二个任务甚至绘制之前开始等待响应。然后第二个刺激出现并标志着对第二个任务的可能反应的开始。
我正在使用的两个函数和主要函数的代码都包含在下面。
def StimPresent(a_soa, b_s1, c_s2):
"""
Function StimPresent(a, b, c) presents stimulus_1 (b) for SOA ((a) number of frames),
then it adds stimulus_2 (d) and shows both for max 60 frames
and returns time of stimulus onset (tim)
"""
if event.getKeys(keyList='escape'):
myWin.close()
core.quit()
for frameN in range(a_soa):
b_s1.draw()
fixation.draw()
if frameN == 0: # RT S1 starting immediately after flip
onsetS1 = RT1.getTime()
myWin.flip()
for frameN in range(a_soa, (a_soa+60)):
b_s1.draw()
fixation.draw()
c_s2.draw()
if frameN == (a_soa+1):
onsetS2 = RT2.getTime() #RT S2 starting immediately after soa flip
myWin.flip()
for frameN in range((a_soa+60), 300):
fixation.draw()
myWin.flip()
return [b_s1, onsetS1, c_s2, onsetS2, a_soa]
def GetRTs(onS1, onS2):
allkeys = []
event.clearEvents()
while len(allkeys)!=2:
if event.getKeys(['y']):
buttonR1 = 55
allkeys.append(buttonR1)
buttonR1Time = RT1.getTime()
theRT1 = buttonR1Time - onS1
elif event.getKeys(['x']):
buttonR1 = 44
allkeys.append(buttonR1)
buttonR1Time = RT1.getTime()
theRT1 = buttonR1Time - onS1
else:
buttonR1 = 666
allkeys.append(buttonR1)
buttonR1Time = 'NaN'
theRT1 = 'NaN'
if event.getKeys(','):
buttonR2 = 44
allkeys.append(buttonR1)
buttonR2Time = RT2.getTime()
theRT2 = buttonR2Time - onS2
elif event.getKeys('.'):
buttonR2 = 55
allkeys.append(buttonR1)
buttonR2Time = RT2.getTime()
theRT2 = buttonR2Time - onS2
else:
buttonR2 = 666
allkeys.append(buttonR1)
buttonR2Time = 'NaN'
theRT2 = 'NaN'
if RT2.getTime() - onS2 > 210:
break
elif event.getKeys(['escape']):
myWin.close()
core.quit()
return [buttonR1, buttonR1Time, buttonR2, buttonR2Time, theRT1, theRT2]
主程序
for b in range(block < 2):
for thisTrial in trials:
"""
---------------------
Start des Durchgangs
---------------------
"""
RSIFix()
showChar = StimPresent(thisTrial.SOA, thisTrial.Stimulus_1, thisTrial.Stimulus_2)
s1 = showChar[0]
s1onset = showChar[1]
s2 = showChar[2]
s2onset = showChar[3]
soa = showChar[4]
responses = GetRTs(s1onset, s2onset)
谢谢你的帮助 :)
解决方案
非常感谢,您的评论帮助了我!我用键盘类重写了代码,但现在我遇到了另一个问题:该函数只返回 666 作为 buttonR1Code 和 buttonR2Code。仅当收集到现在的响应时才应提供这些信息。我怎样才能解决这个问题?有什么建议么?
def StimPresent(a_soa, b_s1, c_s2):
"""
Function StimPresent(a, b, c) presents stimulus_1 (b) for SOA ((a) number of frames),
then it adds stimulus_2 (d) and shows both for max 60 frames
and returns time of stimulus onset (tim)
"""
kbR1 = keyboard.Keyboard()
kbR2 = keyboard.Keyboard()
allkeys = 0
while allkeys < 2:
if event.getKeys(keyList='escape'):
myWin.close()
core.quit()
for frameN in range(a_soa):
b_s1.draw()
fixation.draw()
if frameN == 0: # RT S1 starting immediately after flip
onsetS1 = RT1.getTime()
kbR1.clock.reset()
keyR1 = kbR1.getKeys(['y', 'x'], waitRelease=True)
if keyR1 == 'y':
buttonR1 = 55
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
elif keyR1 == 'x':
buttonR1 = 44
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
myWin.flip()
for frameN in range(a_soa, (a_soa+60)):
b_s1.draw()
fixation.draw()
c_s2.draw()
if frameN == (a_soa+1):
onsetS2 = RT2.getTime() #RT S2 starting immediately after soa flip
kbR2.clock.reset()
keyR1 = kbR1.getKeys(['y', 'x'], waitRelease=True)
keyR2 = kbR2.getKeys(['.', ','], waitRelease=True)
if allkeys == 0:
if keyR1 == 'y':
buttonR1 = 55
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
elif keyR1 == 'x':
buttonR1 = 44
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
if allkeys == 1:
if kbR2.getKeys(keyList=['.'], waitRelease=True):
buttonR2 = 55
allkeys += 1
buttonR2Iden = kbR2.name
buttonR2Dur = kbR2.duration
theRT2 = kbR2.rt
elif kbR2.getKeys(keyList=[','], waitRelease=True):
buttonR2 = 44
allkeys += 1
buttonR2Iden = kbR2.name
buttonR2Dur = kbR2.duration
theRT2 = kbR2.rt
myWin.flip()
for frameN in range((a_soa+60), 300):
fixation.draw()
deadlineS1 = 210
deadlineS2 = 210
keyR1 = kbR1.getKeys(['y', 'x'], waitRelease=True)
keyR2 = kbR2.getKeys(['.', ','], waitRelease=True)
if allkeys == 0:
if keyR1 == 'y':
buttonR1 = 55
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
elif keyR1 == 'x':
buttonR1 = 44
allkeys += 1
buttonR1Iden = keyR1.name
buttonR1Dur = keyR1.duration
theRT1 = keyR1.rt
elif frameN > deadlineS1:
buttonR1 = 666
allkeys += 1
buttonR1Iden = 'NaN'
buttonR1Dur = 'NaN'
theRT1 = 'NaN'
if allkeys == 1:
if kbR2.getKeys(keyList=['.'], waitRelease=True):
buttonR2 = 55
allkeys += 1
buttonR2Iden = kbR2.name
buttonR2Dur = kbR2.duration
theRT2 = kbR2.rt
elif kbR2.getKeys(keyList=[','], waitRelease=True):
buttonR2 = 44
allkeys += 1
buttonR2Iden = kbR2.name
buttonR2Dur = kbR2.duration
theRT2 = kbR2.rt
elif frameN > deadlineS2:
buttonR2 = 666
allkeys += 1
buttonR2Iden = 'NaN'
buttonR2Dur = 'NaN'
theRT2 = 'NaN'
myWin.flip()
return [b_s1, onsetS1, buttonR1, buttonR1Iden, buttonR1Dur, theRT1, c_s2, onsetS2, buttonR1, buttonR1Iden, buttonR1Dur, theRT2, a_soa]
谢谢 :)
推荐阅读
- reactjs - 如何从反应钩子中的字符串动态执行useState?
- html - 移动友好的导航栏
- linux - 从文件夹中的所有文件中提取 200 行
- r - Highcart R 中的 qqcomp() 和 ppcomp()
- memory - JVM初始堆内存分配
- excel - 如何根据excel中输入的日期计算一个月(周末和美国公众假期除外)的天数百分比?
- visual-c++ - 无法在我的应用程序中更改对话框的颜色
- swift - 我想为每个 ViewController 设置不同的自定义堆叠按钮类的按钮文本
- google-apps-script - MailApp AppScript:如何使用 MailApp 向线程发送电子邮件?
- c# - C# Windows 窗体 - 正常应用过滤器到图像但使用线程得到 NullReferenceException