Jian Chen
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