CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalUncalibRecHitWorkerGlobal.cc
Go to the documentation of this file.
2 
7 
13 
16 {
17  // ratio method parameters
18  EBtimeFitParameters_ = ps.getParameter<std::vector<double> >("EBtimeFitParameters");
19  EEtimeFitParameters_ = ps.getParameter<std::vector<double> >("EEtimeFitParameters");
20  EBamplitudeFitParameters_ = ps.getParameter<std::vector<double> >("EBamplitudeFitParameters");
21  EEamplitudeFitParameters_ = ps.getParameter<std::vector<double> >("EEamplitudeFitParameters");
22  EBtimeFitLimits_.first = ps.getParameter<double>("EBtimeFitLimits_Lower");
23  EBtimeFitLimits_.second = ps.getParameter<double>("EBtimeFitLimits_Upper");
24  EEtimeFitLimits_.first = ps.getParameter<double>("EEtimeFitLimits_Lower");
25  EEtimeFitLimits_.second = ps.getParameter<double>("EEtimeFitLimits_Upper");
26  EBtimeConstantTerm_=ps.getParameter<double>("EBtimeConstantTerm");
27  EBtimeNconst_=ps.getParameter<double>("EBtimeNconst");
28  EEtimeConstantTerm_=ps.getParameter<double>("EEtimeConstantTerm");
29  EEtimeNconst_=ps.getParameter<double>("EEtimeNconst");
30  outOfTimeThreshG12pEB_ = ps.getParameter<double>("outOfTimeThresholdGain12pEB");
31  outOfTimeThreshG12mEB_ = ps.getParameter<double>("outOfTimeThresholdGain12mEB");
32  outOfTimeThreshG61pEB_ = ps.getParameter<double>("outOfTimeThresholdGain61pEB");
33  outOfTimeThreshG61mEB_ = ps.getParameter<double>("outOfTimeThresholdGain61mEB");
34  outOfTimeThreshG12pEE_ = ps.getParameter<double>("outOfTimeThresholdGain12pEE");
35  outOfTimeThreshG12mEE_ = ps.getParameter<double>("outOfTimeThresholdGain12mEE");
36  outOfTimeThreshG61pEE_ = ps.getParameter<double>("outOfTimeThresholdGain61pEE");
37  outOfTimeThreshG61mEE_ = ps.getParameter<double>("outOfTimeThresholdGain61mEE");
38  amplitudeThreshEB_ = ps.getParameter<double>("amplitudeThresholdEB");
39  amplitudeThreshEE_ = ps.getParameter<double>("amplitudeThresholdEE");
40  // amplitude-dependent correction of time
41  doEBtimeCorrection_ = ps.getParameter<bool>("doEBtimeCorrection");
42  doEEtimeCorrection_ = ps.getParameter<bool>("doEEtimeCorrection");
43  EBtimeCorrAmplitudeBins_ = ps.getParameter<std::vector<double> >("EBtimeCorrAmplitudeBins");
44  EBtimeCorrShiftBins_ = ps.getParameter<std::vector<double> >("EBtimeCorrShiftBins");
45  EEtimeCorrAmplitudeBins_ = ps.getParameter<std::vector<double> >("EEtimeCorrAmplitudeBins");
46  EEtimeCorrShiftBins_ = ps.getParameter<std::vector<double> >("EEtimeCorrShiftBins");
47  if(EBtimeCorrAmplitudeBins_.size() != EBtimeCorrShiftBins_.size()) {
48  doEBtimeCorrection_ = false;
49  edm::LogError("EcalRecHitError") << "Size of EBtimeCorrAmplitudeBins different from EBtimeCorrShiftBins. Forcing no time corrections for EB. ";
50  }
51  if(EEtimeCorrAmplitudeBins_.size() != EEtimeCorrShiftBins_.size()) {
52  doEEtimeCorrection_ = false;
53  edm::LogError("EcalRecHitError") << "Size of EEtimeCorrAmplitudeBins different from EEtimeCorrShiftBins. Forcing no time corrections for EE. ";
54  }
55 
56  // spike threshold
57  ebSpikeThresh_ = ps.getParameter<double>("ebSpikeThreshold");
58  // leading edge parameters
59  ebPulseShape_ = ps.getParameter<std::vector<double> >("ebPulseShape");
60  eePulseShape_ = ps.getParameter<std::vector<double> >("eePulseShape");
61  // chi2 parameters
62  kPoorRecoFlagEB_ = ps.getParameter<bool>("kPoorRecoFlagEB");
63  kPoorRecoFlagEE_ = ps.getParameter<bool>("kPoorRecoFlagEE");;
64  chi2ThreshEB_=ps.getParameter<double>("chi2ThreshEB_");
65  chi2ThreshEE_=ps.getParameter<double>("chi2ThreshEE_");
66  EBchi2Parameters_ = ps.getParameter<std::vector<double> >("EBchi2Parameters");
67  EEchi2Parameters_ = ps.getParameter<std::vector<double> >("EEchi2Parameters");
68 }
69 
70 void
72 {
73  // common setup
74  es.get<EcalGainRatiosRcd>().get(gains);
75  es.get<EcalPedestalsRcd>().get(peds);
76 
77  // for the weights method
78  es.get<EcalWeightXtalGroupsRcd>().get(grps);
79  es.get<EcalTBWeightsRcd>().get(wgts);
80 
81  // for the ratio method
82 
83  // for the leading edge method
85 }
86 
87 
88 // check saturation: 5 samples with gainId = 0
89 template < class C >
91 {
92  //bool saturated_ = 0;
93  int cnt;
94  for (int j = 0; j < C::MAXSAMPLES - 5; ++j) {
95  cnt = 0;
96  for (int i = j; i < (j + 5) && i < C::MAXSAMPLES; ++i) {
97  if ( dataFrame.sample(i).gainId() == 0 ) ++cnt;
98  }
99  if ( cnt == 5 ) return j-1 ; // the last unsaturated sample
100  }
101  return -1; // no saturation found
102 }
103 
104 
106  // computed initially in ns. Than turned in the BX's, as EcalUncalibratedRecHit need be.
107  double theCorrection=0;
108 
109 
110  int myBin = -1;
111  for (int bin=0; bin<(int)EBtimeCorrAmplitudeBins_.size(); bin++ ){
112  if(ampliEB > EBtimeCorrAmplitudeBins_.at(bin)) {
113  myBin = bin; }
114  else break;
115  }
116 
117  if (myBin == -1)
118  {
119  theCorrection = EBtimeCorrShiftBins_.at(0);
120  }
121  else if ( myBin == ((int)(EBtimeCorrAmplitudeBins_.size()-1)) )
122  {
123  theCorrection = EBtimeCorrShiftBins_.at( myBin );
124  }
125  else if ( -1 < myBin && myBin < ((int)EBtimeCorrAmplitudeBins_.size()-1) )
126  {
127  // interpolate linearly between two assingned points
128  theCorrection = ( EBtimeCorrShiftBins_.at(myBin+1) - EBtimeCorrShiftBins_.at(myBin) );
129  theCorrection *= ( ((double)ampliEB) - EBtimeCorrAmplitudeBins_.at(myBin) ) / ( EBtimeCorrAmplitudeBins_.at(myBin+1) - EBtimeCorrAmplitudeBins_.at(myBin) );
130  theCorrection += EBtimeCorrShiftBins_.at(myBin);
131  }
132  else
133  {
134  edm::LogError("EcalRecHitError") << "Assigning time correction impossible. Setting it to 0 ";
135  theCorrection = 0.;
136  }
137 
138  // convert ns into clocks
139  return theCorrection/25.;
140 }
141 
142 
144  // computed initially in ns. Than turned in the BX's, as EcalUncalibratedRecHit need be.
145  double theCorrection=0;
146 
147  int myBin = -1;
148  for (int bin=0; bin<(int)EEtimeCorrAmplitudeBins_.size(); bin++ ){
149  if(ampliEE > EEtimeCorrAmplitudeBins_.at(bin)) {
150  myBin = bin; }
151  else break;
152  }
153 
154  if (myBin == -1)
155  {
156  theCorrection = EEtimeCorrShiftBins_.at(0);
157  }
158  else if ( myBin == ((int)(EEtimeCorrAmplitudeBins_.size()-1)) )
159  {
160  theCorrection = EEtimeCorrShiftBins_.at( myBin );
161  }
162  else if ( -1 < myBin && myBin < ((int)EEtimeCorrAmplitudeBins_.size()-1) )
163  {
164  // interpolate linearly between two assingned points
165  theCorrection = ( EEtimeCorrShiftBins_.at(myBin+1) - EEtimeCorrShiftBins_.at(myBin) );
166  theCorrection *= ( ((double)ampliEE) - EEtimeCorrAmplitudeBins_.at(myBin) ) / ( EEtimeCorrAmplitudeBins_.at(myBin+1) - EEtimeCorrAmplitudeBins_.at(myBin) );
167  theCorrection += EEtimeCorrShiftBins_.at(myBin);
168  }
169  else
170  {
171  edm::LogError("EcalRecHitError") << "Assigning time correction impossible. Setting it to 0 ";
172  theCorrection = 0.;
173  }
174 
175  // convert ns into clocks
176  return theCorrection/25.;
177 }
178 
179 
180 
181 
182 bool
186 {
187  DetId detid(itdg->id());
188 
189  // intelligence for recHit computation
190  EcalUncalibratedRecHit uncalibRecHit;
191 
192 
193  const EcalPedestals::Item * aped = 0;
194  const EcalMGPAGainRatio * aGain = 0;
195  const EcalXtalGroupId * gid = 0;
196 
197  if (detid.subdetId()==EcalEndcap) {
198  unsigned int hashedIndex = EEDetId(detid).hashedIndex();
199  aped = &peds->endcap(hashedIndex);
200  aGain = &gains->endcap(hashedIndex);
201  gid = &grps->endcap(hashedIndex);
202  } else {
203  unsigned int hashedIndex = EBDetId(detid).hashedIndex();
204  aped = &peds->barrel(hashedIndex);
205  aGain = &gains->barrel(hashedIndex);
206  gid = &grps->barrel(hashedIndex);
207  }
208 
209  pedVec[0] = aped->mean_x12;
210  pedVec[1] = aped->mean_x6;
211  pedVec[2] = aped->mean_x1;
212  pedRMSVec[0] = aped->rms_x12;
213  pedRMSVec[1] = aped->rms_x6;
214  pedRMSVec[2] = aped->rms_x1;
215  gainRatios[0] = 1.;
216  gainRatios[1] = aGain->gain12Over6();
217  gainRatios[2] = aGain->gain6Over1()*aGain->gain12Over6();
218 
219  // compute the right bin of the pulse shape using time calibration constants
221  EcalTimeCalibConstant itimeconst = 0;
222  if( it != itime->end() ) {
223  itimeconst = (*it);
224  } else {
225  edm::LogError("EcalRecHitError") << "No time intercalib const found for xtal "
226  << detid.rawId()
227  << "! something wrong with EcalTimeCalibConstants in your DB? ";
228  }
229 
230 
231  // === amplitude computation ===
232  int leadingSample = -1;
233  if (detid.subdetId()==EcalEndcap) {
234  leadingSample = ((EcalDataFrame)(*itdg)).lastUnsaturatedSample();
235  } else {
236  leadingSample = ((EcalDataFrame)(*itdg)).lastUnsaturatedSample();
237  }
238 
239  if ( leadingSample >= 0 ) { // saturation
240  if ( leadingSample != 4 ) {
241  // all samples different from the fifth are not reliable for the amplitude estimation
242  // put by default the energy at the saturation threshold and flag as saturated
243  float sratio = 1;
244  if ( detid.subdetId()==EcalBarrel) {
245  sratio = ebPulseShape_[5] / ebPulseShape_[4];
246  } else {
247  sratio = eePulseShape_[5] / eePulseShape_[4];
248  }
249  uncalibRecHit = EcalUncalibratedRecHit( (*itdg).id(), 4095*12*sratio, 0, 0, 0);
251  } else {
252  // float clockToNsConstant = 25.;
253  // reconstruct the rechit
254  if (detid.subdetId()==EcalEndcap) {
256  // float mult = (float)eePulseShape_.size() / (float)(*itdg).size();
257  // bin (or some analogous mapping) will be used instead of the leadingSample
258  //int bin = (int)(( (mult * leadingSample + mult/2) * clockToNsConstant + itimeconst ) / clockToNsConstant);
259  // bin is not uset for the moment
261  uncalibRecHit = leadingEdgeMethod_endcap_.makeRecHit(*itdg, pedVec, gainRatios, 0, 0);
264  } else {
266  // float mult = (float)ebPulseShape_.size() / (float)(*itdg).size();
267  // bin (or some analogous mapping) will be used instead of the leadingSample
268  //int bin = (int)(( (mult * leadingSample + mult/2) * clockToNsConstant + itimeconst ) / clockToNsConstant);
269  // bin is not uset for the moment
271  uncalibRecHit = leadingEdgeMethod_barrel_.makeRecHit(*itdg, pedVec, gainRatios, 0, 0);
274  }
275  }
276 
277  uncalibRecHit.setChi2(0); // do not propagate the default chi2 = -1 value to the calib rechit (mapped to 64), set it to 0 when saturation
278  uncalibRecHit.setOutOfTimeChi2(0);
279  } else {
280  // weights method
281  EcalTBWeights::EcalTDCId tdcid(1);
282  EcalTBWeights::EcalTBWeightMap const & wgtsMap = wgts->getMap();
283  EcalTBWeights::EcalTBWeightMap::const_iterator wit;
284  wit = wgtsMap.find( std::make_pair(*gid,tdcid) );
285  if( wit == wgtsMap.end() ) {
286  edm::LogError("EcalUncalibRecHitError") << "No weights found for EcalGroupId: "
287  << gid->id() << " and EcalTDCId: " << tdcid
288  << "\n skipping digi with id: " << detid.rawId();
289 
290  return false;
291  }
292  const EcalWeightSet& wset = wit->second; // this is the EcalWeightSet
293 
296 
297  weights[0] = &mat1;
298  weights[1] = &mat2;
299 
300  // get uncalibrated recHit from weights
301  if (detid.subdetId()==EcalEndcap) {
303  } else {
305  }
306 
307  // === time computation ===
308  // ratio method
309  float const clockToNsConstant = 25.;
310  if (detid.subdetId()==EcalEndcap) {
315  double theTimeCorrectionEE=0;
316  if(doEEtimeCorrection_) theTimeCorrectionEE = timeCorrectionEE( uncalibRecHit.amplitude() );
317  uncalibRecHit.setJitter( crh.timeMax - 5 + theTimeCorrectionEE);
318  uncalibRecHit.setJitterError( std::sqrt(pow(crh.timeError,2) + std::pow(EEtimeConstantTerm_,2)/std::pow(clockToNsConstant,2)) );
319  uncalibRecHit.setOutOfTimeEnergy( crh.amplitudeMax );
320  // consider flagging as kOutOfTime only if above noise
321  if (uncalibRecHit.amplitude() > pedRMSVec[0] * amplitudeThreshEE_){
322  float outOfTimeThreshP = outOfTimeThreshG12pEE_;
323  float outOfTimeThreshM = outOfTimeThreshG12mEE_;
324  // determine if gain has switched away from gainId==1 (x12 gain)
325  // and determine cuts (number of 'sigmas') to ose for kOutOfTime
326  // >3k ADC is necessasry condition for gain switch to occur
327  if (uncalibRecHit.amplitude() > 3000.){
328  for (int iSample = 0; iSample < EEDataFrame::MAXSAMPLES; iSample++) {
329  int GainId = ((EcalDataFrame)(*itdg)).sample(iSample).gainId();
330  if (GainId!=1) {
331  outOfTimeThreshP = outOfTimeThreshG61pEE_;
332  outOfTimeThreshM = outOfTimeThreshG61mEE_;
333  break;}
334  }}
335  float correctedTime = (crh.timeMax-5) * clockToNsConstant + itimeconst;
336  float cterm = EEtimeConstantTerm_;
337  float sigmaped = pedRMSVec[0]; // approx for lower gains
338  float nterm = EEtimeNconst_*sigmaped/uncalibRecHit.amplitude();
339  float sigmat = std::sqrt( nterm*nterm + cterm*cterm );
340  if ( ( correctedTime > sigmat*outOfTimeThreshP ) ||
341  ( correctedTime < (-1.*sigmat*outOfTimeThreshM) ))
342  { uncalibRecHit.setRecoFlag( EcalUncalibratedRecHit::kOutOfTime ); }
343  }
344 
345  } else {
350  double theTimeCorrectionEB=0;
351  if(doEBtimeCorrection_) theTimeCorrectionEB = timeCorrectionEB( uncalibRecHit.amplitude() );
352  // the correction for gain switch (when the sample before is ignored in ratioAlgo) is now included in the configurable correction
353  // bool gainSwitch = ratioMethod_barrel_.fixMGPAslew(*itdg);
354  // if(gainSwitch){
355  // uncalibRecHit.setJitter( crh.timeMax - 5 - 0.04 + theTimeCorrectionEB); // introduce additional 1ns shift
356  // }else{
357  // uncalibRecHit.setJitter( crh.timeMax - 5 + theTimeCorrectionEB);
358  // }
359  uncalibRecHit.setJitter( crh.timeMax - 5 + theTimeCorrectionEB);
360 
361  uncalibRecHit.setJitterError( std::sqrt(std::pow(crh.timeError,2) + std::pow(EBtimeConstantTerm_,2)/std::pow(clockToNsConstant,2)) );
362  uncalibRecHit.setOutOfTimeEnergy( crh.amplitudeMax );
363  // consider flagging as kOutOfTime only if above noise
364  if (uncalibRecHit.amplitude() > pedRMSVec[0] * amplitudeThreshEB_){
365  float outOfTimeThreshP = outOfTimeThreshG12pEB_;
366  float outOfTimeThreshM = outOfTimeThreshG12mEB_;
367  // determine if gain has switched away from gainId==1 (x12 gain)
368  // and determine cuts (number of 'sigmas') to ose for kOutOfTime
369  // >3k ADC is necessasry condition for gain switch to occur
370  if (uncalibRecHit.amplitude() > 3000.){
371  for (int iSample = 0; iSample < EBDataFrame::MAXSAMPLES; iSample++) {
372  int GainId = ((EcalDataFrame)(*itdg)).sample(iSample).gainId();
373  if (GainId!=1) {
374  outOfTimeThreshP = outOfTimeThreshG61pEB_;
375  outOfTimeThreshM = outOfTimeThreshG61mEB_;
376  break;}
377  } }
378  float correctedTime = (crh.timeMax-5) * clockToNsConstant + itimeconst;
379  float cterm = EBtimeConstantTerm_;
380  float sigmaped = pedRMSVec[0]; // approx for lower gains
381  float nterm = EBtimeNconst_*sigmaped/uncalibRecHit.amplitude();
382  float sigmat = std::sqrt( nterm*nterm + cterm*cterm );
383  if ( ( correctedTime > sigmat*outOfTimeThreshP ) ||
384  ( correctedTime < (-1.*sigmat*outOfTimeThreshM) ))
385  { uncalibRecHit.setRecoFlag( EcalUncalibratedRecHit::kOutOfTime ); }
386  }
387  }
388 
389  // === chi2express ===
390  if (detid.subdetId()==EcalEndcap) {
391 
392  double amplitude = uncalibRecHit.amplitude();
393  double amplitudeOutOfTime = uncalibRecHit.outOfTimeEnergy();
394  double jitter= uncalibRecHit.jitter();
395 
396 
397 
399  *itdg,
400  amplitude,
401  itimeconst,
402  amplitudeOutOfTime,
403  jitter,
404  pedVec,
405  pedRMSVec,
406  gainRatios,
409  );
410  double chi2 = chi2expressEE_.chi2();
411  uncalibRecHit.setChi2(chi2);
412  double chi2OutOfTime = chi2expressEE_.chi2OutOfTime();
413  uncalibRecHit.setOutOfTimeChi2(chi2OutOfTime);
414 
415  if(kPoorRecoFlagEE_)
416  {
417  if(chi2>chi2ThreshEE_)uncalibRecHit.setRecoFlag(EcalUncalibratedRecHit::kPoorReco);
418  }
419 
420  } else {
421  double amplitude = uncalibRecHit.amplitude();
422  double amplitudeOutOfTime = uncalibRecHit.outOfTimeEnergy();
423  double jitter= uncalibRecHit.jitter();
424 
426  *itdg,
427  amplitude,
428  itimeconst,
429  amplitudeOutOfTime,
430  jitter,
431  pedVec,
432  pedRMSVec,
433  gainRatios,
436  );
437  double chi2 = chi2expressEB_.chi2();
438  uncalibRecHit.setChi2(chi2);
439  double chi2OutOfTime = chi2expressEB_.chi2OutOfTime();
440  uncalibRecHit.setOutOfTimeChi2(chi2OutOfTime);
441 
442  if(kPoorRecoFlagEB_)
443  {
444  if(chi2>chi2ThreshEB_)uncalibRecHit.setRecoFlag(EcalUncalibratedRecHit::kPoorReco);
445  }
446  }
447  }
448 
449  // remove setting of kFake, which can be misleading for the time being
450  //if ( detid.subdetId()==EcalBarrel ) {
451  // if ( uncalibRecHit.jitter()*25. > -5 ) {
452  // EBDataFrame dt(*itdg);
453  // if ( dt.spikeEstimator() < ebSpikeThresh_ ) uncalibRecHit.setRecoFlag( EcalUncalibratedRecHit::kFake );
454  // }
455  //}
456 
457 
458  // put the recHit in the collection
459  if (detid.subdetId()==EcalEndcap) {
460  result.push_back( uncalibRecHit );
461  } else {
462  result.push_back( uncalibRecHit );
463  }
464  return true;
465 }
466 
std::map< std::pair< EcalXtalGroupId, EcalTDCId >, EcalWeightSet > EcalTBWeightMap
Definition: EcalTBWeights.h:19
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
bool run(const edm::Event &evt, const EcalDigiCollection::const_iterator &digi, EcalUncalibratedRecHitCollection &result)
int hashedIndex() const
get a compact index for arrays
Definition: EBDetId.h:73
void computeAmplitude(std::vector< double > &amplitudeFitParameters)
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
EcalUncalibRecHitWorkerGlobal(const edm::ParameterSet &)
void setRecoFlag(uint32_t flags)
std::pair< double, double > EBtimeFitLimits_
void computeTime(std::vector< double > &timeFitParameters, std::pair< double, double > &timeFitLimits, std::vector< double > &amplitudeFitParameters)
void push_back(T const &t)
EcalUncalibRecHitRecWeightsAlgo< EBDataFrame > weightsMethod_barrel_
std::pair< double, double > EEtimeFitLimits_
void setPulseShape(std::vector< double > &shape)
EcalUncalibRecHitRatioMethodAlgo< EEDataFrame > ratioMethod_endcap_
const unsigned int id() const
EcalUncalibRecHitLeadingEdgeAlgo< EBDataFrame > leadingEdgeMethod_barrel_
int hashedIndex(int ieta, int iphi)
Definition: EcalPyUtils.cc:42
EcalUncalibRecHitRatioMethodAlgo< EBDataFrame > ratioMethod_barrel_
edm::ESHandle< EcalGainRatios > gains
EcalUncalibRecHitLeadingEdgeAlgo< EEDataFrame > leadingEdgeMethod_endcap_
T sqrt(T t)
Definition: SSEVec.h:28
edm::ESHandle< EcalPedestals > peds
tuple result
Definition: query.py:137
virtual EcalUncalibratedRecHit makeRecHit(const C &dataFrame, const double *pedestals, const double *pedestalsRMS, const double *gainRatios, const EcalWeightSet::EcalWeightMatrix **weights, const EcalShapeBase &testbeamPulseShape)
Compute parameters.
int j
Definition: DBlmapReader.cc:9
edm::ESHandle< EcalTBWeights > wgts
float gain6Over1() const
edm::ESHandle< EcalWeightXtalGroups > grps
EcalWeightMatrix & getWeightsAfterGainSwitch()
Definition: EcalWeightSet.h:28
virtual EcalUncalibratedRecHit makeRecHit(const C &dataFrame, const double *pedestals, const double *gainRatios, const EcalWeightSet::EcalWeightMatrix **weights, const EcalWeightSet::EcalChi2WeightMatrix **chi2Matrix)
Compute parameters.
Definition: DetId.h:20
int hashedIndex() const
Definition: EEDetId.h:177
EcalWeightMatrix & getWeightsBeforeGainSwitch()
Definition: EcalWeightSet.h:27
const T & get() const
Definition: EventSetup.h:55
void init(const C &dataFrame, const double *pedestals, const double *pedestalRMSes, const double *gainRatios)
std::vector< Item >::const_iterator const_iterator
float gain12Over6() const
const EcalWeightSet::EcalWeightMatrix * weights[2]
float EcalTimeCalibConstant
void set(const edm::EventSetup &es)
edm::ESHandle< EcalTimeCalibConstants > itime
EcalUncalibRecHitRecWeightsAlgo< EEDataFrame > weightsMethod_endcap_
math::Matrix< 3, 10 >::type EcalWeightMatrix
Definition: EcalWeightSet.h:20
#define DEFINE_EDM_PLUGIN(factory, type, name)
static const int MAXSAMPLES
Definition: EcalDataFrame.h:44
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40