📄 aft_getvolume.m
字号:
function y = aft_GetVolume(hfile, volnum)
% AFT::GetVolume - get one volume from a (multi-volume) dataset
%
% FORMAT: y = obj.GetVolume([volnum])
%
% Input fields:
%
% volnum 1x1 double index (default: 1)
%
% Output fields:
%
% y uninterpolated volume data (in source datatype)
%
% Note: this methods works with
%
% cmp get component map with number volnum
% ddt get the corresponding volume (1 .. 12)
% dmr get according volume of DWI file
% fmr get according volume of STC file(s)
% glm get beta map with index volnum (scheme PxS)
% map get FMR based map (volnum discarded, can only be 1)
% msk get MSK data (volnum discarded, can only be 1)
% vdw get tensor imaging volume with number volnum
% vmp get according statistical map with number volnum
% vmr get VMR data (volnum discarded, can only be 1)
% vtc get functional volume with number volnum
% Version: v0.7b
% Build: 7082922
% Date: Aug-29 2007, 10:37 PM CEST
% Author: Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools
% argument check
if nargin < 1 || ...
numel(hfile) ~= 1 || ...
~isBVQXfile(hfile, true)
error( ...
'BVQXfile:BadArgument', ...
'Invalid call to ''%s''.', ...
mfilename ...
);
end
if nargin < 2 || ...
~isa(volnum, 'double') || ...
numel(volnum) ~= 1 || ...
isinf(volnum) || ...
isnan(volnum) || ...
volnum < 1
volnum = 1;
else
volnum = floor(volnum);
end
% get super-struct
ssc = bvqxfile_getscont(hfile.L);
ft = lower(ssc.S.Extensions{1});
if ~any(strcmp(ft, ...
{'cmp', 'ddt', 'dmr', 'fmr', 'glm', 'map', 'msk', 'vdw', 'vmp', 'vmr', 'vtc'}))
error( ...
'BVQXfile:BadArgument', ...
'GetVolume not supported for this object type.' ...
);
end
% depends on filetype
bc = ssc.C;
switch (ft)
% CMP
case {'cmp'}
if volnum > numel(bc.Map)
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
y = bc.Map(volnum).CMPData;
% DDT
case {'ddt'}
if volnum > 12
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
y = squeeze(bc.TensorEigenVs(volnum, :, :, :));
% DMR
case {'dmr'}
if volnum > bc.NrOfVolumes
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
% depends on storage format
switch (bc.DataStorageFormat)
case {2}
y = squeeze(bc.DWIData(:, :, volnum, :));
case {3}
y = bc.DWIData(:, :, :, volnum);
case {4}
y = squeeze(bc.DWIData(volnum, :, :, :));
otherwise
error( ...
'BVQXfile:BadObject', ...
'DataStorageFormat unknown.' ...
);
end
% FMR
case {'fmr'}
if volnum > bc.NrOfVolumes
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
% data must be loaded
if isempty(bc.Slice)
error( ...
'BVQXfile:BadObject', ...
'STC data not loaded.' ...
);
end
% depends on FileVersion and DataStorageFormat
if bc.FileVersion < 5 || ...
bc.DataStorageFormat == 1
y = uint16([]);
y(1:bc.ResolutionX, 1:bc.ResolutionY, 1:bc.NrOfSlices) = uint16(0);
% iterate over slices
for sc = 1:bc.NrOfSlices
y(:, :, sc) = bc.Slice(sc).STCData(:, :, volnum);
end
else
switch (bc.DataStorageFormat)
case {2}
y = squeeze(bc.Slice.STCData(:, :, volnum, :));
case {3}
y = bc.Slice.STCData(:, :, :, volnum);
case {4}
y = squeeze(bc.Slice.STCData(volnum, :, :, :));
otherwise
error( ...
'BVQXfile:BadObject', ...
'DataStorageFormat unknown.' ...
);
end
end
% GLM
case {'glm'}
% what type of GLM
if ~bc.ProjectTypeRFX
nd = numel(size(bc.GLMData.BetaMaps));
if volnum > size(bc.GLMData.BetaMaps, nd)
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
if nd == 2
y = bc.GLMData.BetaMaps(:, volnum);
elseif nd == 4
y = bc.GLMData.BetaMaps(:, :, :, volnum);
else
error( ...
'BVQXfile:BadObject', ...
'Unsupported GLMData size.' ...
);
end
else
nd = numel(size(bc.GLMData.Subject(1).BetaMaps));
ns = size(bc.GLMData.Subject);
nsp = size(bc.GLMData.Subject(1).BetaMaps, nd);
if volnum > (ns * nsp)
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
snum = floor((volnum - 1) / nsp) + 1;
pnum = volnum - (snum - 1) * nsp;
if nd == 2
y = bc.GLMData.Subject(snum).BetaMaps(:, pnum);
elseif nd == 4
y = bc.GLMData.Subject(snum).BetaMaps(:, :, :, pnum);
else
error( ...
'BVQXfile:BadObject', ...
'Unsupported GLMData size.' ...
);
end
end
% MAP
case {'map'}
% initialize data
y = single([]);
y(1:bc.DimX, 1:bc.DimY, 1:numel(bc.Map)) = single(0);
% iterate over slices
for sc = 1:size(y, 3)
y(:, :, sc) = bc.Map(sc).Data(:, :);
end
% MSK
case {'msk'}
y = bc.Mask;
% VDW
case {'vdw'}
if volnum > bc.NrOfVolumes
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
% make sure to load transio object
t = bc.VDWData;
if istransio(t)
t = t(:, :, :, :);
end
y = squeeze(t(volnum, :, :, :));
% VMP
case {'vmp'}
if volnum > numel(bc.Map)
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
y = bc.Map(volnum).VMPData;
% VMR
case {'vmr'}
if volnum == 1
y = bc.VMRData;
elseif ~isempty(bc.VMRData16)
y = bc.VMRData16;
else
error( ...
'BVQXfile:BadArgument', ...
'Higher volume only valid if V16 loaded.' ...
);
end
% VTC
case {'vtc'}
if volnum > bc.NrOfVolumes
error( ...
'BVQXfile:BadArgument', ...
'Volume number out of bounds.' ...
);
end
% make sure to load transio object
t = bc.VTCData;
if istransio(t)
t = t(:, :, :, :);
end
y = squeeze(t(volnum, :, :, :));
end
% final check
if istransio(y)
y = y(:, :, :);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -