
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "auto_examples/plot_gr_hv_scan.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        Click :ref:`here <sphx_glr_download_auto_examples_plot_gr_hv_scan.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_auto_examples_plot_gr_hv_scan.py:


Graphene hv scan
================

Simple workflow for analyzing a photon energy scan data of graphene as
simulated from a third nearest neighbor tight binding model.
The same workflow can be applied to any photon energy scan.

.. GENERATED FROM PYTHON SOURCE LINES 12-13

Import the "fundamental" python libraries for a generic data analysis:

.. GENERATED FROM PYTHON SOURCE LINES 13-17

.. code-block:: default


    import numpy as np
    import matplotlib.pyplot as plt








.. GENERATED FROM PYTHON SOURCE LINES 18-19

Instead of loading the file as for example:

.. GENERATED FROM PYTHON SOURCE LINES 19-24

.. code-block:: default


    # from navarp.utils import navfile
    # file_name = r"nxarpes_simulated_cone.nxs"
    # entry = navfile.load(file_name)








.. GENERATED FROM PYTHON SOURCE LINES 25-27

Here we build the simulated graphene signal with a dedicated function defined
just for this purpose:

.. GENERATED FROM PYTHON SOURCE LINES 27-36

.. code-block:: default

    from navarp.extras.simulation import get_tbgraphene_hv

    entry = get_tbgraphene_hv(
        scans=np.arange(90, 150, 2),
        angles=np.linspace(-7, 7, 300),
        ebins=np.linspace(-3.3, 0.4, 450),
        tht_an=-18,
    )








.. GENERATED FROM PYTHON SOURCE LINES 37-41

Plot a single analyzer image at scan = 90
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
First I have to extract the isoscan from the entry, so I use the isoscan
method of entry:

.. GENERATED FROM PYTHON SOURCE LINES 41-43

.. code-block:: default

    iso0 = entry.isoscan(scan=90)








.. GENERATED FROM PYTHON SOURCE LINES 44-45

Then to plot it using the 'show' method of the extracted iso0:

.. GENERATED FROM PYTHON SOURCE LINES 45-47

.. code-block:: default

    iso0.show(yname='ekin')




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_001.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_001.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f9d54210>



.. GENERATED FROM PYTHON SOURCE LINES 48-49

Or by string concatenation, directly as:

.. GENERATED FROM PYTHON SOURCE LINES 49-51

.. code-block:: default

    entry.isoscan(scan=90).show(yname='ekin')




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_002.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_002.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f9e72790>



.. GENERATED FROM PYTHON SOURCE LINES 52-60

Fermi level determination
^^^^^^^^^^^^^^^^^^^^^^^^^
The initial guess for the binding energy is: ebins = ekins - (hv - work_fun).
However, the better way is to proper set the Fermi level first and then
derives everything form it. In this case the Fermi level kinetic energy is
changing along the scan since it is a photon energy scan.
So to set the Fermi level I have to give an array of values corresponding to
each photon energy. By definition I can give:

.. GENERATED FROM PYTHON SOURCE LINES 60-64

.. code-block:: default


    efermis = entry.hv - entry.analyzer.work_fun
    entry.set_efermi(efermis)








.. GENERATED FROM PYTHON SOURCE LINES 65-69

Or I can use a method for its detection, but in this case, it is important to
give a proper energy range for each photon energy. For example for each
photon a good range is within 0.4 eV around the photon energy minus the
analyzer work function:

.. GENERATED FROM PYTHON SOURCE LINES 69-76

.. code-block:: default


    energy_range = (
        (entry.hv[:, None] - entry.analyzer.work_fun) +
        np.array([-0.4, 0.4])[None, :])

    entry.autoset_efermi(energy_range=energy_range)





