ARPES API
Bands Class
- class aurelia_arpes.Bands(symmetry=None, klim=None, Nbands=None, warp=None, Npts=None, edges=None)
Calculates the bandstructure based on a tight-binding model. The input arguments are saved in the
Bandsobject.Optional args:
symmetry: A string. Defines the lattice of the tight-binding model. The available inputs are ‘rectangle’, ‘square’, ‘hexagonal’, ‘honeycomb’. If an input is not given, one is chosen at random.klim: A \(2 \times 2\) numpy array defining the limits of \(k_x\) and \(k_y\) in the list. If an input is not given, the lower limit is chosen randomly between \([-1,-0.5]\), and the upper limit is chosen randomly between \([0.5, 1]\).Nbands: An integer defining the number of bands in the tight-binding model. If an input is not given, one is chosen at random between \([1, 5]\).warp: A string. “on” or “off”. Toggles next-nearest neighbour hopping in the tight-binding model.Npts: A \(2 \times 1\) numpy array (elements are integers) defining the number of points calculated in the \(k_x\) and \(k_y\) dimensions.edges: A float slightly larger than one. Since we calculate a limited region of k-space, interpolation may be off at the edges if we use large offset angles in the experiment. Here, the k-space edge is padded and later cropped to exclude artifacts.
- Import_bands(filename)
This function imports bands from a file. The file should have kx in column 1, ky in column 2. Each band should be in its own column from 3 onwards.
args:
filename: A string. The name of the file to be imported.
Saved args:
The following and read from the file and saved to the Bands object:
Npts,kax,kay,klim,kpath,bands,NbandsThe following parameters are defined statically:
bands.edges = 1 bands.warp = "off" bands.symmetry = "custom"
- Make_bands(tb=None, lattice=None)
This function calculates the dispersion using a tight-binding model.
Optional args:
tb: A Python dictionary representing the tight-binding parameters. The dictionary is of the form:
tb = {"E0": [], "t": []}
\(E_0\) and \(t\) must be NumPy arrays of dimension \([1 , N_\text{bands}]\).
\(E_0\) contains the center energies of the bands.
\(t\) contains the hopping parameter of each band.
If the lattice is rectangular (as defined in
Bands.symmetry), then \(t\) must have shape \([2, N_\text{bands}]\).If no input is provided, \(E_0\) is randomly generated in the interval [-1, 0], and \(t\) is randomly generated in the interval [-1, 1].
lattice: A Python dictionary of the lattice parameters.
These lattice parameters define the size of the Brillouin zone and – by extension – the field of view given by the limits set in
Bands.klim. The dictionary is of the form:lattice = {"a": [], "b": []}
\(a\) and \(b\) are floats.
If no input is provided, \(a\) and math:b are calculated from the k-space limits.
Saved args:
Bands.bands: A \([N , N_{\text{bands}}\) numpy array defining the dispersion of each band along the k-path. N is given by the product ofBands.Npts.
- Make_kpath()
This function defines the \(k_x\) and \(k_y\) grid the bands are calculated on. The edges are padded so that rotation and interpolation do not create artifacts. The calculation of the dispersion is not particularly time-intensive, so a grid of points is typically calculated. To speed up computation, the ARPES spectra can be calculated over just \(k_x\), but the grid of points are needed for interpolation in the case of rotational or offset domains.
This function adds the following to the
Bandsobject:Saved args:
Bands.kpath: A \(N \times 2\) numpy array defining the k-path along which the dispersion is calculated. \(N\) is the product of the elements ofBands.Npts. The first and second columns correspond to \(k_x\) and \(k_y\), respectively.Bands.kax: A \(N_\text{pts}^x \times 1\) numpy array defining the \(k_x\) axis. Used for plotting purposes.Bands.kay: A \(N_\text{pts}^y \times 1\) numpy array defining the \(k_y\) axis. Used for plotting purposes.
- print_variables()
Provides a summary of variables used to define the band structure.
Spec Class
- class aurelia_arpes.Spec(bands, dimension=None, Omega=None)
Calculates the photoemission spectra. Includes the Fermi-Dirac distribution, matrix elements and resolution broadening.
args:
The input
bandsis an object. Defines the electronic dispersion and k-path.
Optional args:
dimension: A string. Defines the dimension of the calculation, three modes are available.The input “cube” calculates the spectra in binding energy \(\omega\), and the crystal momenta \(k_x\), and \(k_y\).
The input “sliceEk” calculates the spectra in \(\omega\) and \(k_x\). The “dispersion cut”.
The input “slicekk” calculates the spectra in \(k_x\) and \(k_y\). The “Fermi surface” or “constant energy cut”.
Omega: A \(M \times 1\) numpy array defining the binding energy range points over which the photoemission spectra are calculated.
Saved args:
spec.bands: The object defining the electronic dispersion and k-path.spec.kax: numpy array of shape \((N_\text{pts}^x, 1)\). Defines the \(k_x\) axis. Used for plotting purposes.spec.kay: numpy array of shape \((N_\text{pts}^y, 1)\). Defines the \(k_y\) axis. Used for plotting purposes.spec.matrix_elements: numpy array of shape \((N, N_\text{bands})\). Matrix elements of each band along the k-path. Same shape asBands.bands. Initialized as an array of ones.spec.ReS: numpy array of shape \((M, N_\text{bands})\). The real part of the self-energy, initialized as zeros.spec.ImS: numpy array of shape \((M, N_\text{bands})\). The real part of the self-energy, initialized as with a single value of 0.2.spec.domain: numpy array. Defines the relative intensity of rotational and offset domains. Initialized (for the primary domain) as an array of ones with shape \((1, N_{\text{bands}})\).
- Make_matrix_elements(ME=None)
This function creates fake matrix elements aimed at varying the intensity of bands to mimic photoemission intensity.
args:
A Python dictionary. Defines the type of fake photoemission matrix elements that are generated. Accepts three strings.
"symm": Gives matrix elements the same symmetry as that of the tight-binding model, in that they are periodic in k-space in the same way."rot": Gives matrix elements with rotational symmetry, which mimics the orbital selectivity of linear and/or circularly polarized light."poly": Gives matrix elements defined by a random polynomial. Used to modulate the intensity of the bands and is used to mimic the unpredictable effects of experimental geometry variance in the light.
Saved args:
spec.matrix_elements: A NumPy array defining the matrix elwith the same dimensions asBands.bands.spec.ME: The Python dictionary specifying parameters of the matrix-element calculation.
- Make_self_energy(SE)
This function is optional, since the self-energy is already initialized. For more realistic ARPES spectra, two types of self-energy are available through the input dictionary
SE:args:
SE: a python dictionary. The keytypeaccepts two strings:"FL"or"kink", corresponding to Fermi-liquid or electron-boson kink.for Fermi-liquid type self energy, additional fields
valandImS0may be specified (or will be randomly chosen)for electron-boson kink, additional fields
ImS0,ImS1,Amp,Ekink, andgammamay be specified (or will be randomly chosen).
Saved args:
spec.ReS: numpy array of shape \((M, N_\text{bands})\). The real part of the self-energy.spec.ImS: numpy array of shape \((M, N_\text{bands})\). The real part of the self-energy.spec.SE: the python dictionary with parameters used in the calculation of the self-energy.
- Make_specfun(mod)
This function calculates the photoemission spectral intensity based on the band structure as well as the self-energy given.
args: -
mod: a Python dictionary of the formmod = {"ER": [], "kR": [], "Temp": []}, where the three fields define the energy resolution, the angular resolution, and the electronic temperature, respectively.modis an object generated by theaurelia_static_varsmodule.The outputs of the function are:
spec.mod: The Python dictionary which collects the modification parameters.spec.specfun: A numpy array with a dimension specified byspec.dimension, such that:cube: \(M \times N_{pts}^x \times N_{pts}^y\)sliceEk: \(M \times N_{pts}^x\)slicekk: \(1 \times N_{pts}^x \times N_{pts}^y\)
- Make_specmod(mod)
This function modifies the intensity in
self.specfunby adding the Fermi-Dirac distribution and resolution broadening.args:
mod: an object generated the aurelia_static_vars module. Defines the energy resolution, the angular resolution, and the electronic temperature.
Saved args:
spec.specfun: The modified intensity replaces that previous calculated via spec.Make_specfun(mod)
- print_variables()
Provides a summary of variables used to calculate the measured spectral intensity.
ARPES Class
- class aurelia_arpes.ARPES(spec, exp, ang_lim=None, dimension=None)
This function initializes the ARPES simulation.
args:
spec: An object containing the spectral intensity calculated from the dispersion.exp: An object containing the experimental parameters, initialized from the aurelia_static_vars module.
Optional args:
dimension: A string defining the dimension of the calculation. Three modes are available:"cube": Spectra in binding energy, \(k_x\), and \(k_y\)."sliceEk": Spectra in binding energy and \(k_x\) (dispersion cut)."slicekk": Spectra in \(k_x\) and \(k_y\) (Fermi surface).
The default
dimensionstring is the same asSpec.dimension. IfSpec.dimension = "cube", thenarpes.dimensioncan be set to"sliceEk"or"slicekk". This allows offset and rotational domains to be accurately calculated, while saving computational time and file size.ang_lim: A python dictionary with the fieldsang_lim["th"]andang_lim["ph"]. The values are 2-element numpy arrays defining the limits of \(\theta\) and \(\phi\) seen by the detector. If not specified, the angle limits are calculated using the k-space limits inSpec.
Saved args:
arpes.spec: An object containing the spectral intensity calculated from the dispersion.arpes.exp: An object containing the experimental parameters.arpes.Ek: The kinetic energy axis, calculated as:arpes.dimension: A string defining the dimension of the calculation.arpes.th: A NumPy array of shape \(N_{pts}^x \times 1\). Defines the angles along the \(k_x\) direction.arpes.ph: A NumPy array of shape \(N_{pts}^y \times 1\). Defines the angles along the \(k_y\) direction.arpes.crop: A boolean. Checks if the edges have been cropped. Initialized as false. The edges are defined byBands.edges.
- Crop_edges()
This function crops the edges of the simulation to remove artifacts.
- Make_angle_conv(const=None, domain=None)
This function converts the intensity stored in
spec.specfunin momentum and binding energy toarpes.intensityin angle and kinetic energy.args:
const: A float. If the dimension of the calculation is not"cube", thisgives the value at which the slice is calculated.
For
self.dimension = "sliceEk",constcorresponds to the
\(\phi\) axis. Defaults to the mean \(\phi\) value. - For
self.dimension = "slicekk",constcorresponds to \(E_k\) axis. Defaults to the Fermi energy.
domain: An object containing information about offset angles forcalculating offset domains.
Saved args:
arpes.intensity: A numpy array with shape specified byarpes.dimension.cube: \(M\times N_{pts}^x \times N_{pts}^y\)sliceEk: \(M\times N_{pts}^x\)slicekk: \(1\times N_{pts}^x \times N_{pts}^y\)
arpes.bkgd: A numpy array with the same shape asarpes.intensity. Initialized as zeros.arpes.response: A numpy array with the same shape asarpes.intensity. Initialized as ones.
Returned args:
If this function is used to calculate a domain, then the intensity is not saved, but simply returned.
- Make_kwarp_check()
This function checks the momentum-to-angle conversion by performing an angle-to-momentum conversion before interpolation to show that the original k-mesh is reporduced. It gives no outputs but plots the intensity before warping, after warping to angle, and after warping back to momentum space.
- Make_quality_score(param=None)
This function provides a quality score for the spectra based on the metrics, feature sharpness, the number of electrons, the signal to background, and a total score.
args:
param: A dictionary of the formparam = {"threshold": [], "penalty": [], "weight": []}. The fields are:param["threshold"]: A numpy array of shape \(m \times 1\) defining the
score brackets where each penalty is incurred. Default: [0.9, 0.7, 0.5, 0.3]. -
param["penalty"]: A numpy array of shape \(m \times 1\) defining the penalty amount incurred in each score bracket. Default: [1, 2, 3, 4]. -param["weight"]: A numpy array of shape \(3 \times 1\) defining the relative weights of penalties for each metric. Default: [1, 1, 1].
Saved args:
arpes.score, a dictionary with the following fields:score["width"]: Feature sharpness score, out of 1.score["bkgd"]: Signal-to-background score, out of 1.score["counts"]: Number of electrons score, out of 1.score["final"]: Total score, out of 10.
- Make_statistics(exp)
This function takes the ARPES intensity \(I(\theta,\phi, \omega)\) and uses it as a probability distribution function to generate a measured spectrum of $N$ electrons.
args:
exp: An object containing the experimental parameters. Defined via theaurelia_static_varsmodule.
Saved args:
arpes.stats: A numpy array containing the spectra generated by \(N_e\) random electrons that has the same dimension asarpes.intensity.arpes.dstats: A numpy array containing the spectra generated by \(N_e\) random electrons that has the same dimension asarpes.domains.
- print_variables()
Provides a summary of variables used to calculate the measured arpes spectra.