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
Beispiel #2
0
# 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))
Beispiel #4
0
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