Skip to content
Snippets Groups Projects
gtTwinTest.m 7.32 KiB
Newer Older
function out = gtTwinTest(phaseid, parameters, grain1, grain2, grain)
% out = gtTwinTest(phaseid, parameters, grain1, grain2, grain)
pxsize  = (parameters.labgeo.pixelsizeu + parameters.labgeo.pixelsizev)/2;
spacegroup = parameters.cryst(phaseid).spacegroup;
maxgrain = max(0, grain1);
maxgrain = max(maxgrain, grain2);
r_vectors = [];
for ii=1:length(grain)
    r_vectors(ii, 1) = ii;
    r_vectors(ii, 2:4) = grain{ii}.R_vector;
end


% get sym operators
if spacegroup==225 || spacegroup==229
    % cubic material
    sym = gtGetCubicSymOp();
elseif spacegroup==167 || spacegroup==663 || spacegroup==194
    % hexagonal material - 4x4 element sym operators
    sym = gtGetHexagonalSymOp_sab();
else
    disp('unrecognised spacegroup! quitting...')
    R1 = r_vectors(grain1,2:4);
    g1 = Rod2g(R1);
    R2 = r_vectors(grain2,2:4);
    g2 = Rod2g(R2);
end

% this only works for cubic systems until someone works out how to pdo te
% permutations of the g1 for the hexagonal system
if spacegroup==225 || spacegroup==229
    
    % calculate the misorientation angle and axis between these grains
    if ~isempty(g1) && ~isempty(g2)
        %if we have both grains
        %need to search symmetry equivelents for the minimum misorientation
        rot_offset=[];
        % warning('g*sym.g maybe should be sym.g*g')
        for j=1:24
            g1equiv = g1*sym(j).g;
            netg = g1equiv\g2;
            rot_offset(j) = acos((trace(netg)-1)/2);
        end
        
        dummy = find(rot_offset ==min(rot_offset));
        g1equiv = g1*sym(dummy).g;
        netg = g1equiv\g2;
        
        misorientation_angle = acosd((trace(netg)-1)/2);
        
        [eigVec, eigVal]=eig(netg);
        for p=1:3
            if isreal(eigVec(:,p))  %find the real eigenvector - should be just one
                misorientation_axis=eigVec(:,p);
            end
        end
    end
    
elseif spacegroup==167 || spacegroup==663 || spacegroup==194
    % same calculation but using hexagonal sym operations
    % calculate the misorientation angle and axis between these grains
    if ~isempty(g1) && ~isempty(g2)
        %if we have both grains
        %need to search symmetry equivelents for the minimum misorientation
        rot_offset=[];
        % warning('g*sym.g maybe should be sym.g*g')
        for j=1:length(sym)
            g1equiv = g1*sym(j).g3;
            netg = g1equiv\g2;
            rot_offset(j) = acos((trace(netg)-1)/2);
        end
        
        dummy = find(rot_offset ==min(rot_offset));
        g1equiv = g1*sym(dummy).g3;
        netg = g1equiv\g2;
        
        misorientation_angle = acosd((trace(netg)-1)/2);
        
        [eigVec, eigVal]=eig(netg);
        for p=1:3
            if isreal(eigVec(:,p))  %find the real eigenvector - should be just one
                misorientation_axis=eigVec(:,p);
                eigVal=eigVal(p,p);
            end
        end
end

out.grain1 = grain1;
out.grain2 = grain2;
out.grain1_R_vector = r_vectors(grain1,2:4);
out.grain2_R_vector = r_vectors(grain2,2:4);
out.mis_angle = misorientation_angle;
hkl=misorientation_axis';

hkil=[];
hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
hkil(2) = (2/sqrt(3))*hkl(2);
hkil(3) = -(hkil(1) + hkil(2));
hkil(4) = hkl(3);
% account for lattice vector lengths
hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1)));
hkil(4)   = hkil(4) / (1/parameters.cryst(phaseid).latticepar(3));
out.angle = rad2deg(atan2(norm(cross(R1,R2)), dot(R1,R2)));


