CMS 3D CMS Logo

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

#include <ParticleLevelProducer.h>

Inheritance diagram for ParticleLevelProducer:
edm::one::EDProducer< edm::one::SharedResources > edm::one::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 ParticleLevelProducer (const edm::ParameterSet &pset)
 
void produce (edm::Event &event, const edm::EventSetup &eventSetup) override
 
 ~ParticleLevelProducer () override
 
- Public Member Functions inherited from edm::one::EDProducer< edm::one::SharedResources >
 EDProducer ()=default
 
SerialTaskQueueglobalLuminosityBlocksQueue () final
 
SerialTaskQueueglobalRunsQueue () final
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
- Public Member Functions inherited from edm::one::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
bool wantsStreamLuminosityBlocks () const
 
bool wantsStreamRuns () const
 
 ~EDProducerBase () override
 
- 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 ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
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, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
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 & itemsToGetFrom (BranchType iType) 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
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Private Member Functions

void addGenJet (Rivet::Jet jet, std::unique_ptr< reco::GenJetCollection > &jets, std::unique_ptr< reco::GenParticleCollection > &consts, edm::RefProd< reco::GenParticleCollection > &constsRefHandle, int &iConstituent, std::unique_ptr< reco::GenParticleCollection > &tags, edm::RefProd< reco::GenParticleCollection > &tagsRefHandle, int &iTag)
 
template<typename T >
reco::Candidate::LorentzVector p4 (const T &p) const
 

Private Attributes

Rivet::AnalysisHandler analysisHandler_
 
reco::Particle::Point genVertex_
 
Rivet::RivetAnalysisrivetAnalysis_
 
const edm::EDGetTokenT< edm::HepMCProductsrcToken_
 

Additional Inherited Members

- Public Types inherited from edm::one::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex >>
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::one::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- 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 ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
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

Definition at line 18 of file ParticleLevelProducer.h.

Constructor & Destructor Documentation

ParticleLevelProducer::ParticleLevelProducer ( const edm::ParameterSet pset)

Definition at line 19 of file ParticleLevelProducer.cc.

References analysisHandler_, genVertex_, and rivetAnalysis_.

20  : srcToken_(consumes<edm::HepMCProduct>(pset.getParameter<edm::InputTag>("src"))),
22  usesResource("Rivet");
23 
25 
26  produces<reco::GenParticleCollection>("neutrinos");
27  produces<reco::GenParticleCollection>("photons");
28  produces<reco::GenJetCollection>("leptons");
29  produces<reco::GenJetCollection>("jets");
30  produces<reco::GenJetCollection>("fatjets");
31  produces<reco::GenParticleCollection>("consts");
32  produces<reco::GenParticleCollection>("tags");
33  produces<reco::METCollection>("mets");
34 
35  analysisHandler_.setIgnoreBeams(true);
36  analysisHandler_.addAnalysis(rivetAnalysis_);
37 }
T getParameter(std::string const &) const
math::XYZPoint Point
point in the space
Definition: Particle.h:25
Rivet::RivetAnalysis * rivetAnalysis_
const edm::EDGetTokenT< edm::HepMCProduct > srcToken_
Rivet::AnalysisHandler analysisHandler_
reco::Particle::Point genVertex_
ParticleLevelProducer::~ParticleLevelProducer ( )
inlineoverride

Definition at line 22 of file ParticleLevelProducer.h.

References addGenJet(), metsig::jet, nanoDQM_cfi::Jet, fwrapper::jets, and produce().

22 {}

Member Function Documentation

void ParticleLevelProducer::addGenJet ( Rivet::Jet  jet,
std::unique_ptr< reco::GenJetCollection > &  jets,
std::unique_ptr< reco::GenParticleCollection > &  consts,
edm::RefProd< reco::GenParticleCollection > &  constsRefHandle,
int &  iConstituent,
std::unique_ptr< reco::GenParticleCollection > &  tags,
edm::RefProd< reco::GenParticleCollection > &  tagsRefHandle,
int &  iTag 
)
private

Definition at line 39 of file ParticleLevelProducer.cc.

References reco::CompositePtrCandidate::addDaughter(), edmIntegrityCheck::d, MillePedeFileConverter_cfg::e, genVertex_, match(), AlCaHLTBitMon_ParallelJobs::p, p4(), lumiQueryAPI::q, edm::refToPtr(), reco::Jet::setJetArea(), reco::LeafCandidate::setP4(), reco::LeafCandidate::setPdgId(), and reco::LeafCandidate::setVertex().

Referenced by produce(), and ~ParticleLevelProducer().

46  {
47  const auto pjet = jet.pseudojet();
48 
49  reco::GenJet genJet;
50  genJet.setP4(p4(jet));
51  genJet.setVertex(genVertex_);
52  if (jet.bTagged())
53  genJet.setPdgId(5);
54  else if (jet.cTagged())
55  genJet.setPdgId(4);
56  genJet.setJetArea(pjet.has_area() ? pjet.area() : 0);
57 
58  for (auto const& p : jet.particles()) {
59  auto pp4 = p4(p);
60  bool match = false;
61  int iMatch = -1;
62  for (auto const& q : *consts) {
63  ++iMatch;
64  if (q.p4() == pp4) {
65  match = true;
66  break;
67  }
68  }
69  if (match) {
70  genJet.addDaughter(edm::refToPtr(reco::GenParticleRef(constsRefHandle, iMatch)));
71  } else {
72  consts->push_back(reco::GenParticle(p.charge(), pp4, genVertex_, p.pdgId(), 1, true));
73  genJet.addDaughter(edm::refToPtr(reco::GenParticleRef(constsRefHandle, ++iConstituent)));
74  }
75  }
76  for (auto const& p : jet.tags()) {
77  // The tag particles are accessible as jet daughters, so scale down p4 for safety.
78  // p4 needs to be multiplied by 1e20 for fragmentation analysis.
79  auto pp4 = p4(p) * 1e-20;
80  bool match = false;
81  int iMatch = -1;
82  for (auto const& q : *tags) {
83  ++iMatch;
84  if (q.p4() == pp4) {
85  match = true;
86  break;
87  }
88  }
89  if (match) {
90  genJet.addDaughter(edm::refToPtr(reco::GenParticleRef(tagsRefHandle, iMatch)));
91  } else {
92  tags->push_back(reco::GenParticle(p.charge(), p4(p) * 1e-20, genVertex_, p.pdgId(), 2, true));
93  genJet.addDaughter(edm::refToPtr(reco::GenParticleRef(tagsRefHandle, ++iTag)));
94  // Also save lepton+neutrino daughters of tag particles
95  int iTagMother = iTag;
96  for (auto const& d : p.constituents()) {
97  ++iTag;
98  int d_status = (d.isStable()) ? 1 : 2;
99  tags->push_back(reco::GenParticle(d.charge(), p4(d) * 1e-20, genVertex_, d.pid(), d_status, true));
100  tags->at(iTag).addMother(reco::GenParticleRef(tagsRefHandle, iTagMother));
101  tags->at(iTagMother).addDaughter(reco::GenParticleRef(tagsRefHandle, iTag));
102  genJet.addDaughter(edm::refToPtr(reco::GenParticleRef(tagsRefHandle, iTag)));
103  }
104  }
105  }
106 
107  jets->push_back(genJet);
108 }
Ptr< typename C::value_type > refToPtr(Ref< C, typename C::value_type, refhelper::FindUsingAdvance< C, typename C::value_type > > const &ref)
Definition: RefToPtr.h:18
void setVertex(const Point &vertex) override
set vertex
virtual void setJetArea(float fArea)
set jet area
Definition: Jet.h:103
reco::Candidate::LorentzVector p4(const T &p) const
vector< PseudoJet > jets
Jets made from MC generator particles.
Definition: GenJet.h:25
void addDaughter(const CandidatePtr &)
add a daughter via a reference
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
void setPdgId(int pdgId) final
void setP4(const LorentzVector &p4) final
set 4-momentum
reco::Particle::Point genVertex_
template<typename T >
reco::Candidate::LorentzVector ParticleLevelProducer::p4 ( const T p) const
inlineprivate

Definition at line 30 of file ParticleLevelProducer.h.

Referenced by addGenJet(), Tau.Tau::dxy_approx(), Tau.Tau::dz(), Lepton.Lepton::p4WithFSR(), and produce().

