CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
GenParticles2HepMCConverter Class Reference
Inheritance diagram for GenParticles2HepMCConverter:
edm::stream::EDProducer<>

Public Member Functions

void beginRun (edm::Run const &iRun, edm::EventSetup const &) override
 
 GenParticles2HepMCConverter (const edm::ParameterSet &pset)
 
void produce (edm::Event &event, const edm::EventSetup &eventSetup) override
 
 ~GenParticles2HepMCConverter () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Private Member Functions

HepMC::FourVector FourVector (const reco::Candidate::Point &point)
 
HepMC::FourVector FourVector (const reco::Candidate::LorentzVector &lvec)
 

Private Attributes

const double cmEnergy_
 
edm::EDGetTokenT< GenEventInfoProductgenEventInfoToken_
 
edm::EDGetTokenT< reco::CandidateViewgenParticlesToken_
 
edm::EDGetTokenT< GenRunInfoProductgenRunInfoToken_
 
edm::ESGetToken< HepPDT::ParticleDataTable, PDTRecordpTable_
 
std::vector< int > signalParticlePdgIds_
 
HepMC::GenCrossSection xsec_
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Definition at line 27 of file GenParticles2HepMCConverter.cc.

Constructor & Destructor Documentation

◆ GenParticles2HepMCConverter()

GenParticles2HepMCConverter::GenParticles2HepMCConverter ( const edm::ParameterSet pset)
explicit

Definition at line 56 of file GenParticles2HepMCConverter.cc.

References genEventInfoToken_, genParticlesToken_, genRunInfoToken_, muonDTDigis_cfi::pset, pTable_, and signalParticlePdgIds_.

58  : cmEnergy_(pset.getUntrackedParameter<double>("cmEnergy", 13000)) {
59  genParticlesToken_ = consumes<reco::CandidateView>(pset.getParameter<edm::InputTag>("genParticles"));
60  genEventInfoToken_ = consumes<GenEventInfoProduct>(pset.getParameter<edm::InputTag>("genEventInfo"));
61  genRunInfoToken_ = consumes<GenRunInfoProduct, edm::InRun>(pset.getParameter<edm::InputTag>("genEventInfo"));
62  pTable_ = esConsumes<HepPDT::ParticleDataTable, PDTRecord>();
63  signalParticlePdgIds_ = pset.getParameter<std::vector<int>>("signalParticlePdgIds");
64 
65  produces<edm::HepMCProduct>("unsmeared");
66 }
edm::EDGetTokenT< GenRunInfoProduct > genRunInfoToken_
edm::EDGetTokenT< GenEventInfoProduct > genEventInfoToken_
edm::EDGetTokenT< reco::CandidateView > genParticlesToken_
edm::ESGetToken< HepPDT::ParticleDataTable, PDTRecord > pTable_

◆ ~GenParticles2HepMCConverter()

GenParticles2HepMCConverter::~GenParticles2HepMCConverter ( )
inlineoverride

Definition at line 30 of file GenParticles2HepMCConverter.cc.

30 {};

Member Function Documentation

◆ beginRun()

void GenParticles2HepMCConverter::beginRun ( edm::Run const &  iRun,
edm::EventSetup const &   
)
override

Definition at line 68 of file GenParticles2HepMCConverter.cc.

References GenRunInfoProduct::XSec::error(), genRunInfoToken_, edm::Run::getByToken(), GenRunInfoProduct::internalXSec(), GenRunInfoProduct::XSec::value(), and xsec_.

68  {
69  edm::Handle<GenRunInfoProduct> genRunInfoHandle;
70  iRun.getByToken(genRunInfoToken_, genRunInfoHandle);
71 
72  xsec_.set_cross_section(genRunInfoHandle->internalXSec().value(), genRunInfoHandle->internalXSec().error());
73 }
edm::EDGetTokenT< GenRunInfoProduct > genRunInfoToken_
const XSec & internalXSec() const

◆ FourVector() [1/2]

HepMC::FourVector GenParticles2HepMCConverter::FourVector ( const reco::Candidate::Point point)
inlineprivate

Definition at line 46 of file GenParticles2HepMCConverter.cc.

