Skip to main content

No project description provided

Project description

Python versions on PyPI CeNTREX-TlF version on PyPI Code style: black

Extensions

CeNTREX-TlF-julia-extension version on PyPI CeNTREX-TlF version on PyPI

CeNTREX-TlF

Code for generating the CeNTREX TlF States, Hamiltonians, Transitions, Couplings and Lindblad equations.

Consists of six modules:

  • states
  • hamiltonian
  • transitions
  • couplings
  • lindblad
  • utils

states has code to generate states and the classes that describe the CoupledBasisState, UncoupledBasisState and State; where State holds multiple CoupledBasisStates or UncoupledBasisStates with different amplitudes, i.e. when superpositions arise.

Dependencies

  • numpy
  • scipy
  • sympy
  • pandas

Installation

python -m pip install .
where . is the path to the directory. To install directly from Github use:
python -m pip install git+https://github.com/ograsdijk/CeNTREX-TlF

states

states contains the functions and classes to represent the TlF states:
CoupledBasisState is a class representing a TlF state with coupled quantum numbers, i.e. F, mF, F1, J, I1, I2, Ω, P.
UncoupledBasisState is a class representing a TlF state with uncoupled quantum numbers, i.e. J, mJ, I1, m1, I2, m2, Ω, P.
Finally State is a class representing a collection of states, since in most cases the TlF molecules are in a superposition state.

from centrex_tlf import states
states.CoupledBasisState(F=1, mF=0, F1 = 1/2, J = 0, I1 = 1/2, I2 = 1/2, Omega = 0, P = 1)

or using some of the functions to generate all hyperfine substates in a given J level:

from centrex_tlf import states
QN = states.generate_uncoupled_states_ground(Js = [0,1])

which returns an array containing the UncoupledBasisStates

array([|X, J = 0, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = -1/2, P = +, Ω = 0>,
       |X, J = 0, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = 1/2, P = +, Ω = 0>,
       |X, J = 0, mJ = 0, I = 1/2, m = 1/2, I = 1/2, m = -1/2, P = +, Ω = 0>,
       |X, J = 0, mJ = 0, I = 1/2, m = 1/2, I = 1/2, m = 1/2, P = +, Ω = 0>,
       |X, J = 1, mJ = -1, I = 1/2, m = -1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = -1, I = 1/2, m = -1/2, I = 1/2, m = 1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = -1, I = 1/2, m = 1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = -1, I = 1/2, m = 1/2, I = 1/2, m = 1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = 1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 0, I = 1/2, m = 1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 0, I = 1/2, m = 1/2, I = 1/2, m = 1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 1, I = 1/2, m = -1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 1, I = 1/2, m = -1/2, I = 1/2, m = 1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 1, I = 1/2, m = 1/2, I = 1/2, m = -1/2, P = -, Ω = 0>,
       |X, J = 1, mJ = 1, I = 1/2, m = 1/2, I = 1/2, m = 1/2, P = -, Ω = 0>],
      dtype=object)

State objects, which are superpositions of BasisStates are also generated easily:

superposition = 1*QN[0] + 0.1j*QN[1]

which returns

1.00 x |X, J = 0, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = -1/2, P = +, Ω = 0>
0.00+0.10j x |X, J = 0, mJ = 0, I = 1/2, m = -1/2, I = 1/2, m = 1/2, P = +, Ω = 0>

A subset of State, CoupledBasisStates can be selected with the QuantumSelector as follows:

QN = states.generate_coupled_states_ground(Js = [0,1])
qn_select = states.QuantumSelector(J = 1, mF = 0, electronic = states.ElectronicState.X)
qn_select.get_indices(QN)

which returns all the indices with J=1 and mJ=0:

array([ 4,  6,  9, 13], dtype=int64)

hamiltonian

hamiltonian contains the functions to generate TlF hamiltonians in the X and B state in either coupled or uncoupled form.
Generating a ground state X hamiltonian can be accomplished easily using some convenience functions:

