image thumbnail

eogui – a software to analyze electro-oculogram (EOG) recordings

by

 

10 Aug 2011 (Updated )

detects blinks and saccadic eye movements in EOG recordings

eogbatch.m
function r=eogbatch(inputfname,inputformat,outputfname,outputformat,varargin)
% eogbatch - processes large files without a GUI
% Exemplary call:
%   eogbatch('D:\Recordings\EOG.mat',1,'C:\Results\EOG-events',[1 2])   
% Syntax:
%  eogbatch(inputfname,inputformat,outputfname,outputformat,(param.dat))
%
% Inputs:
%    inputfname   - file name eog recording
%    inputformat  - input file format: 1=MAT, 2=VHDR, 3=ATISA, 4=Varioport VPD 5=Knigstein IDAT
%    outputfname  - name of output file (without file extension)
%    outputformat - format of output file:
%                           1=ASCII - numbers only ,2=ASCII,3=MAT,4=XML,5=xyValues,
%                           6=Kngistein
%                           you can also enter several output formats as a vector:
%                           e.g. [1 2] %RS
%    (param.dat)  - Optional, Knigstein-Param.dat
%
% Outputs:
%    none at the moments
%
%
% Other m-files required: alle im Paket enthaltenen
% Subfunctions: 
% MAT-files required:
%
% See also: 

% Author: Maik Hofmann
% email: Maik_hofmann@web.de
% $Id: eogbatch.m 15 2005-03-10 12:53:40Z maik $


%------------- BEGIN CODE -------------- 

% Ermittel Programmparameter
parameter=setupdefaultparameter;
if ~exist('lastpara.config')
    error('No last Settings available, EOGUI must be used for calibration first!');
end

parameter=loadParam('lastpara.config');            


% wenn eine param.dat angegeben wird, diese laden
if nargin == 5 && exist(varargin{1})==2    
    parameter=loadIDATParam(varargin{1},parameter);
end



%------------------------------------
%  lade Datei
%------------------------------------
switch(inputformat)
     case 1 %load mat file
        eogreader=matreader(inputfname);
                        
    case 2 %load VHDR
        eogreader=vhdrreader(inputfname);      
        
    case 3 %load ATISA
        eogreader=atisareader(inputfname);
        
    case 4 %load VPD
        eogreader=vpdreader(inputfname); 		
                
    case 5         %load idat
        eogreader=idatreader(inputfname);
                               
    otherwise                
        close;
        error('Format not possible');
        return;
end;



% justiere Parameter nach Samplingrate
parameter=adjustparameters(parameter,get(eogreader,'SampleRate'));

%RS: berprfen, ob auch im Knigstein-Format gespeichert werden soll:
if find(outputformat==6)
    KS=1;
    if length(outputformat)>1 %es soll auch noch in weiteren Formaten gespeichert werden
        disp('Save in several formats');
        blinks_all=[];
        sakkaden_all=[];
        reiz1_all=[];    
        reiz2_all=[]; 
        KS=2;
    end;
else
   KS=0;
   %blinks_all=[];%RS 30.9.: ob das hier reicht?
   %sakkaden_all=[];
   %reiz1_all=[];    
   %reiz2_all=[]; 
end;

%------------------------------------
%  Verarbeite Daten
%------------------------------------
window=1000*60*10;  % Verarbeite 10 min Segmente @ 1000Hz
overlap=2000;  % berlappung der Segmente
pos=0; %startposition
channels=get(eogreader,'Channels'); % Anzahl der Kanle in der Aufzeichnung
samplesperchannel=get(eogreader,'SamplesPerChannel');  %anzahl Samples pro Kanal


blinks=[];
sakkaden=[];
reiz1=[];    
reiz2=[]; 

ttt=0;

i=1;
if outputfname(end-3)=='.' %RS: Dateiendung mit angegeben
    outputfname=outputfname(1:end-4); %RS: Endung richtet sich nach Ausgabeformat, s. u.