.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    scan(eV)  efermi(eV)  FWHM(meV)  new hv(eV)
    90.0000  85.3999  59.9  89.9999
    92.0000  87.3998  58.5  91.9998
    94.0000  89.3994  60.7  93.9994
    96.0000  91.4004  57.8  96.0004
    98.0000  93.4004  59.3  98.0004
    100.0000  95.4001  59.3  100.0001
    102.0000  97.4002  58.8  102.0002
    104.0000  99.4005  58.7  104.0005
    106.0000  101.4010  57.5  106.0010
    108.0000  103.3997  59.9  107.9997
    110.0000  105.4001  59.4  110.0001
    112.0000  107.4007  58.4  112.0007
    114.0000  109.4005  58.1  114.0005
    116.0000  111.4002  59.4  116.0002
    118.0000  113.4008  57.4  118.0008
    120.0000  115.4009  57.6  120.0009
    122.0000  117.4000  60.0  122.0000
    124.0000  119.4000  60.3  124.0000
    126.0000  121.3998  59.0  125.9998
    128.0000  123.4006  58.6  128.0006
    130.0000  125.3997  59.9  129.9997
    132.0000  127.4000  59.7  132.0000
    134.0000  129.4003  59.0  134.0003
    136.0000  131.4002  58.5  136.0002
    138.0000  133.4004  58.6  138.0004
    140.0000  135.4003  59.2  140.0003
    142.0000  137.4004  58.8  142.0004
    144.0000  139.4000  59.1  144.0000
    146.0000  141.3998  60.2  145.9998
    148.0000  143.3999  59.5  147.9999





.. GENERATED FROM PYTHON SOURCE LINES 77-80

In both cases the binding energy and the photon energy will be updated
consistently. Note that the work function depends on the beamline or
laboratory. If not specified is 4.5 eV.

.. GENERATED FROM PYTHON SOURCE LINES 82-84

To check the Fermi level detection I can have a look on each photon energy.
Here I show only the first 10 photon energies:

.. GENERATED FROM PYTHON SOURCE LINES 84-93

.. code-block:: default


    for scan_i in range(10):
        print("hv = {} eV,  E_F = {:.0f} eV,  Res = {:.0f} meV".format(
            entry.hv[scan_i],
            entry.efermi[scan_i],
            entry.efermi_fwhm[scan_i]*1000
        ))
        entry.plt_efermi_fit(scan_i=scan_i)




.. rst-class:: sphx-glr-horizontal


    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_003.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_003.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_004.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_004.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_005.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_005.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_006.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_006.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_007.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_007.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_008.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_008.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_009.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_009.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_010.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_010.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_011.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_011.png
         :class: sphx-glr-multi-img

    *

      .. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_012.png
         :alt: plot gr hv scan
         :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_012.png
         :class: sphx-glr-multi-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    hv = 89.9998738611425 eV,  E_F = 85 eV,  Res = 60 meV
    hv = 91.99976715674832 eV,  E_F = 87 eV,  Res = 59 meV
    hv = 93.99939401430593 eV,  E_F = 89 eV,  Res = 61 meV
    hv = 96.0003924997328 eV,  E_F = 91 eV,  Res = 58 meV
    hv = 98.00038148538293 eV,  E_F = 93 eV,  Res = 59 meV
    hv = 100.00007864343151 eV,  E_F = 95 eV,  Res = 59 meV
    hv = 102.00022919963484 eV,  E_F = 97 eV,  Res = 59 meV
    hv = 104.0004864784704 eV,  E_F = 99 eV,  Res = 59 meV
    hv = 106.00102622412413 eV,  E_F = 101 eV,  Res = 58 meV
    hv = 107.99970039300567 eV,  E_F = 103 eV,  Res = 60 meV




.. GENERATED FROM PYTHON SOURCE LINES 94-96

Plot a single analyzer image at scan = 110 with the Fermi level aligned
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. GENERATED FROM PYTHON SOURCE LINES 96-99

.. code-block:: default


    entry.isoscan(scan=110).show(yname='eef')




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_013.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_013.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f9975d50>



.. GENERATED FROM PYTHON SOURCE LINES 100-102

Plotting iso-energetic cut at ekin = efermi
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. GENERATED FROM PYTHON SOURCE LINES 102-105

.. code-block:: default


    entry.isoenergy(0).show()




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_014.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_014.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f986f910>



.. GENERATED FROM PYTHON SOURCE LINES 106-113

Plotting in the reciprocal space (k-space)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I have to define first the reference point to be used for the transformation.
Meaning a point in the angular space which I know it correspond to a
particular point in the k-space. In this case the graphene Dirac-point is for
hv = 120 is at ekin = 114.3 eV and tht_p = -0.6 (see the figure below), which
in the k-space has to correspond to kx = 1.7.

.. GENERATED FROM PYTHON SOURCE LINES 113-133

