Hi,
I have an experiment (an n-back task) in which participants are shown a letter for 0.5 seconds followed by a 2 second blank screen. In each trial, participants have to press spacebar if the letter shown is the SAME as that shown just before and otherwise not respond. I want to code it so that the reaction time (from the beginning of the presentation of the letter to the spacebar press) is recorded.
Currently I have done so using two methods:
(1) Just doing nback_clock.reset() and then nback_clock.gettime() when the spacebar is pressed
(2) recorded keys_n.rt. When I look at the csv, they are different, with the (1) method being slower. I have put my code below and just wanted to check that the way I was doing it was correct or if there were any suggestions as to the correct way to do this. I am on OSX.
Side note: should the port writing (I’ve marked it with “#PORT_WRITING”) be call on flip or simply port.write?
I would appreciate any help, thank you!
for version in range(0, 3):
loop = version+1
filename = 'nback_letters' + str(loop) + '.csv'
letter_list = list(chunks(pd.read_csv(filename)['letters'].tolist(), 30))
correct_answers = list(chunks(pd.read_csv(filename)['corrAns'].tolist(), 30))
if loop == 2:
showimage(win, 'twobacktaskinstructions.png',size=(1.7, 1.9))
if loop == 3:
showimage(win, 'threebacktaskinstructions.png',size=(1.7, 1.9))
for (a,b) in zip(letter_list, correct_answers):
block_number = letter_list.index(a)
fixation_cross(1)
win.callOnFlip(port.write, baseline_triggersnback[version].encode())
blank(20)
win.callOnFlip(port.write, start_block_triggers[version].encode())
for j in range(0, len(a)):
nback_start = datetime.now()
if kb.getKeys(keyList=['escape']):
shutdown()
corrAns = b[j]
thisLetter = a[j]
letter_present = TextStim(win, text=thisLetter, height=0.5)
# Use clock-based timing
nback_clock.reset()
start_marker_sent = False
key_pressed = False
win.callOnFlip(nback_kb.clock.reset)
while nback_clock.getTime() < 2.5: # HOW LONG TO MAKE TRIALS
if nback_clock.getTime() < 0.5:
letter_present.draw()
if start_marker_sent == False:
win.callOnFlip(port.write, start_triggers[version].encode()) #PORT_WRITING
start_marker_sent = True
else:
blank_.draw()
win.flip()
if key_pressed == False:
keys_n = nback_kb.getKeys(keyList = ['space'], waitRelease=False)
RT2 = '0'
if len(keys_n) > 0:
key_pressed = True
RT2 = nback_clock.getTime()
port.write(stop_triggers[version].encode())
if key_pressed == False:
response = 'none'
RT = '0'
if str(corrAns) == 'none':
answer = 1
else:
answer = 0
elif key_pressed == True:
response = str(keys_n[-1].name)
RT = str(keys_n[-1].rt)
if str(corrAns) == response:
answer = 1
elif str(corrAns) != response:
answer = 0
else:
answer = 'error'
# Saving trial data
thisExp.addData('Version',loop)
thisExp.addData('N back RT',RT)
thisExp.addData('N back RT2',RT2)
thisExp.addData('Stimulus presented',thisLetter)
thisExp.addData('N back response',answer)
thisExp.addData('N back start',nback_start)
thisExp.addData('Key pressed', response)
thisExp.addData('Trial number', j)
thisExp.addData('Block number', block_number)
thisExp.nextEntry()