CMS 3D CMS Logo

EmbeddingLHEProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: test/EmbeddingLHEProducer
4 // Class: EmbeddingLHEProducer
5 //
13 //
14 // Original Author: Stefan Wayand
15 // Created: Wed, 13 Jan 2016 08:15:01 GMT
16 //
17 //
18 
19 
20 // system include files
21 #include <algorithm>
22 #include <iostream>
23 #include <iterator>
24 #include <fstream>
25 #include <string>
26 #include <memory>
27 #include "TLorentzVector.h"
28 
29 // user include files
32 
36 
38 
43 
49 
53 
58 #include "CLHEP/Random/RandExponential.h"
59 
60 
61 
62 //
63 // class declaration
64 //
65 
66 namespace CLHEP{
67  class HepRandomEngine;
68 }
69 
70 
71 
72 
73 class EmbeddingLHEProducer : public edm::one::EDProducer<edm::BeginRunProducer,
74  edm::EndRunProducer> {
75  public:
76  explicit EmbeddingLHEProducer(const edm::ParameterSet&);
78 
79  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
80 
81  private:
82  virtual void beginJob() override;
83  virtual void produce(edm::Event&, const edm::EventSetup&) override;
84  virtual void endJob() override;
85 
86  virtual void beginRunProduce(edm::Run& run, edm::EventSetup const& es) override;
87  virtual void endRunProduce(edm::Run&, edm::EventSetup const&) override;
88 
89  void fill_lhe_from_mumu(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton, lhef::HEPEUP &outlhe, CLHEP::HepRandomEngine* engine);
90  void fill_lhe_with_particle(lhef::HEPEUP &outlhe, TLorentzVector &particle, int pdgid, double spin, double ctau);
91 
92  void transform_mumu_to_tautau(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton);
93  const reco::Candidate* find_original_muon(const reco::Candidate* muon);
94  void assign_4vector(TLorentzVector &Lepton, const pat::Muon* muon, std::string FSRmode);
95  void mirror(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton);
96  void rotate180(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton);
97 
98  LHERunInfoProduct::Header give_slha();
99 
103  bool mirror_,rotate180_;
104  const double tauMass_ = 1.77682;
105 
106  std::ofstream file;
108 
109  // instead of reconstruted 4vectors of muons generated are taken to study FSR. Possible modes:
110  // afterFSR - muons without FSR photons taken into account
111  // beforeFSR - muons with FSR photons taken into account
113 };
114 
115 //
116 // constructors and destructor
117 //
119 {
120  //register your products
121  produces<LHEEventProduct>();
122  produces<LHERunInfoProduct, edm::Transition::EndRun>();
123  produces<math::XYZTLorentzVectorD>("vertexPosition");
124 
125  muonsCollection_ = consumes<edm::View<pat::Muon>>(iConfig.getParameter<edm::InputTag>("src"));
126  vertexCollection_ = consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"));
127  switchToMuonEmbedding_ = iConfig.getParameter<bool>("switchToMuonEmbedding");
128  mirror_ = iConfig.getParameter<bool>("mirror");
129  rotate180_ = iConfig.getParameter<bool>("rotate180");
130  studyFSRmode_ = iConfig.getUntrackedParameter<std::string>("studyFSRmode","");
131 
132  write_lheout=false;
133  std::string lhe_ouputfile = iConfig.getUntrackedParameter<std::string>("lhe_outputfilename","");
134  if (lhe_ouputfile !=""){
135  write_lheout=true;
136  file.open(lhe_ouputfile, std::fstream::out | std::fstream::trunc);
137  }
138 
139 
141  if ( ! rng.isAvailable()) {
142  throw cms::Exception("Configuration")
143  << "The EmbeddingLHEProducer requires the RandomNumberGeneratorService\n"
144  "which is not present in the configuration file. \n"
145  "You must add the service\n"
146  "in the configuration file or remove the modules that require it.";
147  }
148 
149 
150 }
151 
152 
154 {
155 }
156 
157 
158 //
159 // member functions
160 //
161 
162 // ------------ method called to produce the data ------------
163 void
165 {
166  using namespace edm;
167 
169  CLHEP::HepRandomEngine* engine = &rng->getEngine(iEvent.streamID());
170 
171 
173  iEvent.getByToken(muonsCollection_, muonHandle);
174  edm::View<pat::Muon> coll_muons = *muonHandle;
175 
176  Handle<std::vector<reco::Vertex>> coll_vertices;
177  iEvent.getByToken(vertexCollection_ , coll_vertices);
178 
179  TLorentzVector positiveLepton, negativeLepton;
180  bool mu_plus_found = false;
181  bool mu_minus_found = false;
182  lhef::HEPEUP hepeup;
183  hepeup.IDPRUP = 0;
184  hepeup.XWGTUP = 1;
185  hepeup.SCALUP = -1;
186  hepeup.AQEDUP = -1;
187  hepeup.AQCDUP = -1;
188  // Assuming Pt-Order
189  for (edm::View<pat::Muon>::const_iterator muon= coll_muons.begin(); muon!= coll_muons.end(); ++muon)
190  {
191  if (muon->charge() == 1 && !mu_plus_found)
192  {
193  assign_4vector(positiveLepton, &(*muon), studyFSRmode_);
194  mu_plus_found = true;
195  }
196  else if (muon->charge() == -1 && !mu_minus_found)
197  {
198  assign_4vector(negativeLepton, &(*muon), studyFSRmode_);
199  mu_minus_found = true;
200  }
201  else if (mu_minus_found && mu_plus_found) break;
202  }
203  mirror(positiveLepton,negativeLepton); // if no mirror, function does nothing.
204  rotate180(positiveLepton,negativeLepton); // if no rotate180, function does nothing
205  transform_mumu_to_tautau(positiveLepton,negativeLepton); // if MuonEmbedding, function does nothing.
206  fill_lhe_from_mumu(positiveLepton,negativeLepton,hepeup,engine);
207 
208  double originalXWGTUP_ = 1.;
209  std::unique_ptr<LHEEventProduct> product( new LHEEventProduct(hepeup,originalXWGTUP_) );
210 
211  if (write_lheout) std::copy(product->begin(), product->end(), std::ostream_iterator<std::string>(file));
212 
213  iEvent.put(std::move(product));
214  // Saving vertex position
215  std::unique_ptr<math::XYZTLorentzVectorD> vertex_position (new math::XYZTLorentzVectorD(coll_vertices->at(0).x(),coll_vertices->at(0).y(),coll_vertices->at(0).z(),0.0));
216  iEvent.put(std::move(vertex_position), "vertexPosition");
217 
218 }
219 
220 // ------------ method called once each job just before starting event loop ------------
221 void
223 {
224 }
225 
226 // ------------ method called once each job just after ending the event loop ------------
227 void
229 }
230 
231 // ------------ method called when starting to processes a run ------------
232 
233 void
235 {
236  // fill HEPRUP common block and store in edm::Run
237  lhef::HEPRUP heprup;
238 
239  // set number of processes: 1 for Z to tau tau
240  heprup.resize(1);
241 
242  //Process independent information
243 
244  //beam particles ID (two protons)
245  //heprup.IDBMUP.first = 2212;
246  //heprup.IDBMUP.second = 2212;
247 
248  //beam particles energies (both 6.5 GeV)
249  //heprup.EBMUP.first = 6500.;
250  //heprup.EBMUP.second = 6500.;
251 
252  //take default pdf group for both beamparticles
253  //heprup.PDFGUP.first = -1;
254  //heprup.PDFGUP.second = -1;
255 
256  //take certan pdf set ID (same as in officially produced DYJets LHE files)
257  //heprup.PDFSUP.first = -1;
258  //heprup.PDFSUP.second = -1;
259 
260  //master switch for event weight iterpretation (same as in officially produced DYJets LHE files)
261  heprup.IDWTUP = 3;
262 
263  //Information for first process (Z to tau tau), for now only placeholder:
264  heprup.XSECUP[0] = 1.;
265  heprup.XERRUP[0] = 0;
266  heprup.XMAXUP[0] = 1;
267  heprup.LPRUP[0]= 1;
268 
269 
270  std::unique_ptr<LHERunInfoProduct> runInfo(new LHERunInfoProduct(heprup));
271  runInfo->addHeader(give_slha());
272 
273 
274  if (write_lheout)std::copy(runInfo->begin(), runInfo->end(),std::ostream_iterator<std::string>(file));
275  run.put(std::move(runInfo));
276 
277 
278 }
279 
280 
281 void
283 {
284  if (write_lheout) {
286  file.close();
287  }
288 }
289 
290 void
291 EmbeddingLHEProducer::fill_lhe_from_mumu(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton, lhef::HEPEUP &outlhe, CLHEP::HepRandomEngine* engine)
292 {
293 
294  TLorentzVector Z = positiveLepton + negativeLepton;
295  int leptonPDGID = switchToMuonEmbedding_ ? 13 : 15;
296 
297  // double tau_ctau = 0.00871100; //cm
298  double tau_ctau0 = 8.71100e-02; // mm (for Pythia)
299  double tau_ctau_p = tau_ctau0 * CLHEP::RandExponential::shoot(engine); // return -std::log(HepRandom::getTheEngine()->flat());
300  // replaces tau = process[iNow].tau0() * rndmPtr->exp(); from pythia8212/src/ProcessContainer.cc which is not initialized for ProcessLevel:all = off mode (no beam particle mode)
301  double tau_ctau_n = tau_ctau0 * CLHEP::RandExponential::shoot(engine);
302  //std::cout<<"tau_ctau P: "<<tau_ctau_p<<" tau_ctau N: "<<tau_ctau_n<<std::endl;
303 
304  fill_lhe_with_particle(outlhe, Z,23,9.0, 0);
305  fill_lhe_with_particle(outlhe, positiveLepton,-leptonPDGID,1.0, tau_ctau_p);
306  fill_lhe_with_particle(outlhe, negativeLepton,leptonPDGID,-1.0, tau_ctau_n);
307 
308  return;
309 }
310 
311 void EmbeddingLHEProducer::fill_lhe_with_particle(lhef::HEPEUP &outlhe, TLorentzVector &particle, int pdgid, double spin, double ctau)
312 {
313  // Pay attention to different index conventions:
314  // 'particleindex' follows usual C++ index conventions starting at 0 for a list.
315  // 'motherindex' follows the LHE index conventions: 0 is for 'not defined', so the listing starts at 1.
316  // That means: LHE index 1 == C++ index 0.
317  int particleindex = outlhe.NUP;
318  outlhe.resize(outlhe.NUP+1);
319 
320  outlhe.PUP[particleindex][0] = particle.Px();
321  outlhe.PUP[particleindex][1] = particle.Py();
322  outlhe.PUP[particleindex][2] = particle.Pz();
323  outlhe.PUP[particleindex][3] = particle.E();
324  outlhe.PUP[particleindex][4] = particle.M();
325  outlhe.IDUP[particleindex] = pdgid;
326  outlhe.SPINUP[particleindex] = spin;
327  outlhe.VTIMUP[particleindex] = ctau;
328 
329  outlhe.ICOLUP[particleindex].first = 0;
330  outlhe.ICOLUP[particleindex].second = 0;
331 
332 
333  if (std::abs(pdgid) == 23){
334  outlhe.MOTHUP[particleindex].first = 0; // No Mother
335  outlhe.MOTHUP[particleindex].second = 0;
336  outlhe.ISTUP[particleindex] = 2; // status
337 
338  }
339 
340  if (std::abs(pdgid) == 15){
341  outlhe.MOTHUP[particleindex].first = 1; // Mother is the Z (first partile)
342  outlhe.MOTHUP[particleindex].second = 1; // Mother is the Z (first partile)
343 
344  outlhe.ISTUP[particleindex] = 1;//status
345 
346  }
347 
348 
349 
350  return;
351 }
352 
353 
354 
355 
356 void EmbeddingLHEProducer::transform_mumu_to_tautau(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
357 {
358  // No corrections applied for muon embedding
359  if (switchToMuonEmbedding_) return;
360 
361  TLorentzVector Z = positiveLepton + negativeLepton;
362 
363  TVector3 boost_from_Z_to_LAB = Z.BoostVector();
364  TVector3 boost_from_LAB_to_Z = -Z.BoostVector();
365 
366  // Boosting the two leptons to Z restframe, then both are back to back. This means, same 3-momentum squared
367  positiveLepton.Boost(boost_from_LAB_to_Z);
368  negativeLepton.Boost(boost_from_LAB_to_Z);
369 
370  // Energy of tau = 0.5*Z-mass
371  double tau_mass_squared = tauMass_*tauMass_;
372  double tau_energy_squared = 0.25*Z.M2();
373  double tau_3momentum_squared = tau_energy_squared - tau_mass_squared;
374  if (tau_3momentum_squared < 0)
375  {
376  edm::LogWarning("TauEmbedding") << "3-Momentum squared is negative";
377  return;
378  }
379 
380  //Computing scale, applying it on the 3-momenta and building new 4 momenta of the taus
381  double scale = std::sqrt(tau_3momentum_squared/positiveLepton.Vect().Mag2());
382  positiveLepton.SetPxPyPzE(scale*positiveLepton.Px(),scale*positiveLepton.Py(),scale*positiveLepton.Pz(),std::sqrt(tau_energy_squared));
383  negativeLepton.SetPxPyPzE(scale*negativeLepton.Px(),scale*negativeLepton.Py(),scale*negativeLepton.Pz(),std::sqrt(tau_energy_squared));
384 
385  //Boosting the new taus back to LAB frame
386  positiveLepton.Boost(boost_from_Z_to_LAB);
387  negativeLepton.Boost(boost_from_Z_to_LAB);
388 
389  return;
390 }
391 
393 {
394  if("afterFSR" == FSRmode && muon->genParticle() != 0)
395  {
396  const reco::GenParticle* afterFSRMuon = muon->genParticle();
397  Lepton.SetPxPyPzE(afterFSRMuon->p4().px(),afterFSRMuon->p4().py(),afterFSRMuon->p4().pz(), afterFSRMuon->p4().e());
398  }
399  else if ("beforeFSR" == FSRmode && muon->genParticle() != 0)
400  {
401  const reco::Candidate* beforeFSRMuon = find_original_muon(muon->genParticle());
402  Lepton.SetPxPyPzE(beforeFSRMuon->p4().px(),beforeFSRMuon->p4().py(),beforeFSRMuon->p4().pz(), beforeFSRMuon->p4().e());
403  }
404  else
405  {
406  Lepton.SetPxPyPzE(muon->p4().px(),muon->p4().py(),muon->p4().pz(), muon->p4().e());
407  }
408  return;
409 }
410 
412 {
413  if(muon->mother(0) == 0) return muon;
414  if(muon->pdgId() == muon->mother(0)->pdgId()) return find_original_muon(muon->mother(0));
415  else return muon;
416 }
417 
418 void EmbeddingLHEProducer::rotate180(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
419 {
420  if (!rotate180_) return;
421  edm::LogInfo("TauEmbedding") << "Applying 180<C2><B0> rotation" ;
422  // By construction, the 3-momenta of mu-, mu+ and Z are in one plane.
423  // That means, one vector for perpendicular projection can be used for both leptons.
424  TLorentzVector Z = positiveLepton + negativeLepton;
425 
426  edm::LogInfo("TauEmbedding") << "MuMinus before. Pt: " << negativeLepton.Pt() << " Eta: " << negativeLepton.Eta() << " Phi: " << negativeLepton.Phi() << " Mass: " << negativeLepton.M();
427 
428  TVector3 Z3 = Z.Vect();
429  TVector3 positiveLepton3 = positiveLepton.Vect();
430  TVector3 negativeLepton3 = negativeLepton.Vect();
431 
432  TVector3 p3_perp = positiveLepton3 - positiveLepton3.Dot(Z3)/Z3.Dot(Z3)*Z3;
433  p3_perp = p3_perp.Unit();
434 
435  positiveLepton3 -= 2*positiveLepton3.Dot(p3_perp)*p3_perp;
436  negativeLepton3 -= 2*negativeLepton3.Dot(p3_perp)*p3_perp;
437 
438  positiveLepton.SetVect(positiveLepton3);
439  negativeLepton.SetVect(negativeLepton3);
440 
441  edm::LogInfo("TauEmbedding") << "MuMinus after. Pt: " << negativeLepton.Pt() << " Eta: " << negativeLepton.Eta() << " Phi: " << negativeLepton.Phi() << " Mass: " << negativeLepton.M();
442 
443  return;
444 }
445 
446 void EmbeddingLHEProducer::mirror(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
447 {
448  if(!mirror_) return;
449  edm::LogInfo("TauEmbedding")<< "Applying mirroring" ;
450  TLorentzVector Z = positiveLepton + negativeLepton;
451 
452  edm::LogInfo("TauEmbedding") << "MuMinus before. Pt: " << negativeLepton.Pt() << " Eta: " << negativeLepton.Eta() << " Phi: " << negativeLepton.Phi() << " Mass: " << negativeLepton.M() ;
453 
454  TVector3 Z3 = Z.Vect();
455  TVector3 positiveLepton3 = positiveLepton.Vect();
456  TVector3 negativeLepton3 = negativeLepton.Vect();
457 
458  TVector3 beam(0.,0.,1.);
459  TVector3 perpToZandBeam = Z3.Cross(beam).Unit();
460 
461  positiveLepton3 -= 2*positiveLepton3.Dot(perpToZandBeam)*perpToZandBeam;
462  negativeLepton3 -= 2*negativeLepton3.Dot(perpToZandBeam)*perpToZandBeam;
463 
464  positiveLepton.SetVect(positiveLepton3);
465  negativeLepton.SetVect(negativeLepton3);
466 
467  edm::LogInfo("TauEmbedding") << "MuMinus after. Pt: " << negativeLepton.Pt() << " Eta: " << negativeLepton.Eta() << " Phi: " << negativeLepton.Phi() << " Mass: " << negativeLepton.M() ;
468 
469  return;
470 }
471 
472 
474  LHERunInfoProduct::Header slhah("slha");
475 
476  slhah.addLine("######################################################################\n");
477  slhah.addLine("## PARAM_CARD AUTOMATICALY GENERATED BY MG5 FOLLOWING UFO MODEL ####\n");
478  slhah.addLine("######################################################################\n");
479  slhah.addLine("## ##\n");
480  slhah.addLine("## Width set on Auto will be computed following the information ##\n");
481  slhah.addLine("## present in the decay.py files of the model. ##\n");
482  slhah.addLine("## See arXiv:1402.1178 for more details. ##\n");
483  slhah.addLine("## ##\n");
484  slhah.addLine("######################################################################\n");
485  slhah.addLine("\n");
486  slhah.addLine("###################################\n");
487  slhah.addLine("## INFORMATION FOR MASS\n");
488  slhah.addLine("###################################\n");
489  slhah.addLine("Block mass \n");
490  slhah.addLine(" 6 1.730000e+02 # MT \n");
491  slhah.addLine(" 15 1.777000e+00 # MTA \n");
492  slhah.addLine(" 23 9.118800e+01 # MZ \n");
493  slhah.addLine(" 25 1.250000e+02 # MH \n");
494  slhah.addLine("## Dependent parameters, given by model restrictions.\n");
495  slhah.addLine("## Those values should be edited following the \n");
496  slhah.addLine("## analytical expression. MG5 ignores those values \n");
497  slhah.addLine("## but they are important for interfacing the output of MG5\n");
498  slhah.addLine("## to external program such as Pythia.\n");
499  slhah.addLine(" 1 0.000000 # d : 0.0 \n");
500  slhah.addLine(" 2 0.000000 # u : 0.0 \n");
501  slhah.addLine(" 3 0.000000 # s : 0.0 \n");
502  slhah.addLine(" 4 0.000000 # c : 0.0 \n");
503  slhah.addLine(" 5 0.000000 # b : 0.0 \n");
504  slhah.addLine(" 11 0.000000 # e- : 0.0 \n");
505  slhah.addLine(" 12 0.000000 # ve : 0.0 \n");
506  slhah.addLine(" 13 0.000000 # mu- : 0.0 \n");
507  slhah.addLine(" 14 0.000000 # vm : 0.0 \n");
508  slhah.addLine(" 16 0.000000 # vt : 0.0 \n");
509  slhah.addLine(" 21 0.000000 # g : 0.0 \n");
510  slhah.addLine(" 22 0.000000 # a : 0.0 \n");
511  slhah.addLine(" 24 80.419002 # w+ : cmath.sqrt(MZ__exp__2/2. + cmath.sqrt(MZ__exp__4/4. - (aEW*cmath.pi*MZ__exp__2)/(Gf*sqrt__2))) \n");
512  slhah.addLine("\n");
513  slhah.addLine("###################################\n");
514  slhah.addLine("## INFORMATION FOR SMINPUTS\n");
515  slhah.addLine("###################################\n");
516  slhah.addLine("Block sminputs \n");
517  slhah.addLine(" 1 1.325070e+02 # aEWM1 \n");
518  slhah.addLine(" 2 1.166390e-05 # Gf \n");
519  slhah.addLine(" 3 1.180000e-01 # aS \n");
520  slhah.addLine("\n");
521  slhah.addLine("###################################\n");
522  slhah.addLine("## INFORMATION FOR WOLFENSTEIN\n");
523  slhah.addLine("###################################\n");
524  slhah.addLine("Block wolfenstein \n");
525  slhah.addLine(" 1 2.253000e-01 # lamWS \n");
526  slhah.addLine(" 2 8.080000e-01 # AWS \n");
527  slhah.addLine(" 3 1.320000e-01 # rhoWS \n");
528  slhah.addLine(" 4 3.410000e-01 # etaWS \n");
529  slhah.addLine("\n");
530  slhah.addLine("###################################\n");
531  slhah.addLine("## INFORMATION FOR YUKAWA\n");
532  slhah.addLine("###################################\n");
533  slhah.addLine("Block yukawa \n");
534  slhah.addLine(" 6 1.730000e+02 # ymt \n");
535  slhah.addLine(" 15 1.777000e+00 # ymtau \n");
536  slhah.addLine("\n");
537  slhah.addLine("###################################\n");
538  slhah.addLine("## INFORMATION FOR DECAY\n");
539  slhah.addLine("###################################\n");
540  slhah.addLine("DECAY 6 1.491500e+00 # WT \n");
541  slhah.addLine("DECAY 15 2.270000e-12 # WTau \n");
542  slhah.addLine("DECAY 23 2.441404e+00 # WZ \n");
543  slhah.addLine("DECAY 24 2.047600e+00 # WW \n");
544  slhah.addLine("DECAY 25 6.382339e-03 # WH \n");
545  slhah.addLine("## Dependent parameters, given by model restrictions.\n");
546  slhah.addLine("## Those values should be edited following the \n");
547  slhah.addLine("## analytical expression. MG5 ignores those values \n");
548  slhah.addLine("## but they are important for interfacing the output of MG5\n");
549  slhah.addLine("## to external program such as Pythia.\n");
550  slhah.addLine("DECAY 1 0.000000 # d : 0.0 \n");
551  slhah.addLine("DECAY 2 0.000000 # u : 0.0 \n");
552  slhah.addLine("DECAY 3 0.000000 # s : 0.0 \n");
553  slhah.addLine("DECAY 4 0.000000 # c : 0.0 \n");
554  slhah.addLine("DECAY 5 0.000000 # b : 0.0 \n");
555  slhah.addLine("DECAY 11 0.000000 # e- : 0.0 \n");
556  slhah.addLine("DECAY 12 0.000000 # ve : 0.0 \n");
557  slhah.addLine("DECAY 13 0.000000 # mu- : 0.0 \n");
558  slhah.addLine("DECAY 14 0.000000 # vm : 0.0 \n");
559  slhah.addLine("DECAY 16 0.000000 # vt : 0.0 \n");
560  slhah.addLine("DECAY 21 0.000000 # g : 0.0 \n");
561  slhah.addLine("DECAY 22 0.000000 # a : 0.0\n");
562 
563  return slhah;
564 }
565 
566 
567 
568 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
569 void
571  //The following says we do not know what parameters are allowed so do no validation
572  // Please change this to state exactly what you do use, even if it is no parameters
574  desc.setUnknown();
575  descriptions.addDefault(desc);
576 }
577 
578 //define this as a plug-in
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
void resize(int nrup)
Definition: LesHouches.h:52
void mirror(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
const reco::GenParticle * genParticle(size_t idx=0) const
Definition: PATObject.h:244
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
virtual const Candidate * mother(size_type i=0) const =0
return pointer to mother
std::vector< double > VTIMUP
Definition: LesHouches.h:254
void transform_mumu_to_tautau(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
virtual void beginJob() override
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
void beginJob()
Definition: Breakpoints.cc:15
void fill_lhe_with_particle(lhef::HEPEUP &outlhe, TLorentzVector &particle, int pdgid, double spin, double ctau)
virtual void beginRunProduce(edm::Run &run, edm::EventSetup const &es) override
LHERunInfoProduct::Header give_slha()
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< std::pair< int, int > > MOTHUP
Definition: LesHouches.h:236
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
const_iterator begin() const
virtual void endJob() override
void resize(int nup)
Definition: LesHouches.h:161
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
virtual int pdgId() const =0
PDG identifier.
void assign_4vector(TLorentzVector &Lepton, const pat::Muon *muon, std::string FSRmode)
T sqrt(T t)
Definition: SSEVec.h:18
std::vector< FiveVector > PUP
Definition: LesHouches.h:248
std::vector< double > SPINUP
Definition: LesHouches.h:261
void addLine(const std::string &line)
bool isAvailable() const
Definition: Service.h:46
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< int > ISTUP
Definition: LesHouches.h:230
virtual void endRunProduce(edm::Run &, edm::EventSetup const &) override
std::vector< int > IDUP
Definition: LesHouches.h:225
std::vector< double > XERRUP
Definition: LesHouches.h:114
std::vector< double > XMAXUP
Definition: LesHouches.h:119
double AQCDUP
Definition: LesHouches.h:220
void put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Run.h:111
void rotate180(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
edm::EDGetTokenT< edm::View< pat::Muon > > muonsCollection_
virtual void produce(edm::Event &, const edm::EventSetup &) override
const reco::Candidate * find_original_muon(const reco::Candidate *muon)
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
StreamID streamID() const
Definition: Event.h:81
edm::EDGetTokenT< reco::VertexCollection > vertexCollection_
static const std::string & endOfFile()
double AQEDUP
Definition: LesHouches.h:215
const_iterator end() const
void fill_lhe_from_mumu(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton, lhef::HEPEUP &outlhe, CLHEP::HepRandomEngine *engine)
Definition: Lepton.py:1
std::vector< double > XSECUP
Definition: LesHouches.h:108
virtual const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:99
double XWGTUP
Definition: LesHouches.h:196
Analysis-level muon class.
Definition: Muon.h:49
std::vector< std::pair< int, int > > ICOLUP
Definition: LesHouches.h:242
def move(src, dest)
Definition: eostools.py:510
float spin(float ph)
Definition: Run.h:42
EmbeddingLHEProducer(const edm::ParameterSet &)
std::vector< int > LPRUP
Definition: LesHouches.h:124
double SCALUP
Definition: LesHouches.h:210