00001 #include <iostream>
00002
00003 #include "FWCore/ServiceRegistry/interface/Service.h"
00004 #include "PhysicsTools/UtilAlgos/interface/TFileService.h"
00005
00006 #include "DQMOffline/EGamma/interface/PhotonAnalyzer.h"
00007
00008 #include "FWCore/Framework/interface/MakerMacros.h"
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010 #include "FWCore/Utilities/interface/Exception.h"
00011
00012 #include "DataFormats/Common/interface/Handle.h"
00013 #include "DataFormats/TrackReco/interface/Track.h"
00014 #include "DataFormats/TrackReco/interface/TrackExtra.h"
00015 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00016 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
00017 #include "DataFormats/EgammaCandidates/interface/ConversionFwd.h"
00018 #include "DataFormats/EgammaCandidates/interface/Photon.h"
00019 #include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
00020 #include "DataFormats/EgammaCandidates/interface/PhotonIDFwd.h"
00021 #include "DataFormats/EgammaCandidates/interface/PhotonID.h"
00022 #include "DataFormats/EgammaCandidates/interface/PhotonIDAssociation.h"
00023 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00024 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00025 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00026 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
00027 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00028 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h"
00030 #include "RecoEcal/EgammaCoreTools/interface/PositionCalc.h"
00031 #include "RecoEcal/EgammaCoreTools/interface/EcalEtaPhiRegion.h"
00032 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterTools.h"
00033
00034 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00035 #include "Geometry/CaloTopology/interface/CaloTopology.h"
00036 #include "Geometry/CaloTopology/interface/CaloSubdetectorTopology.h"
00037 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00038 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00039 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00040 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00041 #include "Geometry/CaloTopology/interface/EcalEndcapTopology.h"
00042 #include "Geometry/CaloTopology/interface/EcalBarrelTopology.h"
00043
00044 #include "TFile.h"
00045 #include "TH1.h"
00046 #include "TH2.h"
00047 #include "TTree.h"
00048 #include "TVector3.h"
00049 #include "TProfile.h"
00050
00051
00052
00053
00067 using namespace std;
00068
00069
00070 PhotonAnalyzer::PhotonAnalyzer( const edm::ParameterSet& pset )
00071 {
00072
00073 fName_ = pset.getUntrackedParameter<std::string>("Name");
00074 verbosity_ = pset.getUntrackedParameter<int>("Verbosity");
00075
00076 prescaleFactor_ = pset.getUntrackedParameter<int>("prescaleFactor",1);
00077
00078 photonProducer_ = pset.getParameter<std::string>("phoProducer");
00079 photonCollection_ = pset.getParameter<std::string>("photonCollection");
00080
00081 barrelEcalHits_ = pset.getParameter<edm::InputTag>("barrelEcalHits");
00082 endcapEcalHits_ = pset.getParameter<edm::InputTag>("endcapEcalHits");
00083
00084 minPhoEtCut_ = pset.getParameter<double>("minPhoEtCut");
00085
00086 cutStep_ = pset.getParameter<double>("cutStep");
00087 numberOfSteps_ = pset.getParameter<int>("numberOfSteps");
00088
00089 useBinning_ = pset.getParameter<bool>("useBinning");
00090
00091 isolationStrength_ = pset.getParameter<int>("isolationStrength");
00092
00093
00094 seleXtalMinEnergy_ = pset.getParameter<double> ("seleXtalMinEnergy");
00095 clusSeedThr_ = pset.getParameter<double> ("clusSeedThr");
00096 clusEtaSize_ = pset.getParameter<int> ("clusEtaSize");
00097 clusPhiSize_ = pset.getParameter<int> ("clusPhiSize");
00098 ParameterLogWeighted_ = pset.getParameter<bool> ("ParameterLogWeighted");
00099 ParameterX0_ = pset.getParameter<double> ("ParameterX0");
00100 ParameterT0_barl_ = pset.getParameter<double> ("ParameterT0_barl");
00101 ParameterW0_ = pset.getParameter<double> ("ParameterW0");
00102
00103 selePtGammaOne_ = pset.getParameter<double> ("selePtGammaOne");
00104 selePtGammaTwo_ = pset.getParameter<double> ("selePtGammaTwo");
00105 seleS4S9GammaOne_ = pset.getParameter<double> ("seleS4S9GammaOne");
00106 seleS4S9GammaTwo_ = pset.getParameter<double> ("seleS4S9GammaTwo");
00107 selePtPi0_ = pset.getParameter<double> ("selePtPi0");
00108 selePi0Iso_ = pset.getParameter<double> ("selePi0Iso");
00109 selePi0BeltDR_ = pset.getParameter<double> ("selePi0BeltDR");
00110 selePi0BeltDeta_ = pset.getParameter<double> ("selePi0BeltDeta");
00111 seleMinvMaxPi0_ = pset.getParameter<double> ("seleMinvMaxPi0");
00112 seleMinvMinPi0_ = pset.getParameter<double> ("seleMinvMinPi0");
00113
00114 parameters_ = pset;
00115
00116
00117 }
00118
00119
00120
00121 PhotonAnalyzer::~PhotonAnalyzer() {
00122
00123
00124
00125
00126 }
00127
00128
00129 void PhotonAnalyzer::beginJob( const edm::EventSetup& setup)
00130 {
00131
00132
00133 nEvt_=0;
00134 nEntry_=0;
00135
00136 dbe_ = 0;
00137 dbe_ = edm::Service<DQMStore>().operator->();
00138
00139
00140
00141 if (dbe_) {
00142 if (verbosity_ > 0 ) {
00143 dbe_->setVerbose(1);
00144 } else {
00145 dbe_->setVerbose(0);
00146 }
00147 }
00148 if (dbe_) {
00149 if (verbosity_ > 0 ) dbe_->showDirStructure();
00150 }
00151
00152
00153
00154 double eMin = parameters_.getParameter<double>("eMin");
00155 double eMax = parameters_.getParameter<double>("eMax");
00156 int eBin = parameters_.getParameter<int>("eBin");
00157
00158 double etMin = parameters_.getParameter<double>("etMin");
00159 double etMax = parameters_.getParameter<double>("etMax");
00160 int etBin = parameters_.getParameter<int>("etBin");
00161
00162 double etaMin = parameters_.getParameter<double>("etaMin");
00163 double etaMax = parameters_.getParameter<double>("etaMax");
00164 int etaBin = parameters_.getParameter<int>("etaBin");
00165
00166 double phiMin = parameters_.getParameter<double>("phiMin");
00167 double phiMax = parameters_.getParameter<double>("phiMax");
00168 int phiBin = parameters_.getParameter<int>("phiBin");
00169
00170
00171 double r9Min = parameters_.getParameter<double>("r9Min");
00172 double r9Max = parameters_.getParameter<double>("r9Max");
00173 int r9Bin = parameters_.getParameter<int>("r9Bin");
00174
00175 double dPhiTracksMin = parameters_.getParameter<double>("dPhiTracksMin");
00176 double dPhiTracksMax = parameters_.getParameter<double>("dPhiTracksMax");
00177 int dPhiTracksBin = parameters_.getParameter<int>("dPhiTracksBin");
00178
00179 double dEtaTracksMin = parameters_.getParameter<double>("dEtaTracksMin");
00180 double dEtaTracksMax = parameters_.getParameter<double>("dEtaTracksMax");
00181 int dEtaTracksBin = parameters_.getParameter<int>("dEtaTracksBin");
00182
00183
00184 vector<string> parts;
00185 parts.push_back("AllEcal");
00186 parts.push_back("Barrel");
00187 parts.push_back("Endcaps");
00188
00189
00190 vector<string> types;
00191 types.push_back("All");
00192 types.push_back("Isolated");
00193 types.push_back("Nonisolated");
00194
00195
00196
00197 if (dbe_) {
00198
00199
00200 for(int cut = 0; cut != numberOfSteps_; ++cut){
00201
00202
00203
00204
00205 currentFolder_.str("");
00206 currentFolder_ << "Egamma/PhotonAnalyzer/IsolationVariables/Et above " << cut*cutStep_ << " GeV";
00207 dbe_->setCurrentFolder(currentFolder_.str());
00208
00209 h_nTrackIsolSolid_.push_back(dbe_->book2D("nIsoTracksSolid2D","Avg Number Of Tracks in the Solid Iso Cone",etaBin,etaMin, etaMax,10,-0.5, 9.5));
00210 h_trackPtSumSolid_.push_back(dbe_->book2D("isoPtSumSolid2D","Avg Tracks Pt Sum in the Solid Iso Cone",etaBin,etaMin, etaMax,100,0., 20.));
00211 h_nTrackIsolHollow_.push_back(dbe_->book2D("nIsoTracksHollow2D","Avg Number Of Tracks in the Hollow Iso Cone",etaBin,etaMin, etaMax,10,-0.5, 9.5));
00212 h_trackPtSumHollow_.push_back(dbe_->book2D("isoPtSumHollow2D","Avg Tracks Pt Sum in the Hollow Iso Cone",etaBin,etaMin, etaMax,100,0., 20.));
00213 h_ecalSum_.push_back(dbe_->book2D("ecalSum2D","Avg Ecal Sum in the Iso Cone",etaBin,etaMin, etaMax,100,0., 20.));
00214 h_hcalSum_.push_back(dbe_->book2D("hcalSum2D","Avg Hcal Sum in the Iso Cone",etaBin,etaMin, etaMax,100,0., 20.));
00215 p_nTrackIsolSolid_.push_back(dbe_->book1D("nIsoTracksSolid","Avg Number Of Tracks in the Solid Iso Cone",etaBin,etaMin, etaMax));
00216 p_trackPtSumSolid_.push_back(dbe_->book1D("isoPtSumSolid","Avg Tracks Pt Sum in the Solid Iso Cone",etaBin,etaMin, etaMax));
00217 p_nTrackIsolHollow_.push_back(dbe_->book1D("nIsoTracksHollow","Avg Number Of Tracks in the Hollow Iso Cone",etaBin,etaMin, etaMax));
00218 p_trackPtSumHollow_.push_back(dbe_->book1D("isoPtSumHollow","Avg Tracks Pt Sum in the Hollow Iso Cone",etaBin,etaMin, etaMax));
00219 p_ecalSum_.push_back(dbe_->book1D("ecalSum","Avg Ecal Sum in the Iso Cone",etaBin,etaMin, etaMax));
00220 p_hcalSum_.push_back(dbe_->book1D("hcalSum","Avg Hcal Sum in the Iso Cone",etaBin,etaMin, etaMax));
00221
00222
00223
00224 p_efficiencyVsEta_.push_back(dbe_->book1D("EfficiencyVsEta","Fraction of isolated Photons vs. Eta",etaBin,etaMin, etaMax));
00225 p_efficiencyVsEt_.push_back(dbe_->book1D("EfficiencyVsEt","Fraction of isolated Photons vs. Et",etBin,etMin, etMax));
00226
00227
00228
00229
00230 for(int type=0;type!=3;++type){
00231
00232 currentFolder_.str("");
00233 currentFolder_ << "Egamma/PhotonAnalyzer/" << types[type] << "Photons/Et above " << cut*cutStep_ << " GeV";
00234 dbe_->setCurrentFolder(currentFolder_.str());
00235
00236 for(int part=0;part!=3;++part){
00237
00238 h_phoE_part_.push_back(dbe_->book1D("phoE"+parts[part],types[type]+" Photon Energy: "+parts[part], eBin,eMin, eMax));
00239 h_phoEt_part_.push_back(dbe_->book1D("phoEt"+parts[part],types[type]+" Photon Transverse Energy: "+parts[part], etBin,etMin, etMax));
00240 h_r9_part_.push_back(dbe_->book1D("r9"+parts[part],types[type]+" Photon r9: "+parts[part],r9Bin,r9Min, r9Max));
00241 h_hOverE_part_.push_back(dbe_->book1D("hOverE"+parts[part],types[type]+" Photon H/E: "+parts[part],r9Bin,r9Min, 1));
00242 h_nPho_part_.push_back(dbe_->book1D("nPho"+parts[part],"Number of "+types[type]+" Photons per Event: "+parts[part], 10,-0.5,9.5));
00243 }
00244
00245 h_phoDistribution_part_.push_back(dbe_->book2D("DistributionAllEcal","Distribution of "+types[type]+" Photons in Eta/Phi: AllEcal",phiBin,phiMin,phiMax,etaBin,-2.5,2.5));
00246 h_phoDistribution_part_.push_back(dbe_->book2D("DistributionBarrel","Distribution of "+types[type]+" Photons in Eta/Phi: Barrel",360,phiMin,phiMax,170,-1.5,1.5));
00247 h_phoDistribution_part_.push_back(dbe_->book2D("DistributionEndcapMinus","Distribution of "+types[type]+" Photons in X/Y: EndcapMinus",100,-150,150,100,-150,150));
00248 h_phoDistribution_part_.push_back(dbe_->book2D("DistributionEndcapPlus","Distribution of "+types[type]+" Photons in X/Y: EndcapPlus",100,-150,150,100,-150,150));
00249
00250 h_phoE_isol_.push_back(h_phoE_part_);
00251 h_phoE_part_.clear();
00252 h_phoEt_isol_.push_back(h_phoEt_part_);
00253 h_phoEt_part_.clear();
00254 h_r9_isol_.push_back(h_r9_part_);
00255 h_r9_part_.clear();
00256 h_hOverE_isol_.push_back(h_hOverE_part_);
00257 h_hOverE_part_.clear();
00258 h_nPho_isol_.push_back(h_nPho_part_);
00259 h_nPho_part_.clear();
00260
00261 h_phoDistribution_isol_.push_back(h_phoDistribution_part_);
00262 h_phoDistribution_part_.clear();
00263
00264 h_phoEta_isol_.push_back(dbe_->book1D("phoEta",types[type]+" Photon Eta ",etaBin,etaMin, etaMax)) ;
00265 h_phoPhi_isol_.push_back(dbe_->book1D("phoPhi",types[type]+" Photon Phi ",phiBin,phiMin,phiMax)) ;
00266 h_r9VsEt_isol_.push_back(dbe_->book2D("r9VsEt2D",types[type]+" Photon r9 vs. Transverse Energy",etBin,etMin,etMax,r9Bin,r9Min,r9Max));
00267 p_r9VsEt_isol_.push_back(dbe_->book1D("r9VsEt",types[type]+" Photon r9 vs. Transverse Energy",etBin,etMin,etMax));
00268
00269
00270 }
00271
00272 h_phoE_.push_back(h_phoE_isol_);
00273 h_phoE_isol_.clear();
00274 h_phoEt_.push_back(h_phoEt_isol_);
00275 h_phoEt_isol_.clear();
00276 h_r9_.push_back(h_r9_isol_);
00277 h_r9_isol_.clear();
00278 h_hOverE_.push_back(h_hOverE_isol_);
00279 h_hOverE_isol_.clear();
00280 h_nPho_.push_back(h_nPho_isol_);
00281 h_nPho_isol_.clear();
00282
00283 h_phoDistribution_.push_back(h_phoDistribution_isol_);
00284 h_phoDistribution_isol_.clear();
00285
00286 h_phoEta_.push_back(h_phoEta_isol_);
00287 h_phoEta_isol_.clear();
00288 h_phoPhi_.push_back(h_phoPhi_isol_);
00289 h_phoPhi_isol_.clear();
00290 h_r9VsEt_.push_back(h_r9VsEt_isol_);
00291 h_r9VsEt_isol_.clear();
00292 p_r9VsEt_.push_back(p_r9VsEt_isol_);
00293 p_r9VsEt_isol_.clear();
00294
00295
00296
00297
00298
00299 for(int type=0;type!=3;++type){
00300
00301 currentFolder_.str("");
00302 currentFolder_ << "Egamma/PhotonAnalyzer/" << types[type] << "Photons/Et above " << cut*cutStep_ << " GeV/Conversions";
00303 dbe_->setCurrentFolder(currentFolder_.str());
00304
00305 for(int part=0;part!=3;++part){
00306
00307 h_nConv_part_.push_back(dbe_->book1D("nConv"+parts[part],"Number Of Conversions per Event: "+parts[part] ,10,-0.5, 9.5));
00308 h_eOverPTracks_part_.push_back(dbe_->book1D("eOverPTracks"+parts[part],"E/P of Conversions: "+parts[part] ,100, 0., 5.));
00309
00310 h_dPhiTracksAtVtx_part_.push_back(dbe_->book1D("dPhiTracksAtVtx"+parts[part], " #delta#phi of Conversion Tracks at Vertex: "+parts[part],dPhiTracksBin,dPhiTracksMin,dPhiTracksMax));
00311 h_dCotTracks_part_.push_back(dbe_->book1D("dCotTracks"+parts[part],"#delta cotg(#Theta) of Conversion Tracks: "+parts[part],dEtaTracksBin,dEtaTracksMin,dEtaTracksMax));
00312
00313 h_dPhiTracksAtEcal_part_.push_back(dbe_->book1D("dPhiTracksAtEcal"+parts[part], " #delta#phi of Conversion Tracks at Ecal: "+parts[part],dPhiTracksBin,0.,dPhiTracksMax));
00314 h_dEtaTracksAtEcal_part_.push_back(dbe_->book1D("dEtaTracksAtEcal"+parts[part], " #delta#eta of Conversion Tracks at Ecal: "+parts[part],dEtaTracksBin,dEtaTracksMin,dEtaTracksMax));
00315 }
00316
00317 h_nConv_isol_.push_back(h_nConv_part_);
00318 h_nConv_part_.clear();
00319 h_eOverPTracks_isol_.push_back(h_eOverPTracks_part_);
00320 h_eOverPTracks_part_.clear();
00321 h_dPhiTracksAtVtx_isol_.push_back(h_dPhiTracksAtVtx_part_);
00322 h_dPhiTracksAtVtx_part_.clear();
00323 h_dCotTracks_isol_.push_back(h_dCotTracks_part_);
00324 h_dCotTracks_part_.clear();
00325 h_dPhiTracksAtEcal_isol_.push_back(h_dPhiTracksAtEcal_part_);
00326 h_dPhiTracksAtEcal_part_.clear();
00327 h_dEtaTracksAtEcal_isol_.push_back(h_dEtaTracksAtEcal_part_);
00328 h_dEtaTracksAtEcal_part_.clear();
00329
00330
00331 h_phoConvEta_isol_.push_back(dbe_->book1D("phoConvEta",types[type]+" Converted Photon Eta ",etaBin,etaMin, etaMax)) ;
00332 h_phoConvPhi_isol_.push_back(dbe_->book1D("phoConvPhi",types[type]+" Converted Photon Phi ",phiBin,phiMin,phiMax)) ;
00333 h_convVtxRvsZ_isol_.push_back(dbe_->book2D("convVtxRvsZ",types[type]+" Photon Reco conversion vtx position",100, 0., 280.,200,0., 120.));
00334 h_nHitsVsEta_isol_.push_back(dbe_->book2D("nHitsVsEta2D",types[type]+" Photons: Tracks from conversions: Mean Number of Hits vs Eta",etaBin,etaMin, etaMax,etaBin,0, 16));
00335 p_nHitsVsEta_isol_.push_back(dbe_->book1D("nHitsVsEta",types[type]+" Photons: Tracks from conversions: Mean Number of Hits vs Eta",etaBin,etaMin, etaMax));
00336 h_tkChi2_isol_.push_back(dbe_->book1D("tkChi2",types[type]+" Photons: Tracks from conversions: #chi^{2} of all tracks", 100, 0., 20.0));
00337 }
00338
00339 h_nConv_.push_back(h_nConv_isol_);
00340 h_nConv_isol_.clear();
00341 h_eOverPTracks_.push_back(h_eOverPTracks_isol_);
00342 h_eOverPTracks_isol_.clear();
00343 h_dPhiTracksAtVtx_.push_back(h_dPhiTracksAtVtx_isol_);
00344 h_dPhiTracksAtVtx_isol_.clear();
00345 h_dCotTracks_.push_back(h_dCotTracks_isol_);
00346 h_dCotTracks_isol_.clear();
00347 h_dPhiTracksAtEcal_.push_back(h_dPhiTracksAtEcal_isol_);
00348 h_dPhiTracksAtEcal_isol_.clear();
00349 h_dEtaTracksAtEcal_.push_back(h_dEtaTracksAtEcal_isol_);
00350 h_dEtaTracksAtEcal_isol_.clear();
00351
00352 h_phoConvEta_.push_back(h_phoConvEta_isol_);
00353 h_phoConvEta_isol_.clear();
00354 h_phoConvPhi_.push_back(h_phoConvPhi_isol_);
00355 h_phoConvPhi_isol_.clear();
00356 h_convVtxRvsZ_.push_back(h_convVtxRvsZ_isol_);
00357 h_convVtxRvsZ_isol_.clear();
00358 h_tkChi2_.push_back(h_tkChi2_isol_);
00359 h_tkChi2_isol_.clear();
00360 h_nHitsVsEta_.push_back(h_nHitsVsEta_isol_);
00361 h_nHitsVsEta_isol_.clear();
00362 p_nHitsVsEta_.push_back(p_nHitsVsEta_isol_);
00363 p_nHitsVsEta_isol_.clear();
00364
00365 }
00366
00367
00368 currentFolder_.str("");
00369 currentFolder_ << "Egamma/PhotonAnalyzer/PiZero";
00370 dbe_->setCurrentFolder(currentFolder_.str());
00371
00372 hMinvPi0EB_ = dbe_->book1D("Pi0InvmassEB","Pi0 Invariant Mass in EB",100,0.,0.5);
00373 hMinvPi0EB_->setAxisTitle("Inv Mass [GeV] ",1);
00374
00375 hPt1Pi0EB_ = dbe_->book1D("Pt1Pi0EB","Pt 1st most energetic Pi0 photon in EB",100,0.,20.);
00376 hPt1Pi0EB_->setAxisTitle("1st photon Pt [GeV] ",1);
00377
00378 hPt2Pi0EB_ = dbe_->book1D("Pt2Pi0EB","Pt 2nd most energetic Pi0 photon in EB",100,0.,20.);
00379 hPt2Pi0EB_->setAxisTitle("2nd photon Pt [GeV] ",1);
00380
00381 hPtPi0EB_ = dbe_->book1D("PtPi0EB","Pi0 Pt in EB",100,0.,20.);
00382 hPtPi0EB_->setAxisTitle("Pi0 Pt [GeV] ",1);
00383
00384 hIsoPi0EB_ = dbe_->book1D("IsoPi0EB","Pi0 Iso in EB",50,0.,1.);
00385 hIsoPi0EB_->setAxisTitle("Pi0 Iso",1);
00386
00387
00388 }
00389
00390
00391 }
00392
00393
00394
00395 void PhotonAnalyzer::analyze( const edm::Event& e, const edm::EventSetup& esup )
00396 {
00397
00398 using namespace edm;
00399
00400 if (nEvt_% prescaleFactor_ ) return;
00401 nEvt_++;
00402 LogInfo("PhotonAnalyzer") << "PhotonAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_ <<"\n";
00403
00404
00405
00406 Handle<reco::PhotonCollection> photonHandle;
00407 e.getByLabel(photonProducer_, photonCollection_ , photonHandle);
00408 if ( !photonHandle.isValid()) return;
00409 const reco::PhotonCollection photonCollection = *(photonHandle.product());
00410
00411
00412
00413 Handle<reco::PhotonIDAssociationCollection> photonIDMapColl;
00414 e.getByLabel("PhotonIDProd", "PhotonAssociatedID", photonIDMapColl);
00415 if ( !photonIDMapColl.isValid()) return;
00416 const reco::PhotonIDAssociationCollection *phoMap = photonIDMapColl.product();
00417
00418
00419
00420 bool validEcalRecHits=true;
00421 Handle<EcalRecHitCollection> barrelHitHandle;
00422 EcalRecHitCollection barrelRecHits;
00423 e.getByLabel(barrelEcalHits_, barrelHitHandle);
00424 if (!barrelHitHandle.isValid()) {
00425 edm::LogError("PhotonProducer") << "Error! Can't get the product "<<barrelEcalHits_.label();
00426 validEcalRecHits=false;
00427 }
00428
00429 Handle<EcalRecHitCollection> endcapHitHandle;
00430 e.getByLabel(endcapEcalHits_, endcapHitHandle);
00431 EcalRecHitCollection endcapRecHits;
00432 if (!endcapHitHandle.isValid()) {
00433 edm::LogError("PhotonProducer") << "Error! Can't get the product "<<endcapEcalHits_.label();
00434 validEcalRecHits=false;
00435 }
00436
00437
00438
00439
00440
00441
00442
00443 int nPho[100][3][3];
00444
00445 for (int cut=0; cut!=100; ++cut){
00446 for (int type=0; type!=3; ++type){
00447 for (int part=0; part!=3; ++part){
00448 nPho[cut][type][part] = 0;
00449 }
00450 }
00451 }
00452
00453
00454 int photonCounter = 0;
00455
00456
00457 for( reco::PhotonCollection::const_iterator iPho = photonCollection.begin(); iPho != photonCollection.end(); iPho++) {
00458
00459 if ((*iPho).superCluster()->energy()/cosh( (*iPho).superCluster()->eta()) < minPhoEtCut_) continue;
00460
00461 edm::Ref<reco::PhotonCollection> photonref(photonHandle, photonCounter);
00462 photonCounter++;
00463 reco::PhotonIDAssociationCollection::const_iterator photonIter = phoMap->find(photonref);
00464 const reco::PhotonIDRef &phtn = photonIter->val;
00465
00466
00467 bool phoIsInBarrel=false;
00468 bool phoIsInEndcap=false;
00469 bool phoIsInEndcapMinus=false;
00470 bool phoIsInEndcapPlus=false;
00471 float etaPho = (*iPho).superCluster()->eta();
00472 if ( fabs(etaPho) < 1.479 )
00473 phoIsInBarrel=true;
00474 else {
00475 phoIsInEndcap=true;
00476 if ( etaPho < 0.0 )
00477 phoIsInEndcapMinus=true;
00478 else
00479 phoIsInEndcapPlus=true;
00480 }
00481
00482
00483 bool isIsolated=false;
00484 if ( isolationStrength_ == 1) isIsolated = (phtn)->isLooseEM();
00485 else if ( isolationStrength_ == 2) isIsolated = (phtn)->isLoosePhoton();
00486 else if ( isolationStrength_ == 3) isIsolated = (phtn)->isTightPhoton();
00487
00488 int type=0;
00489 if ( isIsolated ) type=1;
00490 if ( !isIsolated ) type=2;
00491
00492
00493 nEntry_++;
00494
00495 float r9 = (phtn)->r9();
00496
00497 for (int cut=0; cut !=numberOfSteps_; ++cut) {
00498 double Et = (*iPho).energy()/cosh( (*iPho).superCluster()->eta());
00499
00500 bool passesCuts = false;
00501
00502 if ( useBinning_ && Et > cut*cutStep_ && ( Et < (cut+1)*cutStep_ | cut == numberOfSteps_-1 ) ){
00503 passesCuts = true;
00504 }
00505 else if ( !useBinning_ && Et > cut*cutStep_ ){
00506 passesCuts = true;
00507 }
00508
00509 if (passesCuts){
00510
00511 h_nTrackIsolSolid_[cut]->Fill( (*iPho).superCluster()->eta(),(phtn)->nTrkSolidCone());
00512 h_trackPtSumSolid_[cut]->Fill((*iPho).superCluster()->eta(), (phtn)->isolationSolidTrkCone());
00513
00514 h_nTrackIsolHollow_[cut]->Fill( (*iPho).superCluster()->eta(),(phtn)->nTrkHollowCone());
00515 h_trackPtSumHollow_[cut]->Fill((*iPho).superCluster()->eta(), (phtn)->isolationHollowTrkCone());
00516
00517 h_ecalSum_[cut]->Fill((*iPho).superCluster()->eta(), (phtn)->isolationEcalRecHit());
00518 h_hcalSum_[cut]->Fill((*iPho).superCluster()->eta(), (phtn)->isolationHcalRecHit());
00519
00520
00521
00522 h_phoE_[cut][0][0]->Fill( (*iPho).energy() );
00523 h_phoEt_[cut][0][0]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()) );
00524
00525 h_r9_[cut][0][0]->Fill( r9 );
00526 h_hOverE_[cut][0][0]->Fill( (*iPho).hadronicOverEm() );
00527
00528 nPho[cut][0][0]++;
00529 h_nConv_[cut][0][0]->Fill(float( (*iPho).conversions().size() ));
00530
00531 h_phoDistribution_[cut][0][0]->Fill( (*iPho).superCluster()->phi(),(*iPho).superCluster()->eta() );
00532
00533 h_phoEta_[cut][0]->Fill( (*iPho).superCluster()->eta() );
00534 h_phoPhi_[cut][0]->Fill( (*iPho).superCluster()->phi() );
00535
00536 h_r9VsEt_[cut][0]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()), r9 );
00537
00538
00539
00540 h_phoE_[cut][type][0]->Fill( (*iPho).energy() );
00541 h_phoEt_[cut][type][0]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()) );
00542
00543 h_r9_[cut][type][0]->Fill( r9 );
00544 h_hOverE_[cut][type][0]->Fill( (*iPho).hadronicOverEm() );
00545
00546 nPho[cut][type][0]++;
00547 h_nConv_[cut][type][0]->Fill(float( (*iPho).conversions().size() ));
00548
00549 h_phoDistribution_[cut][type][0]->Fill( (*iPho).superCluster()->phi(),(*iPho).superCluster()->eta() );
00550
00551 h_phoEta_[cut][type]->Fill( (*iPho).superCluster()->eta() );
00552 h_phoPhi_[cut][type]->Fill( (*iPho).superCluster()->phi() );
00553
00554 h_r9VsEt_[cut][type]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()), r9 );
00555
00556
00557
00558 int part = 0;
00559 if ( phoIsInBarrel )
00560 part = 1;
00561 if ( phoIsInEndcap )
00562 part = 2;
00563
00564 h_phoE_[cut][0][part]->Fill( (*iPho).energy() );
00565 h_phoEt_[cut][0][part]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()) );
00566
00567 h_r9_[cut][0][part]->Fill( r9 );
00568 h_hOverE_[cut][0][part]->Fill( (*iPho).hadronicOverEm() );
00569
00570 nPho[cut][0][part]++;
00571 h_nConv_[cut][0][part]->Fill(float( (*iPho).conversions().size() ));
00572
00573 if ( phoIsInBarrel ) h_phoDistribution_[cut][0][1]->Fill( (*iPho).superCluster()->phi(),(*iPho).superCluster()->eta() );
00574 if ( phoIsInEndcapMinus ) h_phoDistribution_[cut][0][2]->Fill( (*iPho).superCluster()->x(),(*iPho).superCluster()->y() );
00575 if ( phoIsInEndcapPlus ) h_phoDistribution_[cut][0][3]->Fill( (*iPho).superCluster()->x(),(*iPho).superCluster()->y() );
00576
00577
00578 h_phoE_[cut][type][part]->Fill( (*iPho).energy() );
00579 h_phoEt_[cut][type][part]->Fill( (*iPho).energy()/ cosh( (*iPho).superCluster()->eta()) );
00580
00581 h_r9_[cut][type][part]->Fill( r9 );
00582 h_hOverE_[cut][type][part]->Fill( (*iPho).hadronicOverEm() );
00583
00584 nPho[cut][type][part]++;
00585 h_nConv_[cut][type][part]->Fill(float( (*iPho).conversions().size() ));
00586
00587 if ( phoIsInBarrel ) h_phoDistribution_[cut][type][1]->Fill( (*iPho).superCluster()->phi(),(*iPho).superCluster()->eta() );
00588 if ( phoIsInEndcapMinus ) h_phoDistribution_[cut][type][2]->Fill( (*iPho).superCluster()->x(),(*iPho).superCluster()->y() );
00589 if ( phoIsInEndcapPlus ) h_phoDistribution_[cut][type][3]->Fill( (*iPho).superCluster()->x(),(*iPho).superCluster()->y() );
00590
00591
00592
00593 std::vector<reco::ConversionRef> conversions = (*iPho).conversions();
00594 for (unsigned int iConv=0; iConv<conversions.size(); iConv++) {
00595
00596 reco::ConversionRef aConv=conversions[iConv];
00597
00598 h_phoConvEta_[cut][0]->Fill( conversions[iConv]->caloCluster()[0]->eta() );
00599 h_phoConvPhi_[cut][0]->Fill( conversions[iConv]->caloCluster()[0]->phi() );
00600 h_phoConvEta_[cut][type]->Fill( conversions[iConv]->caloCluster()[0]->eta() );
00601 h_phoConvPhi_[cut][type]->Fill( conversions[iConv]->caloCluster()[0]->phi() );
00602
00603
00604 if ( conversions[iConv]->conversionVertex().isValid() ) {
00605
00606 h_convVtxRvsZ_[cut][0] ->Fill ( fabs (conversions[iConv]->conversionVertex().position().z() ),
00607 sqrt(conversions[iConv]->conversionVertex().position().perp2()) ) ;
00608 h_convVtxRvsZ_[cut][type] ->Fill ( fabs (conversions[iConv]->conversionVertex().position().z() ),
00609 sqrt(conversions[iConv]->conversionVertex().position().perp2()) ) ;
00610 }
00611
00612
00613 std::vector<reco::TrackRef> tracks = conversions[iConv]->tracks();
00614
00615 for (unsigned int i=0; i<tracks.size(); i++) {
00616 h_tkChi2_[cut][0] ->Fill (tracks[i]->normalizedChi2()) ;
00617 h_tkChi2_[cut][type] ->Fill (tracks[i]->normalizedChi2()) ;
00618 h_nHitsVsEta_[cut][0]->Fill( conversions[iConv]->caloCluster()[0]->eta(), float(tracks[i]->numberOfValidHits() ) );
00619 h_nHitsVsEta_[cut][type]->Fill( conversions[iConv]->caloCluster()[0]->eta(), float(tracks[i]->numberOfValidHits() ) );
00620 }
00621
00622 float DPhiTracksAtVtx = -99;
00623 float dPhiTracksAtEcal= -99;
00624 float dEtaTracksAtEcal= -99;
00625
00626
00627 if ( tracks.size() > 1 ) {
00628 float phiTk1= tracks[0]->innerMomentum().phi();
00629 float phiTk2= tracks[1]->innerMomentum().phi();
00630 DPhiTracksAtVtx = phiTk1-phiTk2;
00631 DPhiTracksAtVtx = phiNormalization( DPhiTracksAtVtx );
00632 }
00633
00634
00635 if (aConv->bcMatchingWithTracks()[0].isNonnull() && aConv->bcMatchingWithTracks()[1].isNonnull() ) {
00636 float recoPhi1 = aConv->ecalImpactPosition()[0].phi();
00637 float recoPhi2 = aConv->ecalImpactPosition()[1].phi();
00638 float recoEta1 = aConv->ecalImpactPosition()[0].eta();
00639 float recoEta2 = aConv->ecalImpactPosition()[1].eta();
00640
00641 recoPhi1 = phiNormalization(recoPhi1);
00642 recoPhi2 = phiNormalization(recoPhi2);
00643
00644 dPhiTracksAtEcal = recoPhi1 -recoPhi2;
00645 dPhiTracksAtEcal = phiNormalization( dPhiTracksAtEcal );
00646 dEtaTracksAtEcal = recoEta1 -recoEta2;
00647
00648 }
00649
00650 h_eOverPTracks_[cut][0][0] ->Fill( conversions[iConv]->EoverP() ) ;
00651 h_eOverPTracks_[cut][type][0] ->Fill( conversions[iConv]->EoverP() ) ;
00652 h_dCotTracks_[cut][0][0] ->Fill ( conversions[iConv]->pairCotThetaSeparation() );
00653 h_dCotTracks_[cut][type][0] ->Fill ( conversions[iConv]->pairCotThetaSeparation() );
00654 h_dPhiTracksAtVtx_[cut][0][0]->Fill( DPhiTracksAtVtx);
00655 h_dPhiTracksAtVtx_[cut][type][0]->Fill( DPhiTracksAtVtx);
00656 h_dPhiTracksAtEcal_[cut][0][0]->Fill( fabs(dPhiTracksAtEcal));
00657 h_dPhiTracksAtEcal_[cut][type][0]->Fill( fabs(dPhiTracksAtEcal));
00658 h_dEtaTracksAtEcal_[cut][0][0]->Fill( dEtaTracksAtEcal);
00659 h_dEtaTracksAtEcal_[cut][type][0]->Fill( dEtaTracksAtEcal);
00660
00661
00662 int part = 0;
00663 if ( phoIsInBarrel ) part = 1;
00664 if ( phoIsInEndcap ) part = 2;
00665
00666 h_eOverPTracks_[cut][0][part] ->Fill( conversions[iConv]->EoverP() ) ;
00667 h_eOverPTracks_[cut][type][part] ->Fill( conversions[iConv]->EoverP() ) ;
00668 h_dCotTracks_[cut][0][part] ->Fill ( conversions[iConv]->pairCotThetaSeparation() );
00669 h_dCotTracks_[cut][type][part] ->Fill ( conversions[iConv]->pairCotThetaSeparation() );
00670 h_dPhiTracksAtVtx_[cut][0][part]->Fill( DPhiTracksAtVtx);
00671 h_dPhiTracksAtVtx_[cut][type][part]->Fill( DPhiTracksAtVtx);
00672 h_dPhiTracksAtEcal_[cut][0][part]->Fill( fabs(dPhiTracksAtEcal));
00673 h_dPhiTracksAtEcal_[cut][type][part]->Fill( fabs(dPhiTracksAtEcal));
00674 h_dEtaTracksAtEcal_[cut][0][part]->Fill( dEtaTracksAtEcal);
00675 h_dEtaTracksAtEcal_[cut][type][part]->Fill( dEtaTracksAtEcal);
00676
00677
00678
00679 }
00680
00681 }
00682 }
00683
00684 }
00685
00686
00687 for (int cut=0; cut !=numberOfSteps_; ++cut) {
00688 for(int type=0;type!=3;++type){
00689 for(int part=0;part!=3;++part){
00690 h_nPho_[cut][type][part]-> Fill (float(nPho[cut][type][part]));
00691 }
00692 }
00693 }
00694
00695 if (validEcalRecHits) makePizero(esup, barrelHitHandle, endcapHitHandle);
00696
00697
00698
00699
00700 }
00701
00702 void PhotonAnalyzer::makePizero ( const edm::EventSetup& es, const edm::Handle<EcalRecHitCollection> rhEB, const edm::Handle<EcalRecHitCollection> rhEE ) {
00703
00704 const EcalRecHitCollection *hitCollection_p = rhEB.product();
00705
00706 edm::ESHandle<CaloGeometry> geoHandle;
00707 es.get<CaloGeometryRecord>().get(geoHandle);
00708
00709 edm::ESHandle<CaloTopology> theCaloTopology;
00710 es.get<CaloTopologyRecord>().get(theCaloTopology);
00711
00712
00713 const CaloSubdetectorGeometry *geometry_p;
00714 const CaloSubdetectorTopology *topology_p;
00715 const CaloSubdetectorGeometry *geometryES_p;
00716 geometry_p = geoHandle->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
00717 geometryES_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
00718
00719 std::map<std::string,double> providedParameters;
00720 providedParameters.insert(std::make_pair("LogWeighted",ParameterLogWeighted_));
00721 providedParameters.insert(std::make_pair("X0",ParameterX0_));
00722 providedParameters.insert(std::make_pair("T0_barl",ParameterT0_barl_));
00723 providedParameters.insert(std::make_pair("W0",ParameterW0_));
00724 PositionCalc posCalculator_ = PositionCalc(providedParameters);
00725
00726
00727 std::map<DetId, EcalRecHit> recHitsEB_map;
00728
00729
00730 std::vector<EcalRecHit> seeds;
00731
00732 seeds.clear();
00733
00734 vector<EBDetId> usedXtals;
00735 usedXtals.clear();
00736
00737 EcalRecHitCollection::const_iterator itb;
00738
00739 static const int MAXCLUS = 2000;
00740 int nClus=0;
00741 vector<float> eClus;
00742 vector<float> etClus;
00743 vector<float> etaClus;
00744 vector<float> phiClus;
00745 vector<EBDetId> max_hit;
00746 vector< vector<EcalRecHit> > RecHitsCluster;
00747 vector<float> s4s9Clus;
00748
00749
00750 for(itb=rhEB->begin(); itb!=rhEB->end(); ++itb){
00751 EBDetId id(itb->id());
00752 double energy = itb->energy();
00753 if (energy > seleXtalMinEnergy_) {
00754 std::pair<DetId, EcalRecHit> map_entry(itb->id(), *itb);
00755 recHitsEB_map.insert(map_entry);
00756 }
00757 if (energy > clusSeedThr_) seeds.push_back(*itb);
00758 }
00759
00760 sort(seeds.begin(), seeds.end(), ecalRecHitLess());
00761 for (std::vector<EcalRecHit>::iterator itseed=seeds.begin(); itseed!=seeds.end(); itseed++) {
00762 EBDetId seed_id = itseed->id();
00763 std::vector<EBDetId>::const_iterator usedIds;
00764
00765 bool seedAlreadyUsed=false;
00766 for(usedIds=usedXtals.begin(); usedIds!=usedXtals.end(); usedIds++){
00767 if(*usedIds==seed_id){
00768 seedAlreadyUsed=true;
00769
00770 break;
00771 }
00772 }
00773 if(seedAlreadyUsed)continue;
00774 topology_p = theCaloTopology->getSubdetectorTopology(DetId::Ecal,EcalBarrel);
00775 std::vector<DetId> clus_v = topology_p->getWindow(seed_id,clusEtaSize_,clusPhiSize_);
00776 std::vector<DetId> clus_used;
00777
00778 vector<EcalRecHit> RecHitsInWindow;
00779
00780 double simple_energy = 0;
00781
00782 for (std::vector<DetId>::iterator det=clus_v.begin(); det!=clus_v.end(); det++) {
00783 EBDetId EBdet = *det;
00784
00785 bool HitAlreadyUsed=false;
00786 for(usedIds=usedXtals.begin(); usedIds!=usedXtals.end(); usedIds++){
00787 if(*usedIds==*det){
00788 HitAlreadyUsed=true;
00789 break;
00790 }
00791 }
00792 if(HitAlreadyUsed)continue;
00793 if (recHitsEB_map.find(*det) != recHitsEB_map.end()){
00794
00795 std::map<DetId, EcalRecHit>::iterator aHit;
00796 aHit = recHitsEB_map.find(*det);
00797 usedXtals.push_back(*det);
00798 RecHitsInWindow.push_back(aHit->second);
00799 clus_used.push_back(*det);
00800 simple_energy = simple_energy + aHit->second.energy();
00801 }
00802 }
00803
00804 math::XYZPoint clus_pos = posCalculator_.Calculate_Location(clus_used,hitCollection_p,geometry_p,geometryES_p);
00805 float theta_s = 2. * atan(exp(-clus_pos.eta()));
00806 float p0x_s = simple_energy * sin(theta_s) * cos(clus_pos.phi());
00807 float p0y_s = simple_energy * sin(theta_s) * sin(clus_pos.phi());
00808
00809 float et_s = sqrt( p0x_s*p0x_s + p0y_s*p0y_s);
00810
00811
00812
00813 eClus.push_back(simple_energy);
00814 etClus.push_back(et_s);
00815 etaClus.push_back(clus_pos.eta());
00816 phiClus.push_back(clus_pos.phi());
00817 max_hit.push_back(seed_id);
00818 RecHitsCluster.push_back(RecHitsInWindow);
00819
00820
00821 float s4s9_[4];
00822 for(int i=0;i<4;i++)s4s9_[i]= itseed->energy();
00823 for(unsigned int j=0; j<RecHitsInWindow.size();j++){
00824
00825 if((((EBDetId)RecHitsInWindow[j].id()).ieta() == seed_id.ieta()-1 && seed_id.ieta()!=1 ) || ( seed_id.ieta()==1 && (((EBDetId)RecHitsInWindow[j].id()).ieta() == seed_id.ieta()-2))){
00826 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()-1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()-1 ){
00827 s4s9_[0]+=RecHitsInWindow[j].energy();
00828 }else{
00829 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()){
00830 s4s9_[0]+=RecHitsInWindow[j].energy();
00831 s4s9_[1]+=RecHitsInWindow[j].energy();
00832 }else{
00833 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()+1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()+1 ){
00834 s4s9_[1]+=RecHitsInWindow[j].energy();
00835 }
00836 }
00837 }
00838 }else{
00839 if(((EBDetId)RecHitsInWindow[j].id()).ieta() == seed_id.ieta()){
00840 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()-1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()-1 ){
00841 s4s9_[0]+=RecHitsInWindow[j].energy();
00842 s4s9_[3]+=RecHitsInWindow[j].energy();
00843 }else{
00844 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()+1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()+1 ){
00845 s4s9_[1]+=RecHitsInWindow[j].energy();
00846 s4s9_[2]+=RecHitsInWindow[j].energy();
00847 }
00848 }
00849 }else{
00850 if((((EBDetId)RecHitsInWindow[j].id()).ieta() == seed_id.ieta()+1 && seed_id.ieta()!=-1 ) || ( seed_id.ieta()==-1 && (((EBDetId)RecHitsInWindow[j].id()).ieta() == seed_id.ieta()+2))){
00851 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()-1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()-1 ){
00852 s4s9_[3]+=RecHitsInWindow[j].energy();
00853 }else{
00854 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()){
00855 s4s9_[2]+=RecHitsInWindow[j].energy();
00856 s4s9_[3]+=RecHitsInWindow[j].energy();
00857 }else{
00858 if(((EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.iphi()+1 ||((EBDetId)RecHitsInWindow[j].id()).iphi()-360 == seed_id.iphi()+1 ){
00859 s4s9_[2]+=RecHitsInWindow[j].energy();
00860 }
00861 }
00862 }
00863 }else{
00864 cout<<" (EBDetId)RecHitsInWindow[j].id()).ieta() "<<((EBDetId)RecHitsInWindow[j].id()).ieta()<<" seed_id.ieta() "<<seed_id.ieta()<<endl;
00865 cout<<" Problem with S4 calculation "<<endl;return;
00866 }
00867 }
00868 }
00869 }
00870 s4s9Clus.push_back(*max_element( s4s9_,s4s9_+4)/simple_energy);
00871
00872
00873 nClus++;
00874 if (nClus == MAXCLUS) return;
00875 }
00876
00877
00878
00879
00880
00881 static const int MAXPI0S = 200;
00882 int npi0_s=0;
00883
00884 vector<EBDetId> scXtals;
00885 scXtals.clear();
00886
00887 if (nClus <= 1) return;
00888 for(Int_t i=0 ; i<nClus ; i++){
00889 for(Int_t j=i+1 ; j<nClus ; j++){
00890
00891 if( etClus[i]>selePtGammaOne_ && etClus[j]>selePtGammaTwo_ && s4s9Clus[i]>seleS4S9GammaOne_ && s4s9Clus[j]>seleS4S9GammaTwo_){
00892 float theta_0 = 2. * atan(exp(-etaClus[i]));
00893 float theta_1 = 2. * atan(exp(-etaClus[j]));
00894
00895 float p0x = eClus[i] * sin(theta_0) * cos(phiClus[i]);
00896 float p1x = eClus[j] * sin(theta_1) * cos(phiClus[j]);
00897 float p0y = eClus[i] * sin(theta_0) * sin(phiClus[i]);
00898 float p1y = eClus[j] * sin(theta_1) * sin(phiClus[j]);
00899 float p0z = eClus[i] * cos(theta_0);
00900 float p1z = eClus[j] * cos(theta_1);
00901
00902 float pt_pi0 = sqrt( (p0x+p1x)*(p0x+p1x) + (p0y+p1y)*(p0y+p1y));
00903
00904 if (pt_pi0 < selePtPi0_)continue;
00905 float m_inv = sqrt ( (eClus[i] + eClus[j])*(eClus[i] + eClus[j]) - (p0x+p1x)*(p0x+p1x) - (p0y+p1y)*(p0y+p1y) - (p0z+p1z)*(p0z+p1z) );
00906 if ( (m_inv<seleMinvMaxPi0_) && (m_inv>seleMinvMinPi0_) ){
00907
00908
00909 vector<int> IsoClus;
00910 IsoClus.clear();
00911 float Iso = 0;
00912 TVector3 pi0vect = TVector3((p0x+p1x), (p0y+p1y), (p0z+p1z));
00913 for(Int_t k=0 ; k<nClus ; k++){
00914 if(k==i || k==j)continue;
00915 TVector3 Clusvect = TVector3(eClus[k] * sin(2. * atan(exp(-etaClus[k]))) * cos(phiClus[k]), eClus[k] * sin(2. * atan(exp(-etaClus[k]))) * sin(phiClus[k]) , eClus[k] * cos(2. * atan(exp(-etaClus[k]))));
00916 float dretaclpi0 = fabs(etaClus[k] - pi0vect.Eta());
00917 float drclpi0 = Clusvect.DeltaR(pi0vect);
00918
00919 if((drclpi0<selePi0BeltDR_) && (dretaclpi0<selePi0BeltDeta_) ){
00920
00921 Iso = Iso + etClus[k];
00922 IsoClus.push_back(k);
00923 }
00924 }
00925
00926
00927 if(Iso/pt_pi0<selePi0Iso_){
00928
00929 hMinvPi0EB_->Fill(m_inv);
00930 hPt1Pi0EB_->Fill(etClus[i]);
00931 hPt2Pi0EB_->Fill(etClus[j]);
00932 hPtPi0EB_->Fill(pt_pi0);
00933 hIsoPi0EB_->Fill(Iso/pt_pi0);
00934
00935
00936 npi0_s++;
00937 }
00938
00939 if(npi0_s == MAXPI0S) return;
00940 }
00941 }
00942 }
00943 }
00944
00945
00946
00947
00948 }
00949
00950
00951
00952 void PhotonAnalyzer::endJob()
00953 {
00954
00955 vector<string> types;
00956 types.push_back("All");
00957 types.push_back("Isolated");
00958 types.push_back("Nonisolated");
00959
00960
00961 for (int cut=0; cut !=numberOfSteps_; ++cut) {
00962
00963
00964
00965 MonitorElement * EtaNum = h_phoEta_[cut][1];
00966 MonitorElement * EtaDen = h_phoEta_[cut][0];
00967 dividePlots(p_efficiencyVsEta_[cut],EtaNum,EtaDen);
00968
00969 MonitorElement * EtNum = h_phoEt_[cut][1][0];
00970 MonitorElement * EtDen = h_phoEt_[cut][0][0];
00971 dividePlots(p_efficiencyVsEt_[cut],EtNum,EtDen);
00972
00973
00974
00975
00976 doProfileX( h_nTrackIsolSolid_[cut], p_nTrackIsolSolid_[cut]);
00977 doProfileX( h_trackPtSumSolid_[cut], p_trackPtSumSolid_[cut]);
00978 doProfileX( h_nTrackIsolHollow_[cut], p_nTrackIsolHollow_[cut]);
00979 doProfileX( h_trackPtSumHollow_[cut], p_trackPtSumHollow_[cut]);
00980 doProfileX( h_ecalSum_[cut], p_ecalSum_[cut]);
00981 doProfileX( h_hcalSum_[cut], p_hcalSum_[cut]);
00982
00983
00984
00985
00986 currentFolder_.str("");
00987 currentFolder_ << "Egamma/PhotonAnalyzer/IsolationVariables/Et above " << cut*cutStep_ << " GeV";
00988 dbe_->setCurrentFolder(currentFolder_.str());
00989
00990 dbe_->removeElement(h_nTrackIsolSolid_[cut]->getName());
00991 dbe_->removeElement(h_trackPtSumSolid_[cut]->getName());
00992 dbe_->removeElement(h_nTrackIsolHollow_[cut]->getName());
00993 dbe_->removeElement(h_trackPtSumHollow_[cut]->getName());
00994 dbe_->removeElement(h_ecalSum_[cut]->getName());
00995 dbe_->removeElement(h_hcalSum_[cut]->getName());
00996
00997 for(int type=0;type!=3;++type){
00998 doProfileX( h_nHitsVsEta_[cut][type], p_nHitsVsEta_[cut][type]);
00999 doProfileX( h_r9VsEt_[cut][type], p_r9VsEt_[cut][type]);
01000 currentFolder_.str("");
01001 currentFolder_ << "Egamma/PhotonAnalyzer/" << types[type] << "Photons/Et above " << cut*cutStep_ << " GeV";
01002 dbe_->setCurrentFolder(currentFolder_.str());
01003 dbe_->removeElement("r9VsEt2D");
01004 currentFolder_ << "/Conversions";
01005 dbe_->setCurrentFolder(currentFolder_.str());
01006 dbe_->removeElement("nHitsVsEta2D");
01007 }
01008
01009
01010
01011
01012 }
01013
01014
01015
01016
01017
01018
01019 bool outputMEsInRootFile = parameters_.getParameter<bool>("OutputMEsInRootFile");
01020 std::string outputFileName = parameters_.getParameter<std::string>("OutputFileName");
01021 if(outputMEsInRootFile){
01022 dbe_->save(outputFileName);
01023 }
01024
01025 edm::LogInfo("PhotonAnalyzer") << "Analyzed " << nEvt_ << "\n";
01026
01027
01028 return ;
01029 }
01030
01031
01032
01033
01034
01035
01036 float PhotonAnalyzer::phiNormalization(float & phi)
01037 {
01038
01039 const float PI = 3.1415927;
01040 const float TWOPI = 2.0*PI;
01041
01042
01043 if(phi > PI) {phi = phi - TWOPI;}
01044 if(phi < -PI) {phi = phi + TWOPI;}
01045
01046 return phi;
01047
01048 }
01049
01050
01051
01052
01053
01054
01055 void PhotonAnalyzer::doProfileX(TH2 * th2, MonitorElement* me){
01056 if (th2->GetNbinsX()==me->getNbinsX()){
01057 TH1F * h1 = (TH1F*) th2->ProfileX();
01058 for (int bin=0;bin!=h1->GetNbinsX();bin++){
01059 me->setBinContent(bin+1,h1->GetBinContent(bin+1));
01060 me->setBinError(bin+1,h1->GetBinError(bin+1));
01061 }
01062 delete h1;
01063 } else {
01064 throw cms::Exception("PhotonAnalyzer") << "Different number of bins!";
01065 }
01066 }
01067
01068 void PhotonAnalyzer::doProfileX(MonitorElement * th2m, MonitorElement* me) {
01069 doProfileX(th2m->getTH2F(), me);
01070 }
01071
01072
01073
01074
01075 void PhotonAnalyzer::dividePlots(MonitorElement* dividend, MonitorElement* numerator, MonitorElement* denominator){
01076 double value,err;
01077 for (int j=1; j<=numerator->getNbinsX(); j++){
01078 if (denominator->getBinContent(j)!=0){
01079 value = ((double) numerator->getBinContent(j))/((double) denominator->getBinContent(j));
01080 err = sqrt( value*(1-value) / ((double) denominator->getBinContent(j)) );
01081 dividend->setBinContent(j, value);
01082 dividend->setBinError(j,err);
01083 }
01084 else {
01085 dividend->setBinContent(j, 0);
01086 }
01087 }
01088 }