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-cp314-cp314-macosx_11_0_arm64.whl (416.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

centrex_tlf-0.1.7-cp313-cp313-win_amd64.whl (309.6 kB view details)

Uploaded CPython 3.13Windows x86-64

centrex_tlf-0.1.7-cp313-cp313-manylinux_2_28_x86_64.whl (463.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7-cp313-cp313-macosx_11_0_arm64.whl (416.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

centrex_tlf-0.1.7-cp312-cp312-win_amd64.whl (309.9 kB view details)

Uploaded CPython 3.12Windows x86-64

centrex_tlf-0.1.7-cp312-cp312-manylinux_2_28_x86_64.whl (463.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7-cp312-cp312-macosx_11_0_arm64.whl (416.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

centrex_tlf-0.1.7-cp311-cp311-win_amd64.whl (312.6 kB view details)

Uploaded CPython 3.11Windows x86-64

centrex_tlf-0.1.7-cp311-cp311-manylinux_2_28_x86_64.whl (468.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7-cp311-cp311-macosx_11_0_arm64.whl (420.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

centrex_tlf-0.1.7-cp310-cp310-win_amd64.whl (312.5 kB view details)

Uploaded CPython 3.10Windows x86-64

centrex_tlf-0.1.7-cp310-cp310-manylinux_2_28_x86_64.whl (468.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.7-cp310-cp310-macosx_11_0_arm64.whl (420.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

centrex_tlf-0.1.7-cp39-cp39-win_amd64.whl (314.8 kB view details)

Uploaded CPython 3.9Windows x86-64

File details

Details for the file centrex_tlf-0.1.7-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a996d701afc37205e08575a732b0a688d7148519f076d0e5fbab4d2d6e3cfbd
MD5 f3cf14616bab9746d3ea7797d3301154
BLAKE2b-256 ee2da83309e9d1c91c25ff0b5b2c8e85108f2a4b59c08b813bcc3f2e619501bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 de0e2b5ac31cd7809f1cd51a4dfe648f1d7db301c8906e900f2a8a378f0e8950
MD5 c39be476b681e18e6b76dd8d3dd3834f
BLAKE2b-256 678f8fd728a09bc5b3c3e88633f72e44cb3c7ae8ae51250eb5edd6fff04e0b6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5355654717517611110aea4a7bfeaca2dc37c91fa47743269192a04071d8af9f
MD5 287f88419b4c701085045ad9d9e78382
BLAKE2b-256 c6ef46e695f465782b9c67dbf83d85d657aeda9cc57fa3ca808fa1be0e9f36e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa621ebf7782d04c211009ab24dbdba5a98d92016788c64bd288c218cfedf59f
MD5 8d734f2239b1c6ab14c7cf6a766b362b
BLAKE2b-256 74a2d07d97e74abe95834a3cdc7d633063664951e785159209b383bce5245fe0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3df56f9d3cc9297b153d9e7dee6e6b88b53367c545b5be1204e685af949b8331
MD5 10cc1a7684b6c4b5cc78e834f3fd1393
BLAKE2b-256 cb02e407b0930dde3384373af7d6efb027a6bf82df173ca5a0992ebe36e6c72d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c6f359e73d0dbf724de9875f2fce58336347c380c52bd6319463779b443bbcb2
MD5 62d97e02cad55d28104bf7ff34c2cb48
BLAKE2b-256 3e03ba92b3660b317a5764691fd2b5234fa9ed148c2116f9a72a4d43748a4946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d7fc715fd7001b0756c0d24fe23dcf63fb66c4f5316346d8215e4496ebc518f
MD5 1410d91fdc881cf2e41cfd455ffa211f
BLAKE2b-256 c495c1e08c43865ac42cf0a66dd0a188b99b9dc126e8d16da3d4fb8073fb9d2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d0e395dc5bb80562b234256ef081e17da98d6e5bd1a2811276cfa3b01ca5669d
MD5 791b9905addd7200f4756c922605464a
BLAKE2b-256 89848bc8fbfdd8fc92d591e6d3347b7710a934ce7e09d64fee91adf048b135ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 58af77e1580f6a691c4c78847f37b38130b3014cf67cd799f520782f47eeef54
MD5 5286235fd9bd7ed6aa71de7e5e935290
BLAKE2b-256 54589c63ff8972d0265b928bd3600e4710624b43982a608693188e51a221127d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36ea9576bc9ac4b53d8ede7498ea3b7eddd643ee93076390f7dd46e7bc2ae749
MD5 4597824e2f720965e4ebc664b16cbe8f
BLAKE2b-256 48605ff77850dccdb1f89a42e25a1f54b3eede606f08383164d72c91c2644617

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 72019d80f05317c1da0c5712aeaf4b819529adda9a4d97a1cc15cde0a67b5cbf
MD5 8e3563f28b690679ff9a76364491db88
BLAKE2b-256 96e4ea910cc33eca7bb6192edd2d8892ef85697e03bb7176efe58d9bcdaf68dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 499cff0dee2ca9b637e592705fde2f0699c16c0dffe4a558c507e66d31823187
MD5 7605f1a023b2d08ac5e515c2e440ae28
BLAKE2b-256 1b1cbe513661c5a95ad4e25f950e5a0d7bf3f9da085aae4a00a6291afa120c5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a94dfa09a363222dc081a438df069c99ab99744769eb7c6d88a5799f7fc3596b
MD5 90f1ca5da6520a58d892b1f73de67032
BLAKE2b-256 742a70e91d7a632addba56e8884477fda9df6bfeea0d9bad71c7961c1edf91ce

See more details on using hashes here.

File details

Details for the file centrex_tlf-0.1.7-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: centrex_tlf-0.1.7-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 314.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for centrex_tlf-0.1.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 837c64036945dbff4cbce992b657969c8f6f38e789129d046e1647bbb2acd5c5
MD5 78ae49307dfd8bffcde855e86de50ea0
BLAKE2b-256 087bbd96d7eca4e36c22dfc6b950eb400025f1b352d59cbdda1540b6b51099a7

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