def createTrialDataStreams(): trial_data_streams=[] # Get the filtered event data. # We will use right eye data only for the testing.. # dataAccessUtil=ExperimentDataAccessUtility('../hdf5_files','remote_data.hdf5', experimentCode=None,sessionCodes=[]) event_type=EventConstants.BINOCULAR_EYE_SAMPLE retrieve_attributes=('time','right_gaze_x','right_gaze_y','right_pupil_measure1','status') trial_event_data=dataAccessUtil.getEventAttributeValues(event_type, retrieve_attributes, conditionVariablesFilter=None, startConditions={'time':('>=','@TRIAL_START@')}, endConditions={'time':('<=','@TRIAL_END@')}, ) dataAccessUtil.close() for t,trial_data in enumerate(trial_event_data): #Create a mask to be used to define periods of missing data in a data trace (eye tracker dependent) # invalid_data_mask=trial_data.status%10>=2 time=trial_data.time pupil=trial_data.right_pupil_measure1 # Get x, y eye position traces (in pixels), setting sample positions where there is track loss # to NaN. xpix_cleared=trial_data.right_gaze_x.copy() ypix_cleared=trial_data.right_gaze_y.copy() processSampleEventGaps(xpix_cleared,ypix_cleared,pupil,invalid_data_mask,'clear') # Get x, y eye position traces (in pixels), setting sample positions # where there is track loss to be linearly interpolated using each # missing_sample_start-1 and missing_sample_end+1 as the points to # interpolate between. # xpix_linear=trial_data.right_gaze_x.copy() ypix_linear=trial_data.right_gaze_y.copy() # valid_data_periods is a list of array slice objects giving the start,end index of each non missing # period of in the data stream. # valid_data_periods=processSampleEventGaps(xpix_linear,ypix_linear,pupil,invalid_data_mask,'linear') # Convert from pixels to visual angle coordinates calibration_area_info=dict(display_size_mm=(340,280.0), display_res_pix=(1280.0,1024.0), eye_distance_mm=590.0) vac=VisualAngleCalc(**calibration_area_info) xdeg,ydeg=vac.pix2deg(xpix_linear,ypix_linear) # Create Filtered versions of the x and y degree data traces # We'll use the Median Filter... # xdeg_filtered = scipy.signal.medfilt(xdeg,SPATIAL_FILTER_WINDOW_SIZE) ydeg_filtered = scipy.signal.medfilt(ydeg,SPATIAL_FILTER_WINDOW_SIZE) # Create the velocity stream # xvel=calculateVelocity(time,xdeg_filtered) yvel=calculateVelocity(time,ydeg_filtered) # Filter the velocity data # FILTER_ORDER=2 Wn=0.3 b, a = scipy.signal.butter(FILTER_ORDER, Wn, 'low') ffunc=scipy.signal.filtfilt xvel_filtered = ffunc(b, a, xvel) yvel_filtered = ffunc(b, a, yvel) # xvel_filtered=savitzky_golay(xvel,window_size=VELOCITY_FILTER_WINDOW_SIZE,order=2) # yvel_filtered=savitzky_golay(yvel,window_size=VELOCITY_FILTER_WINDOW_SIZE,order=2) # xvel_filtered=gaussian_filter1d(xvel,VELOCITY_FILTER_WINDOW_SIZE) # yvel_filtered=gaussian_filter1d(yvel,VELOCITY_FILTER_WINDOW_SIZE) # xvel_filtered=scipy.signal.medfilt(xvel,VELOCITY_FILTER_WINDOW_SIZE) # yvel_filtered=scipy.signal.medfilt(yvel,VELOCITY_FILTER_WINDOW_SIZE) velocity=np.sqrt(xvel*xvel+yvel*yvel) velocity_filtered=np.sqrt(xvel_filtered*xvel_filtered+yvel_filtered*yvel_filtered) # Create a data trace dictionary for all the different types # of data traces created for the trial # trial_data={} trial_data['time']=time trial_data['xpix_cleared']=xpix_cleared trial_data['ypix_cleared']=ypix_cleared trial_data['xpix_linear']=xpix_linear trial_data['xpix_linear']=xpix_linear trial_data['xdeg']=xdeg trial_data['ydeg']=ydeg trial_data['xdeg_filtered']=xdeg_filtered trial_data['ydeg_filtered']=ydeg_filtered trial_data['pupil']=pupil trial_data['velocity']=velocity trial_data['velocity_filtered']=velocity_filtered trial_data['valid_data_periods']=valid_data_periods trial_data['missing_data_mask']=invalid_data_mask # Add the data trace dictionary to a list # trial_data_streams.append(trial_data) return trial_data_streams
# on the supplied calibration / display surface geometry and eye distance. # vac = VisualAngleCalc(**calibration_area_info) # Calculate the visual degree position in x and y for the given pixel position arrays. # degree_x, degree_y = vac.pix2deg(pix_x, pix_y) # Process the eye fields using the processSampleEventGaps function defined # in the common_workshop_functions.py file. # valid_data_periods = processSampleEventGaps(degree_x, degree_y, pupil, invalid_data_mask, 'clear') # calculate unfiltered velocity and accelleration streams # velocity = np.abs(calculateVelocity(time, degree_x, degree_y)) accelleration = calculateAccelleration(time, degree_x, degree_y) pix_x[invalid_data_mask] = np.NaN pix_y[invalid_data_mask] = np.NaN degree_x[invalid_data_mask] = np.NaN degree_y[invalid_data_mask] = np.NaN # Get the range to use for the x axis # tmin = time.min() // 1 tmax = time.max() // 1 + 1 # Create a subplot of eye position in degrees and velocity and a subplot # of eye position in degrees and accelleration. fig = plt.figure(figsize=(12, 8))
# on the supplied calibration / display surface geometry and eye distance. # vac=VisualAngleCalc(**calibration_area_info) # Calculate the visual degree position in x and y for the given pixel position arrays. # degree_x,degree_y=vac.pix2deg(pix_x,pix_y) # Process the eye fields using the processSampleEventGaps function defined # in the common_workshop_functions.py file. # valid_data_periods=processSampleEventGaps(degree_x,degree_y,pupil,invalid_data_mask, 'clear') # calculate unfiltered velocity and accelleration streams # velocity=np.abs(calculateVelocity(time,degree_x,degree_y)) accelleration=calculateAccelleration(time,degree_x,degree_y) pix_x[invalid_data_mask]=np.NaN pix_y[invalid_data_mask]=np.NaN degree_x[invalid_data_mask]=np.NaN degree_y[invalid_data_mask]=np.NaN # Get the range to use for the x axis # tmin=time.min()//1 tmax=time.max()//1+1 # Create a subplot of eye position in degrees and velocity and a subplot # of eye position in degrees and accelleration. fig = plt.figure(figsize=(12,8))
def createTrialDataStreams(): trial_data_streams = [] # Get the filtered event data. # We will use right eye data only for the testing.. # dataAccessUtil = ExperimentDataAccessUtility( "../hdf5_files", "remote_data.hdf5", experimentCode=None, sessionCodes=[] ) event_type = EventConstants.BINOCULAR_EYE_SAMPLE retrieve_attributes = ("time", "right_gaze_x", "right_gaze_y", "right_pupil_measure1", "status") trial_event_data = dataAccessUtil.getEventAttributeValues( event_type, retrieve_attributes, conditionVariablesFilter=None, startConditions={"time": (">=", "@TRIAL_START@")}, endConditions={"time": ("<=", "@TRIAL_END@")}, ) dataAccessUtil.close() for t, trial_data in enumerate(trial_event_data): # Create a mask to be used to define periods of missing data in a data trace (eye tracker dependent) # invalid_data_mask = trial_data.status % 10 >= 2 time = trial_data.time pupil = trial_data.right_pupil_measure1 # Get x, y eye position traces (in pixels), setting sample positions where there is track loss # to NaN. xpix_cleared = trial_data.right_gaze_x.copy() ypix_cleared = trial_data.right_gaze_y.copy() processSampleEventGaps(xpix_cleared, ypix_cleared, pupil, invalid_data_mask, "clear") # Get x, y eye position traces (in pixels), setting sample positions # where there is track loss to be linearly interpolated using each # missing_sample_start-1 and missing_sample_end+1 as the points to # interpolate between. # xpix_linear = trial_data.right_gaze_x.copy() ypix_linear = trial_data.right_gaze_y.copy() # valid_data_periods is a list of array slice objects giving the start,end index of each non missing # period of in the data stream. # valid_data_periods = processSampleEventGaps(xpix_linear, ypix_linear, pupil, invalid_data_mask, "linear") # Convert from pixels to visual angle coordinates calibration_area_info = dict( display_size_mm=(340, 280.0), display_res_pix=(1280.0, 1024.0), eye_distance_mm=590.0 ) vac = VisualAngleCalc(**calibration_area_info) xdeg, ydeg = vac.pix2deg(xpix_linear, ypix_linear) # Create Filtered versions of the x and y degree data traces # We'll use the Median Filter... # xdeg_filtered = scipy.signal.medfilt(xdeg, SPATIAL_FILTER_WINDOW_SIZE) ydeg_filtered = scipy.signal.medfilt(ydeg, SPATIAL_FILTER_WINDOW_SIZE) # Create the velocity stream # xvel = calculateVelocity(time, xdeg_filtered) yvel = calculateVelocity(time, ydeg_filtered) # Filter the velocity data # FILTER_ORDER = 2 Wn = 0.3 b, a = scipy.signal.butter(FILTER_ORDER, Wn, "low") ffunc = scipy.signal.filtfilt xvel_filtered = ffunc(b, a, xvel) yvel_filtered = ffunc(b, a, yvel) # xvel_filtered=savitzky_golay(xvel,window_size=VELOCITY_FILTER_WINDOW_SIZE,order=2) # yvel_filtered=savitzky_golay(yvel,window_size=VELOCITY_FILTER_WINDOW_SIZE,order=2) # xvel_filtered=gaussian_filter1d(xvel,VELOCITY_FILTER_WINDOW_SIZE) # yvel_filtered=gaussian_filter1d(yvel,VELOCITY_FILTER_WINDOW_SIZE) # xvel_filtered=scipy.signal.medfilt(xvel,VELOCITY_FILTER_WINDOW_SIZE) # yvel_filtered=scipy.signal.medfilt(yvel,VELOCITY_FILTER_WINDOW_SIZE) velocity = np.sqrt(xvel * xvel + yvel * yvel) velocity_filtered = np.sqrt(xvel_filtered * xvel_filtered + yvel_filtered * yvel_filtered) # Create a data trace dictionary for all the different types # of data traces created for the trial # trial_data = {} trial_data["time"] = time trial_data["xpix_cleared"] = xpix_cleared trial_data["ypix_cleared"] = ypix_cleared trial_data["xpix_linear"] = xpix_linear trial_data["xpix_linear"] = xpix_linear trial_data["xdeg"] = xdeg trial_data["ydeg"] = ydeg trial_data["xdeg_filtered"] = xdeg_filtered trial_data["ydeg_filtered"] = ydeg_filtered trial_data["pupil"] = pupil trial_data["velocity"] = velocity trial_data["velocity_filtered"] = velocity_filtered trial_data["valid_data_periods"] = valid_data_periods trial_data["missing_data_mask"] = invalid_data_mask # Add the data trace dictionary to a list # trial_data_streams.append(trial_data) return trial_data_streams