plx_waves.m 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. function [n, npw, ts, wave] = plx_waves(filename, ch, u)
  2. % plx_waves(filename, channel, unit): Read waveform data from a .plx file
  3. %
  4. % [n, npw, ts, wave] = plx_waves(filename, channel, unit)
  5. %
  6. % INPUT:
  7. % filename - if empty string, will use File Open dialog
  8. % channel - 1-based channel number
  9. % unit - unit number (0- invalid, 1-4 valid)
  10. % OUTPUT:
  11. % n - number of waveforms
  12. % npw - number of points in each waveform
  13. % ts - array of timestamps (in seconds)
  14. % wave - array of waveforms [npw, n], raw a/d values
  15. if(nargin ~= 3)
  16. disp('3 input arguments are required')
  17. return
  18. end
  19. n = 0;
  20. npw = 0;
  21. ts = 0;
  22. wave = 0;
  23. if(isempty(filename))
  24. [fname, pathname] = uigetfile('*.plx', 'Select a plx file');
  25. filename = strcat(pathname, fname);
  26. end
  27. fid = fopen(filename, 'r');
  28. if(fid == -1)
  29. disp('cannot open file');
  30. return
  31. end
  32. disp(strcat('file = ', filename));
  33. % read file header
  34. header = fread(fid, 64, 'int32');
  35. freq = header(35); % frequency
  36. ndsp = header(36); % number of dsp channels
  37. nevents = header(37); % number of external events
  38. nslow = header(38); % number of slow channels
  39. npw = header(39); % number of points in wave
  40. npr = header(40); % number of points before threshold
  41. tscounts = fread(fid, [5, 130], 'int32');
  42. wfcounts = fread(fid, [5, 130], 'int32');
  43. evcounts = fread(fid, [1, 512], 'int32');
  44. % skip variable headers
  45. fseek(fid, 1020*ndsp + 296*nevents + 296*nslow, 'cof');
  46. record = 0;
  47. wave = zeros(npw, 1);
  48. wf = zeros(npw, 1);
  49. % read data records
  50. while feof(fid) == 0
  51. type = fread(fid, 1, 'int16');
  52. upperbyte = fread(fid, 1, 'int16');
  53. timestamp = fread(fid, 1, 'int32');
  54. channel = fread(fid, 1, 'int16');
  55. unit = fread(fid, 1, 'int16');
  56. nwf = fread(fid, 1, 'int16');
  57. nwords = fread(fid, 1, 'int16');
  58. toread = nwords;
  59. if toread > 0
  60. wf = fread(fid, [toread, 1], 'int16');
  61. end
  62. if toread > 0
  63. if type == 1
  64. if channel == ch
  65. if unit == u
  66. n = n + 1;
  67. ts(n) = timestamp/freq;
  68. wave(:, n) = wf;
  69. end
  70. end
  71. end
  72. end
  73. record = record + 1;
  74. if feof(fid) == 1
  75. break
  76. end
  77. end
  78. disp(strcat('number of waveforms = ', num2str(n)));
  79. fclose(fid);