class Interval(object): def __init__(self, win): frameRate = win.getActualFrameRate() # could be None. What then ? self.frameRate = frameRate / 2 self.frameDuration = 1.0 / round(self.frameRate) self.win = win self.isi = StaticPeriod(screenHz=self.frameRate, win=win) def start(self): self.isi.start(self.frameDuration) def complete(self): self.isi.complete()
def testStaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete()==1 static.start(0.1) wait(0.11) assert static.complete()==0
def display_outcome(self): # update text onscreen self.display.set_target_text(self.which_target, str(self.pts_this_trial)) self.score += self.pts_this_trial self.display.set_score(self.score) # refresh screen self.outcome_sound.play() self.mark_event('outcome', channel=5) # during static period, code between start and complete will run iti = StaticPeriod() iti.start(self.outcome_delay) self.display.draw() iti.complete() # remove text overlay on target self.display.set_target_text(self.which_target, '')
def show_phased(self, phase): isi = StaticPeriod(screenHz=self.afr, win=self.window) for frame in self.movie: if event.getKeys('escape'): raise UserAbortException() isi.start(self.mspf) self.instance.image = Image.fromarray(frame) self.instance.draw() self.window.flip() isi.complete()
def testStaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete()==1 static.start(0.1) wait(0.11) assert static.complete()==0 win = Window(autoLog=False) static = StaticPeriod(screenHz=60, win=win) static.start(.002) assert win.recordFrameIntervals == False static.complete() assert static._winWasRecordingIntervals == win.recordFrameIntervals win.close() # Test if screenHz parameter is respected, i.e., if after completion of the # StaticPeriod, 1/screenHz seconds are still remaining, so the period will # complete after the next flip. refresh_rate = 100.0 period_duration = 0.1 timer = CountdownTimer() win = Window(autoLog=False) static = StaticPeriod(screenHz=refresh_rate, win=win) static.start(period_duration) timer.reset(period_duration ) static.complete() assert np.allclose(timer.getTime(), 1.0/refresh_rate, atol=0.001) win.close()
def test_StaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete() == 1 static.start(0.1) wait(0.11) assert static.complete() == 0 win = Window(autoLog=False) static = StaticPeriod(screenHz=60, win=win) static.start(.002) assert win.recordFrameIntervals is False static.complete() assert static._winWasRecordingIntervals == win.recordFrameIntervals win.close() # Test if screenHz parameter is respected, i.e., if after completion of the # StaticPeriod, 1/screenHz seconds are still remaining, so the period will # complete after the next flip. refresh_rate = 100.0 period_duration = 0.1 timer = CountdownTimer() win = Window(autoLog=False) static = StaticPeriod(screenHz=refresh_rate, win=win) static.start(period_duration) timer.reset(period_duration) static.complete() if _vmTesting: tolerance = 0.01 # without a proper screen timing might not eb sub-ms else: tolerance = 0.001 assert np.allclose(timer.getTime(), 1.0 / refresh_rate, atol=tolerance) win.close()
def testStaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete()==1 static.start(0.1) wait(0.11) assert static.complete()==0 win = Window(autoLog=False) static = StaticPeriod(screenHz=60, win=win) static.start(.002) assert win.recordFrameIntervals == False static.complete() assert static._winWasRecordingIntervals == win.recordFrameIntervals
def testStaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete() == 1 static.start(0.1) wait(0.11) assert static.complete() == 0 win = Window(autoLog=False) static = StaticPeriod(screenHz=60, win=win) static.start(.002) assert win.recordFrameIntervals == False static.complete() assert static._winWasRecordingIntervals == win.recordFrameIntervals
def testStaticPeriod(): static = StaticPeriod() static.start(0.1) wait(0.05) assert static.complete()==1 static.start(0.1) wait(0.11) assert static.complete()==0 win = Window(autoLog=False) static = StaticPeriod(screenHz=60, win=win) static.start(.002) assert win.recordFrameIntervals == False static.complete() assert static._winWasRecordingIntervals == win.recordFrameIntervals win.close() # Test if screenHz parameter is respected, i.e., if after completion of the # StaticPeriod, 1/screenHz seconds are still remaining, so the period will # complete after the next flip. refresh_rate = 100.0 period_duration = 0.1 timer = CountdownTimer() win = Window(autoLog=False) static = StaticPeriod(screenHz=refresh_rate, win=win) static.start(period_duration) timer.reset(period_duration ) static.complete() assert np.allclose(timer.getTime(), old_div(1,refresh_rate), atol=0.001) win.close()
def mainLoop(blocks=1, trialNumber=216): #global blockCount blockCount = 0 trialCount = 0 timer = Clock() maskDelay = delayForMask #make finalItems which will be reused for every block generatedItems = finalItems(blocks) itemsForDisplay = generatedItems #main trial loop runns for n-blocks for block in range(blocks): #f' is the python3 equivalent of "something{}something.format()" function for python2 betweenBlocksInfo = ( f'Der {blockCount}. Block ist nun vorbei, wenn Sie möchten können Sie eine kurze Pause machen.\n\ \n\ Fortfahren mit "Leertaste".') if blockCount == blocks - 1 and blockCount > 0: TextStim(win, ( f'Der {blockCount}. Block ist nun vorbei, wenn Sie möchten können Sie eine kurze Pause machen. Nun folgt der letzte Durchgang.\n\ \n\ Fortfahren mit "Leertaste".'), units='norm', pos=(0.0, 0.0)).draw() win.flip() waitKeys(keyList=['space']) elif blockCount > 0: TextStim(win, betweenBlocksInfo, units='norm', pos=(0.0, 0.0)).draw() win.flip() waitKeys(keyList=['space']) fixationCross.draw() win.flip() wait(0.6) win.flip() blockCount = block + 1 #loop run for n-trials for trial in range(trialNumber): if itemsForDisplay[trial]['itemInfo'][ 'side'] == -1 and itemsForDisplay[trial]['itemInfo'][ 'first'] == 1: corr = -1 elif itemsForDisplay[trial]['itemInfo'][ 'side'] == 1 and itemsForDisplay[trial]['itemInfo'][ 'first'] == 1: corr = 1 elif itemsForDisplay[trial]['itemInfo'][ 'side'] == -1 and itemsForDisplay[trial]['itemInfo'][ 'first'] == 0: corr = 1 elif itemsForDisplay[trial]['itemInfo'][ 'side'] == 1 and itemsForDisplay[trial]['itemInfo'][ 'first'] == 0: corr = -1 timeDelayBetweenNames = itemsForDisplay[trial]['itemInfo']['delay'] timer.reset() time1 = timer.getTime() intertDelay = 0 trialCount += 1 waitDuration = StaticPeriod(screenHz=60) d = interTrialDelay() print('interTrialDelay: ', d) t1 = clock.getTime() if timeDelayBetweenNames != 0.0: waitDuration.start(d) nameToDrawFirst = itemsForDisplay[trial]['firstName'] nameToDrawSecond = itemsForDisplay[trial]['secondName'] if expVersion == 1: mask1 = itemsForDisplay[trial]['firstMask'] mask2 = itemsForDisplay[trial]['secondMask'] maskStimuli = [mask1, mask2] stimuli = [nameToDrawFirst, nameToDrawSecond] intertDelay += d print('delay should be: ', timeDelayBetweenNames) nameToDrawFirst.draw() waitDuration.complete() print('1. loop dur: ', clock.getTime() - t1) win.flip() t1 = clock.getTime() w1 = clock.getTime() waitDuration.start(timeDelayBetweenNames) for s in stimuli: s.draw() waitDuration.complete() print('2. loop dur: ', clock.getTime() - w1) win.flip() realTimeDelay = clock.getTime() - t1 print('effective time delay: ', realTimeDelay) if expVersion == 1: waitDuration.start(maskDelay) for m in maskStimuli: m.draw() waitDuration.complete() win.flip() else: waitDuration.start(d) nameToDrawFirst = itemsForDisplay[trial]['firstName'] nameToDrawSecond = itemsForDisplay[trial]['secondName'] if expVersion == 1: mask1 = itemsForDisplay[trial]['firstMask'] mask2 = itemsForDisplay[trial]['secondMask'] maskStimuli = [mask1, mask2] stimuli = [nameToDrawFirst, nameToDrawSecond] print('delay should be: ', timeDelayBetweenNames) for s in stimuli: s.draw() waitDuration.complete() realTimeDelay = 0 win.flip() print('effective time delay: ', realTimeDelay) if expVersion == 1: waitDuration.start(maskDelay) for m in maskStimuli: m.draw() waitDuration.complete() win.flip() #start response record responseStart = clock.getTime() #wait a specific amount of time for the keypress pressedKey = waitKeys( keyList=['f', 'j', 'space', quitkey]) #escape for quiting the experiment #below just for simulating persons # pressedKey = random.choice(['f','j','space']) # wait(0.2) #end response clock responseEnd = clock.getTime() #calculate response time RT = responseEnd - responseStart if pressedKey == None: pass elif quitkey in pressedKey: quit() print('response time: ', RT) correct = 0 #if-else statements for 'possible' feedback and response recording if pressedKey == None: correct = 0 elif itemsForDisplay[trial]['itemInfo']['delay'] == 0.0: correct = -2 #with 0 delay there cannot be a correct answer elif 'f' in pressedKey and corr == 1: print('incorrect') correct = 0 elif 'j' in pressedKey and corr == -1: print('incorrect') correct = 0 elif 'f' in pressedKey and corr == -1: print('correct') correct = 1 elif 'j' in pressedKey and corr == 1: print('correct') correct = 1 elif 'space' in pressedKey: correct = -1 # -1 then means didnt know win.flip() d = interTrialDelay() print('interTrialDelay: ', d) intertDelay += d wait(d) fixationCross.draw() win.flip() #aand again save the current trials while waiting the inter-trial duration instead of doing nothing d = interTrialDelay() print('interTrialDelay: ', d) t1 = clock.getTime() waitDuration.start(d) intertDelay += d interTrialDuration = intertDelay trialDuration = timer.getTime() - time1 + d #what is saved: #name class #if garbled or not #left name #right name #intended time delay #real time delay #which name was displayed first #response time #if the response was correct #person ID, first name, last name, country, adress if itemsForDisplay[trial]['itemInfo']['side'] == -1: leftName = itemsForDisplay[trial]['itemInfo']['unfamWord'] rightName = itemsForDisplay[trial]['itemInfo']['famWord'] leftNameType = 'unfamiliar' rightNameType = 'familiar' else: leftName = itemsForDisplay[trial]['itemInfo']['famWord'] rightName = itemsForDisplay[trial]['itemInfo']['unfamWord'] leftNameType = 'familiar' rightNameType = 'unfamiliar' if itemsForDisplay[trial]['itemInfo']['first'] == 1: firstNameType = 'unfamiliar' else: firstNameType = 'familiar' if os.path.isfile(f'exp_degrade_{person.id}_{startDate}.txt'): with open(f'exp_degrade_{person.id}_{startDate}.txt', 'a') as file: file.write('\t'.join([itemsForDisplay[trial]['itemInfo']['class'],str(itemsForDisplay[trial]['itemInfo']['garbled']),leftName ,\ rightName , leftNameType, rightNameType, str(itemsForDisplay[trial]['itemInfo']['delay']) , str(realTimeDelay), \ nameToDrawFirst.text.replace('%',''), firstNameType , str(RT) , str(pressedKey) ,str(correct) , str(blockCount) , str(trialCount) , person.id ,\ str(trialDuration), str(interTrialDuration)])+ '\n') else: with open(f'exp_degrade_{person.id}_{startDate}.txt', 'w+') as file: file.write( 'class\tgarbled\tleft Name\tright Name\tleftNameType\trightNameType\tintendedTimeDelay\trealTimeDelay\t\ nameShowedFirst\tfirstNameType\tresponseTime\tpressedKey\tcorrectAnswer\tblock\ttrial\tID\ttrialDuration\tinterTrialDuration' + '\n') with open(f'exp_degrade_{person.id}_{startDate}.txt', 'a') as file: file.write('\t'.join([itemsForDisplay[trial]['itemInfo']['class'],str(itemsForDisplay[trial]['itemInfo']['garbled']),leftName ,\ rightName , leftNameType, rightNameType, str(itemsForDisplay[trial]['itemInfo']['delay']) , str(realTimeDelay), \ nameToDrawFirst.text.replace('%',''), firstNameType , str(RT) , str(pressedKey) ,str(correct) , str(blockCount) , str(trialCount) , person.id ,\ str(trialDuration), str(interTrialDuration)])+ '\n') waitDuration.complete() print('3. loop dur: ', clock.getTime() - t1) win.flip() print('trialDuration: ', trialDuration) endTime = expTime.getTime() - startTime #write person demographics with open(f'exp_degrade_{person.id}_{startDate}.txt', 'a') as file: file.write(' '.join(['experiment Duration: ', str(endTime),' ID: ',person.id,' first name: ',person.first,\ ' last name: ',person.last,' country: ',person.country,\ ' adress: ',person.adress,' birhtday: ',person.adress,' animal: ',person.animal])) TextStim(win, AppEndText, font='Calibri', units='norm', pos=(0, 0), height=0.08, wrapWidth=0.9).draw() win.flip() waitKeys(keyList=['escape'])
def practiceLoop(trials): practiceInfo = TextStim(win, practiceInstructions, units='norm', pos=(0, 0), height=0.05, wrapWidth=0.9) practiceInfo.draw() win.flip() if waitKeys(keyList=['space']): pass fixationCross.draw() win.flip() wait(0.6) t1 = clock.getTime() win.flip() print(clock.getTime() - t1) namesLeft = [] namesRight = [] for i in range(trials * 2): namesLeft.append(random.choice(unfamFirstNames)) namesRight.append(random.choice(unfamFirstNames)) for i in range(trials): timeDelay = random.choice([0.0, 0.0334, 0.0835, 0.1, 0.2]) print('delay should be: ', timeDelay) waitDuration = StaticPeriod() waitDuration.start(0.6) left = namesLeft[i] right = namesRight[i] leftName = TextStim(win, left, units='norm', pos=(posLeft), color=(1, 0, 0), height=0.1) rightName = TextStim(win, right, units='norm', pos=(posRight), color=(1, 0, 0), height=0.1) answer_infoLeft = TextStim(win, 'links', units='norm', pos=(-0.8, -0.7), height=0.1) answer_infoRight = TextStim(win, 'rechts', units='norm', pos=(0.8, -0.7), height=0.1) answer_infoDontKnow = TextStim(win, "unsicher", units='norm', pos=(0, -0.8), height=0.1) correct = TextStim(win, 'richtig!', units='norm', pos=(0, 0)) incorrect = TextStim(win, 'falsch!', units='norm', pos=(0, 0)) #randomly chose which name will be shown first aand the other will then be second nameToDrawFirst = random.choice([leftName, rightName]) if nameToDrawFirst == leftName: nameToDrawSecond = rightName else: nameToDrawSecond = leftName stimuli = [ nameToDrawFirst, answer_infoLeft, answer_infoRight, answer_infoDontKnow ] fullStimuli = [ nameToDrawFirst, nameToDrawSecond, answer_infoLeft, answer_infoRight, answer_infoDontKnow ] for s in stimuli: s.draw() print('ANSWER: ', nameToDrawFirst.text) waitDuration.complete() #make flip and take time win.flip() t1 = clock.getTime() waitDuration.start(timeDelay) for s in fullStimuli: s.draw() waitDuration.complete() win.flip() t2 = clock.getTime() print('effective time delay: ', t2 - t1) #start response time window responseStart = clock.getTime() #wait a specific amount of time for the keypress pressedKey = waitKeys(keyList=['f', 'j', 'space', quitkey]) #only for simulating agents #pressedKey = random.choice(['f','j']) responseEnd = clock.getTime() #calculate response time RT = responseEnd - responseStart if quitkey in pressedKey: win.close() print('response time: ', RT) if 'f' in pressedKey and nameToDrawFirst.text == leftName.text: correct.draw() win.flip() wait(0.4) elif 'j' in pressedKey and nameToDrawFirst.text == rightName.text: correct.draw() win.flip() wait(0.4) elif 'j' in pressedKey and nameToDrawFirst.text != rightName.text: incorrect.draw() win.flip() wait(0.4) elif 'f' in pressedKey and nameToDrawFirst.text != leftName.text: incorrect.draw() win.flip() wait(0.4) fixationCross.draw() win.flip() wait(0.6) win.flip() TextStim(win, practiceEndText, pos=(0, 0), height=0.08, wrapWidth=0.9).draw() win.flip() #fixationCross.draw() waitKeys(keyList=['space']) wait(0.4) win.flip() wait(0.2) win.flip()
def __init__(self, win): frameRate = win.getActualFrameRate() # could be None. What then ? self.frameRate = frameRate / 2 self.frameDuration = 1.0 / round(self.frameRate) self.win = win self.isi = StaticPeriod(screenHz=self.frameRate, win=win)