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;