123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- function [y, x] = cdraster(ref, cdtimes, cdvals, varargin)
- % [y, x] = cdraster(ref, cdtimes, cdvals, pre, post, bin)
- %
- % returns a raster of some continuously sampled data relative to events ref
- % at intervals of size bin
- %
- % all times should be in seconds
- % forces input times to be smallest integer multiple of bin possible that
- % is greater than pre and post
- % false by default for backward compatability
- inpd = @utils.inputordefault;
- pre = inpd('pre',0.5, varargin);
- post = inpd('post',1, varargin);
- bin = inpd('bin',0.1, varargin);
- isforce = inpd('coerce',true,varargin);
- if nargin<7, isforce=false; end
- if numel(cdtimes)~=numel(cdvals)
- %assume that the ts refer to equally spaced samples
- samples_per_ts = numel(cdvals)./numel(cdtimes);
- if rem(numel(cdvals),numel(cdtimes))==0
- samples_per_ts = numel(cdvals)./numel(cdtimes);
- else
- error("Not an even # of samples per timestep")
- return
- end
- else
- samples_per_ts = 1;
- end
- if ~isforce
- if abs((post+pre)/bin - round((post+pre)/bin)) > 1e-5,
- y = [];
- x = [];
- warning('window size must be an integer multiple of bin size');
- return;
- end
- else
- if abs((post+pre)/bin - round(post+pre)/bin) > 0
- pre=ceil((pre)/bin)*bin;
- post=ceil((post)/bin)*bin;
- end
- end
- x = (-pre+bin/2):bin:(post-bin/2);
- ssize = median(diff(cdtimes));
- if bin > ssize
- n = floor(bin/ssize)+1;
- ssize = bin/n;
- else
- ssize = bin;
- n=1;
- end
- xs = -pre+ssize/2:ssize:post-ssize/2;
- ys = zeros(numel(ref), numel(xs));
- y = zeros(numel(ref), numel(x));
- for i = 1:numel(ref)
- starting = ref(i) - pre;
- ending = ref(i) + post;
-
- if isnan(starting) || isnan(ending)
- ftimes=[];
- s = [];
- else
-
- [ftimes, s] = stats.qbetween2(cdtimes, starting, ending);
- end
- if isempty(ftimes)
- ys(i,:) = NaN * ones(size(xs));
- else
- stepsize = median(diff(ftimes));
- times = bsxfun(@plus, repmat(ftimes(:),1,samples_per_ts), (stepsize/samples_per_ts).*(0:(samples_per_ts-1)))' - ref(i);
- times = times(:);
- start_val = samples_per_ts * (s(1)-1)+1;
- end_val = samples_per_ts*s(2);
- try
- vals = cdvals(start_val:end_val);
- ys(i,:) = interp1(times, vals, xs,'linear',nan);
-
- catch
- ys(i,:) = NaN * ones(size(xs));
- end
- end
- y(i,:) = nanmean(reshape(ys(i,:),n,numel(xs)/n),1);
- end
|