PageRenderTime 107ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/examples/toolboxes/fieldtrip/fileio/private/loadcnt.m

http://brainstream.googlecode.com/
MATLAB | 596 lines | 451 code | 40 blank | 105 comment | 39 complexity | 6e189bd6cc949d53bb7dd274ba64af0e MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, LGPL-2.0, GPL-3.0, GPL-2.0, LGPL-2.1, LGPL-3.0, BSD-2-Clause
  1. % loadcnt() - Load a Neuroscan continuous signal file.
  2. %
  3. % Usage:
  4. % >> cnt = loadcnt(file, varargin)
  5. %
  6. % Inputs:
  7. % filename - name of the file with extension
  8. %
  9. % Optional inputs:
  10. % 't1' - start at time t1, default 0
  11. % 'sample1' - start at sample1, default 0, overrides t1
  12. % 'lddur' - duration of segment to load, default = whole file
  13. % 'ldnsamples' - number of samples to load, default = whole file,
  14. % overrides lddur
  15. % 'scale' - ['on'|'off'] scale data to microvolt (default:'on')
  16. % 'dataformat' - ['int16'|'int32'] default is 'int16' for 16-bit data.
  17. % Use 'int32' for 32-bit data.
  18. % 'blockread' - [integer] by default it is automatically determined
  19. % from the file header, though sometimes it finds an
  20. % incorect value, so you may want to enter a value manually
  21. % here (1 is the most standard value).
  22. % 'memmapfile' - ['memmapfile_name'] use this option if the .cnt file
  23. % is too large to read in conventially. The suffix of
  24. % the memmapfile_name must be .fdt. The memmapfile
  25. % functions process files based on their suffix, and an
  26. % error will occur if you use a different suffix.
  27. %
  28. % Outputs:
  29. % cnt - structure with the continuous data and other informations
  30. % cnt.header
  31. % cnt.electloc
  32. % cnt.data
  33. % cnt.tag
  34. %
  35. % Authors: Sean Fitzgibbon, Arnaud Delorme, 2000-
  36. %
  37. % Note: function original name was load_scan41.m
  38. %
  39. % Known limitations:
  40. % For more see http://www.cnl.salk.edu/~arno/cntload/index.html
  41. %123456789012345678901234567890123456789012345678901234567890123456789012
  42. % Copyright (C) 2000 Sean Fitzgibbon, <psspf@id.psy.flinders.edu.au>
  43. % Copyright (C) 2003 Arnaud Delorme, Salk Institute, arno@salk.edu
  44. %
  45. % This program is free software; you can redistribute it and/or modify
  46. % it under the terms of the GNU General Public License as published by
  47. % the Free Software Foundation; either version 2 of the License, or
  48. % (at your option) any later version.
  49. %
  50. % This program is distributed in the hope that it will be useful,
  51. % but WITHOUT ANY WARRANTY; without even the implied warranty of
  52. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  53. % GNU General Public License for more details.
  54. %
  55. % You should have received a copy of the GNU General Public License
  56. % along with this program; if not, write to the Free Software
  57. % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  58. %
  59. function [f,lab,ev2p] = loadcnt(filename,varargin)
  60. if ~isempty(varargin)
  61. r=struct(varargin{:});
  62. else r = [];
  63. end;
  64. try, r.t1; catch, r.t1=0; end
  65. try, r.sample1; catch, r.sample1=[]; end
  66. try, r.lddur; catch, r.lddur=[]; end
  67. try, r.ldnsamples; catch, r.ldnsamples=[]; end
  68. try, r.scale; catch, r.scale='on'; end
  69. try, r.blockread; catch, r.blockread = []; end
  70. try, r.dataformat; catch, r.dataformat = 'int16'; end
  71. try, r.memmapfile; catch, r.memmapfile = ''; end
  72. sizeEvent1 = 8 ; %%% 8 bytes for Event1
  73. sizeEvent2 = 19 ; %%% 19 bytes for Event2
  74. sizeEvent3 = 19 ; %%% 19 bytes for Event3
  75. type='cnt';
  76. if nargin ==1
  77. scan=0;
  78. end
  79. fid = fopen(filename,'r', 'l');
  80. disp(['Loading file ' filename ' ...'])
  81. h.rev = fread(fid,12,'char');
  82. h.nextfile = fread(fid,1,'long');
  83. h.prevfile = fread(fid,1,'ulong');
  84. h.type = fread(fid,1,'char');
  85. h.id = fread(fid,20,'char');
  86. h.oper = fread(fid,20,'char');
  87. h.doctor = fread(fid,20,'char');
  88. h.referral = fread(fid,20,'char');
  89. h.hospital = fread(fid,20,'char');
  90. h.patient = fread(fid,20,'char');
  91. h.age = fread(fid,1,'short');
  92. h.sex = fread(fid,1,'char');
  93. h.hand = fread(fid,1,'char');
  94. h.med = fread(fid,20, 'char');
  95. h.category = fread(fid,20, 'char');
  96. h.state = fread(fid,20, 'char');
  97. h.label = fread(fid,20, 'char');
  98. h.date = fread(fid,10, 'char');
  99. h.time = fread(fid,12, 'char');
  100. h.mean_age = fread(fid,1,'float');
  101. h.stdev = fread(fid,1,'float');
  102. h.n = fread(fid,1,'short');
  103. h.compfile = fread(fid,38,'char');
  104. h.spectwincomp = fread(fid,1,'float');
  105. h.meanaccuracy = fread(fid,1,'float');
  106. h.meanlatency = fread(fid,1,'float');
  107. h.sortfile = fread(fid,46,'char');
  108. h.numevents = fread(fid,1,'int');
  109. h.compoper = fread(fid,1,'char');
  110. h.avgmode = fread(fid,1,'char');
  111. h.review = fread(fid,1,'char');
  112. h.nsweeps = fread(fid,1,'ushort');
  113. h.compsweeps = fread(fid,1,'ushort');
  114. h.acceptcnt = fread(fid,1,'ushort');
  115. h.rejectcnt = fread(fid,1,'ushort');
  116. h.pnts = fread(fid,1,'ushort');
  117. h.nchannels = fread(fid,1,'ushort');
  118. h.avgupdate = fread(fid,1,'ushort');
  119. h.domain = fread(fid,1,'char');
  120. h.variance = fread(fid,1,'char');
  121. h.rate = fread(fid,1,'ushort'); % A USER CLAIMS THAT SAMPLING RATE CAN BE
  122. h.scale = fread(fid,1,'double'); % FRACTIONAL IN NEUROSCAN WHICH IS
  123. h.veogcorrect = fread(fid,1,'char'); % OBVIOUSLY NOT POSSIBLE HERE (BUG 606)
  124. h.heogcorrect = fread(fid,1,'char');
  125. h.aux1correct = fread(fid,1,'char');
  126. h.aux2correct = fread(fid,1,'char');
  127. h.veogtrig = fread(fid,1,'float');
  128. h.heogtrig = fread(fid,1,'float');
  129. h.aux1trig = fread(fid,1,'float');
  130. h.aux2trig = fread(fid,1,'float');
  131. h.heogchnl = fread(fid,1,'short');
  132. h.veogchnl = fread(fid,1,'short');
  133. h.aux1chnl = fread(fid,1,'short');
  134. h.aux2chnl = fread(fid,1,'short');
  135. h.veogdir = fread(fid,1,'char');
  136. h.heogdir = fread(fid,1,'char');
  137. h.aux1dir = fread(fid,1,'char');
  138. h.aux2dir = fread(fid,1,'char');
  139. h.veog_n = fread(fid,1,'short');
  140. h.heog_n = fread(fid,1,'short');
  141. h.aux1_n = fread(fid,1,'short');
  142. h.aux2_n = fread(fid,1,'short');
  143. h.veogmaxcnt = fread(fid,1,'short');
  144. h.heogmaxcnt = fread(fid,1,'short');
  145. h.aux1maxcnt = fread(fid,1,'short');
  146. h.aux2maxcnt = fread(fid,1,'short');
  147. h.veogmethod = fread(fid,1,'char');
  148. h.heogmethod = fread(fid,1,'char');
  149. h.aux1method = fread(fid,1,'char');
  150. h.aux2method = fread(fid,1,'char');
  151. h.ampsensitivity = fread(fid,1,'float');
  152. h.lowpass = fread(fid,1,'char');
  153. h.highpass = fread(fid,1,'char');
  154. h.notch = fread(fid,1,'char');
  155. h.autoclipadd = fread(fid,1,'char');
  156. h.baseline = fread(fid,1,'char');
  157. h.offstart = fread(fid,1,'float');
  158. h.offstop = fread(fid,1,'float');
  159. h.reject = fread(fid,1,'char');
  160. h.rejstart = fread(fid,1,'float');
  161. h.rejstop = fread(fid,1,'float');
  162. h.rejmin = fread(fid,1,'float');
  163. h.rejmax = fread(fid,1,'float');
  164. h.trigtype = fread(fid,1,'char');
  165. h.trigval = fread(fid,1,'float');
  166. h.trigchnl = fread(fid,1,'char');
  167. h.trigmask = fread(fid,1,'short');
  168. h.trigisi = fread(fid,1,'float');
  169. h.trigmin = fread(fid,1,'float');
  170. h.trigmax = fread(fid,1,'float');
  171. h.trigdir = fread(fid,1,'char');
  172. h.autoscale = fread(fid,1,'char');
  173. h.n2 = fread(fid,1,'short');
  174. h.dir = fread(fid,1,'char');
  175. h.dispmin = fread(fid,1,'float');
  176. h.dispmax = fread(fid,1,'float');
  177. h.xmin = fread(fid,1,'float');
  178. h.xmax = fread(fid,1,'float');
  179. h.automin = fread(fid,1,'float');
  180. h.automax = fread(fid,1,'float');
  181. h.zmin = fread(fid,1,'float');
  182. h.zmax = fread(fid,1,'float');
  183. h.lowcut = fread(fid,1,'float');
  184. h.highcut = fread(fid,1,'float');
  185. h.common = fread(fid,1,'char');
  186. h.savemode = fread(fid,1,'char');
  187. h.manmode = fread(fid,1,'char');
  188. h.ref = fread(fid,10,'char');
  189. h.rectify = fread(fid,1,'char');
  190. h.displayxmin = fread(fid,1,'float');
  191. h.displayxmax = fread(fid,1,'float');
  192. h.phase = fread(fid,1,'char');
  193. h.screen = fread(fid,16,'char');
  194. h.calmode = fread(fid,1,'short');
  195. h.calmethod = fread(fid,1,'short');
  196. h.calupdate = fread(fid,1,'short');
  197. h.calbaseline = fread(fid,1,'short');
  198. h.calsweeps = fread(fid,1,'short');
  199. h.calattenuator = fread(fid,1,'float');
  200. h.calpulsevolt = fread(fid,1,'float');
  201. h.calpulsestart = fread(fid,1,'float');
  202. h.calpulsestop = fread(fid,1,'float');
  203. h.calfreq = fread(fid,1,'float');
  204. h.taskfile = fread(fid,34,'char');
  205. h.seqfile = fread(fid,34,'char');
  206. h.spectmethod = fread(fid,1,'char');
  207. h.spectscaling = fread(fid,1,'char');
  208. h.spectwindow = fread(fid,1,'char');
  209. h.spectwinlength = fread(fid,1,'float');
  210. h.spectorder = fread(fid,1,'char');
  211. h.notchfilter = fread(fid,1,'char');
  212. h.headgain = fread(fid,1,'short');
  213. h.additionalfiles = fread(fid,1,'int');
  214. h.unused = fread(fid,5,'char');
  215. h.fspstopmethod = fread(fid,1,'short');
  216. h.fspstopmode = fread(fid,1,'short');
  217. h.fspfvalue = fread(fid,1,'float');
  218. h.fsppoint = fread(fid,1,'short');
  219. h.fspblocksize = fread(fid,1,'short');
  220. h.fspp1 = fread(fid,1,'ushort');
  221. h.fspp2 = fread(fid,1,'ushort');
  222. h.fspalpha = fread(fid,1,'float');
  223. h.fspnoise = fread(fid,1,'float');
  224. h.fspv1 = fread(fid,1,'short');
  225. h.montage = fread(fid,40,'char');
  226. h.eventfile = fread(fid,40,'char');
  227. h.fratio = fread(fid,1,'float');
  228. h.minor_rev = fread(fid,1,'char');
  229. h.eegupdate = fread(fid,1,'short');
  230. h.compressed = fread(fid,1,'char');
  231. h.xscale = fread(fid,1,'float');
  232. h.yscale = fread(fid,1,'float');
  233. h.xsize = fread(fid,1,'float');
  234. h.ysize = fread(fid,1,'float');
  235. h.acmode = fread(fid,1,'char');
  236. h.commonchnl = fread(fid,1,'uchar');
  237. h.xtics = fread(fid,1,'char');
  238. h.xrange = fread(fid,1,'char');
  239. h.ytics = fread(fid,1,'char');
  240. h.yrange = fread(fid,1,'char');
  241. h.xscalevalue = fread(fid,1,'float');
  242. h.xscaleinterval = fread(fid,1,'float');
  243. h.yscalevalue = fread(fid,1,'float');
  244. h.yscaleinterval = fread(fid,1,'float');
  245. h.scaletoolx1 = fread(fid,1,'float');
  246. h.scaletooly1 = fread(fid,1,'float');
  247. h.scaletoolx2 = fread(fid,1,'float');
  248. h.scaletooly2 = fread(fid,1,'float');
  249. h.port = fread(fid,1,'short');
  250. h.numsamples = fread(fid,1,'ulong');
  251. h.filterflag = fread(fid,1,'char');
  252. h.lowcutoff = fread(fid,1,'float');
  253. h.lowpoles = fread(fid,1,'short');
  254. h.highcutoff = fread(fid,1,'float');
  255. h.highpoles = fread(fid,1,'short');
  256. h.filtertype = fread(fid,1,'char');
  257. h.filterdomain = fread(fid,1,'char');
  258. h.snrflag = fread(fid,1,'char');
  259. h.coherenceflag = fread(fid,1,'char');
  260. h.continuoustype = fread(fid,1,'char');
  261. h.eventtablepos = fread(fid,1,'ulong');
  262. h.continuousseconds = fread(fid,1,'float');
  263. h.channeloffset = fread(fid,1,'long');
  264. h.autocorrectflag = fread(fid,1,'char');
  265. h.dcthreshold = fread(fid,1,'uchar');
  266. for n = 1:h.nchannels
  267. e(n).lab = deblank(char(fread(fid,10,'char')'));
  268. e(n).reference = fread(fid,1,'char');
  269. e(n).skip = fread(fid,1,'char');
  270. e(n).reject = fread(fid,1,'char');
  271. e(n).display = fread(fid,1,'char');
  272. e(n).bad = fread(fid,1,'char');
  273. e(n).n = fread(fid,1,'ushort');
  274. e(n).avg_reference = fread(fid,1,'char');
  275. e(n).clipadd = fread(fid,1,'char');
  276. e(n).x_coord = fread(fid,1,'float');
  277. e(n).y_coord = fread(fid,1,'float');
  278. e(n).veog_wt = fread(fid,1,'float');
  279. e(n).veog_std = fread(fid,1,'float');
  280. e(n).snr = fread(fid,1,'float');
  281. e(n).heog_wt = fread(fid,1,'float');
  282. e(n).heog_std = fread(fid,1,'float');
  283. e(n).baseline = fread(fid,1,'short');
  284. e(n).filtered = fread(fid,1,'char');
  285. e(n).fsp = fread(fid,1,'char');
  286. e(n).aux1_wt = fread(fid,1,'float');
  287. e(n).aux1_std = fread(fid,1,'float');
  288. e(n).senstivity = fread(fid,1,'float');
  289. e(n).gain = fread(fid,1,'char');
  290. e(n).hipass = fread(fid,1,'char');
  291. e(n).lopass = fread(fid,1,'char');
  292. e(n).page = fread(fid,1,'uchar');
  293. e(n).size = fread(fid,1,'uchar');
  294. e(n).impedance = fread(fid,1,'uchar');
  295. e(n).physicalchnl = fread(fid,1,'uchar');
  296. e(n).rectify = fread(fid,1,'char');
  297. e(n).calib = fread(fid,1,'float');
  298. end
  299. % finding if 32-bits of 16-bits file
  300. % ----------------------------------
  301. begdata = ftell(fid);
  302. enddata = h.eventtablepos; % after data
  303. if strcmpi(r.dataformat, 'int16')
  304. nums = (enddata-begdata)/h.nchannels/2;
  305. else nums = (enddata-begdata)/h.nchannels/4;
  306. end;
  307. % number of sample to read
  308. % ------------------------
  309. if ~isempty(r.sample1)
  310. r.t1 = r.sample1/h.rate;
  311. else
  312. r.sample1 = r.t1*h.rate;
  313. end;
  314. if strcmpi(r.dataformat, 'int16')
  315. startpos = r.t1*h.rate*2*h.nchannels;
  316. else startpos = r.t1*h.rate*4*h.nchannels;
  317. end;
  318. if isempty(r.ldnsamples)
  319. if ~isempty(r.lddur)
  320. r.ldnsamples = round(r.lddur*h.rate);
  321. else r.ldnsamples = nums;
  322. end;
  323. end;
  324. % VL modification 1 =========================
  325. h.nums = nums;
  326. % channel offset
  327. % --------------
  328. if ~isempty(r.blockread)
  329. h.channeloffset = r.blockread;
  330. end;
  331. if h.channeloffset > 1
  332. fprintf('WARNING: reading data in blocks of %d, if this fails, try using option "''blockread'', 1"\n', ...
  333. h.channeloffset);
  334. end;
  335. disp('Reading data .....')
  336. if type == 'cnt'
  337. % while (ftell(fid) +1 < h.eventtablepos)
  338. %d(:,i)=fread(fid,h.nchannels,'int16');
  339. %end
  340. fseek(fid, startpos, 0);
  341. % **** This marks the beginning of the code modified for reading
  342. % large .cnt files
  343. % Switched to r.memmapfile for continuity. Check to see if the
  344. % variable exists. If it does, then the user has indicated the
  345. % file is too large to be processed in memory. If the variable
  346. % is blank, the file is processed in memory.
  347. if (~isempty(r.memmapfile))
  348. % open a file for writing
  349. foutid = fopen(r.memmapfile, 'w') ;
  350. % This portion of the routine reads in a section of the EEG file
  351. % and then writes it out to the harddisk.
  352. samples_left = h.nchannels * r.ldnsamples ;
  353. % the size of the data block to be read is limited to 4M
  354. % samples. This equates to 16MB and 32MB of memory for
  355. % 16 and 32 bit files, respectively.
  356. data_block = 4000000 ;
  357. max_rows = data_block / h.nchannels ;
  358. warning off ;
  359. max_written = h.nchannels * uint32(max_rows) ;
  360. warning on ;
  361. % This while look tracks the remaining samples. The
  362. % data is processed in chunks rather than put into
  363. % memory whole.
  364. while (samples_left > 0)
  365. % Check to see if the remaining data is smaller than
  366. % the general processing block by looking at the
  367. % remaining number of rows.
  368. to_read = max_rows ;
  369. if (data_block > samples_left)
  370. to_read = samples_left / h.nchannels ;
  371. end ;
  372. % Read data in a relatively small chunk
  373. temp_dat = fread(fid, [h.nchannels to_read], r.dataformat) ;
  374. % The data is then scaled using the original routine.
  375. % In the original routine, the entire data set was scaled
  376. % after being read in. For this version, scaling occurs
  377. % after every chunk is read.
  378. if strcmpi(r.scale, 'on')
  379. disp('Scaling data .....')
  380. %%% scaling to microvolts
  381. for i=1:h.nchannels
  382. bas=e(i).baseline;sen=e(i).senstivity;cal=e(i).calib;
  383. mf=sen*(cal/204.8);
  384. temp_dat(i,:)=(temp_dat(i,:)-bas).*mf;
  385. end
  386. end
  387. % Write out data in float32 form to the file name
  388. % supplied by the user.
  389. written = fwrite (foutid, temp_dat, 'float32') ;
  390. if (written ~= max_written)
  391. samples_left = 0 ;
  392. else
  393. samples_left = samples_left - written ;
  394. end ;
  395. end ;
  396. fclose (foutid) ;
  397. % Set the dat variable. This gets used later by other
  398. % EEGLAB functions.
  399. dat = r.memmapfile ;
  400. % This variable tracks how the data should be read.
  401. bReadIntoMemory = false ;
  402. else
  403. % The memmapfile variable is empty, read into memory.
  404. bReadIntoMemory = true ;
  405. end
  406. % This ends the modifications made to read large files.
  407. % Everything contained within the following if statement is the
  408. % original code.
  409. if (bReadIntoMemory == true)
  410. if h.channeloffset <= 1
  411. dat=fread(fid, [h.nchannels r.ldnsamples], r.dataformat);
  412. else
  413. h.channeloffset = h.channeloffset/2;
  414. % reading data in blocks
  415. dat = zeros( h.nchannels, r.ldnsamples);
  416. dat(:, 1:h.channeloffset) = fread(fid, [h.channeloffset h.nchannels], r.dataformat)';
  417. counter = 1;
  418. while counter*h.channeloffset < r.ldnsamples
  419. dat(:, counter*h.channeloffset+1:counter*h.channeloffset+h.channeloffset) = ...
  420. fread(fid, [h.channeloffset h.nchannels], r.dataformat)';
  421. counter = counter + 1;
  422. end;
  423. end ;
  424. % ftell(fid)
  425. if strcmpi(r.scale, 'on')
  426. disp('Scaling data .....')
  427. %%% scaling to microvolts
  428. for i=1:h.nchannels
  429. bas=e(i).baseline;sen=e(i).senstivity;cal=e(i).calib;
  430. mf=sen*(cal/204.8);
  431. dat(i,:)=(dat(i,:)-bas).*mf;
  432. end % end for i=1:h.nchannels
  433. end; % end if (strcmpi(r.scale, 'on')
  434. end ;
  435. ET_offset = (double(h.prevfile) * (2^32)) + double(h.eventtablepos); % prevfile contains high order bits of event table offset, eventtablepos contains the low order bits
  436. fseek(fid, ET_offset, 'bof');
  437. disp('Reading Event Table...')
  438. eT.teeg = fread(fid,1,'uchar');
  439. eT.size = fread(fid,1,'ulong');
  440. eT.offset = fread(fid,1,'ulong');
  441. if eT.teeg==2
  442. nevents=eT.size/sizeEvent2;
  443. if nevents > 0
  444. ev2(nevents).stimtype = [];
  445. for i=1:nevents
  446. ev2(i).stimtype = fread(fid,1,'ushort');
  447. ev2(i).keyboard = fread(fid,1,'char');
  448. temp = fread(fid,1,'uint8');
  449. ev2(i).keypad_accept = bitand(15,temp);
  450. ev2(i).accept_ev1 = bitshift(temp,-4);
  451. ev2(i).offset = fread(fid,1,'long');
  452. ev2(i).type = fread(fid,1,'short');
  453. ev2(i).code = fread(fid,1,'short');
  454. ev2(i).latency = fread(fid,1,'float');
  455. ev2(i).epochevent = fread(fid,1,'char');
  456. ev2(i).accept = fread(fid,1,'char');
  457. ev2(i).accuracy = fread(fid,1,'char');
  458. end
  459. else
  460. ev2 = [];
  461. end;
  462. elseif eT.teeg==3 % type 3 is similar to type 2 except the offset field encodes the global sample frame
  463. nevents=eT.size/sizeEvent3;
  464. if nevents > 0
  465. ev2(nevents).stimtype = [];
  466. if r.dataformat == 'int32'
  467. bytes_per_samp = 4; % I only have 32 bit data, unable to check whether this is necessary,
  468. else % perhaps there is no type 3 file with 16 bit data
  469. bytes_per_samp = 2;
  470. end
  471. for i=1:nevents
  472. ev2(i).stimtype = fread(fid,1,'ushort');
  473. ev2(i).keyboard = fread(fid,1,'char');
  474. temp = fread(fid,1,'uint8');
  475. ev2(i).keypad_accept = bitand(15,temp);
  476. ev2(i).accept_ev1 = bitshift(temp,-4);
  477. os = fread(fid,1,'ulong');
  478. ev2(i).offset = os * bytes_per_samp * h.nchannels;
  479. ev2(i).type = fread(fid,1,'short');
  480. ev2(i).code = fread(fid,1,'short');
  481. ev2(i).latency = fread(fid,1,'float');
  482. ev2(i).epochevent = fread(fid,1,'char');
  483. ev2(i).accept = fread(fid,1,'char');
  484. ev2(i).accuracy = fread(fid,1,'char');
  485. end
  486. else
  487. ev2 = [];
  488. end;
  489. elseif eT.teeg==1
  490. nevents=eT.size/sizeEvent1;
  491. if nevents > 0
  492. ev2(nevents).stimtype = [];
  493. for i=1:nevents
  494. ev2(i).stimtype = fread(fid,1,'ushort');
  495. ev2(i).keyboard = fread(fid,1,'char');
  496. % modified by Andreas Widmann 2005/05/12 14:15:00
  497. %ev2(i).keypad_accept = fread(fid,1,'char');
  498. temp = fread(fid,1,'uint8');
  499. ev2(i).keypad_accept = bitand(15,temp);
  500. ev2(i).accept_ev1 = bitshift(temp,-4);
  501. % end modification
  502. ev2(i).offset = fread(fid,1,'long');
  503. end;
  504. else
  505. ev2 = [];
  506. end;
  507. else
  508. disp('Skipping event table (tag != 1,2,3 ; theoritically impossible)');
  509. ev2 = [];
  510. end
  511. fseek(fid, -1, 'eof');
  512. t = fread(fid,'char');
  513. f.header = h;
  514. f.electloc = e;
  515. f.data = dat;
  516. f.Teeg = eT;
  517. f.event = ev2;
  518. f.tag=t;
  519. % Surgical addition of number of samples
  520. f.ldnsamples = r.ldnsamples ;
  521. %%%% channels labels
  522. for i=1:h.nchannels
  523. plab=sprintf('%c',f.electloc(i).lab);
  524. if i>1
  525. lab=str2mat(lab,plab);
  526. else
  527. lab=plab;
  528. end
  529. end
  530. %%%% to change offest in bytes to points
  531. if ~isempty(ev2)
  532. if r.sample1 ~= 0
  533. % VL modification 2 =========================
  534. % fprintf(2,'Warning: events imported with a time shift might be innacurate (bug 661)\n');
  535. end;
  536. ev2p=ev2;
  537. ioff=900+(h.nchannels*75); %% initial offset : header + electordes desc
  538. if strcmpi(r.dataformat, 'int16')
  539. for i=1:nevents
  540. ev2p(i).offset=(ev2p(i).offset-ioff)/(2*h.nchannels) - r.sample1; %% 2 short int end
  541. end
  542. else % 32 bits
  543. for i=1:nevents
  544. ev2p(i).offset=(ev2p(i).offset-ioff)/(4*h.nchannels) - r.sample1; %% 4 short int end
  545. end
  546. end;
  547. f.event = ev2p;
  548. end;
  549. frewind(fid);
  550. fclose(fid);
  551. end