/* Particle.h Particle Class (Sep 2008) */ class Particle{ public: Particle(); Particle(double); double px, py, pz, E, m, pAbs, pt, p[4]; void p4(double, double, double, double); void boost(Particle); void twoBodyDecay(Particle&, Particle&); void print(); }; //------------------------------------------------------------------------------ // Default constructor // Particle::Particle(){ px = py = pz = E = m = pAbs = pt = 0.0; p[0] = p[1] = p[2] = p[3] = 0.0; } Particle::Particle(double mass){ m = mass; px = py = pz = E = pAbs = pt = 0.0; p[0] = p[1] = p[2] = p[3] = 0.0; } //------------------------------------------------------------------------------ // Sets components of 4-momentum vector // void Particle::p4(double momx, double momy, double momz, double energy){ // components of 4-momenta px = p[0] = momx; py = p[1] = momy; pz = p[2] = momz; E = p[3] = energy; // transverse momentum and the magnitude of the space momentum pt = sqrt(momx*momx + momy*momy); pAbs = sqrt(momx*momx + momy*momy + momz*momz); } //------------------------------------------------------------------------------ // Prints 4-vector // void Particle::print(){ cout << "(" << p[0] <<",\t" << p[1] <<",\t"<< p[2] <<",\t"<< p[3] << ")" << endl; } //------------------------------------------------------------------------------ // Evaluates 4-vector of decay product in the rest frame of parent // void Particle::twoBodyDecay(Particle& prod1, Particle& prod2) { double m1 = prod1.m; double m2 = prod2.m; // check if particle m can decay if( m < m1+m2 ){ cout << "Particle::twoBodyDecay parent mass is less than sum of products." << endl; prod1.p4 ( 0., 0., 0., m1); prod2.p4 ( 0., 0., 0., m2); return; } // CM energies and momentum double e1 = (m*m + m1*m1 - m2*m2) / (2.0*m); double e2 = (m*m - m1*m1 + m2*m2) / (2.0*m); double P = sqrt(e1*e1 - m1*m1); // Isotropic random angles double theta = acos( 2.0*Random::Flat()- 1.0 ); double phi = 2.0*M_PI *Random::Flat(); double pX = P*sin(theta)*cos(phi); double pY = P*sin(theta)*sin(phi); double pZ = P*cos(theta); // set the 4-momenta prod1.p4( pX, pY, pZ, e1 ); prod2.p4( -pX, -pY, -pZ, e2 ); } //------------------------------------------------------------------------------ // Lorentz Boost // void Particle::boost(Particle parent){ // beta and gamma values double betax = parent.px / parent.E; double betay = parent.py / parent.E; double betaz = parent.pz / parent.E; double beta2 = betax*betax + betay*betay + betaz*betaz; double gamma = 1.0/sqrt(1.0-beta2); double dot = betax*px + betay*py + betaz*pz; double prod = gamma*( gamma*dot/(1.0+gamma) + E ); double pX = px + betax*prod; double pY = py + betay*prod; double pZ = pz + betaz*prod; double e = gamma*(E + dot); p4( pX, pY, pZ, e ); }