CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
EmbeddingLHEProducer Class Reference

#include <test/EmbeddingLHEProducer/plugins/EmbeddingLHEProducer.cc>

Inheritance diagram for EmbeddingLHEProducer:
edm::one::EDProducer< edm::BeginRunProducer, edm::EndRunProducer > edm::one::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 EmbeddingLHEProducer (const edm::ParameterSet &)
 
 ~EmbeddingLHEProducer ()
 
- Public Member Functions inherited from edm::one::EDProducer< edm::BeginRunProducer, edm::EndRunProducer >
 EDProducer ()=default
 
- Public Member Functions inherited from edm::one::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducerBase ()
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, std::unordered_multimap< std::string, edm::ProductResolverIndex > const &iIndicies, std::string const &moduleLabel)
 
virtual ~ProducerBase () noexcept(false)
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
virtual ~EDConsumerBase () noexcept(false)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
- Static Public Member Functions inherited from edm::one::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 

Private Member Functions

void assign_4vector (TLorentzVector &Lepton, const pat::Muon *muon, std::string FSRmode)
 
virtual void beginJob () override
 
virtual void beginRunProduce (edm::Run &run, edm::EventSetup const &es) override
 
virtual void endJob () override
 
virtual void endRunProduce (edm::Run &, edm::EventSetup const &) override
 
void fill_lhe_from_mumu (TLorentzVector &positiveLepton, TLorentzVector &negativeLepton, lhef::HEPEUP &outlhe, CLHEP::HepRandomEngine *engine)
 
void fill_lhe_with_particle (lhef::HEPEUP &outlhe, TLorentzVector &particle, int pdgid, double spin, double ctau)
 
const reco::Candidatefind_original_muon (const reco::Candidate *muon)
 
LHERunInfoProduct::Header give_slha ()
 
void mirror (TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
 
virtual void produce (edm::Event &, const edm::EventSetup &) override
 
void rotate180 (TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
 
void transform_mumu_to_tautau (TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
 

Private Attributes

std::ofstream file
 
bool mirror_
 
edm::EDGetTokenT< edm::View< pat::Muon > > muonsCollection_
 
bool rotate180_
 
std::string studyFSRmode_
 
bool switchToMuonEmbedding_
 
const double tauMass_ = 1.77682
 
edm::EDGetTokenT< reco::VertexCollectionvertexCollection_
 
bool write_lheout
 

Additional Inherited Members

- Public Types inherited from edm::one::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Description: [one line class summary]

Implementation: [Notes on implementation]

Definition at line 73 of file EmbeddingLHEProducer.cc.

Constructor & Destructor Documentation

EmbeddingLHEProducer::EmbeddingLHEProducer ( const edm::ParameterSet iConfig)
explicit

Definition at line 118 of file EmbeddingLHEProducer.cc.

References Exception, FrontierConditions_GlobalTag_cff::file, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), edm::Service< T >::isAvailable(), MillePedeFileConverter_cfg::out, AlCaHLTBitMon_QueryRunRegistry::string, and estimatePileup_makeJSON::trunc.

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 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool isAvailable() const
Definition: Service.h:46
edm::EDGetTokenT< edm::View< pat::Muon > > muonsCollection_
edm::EDGetTokenT< reco::VertexCollection > vertexCollection_
EmbeddingLHEProducer::~EmbeddingLHEProducer ( )

Definition at line 153 of file EmbeddingLHEProducer.cc.

154 {
155 }

Member Function Documentation

void EmbeddingLHEProducer::assign_4vector ( TLorentzVector &  Lepton,
const pat::Muon muon,
std::string  FSRmode 
)
private

Definition at line 392 of file EmbeddingLHEProducer.cc.

References pat::PATObject< ObjectType >::genParticle(), reco::Candidate::p4(), and reco::LeafCandidate::p4().

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 }
const reco::GenParticle * genParticle(size_t idx=0) const
Definition: PATObject.h:244
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
const reco::Candidate * find_original_muon(const reco::Candidate *muon)
Definition: Lepton.py:1
virtual const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:99
void EmbeddingLHEProducer::beginJob ( void  )
overrideprivatevirtual

Reimplemented from edm::one::EDProducerBase.

Definition at line 222 of file EmbeddingLHEProducer.cc.

223 {
224 }
void EmbeddingLHEProducer::beginRunProduce ( edm::Run run,
edm::EventSetup const &  es 
)
overrideprivatevirtual

Definition at line 234 of file EmbeddingLHEProducer.cc.

References popcon2dropbox::copy(), FrontierConditions_GlobalTag_cff::file, lhef::HEPRUP::IDWTUP, lhef::HEPRUP::LPRUP, eostools::move(), edm::Run::put(), lhef::HEPRUP::resize(), lhef::HEPRUP::XERRUP, lhef::HEPRUP::XMAXUP, and lhef::HEPRUP::XSECUP.

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 }
void resize(int nrup)
Definition: LesHouches.h:52
LHERunInfoProduct::Header give_slha()
std::vector< double > XERRUP
Definition: LesHouches.h:114
std::vector< double > XMAXUP
Definition: LesHouches.h:119
void put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Run.h:111
std::vector< double > XSECUP
Definition: LesHouches.h:108
def move(src, dest)
Definition: eostools.py:510
std::vector< int > LPRUP
Definition: LesHouches.h:124
void EmbeddingLHEProducer::endJob ( void  )
overrideprivatevirtual

