Source code for ptyrad.optics.constants

"""
Electron microscopy related physical constants

"""

from typing import Literal

import numpy as np

# Physical Constants
PLANCKS = 6.62607015E-34 # m^2*kg / s
REST_MASS_E = 9.1093837015E-31 # kg
CHARGE_E = 1.602176634E-19 # coulomb 
SPEED_OF_LIGHT = 299792458 # m/s

# Useful constants in EM unit 
HC = PLANCKS * SPEED_OF_LIGHT / CHARGE_E*1E-3*1E10 # 12.398 keV-Ang, h*c
REST_ENERGY_E = REST_MASS_E*SPEED_OF_LIGHT**2/CHARGE_E*1E-3 # 511 keV, m0c^2

[docs] def get_EM_constants(kv: float, output_type: Literal['gamma', 'wavelength', 'sigma']): """Calculates a specific electron microscopy physical parameter. Args: kv (float): The acceleration voltage of the electron microscope in kilovolts (kV). output_type (Literal['gamma', 'wavelength', 'sigma']): The specific parameter to calculate. Options are 'gamma' (Lorentz factor), 'wavelength' (relativistic electron wavelength), or 'sigma' (interaction parameter). Returns: float: The calculated parameter value. Raises: ValueError: If an unsupported `output_type` is provided. """ # acceleration_voltage: kV if output_type == 'gamma': return get_lorentz_factor_gamma(kv) elif output_type == 'wavelength': return get_wavelength_ang(kv) elif output_type == 'sigma': return get_interaction_parameter_sigma else: raise ValueError(f"output_type '{output_type}' not implemented yet, please use 'gamma', 'wavelength', or 'sigma'!")
[docs] def get_lorentz_factor_gamma(kv): """Calculates the dimensionless relativistic Lorentz factor (gamma). The Lorentz factor accounts for the relativistic mass increase of the accelerated electron. It is calculated as: gamma = 1 + (e * V) / (m0 * c^2) Args: kv (float): The acceleration voltage in kilovolts (kV). Returns: float: The dimensionless Lorentz factor. """ gamma = 1 + kv / REST_ENERGY_E # m/m0 = 1 + e*V/m0c^2, dimensionless, Lorentz factor return gamma
[docs] def get_wavelength_ang(kv): """Calculates the relativistic electron wavelength (Ang). The wavelength is calculated using the relativistic de Broglie relationship: lambda = h * c / sqrt((2 * m0 * c^2 + e * V) * e * V) Args: kv (float): The acceleration voltage in kilovolts (kV). Returns: float: The electron wavelength in Angstroms. """ wavelength = HC/np.sqrt((2*REST_ENERGY_E + kv)*kv) # Angstrom, lambda = hc/sqrt((2*m0c^2 + e*V)*e*V)) return wavelength
[docs] def get_interaction_parameter_sigma(kv): """Calculates the electron interaction parameter (sigma). The interaction parameter governs the phase shift of the electron wave per unit of projected electrostatic potential. It is calculated as: sigma = (2 * pi * gamma * m0 * e * lambda) / h^2 Args: kv (float): The acceleration voltage in kilovolts (kV). Returns: float: The interaction parameter in units of 1 / (kV * Angstrom). """ gamma = get_lorentz_factor_gamma(kv) wavelength = get_wavelength_ang(kv) sigma = 2*np.pi*gamma*REST_MASS_E*CHARGE_E*wavelength/PLANCKS**2 * 1E-20 * 1E3 # interaction parameter, 2 pi*gamma*m0*e*lambda/h^2, 1/kV-Ang return sigma