Coordinate frames in EasySpin

To simulate EPR spectra, EasySpin needs to know about the relative orientations of the various tensors within a paramagnetic molecule or center, of the molecule within a crystal, and of the crystal within the spectrometer in the lab. For this purpose, EasySpin defines a set of standard cartesian coordinate frames. As a user, you specify the relative orientation between these frames in order to describe the geometry of your sample and your experiment.

Four types of frames

The figure below summarizes EasySpin's frames. There are four frame types: the lab frame, the crystal frame, the molecular frame, and a set of tensor frames (one for each tensor). The orientation of the crystal in the lab frame is given in Exp.CrystalOrientation, the orientation of the molecule in the crystal frame is given in Exp.MolFrame, and the orientations of the various tensors in the molecular frame are given in Sys.gFrame, Sys.AFrame, Sys.DFrame, Sys.QFrame, Sys.eeFrame, Sys.nnFrame, and Sys.DiffFrame.

In the following, we explain at how these frames are defined in EasySpin and show how you can specify the relative orientations between them. All frames are right-handed cartesian with orthonormal axes.

Lab frame

The lab frame L is fixed in the laboratory. Its three unit vectors are denoted xL, yL, zL. By universal convention, zL is along the static magnetic field. The directions of xL and yL depend on the microwave excitation mode:

Crystal frame

The crystal frame C is a crystal-fixed frame with orthonormal unit vectors xC, yC, zC. For the crystal frame, EasySpin follows the conventions prevalent in X-ray crystallography where the axis convention depends on the space group of the crystal:

It is important to be aware of to these conventions, as EasySpin relies on them to correctly compute the orientations of all sites in the unit cell of a crystal given the orientation of a site in the asymmetric unit.
Molecular frame

The molecular frame M is a reference frame that is fixed in the molecule or paramagnetic center. Its three unit axes are denoted xM, yM, and zM. You are free to choose the orientation of the molecular frame, but it's best to align it with the local symmetry of the molecule or paramagnetic center. For example, put the zM axis along the plane normal of an aromatic radical or a planar transition metal complex. If you import data from quantum chemistry programs like ORCA, then you can take the frame from those calculations as the molecular frame. All imported atom coordinates and calculated tensors will be defined in this frame. EasySpin can import ORCA calculation results.

Tensor frames

Last, there are the tensor frames T, with unit vectors xT, yT, zT. There is one frame for each tensor in the spin Hamiltonian, such as g, A, D, Q and tensors, as well as the rotational diffusion tensor. The tensor frame for a given tensor is its eigenframe. Its axes are aligned with the principal axes of the tensor. The particular order of principal values, and therefore their assignment to xT, yT, and zT, is arbitrary and up to you.

Next, let's look at how you can tell EasySpin about the relative orientations between these frames.

Tensor orientations within the molecule

In paramagnetic centers, there often exists some local symmetry. An aromatic molecule has a unique plane normal axis, and square-planar transition metal complex has a four-fold symmetry axis perpendicular to the plane. For such a center, atomic coordinates and tensor orientations are best expressed in a coordinate reference frame that aligns with these local symmetry elements. However, any molecule-fixed frame can be chosen as a reference frame. This coordinate frame is the molecular reference frame, or molecular frame for short. The corresponding axes are labeled xM, yM, and zM.

The orientation of every tensor you specify in EasySpin is related to the molecular reference frame. If the tensor is fully aligned with the molecular frame, then it is enough to simply give the three principal values of the tensor

Sys.g = [2.0 2.1 2.2];

For EasySpin, this means that the tensor axes - let's call them xT, yT, and zT - align with the molecular frame. The first g principal axis xT, with the principal value 2.0, is along xM, the second (2.1, yT) is along yM, and the third (2.2, zT) is along zM.

If the tensor is tilted with respect to the molecular frame, you can specify the tilt in terms of three Euler angles that describe the transformation from the molecular frame to the tensor frame (M→T). For a g tensor, specify this in the field Sys.gFrame. Here is an example:

Sys.g = [2.0 2.1 2.2];
Sys.gFrame = [30 27 81]*pi/180;  % Euler angles, molecular frame -> g frame

This means that to transform the molecular frame (M) to the g tensor frame (T), you first rotate the molecular frame by 30 degrees around zM, then by 27 degrees around the resulting y axis, and then by 81 degrees around the resulting z axis. It's important to realize that you rotate the frame, and not the tensor. The tensor stays untouched.

To convert this M→T transformation to the associated T→M transformation (as used in old EasySpin versions prior to 5.0 by the obsolete Sys.gpa), just invert the order and the sign of the three Euler angles.

a_M2T = [30 27 81]*pi/180;       % Euler angles for M->T transformation
a_T2M = [-81 -27 -30]*pi/180;    % Euler angles for corresponding T->M transformation

Sys.gFrame = a_M2T;              % EasySpin 5
% Sys.gpa = a_T2M;               % Obsolete! (valid prior to EasySpin 5)

This works similarly for the other tensors. For hyperfine tensors, use Sys.AFrame, for zero-field tensors Sys.DFrame, for quadrupole tensors Sys.QFrame, for electron-electron interaction tensors Sys.eeFrame, and for nuclear-nuclear interaction tensors Sys.nnFrame.

