Calculating looking time duration output file

Hello PyschoPy community,

I have a simple task where I am recording gaze data with a tobii Fusion Eye tracker.
Each trial is composed of a Attention getter, a fixation cross and then a video.
The AOI is the video.
When we stop looking at the AOI, the next trial begins.

OS (e.g. Win10):
PsychoPy version (e.g. 1.84.x): PsychoPy2021.2.3
Standard Standalone? (y/n) standalone

What are you trying to achieve?:
I would like to calculate the looking time duration at the video.
In the output file, I get the number of looks, then the start time(AOI.timesOn) of each look and the stop time (AOI.timesOff) of each look. To get the duration, I would like to calculate the stop time of the last look - the start time of the first look.
Does anyone know how to do that ?
I imagine I need to put a custom code, at the end of the routine.
Note also that I cannot calculate that by doing video_stop - video_started, I need to work only with looking times.

Many thanks in advance !

You could add some custom code to the end of the routine that has the roi in it:

# dwell_time is total amount of time looked within ROI
dwell_time = 0.0
for i, onTime in enumerate(roi.timesOn):
    dwell_time += roi.timesOff[i] - onTime
trials.addData('roi.dwellTime', dwell_time)

# look_period is the time between the first look start and the last look end.
look_period = 0.0
if roi.numLooks:
    look_period = roi.timesOff[-1] - roi.timesOn[0]
trials.addData('roi.lookPeriod', look_period)

This calculates roi.dwellTime as the amount of time spent within the ROI across all looks, and roi.lookPeriod as the last look end time - first look start time. Therefore roi.dwellTime <= roi.lookPeriod.

Thanks a lot Sol,

I actually found the second bit myself this morning but I hadn’t thought about the dwell time.
I am going to add it !

Many thanks!!

I’m also needing to calculate dwell and look times but I had data already collected to needed to do this on the output. Because of the formatting of the look times (comma separated times within brackets formatted as a string) it was a little tricky after the fact but I wrote a script that will do it. If anyone has a more efficient way of doing this please let me know.

data = data.fillna('')
data = data.groupby(["blocks.thisN","trial.thisN"]).max()
data = data.reset_index()


ROIs_on=['math_roi.timesOn', 'popup_roi.timesOn', 'pts_roi.timesOn', 'word_roi.timesOn', 'total_roi.timesOn']
ROIs_off=['math_roi.timesOff', 'popup_roi.timesOff', 'pts_roi.timesOff', 'word_roi.timesOff', 'total_roi.timesOff']
ROIs_dwell=['math_roi.dwell', 'popup_roi.dwell', 'pts_roi.dwell', 'word_roi.dwell', 'total_roi.dwell']

for i, roiOn in enumerate(ROIs_on):
    roiOff = ROIs_off[i]
    ondata = data[roiOn]
    offdata = data[roiOff]
    OnOffData = [ondata, offdata]
    onTimesArray = []
    offTimesArray = []
    outputs = [onTimesArray, offTimesArray]
    for j, lookdata in enumerate(OnOffData):
        for trial in lookdata:
            trial=trial.strip("[]")
            trial=trial.split(", ")
            times=[]
            for time in trial:
                try:
                    times.append(float(time))
                except Exception:
                    pass
            outputs[j].append(times)
    dwell_times = []
    for k in range(0, len(onTimesArray)):
        diffs = list()
        for on, off in zip (onTimesArray[k], offTimesArray[k]):
            diff = off - on
            diffs.append(diff)
        dwell_time = sum(diffs)
        dwell_times.append(dwell_time)
    data[roiOn] = onTimesArray
    data[roiOff] = offTimesArray
    data[ROIs_dwell[i]] = dwell_times