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

saveresult.m
function s=saveresult(format,filename,reiz1,reiz2,blinks,sakkaden,parameter)
% $Id: saveresult.m 15 2005-03-10 12:53:40Z maik $
s=false;
switch(format)
    case 1 %ASCII format 2: numbers only
        s=saveToASCII(filename,reiz1,reiz2,blinks,sakkaden,parameter);        
    case 2
        s=saveToTXT(filename,reiz1,reiz2,blinks,sakkaden,parameter);
    case 3
        s=saveToMAT(filename,reiz1,reiz2,blinks,sakkaden,parameter);
    case 4 
        s=saveToXML(filename,reiz1,reiz2,blinks,sakkaden,parameter);
    case 5 
        s=saveToxyValues(filename,reiz1,reiz2,blinks,sakkaden,parameter);
    case 6%Knigstein-Format %RS: 14.4.05: Pro Ks-Datei maximal 1 Reiztyp, deshalb Falluntescheidungen
        if (size(reiz2,2)) %yreiz in eigene Datei
            ext=findstr(filename,'.'); %Dateiendung angegeben?
            if ext
                filename2= [filename(1:(ext-1)) 'y.dat']; %fr Y-ReizAuswertung
            else
                filename2= [filename 'y.dat']; %fr Y-ReizAuswertung
            end
            s=saveToKStein(filename2,reiz2,[],[],[],parameter); %diese Datei nur Y-Reize
            if ~s disp('Fehler beim Abspeichern Y-Reizauswertung'); end;
            reiz2=[]; %bereits abgespeichert, wird dann leergemacht... 
        end    
        s=saveToKStein(filename,reiz1,reiz2,blinks,sakkaden,parameter); %wie immer        
end



function s=saveToASCII(filename,reiz1,reiz2,blinks,sakkaden,parameter)
s=false;

%schreibe Reizwechsel
%------------------------------
pos=findstr(myseqreverse(filename),'.');
if(~isempty(pos))
    name=filename(1:end-pos);
else
    name=filename;
end

c=size(reiz1)
if c %RS 28.9.:if is neu v
    fid = fopen([name '1.trg'],'w');
    for i=1:c(1);
        fprintf(fid,'%d %d\r\n',reiz1(i,1),reiz1(i,2));    
    end
    fclose(fid);
end

c=size(reiz2)
if c
    fid = fopen([name '2.trg'],'w');
    c=size(reiz2);
    for i=1:c(1)
        fprintf(fid,'%d %d\r\n',reiz2(i,1),reiz2(i,2));        
    end
    fclose(fid);
end




fid = fopen(filename,'w');

%-----------------------------------------------
% erzeuge neue Listen in Sakkadenform
%-----------------------------------------------
% 1. Startzeit in ms
% 2. Ereignistyp (0=Sakkade, 1=Lidschlieung, 2=Lidffnung)
% 3. Dauer 
% 4. Amplitude 
% 5. Maximalgeschwindigkeit 
% 6. Zeitpunkt Maximalgeschwindigkeit
% 7. Blickrichtung in nautischen Grad (bei Blinks entweder 0 oder NaN schreiben)

%schreibe Sakkaden
%------------------------------
list=[];
for i=1:length(sakkaden)        
    sakkade=sakkaden(i); 
    amp=sqrt((sakkade.endeampx-sakkade.startampx)^2 + (sakkade.endeampy-sakkade.startampy)^2);
    %time=(sakkade.ende-sakkade.start)/1000; % zeit in s    
    %speed=amp/time;
    
    entry.start=sakkade.start;
    entry.type=0;
    entry.duration=sakkade.ende-sakkade.start;
    entry.amp=amp;
    entry.maxspeed=sakkade.qmaxspeed;
    entry.maxspeedpos=sakkade.qmaxspeedpos_proz;
    entry.lookdir=lookdir((sakkade.endeampx-sakkade.startampx),...
        (sakkade.endeampy-sakkade.startampy));
        
    list=[list entry];    
end

