⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nextdata.m

📁 神经元信号处理软件
💻 M
字号:
function c = nextdata(d,varargin);
% NEXTDATA   - read data from an MCRack OLE Object opened with datastrm.m
%     c = nextdata(D,'streamname','Spikes 1','startend',[0 1000]); 
% retrieves data from the specified stream in the object <D>.
%
% In this help section we will use 'D' for the current datastream object.
%
% Optional parameters (parameter value paires):
% streamname   string	   stream to access
% startend     double(2,1) start and stop time for retrieving in ms
% originorder   string     'on' or 'off', with the default 'off' the data channels 
%                          are sorted in linear MEA order as channels are in MCRack 
%                          buffer page, when in datasource/Channels Page MEA Type 
%                          is selected.
%                          In the linear MEA order data come as (64,x) array.
%                          With 'originorder' 'on' data channels come in (hardware) order 
%                          of recording and only recorded channel are returned.
%                          
%                          Please use 'originorder' 'on' when you work with linear channel layout ('nogrid' 'plain').
%                          For data from MC Rack V1.4 and higher this 'originorder' 'on' is set
%                          by default for linear channel layout.
%                          !!!!! IMPORTANT !!!!!
%                          If you use MEA layout ('8x8'), please set 'originorder' 'on' for all streams derived
%                          from Analog Raw Data.
%
% warning      string      'on' or 'off', higher level routines can supress warnings here
%
% hardwarechannelid
%              double      hardware channel id; for 'spikes' streams only, data of only one 
%                          channel can be retrieved fast
% channelid    double      linear channel id; for 'spikes' streams only, data of only one 
%                          channel can be retrieved fast, overrides hardwarechannelid
% timesonly    string      'on' or 'off', read out only spike time points and no spike 
%                          data when 'on' (c.spiketimes filled, c.spikevalues empty) 
%                          only valid for spikes, works with and without channelid set
% eventtimes  double(n,1)  get events (spike data) to corresponding time points,
%                          only valid for spikes, works only with channelid set,
%                          spikes are sorted ascendingly, startend is ignored
%
% To access triggered data, please use the sweep starting times you find in the property 
% sweepStartTime or first retrieve the triggers event of the whole file to get the 
% sweep starting times.
%
% sample code:
%     sweeptimes = getfield(D,'sweepStartTime');
%     timeWindow = getfield(D,'TimeWindow');
%     startend = [sweeptimes(sweepindex) sweeptimes(sweepindex)+timeWindow.Time2];
%     nextdata(...,'startend',startend,...);
%
% Please use 
%     data = ad2muvolt(D,data); 
% to convert 'analog' and 'spikes' data from AD-values to 礦. Times are generally given in ms. 
%
% You can build arrays with time data in ms for 'analog' data using 
%     ticks = 1000/getfield(D,'MicrosecondsPerTick'); 
%     timedata = [start_ms*ticks:end_ms*ticks]/ticks;
%
% 'params' data are in 
%     V (min,max,height,amplitude), 
%     ms (tmin,tmax,width), 
%     ms*V (area), 
%     Hz (rate), 
%     number is without unit
%
% nextdata generally retrieves data in multi channel format. 
%     Use the linear channel index (#12=2,#21=9; as in ChannelID2/ChannelNames2 pairs) 
%     on nextdata return values for accessing single channel data fetched with originorder off.
%     With originorder on (eg. used, when non MEA data are recorded) use 
%     hardware linear channel index (#01=1,#02=2; as in HardwareChannelID2/HardwareChannelNames2 pairs)
%
% Examples for plotting single channel data:
% 'analog' sample: plot(timedata, c.data(channelnumber,:));    % c.data is a double array
% 'spikes' sample: 
%          spiketimes = c.spiketimes{channelnumber,:};         % c.spiketimes is a cell array
%          plot(spiketimes[1:end-1],diff(spiketimes,1),'*');   % inter spike interval plot
% 'params' sample: plot(c.min(channelnumber,:));               % c.min and others are double arrays
% 
%
% (c) Th. Knott



if (~strcmp(d.fileaccess,'ole'))
	error('nextdata works only with data from MCRack OLE Object')
end;
pvpmod(varargin);
%***********
cfg.startend=[0 100];
cfg.streamname='Electrode Raw Data';
cfg.sorterleft=getfield(d,'sorterleft')-1;
cfg.originorder='off';
cfg.warning='on';
cfg.ChunkNumber=-1;	%if chunk >-1 then data of one chunk will be read in 
					%low level format (2 bytes on harddisk = 1 value)
					%chunk size (means 128 ms or greater) and format depends on stream type. 
					%Use chunks only for debugging!
cfg.channelid=[]; %read out data only for one specified channel (linear channel id), works only for spikes,
%								overrides hardwarechannelid!               
cfg.hardwarechannelid=[]; %read out data only for one specified channel (hardward channel id), works only for spikes
cfg.timesonly='off'; %read out only time points, only valid for spikes
cfg.eventtimes=[]; %read out spike to corresponding time points
cfg.eventtimesrange=(d.MicrosecondsPerTick/1000/2)*1.1; % accurracy in ms for time points to be found:
                                                        % half tick plus 10 percent (unnecessary with MC_Rack 1.64.0)
%***********

fields=[char(fieldnames(cfg))];
fields=[fields blanks(size(fields,1))']';
fields=fields(:)';
for idx=1:2:size(varargin, 2)
  if isempty(findstr(fields,[varargin{idx} ' ']))
    warning(['trying unknown option in nextdata:' varargin{idx}]);
  end;
  cfg = setfield(cfg, varargin{idx}, varargin{idx+1});
end

if ~isempty(cfg.channelid)
   cfg.hardwarechannelid=d.sorterright(cfg.channelid(1));
end
cfg=rmfield(cfg,'channelid');
if ~isempty(cfg.hardwarechannelid) 
   if strcmp(cfg.streamname(1:6),'Spikes')
      cfg.originorder='on';
      cfg.hardwarechannelid=cfg.hardwarechannelid-1;
   else
      warning(['channelid option in nextdata works only on spikes']);
		cfg=rmfield(cfg,'hardwarechannelid');
   end
else
	cfg=rmfield(cfg,'hardwarechannelid');
end
if strcmp(cfg.timesonly,'on')
   cfg.timesonly = 1;
else
   cfg.timesonly = 0;
end

msPerTick=d.MicrosecondsPerTick/1000;
if isempty(cfg.eventtimes) 
	cfg=rmfield(cfg,'eventtimes');
   cfg.startend=round(cfg.startend/msPerTick)*msPerTick;
elseif ~isfield(cfg,'hardwarechannelid')
	cfg=rmfield(cfg,'eventtimes');
   error(['eventtimes option in nextdata works only with channelid set']);
else
   cfg.eventtimes=sort(cfg.eventtimes);
   cfg.eventtimes=round(cfg.eventtimes/msPerTick)*msPerTick;
   cfg.startend=[cfg.eventtimes(1)-cfg.eventtimesrange*2 cfg.eventtimes(1)+100]; %end is ignored
end


cfg.StreamNumber = getstreamnumber(d,cfg.streamname)-1;
if cfg.StreamNumber < 0
	if strcmp(cfg.warning,'on')
		cfg.streamname
		warning('Stream not contained in file');
	end
	c.data=[];
	c.startend=cfg.startend;
	return
end

if ((d.TotalChannels>64) | ~isempty(find(d.HardwareChannelID2{cfg.StreamNumber+1}>64)) | ...
      strcmp(d.meatype, 'nogrid'))
	cfg.originorder='on';	%for more than 64 Channels, MEA layout makes no sense
end;

if strcmp(cfg.originorder,'on')
	cfg=rmfield(cfg,'sorterleft');
else
   if strcmp(cfg.streamname,'Analog Raw Data')
      cfg.sorterleft = [[1:60] 1 2 3 4]-1; %default should be 'originorder' 'on' also for MEA layout as 
                                             %all Streams derived from Analog Raw Data lead to crashes
   end
end;

if cfg.ChunkNumber > -1
	cfg.function='GetChunk';
	c=mcstreammex(cfg);
	return;
end


cfg.function='GetFromTo';
c=mcstreammex(cfg);
if strcmp(cfg.originorder,'off')
	cNum=64;
	if strcmp(cfg.streamname,'Analog Raw Data')
		cNum=4;
	end
else
	cNum=d.NChannels2(getstreamnumber(d,cfg.streamname));
end

if (strcmp(cfg.streamname,'Analog Raw Data') | strcmp(cfg.streamname,'Electrode Raw Data') | strcmp(cfg.streamname,'Digital Data') | ~isempty(findstr(cfg.streamname,'Filtered Data'))) 
   c.data = [reshape(c.data,cNum,length(c.data)/cNum)];
end

c.startend=cfg.startend;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -