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 
6 
11 
13 
15 
16  cThreshold_barrel_ = p.getParameter<double>("cThreshold_barrel");;
17  cThreshold_endcap_ = p.getParameter<double>("cThreshold_endcap");;
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 
35 
36 }
37 
38 
39 
40 
70  const EcalRecHitCollection& rhs){
71 
72 
73  float a=0,b=0,e4e1thresh=0,ethresh=0;
74 
75 
76  if( id.subdetId() == EcalBarrel) {
77  a= e4e1_a_barrel_;
78  b= e4e1_b_barrel_;
80 
81  }
82  else if( id.subdetId() == EcalEndcap){
83  a= e4e1_a_endcap_;
86  }
87 
88 
89 
90  // for energies below threshold, we don't apply e4e1 cut
91  float energy = recHitE(id,rhs,false);
92 
93  if (energy< ethresh) return EcalRecHit::kGood;
94  if (isNearCrack(id) && energy < ethresh*tightenCrack_e1_single_)
95  return EcalRecHit::kGood;
96 
97 
98  float e4e1value = e4e1(id,rhs);
99  e4e1thresh = a* log10(energy) + b;
100 
101  // near cracks the cut is tighter by a factor
102  if (isNearCrack(id)) {
103  e4e1thresh/=tightenCrack_e4e1_single_;
104  }
105 
106  // identify spike
107  if (e4e1value < e4e1thresh) return EcalRecHit::kWeird;
108 
109 
110 
111  // now for double spikes
112 
113  // no checking for double spikes in EE
114  if( id.subdetId() == EcalEndcap) return EcalRecHit::kGood;
115 
116  float e6e2value = e6e2(id,rhs);
117  float e6e2thresh = e6e2thresh_ ;
119  return EcalRecHit::kGood;
120 
121  if (energy < cThreshold_double_) return EcalRecHit::kGood;
122 
123  // near cracks the cut is tighter by a factor
124  if (id.subdetId() == EcalBarrel && isNearCrack(id))
125  e6e2thresh/=tightenCrack_e6e2_double_;
126 
127  // identify double spike
128  if (e6e2value < e6e2thresh) return EcalRecHit::kDiWeird;
129 
130  return EcalRecHit::kGood;
131 
132 }
133 
134 
135 
136 
137 
138 
139 float EcalCleaningAlgo::e4e1(const DetId& id,
140  const EcalRecHitCollection& rhs){
141 
142 
143  float s4 = 0;
144  float e1 = recHitE( id, rhs, false );
145 
146 
147  if ( e1 == 0 ) return 0;
148  const std::vector<DetId>& neighs = neighbours(id);
149  for (size_t i=0; i<neighs.size(); ++i)
150  // avoid hits out of time when making s4
151  s4+=recHitE(neighs[i],rhs, true);
152 
153  return s4 / e1;
154 
155 
156 }
157 
158 
159 
160 
161 float EcalCleaningAlgo::e6e2(const DetId& id,
162  const EcalRecHitCollection& rhs){
163 
164  float s4_1 = 0;
165  float s4_2 = 0;
166  float e1 = recHitE( id, rhs , false );
167 
168 
169  float maxene=0;
170  DetId maxid;
171 
172  if ( e1 == 0 ) return 0;
173 
174  const std::vector<DetId>& neighs = neighbours(id);
175 
176  // find the most energetic neighbour ignoring time info
177  for (size_t i=0; i<neighs.size(); ++i){
178  float ene = recHitE(neighs[i],rhs,false);
179  if (ene>maxene) {
180  maxene=ene;
181  maxid = neighs[i];
182  }
183  }
184 
185  float e2=maxene;
186 
187  s4_1 = e4e1(id,rhs)* e1;
188  s4_2 = e4e1(maxid,rhs)* e2;
189 
190  return (s4_1 + s4_2) / (e1+e2) -1. ;
191 
192 }
193 
194 
195 
196 
198  const EcalRecHitCollection &recHits,
199  bool useTimingInfo )
200 {
201  if ( id.rawId() == 0 ) return 0;
202 
203 
205  if ( id.subdetId() == EcalEndcap) threshold = e4e1Treshold_endcap_;
206 
207  EcalRecHitCollection::const_iterator it = recHits.find( id );
208  if ( it != recHits.end() ){
209  float ene= (*it).energy();
210 
211  // ignore out of time in EB when making e4e1 if so configured
212  if (useTimingInfo){
213 
214  if (id.subdetId()==EcalBarrel &&
215  it->checkFlag(EcalRecHit::kOutOfTime)
216  && ene>ignoreOutOfTimeThresh_) return 0;
217  }
218 
219  // ignore hits below threshold
220  if (ene < threshold) return 0;
221 
222  // else return the energy of this hit
223  return ene;
224  }
225  return 0;
226 }
227 
229 const std::vector<DetId> EcalCleaningAlgo::neighbours(const DetId& id){
230 
231  std::vector<DetId> ret;
232 
233  if ( id.subdetId() == EcalBarrel) {
234 
235  ret.push_back( EBDetId::offsetBy( id, 1, 0 ));
236  ret.push_back( EBDetId::offsetBy( id, -1, 0 ));
237  ret.push_back( EBDetId::offsetBy( id, 0, 1 ));
238  ret.push_back( EBDetId::offsetBy( id, 0,-1 ));
239  }
240  // nobody understands what polymorphism is for, sgrunt !
241  else if (id.subdetId() == EcalEndcap) {
242  ret.push_back( EEDetId::offsetBy( id, 1, 0 ));
243  ret.push_back( EEDetId::offsetBy( id, -1, 0 ));
244  ret.push_back( EEDetId::offsetBy( id, 0, 1 ));
245  ret.push_back( EEDetId::offsetBy( id, 0,-1 ));
246 
247  }
248 
249 
250  return ret;
251 
252 }
253 
254 
256 
257  if (id.subdetId() == EcalEndcap) {
259  } else {
260  return EBDetId::isNextToBoundary(id);
261  }
262 }
263 
264 
265 
268  //changing the collection on place
269  for (rh=rhs.begin(); rh!=rhs.end(); ++rh){
270  EcalRecHit::Flags state=checkTopology(rh->id(),rhs);
271  if (state!=EcalRecHit::kGood) {
272  rh->unsetFlag(EcalRecHit::kGood);
273  rh->setFlag(state);
274  }
275  }
276 }
277 
T getParameter(std::string const &) const
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)
float ignoreOutOfTimeThresh_
ignore kOutOfTime above threshold when calculating e4e1
std::vector< EcalRecHit >::const_iterator const_iterator
EEDetId offsetBy(int nrStepsX, int nrStepsY) const
Definition: EEDetId.cc:391
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
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_
EBDetId offsetBy(int nrStepsEta, int nrStepsPhi) const
Definition: EBDetId.cc:50
std::vector< EcalRecHit >::iterator iterator
const_iterator end() const
Definition: DetId.h:18
double b
Definition: hdecay.h:120
iterator find(key_type k)
double a
Definition: hdecay.h:121
void setFlags(EcalRecHitCollection &rhs)
const_iterator begin() const
float e6e2(const DetId &id, const EcalRecHitCollection &rhs)