ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/UHHAnalysis/SFrameTools/JetMETObjects/src/JetResolution.cc
Revision: 1.1
Committed: Wed May 30 09:20:33 2012 UTC (12 years, 11 months ago) by peiffer
Content type: text/plain
Branch: MAIN
CVS Tags: v1-00, Feb-15-2013-v1, Feb-14-2013, Feb-07-2013-v1, Jan-17-2013-v2, Jan-17-2013-v1, Jan-16-2012-v1, Jan-09-2012-v2, Jan-09-2012-v1, Dec-26-2012-v1, Dec-20-2012-v1, Dec-17-2012-v1, Nov-30-2012-v2, Nov-30-2012-v1, HEAD
Log Message:
added JetMETObjects

File Contents

# Content
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // JetResolution
4 // -------------
5 //
6 // 11/05/2010 Philipp Schieferdecker <philipp.schieferdecker@cern.ch>
7 ////////////////////////////////////////////////////////////////////////////////
8
9
10 #include "CondFormats/JetMETObjects/interface/JetResolution.h"
11 #include "CondFormats/JetMETObjects/interface/JetCorrectorParameters.h"
12
13
14 #include <TMath.h>
15
16
17 #include <iostream>
18 #include <sstream>
19 #include <cassert>
20
21
22 using namespace std;
23
24
25 ////////////////////////////////////////////////////////////////////////////////
26 // GLOBAL FUNCTION DEFINITIONS
27 ////////////////////////////////////////////////////////////////////////////////
28
29 //______________________________________________________________________________
30 double fnc_dscb(double*xx,double*pp);
31 double fnc_gaussalpha(double*xx,double*pp);
32 double fnc_gaussalpha1alpha2(double*xx,double*pp);
33
34
35 ////////////////////////////////////////////////////////////////////////////////
36 // CONSTRUCTION / DESTRUCTION
37 ////////////////////////////////////////////////////////////////////////////////
38
39 //______________________________________________________________________________
40 JetResolution::JetResolution()
41 : resolutionFnc_(0)
42 {
43 resolutionFnc_ = new TF1();
44 }
45
46
47 //______________________________________________________________________________
48 JetResolution::JetResolution(const string& fileName,bool doGaussian)
49 : resolutionFnc_(0)
50 {
51 initialize(fileName,doGaussian);
52 }
53
54
55 //______________________________________________________________________________
56 JetResolution::~JetResolution()
57 {
58 delete resolutionFnc_;
59 for (unsigned i=0;i<parameterFncs_.size();i++) delete parameterFncs_[i];
60 for (unsigned i=0;i<parameters_.size();i++) delete parameters_[i];
61 }
62
63
64 ////////////////////////////////////////////////////////////////////////////////
65 // IMPLEMENTATION OF MEMBER FUNCTIONS
66 ////////////////////////////////////////////////////////////////////////////////
67
68 //______________________________________________________________________________
69 void JetResolution::initialize(const string& fileName,bool doGaussian)
70 {
71 size_t pos;
72
73 name_ = fileName;
74 pos = name_.find_last_of('.'); name_ = name_.substr(0,pos);
75 pos = name_.find_last_of('/'); name_ = name_.substr(pos+1);
76
77 JetCorrectorParameters resolutionPars(fileName,"resolution");
78 string fncname = "fResolution_" + name_;
79 string formula = resolutionPars.definitions().formula();
80 if (doGaussian) resolutionFnc_=new TF1(fncname.c_str(),"gaus",0.,5.);
81 else if (formula=="DSCB") resolutionFnc_=new TF1(fncname.c_str(),fnc_dscb,0.,5.,7);
82 else if (formula=="GaussAlpha1Alpha2") resolutionFnc_=new TF1(fncname.c_str(),fnc_gaussalpha1alpha2,-5.,5.,5);
83 else if (formula=="GaussAlpha") resolutionFnc_=new TF1(fncname.c_str(),fnc_gaussalpha,-5.,5.,4);
84 else resolutionFnc_=new TF1(fncname.c_str(),formula.c_str(),0.,5.);
85
86 resolutionFnc_->SetNpx(200);
87 resolutionFnc_->SetParName(0,"N");
88 resolutionFnc_->SetParameter(0,1.0);
89 unsigned nPar(1);
90
91 string tmp = resolutionPars.definitions().level();
92 pos = tmp.find(':');
93 while (!tmp.empty()) {
94 string paramAsStr = tmp.substr(0,pos);
95 if (!doGaussian||paramAsStr=="mean"||paramAsStr=="sigma") {
96 parameters_.push_back(new JetCorrectorParameters(fileName,paramAsStr));
97 formula = parameters_.back()->definitions().formula();
98 parameterFncs_.push_back(new TF1(("f"+paramAsStr+"_"+name()).c_str(),formula.c_str(),
99 parameters_.back()->record(0).parameters()[0],
100 parameters_.back()->record(0).parameters()[1]));
101 resolutionFnc_->SetParName(nPar,parameters_.back()->definitions().level().c_str());
102 nPar++;
103 }
104 tmp = (pos==string::npos) ? "" : tmp.substr(pos+1);
105 pos = tmp.find(':');
106 }
107
108 assert(nPar==(unsigned)resolutionFnc_->GetNpar());
109 assert(!doGaussian||nPar==3);
110 }
111
112
113 //______________________________________________________________________________
114 TF1* JetResolution::resolutionEtaPt(float eta, float pt) const
115 {
116 vector<float> x; x.push_back(eta);
117 vector<float> y; y.push_back(pt);
118 return resolution(x,y);
119 }
120
121
122 //______________________________________________________________________________
123 TF1* JetResolution::resolution(const vector<float>& x,
124 const vector<float>& y) const
125 {
126 unsigned N(y.size());
127 for (unsigned iPar=0;iPar<parameters_.size();iPar++) {
128 int bin = parameters_[iPar]->binIndex(x);
129 assert(bin>=0);
130 assert(bin<(int)parameters_[iPar]->size());
131 const std::vector<float>& pars = parameters_[iPar]->record(bin).parameters();
132 for (unsigned i=2*N;i<pars.size();i++)
133 parameterFncs_[iPar]->SetParameter(i-2*N,pars[i]);
134 float yy[4];
135 for (unsigned i=0;i<N;i++)
136 yy[i] = (y[i] < pars[2*i]) ? pars[2*i] : (y[i] > pars[2*i+1]) ? pars[2*i+1] : y[i];
137 resolutionFnc_->SetParameter(iPar+1,
138 parameterFncs_[iPar]->Eval(yy[0],yy[1],yy[2],yy[3]));
139 }
140 return resolutionFnc_;
141 }
142
143
144 //______________________________________________________________________________
145 TF1* JetResolution::parameterEta(const string& parameterName, float eta)
146 {
147 vector<float> x; x.push_back(eta);
148 return parameter(parameterName,x);
149 }
150
151
152 //______________________________________________________________________________
153 TF1* JetResolution::parameter(const string& parameterName,const vector<float>& x)
154 {
155 TF1* result(0);
156 for (unsigned i=0;i<parameterFncs_.size()&&result==0;i++) {
157 string fncname = parameterFncs_[i]->GetName();
158 if (fncname.find("f"+parameterName)==0) {
159 stringstream ssname; ssname<<parameterFncs_[i]->GetName();
160 for (unsigned ii=0;ii<x.size();ii++)
161 ssname<<"_"<<parameters_[i]->definitions().binVar(ii)<<x[ii];
162 result = (TF1*)parameterFncs_[i]->Clone();
163 result->SetName(ssname.str().c_str());
164 int N = parameters_[i]->definitions().nParVar();
165 int bin = parameters_[i]->binIndex(x);
166 assert(bin>=0);
167 assert(bin<(int)parameters_[i]->size());
168 const std::vector<float>& pars = parameters_[i]->record(bin).parameters();
169 for (unsigned ii=2*N;ii<pars.size();ii++) result->SetParameter(ii-2*N,pars[ii]);
170 }
171 }
172
173 if (0==result) cerr<<"JetResolution::parameter() ERROR: no parameter "
174 <<parameterName<<" found."<<endl;
175
176 return result;
177 }
178
179
180 ////////////////////////////////////////////////////////////////////////////////
181 // IMPLEMENTATION OF GLOBAL FUNCTIONS
182 ////////////////////////////////////////////////////////////////////////////////
183
184 //______________________________________________________________________________
185 double fnc_dscb(double*xx,double*pp)
186 {
187 double x = xx[0];
188 double N = pp[0];
189 double mu = pp[1];
190 double sig = pp[2];
191 double a1 = pp[3];
192 double p1 = pp[4];
193 double a2 = pp[5];
194 double p2 = pp[6];
195
196 double u = (x-mu)/sig;
197 double A1 = TMath::Power(p1/TMath::Abs(a1),p1)*TMath::Exp(-a1*a1/2);
198 double A2 = TMath::Power(p2/TMath::Abs(a2),p2)*TMath::Exp(-a2*a2/2);
199 double B1 = p1/TMath::Abs(a1) - TMath::Abs(a1);
200 double B2 = p2/TMath::Abs(a2) - TMath::Abs(a2);
201
202 double result(N);
203 if (u<-a1) result *= A1*TMath::Power(B1-u,-p1);
204 else if (u<a2) result *= TMath::Exp(-u*u/2);
205 else result *= A2*TMath::Power(B2+u,-p2);
206 return result;
207 }
208
209
210 //______________________________________________________________________________
211 double fnc_gaussalpha(double *v, double *par)
212 {
213 double N =par[0];
214 double mean =par[1];
215 double sigma=par[2];
216 double alpha=par[3];
217 double t =TMath::Abs((v[0]-mean)/sigma);
218 double cut = 1.0;
219 return (t<=cut) ? N*TMath::Exp(-0.5*t*t) : N*TMath::Exp(-0.5*(alpha*(t-cut)+cut*cut));
220 }
221
222
223 //______________________________________________________________________________
224 double fnc_gaussalpha1alpha2(double *v, double *par)
225 {
226 double N =par[0];
227 double mean =par[1];
228 double sigma =par[2];
229 double alpha1=par[3];
230 double alpha2=par[4];
231 double t =TMath::Abs((v[0]-mean)/sigma);
232 double cut = 1.0;
233 return
234 (t<=cut) ? N*TMath::Exp(-0.5*t*t) :
235 ((v[0]-mean)>=0) ? N*TMath::Exp(-0.5*(alpha1*(t-cut)+cut*cut)) :
236 N*TMath::Exp(-0.5*(alpha2*(t-cut)+cut*cut));
237 }
238