If you want to get the coordinates of the tensor principal axes in molecular frame coordinates, use the following:

Sys.gFrame = [30 27 81]*pi/180;   % Euler angles for M->T transformation
R_M2T = erot(Sys.gFrame)          % corresponding M->T transformation matrix
R_M2T =
   -0.3731    0.9251   -0.0710
   -0.8404   -0.3045    0.4484
    0.3932    0.2270    0.8910

The first row is xT, the second one is yT, and the third one is zT, all expressed in molecular frame coordinates:

% tensor axes in molecular coordinates
xT_M = R_M2T(1,:).';
yT_M = R_M2T(2,:).';
zT_M = R_M2T(3,:).';

Vice versa, the first column is xM, the second column is yM, and the third column is zM, all expressed in tensor frame coordinates.

% molecular axes in tensor coordinates
xM_T = R_M2T(:,1);
yM_T = R_M2T(:,2);
zM_T = R_M2T(:,3);

Prior to version 5, EasySpin used Sys.gpa, Sys.Apa etc. instead of Sys.gFrame, Sys.AFrame etc. To update old scripts, invert the signs of all the angles, and reverse the order. So the old Sys.gpa = [10 -20 34]*pi/180; is now Sys.gFrame = [-34 20 -10]*pi/180;.

Molecule orientation within the crystal

In crystals, the paramagnetic centers rarely align with the crystal axes. Therefore, it is often necessary to specify a tilt between the crystal frame (C) and the molecular frame (M). In EasySpin, you can do this with Exp.MolFrame. This field takes a set of three values that specify the Euler angles (in radians) for the transformation of the crystal frame to the molecular frame (C→M).

Exp.MolFrame = [33 12 -76]*pi/180;  % Euler angles for C->M transformation

This means that to transform the crystal frame (C) to the molecular frame (M), you first rotate by 33 degrees around zC, then by 12 degrees around the resulting y axis, and then by -76 degrees around the resulting z axis. Again, this transforms the frames, but leaves the physical objects (crystal and molecule) untouched.

To get the vectors xM, yM, zM in crystal coordinates (we'll denote these as xM_C, yM_C, zM_C), use erot to calculate the corresponding transformation matrix:

a_C2M = [33 12 -76]*pi/180;  % Euler angles for C->M transformation
R_C2M = erot(a_C2M)          % corresponding transformation matrix
R_C2M =
    0.7269   -0.6849   -0.0503
    0.6642    0.7198   -0.2017
    0.1744    0.1132    0.9781

The three columns give the crystal axes as vectors expressed in molecular frame coordinates.

% crystal axes in molecular coordinates
xC_M = R_C2M(:,1);
yC_M = R_C2M(:,2);
zC_M = R_C2M(:,3);

The three rows give the molecular axes vectors expressed in crystal frame coordinates.

% molecular axes in crystal coordinates
xM_C = R_C2M(1,:).';
yM_C = R_C2M(2,:).';
zM_C = R_C2M(3,:).';
Crystal orientation in the spectrometer

To describe the alignment of a crystal in the spectrometer, you need to give the relative orientation between the crystal frame (C) and the lab frame (L). In EasySpin, you can do this using the field Exp.CrystalOrientation. This field takes a set of three values that specify the Euler angles (in radians) for the transformation of the crystal frame to the lab frame (C→L). Here is a simple example.

Exp.CrystalOrientation = [30 45 10]*pi/180; % Euler angles for C->L transformation

This indicates that the crystal frame (xC,yC,zC) has to be rotated by 30 degrees around its zC axis, followed by a rotation by 45 degrees around the resulting new y axis, followed by a 10 degree rotation around the resulting z axis, to bring it into overlap with the lab frame (xL,yL,zL).

Exp.CrystalOrientation describes the crystal-to-lab frame transformation (C→L). In order to find the transformation that works in reverse, from the lab to the crystal frame (L→C), use the following: First, determine the Euler angles for the C→L transformation. Then, to get the corresponding L→C transformation, invert the order and the signs of the angles. Here is an example:

a_C2L = [72 15 -108]*pi/180;      % angles for lab -> crystal transformation
a_L2C = [+108 -15 -72]*pi/180;    % angles for corresponding crystal -> lab transformation
Exp.CrystalOrientation = a_C2L;   % EasySpin expects a lab -> crystal transformation

In order to find out how the crystal axes lie in the spectrometer, or how the lab axes lie relative to the crystal frame, use EasySpin's erot to get the associated transformation matrix. Here is an example:

a_C2L = [10 45 0]*pi/180;                % Euler angles for C->L transformation
Exp.CrystalOrientation = a_C2L;
R_C2L = erot(Exp.CrystalOrientation)       % corresponding transformation matrix
R_C2L =
    0.6964    0.1228   -0.7071
   -0.1736    0.9848         0
    0.6964    0.1228    0.7071
In this matrix, the three columns are the three crystal axis vectors xC, yC, zC, represented in lab coordinates. Conversely, the three rows are the lab axis vectors xL, yL, zL, represented in crystal coordinates.
% crystal axes in lab coordinates
xC = R_C2L(:,1);
yC = R_C2L(:,2);
zC = R_C2L(:,3);
% lab axes in crystal coordinates
xL = R_C2L(1,:).';
yL = R_C2L(2,:).';
zL = R_C2L(3,:).';