30 #include "CLHEP/Random/RandFlat.h"
33 #include "EvtGen/EvtGen.hh"
34 #include "EvtGenExternal/EvtExternalGenList.hh"
35 #include "EvtGenBase/EvtAbsRadCorr.hh"
36 #include "EvtGenBase/EvtDecayBase.hh"
37 #include "EvtGenBase/EvtId.hh"
38 #include "EvtGenBase/EvtDecayTable.hh"
39 #include "EvtGenBase/EvtParticle.hh"
40 #include "EvtGenBase/EvtParticleFactory.hh"
41 #include "EvtGenBase/EvtHepMCEvent.hh"
43 #include "HepPID/ParticleIDTranslations.hh"
66 m_PDGs.push_back(300553);
67 m_PDGs.push_back(511);
68 m_PDGs.push_back(521);
69 m_PDGs.push_back(523);
70 m_PDGs.push_back(513);
71 m_PDGs.push_back(533);
72 m_PDGs.push_back(531);
76 m_PDGs.push_back(413);
77 m_PDGs.push_back(423);
78 m_PDGs.push_back(433);
79 m_PDGs.push_back(411);
80 m_PDGs.push_back(421);
81 m_PDGs.push_back(431);
82 m_PDGs.push_back(10411);
83 m_PDGs.push_back(10421);
84 m_PDGs.push_back(10413);
85 m_PDGs.push_back(10423);
86 m_PDGs.push_back(20413);
87 m_PDGs.push_back(20423);
89 m_PDGs.push_back(415);
90 m_PDGs.push_back(425);
91 m_PDGs.push_back(10431);
92 m_PDGs.push_back(20433);
93 m_PDGs.push_back(10433);
94 m_PDGs.push_back(435);
96 m_PDGs.push_back(310);
97 m_PDGs.push_back(311);
98 m_PDGs.push_back(313);
99 m_PDGs.push_back(323);
100 m_PDGs.push_back(10321);
101 m_PDGs.push_back(10311);
102 m_PDGs.push_back(10313);
103 m_PDGs.push_back(10323);
104 m_PDGs.push_back(20323);
105 m_PDGs.push_back(20313);
106 m_PDGs.push_back(325);
107 m_PDGs.push_back(315);
109 m_PDGs.push_back(100313);
110 m_PDGs.push_back(100323);
111 m_PDGs.push_back(30313);
112 m_PDGs.push_back(30323);
113 m_PDGs.push_back(30343);
114 m_PDGs.push_back(30353);
115 m_PDGs.push_back(30363);
117 m_PDGs.push_back(111);
118 m_PDGs.push_back(221);
119 m_PDGs.push_back(113);
120 m_PDGs.push_back(213);
121 m_PDGs.push_back(223);
122 m_PDGs.push_back(331);
123 m_PDGs.push_back(333);
124 m_PDGs.push_back(20213);
125 m_PDGs.push_back(20113);
126 m_PDGs.push_back(215);
127 m_PDGs.push_back(115);
128 m_PDGs.push_back(10213);
129 m_PDGs.push_back(10113);
130 m_PDGs.push_back(9000111);
131 m_PDGs.push_back(9000211);
132 m_PDGs.push_back(9010221);
133 m_PDGs.push_back(10221);
134 m_PDGs.push_back(20223);
135 m_PDGs.push_back(20333);
136 m_PDGs.push_back(225);
137 m_PDGs.push_back(9020221);
138 m_PDGs.push_back(335);
139 m_PDGs.push_back(10223);
140 m_PDGs.push_back(10333);
141 m_PDGs.push_back(100213);
142 m_PDGs.push_back(100113);
144 m_PDGs.push_back(441);
145 m_PDGs.push_back(100441);
146 m_PDGs.push_back(443);
147 m_PDGs.push_back(100443);
148 m_PDGs.push_back(9000443);
149 m_PDGs.push_back(9010443);
150 m_PDGs.push_back(9020443);
151 m_PDGs.push_back(10441);
152 m_PDGs.push_back(20443);
153 m_PDGs.push_back(445);
155 m_PDGs.push_back(30443);
156 m_PDGs.push_back(551);
157 m_PDGs.push_back(553);
158 m_PDGs.push_back(100553);
159 m_PDGs.push_back(200553);
160 m_PDGs.push_back(10551);
161 m_PDGs.push_back(20553);
162 m_PDGs.push_back(555);
163 m_PDGs.push_back(10553);
165 m_PDGs.push_back(110551);
166 m_PDGs.push_back(120553);
167 m_PDGs.push_back(100555);
168 m_PDGs.push_back(210551);
169 m_PDGs.push_back(220553);
170 m_PDGs.push_back(200555);
171 m_PDGs.push_back(30553);
172 m_PDGs.push_back(20555);
174 m_PDGs.push_back(557);
175 m_PDGs.push_back(130553);
176 m_PDGs.push_back(120555);
177 m_PDGs.push_back(100557);
178 m_PDGs.push_back(110553);
179 m_PDGs.push_back(210553);
180 m_PDGs.push_back(10555);
181 m_PDGs.push_back(110555);
183 m_PDGs.push_back(4122);
184 m_PDGs.push_back(4132);
186 m_PDGs.push_back(4112);
187 m_PDGs.push_back(4212);
188 m_PDGs.push_back(4232);
189 m_PDGs.push_back(4222);
190 m_PDGs.push_back(4322);
191 m_PDGs.push_back(4312);
193 m_PDGs.push_back(102132);
194 m_PDGs.push_back(103124);
195 m_PDGs.push_back(203122);
196 m_PDGs.push_back(103122);
197 m_PDGs.push_back(123122);
198 m_PDGs.push_back(213122);
199 m_PDGs.push_back(103126);
200 m_PDGs.push_back(13212);
203 m_PDGs.push_back(203126);
204 m_PDGs.push_back(102134);
205 m_PDGs.push_back(3122);
206 m_PDGs.push_back(3222);
207 m_PDGs.push_back(2214);
208 m_PDGs.push_back(2224);
209 m_PDGs.push_back(3324);
210 m_PDGs.push_back(2114);
211 m_PDGs.push_back(1114);
212 m_PDGs.push_back(3112);
213 m_PDGs.push_back(3212);
214 m_PDGs.push_back(3114);
215 m_PDGs.push_back(3224);
216 m_PDGs.push_back(3214);
217 m_PDGs.push_back(3216);
218 m_PDGs.push_back(3322);
219 m_PDGs.push_back(3312);
220 m_PDGs.push_back(3314);
221 m_PDGs.push_back(3334);
223 m_PDGs.push_back(4114);
224 m_PDGs.push_back(4214);
225 m_PDGs.push_back(4224);
226 m_PDGs.push_back(4314);
227 m_PDGs.push_back(4324);
228 m_PDGs.push_back(4332);
229 m_PDGs.push_back(4334);
232 m_PDGs.push_back(10443);
234 m_PDGs.push_back(5122);
235 m_PDGs.push_back(5132);
236 m_PDGs.push_back(5232);
237 m_PDGs.push_back(5332);
238 m_PDGs.push_back(5222);
239 m_PDGs.push_back(5112);
240 m_PDGs.push_back(5212);
241 m_PDGs.push_back(541);
242 m_PDGs.push_back(14122);
243 m_PDGs.push_back(14124);
244 m_PDGs.push_back(5312);
245 m_PDGs.push_back(5322);
246 m_PDGs.push_back(10521);
247 m_PDGs.push_back(20523);
248 m_PDGs.push_back(10523);
250 m_PDGs.push_back(525);
251 m_PDGs.push_back(10511);
252 m_PDGs.push_back(20513);
253 m_PDGs.push_back(10513);
254 m_PDGs.push_back(515);
255 m_PDGs.push_back(10531);
256 m_PDGs.push_back(20533);
257 m_PDGs.push_back(10533);
258 m_PDGs.push_back(535);
259 m_PDGs.push_back(543);
260 m_PDGs.push_back(545);
261 m_PDGs.push_back(5114);
262 m_PDGs.push_back(5224);
263 m_PDGs.push_back(5214);
264 m_PDGs.push_back(5314);
265 m_PDGs.push_back(5324);
266 m_PDGs.push_back(5334);
267 m_PDGs.push_back(10541);
268 m_PDGs.push_back(10543);
269 m_PDGs.push_back(20543);
271 m_PDGs.push_back(4424);
272 m_PDGs.push_back(4422);
273 m_PDGs.push_back(4414);
274 m_PDGs.push_back(4412);
275 m_PDGs.push_back(4432);
276 m_PDGs.push_back(4434);
278 m_PDGs.push_back(130);
280 for (
unsigned int i = 0;
i < m_PDGs.size();
i++) {
281 int pdt = HepPID::translatePythiatoPDT(m_PDGs.at(
i));
282 if (pdt != m_PDGs.at(
i))
291 fSpecialSettings.push_back(
"Pythia8:ParticleDecays:mixB = off");
297 bool usePythia = fPSet->getUntrackedParameter<
bool>(
"use_internal_pythia",
true);
298 bool useTauola = fPSet->getUntrackedParameter<
bool>(
"use_internal_tauola",
true);
299 bool usePhotos = fPSet->getUntrackedParameter<
bool>(
"use_internal_photos",
true);
302 bool convertPythiaCodes = fPSet->getUntrackedParameter<
bool>(
303 "convertPythiaCodes",
true);
305 std::getenv(
"PYTHIA8DATA");
306 if (pythiaDir.empty()) {
308 <<
"EvtGenInterface::init() PYTHIA8DATA not defined. Terminating program ";
312 bool useEvtGenRandom(
true);
315 EvtExternalGenList genList(convertPythiaCodes, pythiaDir, photonType, useEvtGenRandom);
316 EvtAbsRadCorr* radCorrEngine =
nullptr;
318 radCorrEngine = genList.getPhotosModel();
319 std::list<EvtDecayBase*> extraModels = genList.getListOfModels();
320 std::list<EvtDecayBase*> myExtraModels;
321 for (
unsigned int i = 0;
i < extraModels.size();
i++) {
322 std::list<EvtDecayBase*>::iterator it = extraModels.begin();
324 TString
name = (*it)->getName();
325 if (name.Contains(
"PYTHIA") && usePythia)
326 myExtraModels.push_back(*it);
327 if (name.Contains(
"TAUOLA") && useTauola)
328 myExtraModels.push_back(*it);
334 std::list<EvtDecayBase*> userModels = userList.
getUserModels();
335 for (
unsigned int i = 0;
i < userModels.size();
i++) {
336 std::list<EvtDecayBase*>::iterator it = userModels.begin();
338 TString
name = (*it)->getName();
339 edm::LogInfo(
"EvtGenInterface::~EvtGenInterface") <<
"Adding user model: " <<
name;
340 myExtraModels.push_back(*it);
344 BmixingOption = fPSet->getUntrackedParameter<
int>(
"B_Mixing", 1);
345 if (BmixingOption != 0 && BmixingOption != 1) {
346 throw cms::Exception(
"Configuration") <<
"EvtGenProducer requires B_Mixing to be 0 (coherent) or 1 (incoherent) \n"
347 "Please fix this in your configuration.";
352 m_EvtGen =
new EvtGen(
353 decay_table.
fullPath().c_str(), pdt.
fullPath().c_str(), the_engine, radCorrEngine, &myExtraModels, BmixingOption);
356 if (fPSet->exists(
"user_decay_file")) {
357 std::vector<std::string> user_decays = fPSet->getParameter<std::vector<std::string> >(
"user_decay_file");
358 for (
unsigned int i = 0;
i < user_decays.size();
i++) {
360 m_EvtGen->readUDecay(user_decay.fullPath().c_str());
364 if (fPSet->exists(
"user_decay_embedded")) {
365 std::vector<std::string> user_decay_lines = fPSet->getParameter<std::vector<std::string> >(
"user_decay_embedded");
366 char user_decay_tmp[] =
"user_decay_tmpfileXXXXXX";
367 int tmp_creation = mkstemp(user_decay_tmp);
368 FILE* tmpf = std::fopen(user_decay_tmp,
"w");
369 if (!tmpf || (tmp_creation == -1)) {
371 <<
"EvtGenInterface::init() fails when trying to open a temporary file for embedded user.dec. Terminating "
375 for (
unsigned int i = 0;
i < user_decay_lines.size();
i++) {
376 user_decay_lines.at(
i) +=
"\n";
377 std::fputs(user_decay_lines.at(
i).c_str(), tmpf);
380 m_EvtGen->readUDecay(user_decay_tmp);
384 if (fPSet->exists(
"operates_on_particles")) {
385 std::vector<int> tmpPIDs = fPSet->getParameter<std::vector<int> >(
"operates_on_particles");
387 bool goodinput =
false;
388 if (!tmpPIDs.empty()) {
389 if (tmpPIDs.size() == 1 && tmpPIDs[0] == 0)
403 for (
unsigned int i = 0;
i < m_PDGs.size();
i++) {
405 <<
"EvtGenInterface::init() Particles to Operate on: " << m_PDGs[
i];
409 polarize_ids = fPSet->getUntrackedParameter<std::vector<int> >(
"particles_to_polarize", std::vector<int>());
410 polarize_pol = fPSet->getUntrackedParameter<std::vector<double> >(
"particle_polarizations", std::vector<double>());
411 if (polarize_ids.size() != polarize_pol.size()) {
413 <<
"EvtGenProducer requires that the particles_to_polarize and particle_polarization\n"
414 "vectors be the same size. Please fix this in your configuration.";
416 for (
unsigned int ndx = 0; ndx < polarize_ids.size(); ndx++) {
417 if (polarize_pol[ndx] < -1. || polarize_pol[ndx] > 1.) {
419 <<
"EvtGenProducer error: particle polarizations must be in the range -1 < P < 1";
421 polarizations.insert(std::pair<int, float>(polarize_ids[ndx], polarize_pol[ndx]));
425 if (fPSet->exists(
"list_forced_decays")) {
426 std::vector<std::string> forced_names = fPSet->getParameter<std::vector<std::string> >(
"list_forced_decays");
427 for (
unsigned int i = 0;
i < forced_names.size();
i++) {
429 if (found.getId() == -1)
430 throw cms::Exception(
"Configuration") <<
"name in part list for ignored decays not found: " << forced_names[
i];
431 if (found.getId() == found.getAlias())
432 throw cms::Exception(
"Configuration") <<
"name of ignored decays is not an alias: " << forced_names[
i];
433 forced_id.push_back(found);
434 forced_pdgids.push_back(EvtPDL::getStdHep(found));
438 <<
"Number of Forced Paricles is: " << forced_pdgids.size() << std::endl;
439 for (
unsigned int j = 0;
j < forced_id.size();
j++) {
441 <<
"Forced Paricles are: " << forced_pdgids.at(
j) <<
" " << forced_id.at(
j) << std::endl;
444 if (fPSet->exists(
"list_ignored_pdgids")) {
445 ignore_pdgids = fPSet->getUntrackedParameter<std::vector<int> >(
"list_ignored_pdgids");
452 if (the_engine->engine() ==
nullptr) {
454 <<
"The EvtGen code attempted to use a random number engine while\n"
455 <<
"the engine pointer was null in EvtGenInterface::decay. This might\n"
456 <<
"mean that the code was modified to generate a random number outside\n"
457 <<
"the event and beginLuminosityBlock methods, which is not allowed.\n";
459 CLHEP::RandFlat m_flat(*the_engine->engine(), 0., 1.);
462 unsigned int nisforced = 0;
463 std::vector<std::vector<HepMC::GenParticle*> > forcedparticles;
464 for (
unsigned int i = 0;
i < forced_pdgids.size();
i++)
465 forcedparticles.push_back(std::vector<HepMC::GenParticle*>());
468 for (HepMC::GenEvent::particle_const_iterator
p = evt->particles_begin();
p != evt->particles_end(); ++
p) {
469 if ((*p)->status() == 1) {
470 int idHep = (*p)->pdg_id();
471 bool isignore =
false;
472 for (
unsigned int i = 0;
i < ignore_pdgids.size();
i++) {
473 if (idHep == ignore_pdgids[
i])
477 bool isforced =
false;
478 for (
unsigned int i = 0;
i < forced_pdgids.size();
i++) {
479 if (idHep == forced_pdgids[
i]) {
480 forcedparticles.at(i).push_back(*
p);
486 bool isDefaultEvtGen =
false;
487 for (
unsigned int i = 0;
i < m_PDGs.size();
i++) {
488 if (
abs(idHep) ==
abs(m_PDGs[
i])) {
489 isDefaultEvtGen =
true;
493 EvtId idEvt = EvtPDL::evtIdFromStdHep(idHep);
494 int ipart = idEvt.getId();
495 EvtDecayTable* evtDecayTable = EvtDecayTable::getInstance();
496 if (!isforced && isDefaultEvtGen && ipart != -1 && evtDecayTable->getNMode(ipart) != 0) {
497 addToHepMC(*
p, idEvt, evt,
true);
504 unsigned int which = (
unsigned int)(nisforced * flat());
505 if (which == nisforced && nisforced > 0)
506 which = nisforced - 1;
508 unsigned int idx = 0;
509 for (
unsigned int i = 0;
i < forcedparticles.size();
i++) {
510 for (
unsigned int j = 0;
j < forcedparticles.at(
i).size();
j++) {
511 EvtId idEvt = EvtPDL::evtIdFromStdHep(forcedparticles.at(
i).at(
j)->pdg_id());
513 idEvt = forced_id[
i];
515 << EvtPDL::getStdHep(idEvt) <<
" will force to decay " << idx + 1 <<
" out of " << nisforced << std::endl;
517 bool decayed =
false;
519 decayed = addToHepMC(forcedparticles.at(
i).at(
j), idEvt, evt,
false);
526 for (HepMC::GenEvent::particle_const_iterator
p = evt->particles_begin();
p != evt->particles_end(); ++
p) {
527 if ((*p)->end_vertex() && (*p)->status() == 1)
529 if ((*p)->end_vertex() && (*p)->end_vertex()->particles_out_size() == 0)
543 partHep->momentum().e(), partHep->momentum().px(), partHep->momentum().py(), partHep->momentum().pz());
544 EvtParticle*
parent = EvtParticleFactory::particleFactory(idEvt, pInit);
545 HepMC::FourVector posHep = (partHep->production_vertex())->
position();
546 EvtVector4R vInit(posHep.t(), posHep.x(), posHep.y(), posHep.z());
548 if (EvtPDL::getSpinType(idEvt) == EvtSpinType::DIRAC && polarizations.count(partHep->pdg_id()) > 0) {
549 const HepMC::FourVector& momHep = partHep->momentum();
551 momEvt.set(momHep.t(), momHep.x(), momHep.y(), momHep.z());
554 float pol = polarizations.find(partHep->pdg_id())->
second;
559 EvtSpinDensity theSpinDensity;
560 theSpinDensity.setDim(2);
561 theSpinDensity.set(0, 0, EvtComplex(1. / 2. + polVec.
z() / 2., 0.));
562 theSpinDensity.set(0, 1, EvtComplex(polVec.
x() / 2., -polVec.
y() / 2.));
563 theSpinDensity.set(1, 0, EvtComplex(polVec.
x() / 2., polVec.
y() / 2.));
564 theSpinDensity.set(1, 1, EvtComplex(1. / 2. - polVec.
z() / 2., 0.));
565 parent->setSpinDensityForwardHelicityBasis(theSpinDensity);
569 m_EvtGen->generateDecay(parent);
571 go_through_daughters(parent);
574 EvtHepMCEvent evtHepMCEvent;
575 evtHepMCEvent.constructEvent(parent, vInit);
577 parent->deleteTree();
580 if (!evtGenHepMCTree->particles_empty())
581 update_particles(partHep, theEvent, (*evtGenHepMCTree->particles_begin()));
592 if (p->end_vertex()) {
593 if (!partHep->end_vertex()) {
594 HepMC::GenVertex* vtx =
new HepMC::GenVertex(p->end_vertex()->position());
595 theEvent->add_vertex(vtx);
596 vtx->add_particle_in(partHep);
598 if (p->end_vertex()->particles_out_size() != 0) {
599 for (HepMC::GenVertex::particles_out_const_iterator
d = p->end_vertex()->particles_out_const_begin();
600 d != p->end_vertex()->particles_out_const_end();
603 daughter->suggest_barcode(theEvent->particles_size() + 1);
604 partHep->end_vertex()->add_particle_out(daughter);
605 if ((*d)->end_vertex())
606 update_particles(daughter, theEvent, (*
d));
608 partHep->set_status(p->status());
614 the_engine->setRandomEngine(v);
619 if (!fRandomEngine) {
621 <<
"EvtGenInterface::flat: Attempt to generate random number when engine pointer is null\n"
622 <<
"This might mean that the code was modified to generate a random number outside the\n"
623 <<
"event and beginLuminosityBlock methods, which is not allowed.\n";
625 return fRandomEngine->flat();
629 if (p->end_vertex()) {
630 if (p->end_vertex()->particles_out_size() != 0) {
631 for (HepMC::GenVertex::particles_out_const_iterator
d = p->end_vertex()->particles_out_const_begin();
632 d != p->end_vertex()->particles_out_const_end();
634 if (
abs((*d)->pdg_id()) ==
abs(p->pdg_id())) {
646 if (p->end_vertex()) {
647 if (p->end_vertex()->particles_out_size() != 0) {
655 int NDaug = part->getNDaug();
657 EvtParticle* Daughter;
658 for (
int i = 0;
i < NDaug;
i++) {
659 Daughter = part->getDaug(
i);
660 int idHep = Daughter->getPDGId();
662 for (
unsigned int j = 0;
j < forced_pdgids.size();
j++) {
663 if (idHep == forced_pdgids[
j]) {
665 Daughter->deleteDaughters();
670 go_through_daughters(Daughter);
~EvtGenInterface() override
Vector3DBase< typename PreciseFloatType< T, U >::Type, FrameTag > cross(const Vector3DBase< U, FrameTag > &v) const
static unsigned int getId()
Log< level::Error, false > LogError
void go_through_daughters(EvtParticle *part)
bool addToHepMC(HepMC::GenParticle *partHep, const EvtId &idEvt, HepMC::GenEvent *theEvent, bool del_daug)
U second(std::pair< T, U > const &p)
void setRandomEngine(CLHEP::HepRandomEngine *v) override
static CLHEP::HepRandomEngine * fRandomEngine
Abs< T >::type abs(const T &t)
HepMC::GenEvent * decay(HepMC::GenEvent *) override
Log< level::Info, false > LogInfo
Vector3DBase unit() const
void update_particles(HepMC::GenParticle *partHep, HepMC::GenEvent *theEvent, HepMC::GenParticle *p)
EvtGenInterface(const edm::ParameterSet &)
bool hasnoDaughter(HepMC::GenParticle *p)
static int position[264][3]
std::list< EvtDecayBase * > getUserModels()
bool findLastinChain(HepMC::GenParticle *&p)
std::string fullPath() const
#define DEFINE_EDM_PLUGIN(factory, type, name)