Author image Will Foran
and 1 contributors




version 0.1.2


   # the binary EYD file
   my $file='/home/foranw/remotes/B/bea_res/Data/Tasks/BarsScan/Basic/10128/20080925/Raw/EyeData/10128_run1.eyd';
   my $id="10128.20090925.1";
   my $errorfile="$id.err";
   # an expected order-of-events long file

   my $order='/home/foranw/remotes/B/bea_res/MR_Scanner_Experiments/Scanner Tasks/MRRC tasks/Rewards Scanner Bars/OrderOfEvents-v1.txt';
   ##trial.num event
   #1 neutral007
   #1 LongFix
   #2 FIVEpunish532
   #2 LongFix
   #3 FIVEreward532
   ### used by barsEprimeTrialOrder
   ### hardcoded xdat codes (start,target,stop) as hash from e.g. neutral007
   ###           time delays as a result of eg LongFix

   my $eyd = EyeTracking::EYD->new($file,$id,$errorfile);
   # $eyd->{verbose}=1;     # print lots of fun things
   # $eyd->{printerrors}=1; # errors also go to stdout
   # print Dumper($eyd->{data}),"\n";
   $eyd->printEyeData(); # just: xdat, dil, gaze
   $eyd->printallEyeData(); # print everying

   use Number::Range;
   my $startCodes  = Number::Range->new("50,100,200");
   my $targetCodes = Number::Range->new("110..160,201..210");
   my $stopCodes   = Number::Range->new("250");
   $eyd->trialPositions($startCodes,$targetCodes,$stopCodes );
   # print Dumper($eyd->{codes}),"\n";

   # print codes and index in triplet pairs
   # eg. 100  147  250  15387 15568 15666

   # use order of exerpiment to set timing
   #print Dumper($self->{_idealOrderHash})
   # with verbose, prints a nice list like:
   #strt trg   stp   ITIo  ITIe  strtp trgp  stpp  lastp proc
   #200  201   250   357   363   |  480   656   753   837   +LongFix

   # we have a 'legacy' format to persever
   # print in that format
   my @fields=@{$eyd->{checkedHdr}}{qw/strt trg stp strtp trgp stpp lastp strtep trgep stpep/};
   print ( map {join("\t",@$_[@fields ]),"\n"} @{$eyd->{checked}}  ), "\n";


This provides functions to deal with ASL EYD binary files specifically in the context of EPrime run experments.

In addition to pupil dilation and gaze location, we are particularly interested in using the eyd timing as a way to confirm task progress (via xdat codes) and adjust expected timing from eprime (via sample number)

Parsing the binary file was largely copied from


EyeTracking::EYD - extract EYD binary files in a start,target,stop paradigm



$eyd = EyeTracking::EYD->new($file,$id,$errorfile) requries an eyd file be passed as the sole argument set $self->{verbose} to true for more printing


$eyd->read() reads the eyd file provided when new() is called

creates $eyd->{qw/_startbyte _endbyte _recfmt _records fields data}

data and fields

data is a 2D array of where each row has a sample of of @fields =item @_records

@_records stores the type and name of each field


_recfmt, start, and endbyte together describe the start and end of the binary blob and what the order of encoding is

"Corrects" gaze by origvalue/10

this code is taken mostly from ilab =back


$eyd->printEyeData(filename=<stdout>) prints XDAT, pupil_diam and gaze to stdout unless af filename is given one sample per line


$eyd->printallEyeData() prints everything collected one sample per line


$eyd->trialPositions($start,$target,$stop) where start,target,stop are all number::range ojbects will make a wide fromate table of start | target | stop in the form of a hash as {codes}

   my $startCodes  = Number::Range->new("50,100,200");
   my $targetCodes = Number::Range->new("110..160,201..210");
   my $stopCodes   = Number::Range->new("250");
   print Dumper($eyd->{codes})

barsEprimeLog and barsEprimeTrialOrder

$eyd->barsEprimeLog($logfile) or $eyd->barsEprimeTrialOrder($orderfile) results in $eyd->{_idealOrderHash}

where logfile is an eprime experement's log file and orderfile is a space deliminted file with 'trial# displayevent' on each line

logfiles are specific to one subject on a particular run orderfiles are generic for all subjects for a particular run

the output is an array of hashes like

   $VAR42 = {
      'startcode' => 100,
      'Latency' => '451',              #*
      'masterlist' => '142',           #*
      'location' => '532',
      'fixationTxt' => '+LongFix',
      'fixation' => 363,
      'targetcode' => 149,
      'Score' => '60',                 #*
      'Procedure' => 'FIVEpunish532',
      'Correct' => '1',                #*
      'Running' => 'masterlist'        #*

* denotes hash elements only created by barsEprimeLog not in barsEprimeTrialOrder

fixationTxt is a + delim. list of fixation events duration is the number of samples (assumed 60Hz) as estimated by parsing and evaluating fixationTxt

example orderfile
   1 neutral007
   1 LongFix
   2 FIVEpunish532
   2 LongFix
   3 FIVEreward532
   3 LongFix
   3 fix
   3 fix
   3 punCatch1
   3 fix
   4 neutral532
example logfile
study details

| bars | cross | dot | cross cue prep sac | fixations | | | | start target stop=250 | 1.5 1.5 1.5 | 1.5s*N LongFix==2*1.5s | {,ONE..FIVE}{punish,neutral,reward}{[position]} | LongFix + { fix,Catch{1,2} }*

Ring Rewards

We can also parse ring rewards eprime order files parsed trial information is stored in $eyd->{_idealOrderHash}


$eyd->checkAlignment(filename=<STDERR>) returns the alignment score between observed and experiement setup (eprime) and prints alignment errors to stderr or specified file extensivle checks value of $self->{verbose} when printing

uses {_idealOrderHash} and {codes} (both arrays of hashes with startcode and targetcode) to find the optimal (NeedlemanWunsch with gap/mismatch=-5) alignment of start and target codes

setting $self->{codeTableFN} to a file will write the ITIobserved against ITIexpected table to that file


$eyd->printCodes() prints codes to a given file name (or stdout if no arguments) is a nice way of exporting $self->{codes}


Will Foran <>


This software is copyright (c) 2013 by Will Foran <>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.