Source code for phasespace.kinematics
#!/usr/bin/env python3
# =============================================================================
# @file kinematics.py
# @author Albert Puig (albert.puig@cern.ch)
# @date 12.02.2019
# =============================================================================
"""Basic kinematics."""
import tensorflow.experimental.numpy as tnp
from phasespace.backend import function, function_jit
[docs]
@function_jit
def scalar_product(vec1, vec2):
"""Calculate scalar product of two 3-vectors.
Args:
vec1: First vector.
vec2: Second vector.
"""
return tnp.sum(vec1 * vec2, axis=1)
[docs]
@function_jit
def spatial_component(vector):
"""Extract spatial components of the input Lorentz vector.
Args:
vector: Input Lorentz vector (where indexes 0-2 are space, index 3 is time).
"""
return tnp.take(vector, indices=[0, 1, 2], axis=-1)
[docs]
@function_jit
def time_component(vector):
"""Extract time component of the input Lorentz vector.
Args:
vector: Input Lorentz vector (where indexes 0-2 are space, index 3 is time).
"""
return tnp.take(vector, indices=[3], axis=-1)
[docs]
@function
def x_component(vector):
"""Extract spatial X component of the input Lorentz or 3-vector.
Args:
vector: Input vector.
"""
return tnp.take(vector, indices=[0], axis=-1)
[docs]
@function_jit
def y_component(vector):
"""Extract spatial Y component of the input Lorentz or 3-vector.
Args:
vector: Input vector.
"""
return tnp.take(vector, indices=[1], axis=-1)
[docs]
@function_jit
def z_component(vector):
"""Extract spatial Z component of the input Lorentz or 3-vector.
Args:
vector: Input vector.
"""
return tnp.take(vector, indices=[2], axis=-1)
[docs]
@function_jit
def mass(vector):
"""Calculate mass scalar for Lorentz 4-momentum.
Args:
vector: Input Lorentz momentum vector.
"""
return tnp.sqrt(
tnp.sum(tnp.square(vector) * metric_tensor(), axis=-1, keepdims=True)
)
[docs]
@function_jit
def lorentz_vector(space, time):
"""Make a Lorentz vector from spatial and time components.
Args:
space: 3-vector of spatial components.
time: Time component.
"""
return tnp.concatenate([space, time], axis=-1)
[docs]
@function_jit
def lorentz_boost(vector, boostvector):
"""Perform Lorentz boost.
Args:
vector: 4-vector to be boosted
boostvector: Boost vector. Can be either 3-vector or 4-vector, since
only spatial components are used.
"""
boost = spatial_component(boostvector)
b2 = tnp.expand_dims(scalar_product(boost, boost), axis=-1)
def boost_fn():
gamma = 1.0 / tnp.sqrt(1.0 - b2)
gamma2 = (gamma - 1.0) / b2
ve = time_component(vector)
vp = spatial_component(vector)
bp = tnp.expand_dims(scalar_product(vp, boost), axis=-1)
vp2 = vp + (gamma2 * bp + gamma * ve) * boost
ve2 = gamma * (ve + bp)
return lorentz_vector(vp2, ve2)
# if boost vector is zero, return the original vector
all_b2_zero = tnp.all(tnp.equal(b2, tnp.zeros_like(b2)))
boosted_vector = tnp.where(all_b2_zero, vector, boost_fn())
return boosted_vector
[docs]
@function_jit
def beta(vector):
"""Calculate beta of a given 4-vector.
Args:
vector: Input Lorentz momentum vector.
"""
return mass(vector) / time_component(vector)
[docs]
@function_jit
def boost_components(vector):
"""Get the boost components of a given 4-vector.
Args:
vector: Input Lorentz momentum vector.
"""
return spatial_component(vector) / time_component(vector)
[docs]
@function_jit
def metric_tensor():
"""Metric tensor for Lorentz space (constant)."""
return tnp.asarray([-1.0, -1.0, -1.0, 1.0], dtype=tnp.float64)
# EOF