gazeplotter
Version:
Gazeplotter is a Svelte application for visualizing eye-tracking data.
83 lines (82 loc) • 3.35 kB
JavaScript
import { AbstractEyeDeserializer } from './AbstractEyeDeserializer.ts';
export class GazePointEyeDeserializer extends AbstractEyeDeserializer {
cStart;
cTime;
cDurationOfFixation;
cDurationOfBlink;
cAOI;
cStimulus;
cFixID;
mTime = null;
mStart = null;
mDurationOfEvent = null;
mDurationOfFixation = null;
mAOI = null;
mStimulus = null;
mCategory = null;
mFixID = null;
mHasFixationSegmentEnded = false;
participant; // for this reducer, the participant is always the same (one file per participant)
constructor(header, fileName) {
super();
this.cStart = header.indexOf('FPOGS');
this.cTime = header.indexOf('FPOGS') - 1;
this.cDurationOfFixation = header.indexOf('FPOGD');
this.cDurationOfBlink = header.indexOf('BKDUR');
this.cAOI = header.indexOf('AOI');
this.cStimulus = header.indexOf('MEDIA_NAME');
this.cFixID = header.indexOf('FPOGID');
this.participant = fileName.split('_')[0];
}
deserialize(row) {
let result = null;
const time = row[this.cTime];
const start = row[this.cStart];
const durationOfFixation = row[this.cDurationOfFixation];
const durationOfBlink = row[this.cDurationOfBlink];
const aoi = row[this.cAOI] === '' ? null : row[this.cAOI];
const stimulus = row[this.cStimulus];
const fixID = row[this.cFixID];
const isBlink = durationOfBlink !== '0.00000';
const category = isBlink ? 'Blink' : 'Fixation';
const hasFixationSegmentEnded = Number(durationOfFixation) === this.mDurationOfEvent;
const isToFlush = this.mStimulus !== stimulus || this.mFixID !== fixID || this.mCategory === 'Blink' || (hasFixationSegmentEnded && !this.mHasFixationSegmentEnded);
if (isToFlush) {
result = this.flush();
}
if (this.mDurationOfFixation !== Number(durationOfFixation) || this.mStimulus !== stimulus || this.mFixID !== fixID || isBlink) {
this.mStimulus = stimulus;
this.mAOI = aoi;
this.mCategory = category;
this.mDurationOfEvent = isBlink ? Number(durationOfBlink) : Number(durationOfFixation);
this.mDurationOfFixation = Number(durationOfFixation);
this.mTime = Number(time);
this.mStart = isBlink ? Number(time) - this.mDurationOfEvent : Number(start);
this.mFixID = fixID;
}
this.mHasFixationSegmentEnded = hasFixationSegmentEnded;
return result;
}
finalize() {
return this.flush();
}
flush() {
if (this.mStimulus === null || this.mCategory === null || this.mStart === null || this.mDurationOfEvent === null)
return null;
let r = {
aoi: this.mAOI === null ? null : [this.mAOI],
category: this.mCategory,
end: String(this.mTime),
participant: this.participant,
start: String(this.mStart),
stimulus: this.mStimulus
};
if (this.mStart === 0 && this.mTime === 0) {
console.warn('start and end are 0 - Probable blink issue', this.mFixID, this.mStimulus, this.participant);
r = null;
}
this.mTime = null;
this.mStart = null;
return r;
}
}