Browse Source

Upload files to ''

Yuri Pavlov 2 years ago
parent
commit
74a26d740e
32 changed files with 4477 additions and 0 deletions
  1. 33 0
      stimuli/presentationScript/experiment.py
  2. BIN
      stimuli/presentationScript/num/1.wav
  3. BIN
      stimuli/presentationScript/num/10.wav
  4. BIN
      stimuli/presentationScript/num/2.wav
  5. BIN
      stimuli/presentationScript/num/3.wav
  6. BIN
      stimuli/presentationScript/num/4.wav
  7. BIN
      stimuli/presentationScript/num/5.wav
  8. BIN
      stimuli/presentationScript/num/6.wav
  9. BIN
      stimuli/presentationScript/num/7.wav
  10. BIN
      stimuli/presentationScript/num/8.wav
  11. BIN
      stimuli/presentationScript/num/9.wav
  12. BIN
      stimuli/presentationScript/num/FixCross.png
  13. BIN
      stimuli/presentationScript/num/end_block.wav
  14. BIN
      stimuli/presentationScript/num/mic_white.png
  15. BIN
      stimuli/presentationScript/num/repeat.wav
  16. BIN
      stimuli/presentationScript/num/start.wav
  17. 673 0
      stimuli/presentationScript/peavler.psyexp
  18. 1162 0
      stimuli/presentationScript/peavler.py
  19. 1162 0
      stimuli/presentationScript/peavler_lastrun.py
  20. 396 0
      stimuli/presentationScript/peavler_training.psyexp
  21. 908 0
      stimuli/presentationScript/peavler_training_lastrun.py
  22. BIN
      stimuli/presentationScript/repNums_0.xlsx
  23. BIN
      stimuli/presentationScript/repNums_1.xlsx
  24. BIN
      stimuli/presentationScript/rest_inst.xlsx
  25. BIN
      stimuli/presentationScript/sounds.xlsx
  26. 4 0
      stimuli/presentationScript/timer.py
  27. 16 0
      stimuli/presentationScript/timer_tt.sh
  28. BIN
      stimuli/presentationScript/trainingTrials_0.xlsx
  29. BIN
      stimuli/presentationScript/trainingTrials_1.xlsx
  30. 10 0
      stimuli/presentationScript/triggers.txt
  31. 113 0
      stimuli/presentationScript/zmq_socket.py
  32. BIN
      stimuli/taskDescription.jpg

+ 33 - 0
stimuli/presentationScript/experiment.py

@@ -0,0 +1,33 @@
+from zmq_socket import ZMQsocket
+from time import sleep, time
+
+remote_ip = '10.142.20.154'
+print('Make sure the ports match with Pupil Capture Remote Plugin and the one in zmq_pocket.py')
+port = '50020'
+socket = ZMQsocket()
+socket.connect()
+# socket.start_calibration()
+
+# Grab the time module for timesync
+time_fn = time
+
+# Sync time
+print(socket.set_time(time_fn))
+
+# # Start the notifications puglin
+socket.notify({'subject': 'start_plugin', 'name': 'Annotation_Capture', 'args': {}})
+#
+socket.start_recording() # commenting this out to test something, needs to be uncommented later.
+
+sleep(1.)
+
+# Send some annotations
+socket.annotation('start_trial', 0)
+sleep(5.)  # sleep a bit
+
+socket.annotation('end_trial', 0)
+sleep(1.)
+
+# Finish up
+socket.stop_recording()
+print('Script completed.')

BIN
stimuli/presentationScript/num/1.wav


BIN
stimuli/presentationScript/num/10.wav


BIN
stimuli/presentationScript/num/2.wav


BIN
stimuli/presentationScript/num/3.wav


BIN
stimuli/presentationScript/num/4.wav


BIN
stimuli/presentationScript/num/5.wav


BIN
stimuli/presentationScript/num/6.wav


BIN
stimuli/presentationScript/num/7.wav


BIN
stimuli/presentationScript/num/8.wav


BIN
stimuli/presentationScript/num/9.wav


BIN
stimuli/presentationScript/num/FixCross.png


BIN
stimuli/presentationScript/num/end_block.wav


BIN
stimuli/presentationScript/num/mic_white.png


BIN
stimuli/presentationScript/num/repeat.wav


BIN
stimuli/presentationScript/num/start.wav


+ 673 - 0
stimuli/presentationScript/peavler.psyexp