for i=1:length(blinks)    
    blink=blinks(i);
    
    entry.start=blink.bstart1;
    entry.type=1;
    entry.duration=blink.bende1-blink.bstart1;
    entry.amp=blink.bendeamp1-blink.bstartamp1;
    entry.maxspeed=blink.qmaxspeed1;
    entry.maxspeedpos=blink.qmaxspeedpos1_proz;    
    entry.lookdir=0;        
    list=[list entry]; 
    
    entry.start=blink.bstart2;
    entry.type=2;
    entry.duration=blink.bende2-blink.bstart2;
    entry.amp=blink.bendeamp2-blink.bstartamp2;
    entry.maxspeed=blink.qmaxspeed2;
    entry.maxspeedpos=blink.qmaxspeedpos2_proz;
    entry.lookdir=0;
    list=[list entry];             
end


% sortiere nach Zeiten
[a,b]=sort([list(:).start]);
list=list(b);


% schreibe in Datei
% ------------------------------------
for i=1:length(list)    
    entry=list(i);
    fprintf(fid,'%d %d %d %d %d %d %d\r\n',...
        entry.start,...
        entry.type,...
        entry.duration,...
        entry.amp,...
        entry.maxspeed,...
        entry.maxspeedpos,...
        entry.lookdir);
end
fclose(fid);
s=true;





function s=saveToKStein(filename,reiz1,reiz2,blinks,sakkaden,parameter) %RS: reiz2 bruchte ich eigentlich nicht
s=false;
%c1=size(reiz1);
%c2=size(reiz2);

%ansxreiz=c1(1);
%ansyreiz=c2(1);
anzreiz1=size(reiz1,1);
xreiz=parameter.reizx;
yreiz=parameter.reizy;


%schreibe Header
%------------------------------
fid = fopen(filename,'w');
fprintf(fid,'%s\r\n','1');
fprintf(fid,'%s\r\n','F');
fprintf(fid,'%s\r\n','1');

fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);

fprintf(fid,'%d\r\n', round(xreiz/parameter.wfakt.x) );  %Reizgrsse hori im AD

fprintf(fid,'%d\r\n',100);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);%11. Zeile
fprintf(fid,'%d\r\n',40);

fprintf(fid,'%d\r\n',anzreiz1);  % Anzahl Reizwechsel RS: ansyreiz noch dazu
fprintf(fid,'%d\r\n',40 + anzreiz1 +length(blinks)*12 );  % Startaddr. Sakkaden RS 15.2: ansyreiz noch dazu

fprintf(fid,'%d\r\n',8); %15. Zeile

fprintf(fid,'%d\r\n',length(sakkaden));  % Anzahl Sakkaden
fprintf(fid,'%d\r\n',length(blinks));  % Anzahl Lidschlge

fprintf(fid,'%d\r\n',100);
fprintf(fid,'%d\r\n',2);

fprintf(fid,'%d\r\n',round(xreiz*10));  % hori Reizgre WG *10
fprintf(fid,'%d\r\n',round(parameter.grobsuche.x.schwellwert*10));  % hori Noise WG *10

fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',12);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',100);
fprintf(fid,'%d\r\n',0);


fprintf(fid,'%d\r\n',round(parameter.sfreq));  % dwelltime in usec  1000 bei 1000 Hz
fprintf(fid,'%d\r\n',round(yreiz*10));  % Reiz vert WG  *10
fprintf(fid,'%d\r\n',round(yreiz/parameter.wfakt.y));  % Reiz vert AD
fprintf(fid,'%d\r\n',round(parameter.grobsuche.y.schwellwert*10));  % Noise vert WG  *10

fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);
fprintf(fid,'%d\r\n',0);

%schreibe Reizwechsel
%RS: von mir am 17.1. verndert: Reiz 2-Schreiben wieder aktiviert, noch
%eine if-Abfrage vor Schleife eingebaut...
%------------------------------
if anzreiz1>0 %nur wenn was drinsteht bzw. mindestens 1 Zeile...size(reiz1) 
for i=1:anzreiz1 %besser als length(reiz1), ist bei reiz1=[0 0] nmlich =2
    fprintf(fid,'%d\r\n',reiz1(i,1)*sign(reiz1(i,2)));    
end
end

