00001
00007 #include "RecoEgamma/PhotonIdentification/interface/PhotonIsolationCalculator.h"
00008 #include "CommonTools/Utils/interface/StringToEnumValue.h"
00009 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00010 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
00011 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00012 #include "DataFormats/TrackReco/interface/Track.h"
00013 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00014 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00015 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00016 #include "DataFormats/DetId/interface/DetId.h"
00017 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00018 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00019 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
00020 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00021 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00022 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00023
00024 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaHcalIsolation.h"
00025 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaRecHitIsolation.h"
00026 #include "RecoEgamma/EgammaIsolationAlgos/interface/PhotonTkIsolation.h"
00027 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaEcalIsolation.h"
00028 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h"
00029 #include "RecoCaloTools/MetaCollections/interface/CaloRecHitMetaCollections.h"
00030
00031
00032 #include "Geometry/CaloTopology/interface/CaloTopology.h"
00033 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00034 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00035 #include "Geometry/CaloTopology/interface/EcalBarrelTopology.h"
00036 #include "Geometry/CaloTopology/interface/EcalEndcapTopology.h"
00037 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00038
00039 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
00040 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgoRcd.h"
00041
00042 #include <string>
00043 #include <TMath.h>
00044
00045
00046 void PhotonIsolationCalculator::setup(const edm::ParameterSet& conf, std::vector<int> flagsEB, std::vector<int> flagsEE, std::vector<int> severitiesEB, std::vector<int> severitiesEE) {
00047
00048 trackInputTag_ = conf.getParameter<edm::InputTag>("trackProducer");
00049 beamSpotProducerTag_ = conf.getParameter<edm::InputTag>("beamSpotProducer");
00050 barrelecalCollection_ = conf.getParameter<edm::InputTag>("barrelEcalRecHitCollection");
00051 endcapecalCollection_ = conf.getParameter<edm::InputTag>("endcapEcalRecHitCollection");
00052 hcalCollection_ = conf.getParameter<edm::InputTag>("HcalRecHitCollection");
00053
00054
00055 modulePhiBoundary_ = conf.getParameter<double>("modulePhiBoundary");
00056 moduleEtaBoundary_ = conf.getParameter<std::vector<double> >("moduleEtaBoundary");
00057
00058 vetoClusteredEcalHits_ = conf.getParameter<bool>("vetoClustered");
00059 useNumCrystals_ = conf.getParameter<bool>("useNumCrystals");
00060
00062 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("TrackConeOuterRadiusA_Barrel") );
00063 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("TrackConeInnerRadiusA_Barrel") ) ;
00064 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("isolationtrackThresholdA_Barrel") );
00065 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("longImpactParameterA_Barrel") );
00066 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("transImpactParameterA_Barrel") );
00067 trkIsoBarrelRadiusA_.push_back( conf.getParameter<double>("isolationtrackEtaSliceA_Barrel") );
00068
00069 ecalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("EcalRecHitInnerRadiusA_Barrel") );
00070 ecalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("EcalRecHitOuterRadiusA_Barrel") );
00071 ecalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("EcalRecHitEtaSliceA_Barrel") );
00072 ecalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("EcalRecHitThreshEA_Barrel") );
00073 ecalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("EcalRecHitThreshEtA_Barrel") );
00074
00075 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalTowerInnerRadiusA_Barrel") );
00076 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalTowerOuterRadiusA_Barrel") );
00077 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalTowerThreshEA_Barrel") );
00078 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerInnerRadiusA_Barrel") );
00079 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerOuterRadiusA_Barrel") );
00080 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerThreshEA_Barrel") );
00081 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerInnerRadiusA_Barrel") );
00082 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerOuterRadiusA_Barrel") );
00083 hcalIsoBarrelRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerThreshEA_Barrel") );
00084
00085
00086 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("TrackConeOuterRadiusB_Barrel") );
00087 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("TrackConeInnerRadiusB_Barrel") ) ;
00088 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("isolationtrackThresholdB_Barrel") );
00089 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("longImpactParameterB_Barrel") );
00090 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("transImpactParameterB_Barrel") );
00091 trkIsoBarrelRadiusB_.push_back( conf.getParameter<double>("isolationtrackEtaSliceB_Barrel") );
00092
00093 ecalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("EcalRecHitInnerRadiusB_Barrel") );
00094 ecalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("EcalRecHitOuterRadiusB_Barrel") );
00095 ecalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("EcalRecHitEtaSliceB_Barrel") );
00096 ecalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("EcalRecHitThreshEB_Barrel") );
00097 ecalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("EcalRecHitThreshEtB_Barrel") );
00098
00099 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalTowerInnerRadiusB_Barrel") );
00100 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalTowerOuterRadiusB_Barrel") );
00101 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalTowerThreshEB_Barrel") );
00102 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerInnerRadiusB_Barrel") );
00103 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerOuterRadiusB_Barrel") );
00104 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerThreshEB_Barrel") );
00105 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerInnerRadiusB_Barrel") );
00106 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerOuterRadiusB_Barrel") );
00107 hcalIsoBarrelRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerThreshEB_Barrel") );
00108
00110 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("TrackConeOuterRadiusA_Endcap") );
00111 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("TrackConeInnerRadiusA_Endcap") ) ;
00112 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("isolationtrackThresholdA_Endcap") );
00113 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("longImpactParameterA_Endcap") );
00114 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("transImpactParameterA_Endcap") );
00115 trkIsoEndcapRadiusA_.push_back( conf.getParameter<double>("isolationtrackEtaSliceA_Endcap") );
00116
00117
00118 ecalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("EcalRecHitInnerRadiusA_Endcap") );
00119 ecalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("EcalRecHitOuterRadiusA_Endcap") );
00120 ecalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("EcalRecHitEtaSliceA_Endcap") );
00121 ecalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("EcalRecHitThreshEA_Endcap") );
00122 ecalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("EcalRecHitThreshEtA_Endcap") );
00123
00124
00125 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalTowerInnerRadiusA_Endcap") );
00126 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalTowerOuterRadiusA_Endcap") );
00127 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalTowerThreshEA_Endcap") );
00128 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerInnerRadiusA_Endcap") );
00129 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerOuterRadiusA_Endcap") );
00130 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth1TowerThreshEA_Endcap") );
00131 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerInnerRadiusA_Endcap") );
00132 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerOuterRadiusA_Endcap") );
00133 hcalIsoEndcapRadiusA_.push_back( conf.getParameter<double>("HcalDepth2TowerThreshEA_Endcap") );
00134
00135
00136 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("TrackConeOuterRadiusB_Endcap") );
00137 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("TrackConeInnerRadiusB_Endcap") ) ;
00138 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("isolationtrackThresholdB_Endcap") );
00139 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("longImpactParameterB_Endcap") );
00140 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("transImpactParameterB_Endcap") );
00141 trkIsoEndcapRadiusB_.push_back( conf.getParameter<double>("isolationtrackEtaSliceB_Endcap") );
00142
00143 ecalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("EcalRecHitInnerRadiusB_Endcap") );
00144 ecalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("EcalRecHitOuterRadiusB_Endcap") );
00145 ecalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("EcalRecHitEtaSliceB_Endcap") );
00146 ecalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("EcalRecHitThreshEB_Endcap") );
00147 ecalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("EcalRecHitThreshEtB_Endcap") );
00148
00149 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalTowerInnerRadiusB_Endcap") );
00150 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalTowerOuterRadiusB_Endcap") );
00151 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalTowerThreshEB_Endcap") );
00152 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerInnerRadiusB_Endcap") );
00153 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerOuterRadiusB_Endcap") );
00154 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth1TowerThreshEB_Endcap") );
00155 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerInnerRadiusB_Endcap") );
00156 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerOuterRadiusB_Endcap") );
00157 hcalIsoEndcapRadiusB_.push_back( conf.getParameter<double>("HcalDepth2TowerThreshEB_Endcap") );
00158
00159
00160 flagsEB_ = flagsEB;
00161 flagsEE_ = flagsEE;
00162 severityExclEB_ = severitiesEB;
00163 severityExclEE_ = severitiesEE;
00164 }
00165
00166
00167 void PhotonIsolationCalculator::calculate(const reco::Photon* pho,
00168 const edm::Event& e,
00169 const edm::EventSetup& es,
00170 reco::Photon::FiducialFlags& phofid,
00171 reco::Photon::IsolationVariables& phoisolR1,
00172 reco::Photon::IsolationVariables& phoisolR2) {
00173
00174
00175 bool isEBPho = false;
00176 bool isEEPho = false;
00177 bool isEBEtaGap = false;
00178 bool isEBPhiGap = false;
00179 bool isEERingGap = false;
00180 bool isEEDeeGap = false;
00181 bool isEBEEGap = false;
00182 classify(pho, isEBPho, isEEPho, isEBEtaGap, isEBPhiGap, isEERingGap, isEEDeeGap, isEBEEGap);
00183 phofid.isEB = isEBPho;
00184 phofid.isEE = isEEPho;
00185 phofid.isEBEtaGap = isEBEtaGap;
00186 phofid.isEBPhiGap = isEBPhiGap;
00187 phofid.isEERingGap = isEERingGap;
00188 phofid.isEEDeeGap = isEEDeeGap;
00189 phofid.isEBEEGap = isEBEEGap;
00190
00191
00192
00193
00194 reco::SuperClusterRef scRef=pho->superCluster();
00195 const reco::BasicCluster & seedCluster = *(scRef->seed()) ;
00196 DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
00197 int detector = seedXtalId.subdetId() ;
00198
00199 if (detector==EcalBarrel) {
00200
00201 trackConeOuterRadiusA_ = trkIsoBarrelRadiusA_[0];
00202 trackConeInnerRadiusA_ = trkIsoBarrelRadiusA_[1];
00203 isolationtrackThresholdA_ = trkIsoBarrelRadiusA_[2];
00204 trackLipRadiusA_ = trkIsoBarrelRadiusA_[3];
00205 trackD0RadiusA_ = trkIsoBarrelRadiusA_[4];
00206 isolationtrackEtaSliceA_ = trkIsoBarrelRadiusA_[5];
00207
00208 photonEcalRecHitConeInnerRadiusA_ = ecalIsoBarrelRadiusA_[0];
00209 photonEcalRecHitConeOuterRadiusA_ = ecalIsoBarrelRadiusA_[1];
00210 photonEcalRecHitEtaSliceA_ = ecalIsoBarrelRadiusA_[2];
00211 photonEcalRecHitThreshEA_ = ecalIsoBarrelRadiusA_[3];
00212 photonEcalRecHitThreshEtA_ = ecalIsoBarrelRadiusA_[4];
00213
00214 photonHcalTowerConeInnerRadiusA_ = hcalIsoBarrelRadiusA_[0];
00215 photonHcalTowerConeOuterRadiusA_ = hcalIsoBarrelRadiusA_[1];
00216 photonHcalTowerThreshEA_ = hcalIsoBarrelRadiusA_[2];
00217 photonHcalDepth1TowerConeInnerRadiusA_ = hcalIsoBarrelRadiusA_[3];
00218 photonHcalDepth1TowerConeOuterRadiusA_ = hcalIsoBarrelRadiusA_[4];
00219 photonHcalDepth1TowerThreshEA_ = hcalIsoBarrelRadiusA_[5];
00220 photonHcalDepth2TowerConeInnerRadiusA_ = hcalIsoBarrelRadiusA_[6];
00221 photonHcalDepth2TowerConeOuterRadiusA_ = hcalIsoBarrelRadiusA_[7];
00222 photonHcalDepth2TowerThreshEA_ = hcalIsoBarrelRadiusA_[8];
00223
00224
00225 trackConeOuterRadiusB_ = trkIsoBarrelRadiusB_[0];
00226 trackConeInnerRadiusB_ = trkIsoBarrelRadiusB_[1];
00227 isolationtrackThresholdB_ = trkIsoBarrelRadiusB_[2];
00228 trackLipRadiusB_ = trkIsoBarrelRadiusB_[3];
00229 trackD0RadiusB_ = trkIsoBarrelRadiusB_[4];
00230 isolationtrackEtaSliceB_ = trkIsoBarrelRadiusB_[5];
00231
00232 photonEcalRecHitConeInnerRadiusB_ = ecalIsoBarrelRadiusB_[0];
00233 photonEcalRecHitConeOuterRadiusB_ = ecalIsoBarrelRadiusB_[1];
00234 photonEcalRecHitEtaSliceB_ = ecalIsoBarrelRadiusB_[2];
00235 photonEcalRecHitThreshEB_ = ecalIsoBarrelRadiusB_[3];
00236 photonEcalRecHitThreshEtB_ = ecalIsoBarrelRadiusB_[4];
00237
00238 photonHcalTowerConeInnerRadiusB_ = hcalIsoBarrelRadiusB_[0];
00239 photonHcalTowerConeOuterRadiusB_ = hcalIsoBarrelRadiusB_[1];
00240 photonHcalTowerThreshEB_ = hcalIsoBarrelRadiusB_[2];
00241 photonHcalDepth1TowerConeInnerRadiusB_ = hcalIsoBarrelRadiusB_[3];
00242 photonHcalDepth1TowerConeOuterRadiusB_ = hcalIsoBarrelRadiusB_[4];
00243 photonHcalDepth1TowerThreshEB_ = hcalIsoBarrelRadiusB_[5];
00244 photonHcalDepth2TowerConeInnerRadiusB_ = hcalIsoBarrelRadiusB_[6];
00245 photonHcalDepth2TowerConeOuterRadiusB_ = hcalIsoBarrelRadiusB_[7];
00246 photonHcalDepth2TowerThreshEB_ = hcalIsoBarrelRadiusB_[8];
00247
00248 } else if
00249 (detector==EcalEndcap) {
00250
00251 trackConeOuterRadiusA_ = trkIsoEndcapRadiusA_[0];
00252 trackConeInnerRadiusA_ = trkIsoEndcapRadiusA_[1];
00253 isolationtrackThresholdA_ = trkIsoEndcapRadiusA_[2];
00254 trackLipRadiusA_ = trkIsoEndcapRadiusA_[3];
00255 trackD0RadiusA_ = trkIsoEndcapRadiusA_[4];
00256 isolationtrackEtaSliceA_ = trkIsoEndcapRadiusA_[5];
00257
00258 photonEcalRecHitConeInnerRadiusA_ = ecalIsoEndcapRadiusA_[0];
00259 photonEcalRecHitConeOuterRadiusA_ = ecalIsoEndcapRadiusA_[1];
00260 photonEcalRecHitEtaSliceA_ = ecalIsoEndcapRadiusA_[2];
00261 photonEcalRecHitThreshEA_ = ecalIsoEndcapRadiusA_[3];
00262 photonEcalRecHitThreshEtA_ = ecalIsoEndcapRadiusA_[4];
00263
00264 photonHcalTowerConeInnerRadiusA_ = hcalIsoEndcapRadiusA_[0];
00265 photonHcalTowerConeOuterRadiusA_ = hcalIsoEndcapRadiusA_[1];
00266 photonHcalTowerThreshEA_ = hcalIsoEndcapRadiusA_[2];
00267 photonHcalDepth1TowerConeInnerRadiusA_ = hcalIsoEndcapRadiusA_[3];
00268 photonHcalDepth1TowerConeOuterRadiusA_ = hcalIsoEndcapRadiusA_[4];
00269 photonHcalDepth1TowerThreshEA_ = hcalIsoEndcapRadiusA_[5];
00270 photonHcalDepth2TowerConeInnerRadiusA_ = hcalIsoEndcapRadiusA_[6];
00271 photonHcalDepth2TowerConeOuterRadiusA_ = hcalIsoEndcapRadiusA_[7];
00272 photonHcalDepth2TowerThreshEA_ = hcalIsoEndcapRadiusA_[8];
00273
00274
00275 trackConeOuterRadiusB_ = trkIsoEndcapRadiusB_[0];
00276 trackConeInnerRadiusB_ = trkIsoEndcapRadiusB_[1];
00277 isolationtrackThresholdB_ = trkIsoEndcapRadiusB_[2];
00278 trackLipRadiusB_ = trkIsoEndcapRadiusB_[3];
00279 trackD0RadiusB_ = trkIsoEndcapRadiusB_[4];
00280 isolationtrackEtaSliceB_ = trkIsoEndcapRadiusB_[5];
00281
00282
00283 photonEcalRecHitConeInnerRadiusB_ = ecalIsoEndcapRadiusB_[0];
00284 photonEcalRecHitConeOuterRadiusB_ = ecalIsoEndcapRadiusB_[1];
00285 photonEcalRecHitEtaSliceB_ = ecalIsoEndcapRadiusB_[2];
00286 photonEcalRecHitThreshEB_ = ecalIsoEndcapRadiusB_[3];
00287 photonEcalRecHitThreshEtB_ = ecalIsoEndcapRadiusB_[4];
00288
00289 photonHcalTowerConeInnerRadiusB_ = hcalIsoEndcapRadiusB_[0];
00290 photonHcalTowerConeOuterRadiusB_ = hcalIsoEndcapRadiusB_[1];
00291 photonHcalTowerThreshEB_ = hcalIsoEndcapRadiusB_[2];
00292 photonHcalDepth1TowerConeInnerRadiusB_ = hcalIsoEndcapRadiusB_[3];
00293 photonHcalDepth1TowerConeOuterRadiusB_ = hcalIsoEndcapRadiusB_[4];
00294 photonHcalDepth1TowerThreshEB_ = hcalIsoEndcapRadiusB_[5];
00295 photonHcalDepth2TowerConeInnerRadiusB_ = hcalIsoEndcapRadiusB_[6];
00296 photonHcalDepth2TowerConeOuterRadiusB_ = hcalIsoEndcapRadiusB_[7];
00297 photonHcalDepth2TowerThreshEB_ = hcalIsoEndcapRadiusB_[8];
00298
00299 }
00300
00301
00302
00303 int ntrkA=0;
00304 double trkisoA=0;
00305 calculateTrackIso(pho, e, trkisoA, ntrkA, isolationtrackThresholdA_,
00306 trackConeOuterRadiusA_, trackConeInnerRadiusA_, isolationtrackEtaSliceA_, trackLipRadiusA_, trackD0RadiusA_);
00307
00308
00309 int sntrkA=0;
00310 double strkisoA=0;
00311 calculateTrackIso(pho, e, strkisoA, sntrkA, isolationtrackThresholdA_,
00312 trackConeOuterRadiusA_, 0., isolationtrackEtaSliceA_, trackLipRadiusA_, trackD0RadiusA_ );
00313
00314 phoisolR1.nTrkHollowCone = ntrkA;
00315 phoisolR1.trkSumPtHollowCone = trkisoA;
00316 phoisolR1.nTrkSolidCone = sntrkA;
00317 phoisolR1.trkSumPtSolidCone = strkisoA;
00318
00319
00320 int ntrkB=0;
00321 double trkisoB=0;
00322 calculateTrackIso(pho, e, trkisoB, ntrkB, isolationtrackThresholdB_,
00323 trackConeOuterRadiusB_, trackConeInnerRadiusB_, isolationtrackEtaSliceB_, trackLipRadiusB_, trackD0RadiusB_ );
00324
00325
00326 int sntrkB=0;
00327 double strkisoB=0;
00328 calculateTrackIso(pho, e, strkisoB, sntrkB, isolationtrackThresholdB_,
00329 trackConeOuterRadiusB_, 0., isolationtrackEtaSliceB_, trackLipRadiusB_, trackD0RadiusB_);
00330
00331 phoisolR2.nTrkHollowCone = ntrkB;
00332 phoisolR2.trkSumPtHollowCone = trkisoB;
00333 phoisolR2.nTrkSolidCone = sntrkB;
00334 phoisolR2.trkSumPtSolidCone = strkisoB;
00335
00336
00337
00338
00339 double EcalRecHitIsoA = calculateEcalRecHitIso(pho, e, es,
00340 photonEcalRecHitConeOuterRadiusA_,
00341 photonEcalRecHitConeInnerRadiusA_,
00342 photonEcalRecHitEtaSliceA_,
00343 photonEcalRecHitThreshEA_,
00344 photonEcalRecHitThreshEtA_,
00345 vetoClusteredEcalHits_,
00346 useNumCrystals_);
00347 phoisolR1.ecalRecHitSumEt = EcalRecHitIsoA;
00348
00349 double EcalRecHitIsoB = calculateEcalRecHitIso(pho, e, es,
00350 photonEcalRecHitConeOuterRadiusB_,
00351 photonEcalRecHitConeInnerRadiusB_,
00352 photonEcalRecHitEtaSliceB_,
00353 photonEcalRecHitThreshEB_,
00354 photonEcalRecHitThreshEtB_,
00355 vetoClusteredEcalHits_,
00356 useNumCrystals_);
00357 phoisolR2.ecalRecHitSumEt = EcalRecHitIsoB;
00358
00359
00360 double HcalTowerIsoA = calculateHcalTowerIso(pho, e, es, photonHcalTowerConeOuterRadiusA_,
00361 photonHcalTowerConeInnerRadiusA_,
00362 photonHcalTowerThreshEA_, -1 );
00363 phoisolR1.hcalTowerSumEt = HcalTowerIsoA;
00364
00365
00366 double HcalTowerIsoB = calculateHcalTowerIso(pho, e, es, photonHcalTowerConeOuterRadiusB_,
00367 photonHcalTowerConeInnerRadiusB_,
00368 photonHcalTowerThreshEB_, -1 );
00369 phoisolR2.hcalTowerSumEt = HcalTowerIsoB;
00370
00372
00373 double HcalDepth1TowerIsoA = calculateHcalTowerIso(pho, e, es, photonHcalDepth1TowerConeOuterRadiusA_,
00374 photonHcalDepth1TowerConeInnerRadiusA_,
00375 photonHcalDepth1TowerThreshEA_, 1 );
00376 phoisolR1.hcalDepth1TowerSumEt = HcalDepth1TowerIsoA;
00377
00378
00379 double HcalDepth1TowerIsoB = calculateHcalTowerIso(pho, e, es, photonHcalDepth1TowerConeOuterRadiusB_,
00380 photonHcalDepth1TowerConeInnerRadiusB_,
00381 photonHcalDepth1TowerThreshEB_, 1 );
00382 phoisolR2.hcalDepth1TowerSumEt = HcalDepth1TowerIsoB;
00383
00384
00385
00387
00388 double HcalDepth2TowerIsoA = calculateHcalTowerIso(pho, e, es, photonHcalDepth2TowerConeOuterRadiusA_,
00389 photonHcalDepth2TowerConeInnerRadiusA_,
00390 photonHcalDepth2TowerThreshEA_, 2 );
00391 phoisolR1.hcalDepth2TowerSumEt = HcalDepth2TowerIsoA;
00392
00393
00394 double HcalDepth2TowerIsoB = calculateHcalTowerIso(pho, e, es, photonHcalDepth2TowerConeOuterRadiusB_,
00395 photonHcalDepth2TowerConeInnerRadiusB_,
00396 photonHcalDepth2TowerThreshEB_, 2 );
00397 phoisolR2.hcalDepth2TowerSumEt = HcalDepth2TowerIsoB;
00398
00399
00400
00401 double HcalTowerBcIsoA = calculateHcalTowerIso(pho, e, es, photonHcalTowerConeOuterRadiusA_,
00402 photonHcalTowerThreshEA_, -1 );
00403 phoisolR1.hcalTowerSumEtBc = HcalTowerBcIsoA;
00404
00405
00406 double HcalTowerBcIsoB = calculateHcalTowerIso(pho, e, es, photonHcalTowerConeOuterRadiusB_,
00407 photonHcalTowerThreshEB_, -1 );
00408 phoisolR2.hcalTowerSumEtBc = HcalTowerBcIsoB;
00409
00411
00412 double HcalDepth1TowerBcIsoA = calculateHcalTowerIso(pho, e, es, photonHcalDepth1TowerConeOuterRadiusA_,
00413 photonHcalDepth1TowerThreshEA_, 1 );
00414 phoisolR1.hcalDepth1TowerSumEtBc = HcalDepth1TowerBcIsoA;
00415
00416
00417 double HcalDepth1TowerBcIsoB = calculateHcalTowerIso(pho, e, es, photonHcalDepth1TowerConeOuterRadiusB_,
00418 photonHcalDepth1TowerThreshEB_, 1 );
00419 phoisolR2.hcalDepth1TowerSumEtBc = HcalDepth1TowerBcIsoB;
00420
00421
00422
00424
00425 double HcalDepth2TowerBcIsoA = calculateHcalTowerIso(pho, e, es, photonHcalDepth2TowerConeOuterRadiusA_,
00426 photonHcalDepth2TowerThreshEA_, 2 );
00427 phoisolR1.hcalDepth2TowerSumEtBc = HcalDepth2TowerBcIsoA;
00428
00429
00430 double HcalDepth2TowerBcIsoB = calculateHcalTowerIso(pho, e, es, photonHcalDepth2TowerConeOuterRadiusB_,
00431 photonHcalDepth2TowerThreshEB_, 2 );
00432 phoisolR2.hcalDepth2TowerSumEtBc = HcalDepth2TowerBcIsoB;
00433
00434
00435
00436 }
00437
00438
00439 void PhotonIsolationCalculator::classify(const reco::Photon* photon,
00440 bool &isEBPho,
00441 bool &isEEPho,
00442 bool &isEBEtaGap,
00443 bool &isEBPhiGap,
00444 bool &isEERingGap,
00445 bool &isEEDeeGap,
00446 bool &isEBEEGap){
00447
00448
00449 const reco::CaloCluster & seedCluster = *(photon->superCluster()->seed()) ;
00450
00451
00452
00453 DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
00454 int detector = seedXtalId.subdetId() ;
00455
00456
00457 double eta = photon->superCluster()->position().eta();
00458 double feta = fabs(eta);
00459
00460 if (detector==EcalBarrel) {
00461
00462
00463 isEBPho = true;
00464 if (EBDetId::isNextToEtaBoundary(EBDetId(seedXtalId))) {
00465 if (fabs(feta-1.479)<.1) isEBEEGap = true ;
00466 else
00467 isEBEtaGap = true ;
00468 }
00469
00470 if (EBDetId::isNextToPhiBoundary(EBDetId(seedXtalId)))
00471 isEBPhiGap = true ;
00472
00473
00474
00475 } else if (detector==EcalEndcap) {
00476
00477 isEEPho = true;
00478 if (EEDetId::isNextToRingBoundary(EEDetId(seedXtalId))) {
00479 if (fabs(feta-1.479)<.1) isEBEEGap = true ;
00480 else
00481 isEERingGap = true ;
00482 }
00483
00484 if (EEDetId::isNextToDBoundary(EEDetId(seedXtalId)))
00485 isEEDeeGap = true ;
00486 }
00487
00488
00489 }
00490
00491 void PhotonIsolationCalculator::calculateTrackIso(const reco::Photon* photon,
00492 const edm::Event& e,
00493 double &trkCone,
00494 int &ntrkCone,
00495 double pTThresh,
00496 double RCone,
00497 double RinnerCone,
00498 double etaSlice,
00499 double lip,
00500 double d0){
00501 int counter =0;
00502 double ptSum =0.;
00503
00504
00505
00506 edm::Handle<reco::TrackCollection> tracks;
00507 e.getByLabel(trackInputTag_,tracks);
00508 if(!tracks.isValid()) {
00509 return;
00510 }
00511 const reco::TrackCollection* trackCollection = tracks.product();
00512
00513 reco::BeamSpot vertexBeamSpot;
00514 edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00515 e.getByLabel(beamSpotProducerTag_,recoBeamSpotHandle);
00516 vertexBeamSpot = *recoBeamSpotHandle;
00517
00518 PhotonTkIsolation phoIso(RCone,
00519 RinnerCone,
00520 etaSlice,
00521 pTThresh,
00522 lip ,
00523 d0,
00524 trackCollection,
00525 math::XYZPoint(vertexBeamSpot.x0(),vertexBeamSpot.y0(),vertexBeamSpot.z0()));
00526
00527 counter = phoIso.getNumberTracks(photon);
00528 ptSum = phoIso.getPtTracks(photon);
00529 ntrkCone = counter;
00530 trkCone = ptSum;
00531 }
00532
00533
00534
00535 double PhotonIsolationCalculator::calculateEcalRecHitIso(const reco::Photon* photon,
00536 const edm::Event& iEvent,
00537 const edm::EventSetup& iSetup,
00538 double RCone,
00539 double RConeInner,
00540 double etaSlice,
00541 double eMin,
00542 double etMin,
00543 bool vetoClusteredHits,
00544 bool useNumXtals)
00545 {
00546
00547 edm::Handle<EcalRecHitCollection> ecalhitsCollEB;
00548 edm::Handle<EcalRecHitCollection> ecalhitsCollEE;
00549 iEvent.getByLabel(endcapecalCollection_, ecalhitsCollEE);
00550
00551 iEvent.getByLabel(barrelecalCollection_, ecalhitsCollEB);
00552
00553 const EcalRecHitCollection* rechitsCollectionEE_ = ecalhitsCollEE.product();
00554 const EcalRecHitCollection* rechitsCollectionEB_ = ecalhitsCollEB.product();
00555
00556 edm::ESHandle<EcalSeverityLevelAlgo> sevlv;
00557 iSetup.get<EcalSeverityLevelAlgoRcd>().get(sevlv);
00558 const EcalSeverityLevelAlgo* sevLevel = sevlv.product();
00559
00560 std::auto_ptr<CaloRecHitMetaCollectionV> RecHitsEE(0);
00561 RecHitsEE = std::auto_ptr<CaloRecHitMetaCollectionV>(new EcalRecHitMetaCollection(*rechitsCollectionEE_));
00562
00563 std::auto_ptr<CaloRecHitMetaCollectionV> RecHitsEB(0);
00564 RecHitsEB = std::auto_ptr<CaloRecHitMetaCollectionV>(new EcalRecHitMetaCollection(*rechitsCollectionEB_));
00565
00566 edm::ESHandle<CaloGeometry> geoHandle;
00567 iSetup.get<CaloGeometryRecord>().get(geoHandle);
00568
00569 EgammaRecHitIsolation phoIsoEB(RCone,
00570 RConeInner,
00571 etaSlice,
00572 etMin,
00573 eMin,
00574 geoHandle,
00575 &(*RecHitsEB),
00576 sevLevel,
00577 DetId::Ecal);
00578
00579 phoIsoEB.setVetoClustered(vetoClusteredHits);
00580 phoIsoEB.setUseNumCrystals(useNumXtals);
00581 phoIsoEB.doSeverityChecks(ecalhitsCollEB.product(), severityExclEB_);
00582 phoIsoEB.doFlagChecks(flagsEB_);
00583 double ecalIsolEB = phoIsoEB.getEtSum(photon);
00584
00585 EgammaRecHitIsolation phoIsoEE(RCone,
00586 RConeInner,
00587 etaSlice,
00588 etMin,
00589 eMin,
00590 geoHandle,
00591 &(*RecHitsEE),
00592 sevLevel,
00593 DetId::Ecal);
00594
00595 phoIsoEE.setVetoClustered(vetoClusteredHits);
00596 phoIsoEE.setUseNumCrystals(useNumXtals);
00597 phoIsoEE.doSeverityChecks(ecalhitsCollEE.product(), severityExclEE_);
00598 phoIsoEE.doFlagChecks(flagsEE_);
00599
00600 double ecalIsolEE = phoIsoEE.getEtSum(photon);
00601
00602 double ecalIsol = ecalIsolEB + ecalIsolEE;
00603
00604 return ecalIsol;
00605 }
00606
00607 double PhotonIsolationCalculator::calculateHcalTowerIso(const reco::Photon* photon,
00608 const edm::Event& iEvent,
00609 const edm::EventSetup& iSetup,
00610 double RCone,
00611 double RConeInner,
00612 double eMin,
00613 signed int depth )
00614 {
00615
00616 edm::Handle<CaloTowerCollection> hcalhitsCollH;
00617
00618 iEvent.getByLabel(hcalCollection_, hcalhitsCollH);
00619
00620 const CaloTowerCollection *toww = hcalhitsCollH.product();
00621
00622 double hcalIsol=0.;
00623
00624
00625 EgammaTowerIsolation phoIso(RCone,
00626 RConeInner,
00627 eMin,depth,
00628 toww);
00629 hcalIsol = phoIso.getTowerEtSum(photon);
00630
00631
00632 return hcalIsol;
00633
00634
00635 }
00636
00637
00638
00639 double PhotonIsolationCalculator::calculateHcalTowerIso(const reco::Photon* photon,
00640 const edm::Event& iEvent,
00641 const edm::EventSetup& iSetup,
00642 double RCone,
00643 double eMin,
00644 signed int depth )
00645 {
00646
00647 edm::Handle<CaloTowerCollection> hcalhitsCollH;
00648
00649 iEvent.getByLabel(hcalCollection_, hcalhitsCollH);
00650
00651 const CaloTowerCollection *toww = hcalhitsCollH.product();
00652
00653 double hcalIsol=0.;
00654
00655
00656 EgammaTowerIsolation phoIso(RCone,
00657 0.,
00658 eMin,depth,
00659 toww);
00660 hcalIsol = phoIso.getTowerEtSum(photon, &(photon->hcalTowersBehindClusters()) );
00661
00662
00663 return hcalIsol;
00664
00665
00666 }
00667
00668
00669
00670