26 #include <TLorentzVector.h>
28 #include <framework/logging/Logger.h>
31 #include <generators/treps/Sutool.h>
42 extern void aaubrn_(
float*,
float[20],
int*,
float*);
50 double Sutool::p2bdy(
double m0,
double m1,
double m2,
int& jcode)
53 if (m0 <= 0.0 || m1 < 0.0 || m2 < 0.0) {
54 B2FATAL(
" Invalid mass value in two-body decay:" <<
55 m0 <<
" " << m1 <<
" " << m2) ;
60 if (m0 >= (m1 + m2)) {
61 double pp = (m0 - m1 - m2) * (m0 + m1 - m2)
62 * (m0 - m1 + m2) * (m0 + m1 + m2);
63 if (pp < 0.0) pp = 0.0 ;
65 double pcm = sqrt(pp) / 2. / m0 ;
74 int Sutool::pdecy(
double mpr,
double* mse,
75 const TVector3& ppri, TLorentzVector* psec,
int nums)
84 B2FATAL(
" Number of secondaries must be >=2");
90 TVector3 pcms = ppri ;
97 p = p2bdy(m0, mse[0], mse[1], jcode);
98 if (jcode == 0)
return 0 ;
101 double mx = m0 - mse[n - 1];
103 for (
int l = 1 ; l <= n - 1 ; l++) mi = mi + mse[l - 1];
104 double bmx = mx * mx ;
105 double bmi = mi * mi ;
106 double pmx = p2bdy(m0, mi, mse[n - 1], jcode);
107 if (jcode == 0)
return 0 ;
110 double w2 = bmi + (bmx - bmi) * gRandom->Uniform() ;
112 p = p2bdy(m0, w, mse[n - 1], jcode);
113 if (jcode == 0)
return 0;
116 pf = 2.*p2bdy(w, mse[0], mse[1], jcode) / w;
117 if (jcode == 0)
return 0;
121 float m0f = (float)m0;
125 for (
int l = 0 ; l < nsub ; l++) msef[l] = (
float)mse[l];
126 aaubrn_(&m0f, msef, &nsub, &pfmax);
127 aaubrn_(&wf, msef, &nsub, &pff);
128 pf = (double)(pff / pfmax);
130 }
while (pmx * gRandom->Uniform() > p * pf);
133 const double twopi = 2.*3.14159265 ;
134 double phi = twopi * gRandom->Uniform();
135 double cth = 2.*gRandom->Uniform() - 1. ;
136 double sth = sqrt(1. - cth * cth);
138 psec[n - 1] = TLorentzVector(p * sth * cos(phi), p * sth * sin(phi),
139 p * cth, sqrt(p * p + mse[n - 1] * mse[n - 1]));
140 psec[n - 2] = TLorentzVector(-p * sth * cos(phi), -p * sth * sin(phi),
141 -p * cth, sqrt(p * p + w * w));
143 psec[n - 1].Boost(pcms);
144 psec[n - 2].Boost(pcms);
149 pcms = (1. / psec[n - 2].T()) * psec[n - 2].Vect();
156 void Sutool::rotate(TLorentzVector& p,
double th,
double phi)
161 double cp = cos(phi);
162 double sp = sin(phi);
164 TLorentzVector q = TLorentzVector(
165 cp * ct * p.X() + sp * p.Y() + cp * st * p.Z(),
166 -sp * ct * p.X() + cp * p.Y() - sp * st * p.Z(),
167 -st * p.X() + ct * p.Z(),
172 float Sutool::interp(
float a1,
float a2,
float a3,
float a4,
float f)
174 float b1, b2, b3, c1, c2, d1;
177 b1 = a2 - a1; b2 = a3 - a2 ; b3 = a4 - a3;
178 c1 = b2 - b1; c2 = b3 - b2 ; d1 = c2 - c1;
179 g2 = 0.25 * f * (f - 1.);
180 g3 = 2. / 3. * g2 * (f - 0.5);
182 return a2 + f * b2 + g2 * (c1 + c2) + g3 * d1;
185 int Sutool::poisson(
double m)
187 return gRandom->Poisson(m);
Abstract base class for different kinds of events.