1function [HDR] = getfiletype(arg1)
2% GETFILETYPE get file type
3%
4% HDR = getfiletype(Filename);
5% HDR = getfiletype(HDR.FileName);
6%
7% HDR is the Header struct and contains stuff used by SOPEN.
8% HDR.TYPE identifies the type of the file [1,2].
9%
10% see also: SOPEN
11%
12% Reference(s):
13%   [1] http://pub.ist.ac.at/~schloegl/matlab/eeg/
14%   [2] http://pub.ist.ac.at/~schloegl/biosig/TESTED
15
16
17% This program is free software; you can redistribute it and/or
18% modify it under the terms of the GNU General Public License
19% as published by the Free Software Foundation; either version 3
20% of the License, or (at your option) any later version.
21
22% Copyright (C) 2004-2008,2019,2020 by Alois Schloegl <alois.schloegl@gmail.com>
23%    This is part of the BIOSIG-toolbox https://biosig.sourceforge.io/
24
25
26if ischar(arg1),
27        HDR.FileName = arg1;
28elseif isfield(arg1,'name')
29        HDR.FileName = arg1.name;
30	HDR.FILE = arg1;
31elseif isfield(arg1,'FileName')
32        HDR = arg1;
33else
34	error('input argument not supported');
35end;
36if ~isfield(HDR,'FILE')
37        HDR.FILE.PERMISSION='r';
38end;
39if ~isfield(HDR.FILE,'PERMISSION')
40        HDR.FILE.PERMISSION='r';
41end;
42
43HDR.TYPE = 'unknown';
44HDR.FILE.OPEN = 0;
45HDR.FILE.FID  = -1;
46HDR.ErrNum    = 0;
47HDR.ErrMsg    = '';
48if ~isfield(HDR.FILE,'stderr'),
49        HDR.FILE.stderr = 2;
50end;
51if ~isfield(HDR.FILE,'stdout'),
52        HDR.FILE.stdout = 1;
53end;
54
55if exist(HDR.FileName,'dir')
56        [pfad,file,FileExt] = fileparts(HDR.FileName);
57        HDR.FILE.Name = file;
58        HDR.FILE.Path = pfad;
59	HDR.FILE.Ext  = FileExt(2:end);
60	if strcmpi(FileExt,'.ds'), % .. & isdir(HDR.FileName)
61	        f1 = fullfile(HDR.FileName,[file,'.meg4']);
62	        f2 = fullfile(HDR.FileName,[file,'.res4']);
63	        if (exist(f1,'file') && exist(f2,'file')), % && (exist(f3)==2)
64            		HDR.FileName  = f1;
65			% HDR.TYPE = 'MEG4'; % will be checked below
66	        end;
67        elseif exist(fullfile(HDR.FileName,'alpha.alp'),'file')
68                HDR.FileName = fullfile(HDR.FileName,'rawhead');
69
70        elseif exist(fullfile(HDR.FileName,'patient.txt'),'file') && exist(fullfile(HDR.FileName,'datafiles.txt'),'file')
71        	% Freiburg Prediction Contest
72        	% https://epilepsy.uni-freiburg.de/seizure-prediction-workshop-2007/prediction-contest/data-download
73		HDR.FILE.Path = HDR.FileName;
74		HDR.FILE.Name = 'patient.txt';
75		HDR.FileName = fullfile(HDR.FILE.Path,'patient.txt');
76
77        elseif exist(fullfile(HDR.FileName,'conf.json'),'file') && ~isempty(dir(fullfile(HDR.FileName,'series-*.bin')))
78                HDR.FileName = fullfile(HDR.FileName,'conf.json')
79
80        else
81    		HDR.TYPE = 'DIR';
82    		return;
83	end;
84end;
85
86%fid = fopen(HDR.FileName,PERMISSION,'ieee-le');
87fid = fopen(HDR.FileName,HDR.FILE.PERMISSION);
88if fid < 0,
89	HDR.ErrNum = -1;
90        HDR.ErrMsg = sprintf('Error GETFILETYPE: file %s not found.\n',HDR.FileName);
91        return;
92else
93        [pfad,file,FileExt] = fileparts(HDR.FileName);
94        if ~isempty(pfad),
95                HDR.FILE.Path = pfad;
96        else
97                HDR.FILE.Path = pwd;
98        end;
99        HDR.FILE.Name = file;
100        HDR.FILE.Ext  = char(FileExt(2:length(FileExt)));
101
102        if ~any(HDR.FILE.PERMISSION=='z')
103                fseek(fid,0,'eof');
104        else
105                fseek(fid,2^32,'bof');
106        end;
107	HDR.FILE.size = ftell(fid);
108
109	fseek(fid,0,'bof');
110        [s,c] = fread(fid,min(HDR.FILE.size,1024),'uint8');
111        if (c == 0),
112		return;
113        elseif (c < 1024),
114                s = [s', repmat(NaN,1,1024-c)];
115        else
116                s = s';
117        end;
118
119        if c,
120		ss = char(s(1:c));
121                HDR.keycode = s(1:34);
122
123                %%%% file type check based on magic numbers %%%
124		tmp = 256.^[0:3]*reshape(s(1:20),4,5);
125		mat4.flag = (c>20) && (tmp(5)<256) && (tmp(5)>1) && (tmp(1)<4053) && any(s(13)==[0,1]) && any(tmp(4)==[0,1]);
126		if mat4.flag,
127			mat4.matrixname = lower(char(s(21:20+tmp(5)-1)));
128	                mat4.type = sprintf('%04i',tmp(1))-48;
129                        mat4.size = tmp(2:3);
130                        mat4.imagf= tmp(4);
131			mat4.flag = mat4.flag && s(20+tmp(5));
132			mat4.flag = all((mat4.matrixname>='0' && mat4.matrixname<='9') || (mat4.matrixname>='_' && mat4.matrixname<='z'));
133			mat4.flag = mat4.flag && all(any(mat4.type(ones(6,1),:)==[0,0:4;zeros(1,6);0:5;0:2,0,0,0]'));
134		end;
135		MAGIC.ePrime = 'ExperimentName	Subject	Session	Clock.Information	Display.RefreshRate	Group	RandomSeed	SessionDate	SessionTime	Block	Blocklist	Blocklist.Cycle';
136
137		pos1_ascii10 = min(find(s==10));
138		FLAG.FS3 = any(s==10);
139		if FLAG.FS3,
140			FLAG.FS3=all((s(4:pos1_ascii10)>=32) & (s(4:pos1_ascii10)<128)); 	% FREESURVER TRIANGLE_FILE_MAGIC_NUMBER
141                end;
142
143                FLAG.IS_UFF = strncmp(ss,['    -1',repmat(' ',1,80-6)],80);
144                if FLAG.IS_UFF,
145                	K = strfind(ss(81:161),'    '); K = min(K);
146                	FLAG.IS_UFF = (K<4) && any(s(81)==[10,13]) && any(s(79+K)==[10,13]);
147                end;
148
149                if 0,
150                elseif all(s([1:2,155:156])==[207,0,0,0]);
151                        HDR.TYPE='BKR';
152                elseif strncmp(ss,'Version 3.0',11); % Neuroscan
153                        HDR.TYPE='CNT';
154                elseif strncmp(ss,'NSI TFF',7); % Neuroscan
155                        HDR.TYPE='AST';
156                elseif strncmp(ss,'Brain Vision Data Exchange Header File',38);
157                        HDR.TYPE = 'BrainVision';
158                elseif strncmp(ss,'Brain Vision V-Amp Data Header File Version',38);
159                        HDR.TYPE = 'BrainVisionVAmp';
160                elseif strncmp(ss,[char([239,187,191]),'Brain Vision Data Exchange Header File'],38);
161                        HDR.TYPE = 'BrainVision';
162                elseif strncmp(ss,'Brain Vision Data Exchange Marker File',38);
163                        HDR.TYPE = 'BrainVision_MarkerFile';
164                elseif strncmp(ss,'[Header]',8);
165                        HDR.TYPE='ET-MEG';
166                elseif all(256.^[0:3]*reshape(s(1:80),[4,20])==[0,16,32,32,512,536,1,1,1048,412,1,1,1460,80,32,1,4020,76,128,128]);
167                        HDR.TYPE='ET-MEG:SQD';
168                        HDR.Endianity = 'ieee-le';
169                elseif all(s(1:4)==0) && strcmp(HDR.FILE.Ext,'raw') && exist(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.ainf']),'file');
170                        HDR.TYPE='AINF';
171                elseif strncmp(ss,'[BioSig Header]',13);
172                        HDR.TYPE='BioSig';
173                elseif strncmp(ss,'#BIOSIG BINARY]',14);
174                        HDR.TYPE='BIN';
175                elseif strncmp(ss,'0       ',8);
176                        HDR.TYPE='EDF';
177                elseif all(s(1:8)==[255,abs('BIOSEMI')]);
178                        HDR.TYPE='BDF';
179                elseif strncmp(ss,'GDF',3);
180                        HDR.TYPE='GDF';
181                elseif strncmp(ss,'EBS',3);
182                        HDR.TYPE='EBS';
183                %elseif all(s(1:4) == [hex2dec(['5f';'09';'a7';'82'])]');
184                        %HDR.TYPE='ASN.1';
185                elseif (c>31) && strncmp(ss,'CEN',3) && all(s(6:8)==hex2dec(['1A';'04';'84'])') && (all(s(4:5)==hex2dec(['13';'10'])') || all(s(4:5)==hex2dec(['0D';'0A'])'));
186                        HDR.TYPE='FEF';
187                        HDR.VERSION   = str2double(ss(9:16))/100;
188                        HDR.Encoding  = str2double(ss(17:24));
189                        if any(str2double(ss(25:32))),
190                                HDR.Endianity = 'ieee-be';
191                        else
192                                HDR.Endianity = 'ieee-le';
193                        end;
194                        if any(s(4:5)~=[13,10])
195                        %        fprintf(2,'Warning GETFILETYPE (FEF): incorrect preamble in file %s\n',HDR.FileName);
196                        end;
197
198                elseif strncmp(ss,'CEDFILE"',8);
199                        HDR.TYPE='CFS';
200                elseif strncmp(ss,'MEG41CP',7);
201                        HDR.TYPE='CTF';
202                elseif strncmp(ss,'MEG41RS',7) || strncmp(ss,'MEG4RES',7);
203                        HDR.TYPE='CTF';
204                elseif strncmp(ss,'MEG4',4);
205                        HDR.TYPE='CTF';
206                elseif (c>21) && strncmp(ss,'CTF_MRI_FORMAT VER 2.2',22);
207                        HDR.TYPE='CTF';
208                elseif 0, strncmp(ss,'PATH OF DATASET:',16);
209                        HDR.TYPE='CTF';
210
211                elseif strcmp(ss(1:10),'EEG-1100C ') && strcmp(ss(16+(1:length(HDR.FILE.Name))),HDR.FILE.Name);      % Nihon-Kohden
212                        HDR.TYPE='EEG-1100';
213                        HDR.VERSION = ss(11:16);
214                elseif strcmp(ss(1:10),'EEG-1100C ') && strcmp(ss(32+(1:length(HDR.FILE.Name))),HDR.FILE.Name);      % Nihon-Kohden
215                        HDR.TYPE='EEG-1100+';
216                        HDR.VERSION = ss(11:16);
217                elseif strcmp(ss([1:8,10]),'EEG-1100 ')  && any(ss(9)=='ABC')   % Nihon-Kohden
218                        HDR.TYPE='EEG-1100-';
219                        HDR.VERSION = ss(11:16);
220                elseif strcmp(ss(1:10),'QI-403A   ')     % Nihon-Kohden
221                        HDR.TYPE='EEG-1100-';
222                        HDR.VERSION = ss(11:16);
223                elseif strcmp(ss(1:10),'EEG-2100  ')     % Nihon-Kohden
224                        HDR.TYPE='EEG-1100-';
225                        HDR.VERSION = ss(11:16);
226                elseif strcmp(ss(1:10),'DAE-2100D ')     % Nihon-Kohden
227                        HDR.TYPE='EEG-1100-';
228                        HDR.VERSION = ss(11:16);
229
230                elseif (c>278) && strncmp(ss,'Embla data file',15) && strcmp(HDR.FILE.Name,ss(279:278+length(HDR.FILE.Name))),
231                        HDR.TYPE='EMBLA';
232                elseif strcmp(ss(1:20),['Header',char(13),char(10),'File Version'])
233                        HDR.TYPE='ETG4000';
234                elseif strncmp(ss, MAGIC.ePrime, length(MAGIC.ePrime))
235                        HDR.TYPE='ePrime';
236
237                elseif strncmp(ss,'GALILEO EEG TRACE FILE',22)     % Galilea EEG (from ESAOTE, EBNeuro spa)
238                        HDR.TYPE='GTF';
239                elseif strcmp(ss(3:11),'COHERENCE') && strcmp(ss(43+[1:length(HDR.FILE.Name)]),HDR.FILE.Name);
240                        HDR.TYPE='Delta';
241
242                elseif strcmp(ss(1:8),'@  MFER ');
243                        HDR.TYPE='MFER';
244                elseif (c>27) && strcmp(ss(1:28),'FileFormat = BNI-1-BALTIMORE');
245                        HDR.TYPE='Nicolet';	%%% see also Nicolet
246                elseif strcmp(ss(1:6),'@ MFR ');
247                        HDR.TYPE='MFER';
248                elseif all(s([4:7,14:19])==[232,3,12,0,0,0,0,0,0,0]);
249                        HDR.TYPE='PathFinder710_HighResolutionECG';
250
251		%% general SCP
252                elseif (c>33) && all(s([9,10,12:14,17:24,26:34])==[0,0,0,0,0,abs('SCPECG'),0,0,0,0,0,7,0,0,0,1,0]) && (s(11)==s(25));
253                        HDR.TYPE = 'SCP';
254                        HDR.VERSION = s(15)/10;
255                elseif (c>33) && all(s([9,10,12:14,17:24,26:34])==[0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,7,0,0,0,1,0]) && (s(11)==s(25));
256                        HDR.TYPE = 'SCP';
257                        HDR.VERSION = s(15)/10;
258
259		%% special SCP
260                elseif (c>23) && all(s([9:23])==[0,0,136,0,0,0, 13,13, 6,abs('SCPECG')]);
261                        HDR.TYPE = 'SCP';
262                        HDR.VERSION = -1;
263                elseif (c>33) && all(s([9:34])==[0,0,136,0,0,0, 10,205,205,205,205,205,205,205,0,0, 136,0,0,0,7,0,0,0,1,0]);
264                        HDR.TYPE = 'SCP';
265                        HDR.VERSION = -2;
266                elseif (c>33) && all(s([9:34])==[0,0,136,0,0,0, 10,11, 0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0, 1,0]);
267                        HDR.TYPE = 'SCP';
268                        HDR.VERSION = -3;
269                elseif (c>33) && all(s([9:34])==[0,0,136,0,0,0, 13,13, abs('SCPEGC'),0,0, 136,0,0,0, 7,0,0,0, 1,0]);
270                        HDR.TYPE = 'SCP';
271                        HDR.VERSION = -4;
272                elseif (c>33) && all(s([9:34])==[0,0,136,0,0,0, 10,0, 144,128,0,0,120,128,0,0, 136,0,0,0, 7,0,0,0, 1,0]);
273                        HDR.TYPE = 'SCP';
274                        HDR.VERSION = -5;
275                elseif (c>33) && all(s([9:34])==[0,0,136,0,0,0, 10,11, 37,1,153,1,231,73 ,0,0, 136,0,0,0, 7,0,0,0, 1,0]);
276                        HDR.TYPE = 'SCP';
277                        HDR.VERSION = -6;
278
279                elseif strncmp(ss,'# EN1064 Lead Identification Table of the SCP-ECG format',6);
280                        HDR.TYPE='EN1064:LeadId';
281                        tmp = fread(fid,[1,inf],'uint8');
282                        s = char([s(:);tmp(:)])';
283                        fclose(fid);
284                        k = 0;
285                        while ~isempty(s),
286                                [t,s] = strtok(s,[10,13]);
287                                if ~length(t)
288                                elseif ~strncmp(t,'#',1)
289                                        ix3 = strfind(t,'MDC_ECG_LEAD_');
290                                        [t1,t2] = strtok(t(1:ix3-1),[9,32]);
291                                        [t2,t3] = strtok(t2,[9,32]);
292                                        id = str2double(t2);
293                                        k = k+1;
294                                        HDR.EN1064.SCP_Name{k}    = t1;
295                                        HDR.EN1064.Code(k)        = id;
296                                        HDR.EN1064.Description{k} = deblank(t3);
297                                        HDR.EN1064.MDC_ECG_LEAD{k}= t(ix3+13:end);
298                                end;
299                        end;
300                        return;
301                elseif (c>41) && strncmp(ss,'ATES MEDICA SOFT. EEG for Windows',32);	% ATES MEDICA SOFTWARE, NeuroTravel
302                        HDR.TYPE='ATES';
303                        HDR.VERSION = ss(35:42);
304                elseif (c>40) && strncmp(ss,'V3.0            ',16) && strncmp(ss(33:41),'[PatInfo]',9);
305                        HDR.TYPE='Sigma';	%% SigmaPLpro
306                        HDR.HeadLen = s(17:20)*(256.^[0:3]');
307                elseif all(s([1:24,29:31])==[abs('POLY SAMPLE FILEversion '),13,10,26]) && (str2double(ss(25:28))==(s([32:33])*[1;256]/100)); % Poly5/TMS32 sample file format.
308                        HDR.TYPE='TMS32';
309                elseif strncmp(ss,['FileId=TMSi PortiLab sample log file'],36); %
310                        HDR.TYPE='TMSiLOG';
311                        HDR.H1 = [ss(1:c),fread(fid,[1,inf],'uint8=>char')];  %% read whole file
312                elseif strncmp(ss,'"Snap-Master Data File"',23);	% Snap-Master Data File .
313                        HDR.TYPE='SMA';
314                elseif 0, all(s([1:2,20])==[1,0,0]) && any(s(19)==[2,4]);
315                        HDR.TYPE='TEAM';	% Nicolet TEAM file format
316                elseif strncmp(ss,HDR.FILE.Name,length(HDR.FILE.Name)) && strcmpi(HDR.FILE.Ext,'HEA');
317                        HDR.TYPE='MIT';
318                elseif strncmp(ss,'DEMG',4);	% www.Delsys.com
319                        HDR.TYPE='DEMG';
320                elseif (c>37) && strcmp(ss(35:38),'BLSC') % CeeGraph, Bio-Logic Systems Corp.
321                        if strcmpi(ss(44+[0:length(HDR.FILE.Name)+length(HDR.FILE.Ext)]),[HDR.FILE.Name,'.',HDR.FILE.Ext]);
322                        else
323                                warning('BLSC: ????');
324                        end;
325                        HDR.TYPE='BLSC1';
326
327                elseif all(s([1:2,4:8])==[3,17,0,8,9,176,2]) && any(s(3)==[240:249])	% v2.40 - v2.49
328                        HDR.TYPE='BLSC2';
329                elseif (c>317) && all(ss(308:318)==['E',char(zeros(1,7)),'DAT']) % CeeGraph, Bio-Logic Systems Corp.
330                        HDR.TYPE='BLSC2';
331                elseif all(s([129,130,132:136])==[3,17,0,8,9,176,2]) && any(s(3)==[240:249])	% v2.40 - v2.49
332                        HDR.TYPE='BLSC2-128';
333                elseif (c>445) && strncmp(ss(436:446),[HDR.FILE.Name,char(0),HDR.FILE.Ext],length(HDR.FILE.Name)+length(HDR.FILE.Ext)+1) % CeeGraph, Bio-Logic Systems Corp.
334                        HDR.TYPE='BLSC2';
335                elseif (c>445) && strncmp(ss(436:446),[HDR.FILE.Name,char(0),HDR.FILE.Ext],length(HDR.FILE.Name)+length(HDR.FILE.Ext)+1) % CeeGraph, Bio-Logic Systems Corp.
336                        HDR.TYPE='BLSC2';
337                elseif (c>445) && strncmp(ss(436:446),[HDR.FILE.Name,char([0,0,0,0])],length(HDR.FILE.Name)+4) % CeeGraph, Bio-Logic Systems Corp.
338                        HDR.TYPE='BLSC2';
339
340                elseif any(s(1)==[100:103]) && all(s([2:8])==[0,0,0,176,1,0,0]) && strcmpi(HDR.FILE.Ext,'DDT');
341                        HDR.TYPE='DDT';
342                elseif all(s([1:32])==[0,0,0,0,0,0,58,1,58,1,58,1,105,0,4,0,128,0,4,0,0,0,0,0,2,0,0,0,0,0,0,0]);
343                        HDR.TYPE='LEXICORE';
344                elseif all(s([1:4])==abs('NEX1'));
345                        HDR.TYPE='NEX';
346                elseif all(s([1:6])==abs('Neuron'));
347                        HDR.TYPE='NEURON';
348                elseif all(strcmp(ss([1:10]),'[FileInfo]'));
349                        HDR.TYPE='Persyst';
350                elseif all(s([1:4])==abs('SXDF'));
351                        HDR.TYPE='OpenXDF';
352                elseif all(s([1:4,6:132])==[abs('PLEX'),zeros(1,127)]); 	% http://WWW.PLEXONINC.COM
353                        HDR.TYPE='PLEXON';
354
355                elseif strcmp(ss([1:4]),'fLaC');
356                        HDR.TYPE='FLAC';
357                elseif strcmp(ss([1:4]),'OggS');
358                        HDR.TYPE='OGG';
359                elseif strcmp(ss([1:4]),'.RMF');
360                        HDR.TYPE='RMF';
361
362                elseif strncmp(ss,'AON4',4);
363                        HDR.TYPE='AON4';
364                elseif all(s(3:7)==abs('-lh5-'));
365                        HDR.TYPE='LHA';
366                elseif (c>117) && strncmp(ss,'PSID',4);
367                        HDR.TYPE='SID';
368			HDR.Title = ss(23:54);
369			HDR.Author = ss(55:86);
370			HDR.Copyright = ss(87:118);
371
372                elseif strncmp(ss,'.snd',4);
373                        HDR.TYPE='SND';
374                        HDR.Endianity = 'ieee-be';
375                elseif strncmp(ss,'dns.',4);
376                        HDR.TYPE='SND';
377                        HDR.Endianity = 'ieee-le';
378                elseif (c>11) && strcmp(ss([1:4,9:12]),'RIFFWAVE');
379                        HDR.TYPE='WAV';
380                        HDR.Endianity = 'ieee-le';
381                elseif (c>10) && strcmp(ss([1:4,9:11]),'FORMAIF');
382                        HDR.TYPE='AIF';
383                        HDR.Endianity = 'ieee-be';
384                elseif (c>11) && strcmp(ss([1:4,9:12]),'RIFFAVI ');
385                        HDR.TYPE='AVI';
386                        HDR.Endianity = 'ieee-le';
387                elseif (c>20) && all(s([1:4,9:21])==[abs('RIFFRMIDMThd'),0,0,0,6,0]);
388                        HDR.TYPE='RMID';
389                        HDR.Endianity = 'ieee-be';
390                elseif all(s(1:9)==[abs('MThd'),0,0,0,6,0]) && any(s(10)==[0:2]);
391                        HDR.TYPE='MIDI';
392			HDR.Endianity = 'ieee-be';
393                elseif (c>15) && ~isempty(strfind(ss(1:16),'8SVXVHDR'));
394                        HDR.TYPE='8SVX';
395                elseif strcmp(ss([1:4,9:12]),'RIFFILBM');
396                        HDR.TYPE='ILBM';
397                elseif strcmp(ss([1:4]),'2BIT');
398                        HDR.TYPE='AVR';
399                elseif all(s([1:4])==[26,106,0,0]);
400                        HDR.TYPE='ESPS';
401                        HDR.Endianity = 'ieee-le';
402                elseif all(s([1:4])==[0,0,106,26]);
403                        HDR.TYPE='ESPS';
404                        HDR.Endianity = 'ieee-le';
405                elseif strncmp(ss,'|CF,',4)
406                        HDR.TYPE='FAMOS';
407                elseif strcmp(ss([1:15]),'IMA_ADPCM_Sound');
408                        HDR.TYPE='IMA ADPCM';
409                elseif all(s([1:8])==[abs('NIST_1A'),0]);
410                        HDR.TYPE='NIST';
411                elseif (c>77) && strcmp(ss(1:78),'HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000');
412                        HDR.TYPE='SAS_XPORT';
413                elseif (c>22) && strncmp(ss(1:23),'$FL2@(#) SPSS DATA FILE',8);
414                        HDR.TYPE='SPSS';
415                        if all(s(66:68)==0) 		HDR.Endianity = 'ieee-le';
416                        elseif all(s(65:67)==0) 	HDR.Endianity = 'ieee-be';
417			end
418		elseif (c>15) && strcmp(ss(1:16),['SQLite format 3',char(0)]) && s(22)==64 && s(23)==32 && all(s(69:92)==0),
419			HDR.TYPE = 'SQLite';
420		elseif all(s(3:4)==[1,0]) && any(s(1)==[113,114]) && any(s(2)==[1:2]),
421			HDR.TYPE = 'STATA';
422
423                elseif all(s([1:7])==[abs('SOUND'),0,13]);
424                        HDR.TYPE='SNDT';
425                elseif (c>17) && strcmp(ss([1:18]),'SOUND SAMPLE DATA ');
426                        HDR.TYPE='SMP';
427                elseif (c>18) && strcmp(ss([1:19]),'Creative Voice File');
428                        HDR.TYPE='VOC';
429                elseif strcmp(ss([5:8]),'moov'); 	% QuickTime movie
430                        HDR.TYPE='QTFF';
431                elseif strncmp(ss,'FWS',3) || strncmp(ss,'CWS',3); 	% Macromedia
432                        HDR.TYPE='SWF';
433			HDR.VERSION = s(4);
434			HDR.SWF.size = s(5:8)*256.^[0:3]';
435                elseif all(s(1:16)==hex2dec(reshape('3026b2758e66cf11a6d900aa0062ce6c',2,16)')')
436                        %'75B22630668e11cfa6d900aa0062ce6c'
437                        HDR.TYPE='ASF';
438
439                elseif strncmp(ss,'MPv4',4);
440                        HDR.TYPE='MPv4';
441                        HDR.Date = ss(65:87);
442                elseif strncmp(ss,'RG64',4);
443                        HDR.TYPE='RG64';
444                elseif strncmp(ss,'DTDF',4);
445                        HDR.TYPE='DDF';
446                elseif strncmp(ss,'RSRC',4);
447                        HDR.TYPE='LABVIEW';
448                elseif strncmp(ss,'IAvSFo',6);
449                        HDR.TYPE='SIGIF';
450                elseif any(s(4)==(2:7)) && all(s([1:3,6:2:14,26])==0) ; % [int32] 2...7
451			%% high byte of month, day, hour, min, sec and bits must be zero.
452                        HDR.TYPE='EGI';
453
454                elseif (c>160) && FLAG.IS_UFF,
455                	K = strfind(ss(81:161),'    ')+80; K = K(1);
456                        HDR.TYPE=['UFF',deblank(ss(K+[0:6]))];
457
458                elseif all(s(1:4)==hex2dec(reshape('AFFEDADA',2,4)')');        % Walter Graphtek
459                        HDR.TYPE='WG1';
460                        HDR.Endianity = 'ieee-le';
461                elseif all(s(1:4)==hex2dec(reshape('DADAFEAF',2,4)')');
462                        HDR.TYPE='WG1';
463                        HDR.Endianity = 'ieee-le';
464                elseif all(s(1:4)==hex2dec(reshape('5555FEAF',2,4)')');
465                        HDR.TYPE='WG1';
466                        HDR.Endianity = 'ieee-le';
467                elseif all(s(1:4)==[14,15,23,0]);
468                        HDR.TYPE='WINEEG';
469
470                elseif strncmp(ss,'HeaderLen=',10);
471                        HDR.TYPE    = 'BCI2000';
472                        HDR.VERSION = 1;
473                elseif strncmp(ss,'BCI2000',7);
474                        HDR.TYPE    = 'BCI2000';
475                        HDR.VERSION = 1.1;
476
477                elseif (c>11) && strcmp(ss([1:4,9:12]),'RIFFCNT ')
478                        HDR.TYPE='EEProbe-CNT';     % continuous EEG in EEProbe format, ANT Software (NL) and MPI Leipzig (DE)
479                elseif all(s(1:4)==[38 0 16 0])
480                        HDR.TYPE='EEProbe-AVR';     % averaged EEG in EEProbe format, ANT Software (NL) and MPI Leipzig (DE)
481
482                elseif strncmp(ss,'eerT',4);
483                        HDR.TYPE='HEKA PatchMaster';
484                elseif strncmp(ss,'IGOR',4);
485                        HDR.TYPE='ITX';
486                elseif strncmp(ss,'ISHNE1.0',8);        % ISHNE Holter standard output file.
487                        HDR.TYPE='ISHNE';
488                elseif strncmp(ss,'rhdE',4);	% Holter Excel 2 file, not supported yet.
489                        HDR.TYPE='rhdE';
490
491                elseif strncmp(ss,'RRI',3);	% R-R interval format % Holter Excel 2 file, not supported yet.
492                        HDR.TYPE='RRI';
493                elseif strncmp(ss,'Repo',4);	% Repo Holter Excel 2 file, not supported yet.
494                        HDR.TYPE='REPO';
495                elseif strncmp(ss,'Beat',4);	% Beat file % Holter Excel 2 file, not supported yet.
496                        HDR.TYPE='Beat';
497                elseif strncmp(ss,'Evnt',4);	% Event file % Holter Excel 2 file, not supported yet.
498                        HDR.TYPE='EVNT';
499
500                elseif strncmp(ss,'CFWB',4); 	% Chart For Windows Binary data, defined by ADInstruments.
501                        HDR.TYPE='CFWB';
502                elseif strncmp(ss,'FILE FORMAT=RigSys',18); 	% RigSys file format
503                        HDR.TYPE='RigSys';
504
505                elseif any(s(3:6)*(2.^[0;8;16;24]) == (30:42))
506                        HDR.VERSION = s(3:6)*(2.^[0;8;16;24]);
507                        offset2 = s(7:10)*(2.^[0;8;16;24]);
508
509                        if     HDR.VERSION < 34, offset = 150;
510                        elseif HDR.VERSION < 35, offset = 164;
511                        elseif HDR.VERSION < 36, offset = 326;
512                        elseif HDR.VERSION < 38, offset = 886;
513                        elseif HDR.VERSION < 39, offset = 1894;
514                        elseif HDR.VERSION < 41, offset = 1896;
515                        elseif HDR.VERSION ==41, offset = 1944;
516                        else   offset = -1;
517                               fprintf(2,'Warning: Version %i of ACQ format not supported (yet).\n',HDR.VERSION);
518                        end;
519                        if (offset==offset2),
520                                HDR.TYPE = 'ACQ';
521                        end;
522
523                elseif (s(1) == 253) && (HDR.FILE.size==(s(6:7)*[1;256]+7));
524                        HDR.TYPE='AKO+';
525                elseif all(s(1:4) == [253, 174, 45, 5]);
526                        HDR.TYPE='AKO';
527                elseif all(s(1:8) == [1,16,137,0,0,225,165,4]);
528                        HDR.TYPE='ALICE4';
529
530                elseif strfind(ss,'ALPHA-TRACE-MEDICAL');
531                        HDR.TYPE='alpha';
532
533                elseif strncmp(ss,'SamplingRate=',13) && strcmp(HDR.FILE.Name,'patient'),
534                	% Freiburg Prediction Contest
535	        	% https://epilepsy.uni-freiburg.de/seizure-prediction-workshop-2007/prediction-contest/data-download
536			HDR.FEPI.PatientFile = fullfile(HDR.FILE.Path,'patient.txt');
537			fid2 = fopen(fullfile(HDR.FILE.Path,'datafiles.txt'),'r');
538			if fid2>0,
539		        	HDR.TYPE = 'FEPI3';
540		        	HDR.H1 = ss;
541				k = 0;
542				while ~feof(fid2)
543					tmp = fgetl(fid2);
544					k = k+1;
545					HDR.FEPI.ListOfDataFiles{k,1} = tmp;
546				end;
547				fclose(fid2);
548		        end;
549
550                elseif all(s(5:18)==[40,0,4,1,44,1,102,2,146,3,44,0,190,3])
551                	%HDR.FILE.size == (s(37:40)*256.^[0:3]')
552                	HDR.TYPE = 'unipro';
553                	tmp=repmat(',',1,19);
554                	tmp([1:4,6:7,9:10,12:13,15:16,18:19])=s([153:160,162:167]);
555			HDR.T0 = biosig_str2double(char(tmp));
556                	tmp([1:4,6:7,9:10])=s([128:135]);
557			HDR.Patient.Birthday = biosig_str2double(char(tmp));
558			frewind(fid);
559			HDR.s8=fread(fid,[1,inf],'uint8');
560			frewind(fid);
561			HDR.s16=fread(fid,[1,inf],'uint16');
562
563                elseif strfind(ss,'W1N10936.');
564                        ss(1:20),
565
566                elseif all(s(1:4) == [27,153,153,153]);
567                        HDR.TYPE='???';
568                        %ss(1:20),
569                elseif all(s(1:4) == [28,153,153,153]);
570                        HDR.TYPE='???';
571                        %ss(1:20),
572
573                elseif all(s(1:2)==[hex2dec('55'),hex2dec('AA')]);
574                        HDR.TYPE='RDF'; % UCSD ERPSS aquisition system
575                elseif ( (c>107) && all(reshape(s(1:32),1,[])==[abs('Synergy'),0,abs('012.003.000.000'),0,28,0,0,0,2,0,0,0]) && strcmp(ss(64:78),'CRawDataElement') && strcmp(ss(86:99),'CRawDataBuffer') ),
576                        HDR.TYPE='SYNERGY';
577			HDR.SampleRate = 50000;
578
579                elseif strncmp(ss,'Stamp',5)
580                        HDR.TYPE='XLTEK-EVENT';
581
582                elseif all(s(1:2)==[hex2dec('55'),hex2dec('3A')]);      % little endian
583                        HDR.TYPE='SEG2';
584                        HDR.Endianity = 'ieee-le';
585                elseif all(s(1:2)==[hex2dec('3A'),hex2dec('55')]);      % big endian
586                        HDR.TYPE='SEG2';
587                        HDR.Endianity = 'ieee-be';
588
589                elseif strncmp(ss,'MATLAB Data Acquisition File.',29);  % Matlab Data Acquisition File
590                        HDR.TYPE='DAQ';
591                elseif all(s(1:4)==[137,abs('HDF')]);
592                        HDR.TYPE='HDF5';
593                elseif strncmp(ss,'MATLAB 5.0 MAT-file',19);
594                        HDR.TYPE='MAT5';
595                        if (s(127:128)==abs('MI')),
596                                HDR.Endianity = 'ieee-le';
597                        elseif (s(127:128)==abs('IM')),
598                                HDR.Endianity = 'ieee-be';
599                        end;
600                elseif strncmp(ss,'Model {',7);
601                        HDR.TYPE='MDL';
602                elseif all(s(85:92)==abs('SAS FILE')); 	% FREESURVER TRIANGLE_FILE_MAGIC_NUMBER
603                        HDR.TYPE='SAS';
604
605                elseif all(s(1:16)==[15   195   123    28   207    45   109    75   138   234    31   100   206  210   185    23])
606                        HDR.TYPE='no spec (nicolet?)';
607
608                elseif any(s(1)==[49:51]) && all(s([2:4,6])==[0,50,0,0]) && any(s(5)==[49:50]),
609                        HDR.TYPE = 'WFT';	% nicolet
610
611                elseif all(s(1:3)==[255,255,254]) && FLAG.FS3,
612		%any(s==10) && all((s(4:pos1_ascii10)>=32) & (s(4:pos1_ascii10)<128)); 	% FREESURVER TRIANGLE_FILE_MAGIC_NUMBER
613                        HDR.TYPE='FS3';
614                elseif all(s(1:3)==[255,255,255]); 	% FREESURVER QUAD_FILE_MAGIC_NUMBER or CURVATURE
615                        HDR.TYPE='FS4';
616                elseif all(s(2:6)==[134,1,0,2,0]) && any(s(1)==[162:164]); 	% SCAN *.TRI file
617                        HDR.TYPE='TRI';
618
619                elseif strncmp(ss,'3D Geometry File Format ',24); % Rhino Model file
620                        HDR.TYPE='GEO:3DM';
621                elseif strncmp(ss,'Iges ',5);
622                        HDR.TYPE='GEO:IGES';
623                elseif strncmp(ss,'solid',5);
624                        HDR.TYPE='GEO:STL:ASCII';
625                elseif strncmp(ss,'STL binary file',15) && (HDR.FILE.size==(s(81:84)*256.^[3:-1:0]')*50+84);
626                        HDR.TYPE='GEO:STL:BIN';
627			HDR.Endianity='ieee-be';
628                elseif strncmp(ss,'STL binary file',15) && (HDR.FILE.size==(s(81:84)*256.^[0:3]')*50+84);
629                        HDR.TYPE='GEO:STL:BIN';
630			HDR.Endianity='ieee-le';
631                elseif strncmp(ss,'PLY',3); 	% Polygon file format
632                	% http://local.wasp.uwa.edu.au/~pbourke/dataformats/ply/
633                	% http://en.wikipedia.org/wiki/PLY_%28file_format%29
634                        HDR.TYPE='GEO:PLY';
635
636                elseif all(s(1:16)==[162 134 1 0 0 0 1 0 205 204 76 63 0 0 192 63]);
637                        HDR.TYPE='GEO:3DD';
638
639                elseif all((s(1:4)*(2.^[24;16;8;1]))==1229801286); 	% GE 5.X format image
640                        HDR.TYPE='5.X';
641
642                elseif all(s(1:2)==[105,102]);
643                        HDR.TYPE='669';
644                elseif all(s(1:2)==[234,96]);
645                        HDR.TYPE='ARJ';
646                elseif 0, s(1)==2;
647                        HDR.TYPE='DB2';
648                elseif 0, any(s(1)==[3,131]);
649                        HDR.TYPE='DB3';
650                elseif strncmp(ss,'DDMF',4);
651                        HDR.TYPE='DMF';
652                elseif strncmp(ss,'DMS',4);
653                        HDR.TYPE='DMS';
654                elseif strncmp(ss,'FAR',3);
655                        HDR.TYPE='FAR';
656                elseif all(ss(5:6)==[175,18]);
657                        HDR.TYPE='FLC';
658                elseif strncmp(ss,'GF1PATCH110',12);
659                        HDR.TYPE='GF1';
660                elseif strcmp(ss([1:6,12]),'(DWF V)');
661                        HDR.VERSION = biosig_str2double(ss(7:11));
662                        if ~isnan(HDR.VERSION),
663                                HDR.TYPE='IMAGE:DWF';           % Design Web Format  from Autodesk
664                        end;
665                elseif strncmp(ss,'GIF87a',6);
666                        HDR.TYPE='IMAGE:GIF';
667                elseif strncmp(ss,'GIF89a',6);
668                        HDR.TYPE='IMAGE:GIF';
669                elseif strncmp(ss,'CPT9FILE',8);        % Corel PhotoPaint Format
670                        HDR.TYPE='CPT9';
671
672                elseif all(s(21:28)==abs('ACR-NEMA'));
673                        HDR.TYPE='ACR-NEMA';
674
675                elseif all(s(129:132)==abs('DICM'));
676                        HDR.TYPE='DICOM';
677                elseif all(s([2,4,6:8])==0) && all(s([1,3,5]));            % DICOM candidate
678                        HDR.TYPE='DICOM';
679                elseif all(s(1:18)==[8,0,5,0,10,0,0,0,abs('ISO_IR 100')])             % DICOM candidate
680                        HDR.TYPE='DICOM';
681                elseif all(s(12+[1:18])==[8,0,5,0,10,0,0,0,abs('ISO_IR 100')])             % DICOM candidate
682                        HDR.TYPE='DICOM';
683                elseif all(s([1:8,13:20])==[8,0,0,0,4,0,0,0,8,0,5,0,10,0,0,0])            % DICOM candidate
684                        HDR.TYPE='DICOM';
685		% more about the heuristics to identify DICOM files at
686		% http://groups.google.com/groups?hl=fr&lr=&frame=right&th=cb048de7b4459bd3&seekm=9h9jrs%247jf%40news.Informatik.Uni-Oldenburg.DE#link1
687		% http://fixunix.com/dicom/545185-dicom-file-without-file-meta-information-size-preamble.html
688
689                elseif strncmp(ss,'*3DSMAX_ASCIIEXPORT',19)
690                        HDR.TYPE='ASE';
691                elseif strncmp(ss,'999',3)
692                        HDR.TYPE='DXF-Ascii';
693                elseif all(s([1:4])==[32,32,48,10])
694                        HDR.TYPE='DXF?';
695                elseif all(s([1:4])==[103,23,208,113])
696                        HDR.TYPE='DXF13';
697                elseif strncmp(ss,'AutoCAD Binary DXF',18)
698                        HDR.TYPE='DXF-Binary';
699
700                elseif all(s(1:24)==[0,0,39,10,zeros(1,20)])
701                        HDR.TYPE='SHAPE';
702
703                elseif strncmp(ss,'%!PS-Adobe',10)
704                        HDR.TYPE='PS/EPS';
705                elseif strncmp(ss,'HRCH: Softimage 4D Creative Environment',38)
706                        HDR.TYPE='HRCH';
707                elseif strncmp(ss,'#Inventor V2.0 ascii',11)
708                        HDR.TYPE='IV2';
709			HDR.VERSION = ss(12:14);
710                elseif strncmp(ss,'HRCH: Softimage 4D Creative Environment',38)
711                        HDR.TYPE='HRCH';
712                elseif all(s([1:2])==[1,218])
713                        HDR.TYPE='RGB';
714                elseif strncmp(ss,'#$SMF',5)
715                        HDR.TYPE='SMF';
716			HDR.VERSION = str2double(ss(7:10));
717                elseif strncmp(ss,'#SMF',4)
718                        HDR.TYPE='SMF';
719			HDR.VERSION = str2double(ss(5:8));
720
721                elseif all(s([1:4])==[127,abs('ELF')])
722                        HDR.TYPE='ELF';
723                elseif all(s([1:4])==[77,90,192,0])
724                        HDR.TYPE='EXE';
725                elseif all(s([1:4])==[77,90,80,0])
726                        HDR.TYPE='EXE/DLL';
727                elseif all(s([1:4])==[77,90,128,0])
728                        HDR.TYPE='DLL';
729                elseif all(s([1:4])==[77,90,144,0])
730                        HDR.TYPE='DLL';
731                elseif all(s(1:4)==hex2dec(['CA';'FE';'BA';'BE'])')
732                        HDR.TYPE='JAVA';
733                elseif all(s([1:8])==[254,237,250,206,0,0,0,18])
734                        HDR.TYPE='MEXMAC';
735
736                elseif all(s(1:33)==[208 207 17 224 161 177 26 225 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 03 00 254 255 09 00 06]);
737                        HDR.TYPE='MSI';
738                elseif all(s(1:24)==[208,207,17,224,161,177,26,225,zeros(1,16)]);	% MS-EXCEL candidate
739                        HDR.TYPE='BIFF';
740
741                elseif strncmp(lower(ss),'<?php',5)
742                        HDR.TYPE='PHP';
743		elseif ~isempty(strfind(ss,'<AnnotatedECG xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc"'))
744                        HDR.TYPE='HL7aECG';
745                elseif strncmp(ss,'<WORLD>',7)
746                        HDR.TYPE='XML';
747                elseif all(s(1:2)==[255,254]) && all(s(4:2:end)==0)
748                        HDR.TYPE='XML-UTF16';
749                elseif ~isempty(strfind(ss,'?xml version'))
750                        HDR.TYPE='XML-UTF8';
751                elseif ~isempty(strfind(ss,'Serial number'))
752                        HDR.TYPE='ASCII:IBI';
753
754                elseif strncmp(ss,'ABF',3)
755                        HDR.TYPE = ss(1:4);
756                elseif strncmp(ss,'CLPX',3)
757                        HDR.TYPE = 'ABF';
758                elseif strncmp(ss,'FTCX',3)
759                        HDR.TYPE = 'ABF';
760                elseif all(s(1:4)==[0,0,128,63])        %float(1)
761                        HDR.TYPE = 'ABF';
762                elseif all(s(1:4)==[0,0,32,65])         %float(10)
763                        HDR.TYPE = 'ABF';
764
765                elseif all(s(1:4)==abs(['ATF',9]))
766                        HDR.TYPE='ATF'; % axon text file
767                        [tmp,t]=strtok(ss,[9,10,13,32]);
768                        [tmp,t]=strtok(t,[9,10,13,32]);
769                        HDR.Version = str2double(tmp);
770
771                elseif strncmp(ss,'binterr1.3',10)
772                        HDR.TYPE='BT1.3';
773                elseif all(s([1:2,7:10])==[abs('BM'),zeros(1,4)])
774                        HDR.TYPE='IMAGE:BMP';
775                        HDR.Endianity = 'ieee-le';
776                elseif strncmp(ss,'#FIG',4)
777                        HDR.TYPE='FIG';
778			HDR.VERSION = strtok(ss(6:end),[10,13]);
779                elseif strncmp(ss,'SIMPLE  =                    T / Standard FITS format',30)
780                        HDR.TYPE='IMAGE:FITS';
781                elseif all(s(1:40)==[137,abs('HDF'),13,10,26,10,0,0,0,0,0,8,8,0,4,0,16,0,3,zeros(1,11),repmat(255,1,8)]) && (HDR.FILE.size==s(41:44)*2.^[0:8:24]')
782                        HDR.TYPE='HDF';
783                elseif strncmp(ss,'CDF',3)
784                        HDR.TYPE='NETCDF';
785                elseif strncmp(ss,'%%MatrixMarket matrix coordinate',32)
786                        HDR.TYPE='MatrixMarket';
787                elseif s(1:4)*2.^[0:8:24]'==5965600,	 % Kodac ICC format
788                        HDR.TYPE='ICC';
789			HDR.HeadLen = s(5:8)*2.^[0:8:24];
790			HDR.T0 = s([20,19,18,17,24,23]);
791                elseif strncmp(ss,'IFS',3)
792                        HDR.TYPE='IMAGE:IFS';
793                elseif strncmp(ss,'OFF',3)
794                        HDR.TYPE='OFF';
795			HDR.ND = 3;
796                elseif strncmp(ss,'4OFF',4)
797                        HDR.TYPE='OFF';
798			HDR.ND = 4;
799                elseif strncmp(ss,'.PBF',4)
800                        HDR.TYPE='PBF';
801                elseif all(s([1,3])==[10,1]) && any(s(2)==[0,2,3,5]) && any(s(4)==[1,4,8,24]) && any(s(59)==[4,3])
802                        HDR.TYPE='PCX';
803			tmp = [2.5, 0, 2.8, 2.8, 0, 3];
804                        HDR.VERSION=tmp(s(2)+1);
805			HDR.Encoding = s(3);
806			HDR.BitsPerPixel = s(4);
807			HDR.NPlanes = s(65);
808                elseif all(s(1:20)==[ 99,253,45,1,3,0,1,0,1,zeros(1,11)])
809                        HDR.TYPE='PDP';
810                        HDR.T0 = [1,256]*reshape(s(21:32),2,6);
811
812                elseif all(s(1:8)==[139,74,78,71,13,10,26,10])
813                        HDR.TYPE='IMAGE:JNG';
814                elseif all(s(1:8)==[137,80,78,71,13,10,26,10])
815                        HDR.TYPE='IMAGE:PNG';
816		elseif (ss(1)=='P') && any(ss(2)=='123')	% PBMA, PGMA, PPMA
817                        HDR.TYPE='IMAGE:PBMA';
818			id = 'BGP';
819			HDR.TYPE(8)=id(s(2)-48);
820
821		elseif (ss(1)=='P') && any(ss(2)=='456')	% PBMB, PGMB, PPMB
822                        HDR.TYPE='IMAGE:PBMB';
823			id = 'BGP';
824			HDR.TYPE(8) = id(s(2)-abs('3'));
825			[t,ss] = strtok(ss,[10,13]);
826			lt = length(t) + 1;
827			[t,ss] = strtok(ss,[10,13]);
828			lt = lt + length(t) + 1;
829			while strncmp(t,'#',1)
830				[t,ss] = strtok(ss,[10,13]);
831				lt = lt + length(t) + 1;
832			end;
833			HDR.IMAGE.Size = biosig_str2double(t);
834			[t,ss] = strtok(ss,[10,13]);
835			lt = lt + length(t) + 1;
836			HDR.DigMax  = biosig_str2double(t);
837			HDR.HeadLen = lt;
838
839                elseif strcmpi(HDR.FILE.Ext,'XBM') && ~isempty(strfind(ss,'bits[]')) && ~isempty(strfind(ss,'width')) && ~isempty(strfind(ss,'height'))
840                        HDR.TYPE='IMAGE:XBM';
841                elseif strncmp(ss,'/* XBM ',7)
842                        HDR.TYPE='IMAGE:XBM';
843                elseif strncmp(ss,'#define icon_width',7)
844                        HDR.TYPE='IMAGE:XBM';
845
846                elseif strncmp(ss,'/* XPM */',9)
847                        HDR.TYPE='IMAGE:XPM';
848
849                elseif strncmp(ss,['#  ',HDR.FILE.Name,'.poly'],8+length(HDR.FILE.Name))
850                        HDR.TYPE='POLY';
851                elseif all(s([1,3,7:12])==[255,255,abs('Exif'),0,0]) && any(s(2)==[216:217]) && any(s(4)==[224:225]);
852                        HDR.TYPE='IMAGE:EXIF';
853                        HDR.Endianity = 'ieee-be';
854                elseif all(s([1:4,7:12])==[255,216,255,225,abs('Exif'),0,0]);
855                        HDR.TYPE='IMAGE:EXIF';
856                        HDR.Endianity = 'ieee-be';
857                elseif all(s([1:3])==[255,216,255])
858                        HDR.TYPE='IMAGE:JPG-';
859                        HDR.Endianity = 'ieee-be';
860                elseif all(s([1:4,7:11])==[255,217,255,224,abs('JFIF'),0])
861                        HDR.TYPE='IMAGE:JPG1';
862                        HDR.Endianity = 'ieee-be';
863                elseif all(s([1:4,7:11])==[255,216,255,224,abs('JFIF'),0])
864                        HDR.TYPE='IMAGE:JPG2';
865                        HDR.Endianity = 'ieee-be';
866                elseif all(s(1:4)==[216,255,224,255])
867                        HDR.TYPE='IMAGE:JPG3';
868                        HDR.Endianity = 'ieee-le';
869                elseif all(s([1,3,65])==[10,1,0]) && any(s(2)==[0,2,3,4,5]) && any(s(4)==[1,2,4,8]) && any(s(66)==[1:4]) && any(s(69)==[1:2])
870                        HDR.TYPE='IMAGE:PCX';
871                        HDR.Endianity = 'ieee-le';
872                elseif all(s(1:4)==[149, 106, 166, 89])
873                        HDR.TYPE='IMAGE:SunRasterfile';
874                        HDR.Endianity = 'ieee-be';
875                elseif all(s(1:20)==['L',0,0,0,1,20,2,0,0,0,0,0,192,0,0,0,0,0,0,70])
876                        HDR.TYPE='LNK';
877                        tmp = fread(fid,inf,'uint8');
878                        HDR.LNK=[s,tmp'];
879                elseif all(s(1:111)==[0,0,1,186,68,0,4,0,4,1,1,137,195,248,0,0,1,187,0,18,128,196,225,0,225,127,185,224,232,184,192,32,189,224,58,191,224,2,0,0,1,191,7,212,80,0,0,0,0,84,47,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,64,16,0,0,0,0,74,86,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
880                        HDR.TYPE='MOVIE:MOD';
881                elseif all(s(1:3)==[0,0,1])
882                        HDR.TYPE='MOVIE:MPG2MOV';
883                elseif strcmp(ss([3:5,7]),'-lh-');
884                        HDR.TYPE='LZH';
885                elseif strcmp(ss([3:5,7]),'-lz-');
886                        HDR.TYPE='LZH';
887                elseif strcmp(ss(1:3),'MMD');
888                        HDR.TYPE='MED';
889                elseif 0, % conflict with some WFDB-data
890			%(s(1)==255) && any(s(2)>=224);
891                        HDR.TYPE='MPEG';
892                elseif strncmp(ss(5:8),'mdat',4);
893                        HDR.TYPE='MOV';
894
895                elseif all(s(1:2)==[26,63]);
896                        HDR.TYPE='OPT';
897                elseif strncmp(ss,'%PDF',4);
898                        HDR.TYPE='PDF';
899                elseif strncmp(ss,'QLIIFAX',7);
900                        HDR.TYPE='QFX';
901                elseif strncmp(ss,'.RMF',4);
902                        HDR.TYPE='RMF';
903                elseif strncmp(ss,'IREZ',4);
904                        HDR.TYPE='RMF';
905                elseif strncmp(ss,'{\rtf',5);
906                        HDR.TYPE='RTF';
907                elseif all(s(1:4)==[73,73,42,0]);
908                        HDR.TYPE='IMAGE:TIFF';
909                        HDR.Endianity = 'ieee-le';
910                        HDR.FLAG.BigTIFF = 0;
911                elseif all(s(1:4)==[77,77,0,42]);
912                        HDR.TYPE='IMAGE:TIFF';
913                        HDR.Endianity = 'ieee-be';
914                        HDR.FLAG.BigTIFF = 0;
915                elseif all(s(1:8)==[73,73,43,0,8,0,0,0]);
916                        HDR.TYPE='IMAGE:TIFF';
917                        HDR.Endianity = 'ieee-le';
918                        HDR.FLAG.BigTIFF = 1;
919                elseif all(s(1:8)==[77,77,0,43,0,8,0,0]);
920                        HDR.TYPE='IMAGE:TIFF';
921                        HDR.Endianity = 'ieee-be';
922                        HDR.FLAG.BigTIFF = 1;
923                elseif strncmp(ss,'StockChartX',11);
924                        HDR.TYPE='STX';
925                elseif all(ss(1:2)==[25,149]);
926                        HDR.TYPE='TWE';
927                elseif strncmp(ss,'TVF 1.1A',7);
928                        HDR.TYPE = ss(1:8);
929                elseif all(s(1:12)==[abs('TVF 1.1B'),1,0,0,0]);
930                        HDR.TYPE = ss(1:8);
931			HDR.Endianity = 'ieee-le';
932                elseif all(s(1:12)==[abs('TVF 1.1B'),0,0,0,1]);
933                        HDR.TYPE = ss(1:8);
934			HDR.Endianity = 'ieee-be';
935                elseif strncmp(ss,'#VRML',5);
936                        HDR.TYPE='VRML';
937                elseif strncmp(ss,'# vtk DataFile Version ',23);
938                        HDR.TYPE='VTK';
939			HDR.VERSION = ss(24:26);
940                elseif all(ss(1:5)==[0,0,2,0,4]);
941                        HDR.TYPE='WKS';
942                elseif all(ss(1:5)==[0,0,2,0,abs('Q')]);
943                        HDR.TYPE='WQ1';
944                elseif all(s(1:8)==hex2dec(['30';'26';'B2';'75';'8E';'66';'CF';'11'])');
945                        HDR.TYPE='WMV';
946
947                	% compression formats
948                elseif strncmp(ss,'BZh91AH&SY',10);
949                        HDR.TYPE='BZ2';
950                elseif all(s(1:3)==[66,90,104]);
951                        HDR.TYPE='BZ2';
952                elseif strncmp(ss,'MSCF',4);
953                        HDR.TYPE='CAB';
954                elseif all(s(1:3)==[31,139,8]);
955                        HDR.TYPE='gzip';
956                        if exist('OCTAVE_VERSION','builtin')
957                                fclose(fid);
958                                HDR.FILE.PERMISSION = [HDR.FILE.PERMISSION ,'z'];
959                                HDR = getfiletype(HDR);
960                                return;
961                        end;
962                elseif all(s(1:3)==[31,157,144]);
963                        HDR.TYPE='Z';
964                elseif all(s([1:4])==[80,75,3,4]) && (c>=30)
965                        HDR.TYPE='ZIP';
966                        HDR.VERSION = s(5:6)*[1;256];
967                        HDR.ZIP.FLAG = s(7:8);
968                        HDR.ZIP.CompressionMethod = s(9:10);
969
970                        % converting MS-Dos Date*Time format
971                        tmp = s(11:14)*2.^[0:8:31]';
972                        HDR.T0(6) = rem(tmp,2^5)*2;	tmp=floor(tmp/2^5);
973                        HDR.T0(5) = rem(tmp,2^6);	tmp=floor(tmp/2^6);
974                        HDR.T0(4) = rem(tmp,2^5);	tmp=floor(tmp/2^5);
975                        HDR.T0(3) = rem(tmp,2^5);	tmp=floor(tmp/2^5);
976                        HDR.T0(2) = rem(tmp,2^4); 	tmp=floor(tmp/2^4);
977                        HDR.T0(1) = 1980+tmp;
978
979                        HDR.ZIP.CRC = s(15:18)*2.^[0:8:31]';
980                        HDR.ZIP.size2 = s(19:22)*2.^[0:8:31]';
981                        HDR.ZIP.size1 = s(23:26)*2.^[0:8:31]';
982                        HDR.ZIP.LengthFileName = s(27:28)*[1;256];
983                        HDR.ZIP.filename = char(s(31:min(c,30+HDR.ZIP.LengthFileName)));
984                        HDR.ZIP.LengthExtra = s(29:30)*[1;256];
985                        HDR.HeadLen = 30 + HDR.ZIP.LengthFileName + HDR.ZIP.LengthExtra;
986                        HDR.ZIP.tmp = char(s);
987                        HDR.ZIP.Extra = s(31+HDR.ZIP.LengthFileName:min(c,HDR.HeadLen));
988                        if 1,
989                        elseif strncmp(ss(31:end),'mimetypeapplication/vnd.sun.xml.writer',38)
990                                HDR.TYPE='SWX';
991                        elseif strncmp(ss(31:end),'mimetypeapplication/vnd.oasis.opendocument.spreadsheet',38)
992                                HDR.TYPE='ODS';
993                        end;
994                elseif strncmp(ss,'ZYXEL',5);
995                        HDR.TYPE='ZYXEL';
996                elseif strcmpi([HDR.FILE.Name,' '],ss(1:length(HDR.FILE.Name)+1)) && any(ss(length(HDR.FILE.Name)+2)==' 0123456789');
997                        HDR.TYPE='MIT';
998                elseif strcmpi(HDR.FILE.Name,ss(1:length(HDR.FILE.Name)))
999                        HDR.TYPE='TAR?';
1000                elseif strncmp(ss,['# ',HDR.FILE.Name],length(HDR.FILE.Name)+2);
1001                        HDR.TYPE='SMNI';
1002
1003                elseif mat4.flag,
1004		%(c>20) && (s(1:4)*256.^[0:3]'<4053) && any(s(13)==[0,1]) && all(s(14:16)==0) && any(s(17:20)>0) && all(mat4.matrixname>='0' && mat4.matrixname<='z') && ~mat4.matrixname(20+mat4.matrixname_len) && all(any(mat4.type(ones(6,1),:)==[0,0:4;zeros(1,6);0:5;0:2,0,0,0]')),
1005		%& (type_mat4(1)==(0:4)) && (type_mat4(2)==0) && (type_mat4(3)==(0:5)) && (type_mat4(4)==(0:2))
1006			% should be last, otherwise to many false detections
1007                        HDR.TYPE = 'MAT4';
1008                        HDR.MAT4 = mat4;
1009			if mat4.type(1)=='0'
1010				HDR.MAT4.opentyp = 'ieee-le';
1011			elseif mat4.type(1)=='1'
1012				HDR.MAT4.opentyp = 'ieee-be';
1013			elseif mat4.type(1)=='2'
1014				HDR.MAT4.opentyp = 'vaxd';
1015			elseif mat4.type(1)=='3'
1016				HDR.MAT4.opentyp = 'vaxg';
1017			elseif mat4.type(1)=='4'
1018				HDR.MAT4.opentyp = 'cray';
1019                        end;
1020
1021                elseif ~isempty(strfind(ss,'### Table of event codes.'))
1022                        fseek(fid,0,-1);
1023                        line = fgetl(fid);
1024                        N1 = 0; N2 = 0;
1025                        while ~feof(fid),%length(line),
1026                                if 0,
1027                                elseif strncmp(line,'0x',2),
1028                                        N1 = N1 + 1;
1029                                        [ix,desc] = strtok(line,char([9,32,13,10]));
1030                                        ix = hex2dec(ix(3:end));
1031                                        HDR.EVENT.CodeDesc{N1,1} = desc(2:end);
1032                                        HDR.EVENT.CodeIndex(N1,1) = ix;
1033                                elseif strncmp(line,'### 0x',6)
1034                                        N2 = N2 + 1;
1035                                        HDR.EVENT.GroupDesc{N2,1} = line(12:end);
1036                                        tmp = line(7:10);
1037                                        HDR.EVENT.GroupIndex{N2,1} = tmp;
1038                                        tmp1 = tmp; tmp1(tmp~='_') = 'F'; tmp1(tmp=='_')='0';
1039                                        HDR.EVENT.GroupMask(N2,1)  = bitand(hex2dec(tmp1),hex2dec('7FFF'));
1040                                        tmp1 = tmp; tmp1(tmp=='_') = '0';
1041                                        HDR.EVENT.GroupValue(N2,1) = hex2dec(tmp1);
1042                                end;
1043                                line = fgetl(fid);
1044                        end;
1045                        HDR.TYPE = 'EVENTCODES';
1046                        global BIOSIG_GLOBAL
1047			BIOSIG_GLOBAL.EVENT = HDR.EVENT;
1048			BIOSIG_GLOBAL.ISLOADED_EVENTCODES = 1;
1049
1050                elseif strcmp(HDR.FILE.Ext,'Markers') && strcmp(ss(1:14),'Sampling rate:'),
1051			HDR.EVENT.SampleRate = str2double(ss(15:strfind(ss,'Hz')-1));
1052			[t,r]=strtok(ss,char([10,13]));
1053			[t,r]=strtok(r,char([10,13]));
1054			[t,r]=strtok(r,char([10,13]));
1055			k = 1;
1056			while sum(t==',')>3,
1057				[n,v,sa] = biosig_str2double(t,', ');
1058				Desc{k,1} = sa{2};
1059				HDR.EVENT.POS(k,1) = n(3);
1060				HDR.EVENT.DUR(k,1) = n(4);
1061				if isnan(n(5))
1062					HDR.EVENT.CHN(k,1) = 0;
1063				else
1064					HDR.EVENT.CHN(k,1) = n(5);
1065				end
1066				k = k+1;
1067				[t,r]=strtok(r,char([10,13]));
1068			end;
1069			[HDR.EVENT.CodeDesc,ix,HDR.EVENT.TYP]=unique(Desc);
1070			HDR.TYPE='EVENT';
1071
1072                elseif ~strcmp(version,'3.5') %% exclude FreeMat v3.5
1073                        HDR.TYPE='unknown';
1074
1075                        status = fseek(fid,3228,-1);
1076                        [s0,c]=fread(fid,[1,4],'uint8');
1077			if (status && (c==4))
1078			if all((s0(1:4)*(2.^[24;16;8;1]))==1229801286); 	% GE LX2 format image
1079                                HDR.TYPE='LX2';
1080                        end;
1081			end;
1082
1083                elseif (c>176) && any(s(176)==[0:4])
1084                        HDR.TYPE='MicroMed TRC';
1085
1086                else
1087                        HDR.TYPE='unknown';
1088
1089                end;
1090                if strcmp(HDR.TYPE,'unknown')
1091                        fseek(fid,0,'bof');
1092                        [s,len] = fread(fid,[1,min(1e5,HDR.FILE.size)],'uint8');
1093                        HDR.FLAG.ASCII = all((s>=32) | (s==9) | (s==10) | (s==13));
1094                        if HDR.FLAG.ASCII,
1095                                HDR.s = char(s);
1096                                s = HDR.s;
1097                        end;
1098
1099                        if all((s==32) | ((s>='0') & (s<='9'))) && strcmpi(HDR.FILE.Ext,'DCD') && (len>=3000);
1100	                        s = s(1:3000);
1101                        	HDR.HeadLen = 3000;
1102                        	HDR.TYPE = 'CSE-database';
1103                        end;
1104                end;
1105
1106        end;
1107        fclose(fid);
1108
1109        if strcmpi(HDR.TYPE,'unknown'),
1110                % alpha-TRACE Medical software
1111                if exist(fullfile(HDR.FILE.Path,'alpha.alp'),'file')
1112                        %HDR.TYPE = 'alpha'; %alpha trace medical software
1113                        HDR = getfiletype(fullfile(HDR.FILE.Path,'alpha.alp'));
1114                        if strcmp(HDR.TYPE,'alpha')
1115                                return;
1116                        end;
1117                end;
1118
1119                %%% this is the file type check based on the file extionsion, only.
1120                if 0,
1121
1122                elseif exist(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.dm6']),'file') && exist(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.chn']),'file') && exist(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.log']),'file'),
1123                	% Nakamura dataset from S. Bressler
1124                	HDR.TYPE='nakamura';
1125
1126
1127                elseif strcmpi(HDR.FILE.Ext,'HEA'),
1128                        % MIT-ECG / Physiobank format
1129                	HDR.TYPE='MIT';
1130
1131		elseif length(HDR.FILE.Ext) && any(strcmp(HDR.FILE.Ext,{'16a','abp','al','apn','ari','atr','atr-','ecg','pap','ple','qrs','qrsc','sta','stb','stc'})),
1132			% Physiobank annotation files
1133			HDR.TYPE='MIT-ATR';
1134
1135                elseif strcmpi(HDR.FILE.Ext,'DAT')
1136			if HDR.FLAG.ASCII,
1137				ix = find(HDR.s(1:120)==10);
1138				ix1 = strfind(HDR.s(1:120),'Andrews & Herzberg (1985)');
1139
1140				if (length(ix1)>0)
1141					HDR.TYPE = 'AndrewsHerzberg1985';
1142				elseif (length(ix) > 3)
1143					line = HDR.s(1:ix(1)-1);
1144					[n,v,sa] = biosig_str2double(line);
1145					HDR.SampleRate = 1000/n(1);
1146					%HDR.EVENT.POS = n([2,4])/1000*HDR.SampleRate;
1147					%HDR.EVENT.DUR = (n([3,5])-n([2,4]))/1000*HDR.SampleRate;
1148					%HDR.EVENT.TYP = [hex2dec('502');hex2dec('503');hex2dec('506')];
1149					line = HDR.s(ix(1)+1:ix(2)-1);
1150					[n,v,sa] = biosig_str2double(line);
1151					HDR.Patient.Sex = strncmpi(sa{3},'M',1) + strncmpi(sa{3},'F',1)*2;
1152					HDR.Patient.Age = n(4);
1153					line = HDR.s(ix(2)+1:ix(3)-1);
1154					[n,v,sa] = biosig_str2double(line);
1155					line = HDR.s(ix(3)+1:ix(4)-1);
1156
1157					HDR.HeadLen = ix(4);
1158					fid = fopen(HDR.FileName,'r');
1159		                        [HDR.data,len] = fread(fid,[1,1e7],'uint8');
1160					fclose(fid);
1161					HDR.TYPE = 'CinC2007Challenge';
1162					return;
1163				end
1164			end
1165
1166                        tmp = dir(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.hea']));
1167                        if isempty(tmp),
1168                                tmp = dir(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.HEA']));
1169                        end
1170                        if ~isempty(tmp),
1171                                HDR.TYPE='MIT';
1172                                [tmp,tmp1,tmp2] = fileparts(tmp.name);
1173                                HDR.FILE.Ext = tmp2(2:end);
1174                        end
1175                        if isempty(tmp),
1176                                tmp = dir(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.set']));      % EEGLAB file
1177                        end
1178                        if isempty(tmp),
1179                                tmp = dir(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.vhdr']));
1180                        end
1181                        if isempty(tmp),
1182                                tmp = dir(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.VHDR']));
1183                        end
1184                        if ~isempty(tmp),
1185                                HDR = getfiletype(fullfile(HDR.FILE.Path,tmp.name));
1186                        end
1187
1188                elseif strcmpi(HDR.FILE.Ext,'flt') && exist([HDR.FileName,'.hdr'],'file');
1189                        HDR.TYPE = 'ET-MEG'; % ET-MEG format
1190                        HDR.FileName = [HDR.FileName,'.hdr'];
1191                elseif strcmpi(HDR.FILE.Ext,'bin') && exist([HDR.FileName,'.hdr'],'file');
1192                        HDR.TYPE = 'ET-MEG'; % ET-MEG format
1193                        HDR.FileName = [HDR.FileName,'.hdr'];
1194                elseif strcmpi(HDR.FILE.Ext,'int') && exist([HDR.FileName,'.hdr'],'file');
1195                        HDR.TYPE = 'ET-MEG'; % ET-MEG format
1196                        HDR.FileName = [HDR.FileName,'.hdr'];
1197                elseif strcmpi(HDR.FILE.Ext,'hdr') && exist(fullfile(HDR.FILE.Path,HDR.FILE.Name),'file');
1198                        HDR.TYPE = 'ET-MEG'; % ET-MEG format
1199                        %HDR.FileName = fullfile(HDR.FILE.Path,HDR.FILE.Name);
1200
1201                elseif strcmpi(HDR.FILE.Ext,'rhf'),
1202                        HDR.FileName=fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.',HDR.FILE.Ext]);
1203                        HDR.TYPE = 'RG64';
1204                elseif strcmp(HDR.FILE.Ext,'rdf'),
1205                        HDR.FileName=fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.',HDR.FILE.Ext(1),'h',HDR.FILE.Ext(3)]);
1206                        HDR.TYPE = 'RG64';
1207                elseif strcmp(HDR.FILE.Ext,'RDF'),
1208                        HDR.FileName=fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.',HDR.FILE.Ext(1),'H',HDR.FILE.Ext(3)]);
1209                        HDR.TYPE = 'RG64';
1210
1211                elseif strcmpi([HDR.FILE.Name,'.',HDR.FILE.Ext],'alldata.bin')
1212                	if exist(fullfile(HDR.FILE.Path,'alldata.bin'),'file')
1213                	if exist(fullfile(HDR.FILE.Path,'lefttrain.events'),'file')
1214                	if exist(fullfile(HDR.FILE.Path,'righttrain.events'),'file')
1215                	if exist(fullfile(HDR.FILE.Path,'test.events'),'file')
1216	                	HDR.TYPE = 'BCI2002b';
1217                	end;end;end;end;
1218
1219                elseif strcmpi(HDR.FILE.Ext,'txt') && (any(strfind(HDR.FILE.Path,'a34lkt')) || any(strfind(HDR.FILE.Path,'egl2ln'))) && any(strncmp(HDR.FILE.Name,{'Traindata_0','Traindata_1','Testdata'}))
1220                        HDR.TYPE = 'BCI2003_Ia+b';
1221
1222                elseif any(strcmp(HDR.FILE.Name,{'x_train','x_test'}))
1223                        HDR.TYPE = 'BCI2003_III';
1224
1225                elseif strcmpi(HDR.FILE.Ext,'hdm')
1226
1227                elseif strcmpi(HDR.FILE.Ext,'hc')
1228
1229                elseif strcmpi(HDR.FILE.Ext,'shape')
1230
1231                elseif strcmpi(HDR.FILE.Ext,'shape_info')
1232
1233                elseif strcmpi(HDR.FILE.Ext,'trg') && HDR.FLAG.ASCII
1234                	HDR.TYPE = 'EEProbe-TRG';
1235
1236                elseif strcmpi(HDR.FILE.Ext,'ainf') && HDR.FLAG.ASCII && exist(fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.raw']),'file')
1237                	HDR.TYPE = 'AINF';
1238
1239                elseif strcmpi(HDR.FILE.Ext,'rej')
1240
1241                elseif strcmpi(HDR.FILE.Ext,'vol')
1242
1243                elseif strcmpi(HDR.FILE.Ext,'bnd')
1244
1245                elseif strcmpi(HDR.FILE.Ext,'msm')
1246
1247                elseif strcmpi(HDR.FILE.Ext,'msr')
1248                        HDR.TYPE = 'ASA2';    % ASA version 2.x, see http://www.ant-software.nl
1249
1250                elseif strcmpi(HDR.FILE.Ext,'dip')
1251
1252                elseif strcmpi(HDR.FILE.Ext,'mri')
1253
1254                elseif strcmpi(HDR.FILE.Ext,'iso')
1255
1256                elseif strcmpi(HDR.FILE.Ext,'hdr')
1257
1258                elseif strcmpi(HDR.FILE.Ext,'img')
1259
1260                elseif strcmpi(HDR.FILE.Ext,'ddt')
1261%                        HDR.TYPE = 'DDT';
1262                elseif strcmpi(HDR.FILE.Ext,'sx')
1263                        HDR.TYPE = 'SXI';
1264                elseif strcmpi(HDR.FILE.Ext,'sxi')
1265                        HDR.TYPE = 'SXI';
1266                elseif strcmpi(HDR.FILE.Ext,'nxa')
1267                        HDR.TYPE = 'NXA';
1268                elseif strcmpi(HDR.FILE.Ext,'nxe')
1269                        HDR.TYPE = 'NXA';
1270
1271                elseif strcmpi(HDR.FILE.Ext,'ent')
1272			HDR.TYPE = 'XLTEK-EVENT';
1273                elseif strcmpi(HDR.FILE.Ext,'erd')
1274			HDR.TYPE = 'XLTEK';
1275
1276                elseif strcmpi(HDR.FILE.Ext,'etc')
1277			HDR.TYPE = 'XLTEK-ETC';
1278			fid = fopen(HDR.FileName,'r');
1279			fseek(fid,355,'bof');
1280			HDR.TIMESTAMP = fread(fid,1,'int32');
1281			fclose(fid);
1282
1283                        % the following are Brainvision format, see http://www.brainproducts.de
1284                elseif strcmpi(HDR.FILE.Ext,'seg') || strcmpi(HDR.FILE.Ext,'vmrk')
1285                        % If this is really a BrainVision file, there should also be a
1286                        % header with the same name and extension *.vhdr.
1287                        tmp = fullfile(HDR.FILE.Path, [HDR.FILE.Name '.vhdr']);
1288                        if exist(tmp, 'file')
1289                                tmp = fullfile(HDR.FILE.Path, [HDR.FILE.Name '.VHDR']);
1290                        end;
1291                        if exist(tmp, 'file')
1292                                HDR = getfiletype(tmp);
1293                        end
1294
1295                elseif strcmpi(HDR.FILE.Ext,'vabs')
1296
1297                elseif strcmpi(HDR.FILE.Ext,'bni')        %%% Nicolet files
1298                        tmp = fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.eeg']);  % nicolet
1299                        if exist(tmp,'file'),      % Nicolet
1300                                HDR = getfiletype(tmp);
1301                        end
1302
1303                elseif strcmpi(HDR.FILE.Ext,'eeg')
1304                        tmp = fullfile(HDR.FILE.Path,[HDR.FILE.Name,'.vhdr']);  % brainvision header file
1305                        if ~exist(tmp,'file'),          % brain vision
1306                                tmp = fullfile(HDR.FILE.Path, [HDR.FILE.Name '.bni']);   % nicolet
1307                        end
1308                        if exist(tmp,'file')
1309                                HDR = getfiletype(tmp);
1310                        end;
1311
1312                elseif strcmpi(HDR.FILE.Ext,'fif')
1313                        HDR.TYPE = 'FIF';	% Neuromag MEG data (company is now part of 4D Neuroimaging)
1314
1315                elseif strcmpi(HDR.FILE.Ext,'bdip')
1316
1317	        elseif strcmpi(HDR.FILE.Ext,'json') && exist('loadjson','file');
1318			X = loadjson(HDR.FileName);
1319			if isfield(X,'dtype') && isfield(X,'shape') && isnumeric(X.shape) && (numel(X.shape)==2)
1320				% https://www.janelia.org/lab/svoboda-lab/data
1321				HDR.TYPE = 'SvobodaLab';
1322				HDR.NS  = X.shape(1);
1323				HDR.SPR = X.shape(2);
1324				HDR.Svoboda = X;
1325			end
1326
1327	        elseif strcmpi(HDR.FILE.Ext,'json') && ~exist('loadjson','file')
1328			fprintf(2,'Cannot load JSON file because function "loadjson(...)" is not available');
1329
1330                elseif strcmpi(HDR.FILE.Ext,'ela')
1331
1332                elseif strcmpi(HDR.FILE.Ext,'trl')
1333
1334                elseif (length(HDR.FILE.Ext)>2) && all(s>31),
1335                        if all(HDR.FILE.Ext(1:2)=='0') && any(abs(HDR.FILE.Ext(3))==abs([48:57])),	% WSCORE scoring file
1336                                x = load('-ascii',HDR.FileName);
1337                                HDR.EVENT.POS = x(:,1);
1338                                HDR.EVENT.WSCORETYP = x(:,2);
1339                                HDR.TYPE = 'WCORE_EVENT';
1340                        end;
1341
1342                elseif strcmpi(HDR.FILE.Ext,'hgt') && (rem(sqrt(HDR.FILE.size/2),1)==0)
1343                	HDR.TYPE = 'IMAGE:HGT';
1344
1345                end;
1346        end;
1347
1348        if 0, strcmpi(HDR.TYPE,'unknown'),
1349                try
1350                        [status, HDR.XLS.sheetNames] = xlsfinfo(HDR.FileName)
1351                        if ~isempty(status)
1352                                HDR.TYPE = 'EXCEL';
1353                        end;
1354                catch
1355                end;
1356        end;
1357end;
1358