@@ -0,0 +1,673 @@
+<?xml version="1.0" ?>
+<PsychoPy2experiment encoding="utf-8" version="2020.1.3">
+  <Settings>
+    <Param name="Audio latency priority" updates="None" val="3" valType="str"/>
+    <Param name="Audio lib" updates="None" val="pyo" valType="str"/>
+    <Param name="Completed URL" updates="None" val="" valType="str"/>
+    <Param name="Data file delimiter" updates="None" val="auto" valType="str"/>
+    <Param name="Data filename" updates="None" val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code"/>
+    <Param name="Enable Escape" updates="None" val="True" valType="bool"/>
+    <Param name="Experiment info" updates="None" val="{'participant': '', 'session': 'experiment'}" valType="code"/>
+    <Param name="Force stereo" updates="None" val="True" valType="bool"/>
+    <Param name="Full-screen window" updates="None" val="True" valType="bool"/>
+    <Param name="HTML path" updates="None" val="html" valType="str"/>
+    <Param name="Incomplete URL" updates="None" val="" valType="str"/>
+    <Param name="JS libs" updates="None" val="packaged" valType="str"/>
+    <Param name="Monitor" updates="None" val="testMonitor" valType="str"/>
+    <Param name="Resources" updates="None" val="[]" valType="fileList"/>
+    <Param name="Save csv file" updates="None" val="False" valType="bool"/>
+    <Param name="Save excel file" updates="None" val="False" valType="bool"/>
+    <Param name="Save log file" updates="None" val="True" valType="bool"/>
+    <Param name="Save psydat file" updates="None" val="True" valType="bool"/>
+    <Param name="Save wide csv file" updates="None" val="True" valType="bool"/>
+    <Param name="Screen" updates="None" val="1" valType="num"/>
+    <Param name="Show info dlg" updates="None" val="True" valType="bool"/>
+    <Param name="Show mouse" updates="None" val="False" valType="bool"/>
+    <Param name="Units" updates="None" val="height" valType="str"/>
+    <Param name="Use version" updates="None" val="2020.1.3" valType="str"/>
+    <Param name="Window size (pixels)" updates="None" val="[1920, 1080]" valType="code"/>
+    <Param name="blendMode" updates="None" val="avg" valType="str"/>
+    <Param name="color" updates="None" val="$[0, 0, 0]" valType="str"/>
+    <Param name="colorSpace" updates="None" val="rgb" valType="str"/>
+    <Param name="expName" updates="None" val="peavler" valType="str"/>
+    <Param name="exportHTML" updates="None" val="on Sync" valType="str"/>
+    <Param name="logging level" updates="None" val="exp" valType="code"/>
+  </Settings>
+  <Routines>
+    <Routine name="end_block">
+      <CodeComponent name="trigger_endBlock">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="socket.annotation(&quot;190&quot;, 0);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="socket.annotation('190', 0)" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_endBlock" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_endBlock_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_endBlock_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="190" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <SoundComponent name="end">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="end" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="num/end_block.wav" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <ImageComponent name="FixCross_end">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="FixCross_end" valType="code"/>
+        <Param name="opacity" updates="constant" val="0" 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="size" updates="constant" val="" 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="5.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="repeat">
+      <CodeComponent name="trigger_mic">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="socket.annotation(&quot;180&quot;, 0);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="socket.annotation('180', 0)" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_mic" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_mic_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_mic_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="180" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <CodeComponent name="skip_routine">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="if ((skip_mic === 1)) {&amp;#10;    continueRoutine = false;&amp;#10;}&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="if skip_mic==1:&amp;#10;    continueRoutine = False" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="skip_routine" valType="code"/>
+      </CodeComponent>
+      <MicrophoneComponent name="mic_1">
+        <Param name="channel" updates="None" val="0" valType="code"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="mic_1" 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" valType="code"/>
+        <Param name="stereo" updates="None" val="False" valType="bool"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="$micDuration" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </MicrophoneComponent>
+      <ImageComponent name="mic_image">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="11" valType="code"/>
+        <Param name="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/mic_white.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="mic_image" 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="size" updates="constant" val="(0.67, 0.36)" 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" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="$micDuration" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="rest">
+      <CodeComponent name="trigger_rest">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="socket.annotation(&quot;100&quot;, 0);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="socket.annotation('100', 0)" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_rest" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_rest_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_rest_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="100" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <TextComponent name="rest_instruction">
+        <Param name="color" updates="set every repeat" val="white" 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="0.056" valType="code"/>
+        <Param name="name" updates="None" val="rest_instruction" 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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="set every repeat" val="$rest_inst&amp;#10;" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+      <KeyboardComponent name="key_resp_2">
+        <Param name="allowedKeys" updates="constant" val="'space'" valType="code"/>
+        <Param name="correctAns" updates="constant" val="" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="discard previous" updates="constant" val="True" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="forceEndRoutine" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="key_resp_2" 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="" valType="code"/>
+        <Param name="store" updates="constant" val="last key" valType="str"/>
+        <Param name="storeCorrect" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+      </KeyboardComponent>
+      <CodeComponent name="experimenterWarning">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="if ((rest_cond === 1)) {&amp;#10;    console.log(&quot;COME IN&quot;);&amp;#10;}&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="if rest_cond == 1:&amp;#10;    print(&quot;COME IN&quot;)" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="experimenterWarning" valType="code"/>
+      </CodeComponent>
+    </Routine>
+    <Routine name="Randomizer">
+      <CodeComponent name="randomize">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Begin Experiment" updates="constant" val="from numpy.random import choice&amp;#10;import random&amp;#10;from numpy import arange, concatenate&amp;#10;&amp;#10;def randomDigits(numOfReps):&amp;#10;    if numOfReps&lt;=10:&amp;#10;        return choice(10, size=numOfReps, replace=False)&amp;#10;    else:&amp;#10;        arr1 = list(choice(10, size=10, replace=False))&amp;#10;        arr2 = list(choice(10, size=numOfReps-10, replace=False))&amp;#10;        while arr2[0] == arr1[-1]:&amp;#10;            random.shuffle(arr2)&amp;#10;        return arr1+arr2&amp;#10;&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin JS Experiment" updates="constant" val="&amp;#10;        // add-on: list(s: string): string[]&amp;#10;        function list(s) {&amp;#10;            // if s is a string, we return a list of its characters&amp;#10;            if (typeof s === 'string')&amp;#10;                return s.split('');&amp;#10;            else&amp;#10;                // otherwise we return s:&amp;#10;                return s;&amp;#10;        }&amp;#10;        &amp;#10;        import {choice} from 'numpy/random';&amp;#10;import * as random from 'random';&amp;#10;import {arange, concatenate} from 'numpy';&amp;#10;function randomDigits(numOfReps) {&amp;#10;    var arr1, arr2;&amp;#10;    if ((numOfReps &lt;= 10)) {&amp;#10;        return choice(10, {&quot;size&quot;: numOfReps, &quot;replace&quot;: false});&amp;#10;    } else {&amp;#10;        arr1 = list(choice(10, {&quot;size&quot;: 10, &quot;replace&quot;: false}));&amp;#10;        arr2 = list(choice(10, {&quot;size&quot;: (numOfReps - 10), &quot;replace&quot;: false}));&amp;#10;        while ((arr2[0] === arr1.slice((- 1))[0])) {&amp;#10;            random.shuffle(arr2);&amp;#10;        }&amp;#10;        return (arr1 + arr2);&amp;#10;    }&amp;#10;}&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin JS Routine" updates="constant" val="l1 = choice([0, 1, 2], 3, {&quot;replace&quot;: false});&amp;#10;r = choice(arange(3, 15), 12, {&quot;replace&quot;: false});&amp;#10;l2 = choice([15, 16, 17], 3, {&quot;replace&quot;: false});&amp;#10;trialsOrder = concatenate([l1, r, l2]);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="# 3 listen + 12 remember + 3 listen trials per block&amp;#10;&amp;#10;l1 = choice([0,1,2],3,replace=False)&amp;#10;r = choice(arange(3,15),12,replace=False)&amp;#10;l2 = choice([15,16,17],3,replace=False)&amp;#10;&amp;#10;trialsOrder = concatenate([l1,r,l2])&amp;#10;" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each Frame" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Each JS Frame" updates="constant" val="" valType="extendedCode"/>
+        <Param name="End Experiment" updates="constant" val="thisExp.addData(&quot;globalClockTime&quot;, globalClock.getTime())&amp;#10;thisExp.nextEntry()" valType="extendedCode"/>
+        <Param name="End JS Experiment" updates="constant" val="thisExp.addData(&quot;globalClockTime&quot;, globalClock.getTime());&amp;#10;thisExp.nextEntry();&amp;#10;" 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="randomize" valType="code"/>
+      </CodeComponent>
+      <CodeComponent name="ETtrigger_setup">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Begin Experiment" updates="constant" val="from zmq_socket import ZMQsocket&amp;#10;from time import sleep, time&amp;#10;&amp;#10;#remote_ip = '192.168.0.2'&amp;#10;remote_ip = '127.0.0.1'&amp;#10;print('Make sure the ports match with Pupil Capture Remote Plugin and the one in zmq_pocket.py')&amp;#10;port = '50020'&amp;#10;socket = ZMQsocket(remote_ip,port)&amp;#10;socket.connect()&amp;#10;# socket.start_calibration()&amp;#10;&amp;#10;# Grab the time module for timesync&amp;#10;time_fn = time&amp;#10;&amp;#10;# Sync time&amp;#10;print(socket.set_time(time_fn))&amp;#10;&amp;#10;# # Start the notifications plugin&amp;#10;socket.notify({'subject': 'start_plugin', 'name': 'Annotation_Capture', 'args': {}})&amp;#10;#&amp;#10;socket.start_recording() # commenting this out to test something, needs to be uncommented later.&amp;#10;&amp;#10;core.wait(0.005)&amp;#10;## send name of the participant as a trigger&amp;#10;socket.annotation(str('Participant number '+expInfo['participant']), 0)&amp;#10;print(str('Participant number '+expInfo['participant']))&amp;#10;core.wait(10.005)&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin JS Experiment" updates="constant" val="import {ZMQsocket} from 'zmq_socket';&amp;#10;import {sleep, time} from 'time';&amp;#10;var port, remote_ip, socket, time_fn;&amp;#10;remote_ip = &quot;127.0.0.1&quot;;&amp;#10;console.log(&quot;Make sure the ports match with Pupil Capture Remote Plugin and the one in zmq_pocket.py&quot;);&amp;#10;port = &quot;50020&quot;;&amp;#10;socket = new ZMQsocket(remote_ip, port);&amp;#10;socket.connect();&amp;#10;time_fn = time;&amp;#10;console.log(socket.set_time(time_fn));&amp;#10;socket.notify({&quot;subject&quot;: &quot;start_plugin&quot;, &quot;name&quot;: &quot;Annotation_Capture&quot;, &quot;args&quot;: {}});&amp;#10;socket.start_recording();&amp;#10;core.wait(0.005);&amp;#10;socket.annotation((&quot;Participant number &quot; + expInfo[&quot;participant&quot;]).toString(), 0);&amp;#10;console.log((&quot;Participant number &quot; + expInfo[&quot;participant&quot;]).toString());&amp;#10;core.wait(10.005);&amp;#10;" 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="" valType="extendedCode"/>
+        <Param name="Each JS Frame" updates="constant" val="" valType="extendedCode"/>
+        <Param name="End Experiment" updates="constant" val="socket.stop_recording()&amp;#10;print('Script completed.')" valType="extendedCode"/>
+        <Param name="End JS Experiment" updates="constant" val="socket.stop_recording();&amp;#10;console.log(&quot;Script completed.&quot;);&amp;#10;" 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="ETtrigger_setup" valType="code"/>
+      </CodeComponent>
+    </Routine>
+    <Routine name="instruction">
+      <CodeComponent name="trigger_instr">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Begin Experiment" updates="constant" val="blockN=1" valType="extendedCode"/>
+        <Param name="Begin JS Experiment" updates="constant" val="blockN = 1;&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin JS Routine" updates="constant" val="/* Syntax Error: Fix Python code */" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="&amp;#10;## ET trigger ##&amp;#10;&amp;#10;# listen or remember trials&amp;#10;socket.annotation(str(trialType_trCode), 0)&amp;#10;&amp;#10;## info about current trial&amp;#10;print('\nSet number: {}/9\nBlock number: {}/162\nLength of the string: {}\nTrial type: {}'.format(setN, blockN, numOfReps, trialType))&amp;#10;blockN=blockN+1" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_instr" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_instr_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_instr_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="$trialType_trCode" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <TextComponent name="instruction_text">
+        <Param name="color" updates="set every repeat" val="$instrCol" 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="0.056" valType="code"/>
+        <Param name="name" updates="None" val="instruction_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.5" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="1" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="set every repeat" val="$inst" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+      <SoundComponent name="start_sound">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="start_sound" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="num/start.wav" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <TextComponent name="exclamationMark">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="0.076" valType="code"/>
+        <Param name="name" updates="None" val="exclamationMark" 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="0.5" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="constant" val="!" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+    </Routine>
+    <Routine name="digits">
+      <CodeComponent name="trigger_digits">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="digit = Number.parseInt(sounds.slice(4).slice(0, (- 4)));&amp;#10;socket.annotation(digit, 0);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="digit = int(sounds[4:][:-4])&amp;#10;socket.annotation(digit, 0)" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_digits" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_digits_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_digits_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="$digit" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <SoundComponent name="sound_digit">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="sound_digit" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="$sounds" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="False" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <ImageComponent name="FixCross_answ">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="FixCross_answ" 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="size" updates="constant" val="" 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="2.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="retention_1s">
+      <CodeComponent name="trigger_retention_1s">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="socket.annotation(171, 0);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="socket.annotation(171, 0)&amp;#10;" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_retention_1s" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_retention_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_retention_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="171" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <ImageComponent name="fixCross_1s">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="fixCross_1s" 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="size" updates="constant" val="" 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="1.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="baseline_3s">
+      <CodeComponent name="trigger_baseline">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="socket.annotation((100 + numOfReps).toString(), 0);&amp;#10;eegTr = (100 + numOfReps);&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="# 105,109,113 - remember 5,9,13 digits&amp;#10;socket.annotation(str(100+numOfReps), 0)&amp;#10;&amp;#10;# EEG trigger&amp;#10;eegTr = 100+numOfReps" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="trigger_baseline" valType="code"/>
+      </CodeComponent>
+      <ParallelOutComponent name="trigger_baseline_EEG">
+        <Param name="address" updates="None" val="0x0378" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="trigger_baseline_EEG" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="startData" updates="None" val="$eegTr" 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="stopData" updates="None" val="0" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="0.02" valType="code"/>
+        <Param name="syncScreen" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </ParallelOutComponent>
+      <ImageComponent name="fixCross">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="fixCross" 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="size" updates="constant" val="" 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="3.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+  </Routines>
+  <Flow>
+    <LoopInitiator loopType="TrialHandler" name="trialSet_9">
+      <Param name="Selected rows" updates="None" val="" valType="str"/>
+      <Param name="conditions" updates="None" val="[OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Подождите экспериментатора нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 1)]), OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Подождите экспериментатора нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 1)]), OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Отдохните нажмите &quot;пробел&quot; чтобы продолжить '), ('rest_cond', 0)]), OrderedDict([('rest_inst', 'Спасибо за участие в эксперименте нажмите &quot;пробел&quot; чтобы закончить'), ('rest_cond', 1)])]" valType="str"/>
+      <Param name="conditionsFile" updates="None" val="rest_inst.xlsx" valType="str"/>
+      <Param name="endPoints" updates="None" val="[0, 1]" valType="num"/>
+      <Param name="isTrials" updates="None" val="True" valType="bool"/>
+      <Param name="loopType" updates="None" val="sequential" valType="str"/>
+      <Param name="nReps" updates="None" val="1" valType="code"/>
+      <Param name="name" updates="None" val="trialSet_9" valType="code"/>
+      <Param name="random seed" updates="None" val="" valType="code"/>
+    </LoopInitiator>
+    <Routine name="Randomizer"/>
+    <LoopInitiator loopType="TrialHandler" name="trials">
+      <Param name="Selected rows" updates="None" val="$trialsOrder" valType="str"/>
+      <Param name="conditions" updates="None" val="None" valType="str"/>
+      <Param name="conditionsFile" updates="None" val="$'repNums_'+str(int(expInfo['participant'])%2)+'.xlsx'" valType="str"/>
+      <Param name="endPoints" updates="None" val="[0, 1]" valType="num"/>
+      <Param name="isTrials" updates="None" val="True" valType="bool"/>
+      <Param name="loopType" updates="None" val="sequential" valType="str"/>
+      <Param name="nReps" updates="None" val="1" valType="code"/>
+      <Param name="name" updates="None" val="trials" valType="code"/>
+      <Param name="random seed" updates="None" val="" valType="code"/>
+    </LoopInitiator>
+    <Routine name="instruction"/>
+    <Routine name="baseline_3s"/>
+    <LoopInitiator loopType="TrialHandler" name="present_sounds">
+      <Param name="Selected rows" updates="None" val="randomDigits($numOfReps)" valType="str"/>
+      <Param name="conditions" updates="None" val="[OrderedDict([('sounds', 'num/10.wav')]), OrderedDict([('sounds', 'num/1.wav')]), OrderedDict([('sounds', 'num/2.wav')]), OrderedDict([('sounds', 'num/3.wav')]), OrderedDict([('sounds', 'num/4.wav')]), OrderedDict([('sounds', 'num/5.wav')]), OrderedDict([('sounds', 'num/6.wav')]), OrderedDict([('sounds', 'num/7.wav')]), OrderedDict([('sounds', 'num/8.wav')]), OrderedDict([('sounds', 'num/9.wav')])]" valType="str"/>
+      <Param name="conditionsFile" updates="None" val="sounds.xlsx" valType="str"/>
+      <Param name="endPoints" updates="None" val="[0, 1]" valType="num"/>
+      <Param name="isTrials" updates="None" val="True" valType="bool"/>
+      <Param name="loopType" updates="None" val="sequential" valType="str"/>
+      <Param name="nReps" updates="None" val="1" valType="code"/>
+      <Param name="name" updates="None" val="present_sounds" valType="code"/>
+      <Param name="random seed" updates="None" val="" valType="code"/>
+    </LoopInitiator>
+    <Routine name="digits"/>
+    <LoopTerminator name="present_sounds"/>
+    <Routine name="retention_1s"/>
+    <Routine name="repeat"/>
+    <Routine name="end_block"/>
+    <LoopTerminator name="trials"/>
+    <Routine name="rest"/>
+    <LoopTerminator name="trialSet_9"/>
+  </Flow>
+</PsychoPy2experiment>

