Skip to content
Snippets Groups Projects
gtReadEBSDMapEulerCTFFile.m 3.77 KiB
Newer Older
function [EBSD_e_map, EBSD_r_map, EBSD_mask] = gtReadEBSDMapEulerCTFFile(filename, axes_perm, permute_maps, stretch_axes, phase_id)
% function [EBSD_e_map, EBSD_r_map] = gtReadEBSDMapEulerCTFFile(filename, axes_perm, permute_maps, stretch_axes, phase_id)
%   Axes permutation allows to easily deal with different reference
%   systems, like for instance:
%       DCT Axes <-> EBSD Axes ([x y z] <-> [x'y'z'])
%           x     =     -y'
%           y     =      z'
%           z     =     -x'
%   Translates to: axes_perm = [-2 3 -1]
%
%   NOTE: Only the Rodrigues vector map has the axes changed!
%

    if (~exist('axes_perm', 'var') || isempty(axes_perm))
        axes_perm = 1:3;
    end

    if (~exist('permute_maps', 'var') || isempty(permute_maps))
        permute_maps = true;
    end

    if (~exist('stretch_axes', 'var') || isempty(stretch_axes))
        stretch_axes = [1 1];
    end
    if (~exist('phase_id', 'var') || isempty(phase_id))
        phase_id = 1;
    end
    c = tic();
    fprintf('Reading from file: "%s"..', filename);

    fid = fopen(filename);
    fgetl(fid);
    fgetl(fid);
    fgetl(fid);
    fgetl(fid);
    dims = fscanf(fid, 'XCells\t%d\nYCells\t%d\nXStep\t%f\nYStep\t%f\n');
    fscanf(fid, 'AcqE1\t%d\nAcqE2\t%d\nAcqE3\t%d\n'); % Unknown parameters
    fgetl(fid);
    fgetl(fid);
    fgetl(fid);
    fgetl(fid);
    input = fscanf(fid, '%d\t%f\t%f\t%d\t%d\t%f\t%f\t%f\t%f\t%d\t%d');
    fclose(fid);

    fprintf('\b\b, Done in %f seconds.\n', toc(c));
    c = tic();
    fprintf('Converting to Euler and Rodriguez maps..');

    input = reshape(input, 11, [])';

%     scales = dims(3:4);
%
%     xx = (input(:, 2) ./ scales(1)) + 1;
%     yy = (input(:, 3) ./ scales(2)) + 1;

    ea1 = input(:, 6);
    ea2 = input(:, 7);
    ea3 = input(:, 8);

    sizes = dims(1:2)';
    EBSD_e_map = cat(3, reshape(ea1, sizes), reshape(ea2, sizes), reshape(ea3, sizes));
%     EBSD_e_map = zeros([sizes 3], 'single');
%     ii = sub2ind([sizes, 3], yy, xx, 1 * ones(size(xx)));
%     EBSD_e_map(ii) = ea1;
%     ii = sub2ind([sizes, 3], yy, xx, 2 * ones(size(xx)));
%     EBSD_e_map(ii) = ea2;
%     ii = sub2ind([sizes, 3], yy, xx, 3 * ones(size(xx)));
%     EBSD_e_map(ii) = ea3;

%     EBSD_e_map = EBSD_e_map * 180 / pi;

    p = gtLoadParameters();
    cryst_system = p.cryst(phase_id).crystal_system;
    cryst_spacegroup = p.cryst(phase_id).spacegroup;
    symm = gtCrystGetSymmetryOperators(cryst_system, cryst_spacegroup);

    dmvol_EBSD_e_map = permute(EBSD_e_map, [1 2 4 3]);
    [gvdm_EBSD_e_map, size_dmvol_EBSD_map] = gtDefDmvol2Gvdm(dmvol_EBSD_e_map);
    gvdm_EBSD_r_map = gtMathsEuler2Rod(gvdm_EBSD_e_map);
    fprintf('\b\b, Done in %f seconds.\n', toc(c));
    c = tic();
    fprintf('Mapping Rodrigues vectors to fundamental zone..');
    gvdm_EBSD_r_map = gtMathsRod2RodInFundZone(gvdm_EBSD_r_map, symm);
    fprintf('\b\b, Done in %f seconds.\n', toc(c));
    c = tic();
    fprintf('Applying requested transformations..');
    dmvol_EBSD_r_map = gtDefGvdm2Dmvol(gvdm_EBSD_r_map, size_dmvol_EBSD_map);
    EBSD_r_map = reshape(dmvol_EBSD_r_map, [sizes 3]);

    EBSD_r_map = EBSD_r_map(:, :, abs(axes_perm));
    negative = axes_perm < 0;
    EBSD_r_map(:, :, negative) = - EBSD_r_map(:, :, negative);

    EBSD_mask = input(:, 1);
    EBSD_mask = reshape(EBSD_mask, sizes);
    if (any(stretch_axes ~= 1))
        EBSD_e_map = imresize(EBSD_e_map, 'nearest', 'scale', stretch_axes);
        EBSD_r_map = imresize(EBSD_r_map, 'nearest', 'scale', stretch_axes);
        EBSD_mask = imresize(EBSD_mask, 'nearest', 'scale', stretch_axes);
    EBSD_mask = logical(EBSD_mask);

    if (permute_maps)
        EBSD_e_map = permute(EBSD_e_map, [2 1 3]);
        EBSD_r_map = permute(EBSD_r_map, [2 1 3]);
        EBSD_mask = EBSD_mask';
    end

    fprintf('\b\b, Done in %f seconds.\n', toc(c));
end