Reimplemented from edm::one::EDProducerBase.

Definition at line 228 of file EmbeddingLHEProducer.cc.

228  {
229 }
void EmbeddingLHEProducer::endRunProduce ( edm::Run run,
edm::EventSetup const &  es 
)
overrideprivatevirtual

Definition at line 282 of file EmbeddingLHEProducer.cc.

References LHERunInfoProduct::endOfFile(), and FrontierConditions_GlobalTag_cff::file.

283 {
284  if (write_lheout) {
286  file.close();
287  }
288 }
static const std::string & endOfFile()
void EmbeddingLHEProducer::fill_lhe_from_mumu ( TLorentzVector &  positiveLepton,
TLorentzVector &  negativeLepton,
lhef::HEPEUP outlhe,
CLHEP::HepRandomEngine *  engine 
)
private

Definition at line 291 of file EmbeddingLHEProducer.cc.

References DOFs::Z.

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 }
void fill_lhe_with_particle(lhef::HEPEUP &outlhe, TLorentzVector &particle, int pdgid, double spin, double ctau)
void EmbeddingLHEProducer::fill_lhe_with_particle ( lhef::HEPEUP outlhe,
TLorentzVector &  particle,
int  pdgid,
double  spin,
double  ctau 
)
private

Definition at line 311 of file EmbeddingLHEProducer.cc.

References funct::abs(), lhef::HEPEUP::ICOLUP, lhef::HEPEUP::IDUP, lhef::HEPEUP::ISTUP, lhef::HEPEUP::MOTHUP, lhef::HEPEUP::NUP, BPhysicsValidation_cfi::pdgid, lhef::HEPEUP::PUP, lhef::HEPEUP::resize(), spin(), lhef::HEPEUP::SPINUP, and lhef::HEPEUP::VTIMUP.

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 }
std::vector< double > VTIMUP
Definition: LesHouches.h:254
std::vector< std::pair< int, int > > MOTHUP
Definition: LesHouches.h:236
void resize(int nup)
Definition: LesHouches.h:161
std::vector< FiveVector > PUP
Definition: LesHouches.h:248
std::vector< double > SPINUP
Definition: LesHouches.h:261
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< int > ISTUP
Definition: LesHouches.h:230
std::vector< int > IDUP
Definition: LesHouches.h:225
std::vector< std::pair< int, int > > ICOLUP
Definition: LesHouches.h:242
float spin(float ph)
void EmbeddingLHEProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 570 of file EmbeddingLHEProducer.cc.

References edm::ConfigurationDescriptions::addDefault(), DEFINE_FWK_MODULE, and edm::ParameterSetDescription::setUnknown().

570  {
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 }
void addDefault(ParameterSetDescription const &psetDescription)
const reco::Candidate * EmbeddingLHEProducer::find_original_muon ( const reco::Candidate muon)
private

