-
Nicola Vigano authored
Signed-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
Nicola Vigano authoredSigned-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
gtGeoProjForReconstruction.m 5.16 KiB
function proj_geom = gtGeoProjForReconstruction(projvec_sam, omega, vol_center,...
bbpos, bboff, detgeo, labgeo, samgeo, recgeo, rectype, vol_center_shift)
% GTGEOPROJFORRECONSTRUCTION Projection coordinates required for
% reconstructions.
%
% proj_geom = gtGeoProjForReconstruction(projvec, omega, ...
% graincenter, bbpos, bboff, labgeo, samgeo, recgeo)
%
% ----------------------------------------------------------------
%
% Reconstruction geometries
% 'ASTRA_grain' - for a single grain placed in the origin of the
% reconctructed ROI (requires 'graincenter')
% 'ASTRA_full' - for a reconstruction of the complete sample volume
% (does not use 'graincenter')
% 'ASTRA_absorption' - for a reconstruction of the absorption volume
% (does not use 'graincenter' and 'projvec')
%
%
% INPUT:
% projvec = projection vectors (beam direction) in the
% SAMPLE reference (nx3) (Not needed for 'absorption')
% omega = omega rotational positions corresponding to
% the projection vectors (in degrees) (nx1)
% graincenter = grain center in the SAMPLE reference (1x3)
% (Only needed for 'grain')
% bbpos = bounding box positions on the detector (in pixels)
% [corner_U corner_V width height] (nx4)
% bboff = additional bounding box U,V offsets relative to
% position 'bbpos' (n,2)
% detgeo = DETector geometry as in parameters.detgeo
% labgeo = LABoratory reference as in parameters.labgeo
% samgeo = SAMPLE reference as in parameters.samgeo
% recgeo = REConstruction reference as in parameters.recgeo
% rectype = <char> reconstruction geometry:
% 'ASTRA_grain', 'ASTRA_absorption' or 'ASTRA_full'
% vol_center_shift = shift of grain center in SAMPLE reference (nx3)
% accounting for sample movements relative to the
% the rotation axis (see also gtMatchGetSampleShifts)
%
% OUTPUT:
% proj_geom = input for the specified reconstruction geometry:
% 'ASTRA_grain', 'ASTRA_absorption' and 'ASTRA_full':
% Parameters defined relative to the sample (nx12):
% [projection vector, detector position, ...
% detector vector U, detector vector V];
%
%
if isempty(bboff)
bboff = zeros(size(bbpos, 1), 2);
end
if (isempty(detgeo))
detgeo = gtGeoConvertLegacyLabgeo2Detgeo(labgeo);
end
% Bounding box center U,V coordinates
bbcent_det = [ ...
bbpos(:, 1) + (bbpos(:, 3) - 1) / 2 + bboff(:, 1) , ...
bbpos(:, 2) + (bbpos(:, 4) - 1) / 2 + bboff(:, 2) ];
if (all([size(omega, 1), size(omega, 2)] == [3 3]))
% Rotation tensors were given already
rot_omega = omega;
ones_omega = ones(size(omega, 3), 1);
else
% All functions that use the same omegas, need the same rotation tensors:
rot_comp_w = gtMathsRotationMatrixComp(labgeo.rotdir', 'col');
rot_omega = gtMathsRotationTensor(omega, rot_comp_w);
ones_omega = ones(length(omega), 1);
end
if (~exist('vol_center_shift', 'var') || isempty(vol_center_shift))
vol_center_shift_rec = zeros(numel(ones_omega), 3);
else
vol_center_shift_rec = gtGeoSam2Sam(vol_center_shift, samgeo, recgeo, false, false);
end
% Bounding box center X,Y,Z coordinates in LAB and REC reference
bbcent_lab = gtGeoDet2Lab(bbcent_det, detgeo, 0);
bbcent_rec = gtGeoLab2Sam(bbcent_lab, rot_omega, labgeo, recgeo, 0, 0);
% Detector orientation vectors in REC reference
detdiru = detgeo.detdiru ./ sqrt(sum(detgeo.detdiru .^ 2)) * detgeo.pixelsizeu;
detdirv = detgeo.detdirv ./ sqrt(sum(detgeo.detdirv .^ 2)) * detgeo.pixelsizev;
detdiru_rec = gtGeoLab2Sam(detdiru(ones_omega, :), rot_omega, labgeo, recgeo, true, false);
detdirv_rec = gtGeoLab2Sam(detdirv(ones_omega, :), rot_omega, labgeo, recgeo, true, false);
if (strcmpi(rectype, 'ASTRA_absorption'))
projvec_lab = labgeo.beamdir(ones_omega, :);
projvec_rec = gtGeoLab2Sam(projvec_lab, rot_omega, labgeo, recgeo, true, false);
else
% Normalised projection vector in REC reference
projvec_rec = gtGeoSam2Sam(projvec_sam, samgeo, recgeo, true, false);
end
projvec_rec = gtMathsNormalizeVectorsList(projvec_rec);
if (strcmpi(rectype, 'ASTRA_grain') || strcmpi(rectype, 'ASTRA_absorption'))
% Volume center in REC reference
if (strcmpi(rectype, 'ASTRA_absorption'))
vol_center_rec = recgeo.orig;
else
vol_center_rec = gtGeoSam2Sam(vol_center, samgeo, recgeo, false, false);
end
vol_center_rec = vol_center_rec(ones_omega, :) + vol_center_shift_rec;
bbcent_rec = bbcent_rec - vol_center_rec;
else
% case {'ASTRA_full'}
bbcent_rec = bbcent_rec - vol_center_shift_rec;
end
proj_geom = [projvec_rec, bbcent_rec, detdiru_rec, detdirv_rec];
end