Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)