Skip to content
Snippets Groups Projects
Commit d472eff2 authored by unknown's avatar unknown
Browse files

UPDATES: rest, stats

parent 246c0191
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" ?> <?xml version="1.0" ?>
<PsychoPy2experiment encoding="utf-8" version="3.2.4"> <PsychoPy2experiment encoding="utf-8" version="2020.1.0">
<Settings> <Settings>
<Param name="Audio latency priority" updates="None" val="use prefs" valType="str"/> <Param name="Audio latency priority" updates="None" val="use prefs" valType="str"/>
<Param name="Audio lib" updates="None" val="use prefs" valType="str"/> <Param name="Audio lib" updates="None" val="use prefs" valType="str"/>
<Param name="Completed URL" updates="None" val="" valType="str"/> <Param name="Completed URL" updates="None" val="" valType="str"/>
<Param name="Data filename" updates="None" val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code"/> <Param name="Data filename" updates="None" val="u'data/%s/%s_%s_%s' % (expInfo['participant'], expInfo['participant'], expName, expInfo['date'])" valType="code"/>
<Param name="Enable Escape" updates="None" val="True" valType="bool"/> <Param name="Enable Escape" updates="None" val="True" valType="bool"/>
<Param name="Experiment info" updates="None" val="{'participant': '', 'session': '001', 'backN': '3', 'probability': '0.2'}" valType="code"/> <Param name="Experiment info" updates="None" val="{'participant': '', 'session': '001', 'backN': '3', 'probability': '0.2'}" valType="code"/>
<Param name="Force stereo" updates="None" val="True" valType="bool"/> <Param name="Force stereo" updates="None" val="True" valType="bool"/>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<Param name="Show mouse" updates="None" val="False" valType="bool"/> <Param name="Show mouse" updates="None" val="False" valType="bool"/>
<Param name="Units" updates="None" val="deg" valType="str"/> <Param name="Units" updates="None" val="deg" valType="str"/>
<Param name="Use version" updates="None" val="" valType="str"/> <Param name="Use version" updates="None" val="" valType="str"/>
<Param name="Window size (pixels)" updates="None" val="[1366, 768]" valType="code"/> <Param name="Window size (pixels)" updates="None" val="[1920, 1080]" valType="code"/>
<Param name="blendMode" updates="None" val="avg" valType="str"/> <Param name="blendMode" updates="None" val="avg" valType="str"/>
<Param name="color" updates="None" val="$[1,1,1]" valType="str"/> <Param name="color" updates="None" val="$[1,1,1]" valType="str"/>
<Param name="colorSpace" updates="None" val="rgb" valType="str"/> <Param name="colorSpace" updates="None" val="rgb" valType="str"/>
...@@ -53,9 +53,9 @@ ...@@ -53,9 +53,9 @@
<Param name="stopType" updates="None" val="condition" valType="str"/> <Param name="stopType" updates="None" val="condition" valType="str"/>
<Param name="stopVal" updates="constant" val="False" valType="code"/> <Param name="stopVal" updates="constant" val="False" valType="code"/>
<Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/> <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
<Param name="text" updates="constant" val="$&quot;The n-back task presents stimuli sequentially and require you to decide if the current stimulus is the same as one presented n-numbers previous (or back).\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ &quot;For example, the 3-back you will indicate if the current number matches the number presented 3 places previous\n&quot;&amp;#10;+ &quot;(e.g. A H G A B G B shows that 'A' and 'G' have matches in this sequence).\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ f&quot;This is an {expInfo['backN']}-back task.\n&quot;&amp;#10;+ f&quot;Press SPACE if the current stimulus is the same a {expInfo['backN']} places previous.\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ &quot;Press SPACE bar when ready to start.&quot; " valType="str"/> <Param name="text" updates="constant" val="$&quot;The n-back task presents stimuli sequentially and require you to decide if the current stimulus is the same as one presented n-numbers previous (or back).\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ &quot;For example, the 3-back you will indicate if the current number matches the number presented 3 places previous\n&quot;&amp;#10;+ &quot;(e.g. A H G A B G B shows that 'A' and 'G' have matches in this sequence).\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ f&quot;This is an {expInfo['backN']}-back task.\n&quot;&amp;#10;+ f&quot;Press SPACE if the current stimulus is the same a {expInfo['backN']} places previous.\n&quot;&amp;#10;+ &quot;\n&quot;&amp;#10;+ &quot;The task will start after some minutes of rest.&quot;" valType="str"/>
<Param name="units" updates="None" val="from exp settings" valType="str"/> <Param name="units" updates="None" val="from exp settings" valType="str"/>
<Param name="wrapWidth" updates="constant" val="30" valType="code"/> <Param name="wrapWidth" updates="constant" val="45" valType="code"/>
</TextComponent> </TextComponent>
<KeyboardComponent name="instructions_key"> <KeyboardComponent name="instructions_key">
<Param name="allowedKeys" updates="constant" val="'space'" valType="code"/> <Param name="allowedKeys" updates="constant" val="'space'" valType="code"/>
...@@ -126,12 +126,12 @@ ...@@ -126,12 +126,12 @@
<CodeComponent name="trial_code"> <CodeComponent name="trial_code">
<Param name="Begin Experiment" updates="constant" val="prevN = np.array([])" valType="extendedCode"/> <Param name="Begin Experiment" updates="constant" val="prevN = np.array([])" valType="extendedCode"/>
<Param name="Begin JS Experiment" updates="constant" val="" valType="extendedCode"/> <Param name="Begin JS Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="Begin JS Routine" updates="constant" val="" valType="extendedCode"/> <Param name="Begin JS Routine" updates="constant" val="if (((currentLoop.thisN &lt; Number.parseInt(expInfo[&quot;backN&quot;])) || (np.random.uniform() &gt; Number.parseFloat(expInfo[&quot;probability&quot;])))) {&amp;#10; stimleft = np.delete(stimuli, function () {&amp;#10; var _pj_a = [], _pj_b = prevN;&amp;#10; for (var _pj_c = 0, _pj_d = _pj_b.length; (_pj_c &lt; _pj_d); _pj_c += 1) {&amp;#10; var i = _pj_b[_pj_c];&amp;#10; _pj_a.push(np.argwhere((stimuli === i)));&amp;#10; }&amp;#10; return _pj_a;&amp;#10;}&amp;#10;.call(this));&amp;#10; stimulus = np.random.choice(stimleft);&amp;#10; correctResponse = null;&amp;#10;} else {&amp;#10; stimulus = prevN.slice((- Number.parseInt(expInfo[&quot;backN&quot;])))[0];&amp;#10; correctResponse = &quot;space&quot;;&amp;#10;}&amp;#10;" valType="extendedCode"/>
<Param name="Begin Routine" updates="constant" val="if (currentLoop.thisN &lt; int(expInfo['backN'])) or (np.random.uniform() &gt; float(expInfo['probability'])):&amp;#10; stimleft = np.delete(stimuli,[np.argwhere(stimuli==i) for i in prevN])&amp;#10; stimulus = np.random.choice(stimleft)&amp;#10; correctResponse = None&amp;#10;else:&amp;#10; stimulus = prevN[-int(expInfo['backN'])]&amp;#10; correctResponse = 'space'" valType="extendedCode"/> <Param name="Begin Routine" updates="constant" val="if (currentLoop.thisN &lt; int(expInfo['backN'])) or (np.random.uniform() &gt; float(expInfo['probability'])):&amp;#10; stimleft = np.delete(stimuli,[np.argwhere(stimuli==i) for i in prevN])&amp;#10; stimulus = np.random.choice(stimleft)&amp;#10; thisExp.addData('trial_type', 'none')&amp;#10; correctResponse = None&amp;#10;else:&amp;#10; stimulus = prevN[-int(expInfo['backN'])]&amp;#10; thisExp.addData('trial_type', 'back')&amp;#10; correctResponse = 'space'" valType="extendedCode"/>
<Param name="Code Type" updates="None" val="Py" valType="str"/> <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
<Param name="Each Frame" updates="constant" val="" valType="extendedCode"/> <Param name="Each Frame" updates="constant" val="" valType="extendedCode"/>
<Param name="Each JS Frame" updates="constant" val="" valType="extendedCode"/> <Param name="Each JS Frame" updates="constant" val="" valType="extendedCode"/>
<Param name="End Experiment" updates="constant" val="" valType="extendedCode"/> <Param name="End Experiment" updates="constant" val="trialNone = 0; trialBack = 0; hit = 0; miss = 0; fa = 0&amp;#10;for n, t in enumerate(thisExp.entries):&amp;#10; if t['trial_type'] == 'none':&amp;#10; trialNone += 1&amp;#10; if not(t['trial_resp.corr']): fa += 1&amp;#10; if t['trial_type'] == 'back':&amp;#10; trialBack += 1&amp;#10; if t['trial_resp.corr']: hit += 1&amp;#10; else: miss += 1&amp;#10;logging.log(level=logging.DATA, msg='hit={:.2f}%,miss={:.2f}%,fa={:.2f}%'.format(hit/trialBack*100,miss/trialBack*100,fa/trialNone*100))&amp;#10;" valType="extendedCode"/>
<Param name="End JS Experiment" updates="constant" val="" valType="extendedCode"/> <Param name="End JS Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="End JS Routine" updates="constant" val="" valType="extendedCode"/> <Param name="End JS Routine" updates="constant" val="" valType="extendedCode"/>
<Param name="End Routine" updates="constant" val="thisExp.addData('tial_stimulus.stim', stimulus)&amp;#10;prevN = np.hstack((prevN,stimulus))&amp;#10;prevN = prevN[-3:]" valType="extendedCode"/> <Param name="End Routine" updates="constant" val="thisExp.addData('tial_stimulus.stim', stimulus)&amp;#10;prevN = np.hstack((prevN,stimulus))&amp;#10;prevN = prevN[-3:]" valType="extendedCode"/>
...@@ -181,9 +181,100 @@ ...@@ -181,9 +181,100 @@
<Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/> <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
</KeyboardComponent> </KeyboardComponent>
</Routine> </Routine>
<Routine name="Rest">
<PolygonComponent name="rest_bg">
<Param name="disabled" updates="None" val="False" valType="bool"/>
<Param name="durationEstim" updates="None" val="" valType="code"/>
<Param name="fillColor" updates="constant" val="$[1,1,1]" valType="str"/>
<Param name="fillColorSpace" updates="constant" val="rgb" valType="str"/>
<Param name="interpolate" updates="constant" val="linear" valType="str"/>
<Param name="lineColor" updates="constant" val="$[1,1,1]" valType="str"/>
<Param name="lineColorSpace" updates="constant" val="rgb" valType="str"/>
<Param name="lineWidth" updates="constant" val="0" valType="code"/>
<Param name="nVertices" updates="constant" val="4" valType="int"/>
<Param name="name" updates="None" val="rest_bg" valType="code"/>
<Param name="opacity" updates="constant" val="1" valType="code"/>
<Param name="ori" updates="constant" val="0" valType="code"/>
<Param name="pos" updates="constant" val="(0, 0)" valType="code"/>
<Param name="saveStartStop" updates="None" val="True" valType="bool"/>
<Param name="shape" updates="constant" val="rectangle" valType="str"/>
<Param name="size" updates="constant" val="(2, 2)" valType="code"/>
<Param name="startEstim" updates="None" val="" valType="code"/>
<Param name="startType" updates="None" val="time (s)" valType="str"/>
<Param name="startVal" updates="None" val="0.0" valType="code"/>
<Param name="stopType" updates="None" val="duration (s)" valType="str"/>
<Param name="stopVal" updates="constant" val="300" valType="code"/>
<Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
<Param name="units" updates="None" val="norm" valType="str"/>
</PolygonComponent>
<TextComponent name="rest_text">
<Param name="color" updates="constant" val="black" valType="str"/>
<Param name="colorSpace" updates="constant" val="rgb" valType="str"/>
<Param name="disabled" updates="None" val="False" valType="bool"/>
<Param name="durationEstim" updates="None" val="" valType="code"/>
<Param name="flip" updates="constant" val="" valType="str"/>
<Param name="font" updates="constant" val="Arial" valType="str"/>
<Param name="languageStyle" updates="None" val="LTR" valType="str"/>
<Param name="letterHeight" updates="constant" val="1" valType="code"/>
<Param name="name" updates="None" val="rest_text" valType="code"/>
<Param name="opacity" updates="constant" val="1" valType="code"/>
<Param name="ori" updates="constant" val="0" valType="code"/>
<Param name="pos" updates="constant" val="(0, 0)" valType="code"/>
<Param name="saveStartStop" updates="None" val="True" valType="bool"/>
<Param name="startEstim" updates="None" val="" valType="code"/>
<Param name="startType" updates="None" val="time (s)" valType="str"/>
<Param name="startVal" updates="None" val="0.0" valType="code"/>
<Param name="stopType" updates="None" val="duration (s)" valType="str"/>
<Param name="stopVal" updates="constant" val="270" valType="code"/>
<Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
<Param name="text" updates="constant" val="Rest" valType="str"/>
<Param name="units" updates="None" val="from exp settings" valType="str"/>
<Param name="wrapWidth" updates="constant" val="" valType="code"/>
</TextComponent>
<TextComponent name="rest_text2">
<Param name="color" updates="constant" val="black" valType="str"/>
<Param name="colorSpace" updates="constant" val="rgb" valType="str"/>
<Param name="disabled" updates="None" val="False" valType="bool"/>
<Param name="durationEstim" updates="None" val="" valType="code"/>
<Param name="flip" updates="constant" val="" valType="str"/>
<Param name="font" updates="constant" val="Arial" valType="str"/>
<Param name="languageStyle" updates="None" val="LTR" valType="str"/>
<Param name="letterHeight" updates="constant" val="1" valType="code"/>
<Param name="name" updates="None" val="rest_text2" valType="code"/>
<Param name="opacity" updates="constant" val="1" valType="code"/>
<Param name="ori" updates="constant" val="0" valType="code"/>
<Param name="pos" updates="constant" val="(0, 0)" valType="code"/>
<Param name="saveStartStop" updates="None" val="True" valType="bool"/>
<Param name="startEstim" updates="None" val="" valType="code"/>
<Param name="startType" updates="None" val="time (s)" valType="str"/>
<Param name="startVal" updates="None" val="270" valType="code"/>
<Param name="stopType" updates="None" val="duration (s)" valType="str"/>
<Param name="stopVal" updates="constant" val="29" valType="code"/>
<Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
<Param name="text" updates="constant" val="Get ready!" valType="str"/>
<Param name="units" updates="None" val="from exp settings" valType="str"/>
<Param name="wrapWidth" updates="constant" val="" valType="code"/>
</TextComponent>
<CodeComponent name="rest_code">
<Param name="Begin Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="Begin JS Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="Begin JS Routine" updates="constant" val="" valType="extendedCode"/>
<Param name="Begin Routine" updates="constant" val="" valType="extendedCode"/>
<Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
<Param name="Each Frame" updates="constant" val="if routineTimer.getTime() &lt;= 10:&amp;#10; rest_text2.setText(&quot;Get ready!\n{}&quot;.format(round(routineTimer.getTime())), log=False)&amp;#10;" valType="extendedCode"/>
<Param name="Each JS Frame" updates="constant" val="/* Syntax Error: Fix Python code */" valType="extendedCode"/>
<Param name="End Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="End JS Experiment" updates="constant" val="" valType="extendedCode"/>
<Param name="End JS Routine" updates="constant" val="" valType="extendedCode"/>
<Param name="End Routine" updates="constant" val="" valType="extendedCode"/>
<Param name="disabled" updates="None" val="False" valType="bool"/>
<Param name="name" updates="None" val="rest_code" valType="code"/>
</CodeComponent>
</Routine>
</Routines> </Routines>
<Flow> <Flow>
<Routine name="Instructions"/> <Routine name="Instructions"/>
<Routine name="Rest"/>
<LoopInitiator loopType="TrialHandler" name="loop"> <LoopInitiator loopType="TrialHandler" name="loop">
<Param name="Selected rows" updates="None" val="" valType="str"/> <Param name="Selected rows" updates="None" val="" valType="str"/>
<Param name="conditions" updates="None" val="None" valType="str"/> <Param name="conditions" updates="None" val="None" valType="str"/>
......
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
This experiment was created using PsychoPy3 Experiment Builder (v3.2.4), This experiment was created using PsychoPy3 Experiment Builder (v2020.1.0),
on November 15, 2019, at 12:50 on February 13, 2020, at 15:00
If you publish work using this script the most relevant publication is: 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) Peirce J, Gray JR, Simpson S, MacAskill M, Höchenberger R, Sogo H, Kastman E, Lindeløv JK. (2019)
...@@ -28,12 +28,14 @@ import sys # to get file system encoding ...@@ -28,12 +28,14 @@ import sys # to get file system encoding
from psychopy.hardware import keyboard from psychopy.hardware import keyboard
# Ensure that relative paths start from the same directory as this script # Ensure that relative paths start from the same directory as this script
_thisDir = os.path.dirname(os.path.abspath(__file__)) _thisDir = os.path.dirname(os.path.abspath(__file__))
os.chdir(_thisDir) os.chdir(_thisDir)
# Store info about the experiment session # Store info about the experiment session
psychopyVersion = '3.2.4' psychopyVersion = '2020.1.0'
expName = 'three-back' # from the Builder filename that created this script expName = 'three-back' # from the Builder filename that created this script
expInfo = {'participant': '', 'session': '001', 'backN': '3', 'probability': '0.2'} expInfo = {'participant': '', 'session': '001', 'backN': '3', 'probability': '0.2'}
dlg = gui.DlgFromDict(dictionary=expInfo, sortKeys=False, title=expName) dlg = gui.DlgFromDict(dictionary=expInfo, sortKeys=False, title=expName)
...@@ -44,12 +46,12 @@ expInfo['expName'] = expName ...@@ -44,12 +46,12 @@ expInfo['expName'] = expName
expInfo['psychopyVersion'] = psychopyVersion expInfo['psychopyVersion'] = psychopyVersion
# Data file name stem = absolute path + name; later add .psyexp, .csv, .log, etc # Data file name stem = absolute path + name; later add .psyexp, .csv, .log, etc
filename = _thisDir + os.sep + u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date']) filename = _thisDir + os.sep + u'data/%s/%s_%s_%s' % (expInfo['participant'], expInfo['participant'], expName, expInfo['date'])
# An ExperimentHandler isn't essential but helps with data saving # An ExperimentHandler isn't essential but helps with data saving
thisExp = data.ExperimentHandler(name=expName, version='', thisExp = data.ExperimentHandler(name=expName, version='',
extraInfo=expInfo, runtimeInfo=None, extraInfo=expInfo, runtimeInfo=None,
originPath='C:\\Users\\User\\Documents\\PROJECT_FOLDER\\three-back\\three-back.py', originPath='C:\\Users\\nemo\\Desktop\\NEMO\\Paradigms\\three-back\\three-back.py',
savePickle=True, saveWideText=True, savePickle=True, saveWideText=True,
dataFileName=filename) dataFileName=filename)
# save a log file for detail verbose info # save a log file for detail verbose info
...@@ -63,7 +65,7 @@ frameTolerance = 0.001 # how close to onset before 'same' frame ...@@ -63,7 +65,7 @@ frameTolerance = 0.001 # how close to onset before 'same' frame
# Setup the Window # Setup the Window
win = visual.Window( win = visual.Window(
size=[1366, 768], fullscr=True, screen=0, size=[1920, 1080], fullscr=True, screen=0,
winType='pyglet', allowGUI=False, allowStencil=False, winType='pyglet', allowGUI=False, allowStencil=False,
monitor='testMonitor', color=[1,1,1], colorSpace='rgb', monitor='testMonitor', color=[1,1,1], colorSpace='rgb',
blendMode='avg', useFBO=True, blendMode='avg', useFBO=True,
...@@ -89,9 +91,9 @@ instructions = visual.TextStim(win=win, name='instructions', ...@@ -89,9 +91,9 @@ instructions = visual.TextStim(win=win, name='instructions',
+ f"This is an {expInfo['backN']}-back task.\n" + f"This is an {expInfo['backN']}-back task.\n"
+ f"Press SPACE if the current stimulus is the same a {expInfo['backN']} places previous.\n" + f"Press SPACE if the current stimulus is the same a {expInfo['backN']} places previous.\n"
+ "\n" + "\n"
+ "Press SPACE bar when ready to start." , + "The task will start after some minutes of rest.",
font='Arial', font='Arial',
pos=(0, 0), height=1, wrapWidth=30, ori=0, pos=(0, 0), height=1, wrapWidth=45, ori=0,
color='black', colorSpace='rgb', opacity=1, color='black', colorSpace='rgb', opacity=1,
languageStyle='LTR', languageStyle='LTR',
depth=0.0); depth=0.0);
...@@ -100,6 +102,30 @@ instructions_key = keyboard.Keyboard() ...@@ -100,6 +102,30 @@ instructions_key = keyboard.Keyboard()
stimuli = np.array(['A','B','C','D','E','F','G','H']) stimuli = np.array(['A','B','C','D','E','F','G','H'])
stimuliContainer = [] stimuliContainer = []
# Initialize components for Routine "Rest"
RestClock = core.Clock()
rest_bg = visual.Rect(
win=win, name='rest_bg',units='norm',
width=(2, 2)[0], height=(2, 2)[1],
ori=0, pos=(0, 0),
lineWidth=0, lineColor=[1,1,1], lineColorSpace='rgb',
fillColor=[1,1,1], fillColorSpace='rgb',
opacity=1, depth=0.0, interpolate=True)
rest_text = visual.TextStim(win=win, name='rest_text',
text='Rest',
font='Arial',
pos=(0, 0), height=1, wrapWidth=None, ori=0,
color='black', colorSpace='rgb', opacity=1,
languageStyle='LTR',
depth=-1.0);
rest_text2 = visual.TextStim(win=win, name='rest_text2',
text='Get ready!',
font='Arial',
pos=(0, 0), height=1, wrapWidth=None, ori=0,
color='black', colorSpace='rgb', opacity=1,
languageStyle='LTR',
depth=-2.0);
# Initialize components for Routine "trial" # Initialize components for Routine "trial"
trialClock = core.Clock() trialClock = core.Clock()
prevN = np.array([]) prevN = np.array([])
...@@ -121,6 +147,7 @@ continueRoutine = True ...@@ -121,6 +147,7 @@ continueRoutine = True
# update component parameters for each repeat # update component parameters for each repeat
instructions_key.keys = [] instructions_key.keys = []
instructions_key.rt = [] instructions_key.rt = []
_instructions_key_allKeys = []
# keep track of which components have finished # keep track of which components have finished
InstructionsComponents = [instructions, instructions_key] InstructionsComponents = [instructions, instructions_key]
for thisComponent in InstructionsComponents: for thisComponent in InstructionsComponents:
...@@ -170,14 +197,13 @@ while continueRoutine: ...@@ -170,14 +197,13 @@ while continueRoutine:
win.timeOnFlip(instructions_key, 'tStartRefresh') # time at next scr refresh win.timeOnFlip(instructions_key, 'tStartRefresh') # time at next scr refresh
instructions_key.status = STARTED instructions_key.status = STARTED
# keyboard checking is just starting # keyboard checking is just starting
instructions_key.clock.reset() # now t=0
if instructions_key.status == STARTED: if instructions_key.status == STARTED:
theseKeys = instructions_key.getKeys(keyList=['space'], waitRelease=False) theseKeys = instructions_key.getKeys(keyList=['space'], waitRelease=False)
if len(theseKeys): _instructions_key_allKeys.extend(theseKeys)
theseKeys = theseKeys[0] # at least one key was pressed if len(_instructions_key_allKeys):
instructions_key.keys = _instructions_key_allKeys[-1].name # just the last key pressed
# check for quit: instructions_key.rt = _instructions_key_allKeys[-1].rt
if "escape" == theseKeys:
endExpNow = True
# a response ends the routine # a response ends the routine
continueRoutine = False continueRoutine = False
...@@ -205,6 +231,116 @@ for thisComponent in InstructionsComponents: ...@@ -205,6 +231,116 @@ for thisComponent in InstructionsComponents:
# the Routine "Instructions" was not non-slip safe, so reset the non-slip timer # the Routine "Instructions" was not non-slip safe, so reset the non-slip timer
routineTimer.reset() routineTimer.reset()
# ------Prepare to start Routine "Rest"-------
continueRoutine = True
routineTimer.add(300.000000)
# update component parameters for each repeat
# keep track of which components have finished
RestComponents = [rest_bg, rest_text, rest_text2]
for thisComponent in RestComponents:
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")
RestClock.reset(-_timeToFirstFrame) # t0 is time of first possible flip
frameN = -1
# -------Run Routine "Rest"-------
while continueRoutine and routineTimer.getTime() > 0:
# get current time
t = RestClock.getTime()
tThisFlip = win.getFutureFlipTime(clock=RestClock)
tThisFlipGlobal = win.getFutureFlipTime(clock=None)
frameN = frameN + 1 # number of completed frames (so 0 is the first frame)
# update/draw components on each frame
# *rest_bg* updates
if rest_bg.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
# keep track of start time/frame for later
rest_bg.frameNStart = frameN # exact frame index
rest_bg.tStart = t # local t and not account for scr refresh
rest_bg.tStartRefresh = tThisFlipGlobal # on global time
win.timeOnFlip(rest_bg, 'tStartRefresh') # time at next scr refresh
rest_bg.setAutoDraw(True)
if rest_bg.status == STARTED:
# is it time to stop? (based on global clock, using actual start)
if tThisFlipGlobal > rest_bg.tStartRefresh + 300-frameTolerance:
# keep track of stop time/frame for later
rest_bg.tStop = t # not accounting for scr refresh
rest_bg.frameNStop = frameN # exact frame index
win.timeOnFlip(rest_bg, 'tStopRefresh') # time at next scr refresh
rest_bg.setAutoDraw(False)
# *rest_text* updates
if rest_text.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
# keep track of start time/frame for later
rest_text.frameNStart = frameN # exact frame index
rest_text.tStart = t # local t and not account for scr refresh
rest_text.tStartRefresh = tThisFlipGlobal # on global time
win.timeOnFlip(rest_text, 'tStartRefresh') # time at next scr refresh
rest_text.setAutoDraw(True)
if rest_text.status == STARTED:
# is it time to stop? (based on global clock, using actual start)
if tThisFlipGlobal > rest_text.tStartRefresh + 270-frameTolerance:
# keep track of stop time/frame for later
rest_text.tStop = t # not accounting for scr refresh
rest_text.frameNStop = frameN # exact frame index
win.timeOnFlip(rest_text, 'tStopRefresh') # time at next scr refresh
rest_text.setAutoDraw(False)
# *rest_text2* updates
if rest_text2.status == NOT_STARTED and tThisFlip >= 270-frameTolerance:
# keep track of start time/frame for later
rest_text2.frameNStart = frameN # exact frame index
rest_text2.tStart = t # local t and not account for scr refresh
rest_text2.tStartRefresh = tThisFlipGlobal # on global time
win.timeOnFlip(rest_text2, 'tStartRefresh') # time at next scr refresh
rest_text2.setAutoDraw(True)
if rest_text2.status == STARTED:
# is it time to stop? (based on global clock, using actual start)
if tThisFlipGlobal > rest_text2.tStartRefresh + 29-frameTolerance:
# keep track of stop time/frame for later
rest_text2.tStop = t # not accounting for scr refresh
rest_text2.frameNStop = frameN # exact frame index
win.timeOnFlip(rest_text2, 'tStopRefresh') # time at next scr refresh
rest_text2.setAutoDraw(False)
if routineTimer.getTime() <= 10:
rest_text2.setText("Get ready!\n{}".format(round(routineTimer.getTime())), log=False)
# check for quit (typically the Esc key)
if endExpNow or defaultKeyboard.getKeys(keyList=["escape"]):
core.quit()
# check if all components have finished
if not continueRoutine: # a component has requested a forced-end of Routine
break
continueRoutine = False # will revert to True if at least one component still running
for thisComponent in RestComponents:
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 "Rest"-------
for thisComponent in RestComponents:
if hasattr(thisComponent, "setAutoDraw"):
thisComponent.setAutoDraw(False)
thisExp.addData('rest_bg.started', rest_bg.tStartRefresh)
thisExp.addData('rest_bg.stopped', rest_bg.tStopRefresh)
thisExp.addData('rest_text.started', rest_text.tStartRefresh)
thisExp.addData('rest_text.stopped', rest_text.tStopRefresh)
thisExp.addData('rest_text2.started', rest_text2.tStartRefresh)
thisExp.addData('rest_text2.stopped', rest_text2.tStopRefresh)
# set up handler to look after randomisation of conditions etc # set up handler to look after randomisation of conditions etc
loop = data.TrialHandler(nReps=150, method='sequential', loop = data.TrialHandler(nReps=150, method='sequential',
extraInfo=expInfo, originPath=-1, extraInfo=expInfo, originPath=-1,
...@@ -231,13 +367,16 @@ for thisLoop in loop: ...@@ -231,13 +367,16 @@ for thisLoop in loop:
if (currentLoop.thisN < int(expInfo['backN'])) or (np.random.uniform() > float(expInfo['probability'])): if (currentLoop.thisN < int(expInfo['backN'])) or (np.random.uniform() > float(expInfo['probability'])):
stimleft = np.delete(stimuli,[np.argwhere(stimuli==i) for i in prevN]) stimleft = np.delete(stimuli,[np.argwhere(stimuli==i) for i in prevN])
stimulus = np.random.choice(stimleft) stimulus = np.random.choice(stimleft)
thisExp.addData('trial_type', 'none')
correctResponse = None correctResponse = None
else: else:
stimulus = prevN[-int(expInfo['backN'])] stimulus = prevN[-int(expInfo['backN'])]
thisExp.addData('trial_type', 'back')
correctResponse = 'space' correctResponse = 'space'
trial_stimulus.setText(stimulus) trial_stimulus.setText(stimulus)
trial_resp.keys = [] trial_resp.keys = []
trial_resp.rt = [] trial_resp.rt = []
_trial_resp_allKeys = []
# keep track of which components have finished # keep track of which components have finished
trialComponents = [trial_stimulus, trial_resp] trialComponents = [trial_stimulus, trial_resp]
for thisComponent in trialComponents: for thisComponent in trialComponents:
...@@ -302,20 +441,15 @@ for thisLoop in loop: ...@@ -302,20 +441,15 @@ for thisLoop in loop:
trial_resp.status = FINISHED trial_resp.status = FINISHED
if trial_resp.status == STARTED and not waitOnFlip: if trial_resp.status == STARTED and not waitOnFlip:
theseKeys = trial_resp.getKeys(keyList=['space'], waitRelease=False) theseKeys = trial_resp.getKeys(keyList=['space'], waitRelease=False)
if len(theseKeys): _trial_resp_allKeys.extend(theseKeys)
theseKeys = theseKeys[0] # at least one key was pressed if len(_trial_resp_allKeys):
trial_resp.keys = _trial_resp_allKeys[0].name # just the first key pressed
# check for quit: trial_resp.rt = _trial_resp_allKeys[0].rt
if "escape" == theseKeys: # was this correct?
endExpNow = True if (trial_resp.keys == str(correctResponse)) or (trial_resp.keys == correctResponse):
if trial_resp.keys == []: # then this was the first keypress trial_resp.corr = 1
trial_resp.keys = theseKeys.name # just the first key pressed else:
trial_resp.rt = theseKeys.rt trial_resp.corr = 0
# was this 'correct'?
if (trial_resp.keys == str(correctResponse)) or (trial_resp.keys == correctResponse):
trial_resp.corr = 1
else:
trial_resp.corr = 0
# check for quit (typically the Esc key) # check for quit (typically the Esc key)
if endExpNow or defaultKeyboard.getKeys(keyList=["escape"]): if endExpNow or defaultKeyboard.getKeys(keyList=["escape"]):
...@@ -362,6 +496,17 @@ for thisLoop in loop: ...@@ -362,6 +496,17 @@ for thisLoop in loop:
# completed 150 repeats of 'loop' # completed 150 repeats of 'loop'
trialNone = 0; trialBack = 0; hit = 0; miss = 0; fa = 0
for n, t in enumerate(thisExp.entries):
if t['trial_type'] == 'none':
trialNone += 1
if not(t['trial_resp.corr']): fa += 1
if t['trial_type'] == 'back':
trialBack += 1
if t['trial_resp.corr']: hit += 1
else: miss += 1
logging.log(level=logging.DATA, msg='hit={:.2f}%,miss={:.2f}%,fa={:.2f}%'.format(hit/trialBack*100,miss/trialBack*100,fa/trialNone*100))
# Flip one final time so any remaining win.callOnFlip() # Flip one final time so any remaining win.callOnFlip()
# and win.timeOnFlip() tasks get executed before quitting # and win.timeOnFlip() tasks get executed before quitting
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment