FRAMES_PER_SEC = get_frame_rate(win) clock_image = visual.ImageStim(win=win, image=join('images', 'clock.png'), interpolate=True, size=config['CLOCK_SIZE'], pos=config['CLOCK_POS']) accept_box = AcceptBox(win, config["ACCEPT_BOX_POS"], config["ACCEPT_BOX_SIZE"], config["ACCEPT_BOX_TEXT"], config["START_BOX_COLOR"], config["START_TEXT_COLOR"], config["END_BOX_COLOR"], config["END_TEXT_COLOR"]) feedback_positive = visual.TextStim(win=win, text=read_text_from_file( join('.', 'messages', "feedback_positive.txt")), antialias=True, font=u'Arial', height=config['FEEDBACK_SIZE'], wrapWidth=win.size[0], color=u'black', alignHoriz='center', alignVert='center', pos=config["FEEDBACK_POS"]) feedback_negative = visual.TextStim(win=win, text=read_text_from_file( join('.', 'messages', "feedback_negative.txt")), antialias=True,
def ophthalmic_procedure(win, screen_res, frames_per_sec, trigger_no, triggers_list, text_size, send_eeg_triggers=False, send_nirs_triggers=False, port_eeg=None, port_nirs=None, vis_offset=60, secs_of_msg=5, secs_of_blinks=9, secs_of_saccades=9, exit_key='f7'): """ :param port_nirs: :param port_eeg: :param send_nirs_triggers: :param text_size: :param triggers_list: :param trigger_no: :param frames_per_sec: :param screen_res: :param win: :param send_eeg_triggers: :param vis_offset: No of pixels of margin between fixation crosses and screen border :param secs_of_msg: :param secs_of_blinks: :param secs_of_saccades: :return: """ logging.info('Starting ophthalmic procedure... ') # prepare stim's ophthalmic_info = read_text_from_file( os.path.join('.', 'messages', 'ophthalmic_instruction.txt')) corners_info = read_text_from_file( os.path.join('.', 'messages', 'ophthalmic_corners.txt')) ophthalmic_info = visual.TextStim(win=win, font=u'Arial', text=ophthalmic_info, height=text_size, wrapWidth=screen_res['width'], color=u'black') corners_info = visual.TextStim(win=win, font=u'Arial', text=corners_info, height=text_size, wrapWidth=screen_res['width'], color=u'black') # crosses are located in corners crosses = [[x, y] for x in [ -screen_res['width'] / 2 + vis_offset, screen_res['width'] / 2 - vis_offset ] for y in [ -screen_res['height'] / 2 + vis_offset, screen_res['height'] / 2 - vis_offset ]] crosses = [ visual.TextStim(win=win, text=u'+', height=3 * text_size, color=u'black', pos=pos) for pos in crosses ] ophthalmic_info.setAutoDraw(True) for _ in range(frames_per_sec * secs_of_msg): win.flip() check_exit(exit_key) ophthalmic_info.setAutoDraw(False) win.flip() for frame_counter in range(frames_per_sec * secs_of_blinks): if frame_counter % frames_per_sec == 0: trigger_no, triggers_list = prepare_trigger( trigger_type=TriggerTypes.BLINK, trigger_no=trigger_no, triggers_list=triggers_list) send_trigger(port_eeg=port_eeg, port_nirs=port_nirs, trigger_no=trigger_no, send_eeg_triggers=send_eeg_triggers, send_nirs_triggers=send_nirs_triggers) win.flip() check_exit(exit_key) corners_info.setAutoDraw(True) for _ in range(frames_per_sec * secs_of_msg): win.flip() check_exit(exit_key) corners_info.setAutoDraw(False) [item.setAutoDraw(True) for item in crosses] for frame_counter in range(frames_per_sec * secs_of_saccades): if frame_counter % frames_per_sec == 0: trigger_no, triggers_list = prepare_trigger( trigger_type=TriggerTypes.BLINK, trigger_no=trigger_no, triggers_list=triggers_list) send_trigger(port_eeg=port_eeg, port_nirs=port_nirs, trigger_no=trigger_no, send_eeg_triggers=send_eeg_triggers, send_nirs_triggers=send_nirs_triggers) win.flip() check_exit(exit_key) [item.setAutoDraw(False) for item in crosses] win.flip() logging.info('Ophthalmic procedure finished correctly!') return trigger_no, triggers_list
def run_trial(trial, config, response_clock, clock_image, mouse, win, fixation, stim_time, instruction=None, training=False, training_trial_idx=None): win.callOnFlip(response_clock.reset) win.flip() while response_clock.getTime() < config["FIXATION_TIME"]: fixation.draw(win) win.flip() acc = -1 chosen_answer = {"word": None, "length": None, "category": None} rt = None trial.set_auto_draw(True) if instruction is not None: instruction.setAutoDraw(True) clock_is_shown = False win.callOnFlip(response_clock.reset) win.flip() event.clearEvents() while response_clock.getTime() < stim_time and acc == -1: for idx, frame in enumerate(trial.frames): if frame.contains(mouse.getPos()) and config["SHOW_FRAMES"]: frame.draw() if mouse.isPressedIn(frame): chosen_answer = trial.info["answers"][idx] acc = chosen_answer == trial.info["task"] rt = response_clock.getTime() break if clock_image is not None and \ not clock_is_shown and \ config["STIM_TIME"] - response_clock.getTime() < config["SHOW_CLOCK"]: clock_image.setAutoDraw(True) clock_is_shown = True win.flip() check_exit() win.flip() if clock_image is not None: clock_image.setAutoDraw(False) if training: if acc == 1: feedback_file_name = "feedback_positive.txt" elif acc == -1: feedback_file_name = "feedback_no_answer.txt" else: feedback_file_name = "feedback_negative.txt" text = read_text_from_file(join('.', 'messages', feedback_file_name)) + \ read_text_from_file(join('.', 'messages', "feedback_info_{}.txt".format(training_trial_idx + 1))) feedback = visual.TextStim(win=win, height=config['FEEDBACK_SIZE'], alignHoriz='center', alignVert='center', font=u'Arial', pos=config["FEEDBACK_POS"], text=text, wrapWidth=win.size[0], color=config["FEEDBACK_COLOR"]) feedback.setAutoDraw(True) answer_idx = trial.info["answers"].index(trial.info["task"]) trial.frames[answer_idx].lineColor = config["FRAME_COLOR_CORR"] trial.frames[answer_idx].setAutoDraw(True) if not acc: chosen_idx = trial.info["answers"].index(chosen_answer) trial.frames[chosen_idx].lineColor = config["FRAME_COLOR_WRONG"] trial.frames[chosen_idx].setAutoDraw(True) win.flip() event.waitKeys(keyList=['space']) feedback.setAutoDraw(False) trial.set_auto_draw(False) if instruction is not None: instruction.setAutoDraw(False) win.flip() time.sleep(config["WAIT_TIME"] + random.uniform(config["WAIT_JITTER"][0], config["WAIT_JITTER"][1])) return chosen_answer, acc, rt
color=config["FIXATION_COLOR"]) mouse = event.Mouse() response_clock = core.Clock() in_trial_instruction = None if config["SHOW_IN_TRIAL_INSTRUCTION"]: in_trial_instruction = visual.TextStim( win=win, height=config['IN_TRIAL_INSTRUCTION_SIZE'], alignHoriz='center', alignVert='center', font=u'Arial', pos=config["IN_TRIAL_INSTRUCTION_POS"], text=read_text_from_file( join('.', 'messages', "in_trial_instruction.txt")), wrapWidth=win.size[0], color=config["IN_TRIAL_INSTRUCTION_COLOR"]) # TRAINING 1 # show_info(win, join('.', 'messages', "instruction1.txt"), text_size=config['TEXT_SIZE'], screen_width=SCREEN_RES[0]) show_image(win, "instruction_1.jpg", size=config["INSTRUCTION_SIZE_TRAINING_1"]) training = True training_trials_info = load_training_trials("training_1_trials.yaml") training_trials = create_training_trials(config, win, training_trials_info) train_clock = clock_image if config["SHOW_CLOCK_IN_TRAINING_1"] else None for i, t in enumerate(training_trials): chosen_answer, acc, rt = run_trial( trial=t,
config["ACCEPT_BOX_SIZE"], config["ACCEPT_BOX_TEXT"], config["START_BOX_COLOR"], config["START_TEXT_COLOR"], config["END_BOX_COLOR"], config["END_TEXT_COLOR"]) mouse = event.Mouse() response_clock = core.Clock() trial_nr = 1 # TRAINING # show_info(win, join('.', 'messages', "instruction1.txt"), text_size=config['TEXT_SIZE'], screen_width=SCREEN_RES[0]) show_image(win, "instrukcja_1.jpg", size=SCREEN_RES) show_image(win, "instrukcja_2.jpg", size=SCREEN_RES) # show_image(window, 'instruction.png', SCREEN_RES) for item in config["TRAINING_TRIALS"]: text = read_text_from_file(join('.', 'messages', "feedback_positive.txt")) + \ read_text_from_file(join('.', 'messages', "feedback_info_{}.txt".format(item))) feedback_positive = visual.TextStim(win=win, text=text, antialias=True, font=u'Arial', height=config['FEEDBACK_SIZE'], wrapWidth=win.size[0], color=u'black', alignHoriz='center', alignVert='center', pos=config["FEEDBACK_POS"]) text = read_text_from_file(join('.', 'messages', "feedback_negative.txt")) + \ read_text_from_file(join('.', 'messages', "feedback_info_{}.txt".format(item))) feedback_negative = visual.TextStim(win=win,