from centrex_tlf import states, hamiltonian

# generate the hyperfine sublevels in J=0 and J=1
QN = states.generate_uncoupled_states_ground(Js = [0,1])

# generate a dictionary with X hamiltonian terms
H = hamiltonian.generate_uncoupled_hamiltonian_X(QN)

# create a function outputting the hamiltonian as a function of E and B
Hfunc = hamiltonian.generate_uncoupled_hamiltonian_X_function(H)

All functions generating hamiltonians only require a list or array of TlF states. Generating the hamiltonian only for certain hyperfine sublevels is hence also straightforward. The function calculate_uncoupled_hamiltonian_X calculates the hamiltonians from scratch, whereas generate_uncoupled_hamiltonian_X pulls the non-zero elements from an sqlite database.

To convert a hamiltonian from one basis to another transformation matrices can be generated or calculated (generate_transform_matrix pulls non-zero matrix elements from an sqlite database, calculate_transform_matrix does the full element wise calculation):

from centrex_tlf import states, hamiltonian

# generate the hyperfine sublevels in J=0 and J=1
QN = states.generate_uncoupled_states_ground(Js = [0,1])
# generate the coupled hyperfine sublevels in J=0 and J=1
QNc = states.generate_coupled_states_ground(Js = [0,1])

# generate a dictionary with X hamiltonian terms
H = hamiltonian.generate_uncoupled_hamiltonian_X(QN)
Hfunc = hamiltonian.generate_uncoupled_hamiltonian_X_function(H)
H0 = Hfunc(E = [0,0,0], B = [0,0,1e-3])

# generate the transformation matrix
transform = hamiltonian.generate_transform_matrix(QN, QNc)

# calculate the transformed matrix
H0c = transform.conj().T@H0@transform

This is mostly used for optical bloch simulations where the coupled states representation is more convenient.

Stark Shift Example

To calculate the energy levels as a function of the electric field the following code can be used, which calculates all energies up to J=6 but only plots the |J=2, mJ=0> hyperfine levels. These are the states focussed by the electrostatic quadrupole lens in the CeNTREX experiment. Quadrupole Lens States

import numpy as np
import matplotlib.pyplot as plt

from centrex_tlf import states, hamiltonian

# generate states up to J=6
QN = states.generate_uncoupled_states_ground(Js=np.arange(7))

# generate the X hamiltonian terms
H = hamiltonian.generate_uncoupled_hamiltonian_X(QN)

# create a function outputting the hamiltonian as a function of E and B
Hfunc = hamiltonian.generate_uncoupled_hamiltonian_X_function(H)

# V/cm
Ez = np.linspace(0, 50e3, 101)

# generate the Hamiltonian for (almost) zero field, add a small field to make states
# non-degenerate
Hi = Hfunc(E=[0, 0, 1e-3], B=[0, 0, 1e-3])
E, V = np.linalg.eigh(Hi)

# get the true superposition-states of the system
QN_states = hamiltonian.matrix_to_states(V, QN)

# original eigenvectors used in tracking states as energies change order
V_track = V.copy()

# indices of the J=2, mJ=0 states focused by the lens
indices_J2_mJ0 = [
    idx
    for idx, s in enumerate(QN_states)
    if s.largest.J == 2 and s.largest.mJ == 0
]

indices_J012 = [
    idx for idx, s in enumerate(QN_states) if s.largest.J in [0, 1, 2]
]

# empty array for storing energies
energy = np.empty([Ez.size, len(QN)], dtype=np.complex128)

# iterate over the electric field values
for idx, Ei in enumerate(Ez):
    Hi = Hfunc(E=[0, 0, Ei], B=[0, 0, 1e-3])
    E, V = np.linalg.eigh(Hi)

    # sort indices to keep the state order the same
    indices = np.argmax(np.abs(V_track.conj().T @ V), axis=1)
    energy[idx, :] = E[indices]
    V_track[:, :] = V[:, indices]