File diff suppressed because it is too large
+ 1162 - 0
stimuli/presentationScript/peavler.py


File diff suppressed because it is too large
+ 1162 - 0
stimuli/presentationScript/peavler_lastrun.py


+ 396 - 0
stimuli/presentationScript/peavler_training.psyexp

@@ -0,0 +1,396 @@
+<?xml version="1.0" ?>
+<PsychoPy2experiment encoding="utf-8" version="2020.1.3">
+  <Settings>
+    <Param name="Audio latency priority" updates="None" val="3" valType="str"/>
+    <Param name="Audio lib" updates="None" val="pyo" valType="str"/>
+    <Param name="Completed URL" updates="None" val="" valType="str"/>
+    <Param name="Data file delimiter" updates="None" val="auto" valType="str"/>
+    <Param name="Data filename" updates="None" val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code"/>
+    <Param name="Enable Escape" updates="None" val="True" valType="bool"/>
+    <Param name="Experiment info" updates="None" val="{'participant': '', 'session': 'training'}" valType="code"/>
+    <Param name="Force stereo" updates="None" val="True" valType="bool"/>
+    <Param name="Full-screen window" updates="None" val="True" valType="bool"/>
+    <Param name="HTML path" updates="None" val="html" valType="str"/>
+    <Param name="Incomplete URL" updates="None" val="" valType="str"/>
+    <Param name="JS libs" updates="None" val="packaged" valType="str"/>
+    <Param name="Monitor" updates="None" val="testMonitor" valType="str"/>
+    <Param name="Resources" updates="None" val="[]" valType="fileList"/>
+    <Param name="Save csv file" updates="None" val="False" valType="bool"/>
+    <Param name="Save excel file" updates="None" val="False" valType="bool"/>
+    <Param name="Save log file" updates="None" val="True" valType="bool"/>
+    <Param name="Save psydat file" updates="None" val="True" valType="bool"/>
+    <Param name="Save wide csv file" updates="None" val="True" valType="bool"/>
+    <Param name="Screen" updates="None" val="1" valType="num"/>
+    <Param name="Show info dlg" updates="None" val="True" valType="bool"/>
+    <Param name="Show mouse" updates="None" val="False" valType="bool"/>
+    <Param name="Units" updates="None" val="height" valType="str"/>
+    <Param name="Use version" updates="None" val="" valType="str"/>
+    <Param name="Window size (pixels)" updates="None" val="[1920, 1080]" valType="code"/>
+    <Param name="blendMode" updates="None" val="avg" valType="str"/>
+    <Param name="color" updates="None" val="$[0, 0, 0]" valType="str"/>
+    <Param name="colorSpace" updates="None" val="rgb" valType="str"/>
+    <Param name="expName" updates="None" val="peavler_training" valType="str"/>
+    <Param name="exportHTML" updates="None" val="on Sync" valType="str"/>
+    <Param name="logging level" updates="None" val="exp" valType="code"/>
+  </Settings>
+  <Routines>
+    <Routine name="end_block">
+      <SoundComponent name="end">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="end" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="num/end_block.wav" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <ImageComponent name="FixCross_end">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="FixCross_end" valType="code"/>
+        <Param name="opacity" updates="constant" val="0" 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="size" updates="constant" val="" 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="5.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="repeat">
+      <CodeComponent name="skip_routine">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <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="if ((skip_mic === 1)) {&amp;#10;    continueRoutine = false;&amp;#10;}&amp;#10;" valType="extendedCode"/>
+        <Param name="Begin Routine" updates="constant" val="if skip_mic==1:&amp;#10;    continueRoutine = False" valType="extendedCode"/>
+        <Param name="Code Type" updates="None" val="Auto-&gt;JS" valType="str"/>
+        <Param name="Each 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 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="skip_routine" valType="code"/>
+      </CodeComponent>
+      <MicrophoneComponent name="mic_1">
+        <Param name="channel" updates="None" val="0" valType="code"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="name" updates="None" val="mic_1" 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" valType="code"/>
+        <Param name="stereo" updates="None" val="False" valType="bool"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="$micDuration" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="False" valType="bool"/>
+      </MicrophoneComponent>
+      <ImageComponent name="mic_image">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="11" valType="code"/>
+        <Param name="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/mic_white.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="mic_image" 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="size" updates="constant" val="(0.67, 0.36)" 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" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="$micDuration" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="rest">
+      <TextComponent name="rest_instruction">
+        <Param name="color" updates="set every repeat" val="white" 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="0.056" valType="code"/>
+        <Param name="name" updates="None" val="rest_instruction" 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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="set every repeat" val="Конец тренировки" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+      <KeyboardComponent name="key_resp_2">
+        <Param name="allowedKeys" updates="constant" val="'space'" valType="code"/>
+        <Param name="correctAns" updates="constant" val="" valType="str"/>
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="discard previous" updates="constant" val="True" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="forceEndRoutine" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="key_resp_2" 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="" valType="code"/>
+        <Param name="store" updates="constant" val="last key" valType="str"/>
+        <Param name="storeCorrect" updates="constant" val="False" valType="bool"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+      </KeyboardComponent>
+    </Routine>
+    <Routine name="instruction">
+      <TextComponent name="instruction_text">
+        <Param name="color" updates="set every repeat" val="$instrCol" 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="0.056" valType="code"/>
+        <Param name="name" updates="None" val="instruction_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.5" valType="code"/>
+        <Param name="stopType" updates="None" val="duration (s)" valType="str"/>
+        <Param name="stopVal" updates="constant" val="1" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="set every repeat" val="$inst" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+      <SoundComponent name="start_sound">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="start_sound" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="num/start.wav" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="True" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <TextComponent name="exclamationMark">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="0.076" valType="code"/>
+        <Param name="name" updates="None" val="exclamationMark" 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="0.5" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="text" updates="constant" val="!" valType="str"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+        <Param name="wrapWidth" updates="constant" val="" valType="code"/>
+      </TextComponent>
+    </Routine>
+    <Routine name="baseline_2s">
+      <ImageComponent name="fixCross">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="fixCross" 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="size" updates="constant" val="" 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="3" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="digits">
+      <SoundComponent name="sound_digit">
+        <Param name="disabled" updates="None" val="False" valType="bool"/>
+        <Param name="durationEstim" updates="None" val="" valType="code"/>
+        <Param name="hamming" updates="constant" val="True" valType="bool"/>
+        <Param name="name" updates="None" val="sound_digit" valType="code"/>
+        <Param name="saveStartStop" updates="None" val="True" valType="bool"/>
+        <Param name="sound" updates="set every repeat" val="$sounds" valType="str"/>
+        <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="" valType="code"/>
+        <Param name="syncScreenRefresh" updates="constant" val="False" valType="bool"/>
+        <Param name="volume" updates="constant" val="1" valType="code"/>
+      </SoundComponent>
+      <ImageComponent name="FixCross_answ">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="FixCross_answ" 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="size" updates="constant" val="" 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="2.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="retention_1s">
+      <ImageComponent name="fixCross_1s">
+        <Param name="color" updates="constant" val="$[1,1,1]" 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="flipHoriz" updates="constant" val="False" valType="bool"/>
+        <Param name="flipVert" updates="constant" val="False" valType="bool"/>
+        <Param name="image" updates="constant" val="num/FixCross.png" valType="str"/>
+        <Param name="interpolate" updates="constant" val="linear" valType="str"/>
+        <Param name="mask" updates="constant" val="None" valType="str"/>
+        <Param name="name" updates="None" val="fixCross_1s" 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="size" updates="constant" val="" 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="1.0" valType="code"/>
+        <Param name="syncScreenRefresh" updates="None" val="True" valType="bool"/>
+        <Param name="texture resolution" updates="constant" val="128" valType="code"/>
+        <Param name="units" updates="None" val="from exp settings" valType="str"/>
+      </ImageComponent>
+    </Routine>
+    <Routine name="randomizer">
+      <CodeComponent name="random_digits">
+        <Param name="Before Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Before JS Experiment" updates="constant" val="" valType="extendedCode"/>
+        <Param name="Begin Experiment" updates="constant" val="from numpy.random import choice&amp;#10;import random&amp;#10;from numpy import arange, concatenate&amp;#10;&amp;#10;def randomDigits(numOfReps):&amp;#10;    if numOfReps&lt;=10:&amp;#10;        return choice(10, size=numOfReps, replace=False)&amp;#10;    else:&amp;#10;        arr1 = list(choice(10, size=10, replace=False))&amp;#10;        arr2 = list(choice(10, size=numOfReps-10, replace=False))&amp;#10;        while arr2[0] == arr1[-1]:&amp;#10;            random.shuffle(arr2)&amp;#10;        return arr1+arr2" valType="extendedCode"/>
+        <Param name="Begin JS Experiment" updates="constant" val="&amp;#10;        // add-on: list(s: string): string[]&amp;#10;        function list(s) {&amp;#10;            // if s is a string, we return a list of its characters&amp;#10;            if (typeof s === 'string')&amp;#10;                return s.split('');&amp;#10;            else&amp;#10;                // otherwise we return s:&amp;#10;                return s;&amp;#10;        }&amp;#10;        &amp;#10;        import {choice} from 'numpy/random';&amp;#10;import * as random from 'random';&amp;#10;import {arange, concatenate} from 'numpy';&amp;#10;function randomDigits(numOfReps) {&amp;#10;    var arr1, arr2;&amp;#10;    if ((numOfReps &lt;= 10)) {&amp;#10;        return choice(10, {&quot;size&quot;: numOfReps, &quot;replace&quot;: false});&amp;#10;    } else {&amp;#10;        arr1 = list(choice(10, {&quot;size&quot;: 10, &quot;replace&quot;: false}));&amp;#10;        arr2 = list(choice(10, {&quot;size&quot;: (numOfReps - 10), &quot;replace&quot;: false}));&amp;#10;        while ((arr2[0] === arr1.slice((- 1))[0])) {&amp;#10;            random.shuffle(arr2);&amp;#10;        }&amp;#10;        return (arr1 + arr2);&amp;#10;    }&amp;#10;}&amp;#10;" 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="" valType="extendedCode"/>
+        <Param name="Each JS Frame" updates="constant" val="" 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="random_digits" valType="code"/>
+      </CodeComponent>
+    </Routine>
+  </Routines>
+  <Flow>
+    <Routine name="randomizer"/>
+    <LoopInitiator loopType="TrialHandler" name="trials">
+      <Param name="Selected rows" updates="None" val="" valType="str"/>
+      <Param name="conditions" updates="None" val="None" valType="str"/>
+      <Param name="conditionsFile" updates="None" val="$'trainingTrials_'+str(int(expInfo['participant'])%2)+'.xlsx'" valType="str"/>
+      <Param name="endPoints" updates="None" val="[0, 1]" valType="num"/>
+      <Param name="isTrials" updates="None" val="True" valType="bool"/>
+      <Param name="loopType" updates="None" val="random" valType="str"/>
+      <Param name="nReps" updates="None" val="1" valType="code"/>
+      <Param name="name" updates="None" val="trials" valType="code"/>
+      <Param name="random seed" updates="None" val="" valType="code"/>
+    </LoopInitiator>
+    <Routine name="instruction"/>
+    <Routine name="baseline_2s"/>
+    <LoopInitiator loopType="TrialHandler" name="present_sounds">
+      <Param name="Selected rows" updates="None" val="randomDigits($numOfReps)" valType="str"/>
+      <Param name="conditions" updates="None" val="[OrderedDict([('sounds', 'num/10.wav')]), OrderedDict([('sounds', 'num/1.wav')]), OrderedDict([('sounds', 'num/2.wav')]), OrderedDict([('sounds', 'num/3.wav')]), OrderedDict([('sounds', 'num/4.wav')]), OrderedDict([('sounds', 'num/5.wav')]), OrderedDict([('sounds', 'num/6.wav')]), OrderedDict([('sounds', 'num/7.wav')]), OrderedDict([('sounds', 'num/8.wav')]), OrderedDict([('sounds', 'num/9.wav')])]" valType="str"/>
+      <Param name="conditionsFile" updates="None" val="sounds.xlsx" valType="str"/>
+      <Param name="endPoints" updates="None" val="[0, 1]" valType="num"/>
+      <Param name="isTrials" updates="None" val="True" valType="bool"/>
+      <Param name="loopType" updates="None" val="sequential" valType="str"/>
+      <Param name="nReps" updates="None" val="1" valType="code"/>
+      <Param name="name" updates="None" val="present_sounds" valType="code"/>
+      <Param name="random seed" updates="None" val="" valType="code"/>
+    </LoopInitiator>
+    <Routine name="digits"/>
+    <LoopTerminator name="present_sounds"/>
+    <Routine name="retention_1s"/>
+    <Routine name="repeat"/>
+    <Routine name="end_block"/>
+    <LoopTerminator name="trials"/>
+    <Routine name="rest"/>
+  </Flow>
+</PsychoPy2experiment>

