documents/tutorials/select_quantum_states.rst
Filtering Lines by Quantum Number
=================================
In this tutorial, we filter lines by the difference of vibrational
quantum number between lower and upper states, :math:`\Delta \nu`.
.. code:: ipython3
from exojax.utils.grids import wavenumber_grid
nu_grid, wav, resolution = wavenumber_grid(24000.0, 26000,80000, unit="AA", xsmode="premodit")
.. parsed-literal::
xsmode = premodit
xsmode assumes ESLOG in wavenumber space: mode=premodit
Normally, “mdb” performs the activation automatically. We would like to
avoid this automatic activation and perform activation after the user
defines the mask. To do this, call mdb with activation=False. We also
would use the quantum number available in this database. So, use
optional_quantum_states=True.
.. code:: ipython3
from exojax.spec import api
mdb = api.MdbExomol("CO/12C-16O/Li2015/", nu_grid, optional_quantum_states=True, activation=False)
.. parsed-literal::
HITRAN exact name= (12C)(16O)
Background atmosphere: H2
Reading CO/12C-16O/Li2015/12C-16O__Li2015.trans.bz2
DataFrame (self.df) available.
When called activation turn off, the DataFrame becomes automatically
available. Check mdb.df.
.. code:: ipython3
print(mdb.df)
.. parsed-literal::
# i_upper i_lower A nu_lines gup jlower jupper elower v_l v_u kp_l kp_u Sij0
0 84 42 1.155e-06 2.405586 3 0 1 66960.7124 41 41 e e 3.811968898414225e-164
1 83 41 1.161e-06 2.441775 3 0 1 65819.903 40 40 e e 9.663028103692631e-162
2 82 40 1.162e-06 2.477774 3 0 1 64654.9206 39 39 e e 2.7438392479197905e-159
3 81 39 1.159e-06 2.513606 3 0 1 63465.8042 38 38 e e 8.73322833971394e-157
4 80 38 1.152e-06 2.549292 3 0 1 62252.5793 37 37 e e 3.115220404216648e-154
... ... ... ... ... ... ... ... ... ... ... ... ... ...
125,491 306 253 7.164e-10 22147.135424 15 6 7 80.7354 0 11 e e 1.8282485593637477e-31
125,492 474 421 9.852e-10 22147.86595 23 10 11 211.4041 0 11 e e 2.0425455665383687e-31
125,493 348 295 7.72e-10 22147.897299 17 7 8 107.6424 0 11 e e 1.9589545250222689e-31
125,494 432 379 9.056e-10 22148.262711 21 9 10 172.978 0 11 e e 2.0662209116961706e-31
125,495 390 337 8.348e-10 22148.273111 19 8 9 138.3903 0 11 e e 2.0387827253771594e-31
So, we can use the above information for masking the molecular lines.
DataFrame is not limited by nu_grids. So, all of the lines are visible
(but using lazy I/O of vaex). Let’s plot the line strength with
different :math:`\Delta \nu`.
.. code:: ipython3
import matplotlib.pyplot as plt
for dv in range(0, 6):
mask = mdb.df["v_u"] - mdb.df["v_l"] == dv
dfv = mdb.df[mask]
plt.plot(dfv["nu_lines"].values,
dfv["Sij0"].values,
".",
label="$\\Delta \\nu = $" + str(dv),
alpha=0.2)
plt.legend()
plt.yscale("log")
plt.xlabel("wavenumber cm-1")
plt.show()
.. image:: select_quantum_states_files/select_quantum_states_8_0.png
In ExoJAX, we need activate “mdb”. User-defined mask for DataFrame can
be used as load_mask option of msb.activate.
.. code:: ipython3
load_mask = (mdb.df["v_u"] - mdb.df["v_l"] == 2)
mdb.activate(mdb.df, load_mask)
.. parsed-literal::
.broad is used.
Broadening code level= a0
default broadening parameters are used for 69 J lower states in 150 states
The following lines are activated and can be used further analysis as
usual.
.. code:: ipython3
plt.plot(mdb.nu_lines,
mdb.line_strength_ref,
"+",
color="black",
label="activated lines")
plt.legend()
plt.ylabel("line strength at 296 K")
plt.xlabel("wavenumber cm-1")
plt.yscale("log")
plt.show()
# %%
.. image:: select_quantum_states_files/select_quantum_states_12_0.png
Note that the above process is also applicable to MdbHitemp and
MdbHitran.
In tests/integration/moldb these examples are available for reference.
- quantum_states_filter_exomol.py
- quantum_states_filter_hitemp.py
- quantum_states_filter_hitran_co.py