CMS 3D CMS Logo

SimplePhotonAnalyzer.cc
Go to the documentation of this file.
1 
30 
31 #include "CLHEP/Units/GlobalPhysicalConstants.h"
32 
33 #include "TFile.h"
34 #include "TH1.h"
35 #include "TProfile.h"
36 
37 #include <memory>
38 #include <string>
39 
41 public:
44 
45  explicit SimplePhotonAnalyzer(const edm::ParameterSet&);
46  ~SimplePhotonAnalyzer() override;
47 
48  void analyze(const edm::Event&, const edm::EventSetup&) override;
49  void beginJob() override;
50  void endJob() override;
51 
52 private:
53  float etaTransformation(float a, float b);
54 
63 
65  float sample_;
66 
68 
87 
92 };
93 
96 
97 //========================================================================
99 //========================================================================
100 {
102  photonCollection_ = ps.getParameter<std::string>("photonCollection");
103 
104  barrelEcalHits_ = ps.getParameter<edm::InputTag>("barrelEcalHits");
105  endcapEcalHits_ = ps.getParameter<edm::InputTag>("endcapEcalHits");
106 
107  pfEgammaCandidates_ = ps.getParameter<edm::InputTag>("pfEgammaCandidates");
108  valueMapPFCandPhoton_ = ps.getParameter<std::string>("valueMapPhotons");
109 
110  mcProducer_ = ps.getParameter<std::string>("mcProducer");
111  //mcCollection_ = ps.getParameter<std::string>("mcCollection");
112  vertexProducer_ = ps.getParameter<std::string>("primaryVertexProducer");
113  sample_ = ps.getParameter<int>("sample");
114 }
115 
116 //========================================================================
118 //========================================================================
119 {}
120 
121 //========================================================================
123  //========================================================================
124 
125  dbe_ = nullptr;
127 
128  float hiE = 0;
129  float loE = 0;
130  float hiEt = 0;
131  float loEt = 0;
132  float dPhi = 0;
133  float loRes = 0;
134  float hiRes = 0;
135  if (sample_ == 1) {
136  loE = 0.;
137  hiE = 30.;
138  loEt = 0.;
139  hiEt = 30.;
140  dPhi = 0.2;
141  loRes = 0.;
142  hiRes = 1.2;
143  } else if (sample_ == 2) {
144  loE = 0.;
145  hiE = 200.;
146  loEt = 0.;
147  hiEt = 50.;
148  dPhi = 0.05;
149  loRes = 0.7;
150  hiRes = 1.2;
151  } else if (sample_ == 3) {
152  loE = 0.;
153  hiE = 500.;
154  loEt = 0.;
155  hiEt = 500.;
156  dPhi = 0.05;
157  loRes = 0.7;
158  hiRes = 1.2;
159  } else if (sample_ == 4) {
160  loE = 0.;
161  hiE = 6000.;
162  loEt = 0.;
163  hiEt = 1200.;
164  dPhi = 0.05;
165  loRes = 0.7;
166  hiRes = 1.2;
167  }
168 
169  h1_deltaEta_ = dbe_->book1D("deltaEta", " Reco photon Eta minus Generated photon Eta ", 100, -0.2, 0.2);
170  h1_deltaPhi_ = dbe_->book1D("deltaPhi", "Reco photon Phi minus Generated photon Phi ", 100, -dPhi, dPhi);
171  h1_pho_Eta_ = dbe_->book1D("phoEta", "Photon Eta ", 40, -3., 3.);
172  h1_pho_Phi_ = dbe_->book1D("phoPhi", "Photon Phi ", 40, -3.14, 3.14);
173  h1_pho_E_ = dbe_->book1D("phoE", "Photon Energy ", 100, loE, hiE);
174  h1_pho_Et_ = dbe_->book1D("phoEt", "Photon Et ", 100, loEt, hiEt);
175 
176  h1_scEta_ = dbe_->book1D("scEta", " SC Eta ", 40, -3., 3.);
177  h1_deltaEtaSC_ = dbe_->book1D("deltaEtaSC", " SC Eta minus Generated photon Eta ", 100, -0.02, 0.02);
178 
179  //
181  "recEoverTrueEBarrel", " Reco photon Energy over Generated photon Energy: Barrel ", 100, loRes, hiRes);
183  "recEoverTrueEEndcap", " Reco photon Energy over Generated photon Energy: Endcap ", 100, loRes, hiRes);
184 
185  //
186 
187  h1_pho_R9Barrel_ = dbe_->book1D("phoR9Barrel", "Photon 3x3 energy / SuperCluster energy : Barrel ", 100, 0., 1.2);
188  h1_pho_R9Endcap_ = dbe_->book1D("phoR9Endcap", "Photon 3x3 energy / SuperCluster energy : Endcap ", 100, 0., 1.2);
189  h1_pho_sigmaIetaIetaBarrel_ = dbe_->book1D("sigmaIetaIetaBarrel", "sigmaIetaIeta: Barrel", 100, 0., 0.05);
190  h1_pho_sigmaIetaIetaEndcap_ = dbe_->book1D("sigmaIetaIetaEndcap", "sigmaIetaIeta: Endcap", 100, 0., 0.1);
191  h1_pho_hOverEBarrel_ = dbe_->book1D("hOverEBarrel", "H/E: Barrel", 100, 0., 0.1);
192  h1_pho_hOverEEndcap_ = dbe_->book1D("hOverEEndcap", "H/E: Endcap", 100, 0., 0.1);
193  h1_pho_ecalIsoBarrel_ = dbe_->book1D("ecalIsolBarrel", "isolation et sum in Ecal: Barrel", 100, 0., 100.);
194  h1_pho_ecalIsoEndcap_ = dbe_->book1D("ecalIsolEndcap", "isolation et sum in Ecal: Endcap", 100, 0., 100.);
195  h1_pho_hcalIsoBarrel_ = dbe_->book1D("hcalIsolBarrel", "isolation et sum in Hcal: Barrel", 100, 0., 100.);
196  h1_pho_hcalIsoEndcap_ = dbe_->book1D("hcalIsolEndcap", "isolation et sum in Hcal: Endcap", 100, 0., 100.);
197  h1_pho_trkIsoBarrel_ = dbe_->book1D("trkIsolBarrel", "isolation pt sum in the tracker: Barrel", 100, 0., 100.);
198  h1_pho_trkIsoEndcap_ = dbe_->book1D("trkIsolEndcap", "isolation pt sum in the tracker: Endcap", 100, 0., 100.);
199 }
200 
201 //========================================================================
203  //========================================================================
204 
205  using namespace edm; // needed for all fwk related classes
206  edm::LogInfo("PhotonAnalyzer") << "Analyzing event number: " << evt.id() << "\n";
207 
208  // Get the corrected photon collection (set in the configuration) which also contains infos about conversions
209 
210  Handle<reco::PhotonCollection> photonHandle;
212  const reco::PhotonCollection photonCollection = *(photonHandle.product());
213 
214  Handle<HepMCProduct> hepProd;
215  evt.getByLabel(mcProducer_, hepProd);
216  const HepMC::GenEvent* myGenEvent = hepProd->GetEvent();
217 
218  // Get the PF refined cluster collection
219  Handle<reco::PFCandidateCollection> pfCandidateHandle;
220  evt.getByLabel(pfEgammaCandidates_, pfCandidateHandle);
221  if (!pfCandidateHandle.isValid()) {
222  edm::LogError("SimplePhotonAnalyzer") << "Error! Can't get the product " << pfEgammaCandidates_.label();
223  }
224 
225  edm::Handle<edm::ValueMap<reco::PhotonRef> > pfCandToPhotonMapHandle;
226  edm::ValueMap<reco::PhotonRef> pfCandToPhotonMap;
227  evt.getByLabel("gedPhotons", valueMapPFCandPhoton_, pfCandToPhotonMapHandle);
228  if (!pfCandToPhotonMapHandle.isValid()) {
229  edm::LogInfo("SimplePhotonAnalyzer") << "Error! Can't get the product: valueMapPhotons " << std::endl;
230  }
231  pfCandToPhotonMap = *(pfCandToPhotonMapHandle.product());
232 
233  std::cout << " SimplePhotonAnalyzer valueMap size" << pfCandToPhotonMap.size() << std::endl;
234  unsigned nObj = pfCandidateHandle->size();
235  for (unsigned int lCand = 0; lCand < nObj; lCand++) {
236  reco::PFCandidateRef pfCandRef(reco::PFCandidateRef(pfCandidateHandle, lCand));
237  if (pfCandRef->particleId() != reco::PFCandidate::gamma)
238  continue;
239  reco::PhotonRef myPho = (pfCandToPhotonMap)[pfCandRef];
240  if (myPho.isNonnull())
241  std::cout << " PF SC " << pfCandRef->superClusterRef()->energy() << " Photon SC "
242  << myPho->superCluster()->energy() << std::endl;
243  }
244 
245  for (HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end();
246  ++p) {
247  if (!((*p)->pdg_id() == 22 && (*p)->status() == 1))
248  continue;
249 
250  // single primary photons or photons from Higgs or RS Graviton
251  HepMC::GenParticle* mother = nullptr;
252  if ((*p)->production_vertex()) {
253  if ((*p)->production_vertex()->particles_begin(HepMC::parents) !=
254  (*p)->production_vertex()->particles_end(HepMC::parents))
255  mother = *((*p)->production_vertex()->particles_begin(HepMC::parents));
256  }
257  if (((mother == nullptr) || ((mother != nullptr) && (mother->pdg_id() == 25)) ||
258  ((mother != nullptr) && (mother->pdg_id() == 22)))) {
259  float minDelta = 10000.;
260  std::vector<reco::Photon> localPhotons;
261  int index = 0;
262  int iMatch = -1;
263 
264  float phiPho = (*p)->momentum().phi();
265  float etaPho = (*p)->momentum().eta();
266  etaPho = etaTransformation(etaPho, (*p)->production_vertex()->position().z() / 10.);
267 
268  bool matched = false;
269  // loop Photon candidates
270  for (reco::PhotonCollection::const_iterator iPho = photonCollection.begin(); iPho != photonCollection.end();
271  iPho++) {
272  reco::Photon localPho = reco::Photon(*iPho);
273  localPhotons.push_back(localPho);
274 
276  float phiClu = localPho.phi();
277  float etaClu = localPho.eta();
278  float deltaPhi = phiClu - phiPho;
279  float deltaEta = etaClu - etaPho;
280 
281  if (deltaPhi > pi)
282  deltaPhi -= twopi;
283  if (deltaPhi < -pi)
284  deltaPhi += twopi;
285  deltaPhi = std::pow(deltaPhi, 2);
286  deltaEta = std::pow(deltaEta, 2);
287  float delta = sqrt(deltaPhi + deltaEta);
288  if (delta < 0.1 && delta < minDelta) {
289  minDelta = delta;
290  iMatch = index;
291  }
292  index++;
293  } // End loop over photons
294 
295  if (iMatch > -1)
296  matched = true;
297 
299  if (matched) {
300  reco::Photon matchingPho = localPhotons[iMatch];
301 
302  bool phoIsInBarrel = false;
303  if (fabs(matchingPho.superCluster()->position().eta()) < 1.479) {
304  phoIsInBarrel = true;
305  }
306  edm::Handle<EcalRecHitCollection> ecalRecHitHandle;
307 
308  h1_scEta_->Fill(matchingPho.superCluster()->position().eta());
309  float trueEta = (*p)->momentum().eta();
310  trueEta = etaTransformation(trueEta, (*p)->production_vertex()->position().z() / 10.);
311  h1_deltaEtaSC_->Fill(localPhotons[iMatch].superCluster()->eta() - trueEta);
312 
313  float photonE = matchingPho.energy();
314  float photonEt = matchingPho.et();
315  float photonEta = matchingPho.eta();
316  float photonPhi = matchingPho.phi();
317 
318  float r9 = matchingPho.r9();
319  float sigmaIetaIeta = matchingPho.sigmaIetaIeta();
320  float hOverE = matchingPho.hadronicOverEm();
321  float ecalIso = matchingPho.ecalRecHitSumEtConeDR04();
322  float hcalIso = matchingPho.hcalTowerSumEtConeDR04();
323  float trkIso = matchingPho.trkSumPtSolidConeDR04();
324 
325  h1_pho_E_->Fill(photonE);
326  h1_pho_Et_->Fill(photonEt);
329 
330  h1_deltaEta_->Fill(photonEta - (*p)->momentum().eta());
331  h1_deltaPhi_->Fill(photonPhi - (*p)->momentum().phi());
332 
333  if (phoIsInBarrel) {
334  h1_recEoverTrueEBarrel_->Fill(photonE / (*p)->momentum().e());
336  h1_pho_sigmaIetaIetaBarrel_->Fill(sigmaIetaIeta);
338  h1_pho_ecalIsoBarrel_->Fill(ecalIso);
339  h1_pho_hcalIsoBarrel_->Fill(hcalIso);
340  h1_pho_trkIsoBarrel_->Fill(trkIso);
341 
342  } else {
343  h1_recEoverTrueEEndcap_->Fill(photonE / (*p)->momentum().e());
345  h1_pho_sigmaIetaIetaEndcap_->Fill(sigmaIetaIeta);
347  h1_pho_ecalIsoEndcap_->Fill(ecalIso);
348  h1_pho_hcalIsoEndcap_->Fill(hcalIso);
349  h1_pho_trkIsoEndcap_->Fill(trkIso);
350  }
351 
352  } // reco photon matching MC truth
353 
354  } // End loop over MC particles
355  }
356 }
357 
358 float SimplePhotonAnalyzer::etaTransformation(float EtaParticle, float Zvertex) {
359  //---Definitions
360  const float PI = 3.1415927;
361  //UNUSED const float TWOPI = 2.0*PI;
362 
363  //---Definitions for ECAL
364  const float R_ECAL = 136.5;
365  const float Z_Endcap = 328.0;
366  const float etaBarrelEndcap = 1.479;
367 
368  //---ETA correction
369 
370  float Theta = 0.0;
371  float ZEcal = R_ECAL * sinh(EtaParticle) + Zvertex;
372 
373  if (ZEcal != 0.0)
374  Theta = atan(R_ECAL / ZEcal);
375  if (Theta < 0.0)
376  Theta = Theta + PI;
377  float ETA = -log(tan(0.5 * Theta));
378 
379  if (fabs(ETA) > etaBarrelEndcap) {
380  float Zend = Z_Endcap;
381  if (EtaParticle < 0.0)
382  Zend = -Zend;
383  float Zlen = Zend - Zvertex;
384  float RR = Zlen / sinh(EtaParticle);
385  Theta = atan(RR / Zend);
386  if (Theta < 0.0)
387  Theta = Theta + PI;
388  ETA = -log(tan(0.5 * Theta));
389  }
390  //---Return the result
391  return ETA;
392  //---end
393 }
394 
395 //========================================================================
397  //========================================================================
398 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
TPRegexp parents
Definition: eve_filter.cc:21
float etaTransformation(float a, float b)
MonitorElement * h1_scEta_
MonitorElement * h1_deltaPhi_
float ecalRecHitSumEtConeDR04() const
Definition: Photon.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T const * product() const
Definition: Handle.h:70
edm::InputTag pfEgammaCandidates_
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
MonitorElement * h1_pho_R9Barrel_
MonitorElement * h1_pho_Eta_
MonitorElement * h1_pho_hcalIsoEndcap_
std::string const & label() const
Definition: InputTag.h:36
Log< level::Error, false > LogError
static constexpr float R_ECAL
MonitorElement * h1_recEoverTrueEEndcap_
static const double deltaEta
Definition: CaloConstants.h:8
MonitorElement * h1_recEoverTrueEBarrel_
const Double_t pi
void Fill(long long x)
float trkSumPtSolidConeDR04() const
Definition: Photon.h:495
#define ETA
void analyze(const edm::Event &, const edm::EventSetup &) override
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
float hcalTowerSumEtConeDR04(int depth=0) const
Definition: Photon.h:475
float sigmaIetaIeta() const
Definition: Photon.h:273
T sqrt(T t)
Definition: SSEVec.h:19
MonitorElement * h1_pho_trkIsoBarrel_
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
MonitorElement * h1_pho_E_
edm::EventID id() const
Definition: EventBase.h:59
static constexpr float etaBarrelEndcap
MonitorElement * h1_deltaEta_
MonitorElement * h1_pho_trkIsoEndcap_
#define PI
Definition: QcdUeDQM.h:37
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:37
SimplePhotonAnalyzer(const edm::ParameterSet &)
MonitorElement * h1_pho_hcalIsoBarrel_
Log< level::Info, false > LogInfo
float hadronicOverEm(int depth=0) const
Definition: Photon.h:236
MonitorElement * h1_pho_Phi_
MonitorElement * h1_pho_sigmaIetaIetaBarrel_
dqm::legacy::MonitorElement MonitorElement
std::vector< Photon > PhotonCollection
collectin of Photon objects
Definition: PhotonFwd.h:9
MonitorElement * h1_pho_hOverEEndcap_
double b
Definition: hdecay.h:118
dqm::legacy::DQMStore DQMStore
float r9() const
Definition: Photon.h:276
bool isValid() const
Definition: HandleBase.h:70
MonitorElement * h1_pho_R9Endcap_
size_t size() const
Definition: ValueMap.h:156
double et() const final
transverse energy
HLT enums.
double a
Definition: hdecay.h:119
static constexpr float ZEcal
MonitorElement * h1_pho_ecalIsoBarrel_
MonitorElement * h1_pho_ecalIsoEndcap_
MonitorElement * h1_pho_sigmaIetaIetaEndcap_
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
MonitorElement * h1_deltaEtaSC_
MonitorElement * h1_pho_Et_
double phi() const final
momentum azimuthal angle
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:500
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
std::string photonCollectionProducer_
static constexpr float Z_Endcap
MonitorElement * h1_pho_hOverEBarrel_
double energy() const final
energy
double eta() const final
momentum pseudorapidity