CMS 3D CMS Logo

EcalCleaningAlgo.cc
Go to the documentation of this file.
1 /* Implementation of class EcalCleaningAlgo
2  \author Stefano Argiro
3  \date 20 Dec 2010
4 */
5 
10 
12 
14  cThreshold_barrel_ = p.getParameter<double>("cThreshold_barrel");
15  ;
16  cThreshold_endcap_ = p.getParameter<double>("cThreshold_endcap");
17  ;
18  e4e1_a_barrel_ = p.getParameter<double>("e4e1_a_barrel");
19  e4e1_b_barrel_ = p.getParameter<double>("e4e1_b_barrel");
20  e4e1_a_endcap_ = p.getParameter<double>("e4e1_a_endcap");
21  e4e1_b_endcap_ = p.getParameter<double>("e4e1_b_endcap");
22  e4e1Treshold_barrel_ = p.getParameter<double>("e4e1Threshold_barrel");
23  e4e1Treshold_endcap_ = p.getParameter<double>("e4e1Threshold_endcap");
24 
25  cThreshold_double_ = p.getParameter<double>("cThreshold_double");
26 
27  ignoreOutOfTimeThresh_ = p.getParameter<double>("ignoreOutOfTimeThresh");
28  tightenCrack_e1_single_ = p.getParameter<double>("tightenCrack_e1_single");
29  tightenCrack_e4e1_single_ = p.getParameter<double>("tightenCrack_e4e1_single");
30  tightenCrack_e1_double_ = p.getParameter<double>("tightenCrack_e1_double");
31  tightenCrack_e6e2_double_ = p.getParameter<double>("tightenCrack_e6e2_double");
32  e6e2thresh_ = p.getParameter<double>("e6e2thresh");
33 }
34 
63  float a = 0, b = 0, e4e1thresh = 0, ethresh = 0;
64 
65  if (id.subdetId() == EcalBarrel) {
66  a = e4e1_a_barrel_;
67  b = e4e1_b_barrel_;
69 
70  } else if (id.subdetId() == EcalEndcap) {
71  a = e4e1_a_endcap_;
72  b = e4e1_b_endcap_;
74  }
75 
76  // for energies below threshold, we don't apply e4e1 cut
77  float energy = recHitE(id, rhs, false);
78 
79  if (energy < ethresh)
80  return EcalRecHit::kGood;
82  return EcalRecHit::kGood;
83 
84  float e4e1value = e4e1(id, rhs);
85  e4e1thresh = a * log10(energy) + b;
86 
87  // near cracks the cut is tighter by a factor
88  if (isNearCrack(id)) {
89  e4e1thresh /= tightenCrack_e4e1_single_;
90  }
91 
92  // identify spike
93  if (e4e1value < e4e1thresh)
94  return EcalRecHit::kWeird;
95 
96  // now for double spikes
97 
98  // no checking for double spikes in EE
99  if (id.subdetId() == EcalEndcap)
100  return EcalRecHit::kGood;
101 
102  float e6e2value = e6e2(id, rhs);
103  float e6e2thresh = e6e2thresh_;
105  return EcalRecHit::kGood;
106 
108  return EcalRecHit::kGood;
109 
110  // near cracks the cut is tighter by a factor
111  if (id.subdetId() == EcalBarrel && isNearCrack(id))
113 
114  // identify double spike
115  if (e6e2value < e6e2thresh)
116  return EcalRecHit::kDiWeird;
117 
118  return EcalRecHit::kGood;
119 }
120 
121 float EcalCleaningAlgo::e4e1(const DetId& id, const EcalRecHitCollection& rhs) {
122  float s4 = 0;
123  float e1 = recHitE(id, rhs, false);
124 
125  if (e1 == 0)
126  return 0;
127  const std::vector<DetId>& neighs = neighbours(id);
128  for (size_t i = 0; i < neighs.size(); ++i)
129  // avoid hits out of time when making s4
130  s4 += recHitE(neighs[i], rhs, true);
131 
132  return s4 / e1;
133 }
134 
135 float EcalCleaningAlgo::e6e2(const DetId& id, const EcalRecHitCollection& rhs) {
136  float s4_1 = 0;
137  float s4_2 = 0;
138  float e1 = recHitE(id, rhs, false);
139 
140  float maxene = 0;
141  DetId maxid;
142 
143  if (e1 == 0)
144  return 0;
145 
146  const std::vector<DetId>& neighs = neighbours(id);
147 
148  // find the most energetic neighbour ignoring time info
149  for (size_t i = 0; i < neighs.size(); ++i) {
150  float ene = recHitE(neighs[i], rhs, false);
151  if (ene > maxene) {
152  maxene = ene;
153  maxid = neighs[i];
154  }
155  }
156 
157  float e2 = maxene;
158 
159  s4_1 = e4e1(id, rhs) * e1;
160  s4_2 = e4e1(maxid, rhs) * e2;
161 
162  return (s4_1 + s4_2) / (e1 + e2) - 1.;
163 }
164 
165 float EcalCleaningAlgo::recHitE(const DetId id, const EcalRecHitCollection& recHits, bool useTimingInfo) {
166  if (id.rawId() == 0)
167  return 0;
168 
170  if (id.subdetId() == EcalEndcap)
172 
174  if (it != recHits.end()) {
175  float ene = (*it).energy();
176 
177  // ignore out of time in EB when making e4e1 if so configured
178  if (useTimingInfo) {
179  if (id.subdetId() == EcalBarrel && it->checkFlag(EcalRecHit::kOutOfTime) && ene > ignoreOutOfTimeThresh_)
180  return 0;
181  }
182 
183  // ignore hits below threshold
184  if (ene < threshold)
185  return 0;
186 
187  // else return the energy of this hit
188  return ene;
189  }
190  return 0;
191 }
192 
194 const std::vector<DetId> EcalCleaningAlgo::neighbours(const DetId& id) {
195  std::vector<DetId> ret;
196 
197  if (id.subdetId() == EcalBarrel) {
198  ret.push_back(EBDetId::offsetBy(id, 1, 0));
199  ret.push_back(EBDetId::offsetBy(id, -1, 0));
200  ret.push_back(EBDetId::offsetBy(id, 0, 1));
201  ret.push_back(EBDetId::offsetBy(id, 0, -1));
202  }
203  // nobody understands what polymorphism is for, sgrunt !
204  else if (id.subdetId() == EcalEndcap) {
205  ret.push_back(EEDetId::offsetBy(id, 1, 0));
206  ret.push_back(EEDetId::offsetBy(id, -1, 0));
207  ret.push_back(EEDetId::offsetBy(id, 0, 1));
208  ret.push_back(EEDetId::offsetBy(id, 0, -1));
209  }
210 
211  return ret;
212 }
213 
215  if (id.subdetId() == EcalEndcap) {
217  } else {
218  return EBDetId::isNextToBoundary(id);
219  }
220 }
221 
224  //changing the collection on place
225  for (rh = rhs.begin(); rh != rhs.end(); ++rh) {
226  EcalRecHit::Flags state = checkTopology(rh->id(), rhs);
227  if (state != EcalRecHit::kGood) {
228  rh->unsetFlag(EcalRecHit::kGood);
229  rh->setFlag(state);
230  }
231  }
232 }
const std::vector< DetId > neighbours(const DetId &id)
return the id of the 4 neighbours in the swiss cross
EcalCleaningAlgo(const edm::ParameterSet &p)
float tightenCrack_e4e1_single_
float recHitE(const DetId id, const EcalRecHitCollection &recHits, bool useTimingInfo)
ret
prodAgent to be discontinued
float ignoreOutOfTimeThresh_
ignore kOutOfTime above threshold when calculating e4e1
std::vector< EcalRecHit >::const_iterator const_iterator
EcalRecHit::Flags checkTopology(const DetId &id, const EcalRecHitCollection &rhs)
float e4e1(const DetId &id, const EcalRecHitCollection &rhs)
yet another function to calculate swiss cross
static bool isNextToBoundary(EBDetId id)
Definition: EBDetId.cc:106
EEDetId offsetBy(int nrStepsX, int nrStepsY) const
Definition: EEDetId.cc:391
bool isNearCrack(const DetId &detid)
in EB, check if we are near a crack
static bool isNextToRingBoundary(EEDetId id)
Definition: EEDetId.cc:284
float tightenCrack_e6e2_double_
const_iterator begin() const
std::vector< EcalRecHit >::iterator iterator
const_iterator end() const
Definition: DetId.h:17
double b
Definition: hdecay.h:118
EBDetId offsetBy(int nrStepsEta, int nrStepsPhi) const
Definition: EBDetId.cc:50
double a
Definition: hdecay.h:119
void setFlags(EcalRecHitCollection &rhs)
float e6e2(const DetId &id, const EcalRecHitCollection &rhs)