+ 908 - 0
stimuli/presentationScript/peavler_training_lastrun.py

@@ -0,0 +1,908 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This experiment was created using PsychoPy3 Experiment Builder (v2020.1.3),
+    on Сентябрь 21, 2020, at 16:47
+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
+
+"""
+
+from __future__ import absolute_import, division
+
+from psychopy import locale_setup
+from psychopy import prefs
+prefs.hardware['audioLib'] = 'pyo'
+prefs.hardware['audioLatencyMode'] = '3'
+from psychopy import sound, gui, visual, core, data, event, logging, clock, microphone
+from psychopy.constants import (NOT_STARTED, STARTED, PLAYING, PAUSED,
+                                STOPPED, FINISHED, PRESSED, RELEASED, FOREVER)
+
+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
+import os  # handy system and path functions
+import sys  # to get file system encoding
+
+from psychopy.hardware import keyboard
+
+
+
+# Ensure that relative paths start from the same directory as this script
+_thisDir = os.path.dirname(os.path.abspath(__file__))
+os.chdir(_thisDir)
+
+# Store info about the experiment session
+psychopyVersion = '2020.1.3'
+expName = 'peavler_training'  # from the Builder filename that created this script
+expInfo = {'participant': '', 'session': 'training'}
+dlg = gui.DlgFromDict(dictionary=expInfo, sortKeys=False, title=expName)
+if dlg.OK == False:
+    core.quit()  # user pressed cancel
+expInfo['date'] = data.getDateStr()  # add a simple timestamp
+expInfo['expName'] = expName
+expInfo['psychopyVersion'] = psychopyVersion
+
+# 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'])
+
+# An ExperimentHandler isn't essential but helps with data saving
+thisExp = data.ExperimentHandler(name=expName, version='',
+    extraInfo=expInfo, runtimeInfo=None,
+    originPath='D:\\GoogleDisk\\Neurotech_lab\\cogLoad_project\\scripts\\peavlerRepl\\v15\\peavler_training_lastrun.py',
+    savePickle=True, saveWideText=True,
+    dataFileName=filename)
+# save a log file for detail verbose info
+logFile = logging.LogFile(filename+'.log', level=logging.EXP)
+logging.console.setLevel(logging.WARNING)  # this outputs to the screen, not a file
+
+endExpNow = False  # flag for 'escape' or other condition => quit the exp
+frameTolerance = 0.001  # how close to onset before 'same' frame
+
+# Start Code - component code to be run before the window creation
+wavDirName = filename + '_wav'
+if not os.path.isdir(wavDirName):
+    os.makedirs(wavDirName)  # to hold .wav files
+
+# Setup the Window
+win = visual.Window(
+    size=[1920, 1080], fullscr=True, screen=0, 
+    winType='pyglet', allowGUI=False, allowStencil=False,
+    monitor='testMonitor', color=[0, 0, 0], colorSpace='rgb',
+    blendMode='avg', useFBO=True, 
+    units='height')
+
+# Enable sound input/output:
+microphone.switchOn()
+# store frame rate of monitor if we can measure it
+expInfo['frameRate'] = win.getActualFrameRate()
+if expInfo['frameRate'] != None:
+    frameDur = 1.0 / round(expInfo['frameRate'])
+else:
+    frameDur = 1.0 / 60.0  # could not measure, so guess
+
+# create a default keyboard (e.g. to check for escape)
+defaultKeyboard = keyboard.Keyboard()
+
+# Initialize components for Routine "randomizer"
+randomizerClock = core.Clock()
+from numpy.random import choice
+import random
+from numpy import arange, concatenate
+
+def randomDigits(numOfReps):
+    if numOfReps<=10:
+        return choice(10, size=numOfReps, replace=False)
+    else:
+        arr1 = list(choice(10, size=10, replace=False))
+        arr2 = list(choice(10, size=numOfReps-10, replace=False))
+        while arr2[0] == arr1[-1]:
+            random.shuffle(arr2)
+        return arr1+arr2
+
+# Initialize components for Routine "instruction"
+instructionClock = core.Clock()
+instruction_text = visual.TextStim(win=win, name='instruction_text',
+    text='default text',
+    font='Arial',
+    pos=(0, 0), height=0.056, wrapWidth=None, ori=0, 
+    color='white', colorSpace='rgb', opacity=1, 
+    languageStyle='LTR',
+    depth=0.0);
+start_sound = sound.Sound('A', secs=-1, stereo=True, hamming=True,
+    name='start_sound')
+start_sound.setVolume(1)
+exclamationMark = visual.TextStim(win=win, name='exclamationMark',
+    text='!',
+    font='Arial',
+    pos=(0, 0), height=0.076, wrapWidth=None, ori=0, 
+    color=[1,1,1], colorSpace='rgb', opacity=1, 
+    languageStyle='LTR',
+    depth=-2.0);
+
+# Initialize components for Routine "baseline_2s"
+baseline_2sClock = core.Clock()
+fixCross = visual.ImageStim(
+    win=win,
+    name='fixCross', 
+    image='num/FixCross.png', mask=None,
+    ori=0, pos=(0, 0), size=None,
+    color=[1,1,1], colorSpace='rgb', opacity=1,
+    flipHoriz=False, flipVert=False,
+    texRes=128, interpolate=True, depth=0.0)
+
+# Initialize components for Routine "digits"
+digitsClock = core.Clock()
+sound_digit = sound.Sound('A', secs=-1, stereo=True, hamming=True,
+    name='sound_digit')
+sound_digit.setVolume(1)
+FixCross_answ = visual.ImageStim(
+    win=win,
+    name='FixCross_answ', 
+    image='num/FixCross.png', mask=None,
+    ori=0, pos=(0, 0), size=None,
+    color=[1,1,1], colorSpace='rgb', opacity=1,
+    flipHoriz=False, flipVert=False,
+    texRes=128, interpolate=True, depth=-1.0)
+
+# Initialize components for Routine "retention_1s"
+retention_1sClock = core.Clock()
+fixCross_1s = visual.ImageStim(
+    win=win,
+    name='fixCross_1s', 
+    image='num/FixCross.png', mask=None,
+    ori=0, pos=(0, 0), size=None,
+    color=[1,1,1], colorSpace='rgb', opacity=1,
+    flipHoriz=False, flipVert=False,
+    texRes=128, interpolate=True, depth=0.0)
+
+# Initialize components for Routine "repeat"
+repeatClock = core.Clock()
+mic_image = visual.ImageStim(
+    win=win,
+    name='mic_image', 
+    image='num/mic_white.png', mask=None,
+    ori=0, pos=(0, 0), size=(0.67, 0.36),
+    color=[1,1,1], colorSpace='rgb', opacity=1,
+    flipHoriz=False, flipVert=False,
+    texRes=128, interpolate=True, depth=-2.0)
+
+# Initialize components for Routine "end_block"
+end_blockClock = core.Clock()
+end = sound.Sound('A', secs=-1, stereo=True, hamming=True,
+    name='end')
+end.setVolume(1)
+FixCross_end = visual.ImageStim(
+    win=win,
+    name='FixCross_end', 
+    image='num/FixCross.png', mask=None,
+    ori=0, pos=(0, 0), size=None,
+    color=[1,1,1], colorSpace='rgb', opacity=0,
+    flipHoriz=False, flipVert=False,
+    texRes=128, interpolate=True, depth=-1.0)
+
+# Initialize components for Routine "rest"
+restClock = core.Clock()
+rest_instruction = visual.TextStim(win=win, name='rest_instruction',
+    text='default text',
+    font='Arial',
+    pos=(0, 0), height=0.056, wrapWidth=None, ori=0, 
+    color='white', colorSpace='rgb', opacity=1, 
+    languageStyle='LTR',
+    depth=0.0);
+key_resp_2 = keyboard.Keyboard()
+
+# Create some handy timers
+globalClock = core.Clock()  # to track the time since experiment started
+routineTimer = core.CountdownTimer()  # to track time remaining of each (non-slip) routine 
+
+# ------Prepare to start Routine "randomizer"-------
+continueRoutine = True
+# update component parameters for each repeat
+# keep track of which components have finished
+randomizerComponents = []
+for thisComponent in randomizerComponents:
+    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")
+randomizerClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+frameN = -1
+
+# -------Run Routine "randomizer"-------
+while continueRoutine:
+    # get current time
+    t = randomizerClock.getTime()
+    tThisFlip = win.getFutureFlipTime(clock=randomizerClock)
+    tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+    frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+    # update/draw components on each frame
+    
+    # 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 randomizerComponents:
+        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 "randomizer"-------
+for thisComponent in randomizerComponents:
+    if hasattr(thisComponent, "setAutoDraw"):
+        thisComponent.setAutoDraw(False)
+# the Routine "randomizer" was not non-slip safe, so reset the non-slip timer
+routineTimer.reset()
+
+# set up handler to look after randomisation of conditions etc
+trials = data.TrialHandler(nReps=1, method='random', 
+    extraInfo=expInfo, originPath=-1,
+    trialList=data.importConditions('trainingTrials_'+str(int(expInfo['participant'])%2)+'.xlsx'),
+    seed=None, name='trials')
+thisExp.addLoop(trials)  # add the loop to the experiment
+thisTrial = trials.trialList[0]  # so we can initialise stimuli with some values
+# abbreviate parameter names if possible (e.g. rgb = thisTrial.rgb)
+if thisTrial != None:
+    for paramName in thisTrial:
+        exec('{} = thisTrial[paramName]'.format(paramName))
+
+for thisTrial in trials:
+    currentLoop = trials
+    # abbreviate parameter names if possible (e.g. rgb = thisTrial.rgb)
+    if thisTrial != None:
+        for paramName in thisTrial:
+            exec('{} = thisTrial[paramName]'.format(paramName))
+    
+    # ------Prepare to start Routine "instruction"-------
+    continueRoutine = True
+    # update component parameters for each repeat
+    instruction_text.setColor(instrCol, colorSpace='rgb')
+    instruction_text.setText(inst)
+    start_sound.setSound('num/start.wav', hamming=True)
+    start_sound.setVolume(1, log=False)
+    # keep track of which components have finished
+    instructionComponents = [instruction_text, start_sound, exclamationMark]
+    for thisComponent in instructionComponents:
+        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")
+    instructionClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+    frameN = -1
+    
+    # -------Run Routine "instruction"-------
+    while continueRoutine:
+        # get current time
+        t = instructionClock.getTime()
+        tThisFlip = win.getFutureFlipTime(clock=instructionClock)
+        tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+        frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+        # update/draw components on each frame
+        
+        # *instruction_text* updates
+        if instruction_text.status == NOT_STARTED and tThisFlip >= 0.5-frameTolerance:
+            # keep track of start time/frame for later
+            instruction_text.frameNStart = frameN  # exact frame index
+            instruction_text.tStart = t  # local t and not account for scr refresh
+            instruction_text.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(instruction_text, 'tStartRefresh')  # time at next scr refresh
+            instruction_text.setAutoDraw(True)
+        if instruction_text.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > instruction_text.tStartRefresh + 1-frameTolerance:
+                # keep track of stop time/frame for later
+                instruction_text.tStop = t  # not accounting for scr refresh
+                instruction_text.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(instruction_text, 'tStopRefresh')  # time at next scr refresh
+                instruction_text.setAutoDraw(False)
+        # start/stop start_sound
+        if start_sound.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            start_sound.frameNStart = frameN  # exact frame index
+            start_sound.tStart = t  # local t and not account for scr refresh
+            start_sound.tStartRefresh = tThisFlipGlobal  # on global time
+            start_sound.play(when=win)  # sync with win flip
+        
+        # *exclamationMark* updates
+        if exclamationMark.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            exclamationMark.frameNStart = frameN  # exact frame index
+            exclamationMark.tStart = t  # local t and not account for scr refresh
+            exclamationMark.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(exclamationMark, 'tStartRefresh')  # time at next scr refresh
+            exclamationMark.setAutoDraw(True)
+        if exclamationMark.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > exclamationMark.tStartRefresh + 0.5-frameTolerance:
+                # keep track of stop time/frame for later
+                exclamationMark.tStop = t  # not accounting for scr refresh
+                exclamationMark.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(exclamationMark, 'tStopRefresh')  # time at next scr refresh
+                exclamationMark.setAutoDraw(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 instructionComponents:
+            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 "instruction"-------
+    for thisComponent in instructionComponents:
+        if hasattr(thisComponent, "setAutoDraw"):
+            thisComponent.setAutoDraw(False)
+    trials.addData('instruction_text.started', instruction_text.tStartRefresh)
+    trials.addData('instruction_text.stopped', instruction_text.tStopRefresh)
+    start_sound.stop()  # ensure sound has stopped at end of routine
+    trials.addData('start_sound.started', start_sound.tStartRefresh)
+    trials.addData('start_sound.stopped', start_sound.tStopRefresh)
+    trials.addData('exclamationMark.started', exclamationMark.tStartRefresh)
+    trials.addData('exclamationMark.stopped', exclamationMark.tStopRefresh)
+    # the Routine "instruction" was not non-slip safe, so reset the non-slip timer
+    routineTimer.reset()
+    
+    # ------Prepare to start Routine "baseline_2s"-------
+    continueRoutine = True
+    routineTimer.add(3.000000)
+    # update component parameters for each repeat
+    # keep track of which components have finished
+    baseline_2sComponents = [fixCross]
+    for thisComponent in baseline_2sComponents:
+        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")
+    baseline_2sClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+    frameN = -1
+    
+    # -------Run Routine "baseline_2s"-------
+    while continueRoutine and routineTimer.getTime() > 0:
+        # get current time
+        t = baseline_2sClock.getTime()
+        tThisFlip = win.getFutureFlipTime(clock=baseline_2sClock)
+        tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+        frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+        # update/draw components on each frame
+        
+        # *fixCross* updates
+        if fixCross.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            fixCross.frameNStart = frameN  # exact frame index
+            fixCross.tStart = t  # local t and not account for scr refresh
+            fixCross.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(fixCross, 'tStartRefresh')  # time at next scr refresh
+            fixCross.setAutoDraw(True)
+        if fixCross.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > fixCross.tStartRefresh + 3-frameTolerance:
+                # keep track of stop time/frame for later
+                fixCross.tStop = t  # not accounting for scr refresh
+                fixCross.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(fixCross, 'tStopRefresh')  # time at next scr refresh
+                fixCross.setAutoDraw(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 baseline_2sComponents:
+            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 "baseline_2s"-------
+    for thisComponent in baseline_2sComponents:
+        if hasattr(thisComponent, "setAutoDraw"):
+            thisComponent.setAutoDraw(False)
+    trials.addData('fixCross.started', fixCross.tStartRefresh)
+    trials.addData('fixCross.stopped', fixCross.tStopRefresh)
+    
+    # set up handler to look after randomisation of conditions etc
+    present_sounds = data.TrialHandler(nReps=1, method='sequential', 
+        extraInfo=expInfo, originPath=-1,
+        trialList=data.importConditions('sounds.xlsx', selection=randomDigits(numOfReps)),
+        seed=None, name='present_sounds')
+    thisExp.addLoop(present_sounds)  # add the loop to the experiment
+    thisPresent_sound = present_sounds.trialList[0]  # so we can initialise stimuli with some values
+    # abbreviate parameter names if possible (e.g. rgb = thisPresent_sound.rgb)
+    if thisPresent_sound != None:
+        for paramName in thisPresent_sound:
+            exec('{} = thisPresent_sound[paramName]'.format(paramName))
+    
+    for thisPresent_sound in present_sounds:
+        currentLoop = present_sounds
+        # abbreviate parameter names if possible (e.g. rgb = thisPresent_sound.rgb)
+        if thisPresent_sound != None:
+            for paramName in thisPresent_sound:
+                exec('{} = thisPresent_sound[paramName]'.format(paramName))
+        
+        # ------Prepare to start Routine "digits"-------
+        continueRoutine = True
+        # update component parameters for each repeat
+        sound_digit.setSound(sounds, hamming=True)
+        sound_digit.setVolume(1, log=False)
+        # keep track of which components have finished
+        digitsComponents = [sound_digit, FixCross_answ]
+        for thisComponent in digitsComponents:
+            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")
+        digitsClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+        frameN = -1
+        
+        # -------Run Routine "digits"-------
+        while continueRoutine:
+            # get current time
+            t = digitsClock.getTime()
+            tThisFlip = win.getFutureFlipTime(clock=digitsClock)
+            tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+            frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+            # update/draw components on each frame
+            # start/stop sound_digit
+            if sound_digit.status == NOT_STARTED and t >= 0.0-frameTolerance:
+                # keep track of start time/frame for later
+                sound_digit.frameNStart = frameN  # exact frame index
+                sound_digit.tStart = t  # local t and not account for scr refresh
+                sound_digit.tStartRefresh = tThisFlipGlobal  # on global time
+                sound_digit.play()  # start the sound (it finishes automatically)
+            
+            # *FixCross_answ* updates
+            if FixCross_answ.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+                # keep track of start time/frame for later
+                FixCross_answ.frameNStart = frameN  # exact frame index
+                FixCross_answ.tStart = t  # local t and not account for scr refresh
+                FixCross_answ.tStartRefresh = tThisFlipGlobal  # on global time
+                win.timeOnFlip(FixCross_answ, 'tStartRefresh')  # time at next scr refresh
+                FixCross_answ.setAutoDraw(True)
+            if FixCross_answ.status == STARTED:
+                # is it time to stop? (based on global clock, using actual start)
+                if tThisFlipGlobal > FixCross_answ.tStartRefresh + 2.0-frameTolerance:
+                    # keep track of stop time/frame for later
+                    FixCross_answ.tStop = t  # not accounting for scr refresh
+                    FixCross_answ.frameNStop = frameN  # exact frame index
+                    win.timeOnFlip(FixCross_answ, 'tStopRefresh')  # time at next scr refresh
+                    FixCross_answ.setAutoDraw(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 digitsComponents:
+                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 "digits"-------
+        for thisComponent in digitsComponents:
+            if hasattr(thisComponent, "setAutoDraw"):
+                thisComponent.setAutoDraw(False)
+        sound_digit.stop()  # ensure sound has stopped at end of routine
+        present_sounds.addData('sound_digit.started', sound_digit.tStart)
+        present_sounds.addData('sound_digit.stopped', sound_digit.tStop)
+        present_sounds.addData('FixCross_answ.started', FixCross_answ.tStartRefresh)
+        present_sounds.addData('FixCross_answ.stopped', FixCross_answ.tStopRefresh)
+        # the Routine "digits" was not non-slip safe, so reset the non-slip timer
+        routineTimer.reset()
+        thisExp.nextEntry()
+        
+    # completed 1 repeats of 'present_sounds'
+    
+    
+    # ------Prepare to start Routine "retention_1s"-------
+    continueRoutine = True
+    routineTimer.add(1.000000)
+    # update component parameters for each repeat
+    # keep track of which components have finished
+    retention_1sComponents = [fixCross_1s]
+    for thisComponent in retention_1sComponents:
+        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")
+    retention_1sClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+    frameN = -1
+    
+    # -------Run Routine "retention_1s"-------
+    while continueRoutine and routineTimer.getTime() > 0:
+        # get current time
+        t = retention_1sClock.getTime()
+        tThisFlip = win.getFutureFlipTime(clock=retention_1sClock)
+        tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+        frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+        # update/draw components on each frame
+        
+        # *fixCross_1s* updates
+        if fixCross_1s.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            fixCross_1s.frameNStart = frameN  # exact frame index
+            fixCross_1s.tStart = t  # local t and not account for scr refresh
+            fixCross_1s.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(fixCross_1s, 'tStartRefresh')  # time at next scr refresh
+            fixCross_1s.setAutoDraw(True)
+        if fixCross_1s.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > fixCross_1s.tStartRefresh + 1.0-frameTolerance:
+                # keep track of stop time/frame for later
+                fixCross_1s.tStop = t  # not accounting for scr refresh
+                fixCross_1s.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(fixCross_1s, 'tStopRefresh')  # time at next scr refresh
+                fixCross_1s.setAutoDraw(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 retention_1sComponents:
+            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 "retention_1s"-------
+    for thisComponent in retention_1sComponents:
+        if hasattr(thisComponent, "setAutoDraw"):
+            thisComponent.setAutoDraw(False)
+    trials.addData('fixCross_1s.started', fixCross_1s.tStartRefresh)
+    trials.addData('fixCross_1s.stopped', fixCross_1s.tStopRefresh)
+    
+    # ------Prepare to start Routine "repeat"-------
+    continueRoutine = True
+    # update component parameters for each repeat
+    if skip_mic==1:
+        continueRoutine = False
+    mic_1 = microphone.AdvAudioCapture(name='mic_1', saveDir=wavDirName, stereo=False, chnl=0)
+    # keep track of which components have finished
+    repeatComponents = [mic_1, mic_image]
+    for thisComponent in repeatComponents:
+        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")
+    repeatClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+    frameN = -1
+    
+    # -------Run Routine "repeat"-------
+    while continueRoutine:
+        # get current time
+        t = repeatClock.getTime()
+        tThisFlip = win.getFutureFlipTime(clock=repeatClock)
+        tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+        frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+        # update/draw components on each frame
+        
+        # *mic_1* updates
+        if mic_1.status == NOT_STARTED and t >= 0-frameTolerance:
+            # keep track of start time/frame for later
+            mic_1.frameNStart = frameN  # exact frame index
+            mic_1.tStart = t  # local t and not account for scr refresh
+            mic_1.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(mic_1, 'tStartRefresh')  # time at next scr refresh
+            mic_1.status = STARTED
+            mic_1.record(sec=micDuration, block=False)  # start the recording thread
+        
+        if mic_1.status == STARTED and not mic_1.recorder.running:
+            mic_1.status = FINISHED
+        
+        # *mic_image* updates
+        if mic_image.status == NOT_STARTED and tThisFlip >= 0-frameTolerance:
+            # keep track of start time/frame for later
+            mic_image.frameNStart = frameN  # exact frame index
+            mic_image.tStart = t  # local t and not account for scr refresh
+            mic_image.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(mic_image, 'tStartRefresh')  # time at next scr refresh
+            mic_image.setAutoDraw(True)
+        if mic_image.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > mic_image.tStartRefresh + micDuration-frameTolerance:
+                # keep track of stop time/frame for later
+                mic_image.tStop = t  # not accounting for scr refresh
+                mic_image.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(mic_image, 'tStopRefresh')  # time at next scr refresh
+                mic_image.setAutoDraw(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 repeatComponents:
+            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 "repeat"-------
+    for thisComponent in repeatComponents:
+        if hasattr(thisComponent, "setAutoDraw"):
+            thisComponent.setAutoDraw(False)
+    # mic_1 stop & responses
+    mic_1.stop()  # sometimes helpful
+    if not mic_1.savedFile:
+        mic_1.savedFile = None
+    # store data for trials (TrialHandler)
+    trials.addData('mic_1.filename', mic_1.savedFile)
+    trials.addData('mic_1.started', mic_1.tStart)
+    trials.addData('mic_1.stopped', mic_1.tStop)
+    trials.addData('mic_image.started', mic_image.tStartRefresh)
+    trials.addData('mic_image.stopped', mic_image.tStopRefresh)
+    # the Routine "repeat" was not non-slip safe, so reset the non-slip timer
+    routineTimer.reset()
+    
+    # ------Prepare to start Routine "end_block"-------
+    continueRoutine = True
+    # update component parameters for each repeat
+    end.setSound('num/end_block.wav', hamming=True)
+    end.setVolume(1, log=False)
+    # keep track of which components have finished
+    end_blockComponents = [end, FixCross_end]
+    for thisComponent in end_blockComponents:
+        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")
+    end_blockClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
+    frameN = -1
+    
+    # -------Run Routine "end_block"-------
+    while continueRoutine:
+        # get current time
+        t = end_blockClock.getTime()
+        tThisFlip = win.getFutureFlipTime(clock=end_blockClock)
+        tThisFlipGlobal = win.getFutureFlipTime(clock=None)
+        frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
+        # update/draw components on each frame
+        # start/stop end
+        if end.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            end.frameNStart = frameN  # exact frame index
+            end.tStart = t  # local t and not account for scr refresh
+            end.tStartRefresh = tThisFlipGlobal  # on global time
+            end.play(when=win)  # sync with win flip
+        
+        # *FixCross_end* updates
+        if FixCross_end.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+            # keep track of start time/frame for later
+            FixCross_end.frameNStart = frameN  # exact frame index
+            FixCross_end.tStart = t  # local t and not account for scr refresh
+            FixCross_end.tStartRefresh = tThisFlipGlobal  # on global time
+            win.timeOnFlip(FixCross_end, 'tStartRefresh')  # time at next scr refresh
+            FixCross_end.setAutoDraw(True)
+        if FixCross_end.status == STARTED:
+            # is it time to stop? (based on global clock, using actual start)
+            if tThisFlipGlobal > FixCross_end.tStartRefresh + 5.0-frameTolerance:
+                # keep track of stop time/frame for later
+                FixCross_end.tStop = t  # not accounting for scr refresh
+                FixCross_end.frameNStop = frameN  # exact frame index
+                win.timeOnFlip(FixCross_end, 'tStopRefresh')  # time at next scr refresh
+                FixCross_end.setAutoDraw(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 end_blockComponents:
+            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 "end_block"-------
+    for thisComponent in end_blockComponents:
+        if hasattr(thisComponent, "setAutoDraw"):
+            thisComponent.setAutoDraw(False)
+    end.stop()  # ensure sound has stopped at end of routine
+    trials.addData('end.started', end.tStartRefresh)
+    trials.addData('end.stopped', end.tStopRefresh)
+    trials.addData('FixCross_end.started', FixCross_end.tStartRefresh)
+    trials.addData('FixCross_end.stopped', FixCross_end.tStopRefresh)
+    # the Routine "end_block" was not non-slip safe, so reset the non-slip timer
+    routineTimer.reset()
+    thisExp.nextEntry()
+    
+# completed 1 repeats of 'trials'
+
+
+# ------Prepare to start Routine "rest"-------
+continueRoutine = True
+# update component parameters for each repeat
+rest_instruction.setColor('white', colorSpace='rgb')
+rest_instruction.setText('Конец тренировки')
+key_resp_2.keys = []
+key_resp_2.rt = []
+_key_resp_2_allKeys = []
+# keep track of which components have finished
+restComponents = [rest_instruction, key_resp_2]
+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:
+    # 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_instruction* updates
+    if rest_instruction.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+        # keep track of start time/frame for later
+        rest_instruction.frameNStart = frameN  # exact frame index
+        rest_instruction.tStart = t  # local t and not account for scr refresh
+        rest_instruction.tStartRefresh = tThisFlipGlobal  # on global time
+        win.timeOnFlip(rest_instruction, 'tStartRefresh')  # time at next scr refresh
+        rest_instruction.setAutoDraw(True)
+    
+    # *key_resp_2* updates
+    waitOnFlip = False
+    if key_resp_2.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
+        # keep track of start time/frame for later
+        key_resp_2.frameNStart = frameN  # exact frame index
+        key_resp_2.tStart = t  # local t and not account for scr refresh
+        key_resp_2.tStartRefresh = tThisFlipGlobal  # on global time
+        win.timeOnFlip(key_resp_2, 'tStartRefresh')  # time at next scr refresh
+        key_resp_2.status = STARTED
+        # keyboard checking is just starting
+        waitOnFlip = True
+        win.callOnFlip(key_resp_2.clock.reset)  # t=0 on next screen flip
+        win.callOnFlip(key_resp_2.clearEvents, eventType='keyboard')  # clear events on next screen flip
+    if key_resp_2.status == STARTED and not waitOnFlip:
+        theseKeys = key_resp_2.getKeys(keyList=['space'], waitRelease=False)
+        _key_resp_2_allKeys.extend(theseKeys)
+        if len(_key_resp_2_allKeys):
+            key_resp_2.keys = _key_resp_2_allKeys[-1].name  # just the last key pressed
+            key_resp_2.rt = _key_resp_2_allKeys[-1].rt
+            # a response ends the routine
+            continueRoutine = 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_instruction.started', rest_instruction.tStartRefresh)
+thisExp.addData('rest_instruction.stopped', rest_instruction.tStopRefresh)
+# check responses
+if key_resp_2.keys in ['', [], None]:  # No response was made
+    key_resp_2.keys = None
+thisExp.addData('key_resp_2.keys',key_resp_2.keys)
+if key_resp_2.keys != None:  # we had a response
+    thisExp.addData('key_resp_2.rt', key_resp_2.rt)
+thisExp.addData('key_resp_2.started', key_resp_2.tStartRefresh)
+thisExp.addData('key_resp_2.stopped', key_resp_2.tStopRefresh)
+thisExp.nextEntry()
+# the Routine "rest" was not non-slip safe, so reset the non-slip timer
+routineTimer.reset()
+
+# Flip one final time so any remaining win.callOnFlip() 
+# and win.timeOnFlip() tasks get executed before quitting
+win.flip()
+
+# these shouldn't be strictly necessary (should auto-save)
+thisExp.saveAsWideText(filename+'.csv')
+thisExp.saveAsPickle(filename)
+logging.flush()
+# make sure everything is closed down
+thisExp.abort()  # or data files will save again on exit
+win.close()
+core.quit()

BIN
stimuli/presentationScript/repNums_0.xlsx


BIN
stimuli/presentationScript/repNums_1.xlsx


BIN
stimuli/presentationScript/rest_inst.xlsx


BIN
stimuli/presentationScript/sounds.xlsx


+ 4 - 0
stimuli/presentationScript/timer.py

@@ -0,0 +1,4 @@
+import datetime
+
+while True:
+    print(datetime.datetime.now())

+ 16 - 0
stimuli/presentationScript/timer_tt.sh

@@ -0,0 +1,16 @@
+#! /bin/sh - 
+
+sudo service ntp stop
+sleep 10
+sudo ntpdate 98.152.165.38
+sleep 20
+
+valid=true
+
+while [ $valid ]
+do
+echo $(date +"%H:%M:%S:%3N")
+
+
+
+done

BIN
stimuli/presentationScript/trainingTrials_0.xlsx


BIN
stimuli/presentationScript/trainingTrials_1.xlsx


+ 10 - 0
stimuli/presentationScript/triggers.txt

@@ -0,0 +1,10 @@
+50 - listen (! presentation)
+60 - memorize (! presentation)
+105 - 5 digit sequence
+109 - 9 digit sequence
+113 - 13 digit sequence
+1,2,3,4,5,6,7,8,9,10 digits (0=10)
+171 - retention 1 s
+180 - recall (mic image)
+190 - end
+100 - rest

+ 113 - 0
stimuli/presentationScript/zmq_socket.py

@@ -0,0 +1,113 @@
+import zmq
+import msgpack as serializer
+
+print('Opening ports')
+class ZMQsocket:
+
+    def __init__(self, remote_ip, port):
+        """
+        Setup zmq socket, context, and remote helper.
+
+        Parameters:
+        port (float): Specified port to connect to. Defaults to 50020.
+        """
+        self.ip = remote_ip 
+        self.port = port
+        self.ctx = zmq.Context()
+        self.socket = zmq.Socket(self.ctx, zmq.REQ) # this is pub socket
+
+    def connect(self):
+        """
+        Connects to defined zmq socket.
+        """
+        self.socket.connect(f'tcp://{self.ip}:{self.port}')
+        self.socket.send_string('PUB_PORT')
+        self.pub_port = self.socket.recv_string()
+        self.pub_socket = zmq.Socket(self.ctx, zmq.PUB)
+        self.pub_socket.connect(f"tcp://{self.ip}:{self.pub_port}")
+
+    def start_calibration(self):
+        """
+        Starts pupil calibration procedure.
+        """
+        self.socket.send_string('C')
+        return self.socket.recv_string()
+
+    def stop_calibration(self):
+        """
+        Stops pupil calibration procedure.
+        """
+        self.socket.send_string('c')
+        return self.socket.recv_string()
+
+    def start_recording(self, dir_name=None):
+        """
+        Starts pupil recording.
+        Parameters:
+        dir_name (str): Optional name for directory
+        """
+        if dir_name:
+            self.socket.send_string(f'R {dir_name}')
+        else:
+            self.socket.send_string('R')       
+        return self.socket.recv_string()
+
+    def stop_recording(self):
+        """
+        Stops pupil recording.
+        """
+        self.socket.send_string('r')
+        return self.socket.recv_string()
+
+    def set_time(self, time_fn):
+        """
+        Sets the time in pupil.
+
+        Parameters:
+        time (float): Time to set to. 
+        """
+        self.time_fn = time_fn
+        self.socket.send_string(f'T {time_fn()}')
+        return self.socket.recv_string()
+    
+    # send notification:
+    def notify(self, notification):
+        """Sends ``notification`` to Pupil Remote"""
+        topic = 'notify.' + notification['subject']
+        payload = serializer.dumps(notification, use_bin_type=True)
+        self.socket.send_string(topic, flags=zmq.SNDMORE)
+        self.socket.send(payload)
+        return self.socket.recv_string()
+
+    #test notification, note that you need to listen on the IPC to receive notifications!
+    #notify({'subject':"calibration.should_start"})
+    #notify({'subject':"calibration.should_stop"})
+
+    # TODO fix sending annotations
+    def send_trigger(self, trigger):
+        """
+        Sends a trigger object pub_socket
+        """
+        payload = serializer.dumps(trigger, use_bin_type=True)
+        self.pub_socket.send_string(trigger['topic'], flags=zmq.SNDMORE)
+        self.pub_socket.send(payload)
+
+    def new_trigger(self, topic, label, duration):
+        """
+        Creates a trigger dictionary object (make sure set_time() has been invoked)
+        """
+        return {
+            "topic": topic,
+            "label": label,
+            "timestamp": self.time_fn(),
+            "duration": duration,
+        }
+
+    def annotation(self, label, duration):
+        """
+        Shortcut to sending an annotation to pupil remote (make sure set_time() has been invoked)
+        """
+        self.send_trigger(self.new_trigger('annotation', label, duration))
+
+
+    print('Done!')

BIN
stimuli/taskDescription.jpg