out.center1 = grain{grain1}.center/pxsize;
out.center2 = grain{grain2}.center/pxsize;
out.dist_centers   = norm(out.center1-out.center2);
out.radius1 = min(grain{grain1}.stat.bbxsmean,grain{grain1}.stat.bbysmean);
out.radius2 = min(grain{grain2}.stat.bbxsmean,grain{grain2}.stat.bbysmean);
out.distf = parameters.index.strategy.m.end.distf;
out.is_inside1 = (out.dist_centers < out.distf*out.radius1);
out.is_inside2 = (out.dist_centers < out.distf*out.radius2);


gtDBConnect();
[int, x, y] = mym(['select avintint, avbbXsize, avbbYsize from ' parameters.acq.pair_tablename ' where grainID = ',num2str(grain1)]);
out.avgint1 = mean(int);
[int, x, y] = mym(['select avintint, avbbXsize, avbbYsize from ' parameters.acq.pair_tablename ' where grainID = ',num2str(grain2)]);
out.avgint2 = mean(int);
out.ratio1 = out.dist_centers/(out.radius1*out.distf);
out.ratio2 = out.dist_centers/(out.radius2*out.distf);

out.table = [out.mis_angle out.dist_centers out.distf out.distf*out.radius1 out.distf*out.radius2];
out.table_header = 'mis_angle  dist_centers  distf  distf*radius1  distf*radius2';
%
%         %even if we have only one grain, can deal with the boundary plane
%         test = vol_out==i;
%         [x,y,z]=ind2sub(size(test), find(test));
%         [origin, a]=lsplane([x y z]);
%
%
%         gb_normal=a;
%        % gb_normal(3)=-gb_normal(3);
%
%         gb_norm = gb_normal';
%         gb_centre = origin';
%
%         if ~isempty(g1equiv)
%             plane1=g1equiv\gb_normal;
%         elseif ~isempty(g1)
%             plane1=g1\gb_normal;
%         else
%             plane1=[];
%         end
%
%         if ~isempty(g2)
%             plane2=g2\gb_normal;
%         else
%             plane2=[];
%         end
%
%         if spacegroup==225 || spacegroup==229
%             % if cubic then this is the index plane
%             gb_norm_grain1=plane1';
%             gb_norm_grain2=plane2';
%
%         elseif spacegroup==167 || spacegroup==663 || spacegroup==194
%             % if hexagonal, keep cartesian vector, but also
%             % convert the cartesian plane normal to hexagonal four index notation
%             % ditto for misorientation axis
%
%             gb_norm_grain1=plane1';
%             gb_norm_grain2=plane2';
%
%             if ~isempty(plane1)
%                 hkl=plane1;
%                 hkil=[];
%                 hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
%                 hkil(2) = (2/sqrt(3))*hkl(2);
%                 hkil(3) = -(hkil(1) + hkil(2));
%                 hkil(4) = hkl(3);
%                 % account for lattice vector lengths
%                 hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1)));
%                 hkil(4)   = hkil(4) / (1/parameters.cryst(phaseid).latticepar(3));
%
%                 gb_norm_hex_grain1=hkil;
%             else
%                 gb_norm_hex_grain1=[];
%             end
%
%             if ~isempty(plane2)
%                 hkl=plane2;
%
%                 hkil=[];
%                 hkil(1) = hkl(1) - (1/sqrt(3))*hkl(2);
%                 hkil(2) = (2/sqrt(3))*hkl(2);
%                 hkil(3) = -(hkil(1) + hkil(2));
%                 hkil(4) = hkl(3);
%                 % account for lattice vector lengths
%                 hkil(1:3) = hkil(1:3) / (2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1)));
%                 hkil(4)   = hkil(4) / (1/parameters.cryst(phaseid).latticepar(3));
%                 gb_norm_hex_grain2=hkil;
%             else
%                 gb_norm_hex_grain2=[];
%             end