HajimeKawahara/exojax

View on GitHub
documents/tutorials/select_quantum_states.rst

Summary

Maintainability
Test Coverage
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