31  {
32  return reco::Candidate::LorentzVector(p.px(), p.py(), p.pz(), p.energy());
33  }
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
void ParticleLevelProducer::produce ( edm::Event event,
const edm::EventSetup eventSetup 
)
override

Definition at line 110 of file ParticleLevelProducer.cc.

References reco::CompositePtrCandidate::addDaughter(), addGenJet(), analysisHandler_, DEFINE_FWK_MODULE, Rivet::RivetAnalysis::fatjets(), genWeightsTable_cfi::genEvent, genVertex_, metsig::jet, Rivet::RivetAnalysis::jets(), fwrapper::jets, AK4GenJetFlavourInfos_cfi::leptons, Rivet::RivetAnalysis::leptons(), Rivet::RivetAnalysis::met(), TtSemiLepSignalSelMVAComputer_cfi::mets, eostools::move(), TtSemiLepHypHitFit_cfi::neutrinos, Rivet::RivetAnalysis::neutrinos(), AlCaHLTBitMon_ParallelJobs::p, p4(), Rivet::RivetAnalysis::photons(), muons_cff::photons, funct::pow(), edm::refToPtr(), rivetAnalysis_, reco::LeafCandidate::setCharge(), reco::LeafCandidate::setP4(), reco::LeafCandidate::setPdgId(), reco::LeafCandidate::setVertex(), jetUpdater_cfi::sort, mathSSE::sqrt(), and srcToken_.

Referenced by ~ParticleLevelProducer().