# plot the J=2, mJ=0 Stark curves
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(
    Ez,
    (energy.real[:, indices_J2_mJ0] - energy.real[:, indices_J2_mJ0][0, 0])
    / (2 * np.pi * 1e9),
)
ax.set_xlabel("E [V/cm]")
ax.set_ylabel("Energy [GHz]")
ax.set_title("|J=2, mJ=0> Stark Curve")
ax.grid(True)
plt.show()

couplings

Code for generating the CeNTREX TlF couplings. Includes code for generating branching ratios, electric dipole coupling elements and coupling fields

Generating branching ratios

The code below generates branching ratios from |J'=1, F1'=1/2, mF=0> to all states in the J=1 manifold.

from centrex_tlf import states, couplings

excited_state = states.CoupledBasisState(
    J=1, F1=1 / 2, F=1, mF=0, I1=1 / 2, I2=1 / 2, Omega=1, P=1
)
qn_select = states.QuantumSelector(J=1)
ground_states = [1*s for s in states.generate_coupled_states_X(qn_select)]
br = couplings.calculate_br(1 * excited_state, ground_states)

Generating couplings

The code below generates the coupling fields for the J=1 manifold to the J'=1, F1'=1/2, F'=1 manifold. The returned value is a dataclass CouplingFields containing the following fields:

  • ground_main
  • excited_main
  • main_coupling: the electric dipole coupling between ground_main and excited_main
  • ground_states: list of all ground states
  • excited_states: list of all excited states
  • fields: a list of CouplingField dataclasses with the following fields:
    • polarization: polarization vector
    • field: coupling field in the ground_states + excited_states basis
from centrex_tlf import states, couplings

qn_select = states.QuantumSelector(J=1)
ground_states = states.generate_coupled_states_X(qn_select)

qn_select = states.QuantumSelector(J=1, F1=1 / 2, F=1, P=1, Ω=1)
excited_states = states.generate_coupled_states_B(qn_select)

# the generate_coupling_field_* functions requires lists as inputs, not np.ndarrays
QN = list(1 * np.append(ground_states, excited_states))
ground_states = [1*s for s in  ground_states]
excited_states = [1*s for s in excited_states]

H_rot = np.eye(len(QN), dtype=complex) * np.arange(len(QN))
V_ref = np.eye(len(QN))
pol_vecs = [np.array([0.0, 0.0, 1.0]), np.array([1.0, 0.0, 0.0])]
normalize_pol = True

coupling = couplings.generate_coupling_field_automatic(
    ground_states_approx = ground_states, 
    excited_states_approx = excited_states, 
    QN_basis = QN,
    H_rot = H_rot, 
    QN = QN, 
    V_ref = V_ref, 
    pol_vecs = pol_vecs, 
    normalize_pol = normalize_pol
)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

centrex_tlf-0.1.8.1-cp313-cp313-win_amd64.whl (320.3 kB view details)

Uploaded CPython 3.13Windows x86-64