References point.

Referenced by produce().

46  {
47  return HepMC::FourVector(10 * point.x(), 10 * point.y(), 10 * point.z(), 0);
48  };
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5

◆ FourVector() [2/2]

HepMC::FourVector GenParticles2HepMCConverter::FourVector ( const reco::Candidate::LorentzVector lvec)
inlineprivate

Definition at line 50 of file GenParticles2HepMCConverter.cc.

References Matriplex::hypot(), and SiStripPI::max.

50  {
51  // Avoid negative mass, set minimum m^2 = 0
52  return HepMC::FourVector(lvec.px(), lvec.py(), lvec.pz(), std::hypot(lvec.P(), std::max(0., lvec.mass())));
53  };
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436

◆ produce()

void GenParticles2HepMCConverter::produce ( edm::Event event,
const edm::EventSetup eventSetup 
)
override

Definition at line 75 of file GenParticles2HepMCConverter.cc.

References funct::abs(), GenEventInfoProduct::alphaQCD(), GenEventInfoProduct::alphaQED(), edm::View< T >::at(), class-composition::children, cmEnergy_, options_cfi::eventSetup, spr::find(), FourVector(), genEventInfoToken_, GenParticle::GenParticle, genParticlesToken_, mps_fire::i, gen::PdfInfo::id, dqmiolumiharvest::j, EgHLTOffHistBins_cfi::mass, eostools::move(), dqmiodumpmetadata::n, or, AlCaHLTBitMon_ParallelJobs::p, GenEventInfoProduct::pdf(), EgammaValidation_cff::pdgId, pTable_, GenEventInfoProduct::qScale(), gen::PdfInfo::scalePDF, signalParticlePdgIds_, GenEventInfoProduct::signalProcessID(), edm::View< T >::size(), findQualityFiles::v, bphysicsOniaDQM_cfi::vertex, reco::Candidate::vertex(), GenEventInfoProduct::weights(), gen::PdfInfo::x, gen::PdfInfo::xPDF, and xsec_.

