diff --git a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m index 55410bbccad6c17f91bafae69de8c009819d03e9..e046b51696641a428184464f6e2a079bb8342fe9 100644 --- a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m +++ b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m @@ -654,22 +654,27 @@ classdef Gt6DReconstructionAlgorithmFactory < handle valid_proj_indxes = find(valid_proj_dirs)'; num_valid_projs = numel(valid_proj_indxes); - offsets{ii}.('sino_offsets') = []; - offsets{ii}.('blob_offsets') = []; - offsets{ii}.('proj_offsets') = []; - offsets{ii}.('proj_coeffs') = []; - - offsets{ii}.proj(num_valid_projs) = struct( ... - 'sino_offset', [], 'blob_offset', [], ... - 'proj_offsets', [], 'proj_coeffs', [] ); + c_sino_offsets = cell(2, num_valid_projs); + c_blob_offsets = cell(2, num_valid_projs); + c_proj_offsets = cell(1, num_valid_projs); + c_proj_coeffs = cell(1, num_valid_projs); + + slices_pos_blobs = reshape(slice_pos_in_blob(valid_proj_indxes, ii, :), [], 2); + ws_int_coeffs = reshape(w_int_coeffs(valid_proj_indxes, ii, :), [], 2); + + % computing the correction for the blob truncation, if any + % applies + blob_shirnking_offset = (~blobs_to_not_shrink(valid_proj_indxes)) ... + .* ( 1 - slice_lims(valid_proj_indxes, 1) ); + for jj = 1:num_valid_projs n = valid_proj_indxes(jj); - slices_1 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 1)).slices]; - coeffs_1 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 1)).coeffs] * w_int_coeffs(n, ii, 1); + slices_1 = proj_coeffs{n}(slices_pos_blobs(jj, 1)).slices; + coeffs_1 = proj_coeffs{n}(slices_pos_blobs(jj, 1)).coeffs * ws_int_coeffs(jj, 1); - slices_2 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 2)).slices]; - coeffs_2 = [proj_coeffs{n}(slice_pos_in_blob(n, ii, 2)).coeffs] * w_int_coeffs(n, ii, 2); + slices_2 = proj_coeffs{n}(slices_pos_blobs(jj, 2)).slices; + coeffs_2 = proj_coeffs{n}(slices_pos_blobs(jj, 2)).coeffs * ws_int_coeffs(jj, 2); % ugly but it avoids a lot of compuation later if (numel(slices_1) == 2 && numel(slices_2) == 2 && all(slices_1 == slices_2)) @@ -691,20 +696,29 @@ classdef Gt6DReconstructionAlgorithmFactory < handle end % Correcting w-slices indices for blob truncation - if (~blobs_to_not_shrink(n)) - slices = slices - slice_lims(n, 1) +1; - end + slices = slices + blob_shirnking_offset(jj); + + ones_num_slices = ones(numel(slices), 1); + c_sino_offsets{1, jj} = jj; + c_sino_offsets{2, jj} = jj(1, ones_num_slices); - offsets{ii}.proj(jj) = struct( ... - 'sino_offset', jj, 'blob_offset', n, ... - 'proj_offsets', slices, 'proj_coeffs', coeffs ); + c_blob_offsets{1, jj} = n; + c_blob_offsets{2, jj} = n(1, ones_num_slices); - offsets{ii}.('sino_offsets') = [offsets{ii}.('sino_offsets'), jj(1, ones(numel(slices), 1))]; - offsets{ii}.('blob_offsets') = [offsets{ii}.('blob_offsets'), n(1, ones(numel(slices), 1))]; - offsets{ii}.('proj_offsets') = [offsets{ii}.('proj_offsets'), slices]; - offsets{ii}.('proj_coeffs') = [offsets{ii}.('proj_coeffs'), coeffs]; + c_proj_offsets{jj} = slices; + c_proj_coeffs{jj} = coeffs; end + offsets{ii} = struct( ... + 'sino_offsets', [c_sino_offsets{2, :}], ... + 'blob_offsets', [c_blob_offsets{2, :}], ... + 'proj_offsets', [c_proj_offsets{:}], ... + 'proj_coeffs', [c_proj_coeffs{:}], ... + 'proj', struct( ... + 'sino_offset', c_sino_offsets(1, :), 'blob_offset', c_blob_offsets(1, :), ... + 'proj_offsets', c_proj_offsets, 'proj_coeffs', c_proj_coeffs ) ... + ); + geometries{ii} = double(geometries{ii}(valid_proj_dirs, :)); end end