diff --git a/5_reconstruction/gtRecGrainsDefaultParameters.m b/5_reconstruction/gtRecGrainsDefaultParameters.m index 8c68d965b1d63da20d5d7855ac2ff0df0e94de41..59b375d23d587cc798fb77d0b622c1591b361b99 100644 --- a/5_reconstruction/gtRecGrainsDefaultParameters.m +++ b/5_reconstruction/gtRecGrainsDefaultParameters.m @@ -14,7 +14,7 @@ function par_rec = gtRecGrainsDefaultParameters(algo) par_6D_rec_opts = struct( ... 'grid_edge', 7, 'super_sampling', 1, 'num_interp', 1, ... 'lambda', 1e-1, 'volume_downscaling', 1, ... - 'ospace_oversize', 1.1); + 'ospace_oversize', 1.1, 'rspace_oversize', 1.2); par_rec = struct(... 'algorithm', upper(algo), 'num_iter', 50, 'list', [], ... 'options', par_6D_rec_opts); diff --git a/5_reconstruction/gtReconstruct6DGetParamenters.m b/5_reconstruction/gtReconstruct6DGetParamenters.m index dedbe299941b5d4f5dce29d2103029d1d7f8ecc3..d8e5bc5b9f38f5dffb2ff2404e08d34b9863b9f8 100644 --- a/5_reconstruction/gtReconstruct6DGetParamenters.m +++ b/5_reconstruction/gtReconstruct6DGetParamenters.m @@ -14,13 +14,17 @@ function rec_opts = gtReconstruct6DGetParamenters(parameters) || isempty(rec_opts.ospace_oversize)) rec_opts.ospace_oversize = 1.1; end + if (~isfield(rec_opts, 'rspace_oversize') ... + || isempty(rec_opts.rspace_oversize)) + rec_opts.rspace_oversize = 1.2; + end else warning('gtReconstruct6DGetParamenters:wrong_parameters', ... 'The rec.grains structure doesn''t seem to be valid. Falling back to defaults') rec_opts = struct( ... 'grid_edge', 7, 'num_interp', 1, 'lambda', 1e-1, ... 'super_sampling', 1, 'volume_downscaling', 1, ... - 'ospace_oversize', 1.1 ); + 'ospace_oversize', 1.1, 'rspace_oversize', 1.2 ); end if (isfield(rec, 'grains')) rec_opts.num_iter = rec.grains.num_iter; diff --git a/5_reconstruction/gtReconstruct6DLaunchAlgorithm.m b/5_reconstruction/gtReconstruct6DLaunchAlgorithm.m index 81be2fdc6c48711ac9f97f952fd2c5a963fc1a91..2ac1d85b8e31a66ec540609a70d6c0312040860a 100644 --- a/5_reconstruction/gtReconstruct6DLaunchAlgorithm.m +++ b/5_reconstruction/gtReconstruct6DLaunchAlgorithm.m @@ -3,7 +3,8 @@ function [algo, good_or] = gtReconstruct6DLaunchAlgorithm(sampler, rec_opts, par % rec_factory = Gt6DReconstructionAlgorithmFactory(parameters, ... - 'volume_downscaling', rec_opts.volume_downscaling); + 'volume_downscaling', rec_opts.volume_downscaling, ... + 'rspace_oversize', rec_opts.rspace_oversize ); [algo, good_or] = rec_factory.getSubBlobReconstructionAlgo(sampler, rec_opts.num_interp); mem_cons = [ ... diff --git a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m index cbf2667df27a871456006f0ae38e83b828f1061a..03743b0b27e4838610bc04c81e34feb2eeab93e4 100644 --- a/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m +++ b/zUtil_Deformation/Gt6DReconstructionAlgorithmFactory.m @@ -7,6 +7,7 @@ classdef Gt6DReconstructionAlgorithmFactory < handle det_index = 1; volume_downscaling = 1; + rspace_oversize = 1.2; parameters; end @@ -21,6 +22,48 @@ classdef Gt6DReconstructionAlgorithmFactory < handle end function [algo, good_orients, blobs] = getSubBlobReconstructionAlgo(self, sampler, num_interp, varargin) + algo_params = self.get_algorithm_params(sampler, num_interp); + + % Build Empty volumes + ref_gr = sampler.get_reference_grain(); + spacing = mean([ref_gr.proj.vol_size_y, ref_gr.proj.vol_size_x, ref_gr.proj.vol_size_z]) * (self.rspace_oversize - 1); + volume_size = round([ref_gr.proj.vol_size_y, ref_gr.proj.vol_size_x, ref_gr.proj.vol_size_z] + spacing); + + if (self.volume_downscaling > 1) + volume_size = ceil(volume_size / self.volume_downscaling); + num_geoms = numel(algo_params.geometries); + for ii = 1:num_geoms + algo_params.geometries{ii}(:, 4:12) = algo_params.geometries{ii}(:, 4:12) / self.volume_downscaling; + end + if (~isempty(algo_params.geometries_ss)) + for ii = 1:num_geoms + geom_ss = algo_params.geometries_ss{ii}; + for ii_ss = 1:numel(geom_ss) + geom_ss{ii_ss}(:, 4:12) = geom_ss{ii_ss}(:, 4:12) / self.volume_downscaling; + end + algo_params.geometries_ss{ii} = geom_ss; + end + end + end + + good_orients = algo_params.good_orients; + blobs = algo_params.blobs; + + algo = Gt6DBlobReconstructor(volume_size, blobs, ... + 'data_type', self.data_type, ... + 'geometries', algo_params.geometries, ... + 'offsets', algo_params.offsets, ... + 'ss_geometries', algo_params.geometries_ss, ... + 'ss_offsets', algo_params.offsets_ss, ... + 'use_astra_projectors', true, ... + 'volume_ss', self.volume_downscaling, ... + 'psf', algo_params.psf, ... + varargin{:} ); + end + end + + methods (Access = protected) + function algo_params = get_algorithm_params(self, sampler, num_interp) fprintf('Extracting blobs on detector: ') c = tic(); sel_bls = sampler.selected; @@ -203,33 +246,6 @@ classdef Gt6DReconstructionAlgorithmFactory < handle offsets_ss = {}; end - % Build Empty volumes - blob_size = size(bl(1).intm); - if (isfield(ref_gr, 'proj')) - spacing = mean([ref_gr.proj.vol_size_y, ref_gr.proj.vol_size_x, ref_gr.proj.vol_size_z]) * 0.2; - volume_size = round([ref_gr.proj.vol_size_y, ref_gr.proj.vol_size_x, ref_gr.proj.vol_size_z] + spacing); -% volume_size = [ref_gr.proj.vol_size_y, ref_gr.proj.vol_size_x, ref_gr.proj.vol_size_z]; -% volume_size = self.get_volume_size(ref_gr.center, omegas, bl); - else - volume_size = self.getVolSize(blob_size, self.vol_type); - end - - if (self.volume_downscaling > 1) - volume_size = ceil(volume_size / self.volume_downscaling); - for ii = 1:num_geoms - geometries{ii}(:, 4:12) = geometries{ii}(:, 4:12) / self.volume_downscaling; - end - if (~isempty(geometries_ss)) - for ii = 1:num_geoms - geom_ss = geometries_ss{ii}; - for ii_ss = 1:numel(geom_ss) - geom_ss{ii_ss}(:, 4:12) = geom_ss{ii_ss}(:, 4:12) / self.volume_downscaling; - end - geometries_ss{ii} = geom_ss; - end - end - end - if (isfield(bl, 'psf')) psf = arrayfun(@(x){ permute(x.psf, [1 3 2]) }, bl); elseif (isfield(sampler.ref_gr.proj, 'psf')) @@ -238,20 +254,16 @@ classdef Gt6DReconstructionAlgorithmFactory < handle psf = {}; end - algo = Gt6DBlobReconstructor(volume_size, blobs, ... - 'data_type', self.data_type, ... - 'geometries', geometries, ... - 'offsets', offsets, ... - 'ss_geometries', geometries_ss, ... - 'ss_offsets', offsets_ss, ... - 'use_astra_projectors', true, ... - 'volume_ss', self.volume_downscaling, ... - 'psf', psf, ... - varargin{:} ); + algo_params = struct( ... + 'blobs', {blobs}, ... + 'geometries', {geometries}, ... + 'offsets', {offsets}, ... + 'geometries_ss', {geometries_ss}, ... + 'offsets_ss', {offsets_ss}, ... + 'psf', {psf}, ... + 'good_orients', {good_orients} ); end - end - methods (Access = protected) function [sub_blob_slices, proj_coeffs] = get_sub_blobs(self, blobs, slices_interp, padding) num_blobs = numel(blobs); sub_blob_slices = cell(num_blobs, 1);