centrex_tlf-0.1.8.1-cp313-cp313-manylinux_2_28_x86_64.whl (474.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.1-cp313-cp313-macosx_11_0_arm64.whl (427.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

centrex_tlf-0.1.8.1-cp312-cp312-win_amd64.whl (320.4 kB view details)

Uploaded CPython 3.12Windows x86-64

centrex_tlf-0.1.8.1-cp312-cp312-manylinux_2_28_x86_64.whl (474.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.1-cp312-cp312-macosx_11_0_arm64.whl (427.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

centrex_tlf-0.1.8.1-cp311-cp311-win_amd64.whl (323.3 kB view details)

Uploaded CPython 3.11Windows x86-64

centrex_tlf-0.1.8.1-cp311-cp311-manylinux_2_28_x86_64.whl (478.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.1-cp311-cp311-macosx_11_0_arm64.whl (433.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

centrex_tlf-0.1.8.1-cp310-cp310-win_amd64.whl (323.2 kB view details)

Uploaded CPython 3.10Windows x86-64

centrex_tlf-0.1.8.1-cp310-cp310-manylinux_2_28_x86_64.whl (478.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.1-cp310-cp310-macosx_11_0_arm64.whl (433.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file centrex_tlf-0.1.8.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e98a2af5cf4e2315847390ff514f6e42b3b14aeb0965839c76b7747b2b80d5a6
MD5 25166c0f60c178ac96277ff0f13875e6
BLAKE2b-256 553ccc588054f357ffd6f6ad76bf0835fa0e527036ce9afaa2aee76cf06963c3

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3cd2f243b7d126d495f7a19ec969d7db4f70c8cebe979a7ae61de0fbbef18ac
MD5 4f58557df08f672fc7df1698c1a60321
BLAKE2b-256 e0900a12eeafa99ff09069fb5275d9b5cbc123390e2fb7a4fcf5f5c68e4e9670

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77dd030a2c8f60a49c6381e65647b23884e68e39e9a0041fadb520de88f866ce
MD5 83a3ea2dbf15fea1d2a8d3328b537f5e
BLAKE2b-256 b2f558f5691c8e2a2614e2113b0f057b279b4440a9698db93986c45aec9fd5ad

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e774a225a25ab975bea43bed50a9cc9a2652f0c9ce0381d9eab19a3e19385e86
MD5 e76c7010ec230a4a5014ed3d98994dc4
BLAKE2b-256 59f67f9691cb19ef52149ea85346e199c2e9600e87215ed624d38ed29615e62c

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ac559e5a32aea90c53c1051aa4d851c8aee3e8c6a287ebde5d95a31cbdd76ab3
MD5 88add689744649df4d45f695e324005d
BLAKE2b-256 0674aa2ca2dcbbd46e860da26c49f4901aa5ed4ae2542f3f89165ce0744ffdbc

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0c61b05bb40d919b0c8bf9544e29f28397dbbdc956a934da7d227e80e54e8fe
MD5 34dd8a2d8173b250b586a9d1271cdf40
BLAKE2b-256 49570e7552088092935110c93d04a36aea6255bf68ef0550fb0f42bf2ea69cc1

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 724ee7fd0f3b8895fcd419401fda28a58cdab927d518f138b1347bce3564310e
MD5 af5e41fbf4bb19cb6e47e20d323cffa8
BLAKE2b-256 d76af6384dde2dc6743ffb89d4b9183fe5c1b24ec98c4189c096f613f9411a1e

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4403c12d4e688082c169691c0aee4c05477be963b364ae343c8d232e6f8fd687
MD5 09c9d513cf01b1f31ff5c7a1814ad9d8
BLAKE2b-256 61dcf739def0c2b760539bd39bf79cb0407bade8d727feedd756b3b8f45c8b70

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c01140636edc9a8f375fe8bddf8fc874edae42aea289c847dfda9af33d04cc1
MD5 b4026563c0ac0ebf48fc9f458bf27ba4
BLAKE2b-256 cf61279284f69e74be41b81dea4c14a238a88b74f1688dea7042e050eec45418

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5d3f878d59b3d14bcd8991a9203ba967e0968ea66c2dbe50d59a4c59bc0f5115
MD5 3fd5f97d55b5635d43e52c1d57012c98
BLAKE2b-256 e8aa3967241d3f5f6e9df098cfd928956021a0d4ed289c91258a9372e1535101

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cb8eb33e019473cf877614ac06a85149c23ed48cf53c7f0700aa7ded2fe89c4b
MD5 f8eca4c4fa87bf6f6b0aba3f7f8a8c5d
BLAKE2b-256 133a5c6ba7abb383207f5cce80773583d0accf1c65405d19a695430bf2094623

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.8.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc438e82eb0473c2fc3ae0cff77567aa3df14ef89477bcbb3724cd82a079f093
MD5 0f2e38eaa6bdf5102e1f26b8ccaf679f
BLAKE2b-256 5cd2387c236c823c66ca42a9be7c119d27a87eae59e230217e55fc9fa08db1f5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page