// cascade decay for parent -> mediator + X, mediator > daughter1 + daughter 2 //This assumes no meaningful propagation before the decay occurs void DecayDM(Particle &daughter1, Particle &daughter2, Particle &mediator, Particle &parent){ double pmx, pmy, pmz, Em, pm; double ym, zm, thetam, phim; double pdx, pdy, pdz, Ed, pd; double yd, zd, thetad, phid; double lam; //double polarX1, polarX2; //Particle darkphoton(MV); ym = Random::Flat(0,1); zm = Random::Flat(0,1); thetam = acos(-1+2*ym); phim = 2.0*pi*zm; double Md, Mm, Mp; Md = daughter1.m; Mm = mediator.m; Mp = parent.m; lam = lambda(1,Mm*Mm/Mp/Mp,0); Em = Mp/2.0*(1.0+Mm*Mm/Mp/Mp); pm = Mp/2.0*sqrt(lam); pmx = pm*sin(thetam)*cos(phim); pmy = pm*sin(thetam)*sin(phim); pmz = pm*cos(thetam); mediator.FourMomentum(pmx,pmy,pmz,Em); // boost darkphoton to lab frame mediator.Lorentz(parent); // generate dark matter momentum in dark photon rest frame yd = Random::Flat(0,1); zd = Random::Flat(0,1); thetad = acos(-1+2*yd); phid = 2.0*pi*zd; lam = lambda(1,Md*Md/Mm/Mm,Md*Md/Mm/Mm); Ed = Mm/2.0; pd = Mm/2.0*sqrt(lam); pdx = pd*sin(thetad)*cos(phid); pdy = pd*sin(thetad)*sin(phid); pdz = pd*cos(thetad); daughter1.FourMomentum(pdx,pdy,pdz,Ed); daughter2.FourMomentum(-pdx,-pdy,-pdz,Ed); // boost dark matter particles to lab frame daughter1.Lorentz(mediator); daughter2.Lorentz(mediator); //cout << parent.name << " " << parent.end_coords[0] << " " << parent.end_coords[1] << " " << parent.end_coords[2] << endl; Link_Particles(parent,mediator); Link_Particles_Immediate(mediator,daughter1); Link_Particles_Immediate(mediator,daughter2); //cout << daughter1.name << " " << daughter1.end_coords[0] << " " << daughter1.end_coords[1] << " " << daughter1.end_coords[2] << endl; //cout << daughter2.name << " " << daughter2.end_coords[0] << " " << daughter2.end_coords[1] << " " << daughter2.end_coords[2] << endl; }
// two body decay of parent -> daughter + X (e.g. Pi0 -> gamma + V) // output momentum of daughter particle in the lab frame void DecayDP(Particle &daughter, Particle &parent){ double pdx, pdy, pdz, Ed, pd; double thetad, phid; double lam; thetad = acos(-1+2*Random::Flat(0,1)); phid = Random::Flat(0,2.0*pi*Random::Flat(0,1)); double Md, Mp; Md = daughter.m; Mp = parent.m; lam = lambda(1,Md*Md/Mp/Mp,0); Ed = Mp/2.0*(1.0+Md*Md/Mp/Mp); pd = Mp/2.0*sqrt(lam); pdx = pd*sin(thetad)*cos(phid); pdy = pd*sin(thetad)*sin(phid); pdz = pd*cos(thetad); daughter.FourMomentum(pdx,pdy,pdz,Ed); // boost darkphoton to lab frame daughter.Lorentz(parent); Link_Particles(parent,daughter); }