diff --git a/SaccadePursuitEyeTracking.py b/SaccadePursuitEyeTracking.py index 5180bc0..0a168b2 100755 --- a/SaccadePursuitEyeTracking.py +++ b/SaccadePursuitEyeTracking.py @@ -28,50 +28,51 @@ import SaccadePursuit # Experimental Parameters monitor_name = 'testMonitor' -monitor_width = 41 #25.8 height +monitor_width = 41 # 25.8 height distance_to_monitor = 74 -monitor_px = [1440,900] +monitor_px = [1440, 900] window_screen = 1 -disableTracker = False # For Debugging -isi_time = 2 # Interstimulus Interval +disableTracker = False # For Debugging +isi_time = 2 # Interstimulus Interval data_directory = os.path.join( os.path.expanduser('~'), 'Desktop', 'ExperimentalData', 'SaccadePursuitEyeTracking') # image_directory = os.path.join(os.getcwd(),'Images') image_directory = os.path.join( - os.path.expanduser('~'), 'Desktop','SaccadePursuitExperiment','Images') + os.path.expanduser('~'), 'Desktop', 'SaccadePursuitExperiment', 'Images') new_trial_sound = 'A' instHeight = 6 # Saccade / Antisaccade Parameters number_of_saccade_trials = 1 number_of_saccade_blocks = 1 -saccade_distance = 15 # Degrees per direction -number_of_saccade_lights = 7 # Number of active lights per direction -saccade_time = 3 # Maximum Time +saccade_distance = 15 # Degrees per direction +number_of_saccade_lights = 7 # Number of active lights per direction +saccade_time = 3 # Maximum Time stimulus_size = 0.3 -stim_color = [1,-1,-1] -saccade_fixation_color = [255,255,255] -saccade_dot_color = [50,50,50] -antisaccade_instruct_file = os.path.join(image_directory,'AntiSaccadeInstruct2.tif') +stim_color = [1, -1, -1] +saccade_fixation_color = [255, 255, 255] +saccade_dot_color = [50, 50, 50] +antisaccade_instruct_file = os.path.join( + image_directory, 'AntiSaccadeInstruct2.tif') antisaccade_file_scale = 1 # Pursuit Parameters number_of_pursuit_trials = 1 number_of_pursuit_blocks = 1 pursuit_distance = 15 -pursuit_frequencies = [0.1,0.2,0.3] -pursuit_time = [40,20,13.33] +pursuit_frequencies = [0.1, 0.2, 0.3] +pursuit_time = [40, 20, 13.33] # Necker Cube Parameters number_of_necker_trials = 1 number_of_necker_blocks = 3 necker_time = 60 -necker_color = [190,190,190] -necker_bg_color = [30,30,30] +necker_color = [190, 190, 190] +necker_bg_color = [30, 30, 30] necker_scale = 0.5 -necker_file = os.path.join(image_directory,'Necker1.tif') -necker_response_box_file = os.path.join(image_directory,'ResponseBox5.tif') +necker_file = os.path.join(image_directory, 'Necker1.tif') +necker_response_box_file = os.path.join(image_directory, 'ResponseBox5.tif') necker_response_box_scale = 0.22 # Fixation Parameters @@ -88,11 +89,11 @@ rivalry_time = 90 rivalry_height = 1.5 rivalry_width = 1 rivalry_distance = 3 -rivalry_file1 = os.path.join(image_directory,'house4n_11-160.tif') -rivalry_file2 = os.path.join(image_directory,'face2nS_11-160.tif') -rivalry_border_color = [190,190,190] +rivalry_file1 = os.path.join(image_directory, 'house4n_11-160.tif') +rivalry_file2 = os.path.join(image_directory, 'face2nS_11-160.tif') +rivalry_border_color = [190, 190, 190] rivalry_border_width = 5 -response_box_file = os.path.join(image_directory,'ResponseBox3.tif') +response_box_file = os.path.join(image_directory, 'ResponseBox3.tif') response_box_scale = 0.22 data_fields = [ @@ -112,11 +113,11 @@ questionaire_dict = { 'Run Smooth Pursuit': True, 'Run Saccade': True, 'Run Anti-Saccade': True, -# 'Run Necker Cube': False, + # 'Run Necker Cube': False, 'Run Binocular Rivalry': True, } -questionaire_order=[ +questionaire_order = [ 'Subject ID', 'Session', 'Timepoint', @@ -125,26 +126,26 @@ questionaire_order=[ 'Run Smooth Pursuit', 'Run Saccade', 'Run Anti-Saccade', -# 'Run Necker Cube', + # 'Run Necker Cube', 'Run Binocular Rivalry', ] instruct_text = [ ('Welcome to the experiment'), - (#'In this experiment you will be following targets.\n\n' -# 'Each trial will start with a fixation cross. ' -# 'Focus on the fixation cross until a stimulus appears.\n\n' -# 'In the first three phases, you will follow the stimuli. ' -# 'In the fourth phase, you will focus on the ' -# 'opposite side of center cross at an ' -# 'equal distance as the stimulus. In the fifth ' -# 'phase, you will see a cube, and are to respond as ' -# 'indicated.' -# '\n\n' - 'Do not move your head during the trials of this ' - 'experiment.\n\nMove only your eyes.\n'), -# 'You will be offered rests between sections.\n\n' -# 'Press any key to continue.'), + ( # 'In this experiment you will be following targets.\n\n' + # 'Each trial will start with a fixation cross. ' + # 'Focus on the fixation cross until a stimulus appears.\n\n' + # 'In the first three phases, you will follow the stimuli. ' + # 'In the fourth phase, you will focus on the ' + # 'opposite side of center cross at an ' + # 'equal distance as the stimulus. In the fifth ' + # 'phase, you will see a cube, and are to respond as ' + # 'indicated.' + # '\n\n' + 'Do not move your head during the trials of this ' + 'experiment.\n\nMove only your eyes.\n'), + # 'You will be offered rests between sections.\n\n' + # 'Press any key to continue.'), ] saccade_instruct_text = ( @@ -157,7 +158,7 @@ saccade_instruct_text = ( 'move your eyes back to the fixation cross.\n\n' 'Try not to blink while a red dot is displayed.\n\n' 'You can then blink or close your eyes to rest for a few seconds.\n\n' -# 'Press any key to continue.' + # 'Press any key to continue.' ) antisaccade_instruct_text = ( @@ -171,7 +172,7 @@ antisaccade_instruct_text = ( 'to the fixation point after each target disappears.\n\n' 'Try not to blink while a red dot is displayed.\n\n' 'You can then blink or close your eyes to rest for a few seconds.\n\n' -# 'Press any key to continue.' + # 'Press any key to continue.' ) pursuit_instruct_text = ( @@ -183,7 +184,7 @@ pursuit_instruct_text = ( 'two seconds.\n\n' 'Try not to blink while the dot is moving.\n\n' 'You can then blink or close your eyes to rest for a few seconds.\n\n' -# 'Press any key to continue.' + # 'Press any key to continue.' ) necker_instruct_text = ( @@ -196,7 +197,7 @@ necker_instruct_text = ( 'Try not to blink after the cube appears.\n\n' 'You can blink or close your eyes to rest after the cube ' 'disappears.\n\n' -# 'Press any key to continue.' + # 'Press any key to continue.' ) rivalry_instruct_text = ( @@ -207,9 +208,10 @@ rivalry_instruct_text = ( 'the face and house, press the center button.\n\n' 'You can blink or close your eyes to rest for a few seconds ' 'after the pictures disappear.\n\n' -# 'Press any key to continue.' + # 'Press any key to continue.' ) + def convert_color_value(color): """Converts a list of 3 values from 0 to 255 to -1 to 1. @@ -219,6 +221,7 @@ def convert_color_value(color): return [round(((n/127.5)-1), 2) for n in color] + class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): def __init__(self, **kwargs): self.quit = False # Needed because eyetracker must shut down @@ -254,24 +257,34 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): self.display_text_screen('Quiting...', wait_for_input=False) if self.tracker: fName = os.path.join(self.data_directory, - self.experiment_info['Subject ID'] + self.experiment_info['Timepoint'] + '.edf') - fName2 = os.path.join(self.data_directory, - 'ETSP_' + self.experiment_info['Subject ID'] + self.experiment_info['Session'] \ - + self.experiment_info['Timepoint'] + '.edf') + self.experiment_info['Subject ID'] + self.experiment_info['Timepoint'] + '.edf') + baseName = fName2 = os.path.join(self.data_directory, + 'ETSP_' + + self.experiment_info['Subject ID'] + + self.experiment_info['Session'] + + self.experiment_info['Timepoint']) + fName2 = os.path.join(baseName, '.edf') self.tracker.set_offline_mode() self.tracker.close_edf() self.tracker.transfer_edf() self.tracker.close_connection() - #subprocess.call(['rename',fName, fName2]) + if os.path.exists(fName2): + ii = 1 + newName = os.path.join(basename,'(',str(ii),')','.edf') + while os.path.exists(newName): + ii+=1 + newName = os.path.join(basename,'(',str(ii),')','.edf') + fName2 = newName os.rename(fName, fName2) - subprocess.call(['edf2asc',fName2]) - + subprocess.call(['edf2asc', fName2]) + super(EyeTrackingSaccadePursuit, self).quit_experiment() def run(self): self.chdir() - print('Note: EDF file will be overwritten if identical subject identifiers are used!') + print( + 'Note: EDF file will be overwritten if identical subject identifiers are used!') ok = self.get_experiment_info_from_dialog( additional_fields_dict=questionaire_dict, field_order=questionaire_order) @@ -300,16 +313,17 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): if not self.disableTracker: self.tracker = eyelinker.EyeLinker( self.experiment_window, - self.experiment_info['Subject ID'] + self.experiment_info['Timepoint'] + '.edf', + self.experiment_info['Subject ID'] + + self.experiment_info['Timepoint'] + '.edf', 'BOTH' ) self.tracker.initialize_graphics() self.tracker.open_edf() - #self.tracker.send_command("add_file_preamble_text 'Saccade Pursuit Experiment Plus Fixation and Necker Cube'") self.tracker.initialize_tracker() self.tracker.send_calibration_settings( - settings={'preamble_text':'Saccade Pursuit Experiment Plus Fixation and Necker Cube',} - ) + settings={ + 'preamble_text': 'Saccade Pursuit Experiment Plus Fixation and Necker Cube', } + ) for instruction in self.instruct_text: self.display_text_screen(text=instruction) @@ -319,7 +333,7 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): self.tracker.setup_tracker() self.tracker.send_command("track_search_limits=NO") - #random.shuffle(conditions) + # random.shuffle(conditions) condition_counter = 0 for condition in conditions: @@ -327,35 +341,27 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): numBlocks = 1 numTrials = 1 if condition == 'Saccade': -# self.display_text_screen(text=saccade_instruct_text) self.display_saccade_instructions() numBlocks = self.number_of_saccade_blocks numTrials = self.number_of_saccade_trials - elif condition=='AntiSaccade': -# self.display_text_screen(text=antisaccade_instruct_text, -# image_file = antisaccade_instruct_file, -# image_scale = self.antisaccade_file_scale) + elif condition == 'AntiSaccade': self.display_saccade_instructions(anti=True) numBlocks = self.number_of_saccade_blocks numTrials = self.number_of_saccade_trials - elif condition=='Fixation': + elif condition == 'Fixation': numBlocks = self.number_of_fixation_blocks numTrials = self.number_of_fixation_trials - elif condition=='Pursuit': -# self.display_text_screen(text=pursuit_instruct_text) + elif condition == 'Pursuit': self.display_pursuit_instructions() numBlocks = self.number_of_pursuit_blocks numTrials = self.number_of_pursuit_trials - elif condition=='Necker': + elif condition == 'Necker': self.display_text_screen(text=necker_instruct_text, - image_file=self.necker_response_box_file, - image_scale=self.necker_response_box_scale) + image_file=self.necker_response_box_file, + image_scale=self.necker_response_box_scale) numBlocks = self.number_of_necker_blocks numTrials = self.number_of_necker_trials - elif condition=='Rivalry': -# self.display_text_screen(text=rivalry_instruct_text, -# image_file=self.response_box_file, -# image_scale=self.response_box_scale) + elif condition == 'Rivalry': self.display_rivalry_instructions( image_file=self.response_box_file, image_scale=self.response_box_scale) @@ -366,19 +372,20 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): for block_num in range(numBlocks): block = self.make_block(condition, numTrials) - self.display_text_screen(text='Get ready...', wait_for_input=False) + self.display_text_screen( + text='Get ready...', wait_for_input=False) psychopy.core.wait(2) if condition == 'Saccade' or condition == 'AntiSaccade': self.display_saccade_fixation(1) else: - self.display_fixation(0.5,[]) + self.display_fixation(0.5, []) for trial_num, trial in enumerate(block): printString = ("Condition: %s (%d/%d) Block: %d/%d Trial %d/%d" - % (condition,condition_counter,len(conditions), - block_num+1,numBlocks,trial_num+1,len(block))) + % (condition, condition_counter, len(conditions), + block_num+1, numBlocks, trial_num+1, len(block))) if condition == 'Saccade' or condition == 'AntiSaccade': - if trial['locations'][0]>0: + if trial['locations'][0] > 0: printString = printString + " (Right)" else: printString = printString + " (Left)" @@ -387,52 +394,56 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): self.tracker.send_message('CONDITION %s' % condition) self.tracker.send_message('BLOCK %d' % block_num) self.tracker.send_message('TRIAL %d' % trial_num) - self.tracker.send_message('Location: %d,%d' % (trial['locations'][0],trial['locations'][1])) - status = '%s: Block %d, Trial %d' % (condition, block_num, trial_num) + self.tracker.send_message('Location: %d,%d' % ( + trial['locations'][0], trial['locations'][1])) + status = '%s: Block %d, Trial %d' % ( + condition, block_num, trial_num) self.tracker.send_status(status) - #psychopy.sound.Sound('C').play() + # psychopy.sound.Sound('C').play() self.tracker.start_recording() - if condition == 'Pursuit' and trial_num==0: - self.display_fixation(self.fixation_trial_time,self.tracker) - data = self.run_trial(trial, block_num, trial_num, self.tracker) + if condition == 'Pursuit' and trial_num == 0: + self.display_fixation( + self.fixation_trial_time, self.tracker) + data = self.run_trial( + trial, block_num, trial_num, self.tracker) self.tracker.stop_recording() - #psychopy.sound.Sound('C').play() + # psychopy.sound.Sound('C').play() else: - if condition == 'Pursuit' and trial_num==0: - self.display_fixation(self.fixation_trial_time,self.tracker) + if condition == 'Pursuit' and trial_num == 0: + self.display_fixation( + self.fixation_trial_time, self.tracker) data = self.run_trial(trial, block_num, trial_num) data.update({'Condition': condition}) self.send_data(data) - if condition == 'Saccade' or condition=='AntiSaccade': + if condition == 'Saccade' or condition == 'AntiSaccade': self.display_saccade_fixation(self.isi_time) else: - self.display_fixation(self.isi_time,[]) + self.display_fixation(self.isi_time, []) if condition == 'Saccade' or condition == 'AntiSaccade': self.display_saccade_fixation(1) else: - self.display_fixation(0.5,[]) + self.display_fixation(0.5, []) self.save_data_to_csv() if block_num + 1 != numBlocks: self.display_break() if condition == 'Saccade': - self.display_text_screen(text='Remember:\n\n' + saccade_instruct_text) - elif condition=='AntiSaccade': - self.display_text_screen(text='Remember:\n\n' + antisaccade_instruct_text, - image_file = antisaccade_instruct_file, - image_scale = self.antisaccade_file_scale) - elif condition=='Fixation': - self.display_text_screen(text='Remember:\n\n' + fixation_instruct_text) - elif condition=='Pursuit': - self.display_text_screen(text='Remember:\n\n' + pursuit_instruct_text) - elif condition=='Necker': + self.display_saccade_instructions() + elif condition == 'AntiSaccade': + self.display_saccade_instructions(anti=True) + elif condition == 'Fixation': + self.display_text_screen( + text='Prepare for next trial.') + elif condition == 'Pursuit': + self.display_pursuit_instructions() + elif condition == 'Necker': self.display_text_screen(text='Remember:\n\n' + necker_instruct_text, - image_file=self.necker_response_box_file, - image_scale=self.necker_response_box_scale) - elif condition=='Rivalry': - self.display_text_screen(text='Remember:\n\n' + rivalry_instruct_text, + image_file=self.necker_response_box_file, + image_scale=self.necker_response_box_scale) + elif condition == 'Rivalry': + self.display_rivalry_instructions( image_file=self.response_box_file, image_scale=self.response_box_scale) @@ -446,10 +457,10 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): self.quit_experiment() def display_pursuit_instructions( - self, bg_color=[0,0,0], wait_for_input=True, **kwargs): + self, bg_color=[0, 0, 0], wait_for_input=True, **kwargs): bg_color = convert_color_value(bg_color) - fg_color = convert_color_value([255,255,255]) + fg_color = convert_color_value([255, 255, 255]) backgroundRect = psychopy.visual.Rect( self.experiment_window, fillColor=bg_color, units='norm', width=2, @@ -458,11 +469,11 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): borderFrame = psychopy.visual.Rect( self.experiment_window, lineColor=fg_color, units='deg', - width=self.pursuit_distance*2.1, height=1.5, pos=(0,self.instHeight)) + width=self.pursuit_distance*2.1, height=1.5, pos=(0, self.instHeight)) textObject = psychopy.visual.TextStim( self.experiment_window, text='** Smooth Pursuit Example **', color=fg_color, units='deg', - height=1, pos=(0,self.instHeight+2), **kwargs) + height=1, pos=(0, self.instHeight+2), **kwargs) color = self.stim_color @@ -474,34 +485,34 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): for freq in stim_frequency: stim_frames = int(round(stim_time[counter]*num_frames_per_second)) for time in range(stim_frames): - Xposition.append(math.sin(freq*math.radians((time+1)*360/num_frames_per_second))*self.pursuit_distance) + Xposition.append(math.sin( + freq*math.radians((time+1)*360/num_frames_per_second))*self.pursuit_distance) counter += 1 stim = psychopy.visual.Circle( self.experiment_window, radius=self.stimulus_size/2, - pos=(0,0), fillColor=color, - lineColor=color, units='deg') + pos=(0, 0), fillColor=color, + lineColor=color, units='deg') keys = None while keys != ['space']: for Xpos in Xposition: textObject.draw() borderFrame.draw() - stim.pos = (Xpos,self.instHeight) + stim.pos = (Xpos, self.instHeight) stim.draw() self.experiment_window.flip() keys = psychopy.event.getKeys() - if keys==['space']: + if keys == ['space']: break - return keys def display_saccade_instructions( - self, anti=False, bg_color=[0,0,0], wait_for_input=True, **kwargs): + self, anti=False, bg_color=[0, 0, 0], wait_for_input=True, **kwargs): bg_color = convert_color_value(bg_color) - fg_color = convert_color_value([255,255,255]) + fg_color = convert_color_value([255, 255, 255]) backgroundRect = psychopy.visual.Rect( self.experiment_window, fillColor=bg_color, units='norm', width=2, @@ -510,7 +521,7 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): borderFrame = psychopy.visual.Rect( self.experiment_window, lineColor=fg_color, units='deg', - width=self.pursuit_distance*2.1, height=3, pos=(0,self.instHeight )) + width=self.pursuit_distance*2.1, height=3, pos=(0, self.instHeight)) if anti: dispText = '** Anti-Saccade Example **' @@ -519,27 +530,28 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): textObject = psychopy.visual.TextStim( self.experiment_window, text=dispText, color=fg_color, units='deg', - height=1, pos=(0,self.instHeight+3), **kwargs) + height=1, pos=(0, self.instHeight+3), **kwargs) color = self.stim_color stim = psychopy.visual.Circle( self.experiment_window, radius=self.stimulus_size/2, - pos=(1,0), fillColor=color, + pos=(1, 0), fillColor=color, lineColor=color, units='deg') #arrowVert = [(-0.8,0.1),(-0.8,-0.1),(-0.4,-0.1),(-0.4,-0.2),(0,0),(-0.4,0.2),(-0.4,0.1)] - arrowVert = numpy.array([(-.25,-2),(.25,-2),(.25,-.75),(.5,-.75),(0,0),(-.5,-.75),(-.25,-.75),(-.25,-2)]) - arrowVert = arrowVert + (0,self.instHeight + 5.25) + arrowVert = numpy.array([(-.25, -2), (.25, -2), (.25, -.75), + (.5, -.75), (0, 0), (-.5, -.75), (-.25, -.75), (-.25, -2)]) + arrowVert = arrowVert + (0, self.instHeight + 5.25) arrowStim = psychopy.visual.ShapeStim( self.experiment_window, vertices=arrowVert, fillColor=color, size=0.5, lineColor=color, units='deg') fixation = psychopy.visual.TextStim( self.experiment_window, text='+', color=self.saccade_fixation_color, - height=self.fixation_size, units='deg', pos=[0,self.instHeight]) + height=self.fixation_size, units='deg', pos=[0, self.instHeight]) stimList = [] - temp = list(range(-self.saccade_distance,self.saccade_distance,1)) + temp = list(range(-self.saccade_distance, self.saccade_distance, 1)) for circleN in temp: if circleN < 0: tempCoord = circleN @@ -548,21 +560,23 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): tempStim = psychopy.visual.Circle( self.experiment_window, radius=self.stimulus_size/2, - pos=[tempCoord,self.instHeight], fillColor=self.saccade_dot_color, + pos=[tempCoord, self.instHeight], fillColor=self.saccade_dot_color, lineColor=self.saccade_dot_color, units='deg') stimList.append(tempStim) - temp1 = random.sample(range(1,self.saccade_distance+1),self.number_of_saccade_lights) - temp2 = random.sample(range(1,self.saccade_distance+1),self.number_of_saccade_lights) + temp1 = random.sample( + range(1, self.saccade_distance+1), self.number_of_saccade_lights) + temp2 = random.sample( + range(1, self.saccade_distance+1), self.number_of_saccade_lights) saccade_locations = [x*-1 for x in temp1] + temp2 keys = None while keys != ['space']: for ii in range(4): if anti: - stim_time = 5; + stim_time = 5 else: - stim_time = round(random.uniform(1,self.saccade_time),3) + stim_time = round(random.uniform(1, self.saccade_time), 3) for frameN in range(90): textObject.draw() borderFrame.draw() @@ -572,32 +586,32 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): fixation.draw() self.experiment_window.flip() keys = psychopy.event.getKeys() - if keys==['space']: + if keys == ['space']: break - if keys==['space']: + if keys == ['space']: break - Xpos = random.randint(1,15)*random.choice([-1,1]) + Xpos = random.randint(1, 15)*random.choice([-1, 1]) for frameN in range(int(round(stim_time*60))): textObject.draw() borderFrame.draw() for s in stimList: s.draw() - stim.pos = (Xpos,self.instHeight) + stim.pos = (Xpos, self.instHeight) stim.draw() - fixation.color=self.saccade_fixation_color + fixation.color = self.saccade_fixation_color fixation.draw() if anti and frameN > stim_time*30: - arrowVert2 = arrowVert + (-Xpos*2,0) + arrowVert2 = arrowVert + (-Xpos*2, 0) arrowStim.vertices = arrowVert2 arrowStim.draw() self.experiment_window.flip() keys = psychopy.event.getKeys() - if keys==['space']: + if keys == ['space']: break - if keys==['space']: + if keys == ['space']: break - if keys==['space']: + if keys == ['space']: break if anti: textObject.draw() @@ -607,15 +621,15 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): fixation.color = color fixation.draw() self.experiment_window.flip() - keys = psychopy.event.waitKeys(); + keys = psychopy.event.waitKeys() return keys def display_rivalry_instructions( - self, anti=False, bg_color=[0,0,0], wait_for_input=True, - image_file=[], image_scale=0.25, **kwargs): + self, anti=False, bg_color=[0, 0, 0], wait_for_input=True, + image_file=[], image_scale=0.25, **kwargs): - fg_color = convert_color_value([255,255,255]) + fg_color = convert_color_value([255, 255, 255]) bg_color = convert_color_value(bg_color) backgroundRect = psychopy.visual.Rect( @@ -625,20 +639,21 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): textObject = psychopy.visual.TextStim( self.experiment_window, text='** Binocular Rivalry Example **', color=fg_color, units='deg', - height=1, pos=(0,self.instHeight+2), **kwargs) + height=1, pos=(0, self.instHeight+2), **kwargs) color = self.rivalry_border_color lineSize = self.rivalry_border_width stimPos = self.experiment_window.size[0]/4 - stimPos = psychopy.tools.monitorunittools.pix2deg(stimPos,self.experiment_monitor) + stimPos = psychopy.tools.monitorunittools.pix2deg( + stimPos, self.experiment_monitor) stim1 = psychopy.visual.ImageStim( self.experiment_window, - image=self.rivalry_file1, pos=(-stimPos,0)) + image=self.rivalry_file1, pos=(-stimPos, 0)) stim1.size = (self.rivalry_width, self.rivalry_height) stim2 = psychopy.visual.ImageStim( self.experiment_window, - image=self.rivalry_file2, pos=(stimPos,0)) + image=self.rivalry_file2, pos=(stimPos, 0)) stim2.size = (self.rivalry_width, self.rivalry_height) borderScale = stim1.size[0]*0.4 @@ -648,30 +663,34 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): borderHeight2 = stim2.size[1]+borderScale stimBorder1 = psychopy.visual.Rect( self.experiment_window, width=borderWidth1, - height=borderHeight1, - pos=stim1.pos, lineWidth=lineSize, - lineColor=color, units='deg') + height=borderHeight1, + pos=stim1.pos, lineWidth=lineSize, + lineColor=color, units='deg') stimBorder2 = psychopy.visual.Rect( self.experiment_window, width=borderWidth2, - height=borderHeight2, - pos=stim2.pos, lineWidth=lineSize, - lineColor=color, units='deg') + height=borderHeight2, + pos=stim2.pos, lineWidth=lineSize, + lineColor=color, units='deg') stimFix1_top = psychopy.visual.Line( - self.experiment_window, start=(stim1.pos[0],stim1.pos[1]+borderHeight1/2), - end=(stim1.pos[0],stim1.pos[1]+stim1.size[1]/1.9), units='deg', - lineColor=color, lineWidth=lineSize) + self.experiment_window, start=( + stim1.pos[0], stim1.pos[1]+borderHeight1/2), + end=(stim1.pos[0], stim1.pos[1]+stim1.size[1]/1.9), units='deg', + lineColor=color, lineWidth=lineSize) stimFix1_left = psychopy.visual.Line( - self.experiment_window, start=(stim1.pos[0]-borderWidth1/2,stim1.pos[1]), - end=(stim1.pos[0]-stim1.size[0]/1.9,stim1.pos[1]), units='deg', - lineColor=color, lineWidth=lineSize) + self.experiment_window, start=( + stim1.pos[0]-borderWidth1/2, stim1.pos[1]), + end=(stim1.pos[0]-stim1.size[0]/1.9, stim1.pos[1]), units='deg', + lineColor=color, lineWidth=lineSize) stimFix2_bottom = psychopy.visual.Line( - self.experiment_window, start=(stim2.pos[0],stim2.pos[1]-borderHeight2/2), - end=(stim2.pos[0],stim2.pos[1]-stim2.size[1]/1.9), units='deg', - lineColor=color, lineWidth=lineSize) + self.experiment_window, start=( + stim2.pos[0], stim2.pos[1]-borderHeight2/2), + end=(stim2.pos[0], stim2.pos[1]-stim2.size[1]/1.9), units='deg', + lineColor=color, lineWidth=lineSize) stimFix2_right = psychopy.visual.Line( - self.experiment_window, start=(stim2.pos[0]+borderWidth2/2,stim2.pos[1]), - end=(stim2.pos[0]+stim2.size[0]/1.9,stim2.pos[1]), units='deg', - lineColor=color, lineWidth=lineSize) + self.experiment_window, start=( + stim2.pos[0]+borderWidth2/2, stim2.pos[1]), + end=(stim2.pos[0]+stim2.size[0]/1.9, stim2.pos[1]), units='deg', + lineColor=color, lineWidth=lineSize) textObject.draw() stim1.draw() @@ -688,9 +707,10 @@ class EyeTrackingSaccadePursuit(SaccadePursuit.SPtask): image=image_file) sizex = int(round(imageObject.size[0])*image_scale) sizey = int(round(imageObject.size[1])*image_scale) - bottomOfScreen = int(math.floor(-self.experiment_window.size[1]/2+sizey/2))+5 - imageObject.size = [sizex,sizey] - imageObject.pos = (0,bottomOfScreen) + bottomOfScreen = int( + math.floor(-self.experiment_window.size[1]/2+sizey/2))+5 + imageObject.size = [sizex, sizey] + imageObject.pos = (0, bottomOfScreen) imageObject.draw() self.experiment_window.flip() @@ -719,7 +739,7 @@ experiment = EyeTrackingSaccadePursuit( saccade_time=saccade_time, number_of_saccade_lights=number_of_saccade_lights, saccade_fixation_color=convert_color_value(saccade_fixation_color), - saccade_dot_color = convert_color_value(saccade_dot_color), + saccade_dot_color=convert_color_value(saccade_dot_color), isi_time=isi_time, stimulus_size=stimulus_size, fixation_size=fixation_size, pursuit_distance=pursuit_distance, @@ -737,7 +757,7 @@ experiment = EyeTrackingSaccadePursuit( disableTracker=disableTracker, rivalry_border_width=rivalry_border_width, rivalry_distance=rivalry_distance, - new_trial_sound = new_trial_sound + new_trial_sound=new_trial_sound ) if __name__ == '__main__':