75  {
76  edm::Handle<reco::CandidateView> genParticlesHandle;
77  event.getByToken(genParticlesToken_, genParticlesHandle);
78 
79  edm::Handle<GenEventInfoProduct> genEventInfoHandle;
80  event.getByToken(genEventInfoToken_, genEventInfoHandle);
81 
82  auto const& pTableData = eventSetup.getData(pTable_);
83 
84  HepMC::GenEvent* hepmc_event = new HepMC::GenEvent();
85  hepmc_event->set_event_number(event.id().event());
86  hepmc_event->set_signal_process_id(genEventInfoHandle->signalProcessID());
87  hepmc_event->set_event_scale(genEventInfoHandle->qScale());
88  hepmc_event->set_alphaQED(genEventInfoHandle->alphaQED());
89  hepmc_event->set_alphaQCD(genEventInfoHandle->alphaQCD());
90 
91  hepmc_event->weights() = genEventInfoHandle->weights();
92 
93  hepmc_event->set_cross_section(xsec_);
94 
95  // Set PDF
96  const gen::PdfInfo* pdf = genEventInfoHandle->pdf();
97  if (pdf != nullptr) {
98  const int pdf_id1 = pdf->id.first, pdf_id2 = pdf->id.second;
99  const double pdf_x1 = pdf->x.first, pdf_x2 = pdf->x.second;
100  const double pdf_scalePDF = pdf->scalePDF;
101  const double pdf_xPDF1 = pdf->xPDF.first, pdf_xPDF2 = pdf->xPDF.second;
102  HepMC::PdfInfo hepmc_pdfInfo(pdf_id1, pdf_id2, pdf_x1, pdf_x2, pdf_scalePDF, pdf_xPDF1, pdf_xPDF2);
103  hepmc_event->set_pdf_info(hepmc_pdfInfo);
104  }
105 
106  // Prepare list of HepMC::GenParticles
107  std::map<const reco::Candidate*, HepMC::GenParticle*> genCandToHepMCMap;
108  HepMC::GenParticle *hepmc_parton1 = nullptr, *hepmc_parton2 = nullptr;
109  std::vector<HepMC::GenParticle*> hepmc_particles;
110  const reco::Candidate *parton1 = nullptr, *parton2 = nullptr;
111  for (unsigned int i = 0, n = genParticlesHandle->size(); i < n; ++i) {
112  const reco::Candidate* p = &genParticlesHandle->at(i);
113  HepMC::GenParticle* hepmc_particle = new HepMC::GenParticle(FourVector(p->p4()), p->pdgId(), p->status());
114  hepmc_particle->suggest_barcode(i + 1);
115 
116  // Assign particle's generated mass from the standard particle data table
117  double particleMass;
118  if (pTableData.particle(p->pdgId()))
119  particleMass = pTableData.particle(p->pdgId())->mass();
120  else
121  particleMass = p->mass();
122 
123  hepmc_particle->set_generated_mass(particleMass);
124 
125  hepmc_particles.push_back(hepmc_particle);
126  genCandToHepMCMap[p] = hepmc_particle;
127 
128  // Find incident proton pair
129  if (p->mother() == nullptr and std::abs(p->eta()) > 5 and std::abs(p->pz()) > 1000) {
130  if (!parton1 and p->pz() > 0) {
131  parton1 = p;
132  hepmc_parton1 = hepmc_particle;
133  } else if (!parton2 and p->pz() < 0) {
134  parton2 = p;
135  hepmc_parton2 = hepmc_particle;
136  }
137  }
138  }
139 
140  HepMC::GenVertex* vertex1 = nullptr;
141  HepMC::GenVertex* vertex2 = nullptr;
142  if (parton1 == nullptr || parton2 == nullptr) {
143  // Particle gun samples do not have incident partons. Put dummy incident particle and prod vertex
144  // Note: leave parton1 and parton2 as nullptr since it is not used anymore after creating hepmc_parton1 and 2
145  const reco::Candidate::LorentzVector nullP4(0, 0, 0, 0);
146  const reco::Candidate::LorentzVector beamP4(0, 0, cmEnergy_ / 2, cmEnergy_ / 2);
147  vertex1 = new HepMC::GenVertex(FourVector(nullP4));
148  vertex2 = new HepMC::GenVertex(FourVector(nullP4));
149  hepmc_parton1 = new HepMC::GenParticle(FourVector(+beamP4), 2212, 4);
150  hepmc_parton2 = new HepMC::GenParticle(FourVector(-beamP4), 2212, 4);
151  } else {
152  // Put incident beam particles : proton -> parton vertex
153  vertex1 = new HepMC::GenVertex(FourVector(parton1->vertex()));
154  vertex2 = new HepMC::GenVertex(FourVector(parton2->vertex()));
155  }
156  hepmc_event->add_vertex(vertex1);
157  hepmc_event->add_vertex(vertex2);
158  vertex1->add_particle_in(hepmc_parton1);
159  vertex2->add_particle_in(hepmc_parton2);
160  //hepmc_event->set_beam_particles(hepmc_parton1, hepmc_parton2);
161 
162  // Prepare vertex list
163  typedef std::map<const reco::Candidate*, HepMC::GenVertex*> ParticleToVertexMap;
164  ParticleToVertexMap particleToVertexMap;
165  particleToVertexMap[parton1] = vertex1;
166  particleToVertexMap[parton2] = vertex2;
167  for (unsigned int i = 0, n = genParticlesHandle->size(); i < n; ++i) {
168  const reco::Candidate* p = &genParticlesHandle->at(i);
169  if (p == parton1 or p == parton2)
170  continue;
171 
172  // Connect mother-daughters for the other cases
173  for (unsigned int j = 0, nMothers = p->numberOfMothers(); j < nMothers; ++j) {
174  // Mother-daughter hierarchy defines vertex
175  const reco::Candidate* elder = p->mother(j)->daughter(0);
176  HepMC::GenVertex* vertex;
177  if (particleToVertexMap.find(elder) == particleToVertexMap.end()) {
178  vertex = new HepMC::GenVertex(FourVector(elder->vertex()));
179  hepmc_event->add_vertex(vertex);
180  particleToVertexMap[elder] = vertex;
181  } else {
182  vertex = particleToVertexMap[elder];
183  }
184 
185  // Vertex is found. Now connect each other
186  const reco::Candidate* mother = p->mother(j);
187  vertex->add_particle_in(genCandToHepMCMap[mother]);
188  vertex->add_particle_out(hepmc_particles[i]);
189  }
190  }
191 
192  // Finalize HepMC event record
193  bool hasSignalVertex = false;
194  if (!signalParticlePdgIds_.empty()) {
195  // Loop over all vertices to assign the signal vertex, decaying to a signal particle
196  for (auto v = hepmc_event->vertices_begin(); v != hepmc_event->vertices_end(); ++v) {
197  for (auto p = (*v)->particles_begin(HepMC::children); p != (*v)->particles_end(HepMC::children); ++p) {
198  const int pdgId = (*p)->pdg_id();
200  signalParticlePdgIds_.end()) {
201  hepmc_event->set_signal_process_vertex(*v);
202  hasSignalVertex = true;
203  break;
204  }
205  }
206  if (hasSignalVertex)
207  break;
208  }
209  }
210  // Set the default signal vertex if still not set
211  if (!hasSignalVertex)
212  hepmc_event->set_signal_process_vertex(*(vertex1->vertices_begin()));
213 
214  std::unique_ptr<edm::HepMCProduct> hepmc_product(new edm::HepMCProduct());
215  hepmc_product->addHepMCData(hepmc_event);
216  event.put(std::move(hepmc_product), "unsmeared");
217 }
edm::EDGetTokenT< GenEventInfoProduct > genEventInfoToken_
std::pair< double, double > x
Definition: PdfInfo.h:13
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
HepMC::FourVector FourVector(const reco::Candidate::Point &point)
edm::EDGetTokenT< reco::CandidateView > genParticlesToken_
size_type size() const
edm::ESGetToken< HepPDT::ParticleDataTable, PDTRecord > pTable_
std::pair< double, double > xPDF
Definition: PdfInfo.h:14
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual const Point & vertex() const =0
vertex position
unsigned int signalProcessID() const
const_reference at(size_type pos) const
std::pair< int, int > id
Definition: PdfInfo.h:12
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:36
const PDF * pdf() const
std::vector< double > & weights()
double scalePDF
Definition: PdfInfo.h:15
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1

