CMS 3D CMS Logo

EvtGenInterface.cc
Go to the documentation of this file.
1 // Class Based on EvtGenInterface(LHC).
2 //
3 // Created March 2014
4 //
5 // This class is a modification of the original EvtGenInterface which was developed for EvtGenLHC 9.1.
6 // The modifications for EvtGen 1.3.0 are implemented by Ian M. Nugent
7 // I would like to thank the EvtGen developers, in particular John Black, and Mikhail Kirsanov for their assistance.
8 //
9 // January 2015: Setting of coherent or incoherent B mixing included by Eduard Burelo
10 // January 2015: Adding new feature to allow users to provide new evtgen models
11 
14 
17 
29 
30 #include "CLHEP/Random/RandFlat.h"
32 
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"
42 
43 #include "HepPID/ParticleIDTranslations.hh"
44 
45 #include "TString.h"
46 #include <string>
47 #include <cstdlib>
48 #include <cstdio>
49 
50 #include "boost/filesystem.hpp"
51 #include "boost/filesystem/path.hpp"
52 
53 using namespace gen;
54 using namespace edm;
55 
56 CLHEP::HepRandomEngine* EvtGenInterface::fRandomEngine;
57 
59  fPSet=new ParameterSet(pset);
60  the_engine = new myEvtRandomEngine(nullptr);
61 }
62 
64  // fill up default list of particles to be declared stable in the "master generator"
65  // these are assumed to be PDG ID's
66  //
67  // Note: Pythia6's kc=43, 44, and 84 commented out because they're obsolete (per S.Mrenna)
68  //
69  m_PDGs.push_back( 300553 ) ;
70  m_PDGs.push_back( 511 ) ;
71  m_PDGs.push_back( 521 ) ;
72  m_PDGs.push_back( 523 ) ;
73  m_PDGs.push_back( 513 ) ;
74  m_PDGs.push_back( 533 ) ;
75  m_PDGs.push_back( 531 ) ; //B_s0
76 
77  m_PDGs.push_back( 15 ) ;
78 
79  m_PDGs.push_back( 413 ) ;
80  m_PDGs.push_back( 423 ) ;
81  m_PDGs.push_back( 433 ) ;
82  m_PDGs.push_back( 411 ) ;
83  m_PDGs.push_back( 421 ) ;
84  m_PDGs.push_back( 431 ) ;
85  m_PDGs.push_back( 10411 );
86  m_PDGs.push_back( 10421 );
87  m_PDGs.push_back( 10413 );
88  m_PDGs.push_back( 10423 );
89  m_PDGs.push_back( 20413 );
90  m_PDGs.push_back( 20423 );
91 
92  m_PDGs.push_back( 415 );
93  m_PDGs.push_back( 425 );
94  m_PDGs.push_back( 10431 );
95  m_PDGs.push_back( 20433 );
96  m_PDGs.push_back( 10433 );
97  m_PDGs.push_back( 435 );
98 
99  m_PDGs.push_back( 310 );
100  m_PDGs.push_back( 311 );
101  m_PDGs.push_back( 313 );
102  m_PDGs.push_back( 323 );
103  m_PDGs.push_back( 10321 );
104  m_PDGs.push_back( 10311 );
105  m_PDGs.push_back( 10313 );
106  m_PDGs.push_back( 10323 );
107  m_PDGs.push_back( 20323 );
108  m_PDGs.push_back( 20313 );
109  m_PDGs.push_back( 325 );
110  m_PDGs.push_back( 315 );
111 
112  m_PDGs.push_back( 100313 );
113  m_PDGs.push_back( 100323 );
114  m_PDGs.push_back( 30313 );
115  m_PDGs.push_back( 30323 );
116  m_PDGs.push_back( 30343 );
117  m_PDGs.push_back( 30353 );
118  m_PDGs.push_back( 30363 );
119 
120  m_PDGs.push_back( 111 );
121  m_PDGs.push_back( 221 );
122  m_PDGs.push_back( 113 );
123  m_PDGs.push_back( 213 );
124  m_PDGs.push_back( 223 );
125  m_PDGs.push_back( 331 );
126  m_PDGs.push_back( 333 );
127  m_PDGs.push_back( 20213 );
128  m_PDGs.push_back( 20113 );
129  m_PDGs.push_back( 215 );
130  m_PDGs.push_back( 115 );
131  m_PDGs.push_back( 10213 );
132  m_PDGs.push_back( 10113 );
133  m_PDGs.push_back( 9000111 ); // PDG ID = 9000111, Pythia6 ID = 10111
134  m_PDGs.push_back( 9000211 ); // PDG ID = 9000211, Pythia6 ID = 10211
135  m_PDGs.push_back( 9010221 ); // PDG ID = 9010211, Pythia6 ID = ???
136  m_PDGs.push_back( 10221 );
137  m_PDGs.push_back( 20223 );
138  m_PDGs.push_back( 20333 );
139  m_PDGs.push_back( 225 );
140  m_PDGs.push_back( 9020221 ); // PDG ID = 9020211, Pythia6 ID = ???
141  m_PDGs.push_back( 335 );
142  m_PDGs.push_back( 10223 );
143  m_PDGs.push_back( 10333 );
144  m_PDGs.push_back( 100213 );
145  m_PDGs.push_back( 100113 );
146 
147  m_PDGs.push_back( 441 );
148  m_PDGs.push_back( 100441 );
149  m_PDGs.push_back( 443 );
150  m_PDGs.push_back( 100443 );
151  m_PDGs.push_back( 9000443 );
152  m_PDGs.push_back( 9010443 );
153  m_PDGs.push_back( 9020443 );
154  m_PDGs.push_back( 10441 );
155  m_PDGs.push_back( 20443 );
156  m_PDGs.push_back( 445 );
157 
158  m_PDGs.push_back( 30443 );
159  m_PDGs.push_back( 551 );
160  m_PDGs.push_back( 553 );
161  m_PDGs.push_back( 100553 );
162  m_PDGs.push_back( 200553 );
163  m_PDGs.push_back( 10551 );
164  m_PDGs.push_back( 20553 );
165  m_PDGs.push_back( 555 );
166  m_PDGs.push_back( 10553 );
167 
168  m_PDGs.push_back( 110551 );
169  m_PDGs.push_back( 120553 );
170  m_PDGs.push_back( 100555 );
171  m_PDGs.push_back( 210551 );
172  m_PDGs.push_back( 220553 );
173  m_PDGs.push_back( 200555 );
174  m_PDGs.push_back( 30553 );
175  m_PDGs.push_back( 20555 );
176 
177  m_PDGs.push_back( 557 );
178  m_PDGs.push_back( 130553 );
179  m_PDGs.push_back( 120555 );
180  m_PDGs.push_back( 100557 );
181  m_PDGs.push_back( 110553 );
182  m_PDGs.push_back( 210553 );
183  m_PDGs.push_back( 10555 );
184  m_PDGs.push_back( 110555 );
185 
186  m_PDGs.push_back( 4122 );
187  m_PDGs.push_back( 4132 );
188  // m_PDGs.push_back( 84 ); // obsolete
189  m_PDGs.push_back( 4112 );
190  m_PDGs.push_back( 4212 );
191  m_PDGs.push_back( 4232 );
192  m_PDGs.push_back( 4222 );
193  m_PDGs.push_back( 4322 );
194  m_PDGs.push_back( 4312 );
195 
196  m_PDGs.push_back( 13122 );
197  m_PDGs.push_back( 13124 );
198  m_PDGs.push_back( 23122 );
199  m_PDGs.push_back( 33122 );
200  m_PDGs.push_back( 43122 );
201  m_PDGs.push_back( 53122 );
202  m_PDGs.push_back( 13126 );
203  m_PDGs.push_back( 13212 );
204  //m_PDGs.push_back( 13241 ); unknown particle -typo?
205 
206  m_PDGs.push_back( 3126 );
207  m_PDGs.push_back( 3124 );
208  m_PDGs.push_back( 3122 );
209  m_PDGs.push_back( 3222 );
210  m_PDGs.push_back( 2214 );
211  m_PDGs.push_back( 2224 );
212  m_PDGs.push_back( 3324 );
213  m_PDGs.push_back( 2114 );
214  m_PDGs.push_back( 1114 );
215  m_PDGs.push_back( 3112 );
216  m_PDGs.push_back( 3212 );
217  m_PDGs.push_back( 3114 );
218  m_PDGs.push_back( 3224 );
219  m_PDGs.push_back( 3214 );
220  m_PDGs.push_back( 3216 );
221  m_PDGs.push_back( 3322 );
222  m_PDGs.push_back( 3312 );
223  m_PDGs.push_back( 3314 );
224  m_PDGs.push_back( 3334 );
225 
226  m_PDGs.push_back( 4114 );
227  m_PDGs.push_back( 4214 );
228  m_PDGs.push_back( 4224 );
229  m_PDGs.push_back( 4314 );
230  m_PDGs.push_back( 4324 );
231  m_PDGs.push_back( 4332 );
232  m_PDGs.push_back( 4334 );
233  //m_PDGs.push_back( 43 ); // obsolete (?)
234  //m_PDGs.push_back( 44 ); // obsolete (?)
235  m_PDGs.push_back( 10443 );
236 
237  m_PDGs.push_back( 5122 );
238  m_PDGs.push_back( 5132 );
239  m_PDGs.push_back( 5232 );
240  m_PDGs.push_back( 5332 );
241  m_PDGs.push_back( 5222 );
242  m_PDGs.push_back( 5112 );
243  m_PDGs.push_back( 5212 );
244  m_PDGs.push_back( 541 );
245  m_PDGs.push_back( 14122 );
246  m_PDGs.push_back( 14124 );
247  m_PDGs.push_back( 5312 );
248  m_PDGs.push_back( 5322 );
249  m_PDGs.push_back( 10521 );
250  m_PDGs.push_back( 20523 );
251  m_PDGs.push_back( 10523 );
252 
253  m_PDGs.push_back( 525 );
254  m_PDGs.push_back( 10511 );
255  m_PDGs.push_back( 20513 );
256  m_PDGs.push_back( 10513 );
257  m_PDGs.push_back( 515 );
258  m_PDGs.push_back( 10531 );
259  m_PDGs.push_back( 20533 );
260  m_PDGs.push_back( 10533 );
261  m_PDGs.push_back( 535 );
262  m_PDGs.push_back( 543 );
263  m_PDGs.push_back( 545 );
264  m_PDGs.push_back( 5114 );
265  m_PDGs.push_back( 5224 );
266  m_PDGs.push_back( 5214 );
267  m_PDGs.push_back( 5314 );
268  m_PDGs.push_back( 5324 );
269  m_PDGs.push_back( 5334 );
270  m_PDGs.push_back( 10541 );
271  m_PDGs.push_back( 10543 );
272  m_PDGs.push_back( 20543 );
273 
274  m_PDGs.push_back( 4424 );
275  m_PDGs.push_back( 4422 );
276  m_PDGs.push_back( 4414 );
277  m_PDGs.push_back( 4412 );
278  m_PDGs.push_back( 4432 );
279  m_PDGs.push_back( 4434 );
280 
281  m_PDGs.push_back( 130 );
282 
283 
284  for(unsigned int i=0; i<m_PDGs.size();i++){
285  int pdt=HepPID::translatePythiatoPDT (m_PDGs.at(i));
286  if(pdt!=m_PDGs.at(i))m_PDGs.at(i)=pdt;
287  }
288 }
289 
291 }
292 
294  // flags for pythia8
295  fSpecialSettings.push_back("Pythia8:ParticleDecays:mixB = off");
296  //
297 
298  edm::FileInPath decay_table(fPSet->getParameter<std::string>("decay_table"));
299  edm::FileInPath pdt(fPSet->getParameter<edm::FileInPath>("particle_property_file"));
300 
301  bool usePythia = fPSet->getUntrackedParameter<bool>("use_internal_pythia",true);
302  bool useTauola = fPSet->getUntrackedParameter<bool>("use_internal_tauola",true);
303  bool usePhotos = fPSet->getUntrackedParameter<bool>("use_internal_photos",true);
304 
305  //Setup evtGen following instructions on http://evtgen.warwick.ac.uk/docs/external/
306  bool convertPythiaCodes=fPSet->getUntrackedParameter<bool>("convertPythiaCodes",true); // Specify if we want to use Pythia 6 physics codes for decays
307  std::string pythiaDir = getenv ("PYTHIA8DATA"); // Specify the pythia xml data directory to use the default PYTHIA8DATA location
308  if(pythiaDir.empty()){
309  edm::LogError("EvtGenInterface::~EvtGenInterface") << "EvtGenInterface::init() PYTHIA8DATA not defined. Terminating program ";
310  exit(0);
311  }
312  std::string photonType("gamma"); // Specify the photon type for Photos
313  bool useEvtGenRandom(true); // Specify if we want to use the EvtGen random number engine for these generators
314 
315  // Set up the default external generator list: Photos, Pythia and/or Tauola
316  EvtExternalGenList genList(convertPythiaCodes, pythiaDir, photonType, useEvtGenRandom);
317  EvtAbsRadCorr* radCorrEngine=nullptr;
318  if(usePhotos) radCorrEngine = genList.getPhotosModel(); // Get interface to radiative correction engine
319  std::list<EvtDecayBase*> extraModels = genList.getListOfModels(); // get interface to Pythia and Tauola
320  std::list<EvtDecayBase*> myExtraModels;
321  for(unsigned int i=0; i<extraModels.size();i++){
322  std::list<EvtDecayBase*>::iterator it = extraModels.begin();
323  std::advance(it,i);
324  TString name=(*it)->getName();
325  if(name.Contains("PYTHIA") && usePythia) myExtraModels.push_back(*it);
326  if(name.Contains("TAUOLA") && useTauola) myExtraModels.push_back(*it);
327  }
328 
329  //Set up user evtgen models
330 
331  EvtModelUserReg userList;
332  std::list<EvtDecayBase*> userModels = userList.getUserModels(); // get interface to user models
333  for(unsigned int i=0; i<userModels.size();i++){
334  std::list<EvtDecayBase*>::iterator it = userModels.begin();
335  std::advance(it,i);
336  TString name=(*it)->getName();
337  edm::LogInfo("EvtGenInterface::~EvtGenInterface") << "Adding user model: "<<name;
338  myExtraModels.push_back(*it);
339  }
340 
341 
342 
343  // Set up the incoherent (1) or coherent (0) B mixing option
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.";
348  }
349 
351  // Create the EvtGen generator object, passing the external generators
352  m_EvtGen = new EvtGen(decay_table.fullPath().c_str(),pdt.fullPath().c_str(),the_engine,radCorrEngine,&myExtraModels,BmixingOption);
353 
354  // Add additional user information
355  if (fPSet->exists("user_decay_file")){
356  std::vector<std::string> user_decays = fPSet->getParameter<std::vector<std::string> >("user_decay_file");
357  for(unsigned int i=0;i<user_decays.size();i++){
358  edm::FileInPath user_decay(user_decays.at(i));
359  m_EvtGen->readUDecay(user_decay.fullPath().c_str());
360  }
361  }
362 
363  if (fPSet->exists("user_decay_embedded")){
364  std::vector<std::string> user_decay_lines = fPSet->getParameter<std::vector<std::string> >("user_decay_embedded");
365  auto tmp_dir = boost::filesystem::temp_directory_path();
366  tmp_dir += "/%%%%-%%%%-%%%%-%%%%";
367  auto tmp_path = boost::filesystem::unique_path(tmp_dir);
368  std::string user_decay_tmp = std::string(tmp_path.c_str());
369  FILE* tmpf = std::fopen(user_decay_tmp.c_str(), "w");
370  if (!tmpf) {
371  edm::LogError("EvtGenInterface::~EvtGenInterface") << "EvtGenInterface::init() fails when trying to open a temporary file for embedded user.dec. Terminating program ";
372  exit(0);
373  }
374  for (unsigned int i=0; i<user_decay_lines.size(); i++) {
375  user_decay_lines.at(i) += "\n";
376  std::fputs(user_decay_lines.at(i).c_str(), tmpf);
377  }
378  std::fclose(tmpf);
379  m_EvtGen->readUDecay(user_decay_tmp.c_str());
380  }
381 
382  // setup pdgid which the generator/hadronizer should not decay
383  if (fPSet->exists("operates_on_particles")){
384  std::vector<int> tmpPIDs = fPSet->getParameter< std::vector<int> >("operates_on_particles");
385  m_PDGs.clear();
386  bool goodinput=false;
387  if(!tmpPIDs.empty()){ if(tmpPIDs.size()==1 && tmpPIDs[0]==0) goodinput=false;
388  else goodinput=true;
389  }
390  else{goodinput=false;}
391  if(goodinput) m_PDGs = tmpPIDs;
392  else SetDefault_m_PDGs();
393  }
394  else SetDefault_m_PDGs();
395 
396  for(unsigned int i=0;i<m_PDGs.size();i++){
397  edm::LogInfo("EvtGenInterface::~EvtGenInterface") << "EvtGenInterface::init() Particles to Operate on: " << m_PDGs[i];
398  }
399 
400  // Obtain information to set polarization of particles
401  polarize_ids = fPSet->getUntrackedParameter<std::vector<int> >("particles_to_polarize",std::vector<int>());
402  polarize_pol = fPSet->getUntrackedParameter<std::vector<double> >("particle_polarizations",std::vector<double>());
403  if (polarize_ids.size() != polarize_pol.size()) {
404  throw cms::Exception("Configuration") << "EvtGenProducer requires that the particles_to_polarize and particle_polarization\n"
405  "vectors be the same size. Please fix this in your configuration.";
406  }
407  for (unsigned int ndx = 0; ndx < polarize_ids.size(); ndx++) {
408  if (polarize_pol[ndx] < -1. || polarize_pol[ndx] > 1.) {
409  throw cms::Exception("Configuration") << "EvtGenProducer error: particle polarizations must be in the range -1 < P < 1";
410  }
411  polarizations.insert(std::pair<int, float>(polarize_ids[ndx], polarize_pol[ndx]));
412  }
413 
414  // Forced decays are particles that are aliased and forced to be decayed by EvtGen
415  if (fPSet->exists("list_forced_decays")){
416  std::vector<std::string> forced_names = fPSet->getParameter< std::vector<std::string> >("list_forced_decays");
417  for(unsigned int i=0;i<forced_names.size();i++){
418  EvtId found = EvtPDL::getId(forced_names[i]);
419  if(found.getId() == -1) throw cms::Exception("Configuration") << "name in part list for ignored decays not found: " << forced_names[i];
420  if(found.getId() == found.getAlias()) throw cms::Exception("Configuration") << "name of ignored decays is not an alias: " << forced_names[i];
421  forced_id.push_back(found);
422  forced_pdgids.push_back(EvtPDL::getStdHep(found)); // force_pdgids is the list of stdhep codes
423  }
424  }
425  edm::LogInfo("EvtGenInterface::~EvtGenInterface") << "Number of Forced Paricles is: " << forced_pdgids.size() << std::endl;
426  for(unsigned int j=0;j<forced_id.size();j++){
427  edm::LogInfo("EvtGenInterface::~EvtGenInterface") << "Forced Paricles are: " << forced_pdgids.at(j) << " " << forced_id.at(j) << std::endl;
428  }
429  // Ignore decays are particles that are not to be decayed by EvtGen
430  if (fPSet->exists("list_ignored_pdgids")){
431  ignore_pdgids = fPSet->getUntrackedParameter< std::vector<int> >("list_ignored_pdgids");
432  }
433 
434  return;
435 }
436 
437 HepMC::GenEvent* EvtGenInterface::decay( HepMC::GenEvent* evt ){
438  if(the_engine->engine() == nullptr){
440  << "The EvtGen code attempted to use a random number engine while\n"
441  << "the engine pointer was null in EvtGenInterface::decay. This might\n"
442  << "mean that the code was modified to generate a random number outside\n"
443  << "the event and beginLuminosityBlock methods, which is not allowed.\n";
444  }
445  CLHEP::RandFlat m_flat(*the_engine->engine(), 0., 1.);
446 
447  // decay all request unforced particles and store the forced decays to later decay one per event
448  unsigned int nisforced=0;
449  std::vector<std::vector<HepMC::GenParticle*> > forcedparticles;
450  for(unsigned int i=0;i<forced_pdgids.size();i++) forcedparticles.push_back(std::vector<HepMC::GenParticle*>());
451 
452  // notice this is a dynamic loop
453  for (HepMC::GenEvent::particle_const_iterator p= evt->particles_begin(); p != evt->particles_end(); ++p){
454  if((*p)->status()==1){ // all particles to be decays are set to status 1 by generator.hadronizer
455  int idHep = (*p)->pdg_id();
456  bool isignore=false;
457  for(unsigned int i=0;i<ignore_pdgids.size();i++){
458  if(idHep==ignore_pdgids[i])isignore=true;
459  }
460  if (!isignore){
461  bool isforced=false;
462  for(unsigned int i=0;i<forced_pdgids.size();i++){
463  if(idHep==forced_pdgids[i]){
464  forcedparticles.at(i).push_back(*p); // storing and counting forced decays.
465  nisforced++;
466  isforced=true;
467  break;
468  }
469  }
470  bool isDefaultEvtGen=false;
471  for(unsigned int i=0;i<m_PDGs.size();i++){
472  if(abs(idHep)==abs(m_PDGs[i])){
473  isDefaultEvtGen=true;
474  break;
475  }
476  }
477  EvtId idEvt = EvtPDL::evtIdFromStdHep(idHep);
478  int ipart = idEvt.getId();
479  EvtDecayTable *evtDecayTable=EvtDecayTable::getInstance();
480  if(!isforced && isDefaultEvtGen && ipart!=-1 && evtDecayTable->getNMode(ipart)!=0){
481  addToHepMC(*p,idEvt,evt,true); // generate decay and remove daugther if they are forced
482  }
483  }
484  }
485  }
486 
487  // decay all forced particles (only 1/event is forced)... with no mixing allowed
488  unsigned int which = (unsigned int)(nisforced*flat());
489  if(which==nisforced && nisforced>0) which=nisforced-1;
490 
491  unsigned int idx=0;
492  for (unsigned int i=0; i<forcedparticles.size(); i++){
493  for (unsigned int j=0; j<forcedparticles.at(i).size(); j++){
494  EvtId idEvt = EvtPDL::evtIdFromStdHep(forcedparticles.at(i).at(j)->pdg_id()); // "standard" decay Id
495  if ( idx==which ) {
496  idEvt = forced_id[i]; // force decay Id
497  edm::LogInfo("EvtGenInterface::decay ") << EvtPDL::getStdHep(idEvt) << " will force to decay " << idx+1
498  << " out of " << nisforced << std::endl;
499  }
500  bool decayed = false;
501  while(!decayed){decayed=addToHepMC(forcedparticles.at(i).at(j),idEvt,evt,false);}
502  idx++;
503  }
504  }
505 
506  // add code to ensure all particles have an end vertex and if they are undecayed with no end vertes set to status 1
507  for (HepMC::GenEvent::particle_const_iterator p= evt->particles_begin(); p != evt->particles_end(); ++p){
508  if((*p)->end_vertex() && (*p)->status() == 1)edm::LogWarning("EvtGenInterface::decay error: incorrect status!"); //(*p)->set_status(2);
509  if((*p)->end_vertex() && (*p)->end_vertex()->particles_out_size()==0) edm::LogWarning("EvtGenInterface::decay error: empty end vertex!");
510  }
511  return evt;
512 }
513 
514 // Add particle to MC
515 bool EvtGenInterface::addToHepMC(HepMC::GenParticle* partHep,const EvtId &idEvt, HepMC::GenEvent* theEvent, bool del_daug) {
516  // Set up the parent particle from the HepMC GenEvent tree.
517  //EvtVector4R pInit(EvtPDL::getMass(idEvt),partHep->momentum().px(),partHep->momentum().py(),partHep->momentum().pz());
518  EvtVector4R pInit(partHep->momentum().e(),partHep->momentum().px(),partHep->momentum().py(),partHep->momentum().pz());
519  EvtParticle* parent = EvtParticleFactory::particleFactory(idEvt, pInit);
520  HepMC::FourVector posHep = (partHep->production_vertex())->position();
521  EvtVector4R vInit(posHep.t(),posHep.x(),posHep.y(),posHep.z());
522  // Reset polarization if requested....
523  if(EvtPDL::getSpinType(idEvt) == EvtSpinType::DIRAC && polarizations.count(partHep->pdg_id())>0){
524  const HepMC::FourVector& momHep = partHep->momentum();
525  EvtVector4R momEvt;
526  momEvt.set(momHep.t(),momHep.x(),momHep.y(),momHep.z());
527  // Particle is spin 1/2, so we can polarize it. Check polarizations map for particle, grab its polarization if it exists
528  // and make the spin density matrix
529  float pol = polarizations.find(partHep->pdg_id())->second;
530  GlobalVector pPart(momHep.x(), momHep.y(), momHep.z());
531  GlobalVector zHat(0., 0., 1.);
532  GlobalVector zCrossP = zHat.cross(pPart);
533  GlobalVector polVec = pol * zCrossP.unit();
534  EvtSpinDensity theSpinDensity;
535  theSpinDensity.setDim(2);
536  theSpinDensity.set(0, 0, EvtComplex(1./2. + polVec.z()/2., 0.));
537  theSpinDensity.set(0, 1, EvtComplex(polVec.x()/2., -polVec.y()/2.));
538  theSpinDensity.set(1, 0, EvtComplex(polVec.x()/2., polVec.y()/2.));
539  theSpinDensity.set(1, 1, EvtComplex(1./2. - polVec.z()/2., 0.));
540  parent->setSpinDensityForwardHelicityBasis(theSpinDensity);
541  }
542  if(parent){
543  // Generate the event
544  m_EvtGen->generateDecay(parent);
545  if (del_daug) go_through_daughters(parent); // will delete all daugthers which are listed as forced, to allow decay them later
546 
547  // create HepMCTree
548  EvtHepMCEvent evtHepMCEvent;
549  evtHepMCEvent.constructEvent(parent,vInit);
550  HepMC::GenEvent* evtGenHepMCTree = evtHepMCEvent.getEvent();
551  parent->deleteTree();
552 
553  // update the event using a recursive function
554  if(!evtGenHepMCTree->particles_empty()) update_particles(partHep,theEvent,(*evtGenHepMCTree->particles_begin()));
555 
556  } else {
557  // this should never hapend, in such case, speak out.
558  return false;
559  }
560  return true;
561 }
562 
563 //Recursivley add EvtGen decay to to Event Decy tree
565  if(p->end_vertex()){
566  if(!partHep->end_vertex()){
567  HepMC::GenVertex* vtx = new HepMC::GenVertex(p->end_vertex()->position());
568  theEvent->add_vertex(vtx);
569  vtx->add_particle_in(partHep);
570  }
571  if ( p->end_vertex()->particles_out_size()!=0 ){
572 
573  for ( HepMC::GenVertex::particles_out_const_iterator d=p->end_vertex()->particles_out_const_begin();
574  d!=p->end_vertex()->particles_out_const_end();d++ ){
575 
576  HepMC::GenParticle *daughter = new HepMC::GenParticle((*d)->momentum(),(*d)->pdg_id(),(*d)->status());
577  daughter->suggest_barcode(theEvent->particles_size()+1);
578  partHep->end_vertex()->add_particle_out(daughter);
579  if((*d)->end_vertex()) update_particles(daughter,theEvent,(*d)); // if daugthers add them as well
580  }
581  partHep->set_status(p->status());
582  }
583  }
584 }
585 
586 void EvtGenInterface::setRandomEngine(CLHEP::HepRandomEngine* v) {
587  the_engine->setRandomEngine(v);
588  fRandomEngine=v;
589 }
590 
592  if ( !fRandomEngine ) {
593  throw cms::Exception("LogicError")
594  << "EvtGenInterface::flat: Attempt to generate random number when engine pointer is null\n"
595  << "This might mean that the code was modified to generate a random number outside the\n"
596  << "event and beginLuminosityBlock methods, which is not allowed.\n";
597  }
598  return fRandomEngine->flat();
599 }
600 
601 
603  if(p->end_vertex()){
604  if(p->end_vertex()->particles_out_size()!=0){
605  for(HepMC::GenVertex::particles_out_const_iterator d=p->end_vertex()->particles_out_const_begin(); d!=p->end_vertex()->particles_out_const_end();d++){
606  if(abs((*d)->pdg_id())==abs(p->pdg_id())){
607  p=*d;
608  findLastinChain(p);
609  return false;
610  }
611  }
612  }
613  }
614  return true;
615 }
616 
618  if(p->end_vertex()){
619  if(p->end_vertex()->particles_out_size()!=0){
620  return false;
621  }
622  }
623  return true;
624 }
625 
627  int NDaug=part->getNDaug();
628  if (NDaug) {
629  EvtParticle* Daughter;
630  for (int i=0;i<NDaug;i++) {
631  Daughter=part->getDaug(i);
632  int idHep = Daughter->getPDGId();
633  int found=0;
634  for (unsigned int j=0;j<forced_pdgids.size();j++) {
635  if (idHep == forced_pdgids[j]) {
636  found = 1;
637  Daughter->deleteDaughters();
638  break;
639  }
640  }
641  if (!found) go_through_daughters(Daughter);
642  }
643  }
644 }
645 
static unsigned int getId()
T y() const
Definition: PV3DBase.h:63
static double flat()
photonType
PHOTON
Definition: autophobj.py:157
double v[5][pyjets_maxn]
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)
double p[5][pyjets_maxn]
void setRandomEngine(CLHEP::HepRandomEngine *v) override
static CLHEP::HepRandomEngine * fRandomEngine
Vector3DBase< typename PreciseFloatType< T, U >::Type, FrameTag > cross(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:119
T z() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HepMC::GenEvent * decay(HepMC::GenEvent *) override
Vector3DBase unit() const
Definition: Vector3DBase.h:57
void update_particles(HepMC::GenParticle *partHep, HepMC::GenEvent *theEvent, HepMC::GenParticle *p)
EvtGenInterface(const edm::ParameterSet &)
part
Definition: HCALResponse.h:20
bool hasnoDaughter(HepMC::GenParticle *p)
HLT enums.
static int position[264][3]
Definition: ReadPGInfo.cc:509
void init() override
std::list< EvtDecayBase * > getUserModels()
bool findLastinChain(HepMC::GenParticle *&p)
std::string fullPath() const
Definition: FileInPath.cc:197
#define DEFINE_EDM_PLUGIN(factory, type, name)
def which(cmd)
Definition: eostools.py:335
T x() const
Definition: PV3DBase.h:62