CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuScleFitCorrector_Functions.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_Heppy_MuScleFitCorrector_Functions_h
2 #define PhysicsTools_Heppy_MuScleFitCorrector_Functions_h
3 
11 #include <iostream>
12 #include <vector>
13 #include <cmath>
14 #include "TMath.h"
15 #include "TString.h"
16 #include "TF1.h"
17 #include "TRandom.h"
18 
23  struct ParSet
24  {
25  ParSet() {}
26  ParSet(const TString & inputName, const double & inputStep, const double & inputMini, const double & inputMaxi) :
27  step(inputStep),
28  mini(inputMini),
29  maxi(inputMaxi)
30  {
31  std::cout << "setting name = " << inputName << std::endl;
32  name = inputName;
33  }
34  TString name;
35  double step, mini, maxi;
36  };
37 
38 
39  // ----------------------- //
40  // Scale functors //
41  // ----------------------- //
42 
43  template <class T>
44  class scaleFunctionBase {
45  public:
46  virtual double scale(const double & pt, const double & eta, const double & phi, const int chg, const T & parScale) const = 0;
47  virtual ~scaleFunctionBase() = 0;
48  virtual int parNum() const { return parNum_; }
49  protected:
50  int parNum_;
51  virtual void setPar(double* Start, double* Step, double* Mini, double* Maxi, int* ind,
52  TString* parname, const T & parResol, const std::vector<int> & parResolOrder, const std::vector<ParSet> & parSet ) {
53  if( int(parSet.size()) != this->parNum_ ) {
54  std::cout << "Error: wrong number of parameter initializations = " << parSet.size() << ". Number of parameters is " << this->parNum_ << std::endl;
55  exit(1);
56  }
57  for( int iPar=0; iPar<this->parNum_; ++iPar ) {
58  Start[iPar] = parResol[iPar];
59  Step[iPar] = parSet[iPar].step;
60  Mini[iPar] = parSet[iPar].mini;
61  Maxi[iPar] = parSet[iPar].maxi;
62  ind[iPar] = parResolOrder[iPar];
63  parname[iPar] = parSet[iPar].name;
64  }
65  }
66  };
67 
68  template <class T> inline scaleFunctionBase<T>::~scaleFunctionBase() { } // defined even though it's pure virtual; should be faster this way.
69 
70 
71 
72  //
73  // Curvature: (linear eta + sinusoidal in phi (both in 5 eta bins)) * global scale
74  // ------------------------------------------------------------
75  template <class T>
76  class scaleFunction50 : public scaleFunctionBase<T> {
77  public:
78  scaleFunction50() { this->parNum_ = 27; }
79  virtual double scale(const double & pt, const double & eta, const double & phi, const int chg, const T & parScale) const {
80  double ampl(0), phase(0), twist(0), ampl2(0), freq2(0), phase2(0);
81 
82  // very bwd bin
83  if ( eta < parScale[4] ) {
84  ampl = parScale[1]; phase = parScale[2]; ampl2 = parScale[21]; freq2 = parScale[22]; phase2 = parScale[23];
85  twist = parScale[3]*(eta-parScale[4])+parScale[7]*(parScale[4]-parScale[8])+parScale[11]*parScale[8];
86  // bwd bin
87  } else if ( parScale[4] <= eta && eta < parScale[8] ) {
88  ampl = parScale[5]; phase = parScale[6];
89  twist = parScale[7]*(eta-parScale[8])+parScale[11]*parScale[8] ;
90  // barrel bin
91  } else if ( parScale[8] <= eta && eta < parScale[12] ) {
92  ampl = parScale[9]; phase = parScale[10];
93  twist = parScale[11]*eta;
94  // fwd bin
95  } else if ( parScale[12] <= eta && eta < parScale[16] ) {
96  ampl = parScale[13]; phase = parScale[14];
97  twist = parScale[15]*(eta-parScale[12])+parScale[11]*parScale[12];
98  // very fwd bin
99  } else if ( parScale[16] < eta ) {
100  ampl = parScale[17]; phase = parScale[18]; ampl2 = parScale[24]; freq2 = parScale[25]; phase2 = parScale[26];
101  twist = parScale[19]*(eta-parScale[16])+parScale[15]*(parScale[16]-parScale[12])+parScale[11]*parScale[12];
102  }
103 
104  // apply the correction
105  double curv = (1.+parScale[0])*((double)chg/pt
106  -twist
107  -ampl*sin(phi+phase)
108  -ampl2*sin(freq2*phi+phase2)
109  -0.5*parScale[20]);
110  return 1./((double)chg*curv);
111  }
112 
113  };
114 
115 
116  // ----------------------- //
117  // Resolution functors //
118  // ----------------------- //
119 
120  template <class T>
121  class resolutionFunctionBase {
122  public:
123  virtual double sigmaPt(const double & pt, const double & eta, const T & parval) = 0;
124 
126  virtual ~resolutionFunctionBase() = 0;
127  virtual int parNum() const { return parNum_; }
128 
129  protected:
130  int parNum_;
131  };
132  template <class T> inline resolutionFunctionBase<T>::~resolutionFunctionBase() { } // defined even though it's pure virtual; should be faster this way.
133 
134 
135  template <class T>
137  public:
138  resolutionFunction45() { this->parNum_ = 13; }
139 
140  inline double getGEO(const double & pt, const double & eta, const T & parval){
141  return parval[0];
142  }
143 
144  inline double getMS(const double & pt, const double & eta, const T & parval){
145  if( eta < -2.0 ) return( parval[1] );
146  if( eta < -1.8 ) return( parval[2] );
147  if( eta < -1.6 ) return( parval[3] );
148  if( eta < -1.2 ) return( parval[4] );
149  if( eta < -0.8 ) return( parval[5] );
150  if( eta < 0. ) return( parval[6] );
151  if( eta < 0.8 ) return( parval[7] );
152  if( eta < 1.2 ) return( parval[8] );
153  if( eta < 1.6 ) return( parval[9] );
154  if( eta < 1.8 ) return( parval[10] );
155  if( eta < 2.0 ) return( parval[11] );
156  return( parval[12] );
157  }
158 
159  virtual double sigmaPt(const double & pt, const double & eta, const T & parval)
160  {
161  return pt*getGEO(pt,eta,parval) + getMS(pt,eta,parval);
162  }
163 
164  };
165 
166  template <class T>
168  public:
169  resolutionFunction46() { this->parNum_ = 13; }
170 
171  int etaBin(const double & eta)
172  {
173 
174  // std::cout << "for eta = " << eta << ", bin = " << bin << std::endl;
175 
176  if( eta < -2.0 ) return 1;
177  if( eta < -1.8 ) return 2;
178  if( eta < -1.6 ) return 3;
179  if( eta < -1.2 ) return 4;
180  if( eta < -0.8 ) return 5;
181  if( eta < 0. ) return 6;
182  if( eta < 0.8 ) return 7;
183  if( eta < 1.2 ) return 8;
184  if( eta < 1.6 ) return 9;
185  if( eta < 1.8 ) return 10;
186  if( eta < 2.0 ) return 11;
187  return 12;
188  }
189 
190  virtual double sigmaPt(const double & pt, const double & eta, const T & parval)
191  {
192  return sqrt(pow(parval[0]*pt,2) + pow(parval[etaBin(eta)],2));
193  }
194 
195  };
196 
197 
198  // parametrization as sum in quadrature
199  // Geometric and MSC both as function of eta, adding straight lines between parabolas wrt type51
200  template <class T>
202  public:
203  resolutionFunction57() { this->parNum_ = 17; }
204 
205  inline double getGEO(const double & pt, const double & eta, const T & parval){
206  // geometrical term
207  double qGEO(0);
208  if ( eta < parval[0] ) {
209  qGEO = parval[10]*(eta-parval[0])*(eta-parval[0])+parval[11];
210  } else if ( parval[0] <= eta && eta < parval[3] ) {
211  qGEO = parval[11];
212  } else {
213  qGEO = parval[12]*(eta-parval[3])*(eta-parval[3])+parval[11];
214  }
215  return qGEO;
216  }
217 
218  inline double centralParabola(const double & pt, const double & eta, const T & parval){
219  return parval[4] + parval[5]*eta*eta;
220  }
221 
222  inline double middleParabola(const double & pt, const double & eta, const T & parval){
223  return parval[15] + parval[16]*eta*eta;
224  }
225 
226  inline double leftParabola(const double & pt, const double & eta, const T & parval){
227  return parval[6] + parval[7]*(eta-parval[0])*(eta-parval[0]);
228  }
229 
230  inline double rightParabola(const double & pt, const double & eta, const T & parval){
231  return parval[8] + parval[9]*(eta-parval[3])*(eta-parval[3]);
232  }
233 
234  inline double leftLine(const double & pt, const double & eta, const T & parval){
235  double x_1 = parval[13];
236  double y_1 = middleParabola(pt, parval[13], parval);
237  double x_2 = parval[0];
238  double y_2 = leftParabola(pt, parval[0], parval);
239  return( (eta - x_1)*(y_2 - y_1)/(x_2 - x_1) + y_1 );
240  }
241 
242  inline double rightLine(const double & pt, const double & eta, const T & parval){
243  double x_1 = parval[14];
244  double y_1 = middleParabola(pt, parval[14], parval);
245  double x_2 = parval[3];
246  double y_2 = rightParabola(pt, parval[3], parval);
247  return( (eta - x_1)*(y_2 - y_1)/(x_2 - x_1) + y_1 );
248  }
249 
250 
251  inline double getMSC(const double & pt, const double & eta, const T & parval){
252  // MSC term
253  double qMSC(0);
254  if ( eta < parval[0] ) {
255  qMSC = leftParabola(pt,eta,parval);
256  } else if ( parval[0] <= eta && eta < parval[13] ) {
257  qMSC = leftLine(pt,eta,parval);
258  } else if ( parval[13] <= eta && eta < parval[1] ) {
259  qMSC = middleParabola(pt,eta,parval);
260  } else if ( parval[1] <= eta && eta < parval[2] ) {
261  qMSC = centralParabola(pt,eta,parval);
262  } else if ( parval[2] <= eta && eta < parval[14] ) {
263  qMSC = middleParabola(pt,eta,parval);
264  } else if ( parval[14] <= eta && eta < parval[3] ) {
265  qMSC = rightLine(pt,eta,parval);
266  } else {
267  qMSC = rightParabola(pt,eta,parval);
268  }
269  return qMSC;
270  }
271 
272  virtual double sigmaPt(const double & pt, const double & eta, const T & parval)
273  {
274  double qGEO = getGEO(pt, eta, parval);
275  double qMSC = getMSC(pt, eta, parval);
276  return sqrt(pow(qGEO*pt,2) + pow(qMSC,2));
277  }
278  };
279 
280 
281 
282 // Service to build the scale functor corresponding to the passed identifier
284  switch ( identifier ) {
285  case ( 50 ): return ( new scaleFunction50<double * > ); break;
286  default: std::cout << "scaleFunctionService error: wrong identifier = " << identifier << std::endl; exit(1);
287  }
288 }
289 
290 
291 // Service to build the resolution functor corresponding to the passed identifier
293  switch ( identifier ) {
294  case ( 45 ): return ( new resolutionFunction45<double * > ); break;
295  case ( 46 ): return ( new resolutionFunction46<double * > ); break;
296  case ( 57 ): return ( new resolutionFunction57<double * > ); break;
297  default: std::cout << "resolutionFunctService error: wrong identifier = " << identifier << std::endl; exit(1);
298  }
299 }
300 
301 #endif
scaleFunctionBase< double * > * scaleFunctionService(const int identifier)
Service to build the scale functor corresponding to the passed identifier.
Definition: Functions.cc:3
virtual double sigmaPt(const double &pt, const double &eta, const T &parval)
double centralParabola(const double &pt, const double &eta, const T &parval)
double rightParabola(const double &pt, const double &eta, const T &parval)
const float chg[109]
Definition: CoreSimTrack.cc:5
double getMSC(const double &pt, const double &eta, const T &parval)
virtual double scale(const double &pt, const double &eta, const double &phi, const int chg, const T &parScale) const
virtual double sigmaPt(const double &pt, const double &eta, const T &parval)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
double leftLine(const double &pt, const double &eta, const T &parval)
virtual ~scaleFunctionBase()=0
Definition: Functions.h:103
double middleParabola(const double &pt, const double &eta, const T &parval)
virtual double sigmaPt(const double &pt, const double &eta, const T &parval)=0
virtual double sigmaPt(const double &pt, const double &eta, const T &parval)
double getMS(const double &pt, const double &eta, const T &parval)
T sqrt(T t)
Definition: SSEVec.h:48
ParSet(const TString &inputName, const double &inputStep, const double &inputMini, const double &inputMaxi)
virtual double scale(const double &pt, const double &eta, const double &phi, const int chg, const T &parScale) const =0
double getGEO(const double &pt, const double &eta, const T &parval)
resolutionFunctionBase< double * > * resolutionFunctionService(const int identifier)
Service to build the resolution functor corresponding to the passed identifier.
Definition: Functions.cc:38
tuple cout
Definition: gather_cfg.py:121
virtual void setPar(double *Start, double *Step, double *Mini, double *Maxi, int *ind, TString *parname, const T &parResol, const std::vector< int > &parResolOrder, const std::vector< ParSet > &parSet)
double rightLine(const double &pt, const double &eta, const T &parval)
long double T
virtual int parNum() const
virtual ~resolutionFunctionBase()=0
Definition: Functions.h:736
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
double getGEO(const double &pt, const double &eta, const T &parval)
double leftParabola(const double &pt, const double &eta, const T &parval)