From c25921e437cde34190390533ce289f0f1cbaef74 Mon Sep 17 00:00:00 2001 From: Laura Nervo <laura.nervo@esrf.fr> Date: Thu, 24 Jan 2013 16:58:00 +0100 Subject: [PATCH] General commenting and formatting, modified inputs, unified mis_angle calculation for cubic and hexagonal Signed-off-by: Laura Nervo <laura.nervo@esrf.fr> --- zUtil_Twins/gtTwinTest.m | 283 ++++++++++++++++----------------------- 1 file changed, 115 insertions(+), 168 deletions(-) diff --git a/zUtil_Twins/gtTwinTest.m b/zUtil_Twins/gtTwinTest.m index d093093c..fa174d71 100644 --- a/zUtil_Twins/gtTwinTest.m +++ b/zUtil_Twins/gtTwinTest.m @@ -1,9 +1,13 @@ -function out = gtTwinTest(phaseid, parameters, grain1, grain2, grain) -% out = gtTwinTest(phaseid, parameters, grain1, grain2, grain) +function out = gtTwinTest(phaseid, parameters, grain1, grain2, grain, vol_out, id) +% out = gtTwinTest(phaseid, parameters, grain1, grain2, grain, vol_out, id) +% grain1 = grainID for grain 1 +% grain2 = grainID for grain 2 +% grain = grain structure <cell> +% vol_out = output from gt_find_grain_boundaries -pxsize = (parameters.labgeo.pixelsizeu + parameters.labgeo.pixelsizev)/2; crystal_system = parameters.cryst(phaseid).crystal_system; spacegroup = parameters.cryst(phaseid).spacegroup; +latticepar = parameters.cryst(phaseid).latticepar; % find the max grainID maxgrain = max(0, grain1); @@ -41,185 +45,128 @@ 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*symm.g maybe should be symm.g*g') - for j=1:24 - g1equiv = g1*symm(j).g; - netg = g1equiv\g2; - rot_offset(j) = acos((trace(netg)-1)/2); - end - - dummy = find(rot_offset ==min(rot_offset)); - g1equiv = g1*symm(dummy).g; + +% same calculation but using hexagonal symm 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*symm.g maybe should be symm.g*g') + for jj=1:length(symm) + g1equiv = g1*symm(jj).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); - end - end + rot_offset(jj) = acos((trace(netg)-1)/2); end - -elseif spacegroup==167 || spacegroup==663 || spacegroup==194 - % same calculation but using hexagonal symm 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*symm.g maybe should be symm.g*g') - for j=1:length(symm) - g1equiv = g1*symm(j).g3; - netg = g1equiv\g2; - rot_offset(j) = acos((trace(netg)-1)/2); - end - - dummy = find(rot_offset ==min(rot_offset)); - g1equiv = g1*symm(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 + + dummy = find(rot_offset ==min(rot_offset)); + g1equiv = g1*symm(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 + end +end -out.grain1 = grain1; -out.grain2 = grain2; + +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; -out.mis_axis = misorientation_axis'; - -hkl=misorientation_axis'; +out.mis_angle = misorientation_angle; +out.mis_axis = 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.mis_axis_hex = hkil; -out.symm = symm; +out.mis_axis_hex = gtCart2Hex(misorientation_axis', latticepar); +out.symm = symm; -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); +out.center1 = grain{grain1}.center; +out.center2 = grain{grain2}.center; +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); +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.angle out.mis_axis_hex out.grain1 out.grain2]; -out.table_header = 'mis_angle angle mis_axis_hex grain1 grain2'; -% -% %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 -% -% -% -% else -% disp('crystallography not supported!') -% end +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.mis_axis_hex out.mis_axis out.grain1 out.grain2]; +out.table_header = 'mis_angle mis_axis_hex mis_axis grain1 grain2'; + +if ~isempty(vol_out) + %even if we have only one grain, can deal with the boundary plane + test = vol_out==id; + [x,y,z]=ind2sub(size(test), find(test)); + [origin, a]=lsplane([x y z]); + + + gb_normal=a; + % gb_normal(3)=-gb_normal(3); + + out.gb_norm = gb_normal'; + out.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 + out.gb_norm_grain1=plane1'; + out.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 + + out.gb_norm_grain1=plane1'; + out.gb_norm_grain2=plane2'; + + if ~isempty(plane1) + hkl=plane1'; + hkil = gtCart2Hex(hkl, parameters.cryst(phaseid).latticepar); + out.gb_norm_hex_grain1=hkil; + else + out.gb_norm_hex_grain1=[]; + end + if ~isempty(plane2) + hkl=plane2'; + hkil = gtCart2Hex(hkl, parameters.cryst(phaseid).latticepar); + out.gb_norm_hex_grain2=hkil; + else + out.gb_norm_hex_grain2=[]; + end + + else + disp('crystallography not supported!') + end +end end -- GitLab