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

Uploaded CPython 3.13Windows x86-64

centrex_tlf-0.1.8.3-cp313-cp313-manylinux_2_28_x86_64.whl (484.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.3-cp313-cp313-macosx_11_0_arm64.whl (436.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

centrex_tlf-0.1.8.3-cp312-cp312-win_amd64.whl (328.9 kB view details)

Uploaded CPython 3.12Windows x86-64

centrex_tlf-0.1.8.3-cp312-cp312-manylinux_2_28_x86_64.whl (485.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.3-cp312-cp312-macosx_11_0_arm64.whl (436.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

centrex_tlf-0.1.8.3-cp311-cp311-win_amd64.whl (331.7 kB view details)

Uploaded CPython 3.11Windows x86-64

centrex_tlf-0.1.8.3-cp311-cp311-manylinux_2_28_x86_64.whl (488.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.3-cp311-cp311-macosx_11_0_arm64.whl (442.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

centrex_tlf-0.1.8.3-cp310-cp310-win_amd64.whl (331.8 kB view details)

Uploaded CPython 3.10Windows x86-64

centrex_tlf-0.1.8.3-cp310-cp310-manylinux_2_28_x86_64.whl (489.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

centrex_tlf-0.1.8.3-cp310-cp310-macosx_11_0_arm64.whl (442.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2be1e59a3934dc1d4c5509810d94113ef08936465cd526c56954eb67eb05e5e8
MD5 15e923f927041ad3b226191233c45450
BLAKE2b-256 702e71b1a3abfb287b205e21d9c889b0bc91a147101ffb3a32600e418760c5c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 43332a99bc3553ea8bc5b35cc6124e4e7a354f09fc930b346f09f669104124ba
MD5 6b2104c717851af69d608b03ce5f6e92
BLAKE2b-256 af63200b00726b96bde403db637c1bbcd32fc9b69ba88e687e40ba77916ea910

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c92e2da62cb4c7df58bca224efaa95e5cafafd209fac675876d2e98f613b5d19
MD5 c14d50ecdb90a003e810acc2d6e938e1
BLAKE2b-256 d359703840b229fd546b69b52c922eef0421c2f14665fa350d6e7eea743d2235

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2cb70b5dd94feef2257dd6f1b850cb2667968bf793162e9134d0b8bc3bffa308
MD5 10a5f6c76e2d9f2400412a58e3b038b2
BLAKE2b-256 11c10c2b17280aa0b9b967be59a271009ed8d7d1f7e66ffd054ae68fb1d42663

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3cfa2e43285d893bc4c8c6e9c67f08e6e1b9ddfb4c13c952c1e0eda912887af1
MD5 da4cfd3cd9d3359b0ae336085478c0fd
BLAKE2b-256 a0aa94e53d043f68af5857d898375b5ed5369f6fbed9f52a85b8cd10624ae77d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 86e3db419efb2dd7ef754678e100d5c9499a115a99c0c4b729d76e274a53ea32
MD5 42bffb48cdb0ee57963415eae76db130
BLAKE2b-256 c511c8dbfc9cf5b0220db14f0dd9be96aaaf5759f76211f3e279b4a48cf930e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2bb70e747a59204cfa27754f3fc342220c690e80c49b92332f9be900debd71d1
MD5 3bc7945cd84fb4fab3daaef8030723cb
BLAKE2b-256 d9fcc8dd584a3ab478a1acbc27e660cbe1a383ef738ff5410b142aa52ccaa274

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e8716c4ae3fa805cc507636e2d439f10c273bad16ed535f815524cf0373d45cb
MD5 f197764a7f06739a352f38b1d28f0805
BLAKE2b-256 ed5b53c759872b4310cc284ac2e1a190be6d5aa5d5e67b75c496d886f282e875

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7d290dedfe6124abca3147e33a0fd3a6b4a633d7a44cd677b38fecacc7b8d2a8
MD5 491f8bb3c5752baf3404e247758f2b9a
BLAKE2b-256 79360c3b800c132c577fa4b792cc4559b3e027664fec7f8bb83cb42d6ff88dea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0b2dcff60056b24dcbed50957a90e6ef07a2ead89c75cacdfe44273c595b5de0
MD5 776b76e877c210f45e62b0ade661f4c6
BLAKE2b-256 eb656882b3abada344dd71fb3ff6f9fde659babd637440699b753929f1f09361

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a2e28665f6ce12de4c959e0958f39c314b4c64c34c9ca43847fcc469c5342e07
MD5 b3774dc3a3cf42d71b045e5d63af7177
BLAKE2b-256 feab1b9492bfec929e28c73f425710d36f014683bc1f2cca9b262fecfdf37ffc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for centrex_tlf-0.1.8.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 61cfbd7a1f6fb9b04af948fec68b18354fea7a7726bbb713a4986af4753b8cce
MD5 c72a1286dff3f8cadacd5e87ab115446
BLAKE2b-256 124941e4bcf24c65be16d2e2ed30fe3e98636a27c790e955a13e46a523329395

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