Jian Chen
eyelink data extraction

eyelink data extraction

read asc into matlab

Contents

set asc file name and path

filenameASC = 'JD18J17a.asc';

read eyelink data using system command

extract all numeric lines & replace blink (.) with 0.0. Hack: sed ''s/\.//g'' gets rid of all decimal points. We correct for that in the line dataEyelink.samples(:,2:3)

system(['sed -n ''/^[0-9]/p'' ' filenameASC ' | sed ''s/ \./0.0/g'' | sed ''s/\.//g'' > tmp.txt']);
% read samples into data structure
dataEyelink.samples = dlmread('tmp.txt');
dataEyelink.samples(:,2:3) = dataEyelink.samples(:,2:3)/10; % correct for above hack to resote pixel values....

% extract gaze event for "EFIX" & remove  "EFIX L" (Here I tracked left eye)
system(['sed -n -e ''/^EFIX/p'' ' filenameASC ' | sed ''s/EFIX L   //g'' > tmp.txt']);
% read fixations into data structure
dataEyelink.fixations = dlmread('tmp.txt');

% extract gaze event for "ESACC" & remove  "ESACC R"
system(['sed -n -e ''/^ESACC/p'' ' filenameASC ' | sed ''s/ESACC L  //g'' > tmp.txt']);
% read saccades into data structure
dataEyelink.saccades = dlmread('tmp.txt');

% extract gaze event for "EBLINK" & remove  "EBLINK R"
system(['sed -n -e ''/^EBLINK/p'' ' filenameASC ' | sed ''s/EBLINK L //g'' > tmp.txt']);
% read blinks into data structure
dataEyelink.blinks = dlmread('tmp.txt');

% extract trigger event for "SYNCTIMEON" & "SYNCTIMEOFF" convert "SYNCTIMEON" to 1 & "SYNCTIMEOFF" to 0 and remove MSG
% SYNCTIMEON to SYNCTIMEOFF
% system(['sed -n -e ''/SYNCTIMEON/p'' -e ''/SYNCTIMEOFF/p'' ' filenameASC ' | sed ''s/SYNCTIMEON/1/g'' | sed ''s/SYNCTIMEOFF/0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% SYNCTIMEON to CUE
 system(['sed -n -e ''/SYNCTIMEON/p'' -e ''/DOTS_TARGET /p'' ' filenameASC ' | sed ''s/SYNCTIMEON/1/g'' | sed ''s/DOTS_TARGET /0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% TARGET to RESPONSE
% system(['sed -n -e ''/DOTS_TARGET /p'' -e ''/DOTS_TARGET_OFF/p'' ' filenameASC ' | sed ''s/DOTS_TARGET /1/g'' | sed ''s/DOTS_TARGET_OFF/0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% read triggers into data structure
dataEyelink.triggers = dlmread('tmp.txt');


% extract trigger event for "SYNCTIMEON" & "SYNCTIMEOFF" convert "SYNCTIMEON" to 1 & "SYNCTIMEOFF" to 0 and remove MSG
% SYNCTIMEON to SYNCTIMEOFF
% system(['sed -n -e ''/SYNCTIMEON/p'' -e ''/SYNCTIMEOFF/p'' ' filenameASC ' | sed ''s/SYNCTIMEON/1/g'' | sed ''s/SYNCTIMEOFF/0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% SYNCTIMEON to CUE
% system(['sed -n -e ''/SYNCTIMEON/p'' -e ''/DOTS_TARGET /p'' ' filenameASC ' | sed ''s/SYNCTIMEON/1/g'' | sed ''s/DOTS_TARGET /0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% TARGET to RESPONSE
 system(['sed -n -e ''/DOTS_TARGET /p'' -e ''/DOTS_TARGET_OFF/p'' ' filenameASC ' | sed ''s/DOTS_TARGET /1/g'' | sed ''s/DOTS_TARGET_OFF/0/g'' | sed ''s/MSG	//g'' > tmp.txt']);
% read triggers into data structure
dataEyelink.triggers = dlmread('tmp.txt');


system('rm tmp.txt');

save([filenameASC(1:end-4),'_Eyelink.mat'],'dataEyelink');

Data Structure Explanation

Explanation from Eyelink Programers Guide 3.0

%--------------------------------------------------------
% dataEyelink =
%
%       samples: [401341x4 double]
%     fixations: [3965x6 double]
%      saccades: [3964x9 double]
%        blinks: [1720x3 double]
%      triggers: [1080x3 double]

%--------------------------------------------------------
% dataEyelink.samples
%       column1         column2         column3     column4
%       timepoint       x               y           pupil size
%--------------------------------------------------------
% dataEyelink.fixations
%       column1         column2         column3     column4 column5 column6
%       tmepoint_start  timepoint_end   duration    x       y       avg pupil size
%--------------------------------------------------------
% dataEyelink.saccades
%       column1         column2         column3     column4 column5 column6
%       tmepoint_start  timepoint_end   duration    x_from  y_from  x_to
%       column7         column8         column9
%       y_to            amplitude       peak velocity
%                       in degrees      degr/sec
%--------------------------------------------------------
% dataEyelink.blinks
%       column1         column2         column3
%       tmepoint_start  timepoint_end   duration
%--------------------------------------------------------
% dataEyelink.triggers
%       column1         column2         column3
%       tmepoint        1=SYNCON        Trial(I also wrote trial number)
%                       0=SYNCOFF
%--------------------------------------------------------

find fixations for each trial

for i = 1:2:length(dataEyelink.triggers)
    res.eye.fixations{round(i/2)} = dataEyelink.fixations(...
        dataEyelink.triggers(i,1) < dataEyelink.fixations(:,1) & ...
        dataEyelink.fixations(:,1) < dataEyelink.triggers(i+1,1),:);
end

find saccades

for i = 1:2:length(dataEyelink.triggers)
    res.eye.saccades{round(i/2)} = dataEyelink.saccades(...
        dataEyelink.triggers(i,1) < dataEyelink.saccades(:,1) & ...
        dataEyelink.saccades(:,1) < dataEyelink.triggers(i+1,1),:);
end

find blinks

for i = 1:2:length(dataEyelink.triggers)
    res.eye.blinks{round(i/2)} = dataEyelink.blinks(...
        dataEyelink.triggers(i,1) < dataEyelink.blinks(:,1) & ...
        dataEyelink.blinks(:,1) < dataEyelink.triggers(i+1,1),:);
end