Source code for pyrfu.pyrf.brazil
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
# Local imports
from pyrfu.pyrf.histogram2d import histogram2d
from pyrfu.pyrf.optimize_nbins_2d import optimize_nbins_2d
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2025"
__license__ = "MIT"
__version__ = "2.4.14"
__status__ = "Prototype"
[docs]def brazil(
beta_para: np.ndarray,
p_aniso: np.ndarray,
bins: list = None,
threshold: int = 9,
**kwargs,
):
"""
Computes 2D histogram and PDF (Brazil plot style) for plasma data.
Parameters
----------
beta_para : np.ndarray
Parallel beta values (must be positive and finite).
p_aniso : np.ndarray
Temperature anisotropy values (must be positive and finite).
bins : list, optional
Bin edges or number of bins for the histogram. If None, optimized
bin count is used.
threshold : int, optional
Minimum count threshold for masking low-counts (default is 9).
Returns
-------
n : xarray.DataArray
2D histogram counts with low-counts masked (NaN for <9).
h : xarray.DataArray
2D probability density function with low-counts masked.
"""
# Valid data mask
valid = (
np.isfinite(beta_para) & (beta_para > 0) & np.isfinite(p_aniso) & (p_aniso > 0)
)
beta_para = beta_para[valid]
p_aniso = p_aniso[valid]
log_beta = np.log10(beta_para)
log_aniso = np.log10(p_aniso)
if bins is None:
bins = optimize_nbins_2d(log_beta, log_aniso, **kwargs)
# Compute histogram edges
_, x_edges, y_edges = np.histogram2d(log_beta, log_aniso, bins=bins, density=True)
# Compute bin centers in linear space
x_centers = 10 ** (x_edges[:-1] + np.diff(x_edges) / 2)
y_centers = 10 ** (y_edges[:-1] + np.diff(y_edges) / 2)
# Histogram counts (not normalized)
n = histogram2d(beta_para, p_aniso, bins=[10**x_edges, 10**y_edges], density=False)
n = n.assign_coords({"x_bins": x_centers, "y_bins": y_centers})
n.data[n.data == 0] = np.nan # mask zero counts
# Histogram PDF (normalized)
h = histogram2d(beta_para, p_aniso, bins=[10**x_edges, 10**y_edges], density=True)
h = h.assign_coords({"x_bins": x_centers, "y_bins": y_centers})
h.data[n.data < threshold] = np.nan # apply count threshold mask to PDF
return n, h