00001
00002
00003 #include "RecoEcal/EgammaCoreTools/interface/EcalTools.h"
00004 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00005 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00006 #include "RecoEcal/EgammaCoreTools/interface/EcalNextToDeadChannel.h"
00007 #include "RecoEcal/EgammaCoreTools/interface/EcalNextToDeadChannelRcd.h"
00008 #include "FWCore/Framework/interface/ESHandle.h"
00009 #include "FWCore/Framework/interface/EventSetup.h"
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011
00012 float EcalTools::swissCross( const DetId& id,
00013 const EcalRecHitCollection & recHits,
00014 float recHitThreshold ,
00015 bool avoidIeta85){
00016
00017 if ( id.subdetId() == EcalBarrel ) {
00018 EBDetId ebId( id );
00019
00020
00021
00022
00023 if ( abs(ebId.ieta())==85 && avoidIeta85) return 0;
00024
00025 if ( recHitApproxEt( id, recHits ) < recHitThreshold ) return 0;
00026 float s4 = 0;
00027 float e1 = recHitE( id, recHits );
00028
00029 if ( e1 == 0 ) return 0;
00030 s4 += recHitE( id, recHits, 1, 0 );
00031 s4 += recHitE( id, recHits, -1, 0 );
00032 s4 += recHitE( id, recHits, 0, 1 );
00033 s4 += recHitE( id, recHits, 0, -1 );
00034 return 1 - s4 / e1;
00035 } else if ( id.subdetId() == EcalEndcap ) {
00036 EEDetId eeId( id );
00037
00038 float e1 = recHitE( id, recHits );
00039 if ( e1 < recHitThreshold ) return 0;
00040 float s4 = 0;
00041
00042 if ( e1 == 0 ) return 0;
00043 s4 += recHitE( id, recHits, 1, 0 );
00044 s4 += recHitE( id, recHits, -1, 0 );
00045 s4 += recHitE( id, recHits, 0, 1 );
00046 s4 += recHitE( id, recHits, 0, -1 );
00047 return 1 - s4 / e1;
00048 }
00049 return 0;
00050 }
00051
00052
00053 bool EcalTools::isNextToDead( const DetId& id, const edm::EventSetup& es){
00054
00055 edm::ESHandle<EcalNextToDeadChannel> dch;
00056 es.get<EcalNextToDeadChannelRcd>().get(dch);
00057
00058 EcalNextToDeadChannel::const_iterator chIt = dch->find( id );
00059
00060 if ( chIt != dch->end() ) {
00061 return *chIt;
00062 } else {
00063 edm::LogError("EcalDBError")
00064 << "No NextToDead status found for xtal "
00065 << id.rawId() ;
00066 }
00067
00068 return false;
00069
00070 }
00071
00072 bool EcalTools::isNextToDeadFromNeighbours( const DetId& id,
00073 const EcalChannelStatus& chs,
00074 int chStatusThreshold) {
00075
00076 if (deadNeighbour(id,chs, chStatusThreshold, 1, 0)) return true;
00077 if (deadNeighbour(id,chs, chStatusThreshold,-1, 0)) return true;
00078 if (deadNeighbour(id,chs, chStatusThreshold, 0, 1)) return true;
00079 if (deadNeighbour(id,chs, chStatusThreshold, 0,-1)) return true;
00080 if (deadNeighbour(id,chs, chStatusThreshold, 1,-1)) return true;
00081 if (deadNeighbour(id,chs, chStatusThreshold, 1, 1)) return true;
00082 if (deadNeighbour(id,chs, chStatusThreshold,-1, 1)) return true;
00083 if (deadNeighbour(id,chs, chStatusThreshold,-1,-1)) return true;
00084
00085 return false;
00086 }
00087
00088
00089 bool EcalTools::deadNeighbour(const DetId& id,
00090 const EcalChannelStatus& chs,
00091 int chStatusThreshold,
00092 int dx, int dy){
00093
00094
00095 DetId nid;
00096 if( id.subdetId() == EcalBarrel) nid = EBDetId::offsetBy( id, dx, dy );
00097 else if( id.subdetId() == EcalEndcap) nid = EEDetId::offsetBy( id, dx, dy );
00098
00099 if (!nid) return false;
00100
00101 EcalChannelStatus::const_iterator chIt = chs.find( nid );
00102 uint16_t dbStatus = 0;
00103 if ( chIt != chs.end() ) {
00104
00105 dbStatus = chIt->getStatusCode() ;
00106 } else {
00107 edm::LogError("EcalDBError")
00108 << "No channel status found for xtal "
00109 << id.rawId()
00110 << "! something wrong with EcalChannelStatus in your DB? ";
00111 }
00112
00113 return (dbStatus>=chStatusThreshold );
00114
00115 }
00116
00117
00118
00119 float EcalTools::recHitE( const DetId id,
00120 const EcalRecHitCollection & recHits,
00121 int di, int dj )
00122 {
00123
00124
00125
00126 DetId nid;
00127 if( id.subdetId() == EcalBarrel) nid = EBDetId::offsetBy( id, di, dj );
00128 else if( id.subdetId() == EcalEndcap) nid = EEDetId::offsetBy( id, di, dj );
00129
00130 return ( nid == DetId(0) ? 0 : recHitE( nid, recHits ) );
00131 }
00132
00133 float EcalTools::recHitE( const DetId id, const EcalRecHitCollection &recHits ){
00134 if ( id == DetId(0) ) {
00135 return 0;
00136 } else {
00137 EcalRecHitCollection::const_iterator it = recHits.find( id );
00138 if ( it != recHits.end() ) return (*it).energy();
00139 }
00140 return 0;
00141 }
00142
00143 float EcalTools::recHitApproxEt( const DetId id, const EcalRecHitCollection &recHits ){
00144
00145 if ( id.subdetId() == EcalBarrel ) {
00146 return recHitE( id, recHits ) / cosh( EBDetId::approxEta( id ) );
00147 }
00148 return 0;
00149 }
00150
00151
00152 bool isNextToBoundary(const DetId& id){
00153
00154 if ( id.subdetId() == EcalBarrel )
00155 return EBDetId::isNextToBoundary(EBDetId(id));
00156 else if ( id.subdetId() == EcalEndcap )
00157 return EEDetId::isNextToBoundary(EEDetId(id));
00158
00159 return false;
00160 }