CMS 3D CMS Logo

EcalShapeBase.cc
Go to the documentation of this file.
3 
4 #include <cmath>
5 #include <algorithm>
6 
7 #include <iostream>
8 
10 
12  : m_useDBShape(useDBShape),
13  m_firstIndexOverThreshold(0),
14  m_firstTimeOverThreshold(0.0),
15  m_indexOfMax(0),
16  m_timeOfMax(0.0),
17  m_thresh(0.0) {}
18 
19 void EcalShapeBase::setEventSetup(const edm::EventSetup& evtSetup, bool normalize) { buildMe(&evtSetup, normalize); }
20 
22 
23 double EcalShapeBase::timeOfMax() const { return m_timeOfMax; }
24 
25 double EcalShapeBase::timeToRise() const { return timeOfMax() - timeOfThr(); }
26 
27 double EcalShapeBase::threshold() const { return m_thresh; }
28 
29 void EcalShapeBase::buildMe(const edm::EventSetup* evtSetup, bool normalize) {
30  DVec shapeArray;
31 
32  float time_interval = 0;
33  fillShape(time_interval,
34  m_thresh,
35  shapeArray,
36  evtSetup); // pure virtual function, implementation may vary for EB/EE/APD ...
37  m_arraySize = shapeArray.size(); // original data
38 
39  m_denseArraySize = 10 * m_arraySize; // dense array with interpolation between data
41  (unsigned int)(10 /
42  time_interval); // used to be an unsigned int = 10 in < CMSSW10X, should work for time intervals ~0.1, 0.2, 0.5, 1
43  m_qNSecPerBin = time_interval / 10.;
44 
45  m_deriv.resize(m_denseArraySize);
46  m_shape.resize(m_denseArraySize);
47 
48  const double maxel(*max_element(shapeArray.begin(), shapeArray.end()));
49 
50  const double maxelt(1.e-5 < maxel ? maxel : 1);
51 
52  if (normalize) {
53  for (unsigned int i(0); i != shapeArray.size(); ++i) {
54  shapeArray[i] = shapeArray[i] / maxelt;
55  }
56  }
57 
58  const double thresh(threshold() / maxelt);
59 
60  const double delta(m_qNSecPerBin / 2.);
61 
62  for (unsigned int denseIndex(0); denseIndex != m_denseArraySize; ++denseIndex) {
63  const double xb((denseIndex + 0.5) * m_qNSecPerBin);
64 
65  const unsigned int ibin(denseIndex / 10);
66 
67  double value = 0.0;
68  double deriv = 0.0;
69 
70  if (0 == ibin || shapeArray.size() == 1 + ibin) // cannot do quadratic interpolation at ends
71  {
72  value = shapeArray[ibin];
73  deriv = 0.0;
74  } else {
75  const double x(xb - (ibin + 0.5) * time_interval);
76  const double f1(shapeArray[ibin - 1]);
77  const double f2(shapeArray[ibin]);
78  const double f3(shapeArray[ibin + 1]);
79  const double a(f2);
80  const double b((f3 - f1) / (2. * time_interval));
81  const double c(((f1 + f3) / 2. - f2) / (time_interval * time_interval));
82  value = a + b * x + c * x * x;
83  deriv = (b + 2 * c * x) / delta;
84  }
85 
86  m_shape[denseIndex] = value;
87  m_deriv[denseIndex] = deriv;
88 
89  if (0 < denseIndex && thresh < value && 0 == m_firstIndexOverThreshold) {
90  m_firstIndexOverThreshold = denseIndex - 1;
92  }
93 
94  if (m_shape[m_indexOfMax] < value) {
95  m_indexOfMax = denseIndex;
96  }
97  }
99 }
100 
101 unsigned int EcalShapeBase::timeIndex(double aTime) const {
102  const int index(m_firstIndexOverThreshold + (unsigned int)(aTime * m_kNBinsPerNSec + 0.5));
103 
104  const bool bad((int)m_firstIndexOverThreshold > index || (int)m_denseArraySize <= index);
105 
106  if ((int)m_denseArraySize <= index) {
107  LogDebug("EcalShapeBase") << " ECAL MGPA shape requested for out of range time " << aTime;
108  }
109  return (bad ? m_denseArraySize : (unsigned int)index);
110 }
111 
112 double EcalShapeBase::operator()(double aTime) const {
113  // return pulse amplitude for request time in ns
114 
115  const unsigned int index(timeIndex(aTime));
116  return (m_denseArraySize == index ? 0 : m_shape[index]);
117 }
118 
119 double EcalShapeBase::derivative(double aTime) const {
120  const unsigned int index(timeIndex(aTime));
121  return (m_denseArraySize == index ? 0 : m_deriv[index]);
122 }
123 
124 void EcalShapeBase::m_shape_print(const char* fileName) const {
125  std::ofstream fs;
126  fs.open(fileName);
127  fs << "{\n";
128  for (auto i : m_shape)
129  fs << "vec.push_back(" << i << ");\n";
130  fs << "}\n";
131  fs.close();
132 }
double derivative(double time) const
virtual void fillShape(float &time_interval, double &m_thresh, EcalShapeBase::DVec &aVec, const edm::EventSetup *es) const =0
double threshold() const
double timeToRise() const override
unsigned int m_denseArraySize
Definition: EcalShapeBase.h:67
~EcalShapeBase() override
Definition: EcalShapeBase.cc:9
std::vector< double > DVec
Definition: EcalShapeBase.h:26
Definition: value.py:1
double m_firstTimeOverThreshold
Definition: EcalShapeBase.h:58
double m_qNSecPerBin
Definition: EcalShapeBase.h:68
void setEventSetup(const edm::EventSetup &evtSetup, bool normalize=true)
unsigned int m_arraySize
Definition: EcalShapeBase.h:66
double b
Definition: hdecay.h:118
unsigned int m_indexOfMax
Definition: EcalShapeBase.h:59
double m_timeOfMax
Definition: EcalShapeBase.h:60
double timeOfThr() const
float normalize(float in)
Definition: MLPFModel.cc:207
double a
Definition: hdecay.h:119
unsigned int m_firstIndexOverThreshold
Definition: EcalShapeBase.h:57
void m_shape_print(const char *fileName) const
unsigned int timeIndex(double aTime) const
void buildMe(const edm::EventSetup *=nullptr, bool normalize=true)
unsigned int m_kNBinsPerNSec
Definition: EcalShapeBase.h:62
double timeOfMax() const
double operator()(double aTime) const override
#define LogDebug(id)