Browse Source

修改页面配置

liudkun15@gmail.com 1 year ago
parent
commit
46d8b633b5
3 changed files with 32 additions and 38 deletions
  1. 4 1
      .gitignore
  2. 13 13
      backend/general_grasp_training.psyexp
  3. 15 24
      backend/general_grasp_training.py

+ 4 - 1
.gitignore

@@ -170,4 +170,7 @@ cython_debug/
 #.idea/
 #.idea/
 
 
 model/*
 model/*
-!model/.gitkeep
+!model/.gitkeep
+
+backend/data/*
+!backend/data/.gitkeep

+ 13 - 13
backend/general_grasp_training.psyexp

@@ -8,7 +8,7 @@
     <Param val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code" updates="None" name="Data filename"/>
     <Param val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code" updates="None" name="Data filename"/>
     <Param val="True" valType="bool" updates="None" name="Enable Escape"/>
     <Param val="True" valType="bool" updates="None" name="Enable Escape"/>
     <Param val="" valType="str" updates="None" name="End Message"/>
     <Param val="" valType="str" updates="None" name="End Message"/>
-    <Param val="{'participant':'f&quot;{randint(0, 999999):06.0f}&quot;', 'session':'001'}" valType="code" updates="None" name="Experiment info"/>
+    <Param val="{'participant': 'f&quot;{randint(0, 999999):06.0f}&quot;', 'session': '001'}" valType="code" updates="None" name="Experiment info"/>
     <Param val="True" valType="bool" updates="None" name="Force stereo"/>
     <Param val="True" valType="bool" updates="None" name="Force stereo"/>
     <Param val="True" valType="bool" updates="None" name="Full-screen window"/>
     <Param val="True" valType="bool" updates="None" name="Full-screen window"/>
     <Param val="" valType="str" updates="None" name="HTML path"/>
     <Param val="" valType="str" updates="None" name="HTML path"/>
@@ -26,12 +26,12 @@
     <Param val="False" valType="bool" updates="None" name="Show mouse"/>
     <Param val="False" valType="bool" updates="None" name="Show mouse"/>
     <Param val="height" valType="str" updates="None" name="Units"/>
     <Param val="height" valType="str" updates="None" name="Units"/>
     <Param val="" valType="str" updates="None" name="Use version"/>
     <Param val="" valType="str" updates="None" name="Use version"/>
-    <Param val="(1024, 768)" valType="list" updates="None" name="Window size (pixels)"/>
+    <Param val="[1493, 933]" valType="list" updates="None" name="Window size (pixels)"/>
     <Param val="none" valType="str" updates="None" name="backgroundFit"/>
     <Param val="none" valType="str" updates="None" name="backgroundFit"/>
     <Param val="" valType="str" updates="None" name="backgroundImg"/>
     <Param val="" valType="str" updates="None" name="backgroundImg"/>
     <Param val="avg" valType="str" updates="None" name="blendMode"/>
     <Param val="avg" valType="str" updates="None" name="blendMode"/>
     <Param val="{'thisRow.t': 'priority.CRITICAL', 'expName': 'priority.LOW'}" valType="dict" updates="None" name="colPriority"/>
     <Param val="{'thisRow.t': 'priority.CRITICAL', 'expName': 'priority.LOW'}" valType="dict" updates="None" name="colPriority"/>
-    <Param val="$[0,0,0]" valType="color" updates="None" name="color"/>
+    <Param val="$[1,1,1]" valType="color" updates="None" name="color"/>
     <Param val="rgb" valType="str" updates="None" name="colorSpace"/>
     <Param val="rgb" valType="str" updates="None" name="colorSpace"/>
     <Param val="100.1.1.1" valType="str" updates="None" name="elAddress"/>
     <Param val="100.1.1.1" valType="str" updates="None" name="elAddress"/>
     <Param val="FILTER_LEVEL_2" valType="str" updates="None" name="elDataFiltering"/>
     <Param val="FILTER_LEVEL_2" valType="str" updates="None" name="elDataFiltering"/>
@@ -48,9 +48,9 @@
     <Param val="None" valType="str" updates="None" name="eyetracker"/>
     <Param val="None" valType="str" updates="None" name="eyetracker"/>
     <Param val="127.0.0.1" valType="str" updates="None" name="gpAddress"/>
     <Param val="127.0.0.1" valType="str" updates="None" name="gpAddress"/>
     <Param val="4242" valType="num" updates="None" name="gpPort"/>
     <Param val="4242" valType="num" updates="None" name="gpPort"/>
-    <Param val="ioHub" valType="str" updates="None" name="keyboardBackend"/>
+    <Param val="PsychToolbox" valType="str" updates="None" name="keyboardBackend"/>
     <Param val="exp" valType="code" updates="None" name="logging level"/>
     <Param val="exp" valType="code" updates="None" name="logging level"/>
-    <Param val="MIDDLE_BUTTON" valType="list" updates="None" name="mgBlink"/>
+    <Param val="('MIDDLE_BUTTON',)" valType="list" updates="None" name="mgBlink"/>
     <Param val="CONTINUOUS" valType="str" updates="None" name="mgMove"/>
     <Param val="CONTINUOUS" valType="str" updates="None" name="mgMove"/>
     <Param val="0.5" valType="num" updates="None" name="mgSaccade"/>
     <Param val="0.5" valType="num" updates="None" name="mgSaccade"/>
     <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
     <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
@@ -90,7 +90,7 @@
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
       </RoutineSettingsComponent>
       </RoutineSettingsComponent>
       <TextComponent name="train_position" plugin="None">
       <TextComponent name="train_position" plugin="None">
-        <Param val="white" valType="color" updates="constant" name="color"/>
+        <Param val="black" valType="color" updates="constant" name="color"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
@@ -108,14 +108,14 @@
         <Param val="time (s)" valType="str" updates="None" name="startType"/>
         <Param val="time (s)" valType="str" updates="None" name="startType"/>
         <Param val="0.0" valType="code" updates="None" name="startVal"/>
         <Param val="0.0" valType="code" updates="None" name="startVal"/>
         <Param val="duration (s)" valType="str" updates="None" name="stopType"/>
         <Param val="duration (s)" valType="str" updates="None" name="stopType"/>
-        <Param val="content[&quot;train_right&quot;][&quot;welcome_duration&quot;]" valType="code" updates="constant" name="stopVal"/>
+        <Param val="2" valType="code" updates="constant" name="stopVal"/>
         <Param val="True" valType="bool" updates="None" name="syncScreenRefresh"/>
         <Param val="True" valType="bool" updates="None" name="syncScreenRefresh"/>
         <Param val="训练部位:右手" valType="str" updates="constant" name="text"/>
         <Param val="训练部位:右手" valType="str" updates="constant" name="text"/>
         <Param val="from exp settings" valType="str" updates="None" name="units"/>
         <Param val="from exp settings" valType="str" updates="None" name="units"/>
         <Param val="" valType="num" updates="constant" name="wrapWidth"/>
         <Param val="" valType="num" updates="constant" name="wrapWidth"/>
       </TextComponent>
       </TextComponent>
       <TextComponent name="instruction" plugin="None">
       <TextComponent name="instruction" plugin="None">
-        <Param val="white" valType="color" updates="constant" name="color"/>
+        <Param val="black" valType="color" updates="constant" name="color"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
@@ -157,7 +157,7 @@
         <Param val="config" valType="code" updates="None" name="name"/>
         <Param val="config" valType="code" updates="None" name="name"/>
       </CodeComponent>
       </CodeComponent>
       <KeyboardComponent name="key_resp" plugin="None">
       <KeyboardComponent name="key_resp" plugin="None">
-        <Param val="'return'" valType="list" updates="constant" name="allowedKeys"/>
+        <Param val="'space'" valType="list" updates="constant" name="allowedKeys"/>
         <Param val="" valType="str" updates="constant" name="correctAns"/>
         <Param val="" valType="str" updates="constant" name="correctAns"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="True" valType="bool" updates="constant" name="discard previous"/>
         <Param val="True" valType="bool" updates="constant" name="discard previous"/>
@@ -210,7 +210,7 @@
         <Param val="initialize_buffer" valType="code" updates="None" name="name"/>
         <Param val="initialize_buffer" valType="code" updates="None" name="name"/>
       </CodeComponent>
       </CodeComponent>
       <TextComponent name="text" plugin="None">
       <TextComponent name="text" plugin="None">
-        <Param val="white" valType="color" updates="constant" name="color"/>
+        <Param val="black" valType="color" updates="constant" name="color"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
@@ -252,7 +252,7 @@
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
       </RoutineSettingsComponent>
       </RoutineSettingsComponent>
       <TextComponent name="feedback" plugin="None">
       <TextComponent name="feedback" plugin="None">
-        <Param val="white" valType="color" updates="constant" name="color"/>
+        <Param val="black" valType="color" updates="constant" name="color"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
@@ -372,7 +372,7 @@
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
         <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
       </RoutineSettingsComponent>
       </RoutineSettingsComponent>
       <TextComponent name="mi_end" plugin="None">
       <TextComponent name="mi_end" plugin="None">
-        <Param val="white" valType="color" updates="constant" name="color"/>
+        <Param val="black" valType="color" updates="constant" name="color"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="1" valType="num" updates="constant" name="contrast"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
         <Param val="False" valType="bool" updates="None" name="disabled"/>
@@ -480,7 +480,7 @@
         <Param val="" valType="extendedCode" updates="constant" name="Begin Experiment"/>
         <Param val="" valType="extendedCode" updates="constant" name="Begin Experiment"/>
         <Param val="" valType="extendedCode" updates="constant" name="Begin JS Experiment"/>
         <Param val="" valType="extendedCode" updates="constant" name="Begin JS Experiment"/>
         <Param val="" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
         <Param val="" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
-        <Param val="cnt = 0&amp;#10;for d in decision_buffer:&amp;#10;    if d == decision_buffer:&amp;#10;        cnt += 1&amp;#10;&amp;#10;if cnt &gt;= 3:&amp;#10;    hand_device.start_round(args.finger_model)&amp;#10;    feedback_time = 10&amp;#10;else:&amp;#10;    feedback_time = 2&amp;#10;" valType="extendedCode" updates="constant" name="Begin Routine"/>
+        <Param val="cnt = 0&amp;#10;for d in decision_buffer:&amp;#10;    if d == current_true_label:&amp;#10;        cnt += 1&amp;#10;&amp;#10;if cnt &gt;= 3:&amp;#10;    hand_device.start_round(args.finger_model)&amp;#10;    feedback_time = 10&amp;#10;else:&amp;#10;    feedback_time = 2&amp;#10;" valType="extendedCode" updates="constant" name="Begin Routine"/>
         <Param val="Py" valType="str" updates="None" name="Code Type"/>
         <Param val="Py" valType="str" updates="None" name="Code Type"/>
         <Param val="" valType="extendedCode" updates="constant" name="Each Frame"/>
         <Param val="" valType="extendedCode" updates="constant" name="Each Frame"/>
         <Param val="" valType="extendedCode" updates="constant" name="Each JS Frame"/>
         <Param val="" valType="extendedCode" updates="constant" name="Each JS Frame"/>

+ 15 - 24
backend/general_grasp_training.py

@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 """
 """
 This experiment was created using PsychoPy3 Experiment Builder (v2023.2.3),
 This experiment was created using PsychoPy3 Experiment Builder (v2023.2.3),
-    on 十一月 14, 2023, at 14:23
+    on 十一月 14, 2023, at 15:00
 If you publish work using this script the most relevant publication is:
 If you publish work using this script the most relevant publication is:
 
 
     Peirce J, Gray JR, Simpson S, MacAskill M, Höchenberger R, Sogo H, Kastman E, Lindeløv JK. (2019) 
     Peirce J, Gray JR, Simpson S, MacAskill M, Höchenberger R, Sogo H, Kastman E, Lindeløv JK. (2019) 
@@ -30,7 +30,6 @@ from numpy.random import random, randint, normal, shuffle, choice as randchoice
 import os  # handy system and path functions
 import os  # handy system and path functions
 import sys  # to get file system encoding
 import sys  # to get file system encoding
 
 
-import psychopy.iohub as io
 from psychopy.hardware import keyboard
 from psychopy.hardware import keyboard
 
 
 # Run 'Before Experiment' code from config
 # Run 'Before Experiment' code from config
@@ -238,9 +237,9 @@ def setupWindow(expInfo=None, win=None):
     if win is None:
     if win is None:
         # if not given a window to setup, make one
         # if not given a window to setup, make one
         win = visual.Window(
         win = visual.Window(
-            size=(1024, 768), fullscr=True, screen=0,
+            size=[1493, 933], fullscr=True, screen=0,
             winType='pyglet', allowStencil=False,
             winType='pyglet', allowStencil=False,
-            monitor='testMonitor', color=[0,0,0], colorSpace='rgb',
+            monitor='testMonitor', color=[1,1,1], colorSpace='rgb',
             backgroundImage='', backgroundFit='none',
             backgroundImage='', backgroundFit='none',
             blendMode='avg', useFBO=True,
             blendMode='avg', useFBO=True,
             units='height'
             units='height'
@@ -250,7 +249,7 @@ def setupWindow(expInfo=None, win=None):
             expInfo['frameRate'] = win.getActualFrameRate()
             expInfo['frameRate'] = win.getActualFrameRate()
     else:
     else:
         # if we have a window, just set the attributes which are safe to set
         # if we have a window, just set the attributes which are safe to set
-        win.color = [0,0,0]
+        win.color = [1,1,1]
         win.colorSpace = 'rgb'
         win.colorSpace = 'rgb'
         win.backgroundImage = ''
         win.backgroundImage = ''
         win.backgroundFit = 'none'
         win.backgroundFit = 'none'
@@ -281,18 +280,10 @@ def setupInputs(expInfo, thisExp, win):
     # --- Setup input devices ---
     # --- Setup input devices ---
     inputs = {}
     inputs = {}
     ioConfig = {}
     ioConfig = {}
-    
-    # Setup iohub keyboard
-    ioConfig['Keyboard'] = dict(use_keymap='psychopy')
-    
-    ioSession = '1'
-    if 'session' in expInfo:
-        ioSession = str(expInfo['session'])
-    ioServer = io.launchHubServer(window=win, **ioConfig)
-    eyetracker = None
+    ioSession = ioServer = eyetracker = None
     
     
     # create a default keyboard (e.g. to check for escape)
     # create a default keyboard (e.g. to check for escape)
-    defaultKeyboard = keyboard.Keyboard(backend='iohub')
+    defaultKeyboard = keyboard.Keyboard(backend='ptb')
     # return inputs dict
     # return inputs dict
     return {
     return {
         'ioServer': ioServer,
         'ioServer': ioServer,
@@ -332,7 +323,7 @@ def pauseExperiment(thisExp, inputs=None, win=None, timers=[], playbackComponent
         # make sure we have a keyboard
         # make sure we have a keyboard
         if inputs is None:
         if inputs is None:
             inputs = {
             inputs = {
-                'defaultKeyboard': keyboard.Keyboard(backend='ioHub')
+                'defaultKeyboard': keyboard.Keyboard(backend='PsychToolbox')
             }
             }
         # check for quit (typically the Esc key)
         # check for quit (typically the Esc key)
         if inputs['defaultKeyboard'].getKeys(keyList=['escape']):
         if inputs['defaultKeyboard'].getKeys(keyList=['escape']):
@@ -399,14 +390,14 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         text='训练部位:右手',
         text='训练部位:右手',
         font='Open Sans',
         font='Open Sans',
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
-        color='white', colorSpace='rgb', opacity=None, 
+        color='black', colorSpace='rgb', opacity=None, 
         languageStyle='LTR',
         languageStyle='LTR',
         depth=0.0);
         depth=0.0);
     instruction = visual.TextStim(win=win, name='instruction',
     instruction = visual.TextStim(win=win, name='instruction',
         text='准备进行一般抓握训练,\n按回车键继续',
         text='准备进行一般抓握训练,\n按回车键继续',
         font='Open Sans',
         font='Open Sans',
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
-        color='white', colorSpace='rgb', opacity=None, 
+        color='black', colorSpace='rgb', opacity=None, 
         languageStyle='LTR',
         languageStyle='LTR',
         depth=-1.0);
         depth=-1.0);
     key_resp = keyboard.Keyboard()
     key_resp = keyboard.Keyboard()
@@ -416,7 +407,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         text='请准备开始尝试运动',
         text='请准备开始尝试运动',
         font='Open Sans',
         font='Open Sans',
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
-        color='white', colorSpace='rgb', opacity=None, 
+        color='black', colorSpace='rgb', opacity=None, 
         languageStyle='LTR',
         languageStyle='LTR',
         depth=-1.0);
         depth=-1.0);
     
     
@@ -437,7 +428,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         text=None,
         text=None,
         font='Open Sans',
         font='Open Sans',
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
-        color='white', colorSpace='rgb', opacity=None, 
+        color='black', colorSpace='rgb', opacity=None, 
         languageStyle='LTR',
         languageStyle='LTR',
         depth=0.0);
         depth=0.0);
     
     
@@ -456,7 +447,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         text='结束实验',
         text='结束实验',
         font='Open Sans',
         font='Open Sans',
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
         pos=(0, 0), height=0.05, wrapWidth=None, ori=0.0, 
-        color='white', colorSpace='rgb', opacity=None, 
+        color='black', colorSpace='rgb', opacity=None, 
         languageStyle='LTR',
         languageStyle='LTR',
         depth=0.0);
         depth=0.0);
     
     
@@ -525,7 +516,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         # if train_position is stopping this frame...
         # if train_position is stopping this frame...
         if train_position.status == STARTED:
         if train_position.status == STARTED:
             # is it time to stop? (based on global clock, using actual start)
             # is it time to stop? (based on global clock, using actual start)
-            if tThisFlipGlobal > train_position.tStartRefresh + content["train_right"]["welcome_duration"]-frameTolerance:
+            if tThisFlipGlobal > train_position.tStartRefresh + 2-frameTolerance:
                 # keep track of stop time/frame for later
                 # keep track of stop time/frame for later
                 train_position.tStop = t  # not accounting for scr refresh
                 train_position.tStop = t  # not accounting for scr refresh
                 train_position.frameNStop = frameN  # exact frame index
                 train_position.frameNStop = frameN  # exact frame index
@@ -574,7 +565,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
             win.callOnFlip(key_resp.clock.reset)  # t=0 on next screen flip
             win.callOnFlip(key_resp.clock.reset)  # t=0 on next screen flip
             win.callOnFlip(key_resp.clearEvents, eventType='keyboard')  # clear events on next screen flip
             win.callOnFlip(key_resp.clearEvents, eventType='keyboard')  # clear events on next screen flip
         if key_resp.status == STARTED and not waitOnFlip:
         if key_resp.status == STARTED and not waitOnFlip:
-            theseKeys = key_resp.getKeys(keyList=['return'], ignoreKeys=["escape"], waitRelease=False)
+            theseKeys = key_resp.getKeys(keyList=['space'], ignoreKeys=["escape"], waitRelease=False)
             _key_resp_allKeys.extend(theseKeys)
             _key_resp_allKeys.extend(theseKeys)
             if len(_key_resp_allKeys):
             if len(_key_resp_allKeys):
                 key_resp.keys = _key_resp_allKeys[-1].name  # just the last key pressed
                 key_resp.keys = _key_resp_allKeys[-1].name  # just the last key pressed
@@ -893,7 +884,7 @@ def run(expInfo, thisExp, win, inputs, globalClock=None, thisSession=None):
         # Run 'Begin Routine' code from collect_decisions
         # Run 'Begin Routine' code from collect_decisions
         cnt = 0
         cnt = 0
         for d in decision_buffer:
         for d in decision_buffer:
-            if d == decision_buffer:
+            if d == current_true_label:
                 cnt += 1
                 cnt += 1
         
         
         if cnt >= 3:
         if cnt >= 3: