def display_sequence(self, sequence): for i, number in enumerate(sequence): # Display number self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.stim_font, number, "center", "center") pygame.display.flip() display.wait(self.STIM_DURATION) # Display blank screen display.blank_screen(self.screen, self.background, self.BETWEEN_STIM_DURATION)
def run(self): # Instructions self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.font, "SART", "center", self.screen_y / 2 - 250, (255, 255, 255)) display.text(self.screen, self.font, "Numbers will appear in the center of the screen.", 100, self.screen_y / 2 - 150, (255, 255, 255)) display.text(self.screen, self.font, "Press the spacebar after you see a number.", 100, self.screen_y / 2 - 50, (255, 255, 255)) display.text( self.screen, self.font, "However, if the number is a 3, " "do NOT press the spacebar.", 100, self.screen_y / 2 + 50, (255, 255, 255)) display.text( self.screen, self.font, "Please respond as quickly, " "and as accurately, as possible", 100, self.screen_y / 2 + 150, (255, 255, 255)) display.text_space(self.screen, self.font, "center", self.screen_y / 2 + 300, (255, 255, 255)) pygame.display.flip() display.wait_for_space() # Instructions Practice self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.font, "We will begin with a few practice trials...", "center", "center", (255, 255, 255)) display.text_space(self.screen, self.font, "center", self.screen_y / 2 + 100, (255, 255, 255)) pygame.display.flip() display.wait_for_space() # Blank screen display.blank_screen(self.screen, self.background, self.BLANK_DURATION) # Show practice trials practice_trials = pd.DataFrame([5, 7, 7, 3, 9, 2, 1, 3, 8, 6], columns=['stimulus']) for i in range(practice_trials.shape[0]): self.display_trial(i, practice_trials) # Practice end screen self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.font, "End of practice trials", 100, self.screen_y / 2 - 100, (255, 255, 255)) display.text(self.screen, self.font, "We will now begin the main trials...", 100, "center", (255, 255, 255)) display.text_space(self.screen, self.font, "center", self.screen_y / 2 + 100, (255, 255, 255)) pygame.display.flip() display.wait_for_space() # Blank screen display.blank_screen(self.screen, self.background, self.BLANK_DURATION) # Show main trials for i in range(self.all_data.shape[0]): self.display_trial(i, self.all_data) # Rearrange dataframe columns = [ 'trial', 'stimulus', 'stimSize', 'RT', 'key press', 'accuracy' ] self.all_data = self.all_data[columns] # End screen self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.font, "End of task", "center", "center", (255, 255, 255)) display.text_space(self.screen, self.font, "center", self.screen_y / 2 + 100, (255, 255, 255)) pygame.display.flip() display.wait_for_space() print("- SART complete") return self.all_data
def display_trial(self, df, i, r, trial_type): # Clear screen self.screen.blit(self.background, (0, 0)) pygame.display.flip() # Display number sequence self.display_sequence(r['set']) # Display probe warning self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.stim_font, "+", "center", "center") pygame.display.flip() display.wait(self.PROBE_WARN_DURATION) # Display blank screen display.blank_screen(self.screen, self.background, self.BETWEEN_STIM_DURATION) # Display probe self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.stim_font, r['probe'], "center", "center", (0, 0, 255)) # Display key reminders if practice trials if trial_type == "practice": display.image(self.screen, self.img_left, 450 - self.img_left.get_rect().width / 2, self.screen_y / 2 + 150) yes_text = self.font.render("(yes)", 1, (0, 0, 0)) display.text(self.screen, self.font, yes_text, 450 - yes_text.get_rect().width / 2, self.screen_y / 2 + 160) display.image( self.screen, self.img_right, self.screen_x - 450 - self.img_right.get_rect().width / 2, self.screen_y / 2 + 150) no_text = self.font.render("(no)", 1, (0, 0, 0)) display.text(self.screen, self.font, no_text, self.screen_x - 450 - no_text.get_rect().width / 2, self.screen_y / 2 + 160) pygame.display.flip() start_time = int(round(time.time() * 1000)) # Clear the event queue before checking for responses pygame.event.clear() wait_response = True while wait_response: for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_LEFT: df.set_value(i, "response", "present") wait_response = False elif event.type == KEYDOWN and event.key == K_RIGHT: df.set_value(i, "response", "absent") wait_response = False elif event.type == KEYDOWN and event.key == K_F12: sys.exit(0) end_time = int(round(time.time() * 1000)) # If time limit has been reached, consider it a missed trial if end_time - start_time >= self.PROBE_DURATION: wait_response = False # Store RT rt = int(round(time.time() * 1000)) - start_time df.set_value(i, "RT", rt) # Display blank screen display.blank_screen(self.screen, self.background, self.BETWEEN_STIM_DURATION) # Display feedback self.screen.blit(self.background, (0, 0)) if rt >= self.PROBE_DURATION: df.set_value(i, "correct", 0) display.text(self.screen, self.font, "too slow", "center", "center", (255, 165, 0)) else: if df["probeType"][i] == df["response"][i]: df.set_value(i, "correct", 1) display.text(self.screen, self.font, "correct", "center", "center", (0, 255, 0)) else: df.set_value(i, "correct", 0) display.text(self.screen, self.font, "incorrect", "center", "center", (255, 0, 0)) pygame.display.flip() display.wait(self.FEEDBACK_DURATION) # Display blank screen (ITI) display.blank_screen(self.screen, self.background, self.ITI)
def display_trial(self, df, i, r, trial_type): # Clear screen self.screen.blit(self.background, (0, 0)) pygame.display.flip() # Display number sequence self.display_sequence(r['set']) # Display probe warning self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.stim_font, "+", "center", "center") pygame.display.flip() display.wait(self.PROBE_WARN_DURATION) # Display blank screen display.blank_screen(self.screen, self.background, self.BETWEEN_STIM_DURATION) # Display probe self.screen.blit(self.background, (0, 0)) display.text(self.screen, self.stim_font, r['probe'], "center", "center", (0, 0, 255)) # Display key reminders if practice trials if trial_type == "practice": display.image(self.screen, self.img_left, 450 - self.img_left.get_rect().width/2, self.screen_y/2 + 150) yes_text = self.font.render("(yes)", 1, (0, 0, 0)) display.text(self.screen, self.font, yes_text, 450 - yes_text.get_rect().width/2, self.screen_y/2 + 160) display.image( self.screen, self.img_right, self.screen_x - 450 - self.img_right.get_rect().width/2, self.screen_y/2 + 150) no_text = self.font.render("(no)", 1, (0, 0, 0)) display.text(self.screen, self.font, no_text, self.screen_x - 450 - no_text.get_rect().width/2, self.screen_y/2 + 160) pygame.display.flip() start_time = int(round(time.time() * 1000)) # Clear the event queue before checking for responses pygame.event.clear() wait_response = True while wait_response: for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_LEFT: df.set_value(i, "response", "present") wait_response = False elif event.type == KEYDOWN and event.key == K_RIGHT: df.set_value(i, "response", "absent") wait_response = False elif event.type == KEYDOWN and event.key == K_F12: sys.exit(0) end_time = int(round(time.time() * 1000)) # If time limit has been reached, consider it a missed trial if end_time - start_time >= self.PROBE_DURATION: wait_response = False # Store RT rt = int(round(time.time() * 1000)) - start_time df.set_value(i, "RT", rt) # Display blank screen display.blank_screen(self.screen, self.background, self.BETWEEN_STIM_DURATION) # Display feedback self.screen.blit(self.background, (0, 0)) if rt >= self.PROBE_DURATION: df.set_value(i, "correct", 0) display.text(self.screen, self.font, "too slow", "center", "center", (255, 165, 0)) else: if df["probeType"][i] == df["response"][i]: df.set_value(i, "correct", 1) display.text(self.screen, self.font, "correct", "center", "center", (0, 255, 0)) else: df.set_value(i, "correct", 0) display.text(self.screen, self.font, "incorrect", "center", "center", (255, 0, 0)) pygame.display.flip() display.wait(self.FEEDBACK_DURATION) # Display blank screen (ITI) display.blank_screen(self.screen, self.background, self.ITI)