#!/usr/bin/env python # -*- coding: utf-8 -*- """ This experiment was created using PsychoPy3 Experiment Builder (v2024.2.4), on april 01, 2025, at 16:28 If you publish work using this script the most relevant publication is: Peirce J, Gray JR, Simpson S, MacAskill M, Höchenberger R, Sogo H, Kastman E, Lindeløv JK. (2019) PsychoPy2: Experiments in behavior made easy Behav Res 51: 195. https://doi.org/10.3758/s13428-018-01193-y """ # --- Import packages --- from psychopy import locale_setup from psychopy import prefs from psychopy import plugins plugins.activatePlugins() prefs.hardware['audioLib'] = 'ptb' prefs.hardware['audioLatencyMode'] = '3' from psychopy import sound, gui, visual, core, data, event, logging, clock, colors, layout, hardware from psychopy.tools import environmenttools from psychopy.constants import (NOT_STARTED, STARTED, PLAYING, PAUSED, STOPPED, FINISHED, PRESSED, RELEASED, FOREVER, priority) import numpy as np # whole numpy lib is available, prepend 'np.' from numpy import (sin, cos, tan, log, log10, pi, average, sqrt, std, deg2rad, rad2deg, linspace, asarray) from numpy.random import random, randint, normal, shuffle, choice as randchoice import os # handy system and path functions import sys # to get file system encoding import psychopy.iohub as io from psychopy.hardware import keyboard # --- Setup global variables (available in all functions) --- # create a device manager to handle hardware (keyboards, mice, mirophones, speakers, etc.) deviceManager = hardware.DeviceManager() # ensure that relative paths start from the same directory as this script _thisDir = os.path.dirname(os.path.abspath(__file__)) # store info about the experiment session psychopyVersion = '2024.2.4' expName = 'ExperimentPart1' # from the Builder filename that created this script # information about this experiment expInfo = { 'participant': f"{randint(0, 999999):06.0f}", 'session': '001', 'date|hid': data.getDateStr(), 'expName|hid': expName, 'psychopyVersion|hid': psychopyVersion, } # --- Define some variables which will change depending on pilot mode --- ''' To run in pilot mode, either use the run/pilot toggle in Builder, Coder and Runner, or run the experiment with `--pilot` as an argument. To change what pilot #mode does, check out the 'Pilot mode' tab in preferences. ''' # work out from system args whether we are running in pilot mode PILOTING = core.setPilotModeFromArgs() # start off with values from experiment settings _fullScr = True _winSize = [1536, 960] # if in pilot mode, apply overrides according to preferences if PILOTING: # force windowed mode if prefs.piloting['forceWindowed']: _fullScr = False # set window size _winSize = prefs.piloting['forcedWindowSize'] def showExpInfoDlg(expInfo): """ Show participant info dialog. Parameters ========== expInfo : dict Information about this experiment. Returns ========== dict Information about this experiment. """ # show participant info dialog dlg = gui.DlgFromDict( dictionary=expInfo, sortKeys=False, title=expName, alwaysOnTop=True ) if dlg.OK == False: core.quit() # user pressed cancel # return expInfo return expInfo def setupData(expInfo, dataDir=None): """ Make an ExperimentHandler to handle trials and saving. Parameters ========== expInfo : dict Information about this experiment, created by the `setupExpInfo` function. dataDir : Path, str or None Folder to save the data to, leave as None to create a folder in the current directory. Returns ========== psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. """ # remove dialog-specific syntax from expInfo for key, val in expInfo.copy().items(): newKey, _ = data.utils.parsePipeSyntax(key) expInfo[newKey] = expInfo.pop(key) # data file name stem = absolute path + name; later add .psyexp, .csv, .log, etc if dataDir is None: dataDir = _thisDir filename = u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date']) # make sure filename is relative to dataDir if os.path.isabs(filename): dataDir = os.path.commonprefix([dataDir, filename]) filename = os.path.relpath(filename, dataDir) # an ExperimentHandler isn't essential but helps with data saving thisExp = data.ExperimentHandler( name=expName, version='', extraInfo=expInfo, runtimeInfo=None, originPath='C:\\Users\\credo\\Documents\\Color\\Routines\\ExperimentPart1\\ExperimentPart1.py', savePickle=True, saveWideText=True, dataFileName=dataDir + os.sep + filename, sortColumns='time' ) thisExp.setPriority('thisRow.t', priority.CRITICAL) thisExp.setPriority('expName', priority.LOW) # return experiment handler return thisExp def setupLogging(filename): """ Setup a log file and tell it what level to log at. Parameters ========== filename : str or pathlib.Path Filename to save log file and data files as, doesn't need an extension. Returns ========== psychopy.logging.LogFile Text stream to receive inputs from the logging system. """ # set how much information should be printed to the console / app if PILOTING: logging.console.setLevel( prefs.piloting['pilotConsoleLoggingLevel'] ) else: logging.console.setLevel('warning') # save a log file for detail verbose info logFile = logging.LogFile(filename+'.log') if PILOTING: logFile.setLevel( prefs.piloting['pilotLoggingLevel'] ) else: logFile.setLevel( logging.getLevel('info') ) return logFile def setupWindow(expInfo=None, win=None): """ Setup the Window Parameters ========== expInfo : dict Information about this experiment, created by the `setupExpInfo` function. win : psychopy.visual.Window Window to setup - leave as None to create a new window. Returns ========== psychopy.visual.Window Window in which to run this experiment. """ if PILOTING: logging.debug('Fullscreen settings ignored as running in pilot mode.') if win is None: # if not given a window to setup, make one win = visual.Window( size=_winSize, fullscr=_fullScr, screen=0, winType='pyglet', allowGUI=True, allowStencil=True, monitor='testMonitor', color=[-0.7255, -0.7647, -0.7647], colorSpace='rgb', backgroundImage='', backgroundFit='none', blendMode='avg', useFBO=True, units='height', checkTiming=False # we're going to do this ourselves in a moment ) else: # if we have a window, just set the attributes which are safe to set win.color = [-0.7255, -0.7647, -0.7647] win.colorSpace = 'rgb' win.backgroundImage = '' win.backgroundFit = 'none' win.units = 'height' if expInfo is not None: # get/measure frame rate if not already in expInfo if win._monitorFrameRate is None: win._monitorFrameRate = win.getActualFrameRate(infoMsg='Attempting to measure frame rate of screen, please wait...') expInfo['frameRate'] = win._monitorFrameRate win.hideMessage() # show a visual indicator if we're in piloting mode if PILOTING and prefs.piloting['showPilotingIndicator']: win.showPilotingIndicator() return win def setupDevices(expInfo, thisExp, win): """ Setup whatever devices are available (mouse, keyboard, speaker, eyetracker, etc.) and add them to the device manager (deviceManager) Parameters ========== expInfo : dict Information about this experiment, created by the `setupExpInfo` function. thisExp : psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. win : psychopy.visual.Window Window in which to run this experiment. Returns ========== bool True if completed successfully. """ # --- Setup input devices --- ioConfig = {} # Setup iohub keyboard ioConfig['Keyboard'] = dict(use_keymap='psychopy') # Setup iohub experiment ioConfig['Experiment'] = dict(filename=thisExp.dataFileName) # Start ioHub server ioServer = io.launchHubServer(window=win, **ioConfig) # store ioServer object in the device manager deviceManager.ioServer = ioServer # create a default keyboard (e.g. to check for escape) if deviceManager.getDevice('defaultKeyboard') is None: deviceManager.addDevice( deviceClass='keyboard', deviceName='defaultKeyboard', backend='iohub' ) # return True if completed successfully return True def pauseExperiment(thisExp, win=None, timers=[], playbackComponents=[]): """ Pause this experiment, preventing the flow from advancing to the next routine until resumed. Parameters ========== thisExp : psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. win : psychopy.visual.Window Window for this experiment. timers : list, tuple List of timers to reset once pausing is finished. playbackComponents : list, tuple List of any components with a `pause` method which need to be paused. """ # if we are not paused, do nothing if thisExp.status != PAUSED: return # start a timer to figure out how long we're paused for pauseTimer = core.Clock() # pause any playback components for comp in playbackComponents: comp.pause() # make sure we have a keyboard defaultKeyboard = deviceManager.getDevice('defaultKeyboard') if defaultKeyboard is None: defaultKeyboard = deviceManager.addKeyboard( deviceClass='keyboard', deviceName='defaultKeyboard', backend='ioHub', ) # run a while loop while we wait to unpause while thisExp.status == PAUSED: # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=['escape']): endExperiment(thisExp, win=win) # sleep 1ms so other threads can execute clock.time.sleep(0.001) # if stop was requested while paused, quit if thisExp.status == FINISHED: endExperiment(thisExp, win=win) # resume any playback components for comp in playbackComponents: comp.play() # reset any timers for timer in timers: timer.addTime(-pauseTimer.getTime()) def run(expInfo, thisExp, win, globalClock=None, thisSession=None): """ Run the experiment flow. Parameters ========== expInfo : dict Information about this experiment, created by the `setupExpInfo` function. thisExp : psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. psychopy.visual.Window Window in which to run this experiment. globalClock : psychopy.core.clock.Clock or None Clock to get global time from - supply None to make a new one. thisSession : psychopy.session.Session or None Handle of the Session object this experiment is being run from, if any. """ # mark experiment as started thisExp.status = STARTED # make sure window is set to foreground to prevent losing focus win.winHandle.activate() # make sure variables created by exec are available globally exec = environmenttools.setExecEnvironment(globals()) # get device handles from dict of input devices ioServer = deviceManager.ioServer # get/create a default keyboard (e.g. to check for escape) defaultKeyboard = deviceManager.getDevice('defaultKeyboard') if defaultKeyboard is None: deviceManager.addDevice( deviceClass='keyboard', deviceName='defaultKeyboard', backend='ioHub' ) eyetracker = deviceManager.getDevice('eyetracker') # make sure we're running in the directory for this experiment os.chdir(_thisDir) # get filename from ExperimentHandler for convenience filename = thisExp.dataFileName frameTolerance = 0.001 # how close to onset before 'same' frame endExpNow = False # flag for 'escape' or other condition => quit the exp # get frame duration from frame rate in expInfo if 'frameRate' in expInfo and expInfo['frameRate'] is not None: frameDur = 1.0 / round(expInfo['frameRate']) else: frameDur = 1.0 / 60.0 # could not measure, so guess # Start Code - component code to be run after the window creation # --- Initialize components for Routine "BlackWhite" --- text = visual.TextStim(win=win, name='text', text='Get ready to memorize a pattern. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=0.0); Base = visual.ImageStim( win=win, name='Base', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/d_BasePattern.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.5, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-1.0) text_2 = visual.TextStim(win=win, name='text_2', text='Get ready to solve a simple math question. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-2.0); text_3 = visual.TextStim(win=win, name='text_3', text='246 + 32 - 15', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-3.0); textbox = visual.TextBox2( win, text=None, placeholder='Enter answer here', font='Arial', ori=0.0, pos=(0, -0.3), draggable=False, letterHeight=0.05, size=(0.5, 0.5), borderWidth=2.0, color='white', colorSpace='rgb', opacity=None, bold=False, italic=False, lineSpacing=1.0, speechPoint=None, padding=0.0, alignment='center', anchor='center', overflow='visible', fillColor=None, borderColor=None, flipHoriz=False, flipVert=False, languageStyle='LTR', editable=True, name='textbox', depth=-4, autoLog=True, ) text_4 = visual.TextStim(win=win, name='text_4', text='Still remember the pattern? Now, let’s see if you can recognize it among four others.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-5.0); a_Distractor = visual.ImageStim( win=win, name='a_Distractor', units='norm', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/a_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(-0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-6.0) b_Distractor = visual.ImageStim( win=win, name='b_Distractor', units='norm', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/b_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(-0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-7.0) c_Distractor = visual.ImageStim( win=win, name='c_Distractor', units='norm', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/c_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-8.0) d_Base = visual.ImageStim( win=win, name='d_Base', units='norm', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/d_BasePattern.png', mask=None, anchor='center', ori=0.0, pos=(0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-9.0) e_Distractor = visual.ImageStim( win=win, name='e_Distractor', units='norm', image='C:/Users/credo/Documents/Color/Patterns/ControlBaseline/e_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-10.0) mouse = event.Mouse(win=win) x, y = [None, None] mouse.mouseClock = core.Clock() # --- Initialize components for Routine "RedWhite" --- text_5 = visual.TextStim(win=win, name='text_5', text='Get ready to memorize the next pattern. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=0.0); Base_2 = visual.ImageStim( win=win, name='Base_2', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/c_Base.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.5, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-1.0) text_6 = visual.TextStim(win=win, name='text_6', text='Get ready to solve a simple math question. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-2.0); text_7 = visual.TextStim(win=win, name='text_7', text='574 + 23 - 38', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-3.0); textbox_2 = visual.TextBox2( win, text=None, placeholder='Enter answer here', font='Arial', ori=0.0, pos=(0, -0.3), draggable=False, letterHeight=0.05, size=(0.5, 0.5), borderWidth=2.0, color='white', colorSpace='rgb', opacity=None, bold=False, italic=False, lineSpacing=1.0, speechPoint=None, padding=0.0, alignment='center', anchor='center', overflow='visible', fillColor=None, borderColor=None, flipHoriz=False, flipVert=False, languageStyle='LTR', editable=True, name='textbox_2', depth=-4, autoLog=True, ) text_8 = visual.TextStim(win=win, name='text_8', text='Still remember the pattern? Now, let’s see if you can recognize it among four others.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-5.0); a_Distractor_2 = visual.ImageStim( win=win, name='a_Distractor_2', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/a_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(-0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-6.0) b_Distractor_2 = visual.ImageStim( win=win, name='b_Distractor_2', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/b_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(-0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-7.0) c_Base = visual.ImageStim( win=win, name='c_Base', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/c_Base.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-8.0) d_Distractor_2 = visual.ImageStim( win=win, name='d_Distractor_2', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/d_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-9.0) e_Distractor_2 = visual.ImageStim( win=win, name='e_Distractor_2', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedWhite/e_Distractor.png', mask=None, anchor='center', ori=0.0, pos=(0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-10.0) mouse_2 = event.Mouse(win=win) x, y = [None, None] mouse_2.mouseClock = core.Clock() # --- Initialize components for Routine "BlueWhite" --- text_9 = visual.TextStim(win=win, name='text_9', text='Get ready to memorize the next pattern. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=0.0); Base_3 = visual.ImageStim( win=win, name='Base_3', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWB.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.5, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-1.0) text_10 = visual.TextStim(win=win, name='text_10', text='Get ready to solve a simple math question. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-2.0); text_11 = visual.TextStim(win=win, name='text_11', text='167 + 45 - 29', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-3.0); textbox_3 = visual.TextBox2( win, text=None, placeholder='Enter answer here', font='Arial', ori=0.0, pos=(0, -0.3), draggable=False, letterHeight=0.05, size=(0.5, 0.5), borderWidth=2.0, color='white', colorSpace='rgb', opacity=None, bold=False, italic=False, lineSpacing=1.0, speechPoint=None, padding=0.0, alignment='center', anchor='center', overflow='visible', fillColor=None, borderColor=None, flipHoriz=False, flipVert=False, languageStyle='LTR', editable=True, name='textbox_3', depth=-4, autoLog=True, ) text_12 = visual.TextStim(win=win, name='text_12', text='Still remember the pattern? Now, let’s see if you can recognize it among four others.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-5.0); a_Distractor_3 = visual.ImageStim( win=win, name='a_Distractor_3', units='norm', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWD1.png', mask=None, anchor='center', ori=0.0, pos=(-0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-6.0) b_Base = visual.ImageStim( win=win, name='b_Base', units='norm', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWB.png', mask=None, anchor='center', ori=0.0, pos=(-0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-7.0) c_Distractor_3 = visual.ImageStim( win=win, name='c_Distractor_3', units='norm', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWD2.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-8.0) d_Distractor_3 = visual.ImageStim( win=win, name='d_Distractor_3', units='norm', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWD3.png', mask=None, anchor='center', ori=0.0, pos=(0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-9.0) e_Distractor_3 = visual.ImageStim( win=win, name='e_Distractor_3', units='norm', image='C:/Users/credo/Documents/Color/Patterns/BlueWhite/BWD4.png', mask=None, anchor='center', ori=0.0, pos=(0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-10.0) mouse_3 = event.Mouse(win=win) x, y = [None, None] mouse_3.mouseClock = core.Clock() # --- Initialize components for Routine "RedGreen" --- text_13 = visual.TextStim(win=win, name='text_13', text='Get ready to memorize the next pattern. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=0.0); Base_4 = visual.ImageStim( win=win, name='Base_4', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGB.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.5, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-1.0) text_14 = visual.TextStim(win=win, name='text_14', text='Get ready to solve a simple math question. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-2.0); text_15 = visual.TextStim(win=win, name='text_15', text='264 - 48 + 33', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-3.0); textbox_4 = visual.TextBox2( win, text=None, placeholder='Enter answer here', font='Arial', ori=0.0, pos=(0, -0.3), draggable=False, letterHeight=0.05, size=(0.5, 0.5), borderWidth=2.0, color='white', colorSpace='rgb', opacity=None, bold=False, italic=False, lineSpacing=1.0, speechPoint=None, padding=0.0, alignment='center', anchor='center', overflow='visible', fillColor=None, borderColor=None, flipHoriz=False, flipVert=False, languageStyle='LTR', editable=True, name='textbox_4', depth=-4, autoLog=True, ) text_16 = visual.TextStim(win=win, name='text_16', text='Still remember the pattern? Now, let’s see if you can recognize it among four others.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-5.0); a_Distractor_4 = visual.ImageStim( win=win, name='a_Distractor_4', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGD1.png', mask=None, anchor='center', ori=0.0, pos=(-0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-6.0) b_Distractor_4 = visual.ImageStim( win=win, name='b_Distractor_4', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGD2.png', mask=None, anchor='center', ori=0.0, pos=(-0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-7.0) c_Distractor_4 = visual.ImageStim( win=win, name='c_Distractor_4', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGD3.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-8.0) d_Distractor_4 = visual.ImageStim( win=win, name='d_Distractor_4', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGD4.png', mask=None, anchor='center', ori=0.0, pos=(0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-9.0) e_Base = visual.ImageStim( win=win, name='e_Base', units='norm', image='C:/Users/credo/Documents/Color/Patterns/RedGreen/RGB.png', mask=None, anchor='center', ori=0.0, pos=(0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-10.0) mouse_4 = event.Mouse(win=win) x, y = [None, None] mouse_4.mouseClock = core.Clock() # --- Initialize components for Routine "YellowBlack" --- text_17 = visual.TextStim(win=win, name='text_17', text='Get ready to memorize the next pattern. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=0.0); Base_5 = visual.ImageStim( win=win, name='Base_5', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBB.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.5, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-1.0) text_18 = visual.TextStim(win=win, name='text_18', text='Get ready to solve a simple math question. It will be shown on the next screen.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-2.0); text_19 = visual.TextStim(win=win, name='text_19', text='352 - 57 + 44', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-3.0); textbox_5 = visual.TextBox2( win, text=None, placeholder='Enter answer here', font='Arial', ori=0.0, pos=(0, -0.3), draggable=False, letterHeight=0.05, size=(0.5, 0.5), borderWidth=2.0, color='white', colorSpace='rgb', opacity=None, bold=False, italic=False, lineSpacing=1.0, speechPoint=None, padding=0.0, alignment='center', anchor='center', overflow='visible', fillColor=None, borderColor=None, flipHoriz=False, flipVert=False, languageStyle='LTR', editable=True, name='textbox_5', depth=-4, autoLog=True, ) text_20 = visual.TextStim(win=win, name='text_20', text='Still remember the pattern? Now, let’s see if you can recognize it among four others.', font='Arial', pos=(0, 0), draggable=False, height=0.05, wrapWidth=None, ori=0.0, color='white', colorSpace='rgb', opacity=None, languageStyle='LTR', depth=-5.0); a_Base = visual.ImageStim( win=win, name='a_Base', units='norm', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBB.png', mask=None, anchor='center', ori=0.0, pos=(-0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-6.0) b_Distractor_5 = visual.ImageStim( win=win, name='b_Distractor_5', units='norm', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBD1.png', mask=None, anchor='center', ori=0.0, pos=(-0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-7.0) c_Distractor_5 = visual.ImageStim( win=win, name='c_Distractor_5', units='norm', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBD2.png', mask=None, anchor='center', ori=0.0, pos=(0, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-8.0) d_Distractor_5 = visual.ImageStim( win=win, name='d_Distractor_5', units='norm', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBD3.png', mask=None, anchor='center', ori=0.0, pos=(0.4, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-9.0) e_Distractor_5 = visual.ImageStim( win=win, name='e_Distractor_5', units='norm', image='C:/Users/credo/Documents/Color/Patterns/YellowBlack/YBD4.png', mask=None, anchor='center', ori=0.0, pos=(0.8, 0), draggable=False, size=(0.3, 0.5), color=[1,1,1], colorSpace='rgb', opacity=None, flipHoriz=False, flipVert=False, texRes=128.0, interpolate=True, depth=-10.0) mouse_5 = event.Mouse(win=win) x, y = [None, None] mouse_5.mouseClock = core.Clock() # create some handy timers # global clock to track the time since experiment started if globalClock is None: # create a clock if not given one globalClock = core.Clock() if isinstance(globalClock, str): # if given a string, make a clock accoridng to it if globalClock == 'float': # get timestamps as a simple value globalClock = core.Clock(format='float') elif globalClock == 'iso': # get timestamps in ISO format globalClock = core.Clock(format='%Y-%m-%d_%H:%M:%S.%f%z') else: # get timestamps in a custom format globalClock = core.Clock(format=globalClock) if ioServer is not None: ioServer.syncClock(globalClock) logging.setDefaultClock(globalClock) # routine timer to track time remaining of each (possibly non-slip) routine routineTimer = core.Clock() win.flip() # flip window to reset last flip timer # store the exact time the global clock started expInfo['expStart'] = data.getDateStr( format='%Y-%m-%d %Hh%M.%S.%f %z', fractionalSecondDigits=6 ) # --- Prepare to start Routine "BlackWhite" --- # create an object to store info about Routine BlackWhite BlackWhite = data.Routine( name='BlackWhite', components=[text, Base, text_2, text_3, textbox, text_4, a_Distractor, b_Distractor, c_Distractor, d_Base, e_Distractor, mouse], ) BlackWhite.status = NOT_STARTED continueRoutine = True # update component parameters for each repeat textbox.reset() # setup some python lists for storing info about the mouse mouse.x = [] mouse.y = [] mouse.leftButton = [] mouse.midButton = [] mouse.rightButton = [] mouse.time = [] mouse.clicked_name = [] gotValidClick = False # until a click is received # store start times for BlackWhite BlackWhite.tStartRefresh = win.getFutureFlipTime(clock=globalClock) BlackWhite.tStart = globalClock.getTime(format='float') BlackWhite.status = STARTED thisExp.addData('BlackWhite.started', BlackWhite.tStart) BlackWhite.maxDuration = None # keep track of which components have finished BlackWhiteComponents = BlackWhite.components for thisComponent in BlackWhite.components: thisComponent.tStart = None thisComponent.tStop = None thisComponent.tStartRefresh = None thisComponent.tStopRefresh = None if hasattr(thisComponent, 'status'): thisComponent.status = NOT_STARTED # reset timers t = 0 _timeToFirstFrame = win.getFutureFlipTime(clock="now") frameN = -1 # --- Run Routine "BlackWhite" --- BlackWhite.forceEnded = routineForceEnded = not continueRoutine while continueRoutine and routineTimer.getTime() < 175.0: # get current time t = routineTimer.getTime() tThisFlip = win.getFutureFlipTime(clock=routineTimer) tThisFlipGlobal = win.getFutureFlipTime(clock=None) frameN = frameN + 1 # number of completed frames (so 0 is the first frame) # update/draw components on each frame # *text* updates # if text is starting this frame... if text.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later text.frameNStart = frameN # exact frame index text.tStart = t # local t and not account for scr refresh text.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text.started') # update status text.status = STARTED text.setAutoDraw(True) # if text is active this frame... if text.status == STARTED: # update params pass # if text is stopping this frame... if text.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text.tStop = t # not accounting for scr refresh text.tStopRefresh = tThisFlipGlobal # on global time text.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text.stopped') # update status text.status = FINISHED text.setAutoDraw(False) # *Base* updates # if Base is starting this frame... if Base.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: # keep track of start time/frame for later Base.frameNStart = frameN # exact frame index Base.tStart = t # local t and not account for scr refresh Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base.started') # update status Base.status = STARTED Base.setAutoDraw(True) # if Base is active this frame... if Base.status == STARTED: # update params pass # if Base is stopping this frame... if Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > Base.tStartRefresh + 10.0-frameTolerance: # keep track of stop time/frame for later Base.tStop = t # not accounting for scr refresh Base.tStopRefresh = tThisFlipGlobal # on global time Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base.stopped') # update status Base.status = FINISHED Base.setAutoDraw(False) # *text_2* updates # if text_2 is starting this frame... if text_2.status == NOT_STARTED and tThisFlip >= 15.0-frameTolerance: # keep track of start time/frame for later text_2.frameNStart = frameN # exact frame index text_2.tStart = t # local t and not account for scr refresh text_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_2.started') # update status text_2.status = STARTED text_2.setAutoDraw(True) # if text_2 is active this frame... if text_2.status == STARTED: # update params pass # if text_2 is stopping this frame... if text_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_2.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_2.tStop = t # not accounting for scr refresh text_2.tStopRefresh = tThisFlipGlobal # on global time text_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_2.stopped') # update status text_2.status = FINISHED text_2.setAutoDraw(False) # *text_3* updates # if text_3 is starting this frame... if text_3.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later text_3.frameNStart = frameN # exact frame index text_3.tStart = t # local t and not account for scr refresh text_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_3.started') # update status text_3.status = STARTED text_3.setAutoDraw(True) # if text_3 is active this frame... if text_3.status == STARTED: # update params pass # if text_3 is stopping this frame... if text_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_3.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later text_3.tStop = t # not accounting for scr refresh text_3.tStopRefresh = tThisFlipGlobal # on global time text_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_3.stopped') # update status text_3.status = FINISHED text_3.setAutoDraw(False) # *textbox* updates # if textbox is starting this frame... if textbox.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later textbox.frameNStart = frameN # exact frame index textbox.tStart = t # local t and not account for scr refresh textbox.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(textbox, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox.started') # update status textbox.status = STARTED textbox.setAutoDraw(True) # if textbox is active this frame... if textbox.status == STARTED: # update params pass # if textbox is stopping this frame... if textbox.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > textbox.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later textbox.tStop = t # not accounting for scr refresh textbox.tStopRefresh = tThisFlipGlobal # on global time textbox.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox.stopped') # update status textbox.status = FINISHED textbox.setAutoDraw(False) # *text_4* updates # if text_4 is starting this frame... if text_4.status == NOT_STARTED and tThisFlip >= 50.0-frameTolerance: # keep track of start time/frame for later text_4.frameNStart = frameN # exact frame index text_4.tStart = t # local t and not account for scr refresh text_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_4.started') # update status text_4.status = STARTED text_4.setAutoDraw(True) # if text_4 is active this frame... if text_4.status == STARTED: # update params pass # if text_4 is stopping this frame... if text_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_4.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_4.tStop = t # not accounting for scr refresh text_4.tStopRefresh = tThisFlipGlobal # on global time text_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_4.stopped') # update status text_4.status = FINISHED text_4.setAutoDraw(False) # *a_Distractor* updates # if a_Distractor is starting this frame... if a_Distractor.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later a_Distractor.frameNStart = frameN # exact frame index a_Distractor.tStart = t # local t and not account for scr refresh a_Distractor.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(a_Distractor, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor.started') # update status a_Distractor.status = STARTED a_Distractor.setAutoDraw(True) # if a_Distractor is active this frame... if a_Distractor.status == STARTED: # update params pass # if a_Distractor is stopping this frame... if a_Distractor.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > a_Distractor.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later a_Distractor.tStop = t # not accounting for scr refresh a_Distractor.tStopRefresh = tThisFlipGlobal # on global time a_Distractor.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor.stopped') # update status a_Distractor.status = FINISHED a_Distractor.setAutoDraw(False) # *b_Distractor* updates # if b_Distractor is starting this frame... if b_Distractor.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later b_Distractor.frameNStart = frameN # exact frame index b_Distractor.tStart = t # local t and not account for scr refresh b_Distractor.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(b_Distractor, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor.started') # update status b_Distractor.status = STARTED b_Distractor.setAutoDraw(True) # if b_Distractor is active this frame... if b_Distractor.status == STARTED: # update params pass # if b_Distractor is stopping this frame... if b_Distractor.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > b_Distractor.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later b_Distractor.tStop = t # not accounting for scr refresh b_Distractor.tStopRefresh = tThisFlipGlobal # on global time b_Distractor.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor.stopped') # update status b_Distractor.status = FINISHED b_Distractor.setAutoDraw(False) # *c_Distractor* updates # if c_Distractor is starting this frame... if c_Distractor.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later c_Distractor.frameNStart = frameN # exact frame index c_Distractor.tStart = t # local t and not account for scr refresh c_Distractor.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(c_Distractor, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor.started') # update status c_Distractor.status = STARTED c_Distractor.setAutoDraw(True) # if c_Distractor is active this frame... if c_Distractor.status == STARTED: # update params pass # if c_Distractor is stopping this frame... if c_Distractor.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > c_Distractor.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later c_Distractor.tStop = t # not accounting for scr refresh c_Distractor.tStopRefresh = tThisFlipGlobal # on global time c_Distractor.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor.stopped') # update status c_Distractor.status = FINISHED c_Distractor.setAutoDraw(False) # *d_Base* updates # if d_Base is starting this frame... if d_Base.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later d_Base.frameNStart = frameN # exact frame index d_Base.tStart = t # local t and not account for scr refresh d_Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(d_Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Base.started') # update status d_Base.status = STARTED d_Base.setAutoDraw(True) # if d_Base is active this frame... if d_Base.status == STARTED: # update params pass # if d_Base is stopping this frame... if d_Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > d_Base.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later d_Base.tStop = t # not accounting for scr refresh d_Base.tStopRefresh = tThisFlipGlobal # on global time d_Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Base.stopped') # update status d_Base.status = FINISHED d_Base.setAutoDraw(False) # *e_Distractor* updates # if e_Distractor is starting this frame... if e_Distractor.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later e_Distractor.frameNStart = frameN # exact frame index e_Distractor.tStart = t # local t and not account for scr refresh e_Distractor.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(e_Distractor, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor.started') # update status e_Distractor.status = STARTED e_Distractor.setAutoDraw(True) # if e_Distractor is active this frame... if e_Distractor.status == STARTED: # update params pass # if e_Distractor is stopping this frame... if e_Distractor.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > e_Distractor.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later e_Distractor.tStop = t # not accounting for scr refresh e_Distractor.tStopRefresh = tThisFlipGlobal # on global time e_Distractor.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor.stopped') # update status e_Distractor.status = FINISHED e_Distractor.setAutoDraw(False) # *mouse* updates # if mouse is starting this frame... if mouse.status == NOT_STARTED and t >= 0.0-frameTolerance: # keep track of start time/frame for later mouse.frameNStart = frameN # exact frame index mouse.tStart = t # local t and not account for scr refresh mouse.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(mouse, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.addData('mouse.started', t) # update status mouse.status = STARTED mouse.mouseClock.reset() prevButtonState = mouse.getPressed() # if button is down already this ISN'T a new click # if mouse is stopping this frame... if mouse.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > mouse.tStartRefresh + 175.0-frameTolerance: # keep track of stop time/frame for later mouse.tStop = t # not accounting for scr refresh mouse.tStopRefresh = tThisFlipGlobal # on global time mouse.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.addData('mouse.stopped', t) # update status mouse.status = FINISHED if mouse.status == STARTED: # only update if started and not finished! buttons = mouse.getPressed() if buttons != prevButtonState: # button state changed? prevButtonState = buttons if sum(buttons) > 0: # state changed to a new click # check if the mouse was inside our 'clickable' objects gotValidClick = False clickableList = environmenttools.getFromNames([a_Distractor, b_Distractor, c_Distractor, d_Base, e_Distractor], namespace=locals()) for obj in clickableList: # is this object clicked on? if obj.contains(mouse): gotValidClick = True mouse.clicked_name.append(obj.name) if not gotValidClick: mouse.clicked_name.append(None) x, y = mouse.getPos() mouse.x.append(x) mouse.y.append(y) buttons = mouse.getPressed() mouse.leftButton.append(buttons[0]) mouse.midButton.append(buttons[1]) mouse.rightButton.append(buttons[2]) mouse.time.append(mouse.mouseClock.getTime()) if gotValidClick: continueRoutine = False # end routine on response # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=["escape"]): thisExp.status = FINISHED if thisExp.status == FINISHED or endExpNow: endExperiment(thisExp, win=win) return # pause experiment here if requested if thisExp.status == PAUSED: pauseExperiment( thisExp=thisExp, win=win, timers=[routineTimer], playbackComponents=[] ) # skip the frame we paused on continue # check if all components have finished if not continueRoutine: # a component has requested a forced-end of Routine BlackWhite.forceEnded = routineForceEnded = True break continueRoutine = False # will revert to True if at least one component still running for thisComponent in BlackWhite.components: if hasattr(thisComponent, "status") and thisComponent.status != FINISHED: continueRoutine = True break # at least one component has not yet finished # refresh the screen if continueRoutine: # don't flip if this routine is over or we'll get a blank screen win.flip() # --- Ending Routine "BlackWhite" --- for thisComponent in BlackWhite.components: if hasattr(thisComponent, "setAutoDraw"): thisComponent.setAutoDraw(False) # store stop times for BlackWhite BlackWhite.tStop = globalClock.getTime(format='float') BlackWhite.tStopRefresh = tThisFlipGlobal thisExp.addData('BlackWhite.stopped', BlackWhite.tStop) thisExp.addData('textbox.text',textbox.text) # store data for thisExp (ExperimentHandler) thisExp.addData('mouse.x', mouse.x) thisExp.addData('mouse.y', mouse.y) thisExp.addData('mouse.leftButton', mouse.leftButton) thisExp.addData('mouse.midButton', mouse.midButton) thisExp.addData('mouse.rightButton', mouse.rightButton) thisExp.addData('mouse.time', mouse.time) thisExp.addData('mouse.clicked_name', mouse.clicked_name) # using non-slip timing so subtract the expected duration of this Routine (unless ended on request) if BlackWhite.maxDurationReached: routineTimer.addTime(-BlackWhite.maxDuration) elif BlackWhite.forceEnded: routineTimer.reset() else: routineTimer.addTime(-175.000000) thisExp.nextEntry() # --- Prepare to start Routine "RedWhite" --- # create an object to store info about Routine RedWhite RedWhite = data.Routine( name='RedWhite', components=[text_5, Base_2, text_6, text_7, textbox_2, text_8, a_Distractor_2, b_Distractor_2, c_Base, d_Distractor_2, e_Distractor_2, mouse_2], ) RedWhite.status = NOT_STARTED continueRoutine = True # update component parameters for each repeat textbox_2.reset() # setup some python lists for storing info about the mouse_2 mouse_2.x = [] mouse_2.y = [] mouse_2.leftButton = [] mouse_2.midButton = [] mouse_2.rightButton = [] mouse_2.time = [] mouse_2.clicked_name = [] gotValidClick = False # until a click is received # store start times for RedWhite RedWhite.tStartRefresh = win.getFutureFlipTime(clock=globalClock) RedWhite.tStart = globalClock.getTime(format='float') RedWhite.status = STARTED thisExp.addData('RedWhite.started', RedWhite.tStart) RedWhite.maxDuration = None # keep track of which components have finished RedWhiteComponents = RedWhite.components for thisComponent in RedWhite.components: thisComponent.tStart = None thisComponent.tStop = None thisComponent.tStartRefresh = None thisComponent.tStopRefresh = None if hasattr(thisComponent, 'status'): thisComponent.status = NOT_STARTED # reset timers t = 0 _timeToFirstFrame = win.getFutureFlipTime(clock="now") frameN = -1 # --- Run Routine "RedWhite" --- RedWhite.forceEnded = routineForceEnded = not continueRoutine while continueRoutine and routineTimer.getTime() < 175.0: # get current time t = routineTimer.getTime() tThisFlip = win.getFutureFlipTime(clock=routineTimer) tThisFlipGlobal = win.getFutureFlipTime(clock=None) frameN = frameN + 1 # number of completed frames (so 0 is the first frame) # update/draw components on each frame # *text_5* updates # if text_5 is starting this frame... if text_5.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later text_5.frameNStart = frameN # exact frame index text_5.tStart = t # local t and not account for scr refresh text_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_5.started') # update status text_5.status = STARTED text_5.setAutoDraw(True) # if text_5 is active this frame... if text_5.status == STARTED: # update params pass # if text_5 is stopping this frame... if text_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_5.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_5.tStop = t # not accounting for scr refresh text_5.tStopRefresh = tThisFlipGlobal # on global time text_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_5.stopped') # update status text_5.status = FINISHED text_5.setAutoDraw(False) # *Base_2* updates # if Base_2 is starting this frame... if Base_2.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: # keep track of start time/frame for later Base_2.frameNStart = frameN # exact frame index Base_2.tStart = t # local t and not account for scr refresh Base_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(Base_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_2.started') # update status Base_2.status = STARTED Base_2.setAutoDraw(True) # if Base_2 is active this frame... if Base_2.status == STARTED: # update params pass # if Base_2 is stopping this frame... if Base_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > Base_2.tStartRefresh + 10.0-frameTolerance: # keep track of stop time/frame for later Base_2.tStop = t # not accounting for scr refresh Base_2.tStopRefresh = tThisFlipGlobal # on global time Base_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_2.stopped') # update status Base_2.status = FINISHED Base_2.setAutoDraw(False) # *text_6* updates # if text_6 is starting this frame... if text_6.status == NOT_STARTED and tThisFlip >= 15.0-frameTolerance: # keep track of start time/frame for later text_6.frameNStart = frameN # exact frame index text_6.tStart = t # local t and not account for scr refresh text_6.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_6, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_6.started') # update status text_6.status = STARTED text_6.setAutoDraw(True) # if text_6 is active this frame... if text_6.status == STARTED: # update params pass # if text_6 is stopping this frame... if text_6.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_6.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_6.tStop = t # not accounting for scr refresh text_6.tStopRefresh = tThisFlipGlobal # on global time text_6.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_6.stopped') # update status text_6.status = FINISHED text_6.setAutoDraw(False) # *text_7* updates # if text_7 is starting this frame... if text_7.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later text_7.frameNStart = frameN # exact frame index text_7.tStart = t # local t and not account for scr refresh text_7.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_7, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_7.started') # update status text_7.status = STARTED text_7.setAutoDraw(True) # if text_7 is active this frame... if text_7.status == STARTED: # update params pass # if text_7 is stopping this frame... if text_7.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_7.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later text_7.tStop = t # not accounting for scr refresh text_7.tStopRefresh = tThisFlipGlobal # on global time text_7.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_7.stopped') # update status text_7.status = FINISHED text_7.setAutoDraw(False) # *textbox_2* updates # if textbox_2 is starting this frame... if textbox_2.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later textbox_2.frameNStart = frameN # exact frame index textbox_2.tStart = t # local t and not account for scr refresh textbox_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(textbox_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_2.started') # update status textbox_2.status = STARTED textbox_2.setAutoDraw(True) # if textbox_2 is active this frame... if textbox_2.status == STARTED: # update params pass # if textbox_2 is stopping this frame... if textbox_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > textbox_2.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later textbox_2.tStop = t # not accounting for scr refresh textbox_2.tStopRefresh = tThisFlipGlobal # on global time textbox_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_2.stopped') # update status textbox_2.status = FINISHED textbox_2.setAutoDraw(False) # *text_8* updates # if text_8 is starting this frame... if text_8.status == NOT_STARTED and tThisFlip >= 50.0-frameTolerance: # keep track of start time/frame for later text_8.frameNStart = frameN # exact frame index text_8.tStart = t # local t and not account for scr refresh text_8.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_8, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_8.started') # update status text_8.status = STARTED text_8.setAutoDraw(True) # if text_8 is active this frame... if text_8.status == STARTED: # update params pass # if text_8 is stopping this frame... if text_8.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_8.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_8.tStop = t # not accounting for scr refresh text_8.tStopRefresh = tThisFlipGlobal # on global time text_8.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_8.stopped') # update status text_8.status = FINISHED text_8.setAutoDraw(False) # *a_Distractor_2* updates # if a_Distractor_2 is starting this frame... if a_Distractor_2.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later a_Distractor_2.frameNStart = frameN # exact frame index a_Distractor_2.tStart = t # local t and not account for scr refresh a_Distractor_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(a_Distractor_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_2.started') # update status a_Distractor_2.status = STARTED a_Distractor_2.setAutoDraw(True) # if a_Distractor_2 is active this frame... if a_Distractor_2.status == STARTED: # update params pass # if a_Distractor_2 is stopping this frame... if a_Distractor_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > a_Distractor_2.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later a_Distractor_2.tStop = t # not accounting for scr refresh a_Distractor_2.tStopRefresh = tThisFlipGlobal # on global time a_Distractor_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_2.stopped') # update status a_Distractor_2.status = FINISHED a_Distractor_2.setAutoDraw(False) # *b_Distractor_2* updates # if b_Distractor_2 is starting this frame... if b_Distractor_2.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later b_Distractor_2.frameNStart = frameN # exact frame index b_Distractor_2.tStart = t # local t and not account for scr refresh b_Distractor_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(b_Distractor_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_2.started') # update status b_Distractor_2.status = STARTED b_Distractor_2.setAutoDraw(True) # if b_Distractor_2 is active this frame... if b_Distractor_2.status == STARTED: # update params pass # if b_Distractor_2 is stopping this frame... if b_Distractor_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > b_Distractor_2.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later b_Distractor_2.tStop = t # not accounting for scr refresh b_Distractor_2.tStopRefresh = tThisFlipGlobal # on global time b_Distractor_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_2.stopped') # update status b_Distractor_2.status = FINISHED b_Distractor_2.setAutoDraw(False) # *c_Base* updates # if c_Base is starting this frame... if c_Base.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later c_Base.frameNStart = frameN # exact frame index c_Base.tStart = t # local t and not account for scr refresh c_Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(c_Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Base.started') # update status c_Base.status = STARTED c_Base.setAutoDraw(True) # if c_Base is active this frame... if c_Base.status == STARTED: # update params pass # if c_Base is stopping this frame... if c_Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > c_Base.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later c_Base.tStop = t # not accounting for scr refresh c_Base.tStopRefresh = tThisFlipGlobal # on global time c_Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Base.stopped') # update status c_Base.status = FINISHED c_Base.setAutoDraw(False) # *d_Distractor_2* updates # if d_Distractor_2 is starting this frame... if d_Distractor_2.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later d_Distractor_2.frameNStart = frameN # exact frame index d_Distractor_2.tStart = t # local t and not account for scr refresh d_Distractor_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(d_Distractor_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_2.started') # update status d_Distractor_2.status = STARTED d_Distractor_2.setAutoDraw(True) # if d_Distractor_2 is active this frame... if d_Distractor_2.status == STARTED: # update params pass # if d_Distractor_2 is stopping this frame... if d_Distractor_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > d_Distractor_2.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later d_Distractor_2.tStop = t # not accounting for scr refresh d_Distractor_2.tStopRefresh = tThisFlipGlobal # on global time d_Distractor_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_2.stopped') # update status d_Distractor_2.status = FINISHED d_Distractor_2.setAutoDraw(False) # *e_Distractor_2* updates # if e_Distractor_2 is starting this frame... if e_Distractor_2.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later e_Distractor_2.frameNStart = frameN # exact frame index e_Distractor_2.tStart = t # local t and not account for scr refresh e_Distractor_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(e_Distractor_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_2.started') # update status e_Distractor_2.status = STARTED e_Distractor_2.setAutoDraw(True) # if e_Distractor_2 is active this frame... if e_Distractor_2.status == STARTED: # update params pass # if e_Distractor_2 is stopping this frame... if e_Distractor_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > e_Distractor_2.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later e_Distractor_2.tStop = t # not accounting for scr refresh e_Distractor_2.tStopRefresh = tThisFlipGlobal # on global time e_Distractor_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_2.stopped') # update status e_Distractor_2.status = FINISHED e_Distractor_2.setAutoDraw(False) # *mouse_2* updates # if mouse_2 is starting this frame... if mouse_2.status == NOT_STARTED and t >= 0.0-frameTolerance: # keep track of start time/frame for later mouse_2.frameNStart = frameN # exact frame index mouse_2.tStart = t # local t and not account for scr refresh mouse_2.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(mouse_2, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.addData('mouse_2.started', t) # update status mouse_2.status = STARTED mouse_2.mouseClock.reset() prevButtonState = mouse_2.getPressed() # if button is down already this ISN'T a new click # if mouse_2 is stopping this frame... if mouse_2.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > mouse_2.tStartRefresh + 175.0-frameTolerance: # keep track of stop time/frame for later mouse_2.tStop = t # not accounting for scr refresh mouse_2.tStopRefresh = tThisFlipGlobal # on global time mouse_2.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.addData('mouse_2.stopped', t) # update status mouse_2.status = FINISHED if mouse_2.status == STARTED: # only update if started and not finished! buttons = mouse_2.getPressed() if buttons != prevButtonState: # button state changed? prevButtonState = buttons if sum(buttons) > 0: # state changed to a new click # check if the mouse was inside our 'clickable' objects gotValidClick = False clickableList = environmenttools.getFromNames([a_Distractor_2, b_Distractor_2, c_Base, d_Distractor_2, e_Distractor_2], namespace=locals()) for obj in clickableList: # is this object clicked on? if obj.contains(mouse_2): gotValidClick = True mouse_2.clicked_name.append(obj.name) if not gotValidClick: mouse_2.clicked_name.append(None) x, y = mouse_2.getPos() mouse_2.x.append(x) mouse_2.y.append(y) buttons = mouse_2.getPressed() mouse_2.leftButton.append(buttons[0]) mouse_2.midButton.append(buttons[1]) mouse_2.rightButton.append(buttons[2]) mouse_2.time.append(mouse_2.mouseClock.getTime()) if gotValidClick: continueRoutine = False # end routine on response # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=["escape"]): thisExp.status = FINISHED if thisExp.status == FINISHED or endExpNow: endExperiment(thisExp, win=win) return # pause experiment here if requested if thisExp.status == PAUSED: pauseExperiment( thisExp=thisExp, win=win, timers=[routineTimer], playbackComponents=[] ) # skip the frame we paused on continue # check if all components have finished if not continueRoutine: # a component has requested a forced-end of Routine RedWhite.forceEnded = routineForceEnded = True break continueRoutine = False # will revert to True if at least one component still running for thisComponent in RedWhite.components: if hasattr(thisComponent, "status") and thisComponent.status != FINISHED: continueRoutine = True break # at least one component has not yet finished # refresh the screen if continueRoutine: # don't flip if this routine is over or we'll get a blank screen win.flip() # --- Ending Routine "RedWhite" --- for thisComponent in RedWhite.components: if hasattr(thisComponent, "setAutoDraw"): thisComponent.setAutoDraw(False) # store stop times for RedWhite RedWhite.tStop = globalClock.getTime(format='float') RedWhite.tStopRefresh = tThisFlipGlobal thisExp.addData('RedWhite.stopped', RedWhite.tStop) thisExp.addData('textbox_2.text',textbox_2.text) # store data for thisExp (ExperimentHandler) thisExp.addData('mouse_2.x', mouse_2.x) thisExp.addData('mouse_2.y', mouse_2.y) thisExp.addData('mouse_2.leftButton', mouse_2.leftButton) thisExp.addData('mouse_2.midButton', mouse_2.midButton) thisExp.addData('mouse_2.rightButton', mouse_2.rightButton) thisExp.addData('mouse_2.time', mouse_2.time) thisExp.addData('mouse_2.clicked_name', mouse_2.clicked_name) # using non-slip timing so subtract the expected duration of this Routine (unless ended on request) if RedWhite.maxDurationReached: routineTimer.addTime(-RedWhite.maxDuration) elif RedWhite.forceEnded: routineTimer.reset() else: routineTimer.addTime(-175.000000) thisExp.nextEntry() # --- Prepare to start Routine "BlueWhite" --- # create an object to store info about Routine BlueWhite BlueWhite = data.Routine( name='BlueWhite', components=[text_9, Base_3, text_10, text_11, textbox_3, text_12, a_Distractor_3, b_Base, c_Distractor_3, d_Distractor_3, e_Distractor_3, mouse_3], ) BlueWhite.status = NOT_STARTED continueRoutine = True # update component parameters for each repeat textbox_3.reset() # setup some python lists for storing info about the mouse_3 mouse_3.x = [] mouse_3.y = [] mouse_3.leftButton = [] mouse_3.midButton = [] mouse_3.rightButton = [] mouse_3.time = [] mouse_3.clicked_name = [] gotValidClick = False # until a click is received # store start times for BlueWhite BlueWhite.tStartRefresh = win.getFutureFlipTime(clock=globalClock) BlueWhite.tStart = globalClock.getTime(format='float') BlueWhite.status = STARTED thisExp.addData('BlueWhite.started', BlueWhite.tStart) BlueWhite.maxDuration = None # keep track of which components have finished BlueWhiteComponents = BlueWhite.components for thisComponent in BlueWhite.components: thisComponent.tStart = None thisComponent.tStop = None thisComponent.tStartRefresh = None thisComponent.tStopRefresh = None if hasattr(thisComponent, 'status'): thisComponent.status = NOT_STARTED # reset timers t = 0 _timeToFirstFrame = win.getFutureFlipTime(clock="now") frameN = -1 # --- Run Routine "BlueWhite" --- BlueWhite.forceEnded = routineForceEnded = not continueRoutine while continueRoutine and routineTimer.getTime() < 175.0: # get current time t = routineTimer.getTime() tThisFlip = win.getFutureFlipTime(clock=routineTimer) tThisFlipGlobal = win.getFutureFlipTime(clock=None) frameN = frameN + 1 # number of completed frames (so 0 is the first frame) # update/draw components on each frame # *text_9* updates # if text_9 is starting this frame... if text_9.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later text_9.frameNStart = frameN # exact frame index text_9.tStart = t # local t and not account for scr refresh text_9.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_9, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_9.started') # update status text_9.status = STARTED text_9.setAutoDraw(True) # if text_9 is active this frame... if text_9.status == STARTED: # update params pass # if text_9 is stopping this frame... if text_9.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_9.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_9.tStop = t # not accounting for scr refresh text_9.tStopRefresh = tThisFlipGlobal # on global time text_9.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_9.stopped') # update status text_9.status = FINISHED text_9.setAutoDraw(False) # *Base_3* updates # if Base_3 is starting this frame... if Base_3.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: # keep track of start time/frame for later Base_3.frameNStart = frameN # exact frame index Base_3.tStart = t # local t and not account for scr refresh Base_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(Base_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_3.started') # update status Base_3.status = STARTED Base_3.setAutoDraw(True) # if Base_3 is active this frame... if Base_3.status == STARTED: # update params pass # if Base_3 is stopping this frame... if Base_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > Base_3.tStartRefresh + 10.0-frameTolerance: # keep track of stop time/frame for later Base_3.tStop = t # not accounting for scr refresh Base_3.tStopRefresh = tThisFlipGlobal # on global time Base_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_3.stopped') # update status Base_3.status = FINISHED Base_3.setAutoDraw(False) # *text_10* updates # if text_10 is starting this frame... if text_10.status == NOT_STARTED and tThisFlip >= 15.0-frameTolerance: # keep track of start time/frame for later text_10.frameNStart = frameN # exact frame index text_10.tStart = t # local t and not account for scr refresh text_10.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_10, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_10.started') # update status text_10.status = STARTED text_10.setAutoDraw(True) # if text_10 is active this frame... if text_10.status == STARTED: # update params pass # if text_10 is stopping this frame... if text_10.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_10.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_10.tStop = t # not accounting for scr refresh text_10.tStopRefresh = tThisFlipGlobal # on global time text_10.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_10.stopped') # update status text_10.status = FINISHED text_10.setAutoDraw(False) # *text_11* updates # if text_11 is starting this frame... if text_11.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later text_11.frameNStart = frameN # exact frame index text_11.tStart = t # local t and not account for scr refresh text_11.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_11, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_11.started') # update status text_11.status = STARTED text_11.setAutoDraw(True) # if text_11 is active this frame... if text_11.status == STARTED: # update params pass # if text_11 is stopping this frame... if text_11.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_11.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later text_11.tStop = t # not accounting for scr refresh text_11.tStopRefresh = tThisFlipGlobal # on global time text_11.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_11.stopped') # update status text_11.status = FINISHED text_11.setAutoDraw(False) # *textbox_3* updates # if textbox_3 is starting this frame... if textbox_3.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later textbox_3.frameNStart = frameN # exact frame index textbox_3.tStart = t # local t and not account for scr refresh textbox_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(textbox_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_3.started') # update status textbox_3.status = STARTED textbox_3.setAutoDraw(True) # if textbox_3 is active this frame... if textbox_3.status == STARTED: # update params pass # if textbox_3 is stopping this frame... if textbox_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > textbox_3.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later textbox_3.tStop = t # not accounting for scr refresh textbox_3.tStopRefresh = tThisFlipGlobal # on global time textbox_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_3.stopped') # update status textbox_3.status = FINISHED textbox_3.setAutoDraw(False) # *text_12* updates # if text_12 is starting this frame... if text_12.status == NOT_STARTED and tThisFlip >= 50.0-frameTolerance: # keep track of start time/frame for later text_12.frameNStart = frameN # exact frame index text_12.tStart = t # local t and not account for scr refresh text_12.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_12, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_12.started') # update status text_12.status = STARTED text_12.setAutoDraw(True) # if text_12 is active this frame... if text_12.status == STARTED: # update params pass # if text_12 is stopping this frame... if text_12.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_12.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_12.tStop = t # not accounting for scr refresh text_12.tStopRefresh = tThisFlipGlobal # on global time text_12.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_12.stopped') # update status text_12.status = FINISHED text_12.setAutoDraw(False) # *a_Distractor_3* updates # if a_Distractor_3 is starting this frame... if a_Distractor_3.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later a_Distractor_3.frameNStart = frameN # exact frame index a_Distractor_3.tStart = t # local t and not account for scr refresh a_Distractor_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(a_Distractor_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_3.started') # update status a_Distractor_3.status = STARTED a_Distractor_3.setAutoDraw(True) # if a_Distractor_3 is active this frame... if a_Distractor_3.status == STARTED: # update params pass # if a_Distractor_3 is stopping this frame... if a_Distractor_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > a_Distractor_3.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later a_Distractor_3.tStop = t # not accounting for scr refresh a_Distractor_3.tStopRefresh = tThisFlipGlobal # on global time a_Distractor_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_3.stopped') # update status a_Distractor_3.status = FINISHED a_Distractor_3.setAutoDraw(False) # *b_Base* updates # if b_Base is starting this frame... if b_Base.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later b_Base.frameNStart = frameN # exact frame index b_Base.tStart = t # local t and not account for scr refresh b_Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(b_Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Base.started') # update status b_Base.status = STARTED b_Base.setAutoDraw(True) # if b_Base is active this frame... if b_Base.status == STARTED: # update params pass # if b_Base is stopping this frame... if b_Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > b_Base.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later b_Base.tStop = t # not accounting for scr refresh b_Base.tStopRefresh = tThisFlipGlobal # on global time b_Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Base.stopped') # update status b_Base.status = FINISHED b_Base.setAutoDraw(False) # *c_Distractor_3* updates # if c_Distractor_3 is starting this frame... if c_Distractor_3.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later c_Distractor_3.frameNStart = frameN # exact frame index c_Distractor_3.tStart = t # local t and not account for scr refresh c_Distractor_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(c_Distractor_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_3.started') # update status c_Distractor_3.status = STARTED c_Distractor_3.setAutoDraw(True) # if c_Distractor_3 is active this frame... if c_Distractor_3.status == STARTED: # update params pass # if c_Distractor_3 is stopping this frame... if c_Distractor_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > c_Distractor_3.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later c_Distractor_3.tStop = t # not accounting for scr refresh c_Distractor_3.tStopRefresh = tThisFlipGlobal # on global time c_Distractor_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_3.stopped') # update status c_Distractor_3.status = FINISHED c_Distractor_3.setAutoDraw(False) # *d_Distractor_3* updates # if d_Distractor_3 is starting this frame... if d_Distractor_3.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later d_Distractor_3.frameNStart = frameN # exact frame index d_Distractor_3.tStart = t # local t and not account for scr refresh d_Distractor_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(d_Distractor_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_3.started') # update status d_Distractor_3.status = STARTED d_Distractor_3.setAutoDraw(True) # if d_Distractor_3 is active this frame... if d_Distractor_3.status == STARTED: # update params pass # if d_Distractor_3 is stopping this frame... if d_Distractor_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > d_Distractor_3.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later d_Distractor_3.tStop = t # not accounting for scr refresh d_Distractor_3.tStopRefresh = tThisFlipGlobal # on global time d_Distractor_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_3.stopped') # update status d_Distractor_3.status = FINISHED d_Distractor_3.setAutoDraw(False) # *e_Distractor_3* updates # if e_Distractor_3 is starting this frame... if e_Distractor_3.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later e_Distractor_3.frameNStart = frameN # exact frame index e_Distractor_3.tStart = t # local t and not account for scr refresh e_Distractor_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(e_Distractor_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_3.started') # update status e_Distractor_3.status = STARTED e_Distractor_3.setAutoDraw(True) # if e_Distractor_3 is active this frame... if e_Distractor_3.status == STARTED: # update params pass # if e_Distractor_3 is stopping this frame... if e_Distractor_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > e_Distractor_3.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later e_Distractor_3.tStop = t # not accounting for scr refresh e_Distractor_3.tStopRefresh = tThisFlipGlobal # on global time e_Distractor_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_3.stopped') # update status e_Distractor_3.status = FINISHED e_Distractor_3.setAutoDraw(False) # *mouse_3* updates # if mouse_3 is starting this frame... if mouse_3.status == NOT_STARTED and t >= 0.0-frameTolerance: # keep track of start time/frame for later mouse_3.frameNStart = frameN # exact frame index mouse_3.tStart = t # local t and not account for scr refresh mouse_3.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(mouse_3, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.addData('mouse_3.started', t) # update status mouse_3.status = STARTED mouse_3.mouseClock.reset() prevButtonState = mouse_3.getPressed() # if button is down already this ISN'T a new click # if mouse_3 is stopping this frame... if mouse_3.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > mouse_3.tStartRefresh + 175.0-frameTolerance: # keep track of stop time/frame for later mouse_3.tStop = t # not accounting for scr refresh mouse_3.tStopRefresh = tThisFlipGlobal # on global time mouse_3.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.addData('mouse_3.stopped', t) # update status mouse_3.status = FINISHED if mouse_3.status == STARTED: # only update if started and not finished! buttons = mouse_3.getPressed() if buttons != prevButtonState: # button state changed? prevButtonState = buttons if sum(buttons) > 0: # state changed to a new click # check if the mouse was inside our 'clickable' objects gotValidClick = False clickableList = environmenttools.getFromNames([a_Distractor_3, b_Base, c_Distractor_3, d_Distractor_3, e_Distractor_3], namespace=locals()) for obj in clickableList: # is this object clicked on? if obj.contains(mouse_3): gotValidClick = True mouse_3.clicked_name.append(obj.name) if not gotValidClick: mouse_3.clicked_name.append(None) x, y = mouse_3.getPos() mouse_3.x.append(x) mouse_3.y.append(y) buttons = mouse_3.getPressed() mouse_3.leftButton.append(buttons[0]) mouse_3.midButton.append(buttons[1]) mouse_3.rightButton.append(buttons[2]) mouse_3.time.append(mouse_3.mouseClock.getTime()) if gotValidClick: continueRoutine = False # end routine on response # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=["escape"]): thisExp.status = FINISHED if thisExp.status == FINISHED or endExpNow: endExperiment(thisExp, win=win) return # pause experiment here if requested if thisExp.status == PAUSED: pauseExperiment( thisExp=thisExp, win=win, timers=[routineTimer], playbackComponents=[] ) # skip the frame we paused on continue # check if all components have finished if not continueRoutine: # a component has requested a forced-end of Routine BlueWhite.forceEnded = routineForceEnded = True break continueRoutine = False # will revert to True if at least one component still running for thisComponent in BlueWhite.components: if hasattr(thisComponent, "status") and thisComponent.status != FINISHED: continueRoutine = True break # at least one component has not yet finished # refresh the screen if continueRoutine: # don't flip if this routine is over or we'll get a blank screen win.flip() # --- Ending Routine "BlueWhite" --- for thisComponent in BlueWhite.components: if hasattr(thisComponent, "setAutoDraw"): thisComponent.setAutoDraw(False) # store stop times for BlueWhite BlueWhite.tStop = globalClock.getTime(format='float') BlueWhite.tStopRefresh = tThisFlipGlobal thisExp.addData('BlueWhite.stopped', BlueWhite.tStop) thisExp.addData('textbox_3.text',textbox_3.text) # store data for thisExp (ExperimentHandler) thisExp.addData('mouse_3.x', mouse_3.x) thisExp.addData('mouse_3.y', mouse_3.y) thisExp.addData('mouse_3.leftButton', mouse_3.leftButton) thisExp.addData('mouse_3.midButton', mouse_3.midButton) thisExp.addData('mouse_3.rightButton', mouse_3.rightButton) thisExp.addData('mouse_3.time', mouse_3.time) thisExp.addData('mouse_3.clicked_name', mouse_3.clicked_name) # using non-slip timing so subtract the expected duration of this Routine (unless ended on request) if BlueWhite.maxDurationReached: routineTimer.addTime(-BlueWhite.maxDuration) elif BlueWhite.forceEnded: routineTimer.reset() else: routineTimer.addTime(-175.000000) thisExp.nextEntry() # --- Prepare to start Routine "RedGreen" --- # create an object to store info about Routine RedGreen RedGreen = data.Routine( name='RedGreen', components=[text_13, Base_4, text_14, text_15, textbox_4, text_16, a_Distractor_4, b_Distractor_4, c_Distractor_4, d_Distractor_4, e_Base, mouse_4], ) RedGreen.status = NOT_STARTED continueRoutine = True # update component parameters for each repeat textbox_4.reset() # setup some python lists for storing info about the mouse_4 mouse_4.x = [] mouse_4.y = [] mouse_4.leftButton = [] mouse_4.midButton = [] mouse_4.rightButton = [] mouse_4.time = [] mouse_4.clicked_name = [] gotValidClick = False # until a click is received # store start times for RedGreen RedGreen.tStartRefresh = win.getFutureFlipTime(clock=globalClock) RedGreen.tStart = globalClock.getTime(format='float') RedGreen.status = STARTED thisExp.addData('RedGreen.started', RedGreen.tStart) RedGreen.maxDuration = None # keep track of which components have finished RedGreenComponents = RedGreen.components for thisComponent in RedGreen.components: thisComponent.tStart = None thisComponent.tStop = None thisComponent.tStartRefresh = None thisComponent.tStopRefresh = None if hasattr(thisComponent, 'status'): thisComponent.status = NOT_STARTED # reset timers t = 0 _timeToFirstFrame = win.getFutureFlipTime(clock="now") frameN = -1 # --- Run Routine "RedGreen" --- RedGreen.forceEnded = routineForceEnded = not continueRoutine while continueRoutine and routineTimer.getTime() < 175.0: # get current time t = routineTimer.getTime() tThisFlip = win.getFutureFlipTime(clock=routineTimer) tThisFlipGlobal = win.getFutureFlipTime(clock=None) frameN = frameN + 1 # number of completed frames (so 0 is the first frame) # update/draw components on each frame # *text_13* updates # if text_13 is starting this frame... if text_13.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later text_13.frameNStart = frameN # exact frame index text_13.tStart = t # local t and not account for scr refresh text_13.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_13, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_13.started') # update status text_13.status = STARTED text_13.setAutoDraw(True) # if text_13 is active this frame... if text_13.status == STARTED: # update params pass # if text_13 is stopping this frame... if text_13.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_13.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_13.tStop = t # not accounting for scr refresh text_13.tStopRefresh = tThisFlipGlobal # on global time text_13.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_13.stopped') # update status text_13.status = FINISHED text_13.setAutoDraw(False) # *Base_4* updates # if Base_4 is starting this frame... if Base_4.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: # keep track of start time/frame for later Base_4.frameNStart = frameN # exact frame index Base_4.tStart = t # local t and not account for scr refresh Base_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(Base_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_4.started') # update status Base_4.status = STARTED Base_4.setAutoDraw(True) # if Base_4 is active this frame... if Base_4.status == STARTED: # update params pass # if Base_4 is stopping this frame... if Base_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > Base_4.tStartRefresh + 10.0-frameTolerance: # keep track of stop time/frame for later Base_4.tStop = t # not accounting for scr refresh Base_4.tStopRefresh = tThisFlipGlobal # on global time Base_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_4.stopped') # update status Base_4.status = FINISHED Base_4.setAutoDraw(False) # *text_14* updates # if text_14 is starting this frame... if text_14.status == NOT_STARTED and tThisFlip >= 15.0-frameTolerance: # keep track of start time/frame for later text_14.frameNStart = frameN # exact frame index text_14.tStart = t # local t and not account for scr refresh text_14.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_14, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_14.started') # update status text_14.status = STARTED text_14.setAutoDraw(True) # if text_14 is active this frame... if text_14.status == STARTED: # update params pass # if text_14 is stopping this frame... if text_14.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_14.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_14.tStop = t # not accounting for scr refresh text_14.tStopRefresh = tThisFlipGlobal # on global time text_14.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_14.stopped') # update status text_14.status = FINISHED text_14.setAutoDraw(False) # *text_15* updates # if text_15 is starting this frame... if text_15.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later text_15.frameNStart = frameN # exact frame index text_15.tStart = t # local t and not account for scr refresh text_15.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_15, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_15.started') # update status text_15.status = STARTED text_15.setAutoDraw(True) # if text_15 is active this frame... if text_15.status == STARTED: # update params pass # if text_15 is stopping this frame... if text_15.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_15.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later text_15.tStop = t # not accounting for scr refresh text_15.tStopRefresh = tThisFlipGlobal # on global time text_15.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_15.stopped') # update status text_15.status = FINISHED text_15.setAutoDraw(False) # *textbox_4* updates # if textbox_4 is starting this frame... if textbox_4.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later textbox_4.frameNStart = frameN # exact frame index textbox_4.tStart = t # local t and not account for scr refresh textbox_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(textbox_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_4.started') # update status textbox_4.status = STARTED textbox_4.setAutoDraw(True) # if textbox_4 is active this frame... if textbox_4.status == STARTED: # update params pass # if textbox_4 is stopping this frame... if textbox_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > textbox_4.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later textbox_4.tStop = t # not accounting for scr refresh textbox_4.tStopRefresh = tThisFlipGlobal # on global time textbox_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_4.stopped') # update status textbox_4.status = FINISHED textbox_4.setAutoDraw(False) # *text_16* updates # if text_16 is starting this frame... if text_16.status == NOT_STARTED and tThisFlip >= 50.0-frameTolerance: # keep track of start time/frame for later text_16.frameNStart = frameN # exact frame index text_16.tStart = t # local t and not account for scr refresh text_16.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_16, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_16.started') # update status text_16.status = STARTED text_16.setAutoDraw(True) # if text_16 is active this frame... if text_16.status == STARTED: # update params pass # if text_16 is stopping this frame... if text_16.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_16.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_16.tStop = t # not accounting for scr refresh text_16.tStopRefresh = tThisFlipGlobal # on global time text_16.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_16.stopped') # update status text_16.status = FINISHED text_16.setAutoDraw(False) # *a_Distractor_4* updates # if a_Distractor_4 is starting this frame... if a_Distractor_4.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later a_Distractor_4.frameNStart = frameN # exact frame index a_Distractor_4.tStart = t # local t and not account for scr refresh a_Distractor_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(a_Distractor_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_4.started') # update status a_Distractor_4.status = STARTED a_Distractor_4.setAutoDraw(True) # if a_Distractor_4 is active this frame... if a_Distractor_4.status == STARTED: # update params pass # if a_Distractor_4 is stopping this frame... if a_Distractor_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > a_Distractor_4.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later a_Distractor_4.tStop = t # not accounting for scr refresh a_Distractor_4.tStopRefresh = tThisFlipGlobal # on global time a_Distractor_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Distractor_4.stopped') # update status a_Distractor_4.status = FINISHED a_Distractor_4.setAutoDraw(False) # *b_Distractor_4* updates # if b_Distractor_4 is starting this frame... if b_Distractor_4.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later b_Distractor_4.frameNStart = frameN # exact frame index b_Distractor_4.tStart = t # local t and not account for scr refresh b_Distractor_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(b_Distractor_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_4.started') # update status b_Distractor_4.status = STARTED b_Distractor_4.setAutoDraw(True) # if b_Distractor_4 is active this frame... if b_Distractor_4.status == STARTED: # update params pass # if b_Distractor_4 is stopping this frame... if b_Distractor_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > b_Distractor_4.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later b_Distractor_4.tStop = t # not accounting for scr refresh b_Distractor_4.tStopRefresh = tThisFlipGlobal # on global time b_Distractor_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_4.stopped') # update status b_Distractor_4.status = FINISHED b_Distractor_4.setAutoDraw(False) # *c_Distractor_4* updates # if c_Distractor_4 is starting this frame... if c_Distractor_4.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later c_Distractor_4.frameNStart = frameN # exact frame index c_Distractor_4.tStart = t # local t and not account for scr refresh c_Distractor_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(c_Distractor_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_4.started') # update status c_Distractor_4.status = STARTED c_Distractor_4.setAutoDraw(True) # if c_Distractor_4 is active this frame... if c_Distractor_4.status == STARTED: # update params pass # if c_Distractor_4 is stopping this frame... if c_Distractor_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > c_Distractor_4.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later c_Distractor_4.tStop = t # not accounting for scr refresh c_Distractor_4.tStopRefresh = tThisFlipGlobal # on global time c_Distractor_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_4.stopped') # update status c_Distractor_4.status = FINISHED c_Distractor_4.setAutoDraw(False) # *d_Distractor_4* updates # if d_Distractor_4 is starting this frame... if d_Distractor_4.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later d_Distractor_4.frameNStart = frameN # exact frame index d_Distractor_4.tStart = t # local t and not account for scr refresh d_Distractor_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(d_Distractor_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_4.started') # update status d_Distractor_4.status = STARTED d_Distractor_4.setAutoDraw(True) # if d_Distractor_4 is active this frame... if d_Distractor_4.status == STARTED: # update params pass # if d_Distractor_4 is stopping this frame... if d_Distractor_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > d_Distractor_4.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later d_Distractor_4.tStop = t # not accounting for scr refresh d_Distractor_4.tStopRefresh = tThisFlipGlobal # on global time d_Distractor_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_4.stopped') # update status d_Distractor_4.status = FINISHED d_Distractor_4.setAutoDraw(False) # *e_Base* updates # if e_Base is starting this frame... if e_Base.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later e_Base.frameNStart = frameN # exact frame index e_Base.tStart = t # local t and not account for scr refresh e_Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(e_Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Base.started') # update status e_Base.status = STARTED e_Base.setAutoDraw(True) # if e_Base is active this frame... if e_Base.status == STARTED: # update params pass # if e_Base is stopping this frame... if e_Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > e_Base.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later e_Base.tStop = t # not accounting for scr refresh e_Base.tStopRefresh = tThisFlipGlobal # on global time e_Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Base.stopped') # update status e_Base.status = FINISHED e_Base.setAutoDraw(False) # *mouse_4* updates # if mouse_4 is starting this frame... if mouse_4.status == NOT_STARTED and t >= 0.0-frameTolerance: # keep track of start time/frame for later mouse_4.frameNStart = frameN # exact frame index mouse_4.tStart = t # local t and not account for scr refresh mouse_4.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(mouse_4, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.addData('mouse_4.started', t) # update status mouse_4.status = STARTED mouse_4.mouseClock.reset() prevButtonState = mouse_4.getPressed() # if button is down already this ISN'T a new click # if mouse_4 is stopping this frame... if mouse_4.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > mouse_4.tStartRefresh + 175.0-frameTolerance: # keep track of stop time/frame for later mouse_4.tStop = t # not accounting for scr refresh mouse_4.tStopRefresh = tThisFlipGlobal # on global time mouse_4.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.addData('mouse_4.stopped', t) # update status mouse_4.status = FINISHED if mouse_4.status == STARTED: # only update if started and not finished! buttons = mouse_4.getPressed() if buttons != prevButtonState: # button state changed? prevButtonState = buttons if sum(buttons) > 0: # state changed to a new click # check if the mouse was inside our 'clickable' objects gotValidClick = False clickableList = environmenttools.getFromNames([a_Distractor_4, b_Distractor_4, c_Distractor_4, d_Distractor_4, e_Base], namespace=locals()) for obj in clickableList: # is this object clicked on? if obj.contains(mouse_4): gotValidClick = True mouse_4.clicked_name.append(obj.name) if not gotValidClick: mouse_4.clicked_name.append(None) x, y = mouse_4.getPos() mouse_4.x.append(x) mouse_4.y.append(y) buttons = mouse_4.getPressed() mouse_4.leftButton.append(buttons[0]) mouse_4.midButton.append(buttons[1]) mouse_4.rightButton.append(buttons[2]) mouse_4.time.append(mouse_4.mouseClock.getTime()) if gotValidClick: continueRoutine = False # end routine on response # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=["escape"]): thisExp.status = FINISHED if thisExp.status == FINISHED or endExpNow: endExperiment(thisExp, win=win) return # pause experiment here if requested if thisExp.status == PAUSED: pauseExperiment( thisExp=thisExp, win=win, timers=[routineTimer], playbackComponents=[] ) # skip the frame we paused on continue # check if all components have finished if not continueRoutine: # a component has requested a forced-end of Routine RedGreen.forceEnded = routineForceEnded = True break continueRoutine = False # will revert to True if at least one component still running for thisComponent in RedGreen.components: if hasattr(thisComponent, "status") and thisComponent.status != FINISHED: continueRoutine = True break # at least one component has not yet finished # refresh the screen if continueRoutine: # don't flip if this routine is over or we'll get a blank screen win.flip() # --- Ending Routine "RedGreen" --- for thisComponent in RedGreen.components: if hasattr(thisComponent, "setAutoDraw"): thisComponent.setAutoDraw(False) # store stop times for RedGreen RedGreen.tStop = globalClock.getTime(format='float') RedGreen.tStopRefresh = tThisFlipGlobal thisExp.addData('RedGreen.stopped', RedGreen.tStop) thisExp.addData('textbox_4.text',textbox_4.text) # store data for thisExp (ExperimentHandler) thisExp.addData('mouse_4.x', mouse_4.x) thisExp.addData('mouse_4.y', mouse_4.y) thisExp.addData('mouse_4.leftButton', mouse_4.leftButton) thisExp.addData('mouse_4.midButton', mouse_4.midButton) thisExp.addData('mouse_4.rightButton', mouse_4.rightButton) thisExp.addData('mouse_4.time', mouse_4.time) thisExp.addData('mouse_4.clicked_name', mouse_4.clicked_name) # using non-slip timing so subtract the expected duration of this Routine (unless ended on request) if RedGreen.maxDurationReached: routineTimer.addTime(-RedGreen.maxDuration) elif RedGreen.forceEnded: routineTimer.reset() else: routineTimer.addTime(-175.000000) thisExp.nextEntry() # --- Prepare to start Routine "YellowBlack" --- # create an object to store info about Routine YellowBlack YellowBlack = data.Routine( name='YellowBlack', components=[text_17, Base_5, text_18, text_19, textbox_5, text_20, a_Base, b_Distractor_5, c_Distractor_5, d_Distractor_5, e_Distractor_5, mouse_5], ) YellowBlack.status = NOT_STARTED continueRoutine = True # update component parameters for each repeat textbox_5.reset() # setup some python lists for storing info about the mouse_5 mouse_5.x = [] mouse_5.y = [] mouse_5.leftButton = [] mouse_5.midButton = [] mouse_5.rightButton = [] mouse_5.time = [] mouse_5.clicked_name = [] gotValidClick = False # until a click is received # store start times for YellowBlack YellowBlack.tStartRefresh = win.getFutureFlipTime(clock=globalClock) YellowBlack.tStart = globalClock.getTime(format='float') YellowBlack.status = STARTED thisExp.addData('YellowBlack.started', YellowBlack.tStart) YellowBlack.maxDuration = None # keep track of which components have finished YellowBlackComponents = YellowBlack.components for thisComponent in YellowBlack.components: thisComponent.tStart = None thisComponent.tStop = None thisComponent.tStartRefresh = None thisComponent.tStopRefresh = None if hasattr(thisComponent, 'status'): thisComponent.status = NOT_STARTED # reset timers t = 0 _timeToFirstFrame = win.getFutureFlipTime(clock="now") frameN = -1 # --- Run Routine "YellowBlack" --- YellowBlack.forceEnded = routineForceEnded = not continueRoutine while continueRoutine and routineTimer.getTime() < 175.0: # get current time t = routineTimer.getTime() tThisFlip = win.getFutureFlipTime(clock=routineTimer) tThisFlipGlobal = win.getFutureFlipTime(clock=None) frameN = frameN + 1 # number of completed frames (so 0 is the first frame) # update/draw components on each frame # *text_17* updates # if text_17 is starting this frame... if text_17.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance: # keep track of start time/frame for later text_17.frameNStart = frameN # exact frame index text_17.tStart = t # local t and not account for scr refresh text_17.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_17, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_17.started') # update status text_17.status = STARTED text_17.setAutoDraw(True) # if text_17 is active this frame... if text_17.status == STARTED: # update params pass # if text_17 is stopping this frame... if text_17.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_17.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_17.tStop = t # not accounting for scr refresh text_17.tStopRefresh = tThisFlipGlobal # on global time text_17.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_17.stopped') # update status text_17.status = FINISHED text_17.setAutoDraw(False) # *Base_5* updates # if Base_5 is starting this frame... if Base_5.status == NOT_STARTED and tThisFlip >= 5.0-frameTolerance: # keep track of start time/frame for later Base_5.frameNStart = frameN # exact frame index Base_5.tStart = t # local t and not account for scr refresh Base_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(Base_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_5.started') # update status Base_5.status = STARTED Base_5.setAutoDraw(True) # if Base_5 is active this frame... if Base_5.status == STARTED: # update params pass # if Base_5 is stopping this frame... if Base_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > Base_5.tStartRefresh + 10.0-frameTolerance: # keep track of stop time/frame for later Base_5.tStop = t # not accounting for scr refresh Base_5.tStopRefresh = tThisFlipGlobal # on global time Base_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'Base_5.stopped') # update status Base_5.status = FINISHED Base_5.setAutoDraw(False) # *text_18* updates # if text_18 is starting this frame... if text_18.status == NOT_STARTED and tThisFlip >= 15.0-frameTolerance: # keep track of start time/frame for later text_18.frameNStart = frameN # exact frame index text_18.tStart = t # local t and not account for scr refresh text_18.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_18, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_18.started') # update status text_18.status = STARTED text_18.setAutoDraw(True) # if text_18 is active this frame... if text_18.status == STARTED: # update params pass # if text_18 is stopping this frame... if text_18.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_18.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_18.tStop = t # not accounting for scr refresh text_18.tStopRefresh = tThisFlipGlobal # on global time text_18.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_18.stopped') # update status text_18.status = FINISHED text_18.setAutoDraw(False) # *text_19* updates # if text_19 is starting this frame... if text_19.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later text_19.frameNStart = frameN # exact frame index text_19.tStart = t # local t and not account for scr refresh text_19.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_19, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_19.started') # update status text_19.status = STARTED text_19.setAutoDraw(True) # if text_19 is active this frame... if text_19.status == STARTED: # update params pass # if text_19 is stopping this frame... if text_19.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_19.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later text_19.tStop = t # not accounting for scr refresh text_19.tStopRefresh = tThisFlipGlobal # on global time text_19.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_19.stopped') # update status text_19.status = FINISHED text_19.setAutoDraw(False) # *textbox_5* updates # if textbox_5 is starting this frame... if textbox_5.status == NOT_STARTED and tThisFlip >= 20.0-frameTolerance: # keep track of start time/frame for later textbox_5.frameNStart = frameN # exact frame index textbox_5.tStart = t # local t and not account for scr refresh textbox_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(textbox_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_5.started') # update status textbox_5.status = STARTED textbox_5.setAutoDraw(True) # if textbox_5 is active this frame... if textbox_5.status == STARTED: # update params pass # if textbox_5 is stopping this frame... if textbox_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > textbox_5.tStartRefresh + 30.0-frameTolerance: # keep track of stop time/frame for later textbox_5.tStop = t # not accounting for scr refresh textbox_5.tStopRefresh = tThisFlipGlobal # on global time textbox_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'textbox_5.stopped') # update status textbox_5.status = FINISHED textbox_5.setAutoDraw(False) # *text_20* updates # if text_20 is starting this frame... if text_20.status == NOT_STARTED and tThisFlip >= 50.0-frameTolerance: # keep track of start time/frame for later text_20.frameNStart = frameN # exact frame index text_20.tStart = t # local t and not account for scr refresh text_20.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(text_20, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_20.started') # update status text_20.status = STARTED text_20.setAutoDraw(True) # if text_20 is active this frame... if text_20.status == STARTED: # update params pass # if text_20 is stopping this frame... if text_20.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > text_20.tStartRefresh + 5.0-frameTolerance: # keep track of stop time/frame for later text_20.tStop = t # not accounting for scr refresh text_20.tStopRefresh = tThisFlipGlobal # on global time text_20.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'text_20.stopped') # update status text_20.status = FINISHED text_20.setAutoDraw(False) # *a_Base* updates # if a_Base is starting this frame... if a_Base.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later a_Base.frameNStart = frameN # exact frame index a_Base.tStart = t # local t and not account for scr refresh a_Base.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(a_Base, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Base.started') # update status a_Base.status = STARTED a_Base.setAutoDraw(True) # if a_Base is active this frame... if a_Base.status == STARTED: # update params pass # if a_Base is stopping this frame... if a_Base.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > a_Base.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later a_Base.tStop = t # not accounting for scr refresh a_Base.tStopRefresh = tThisFlipGlobal # on global time a_Base.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'a_Base.stopped') # update status a_Base.status = FINISHED a_Base.setAutoDraw(False) # *b_Distractor_5* updates # if b_Distractor_5 is starting this frame... if b_Distractor_5.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later b_Distractor_5.frameNStart = frameN # exact frame index b_Distractor_5.tStart = t # local t and not account for scr refresh b_Distractor_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(b_Distractor_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_5.started') # update status b_Distractor_5.status = STARTED b_Distractor_5.setAutoDraw(True) # if b_Distractor_5 is active this frame... if b_Distractor_5.status == STARTED: # update params pass # if b_Distractor_5 is stopping this frame... if b_Distractor_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > b_Distractor_5.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later b_Distractor_5.tStop = t # not accounting for scr refresh b_Distractor_5.tStopRefresh = tThisFlipGlobal # on global time b_Distractor_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'b_Distractor_5.stopped') # update status b_Distractor_5.status = FINISHED b_Distractor_5.setAutoDraw(False) # *c_Distractor_5* updates # if c_Distractor_5 is starting this frame... if c_Distractor_5.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later c_Distractor_5.frameNStart = frameN # exact frame index c_Distractor_5.tStart = t # local t and not account for scr refresh c_Distractor_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(c_Distractor_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_5.started') # update status c_Distractor_5.status = STARTED c_Distractor_5.setAutoDraw(True) # if c_Distractor_5 is active this frame... if c_Distractor_5.status == STARTED: # update params pass # if c_Distractor_5 is stopping this frame... if c_Distractor_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > c_Distractor_5.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later c_Distractor_5.tStop = t # not accounting for scr refresh c_Distractor_5.tStopRefresh = tThisFlipGlobal # on global time c_Distractor_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'c_Distractor_5.stopped') # update status c_Distractor_5.status = FINISHED c_Distractor_5.setAutoDraw(False) # *d_Distractor_5* updates # if d_Distractor_5 is starting this frame... if d_Distractor_5.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later d_Distractor_5.frameNStart = frameN # exact frame index d_Distractor_5.tStart = t # local t and not account for scr refresh d_Distractor_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(d_Distractor_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_5.started') # update status d_Distractor_5.status = STARTED d_Distractor_5.setAutoDraw(True) # if d_Distractor_5 is active this frame... if d_Distractor_5.status == STARTED: # update params pass # if d_Distractor_5 is stopping this frame... if d_Distractor_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > d_Distractor_5.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later d_Distractor_5.tStop = t # not accounting for scr refresh d_Distractor_5.tStopRefresh = tThisFlipGlobal # on global time d_Distractor_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'd_Distractor_5.stopped') # update status d_Distractor_5.status = FINISHED d_Distractor_5.setAutoDraw(False) # *e_Distractor_5* updates # if e_Distractor_5 is starting this frame... if e_Distractor_5.status == NOT_STARTED and tThisFlip >= 55.0-frameTolerance: # keep track of start time/frame for later e_Distractor_5.frameNStart = frameN # exact frame index e_Distractor_5.tStart = t # local t and not account for scr refresh e_Distractor_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(e_Distractor_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_5.started') # update status e_Distractor_5.status = STARTED e_Distractor_5.setAutoDraw(True) # if e_Distractor_5 is active this frame... if e_Distractor_5.status == STARTED: # update params pass # if e_Distractor_5 is stopping this frame... if e_Distractor_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > e_Distractor_5.tStartRefresh + 120.0-frameTolerance: # keep track of stop time/frame for later e_Distractor_5.tStop = t # not accounting for scr refresh e_Distractor_5.tStopRefresh = tThisFlipGlobal # on global time e_Distractor_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.timestampOnFlip(win, 'e_Distractor_5.stopped') # update status e_Distractor_5.status = FINISHED e_Distractor_5.setAutoDraw(False) # *mouse_5* updates # if mouse_5 is starting this frame... if mouse_5.status == NOT_STARTED and t >= 0.0-frameTolerance: # keep track of start time/frame for later mouse_5.frameNStart = frameN # exact frame index mouse_5.tStart = t # local t and not account for scr refresh mouse_5.tStartRefresh = tThisFlipGlobal # on global time win.timeOnFlip(mouse_5, 'tStartRefresh') # time at next scr refresh # add timestamp to datafile thisExp.addData('mouse_5.started', t) # update status mouse_5.status = STARTED mouse_5.mouseClock.reset() prevButtonState = mouse_5.getPressed() # if button is down already this ISN'T a new click # if mouse_5 is stopping this frame... if mouse_5.status == STARTED: # is it time to stop? (based on global clock, using actual start) if tThisFlipGlobal > mouse_5.tStartRefresh + 175.0-frameTolerance: # keep track of stop time/frame for later mouse_5.tStop = t # not accounting for scr refresh mouse_5.tStopRefresh = tThisFlipGlobal # on global time mouse_5.frameNStop = frameN # exact frame index # add timestamp to datafile thisExp.addData('mouse_5.stopped', t) # update status mouse_5.status = FINISHED if mouse_5.status == STARTED: # only update if started and not finished! buttons = mouse_5.getPressed() if buttons != prevButtonState: # button state changed? prevButtonState = buttons if sum(buttons) > 0: # state changed to a new click # check if the mouse was inside our 'clickable' objects gotValidClick = False clickableList = environmenttools.getFromNames([a_Base, b_Distractor_5, c_Distractor_5, d_Distractor_5, e_Distractor_5], namespace=locals()) for obj in clickableList: # is this object clicked on? if obj.contains(mouse_5): gotValidClick = True mouse_5.clicked_name.append(obj.name) if not gotValidClick: mouse_5.clicked_name.append(None) x, y = mouse_5.getPos() mouse_5.x.append(x) mouse_5.y.append(y) buttons = mouse_5.getPressed() mouse_5.leftButton.append(buttons[0]) mouse_5.midButton.append(buttons[1]) mouse_5.rightButton.append(buttons[2]) mouse_5.time.append(mouse_5.mouseClock.getTime()) if gotValidClick: continueRoutine = False # end routine on response # check for quit (typically the Esc key) if defaultKeyboard.getKeys(keyList=["escape"]): thisExp.status = FINISHED if thisExp.status == FINISHED or endExpNow: endExperiment(thisExp, win=win) return # pause experiment here if requested if thisExp.status == PAUSED: pauseExperiment( thisExp=thisExp, win=win, timers=[routineTimer], playbackComponents=[] ) # skip the frame we paused on continue # check if all components have finished if not continueRoutine: # a component has requested a forced-end of Routine YellowBlack.forceEnded = routineForceEnded = True break continueRoutine = False # will revert to True if at least one component still running for thisComponent in YellowBlack.components: if hasattr(thisComponent, "status") and thisComponent.status != FINISHED: continueRoutine = True break # at least one component has not yet finished # refresh the screen if continueRoutine: # don't flip if this routine is over or we'll get a blank screen win.flip() # --- Ending Routine "YellowBlack" --- for thisComponent in YellowBlack.components: if hasattr(thisComponent, "setAutoDraw"): thisComponent.setAutoDraw(False) # store stop times for YellowBlack YellowBlack.tStop = globalClock.getTime(format='float') YellowBlack.tStopRefresh = tThisFlipGlobal thisExp.addData('YellowBlack.stopped', YellowBlack.tStop) thisExp.addData('textbox_5.text',textbox_5.text) # store data for thisExp (ExperimentHandler) thisExp.addData('mouse_5.x', mouse_5.x) thisExp.addData('mouse_5.y', mouse_5.y) thisExp.addData('mouse_5.leftButton', mouse_5.leftButton) thisExp.addData('mouse_5.midButton', mouse_5.midButton) thisExp.addData('mouse_5.rightButton', mouse_5.rightButton) thisExp.addData('mouse_5.time', mouse_5.time) thisExp.addData('mouse_5.clicked_name', mouse_5.clicked_name) # using non-slip timing so subtract the expected duration of this Routine (unless ended on request) if YellowBlack.maxDurationReached: routineTimer.addTime(-YellowBlack.maxDuration) elif YellowBlack.forceEnded: routineTimer.reset() else: routineTimer.addTime(-175.000000) thisExp.nextEntry() # mark experiment as finished endExperiment(thisExp, win=win) def saveData(thisExp): """ Save data from this experiment Parameters ========== thisExp : psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. """ filename = thisExp.dataFileName # these shouldn't be strictly necessary (should auto-save) thisExp.saveAsWideText(filename + '.csv', delim='auto') thisExp.saveAsPickle(filename) def endExperiment(thisExp, win=None): """ End this experiment, performing final shut down operations. This function does NOT close the window or end the Python process - use `quit` for this. Parameters ========== thisExp : psychopy.data.ExperimentHandler Handler object for this experiment, contains the data to save and information about where to save it to. win : psychopy.visual.Window Window for this experiment. """ if win is not None: # remove autodraw from all current components win.clearAutoDraw() # Flip one final time so any remaining win.callOnFlip() # and win.timeOnFlip() tasks get executed win.flip() # return console logger level to WARNING logging.console.setLevel(logging.WARNING) # mark experiment handler as finished thisExp.status = FINISHED logging.flush() def quit(thisExp, win=None, thisSession=None): """ Fully quit, closing the window and ending the Python process. Parameters ========== win : psychopy.visual.Window Window to close. thisSession : psychopy.session.Session or None Handle of the Session object this experiment is being run from, if any. """ thisExp.abort() # or data files will save again on exit # make sure everything is closed down if win is not None: # Flip one final time so any remaining win.callOnFlip() # and win.timeOnFlip() tasks get executed before quitting win.flip() win.close() logging.flush() if thisSession is not None: thisSession.stop() # terminate Python process core.quit() # if running this experiment as a script... if __name__ == '__main__': # call all functions in order expInfo = showExpInfoDlg(expInfo=expInfo) thisExp = setupData(expInfo=expInfo) logFile = setupLogging(filename=thisExp.dataFileName) win = setupWindow(expInfo=expInfo) setupDevices(expInfo=expInfo, thisExp=thisExp, win=win) run( expInfo=expInfo, thisExp=thisExp, win=win, globalClock='float' ) saveData(thisExp=thisExp) quit(thisExp=thisExp, win=win)