Simulating pulse EPR spectra

This user guide explains how to simulate a variety of pulse EPR spectra, using EasySpin's function saffron.

saffron can simulate data from a broad range of pulse EPR experiments. The most common ones are predefined: 2-pulse ESEEM, 3-pulse ESEEM, 4-pulse ESEEM, HYSCORE and Mims ENDOR. Others can be simulated using saffron's interface for custom user-defined pulse sequences. It can accommodate a single electron spin (S=1/2 or S>1/2) coupled to an arbitrary number of magnetic nuclei.

saffron has some limitations. Currently, it can only simulate experiments with rectangular pulses and a single microwave carrier frequency. Relaxation is limited to T1 and T2.

In the following, we go over the following topics:

Look at the list of examples for more examples on how to use saffron.
Running the simulation

To simulate a pulse EPR spectrum, use EasySpin's saffron function. Its usage conforms with the other simulation functions in EasySpin. You need to provide it with two input arguments. The first one collects information about the spin system, and the second one collects information about the pulse experiment. There is an optional third input argument that allows you to set some algorithmic parameters.

Here is a simple example upfront, before we dive into more detail. Let's take a simple spin system: an electron spin coupled to a proton with a relatively weak hyperfine coupling.

Sys.g = 2;
Sys.Nucs = '1H';   % a proton
Sys.A = [2 3 6];   % MHz

For more details on spin systems and their parameters, look at the page on the spin Hamiltonian.

For the experimental information, the minimum information you need to provide is the magnetic field and the type of experiment, including its settings. For example, for

Exp.Field = 350;            % mT
Exp.Sequence = '2pESEEM';
Exp.dt = 0.005;             % us (microseconds)

With these inputs, you can call the simulation function. If you don't ask for outputs, then it will plot the result. Otherwise, you get the result stored in the outputs, and no plotting is happening. For two-pulse ESSEM, a 1D experiment, the first output is the time τ, and the second output is the echo amplitude.

saffron(Sys,Exp);           % plots the results

[tau,V] = saffron(Sys,Exp);   % returns results in t (us) and V 
plot(tau,real(V),tau,imag(V));  % plotting real and imaginary part separately
Experimental parameters

The most important parameters for a pulse EPR simulation are the magnetic field and the pulse experiment. The magnetic field is given in Exp.Field, in units of millitesla (mT):

Exp.Field = 350;   % mT

There are two ways to specify the pulse experiment. You can either use one of the built-in ones, or you can define it fully yourself. We will discuss user-defined experiments further down. The pre-defined built-in experiments include 2-pulse ESEEM, 3-pulse ESEEM, 4-pulse ESEEM, HYSCORE, and Mims ENDOR. You specify them in the field Exp.Sequence.

Exp.Sequence = '2pESEEM';
Exp.Sequence = '3pESEEM';
Exp.Sequence = '4pESEEM';
Exp.Sequence = 'HYSCORE';
Exp.Sequence = 'MimsENDOR';

In these pre-defined pulse sequence, all microwave pulses are treated as ideal (infinitely short, infinite bandwidth). The RF pulse in Mims ENDOR is assumed to have infinitely narrow excitation bandwidth. Each of these pre-defined pulse experiments needs additional parameter settings. If you run any of the ESEEM/HYSCORE experiments, then you need to provide a time increment interval in Exp.dt. Note that the units are microseconds, not nanoseconds.

Exp.dt = 0.010;    % microseconds; equal to 10 ns

For the two-dimensional HYSCORE experiment, saffron will use Exp.dt for both dimensions.

Next, you need to specify whatever additional parameters are required for the pre-defined experiment you selected. For the ESEEM and HYSCORE experiment, these include initial inter-pulse delays:

% Two-pulse ESEEM
Exp.tau = 0.080;   % initial tau value, in us

% Three-pulse ESEEM, four-pulse ESEEM
Exp.tau = 0.120;   % fixed tau value, in us
Exp.T = 0.100;     % initial T value, us

Exp.tau = 0.130;   % fixed tau value, in us
Exp.t1 = 0.100;    % staring value of t1, in us
Exp.t2 = 0.100;    % staring value of t2, in us

For Mims ENDOR, you must specify the frequency range in Exp.Range, in units of MHz:

Exp.Range = [2 40];     % MHz

Further, you can specify the number of points. This is done in Exp.nPoints. If you don't give it, EasySpin uses a default value.

Exp.nPoints = 200;   % for 1D experiments, or 2D experiments with equal dimensions
Exp.nPoints = [200 100]  % for 2D experiments with unequal dimensions
Orientation selection

By default, all pulses are assumed to have infinite excitation bandwidth. This means that you will get a full powder spectrum, no matter what microwave frequency you are using. However, in practice, microwave pulse excitation bandwidths do not exceed 100 MHz or so. As a consequence, only spins within a subset of orientations in a powder sample are excited. This is referred to as orientation selection. Often, the limited excitation bandwidth also results in selective excitation of certain EPR transitions. This is termed transition selection.

