00001
00002
00003
00004
00005
00014
00015
00016
00017
00018
00019
00020
00022
00024 #include "RecoEgamma/PhotonIdentification/plugins/PhotonIDSimpleAnalyzer.h"
00025
00027
00029
00030
00031
00032 #include "DataFormats/EgammaCandidates/interface/Photon.h"
00033 #include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
00034
00035 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00036 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
00037 #include "DataFormats/JetReco/interface/CaloJet.h"
00038 #include "DataFormats/JetReco/interface/CaloJetCollection.h"
00039 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00040 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00041 #include "DataFormats/DetId/interface/DetId.h"
00042 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00043 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00044 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00045 #include "Geometry/CaloTopology/interface/EcalBarrelTopology.h"
00046 #include "FWCore/Framework/interface/ESHandle.h"
00047 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00048 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
00049 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00050 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00052
00054 #include "TH1F.h"
00055 #include "TH2F.h"
00056 #include "TFile.h"
00057 #include "TMath.h"
00058 #include "TTree.h"
00059
00060 using namespace std;
00061
00063
00065 PhotonIDSimpleAnalyzer::PhotonIDSimpleAnalyzer(const edm::ParameterSet& ps)
00066 {
00067
00068
00069
00070 outputFile_ = ps.getParameter<std::string>("outputFile");
00071
00072
00073 minPhotonEt_ = ps.getParameter<double>("minPhotonEt");
00074 minPhotonAbsEta_ = ps.getParameter<double>("minPhotonAbsEta");
00075 maxPhotonAbsEta_ = ps.getParameter<double>("maxPhotonAbsEta");
00076 minPhotonR9_ = ps.getParameter<double>("minPhotonR9");
00077 maxPhotonHoverE_ = ps.getParameter<double>("maxPhotonHoverE");
00078
00079
00080
00081 createPhotonTTree_ = ps.getParameter<bool>("createPhotonTTree");
00082
00083
00084 rootFile_ = TFile::Open(outputFile_.c_str(),"RECREATE");
00085 }
00086
00088
00090 PhotonIDSimpleAnalyzer::~PhotonIDSimpleAnalyzer()
00091 {
00092
00093
00094
00095
00096 delete rootFile_;
00097
00098 }
00099
00101
00103 void
00104 PhotonIDSimpleAnalyzer::beginJob()
00105 {
00106
00107
00108 rootFile_->cd();
00109
00110
00111
00112 h_isoEcalRecHit_ = new TH1F("photonEcalIso", "Ecal Rec Hit Isolation", 300, 0, 300);
00113 h_isoHcalRecHit_ = new TH1F("photonHcalIso", "Hcal Rec Hit Isolation", 300, 0, 300);
00114 h_trk_pt_solid_ = new TH1F("photonTrackSolidIso", "Sum of track pT in a cone of #DeltaR" , 300, 0, 300);
00115 h_trk_pt_hollow_ = new TH1F("photonTrackHollowIso", "Sum of track pT in a hollow cone" , 300, 0, 300);
00116 h_ntrk_solid_ = new TH1F("photonTrackCountSolid", "Number of tracks in a cone of #DeltaR", 100, 0, 100);
00117 h_ntrk_hollow_ = new TH1F("photonTrackCountHollow", "Number of tracks in a hollow cone", 100, 0, 100);
00118 h_ebetagap_ = new TH1F("photonInEBEtagap", "Ecal Barrel eta gap flag", 2, -0.5, 1.5);
00119 h_ebphigap_ = new TH1F("photonInEBEtagap", "Ecal Barrel phi gap flag", 2, -0.5, 1.5);
00120 h_eeringGap_ = new TH1F("photonInEERinggap", "Ecal Endcap ring gap flag", 2, -0.5, 1.5);
00121 h_eedeeGap_ = new TH1F("photonInEEDeegap", "Ecal Endcap dee gap flag", 2, -0.5, 1.5);
00122 h_ebeeGap_ = new TH1F("photonInEEgap", "Ecal Barrel/Endcap gap flag", 2, -0.5, 1.5);
00123 h_r9_ = new TH1F("photonR9", "R9 = E(3x3) / E(SuperCluster)", 300, 0, 3);
00124
00125
00126 h_photonEt_ = new TH1F("photonEt", "Photon E_{T}", 200, 0, 200);
00127 h_photonEta_ = new TH1F("photonEta", "Photon #eta", 800, -4, 4);
00128 h_photonPhi_ = new TH1F("photonPhi", "Photon #phi", 628, -1.*TMath::Pi(), TMath::Pi());
00129 h_hadoverem_ = new TH1F("photonHoverE", "Hadronic over EM", 200, 0, 1);
00130
00131
00132 h_photonScEt_ = new TH1F("photonScEt", "Photon SuperCluster E_{T}", 200, 0, 200);
00133 h_photonScEta_ = new TH1F("photonScEta", "Photon #eta", 800, -4, 4);
00134 h_photonScPhi_ = new TH1F("photonScPhi", "Photon #phi",628, -1.*TMath::Pi(), TMath::Pi());
00135 h_photonScEtaWidth_ = new TH1F("photonScEtaWidth","#eta-width", 100, 0, .1);
00136
00137
00138 h_photonInAnyGap_ = new TH1F("photonInAnyGap", "Photon in any gap flag", 2, -0.5, 1.5);
00139 h_nPassingPho_ = new TH1F("photonLoosePhoton", "Total number photons (0=NotPassing, 1=Passing)", 2, -0.5, 1.5);
00140 h_nPassEM_ = new TH1F("photonLooseEM", "Total number photons (0=NotPassing, 1=Passing)", 2, -0.5, 1.5);
00141 h_nPho_ = new TH1F("photonCount", "Number of photons passing cuts in event", 10, 0, 10);
00142
00143
00144 if ( createPhotonTTree_ ) {
00145 tree_PhotonAll_ = new TTree("TreePhotonAll", "Reconstructed Photon");
00146 tree_PhotonAll_->Branch("recPhoton", &recPhoton.isolationEcalRecHit, "isolationEcalRecHit/F:isolationHcalRecHit:isolationSolidTrkCone:isolationHollowTrkCone:nTrkSolidCone:nTrkHollowCone:isEBGap:isEEGap:isEBEEGap:r9:et:eta:phi:hadronicOverEm");
00147 }
00148 }
00149
00151
00153 void
00154 PhotonIDSimpleAnalyzer::analyze(const edm::Event& evt, const edm::EventSetup& es)
00155 {
00156
00157 using namespace std;
00158 using namespace edm;
00159
00160
00161 Handle<reco::PhotonCollection> photonColl;
00162 evt.getByLabel("photons", "", photonColl);
00163
00164 Handle<edm::ValueMap<Bool_t> > loosePhotonQual;
00165 evt.getByLabel("PhotonIDProd", "PhotonCutBasedIDLoose", loosePhotonQual);
00166 Handle<edm::ValueMap<Bool_t> > looseEMQual;
00167 evt.getByLabel("PhotonIDProd","PhotonCutBasedIDLooseEM",looseEMQual);
00168
00169
00170
00171
00172
00173 const reco::PhotonCollection *photons = photonColl.product();
00174 const edm::ValueMap<Bool_t> *phoMap = loosePhotonQual.product();
00175 const edm::ValueMap<Bool_t> *lEMMap = looseEMQual.product();
00176 int photonCounter = 0;
00177 int idxpho=0;
00178 reco::PhotonCollection::const_iterator pho;
00179 for (pho = (*photons).begin(); pho!= (*photons).end(); pho++){
00180
00181 edm::Ref<reco::PhotonCollection> photonref(photonColl, idxpho);
00182
00183
00184
00185
00186 float photonEt = pho->et();
00187 float superClusterEt = (pho->superCluster()->energy())/(cosh(pho->superCluster()->position().eta()));
00188 Bool_t LoosePhotonQu = (*phoMap)[photonref];
00189 h_nPassingPho_->Fill(LoosePhotonQu);
00190 Bool_t LooseEMQu = (*lEMMap)[photonref];
00191 h_nPassEM_->Fill(LooseEMQu);
00192
00193 bool passCuts = ( photonEt > minPhotonEt_ ) &&
00194 ( fabs(pho->eta()) > minPhotonAbsEta_ ) &&
00195 ( fabs(pho->eta()) < maxPhotonAbsEta_ ) &&
00196 ( pho->r9() > minPhotonR9_ ) &&
00197 ( pho->hadronicOverEm() < maxPhotonHoverE_ ) ;
00198
00199 if ( passCuts )
00200 {
00202
00204
00205 h_isoEcalRecHit_->Fill(pho->ecalRecHitSumEtConeDR04());
00206 h_isoHcalRecHit_->Fill(pho->hcalTowerSumEtConeDR04());
00207 h_trk_pt_solid_ ->Fill(pho->trkSumPtSolidConeDR04());
00208 h_trk_pt_hollow_->Fill(pho->trkSumPtHollowConeDR04());
00209 h_ntrk_solid_-> Fill(pho->nTrkSolidConeDR04());
00210 h_ntrk_hollow_-> Fill(pho->nTrkHollowConeDR04());
00211 h_ebetagap_-> Fill(pho->isEBEtaGap());
00212 h_ebphigap_-> Fill(pho->isEBPhiGap());
00213 h_eeringGap_-> Fill(pho->isEERingGap());
00214 h_eedeeGap_-> Fill(pho->isEEDeeGap());
00215 h_ebeeGap_-> Fill(pho->isEBEEGap());
00216 h_r9_-> Fill(pho->r9());
00217
00218
00219 h_photonEt_-> Fill(photonEt);
00220 h_photonEta_-> Fill(pho->eta());
00221 h_photonPhi_-> Fill(pho->phi());
00222 h_hadoverem_-> Fill(pho->hadronicOverEm());
00223
00224
00225
00226
00227 h_photonScEt_-> Fill(superClusterEt);
00228 h_photonScEta_-> Fill(pho->superCluster()->position().eta());
00229 h_photonScPhi_-> Fill(pho->superCluster()->position().phi());
00230 h_photonScEtaWidth_->Fill(pho->superCluster()->etaWidth());
00231
00232
00233
00235
00237 if ( createPhotonTTree_ ) {
00238 recPhoton.isolationEcalRecHit = pho->ecalRecHitSumEtConeDR04();
00239 recPhoton.isolationHcalRecHit = pho->hcalTowerSumEtConeDR04();
00240 recPhoton.isolationSolidTrkCone = pho->trkSumPtSolidConeDR04();
00241 recPhoton.isolationHollowTrkCone = pho->trkSumPtHollowConeDR04();
00242 recPhoton.nTrkSolidCone = pho->nTrkSolidConeDR04();
00243 recPhoton.nTrkHollowCone = pho->nTrkHollowConeDR04();
00244 recPhoton.isEBEtaGap = pho->isEBEtaGap();
00245 recPhoton.isEBPhiGap = pho->isEBPhiGap();
00246 recPhoton.isEERingGap = pho->isEERingGap();
00247 recPhoton.isEEDeeGap = pho->isEEDeeGap();
00248 recPhoton.isEBEEGap = pho->isEBEEGap();
00249 recPhoton.r9 = pho->r9();
00250 recPhoton.et = pho->et();
00251 recPhoton.eta = pho->eta();
00252 recPhoton.phi = pho->phi();
00253 recPhoton.hadronicOverEm = pho->hadronicOverEm();
00254
00255
00256
00257 tree_PhotonAll_->Fill();
00258 }
00259
00260
00261
00262 bool inAnyGap = pho->isEBEEGap() || (pho->isEB()&&pho->isEBEtaGap()) ||(pho->isEB()&&pho->isEBPhiGap()) || (pho->isEE()&&pho->isEERingGap()) || (pho->isEE()&&pho->isEEDeeGap()) ;
00263 if (inAnyGap) {
00264 h_photonInAnyGap_->Fill(1.0);
00265 } else {
00266 h_photonInAnyGap_->Fill(0.0);
00267 }
00268
00269 photonCounter++;
00270 }
00271 else
00272 {
00273
00274
00275 }
00276 idxpho++;
00277 }
00278 h_nPho_->Fill(photonCounter);
00279
00280 }
00281
00283
00285 void
00286 PhotonIDSimpleAnalyzer::endJob()
00287 {
00288
00289
00290 rootFile_->cd();
00291
00292
00293 h_isoEcalRecHit_->Write();
00294 h_isoHcalRecHit_->Write();
00295 h_trk_pt_solid_-> Write();
00296 h_trk_pt_hollow_->Write();
00297 h_ntrk_solid_-> Write();
00298 h_ntrk_hollow_-> Write();
00299 h_ebetagap_-> Write();
00300 h_ebphigap_-> Write();
00301 h_eeringGap_-> Write();
00302 h_eedeeGap_-> Write();
00303 h_ebeeGap_-> Write();
00304 h_r9_-> Write();
00305
00306
00307 h_photonEt_-> Write();
00308 h_photonEta_-> Write();
00309 h_photonPhi_-> Write();
00310 h_hadoverem_-> Write();
00311
00312
00313 h_photonScEt_-> Write();
00314 h_photonScEta_-> Write();
00315 h_photonScPhi_-> Write();
00316 h_photonScEtaWidth_->Write();
00317
00318
00319 h_photonInAnyGap_->Write();
00320 h_nPassingPho_-> Write();
00321 h_nPassEM_-> Write();
00322 h_nPho_-> Write();
00323
00324
00325 rootFile_->Write();
00326 rootFile_->Close();
00327
00328 }
00329
00330
00331