CMS 3D CMS Logo

EgammaRecHitIsolation.cc
Go to the documentation of this file.
1 //*****************************************************************************
2 // File: EgammaRecHitIsolation.cc
3 // ----------------------------------------------------------------------------
4 // OrigAuth: Matthias Mozer, hacked by Sam Harper (ie the ugly stuff is mine)
5 // Institute: IIHE-VUB, RAL
6 //=============================================================================
7 //*****************************************************************************
8 //C++ includes
9 #include <vector>
10 #include <functional>
11 
12 //ROOT includes
13 #include <Math/VectorUtil.h>
14 
15 //CMSSW includes
29 
30 using namespace std;
31 
33  double intRadius,
34  double etaSlice,
35  double etLow,
36  double eLow,
37  edm::ESHandle<CaloGeometry> theCaloGeom,
38  const EcalRecHitCollection& caloHits,
39  const EcalSeverityLevelAlgo* sl,
40  DetId::Detector detector): // not used anymore, kept for compatibility
41  extRadius_(extRadius),
42  intRadius_(intRadius),
43  etaSlice_(etaSlice),
44  etLow_(etLow),
45  eLow_(eLow),
46  theCaloGeom_(theCaloGeom) ,
47  caloHits_(caloHits),
48  sevLevel_(sl),
49  useNumCrystals_(false),
50  vetoClustered_(false),
51  ecalBarHits_(nullptr),
52  //chStatus_(0),
53  severitiesexcl_(0),
54  //severityRecHitThreshold_(0),
55  //spId_(EcalSeverityLevelAlgo::kSwissCross),
56  //spIdThreshold_(0),
57  flags_(0)
58 {
59  //set up the geometry and selector
60  const CaloGeometry* caloGeom = theCaloGeom_.product();
63 
64 }
65 
67 {}
68 
69 double EgammaRecHitIsolation::getSum_(const reco::Candidate* emObject,bool returnEt) const {
70 
71  double energySum = 0.;
72  if (! caloHits_.empty()) {
73  //Take the SC position
75  math::XYZPoint const & theCaloPosition = sc.get()->position();
76  GlobalPoint pclu (theCaloPosition.x () ,
77  theCaloPosition.y () ,
78  theCaloPosition.z () );
79  float etaclus = pclu.eta();
80  float phiclus = pclu.phi();
81  float r2 = intRadius_*intRadius_;
82 
83  std::vector< std::pair<DetId, float> >::const_iterator rhIt;
84 
85  for(int subdetnr=0; subdetnr<=1 ; subdetnr++){ // look in barrel and endcap
86  if( nullptr == subdet_[subdetnr] ) continue;
87 
88  CaloSubdetectorGeometry::DetIdSet chosen = subdet_[subdetnr]->getCells(pclu,extRadius_);// select cells around cluster
90 
91  for (CaloSubdetectorGeometry::DetIdSet::const_iterator i = chosen.begin ();i != chosen.end (); ++i){ //loop selected cells
92  j = caloHits_.find(*i); // find selected cell among rechits
93  if(j != caloHits_.end()) { // add rechit only if available
94  auto const cell = theCaloGeom_.product()->getGeometry(*i);
95  float eta = cell->etaPos();
96  float phi = cell->phiPos();
97  float etaDiff = eta - etaclus;
98  float phiDiff= reco::deltaPhi(phi,phiclus);
99  float energy = j->energy();
100 
101  if(useNumCrystals_) {
102  if(fabs(etaclus) < 1.479) { // Barrel num crystals, crystal width = 0.0174
103  if (fabs(etaDiff) < 0.0174*etaSlice_)
104  continue;
105  //if (sqrt(etaDiff*etaDiff + phiDiff*phiDiff) < 0.0174*intRadius_)
106  //continue;
107  if ((etaDiff*etaDiff + phiDiff*phiDiff) < 0.00030276*r2)
108  continue;
109  } else { // Endcap num crystals, crystal width = 0.00864*fabs(sinh(eta))
110  if (fabs(etaDiff) < 0.00864*fabs(sinh(eta))*etaSlice_)
111  continue;
112  //if (sqrt(etaDiff*etaDiff + phiDiff*phiDiff) < 0.00864*fabs(sinh(eta))*intRadius_)
113  // continue;
114  if ((etaDiff*etaDiff + phiDiff*phiDiff) < (0.000037325*(cosh(2*eta)-1)*r2))
115  continue;
116  }
117  } else {
118  if (fabs(etaDiff) < etaSlice_)
119  continue; // jurassic strip cut
120  if (etaDiff*etaDiff + phiDiff*phiDiff < r2)
121  continue; // jurassic exclusion cone cut
122  }
123  //Check if RecHit is in SC
124  if(vetoClustered_) {
125 
126  //Loop over basic clusters:
127  bool isClustered = false;
128  for(reco::CaloCluster_iterator bcIt = sc->clustersBegin();bcIt != sc->clustersEnd(); ++bcIt) {
129  for(rhIt = (*bcIt)->hitsAndFractions().begin();rhIt != (*bcIt)->hitsAndFractions().end(); ++rhIt) {
130  if(rhIt->first == *i)
131  isClustered = true;
132  if(isClustered)
133  break;
134  }
135 
136  if(isClustered)
137  break;
138  } //end loop over basic clusters
139 
140  if(isClustered)
141  continue;
142  } //end if removeClustered
143 
144 
145 
146 
147  //std::cout << "detid " << ((EcalRecHit*)(&*j))->detid() << std::endl;
148  int severityFlag = ecalBarHits_ == nullptr ? -1 : sevLevel_->severityLevel(((const EcalRecHit*)(&*j))->detid(), *ecalBarHits_);
149  std::vector<int>::const_iterator sit = std::find(severitiesexcl_.begin(),
150  severitiesexcl_.end(),
151  severityFlag);
152 
153  if (sit!= severitiesexcl_.end())
154  continue;
155 
156  // new rechit flag checks
157  //std::vector<int>::const_iterator vit = std::find(flags_.begin(),
158  // flags_.end(),
159  // ((const EcalRecHit*)(&*j))->recoFlag());
160  //if (vit != flags_.end())
161  // continue;
162  if (!((EcalRecHit*)(&*j))->checkFlag(EcalRecHit::kGood)) {
163  if (((EcalRecHit*)(&*j))->checkFlags(flags_)) {
164  continue;
165  }
166  }
167 
168  float et = energy*std::sqrt(cell->getPosition().perp2()/cell->getPosition().mag2());
169  if ( et > etLow_ && energy > eLow_) { //Changed energy --> fabs(energy) - now changed back to energy
170  if(returnEt)
171  energySum += et;
172  else
173  energySum += energy;
174  }
175 
176  } //End if not end of list
177  } //End loop over rechits
178  } //End loop over barrel/endcap
179  } //End if caloHits_
180 
181  return energySum;
182 }
183 
184 
185 
186 double EgammaRecHitIsolation::getSum_(const reco::SuperCluster* sc, bool returnEt) const {
187 
188  double energySum = 0.;
189  if (! caloHits_.empty()){
190  //Take the SC position
191 
192  const math::XYZPoint& theCaloPosition = sc->position();
193  GlobalPoint pclu (theCaloPosition.x () ,
194  theCaloPosition.y () ,
195  theCaloPosition.z () );
196  double etaclus = pclu.eta();
197  double phiclus = pclu.phi();
198  double r2 = intRadius_*intRadius_;
199 
200  std::vector< std::pair<DetId, float> >::const_iterator rhIt;
201 
202 
203  for(int subdetnr=0; subdetnr<=1 ; subdetnr++){ // look in barrel and endcap
204  if( nullptr == subdet_[subdetnr] ) continue;
205  CaloSubdetectorGeometry::DetIdSet chosen = subdet_[subdetnr]->getCells(pclu,extRadius_);// select cells around cluster
207  for (CaloSubdetectorGeometry::DetIdSet::const_iterator i = chosen.begin ();i!= chosen.end ();++i){//loop selected cells
208 
209  j=caloHits_.find(*i); // find selected cell among rechits
210  if( j!=caloHits_.end()){ // add rechit only if available
212  double eta = position.eta();
213  double phi = position.phi();
214  double etaDiff = eta - etaclus;
215  double phiDiff= reco::deltaPhi(phi,phiclus);
216  double energy = j->energy();
217 
218  if(useNumCrystals_) {
219  if( fabs(etaclus) < 1.479 ) { // Barrel num crystals, crystal width = 0.0174
220  if ( fabs(etaDiff) < 0.0174*etaSlice_) continue;
221  // if ( sqrt(etaDiff*etaDiff + phiDiff*phiDiff) < 0.0174*intRadius_) continue;
222  if ((etaDiff*etaDiff + phiDiff*phiDiff) < 0.00030276*r2) continue;
223  } else { // Endcap num crystals, crystal width = 0.00864*fabs(sinh(eta))
224  if ( fabs(etaDiff) < 0.00864*fabs(sinh(eta))*etaSlice_) continue;
225  // if ( sqrt(etaDiff*etaDiff + phiDiff*phiDiff) < 0.00864*fabs(sinh(eta))*intRadius_) continue;
226  if ((etaDiff*etaDiff + phiDiff*phiDiff) < (0.000037325*(cosh(2*eta)-1)*r2)) continue;
227  }
228  } else {
229  if ( fabs(etaDiff) < etaSlice_) continue; // jurassic strip cut
230  if ( etaDiff*etaDiff + phiDiff*phiDiff < r2) continue; // jurassic exclusion cone cut
231  }
232 
233  //Check if RecHit is in SC
234  if(vetoClustered_) {
235 
236  //Loop over basic clusters:
237  bool isClustered = false;
238  for(reco::CaloCluster_iterator bcIt = sc->clustersBegin();bcIt != sc->clustersEnd(); ++bcIt) {
239  for(rhIt = (*bcIt)->hitsAndFractions().begin();rhIt != (*bcIt)->hitsAndFractions().end(); ++rhIt) {
240  if( rhIt->first == *i ) isClustered = true;
241  if( isClustered ) break;
242  }
243  if( isClustered ) break;
244  } //end loop over basic clusters
245 
246  if(isClustered) continue;
247  } //end if removeClustered
248 
249 
250  int severityFlag = sevLevel_->severityLevel(j->detid(), *ecalBarHits_);
251  std::vector<int>::const_iterator sit = std::find(severitiesexcl_.begin(),
252  severitiesexcl_.end(),
253  severityFlag);
254 
255  if (sit!= severitiesexcl_.end())
256  continue;
257 
258  // new rechit flag checks
259  //std::vector<int>::const_iterator vit = std::find(flags_.begin(),
260  // flags_.end(),
261  // ((EcalRecHit*)(&*j))->recoFlag());
262  //if (vit != flags_.end())
263  // continue;
264  if (!((EcalRecHit*)(&*j))->checkFlag(EcalRecHit::kGood)) {
265  if (((EcalRecHit*)(&*j))->checkFlags(flags_)) {
266  continue;
267  }
268  }
269 
270 
271  double et = energy*position.perp()/position.mag();
272  if ( et > etLow_ && energy > eLow_){ //Changed energy --> fabs(energy) -- then changed into energy
273  if(returnEt) energySum+=et;
274  else energySum+=energy;
275  }
276 
277  } //End if not end of list
278  } //End loop over rechits
279  } //End loop over barrel/endcap
280  } //End if caloHits_
281 
282  return energySum;
283 }
284 
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:45
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:129
const CaloSubdetectorGeometry * subdet_[2]
edm::ESHandle< CaloGeometry > theCaloGeom_
std::vector< int > flags_
T perp() const
Definition: PV3DBase.h:72
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
std::vector< EcalRecHit >::const_iterator const_iterator
std::vector< int > severitiesexcl_
#define nullptr
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
double getSum_(const reco::Candidate *, bool returnEt) const
virtual DetIdSet getCells(const GlobalPoint &r, double dR) const
Get a list of all cells within a dR of the given cell.
T mag() const
Definition: PV3DBase.h:67
T sqrt(T t)
Definition: SSEVec.h:18
EgammaRecHitIsolation(double extRadius, double intRadius, double etaSlice, double etLow, double eLow, edm::ESHandle< CaloGeometry >, const EcalRecHitCollection &, const EcalSeverityLevelAlgo *, DetId::Detector detector)
const GlobalPoint & getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:70
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:245
const EcalRecHitCollection * ecalBarHits_
const_iterator end() const
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
Detector
Definition: DetId.h:24
et
define resolution functions of each parameter
T eta() const
Definition: PV3DBase.h:76
iterator find(key_type k)
static int position[264][3]
Definition: ReadPGInfo.cc:509
const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
Definition: CaloGeometry.cc:78
CaloCluster_iterator clustersBegin() const
fist iterator over BasicCluster constituents
Definition: SuperCluster.h:75
T get() const
get a component
Definition: Candidate.h:217
const EcalSeverityLevelAlgo * sevLevel_
double energySum(const DataFrame &df, int fs, int ls)
T const * product() const
Definition: ESHandle.h:86
const EcalRecHitCollection & caloHits_
CaloCluster_iterator clustersEnd() const
last iterator over BasicCluster constituents
Definition: SuperCluster.h:78