📄 ctf_read_res4_coef.m
字号:
function [ctf] = ctf_read_res4(folder,VERBOSE);% ctf_read_res4 - Read a CTF .res4 file%% ctf = ctf_read_res4( [folder], [VERBOSE])% % This function reads the resource information from a CTF .ds folder. This% resource information must be read before reading the data from a .meg4% file.%% INPUTS%% folder: the .ds directory containing the data to be read. With% no input, it will prompt with a gui folder locator. If only% the folder is input, VERBOSE = 1.%% VERBOSE = 1, display 'ctf.res4.generalSetup' structure (default)% VERBOSE = 0, do not display 'ctf.res4.generalSetup' structure%% OUTPUTS%% ctf.folder: path of the .ds folder%% ctf.header: data format header%% ctf.res4.generalSetup: a header structure consisting of date, time, run name, run% title, subject, run description, operator, number of channels, number% of samples, sample rate, number of trials, duration, pretriggerSamples,% sensor filename, head zeroing, and number of filters.% % ctf.sensor.index: a sensor structure consisting of EEG sensors, MEG% sensors, reference sensors, and other sensors.% % ctf.sensor.info: a structure with gain and offset information consisting% of proper gain, Q gain, io gain, io offset, and index.%% <>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>% < >% < DISCLAIMER: >% < >% < THIS PROGRAM IS INTENDED FOR RESEARCH PURPOSES ONLY. >% < THIS PROGRAM IS IN NO WAY INTENDED FOR CLINICAL OR >% < OFFICIAL USE. >% < >% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>%% $Revision: 1.2 $ $Date: 2004/02/02 23:57:40 $% Licence: GNU GPL, no express or implied warranties% Modified: 11/2003, Darren.Weber_at_radiology.ucsf.edu% - modified from NIH code readresfile.m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ver = '$Revision: 1.2 $';fprintf('\nCTF_READ_RES4 [v %s]\n',ver(11:15)); tic;if ~exist('folder','var'), ctf = ctf_folder;else ctf = ctf_folder(folder);endif ~exist('VERBOSE','var'), VERBOSE = 1; end[rootpath,rootname] = fileparts(ctf.folder);res4file = [rootname,'.res4'];[res4fid,message] = fopen(res4file,'rb','s');% 'ieee-be.l64' or 's' - IEEE floating point with big-endian byte ordering% and 64 bit long data type.if res4fid < 0, error(message);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% READ HEADERfseek(res4fid, 0,-1);ctf.res4.header = char(fread(res4fid,8,'char'))';% check for the right formatif strmatch('MEG41RS',ctf.res4.header), % OK, we can handle this formatelse msg = sprintf('May not read "%s" format correctly',ctf.res4.header); warning(msg);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% READ GENERAL RESOURCES, byte offset = 8, byte size = 1840%---DATE/TIMEfseek(res4fid, 778,-1);ctf.res4.generalSetup.time = char(fread(res4fid,255,'char'))';fseek(res4fid,1033,-1);ctf.res4.generalSetup.date = char(fread(res4fid,255,'char'))';%---NUMBER OF SAMPLESfseek(res4fid,1288,-1);ctf.res4.generalSetup.numberSamples = (fread(res4fid,1,'int32')');%---NUMBER OF CHANNELSfseek(res4fid,1292,-1);ctf.res4.generalSetup.numberChannels = (fread(res4fid,1,'int16')');%---SAMPLE RATEfseek(res4fid,1296,-1);ctf.res4.generalSetup.sampleRate = fread(res4fid,1,'double')';ctf.res4.generalSetup.sampleMsec = 1000 / ctf.res4.generalSetup.sampleRate;ctf.res4.generalSetup.sample_sec = 1 / ctf.res4.generalSetup.sampleRate;%---NUMBER OF TRIALSfseek(res4fid,1312,-1);ctf.res4.generalSetup.numberTrials = fread(res4fid,1,'int16')';fseek(res4fid, 776,-1);ctf.res4.generalSetup.numberTrials_averaged = fread(res4fid,1,'int16');%---DURATIONfseek(res4fid,1304,-1);ctf.res4.generalSetup.durationTotal = fread(res4fid,1,'double');ctf.res4.generalSetup.durationTrial = ctf.res4.generalSetup.durationTotal / ctf.res4.generalSetup.numberTrials;%---PRE_TRIG POINTSfseek(res4fid,1316,-1);ctf.res4.generalSetup.pretriggerSamples = fread(res4fid,1,'int32');ctf.res4.generalSetup.pretriggerMsec = (ctf.res4.generalSetup.pretriggerSamples / ctf.res4.generalSetup.sampleRate) * 1000;%---HEAD ZEROINGfseek(res4fid,1348,-1);h_zero = fread(res4fid,1,'int32')';no_yes = {'no','yes'};ctf.res4.generalSetup.headZero = no_yes{h_zero+1};%---RUN NAMEfseek(res4fid,1360,-1);ctf.res4.generalSetup.runName = char(fread(res4fid,32,'char'))';%---RUN TITLEfseek(res4fid,1392,-1);ctf.res4.generalSetup.runTitle = char(fread(res4fid,256,'char'))';%---SUBJECTfseek(res4fid,1712,-1);ctf.res4.generalSetup.subject = char(fread(res4fid,32,'char'))';%---OPERATORfseek(res4fid,1744,-1);ctf.res4.generalSetup.operator = char(fread(res4fid,32,'char'))';%---SENSOR FILE NAMEfseek(res4fid,1776,-1);ctf.res4.generalSetup.sensorFileName = char(fread(res4fid,60,'char'))';%---CALCULATE TIME ARRAYS (not read directly from the .res4 file)% the time arrays must be based on increments of the sampleMsecctf.res4.generalSetup.timeMsec = [0:ctf.res4.generalSetup.numberSamples - 1]' * ctf.res4.generalSetup.sampleMsec;ctf.res4.generalSetup.timeMsec = ctf.res4.generalSetup.timeMsec - ctf.res4.generalSetup.pretriggerMsec;% adjust the sample point closest to zero so that it is zero, if it% is reasonably close to zero, say within 3 decimal places for msec timingzeroIndex = find(abs(ctf.res4.generalSetup.timeMsec) == min(abs(ctf.res4.generalSetup.timeMsec)));zeroValue = ctf.res4.generalSetup.timeMsec(zeroIndex);if (-0.0001 < zeroValue) & (zeroValue < 0.0001), ctf.res4.generalSetup.timeMsec(zeroIndex) = 0;endctf.res4.generalSetup.startMsec = ctf.res4.generalSetup.timeMsec(1);ctf.res4.generalSetup.endMsec = ctf.res4.generalSetup.timeMsec(end);ctf.res4.generalSetup.timeSec = ctf.res4.generalSetup.timeMsec / 1000;ctf.res4.generalSetup.startSec = ctf.res4.generalSetup.timeSec(1);ctf.res4.generalSetup.endSec = ctf.res4.generalSetup.timeSec(end);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% UNUSED, byte offset = 1840, byte size = 4fseek(res4fid,1840,-1);unused = fread(res4fid,1,'int32'); % read 4 byte int32 value%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% RUN DESCRIPTION, byte offset = 1844, byte size = 1 x rdl% run description length (rdl)fseek(res4fid,1836,-1);runDescriptionLength = fread(res4fid,1,'int32');% run descriptionfseek(res4fid,1844,-1);ctf.res4.runDescription = char(fread(res4fid,runDescriptionLength,'char'));%---PRINT RES4 VERBOSE INFORMATIONif VERBOSE, fprintf('...data format : %s\n',ctf.res4.header); fprintf('...date collected : %s\n',ctf.res4.generalSetup.date); fprintf('...time collected : %s\n',ctf.res4.generalSetup.time); fprintf('...run name : %s\n',ctf.res4.generalSetup.runName); fprintf('...run title : %s\n',ctf.res4.generalSetup.runTitle); fprintf('...subject : %s\n',ctf.res4.generalSetup.subject); fprintf('...run description : %s\n',ctf.res4.runDescription); fprintf('...operator : %s\n',ctf.res4.generalSetup.operator); fprintf('...number of channels: %d\n',ctf.res4.generalSetup.numberChannels); fprintf('...number of samples : %d per trial\n',ctf.res4.generalSetup.numberSamples); fprintf('...sample rate : %g samples/sec\n',ctf.res4.generalSetup.sampleRate); fprintf('...number of trials : %g trials (average of %g)\n',ctf.res4.generalSetup.numberTrials,ctf.res4.generalSetup.numberTrials_averaged); fprintf('...duration : %g sec total\n',ctf.res4.generalSetup.durationTotal); fprintf('...duration : %g sec / trial\n',ctf.res4.generalSetup.durationTrial); fprintf('...pretrigger points : %g samples\n',ctf.res4.generalSetup.pretriggerSamples); fprintf('...pretrigger msec : %g msec\n',ctf.res4.generalSetup.pretriggerMsec); fprintf('...sensor file name : %s\n',ctf.res4.generalSetup.sensorFileName); fprintf('...head zeroing : %s\n',ctf.res4.generalSetup.headZero);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NUMBER OF FILTERS, byte offset = 1844 + rdl, byte size = 2offset = 1844 + runDescriptionLength;fseek(res4fid,offset,-1);ctf.res4.numberFilters = fread(res4fid,1,'int16');% this is 'nf' in CTF file format pdf, used for calculating file byte offsetnf = ctf.res4.numberFilters;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FILTER INFORMATION, byte offset = 1846 + rdl, byte size = variable% this is 'b' in CTF file format pdf, used for calculating file byte offsetb = 1846 + runDescriptionLength;fseek(res4fid,b,-1);% this is 'fi' in CTF file format pdf, used for calculating file byte offsetfi = 0;% this is 'p' & 'np' in CTF file format pdfp = 0; np = 0;for i = 1:ctf.res4.numberFilters, fi = i - 1; ctf.res4.filter(i).frequency = fread(res4fid,1,'double'); ctf.res4.filter(i).class = fread(res4fid,1,'int32'); ctf.res4.filter(i).type = fread(res4fid,1,'int32'); if i > 1, p = p + ( ctf.res4.filter(i-1).numberParameters * 8 ); end np = np + ( ctf.res4.filter(i).numberParameters * 8 ); ctf.res4.filter(i).numberParameters = fread(res4fid,1,'int16'); ctf.res4.filter(i).parameters = fread(res4fid,ctf.res4.filter(i).numberParameters,'double'); end% this is 'f' in CTF file format pdff = ( nf * 18 ) + ( np * 8 );%---PRINT FILTER INFORMATION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -