6 #include <boost/random/mersenne_twister.hpp>
9 #include "EvtGenBase/EvtParticleFactory.hh"
10 #include "EvtGenBase/EvtParticle.hh"
13 using namespace Pythia8;
18 : partonicModel(partonicModelRef) {
20 eCM = partonicModelRef.
eCM;
33 double pT =
sqrt(partonicModel.uH * partonicModel.tH / partonicModel.sH);
34 double pL = (partonicModel.tH - partonicModel.uH) / (2 *
sqrt(partonicModel.sH));
35 double mesonE =
sqrt(partonicModel.mesonMass2 + pow2(pT) + pow2(pL));
36 double gluonE =
sqrt(pow2(pT) + pow2(pL));
40 mesonMomentum = Vec4(0., pT, pL, mesonE);
42 gluonMomentum = Vec4(0., -pT, -pL, gluonE);
46 mesonMomentum.rot(0, hardPhiAngle);
47 gluonMomentum.rot(0, hardPhiAngle);
50 boost = Vec4(0., 0., (partonicModel.x1 - partonicModel.x2) * protonPz,
51 (partonicModel.x1 + partonicModel.x2) * protonPz);
54 gluonMomentum.bst(boost);
58 calculateHadronRemnants(partonicModel.x1, protonPz, uMomentum, dMomentum);
60 calculateHadronRemnants(partonicModel.x2, -protonPz, ubarMomentum, dbarMomentum);
65 Vec4 totalRemnant(0, 0, (1 - x) * hadronPz, eCM / 2 - x * abs(hadronPz));
66 double halfRemnantInvMass = totalRemnant.mCalc() / 2;
69 double sine = halfRemnantInvMass *
sin(theta), cosine = halfRemnantInvMass *
cos(theta);
70 u.p(0, sine, cosine, halfRemnantInvMass);
71 d.p(0, -sine, -cosine, halfRemnantInvMass);
85 EvtVector4R chiMomentum(
92 EvtParticle *chiMeson =
93 EvtParticleFactory::particleFactory(partonicModel.evtId, chiMomentum);
94 chiMeson->setSpinDensityForward(partonicModel.spinDensity);
100 chiMeson->makeStdHep(evtstdhep);
102 assert(evtstdhep.getNPart() == 5);
104 EvtVector4R vertexPoint, evtMomentum;
105 for (
int particleNumber = 0, size = evtstdhep.getNPart();
106 particleNumber < size; ++particleNumber) {
107 vertexPoint = evtstdhep.getX4(particleNumber);
108 evtMomentum = evtstdhep.getP4(particleNumber);
111 p.id(
id = evtstdhep.getStdHepID(particleNumber));
112 p.px(evtMomentum.get(1));
113 p.py(evtMomentum.get(2));
114 p.pz(evtMomentum.get(3));
115 p.e(evtMomentum.get(0));
119 p.daughter1(evtstdhep.getFirstDaughter(particleNumber) + 1);
120 p.daughter2(evtstdhep.getLastDaughter(particleNumber) + 1);
121 p.mother1(evtstdhep.getFirstMother(particleNumber) + 1);
122 p.mother2(evtstdhep.getLastMother(particleNumber) + 1);
141 std::random_shuffle(COLORS, COLORS + 3);
151 event.append(21, 23 ,
153 gluonMomentum , 0.0 );
167 event.append(-2, 23 ,
172 event.append(-1, 23 ,
184 while (!partonicModel.next() && attempt++ < maxTries);
186 if (attempt >= maxTries)
187 Fatal(
"PythiaHadronizationModel::next",
"Can't set kinematics at parton level.");
190 calculateKinematics();
192 fillColorEvent(event);
194 if (doHadronization) {
197 calculateKinematics();
199 fillColorEvent(event);
202 if (attempt >= maxTries)
203 Fatal(
"PythiaHadronizationModel::next",
"Failed to hadronize remnants.");
void ensure_chigen_is_initialized()
friend F32vec4 cos(const F32vec4 &a)
bool isCharmonia(int pdgCode)
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 sin(const F32vec4 &a)
PythiaChiGen(PartonicModel &partonicModel, int maxTries=30, bool doHadronization=true)
void calculateKinematics()
void calculateHadronRemnants(double x, double hadronPz, Vec4 &u, Vec4 &d)
void fillColorEvent(Event &event)
ChiGenRandomEngine * random_engine