57 log = liblog.Logfile()
58 log.write([
"trialnr",
"trialtype",
"targetside",
"gaze_endpos",
"latency",
"correct"])
60 SCREEN_WIDTH, SCREEN_HEIGHT = constants.DISPSIZE
61 CENTER = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
64 left_pos = (CENTER[0] - TARGET_OFFSET, CENTER[1])
65 right_pos = (CENTER[0] + TARGET_OFFSET, CENTER[1])
67 blackscreen = libscreen.Screen()
68 blackscreen.clear(colour=(0, 0, 0))
71 inscreen = libscreen.Screen()
72 inscreen.clear(colour=(0, 0, 0))
74 "Mira la cruz central y presiona 'espacio'.\n\n"
75 "El color indicará la acción:\n"
76 "- Verde: mira al círculo blanco y negro (Pro-sácadico)\n"
77 "- Rojo: mira al estímulo blanco (Anti-sácadico)\n"
78 "- Naranja: NO mires a ningún estímulo (NoGo)\n\n"
79 "Presiona 'espacio' para comenzar.\n"
80 "Pulsa 'E' en cualquier momento para salir."
82 inscreen.draw_text(text=ins_text, fontsize=30, pos=CENTER, colour=(255, 255, 255), center=
True)
85 fixscreen = libscreen.Screen()
86 fixscreen.clear(colour=(0, 0, 0))
87 fixscreen.draw_fixation(fixtype=
'cross', diameter=57, pos=CENTER, colour=(255, 255, 255))
91 'PS': libscreen.Screen(),
92 'AS': libscreen.Screen(),
93 'NoGo': libscreen.Screen()
95 for key, color
in [(
'PS', (0, 255, 0)), (
'AS', (255, 0, 0)), (
'NoGo', (255, 165, 0))]:
96 signal_screens[key].clear(colour=(0, 0, 0))
97 signal_screens[key].draw_circle(pos=CENTER, r=38, fill=
True, colour=color)
101 1: libscreen.Screen(),
102 0: libscreen.Screen()
104 feedbackscreens[1].clear(colour=(0, 0, 0))
105 feedbackscreens[1].draw_text(text=
'Correcto', fontsize=30, pos=CENTER, colour=(0, 255, 0), center=
True)
106 feedbackscreens[0].clear(colour=(0, 0, 0))
107 feedbackscreens[0].draw_text(text=
'Incorrecto', fontsize=30, pos=CENTER, colour=(255, 0, 0), center=
True)
109 self.disp.fill(inscreen)
115 for event
in pygame.event.get():
116 if event.type == pygame.KEYDOWN:
117 if event.key == pygame.K_SPACE:
119 elif event.key == pygame.K_e:
127 for block
in range(max_blocks):
128 trials = [
'PS',
'AS',
'NoGo']
129 random.shuffle(trials)
131 for trialnr, trialtype
in enumerate(trials, start=1):
132 for event
in pygame.event.get():
133 if event.type == pygame.KEYDOWN
and event.key == pygame.K_e:
134 raise KeyboardInterrupt
136 self.disp.fill(fixscreen)
138 libtime.pause(random.randint(750, 1250))
142 for event
in pygame.event.get():
143 if event.type == pygame.KEYDOWN:
144 if event.key == pygame.K_SPACE:
146 elif event.key == pygame.K_e:
147 raise KeyboardInterrupt
150 self.tracker.start_recording()
152 self.disp.fill(signal_screens[trialtype])
156 self.disp.fill(blackscreen)
160 targetside = random.choice([
'left',
'right'])
161 target_pos = left_pos
if targetside ==
'left' else right_pos
162 nontarget_pos = right_pos
if targetside ==
'left' else left_pos
164 dualstim_screen = libscreen.Screen()
165 dualstim_screen.clear(colour=(0, 0, 0))
166 dualstim_screen.draw_circle(pos=nontarget_pos, r=28, fill=
True, colour=(255, 255, 255))
167 dualstim_screen.draw_circle(pos=target_pos, r=38, fill=
True, colour=(255, 255, 255))
168 dualstim_screen.draw_circle(pos=target_pos, r=32, fill=
True, colour=(0, 0, 0))
169 dualstim_screen.draw_circle(pos=target_pos, r=28, fill=
True, colour=(255, 255, 255))
171 self.disp.fill(dualstim_screen)
174 t0 = pygame.time.get_ticks()
175 self.tracker.log(f
"target {targetside}")
177 t1, startpos = self.tracker.wait_for_saccade_start()
178 endtime, startpos, endpos = self.tracker.wait_for_saccade_end()
180 latency = (t1 - t0) / 1000
181 self.tracker.stop_recording()
186 if trialtype ==
'PS':
191 (targetside ==
'left' and endpos[0] <= constants.DISPSIZE[0]/2)
or
192 (targetside ==
'right' and endpos[0] >= constants.DISPSIZE[0]/2)
196 elif trialtype ==
'AS':
201 (targetside ==
'left' and endpos[0] >= constants.DISPSIZE[0]/2)
or
202 (targetside ==
'right' and endpos[0] <= constants.DISPSIZE[0]/2)
205 elif trialtype ==
'NoGo':
209 t1, _ = self.tracker.wait_for_saccade_start(timeout=900)
211 latency = (t1 - t0) / 1000
222 dualstim_screen.clear(colour=(0, 0, 0))
225 self.disp.fill(feedbackscreens[correct])
230 results.append([trialnr, trialtype, targetside, endpos, round(latency, 3), correct])
232 except KeyboardInterrupt:
233 print(
"Test interrumpido por el usuario con la tecla 'E'.")
239 print(
"Test Go/NoGo finalizado.")
242 df = pd.DataFrame(results, columns=[
"trialnr",
"trialtype",
"targetside",
"gaze_endpos",
"latency",
"correct"])
243 df.to_excel(
"gonogo_results.xlsx", index=
False)
244 print(
"Resultados guardados en 'gonogo_results.xlsx'.")