rydiqule.arc_utils.RQ_AlkaliAtom¶
- class rydiqule.arc_utils.RQ_AlkaliAtom(arc_atom: arc.alkali_atom_functions.AlkaliAtom)[source]¶
Bases:
object
- __init__(arc_atom: arc.alkali_atom_functions.AlkaliAtom)[source]¶
Rydiqule’s wrapper class around ARC’s Alkai atom classes.
Designed predominantly for internal use, seldom needs to be accessed directly.
- Parameters:
arc_atom (
AlkaliAtom
) – ARC atom to use for calculations. Stored internally in theatom
attribute.
Methods
__init__
(arc_atom)Rydiqule's wrapper class around ARC's Alkai atom classes.
gaussian_center_field
(laserPower, laserWaist)Returns the electric field for the center of a TEM00 gaussian spatial mode
get_dipole_matrix_element
(state1, state2, q)Get dipole matrix element \(\langle s1|e\mathbf{r}|s2\rangle\) in units of \(a_0 e\)
get_rabi_frequency
(state1, state2, q, ...[, s])Returns the Rabi frequency for resonantly driven atom in center of a TEM00 mode of a field.
get_rabi_frequency2
(state1, state2, q, ...)Returns the Rabi frequency for resonantly driven atom in a given electric field amplitude.
get_reduced_matrix_elementJ
(state1, state2)Returns the reduced dipole matrix element in the J basis.
get_reduced_rabi_frequency
(state1, state2, ...)Returns the Rabi frequency for resonantly driven atom in center of a TEM00 mode of a field.
get_reduced_rabi_frequency2
(state1, state2, ...)Returns the reduced Rabi frequency for resonantly driven atom in a given electric field amplitude.
get_spherical_dipole_matrix_element
(state1, ...)Returns the spherical part of the dipole matrix element for a transition.
get_state_energy
(state[, s])Returns the energy of the level relative to the ionisation level in Hz.
get_state_lifetime
(state[, temperature, ...])Get lifetime of the state.
get_transition_frequency
(state1, state2[, ...])Returns the transition frequency (energy difference) between two states, in Hz.
get_transition_rate
(state1, state2[, ...])Returns transition rate between two states due to spontaneous emission.
get_transition_wavelength
(state1, state2[, ...])Returns the transition wavelength between two states, in m.
Attributes
ARC atom with which to perfom calculations.
- _getDipoleMatrixElementFStoHFS(n1, l1, j1, mj1, n2, l2, j2, f2, mf2, q, s)[source]¶
Funtion which inverts arcs HFS to FS dipole matrix element function, , in units of e*a0
- _get_nlj_dipole(n1, l1, j1, n2, l2, j2, q, s)[source]¶
Dipole matrix element between a pair of NLJ states, in units of e*a0
- _tr_prefactor_fs_fs(state1, state2, s)[source]¶
transition rate prefactor between 2 hyperfine states. Units of reduced matrix element \(<j|er|j'>\)
- _tr_prefactor_fs_hfs(state1, state2, s)[source]¶
transition rate prefactor for transitions from a fine structure state to a hyperfine state. Units of reduced matrix element \(<j|er|j'>\)
- _tr_prefactor_hfs_fs(state1, state2, s)[source]¶
transition rate prefactor for transitions from a hyperfine state to a fine structure state. Units of reduced matrix element \(<j|er|j'>\)
- _tr_prefactor_hfs_hfs(state1, state2, s)[source]¶
transition rate prefactor between hyperfine states. returns the branching ratio for a particular F state. Units of reduced matrix element \(<j|er|j'>\)
- arc_atom¶
ARC atom with which to perfom calculations.
- gaussian_center_field(laserPower: float, laserWaist: float) float [source]¶
Returns the electric field for the center of a TEM00 gaussian spatial mode
This calculates the peak intensity of the gaussian mode, and uses a plane wave assumption to get the electric field amplitude.
- get_dipole_matrix_element(state1: A_QState, state2: A_QState, q: Literal[-1, 0, 1], s: float = 0.5) float [source]¶
Get dipole matrix element \(\langle s1|e\mathbf{r}|s2\rangle\) in units of \(a_0 e\)
If states 1 and 2 are sublevels, either FS or HFS, appropriate ARC function is used. If states 1 and 2 are NLJ, a simple average of the magnitudes of the dipole-allowed moments between mJ1 and mJ2 is returned.
Cannot calculate dipole matrix elements between states with NLJ specication and those with either FS or HS splitting.
ARC functions used are:
- Parameters:
state1 (A_QState) –
A_QState
namedtuple of quantum numbers for the quantum state \(s1\).state2 (A_QState) –
A_QState
namedtuple of quantum numbers for the quantum state \(s2\).q (int) – Polarization of coupling field in spherical basis (+1, 0, -1), corresponding to \(\sigma^+\), \(\pi\), or \(\sigma^-\).
s (float, optional) – total spin angular momentum of the state. Default is 0.5 for Alkali atoms.
- Returns:
Dipole moment of the transition in atomic units (\(a_0 e\)). Will be 0 if the transition is not dipole-allowed.
- Return type:
- Raises:
AtomError – If the two states to be coupled are in one each of the NLJ and FS/HFS defintions.
Examples
>>> import arc >>> g_nlj = rq.A_QState(5, 0, 0.5) >>> g_fs = rq.A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = rq.A_QState(5, 1, 0.5) >>> e_hfs = rq.A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_dipole_matrix_element(g_nlj, e_nlj, q=0)) 1.7277475900721146 >>> print(my_atom.get_dipole_matrix_element(g_fs, e_hfs, q=0)) 1.2217020371187075 >>> print(my_atom.get_dipole_matrix_element(g_nlj, e_hfs, q=0)) Traceback (most recent call last): File "<stdin>", line 1, in <module> rydiqule.exceptions.AtomError: Invalid transition type for dipole calculation.
- get_rabi_frequency(state1: A_QState, state2: A_QState, q: Literal[-1, 0, 1], laserPower: float, laserWaist: float, s: float = 0.5) float [source]¶
Returns the Rabi frequency for resonantly driven atom in center of a TEM00 mode of a field.
The field is calculated using
gaussian_center_field()
. It then callsget_rabi_frequency2()
to get the rabi frequency.- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers for state driving from
state2 (A_QState) – NamedTuple of quantum numbers for state driving to
q (int) – laser polarization in spherical basis (-1,0,1) corresponding to \(\sigma^-\), \(\pi\), and \(\sigma^+\)
laserPower (float) – laser power in Watts
laserWaist (float) – laser \(1/e^2\) waist (radius) in meters
s (float, optional) – total spin angular momentum of the states. By default 0.5 for Alkali atoms.
- Returns:
rabi_frequency – Rabi frequency in rad/s. To get Hz, divide by \(2\pi\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_rabi_frequency(g_nlj, e_nlj, q=0, laserPower=1, laserWaist=0.01)/1e6) #MHz 304.22 >>> print(my_atom.get_rabi_frequency(g_fs, e_hfs, q=0, laserPower=1, laserWaist=0.01)/1e6) #MHz 215.11 >>> print(my_atom.get_rabi_frequency(g_nlj, e_hfs, q=0, laserPower=1, laserWaist=0.01)) Traceback (most recent call last): ... rydiqule.exceptions.AtomError: Invalid transition type for dipole calculation.
- get_rabi_frequency2(state1: A_QState, state2: A_QState, q: Literal[-1, 0, 1], electricFieldAmplitude: float, s: float = 0.5) float [source]¶
Returns the Rabi frequency for resonantly driven atom in a given electric field amplitude.
Uses
get_dipole_matrix_element()
for the calculation.- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers for state driving from
state2 (A_QState) – NamedTuple of quantum numbers for state driving to
q (int) – laser polarization in spherical basis (-1,0,1) corresponding to \(\sigma^-\), \(\pi\), and \(\sigma^+\)
electricFieldAmplitude (float) – amplitude of driving electric field, in V/m
s (float, optional) – total spin angular momentum of the states. By default 0.5 for Alkali atoms.
- Returns:
rabi_frequency – Rabi frequency in rad/s. To get Hz, divide by \(2\pi\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = rq.A_QState(5, 0, 0.5) >>> g_fs = rq.A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = rq.A_QState(5, 1, 0.5) >>> e_hfs = rq.A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> e_field = 0.1 #V/m >>> print(my_atom.get_rabi_frequency2(g_nlj, e_nlj, q=0, electricFieldAmplitude=e_field)) 13890.429 >>> print(my_atom.get_rabi_frequency2(g_fs, e_hfs, q=0, electricFieldAmplitude=e_field)) 9822.0166 >>> print(my_atom.get_rabi_frequency2(g_nlj, e_hfs, q=0, electricFieldAmplitude=e_field)) Traceback (most recent call last): ... rydiqule.exceptions.AtomError: Invalid transition type for dipole calculation.
- get_reduced_matrix_elementJ(state1: A_QState, state2: A_QState, s: float = 0.5) float [source]¶
Returns the reduced dipole matrix element in the J basis.
A convenience wrapper for
getReducedMatrixElementJ()
Note
To get proper sign conventions, state order must go from lower energy to higher energy state.
- Parameters:
- Returns:
Reduced matrix element \(\langle J||d||J'\rangle\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_reduced_matrix_elementJ(g_nlj, e_nlj)) 4.2321 >>> print(my_atom.get_reduced_matrix_elementJ(g_fs, e_hfs)) 4.2321 >>> print(my_atom.get_reduced_matrix_elementJ(g_nlj, e_hfs)) 4.2321
- get_reduced_rabi_frequency(state1: A_QState, state2: A_QState, laserPower: float, laserWaist: float, s: float = 0.5) float [source]¶
Returns the Rabi frequency for resonantly driven atom in center of a TEM00 mode of a field.
The field is calculated using
gaussian_center_field()
. It then callsget_rabi_frequency2()
to get the rabi frequency.Note
This function preserves the sign of the dipole moment (i.e. the result could be negative). As such, state calling order matters. To get correct convention for use in Cell,
state
must be lower energy thanstate2
.- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers for state driving from
state2 (A_QState) – NamedTuple of quantum numbers for state driving to
laserPower (float) – laser power in Watts
laserWaist (float) – laser \(1/e^2\) waist (radius) in meters
s (float, optional) – total spin angular momentum of the states. By default 0.5 for Alkali atoms.
- Returns:
rabi_frequency – Rabi frequency in rad/s. To get Hz, divide by \(2\pi\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_reduced_rabi_frequency(g_nlj, e_nlj, laserPower=1, laserWaist=0.01)/1e6) #MHz 372.59 >>> print(my_atom.get_reduced_rabi_frequency(g_fs, e_hfs, laserPower=1, laserWaist=0.01)/1e6) #MHz 372.59 >>> print(my_atom.get_reduced_rabi_frequency(g_nlj, e_hfs, laserPower=1, laserWaist=0.01)/1e6) #MHz 372.59
- get_reduced_rabi_frequency2(state1: A_QState, state2: A_QState, electricFieldAmplitude: float, s: float = 0.5) float [source]¶
Returns the reduced Rabi frequency for resonantly driven atom in a given electric field amplitude.
Uses \(1/2\)
get_reduced_matrix_elementJ()
.Note
This function preserves the sign of the dipole moment (i.e. the result could be negative). As such, state calling order matters. To get correct convention for use in Cell,
state1
must be lower energy thanstate2
.- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers for state driving from
state2 (A_QState) – NamedTuple of quantum numbers for state driving to
electricFieldAmplitude (float) – amplitude of driving electric field, in V/m
s (float, optional) – total spin angular momentum of the states. By default 0.5 for Alkali atoms.
- Returns:
rabi_frequency – Rabi frequency in rad/s. To get Hz, divide by \(2\pi\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> e_field = 0.1 #V/m >>> print(my_atom.get_reduced_rabi_frequency2(g_nlj, e_nlj, electricFieldAmplitude=e_field)) 17012.23 >>> print(my_atom.get_reduced_rabi_frequency2(g_fs, e_hfs, electricFieldAmplitude=e_field)) 17012.23 >>> print(my_atom.get_reduced_rabi_frequency2(g_nlj, e_hfs, electricFieldAmplitude=e_field)) 17012.23
- get_spherical_dipole_matrix_element(state1: A_QState, state2: A_QState, q: Literal[-1, 0, 1], s: float = 0.5) float [source]¶
Returns the spherical part of the dipole matrix element for a transition.
Calculated by dividing the transition dipole moment by the reduced J matrix element.
- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers for first state
state2 (A_QState) – NamedTuple of quantum numbers for second state
q (int) – field polarization in the spherical basis (-1,0,1) corresponding to \(\sigma^-\), \(\pi\), and \(\sigma^+\)
s (float, optional) – total spin angular momentum of the states. By default 0.5 for Alkali atoms.
- Returns:
Spherical part of the dipole matrix element, in units of reduced matrix element \(\langle J||d||J'\rangle\)
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_spherical_dipole_matrix_element(g_nlj, e_nlj, q=0)) 0.4082 >>> print(my_atom.get_spherical_dipole_matrix_element(g_fs, e_hfs, q=0)) 0.2887 >>> print(my_atom.get_spherical_dipole_matrix_element(g_nlj, e_hfs, q=0)) Traceback (most recent call last): File "<stdin>", line 1, in <module> rydiqule.exceptions.AtomError: Invalid transition type for dipole calculatdion. Allowed types are [('HFS', 'FS'), ('FS', 'HFS'), ('HFS', 'HFS'), ('FS', 'FS'), ('NLJ', 'NLJ')]
- get_state_energy(state: A_QState, s: float = 0.5) float [source]¶
Returns the energy of the level relative to the ionisation level in Hz.
If
state
is in the fine basis or NLJ, energies are relative to the center of gravity of the hyperfine split states. Ifstate
is in the hyperfine basis, hyperfine shifts are applied.Uses ARC’s
getEnergy()
to get the energy of the fine structure state. Hyperfine shifts are applied using ARC’sgetHFSCoefficients()
andgetHFSEnergyShift()
methods.- Parameters:
- Returns:
Energy of state relative to the ionisation level in Hz.
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_state_energy(g_nlj)/1e9) #GHz -1010024.7 >>> print(my_atom.get_state_energy(g_fs)/1e9) #GHz -1010024.7 >>> print(my_atom.get_state_energy(e_hfs)/1e9) #GHz -632917.5
- get_state_lifetime(state: A_QState, temperature: float = 0.0, includeLevelsUpTo: int = 0, s: float = 0.5) float [source]¶
Get lifetime of the state.
If temperature is provided, includes Black-Body Radiation induced transitions. Otherwise, this is the natural lifetime of the state.
This is a thin wrapper around ARC’s
getStateLifetime()
method. It adds basic validation of the state and selects the correct quantum numbers for the calcuation.- Parameters:
state (A_QState) – NamedTuple of quantum numbers of state for which to calculate lifetime.
temperature (float, optional) – Temperature at which the atom environmnet is, in Kelvin. Used for calculating the black-body-induced state lifetime. If 0.0 (default), result does not inlclude BBR term.
includeLevelsUpTo (int, optional) – If
temperature
is non-zero, this specifies the highest principal quantum number states to include in the BBR calculation. Must be at leastn+1
of the provided state.s (float, optional) – total spin angular momentum of the state. Default is 0.5, for alkali atoms.
- Returns:
State lifetime in seconds.
- Return type:
Examples
>>> from rydiqule import A_QState >>> import arc >>> e = A_QState(10, 0, 0.5) >>> e_fs = A_QState(10, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(10, 1, 0.5) >>> e_hfs = A_QState(10, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_state_lifetime(e_nlj)) 1.1626e-06 >>> print(my_atom.get_state_lifetime(e_fs)) 4.20984e-07 >>> print(my_atom.get_state_lifetime(e_nlj)) 1.16261e-06
- get_transition_frequency(state1: A_QState, state2: A_QState, s1: float = 0.5, s2: float = 0.5) float [source]¶
Returns the transition frequency (energy difference) between two states, in Hz.
Uses
get_state_energy()
on both states to determine the energy difference.- Parameters:
state1 (A_QState) –
A_QState
namedtuple of quantum numbers for the first quantum state.state2 (A_QState) –
A_QState
namedtuple of quantum numbers for the second quantum state.s1 (float, optional) – spin of the initial state. Default is 0.5 for Alkali atom.
s2 (float, optional) – spin of the final state. Default is 0.5 for Alkali atom.
- Returns:
Transition frequency between the two states, in Hz. If negative, state1 has higher energy than state2.
- Return type:
Examples
>>> import arc >>> g_nlj = rq.A_QState(5, 0, 0.5) >>> g_fs = rq.A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = rq.A_QState(5, 1, 0.5) >>> e_hfs = rq.A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_transition_frequency(g_nlj, e_nlj)) 377107433259213.6 >>> print(my_atom.get_transition_frequency(g_fs, e_hfs)) 377107222336963.6 >>> print(my_atom.get_transition_frequency(g_nlj, e_hfs)) 377107222336963.6
- get_transition_rate(state1: A_QState, state2: A_QState, temperature: float = 0.0, s: float = 0.5) float [source]¶
Returns transition rate between two states due to spontaneous emission.
If temperature is provided, Black-Body Radiation induced transitions are included. Otherwise, rate is due to the natural radiative lifetime only.
Uses ARC’s
getTransitionRate()
to get the base transition rate between \(|n_1,l_1,j_1\rangle\) to \(|n_2,l_2,j_2\rangle\). If state1 and/or state2 are sublevels in the fine or hyperfine structures, this further applies the appropriate branching ratio.- Parameters:
state1 (A_QState) – NamedTuple of quantum numbers of the originating state
state2 (A_QState) – NamedTuple of quantum numbers of the target state
temperature (float, optional) – Temperature of th atomic environment for calculationg BBR-induced decays, in Kelvin. With default of 0.0, only include natural lifetime.
s (float, optional) – total spin angular momentum. Default of 0.5 for Alkali atoms
- Returns:
Transition rate in 1/s
- Return type:
- Raises:
AtomError – If states are in both NLJ and FS/HFS definition.
Examples
>>> from rydiqule import A_QState >>> import arc >>> g_nlj = A_QState(5, 0, 0.5) >>> g_fs = A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = A_QState(5, 1, 0.5) >>> e_hfs = A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_transition_rate(e_nlj, g_nlj)/1e6) #GHz 36.11 >>> print(my_atom.get_transition_rate(e_hfs, g_fs)/1e6) #GHz 18.06 >>> print(my_atom.get_transition_rate(e_hfs, g_nlj)) Traceback (most recent call last): File "<stdin>", line 1, in <module> rydiqule.exceptions.AtomError: Transition between HFS and NLJ are not allowed.
- get_transition_wavelength(state1: A_QState, state2: A_QState, s1: float = 0.5, s2: float = 0.5) float [source]¶
Returns the transition wavelength between two states, in m.
Uses
getTransitionWavelength()
.- Parameters:
state1 (A_QState) –
A_QState
namedtuple of quantum numbers for the first quantum state.state2 (A_QState) –
A_QState
namedtuple of quantum numbers for the first quantum state.s1 (float, optional) – spin of the initial state. Default is 0.5 for Alkali atom.
s2 (float, optional) – spin of the final state. Default is 0.5 for Alkali atom.
- Returns:
Transition wavelength between the two states, in m. If negative, state2 has higher energy than state1.
- Return type:
Examples
>>> import arc >>> g_nlj = rq.A_QState(5, 0, 0.5) >>> g_fs = rq.A_QState(5, 0, 0.5, m_j=-0.5) >>> e_nlj = rq.A_QState(5, 1, 0.5) >>> e_hfs = rq.A_QState(5, 1, 0.5,f=2, m_f=0) >>> arc_atom = arc.alkali_atom_data.Rubidium85() >>> my_atom = rq.RQ_AlkaliAtom(arc_atom) >>> print(my_atom.get_transition_wavelength(g_nlj, e_nlj)) 7.949789146530309e-07 >>> print(my_atom.get_transition_wavelength(g_fs, e_hfs)) 7.949789146530309e-07 >>> print(my_atom.get_transition_wavelength(g_nlj, e_hfs)) 7.949789146530309e-07