Source code for phasespace.fromdecay.mass_functions
import tensorflow as tf
import zfit
import zfit_physics as zphys
# TODO refactor these mass functions using e.g. a decorator.
# Right now there is a lot of code repetition.
[docs]
def gauss_factory(mass, width):
particle_mass = tf.cast(mass, tf.float64)
particle_width = tf.cast(width, tf.float64)
def gauss(min_mass, max_mass, n_events):
min_mass = tf.cast(min_mass, tf.float64)
max_mass = tf.cast(max_mass, tf.float64)
pdf = zfit.pdf.Gauss(mu=particle_mass, sigma=particle_width, obs="")
iterator = tf.stack([min_mass, max_mass], axis=-1)
return tf.vectorized_map(
lambda lim: pdf.sample(1, limits=(lim[0], lim[1])).unstack_x(), iterator
)
return gauss
[docs]
def breitwigner_factory(mass, width):
particle_mass = tf.cast(mass, tf.float64)
particle_width = tf.cast(width, tf.float64)
def bw(min_mass, max_mass, n_events):
min_mass = tf.cast(min_mass, tf.float64)
max_mass = tf.cast(max_mass, tf.float64)
pdf = zfit.pdf.Cauchy(m=particle_mass, gamma=particle_width, obs="")
iterator = tf.stack([min_mass, max_mass], axis=-1)
return tf.vectorized_map(
lambda lim: pdf.sample(1, limits=(lim[0], lim[1])).unstack_x(), iterator
)
return bw
[docs]
def relativistic_breitwigner_factory(mass, width):
particle_mass = tf.cast(mass, tf.float64)
particle_width = tf.cast(width, tf.float64)
def relbw(min_mass, max_mass, n_events):
min_mass = tf.cast(min_mass, tf.float64)
max_mass = tf.cast(max_mass, tf.float64)
pdf = zphys.pdf.RelativisticBreitWigner(
m=particle_mass, gamma=particle_width, obs=""
)
iterator = tf.stack([min_mass, max_mass], axis=-1)
# this works with map_fn but not with vectorized_map as no analytic sampling is available.
return tf.map_fn(
lambda lim: pdf.sample(1, limits=(lim[0], lim[1])).unstack_x(), iterator
)
return relbw
DEFAULT_CONVERTER = {
"gauss": gauss_factory,
"bw": breitwigner_factory,
"relbw": relativistic_breitwigner_factory,
}