Filtering Lines by Quantum Number

In this tutorial, we filter lines by the difference of vibrational quantum number between lower and upper states, \(\Delta \nu\).

from exojax.utils.grids import wavenumber_grid
nu_grid, wav, resolution = wavenumber_grid(24000.0, 26000,80000, unit="AA", xsmode="premodit")
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.

from exojax.spec import api
mdb = api.MdbExomol("CO/12C-16O/Li2015/", nu_grid, optional_quantum_states=True, activation=False)
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.

print(mdb.df)
#        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 \(\Delta \nu\).

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()
../_images/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.

load_mask = (mdb.df["v_u"] - mdb.df["v_l"] == 2)
mdb.activate(mdb.df, load_mask)
.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.

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()

# %%
../_images/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