CMS 3D CMS Logo

EcalUncalibRecHitTimeWeightsAlgo.h
Go to the documentation of this file.
1 #ifndef RecoLocalCalo_EcalRecAlgos_EcalUncalibRecHitTimeWeightsAlgo_HH
2 #define RecoLocalCalo_EcalRecAlgos_EcalUncalibRecHitTimeWeightsAlgo_HH
3 
19 
22 
23 #include "TVectorD.h"
24 #include <vector>
25 
26 template <class C>
28 public:
31 
33  double time(const C &dataFrame,
34  const std::vector<double> &amplitudes,
35  const EcalPedestals::Item *aped,
36  const EcalMGPAGainRatio *aGain,
37  const FullSampleVector &fullpulse,
39  const unsigned int nsample = EcalDataFrame::MAXSAMPLES;
40 
41  double maxamplitude = -std::numeric_limits<double>::max();
42 
43  double pulsenorm = 0.;
44  int iGainSwitch = 0;
45 
46  ROOT::Math::SVector<double, nsample> pedSubSamples;
47  for (unsigned int iSample = 0; iSample < nsample; iSample++) {
48  const EcalMGPASample &sample = dataFrame.sample(iSample);
49 
50  double amplitude = 0.;
51  int gainId = sample.gainId();
52 
53  double pedestal = 0.;
54  double gainratio = 1.;
55 
56  if (gainId == 0 || gainId == 3) {
57  pedestal = aped->mean_x1;
58  gainratio = aGain->gain6Over1() * aGain->gain12Over6();
59  iGainSwitch = 1;
60  } else if (gainId == 1) {
61  pedestal = aped->mean_x12;
62  gainratio = 1.;
63  iGainSwitch = 0;
64  } else if (gainId == 2) {
65  pedestal = aped->mean_x6;
66  gainratio = aGain->gain12Over6();
67  iGainSwitch = 1;
68  }
69 
70  amplitude = ((double)(sample.adc()) - pedestal) * gainratio;
71 
72  if (gainId == 0) {
73  //saturation
74  amplitude = (4095. - pedestal) * gainratio;
75  }
76 
77  pedSubSamples(iSample) = amplitude;
78 
79  if (amplitude > maxamplitude) {
80  maxamplitude = amplitude;
81  }
82  pulsenorm += fullpulse(iSample);
83  }
84 
85  std::vector<double>::const_iterator amplit;
86  for (amplit = amplitudes.begin(); amplit < amplitudes.end(); ++amplit) {
87  int ipulse = std::distance(amplitudes.begin(), amplit);
88  int bx = ipulse - 5;
89  int firstsamplet = std::max(0, bx + 3);
90  int offset = 7 - 3 - bx;
91 
92  TVectorD pulse;
93  pulse.ResizeTo(nsample);
94  for (unsigned int isample = firstsamplet; isample < nsample; ++isample) {
95  pulse(isample) = fullpulse(isample + offset);
96  pedSubSamples(isample) = std::max(0., pedSubSamples(isample) - amplitudes[ipulse] * pulse(isample) / pulsenorm);
97  }
98  }
99 
100  // Compute parameters
101  double amplitude_(-1.), jitter_(-1.);
102  ROOT::Math::SVector<double, 3> param = (*(weights[iGainSwitch])) * pedSubSamples;
103  amplitude_ = param(EcalUncalibRecHitRecAbsAlgo<C>::iAmplitude);
104  if (amplitude_)
105  jitter_ = -param(EcalUncalibRecHitRecAbsAlgo<C>::iTime) / amplitude_;
106  else
107  jitter_ = 0.;
108 
109  return jitter_;
110  }
111 };
112 #endif
double time(const C &dataFrame, const std::vector< double > &amplitudes, const EcalPedestals::Item *aped, const EcalMGPAGainRatio *aGain, const FullSampleVector &fullpulse, const EcalWeightSet::EcalWeightMatrix **weights)
Compute time.
Eigen::Matrix< double, FullSampleVectorSize, 1 > FullSampleVector
math::Matrix< 3, 10 >::type EcalWeightMatrix
Definition: EcalWeightSet.h:19
float gain12Over6() const
constexpr int gainId(sample_type sample)
get the gainId (2 bits)
double pulse(double x, double y, double z, double t)
float gain6Over1() const
static constexpr int MAXSAMPLES
Definition: EcalDataFrame.h:48