def makeBoostMatrix(beta_x, beta_y, beta_z): """Construct a boost matrix. Returns a 4x4 matrix for the boost for a vector beta whose components are 'beta_x', 'beta_y', and 'beta_z'.""" matrix = Matrix(4, 4) # Handle the zero-boost case. if beta_x == 0 and beta_y == 0 and beta_z == 0: matrix[(0, 0)] = 1 matrix[(1, 1)] = 1 matrix[(2, 2)] = 1 matrix[(3, 3)] = 1 return matrix # Compute beta-squared. betas = (beta_x, beta_y, beta_z) beta2 = hypot(*betas) ** 2 if beta2 > 1: raise ValueError, "beta may not have magnitude greater than one" # Compute gamma. gamma = 1 / sqrt(1 - beta2) # Construct the boost matrix. matrix[(0, 0)] = gamma for i in (1, 2, 3): element = -gamma * betas[i - 1] matrix[(i, 0)] = element matrix[(0, i)] = element for i in (1, 2, 3): for j in range(i, 4): element = (gamma - 1) * betas[i - 1] * betas[j - 1] / beta2 if i == j: element += 1 matrix[(i, j)] = element matrix[(j, i)] = element return matrix
#----------------------------------------------------------------------- # test stuff #----------------------------------------------------------------------- if __name__ == "__main__": from random import random mass_Ups = 10.575 mass_B0 = 5.2794 cm_frame = Frame(lab.Boost(0, 0, 0.56), name="CM") p4_Ups = cm_frame.Momentum(mass_Ups, 0, 0, 0) decay_angles = random() * 2 * pi, random() * pi, random() * 2 * pi decay_rotation = cm_frame.Rotation(*decay_angles) momentum_B0 = twoBodyDecayMomentum(mass_Ups, mass_B0, mass_B0) energy_B0 = hypot(momentum_B0, mass_B0) p4_B0 = decay_rotation \ ^ cm_frame.Momentum(energy_B0, 0, 0, momentum_B0) p4_B0bar = decay_rotation \ ^ cm_frame.Momentum(energy_B0, 0, 0, -momentum_B0) print "B0 and B0bar coordinates in %s:" % lab print "(%.4f, %.4f, %.4f, %.4f)" % lab.coordinatesOf(p4_B0) print "(%.4f, %.4f, %.4f, %.4f)" % lab.coordinatesOf(p4_B0bar) print "B0 and B0bar coordinates in %s:" % cm_frame print "(%.4f, %.4f, %.4f, %.4f)" % cm_frame.coordinatesOf(p4_B0) print "(%.4f, %.4f, %.4f, %.4f)" % cm_frame.coordinatesOf(p4_B0bar) print "Reconstructed Upsilon(4S) mass =", (p4_B0 + p4_B0bar).mass