Go to the documentation of this file.00001 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaHadTower.h"
00002 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00003 #include "FWCore/Framework/interface/ESHandle.h"
00004 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00005
00006 #include <algorithm>
00007 #include <iostream>
00008
00009 EgammaHadTower::EgammaHadTower(const edm::EventSetup &es,HoeMode mode):mode_(mode) {
00010 edm::ESHandle<CaloTowerConstituentsMap> ctmaph;
00011 es.get<IdealGeometryRecord>().get(ctmaph);
00012 towerMap_ = &(*ctmaph);
00013 NMaxClusters_ = 4;
00014 }
00015
00016 CaloTowerDetId EgammaHadTower::towerOf(const reco::CaloCluster& cluster) const {
00017 DetId detid = cluster.seed();
00018 if(detid.det() != DetId::Ecal) {
00019
00020
00021 detid = cluster.hitsAndFractions()[0].first;
00022 if(detid.det() != DetId::Ecal) {
00023 CaloTowerDetId tower;
00024 return tower;
00025 }
00026 }
00027 CaloTowerDetId id(towerMap_->towerOf(detid));
00028 return id;
00029 }
00030
00031 std::vector<CaloTowerDetId> EgammaHadTower::towersOf(const reco::SuperCluster& sc) const {
00032 std::vector<CaloTowerDetId> towers;
00033 std::vector<reco::CaloClusterPtr> orderedClusters;
00034
00035
00036 if ( mode_ == SingleTower ) {
00037 towers.push_back(towerOf(*sc.seed()));
00038 }
00039
00040
00041 if ( mode_ == TowersBehindCluster ) {
00042
00043 reco::CaloCluster_iterator it = sc.clustersBegin();
00044 reco::CaloCluster_iterator itend = sc.clustersEnd();
00045
00046 for ( ; it !=itend; ++it) {
00047 orderedClusters.push_back(*it);
00048 }
00049 std::sort(orderedClusters.begin(),orderedClusters.end(),ClusterGreaterThan);
00050 unsigned nclusters=orderedClusters.size();
00051 for ( unsigned iclus =0 ; iclus <nclusters && iclus < NMaxClusters_; ++iclus) {
00052
00053 CaloTowerDetId id = towerOf(*(orderedClusters[iclus]));
00054 std::vector<CaloTowerDetId>::const_iterator itcheck=find(towers.begin(),towers.end(),id);
00055 if( itcheck == towers.end() ) {
00056 towers.push_back(id);
00057 }
00058 }
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 return towers;
00074 }
00075
00076 double EgammaHadTower::getDepth1HcalESum(const std::vector<CaloTowerDetId> & towers) const {
00077 double esum=0.;
00078 CaloTowerCollection::const_iterator trItr = towerCollection_->begin();
00079 CaloTowerCollection::const_iterator trItrEnd = towerCollection_->end();
00080 for( ; trItr != trItrEnd ; ++trItr){
00081 std::vector<CaloTowerDetId>::const_iterator itcheck = find(towers.begin(), towers.end(), trItr->id());
00082 if( itcheck != towers.end() ) {
00083 esum += trItr->ietaAbs()<18 || trItr->ietaAbs()>29 ? trItr->hadEnergy() : trItr->hadEnergyHeInnerLayer() ;
00084 }
00085 }
00086 return esum;
00087 }
00088
00089 double EgammaHadTower::getDepth2HcalESum(const std::vector<CaloTowerDetId> & towers) const {
00090 double esum=0.;
00091 CaloTowerCollection::const_iterator trItr = towerCollection_->begin();
00092 CaloTowerCollection::const_iterator trItrEnd = towerCollection_->end();
00093 for( ; trItr != trItrEnd ; ++trItr){
00094 std::vector<CaloTowerDetId>::const_iterator itcheck = find(towers.begin(), towers.end(), trItr->id());
00095 if( itcheck != towers.end() ) {
00096 esum += trItr->hadEnergyHeOuterLayer();
00097 }
00098 }
00099 return esum;
00100 }
00101
00102 double EgammaHadTower::getDepth1HcalESum( const reco::SuperCluster& sc ) const {
00103 return getDepth1HcalESum(towersOf(sc)) ;
00104 }
00105
00106 double EgammaHadTower::getDepth2HcalESum( const reco::SuperCluster& sc ) const {
00107 return getDepth2HcalESum(towersOf(sc)) ;
00108 }
00109
00110 void EgammaHadTower::setTowerCollection(const CaloTowerCollection* towerCollection) {
00111 towerCollection_ = towerCollection;
00112 }
00113
00114 bool ClusterGreaterThan(const reco::CaloClusterPtr& c1, const reco::CaloClusterPtr& c2) {
00115 return (*c1 > *c2);
00116 }