40 if (mYRangeIsSet && !mPtRangeIsSet) {
41 throw std::invalid_argument(
"BoxGenerator: rapidity sampling requires SetPtRange() or sampleYAndPt=true in the configuration");
47 double pabs = 0, phi, pt = 0, theta = 0, eta,
y, mt, px, py, pz = 0;
48 phi = gRandom->Uniform(mPhiMin, mPhiMax) * TMath::DegToRad();
50 pabs = gRandom->Uniform(mPMin, mPMax);
51 }
else if (mPtRangeIsSet) {
52 pt = gRandom->Uniform(mPtMin, mPtMax);
54 if (mThetaRangeIsSet) {
56 theta = acos(gRandom->Uniform(cos(mThetaMin * TMath::DegToRad()), cos(mThetaMax * TMath::DegToRad())));
58 theta = gRandom->Uniform(mThetaMin, mThetaMax) * TMath::DegToRad();
60 }
else if (mEtaRangeIsSet) {
61 eta = gRandom->Uniform(mEtaMin, mEtaMax);
62 theta = 2 * TMath::ATan(TMath::Exp(-eta));
63 }
else if (mYRangeIsSet) {
64 y = gRandom->Uniform(mYMin, mYMax);
65 mt = TMath::Sqrt(mass * mass + pt * pt);
66 pz = mt * TMath::SinH(
y);
69 if (mThetaRangeIsSet || mEtaRangeIsSet) {
71 pz = pabs * TMath::Cos(theta);
72 pt = pabs * TMath::Sin(theta);
73 }
else if (mPtRangeIsSet) {
74 pz = pt / TMath::Tan(theta);
77 px = pt * TMath::Cos(phi);
78 py = pt * TMath::Sin(phi);
80 double vx = 0., vy = 0., vz = 0.;
81 double etot = TMath::Sqrt(px * px + py * py + pz * pz + mass * mass);
82 return TParticle(mPDG, 1 , -1 , -1 ,
83 -1 , -1 , px, py, pz, etot, vx, vy, vz, 0. );