%schreibe Blinks
% ------------------------------------
for i=1:length(blinks)    
    blink=blinks(i);
    fprintf(fid,'%d\r\n',blink.bstart1);        % start abwrts
    fprintf(fid,'%d\r\n',blink.bende1);        % ende abwrts
    fprintf(fid,'%d\r\n',round(blink.bstartamp1/parameter.wfakt.y));% vert Ampli AD start
    fprintf(fid,'%d\r\n',round(blink.bendeamp1/parameter.wfakt.y));        % vert Ampli AD ende
    fprintf(fid,'%d\r\n',round(blink.qmaxspeedpos1_proz));        % max speedpos
    fprintf(fid,'%d\r\n',round(blink.qmaxspeed1));        % max speed
    
    
    fprintf(fid,'%d\r\n',blink.bstart2);        % start aufwrts
    fprintf(fid,'%d\r\n',blink.bende2);        % ende aufwrts
    fprintf(fid,'%d\r\n',round(blink.bstartamp2/parameter.wfakt.y));        % vert Ampli AD start
    fprintf(fid,'%d\r\n',round(blink.bendeamp2/parameter.wfakt.y));        % vert Ampli AD ende
    fprintf(fid,'%d\r\n',round(blink.qmaxspeedpos2_proz));        % max speedpos
    fprintf(fid,'%d\r\n',round(blink.qmaxspeed2));        % max speed
end

%schreibe Sakkaden
%------------------------------
for i=1:length(sakkaden)    
    sakkade=sakkaden(i); 
    fprintf(fid,'%d\r\n',sakkade.start);        % start 
    fprintf(fid,'%d\r\n',sakkade.ende);        % ende
    fprintf(fid,'%d\r\n',round(sakkade.startampx/parameter.wfakt.x));        %  Ampli hori start
    fprintf(fid,'%d\r\n',round(sakkade.endeampx/parameter.wfakt.x));        %  Ampli hori ende    
    fprintf(fid,'%d\r\n',round(sakkade.qmaxspeedpos_proz));        %  max speedpos
    fprintf(fid,'%d\r\n',round(sakkade.qmaxspeed));        %  max speed
    fprintf(fid,'%d\r\n',round(sakkade.startampy/parameter.wfakt.y));        %  Ampli vert start
    fprintf(fid,'%d\r\n',round(sakkade.endeampy/parameter.wfakt.y));        %  Ampli vert ende
end

fclose(fid);
s=true;


%##########################################################################
function s=saveToTXT(filename,reiz1,reiz2,blinks,sakkaden,parameter)
s=false;
fid = fopen(filename,'w');

% Sakkaden einfgen
%------------------------------
for i=1:length(sakkaden)    
    sakkade=sakkaden(i);        
    fprintf(fid,'S (%d %d) (%d %d %12.2f) (%d %d %12.2f) (%d %12.2f %12.2f)\r\n',...
         sakkade.start,sakkade.ende,...
         round(sakkade.startampx), round(sakkade.endeampx),sakkade.ampx,...
         round(sakkade.startampy), round(sakkade.endeampy),sakkade.ampy,...
         sakkade.qmaxspeedpos,sakkade.qmaxspeedpos_proz,sakkade.qmaxspeed);         
end

% Blinks einfgen
% ------------------------------------
for i=1:length(blinks)
    blink=blinks(i);
    fprintf(fid,'B [%d %d (%d %d %12.2f) (%d %12.2f %12.2f)] [%d %d (%d %d %12.2f) (%d %12.2f %12.2f)]\r\n',...
        blink.bstart1,blink.bende1,...
        round(blink.bstartamp1),round(blink.bendeamp1),blink.bamp1,...
        blink.qmaxspeedpos1,blink.qmaxspeedpos1_proz,blink.qmaxspeed1,...        
        blink.bstart2,blink.bende2,...
        round(blink.bstartamp2),round(blink.bendeamp2),blink.bamp2,...
        blink.qmaxspeedpos2,blink.qmaxspeedpos2_proz,blink.qmaxspeed2);
end

fclose(fid);
s=true;


%##########################################################################
function s=saveToMAT(filename,reiz1,reiz2,blinks,sakkaden,parameter)
	handles.saccades=sakkaden;
	handles.blinks=blinks;
	handles.stimulus1=reiz1;
	handles.stimulus2=reiz2;
	save(filename,'-struct','handles','-v6');
	s=true;

