#include #include #include void pimuDecay(double Epion, double* a, double* b); double rand01(); double qcm(double ma, double mb, double mc); int main() { double a[4], b[4]; for (int i=0; i<100000; i++) { double pzpi = 20.; // pzpi = 19.*rand01() + 1.; pimuDecay(pzpi, a, b); std::cout << a[0] << " " << b[0] << std::endl; } return 0; } void pimuDecay(double Epion, double* a, double* b) { double acm0, acmx, acmy, acmz, acm; double bcm0, bcmx, bcmy, bcmz; double costhetacm, sinthetacm, phicm; double const mpion=0.13957, ma=0.10566, mb=0.; double const pi = 3.141592; double gamma, beta; // in the center of mass system (CMS) acm = qcm(mpion,ma,mb); // phase-space sampling d(costhetacm)d(phi) costhetacm = -1.0 + 2.0 * rand01(); sinthetacm = sqrt (1.0- costhetacm*costhetacm); phicm = -pi *+ 2.*pi*rand01(); acm0 = sqrt(ma*ma + acm*acm); acmx = acm * sinthetacm * cos(phicm); acmy = acm * sinthetacm * sin(phicm); acmz = acm * costhetacm; bcm0 = sqrt(mb*mb + acm*acm); bcmx = -acmx; bcmy = -acmy; bcmz = -acmz; // Lorentz transformation from CMS to laboratory system gamma = Epion/mpion; beta = sqrt(1-1/pow(gamma,2)); a[0] = gamma * (acm0 + beta * acmz); a[1] = acmx; a[2] = acmy; a[3] = gamma * (acmz + beta * acm0); b[0] = gamma * (bcm0 + beta * bcmz); b[1] = bcmx; b[2] = bcmy; b[3] = gamma * (bcmz + beta * bcm0); return ; } double qcm(double ma, double mb, double mc) { return sqrt(pow((ma*ma-mb*mb-mc*mc),2)-4.*mb*mb*mc*mc)/(2*ma); } double rand01() { return ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) ); }