end    
% Endlosschleife bis Ende
while(true)
    if(pos+window>samplesperchannel)
       window=samplesperchannel-pos;
       if(window<1000) % bei zu kleinem Fenster abbrechen.
           break
       end
    end  
    
    disp(['Segment / Total recording length: '...
          num2str(pos) '-' num2str(pos+window) ' /' num2str(samplesperchannel)]);
    
    %lade segment in Speicher
    segment=read(eogreader,pos,window);
	

	m = parameter.mapping;
	o = segment;
    %disp(['Size of Segment: ' num2str(size(segment))])
	%RS: deactivated, otherwise no blink analysis?
    % segment = [o(:,m(1)),o(:,m(2)),o(:,m(3)),o(:,m(4)),o(:,m(5))];	
    
    
    %Verarbeite Datensegment
    tic;
       [rawsakkaden, rawblinks]=analyzeeog(segment,parameter,2);  
    tt=toc;
    disp(['Duration: ' num2str(tt)])
    ttt=ttt+tt;
    %disp(['Nr of rawblinks: ' num2str(size(rawblinks,2))])              
    
    % zusammenfasse der Sakkaden, Overlap beachten !!!
    if(~isempty(sakkaden) && ~isempty(rawsakkaden))        
        for idx=1:length(rawsakkaden)            
            if(sakkaden(end).ende<rawsakkaden(idx).start)
                sakkaden=[sakkaden rawsakkaden(idx:end)];
            end
        end
    else
        sakkaden=[sakkaden rawsakkaden];        
    end
    
    % zusammenfasse der Blinks, Overlap beachten !!!
    if(~isempty(blinks) && ~isempty(rawblinks))        
        for idx=1:length(rawblinks)            
            if(blinks(end).bende2<rawblinks(idx).bstart1)
                blinks=[blinks rawblinks(idx:end)];
            end
        end
    else
        blinks=[blinks rawblinks];    
    end
    %disp(['2. Nr of blinks: ' num2str(size(blinks,2))])
    treiz1=[];
    treiz2=[];
    
    if(channels>3 && parameter.reizauswertung.xreizflg)
        treiz1=findReiz(segment(:,1),segment(:,4),parameter.reizauswertung.xreiz);
    end
    if(channels>4 && parameter.reizauswertung.yreizflg)
        treiz2=findReiz(segment(:,1),segment(:,5),parameter.reizauswertung.yreiz);
    end
    
    % zusammenfasse der Reize, Overlap beachten !!!
    if(~isempty(reiz1) && ~isempty(treiz1))        
        for idx=1:length(treiz1)            
            if(reiz1(end)<treiz1(idx))
                reiz1=[reiz1; treiz1(idx:end,:)];
            end
        end
    else
        reiz1=[reiz1; treiz1];
    end
    if(~isempty(reiz2) && ~isempty(treiz2))        
        for idx=1:length(treiz2)            
            if(reiz2(end)<treiz2(idx))
                reiz2=[reiz2; treiz2(idx:end,:)];
            end
        end
    else
        reiz2=[reiz2; treiz2];
    end    
          
    
    % sind wir bereits am ende ?
    if(pos+window==samplesperchannel)
        break;
    end
    
    if KS %RS: fr passenden KS-Output 21.11.:Problem: was, wenn NUR in einem anderen Format abgespeichert wird?
       %disp('In Knigstein loop')
        temp=outputfname;
        outputfname=[outputfname num2str(i) '.dat'];
        i=i+1;
        s=saveresult(4,outputfname,reiz1,reiz2,blinks,sakkaden,parameter); %RS: nur fr KS, andere Formate unten
        outputfname=temp; %Name wieder zurcksetzen
        if KS==2         %soll auch noch in anderen Formaten gespeichert werden, Sakkaden usw. mssen also aufgehoben werden
            blinks_all=[blinks_all blinks]; %werden anscheinend in 1 Zeile abgespeichert
            sakkaden_all=[sakkaden_all sakkaden]; %werden anscheinend in 1 Zeile abgespeichert
            reiz1_all=[reiz1_all; reiz1];    
            reiz2_all=[reiz2_all; reiz2];
        end;    
        %blinks=[];
        %sakkaden=[];
        %reiz1=[];    
        %reiz2=[]; 
    end;
    pos=pos+window-overlap;   
    
end %RS: end vom while
%disp(num2str(KS))
if ~KS %21.11.: nur in einem anderen format abspeichern; nicht sehr elegant, aber funktioniert
    blinks_all=blinks; %werden anscheinend in 1 Zeile abgespeichert
    sakkaden_all=sakkaden; %werden anscheinend in 1 Zeile abgespeichert
    reiz1_all=reiz1;    
    reiz2_all=reiz2;
end
%RS: Signal ist ausgewertet, jetzt Abspeichern.
%RS: beim Abspeichern in verschiedenen Formaten auch verschiedene Dateiendungen...
disp(['Number of saccades:' num2str(size(sakkaden_all,2))])
disp(['Number of blinks:' num2str(size(blinks_all,2))])
for j=outputformat 
    switch j
        case 1            %ASCII: numbers only
            s=saveresult(j,[outputfname '.dat'],reiz1_all,reiz2_all,blinks_all,sakkaden_all,parameter);
        case 2 %ASCII
            s=saveresult(j,[outputfname '.txt'],reiz1_all,reiz2_all,blinks_all,sakkaden_all,parameter);
        case 3
            s=saveresult(j,[outputfname '.mat'],reiz1_all,reiz2_all,blinks_all,sakkaden_all,parameter);
        case 4 
            s=saveresult(j,[outputfname num2str(i) '.xml'],reiz1,reiz2,blinks,sakkaden,parameter);
        case 5 
            s=saveresult(j,[outputfname '.dat'],reiz1_all,reiz2_all,blinks_all,sakkaden_all,parameter);
        case 6 %RS: Knigstein: Ergebnis des letzten Schleifendurchlaufs muss noch mit Nummer abgespeichert werden.
            s=saveresult(j,[outputfname '.dat'],reiz1_all,reiz2_all,blinks_all,sakkaden_all,parameter);    
        otherwise
            disp(['Format ' num2str(j) ' unbekannt']);
    end; 
    if(s~=1)
        error(['While saving in format ' num2str(j) ' an error occured']);
    end;    
end;       
disp(['Total duration: ' num2str(ttt)])

lastpara2txt('lastpara.config')
%Jetzt lastpara.txt an richtige Stelle verschieben
temp=strfind(outputfname,'\');
if temp %i.e.>0
    outputpath=outputfname(1:temp(end)); %so kriege ich Position des letzten '\' und damit kompletten Pfad
    commandstr=['move ' 'lastpara.txt ' outputpath];
    [status,result] = dos(commandstr);
    if status==0
        fprintf(1,'%s\n',commandstr);
    else
        fprintf(1,' error with DOS command: %s\n %s\n',commandstr, result);    
    end;
end

function parameter=loadParam(fname);
    s=load(fname,'-mat');
    parameter=s.parameter;

Contact us