2. Hyperfine beat and (electronic) alignment modelling#
From prior work and data:
Forbes, R. et al. (2018) ‘Quantum-beat photoelectron-imaging spectroscopy of Xe in the VUV’, Physical Review A, 97(6), p. 063417. Available at: https://doi.org/10.1103/PhysRevA.97.063417. arXiv: http://arxiv.org/abs/1803.01081, Authorea (original HTML version): https://doi.org/10.22541/au.156045380.07795038
Data (OSF): https://osf.io/ds8mk/
Quantum Metrology with Photoelectrons (Github repo), particularly the Alignment 3 notebook. Functions from this notebook have been incorporated in the current project, under
qbanalysis.hyperfine.
2.1. Formalism#
In many physical processes, multiple eigenstates of the system are populated. This may be the result of thermal effects, in which case the states are incoherent, or via a coherent preparation process. In the latter case, the overall state of the system can be considered as a wavepacket, and will evolve in time. Assuming that the wavepacket is created “instantaneously” (with respect to the timescale of system/wavepacket evolution), such as via photon-absorption from a short laser pulse, then the ensuing dynamics is simply dependent on the phase-evolution of the eigenstates which form the superposition state.
A textbook example is the preparation of a superposition of hyperfine states in rare gas atoms via photo-absorption. Typically, a small number of hyperfine states are prepared, and their evolution results in relatively simple wavepacket behaviour, exhibiting clear quantum beats, correlated with a changing alignment of the charge distribution. A full treatment can be found in Sect. 4.7 of Blum’s book [1].
2.1.1. Hyperfine quantum beats#
For the case of quantum beats from a manifold of (hyperfine) states, the state multipoles can be expressed as a product of an initial state, and time-dependent coefficients, as per Eqns. 4.131 and 4.134 in Blum [1]:
where the time-dependence is given as:
and \(\{...\}\) is a \(6j\) symbol, \(J\) is the electronic angular momentum, \(I\) the nuclear spin and \(F,\,F'\) are hyperfine states that comprise the superposition (wavepacket).
Hence, \(\langle T(J)_{KQ}^{\dagger}\rangle\) defines the initial state of the system after preparation of the state \(|J,M\rangle\) (defined by the state multipoles, these are discussed in the following section), and the time-evolution of the superposition is given by \(G(J;t)_{K}\). This contains the angular momentum coupling between the hyperfine states (defined by the \(6j\) symbol), and the relative phase evolution of the states, expressed in terms of their energy differences.
2.1.2. State Multipoles#
A more physical picture of the geometric properties of an ensemble can be obtained from the state multipoles, which are defined by (spherical) tensor operators. These provide a means to expand the irreducible components of the density matrix, and the geometric properties of the ensemble. (See Chapter 4 in Blum [1] for further details.)
In the \(\{|JM\rangle\}\) representation (Eqn. 4.8 in Blum [1]):
Where \(\hat{T}(J',J)_{KQ}\) are tensor operators. The corresponding matrix elements are (Eqn. 4.9 in Blum [1]):
The density matrix can be written in terms of the tensor operators (Eqn. 4.30 in Blum):
And the state multipoles are defined as the term in square brackets (Eqn. 4.31 in Blum):
And the inverse (Eqn. 4.34 in Blum):
The spatial representation of the ensemble can be defined in terms of the state multipoles - hence the name - by expanding in a suitable basis, usually the spherical harmonics. For example, for a single angular momentum state \(J\), this is given by (Eqn. 4.101 in Blum):
Where \(W(\theta,\phi)\) is the spatial distribution function, and \(Y_{KQ}(\theta,\phi)\) are spherical harmonics.
2.1.3. Example: state selected, 1-photon, transition#
For a basic state-selected transition, following absorption of a photon,
The corresponding density matrix is proportional to the angular momentum coupling coefficient (see Sect. 7 in Blum [1]; also Sect. 3.1.1 and Eqn. 3.5 in Hockett [3], and Reid et. al. [4]):
Where it has been assumed that the initial state \(J_i\) is isotropic, and all \(M_i\) are equally populated.
The properties of the final state \(M\)-level distribution will then depend on the transition (\(\Delta J\)) and the polarization of the light (\(q\)).
Note that in the Quantum Beats section the notation was such that \(J_i \equiv J'\), and \(J_f \equiv J\), and implicitly defined as \(\langle T(J;t)_{KQ}^{\dagger} \rangle \equiv \langle T(J'=J\pm1,J;t)_{KQ}^{\dagger} \rangle\), as appropriate for a 1-photon transition.
Hence:
References
[1] Blum, K. (2012). Density Matrix Theory and Applications (3rd Editio, Vol. 64). Berlin, Heidelberg: Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-20561-3
[2] Zare, R. N. (1988). Angular Momentum: Understanding spatial aspects in chemistry and physics. John Wiley & Sons.
[3] Hockett, P. (2018). Quantum Metrology with Photoelectrons, Volume 1 Foundations. IOP Publishing. https://doi.org/10.1088/978-1-6817-4684-5 (See also links at top of document.)
[4] Forbes, R., Makhija, V., Underwood, J. G., Stolow, A., Wilkinson, I., Hockett, P., & Lausten, R. (2018). Quantum-beat photoelectron-imaging spectroscopy of Xe in the VUV. Physical Review A, 97(6), 063417. https://doi.org/10.1103/PhysRevA.97.063417; also arXiv 1803.01081; and web version on authorea.
[5] Fano, U., & Macek, J. H. (1973). Impact Excitation and Polarization of the Emitted Light. Reviews of Modern Physics, 45(4), 553–573. https://doi.org/10.1103/RevModPhys.45.553
2.2. Xe electronic wavepacket dynamics#
Here, the wavepacket is modelled, following the work in ref. [4], in which hyperfine wavepackets were prepared in Xe via excitation around 133 nm. Distinct wavepackets are created in the \(^{129}Xe\) and \(^{131}Xe\) isotopes, which have \(I_{129}=1/2\) and \(I_{131}=3/2\) and different hyperfine level structures.
For original work see the Alignment 3 notebook. This code has been packaged and expanded upon herein (see :py:module:qbanalysis.hyperfine), and is used for the calculations below.
Note this version also handles uncertainties in the parameters, via the uncertainities package, if installed. In this case, standard linear error propagation is applied.
Xe natural abundances (wiki):
\(^{129}Xe\): 0.264006(82)
\(^{131}Xe\): 0.212324(30)
The relevant energy level structure is given below. The tabulated results are as determined from the experimental work (ref. [4]), see table 1 therein for details and literature values. The figure shows values from NIST.
2.2.1. Load Xe data#
In this case, load the relevant states and properties from file. The parameters are as determined experimentally in ref. [4].
# Load packages
# Main functions used herein from qbanalysis.hyperfine
from qbanalysis.hyperfine import *
import numpy as np
from epsproc.sphCalc import setBLMs
2025-06-03 16:50:25.892 | INFO | qbanalysis.config:<module>:11 - PROJ_ROOT path is: /home/runner/work/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV
* sparse not found, sparse matrix forms not available.
* natsort not found, some sorting functions not available.
* Setting plotter defaults with epsproc.basicPlotters.setPlotters(). Run directly to modify, or change options in local env.
* Set Holoviews with bokeh.
* pyevtk not found, VTK export not available.
* pyshtools not found, SHtools functions not available. If required, run "pip install pyshtools" or "conda install -c conda-forge pyshtools" to install.
2025-06-03 16:50:46.985 | INFO | qbanalysis.hyperfine:<module>:31 - Using uncertainties modules, Sympy maths functions will be forced to float outputs.
# Use Pandas and load Xe local data (ODS)
# These values were detemermined from the experimental data as detailed in ref. [4].
from qbanalysis.dataset import loadXeProps
xeProps = loadXeProps()
2025-06-03 16:50:47.090 | INFO | qbanalysis.dataset:loadXeProps:71 - Loaded Xe data from /home/runner/work/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/dataLocal/Xe_data_table_fixedFractions.ods.
**Xe measured level splittings and the hyperfine constants.**
Statistical uncertainty estimates are given for the measurements. (See manuscript for details).
/home/runner/work/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/qbanalysis/dataset.py:82: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
tidied = rawXeHyperfineResults.applymap(lambda x: x.replace(' ','') if isinstance(x, str) else x)
/home/runner/work/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/qbanalysis/dataset.py:87: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
tidied[uList] = tidied[uList].applymap(lambda x: ufloat_fromstr(x)) # OK
| A/MHz | B/MHz | Splitting/cm−1 | ||||
|---|---|---|---|---|---|---|
| Isotope | I | F | F′ | |||
| 129 | 0.5 | 0.5 | 1.5 | -5723+/-9 | nan+/-nan | 0.2863+/-0.0005 |
| 131 | 1.5 | 1.5 | 0.5 | 1697+/-30 | -8+/-7 | 0.0855+/-0.0010 |
| 2.5 | 1.5 | 1697+/-30 | -8+/-7 | 0.1411+/-0.0029 | ||
| 0.5 | 1697+/-30 | -8+/-7 | 0.2276+/-0.0029 |
Fig. 2.1 Energy-level diagram for the prepared hyperfine states (lower section), and final ion states (upper section). The energies are not to scale. Figure reproduced from ref. [4]. Values from NIST (https://www.physics.nist.gov/PhysRefData/Handbook/Tables/xenontable5.htm).#
2.2.2. Model the wavepackets#
As noted above, distinct wavepackets are created in the \(^{129}Xe\) and \(^{131}Xe\) isotopes, which have \(I_{129}=1/2\) and \(I_{131}=3/2\) and different hyperfine level structures.
# hyperfine.computeModel wraps the necessary computations for both isotopes, including computation of the 1-photon density matrix and hyperfine wavepacket
modelDict = computeModel(xeProps)
# The returned dictionary contains results per isotope:
modelDict.keys()
dict_keys(['129Xe', '131Xe'])
# Plots per isotope
plotOpts = {'width':800}
# Use plotHyperfineModel() to plot results sets, these are returned as Holoviews objects so can also be further modified or laid-out
(plotHyperfineModel(modelDict['129Xe'], **plotOpts) + plotHyperfineModel(modelDict['131Xe'], **plotOpts)).cols(1)
Note here that the error bars are derived from propagation of the input uncertainties. In particular, the temporal evolution is given as Eqn. XX, i.e. \(\cos\left[\frac{(E_{F'}-E_{F})t}{\hbar}\right]\). This results in an increasing uncertainty in the model with \(t\); this also indicates how a longer measurement window will be more sensitive to the values of the splitting.
For \(^{129}Xe\) the dynamics show the expected, simple, quantum beat structure in the \(\langle T(J;t)_{KQ}^{\dagger}\rangle\). For 1-photon excitation, with linearly polarised light, only \(K=0,\,2,\,Q=0\) terms contribute. The \((0,0)\) term reflects the total population, hence is temporally-invariant, while the \((2,0)\) term shows the changing alignment as the wavepacket evolves.
The allowed terms, and phase of the quantum beats, depends on the transition - i.e. initial and final \(J\) state, and photon angular momentum. For example, with circularly polarised light \(M_p = +1\), terms with \(K=1\) are also allowed, and are out-of-phase with \(K=2\) terms.
For \(^{131}Xe\), the 3-state system shows more temporal structure in the beat pattern, again dependent on the properties of the intial and final (prepared) states.
2.2.3. Sum over states#
Here the model wavepacket is defined as an incoherent sum over the two isotopic components:
Where \(i\) labels the isotopes, and \(N_{i}\) the natural abundance, and \(n=\sum_{i}N_i\) is the normalisation constant.
# 12/06/24 - now working from hyperfine.py WITH UNCERTAINTIES.
# Needs a tidy-up, also checks/tests for values.
# modelSum = computeModelSum(modelDict)['sum']
# plotHyperfineModel(modelSum, **plotOpts)
# Update 17/06/24: Now return dict and Xarray versions
modelSumDict, modelDA = computeModelSum(modelDict)
plotHyperfineModel(modelSumDict['sum'], **plotOpts)
/opt/hostedtoolcache/Python/3.10.11/x64/lib/python3.10/site-packages/xarray/core/concat.py:500: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
common_dims = tuple(pd.unique([d for v in vars for d in v.dims]))
/opt/hostedtoolcache/Python/3.10.11/x64/lib/python3.10/site-packages/xarray/core/concat.py:500: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
common_dims = tuple(pd.unique([d for v in vars for d in v.dims]))
#*** Comparison plot of the two isotopes + the summed case
# From dict version
# TODO: fix labels/legend here!
# (plotHyperfineModel(modelDict['129Xe'], **plotOpts) * plotHyperfineModel(modelDict['131Xe'], **plotOpts) * plotHyperfineModel(modelSum, **plotOpts)).opts(title="Isotope comparison + sum")
# Update 17/06/24: Now plot from unified Xr data array, with corrected legend
# NOTE this includes abundance weightings, hence T_{0,0} is smaller for the isotope components.
# modelDA = stackModelToDA(computeModelSum(modelDict))
plotHyperfineModel(modelDA, **plotOpts).opts(title="(Abundance weighted) isotope comparison + sum")
2.3. Quick comparison with experimental data#
The experimental data may directly resemble the underlying wavepacket in some cases, e.g. if the probe process is somewhat direct. A quick time-domain plot should reveal similarities, if any…
2.3.1. Read experimental data#
#
from epsproc import IO
from pathlib import Path
dataPath = Path('/tmp/xe_analysis')
dataTypes = ['BLMall', 'BLMerr', 'BLMerrCycle'] # Read these types, should just do dir scan here.
# # Read from HDF5/NetCDF files
# # TO FIX: this should be identical to loadFinalDataset(dataPath), but gives slightly different plots - possibly complex/real/abs confusion?
# dataDict = {}
# for item in dataTypes:
# dataDict[item] = IO.readXarray(fileName=f'Xe_dataset_{item}.nc', filePath=dataPath.as_posix()).real
# dataDict[item].name = item
# Read from raw data files
from qbanalysis.dataset import loadFinalDataset
dataDict = loadFinalDataset(dataPath)
2025-06-03 16:50:50.332 | INFO | qbanalysis.dataset:loadDataset:268 - Loaded data cpBasex_results_cycleSummed_rot90_quad1_ROI_results_with_FT_NFFT1024_hanningWindow_270717.mat.
2025-06-03 16:50:50.382 | INFO | qbanalysis.dataset:loadDataset:268 - Loaded data cpBasex_results_allCycles_ROIs_with_FTs_NFFT1024_hanningWindow_270717.mat.
2025-06-03 16:50:50.695 | INFO | qbanalysis.dataset:loadFinalDataset:244 - Processed data to Xarray OK.
/opt/hostedtoolcache/Python/3.10.11/x64/lib/python3.10/site-packages/xarray/core/concat.py:500: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
common_dims = tuple(pd.unique([d for v in vars for d in v.dims]))
2.3.2. Plot exp data + model sum#
Plot the data as previously, and overlay the wavepacket model (sum case) from above.
Here it is clear that the time-dependence matches reasonaly well in general; the L=4 case (2nd plot) for ROI 0 matches almost exactly, suggesting that there is only a single partial-wave in this case and the ionization is a fairly direct probe in this channel. There is also a slight phase-shift at larger t, which may indicate an issue with the values used for the energy-level splittings here, and/or indicate additional physical processes (e.g. decoherence, multi-electron effects) play a role here in the experimental results. In general, however, modelling of the photoionization dynamics is also required here before any firm conclusions can be made.
TODO:
update legends here, should add ROI for expt case.
update plot titles here, should be L=2, L=4 as per basic data plot, https://phockett.github.io/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/0.01_data_download_and_preliminaries_050624.html
from qbanalysis.plots import plotFinalDatasetBLMt
hvData = plotFinalDatasetBLMt(**dataDict)
# hvData
# With functional plotter
# TODO: update legends here, should add ROI for expt case.
# TODO: update plot titles here, should be L=2, L=4 as per basic data plot, https://phockett.github.io/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV/0.01_data_download_and_preliminaries_050624.html
plotOpts = {'width':1000}
modelPlot = plotHyperfineModel(modelSumDict['sum'], **plotOpts)
# (modelPlot * hvData).opts(width=1000) # Can't set width here...?
# (modelPlot.opts(width=1000) * hvData.opts(width=1000)) # Ah, this works
# (modelPlot.opts(**plotOpts) * hvData.opts(**plotOpts)) # Ah, this works, although ordering matters...? Must be forced width for some plot/overlay types...?
# modelPlot * hvData
(modelPlot.select(K=2).opts(**plotOpts) * hvData.opts(**plotOpts))
# hvData.opts(**plotOpts) * modelPlot.select(K=2).opts(**plotOpts)
2.4. Versions#
import scooby
scooby.Report(additional=['qbanalysis','pemtk','epsproc', 'holoviews', 'hvplot', 'xarray', 'matplotlib', 'bokeh', 'sympy', 'pandas','uncertainties'])
| Tue Jun 03 16:50:51 2025 UTC | |||||||
| OS | Linux (Ubuntu 24.04) | CPU(s) | 4 | Machine | x86_64 | Architecture | 64bit |
| RAM | 15.6 GiB | Environment | Jupyter | File system | ext4 | ||
| Python 3.10.11 (main, Sep 30 2024, 21:36:13) [GCC 13.2.0] | |||||||
| qbanalysis | 0.0.1 | pemtk | Module not found | epsproc | 1.3.2.dev0 | holoviews | 1.20.2 |
| hvplot | 0.11.3 | xarray | 2022.3.0 | matplotlib | 3.5.3 | bokeh | 3.7.3 |
| sympy | 1.11.1 | pandas | 2.2.3 | uncertainties | 3.2.3 | numpy | 1.23.5 |
| scipy | 1.15.3 | IPython | 8.37.0 | scooby | 0.10.1 | ||
# # Check current Git commit for local ePSproc version
# from pathlib import Path
# !git -C {Path(qbanalysis.__file__).parent} branch
# !git -C {Path(qbanalysis.__file__).parent} log --format="%H" -n 1
# # Check current remote commits
# !git ls-remote --heads https://github.com/phockett/qbanalysis
# Check current Git commit for local code version
import qbanalysis
!git -C {Path(qbanalysis.__file__).parent} branch
!git -C {Path(qbanalysis.__file__).parent} log --format="%H" -n 1
* master
4dc763f8848565a5c3d947470fb3eb687d07ba5d
# Check current remote commits
!git ls-remote --heads https://github.com/phockett/Quantum-Beat_Photoelectron-Imaging_Spectroscopy_of_Xe_in_the_VUV
4dc763f8848565a5c3d947470fb3eb687d07ba5d refs/heads/master
2ff23ede221ac1a0ae8b5351c6c505a6ecd1b65d refs/heads/uncertainties