Member Data Documentation

◆ cmEnergy_

const double GenParticles2HepMCConverter::cmEnergy_
private

Definition at line 42 of file GenParticles2HepMCConverter.cc.

Referenced by produce().

◆ genEventInfoToken_

edm::EDGetTokenT<GenEventInfoProduct> GenParticles2HepMCConverter::genEventInfoToken_
private

Definition at line 37 of file GenParticles2HepMCConverter.cc.

Referenced by GenParticles2HepMCConverter(), and produce().

◆ genParticlesToken_

edm::EDGetTokenT<reco::CandidateView> GenParticles2HepMCConverter::genParticlesToken_
private

Definition at line 36 of file GenParticles2HepMCConverter.cc.

Referenced by GenParticles2HepMCConverter(), and produce().

◆ genRunInfoToken_

edm::EDGetTokenT<GenRunInfoProduct> GenParticles2HepMCConverter::genRunInfoToken_
private

Definition at line 38 of file GenParticles2HepMCConverter.cc.

Referenced by beginRun(), and GenParticles2HepMCConverter().

◆ pTable_

edm::ESGetToken<HepPDT::ParticleDataTable, PDTRecord> GenParticles2HepMCConverter::pTable_
private

Definition at line 39 of file GenParticles2HepMCConverter.cc.

Referenced by GenParticles2HepMCConverter(), and produce().

◆ signalParticlePdgIds_

std::vector<int> GenParticles2HepMCConverter::signalParticlePdgIds_
private

Definition at line 41 of file GenParticles2HepMCConverter.cc.

Referenced by GenParticles2HepMCConverter(), and produce().

◆ xsec_

HepMC::GenCrossSection GenParticles2HepMCConverter::xsec_
private

Definition at line 43 of file GenParticles2HepMCConverter.cc.

Referenced by beginRun(), and produce().