CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
LumiReWeighting.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_Utilities_interface_LumiReWeighting_h
2 #define PhysicsTools_Utilities_interface_LumiReWeighting_h
3 
17 #include "TH1.h"
18 #include "TFile.h"
19 #include <cmath>
20 #include <string>
21 
22 #include <vector>
24 
25 namespace reweight {
26 
27  // add a class to shift the mean of a poisson-like luminosity distribution by an arbitrary amount.
28  // Only valid for small (<1.5) shifts about the 2011 lumi distribution for now, because shifts are non-linear
29  // Each PoissonMeanShifter does one shift, so defining multiples can give you an arbitrary collection
30 
32  public:
34 
35  PoissonMeanShifter(float Shift) {
36  // these are the polynomial or exponential coefficients for each bin of a 25-bin sequence that
37  // convert the Distribution of the 2011 luminosity to something with a lower or higher peak luminosity.
38  // The distributions aren't quite poisson because they model luminosity decreasing during a fill. This implies that
39  // they do get wider as the mean increases, so the weights are not linear with increasing mean.
40 
41  constexpr double p0_minus[20] = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
42  constexpr double p1_minus[20] = {-0.677786, -0.619614, -0.49465, -0.357963, -0.238359, -0.110002, 0.0348629,
43  0.191263, 0.347648, 0.516615, 0.679646, 0.836673, 0.97764, 1.135,
44  1.29922, 1.42467, 1.55901, 1.61762, 1.67275, 1.96008};
45  constexpr double p2_minus[20] = {0.526164, 0.251816, 0.11049, 0.026917, -0.0464692, -0.087022, -0.0931581,
46  -0.0714295, -0.0331772, 0.0347473, 0.108658, 0.193048, 0.272314, 0.376357,
47  0.4964, 0.58854, 0.684959, 0.731063, 0.760044, 1.02386};
48 
49  constexpr double p1_expoM[5] = {1.63363e-03, 6.79290e-04, 3.69900e-04, 2.24349e-04, 9.87156e-06};
50 
51  constexpr double p2_expoM[5] = {2.64692, 3.26585, 3.53229, 4.18035, 5.64027};
52 
53  constexpr double p0_plus[20] = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
54  constexpr double p1_plus[20] = {-0.739059, -0.594445, -0.477276, -0.359707, -0.233573, -0.103458, 0.0373401,
55  0.176571, 0.337617, 0.499074, 0.675126, 0.840522, 1.00917, 1.15847,
56  1.23816, 1.44271, 1.52982, 1.46385, 1.5802, 0.988689};
57  constexpr double p2_plus[20] = {0.208068, 0.130033, 0.0850356, 0.0448344, 0.000749832,
58  -0.0331347, -0.0653281, -0.0746009, -0.0800667, -0.0527636,
59  -0.00402649, 0.103338, 0.261261, 0.491084, 0.857966,
60  1.19495, 1.75071, 2.65559, 3.35433, 5.48835};
61 
62  constexpr double p1_expoP[5] = {1.42463e-01, 4.18966e-02, 1.12697e-01, 1.66197e-01, 1.50768e-01};
63 
64  constexpr double p2_expoP[5] = {1.98758, 2.27217, 2.26799, 2.38455, 2.52428};
65 
66  // initialize weights based on desired Shift
67 
68  for (int ibin = 0; ibin < 20; ibin++) {
69  if (Shift < .0) {
70  Pweight_[ibin] = p0_minus[ibin] + p1_minus[ibin] * Shift + p2_minus[ibin] * Shift * Shift;
71  } else {
72  Pweight_[ibin] = p0_plus[ibin] + p1_plus[ibin] * Shift + p2_plus[ibin] * Shift * Shift;
73  }
74  }
75 
76  // last few bins fit better to an exponential...
77 
78  for (int ibin = 20; ibin < 25; ibin++) {
79  if (Shift < 0.) {
80  Pweight_[ibin] = p1_expoM[ibin - 20] * exp(p2_expoM[ibin - 20] * Shift);
81  } else {
82  Pweight_[ibin] = p1_expoP[ibin - 20] * exp(p2_expoP[ibin - 20] * Shift);
83  }
84  }
85  };
86 
87  double ShiftWeight(int ibin) {
88  if (ibin < 25 && ibin >= 0) {
89  return Pweight_[ibin];
90  } else {
91  return 0;
92  }
93  };
94 
95  double ShiftWeight(float pvnum) { return ShiftWeight(int(pvnum)); };
96 
97  private:
98  double Pweight_[25];
99  };
100 
101 } // namespace reweight
102 
103 namespace edm {
104  class EventBase;
106  public:
107  LumiReWeighting(std::string generatedFile,
108  std::string dataFile,
109  std::string GenHistName = "pileup",
110  std::string DataHistName = "pileup",
111  const edm::InputTag& PileupSumInfoInputTag = edm::InputTag("addPileupInfo"));
112 
113  LumiReWeighting(const std::vector<float>& MC_distr,
114  const std::vector<float>& Lumi_distr,
115  const edm::InputTag& PileupSumInfoInputTag = edm::InputTag("addPileupInfo"));
116 
118 
119  double weight(int npv);
120 
121  double weight(float npv);
122 
123  double weight(const edm::EventBase& e);
124 
125  double weightOOT(const edm::EventBase& e);
126 
127  protected:
133  std::shared_ptr<TFile> generatedFile_;
134  std::shared_ptr<TFile> dataFile_;
135  std::shared_ptr<TH1> weights_;
136 
137  //keep copies of normalized distributions:
138 
139  std::shared_ptr<TH1> MC_distr_;
140  std::shared_ptr<TH1> Data_distr_;
141 
144  };
145 } // namespace edm
146 
147 #endif
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
std::shared_ptr< TFile > generatedFile_
std::shared_ptr< TH1 > Data_distr_
double weight(int npv)
double weightOOT(const edm::EventBase &e)
double ShiftWeight(float pvnum)
std::shared_ptr< TFile > dataFile_
edm::InputTag pileupSumInfoTag_
std::shared_ptr< TH1 > weights_
std::shared_ptr< TH1 > MC_distr_
std::string generatedFileName_