CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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");
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");
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");
80  "genJetPto10", "GenJet multiplicity above 10 GeV", 50, 0, 50, "N_{gen-jets P_{t}>10GeV}", "Number of Events");
82  "genJetPto100", "GenJet multiplicity above 100 GeV", 50, 0, 50, "N_{gen-jets P_{t}>100GeV}", "Number of Events");
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
133  iEvent.getByToken(genparticleCollectionToken_, genParticles);
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
211  iEvent.getByToken(genjetCollectionToken_, genJets);
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);
240  genJetEta->Fill(eta, 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 
261  genJetDeltaEtaMin->Fill(deltaEta, weight);
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 }
int pdgId() const final
PDG identifier.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
double px() const final
x coordinate of momentum vector
Definition: weight.py:1
bool matchParticles(const HepMC::GenParticle *&, const reco::GenParticle *&)
static const double deltaEta
Definition: CaloConstants.h:8
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
MonitorElement * book1dHisto(std::string name, std::string title, int n, double xmin, double xmax, std::string xaxis, std::string yaxis)
Definition: DQMHelper.cc:7
double pz() const final
z coordinate of momentum vector
edm::EDGetTokenT< reco::GenJetCollection > genjetCollectionToken_
T min(T a, T b)
Definition: MathUtil.h:58
edm::EDGetTokenT< edm::HepMCProduct > hepmcCollectionToken_
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:34
double py() const final
y coordinate of momentum vector
void analyze(const edm::Event &, const edm::EventSetup &) override
HLT enums.
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
BasicGenParticleValidation(const edm::ParameterSet &)
double weight(const edm::Event &)
edm::EDGetTokenT< reco::GenParticleCollection > genparticleCollectionToken_
Definition: Run.h:45