36 #include "reportingUtils.hpp"
37 #include "physUtils.hpp"
69 diffractivePhaseSpace::diffractivePhaseSpace()
72 _tprimeMax(numeric_limits<double>::max()),
75 _protonMass(0.938272013),
76 _pionMass(0.13957018),
77 _pionMass2(_pionMass * _pionMass)
105 const double pz = pBeam / sqrt(1 + dxdz * dxdz + dydz * dydz);
106 const double px = dxdz * pz;
107 const double py = dydz * pz;
108 const double EBeam = sqrt(pBeam * pBeam +
_pionMass2);
109 return TLorentzVector(px, py, pz, EBeam);
116 const int beamGeantId,
117 const int beamCharge)
120 printErr <<
"output stream is not writable." << endl;
124 out << nmbDaughters + 1 << endl;
126 out << beamGeantId <<
" " << beamCharge
127 << setprecision(numeric_limits<double>::digits10 + 1)
130 for(
unsigned int i = 0;
i < nmbDaughters; ++
i) {
134 << setprecision(numeric_limits<double>::digits10 + 1)
135 <<
" " << hadron.Px() <<
" " << hadron.Py() <<
" " << hadron.Pz()
136 <<
" " << hadron.E() << endl;
145 cerr <<
"Output stream is not writable." << endl;
152 out << nmbDaughters+1+1 << endl;
157 out << setprecision(numeric_limits<double>::digits10 + 1)
160 out << setprecision(numeric_limits<double>::digits10 + 1)
162 for (
unsigned int i = 0;
i < nmbDaughters; ++
i) {
165 out << setprecision(numeric_limits<double>::digits10 + 1)
167 << hadron.Pz() <<
" "
168 << hadron.Px() <<
" "
169 << hadron.Py() << endl;
177 intval = (
int)nmbDaughters+1+1; out.write((
char*)&intval,4);
180 floatval = (float)
_vertex.Z(); out.write((
char*)&floatval,4);
181 floatval = (float)
_vertex.X(); out.write((
char*)&floatval,4);
182 floatval = (float)
_vertex.Y(); out.write((
char*)&floatval,4);
185 intval = 44; out.write((
char*)&intval,4);
186 floatval = (float)-
_beamLab.Pz(); out.write((
char*)&floatval,4);
187 floatval = (float)-
_beamLab.Px(); out.write((
char*)&floatval,4);
188 floatval = (float)-
_beamLab.Py(); out.write((
char*)&floatval,4);
192 intval = 14; out.write((
char*)&intval,4);
198 for (
unsigned int i = 0;
i < nmbDaughters; ++
i) {
202 floatval = (float)hadron.Pz(); out.write((
char*)&floatval,4);
203 floatval = (float)hadron.Px(); out.write((
char*)&floatval,4);
204 floatval = (float)hadron.Py(); out.write((
char*)&floatval,4);
219 gRandom->SetSeed(seed);
246 for(
unsigned int i = 0;
i < nmbDaughters; ++
i) {
249 if(nmbDaughters > 1) {
253 <<
"does mot make sense. exiting." << endl;
256 printInfo <<
"calculating max weight (" << nmbDaughters <<
" FS particles) "
257 <<
"for m = " <<
_xMassMax <<
" GeV/c^2" << endl;
336 if(invariant_M < 0.) {
343 if(invariant_M <
_invM[0]) {
352 if(i_1 < 0 || i_2 < 0) {
355 if(
_invM[
i] <= invariant_M && invariant_M <
_invM[
i+1]) {
363 double m_1 =
_invM[i_1];
364 double m_2 =
_invM[i_2];
367 result = invt_1 + (((invt_2-invt_1) / (m_2-m_1)) * (invariant_M-m_1));
376 unsigned long int attempts = 0;
382 while(attempts < 1000) {
385 if(beam_dir.Mag() == 0) {
394 if(attempts == 999) {
395 cerr <<
" Error in beam construction. Please check the beam properties loaded correctly!" << endl;
405 const TLorentzVector targetLab(0, 0, 0,
_targetMass);
406 const TLorentzVector overallCm =
_beamLab + targetLab;
409 printErr <<
"Max Mass out of kinematic range." << endl
410 <<
"Limit = " << overallCm.M() -
_targetMass <<
"GeV/c2" << endl
411 <<
" ABORTING " << flush<< endl;
430 tPrime = -gRandom->Exp(calc_invSlopePar);
440 const double s = overallCm.Mag2();
441 const double sqrtS = sqrt(s);
443 const double xMass2 = xMass * xMass;
444 const double xEnergyCM = (s - recoilMass2 + xMass2) / (2 * sqrtS);
445 const double xMomCM = sqrt(xEnergyCM * xEnergyCM - xMass2);
446 const double beamMass2 =
_beamLab.M2();
448 const double beamEnergyCM = (s - targetMass2 + beamMass2) / (2 * sqrtS);
449 const double beamMomCM = sqrt(beamEnergyCM * beamEnergyCM - beamMass2);
450 const double t0 = (xEnergyCM - beamEnergyCM) * (xEnergyCM - beamEnergyCM) -
451 (xMomCM - beamMomCM) * (xMomCM - beamMomCM);
452 const double t = t0 + tPrime;
460 const double reggeonEnergyLab = (targetMass2 - recoilMass2 + t) / (2 * _targetMass);
461 const double xEnergyLab =
_beamLab.E() + reggeonEnergyLab;
462 const double xMomLab = sqrt(xEnergyLab * xEnergyLab - xMass2);
463 const double xCosThetaLab = (t - xMass2 - beamMass2 + 2 *
_beamLab.E() * xEnergyLab) / (2 *
_beamLab.P() * xMomLab);
464 const double xSinThetaLab = sqrt(1 - xCosThetaLab * xCosThetaLab);
465 const double xPtLab = xMomLab * xSinThetaLab;
466 const double xPhiLab = gRandom->Uniform(0., TMath::TwoPi());
469 TLorentzVector xSystemLab = TLorentzVector(xPtLab * cos(xPhiLab),
470 xPtLab * sin(xPhiLab),
471 xMomLab * xCosThetaLab,
474 TVector3 beamDir =
_beamLab.Vect().Unit();
475 xSystemLab.RotateUz(beamDir);
524 const double ps2bodyWMax = breakupMomentum(sqrtS,
_xMassMax,_targetMass)/sqrtS;
525 const double ps2bodyW = breakupMomentum(sqrtS,xMass,_targetMass)/sqrtS;
548 unsigned int attempts =
event();
558 unsigned int attempts =
event();
569 double DxDz,
double DxDzSigma,
570 double DyDz,
double DyDzSigma)
583 result = (particle_Out.M2()-particle_In.M2());
584 result = pow(result,2);
585 result /= 4*pow(particle_In.P(),2);
586 result = fabs((particle_In-particle_Out).
M2())-fabs(result);