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.7.1-cp313-cp313-win_amd64.whl (309.8 kB view details)

Uploaded CPython 3.13Windows x86-64

centrex_tlf-0.1.7.1-cp313-cp313-manylinux_2_28_x86_64.whl (463.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7.1-cp313-cp313-macosx_11_0_arm64.whl (416.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

centrex_tlf-0.1.7.1-cp312-cp312-win_amd64.whl (310.2 kB view details)

Uploaded CPython 3.12Windows x86-64

centrex_tlf-0.1.7.1-cp312-cp312-manylinux_2_28_x86_64.whl (463.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7.1-cp312-cp312-macosx_11_0_arm64.whl (416.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

centrex_tlf-0.1.7.1-cp311-cp311-win_amd64.whl (312.9 kB view details)

Uploaded CPython 3.11Windows x86-64

centrex_tlf-0.1.7.1-cp311-cp311-manylinux_2_28_x86_64.whl (468.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7.1-cp311-cp311-macosx_11_0_arm64.whl (420.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

centrex_tlf-0.1.7.1-cp310-cp310-win_amd64.whl (312.8 kB view details)

Uploaded CPython 3.10Windows x86-64

centrex_tlf-0.1.7.1-cp310-cp310-manylinux_2_28_x86_64.whl (469.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7.1-cp310-cp310-macosx_11_0_arm64.whl (420.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8fe6bb601c419b9c36f1784e998bd501cf6aa331ccf14ab78c5f39f09978d87b
MD5 71df1d113c41b7c0fdea22b11bca3475
BLAKE2b-256 02ad4a07dfb08abf4d4839d41a5e803361151ffb55cd585e23e4284b6dacb1f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 76810b60909524fc63ec05b606cf669744472fd67fd73001c98fe595aabc7e38
MD5 83d3201bb7098205226d9c2f8c5d6293
BLAKE2b-256 d19782c012c7f635bec0a83226796860fbd9dd022a97547a3db2482108a00d9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34498f1260cce87f6db706762a6072456490a18932c8c67b03d317049400181d
MD5 bbd0f69b89cacca0581cab4143c32bdb
BLAKE2b-256 f06b7a07a827dddfa4fec2f2b8987b9cd1582e5775c35ff11f2fa0df0849c6b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2e7143f69cf3b615b97d85ab363c8c9e9fa195449df553708f12e8c47229e4d5
MD5 74aa031b255b2ba953b6af3773da5ffc
BLAKE2b-256 f6a45f67170eba2e808b5afc9f3de0b7a56e7d8a553fe5eca034483bd7c6f82d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b04baf43741887c69c92f2c5c043ae8129a510142111dec2e1bfc2875c9c44f
MD5 0df5743fe551035f74f936e45747abfc
BLAKE2b-256 896046a3786dbd1501cc84346cbf5bd4efb2ec9c5f972817ebb6741909a88ef2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68effaac963de2ed4fc75216be00d1899c591d19fef95952ea5efd27ed857709
MD5 ce9b71485faac13d4f5b9a2160802ed6
BLAKE2b-256 e191c7e8ffa2e946355334ac1732073d679ccb55c7e361f77cae6cc6846b5e48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 416e719e4d6621619b0521bad0fb72a1d033d07fdf3d01e2306710f18cdb0a4a
MD5 1aec3b6aaefdb14a0eba325bc9222d8b
BLAKE2b-256 c4a96a536c244ed8d0c468c73386c34ed64e580f775a69dac045c67563a0da79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d1050bc73cfc0e53bdc9c194ffa266179beee94e8aeacdf232a7f1f1e4b7ba80
MD5 e87e45d746c9088c93b433ae232c51ce
BLAKE2b-256 f39bdc091a90607d20b1eddff08276d63377d3addb561f0f443c4976e614a73a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 606c134ad7fde69cb118c4f0220096a326d2d599f92f64932c9d67bf537ca1f6
MD5 e523ebec987f2f16dba32bbaa24b2db6
BLAKE2b-256 e3241e81e243277dd2969c0261c2a39dd2458ebc99c33e8579067e25d593295a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 06a518d2ea89a5b633e58ae0513f420c9fac1d3cc2a56fe6e01023b26cce4730
MD5 7f32f53462c2f110514e08887a1af2bf
BLAKE2b-256 1a7aa682bb9befa2088296a64a104c2b03899532b30d913f1be24bfc56173279

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c555c15845c605bffcc8ed949d1dec54697ee8e3699dc76bdd08fec7e7a526e3
MD5 9007c63afef651473eabaf89c6259316
BLAKE2b-256 05a5240e5485e5afde9c99bfe243c4cdad52749fe93ec443e3169d27aa6fc9cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 973908c113637b80d3b94708cc65609a5478014a892167b790f5b5d6910c1a09
MD5 da580cd5c7b1af8bffc9d61bb816b1e5
BLAKE2b-256 d7f2c6a901012c1117dcf10cbc98c13044b3e182daded05980d52b1752303cdd

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