Source code for pyrfu.mms.eis_proton_correction

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party imports
import numpy as np
import xarray as xr

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


def _phxtof_calibration(energy, alpha, beta, gamma):
    r"""Pulse Height x Time Of Flight correction model from EPD Data Product
    Guide"""
    return 1 / (0.5 * (1 + alpha * (np.tanh((energy - beta) / gamma) + 1)))


def _extof_calibration(energy, alpha, beta, gamma):
    r"""Energy x Time Of Flight correction model from EPD Data Product Guide"""
    return 1 / (0.5 * (1 + alpha * (1 - np.tanh((energy - beta) / gamma) + 1)))


[docs]def eis_proton_correction(flux_eis): r"""Corrects proton flux values based on FPI/HPCA/EPD-EIS cross calibration. Correction to the EIS PHxTOF data are made by applying an energy-dependent numerical correction of the form: .. math: E_{PHxTOF} = \frac{1}{0.5*\left [1 + \alpha_{PH} \left ( \operatorname{tanh}\left ( \frac{E - \beta_{PH}}{\gamma_{PH}} + 1 \right ) \right ) \right ]} where E is energy and :math:`\alpha_{PH} = -0.3` , :math:`\beta_{PH} = 0.049` , :math:`\gamma_{PH} = 0.001` are coefficients. Minor adjustments were also made to the lowest energy EIS ExTOF data to correct for foil efficiencies. This correction is of the form: .. math: E_{ExTOF} = \frac{1}{0.5*\left [1 + \alpha_{E} \left (1 - \operatorname{tanh}\left ( \frac{E - \beta_{E}}{\gamma_{E}} + 1 \right ) \right ) \right ]} where E is energy and :math:`\alpha_{E} = -0.3` , :math:`\beta_{E} = 0.049` , :math:`\gamma_{E} = 0.001` are coefficients. Parameters ---------- flux_eis : xarray.DataArray Omni-directional energy spectrum from EPD-EIS. Returns ------- flux_eis_corr : xarray.DataArray Cross-calibrated omni-directional energy spectrum from EIS-EPD. See Also -------- pyrfu.mms.get_eis_allt, pyrfu.mms.eis_omni """ assert isinstance(flux_eis, (xr.Dataset, xr.DataArray)), "flux_eis must be a xarray" # Coefficients from EPD Data Product Guide alpha_, beta_, gamma_ = [-0.3, 49e-3, 1e-3] # Pulse Height x Time Of Flight (PHxTOF) energy correction factor energy_phxtof = flux_eis.energy.data[:7] phxtof_corr = _phxtof_calibration(energy_phxtof, alpha_, beta_, gamma_) # Energy x Time Of Flight (ExTOF) energy correction factor energy_extof = flux_eis.energy.data[7:] extof_corr = _extof_calibration(energy_extof, alpha_, beta_, gamma_) eis_corr = np.hstack([phxtof_corr, extof_corr]) if isinstance(flux_eis, xr.Dataset): scopes_eis = list(filter(lambda x: x[0] == "t", flux_eis)) out_keys = list(filter(lambda x: x not in scopes_eis, flux_eis)) out_dict = {k: flux_eis[k] for k in out_keys} for scope in scopes_eis: out_dict[scope] = flux_eis[scope].copy() out_dict[scope].data *= eis_corr flux_eis_corr = xr.Dataset(out_dict) else: # Apply correction to omni-directional energy spectrum flux_eis_corr = flux_eis.copy() flux_eis_corr.data *= eis_corr return flux_eis_corr