-
Nicola Vigano authored
Signed-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
Nicola Vigano authoredSigned-off-by:
Nicola Vigano <nicola.vigano@esrf.fr>
GtGrainODFuvwPatchSolver.m 8.69 KiB
classdef GtGrainODFuvwPatchSolver < GtGrainODFuvwSfSolver
properties
shape_functions_extracted = {};
end
methods (Access = public)
function self = GtGrainODFuvwPatchSolver(parameters, varargin)
self = self@GtGrainODFuvwSfSolver(parameters, varargin{:});
end
end
methods (Access = public)
function build_sinogram(self)
self.build_sinogram@GtGrainODFuvwSolver()
self.sino = reshape(self.sino, self.size_sino);
end
function build_orientation_sampling(self, ref_gr, det_index, oversize, oversampling, shape_functions)
self.build_orientation_sampling@GtGrainODFuvwSfSolver(ref_gr, det_index, oversize, oversampling, shape_functions);
for ii_o = 1:self.sampler.get_total_num_orientations()
for ii_v = 1:size(self.voxel_centers, 1);
self.shape_functions_extracted{ii_o, ii_v} = {self.shape_functions{ii_v}{ii_o}(:).intm};
end
end
end
function build_projection_matrices_sf_uvw(self)
ref_sel = self.sampler.selected;
grid_gr = self.sampler.get_orientations();
num_orients = numel(grid_gr);
num_voxels = size(self.voxel_centers, 1);
self.S = cell(num_voxels, 1);
self.St = cell(num_voxels, 1);
bls = self.sampler.bl(ref_sel);
bls_uvw_orig = cat(1, bls(:).bbuim, bls(:).bbvim, bls(:).bbwim);
bls_uvw_orig = reshape(bls_uvw_orig, [], 3, 2);
bls_uvw_orig = bls_uvw_orig(:, :, 1);
bls_uvw_orig(:, 3) = bls_uvw_orig(:, 3) - self.pre_paddings + 1;
for ii_v = 1:num_voxels
num_chars = fprintf('%03d/%03d', ii_v, num_voxels);
sf_uvw_shift = cell(num_orients, 1);
for ii_o = 1:num_orients
sf_uvw_shift{ii_o} = cat(1, ...
self.shape_functions{ii_v}{ii_o}(:).bbuim, ...
self.shape_functions{ii_v}{ii_o}(:).bbvim, ...
self.shape_functions{ii_v}{ii_o}(:).bbwim ...
);
sf_uvw_shift{ii_o} = reshape(sf_uvw_shift{ii_o}, [], 3, 2);
sf_uvw_shift{ii_o} = sf_uvw_shift{ii_o}(:, :, 1) - bls_uvw_orig;
end
sf_uvw_shift = cat(3, sf_uvw_shift{:});
self.S{ii_v} = sf_uvw_shift;
fprintf(repmat('\b', [1 num_chars]));
end
end
% function build_projection_matrices_sf_uvw_approx(self)
% ref_sel = self.sampler.selected;
%
% det_ind = self.sampler.detector_index;
%
% detgeo = self.parameters.detgeo(det_ind);
% labgeo = self.parameters.labgeo;
% samgeo = self.parameters.samgeo;
%
% grid_gr = self.sampler.get_orientations();
% num_orients = numel(grid_gr);
%
% num_voxels = size(self.voxel_centers, 1);
% self.S = cell(num_voxels, 1);
% self.St = cell(num_voxels, 1);
%
% % Preparing for computing the UV deviations due to the XYZ
% % positions of the real-space voxels
% rot_l2s = cell(num_orients, 1);
% for ii_o = 1:num_orients
% rot_l2s{ii_o} = grid_gr{ii_o}.allblobs.srot(:, :, ref_sel);
% end
% rot_l2s = cat(3, rot_l2s{:});
% rot_s2l = permute(rot_l2s, [2 1 3]);
%
% dveclab = cell(num_orients, 1);
% for ii_o = 1:num_orients
% dveclab{ii_o} = grid_gr{ii_o}.allblobs.dvec(ref_sel, :);
% end
% dveclab = cat(1, dveclab{:});
%
% uv_orig = cell(num_orients, 1);
% for ii_o = 1:num_orients
% uv_orig{ii_o} = grid_gr{ii_o}.allblobs.detector(det_ind).uvw(ref_sel, 1:2);
% end
% uv_orig = cat(3, uv_orig{:});
%
% bls = self.sampler.bl(ref_sel);
% bls_uvw_orig = cat(1, bls(:).bbuim, bls(:).bbvim, bls(:).bbwim);
% bls_uvw_orig = reshape(bls_uvw_orig, [], 3, 2);
% bls_uvw_orig = bls_uvw_orig(:, :, 1);
% bls_uvw_orig(:, 3) = bls_uvw_orig(:, 3) - self.pre_paddings + 1;
%
% sf_uvw_shift = cell(num_orients, 1);
% for ii_o = 1:num_orients
% sf_uvw_shift{ii_o} = cat(1, ...
% self.shape_functions{ii_o}(:).bbuim, ...
% self.shape_functions{ii_o}(:).bbvim, ...
% self.shape_functions{ii_o}(:).bbwim ...
% );
% sf_uvw_shift{ii_o} = reshape(sf_uvw_shift{ii_o}, [], 3, 2);
% sf_uvw_shift{ii_o} = sf_uvw_shift{ii_o}(:, :, 1) - bls_uvw_orig;
% end
% sf_uvw_shift = cat(3, sf_uvw_shift{:});
%
% for ii_v = 1:num_voxels
% num_chars = fprintf('%03d/%03d', ii_v, num_voxels);
%
% gcsam_v = self.voxel_centers(ii_v, :);
% gcsam_v = gcsam_v(ones(1, size(rot_s2l, 3)), :);
% gclab_v = gtGeoSam2Lab(gcsam_v, rot_s2l, labgeo, samgeo, false);
%
% uv_tot = gtFedPredictUVMultiple([], dveclab', gclab_v', ...
% detgeo.detrefpos', detgeo.detnorm', detgeo.Qdet, ...
% [detgeo.detrefu, detgeo.detrefv]');
% uv_tot = reshape(uv_tot, 2, [], num_orients);
%
% uv_shift = permute(uv_tot, [2 1 3]) - uv_orig;
% self.S{ii_v} = sf_uvw_shift + [uv_shift, zeros(size(uv_shift, 1), 1, num_orients)];
%
% fprintf(repmat('\b', [1 num_chars]));
% end
% end
end
methods (Access = protected)
function y = fp(self, x)
num_blobs = self.get_num_blobs();
num_orients = size(self.shape_functions_extracted, 1);
num_voxels = size(self.shape_functions_extracted, 2);
y = gtMathsGetSameSizeZeros(self.sino, self.data_type);
for ii_v = 1:num_voxels
uvw_shifts = self.S{ii_v};
for ii_o = 1:num_orients
bls = self.shape_functions_extracted{ii_o, ii_v};
for ii_b = 1:num_blobs
bls{ii_b} = bls{ii_b} .* x(ii_o, ii_v);
end
y = gtPlaceSubVolumes(y, bls, [uvw_shifts(:, :, ii_o), (0:num_blobs-1)']);
end
end
end
function y = bp(self, x)
num_blobs = self.get_num_blobs();
num_orients = size(self.shape_functions_extracted, 1);
num_voxels = size(self.shape_functions_extracted, 2);
y = zeros([num_orients, num_voxels], self.data_type);
for ii_v = 1:num_voxels
uvw_shifts = self.S{ii_v};
for ii_o = 1:num_orients
bls = self.shape_functions_extracted{ii_o, ii_v};
mask_sino = zeros(self.size_sino, self.data_type);
mask_sino = gtPlaceSubVolumes(mask_sino, bls, [uvw_shifts(:, :, ii_o), (0:num_blobs-1)']);
mask_sino = mask_sino .* x;
y(ii_o, ii_v) = gtMathsSumNDVol(mask_sino);
end
end
end
% function y = fp_approx(self, x)
% num_blobs = self.get_num_blobs();
%
% y = gtMathsGetSameSizeZeros(self.sino);
%
% for ii_o = 1:numel(self.shape_functions)
% sfs = self.shape_functions{ii_o};
% for ii_b = 1:num_blobs
% sf = sfs(ii_b).intm;
% for ii_v = 1:numel(self.S)
% sf_rescaled = sf .* x(ii_o, ii_v);
% y = gtPlaceSubVolume(y, sf_rescaled, [self.S{ii_v}(ii_b, :, ii_o), ii_b], [], 'summed');
% end
% end
% end
% end
%
% function y = bp_approx(self, x)
% num_blobs = self.get_num_blobs();
%
% num_orients = numel(self.shape_functions);
% num_voxels = numel(self.S);
%
% y = zeros([num_orients, numel(self.S)]);
%
% for ii_v = 1:num_voxels
% for ii_o = 1:num_orients
% sfs = self.shape_functions{ii_o};
%
% mask_sino = gtMathsGetSameSizeZeros(self.sino);
%
% for ii_b = 1:num_blobs
% sf = sfs(ii_b).intm;
% mask_sino = gtPlaceSubVolume(mask_sino, sf, [self.S{ii_v}(ii_b, :, ii_o), ii_b], [], 'summed');
% end
%
% mask_sino = mask_sino .* x;
% y(ii_o, ii_v) = sum(mask_sino(:));
% end
% end
% end
end
end