cdraster.m 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. function [y, x] = cdraster(ref, cdtimes, cdvals, varargin)
  2. % [y, x] = cdraster(ref, cdtimes, cdvals, pre, post, bin)
  3. %
  4. % returns a raster of some continuously sampled data relative to events ref
  5. % at intervals of size bin
  6. %
  7. % all times should be in seconds
  8. % forces input times to be smallest integer multiple of bin possible that
  9. % is greater than pre and post
  10. % false by default for backward compatability
  11. inpd = @utils.inputordefault;
  12. pre = inpd('pre',0.5, varargin);
  13. post = inpd('post',1, varargin);
  14. bin = inpd('bin',0.1, varargin);
  15. isforce = inpd('coerce',true,varargin);
  16. if nargin<7, isforce=false; end
  17. if numel(cdtimes)~=numel(cdvals)
  18. %assume that the ts refer to equally spaced samples
  19. samples_per_ts = numel(cdvals)./numel(cdtimes);
  20. if rem(numel(cdvals),numel(cdtimes))==0
  21. samples_per_ts = numel(cdvals)./numel(cdtimes);
  22. else
  23. error("Not an even # of samples per timestep")
  24. return
  25. end
  26. else
  27. samples_per_ts = 1;
  28. end
  29. if ~isforce
  30. if abs((post+pre)/bin - round((post+pre)/bin)) > 1e-5,
  31. y = [];
  32. x = [];
  33. warning('window size must be an integer multiple of bin size');
  34. return;
  35. end
  36. else
  37. if abs((post+pre)/bin - round(post+pre)/bin) > 0
  38. pre=ceil((pre)/bin)*bin;
  39. post=ceil((post)/bin)*bin;
  40. end
  41. end
  42. x = (-pre+bin/2):bin:(post-bin/2);
  43. ssize = median(diff(cdtimes));
  44. if bin > ssize
  45. n = floor(bin/ssize)+1;
  46. ssize = bin/n;
  47. else
  48. ssize = bin;
  49. n=1;
  50. end
  51. xs = -pre+ssize/2:ssize:post-ssize/2;
  52. ys = zeros(numel(ref), numel(xs));
  53. y = zeros(numel(ref), numel(x));
  54. for i = 1:numel(ref)
  55. starting = ref(i) - pre;
  56. ending = ref(i) + post;
  57. if isnan(starting) || isnan(ending)
  58. ftimes=[];
  59. s = [];
  60. else
  61. [ftimes, s] = stats.qbetween2(cdtimes, starting, ending);
  62. end
  63. if isempty(ftimes)
  64. ys(i,:) = NaN * ones(size(xs));
  65. else
  66. stepsize = median(diff(ftimes));
  67. times = bsxfun(@plus, repmat(ftimes(:),1,samples_per_ts), (stepsize/samples_per_ts).*(0:(samples_per_ts-1)))' - ref(i);
  68. times = times(:);
  69. start_val = samples_per_ts * (s(1)-1)+1;
  70. end_val = samples_per_ts*s(2);
  71. try
  72. vals = cdvals(start_val:end_val);
  73. ys(i,:) = interp1(times, vals, xs,'linear',nan);
  74. catch
  75. ys(i,:) = NaN * ones(size(xs));
  76. end
  77. end
  78. y(i,:) = nanmean(reshape(ys(i,:),n,numel(xs)/n),1);
  79. end