Let's look at how orientation and transition selection can be accounted for in a simulation. The excitation bandwidth of a rectangular pulse is determined by its length. You can give finite pulse lengths when specifying the pulse experiment yourself, see below. However, when using the built-in experiment definitions, this is not possible. Instead, saffron offers a simple mechanism to include effects of orientation selection using the field Exp.ExciteWidth. The excitation profile of the first pulse in the sequence is approximated as Gaussian, and Exp.ExciteWidth is its full width at half maximum (FWHM), in MHz.

Exp.ExciteWidth = 50;    % FWHM of Gaussian excitation profile, in MHz

With limited pulse excitation bandwidth, it is now necessary to specify the microwave pulse carrier frequency. As elsewhere in EasySpin, this is in units of GHz.

Exp.mwFreq = 9.5;   % GHz

Both Exp.ExciteWidth and Exp.mwFreq are necessary to obtain orientation selection. If your excitation bandwidth is narrow, and your magnetic field/microwave frequency settings are off-resonant relative to any EPR transition, you won't get any intensity in your pulse EPR spectrum.

User-defined experiments

saffron allows you specify your own custom pulse sequencey. For this, you need to provide full details about pulses, delays and incrementation. A pulse experiment is specified in two parts: the pulse sequence and the incrementation scheme. Together, they fully specify the pulse experiment.

To specify the pulse sequence, you need to provide details about each (rectangular) pulse and its temporal placement relative to the preceding on. Each pulse needs a flip angle and a duration. The flip angles go into Exp.Flip, as multiples of 90°. The durations are expected in, in units of microseconds.

% Two-pulse ESEEM sequence
Exp.Flip = [1 2];        % 90° - 180° = [0.010 0.020];  % pulse durations, us

% HYSCORE sequence
Exp.Flip = [1 1 2 1];      % 90° - 90° - 180° - 90° = [1 1 1 1]*0.010;  % all pulses same length, us

Setting a pulse length in to zero corresponds to an zero-length pulse with infinite excitation bandwidth and flip angle given in Exp.Flip.

If you have pulses with different phases, specify the phases in Exp.Phase. Again, give it in multiples of 90°

Exp.Phase = [0 0 2 0];     % phases (+x,+x,-x,+x)

This defines the pulse sequence. Next, we need to define the incrementation scheme. This includes specifying which pulse intervals are incremented or decremented, and which dimension in the data the incrementation should count for. For this, use Exp.Inc. For each inter-pulse delay, there should be one number: 0 indicates fixed, 1 indicates variation as 1st data dimension, 2 indicates variation as 2nd data dimension. Here are a few examples:

Exp.Inc = [1 1];       % two-pulse ESEEM
Exp.Inc = [0 1 0];     % three-pulse ESEEM
Exp.Inc = [1 2 1];     % 2D three-pulse ESEEM
Exp.Inc  = [0 1 2 0];  % HYSCORE

If you want to decrement an interval instead of incrementing it, use negative signs. For, example, the following gives a one-dimensional incrementation scheme where the second interval is incremented and the third one is decrement at the same time. This gives a fixed-length pulse experiment.

Exp.Inc = [0 1 -1 0];   % combination of increment and decrement

To complete the pulse experiment specification, we need the starting values for all the intervals (Exp.t) and the step sizes (Exp.dt). For each pulse interval, no matter whether it is fixed or varied during the experiment, you must provide an initial duration, in us.

Exp.t = [0.100 0.100];              % two-pulse ESEEM, us
Exp.t = [0.130 0.080 0.080 0.130];  % HYSCORE, us

The step sizes are given in Exp.dt. For a one-dimensional experiment, give just one value. For a two-dimensional experiment, you can give one or two values. As for all time quantities, the units are microseconds.

% 1D experiments
Exp.dt = 0.010;          % us

% 2D experiments
Exp.dt = [0.010 0.050];  % different step sizes, us
Exp.dt = [0.010 0.010];  % equal step sizes, us
Exp.dt = 0.010;          % expands to [0.010 0.010]

For more settings, such as coherence filters, see the reference page on saffron.

Single crystals

By default, saffron simulates powder spectra. But just like all other EasySpin simulation functions, it can also handle single crystals. For this, use the fields Exp.CrystalOrientation (for the crystal orientation in the spectrometer) and Exp.CrystalSymmetry (for the space group of the crystal). For more details, see the pages on frames and crystal simulations.


saffron has a range of settings that can be used to adjust the level of theory and other aspects of the simulation. These are provided in the third input argument to saffron, usually called Opt. One of the most often neede parameters is Opt.nKnots, which specifies the resolution of the orientational grid used for powder simulations. The higher the number in Opt.nKnots, the finer the grid.

Opt.nKnots = 19;   % 5° increments
Opt.nKnots = 31;   % 3° increments
Opt.nKnots = 46;   % 2° increments
Opt.nKnots = 91;   % 1° increments

By default, EasySpin uses a mid-range resolution. For systems with very anisotopic tensors, it is often necessary to manually increase Opt.nKnots to get fully converged spectra.

Another useful setting concerns the "product rule". This rule states that ESEEM traces from a spin system with multiple nuclei can be approximated as sums of products of the ESEEM traces from single-nucleus subsystems. Using the product rule is an approximation (except for ideal pulses), but can substantially speed up simulations for multi-nuclear systems. By default, it is not used. To activate it, use

Opt.ProductRule = 1;    % use product rule approximation

For other settings, included settings for data processing and display, see the reference page on saffron.