diff --git a/4_grains/gtLoadGrain.m b/4_grains/gtLoadGrain.m index 558c732b14efa0e609d68edefb0de295df12e66a..2e2a2dc2430ebf4760af5790a7fc0a75876762d6 100644 --- a/4_grains/gtLoadGrain.m +++ b/4_grains/gtLoadGrain.m @@ -1,8 +1,13 @@ function grain = gtLoadGrain(phase_id, grain_id, varargin) - conf = struct('fields', {{}}); + conf = struct('fields', {{}}, 'parameters', {[]}); conf = parse_pv_pairs(conf, varargin); - phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + if (isempty(conf.parameters)) + phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + else + phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id)); + end + for ii = numel(grain_id):-1:1 grain_file = fullfile(phase_dir, sprintf('grain_%04d.mat', grain_id(ii))); diff --git a/4_grains/gtLoadGrainRec.m b/4_grains/gtLoadGrainRec.m new file mode 100644 index 0000000000000000000000000000000000000000..9dfe5f40f633f34e4d363c421d8dd35899f04c49 --- /dev/null +++ b/4_grains/gtLoadGrainRec.m @@ -0,0 +1,20 @@ +function grain_det = gtLoadGrainRec(phase_id, grain_id, varargin) + conf = struct('fields', {{}}, 'parameters', {[]}); + conf = parse_pv_pairs(conf, varargin); + + if (isempty(conf.parameters)) + phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + else + phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id)); + end + + for ii = numel(grain_id):-1:1 + grain_file = fullfile(phase_dir, sprintf('grain_details_%04d.mat', grain_id(ii))); + + if (isempty(conf.fields)) + grain_det(ii) = load(grain_file); + else + grain_det(ii) = load(grain_file, conf.fields{:}); + end + end +end diff --git a/4_grains/gtSaveGrain.m b/4_grains/gtSaveGrain.m index d35ddbd77a4c06ba693f035632dcf112aecf6195..d27792346be7c374b4780ce502afc231022a47e9 100644 --- a/4_grains/gtSaveGrain.m +++ b/4_grains/gtSaveGrain.m @@ -1,8 +1,12 @@ function gtSaveGrain(phase_id, grain_id, grain, varargin) - conf = struct('fields', {{}}); + conf = struct('fields', {{}}, 'parameters', {[]}); conf = parse_pv_pairs(conf, varargin); - phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + if (isempty(conf.parameters)) + phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + else + phase_dir = fullfile(conf.parameters.acq.dir, '4_grains', sprintf('phase_%02d', phase_id)); + end grain_file = fullfile(phase_dir, sprintf('grain_%04d.mat', grain_id)); if (isempty(conf.fields)) diff --git a/4_grains/gtSaveGrainRec.m b/4_grains/gtSaveGrainRec.m new file mode 100644 index 0000000000000000000000000000000000000000..c539b09274dc2bbe3449cc38450d9ac6d5f1a747 --- /dev/null +++ b/4_grains/gtSaveGrainRec.m @@ -0,0 +1,31 @@ +function gtSaveGrainRec(phase_id, grain_id, grain_det, varargin) + details_fields = {'VOL3D', 'ODF6D', 'ODFw', 'ODFuvw'}; + conf = struct( ... + 'fields', {details_fields}, ... + 'parameters', {[]}, ... + 'clean', false ); + conf = parse_pv_pairs(conf, varargin); + + % Only allow for the possible fields + conf.fields = intersect(conf.fields, details_fields); + + phase_dir = fullfile('4_grains', sprintf('phase_%02d', phase_id)); + grain_file = fullfile(phase_dir, sprintf('grain_details_%04d.mat', grain_id)); + + if (conf.clean) + if (exist(grain_file, file)) + gr_det = load(grain_file); + else + gr_det = struct(); + end + for ii_f = 1:numel(conf.fields) + gr_det.(conf.fields{ii_f}) = grain_det.(conf.fields{ii_f}); + end + save(grain_file, '-struct', 'gr_det', '-v7.3'); + else + mat_grain_file = matfile(grain_file, 'Writable', true); + for ii_f = 1:numel(conf.fields) + mat_grain_file.(conf.fields{ii_f}) = grain_det.(conf.fields{ii_f}); + end + end +end diff --git a/5_reconstruction/gtAstraReconstructGrain.m b/5_reconstruction/gtAstraReconstructGrain.m index 250176dbd25cf9f80ec036ca7bfa64b79bd51602..83d82f6e3b817a82458f2d36548689ad72466c0e 100644 --- a/5_reconstruction/gtAstraReconstructGrain.m +++ b/5_reconstruction/gtAstraReconstructGrain.m @@ -1,4 +1,4 @@ -function vol = gtAstraReconstructGrain(grainID, phaseID, parameters) +function gtAstraReconstructGrain(grainID, phaseID, parameters) % GTASTRARECONSTRUCTGRAIN 3D ART (ASTRA) reconstruction on a GPU machine % gtAstraReconstructGrain(grainID, phaseID, [parameters]) % ------------------------------------------------------- @@ -13,7 +13,7 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters) % Commenting and formatting % - if ~exist('parameters','var') || isempty(parameters) + if (~exist('parameters','var') || isempty(parameters)) parameters = gtLoadParameters(); end @@ -26,11 +26,15 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters) rec.num_iter = parameters.rec.num_iter; end - gr = gtLoadGrain(phaseID, grainID, 'fields', {'proj', 'selected'}); + gr = gtLoadGrain(phaseID, grainID, 'fields', {'proj'}); + if (~isfield(gr.proj, 'selected')) + gr_extra = gtLoadGrain(phaseID, grainID, 'fields', {'selected'}); + gr.proj.selected = gr_extra.selected; + end gr.proj.num_iter = rec.num_iter; - gr.proj.stack = gr.proj.stack(:, gr.selected, :); - gr.proj.geom = gr.proj.geom(gr.selected, :); + gr.proj.stack = gr.proj.stack(:, gr.proj.selected, :); + gr.proj.geom = gr.proj.geom(gr.proj.selected, :); is_cone = isfield(parameters.labgeo, 'sourcepoint') ... && (~isempty(parameters.labgeo.sourcepoint)); @@ -43,4 +47,11 @@ function vol = gtAstraReconstructGrain(grainID, phaseID, parameters) end gtSaveGrain(phaseID, grainID, gr, 'fields', {'vol'}); + + shift = gtFwdSimComputeVolumeShifts(gr.proj, parameters, size(gr.vol)); + + % Saving details to file + gr.VOL3D = struct('intensity', {gr.vol}, 'shift', {shift}); + + gtSaveGrainRec(phaseID, grainID, gr, 'fields', {'VOL3D'}); end