%##########################################################################
function s=saveToXML(filename,reiz1,reiz2,blinks,sakkaden,parameter)
s=false;
docNode = com.mathworks.xml.XMLUtils.createDocument('ANALYSIS');
xmlstylesheet = docNode.createProcessingInstruction('xml-stylesheet',...
'type="text/xsl" href="5.xsl"');

docRootNode = docNode.getDocumentElement;
docNode.insertBefore(xmlstylesheet, docRootNode);

% Blinks einfgen
% ------------------------------------
for i=1:length(blinks)
    
    blink=blinks(i);
    thisElement = docNode.createElement('BLINK');
        
        sak1 = docNode.createElement('SACCADE_1');    
        sak1.setAttribute('start',num2str(blink.bstart1));    
        sak1.setAttribute('end',num2str(blink.bende1));                        
            amp = docNode.createElement('AMPLITUDE');    
            amp.setAttribute('start',num2str(blink.bstartamp1));    
            amp.setAttribute('end',num2str(blink.bendeamp1));                
            amp.setAttribute('angle',num2str(blink.bamp1));                                           
            speed = docNode.createElement('MAXSPEED');    
            speed.setAttribute('moment',num2str(blink.qmaxspeedpos1));
            speed.setAttribute('momentPerc',num2str(blink.qmaxspeedpos1_proz));
            speed.setAttribute('speed',num2str( blink.qmaxspeed1));            
        sak1.appendChild(amp);
        sak1.appendChild(speed);
        
        
        sak2 = docNode.createElement('SACCADE_2');    
        sak2.setAttribute('start',num2str(blink.bstart2));    
        sak2.setAttribute('end',num2str(blink.bende2));            
            amp = docNode.createElement('AMPLITUDE');    
            amp.setAttribute('start',num2str(blink.bstartamp2));
            amp.setAttribute('end',num2str(blink.bendeamp2));
            amp.setAttribute('angle',num2str(blink.bamp2));               
            speed = docNode.createElement('MAXSPEED');    
            speed.setAttribute('moment',num2str(blink.qmaxspeedpos2));
            speed.setAttribute('momentPerc',num2str(blink.qmaxspeedpos2_proz));
            speed.setAttribute('speed',num2str( blink.qmaxspeed2));            
        sak2.appendChild(amp);
        sak2.appendChild(speed);
                   
     thisElement.appendChild(sak1);                  
     thisElement.appendChild(sak2);
     docRootNode.appendChild(thisElement);
end
s=true;

% Sakkaden einfgen
%------------------------------
for i=1:length(sakkaden)
    sakkade=sakkaden(i);
    thisElement = docNode.createElement('SACCADE');
    thisElement.setAttribute('start',num2str(sakkade.start));    
    thisElement.setAttribute('end',num2str(sakkade.ende));
       
        ampx = docNode.createElement('AMPLITUDE_X');    
        ampx.setAttribute('start',num2str(sakkade.startampx));        
        ampx.setAttribute('end',num2str(sakkade.endeampx));
        ampx.setAttribute('angle',num2str(sakkade.ampx));
                
        ampy = docNode.createElement('AMPLITUDE_Y');    
        ampy.setAttribute('start',num2str(sakkade.startampy));
        ampy.setAttribute('end',num2str(sakkade.endeampy));
        ampy.setAttribute('angle',num2str(sakkade.ampy));
               
        speed = docNode.createElement('MAXSPEED');    
        speed.setAttribute('moment',num2str(sakkade.qmaxspeedpos));        
        speed.setAttribute('momentPerc',num2str(sakkade.qmaxspeedpos_proz));
        speed.setAttribute('speed',num2str(sakkade.qmaxspeed));
                           
    thisElement.appendChild(ampx);
    thisElement.appendChild(ampy);
    thisElement.appendChild(speed);
            
    docRootNode.appendChild(thisElement);
end


% Save XML document.
xmlwrite(filename,docNode);
    


function winkel=lookdir(z1hor,z1ver)
if(z1hor==0)
    if(z1ver>0) winkel=360;
    else winkel=180;end
    return;
    