Definition at line 411 of file EmbeddingLHEProducer.cc.

References reco::Candidate::mother(), metsig::muon, and reco::Candidate::pdgId().

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 }
virtual const Candidate * mother(size_type i=0) const =0
return pointer to mother
virtual int pdgId() const =0
PDG identifier.
const reco::Candidate * find_original_muon(const reco::Candidate *muon)
LHERunInfoProduct::Header EmbeddingLHEProducer::give_slha ( )
private

Definition at line 473 of file EmbeddingLHEProducer.cc.

References LHERunInfoProduct::Header::addLine().

473  {
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 }
void EmbeddingLHEProducer::mirror ( TLorentzVector &  positiveLepton,
TLorentzVector &  negativeLepton 
)
private

Definition at line 446 of file EmbeddingLHEProducer.cc.

References DOFs::Z.

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 }
void EmbeddingLHEProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivatevirtual

Definition at line 164 of file EmbeddingLHEProducer.cc.

References lhef::HEPEUP::AQCDUP, lhef::HEPEUP::AQEDUP, edm::View< T >::begin(), popcon2dropbox::copy(), edm::View< T >::end(), FrontierConditions_GlobalTag_cff::file, edm::Event::getByToken(), edm::RandomNumberGenerator::getEngine(), lhef::HEPEUP::IDPRUP, EmbeddingLHEProducer_cfi::mirror, eostools::move(), metsig::muon, edm::Event::put(), EmbeddingLHEProducer_cfi::rotate180, lhef::HEPEUP::SCALUP, edm::Event::streamID(), and lhef::HEPEUP::XWGTUP.

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 }
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
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
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
void transform_mumu_to_tautau(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
const_iterator begin() const
void assign_4vector(TLorentzVector &Lepton, const pat::Muon *muon, std::string FSRmode)
double AQCDUP
Definition: LesHouches.h:220
void rotate180(TLorentzVector &positiveLepton, TLorentzVector &negativeLepton)
edm::EDGetTokenT< edm::View< pat::Muon > > muonsCollection_
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_
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)
double XWGTUP
Definition: LesHouches.h:196
def move(src, dest)
Definition: eostools.py:510
double SCALUP
Definition: LesHouches.h:210
void EmbeddingLHEProducer::rotate180 ( TLorentzVector &  positiveLepton,
TLorentzVector &  negativeLepton 
)
private

Definition at line 418 of file EmbeddingLHEProducer.cc.

References DOFs::Z.

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 }
void EmbeddingLHEProducer::transform_mumu_to_tautau ( TLorentzVector &  positiveLepton,
TLorentzVector &  negativeLepton 
)
private

Definition at line 356 of file EmbeddingLHEProducer.cc.

References Scenarios_cff::scale, mathSSE::sqrt(), and DOFs::Z.

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 }
T sqrt(T t)
Definition: SSEVec.h:18

Member Data Documentation

std::ofstream EmbeddingLHEProducer::file
private

Definition at line 106 of file EmbeddingLHEProducer.cc.

bool EmbeddingLHEProducer::mirror_
private

Definition at line 103 of file EmbeddingLHEProducer.cc.

edm::EDGetTokenT<edm::View<pat::Muon> > EmbeddingLHEProducer::muonsCollection_
private

Definition at line 100 of file EmbeddingLHEProducer.cc.

bool EmbeddingLHEProducer::rotate180_
private

Definition at line 103 of file EmbeddingLHEProducer.cc.

std::string EmbeddingLHEProducer::studyFSRmode_
private

Definition at line 112 of file EmbeddingLHEProducer.cc.

bool EmbeddingLHEProducer::switchToMuonEmbedding_
private

Definition at line 102 of file EmbeddingLHEProducer.cc.

const double EmbeddingLHEProducer::tauMass_ = 1.77682
private

Definition at line 104 of file EmbeddingLHEProducer.cc.

edm::EDGetTokenT<reco::VertexCollection> EmbeddingLHEProducer::vertexCollection_
private

Definition at line 101 of file EmbeddingLHEProducer.cc.

bool EmbeddingLHEProducer::write_lheout
private

Definition at line 107 of file EmbeddingLHEProducer.cc.