A crystal orientation always appears as a class of symmetrically equivalent rotations which all transform the crystal reference frame into the specimen reference frame and are physicaly not distinguishable.
Lets start by defining some random orientation
% trigonal crystal symmetry
cs = crystalSymmetry('6')
% monoclinic specimen symmetry with respect to the x-axis
ss = specimenSymmetry('112')
% a random orientation
ori = orientation.rand(cs,ss)
cs = crystalSymmetry
symmetry : 6
elements : 6
a, b, c : 1, 1, 1
reference frame: X||a*, Y||b, Z||c*
ss = monoclinic specimenSymmetry
ori = orientation (6 → xyz (112))
Bunge Euler angles in degree
phi1 Phi phi2
176.912 102.148 28.6908
Since orientations transform crystal coordinates into specimen coordinates crystal symmetries will act from the right and specimen symmetries from the left
% symmetrically equivalent orientations with respect to crystal symmetry
ori * cs
ans = orientation (6 → xyz (112))
size: 1 x 6
Bunge Euler angles in degree
phi1 Phi phi2
176.912 102.148 28.6908
176.912 102.148 88.6908
176.912 102.148 148.691
176.912 102.148 208.691
176.912 102.148 268.691
176.912 102.148 328.691
We observe that only the third Euler angle phi2 changes as this Euler angle applies first to the crystal coordinates.
% symmetrically equivalent orientations with respect to specimen symmetry
ss * ori
ans = orientation (6 → xyz (112))
size: 2 x 1
Bunge Euler angles in degree
phi1 Phi phi2
176.912 102.148 28.6908
356.912 102.148 28.6908
Combining crystal and specimen symmetry we obtain 6 crystallographically equivalent orientations to ori
ss * ori * cs
ans = orientation (6 → xyz (112))
size: 2 x 6
Bunge Euler angles in degree
phi1 Phi phi2
176.912 102.148 28.6908
356.912 102.148 28.6908
176.912 102.148 88.6908
356.912 102.148 88.6908
176.912 102.148 148.691
356.912 102.148 148.691
176.912 102.148 208.691
356.912 102.148 208.691
176.912 102.148 268.691
356.912 102.148 268.691
176.912 102.148 328.691
356.912 102.148 328.691
A shortcut for this operation is the command symmetrise
symmetrise(ori)
ans = orientation (6 → xyz (112))
size: 12 x 1
Bunge Euler angles in degree
phi1 Phi phi2
176.912 102.148 28.6908
356.912 102.148 28.6908
176.912 102.148 88.6908
356.912 102.148 88.6908
176.912 102.148 148.691
356.912 102.148 148.691
176.912 102.148 208.691
356.912 102.148 208.691
176.912 102.148 268.691
356.912 102.148 268.691
176.912 102.148 328.691
356.912 102.148 328.691
For specific orientations, e.g. for the cube orientations, symmetrisation leads to multiple identical orientations. This can be prevented by passing the option unique
to the command symmetrise
symmetrise(orientation.id(cs,ss),'unique')
ans = orientation (6 → xyz (112))
size: 6 x 1
Bunge Euler angles in degree
phi1 Phi phi2
180 0 0
240 0 0
120 0 0
300 0 0
60 0 0
0 0 0
Crystal symmetries in computations
Note that all operation on orientations are preformed taking all symmetrically equivalent orientations into account. As an example consider the angle between a random orientation and all orientations symmetricall equivalent to the goss orientation
ori = orientation.rand(cs);
angle(ori,symmetrise(orientation.goss(cs))) ./ degree
ans =
130.2438
130.2438
130.2438
130.2438
130.2438
130.2438
The value is the same for all orientations and equal to the smallest angle to one of the symmetrally equivalent orientations. This can be verified by computing the rotational angle ignoring symmetry.
angle(ori,symmetrise(orientation.goss(cs)),'noSymmetry') ./ degree
ans =
142.1009
130.2438
132.3532
147.6085
170.9167
163.6995
Functions that respect crystal symmetry but allow to switch it off using the flag noSymmetry
include dot, unique, calcCluster.