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