Source code for ijazz.alpha_tensors

[docs] __doc__ = """This Modules computes the alpha matrix which allows to smear with a gaussion function an histogram The input histogram is of dimension d_mc (MC reference) and the smeared one of dimension d_dt (smeared to the dataspace). Author: fabrice.couderc@cea.fr"""
import tensorflow as tf import numpy as np from ijazz.dtypes import floatzz
[docs] def alpha_evt(d_min, d_max, bin_m, r_ll, s_ll): """ Compute the probability migration from due to a Gaussian over-smearing. Per-event variation of the alpha matrix (dim(d_min) = dim(d_max) = dim(rll) = dim(sll)). Note the computation is done with a normalisation to the fitting region (win_z) Args: - d_min: minimum value of the mass point for data (we return a bined probability) - d_max: maximum value of the mass point for data (we return a bined probability) - bin_m: MC binning in Mee - r_ll: Gaussian mean (relative, gaussian mean will be mu x r_ll) - s_ll: Gaussian resolution(relative as well) Returns a 2D tensor (dim(bining_mc), dim(r_ll)) dim(r_ll) should be the number of events or categories NB: this can be used to compute the integral of pi ! """ d_min = tf.cast(d_min, floatzz) d_max = tf.cast(d_max, floatzz) sqrt2 = tf.cast(tf.sqrt(2.0), floatzz) r_loc = tf.cast(tf.reshape(r_ll, (+1, -1)), floatzz) s_loc = tf.cast(tf.reshape(s_ll, (+1, -1)), floatzz) mee = tf.reshape(0.5 * (bin_m[1:] + bin_m[:-1]), (-1, +1)) # reshape for a 3D tensor a_ij = tf.math.erf((tf.reshape(d_max, (+1, -1))/r_loc - mee) / (sqrt2 * mee * s_loc)) - \ tf.math.erf((tf.reshape(d_min, (+1, -1))/r_loc - mee) / (sqrt2 * mee * s_loc)) return 0.5 * a_ij
[docs] def alpha_2d(bin_d, bin_m, r_ll, s_ll): """ Compute the probability migration from due to a Gaussian over-smearing. Note the computation is done with a normalisation to the fitting region Args: - bin_d: data binning in Mee - bin_m: MC binning in Mee - r_ll: Gaussian mean (relative, gaussian mean, scalar number) - s_ll: Gaussian resolution(relative as well, , scalar number) Returns a 2D tensor (dim(bining_data), dim(bining_mc)) """ return tf.squeeze(alpha_3d(np.array([bin_d]).T, np.array([bin_m]).T, r_ll=[r_ll], s_ll=[s_ll]), [2])
[docs] def alpha_3d(b_ic, b_jc, r_ll, s_ll): """ Compute the probability migration from due to a Gaussian over-smearing. Note the computation is done with a normalisation to the fitting region Args: - b_ic: data binning in Mee (2D) - b_jc: MC binning in Mee (2D) - r_ll: Gaussian mean (relative, gaussian mean will be mu x r_ll) - s_ll: Gaussian resolution(relative as well) Returns a 3D tensor (dim(bining_data), dim(bining_mc), dim(r_ll)) dim(r_ll) should be the number of events or categories """ sqrt2 = tf.sqrt(2.) r_loc = tf.expand_dims(tf.expand_dims(r_ll, axis=0), axis=0) s_loc = tf.expand_dims(tf.expand_dims(s_ll, axis=0), axis=0) m_ijc = tf.expand_dims(0.5 * (b_jc[1:,] + b_jc[:-1,]), axis=0) b_ijc = tf.expand_dims(b_ic, axis=1) a_ijc = tf.math.erf((b_ijc[1:]/r_loc - m_ijc) / (sqrt2 * m_ijc * s_loc)) - \ tf.math.erf((b_ijc[:-1]/r_loc - m_ijc) / (sqrt2 * m_ijc * s_loc)) return 0.5 * a_ijc
[docs] def alpha_3d_2g(b_ic, b_jc, rll_sll1, rll_sll2, rll_sll3, rll_sll4): """ Compute the probability migration from due to a Gaussian over-smearing. Note the computation is done with a normalisation to the fitting region Args: - b_ic: data binning in Mee (2D) - b_jc: MC binning in Mee (2D) - r_ll: Gaussian mean (relative, gaussian mean will be mu x r_ll) - s_ll: Gaussian resolution(relative as well) Returns a 3D tensor (dim(bining_data), dim(bining_mc), dim(r_ll)) dim(r_ll) should be the number of events or categories """ sqrt2 = tf.sqrt(2.) m_ijc = tf.expand_dims(0.5 * (b_jc[1:,] + b_jc[:-1,]), axis=0) b_ijc = tf.expand_dims(b_ic, axis=1) a_ijc_total = tf.zeros_like(m_ijc) # loop over the 4 gaussians for (f_ll, r_ll, s_ll) in [rll_sll1, rll_sll2, rll_sll3, rll_sll4]: r_loc = tf.expand_dims(tf.expand_dims(r_ll, axis=0), axis=0) s_loc = tf.expand_dims(tf.expand_dims(s_ll, axis=0), axis=0) a_ijc = 0.5 * f_ll *(tf.math.erf((b_ijc[1:]/r_loc - m_ijc) / (sqrt2 * m_ijc * s_loc)) - \ tf.math.erf((b_ijc[:-1]/r_loc - m_ijc) / (sqrt2 * m_ijc * s_loc))) a_ijc_total += a_ijc return a_ijc_total
[docs] def alpha_3d_mmg(b_ic, b_jc, r_ll, s_ll): """ Compute the probability migration from due to a Gaussian over-smearing. Note the computation is done with a normalisation to the fitting region Args: - b_ic: data binning in Mee (2D) - b_jc: MC binning in Mee (2D) - r_ll: Gaussian mean (relative, gaussian mean will be mu x r_ll) - s_ll: Gaussian resolution(relative as well) Returns a 3D tensor (dim(bining_data), dim(bining_mc), dim(r_ll)) dim(r_ll) should be the number of events or categories """ sqrt2 = tf.sqrt(2.) r_loc = tf.expand_dims(tf.expand_dims(r_ll, axis=0), axis=0) s_loc = tf.expand_dims(tf.expand_dims(s_ll, axis=0), axis=0) m_ijc = tf.expand_dims(0.5 * (b_jc[1:,] + b_jc[:-1,]), axis=0) b_ijc = tf.expand_dims(b_ic, axis=1) a_ijc = tf.math.erf((b_ijc[1:] - m_ijc - (r_loc-1)) / (sqrt2 * r_loc*s_loc)) - \ tf.math.erf((b_ijc[:-1] - m_ijc - (r_loc-1)) / (sqrt2 * r_loc*s_loc)) return 0.5 * a_ijc