ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/SchieferD/jetcalib/jetcorr.cpp
Revision: 1.2
Committed: Thu Aug 30 14:12:18 2007 UTC (17 years, 8 months ago) by schiefer
Branch: MAIN
Changes since 1.1: +47 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 schiefer 1.1 ////////////////////////////////////////////////////////////////////////////////
2     //
3     // jetcorr
4     // -------
5     //
6     // 07/05/2007 Philipp Schieferdecker <philipp.schieferdecker@cern.ch>
7     ////////////////////////////////////////////////////////////////////////////////
8    
9    
10     #include "jetcorr.h"
11    
12     #include <TF1.h>
13    
14     #include <iostream>
15     #include <fstream>
16     #include <sstream>
17     #include <algorithm>
18    
19    
20     using namespace std;
21    
22    
23 schiefer 1.2 double fnc_official(double*x,double*p);
24    
25    
26 schiefer 1.1 ////////////////////////////////////////////////////////////////////////////////
27     // construction/destruction
28     ////////////////////////////////////////////////////////////////////////////////
29    
30     //______________________________________________________________________________
31     jetcorr::jetcorr()
32     {
33    
34     }
35    
36     //______________________________________________________________________________
37     jetcorr::~jetcorr()
38     {
39     clear();
40     }
41    
42    
43     ////////////////////////////////////////////////////////////////////////////////
44     // implementation of member functions
45     ////////////////////////////////////////////////////////////////////////////////
46    
47     //______________________________________________________________________________
48     float jetcorr::eval(float pt,float eta)
49     {
50     MapCIter_t it = fitfncs_.lower_bound(eta);
51     assert(it!=fitfncs_.end());
52 schiefer 1.2 double rsp = it->second->Eval(pt);
53     double jes = (rsp>0.0) ? 1./rsp : 1.0;
54     return jes;
55 schiefer 1.1 }
56    
57    
58    
59     //______________________________________________________________________________
60     bool jetcorr::initialize(const string& filename)
61     {
62     clear();
63    
64     ifstream fin(filename.c_str());
65    
66     if (!fin.is_open()) {
67     cout<<"can't open "<<filename<<endl;
68     return false;
69     }
70    
71     stringstream ss;
72     bool filter(false);
73     while (!fin.eof()) {
74     char next;
75     fin.get(next);
76     if (!filter&&next=='#') filter=true;
77     if(!filter) ss<<next;
78     if (filter&&next=='\n') filter=false;
79     }
80     fin.close();
81    
82     int netabins;
83     string fitfncAsString;
84     int fitfncNbParams;
85     float eta,par,parerr;
86    
87     ss>>netabins>>fitfncAsString>>fitfncNbParams;
88    
89     for (int ieta=0;ieta<netabins;ieta++) {
90     ss>>eta;
91     stringstream fname; fname<<"fitfnc_eta"<<eta;
92 schiefer 1.2 TF1* fitfnc = (fitfncAsString=="official") ?
93     new TF1(fname.str().c_str(),fnc_official,1,1e4,9) :
94     new TF1(fname.str().c_str(),fitfncAsString.c_str());
95 schiefer 1.1 fitfncs_[eta] = fitfnc;
96     for (int ipar=0;ipar<fitfncNbParams;ipar++) {
97     ss>>par>>parerr;
98     fitfnc->SetParameter(ipar,par);
99     fitfnc->SetParError(ipar,parerr);
100     }
101     }
102    
103     return true;
104     }
105    
106    
107     //______________________________________________________________________________
108     void jetcorr::clear()
109     {
110     for (MapIter_t it=fitfncs_.begin();it!=fitfncs_.end();++it) delete it->second;
111     fitfncs_.clear();
112     }
113    
114 schiefer 1.2
115     //______________________________________________________________________________
116     double fnc_official(double*xx,double*p)
117     {
118     double a2 = p[5]/(sqrt(fabs(p[6]*p[1] + p[7]))) + p[8];
119     double a1 = p[2]*sqrt(p[0] +p[3]) + p[4];
120     double w1 = (a1*p[1] - a2*p[0])/(p[1]-p[0]);
121     double w2 = (a2-a1)/(p[1]-p[0]);
122     double koef = 1.;
123     double e = xx[0];
124     double JetCalibrEt = e;
125     double x =e;
126     double etConstantResponse=5.;//Beneath this corrected Et response is held constant
127    
128     if ( e<etConstantResponse ) JetCalibrEt=etConstantResponse;
129    
130     for (int ie=0; ie<10; ie++) { //10 iterations garantees convergence
131    
132     if ( JetCalibrEt<etConstantResponse ) JetCalibrEt=etConstantResponse;
133    
134     if (JetCalibrEt < p[0]) {
135     koef = p[2]*std::sqrt(std::abs(JetCalibrEt +p[3])) + p[4];
136     }
137    
138     else if (JetCalibrEt < p[1]) {
139     koef = w1 + JetCalibrEt*w2;
140     }
141    
142     else if (JetCalibrEt > p[1]) {
143     koef = p[5]/(std::sqrt(std::abs(p[6]*JetCalibrEt + p[7]))) + p[8];
144     }
145    
146     if(koef<0.1)koef=0.1;
147     JetCalibrEt = x / koef;
148     }
149    
150     return koef;
151     }