首页 > 解决方案 > 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)

谢谢你的帮助 :)

标签: python-3.xpsychopy

解决方案


非常感谢,您的评论帮助了我!我用键盘类重写了代码,但现在我遇到了另一个问题:该函数只返回 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]

谢谢 :)


推荐阅读