=============================================
Extract information from a pesummary TGR file
=============================================

When the `summarytgr <./cli/summarytgr.html>`_ executable is used, all
data is stored in the output :code:`h5` file (by default called
`tgr_samples.h5`). Here, we give details about how to extract the information
stored.

Loading the file
----------------

The `tgr_samples.h5` file can be loaded with the universal
`read <./read.html>`_ function. For example:

.. code-block:: python

    >>> from pesummary.io import read
    >>> f = read('tgr_samples.h5')
    >>> type(f)
    <class 'pesummary.gw.file.formats.pesummary.TGRPESummary'>

IMRCT data
----------

The purpose of the IMRCT test is to calculate a PDF for the final mass
and final spin deviation parameters, 
see `Ghosh et al 2018 <https://arxiv.org/abs/1704.06784>`_ for details. If only
one analysis is stored in the `tgr_samples.h5` file, the PDF can be extracted
with the following code snippet:

.. code-block:: python

    >>> deviation = f.imrct_deviation["final_mass_final_spin_deviations"]
    >>> type(deviation)
    <class 'pesummary.utils.pdf.DiscretePDF2D'>

If more than one analysis is stored, we need to specify which analysis we wish
to load:

.. code-block:: python

    >>> interested = "analysis_1"
    >>> deviation = f.imrct_deviation[interested]["final_mass_final_spin_deviations"]
    >>> type(deviation)
    <class 'pesummary.utils.pdf.DiscretePDF2D'>

The PDF is stored as a `ProbabilityDict2D class <../core/ProbabilityDict2D.html>`_.
This only stores the 2D PDF. However, we can generate the marginalized PDF for
both the final mass deviation and final spin deviation at once with the
following:

.. code-block:: python

    >>> full = deviation.marginalize()
    >>> type(full)
    <class 'pesummary.utils.pdf.DiscretePDF2Dplus1D'>

The output is the a
`DiscretePDF2Dplus1D class <../core/pdf.html>`_. We may
then use the input class methods to extract the PDF for the final mass deviation:

.. code-block:: python

    >>> final_mass_deviation = full.probs_x.x
    >>> final_mass_deviation_pdf = full.probs_x.probs

We may extract the final spin deviation PDF using similar code to above but
changing :code:`x` to :code:`y`. For example:

.. code-block:: python

    >>> final_spin_deviation = full.probs_y.x
    >>> final_spin_deviation_pdf = full.probs_y.probs

These PDFs are dependent on a set of posterior samples which were generated from
an inspiral only and postinspiral only analysis. These posterior samples are
also stored in the `tgr_samples.h5` file. These posterior samples are accessed
in the same way as other files. For example,

.. code-block:: python

    >>> pe_samples = f.samples_dict
    >>> type(pe_samples)
    <class 'pesummary.utils.samples_dict.MultiAnalysisSamplesDict'>
    >>> type(pe_samples["inspiral"])
    <class 'pesummary.utils.samples_dict.SamplesDict'>

This returns a
`MultiAnalysisSamplesDict class <../core/MultiAnalysisSamplesDict.html>`_ which
stores both the inspiral and postinspiral samples. The individual inspiral
and postinspiral analyses are stored as a
`SamplesDict class <../core/SamplesDict.html>`_.

All additional information is stored in the meta data. We can extract the meta
data with the following:

.. code-block:: python

    >>> kwargs = f.extra_kwargs

If only one analysis is stored, the kwargs are stored under the label
`primary`. If multiple analyses are stored, we use the labels which were provided
from the command line,

.. code-block:: python

    >>> interested = "primary"
    >>> print(kwargs[interested])
    {'GR Quantile (%)': X, 'N_bins': Y, 'Time (seconds)': Z, 'evolve_spins': array([b'False', b'False'], dtype='|S5'), 'inspiral approximant': 'approximant', 'inspiral maximum frequency (Hz)': 'frequency', 'postinspiral approximant': 'approximant', 'postinspiral minimum frequency (Hz)': 'frequency'}

Where we are using place holders (:code:`X`, :code:`Y`, :code:`Z`,
:code:`'approximant'`, ...) for the above code snippet.