diff --git a/4_grains/gtGrainTopotomoUpdateParameters.m b/4_grains/gtGrainTopotomoUpdateParameters.m index 4430a9137a44a21e3cc4afa1ec7a323585bad43c..9edb332970cd424bcca3e6c9cf2ad1d7dbfddc7c 100644 --- a/4_grains/gtGrainTopotomoUpdateParameters.m +++ b/4_grains/gtGrainTopotomoUpdateParameters.m @@ -1,14 +1,19 @@ -function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_basetilt, p, detgeo_tt, pl_ind, gr) +function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_basetilt, p, detgeo_tt, pl_ind, gr, varargin) + conf = struct('check_flips', false, 'verbose', true); + conf = parse_pv_pairs(conf, varargin); + if (~exist('p', 'var') || isempty(p)) p = gtLoadParameters(); end + o = GtConditionalOutput(conf.verbose); + [tt_scan_dir, ~, ~] = fileparts(scan_xml); - fprintf('Importing Topotomo acquisition into current DCT parameters:\n') - fprintf(' - Path of Topotomo scan: %s\n', tt_scan_dir) - fprintf(' - Path of DCT scan: %s\n', p.acq(1).dir) + o.fprintf('Importing Topotomo acquisition into current DCT parameters:\n') + o.fprintf(' - Path of Topotomo scan: %s\n', tt_scan_dir) + o.fprintf(' - Path of DCT scan: %s\n', p.acq(1).dir) if (~isfield(p.acq(1), 'motors')) - fprintf(' - Reading DCT motor positions..') + o.fprintf(' - Reading DCT motor positions..') c = tic(); xmlfname = fullfile(p.acq.dir, '0_rawdata', 'Orig', [p.acq.name '.xml']); acq_xml = gtLoadAcquisitionXML(xmlfname, false, false); @@ -21,19 +26,20 @@ function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_bas new_acq(ii_a) = gtAddMatFile(base_acq, p.acq(ii_a), true); end p.acq = new_acq; - fprintf('\b\b: Done in %g seconds.\n', toc(c)) + o.fprintf('\b\b: Done in %g seconds.\n', toc(c)) end acq_tt = p.acq(1); - fprintf(' - Reading Topotomo acquisition parameters..') + o.fprintf(' - Reading Topotomo acquisition parameters..') c = tic(); topotomo_xml = gtLoadAcquisitionXML(scan_xml, false, false); acq_tt = gtAddMatFile(acq_tt, topotomo_xml, true, false, false); acq_tt.type = 'topotomo'; % The XML tends to set it to 360degree acq_tt = gtAcqDefaultParameters(acq_tt); acq_tt.collection_dir = tt_scan_dir; - fprintf('\b\b: Done in %g seconds.\n', toc(c)) + o.fprintf('\b\b: Done in %g seconds.\n', toc(c)) + if (acq_tt.energy < 0) disp(' ') warning('Energy reported by the XML file is: %d, parsing info file...', acq_tt.energy) @@ -46,37 +52,42 @@ function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_bas disp(' ') end -% % Check for flips: -% cfg_file = fullfile(tt_scan_dir, [acq_tt.name '.cfg']); -% fid = fopen(cfg_file); -% valid = true; -% file_content = {}; -% while (valid) -% file_content{end+1} = fgets(fid); %#ok<AGROW> -% valid = file_content{end} ~= -1; -% end -% fclose(fid); -% file_content = [file_content{:}]; -% horz_flip = regexp(file_content, 'ccd_flip_horz\s*(?<value>\d+)', 'names', 'once'); -% vert_flip = regexp(file_content, 'ccd_flip_vert\s*(?<value>\d+)', 'names', 'once'); -% if (str2double(horz_flip.value)) -% acq_tt.detroi_u_off = acq_tt.true_detsizeu - acq_tt.detroi_u_off; -% end -% if (str2double(vert_flip.value)) -% acq_tt.detroi_v_off = acq_tt.true_detsizev - acq_tt.detroi_v_off; -% end + % Automatically checking for flips: + if (conf.check_flips) + o.fprintf(' - Checking topotomo image flips..') + c = tic(); + cfg_file = fullfile(tt_scan_dir, [acq_tt.name '.cfg']); + fid = fopen(cfg_file); + valid = true; + file_content = {}; + while (valid) + file_content{end+1} = fgets(fid); %#ok<AGROW> + valid = file_content{end} ~= -1; + end + fclose(fid); + file_content = [file_content{:}]; + horz_flip = regexp(file_content, 'ccd_flip_horz\s*(?<value>\d+)', 'names', 'once'); + vert_flip = regexp(file_content, 'ccd_flip_vert\s*(?<value>\d+)', 'names', 'once'); + if (str2double(horz_flip.value)) + acq_tt.detroi_u_off = acq_tt.true_detsizeu - acq_tt.detroi_u_off; + end + if (str2double(vert_flip.value)) + acq_tt.detroi_v_off = acq_tt.true_detsizev - acq_tt.detroi_v_off; + end + o.fprintf('\b\b: Done in %g seconds.\n', toc(c)) + end dct_samt = [p.acq(1).motors.samtx, p.acq(1).motors.samty, p.acq(1).motors.samtz]; tt_samt = [acq_tt.motors.samtx, acq_tt.motors.samty, acq_tt.motors.samtz]; + % samr X and Y reversed, because the first on the right is the one + % applied first when doing SAM->LAB dct_samr = [p.acq(1).motors.samry, p.acq(1).motors.samrx]; tt_samr = [acq_tt.motors.samry, acq_tt.motors.samrx]; - dct_diffrz_start = p.acq(1).motors.diffrz; - + % Translations should be handled a bit differently, especially if there + % were some initial tilts in the DCT acquisition acq_tt.sample_shifts = tt_samt - dct_samt; - % samr X and Y reversed, because the first on the right is the one - % applied first when doing SAM->LAB acq_tt.sample_tilts = tt_samr - dct_samr; acq_tt.range_basetilt = range_basetilt; @@ -87,18 +98,21 @@ function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_bas p.acq(end+1) = acq_tt; det_ind = numel(p.acq); + p.diffractometer(det_ind) = gtGeoDiffractometerDefinition('esrf_id11', ... + 'axes_rotation_offset', p.acq(1).motors.diffrz, ... + 'shifts_sam_stage', acq_tt.sample_shifts ); + p.detgeo(det_ind) = detgeo_tt; + % It might be that the Detector definition ha to be shifted as well!! +% p.detgeo(det_ind).detrefpos = p.detgeo(det_ind).detrefpos + p.diffractometer(det_ind).shifts_sam_stage; + p.recgeo(det_ind) = p.recgeo(1); p.recgeo(det_ind).voxsize = mean([detgeo_tt.pixelsizeu, detgeo_tt.pixelsizev]) * [1, 1, 1]; if (isempty(pl_ind)) - fprintf(' - Guessing Topotomo pl_ind, with respect to DCT (for the range: [%g, %g])..', range_basetilt) + o.fprintf(' - Guessing Topotomo pl_ind, with respect to DCT (for the range: [%g, %g])..', range_basetilt) c = tic(); % Trying to detect the tilts - p.diffractometer(det_ind) = gtGeoDiffractometerDefinition('esrf_id11', ... - 'axes_rotation_offset', dct_diffrz_start, ... - 'shifts_sam_stage', acq_tt.sample_shifts); - diff = p.diffractometer(det_ind); tilts = p.acq(det_ind).sample_tilts; t = gtGeoDiffractometerTensor(diff, 'sam2lab', 'angles_sam_tilt', tilts); @@ -107,9 +121,9 @@ function p = gtGrainTopotomoUpdateParameters(scan_xml, range_basetilt, nproj_bas pl_labd = gtGeoSam2Lab(pl_samd_sign, t, p.labgeo, p.samgeo, true); angle = gtMathsVectorsAnglesDeg(diff.axes_rotation, pl_labd, false); - fprintf('\b\b: Done in %g seconds.\n', toc(c)) + o.fprintf('\b\b: Done in %g seconds.\n', toc(c)) [~, pl_ind] = min(angle); - fprintf(' + Chosen pl_ind: %d (%g deg)\n', pl_ind, angle(pl_ind)) + o.fprintf(' + Chosen pl_ind: %d (%g deg)\n', pl_ind, angle(pl_ind)) end p.acq(det_ind).pl_ind = pl_ind; end \ No newline at end of file