CMS 3D CMS Logo

LumiReWeighting.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_Utilities_interface_LumiReWeighting_h
2 #define PhysicsTools_Utilities_interface_LumiReWeighting_h
3 
4 
18 #include "TH1.h"
19 #include "TFile.h"
20 #include <cmath>
21 #include <string>
22 #include <boost/shared_ptr.hpp>
23 #include <vector>
25 
26 namespace reweight{
27 
28  // add a class to shift the mean of a poisson-like luminosity distribution by an arbitrary amount.
29  // Only valid for small (<1.5) shifts about the 2011 lumi distribution for now, because shifts are non-linear
30  // Each PoissonMeanShifter does one shift, so defining multiples can give you an arbitrary collection
31 
33 
34  public:
35 
37 
38  PoissonMeanShifter( float Shift ){
39 
40  // these are the polynomial or exponential coefficients for each bin of a 25-bin sequence that
41  // convert the Distribution of the 2011 luminosity to something with a lower or higher peak luminosity.
42  // The distributions aren't quite poisson because they model luminosity decreasing during a fill. This implies that
43  // they do get wider as the mean increases, so the weights are not linear with increasing mean.
44 
45  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. };
46  constexpr double p1_minus[20] = {
47  -0.677786,
48  -0.619614,
49  -0.49465,
50  -0.357963,
51  -0.238359,
52  -0.110002,
53  0.0348629,
54  0.191263,
55  0.347648,
56  0.516615,
57  0.679646,
58  0.836673,
59  0.97764,
60  1.135,
61  1.29922,
62  1.42467,
63  1.55901,
64  1.61762,
65  1.67275,
66  1.96008
67  };
68  constexpr double p2_minus[20] = {
69  0.526164,
70  0.251816,
71  0.11049,
72  0.026917,
73  -0.0464692,
74  -0.087022,
75  -0.0931581,
76  -0.0714295,
77  -0.0331772,
78  0.0347473,
79  0.108658,
80  0.193048,
81  0.272314,
82  0.376357,
83  0.4964,
84  0.58854,
85  0.684959,
86  0.731063,
87  0.760044,
88  1.02386
89  };
90 
91  constexpr double p1_expoM[5] = {
92  1.63363e-03,
93  6.79290e-04,
94  3.69900e-04,
95  2.24349e-04,
96  9.87156e-06
97  };
98 
99  constexpr double p2_expoM[5] = {
100  2.64692,
101  3.26585,
102  3.53229,
103  4.18035,
104  5.64027
105  };
106 
107 
108  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. };
109  constexpr double p1_plus[20] = {
110  -0.739059,
111  -0.594445,
112  -0.477276,
113  -0.359707,
114  -0.233573,
115  -0.103458,
116  0.0373401,
117  0.176571,
118  0.337617,
119  0.499074,
120  0.675126,
121  0.840522,
122  1.00917,
123  1.15847,
124  1.23816,
125  1.44271,
126  1.52982,
127  1.46385,
128  1.5802,
129  0.988689
130  };
131  constexpr double p2_plus[20] = {
132  0.208068,
133  0.130033,
134  0.0850356,
135  0.0448344,
136  0.000749832,
137  -0.0331347,
138  -0.0653281,
139  -0.0746009,
140  -0.0800667,
141  -0.0527636,
142  -0.00402649,
143  0.103338,
144  0.261261,
145  0.491084,
146  0.857966,
147  1.19495,
148  1.75071,
149  2.65559,
150  3.35433,
151  5.48835
152  };
153 
154  constexpr double p1_expoP[5] = {
155  1.42463e-01,
156  4.18966e-02,
157  1.12697e-01,
158  1.66197e-01,
159  1.50768e-01
160  };
161 
162  constexpr double p2_expoP[5] = {
163  1.98758,
164  2.27217,
165  2.26799,
166  2.38455,
167  2.52428
168  };
169 
170  // initialize weights based on desired Shift
171 
172 
173 
174  for (int ibin=0;ibin<20;ibin++) {
175 
176  if( Shift < .0) {
177  Pweight_[ibin] = p0_minus[ibin] + p1_minus[ibin]*Shift + p2_minus[ibin]*Shift*Shift;
178  }
179  else {
180  Pweight_[ibin] = p0_plus[ibin] + p1_plus[ibin]*Shift + p2_plus[ibin]*Shift*Shift;
181  }
182  }
183 
184  // last few bins fit better to an exponential...
185 
186  for (int ibin=20;ibin<25;ibin++) {
187  if( Shift < 0.) {
188  Pweight_[ibin] = p1_expoM[ibin-20]*exp(p2_expoM[ibin-20]*Shift);
189  }
190  else {
191  Pweight_[ibin] = p1_expoP[ibin-20]*exp(p2_expoP[ibin-20]*Shift);
192  }
193  }
194 
195  };
196 
197  double ShiftWeight( int ibin ) {
198  if(ibin<25 && ibin>=0) { return Pweight_[ibin]; }
199  else { return 0;}
200 
201  };
202 
203  double ShiftWeight( float pvnum ) {
204  return ShiftWeight(int(pvnum));
205  };
206 
207  private:
208 
209  double Pweight_[25];
210 
211  };
212 
213 
214 
215 } // end of reweight namespace
216 
217 
218 namespace edm {
219  class EventBase;
221  public:
222  LumiReWeighting( std::string generatedFile,
223  std::string dataFile,
224  std::string GenHistName = "pileup",
225  std::string DataHistName = "pileup",
226  const edm::InputTag& PileupSumInfoInputTag = edm::InputTag( "addPileupInfo" ) );
227 
228  LumiReWeighting( const std::vector< float >& MC_distr, const std::vector< float >& Lumi_distr, const edm::InputTag& PileupSumInfoInputTag = edm::InputTag( "addPileupInfo" ) );
229 
230  LumiReWeighting ( ) { } ;
231 
232  double weight( int npv ) ;
233 
234  double weight( float npv ) ;
235 
236  double weight( const edm::EventBase &e ) ;
237 
238  double weightOOT( const edm::EventBase &e ) ;
239 
240  protected:
241 
247  boost::shared_ptr<TFile> generatedFile_;
248  boost::shared_ptr<TFile> dataFile_;
249  boost::shared_ptr<TH1> weights_;
250 
251  //keep copies of normalized distributions:
252 
253  boost::shared_ptr<TH1> MC_distr_;
254  boost::shared_ptr<TH1> Data_distr_;
255 
258 
259 
260  };
261 }
262 
263 
264 
265 #endif
boost::shared_ptr< TH1 > MC_distr_
#define constexpr
double ShiftWeight(float pvnum)
boost::shared_ptr< TFile > dataFile_
edm::InputTag pileupSumInfoTag_
boost::shared_ptr< TFile > generatedFile_
boost::shared_ptr< TH1 > Data_distr_
HLT enums.
boost::shared_ptr< TH1 > weights_
std::string generatedFileName_