CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Pythia8Hadronizer.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <sstream>
3 #include <string>
4 #include <memory>
5 #include <stdint.h>
6 
7 #include "HepMC/GenEvent.h"
8 #include "HepMC/GenParticle.h"
9 
10 #include "Pythia8/Pythia.h"
11 #include "Pythia8/Pythia8ToHepMC.h"
12 
14 
16 
17 // PS matchning prototype
18 //
20 
21 // Emission Veto Hooks
22 //
25 
29 
32 
38 
40 
41 #include "HepPID/ParticleIDTranslations.hh"
42 
44 
45 using namespace gen;
46 using namespace Pythia8;
47 
49  public:
50  Pythia8Hadronizer(const edm::ParameterSet &params);
52 
53  bool readSettings( int );
54  bool initializeForInternalPartons();
55  bool initializeForExternalPartons();
56 
57  bool declareStableParticles(const std::vector<int> &pdgIds);
58  bool declareSpecialSettings( const std::vector<std::string> );
59 
60  void statistics();
61 
62  bool generatePartonsAndHadronize();
63  bool hadronize();
64  bool decay();
65  bool residualDecay();
66  void finalizeEvent();
67 
68  const char *classname() const { return "Pythia8Hadronizer"; }
69 
70  private:
72 
74  double comEnergy;
76  unsigned int pythiaPylistVerbosity;
80  unsigned int maxEventsToPrint;
81 
83 
84  std::auto_ptr<LHAupLesHouches> lhaUP;
85 
86  std::auto_ptr<Pythia> pythia;
87  std::auto_ptr<Pythia> decayer;
88  Event* pythiaEvent;
89  HepMC::Pythia8ToHepMC toHepMC;
90 
91  enum { PP, PPbar, ElectronPositron };
92  int fInitialState ; // pp, ppbar, or e-e+
93 
94  double fBeam1PZ;
95  double fBeam2PZ;
96 
97  // Reweight user hook
98  //
99  UserHooks* fReweightUserHook;
100 
101  // PS matching protot6ype
102  //
104 
105  // Emission Veto Hooks
106  //
117 
118  std::string slhafile_;
119 
120 };
121 
122 
124  BaseHadronizer(params),
125  parameters(params.getParameter<edm::ParameterSet>("PythiaParameters")),
126  comEnergy(params.getParameter<double>("comEnergy")),
127  pythiaPylistVerbosity(params.getUntrackedParameter<int>("pythiaPylistVerbosity", 0)),
128  pythiaHepMCVerbosity(params.getUntrackedParameter<bool>("pythiaHepMCVerbosity", false)),
129  maxEventsToPrint(params.getUntrackedParameter<int>("maxEventsToPrint", 0)),
130  LHEInputFileName(params.getUntrackedParameter<string>("LHEInputFileName","")),
131  fInitialState(PP),
132  fReweightUserHook(0),
133  fJetMatchingHook(0),
134  fEmissionVetoHook(0),fEmissionVetoHook1(0)
135 {
136 
137  //#ifdef PYTHIA8175
138  //setenv("PYTHIA8DATA", getenv("PYTHIA8175DATA"), true);
139  //#endif
140 
142 
143  //Old code that used Pythia8 own random engine
144  //edm::Service<edm::RandomNumberGenerator> rng;
145  //uint32_t seed = rng->mySeed();
146  //Pythia8::Rndm::init(seed);
147 
148  RandomP8* RP8 = new RandomP8();
149 
150  // J.Y.: the following 3 parameters are hacked "for a reason"
151  //
152  if ( params.exists( "PPbarInitialState" ) )
153  {
154  if ( fInitialState == PP )
155  {
157  edm::LogInfo("GeneratorInterface|Pythia6Interface")
158  << "Pythia6 will be initialized for PROTON-ANTIPROTON INITIAL STATE. "
159  << "This is a user-request change from the DEFAULT PROTON-PROTON initial state." << std::endl;
160  std::cout << "Pythia6 will be initialized for PROTON-ANTIPROTON INITIAL STATE." << std::endl;
161  std::cout << "This is a user-request change from the DEFAULT PROTON-PROTON initial state." << std::endl;
162  }
163  else
164  {
165  // probably need to throw on attempt to override ?
166  }
167  }
168  else if ( params.exists( "ElectronPositronInitialState" ) )
169  {
170  if ( fInitialState == PP )
171  {
173  edm::LogInfo("GeneratorInterface|Pythia6Interface")
174  << "Pythia6 will be initialized for ELECTRON-POSITRON INITIAL STATE. "
175  << "This is a user-request change from the DEFAULT PROTON-PROTON initial state." << std::endl;
176  std::cout << "Pythia6 will be initialized for ELECTRON-POSITRON INITIAL STATE." << std::endl;
177  std::cout << "This is a user-request change from the DEFAULT PROTON-PROTON initial state." << std::endl;
178  }
179  else
180  {
181  // probably need to throw on attempt to override ?
182  }
183  }
184  else if ( params.exists( "ElectronProtonInitialState" ) || params.exists( "PositronProtonInitialState" ) )
185  {
186  // throw on unknown initial state !
187  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
188  <<" UNKNOWN INITIAL STATE. \n The allowed initial states are: PP, PPbar, ElectronPositron \n";
189  }
190 
191  pythia.reset(new Pythia);
192  decayer.reset(new Pythia);
193 
194  pythia->setRndmEnginePtr(RP8);
195  decayer->setRndmEnginePtr(RP8);
196 
197  if( params.exists( "SLHAFileForPythia8" ) ) {
198  std::string slhafilenameshort = params.getParameter<string>("SLHAFileForPythia8");
199  edm::FileInPath f1( slhafilenameshort );
200  slhafile_ = f1.fullPath();
201  std::string pythiacommandslha = std::string("SLHA:file = ") + slhafile_;
202  pythia->readString(pythiacommandslha);
204  line != parameters.end(); ++line ) {
205  if (line->find("SLHA:file") != std::string::npos)
206  throw cms::Exception("PythiaError") << "Attempted to set SLHA file name twice, "
207  << "using Pythia8 card SLHA:file and Pythia8Interface card SLHAFileForPythia8"
208  << std::endl;
209  }
210  }
211 
212  // Reweight user hook
213  //
214  if( params.exists( "reweightGen" ) )
216 
217  // PS matching prototype
218  //
219  if ( params.exists("jetMatching") )
220  {
221  edm::ParameterSet jmParams =
222  params.getUntrackedParameter<edm::ParameterSet>("jetMatching");
223  fJetMatchingHook = new JetMatchingHook( jmParams, &pythia->info );
224  }
225 
226  // Emission veto
227  //
228  if(params.exists("EV_CheckHard"))
229  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
230  <<" Parameter EV_CheckHard is no more used\n";
231  if(params.exists("EV1_CheckHard"))
232  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
233  <<" Parameter EV1_CheckHard does not exist\n";
234  //
235  if ( params.exists("emissionVeto") )
236  {
237  //int nversion = (int)(1000.*(pythia->settings.parm("Pythia:versionNumber") - 8.));
239  pythia->setUserHooksPtr( fEmissionVetoHook );
240  }
241 
242  if ( params.exists("emissionVeto1") )
243  {
244  EV1_nFinal = -1;
245  if(params.exists("EV1_nFinal")) EV1_nFinal = params.getParameter<int>("EV1_nFinal");
246  EV1_vetoOn = true;
247  if(params.exists("EV1_vetoOn")) EV1_vetoOn = params.getParameter<bool>("EV1_vetoOn");
248  EV1_maxVetoCount = 10;
249  if(params.exists("EV1_maxVetoCount")) EV1_maxVetoCount = params.getParameter<int>("EV1_maxVetoCount");
250  EV1_pThardMode = 1;
251  if(params.exists("EV1_pThardMode")) EV1_pThardMode = params.getParameter<int>("EV1_pThardMode");
252  EV1_pTempMode = 0;
253  if(params.exists("EV1_pTempMode")) EV1_pTempMode = params.getParameter<int>("EV1_pTempMode");
254  if(EV1_pTempMode > 2 || EV1_pTempMode < 0)
255  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
256  <<" Wrong value for EV1_pTempMode code\n";
257  EV1_emittedMode = 0;
258  if(params.exists("EV1_emittedMode")) EV1_emittedMode = params.getParameter<int>("EV1_emittedMode");
259  EV1_pTdefMode = 1;
260  if(params.exists("EV1_pTdefMode")) EV1_pTdefMode = params.getParameter<int>("EV1_pTdefMode");
261  EV1_MPIvetoOn = false;
262  if(params.exists("EV1_MPIvetoOn")) EV1_MPIvetoOn = params.getParameter<bool>("EV1_MPIvetoOn");
266  }
267 
268  int NHooks=0;
269  if(fReweightUserHook) NHooks++;
270  if(fJetMatchingHook) NHooks++;
271  if(fEmissionVetoHook) NHooks++;
272  if(fEmissionVetoHook1) NHooks++;
273  if(NHooks > 1)
274  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
275  <<" Too many User Hooks. \n Please choose one from: reweightGen, jetMatching, emissionVeto \n";
276 
277  if(fReweightUserHook) pythia->setUserHooksPtr(fReweightUserHook);
278  if(fJetMatchingHook) pythia->setUserHooksPtr(fJetMatchingHook);
279  if(fEmissionVetoHook) pythia->setUserHooksPtr(fEmissionVetoHook);
280  if(fEmissionVetoHook1) pythia->setUserHooksPtr(fEmissionVetoHook1);
281 }
282 
283 
285 {
286 // do we need to delete UserHooks/JetMatchingHook here ???
287 
290 }
291 
292 
294 {
296  line != parameters.end(); ++line ) {
297  if (line->find("Random:") != std::string::npos)
298  throw cms::Exception("PythiaError") << "Attempted to set random number "
299  "using Pythia commands. Please use " "the RandomNumberGeneratorService."
300  << std::endl;
301 
302  if (!pythia->readString(*line)) throw cms::Exception("PythiaError")
303  << "Pythia 8 did not accept \""
304  << *line << "\"." << std::endl;
305  }
306 
307  if ( pythiaPylistVerbosity > 10 ) {
308  if ( pythiaPylistVerbosity == 11 || pythiaPylistVerbosity == 13 )
309  pythia->settings.listAll();
310  if ( pythiaPylistVerbosity == 12 || pythiaPylistVerbosity == 13 )
311  pythia->particleData.listAll();
312  }
313 
314  return true;
315 }
316 
317 
319 {
320 
321  pythiaEvent = &pythia->event;
322 
323  if ( fInitialState == PP ) // default
324  {
325  pythia->init(2212, 2212, comEnergy);
326  }
327  else if ( fInitialState == PPbar )
328  {
329  pythia->init(2212, -2212, comEnergy);
330  }
331  else if ( fInitialState == ElectronPositron )
332  {
333  pythia->init(11, -11, comEnergy);
334  }
335  else
336  {
337  // throw on unknown initial state !
338  throw edm::Exception(edm::errors::Configuration,"Pythia8Interface")
339  <<" UNKNOWN INITIAL STATE. \n The allowed initial states are: PP, PPbar, ElectronPositron \n";
340  }
341 
342  pythia->settings.listChanged();
343 
344  return true;
345 }
346 
347 
349 {
350 
351  std::cout << "Initializing for external partons" << std::endl;
352 
353  pythiaEvent = &pythia->event;
354 
355  if(LHEInputFileName != string()) {
356 
357  cout << endl;
358  cout << "LHE Input File Name = " << LHEInputFileName << endl;
359  cout << endl;
360  pythia->init(LHEInputFileName);
361 
362  } else {
363 
364  lhaUP.reset(new LHAupLesHouches());
365  lhaUP->loadRunInfo(lheRunInfo());
366 
367  //pythia 8 doesn't currently support reading SLHA table from lhe header in memory
368  //so dump it to a temp file and set the appropriate pythia parameters to read it
369  std::vector<std::string> slha = lheRunInfo()->findHeader("slha");
370  const char *fname = std::tmpnam(NULL);
371  //read slha header from lhe only if header is present AND no slha header was specified
372  //for manual loading.
373  bool doslha = !slha.empty() && slhafile_.empty();
374 
375  if (doslha) {
376  std::ofstream file(fname, std::fstream::out | std::fstream::trunc);
377  std::string block;
378  for(std::vector<std::string>::const_iterator iter = slha.begin();
379  iter != slha.end(); ++iter) {
380  file << *iter;
381  }
382  file.close();
383 
384  std::string lhareadcmd = "SLHA:readFrom = 2";
385  std::string lhafilecmd = std::string("SLHA:file = ") + std::string(fname);
386 
387  pythia->readString(lhareadcmd);
388  pythia->readString(lhafilecmd);
389  }
390 
391  pythia->init(lhaUP.get());
392 
393  if (doslha) {
394  std::remove( fname );
395  }
396 
397  }
398 
399  // PS matching prototype
400  //
401  if ( fJetMatchingHook )
402  {
403  // matcher will be init as well, inside init(...)
404  //
406  }
407 
408  return true;
409 }
410 
411 
412 #if 0
413 // naive Pythia8 HepMC status fixup
414 static int getStatus(const HepMC::GenParticle *p)
415 {
416  int status = p->status();
417  if (status > 0)
418  return status;
419  else if (status > -30 && status < 0)
420  return 3;
421  else
422  return 2;
423 }
424 #endif
425 
426 
427 bool Pythia8Hadronizer::declareStableParticles(const std::vector<int> &pdgIds)
428 {
429  for ( size_t i=0; i<pdgIds.size(); i++ )
430  {
431  // FIXME: need to double check if PID's are the same in Py6 & Py8,
432  // because the HepPDT translation tool is actually for **Py6**
433  //
434  // well, actually it looks like Py8 operates in PDT id's rather than Py6's
435  //
436  // int PyID = HepPID::translatePDTtoPythia( pdgIds[i] );
437  int PyID = pdgIds[i];
438  std::ostringstream pyCard ;
439  pyCard << PyID <<":mayDecay=false";
440  pythia->readString( pyCard.str() );
441  // alternative:
442  // set the 2nd input argument warn=false
443  // - this way Py8 will NOT print warnings about unknown particle code(s)
444  // pythia->readString( pyCard.str(), false )
445  }
446 
447  // init decayer
448  decayer->readString("ProcessLevel:all = off"); // The trick!
449  decayer->init();
450 
451  return true;
452 }
453 
454 
455 bool Pythia8Hadronizer::declareSpecialSettings( const std::vector<std::string> settings )
456 {
457  for ( unsigned int iss=0; iss<settings.size(); iss++ )
458  {
459  if ( settings[iss].find("QED-brem-off") == std::string::npos ) continue;
460  pythia->readString( "TimeShower:QEDshowerByL=off" );
461  }
462 
463  return true;
464 }
465 
466 
468 {
469  pythia->statistics();
470 
471  double xsec = pythia->info.sigmaGen(); // cross section in mb
472  xsec *= 1.0e9; // translate to pb (CMS/Gen "convention" as of May 2009)
473  runInfo().setInternalXSec(xsec);
474 }
475 
476 
478 {
479  if (!pythia->next()) return false;
480 
481  event().reset(new HepMC::GenEvent);
482  toHepMC.fill_next_event(*pythiaEvent, event().get());
483 
484  return true;
485 }
486 
487 
489 {
490  if(LHEInputFileName == string()) lhaUP->loadEvent(lheEvent());
491 
492  if ( fJetMatchingHook )
493  {
496  }
497 
498  bool py8next = pythia->next();
499  // if (!pythia->next())
500  if (!py8next)
501  {
503  event().reset();
504  return false;
505  }
506 
507  // update LHE matching statistics
508  //
510 
511  event().reset(new HepMC::GenEvent);
512  toHepMC.fill_next_event(*pythiaEvent, event().get());
513 
514  return true;
515 }
516 
517 
519 {
520  return true;
521 }
522 
523 
525 {
526 
527  int NPartsBeforeDecays = pythiaEvent->size();
528  int NPartsAfterDecays = event().get()->particles_size();
529  int NewBarcode = NPartsAfterDecays;
530 
531  for ( int ipart=NPartsAfterDecays; ipart>NPartsBeforeDecays; ipart-- )
532  {
533 
534  HepMC::GenParticle* part = event().get()->barcode_to_particle( ipart );
535 
536  if ( part->status() == 1 )
537  {
538  decayer->event.reset();
539  Particle py8part( part->pdg_id(), 93, 0, 0, 0, 0, 0, 0,
540  part->momentum().x(),
541  part->momentum().y(),
542  part->momentum().z(),
543  part->momentum().t(),
544  part->generated_mass() );
545  HepMC::GenVertex* ProdVtx = part->production_vertex();
546  py8part.vProd( ProdVtx->position().x(), ProdVtx->position().y(),
547  ProdVtx->position().z(), ProdVtx->position().t() );
548  py8part.tau( (decayer->particleData).tau0( part->pdg_id() ) );
549  decayer->event.append( py8part );
550  int nentries = decayer->event.size();
551  if ( !decayer->event[nentries-1].mayDecay() ) continue;
552  decayer->next();
553  int nentries1 = decayer->event.size();
554  // --> decayer->event.list(std::cout);
555  if ( nentries1 <= nentries ) continue; //same number of particles, no decays...
556 
557  part->set_status(2);
558 
559  Particle& py8daughter = decayer->event[nentries]; // the 1st daughter
560  HepMC::GenVertex* DecVtx = new HepMC::GenVertex( HepMC::FourVector(py8daughter.xProd(),
561  py8daughter.yProd(),
562  py8daughter.zProd(),
563  py8daughter.tProd()) );
564 
565  DecVtx->add_particle_in( part ); // this will cleanup end_vertex if exists, replace with the new one
566  // I presume (vtx) barcode will be given automatically
567 
568  HepMC::FourVector pmom( py8daughter.px(), py8daughter.py(), py8daughter.pz(), py8daughter.e() );
569 
570  HepMC::GenParticle* daughter =
571  new HepMC::GenParticle( pmom, py8daughter.id(), 1 );
572 
573  NewBarcode++;
574  daughter->suggest_barcode( NewBarcode );
575  DecVtx->add_particle_out( daughter );
576 
577  for ( int ipart1=nentries+1; ipart<nentries1; ipart++ )
578  {
579  py8daughter = decayer->event[ipart1];
580  HepMC::FourVector pmomN( py8daughter.px(), py8daughter.py(), py8daughter.pz(), py8daughter.e() );
581  HepMC::GenParticle* daughterN =
582  new HepMC::GenParticle( pmomN, py8daughter.id(), 1 );
583  NewBarcode++;
584  daughterN->suggest_barcode( NewBarcode );
585  DecVtx->add_particle_out( daughterN );
586  }
587 
588  event().get()->add_vertex( DecVtx );
589 
590  }
591  }
592 
593  return true;
594 }
595 
596 
598 {
599  bool lhe = lheEvent() != 0;
600 
601  event()->set_signal_process_id(pythia->info.code());
602  event()->set_event_scale(pythia->info.pTHat()); //FIXME
603 
604  //cout.precision(10);
605  //cout << " pt = " << pythia->info.pTHat() << " weights = "
606  // << pythia->info.weight() << " "
607  // << fReweightUserHook->biasedSelectionWeight() << endl;
608 
609  if (event()->alphaQED() <= 0)
610  event()->set_alphaQED( pythia->info.alphaEM() );
611  if (event()->alphaQCD() <= 0)
612  event()->set_alphaQCD( pythia->info.alphaS() );
613 
614  HepMC::GenCrossSection xsec;
615  xsec.set_cross_section( pythia->info.sigmaGen() * 1e9,
616  pythia->info.sigmaErr() * 1e9);
617  event()->set_cross_section(xsec);
618 
619  // Putting pdf info into the HepMC record
620  // There is the overloaded pythia8 HepMCInterface method fill_next_event
621  // that does this, but CMSSW GeneratorInterface does not fill HepMC
622  // record according to the HepMC convention (stores f(x) instead of x*f(x)
623  // and converts gluon PDG ID to zero). For this reason we use the
624  // method fill_next_event (above) that does NOT this and fill pdf info here
625  //
626  int id1 = pythia->info.id1();
627  int id2 = pythia->info.id2();
628  if (id1 == 21) id1 = 0;
629  if (id2 == 21) id2 = 0;
630  double x1 = pythia->info.x1();
631  double x2 = pythia->info.x2();
632  //double Q = pythia->info.QRen();
633  double Q = pythia->info.QFac();
634  double pdf1 = pythia->info.pdf1() / pythia->info.x1();
635  double pdf2 = pythia->info.pdf2() / pythia->info.x2();
636  event()->set_pdf_info(HepMC::PdfInfo(id1,id2,x1,x2,Q,pdf1,pdf2));
637 
638  // Storing weights. Will be moved to pythia8 HepMCInterface
639  //
640  if (lhe && std::abs(lheRunInfo()->getHEPRUP()->IDWTUP) == 4)
641  // translate mb to pb (CMS/Gen "convention" as of May 2009)
642  event()->weights().push_back( pythia->info.weight() * 1.0e9 );
643  else
644  event()->weights().push_back( pythia->info.weight() );
645 
646  // now create the GenEventInfo product from the GenEvent and fill
647  // the missing pieces
648  eventInfo().reset( new GenEventInfoProduct( event().get() ) );
649 
650  // in pythia pthat is used to subdivide samples into different bins
651  // in LHE mode the binning is done by the external ME generator
652  // which is likely not pthat, so only filling it for Py6 internal mode
653  if (!lhe) {
654  eventInfo()->setBinningValues(std::vector<double>(1, pythia->info.pTHat()));
655  }
656 
657  //******** Verbosity ********
658 
659  if (maxEventsToPrint > 0 &&
662  if (pythiaPylistVerbosity) {
663  pythia->info.list(std::cout);
664  pythia->event.list(std::cout);
665  }
666 
667  if (pythiaHepMCVerbosity) {
668  std::cout << "Event process = "
669  << pythia->info.code() << "\n"
670  << "----------------------" << std::endl;
671  event()->print();
672  }
673  }
674 }
675 
678 
bool pythiaHepMCVerbosity
HepMC verbosity flag.
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
dictionary parameters
Definition: Parameters.py:2
double comEnergy
Center-of-Mass energy.
EmissionVetoHook1 * fEmissionVetoHook1
edm::GeneratorFilter< Pythia8Hadronizer, ExternalDecayDriver > Pythia8GeneratorFilter
UserHooks * fReweightUserHook
bool declareStableParticles(const std::vector< int > &pdgIds)
CLHEP::HepRandomEngine * randomEngine
Definition: PYR.cc:4
EmissionVetoHook * fEmissionVetoHook
std::auto_ptr< Pythia > decayer
std::auto_ptr< Pythia > pythia
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool exists(std::string const &parameterName) const
checks if a parameter exists
#define abs(x)
Definition: mlp_lapack.h:159
#define NULL
Definition: scimark2.h:8
void count(LHERunInfo::CountMode count, double weight=1.0, double matchWeight=1.0)
Definition: LHEEvent.cc:203
Double_t pdf1(double mHstar, double mHreq)
bool declareSpecialSettings(const std::vector< std::string >)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
void setInternalXSec(const XSec &xsec)
void beforeHadronization(lhef::LHEEvent *lhee)
std::auto_ptr< HepMC::GenEvent > & event()
CLHEP::HepRandomEngine & getEngineReference()
GenRunInfoProduct & runInfo()
std::auto_ptr< LHAupLesHouches > lhaUP
lhef::LHEEvent * lheEvent()
const char * classname() const
block
Formating index page&#39;s pieces.
Definition: Association.py:232
unsigned int pythiaPylistVerbosity
Pythia PYLIST Verbosity flag.
std::auto_ptr< GenEventInfoProduct > & eventInfo()
lhef::LHERunInfo * lheRunInfo()
ParameterCollector parameters
tuple out
Definition: dbtoconf.py:99
void init(lhef::LHERunInfo *runInfo)
unsigned int maxEventsToPrint
Events to print if verbosity.
JetMatchingHook * fJetMatchingHook
part
Definition: HCALResponse.h:21
string fname
main script
Pythia8Hadronizer(const edm::ParameterSet &params)
void resetMatchingStatus()
const_iterator end() const
const_iterator begin() const
tuple cout
Definition: gather_cfg.py:121
std::vector< std::string > findHeader(const std::string &tag) const
Definition: LHERunInfo.cc:390
HepMC::Pythia8ToHepMC toHepMC
tuple status
Definition: ntuplemaker.py:245
edm::HadronizerFilter< Pythia8Hadronizer, ExternalDecayDriver > Pythia8HadronizerFilter