110  {
111  using namespace Rivet;
113 
114  std::unique_ptr<reco::GenParticleCollection> neutrinos(new reco::GenParticleCollection);
115  std::unique_ptr<reco::GenParticleCollection> photons(new reco::GenParticleCollection);
116  std::unique_ptr<reco::GenJetCollection> leptons(new reco::GenJetCollection);
117  std::unique_ptr<reco::GenJetCollection> jets(new reco::GenJetCollection);
118  std::unique_ptr<reco::GenJetCollection> fatjets(new reco::GenJetCollection);
119  std::unique_ptr<reco::GenParticleCollection> consts(new reco::GenParticleCollection);
120  std::unique_ptr<reco::GenParticleCollection> tags(new reco::GenParticleCollection);
121  std::unique_ptr<reco::METCollection> mets(new reco::METCollection);
122  auto constsRefHandle = event.getRefBeforePut<reco::GenParticleCollection>("consts");
123  auto tagsRefHandle = event.getRefBeforePut<reco::GenParticleCollection>("tags");
124 
125  edm::Handle<HepMCProduct> srcHandle;
126  event.getByToken(srcToken_, srcHandle);
127 
128  const HepMC::GenEvent* genEvent = srcHandle->GetEvent();
129  analysisHandler_.analyze(*genEvent);
130 
131  // Convert into edm objects
132  // Prompt neutrinos
133  for (auto const& p : rivetAnalysis_->neutrinos()) {
134  neutrinos->push_back(reco::GenParticle(p.charge(), p4(p), genVertex_, p.pdgId(), 1, true));
135  }
137 
138  // Photons
139  for (auto const& p : rivetAnalysis_->photons()) {
140  photons->push_back(reco::GenParticle(p.charge(), p4(p), genVertex_, p.pdgId(), 1, true));
141  }
143 
144  // Prompt leptons
145  int iConstituent = -1;
146  int iTag = -1;
147  for (auto const& lepton : rivetAnalysis_->leptons()) {
148  reco::GenJet lepJet;
149  lepJet.setP4(p4(lepton));
150  lepJet.setVertex(genVertex_);
151  lepJet.setPdgId(lepton.pdgId());
152  lepJet.setCharge(lepton.charge());
153 
154  for (auto const & p : lepton.constituents()) {
155  // ghost taus (momentum scaled with 10e-20 in RivetAnalysis.h already)
156  if (p.abspid() == 15) {
157  tags->push_back(reco::GenParticle(p.charge(), p4(p), genVertex_, p.pdgId(), 2, true));
158  lepJet.addDaughter(edm::refToPtr(reco::GenParticleRef(tagsRefHandle, ++iTag)));
159  }
160  // electrons, muons, photons
161  else {
162  consts->push_back(reco::GenParticle(p.charge(), p4(p), genVertex_, p.pdgId(), 1, true));
163  lepJet.addDaughter(edm::refToPtr(reco::GenParticleRef(constsRefHandle, ++iConstituent)));
164  }
165  }
166 
167  leptons->push_back(lepJet);
168  }
169  std::sort(leptons->begin(), leptons->end(), GreaterByPt<reco::GenJet>());
170 
171  // Jets with constituents and tag particles
172  for (auto jet : rivetAnalysis_->jets()) {
173  addGenJet(jet, jets, consts, constsRefHandle, iConstituent, tags, tagsRefHandle, iTag);
174  }
175  for (auto jet : rivetAnalysis_->fatjets()) {
176  addGenJet(jet, fatjets, consts, constsRefHandle, iConstituent, tags, tagsRefHandle, iTag);
177  }
178 
179  // MET
181  rivetAnalysis_->met().y(),
182  0.,
183  sqrt(pow(rivetAnalysis_->met().x(), 2) + pow(rivetAnalysis_->met().y(), 2)));
184  mets->push_back(reco::MET(metP4, genVertex_));
185 
186  event.put(std::move(neutrinos), "neutrinos");
187  event.put(std::move(photons), "photons");
188  event.put(std::move(leptons), "leptons");
189  event.put(std::move(jets), "jets");
190  event.put(std::move(fatjets), "fatjets");
191  event.put(std::move(consts), "consts");
192  event.put(std::move(tags), "tags");
193  event.put(std::move(mets), "mets");
194 }
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
Vector3 met() const
Definition: RivetAnalysis.h:31
Ptr< typename C::value_type > refToPtr(Ref< C, typename C::value_type, refhelper::FindUsingAdvance< C, typename C::value_type > > const &ref)
Definition: RefToPtr.h:18
std::vector< GenJet > GenJetCollection
collection of GenJet objects
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:23
Jets fatjets() const
Definition: RivetAnalysis.h:30
void setVertex(const Point &vertex) override
set vertex
ParticleVector neutrinos() const
Definition: RivetAnalysis.h:28
void setCharge(Charge q) final
set electric charge
Definition: LeafCandidate.h:93
Jets jets() const
Definition: RivetAnalysis.h:29
ParticleVector photons() const
Definition: RivetAnalysis.h:27
reco::Candidate::LorentzVector p4(const T &p) const
Definition: MET.h:42
T sqrt(T t)
Definition: SSEVec.h:18
vector< PseudoJet > jets
Jets made from MC generator particles.
Definition: GenJet.h:25
void addGenJet(Rivet::Jet jet, std::unique_ptr< reco::GenJetCollection > &jets, std::unique_ptr< reco::GenParticleCollection > &consts, edm::RefProd< reco::GenParticleCollection > &constsRefHandle, int &iConstituent, std::unique_ptr< reco::GenParticleCollection > &tags, edm::RefProd< reco::GenParticleCollection > &tagsRefHandle, int &iTag)
Rivet::RivetAnalysis * rivetAnalysis_
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
const edm::EDGetTokenT< edm::HepMCProduct > srcToken_
ParticleVector leptons() const
Definition: RivetAnalysis.h:26
Rivet::AnalysisHandler analysisHandler_
void addDaughter(const CandidatePtr &)
add a daughter via a reference
void setPdgId(int pdgId) final
void setP4(const LorentzVector &p4) final
set 4-momentum
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
def move(src, dest)
Definition: eostools.py:511
math::PtEtaPhiELorentzVectorF LorentzVector
reco::Particle::Point genVertex_

Member Data Documentation

Rivet::AnalysisHandler ParticleLevelProducer::analysisHandler_
private

Definition at line 40 of file ParticleLevelProducer.h.

Referenced by ParticleLevelProducer(), and produce().

reco::Particle::Point ParticleLevelProducer::genVertex_
private

Definition at line 37 of file ParticleLevelProducer.h.

Referenced by addGenJet(), ParticleLevelProducer(), and produce().

Rivet::RivetAnalysis* ParticleLevelProducer::rivetAnalysis_
private

Definition at line 39 of file ParticleLevelProducer.h.

Referenced by ParticleLevelProducer(), and produce().

const edm::EDGetTokenT<edm::HepMCProduct> ParticleLevelProducer::srcToken_
private

Definition at line 35 of file ParticleLevelProducer.h.

Referenced by produce().