CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HBHERecalibration.cc
Go to the documentation of this file.
2 
3 #include <vector>
4 #include <cmath>
5 
6 //reuse parsing function to read mean energy table
7 HBHERecalibration::HBHERecalibration(float intlumi, float cutoff, std::string meanenergies)
8  : intlumi_(intlumi),
9  cutoff_(cutoff),
10  ieta_shift_(0),
11  max_depth_(0),
12  meanenergies_(HBHEDarkening::readDoseMap(meanenergies)),
13  darkening_(nullptr) {}
14 
16 
17 void HBHERecalibration::setup(const std::vector<std::vector<int>>& m_segmentation, const HBHEDarkening* darkening) {
18  darkening_ = darkening;
20 
21  //infer eta bounds
22  int min_ieta = ieta_shift_ - 1;
23  int max_ieta = min_ieta + meanenergies_.size();
24  dsegm_.reserve(max_ieta - min_ieta);
25  for (int ieta = min_ieta; ieta < max_ieta; ++ieta) {
26  dsegm_.push_back(m_segmentation[ieta]);
27  //find maximum
28  for (unsigned lay = 0; lay < dsegm_.back().size(); ++lay) {
29  if (lay >= meanenergies_[0].size())
30  break;
31  int depth = dsegm_.back()[lay];
32  if (depth > max_depth_)
33  max_depth_ = depth;
34  }
35  }
36 
37  initialize();
38 }
39 
40 float HBHERecalibration::getCorr(int ieta, int depth) const {
41  ieta = abs(ieta);
42  //shift ieta tower index to act as array index
43  ieta -= ieta_shift_;
44 
45  //shift depth index to act as array index (depth = 0 - not used!)
46  depth -= 1;
47 
48  //bounds check
49  if (ieta < 0 or ieta >= int(corr_.size()))
50  return 1.0;
51  if (depth < 0 or depth >= int(corr_[ieta].size()))
52  return 1.0;
53 
54  if (cutoff_ > 1 and corr_[ieta][depth] > cutoff_)
55  return cutoff_;
56  else
57  return corr_[ieta][depth];
58 }
59 
61  std::vector<std::vector<float>> vtmp(dsegm_.size(), std::vector<float>(max_depth_, 0.0));
62  auto dval =
63  vtmp; //conversion of meanenergies into depths-averaged values - denominator (including degradation for intlumi)
64  auto nval = vtmp; // conversion of meanenergies into depths-averaged values - numerator (no degradation)
65  corr_ = vtmp;
66 
67  //converting energy values from layers into depths
68  for (unsigned int ieta = 0; ieta < dsegm_.size(); ++ieta) {
69  //fill sum(means(layer,0)) and sum(means(layer,lumi)) for each depth
70  for (unsigned int ilay = 0; ilay < std::min(meanenergies_[ieta].size(), dsegm_[ieta].size()); ++ilay) {
71  int depth = dsegm_[ieta][ilay] - 1; // depth = 0 - not used!
72  nval[ieta][depth] += meanenergies_[ieta][ilay];
73  dval[ieta][depth] +=
74  meanenergies_[ieta][ilay] *
75  darkening_->degradation(intlumi_, ieta + ieta_shift_, ilay + 1); //be careful of eta and layer numbering
76  }
77 
78  //compute factors, w/ safety checks
79  for (int depth = 0; depth < max_depth_; ++depth) {
80  if (dval[ieta][depth] > 0)
81  corr_[ieta][depth] = nval[ieta][depth] / dval[ieta][depth];
82  else
83  corr_[ieta][depth] = 1.0;
84 
85  if (corr_[ieta][depth] < 1.0)
86  corr_[ieta][depth] = 1.0;
87  }
88  }
89 }
std::vector< std::vector< int > > dsegm_
std::vector< std::vector< float > > meanenergies_
std::vector< std::vector< float > > corr_
void setup(const std::vector< std::vector< int >> &m_segmentation, const HBHEDarkening *darkening)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HBHERecalibration(float intlumi, float cutoff, std::string meanenergies)
T min(T a, T b)
Definition: MathUtil.h:58
int get_ieta_shift() const
Definition: HBHEDarkening.h:49
float getCorr(int ieta, int depth) const
tuple size
Write out results.
float degradation(float intlumi, int ieta, int lay) const
const HBHEDarkening * darkening_