CMS 3D CMS Logo

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), cutoff_(cutoff), ieta_shift_(0), max_depth_(0),
9  meanenergies_(HBHEDarkening::readDoseMap(meanenergies)), darkening_(nullptr)
10 {}
11 
13 
14 void HBHERecalibration::setup(const std::vector<std::vector<int>>& m_segmentation, const HBHEDarkening* darkening)
15 {
16  darkening_ = darkening;
18 
19  //infer eta bounds
20  int min_ieta = ieta_shift_ - 1;
21  int max_ieta = min_ieta + meanenergies_.size();
22  dsegm_.reserve(max_ieta - min_ieta);
23  for(int ieta = min_ieta; ieta < max_ieta; ++ieta){
24  dsegm_.push_back(m_segmentation[ieta]);
25  //find maximum
26  for(unsigned lay = 0; lay < dsegm_.back().size(); ++lay){
27  if(lay>=meanenergies_[0].size()) break;
28  int depth = dsegm_.back()[lay];
29  if(depth>max_depth_) max_depth_ = depth;
30  }
31  }
32 
33  initialize();
34 }
35 
36 float HBHERecalibration::getCorr(int ieta, int depth) const {
37  ieta = abs(ieta);
38  //shift ieta tower index to act as array index
39  ieta -= ieta_shift_;
40 
41  //shift depth index to act as array index (depth = 0 - not used!)
42  depth -= 1;
43 
44  //bounds check
45  if(ieta<0 or ieta>=int(corr_.size())) return 1.0;
46  if(depth<0 or depth>=int(corr_[ieta].size())) return 1.0;
47 
48  if(cutoff_ > 1 and corr_[ieta][depth] > cutoff_) return cutoff_;
49  else return corr_[ieta][depth];
50 }
51 
53  std::vector<std::vector<float>> vtmp(dsegm_.size(),std::vector<float>(max_depth_,0.0));
54  auto dval = vtmp; //conversion of meanenergies into depths-averaged values - denominator (including degradation for intlumi)
55  auto nval = vtmp; // conversion of meanenergies into depths-averaged values - numerator (no degradation)
56  corr_ = vtmp;
57 
58  //converting energy values from layers into depths
59  for (unsigned int ieta = 0; ieta < dsegm_.size(); ++ieta) {
60  //fill sum(means(layer,0)) and sum(means(layer,lumi)) for each depth
61  for(unsigned int ilay = 0; ilay < std::min(meanenergies_[ieta].size(),dsegm_[ieta].size()); ++ilay) {
62  int depth = dsegm_[ieta][ilay] - 1; // depth = 0 - not used!
63  nval[ieta][depth] += meanenergies_[ieta][ilay];
64  dval[ieta][depth] += meanenergies_[ieta][ilay]*darkening_->degradation(intlumi_,ieta+ieta_shift_,ilay+1); //be careful of eta and layer numbering
65  }
66 
67  //compute factors, w/ safety checks
68  for(int depth = 0; depth < max_depth_; ++depth){
69  if(dval[ieta][depth] > 0) corr_[ieta][depth] = nval[ieta][depth]/dval[ieta][depth];
70  else corr_[ieta][depth] = 1.0;
71 
72  if(corr_[ieta][depth] < 1.0) corr_[ieta][depth] = 1.0;
73  }
74  }
75 }
size
Write out results.
std::vector< std::vector< int > > dsegm_
#define nullptr
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:50
float getCorr(int ieta, int depth) const
float degradation(float intlumi, int ieta, int lay) const
const HBHEDarkening * darkening_