CMS 3D CMS Logo

BasicGenParticleValidation.cc
Go to the documentation of this file.
1 /*class BasicGenParticleValidation
2  *
3  * Class to fill dqm monitor elements from existing EDM file
4  *
5  */
6 
8 
9 #include "CLHEP/Units/defs.h"
10 #include "CLHEP/Units/PhysicalConstants.h"
12 
13 using namespace edm;
14 
16  : wmanager_(iPSet, consumesCollector()),
17  hepmcCollection_(iPSet.getParameter<edm::InputTag>("hepmcCollection")),
18  genparticleCollection_(iPSet.getParameter<edm::InputTag>("genparticleCollection")),
19  genjetCollection_(iPSet.getParameter<edm::InputTag>("genjetsCollection")),
20  matchPr_(iPSet.getParameter<double>("matchingPrecision")),
21  verbosity_(iPSet.getUntrackedParameter<unsigned int>("verbosity", 0)) {
22  hepmcCollectionToken_ = consumes<HepMCProduct>(hepmcCollection_);
23  genparticleCollectionToken_ = consumes<reco::GenParticleCollection>(genparticleCollection_);
24  genjetCollectionToken_ = consumes<reco::GenJetCollection>(genjetCollection_);
25 }
26 
28 
31  DQMHelper dqm(&i);
32  i.setCurrentFolder("Generator/GenParticles");
34 
35  // Number of analyzed events
36  nEvt = dqm.book1dHisto("nEvt", "n analyzed Events", 1, 0., 1., "", "Number of Events");
37 
39  genPMultiplicity = dqm.book1dHisto("genPMultiplicty",
40  "Log(No. all GenParticles)",
41  50,
42  -1,
43  5,
44  "log_{10}(N_{All GenParticles})",
45  "Number of Events"); //Log
46  //difference in HepMC and reco multiplicity
47  genMatched = dqm.book1dHisto(
48  "genMatched", "Difference reco - matched", 50, -25, 25, "N_{All GenParticles}-N_{Matched}", "Number of Events");
49  //multiple matching
50  multipleMatching = dqm.book1dHisto("multipleMatching",
51  "multiple reco HepMC matching",
52  50,
53  0,
54  50,
55  "N_{multiple reco HepMC matching}",
56  "Number of Events");
57  //momentum difference of matched particles
58  matchedResolution = dqm.book1dHisto("matchedResolution",
59  "log10(momentum difference of matched particles)",
60  70,
61  -10.,
62  -3.,
63  "log_{10}(#DeltaP_{matched Particles})",
64  "Number of Events");
65 
66  // GenJet general distributions
67  genJetMult = dqm.book1dHisto("genJetMult", "GenJet multiplicity", 50, 0, 50, "N_{gen-jets}", "Number of Events");
68  genJetEnergy = dqm.book1dHisto(
69  "genJetEnergy", "Log10(GenJet energy)", 60, -1, 5, "log_{10}(E^{gen-jets}) (log_{10}(GeV))", "Number of Events");
70  genJetPt = dqm.book1dHisto(
71  "genJetPt", "Log10(GenJet pt)", 60, -1, 5, "log_{10}(P_{t}^{gen-jets}) (log_{10}(GeV))", "Number of Events");
72  genJetEta = dqm.book1dHisto("genJetEta", "GenJet eta", 220, -11, 11, "#eta^{gen-jets}", "Number of Events");
73  genJetPhi = dqm.book1dHisto("genJetPhi", "GenJet phi", 360, -180, 180, "#phi^{gen-jets} (rad)", "Number of Events");
74  genJetDeltaEtaMin = dqm.book1dHisto(
75  "genJetDeltaEtaMin", "GenJet minimum rapidity gap", 30, 0, 30, "#delta#eta_{min}^{gen-jets}", "Number of Events");
76 
77  genJetPto1 = dqm.book1dHisto(
78  "genJetPto1", "GenJet multiplicity above 1 GeV", 50, 0, 50, "N_{gen-jets P_{t}>1GeV}", "Number of Events");
79  genJetPto10 = dqm.book1dHisto(
80  "genJetPto10", "GenJet multiplicity above 10 GeV", 50, 0, 50, "N_{gen-jets P_{t}>10GeV}", "Number of Events");
81  genJetPto100 = dqm.book1dHisto(
82  "genJetPto100", "GenJet multiplicity above 100 GeV", 50, 0, 50, "N_{gen-jets P_{t}>100GeV}", "Number of Events");
83  genJetCentral = dqm.book1dHisto(
84  "genJetCentral", "GenJet multiplicity |eta|.lt.2.5", 50, 0, 50, "N_{gen-jets |#eta|#leq2.5}", "Number of Events");
85 
86  genJetTotPt = dqm.book1dHisto("genJetTotPt",
87  "Log10(GenJet total pt)",
88  100,
89  -5,
90  5,
91  "log_{10}(#SigmaP_{t}^{gen-jets}) (log_{10}(GeV))",
92  "Number of Events");
93 
94  return;
95 }
96 
98  unsigned int initSize = 1000;
99 
102  iEvent.getByToken(hepmcCollectionToken_, evt);
103 
104  //Get HepMC EVENT
105  HepMC::GenEvent* myGenEvent = new HepMC::GenEvent(*(evt->GetEvent()));
106 
107  double weight = wmanager_.weight(iEvent);
108 
109  nEvt->Fill(0.5, weight);
110 
111  std::vector<const HepMC::GenParticle*> hepmcGPCollection;
112  std::vector<int> barcodeList;
113  hepmcGPCollection.reserve(initSize);
114  barcodeList.reserve(initSize);
115 
116  //Looping through HepMC::GenParticle collection to search for status 1 particles
117  for (HepMC::GenEvent::particle_const_iterator iter = myGenEvent->particles_begin();
118  iter != myGenEvent->particles_end();
119  ++iter) {
120  if ((*iter)->status() == 1) {
121  hepmcGPCollection.push_back(*iter);
122  barcodeList.push_back((*iter)->barcode());
123  if (verbosity_ > 0) {
124  std::cout << "HepMC " << std::setw(14) << std::fixed << (*iter)->pdg_id() << std::setw(14) << std::fixed
125  << (*iter)->momentum().px() << std::setw(14) << std::fixed << (*iter)->momentum().py()
126  << std::setw(14) << std::fixed << (*iter)->momentum().pz() << std::endl;
127  }
128  }
129  }
130 
131  // Gather information on the reco::GenParticle collection
134 
135  std::vector<const reco::GenParticle*> particles;
136  particles.reserve(initSize);
137  for (reco::GenParticleCollection::const_iterator iter = genParticles->begin(); iter != genParticles->end(); ++iter) {
138  if ((*iter).status() == 1) {
139  particles.push_back(&*iter);
140  if (verbosity_ > 0) {
141  std::cout << "reco " << std::setw(14) << std::fixed << (*iter).pdgId() << std::setw(14) << std::fixed
142  << (*iter).px() << std::setw(14) << std::fixed << (*iter).py() << std::setw(14) << std::fixed
143  << (*iter).pz() << std::endl;
144  }
145  }
146  }
147 
148  unsigned int nReco = particles.size();
149  unsigned int nHepMC = hepmcGPCollection.size();
150 
151  genPMultiplicity->Fill(std::log10(nReco), weight);
152 
153  // Define vector containing index of hepmc corresponding to the reco::GenParticle
154  std::vector<int> hepmcMatchIndex;
155  hepmcMatchIndex.reserve(initSize);
156 
157  // Matching procedure
158 
159  // Check array size consistency
160 
161  if (nReco != nHepMC) {
162  edm::LogWarning("CollectionSizeInconsistency")
163  << "Collection size inconsistency: HepMC::GenParticle = " << nHepMC << " reco::GenParticle = " << nReco;
164  }
165 
166  // Match each HepMC with a reco
167 
168  for (unsigned int i = 0; i < nReco; ++i) {
169  for (unsigned int j = 0; j < nHepMC; ++j) {
170  if (matchParticles(hepmcGPCollection[j], particles[i])) {
171  hepmcMatchIndex.push_back((int)j);
172  if (hepmcGPCollection[j]->momentum().rho() != 0.) {
173  double reso = 1. - particles[i]->p() / hepmcGPCollection[j]->momentum().rho();
174  if (verbosity_ > 0) {
175  std::cout << "Matching momentum: reco = " << particles[i]->p()
176  << " HepMC = " << hepmcGPCollection[j]->momentum().rho() << " resoultion = " << reso << std::endl;
177  }
178  matchedResolution->Fill(std::log10(std::fabs(reso)), weight);
179  }
180  continue;
181  }
182  }
183  }
184 
185  // Check unicity of matching
186 
187  unsigned int nMatched = hepmcMatchIndex.size();
188 
189  if (nMatched != nReco) {
190  edm::LogWarning("IncorrectMatching") << "Incorrect number of matched indexes: GenParticle = " << nReco
191  << " matched indexes = " << nMatched;
192  }
193  genMatched->Fill(int(nReco - nMatched), weight);
194 
195  unsigned int nWrMatch = 0;
196 
197  for (unsigned int i = 0; i < nMatched; ++i) {
198  for (unsigned int j = i + 1; j < nMatched; ++j) {
199  if (hepmcMatchIndex[i] == hepmcMatchIndex[j]) {
200  int theIndex = hepmcMatchIndex[i];
201  edm::LogWarning("DuplicatedMatching")
202  << "Multiple matching occurencies for GenParticle barcode = " << barcodeList[theIndex];
203  nWrMatch++;
204  }
205  }
206  }
207  multipleMatching->Fill(int(nWrMatch), weight);
208 
209  // Gather information in the GenJet collection
212 
213  int nJets = 0;
214  int nJetso1 = 0;
215  int nJetso10 = 0;
216  int nJetso100 = 0;
217  int nJetsCentral = 0;
218  double totPt = 0.;
219 
220  std::vector<double> jetEta;
221  jetEta.reserve(initSize);
222 
223  for (reco::GenJetCollection::const_iterator iter = genJets->begin(); iter != genJets->end(); ++iter) {
224  nJets++;
225  double pt = (*iter).pt();
226  totPt += pt;
227  if (pt > 1.)
228  nJetso1++;
229  if (pt > 10.)
230  nJetso10++;
231  if (pt > 100.)
232  nJetso100++;
233  double eta = (*iter).eta();
234  if (std::fabs(eta) < 2.5)
235  nJetsCentral++;
236  jetEta.push_back(eta);
237 
238  genJetEnergy->Fill(std::log10((*iter).energy()), weight);
239  genJetPt->Fill(std::log10(pt), weight);
241  genJetPhi->Fill((*iter).phi() / CLHEP::degree, weight);
242  }
243 
244  genJetMult->Fill(nJets, weight);
245  genJetPto1->Fill(nJetso1, weight);
246  genJetPto10->Fill(nJetso10, weight);
247  genJetPto100->Fill(nJetso100, weight);
248  genJetCentral->Fill(nJetsCentral, weight);
249 
250  genJetTotPt->Fill(std::log10(totPt), weight);
251 
252  double deltaEta = 999.;
253  if (jetEta.size() > 1) {
254  for (unsigned int i = 0; i < jetEta.size(); i++) {
255  for (unsigned int j = i + 1; j < jetEta.size(); j++) {
256  deltaEta = std::min(deltaEta, std::fabs(jetEta[i] - jetEta[j]));
257  }
258  }
259  }
260 
262 
263  delete myGenEvent;
264 } //analyze
265 
267  bool state = false;
268 
269  if (hepmcP->pdg_id() != recoP->pdgId())
270  return state;
271  if (std::fabs(hepmcP->momentum().px() - recoP->px()) < std::fabs(matchPr_ * hepmcP->momentum().px()) &&
272  std::fabs(hepmcP->momentum().py() - recoP->py()) < std::fabs(matchPr_ * hepmcP->momentum().py()) &&
273  std::fabs(hepmcP->momentum().pz() - recoP->pz()) < std::fabs(matchPr_ * hepmcP->momentum().pz())) {
274  state = true;
275  }
276 
277  return state;
278 }
alignBH_cfg.fixed
fixed
Definition: alignBH_cfg.py:54
mps_fire.i
i
Definition: mps_fire.py:428
genParticles2HepMC_cfi.genParticles
genParticles
Definition: genParticles2HepMC_cfi.py:4
BasicGenParticleValidation.h
reco::GenParticle
Definition: GenParticle.h:21
DiDispStaMuonMonitor_cfi.pt
pt
Definition: DiDispStaMuonMonitor_cfi.py:39
BasicGenParticleValidation::hepmcCollection_
edm::InputTag hepmcCollection_
Definition: BasicGenParticleValidation.h:48
edm::Run
Definition: Run.h:45
min
T min(T a, T b)
Definition: MathUtil.h:58
BasicGenParticleValidation::wmanager_
WeightManager wmanager_
Definition: BasicGenParticleValidation.h:47
edm
HLT enums.
Definition: AlignableModifier.h:19
mps_merge.weight
weight
Definition: mps_merge.py:88
gather_cfg.cout
cout
Definition: gather_cfg.py:144
BasicGenParticleValidation::analyze
void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: BasicGenParticleValidation.cc:97
BasicGenParticleValidation::matchPr_
double matchPr_
Definition: BasicGenParticleValidation.h:51
BasicGenParticleValidation::genJetMult
MonitorElement * genJetMult
Definition: BasicGenParticleValidation.h:66
BasicGenParticleValidation::BasicGenParticleValidation
BasicGenParticleValidation(const edm::ParameterSet &)
Definition: BasicGenParticleValidation.cc:15
BasicGenParticleValidation::genJetCentral
MonitorElement * genJetCentral
Definition: BasicGenParticleValidation.h:76
BasicGenParticleValidation::bookHistograms
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
Definition: BasicGenParticleValidation.cc:29
edm::Handle
Definition: AssociativeIterator.h:50
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
ecalTrigSettings_cff.particles
particles
Definition: ecalTrigSettings_cff.py:11
HepMC::GenEvent
Definition: hepmc_rootio.cc:9
BasicGenParticleValidation::~BasicGenParticleValidation
~BasicGenParticleValidation() override
Definition: BasicGenParticleValidation.cc:27
DQMHelper.h
BasicGenParticleValidation::multipleMatching
MonitorElement * multipleMatching
Definition: BasicGenParticleValidation.h:61
BasicGenParticleValidation::genJetPto100
MonitorElement * genJetPto100
Definition: BasicGenParticleValidation.h:75
BasicGenParticleValidation::genJetDeltaEtaMin
MonitorElement * genJetDeltaEtaMin
Definition: BasicGenParticleValidation.h:71
spr::deltaEta
static const double deltaEta
Definition: CaloConstants.h:8
reco::LeafCandidate::py
double py() const final
y coordinate of momentum vector
Definition: LeafCandidate.h:142
PVValHelper::eta
Definition: PVValidationHelpers.h:70
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
BasicGenParticleValidation::genJetPhi
MonitorElement * genJetPhi
Definition: BasicGenParticleValidation.h:70
BasicGenParticleValidation::genMatched
MonitorElement * genMatched
Definition: BasicGenParticleValidation.h:60
DDAxes::rho
BasicGenParticleValidation::genjetCollectionToken_
edm::EDGetTokenT< reco::GenJetCollection > genjetCollectionToken_
Definition: BasicGenParticleValidation.h:82
reco::btau::jetEta
Definition: TaggingVariable.h:34
edm::ParameterSet
Definition: ParameterSet.h:47
BasicGenParticleValidation::genJetPto1
MonitorElement * genJetPto1
Definition: BasicGenParticleValidation.h:73
BasicGenParticleValidation::matchParticles
bool matchParticles(const HepMC::GenParticle *&, const reco::GenParticle *&)
Definition: BasicGenParticleValidation.cc:266
BasicGenParticleValidation::genparticleCollectionToken_
edm::EDGetTokenT< reco::GenParticleCollection > genparticleCollectionToken_
Definition: BasicGenParticleValidation.h:81
reco::LeafCandidate::pdgId
int pdgId() const final
PDG identifier.
Definition: LeafCandidate.h:176
BasicGenParticleValidation::genJetEnergy
MonitorElement * genJetEnergy
Definition: BasicGenParticleValidation.h:67
BasicGenParticleValidation::hepmcCollectionToken_
edm::EDGetTokenT< edm::HepMCProduct > hepmcCollectionToken_
Definition: BasicGenParticleValidation.h:80
createfilelist.int
int
Definition: createfilelist.py:10
iEvent
int iEvent
Definition: GenABIO.cc:224
BasicGenParticleValidation::genparticleCollection_
edm::InputTag genparticleCollection_
Definition: BasicGenParticleValidation.h:49
BasicGenParticleValidation::genJetPt
MonitorElement * genJetPt
Definition: BasicGenParticleValidation.h:68
ttbarCategorization_cff.genJets
genJets
Definition: ttbarCategorization_cff.py:29
edm::EventSetup
Definition: EventSetup.h:58
edm::HepMCProduct::GetEvent
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:37
WeightManager::weight
double weight(const edm::Event &)
Definition: WeightManager.cc:24
BasicGenParticleValidation::matchedResolution
MonitorElement * matchedResolution
Definition: BasicGenParticleValidation.h:62
BasicGenParticleValidation::verbosity_
unsigned int verbosity_
Definition: BasicGenParticleValidation.h:53
DQMHelper
Definition: DQMHelper.h:15
GenParticle.GenParticle
GenParticle
Definition: GenParticle.py:18
BasicGenParticleValidation::genjetCollection_
edm::InputTag genjetCollection_
Definition: BasicGenParticleValidation.h:50
RunInfoPI::state
state
Definition: RunInfoPayloadInspectoHelper.h:16
BasicGenParticleValidation::genJetPto10
MonitorElement * genJetPto10
Definition: BasicGenParticleValidation.h:74
BasicGenParticleValidation::nEvt
MonitorElement * nEvt
Definition: BasicGenParticleValidation.h:55
BasicGenParticleValidation::genJetTotPt
MonitorElement * genJetTotPt
Definition: BasicGenParticleValidation.h:78
dqm::implementation::IBooker
Definition: DQMStore.h:43
BasicGenParticleValidation::genPMultiplicity
MonitorElement * genPMultiplicity
Definition: BasicGenParticleValidation.h:59
dqm
Definition: DQMStore.h:18
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
edm::Event
Definition: Event.h:73
BasicGenParticleValidation::genJetEta
MonitorElement * genJetEta
Definition: BasicGenParticleValidation.h:69
reco::LeafCandidate::px
double px() const final
x coordinate of momentum vector
Definition: LeafCandidate.h:140
reco::LeafCandidate::pz
double pz() const final
z coordinate of momentum vector
Definition: LeafCandidate.h:144
edm::InputTag
Definition: InputTag.h:15
weight
Definition: weight.py:1