.. code-block:: default

    hv_p = 120

    entry.isoscan(scan=hv_p, dscan=0).show(yname='ekin', cmap='cividis')

    tht_p = -0.6
    e_kin_p = 114.3
    plt.axvline(tht_p, color='w')
    plt.axhline(e_kin_p, color='w')

    entry.set_kspace(
        tht_p=tht_p,
        k_along_slit_p=1.7,
        scan_p=0,
        ks_p=0,
        e_kin_p=e_kin_p,
        inn_pot=14,
        p_hv=True,
        hv_p=hv_p,
    )




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_015.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_015.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    tht_an = -18.040
    scan_type =  hv
    inn_pot = 14.000
    phi_an = 0.000
    k_perp_slit_for_kz = 0.000
    kspace transformation ready




.. GENERATED FROM PYTHON SOURCE LINES 134-136

Once it is set, all the isoscan or iscoenergy extracted from the entry will
now get their proper k-space scales:

.. GENERATED FROM PYTHON SOURCE LINES 136-139

.. code-block:: default


    entry.isoscan(120).show()




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_016.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_016.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f95d14d0>



.. GENERATED FROM PYTHON SOURCE LINES 140-141

sphinx_gallery_thumbnail_number = 17

.. GENERATED FROM PYTHON SOURCE LINES 141-143

.. code-block:: default

    entry.isoenergy(0).show(cmap='cividis')




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_017.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_017.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none


    <matplotlib.collections.QuadMesh object at 0x7f91f9658550>



.. GENERATED FROM PYTHON SOURCE LINES 144-145

I can also place together in a single figure different images:

.. GENERATED FROM PYTHON SOURCE LINES 145-153

.. code-block:: default


    fig, axs = plt.subplots(1, 2)

    entry.isoscan(120).show(ax=axs[0])
    entry.isoenergy(-0.9).show(ax=axs[1])

    plt.tight_layout()




.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_018.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_018.png
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 154-156

Many other options:
^^^^^^^^^^^^^^^^^^^

.. GENERATED FROM PYTHON SOURCE LINES 156-205

.. code-block:: default


    fig, axs = plt.subplots(2, 2)

    scan = 110
    dscan = 0
    ebin = -0.9
    debin = 0.01

    entry.isoscan(scan, dscan).show(ax=axs[0][0], xname='tht', yname='ekin')
    entry.isoscan(scan, dscan).show(ax=axs[0][1], cmap='binary')

    axs[0][1].axhline(ebin-debin)
    axs[0][1].axhline(ebin+debin)

    entry.isoenergy(ebin, debin).show(
        ax=axs[1][0], xname='tht', yname='phi', cmap='cividis')
    entry.isoenergy(ebin, debin).show(
        ax=axs[1][1], cmap='magma', cmapscale='log')

    axs[1][0].axhline(scan, color='w', ls='--')
    axs[0][1].axvline(1.7, color='r', ls='--')
    axs[1][1].axvline(1.7, color='r', ls='--')

    x_note = 0.05
    y_note = 0.98

    for ax in axs[0][:]:
        ax.annotate(
            "$scan \: = \: {} eV$".format(scan, dscan),
            (x_note, y_note),
            xycoords='axes fraction',
            size=8, rotation=0, ha="left", va="top",
            bbox=dict(
                boxstyle="round", fc='w', alpha=0.65, edgecolor='None', pad=0.05
            )
        )

    for ax in axs[1][:]:
        ax.annotate(
            "$E-E_F \: = \: {} \pm {} \; eV$".format(ebin, debin),
            (x_note, y_note),
            xycoords='axes fraction',
            size=8, rotation=0, ha="left", va="top",
            bbox=dict(
                boxstyle="round", fc='w', alpha=0.65, edgecolor='None', pad=0.05
            )
        )

    plt.tight_layout()



.. image-sg:: /auto_examples/images/sphx_glr_plot_gr_hv_scan_019.png
   :alt: plot gr hv scan
   :srcset: /auto_examples/images/sphx_glr_plot_gr_hv_scan_019.png
   :class: sphx-glr-single-img






.. rst-class:: sphx-glr-timing

   **Total running time of the script:** ( 0 minutes  3.782 seconds)


.. _sphx_glr_download_auto_examples_plot_gr_hv_scan.py:


.. only :: html

 .. container:: sphx-glr-footer
    :class: sphx-glr-footer-example



  .. container:: sphx-glr-download sphx-glr-download-python

     :download:`Download Python source code: plot_gr_hv_scan.py <plot_gr_hv_scan.py>`



  .. container:: sphx-glr-download sphx-glr-download-jupyter

     :download:`Download Jupyter notebook: plot_gr_hv_scan.ipynb <plot_gr_hv_scan.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
