CMS 3D CMS Logo

HcalPulseShapes.h
Go to the documentation of this file.
1 #ifndef CALIBCALORIMETRY_HCALALGOS_HCALPULSESHAPES_H
2 #define CALIBCALORIMETRY_HCALALGOS_HCALPULSESHAPES_H 1
3 
4 #include <map>
5 #include <vector>
6 #include <cmath>
11 
17 namespace CLHEP {
18  class HepRandomEngine;
19 }
20 
22 public:
25  ~HcalPulseShapes();
26  // only needed if you'll be getting shapes by DetId
27  void beginRun(edm::EventSetup const& es);
28  void beginRun(const HcalDbService* conditions);
29 
30  const Shape& hbShape() const { return hpdShape_; }
31  const Shape& heShape() const { return hpdShape_; }
32  const Shape& hfShape() const { return hfShape_; }
33  const Shape& hoShape(bool sipm = false) const { return sipm ? siPMShapeHO_ : hpdShape_; }
34  // return Shape for given shapeType.
35  const Shape& getShape(int shapeType) const;
37  const Shape& shape(const HcalDetId& detId) const;
38  const Shape& shapeForReco(const HcalDetId& detId) const;
40  const Shape& defaultShape(const HcalDetId& detId) const;
41  //public static helpers
42  static const int nBinsSiPM_ = 250;
43  static constexpr float deltaTSiPM_ = 0.5;
44  static constexpr float invDeltaTSiPM_ = 2.0;
45  static double analyticPulseShapeSiPMHO(double t);
46  static double analyticPulseShapeSiPMHE(double t);
47  static constexpr float Y11RANGE_ = nBinsSiPM_;
48  static constexpr float Y11MAX203_ = 0.04;
49  static constexpr float Y11MAX206_ = 0.08;
50  static double Y11203(double t);
51  static double Y11206(double t);
52  static double generatePhotonTime(CLHEP::HepRandomEngine* engine, unsigned int signalShape);
53  static double generatePhotonTime203(CLHEP::HepRandomEngine* engine);
54  static double generatePhotonTime206(CLHEP::HepRandomEngine* engine);
55  //this function can take function pointers *or* functors!
56  template <class F1, class F2>
57  static std::vector<double> convolve(unsigned nbin, F1 f1, F2 f2) {
58  std::vector<double> result(2 * nbin - 1, 0.);
59  for (unsigned i = 0; i < 2 * nbin - 1; ++i) {
60  for (unsigned j = 0; j < std::min(i + 1, nbin); ++j) {
61  double tmp = f1(j) * f2(i - j);
62  if (std::isnan(tmp) or std::isinf(tmp))
63  continue;
64  result[i] += tmp;
65  }
66  }
67  return result;
68  }
69  static std::vector<double> normalize(std::vector<double> nt, unsigned nbin) {
70  //skip first bin, always 0
71  double norm = 0.;
72  for (unsigned int j = 1; j <= nbin; ++j) {
73  norm += (nt[j] > 0) ? nt[j] : 0.;
74  }
75 
76  double normInv = 1. / norm;
77  for (unsigned int j = 1; j <= nbin; ++j) {
78  nt[j] *= normInv;
79  }
80 
81  return nt;
82  }
83  static std::vector<double> normalizeShift(std::vector<double> nt, unsigned nbin, int shift) {
84  //skip first bin, always 0
85  double norm = 0.;
86  for (unsigned int j = std::max(1, -1 * shift); j <= nbin; j++) {
87  norm += std::max(0., nt[j - shift]);
88  }
89  double normInv = 1. / norm;
90  std::vector<double> nt2(nt.size(), 0);
91  for (int j = 1; j <= (int)nbin; j++) {
92  if (j - shift >= 0) {
93  nt2[j] = nt[j - shift] * normInv;
94  }
95  }
96  return nt2;
97  }
98 
99  std::map<int, Shape const*> const& get_all_shapes() const { return theShapes; }
100 
101 private:
102  void computeHPDShape(float, float, float, float, float, float, float, float, Shape&);
103  void computeHFShape();
104  void computeSiPMShapeHO();
105  const HcalPulseShape& computeSiPMShapeHE203();
106  const HcalPulseShape& computeSiPMShapeHE206();
107  void computeSiPMShapeData2017();
108  void computeSiPMShapeData2018();
109  Shape hpdShape_, hfShape_, siPMShapeHO_;
110  Shape siPMShapeData2017_, siPMShapeData2018_;
111  Shape hpdShape_v2, hpdShapeMC_v2;
112  Shape hpdShape_v3, hpdShapeMC_v3;
113  Shape hpdBV30Shape_v2, hpdBV30ShapeMC_v2;
115  typedef std::map<int, const Shape*> ShapeMap;
116  ShapeMap theShapes;
117 };
118 #endif
const Shape & heShape() const
static std::vector< double > normalizeShift(std::vector< double > nt, unsigned nbin, int shift)
const Shape & hoShape(bool sipm=false) const
static std::vector< double > normalize(std::vector< double > nt, unsigned nbin)
static std::vector< double > convolve(unsigned nbin, F1 f1, F2 f2)
bool isnan(float x)
Definition: math.h:13
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
T min(T a, T b)
Definition: MathUtil.h:58
const HcalDbService * theDbService
int nt
Definition: AMPTWrapper.h:42
const Shape & hfShape() const
std::map< int, Shape const * > const & get_all_shapes() const
std::map< int, const Shape * > ShapeMap
const Shape & hbShape() const
HcalPulseShape Shape
static unsigned int const shift
TEveGeoShape * getShape(const char *name, TGeoBBox *shape, Color_t color)
Definition: BuilderUtils.cc:43
tmp
align.sh
Definition: createJobs.py:716
#define constexpr