function [ref_match, twin_match] = gt6DGetMatchingReflections(ref_or, ors, angular_toll, cryst) % ref_match contains the indices of shared reflections in the % twin_gr.allblobs list: i.e. [0 10; ...] would tell us that % ref.allblobs(1) shares a spot with twin_or(2).allblobs(10) % % twin_match contains the indices of shared reflections in the % ref_gr.allblobs list: i.e. [10 0; ...] would tell us that % twin_or(1).allblobs(1) shares a spot with ref_gr.allblobs(10) if (~exist('angular_toll', 'var') || isempty(angular_toll)) angular_toll = 1; % degrees end ref_ws = ref_or.allblobs.omega; ref_ns = ref_or.allblobs.eta; ref_tt = ref_or.allblobs.thetatype; ref_Lfactors = ref_or.allblobs.lorentzfac; w_toll = angular_toll * ref_Lfactors; n_toll = angular_toll; ors_allblobs = [ors(:).allblobs]; ors_ws = cat(2, ors_allblobs(:).omega); ors_ns = cat(2, ors_allblobs(:).eta); ors_tt = cat(2, ors_allblobs(:).thetatype); num_ors = numel(ors); num_spots = numel(ref_ws); ones_array = ones(num_spots, num_ors); ref_match = zeros(num_spots, num_ors); twin_match = zeros(num_spots, num_ors); row_ind = []; for ii = 1 : num_spots ref_ws_array = ref_ws(ii) * ones_array; ref_ns_array = ref_ns(ii) * ones_array; ref_tt_array = ref_tt(ii) * ones_array; tt_equal = ref_tt_array == ors_tt; w_diff = abs(mod(ref_ws_array - ors_ws + 180, 360) - 180); n_diff = abs(mod(ref_ns_array - ors_ns + 180, 360) - 180); [row_ind, col_ind] = find((w_diff < w_toll(:,ones(num_ors,1))) & (n_diff < n_toll) & tt_equal); if ~isempty(row_ind) for jj = 1 : numel(row_ind) ref_match(ii, col_ind(jj)) = row_ind(jj); twin_match(row_ind(jj), col_ind(jj)) = ii; end end end end