CMS 3D CMS Logo

PhotonAnalyzer.cc

Go to the documentation of this file.
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 // DataFormats
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 // Geometry
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 //#define TWOPI 6.283185308
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     // parameters for Pizero finding
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   //booking all histograms
00196 
00197   if (dbe_) {  
00198 
00199 
00200     for(int cut = 0; cut != numberOfSteps_; ++cut){   //looping over Et cut values
00201      
00202 
00203       // Isolation Variable infos
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       //Efficiency histograms
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       // Photon histograms
00229 
00230       for(int type=0;type!=3;++type){ //looping over isolation 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){ //loop over different parts of the ecal
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       //conversion plots
00298 
00299       for(int type=0;type!=3;++type){ //looping over isolation 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){ //loop over different parts of the ecal
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   // Get the recontructed  photons
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   // grab PhotonId objects  
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   // Get EcalRecHits
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   // get the geometry from the event setup:
00439   //  esup.get<CaloGeometryRecord>().get(theCaloGeom_);
00440 
00441 
00442   // Create array to hold #photons/event information
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   // Loop over all photons in event
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         //filling isolation variable histograms
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         //filling all photons histograms
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         // iso/noniso photons histograms
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         //filling both types of histograms for different ecal parts
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         //loop over conversions
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           //filling both types of histograms for different ecal parts
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         }//end loop over conversions
00680 
00681       }
00682     }
00683     
00684   }
00685     
00686   //filling number of photons per event histograms
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   // Initialize the Position Calc
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   // find cluster seeds in EB 
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   } // Eb rechits
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         //cout<< " Seed with energy "<<itseed->energy()<<" was used !"<<endl;
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       //      cout<<" det "<< EBdet<<" ieta "<<EBdet.ieta()<<" iphi "<<EBdet.iphi()<<endl;
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         //      cout<<" Used det "<< EBdet<<endl;
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     //      float p0z_s = simple_energy * cos(theta_s);
00809     float et_s = sqrt( p0x_s*p0x_s + p0y_s*p0y_s);
00810     
00811     //cout << "       Simple Clustering: E,Et,px,py,pz: "<<simple_energy<<" "<<et_s<<" "<<p0x_s<<" "<<p0y_s<<" "<<endl;
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     //Compute S4/S9 variable
00820     //We are not sure to have 9 RecHits so need to check eta and phi:
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       //cout << " Simple cluster rh, ieta, iphi : "<<((EBDetId)RecHitsInWindow[j].id()).ieta()<<" "<<((EBDetId)RecHitsInWindow[j].id()).iphi()<<endl;
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     //    cout<<" s4s9Clus[0] "<<s4s9_[0]/simple_energy<<" s4s9Clus[1] "<<s4s9_[1]/simple_energy<<" s4s9Clus[2] "<<s4s9_[2]/simple_energy<<" s4s9Clus[3] "<<s4s9_[3]/simple_energy<<endl;
00872     //    cout<<" Max "<<*max_element( s4s9_,s4s9_+4)/simple_energy<<endl;
00873     nClus++;
00874     if (nClus == MAXCLUS) return;
00875   }  //  End loop over seed clusters
00876 
00877   // cout<< " Pi0 clusters: "<<nClus<<endl;
00878 
00879   // Selection, based on Simple clustering
00880   //pi0 candidates
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       //      cout<<" i "<<i<<"  etClus[i] "<<etClus[i]<<" j "<<j<<"  etClus[j] "<<etClus[j]<<endl;
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         //      cout<<" pt_pi0 "<<pt_pi0<<endl;
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           //New Loop on cluster to measure isolation:
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     //making efficiency plots
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     //making isolation variable profiles
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     //removing unneeded plots
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 //---Definitions
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 }

Generated on Tue Jun 9 17:33:45 2009 for CMSSW by  doxygen 1.5.4