end
if(z1ver==0)
    if(z1hor>0) winkel=90;
    else winkel=270; end
    return;       
end
win=atand(z1ver / z1hor);

if(sign(z1hor)>0) winkel=90-win; 
else winkel=270-win; end
 
    
function s=saveToxyValues(filename,reiz1,reiz2,blinks,sakkaden,parameter) 
%Reizinformationen bis jetzt nicht bercksichtigt....
s=false;
fid = fopen(filename,'w');
%write header:
fprintf(fid,'type\tstart\tstop\txstart\tystart\txstop\tystop\tmaxspeed\tmxspperc\r\n'); %Variablennamen 
fprintf(fid,'%g\r\n',parameter.sfreq); %samplingrate (wird immer dort gespeichert, mit oder ohne gui)
fprintf(fid,'%g\r\n', parameter.wfakt.x);  %AD2deg
fprintf(fid,'%g\r\n', parameter.wfakt.y);  %AD2deg
clear myhandles; 
%So aus saveToKSTein bernommen:
%wenn ich es richtig verstanden habe, sind in bstartamp usw. bereits WG-,nicht AD-Werte

for i=1:length(blinks)    
    blink=blinks(i);
    fprintf(fid,'1\t');%typ: 0=sacc, 1=blink closure, 2=blink opening
    fprintf(fid,'%d\t',round(blink.bstart1));        % start Schlieung
    fprintf(fid,'%d\t',round(blink.bende1));        % ende abwrts
    fprintf(fid,'NaN\t'); %no xstart for blinks (vertical only)
    fprintf(fid,'%d\t',round(blink.bstartamp1/parameter.wfakt.y));% vert Ampli AD start
    fprintf(fid,'NaN\t'); %no xstop for blinks (vertical only)
    fprintf(fid,'%d\t',round(blink.bendeamp1/parameter.wfakt.y));        % vert Ampli AD ende
    fprintf(fid,'%g\t',round(blink.qmaxspeed1*100)/100);        % max speed xx.xx
    fprintf(fid,'%g\r\n',round(blink.qmaxspeedpos1_proz*100)/100);        % max speedpos: xx.xx
    
    %write opening...
    fprintf(fid,'2\t');%typ: 0=sacc, 1=blink closure, 2=blink opening
    fprintf(fid,'%d\t',round(blink.bstart2));        % start open
    fprintf(fid,'%d\t',round(blink.bende2));        % stop open
    fprintf(fid,'NaN\t'); %no xstart
    fprintf(fid,'%d\t',round(blink.bstartamp2/parameter.wfakt.y));        % vert Ampli AD start
    fprintf(fid,'NaN\t'); %no xstop
    fprintf(fid,'%d\t',round(blink.bendeamp2/parameter.wfakt.y));        % vert Ampli AD ende
    fprintf(fid,'%g\t',round(blink.qmaxspeed2*100)/100);        % max speed
    fprintf(fid,'%g\r\n',round(blink.qmaxspeedpos2_proz*100)/100);        % max speedpos    
end

%typ\t start\t stop\t xstart\t ystart\t xstop\t ystop\t
for i=1:length(sakkaden)    
    sakkade=sakkaden(i); 
    fprintf(fid,'0\t');%typ: 0=sacc, 1=blink closure, 2=blink opening
    fprintf(fid,'%d\t',round(sakkade.start));        % start 
    fprintf(fid,'%d\t',round(sakkade.ende));        % ende
    fprintf(fid,'%d\t',round(sakkade.startampx/parameter.wfakt.x));        %  Ampli hori start
    fprintf(fid,'%d\t',round(sakkade.startampy/parameter.wfakt.y));        %  Ampli vert start
    fprintf(fid,'%d\t',round(sakkade.endeampx/parameter.wfakt.x));        %  Ampli hori ende  
    fprintf(fid,'%d\t',round(sakkade.endeampy/parameter.wfakt.y));        %  Ampli vert ende
    fprintf(fid,'%d\t',round(sakkade.qmaxspeed));        %  max speed
    fprintf(fid,'%d\r\n',round(sakkade.qmaxspeedpos_proz));        %  max speedpos
    %vor letztem Wert neue Zeile!
end

fclose(fid);
s=true;

Contact us