Plotting Distributions

This example shows how to plot 1D histograms of parameters of interest. The example here shows the ToT distribution for pixel data and clusters data.

Luna Command

tpx3dump process -i /Users/Ciaran/atlassian-bitbucket-pipelines-runner/temp/e71169e4-520a-5b30-a5ab-ee8a44eb5fac/build/docs/source/_static/example_data.tpx3 -o /Users/Ciaran/atlassian-bitbucket-pipelines-runner/temp/e71169e4-520a-5b30-a5ab-ee8a44eb5fac/build/docs/source/_static/example_data.hdf5  --eps-t 150ns --eps-s 1 --ctot-cut 500

Python Script

Plot histograms
 1import os, sys
 2import h5py  # ensure you have `pip install h5py`
 3import pandas as pd  # ensure you have `pip install pandas`
 4from typing import *
 5import matplotlib.pyplot as plt
 6import seaborn as sns
 7import warnings
 8warnings.filterwarnings("ignore")  # suppress warnings from plotting libraries.
 9
10sns.set_context(context="talk")
11
12# add some paths to PYTHONPATH
13for directory in ["..", "."]:
14    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), directory)))
15
16# on our system "EXAMPLE_DATA_HDF5" refers to the absolute path
17# to a hdf5 file generated by luna. Replace with your own!
18from env_vars_for_docs_examples import EXAMPLE_DATA_HDF5, PLOTS_DIRECTORY
19
20# re-use functions from previous example
21from ex2_read_data_time_units import load_clusters, TimeUnit, load_pixel_hits
22
23TOA_UNIT = TimeUnit.Microseconds
24
25
26def plot_1d_distribution(data: pd.DataFrame, variable: str, fname: str):
27    """
28    Plots the distribution of a specified variable from pixel or cluster data.
29
30    Args:
31        data (pd.DataFrame): DataFrame containing pixel or cluster data.
32        variable (str): The variable to plot the distribution of.
33    """
34    plt.figure(figsize=(10, 6))
35    sns.histplot(data[variable], bins=100, kde=False, color="white", stat="percent", edgecolor="black", linewidth=2)
36    sns.despine()
37    plt.title(f"Histogram {variable}")
38    plt.xlabel(f"{variable} bins ({TOA_UNIT})")
39    plt.ylabel(f"Frequency")
40    plt.savefig(fname, bbox_inches='tight', dpi=300)
41
42
43if __name__ == "__main__":
44    pixel_data: pd.DataFrame = load_pixel_hits(EXAMPLE_DATA_HDF5, toa_unit=TOA_UNIT)
45    cluster_data: pd.DataFrame = load_clusters(EXAMPLE_DATA_HDF5, toa_unit=TOA_UNIT)
46
47    base_name = "ex6_plot_distributions"
48    fname = os.path.join(PLOTS_DIRECTORY, base_name + f"_pixel_hit_tot.png")
49    plot_1d_distribution(data=pixel_data, variable="tot", fname=fname)
50
51    fname = os.path.join(PLOTS_DIRECTORY, base_name + f"_clusters_ctot.png")
52    plot_1d_distribution(data=cluster_data, variable="ctot", fname=fname)

Script Output

Example Output
hdf5 datasets: ['Clusters', 'ExposureTimeBoundaries', 'PixelHits', 'TimewalkLookupTable', 'TimewalkMatrix']
2D histogram of pixel hits ToT

Time Over Threshold (ToT) Distribution for Pixel Hits

2D histogram of clusters cToT

Charge Over Threshold (cToT) Distribution for Clusters