ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/SchieferD/jetcalib/mcresponse_x.cpp
(Generate patch)

Comparing UserCode/SchieferD/jetcalib/mcresponse_x.cpp (file contents):
Revision 1.1 by schiefer, Wed Aug 15 17:20:06 2007 UTC vs.
Revision 1.11 by schiefer, Mon Sep 3 08:14:28 2007 UTC

# Line 8 | Line 8
8  
9  
10   #include "utils/cmdline.h"
11 < #include "utils/plot.h"
11 > #include "utils/hist.h"
12  
13 + #include <TSystem.h>
14   #include <TROOT.h>
15   #include <TRint.h>
16   #include <TFile.h>
# Line 17 | Line 18
18   #include <TEventList.h>
19   #include <TH1F.h>
20   #include <TF1.h>
21 < #include <TGraphErrors.h>
21 < #include <TMultiGraph.h>
22 < #include <TCanvas.h>
23 < #include <TLegend.h>
21 > #include <TMath.h>
22  
23   #include <iostream>
24   #include <iomanip>
27 #include <fstream>
25   #include <cmath>
26   #include <string>
27   #include <vector>
# Line 34 | Line 31 | using namespace std;
31  
32  
33   ////////////////////////////////////////////////////////////////////////////////
37 // defaults
38 ////////////////////////////////////////////////////////////////////////////////
39 string dflt_ptbins ="7,9,12,15,20,25,30,45,65,90,120";
40 //string dflt_etabins=".2,.4,.7,1.,1.3,1.5,1.75,2.,2.3,2.5,2.7,2.9,3.2";
41 string dflt_etabins=".3,.6,.9,1.2,1.5,1.8,2.1,2.4,2.7";
42 string dflt_phibins="-2.75,-2.25,-1.75.,-1.25,-.75,-.25,.25,.75,1.25,1.75,2.25,2.75";
43
44
45 ////////////////////////////////////////////////////////////////////////////////
34   // declare global functions
35   ////////////////////////////////////////////////////////////////////////////////
36 + void     replaceHistos(int nbins,
37 +                       TH1F**& hVar,TH1F**& hEtCorr,TH1F**& hAbsRsp,TH1F**& hRelRsp,
38 +                       TTree**& tVar);
39 + void     replaceHistos(int nbins1,int nbins2,
40 +                       TH1F***&hVar,TH1F***&hEtCorr,TH1F***&hAbsRsp,TH1F***&hRelRsp,
41 +                       TTree***& tVar);
42 + void     replaceHistos(int nbins1,int nbins2,int nbins3,
43 +                       TH1F****&hVar,TH1F****&hEtCorr,
44 +                       TH1F****&hAbsRsp,TH1F****&hRelRsp,
45 +                       TTree****& tVar);
46 + void     fitHistos    (TH1F**    histos,int n,double nsigma);
47 + void     fitHistos    (TH1F***   histos,int n1,int n2,double nsigma);
48 + void     fitHistos    (TH1F****  histos,int n1,int n2,int n3,double nsigma);
49 + void     saveHistos   (TH1F**&   histos,int n);
50 + void     saveHistos   (TH1F***&  histos,int n1,int n2);
51 + void     saveHistos   (TH1F****& histos,int n1,int n2,int n3);
52  
49 /*
50  TH1F**   initRspHistos(const string& jetalg,const string& varname,
51  const vector<float>& bins,const string& xtitle);
52  TH1F***  initRspHistos(const string& jetalg,
53  const string& varname1,const string& varname2,
54  const vector<float>& bins1,const vector<float>& bins2,
55  const string& xtitle);
56  TH1F**   initVarHistos(const string& jetalg,const string& varname,
57  const vector<float>& bins,const string& xtitle);
58  TH1F***  initVarHistos(const string& jetalg,
59  const string& varname1,const string& varname2,
60  const vector<float>& bins1,const vector<float>& bins2,
61  const string& xtitle);
62  TH1F**   initPtHistos (const string& jetalg,
63  const string& varname,const vector<float>& bins);
64  TH1F***  initPtHistos (const string& jetalg,
65  const string& varname1,const string& varname2,
66  const vector<float>& bins1,const vector<float>& bins2);
67 */
68
69 void     fillRspAndSgm(TGraphErrors* gRsp,TGraphErrors* gSgm,float nsigma,
70                       const vector<float>& bins,TH1F** hVar,TH1F** hPt,TH1F** hRsp);
71 TCanvas* plotVarHistos(const vector<float>& bins,TH1F** hVar,bool logy=false);
72 TCanvas* plotRspHistos(const vector<float>& bins,TH1F** hRsp);
73 TCanvas* plotResponse (const vector<string>& jetalgs,short applyjes,
74                       const vector<TGraphErrors*> gRsp,
75                       const string& varname,const string& xtitle);
76 TCanvas* plotResponse (const string& jetalg,short applyjes,bool fitcorr,
77                       const vector<float>& bins1,TGraphErrors** gRsp,
78                       const string& varname1,const string vartitle1,
79                       const string& varname2,const string& xtitle);
80 TCanvas* plotResolution(const vector<string>& jetalgs,
81                        const vector<TGraphErrors*> gSgm,
82                        const string& varname,const string& xtitle);
83 TCanvas* plotResolution(const string& jetalg,const vector<float>& bins1,
84                        TGraphErrors** gSgm,
85                        const string& varname1,const string vartitle1,
86                        const string& varname2,const string& xtitle);
87
88 /*
89  int    get_ibin(const vector<float>& bins,float value);
90  string get_bin_title(const string& varname,int ibin,const vector<float>& bins);
91  string get_bin_name(const string& varname,int ibin,const vector<float>& bins);
92  void   get_bin_limits(float& min,float& max,int ibin,const vector<float>& bins);
93 */
94 float  get_xmax(TGraph* g);
53  
54  
55   ////////////////////////////////////////////////////////////////////////////////
# Line 103 | Line 61 | int main(int argc,char**argv)
61   {
62    cmdline cl;
63    cl.parse(argc,argv);
64 <
64 >  
65    vector<string> input     = cl.get_vector<string>("input");
66 +  string         output    = cl.get_value<string> ("output", "mcrsp.root");
67    string         selection = cl.get_value<string> ("selection",   "njt>0");
68    float          drmax     = cl.get_value<float>  ("drmax",           0.3);
110  string         treename  = cl.get_value<string> ("treename",        "t");
111  float          nsigma    = cl.get_value<float>  ("nsigma",          2.0);
69    short          applyjes  = cl.get_value<short>  ("applyjes",          0);
70 <  bool           fitcorr   = cl.get_value<bool>   ("fitcorr",       false);
71 <  vector<float>  ptbins    = cl.get_vector<float> ("ptbins",  dflt_ptbins);
72 <  vector<float>  etabins   = cl.get_vector<float> ("etabins",dflt_etabins);
73 <  vector<float>  phibins   = cl.get_vector<float> ("phibins",dflt_phibins);
70 >  string         treename  = cl.get_value<string> ("treename",        "t");
71 >  float          nsigma    = cl.get_value<float>  ("nsigma",          3.0);
72 >  vector<float>  etbins    = cl.get_vector<float> ("etbins",           "");
73 >  vector<float>  etabins   = cl.get_vector<float> ("etabins",          "");
74 >  vector<float>  phibins   = cl.get_vector<float> ("phibins",          "");
75 >  vector<float>  emfbins   = cl.get_vector<float> ("emfbins",          "");
76    bool           abseta    = cl.get_value<bool>   ("abseta",         true);
77    
78    if (!cl.check()) return 0;
79    cl.print();
80    
81 <
81 >  int netbins  = (etbins.size() >0) ? etbins.size() +1 : 0;
82 >  int netabins = (etabins.size()>0) ? etabins.size()+1 : 0;
83 >  int nphibins = (phibins.size()>0) ? phibins.size()+1 : 0;
84 >  int nemfbins = (emfbins.size()>0) ? emfbins.size()+1 : 0;
85 >  
86 >  if (netbins+netabins+nphibins+nemfbins==0) {
87 >    cout<<"Must specify bins: etbins, etabins, phibins, AND/OR emfbins!"<<endl;
88 >    return 0;
89 >  }
90 >  
91    // etabins
92 <  if (!abseta) {
92 >  if (netabins>0&&!abseta) {
93      int neta=(int)etabins.size();
94      std::reverse(etabins.begin(),etabins.end());
95      for (int ieta=neta-1;ieta>=0;ieta--) etabins.push_back(etabins[ieta]);
# Line 142 | Line 110 | int main(int argc,char**argv)
110    // prepare branch variables and histograms / graphs
111    float weight;
112    char  njt;
113 <  float jtpt[100];
113 >  float jtet[100];
114    float jteta[100];
115    float jtphi[100];
116 <  float jtgenpt[100];
116 >  float jtemf[100];
117 >  float jtgenet[100];
118    float jtgendr[100];
119    float jtjes[100][3];
120    
121 <  int nptbins  = ptbins.size()+1;
122 <  int netabins = etabins.size()+1;
154 <  int nphibins = phibins.size()+1;
155 <  
156 <  vector<TH1F**>         hPt;
157 <  vector<TH1F**>         hPtCorr;
158 <  vector<TH1F**>         hRspVsPt;
159 <  vector<TH1F**>         hEta;
160 <  vector<TH1F**>         hEtaPtCorr;
161 <  vector<TH1F**>         hRspVsEta;
162 <  vector<TH1F**>         hPhi;
163 <  vector<TH1F**>         hPhiPtCorr;
164 <  vector<TH1F**>         hRspVsPhi;
165 <  
166 <  vector<TH1F***>        hEtaPtPt;
167 <  vector<TH1F***>        hEtaPtPtCorr;
168 <  vector<TH1F***>        hRspVsEtaPt;
169 <  
170 <  vector<TGraphErrors*>  gRspVsPt;
171 <  vector<TGraphErrors*>  gSgmVsPt;
172 <  vector<TGraphErrors*>  gRspVsEta;
173 <  vector<TGraphErrors*>  gSgmVsEta;
174 <  vector<TGraphErrors*>  gRspVsPhi;
175 <  vector<TGraphErrors*>  gSgmVsPhi;
176 <  
177 <  vector<TGraphErrors**> gRspVsEtaPt;
178 <  vector<TGraphErrors**> gSgmVsEtaPt;
179 <  
180 <  argc=1; //argv[1]="-b";
181 <  TRint* app = new TRint(argv[0],&argc,argv);
121 >  argc=3; argv[1]="-l"; argv[2]="-b";
122 >  TRint* app = new TRint(argv[0],&argc,argv); app->Argc();
123    
124    
125    //
126    // loop over all input files
127    //
128 +  TFile* plotfile = new TFile(output.c_str(),"UPDATE");
129 +  
130    for (unsigned int i=0;i<input.size();++i) {
131      TFile* f = new TFile(input[i].c_str(),"READ"); if (!f->IsOpen()) return 0;
132      TTree* t = (TTree*)f->Get(treename.c_str());
# Line 193 | Line 136 | int main(int argc,char**argv)
136  
137      t->SetBranchAddress("weight", &weight);
138      t->SetBranchAddress("njt",    &njt);
139 <    t->SetBranchAddress("jtpt",   jtpt);
139 >    t->SetBranchAddress("jtet",   jtet);
140      t->SetBranchAddress("jteta",  jteta);
141      t->SetBranchAddress("jtphi",  jtphi);
142 <    t->SetBranchAddress("jtgenpt",jtgenpt);
142 >    t->SetBranchAddress("jtemf",  jtemf);
143 >    t->SetBranchAddress("jtgenet",jtgenet);
144      t->SetBranchAddress("jtgendr",jtgendr);
145 <
146 <    if (t->FindBranch("jtjes")) t->SetBranchAddress("jtjes", jtjes);
147 <    else
145 >    
146 >    vector<TBranch*> branches;
147 >    branches.push_back(t->GetBranch("weight"));
148 >    branches.push_back(t->GetBranch("njt"));
149 >    branches.push_back(t->GetBranch("jtet"));
150 >    branches.push_back(t->GetBranch("jteta"));
151 >    branches.push_back(t->GetBranch("jtphi"));
152 >    branches.push_back(t->GetBranch("jtemf"));
153 >    branches.push_back(t->GetBranch("jtgenet"));
154 >    branches.push_back(t->GetBranch("jtgendr"));
155 >    
156 >    if (t->FindBranch("jtjes")) {
157 >      t->SetBranchAddress("jtjes", jtjes);
158 >      branches.push_back(t->GetBranch("jtjes"));
159 >    }
160 >    else {
161        for (int i1=0;i1<100;i1++)
162          for (int i2=0;i2<3;i2++) jtjes[i1][i2]=1.0;
163 <    
164 <    
165 <    string rsp_xtitle = "E_{T}^{gen}-E_{T}^{rec} [GeV]";
163 >    }
164 >    string absrsp_xtitle = "E_{T}^{gen}-E_{T} [GeV]";
165 >    string relrsp_xtitle = "E_{T}^{rec}/E_{T}";
166  
210    /*
211      hPt       .push_back(initVarHistos(jetalgs[i],"Pt", ptbins,"jet p_{T} [GeV]"));
212      hPtCorr   .push_back(initPtHistos (jetalgs[i],"Pt", ptbins));
213      hRspVsPt  .push_back(initRspHistos(jetalgs[i],"Pt", ptbins, rsp_xtitle));
214      hEta      .push_back(initVarHistos(jetalgs[i],"Eta",etabins,"jet #eta"));
215      hEtaPtCorr.push_back(initPtHistos (jetalgs[i],"Eta",etabins));
216      hRspVsEta .push_back(initRspHistos(jetalgs[i],"Eta",etabins,rsp_xtitle));
217      hPhi      .push_back(initVarHistos(jetalgs[i],"Phi",phibins,"jet #phi"));
218      hPhiPtCorr.push_back(initPtHistos (jetalgs[i],"Phi",phibins));
219      hRspVsPhi .push_back(initRspHistos(jetalgs[i],"Phi",phibins,rsp_xtitle));
220      
221    hEtaPtPt.push_back(initVarHistos(jetalgs[i],
222                                     "Eta","Pt",etabins,ptbins,"jet p_{T} [GeV]"));
223                                     hEtaPtPtCorr.push_back(initPtHistos(jetalgs[i],
224                                     "Eta","Pt",etabins,ptbins));
225                                     hRspVsEtaPt.push_back(initRspHistos(jetalgs[i],
226                                     "Eta","Pt",etabins,ptbins,rsp_xtitle));
227    */
228    
229    hPt       .push_back(initHistos("JetPt",jetalgs[i],
230                                    1000,0,4000,true,"jet p_{T} [GeV]",
231                                    "Pt",ptbins));
232    hPtCorr   .push_back(initHistos("JetPtPtCorr",jetalgs[i],
233                                    1000,0,4000,true,"jet p_{T} [GeV]",
234                                    "Pt",ptbins));
235    hRspVsPt  .push_back(initHistos("RspVsPt",jetalgs[i],
236                                    100,-100,100,true,rsp_xtitle,
237                                    "Pt",ptbins));
238    hEta      .push_back(initHistos("JetEta",jetalgs[i],
239                                    100,0,5,false,"jet #eta",
240                                    "Eta",etabins));
241    hEtaPtCorr.push_back(initHistos("JetEtaPtCorr",jetalgs[i],
242                                    100,0,5,true,"jet p_{T} [GeV]",
243                                    "Eta",etabins));
244    hRspVsEta .push_back(initHistos("RspVsEta",jetalgs[i],
245                                    100,-100,100,true,rsp_xtitle,
246                                    "Eta",etabins));
247    hPhi      .push_back(initHistos(jetalgs[i],"Phi",phibins,"jet #phi"));
248    hPhiPtCorr.push_back(initHistos (jetalgs[i],"Phi",phibins));
249    hRspVsPhi .push_back(initHistos(jetalgs[i],"Phi",phibins,rsp_xtitle));
250    
251    hEtaPtPt.push_back(initVarHistos(jetalgs[i],
252                                     "Eta","Pt",etabins,ptbins,"jet p_{T} [GeV]"));
253    hEtaPtPtCorr.push_back(initPtHistos(jetalgs[i],
254                                        "Eta","Pt",etabins,ptbins));
255    hRspVsEtaPt.push_back(initRspHistos(jetalgs[i],
256                                        "Eta","Pt",etabins,ptbins,rsp_xtitle));
167      
168 +    TH1F** hGenEt(0);
169 +    TH1F** hEtCorrGenEt(0);
170 +    TH1F** hAbsRspGenEt(0);
171 +    TH1F** hRelRspGenEt(0);
172 +    
173 +    if (netbins>0) {
174 +      hGenEt       = hist::initHistos("GenEt",jetalgs[i],100,
175 +                                      "jet E_{T}^{gen} [GeV]",
176 +                                      "GenEt",etbins);
177 +      hEtCorrGenEt = hist::initHistos("EtCorrGenEt",jetalgs[i],100,
178 +                                      "jet E_{T}^{gen} [GeV]",
179 +                                      "GenEt",etbins);
180 +      hAbsRspGenEt = hist::initHistos("AbsRspGenEt",jetalgs[i],
181 +                                      100,-50,150,
182 +                                      absrsp_xtitle,
183 +                                      "GenEt",etbins);
184 +      hRelRspGenEt = hist::initHistos("RelRspGenEt",jetalgs[i],
185 +                                      100,0,2,
186 +                                      relrsp_xtitle,
187 +                                      "GenEt",etbins);
188 +    }
189 +    
190 +
191 +    TH1F** hEt(0);
192 +    TH1F** hEtCorrEt(0);
193 +    TH1F** hAbsRspEt(0);
194 +    TH1F** hRelRspEt(0);
195 +    
196 +    if (netbins>0) {
197 +      hEt       = hist::initHistos("Et",jetalgs[i],100,
198 +                                   "jet E_{T} [GeV]","Et",etbins);
199 +      hEtCorrEt = hist::initHistos("EtCorrEt",jetalgs[i],100,
200 +                                   "jet E_{T} [GeV]","Et",etbins);
201 +      hAbsRspEt = hist::initHistos("AbsRspEt",jetalgs[i],100,-50,150,
202 +                                   absrsp_xtitle,"Et",etbins);
203 +      hRelRspEt = hist::initHistos("RelRspEt",jetalgs[i],100,0,2,
204 +                                   relrsp_xtitle,"Et",etbins);
205 +    }
206 +    
207 +
208 +    TH1F** hEta(0);
209 +    TH1F** hEtCorrEta(0);
210 +    TH1F** hAbsRspEta(0);
211 +    TH1F** hRelRspEta(0);
212 +    
213 +    if (netabins>0) {
214 +      hEta       = hist::initHistos("Eta",jetalgs[i],100,
215 +                                    "jet #eta","Eta",etabins);
216 +      hEtCorrEta = hist::initHistos("EtCorrEta",jetalgs[i],100,
217 +                                    "jet E_{T} [GeV]","Eta",etabins);
218 +      hAbsRspEta = hist::initHistos("AbsRspEta",jetalgs[i],100,-50,150,
219 +                                    absrsp_xtitle,"Eta",etabins);
220 +      hRelRspEta = hist::initHistos("RelRspEta",jetalgs[i],100,0,2,
221 +                                    relrsp_xtitle,"Eta",etabins);
222 +    }
223 +    
224 +
225 +    TH1F** hPhi(0);
226 +    TH1F** hEtCorrPhi(0);
227 +    TH1F** hAbsRspPhi(0);
228 +    TH1F** hRelRspPhi(0);
229 +    
230 +    if (nphibins>0) {
231 +      hPhi       = hist::initHistos("Phi",jetalgs[i],100,
232 +                                    "jet #phi","Phi",phibins);
233 +      hEtCorrPhi = hist::initHistos("EtCorrPhi",jetalgs[i],100,
234 +                                    "jet E_{T} [Gev]","Phi",phibins);
235 +      hAbsRspPhi = hist::initHistos("AbsRspPhi",jetalgs[i],100,-50,150,
236 +                                    absrsp_xtitle,"Phi",phibins);
237 +      hRelRspPhi = hist::initHistos("RelRspPhi",jetalgs[i],100,0,2,
238 +                                    relrsp_xtitle,"Phi",phibins);
239 +    }
240 +    
241 +
242 +    TH1F** hEmf(0);
243 +    TH1F** hEtCorrEmf(0);
244 +    TH1F** hAbsRspEmf(0);
245 +    TH1F** hRelRspEmf(0);
246 +    
247 +    if (nemfbins>0) {
248 +      hEmf       = hist::initHistos("Emf",jetalgs[i],100,
249 +                                    "jet emf","Emf",emfbins);
250 +      hEtCorrEmf = hist::initHistos("EtCorrEmf",jetalgs[i],100,
251 +                                    "jet E_{T} [Gev]","Emf",emfbins);
252 +      hAbsRspEmf = hist::initHistos("AbsRspEmf",jetalgs[i],100,-50,150,
253 +                                    absrsp_xtitle,"Emf",emfbins);
254 +      hRelRspEmf = hist::initHistos("RelRspEmf",jetalgs[i],100,0,2,
255 +                                    relrsp_xtitle,"Emf",emfbins);
256 +    }
257 +    
258 +    
259 +    TH1F*** hEtEtaEt(0);
260 +    TH1F*** hEtCorrEtaEt(0);
261 +    TH1F*** hAbsRspEtaEt(0);
262 +    TH1F*** hRelRspEtaEt(0);
263 +    
264 +    if (netbins>0&&netabins>0) {
265 +      hEtEtaEt     = hist::initHistos("Et",jetalgs[i],100,"jet E_{T} [GeV]",
266 +                                      "Eta",etabins,"Et",etbins);
267 +      hEtCorrEtaEt = hist::initHistos("EtCorrEtaEt",jetalgs[i],100,
268 +                                      "jet E_{T} [GeV]",
269 +                                      "Eta",etabins,"Et",etbins);
270 +      hAbsRspEtaEt = hist::initHistos("AbsRspEtaEt",jetalgs[i],100,-50,150,
271 +                                      absrsp_xtitle,
272 +                                      "Eta",etabins,"Et",etbins);
273 +      hRelRspEtaEt = hist::initHistos("RelRspEtaEt",jetalgs[i],100,0,2,
274 +                                      relrsp_xtitle,
275 +                                      "Eta",etabins,"Et",etbins);
276 +    }
277 +
278 +
279 +    TH1F*** hEtEmfEt(0);
280 +    TH1F*** hEtCorrEmfEt(0);
281 +    TH1F*** hAbsRspEmfEt(0);
282 +    TH1F*** hRelRspEmfEt(0);
283 +    
284 +    if (netbins>0&&nemfbins>0) {
285 +      hEtEmfEt     = hist::initHistos("Et",jetalgs[i],100,"jet E_{T} [GeV]",
286 +                                      "Emf",emfbins,"Et",etbins);
287 +      hEtCorrEmfEt = hist::initHistos("EtCorrEmfEt",jetalgs[i],100,
288 +                                      "jet E_{T} [GeV]",
289 +                                      "Emf",emfbins,"Et",etbins);
290 +      hAbsRspEmfEt = hist::initHistos("AbsRspEmfEt",jetalgs[i],100,-50,150,
291 +                                      absrsp_xtitle,
292 +                                      "Emf",emfbins,"Et",etbins);
293 +      hRelRspEmfEt = hist::initHistos("RelRspEmfEt",jetalgs[i],100,0,2,
294 +                                      relrsp_xtitle,
295 +                                      "Emf",emfbins,"Et",etbins);
296 +    }
297 +    
298 +
299 +    TH1F**** hEtEmfEtaEt(0);
300 +    TH1F**** hEtCorrEmfEtaEt(0);
301 +    TH1F**** hAbsRspEmfEtaEt(0);
302 +    TH1F**** hRelRspEmfEtaEt(0);
303 +    
304 +    if (netbins>0&&netabins>0&&nemfbins>0) {
305 +      hEtEmfEtaEt     = hist::initHistos("Et",jetalgs[i],100,"jet E_{T} [GeV]",
306 +                                         "Emf",emfbins,
307 +                                         "Eta",etabins,
308 +                                         "Et", etbins);
309 +      hEtCorrEmfEtaEt = hist::initHistos("EtCorrEmfEtaEt",jetalgs[i],100,
310 +                                         "jet E_{T} [GeV]",
311 +                                         "Emf",emfbins,
312 +                                         "Eta",etabins,
313 +                                         "Et", etbins);
314 +      hAbsRspEmfEtaEt = hist::initHistos("AbsRspEmfEtaEt",jetalgs[i],
315 +                                         100,-50,150,absrsp_xtitle,
316 +                                         "Emf",emfbins,
317 +                                         "Eta",etabins,
318 +                                         "Et", etbins);
319 +      hRelRspEmfEtaEt = hist::initHistos("RelRspEmfEtaEt",jetalgs[i],
320 +                                         100,0,2,relrsp_xtitle,
321 +                                         "Emf",emfbins,
322 +                                         "Eta",etabins,
323 +                                         "Et", etbins);
324 +    }
325      
326      int nevts = el->GetN();
327      cout<<jetalgs[i]<<": "<<nevts<<" events selected."<<endl;
328      
329 +    // prepare intermediate trees
330 +    float genet,et,eta,phi,emf,etcorr,absrsp,relrsp;
331 +
332 +    TTree**   tGenEt(0);
333 +    TTree**   tEt(0);
334 +    TTree**   tEta(0);
335 +    TTree**   tPhi(0);
336 +    TTree**   tEmf(0);
337 +    TTree***  tEtEtaEt(0);
338 +    TTree***  tEtEmfEt(0);
339 +    TTree**** tEtEmfEtaEt(0);
340 +
341 +    gROOT->cd();
342 +    
343 +    if (netbins>0)  tGenEt = new TTree*[netbins];
344 +    if (netbins>0)  tEt    = new TTree*[netbins];
345 +    if (netabins>0) tEta   = new TTree*[netabins];
346 +    if (nphibins>0) tPhi   = new TTree*[nphibins];
347 +    if (nemfbins>0) tEmf   = new TTree*[nemfbins];
348 +    if (netbins>0&&netabins>0) tEtEtaEt = new TTree**[netabins];
349 +    if (netbins>0&&nemfbins>0) tEtEmfEt = new TTree**[nemfbins];
350 +    if (netbins>0&&netabins>0&&nemfbins>0) tEtEmfEtaEt = new TTree***[nemfbins];
351      
352 +    for (int iet=0;iet<netbins;iet++) {
353 +      
354 +      tGenEt[iet]=new TTree("tGenEt","tGenEt");
355 +      tGenEt[iet]->Branch("val",   &genet, "val/F");
356 +      tGenEt[iet]->Branch("etcorr",&etcorr,"etcorr/F");
357 +      tGenEt[iet]->Branch("absrsp",&absrsp,"absrsp/F");
358 +      tGenEt[iet]->Branch("relrsp",&relrsp,"relrsp/F");
359 +      tGenEt[iet]->Branch("weight",&weight,"weight/F");
360 +
361 +      tEt[iet]=new TTree("tEt","tEt");
362 +      tEt[iet]->Branch("val",   &et,    "val/F");
363 +      tEt[iet]->Branch("etcorr",&etcorr,"etcorr/F");
364 +      tEt[iet]->Branch("absrsp",&absrsp,"absrsp/F");
365 +      tEt[iet]->Branch("relrsp",&relrsp,"relrsp/F");
366 +      tEt[iet]->Branch("weight",&weight,"weight/F");
367 +    }
368 +    for (int ieta=0;ieta<netabins;ieta++) {
369 +      tEta[ieta]=new TTree("tEta","tEta");
370 +      tEta[ieta]->Branch("val",   &eta,   "val/F");
371 +      tEta[ieta]->Branch("etcorr",&etcorr,"etcorr/F");
372 +      tEta[ieta]->Branch("absrsp",&absrsp,"absrsp/F");
373 +      tEta[ieta]->Branch("relrsp",&relrsp,"relrsp/F");
374 +      tEta[ieta]->Branch("weight",&weight,"weight/F");
375 +    }
376 +    for (int iphi=0;iphi<nphibins;iphi++) {
377 +      tPhi[iphi]=new TTree("tPhi","tPhi");
378 +      tPhi[iphi]->Branch("val",   &phi,   "val/F");
379 +      tPhi[iphi]->Branch("etcorr",&etcorr,"etcorr/F");
380 +      tPhi[iphi]->Branch("absrsp",&absrsp,"absrsp/F");
381 +      tPhi[iphi]->Branch("relrsp",&relrsp,"relrsp/F");
382 +      tPhi[iphi]->Branch("weight",&weight,"weight/F");
383 +    }
384 +    for (int iemf=0;iemf<nemfbins;iemf++) {
385 +      tEmf[iemf]=new TTree("tEmf","tEmf");
386 +      tEmf[iemf]->Branch("val",   &emf,   "val/F");
387 +      tEmf[iemf]->Branch("etcorr",&etcorr,"etcorr/F");
388 +      tEmf[iemf]->Branch("absrsp",&absrsp,"absrsp/F");
389 +      tEmf[iemf]->Branch("relrsp",&relrsp,"relrsp/F");
390 +      tEmf[iemf]->Branch("weight",&weight,"weight/F");
391 +    }
392 +
393 +    if (netbins>0) {
394 +      for (int ieta=0;ieta<netabins;ieta++) {
395 +        tEtEtaEt[ieta] = new TTree*[netbins];
396 +        for (int iet=0;iet<netbins;iet++) {
397 +          tEtEtaEt[ieta][iet] = new TTree("tEtEtaEt","tEtEtaEt");
398 +          tEtEtaEt[ieta][iet]->Branch("val",   &et,    "val/F");
399 +          tEtEtaEt[ieta][iet]->Branch("etcorr",&etcorr,"etcorr/F");
400 +          tEtEtaEt[ieta][iet]->Branch("absrsp",&absrsp,"absrsp/F");
401 +          tEtEtaEt[ieta][iet]->Branch("relrsp",&relrsp,"relrsp/F");
402 +          tEtEtaEt[ieta][iet]->Branch("weight",&weight,"weight/F");
403 +        }
404 +      }
405 +      for (int iemf=0;iemf<nemfbins;iemf++) {
406 +        tEtEmfEt[iemf] = new TTree*[netbins];
407 +        for (int iet=0;iet<netbins;iet++) {
408 +          tEtEmfEt[iemf][iet] = new TTree("tEtEmfEt","tEtEmfEt");
409 +          tEtEmfEt[iemf][iet]->Branch("val",   &et,    "val/F");
410 +          tEtEmfEt[iemf][iet]->Branch("etcorr",&etcorr,"etcorr/F");
411 +          tEtEmfEt[iemf][iet]->Branch("absrsp",&absrsp,"absrsp/F");
412 +          tEtEmfEt[iemf][iet]->Branch("relrsp",&relrsp,"relrsp/F");
413 +          tEtEmfEt[iemf][iet]->Branch("weight",&weight,"weight/F");
414 +        }
415 +      }
416 +      if (netabins>0) {
417 +        for (int iemf=0;iemf<nemfbins;iemf++) {
418 +          tEtEmfEtaEt[iemf] = new TTree**[netabins];
419 +          for (int ieta=0;ieta<netabins;ieta++) {
420 +            tEtEmfEtaEt[iemf][ieta] = new TTree*[netbins];
421 +            for (int iet=0;iet<netbins;iet++) {
422 +              tEtEmfEtaEt[iemf][ieta][iet] = new TTree("tEtEmfEtaEt",
423 +                                                       "tEtEmfEtaEt");
424 +              tEtEmfEtaEt[iemf][ieta][iet]->Branch("val",   &et,    "val/F");
425 +              tEtEmfEtaEt[iemf][ieta][iet]->Branch("etcorr",&etcorr,"etcorr/F");
426 +              tEtEmfEtaEt[iemf][ieta][iet]->Branch("absrsp",&absrsp,"absrsp/F");
427 +              tEtEmfEtaEt[iemf][ieta][iet]->Branch("relrsp",&relrsp,"relrsp/F");
428 +              tEtEmfEtaEt[iemf][ieta][iet]->Branch("weight",&weight,"weight/F");
429 +            }
430 +          }
431 +        }
432 +      }
433 +    }
434 +    
435 +    cout<<jetalgs[i]<<": trees created."<<endl;
436 +
437      // loop over all events
438      for (int ievt=0;ievt<nevts;ievt++) {
439        
440 <      t->GetEntry(el->GetEntry(ievt));
441 <      
440 >      //t->GetEntry(el->GetEntry(ievt));
441 >      for (int ibrnch=0;ibrnch<(int)branches.size();ibrnch++)
442 >        branches[ibrnch]->GetEntry(el->GetEntry(ievt));
443 >
444        // loop over all jets in the event
445        for (int ijt=0;ijt<njt;ijt++) {
446          
447          if (jtgendr[ijt]<0.0||jtgendr[ijt]>drmax) continue;
448  
449 <        if (ijt>0) continue;
449 >        //if (ijt>ijtmax) continue;
450 >        
451 >        et      = jtet[ijt];
452 >        genet   = jtgenet[ijt];
453 >        eta     = (abseta) ? std::abs(jteta[ijt]) : jteta[ijt];
454 >        phi     = jtphi[ijt];
455 >        emf     = jtemf[ijt];
456  
457 <        float pt      = jtpt[ijt];
276 <        float genpt   = jtgenpt[ijt];
277 <        float eta     = (abseta) ? std::abs(jteta[ijt]) : jteta[ijt];
278 <        float phi     = jtphi[ijt];
457 >        etcorr  = (applyjes==0) ? et : et*jtjes[ijt][applyjes-1];
458          
459 <        float ptcorr  = (applyjes==0) ? pt : pt*jtjes[ijt][applyjes-1];
460 <        float deltapt = genpt - ptcorr;
459 >        absrsp  = genet - etcorr;
460 >        relrsp  = etcorr/genet;
461 >
462 >        if (TMath::IsNaN(emf)) emf = 0.0;
463          
464 <        // pt
465 <        int ipt = get_ibin(ptbins,pt);
466 <        hPt[i][ipt]     ->Fill(pt,weight);
467 <        hPtCorr[i][ipt] ->Fill(ptcorr,weight);
468 <        hRspVsPt[i][ipt]->Fill(deltapt,weight);
464 >        int igenet = (netbins>0)  ? hist::get_ibin(genet,etbins) : -1;
465 >        int iet    = (netbins>0)  ? hist::get_ibin(et,etbins)    : -1;
466 >        int ieta   = (netabins>0) ? hist::get_ibin(eta,etabins)  : -1;
467 >        int iphi   = (nphibins>0) ? hist::get_ibin(phi,phibins)  : -1;
468 >        int iemf   = (nemfbins>0) ? hist::get_ibin(emf,emfbins)  : -1;
469          
470 <        // eta
471 <        int ieta = get_ibin(etabins,eta);
472 <        hEta[i][ieta]      ->Fill(eta,    weight);
473 <        hEtaPtCorr[i][ieta]->Fill(ptcorr, weight);
474 <        hRspVsEta[i][ieta] ->Fill(deltapt,weight);
475 <                
476 <        // phi
477 <        int iphi = get_ibin(phibins,phi);
478 <        hPhi[i][iphi]      ->Fill(phi,    weight);
479 <        hPhiPtCorr[i][iphi]->Fill(ptcorr, weight);
480 <        hRspVsPhi[i][iphi] ->Fill(deltapt,weight);
300 <                
301 <        // pt-eta
302 <        hEtaPtPt[i][ieta][ipt]    ->Fill(pt,     weight);
303 <        hEtaPtPtCorr[i][ieta][ipt]->Fill(ptcorr, weight);
304 <        hRspVsEtaPt[i][ieta][ipt] ->Fill(deltapt,weight);
305 <                
470 >        if (netbins>0)  tGenEt[igenet]->Fill();
471 >        if (netbins>0)  tEt[iet]->Fill();
472 >        if (netabins>0) tEta[ieta]->Fill();
473 >        if (nphibins>0) tPhi[iphi]->Fill();
474 >        if (nemfbins>0) tEmf[iemf]->Fill();
475 >
476 >        if (netbins>0&&netabins>0) tEtEtaEt[ieta][iet]->Fill();
477 >        if (netbins>0&&nemfbins>0) tEtEmfEt[iemf][iet]->Fill();
478 >
479 >        if (netbins>0&&netabins>0&&nemfbins>0)
480 >          tEtEmfEtaEt[iemf][ieta][iet]->Fill();
481          
482        } // jets
483      } // evts
484      
485      cout<<jetalgs[i]<<": all events processed / histograms filled."<<endl;
486      
312    
313    // response / resolution vs *pt*
314    gRspVsPt.push_back(new TGraphErrors(nptbins));
315    gSgmVsPt.push_back(new TGraphErrors(nptbins));
316    gRspVsPt.back()->SetName(("RspVsPt_"+jetalgs[i]).c_str());
317    gSgmVsPt.back()->SetName(("SgmVsPt_"+jetalgs[i]).c_str());
318    fillRspAndSgm(gRspVsPt.back(),gSgmVsPt.back(),nsigma,
319                  ptbins,hPt[i],hPtCorr[i],hRspVsPt[i]);
320    
321    // response / resolution vs *eta*
322    gRspVsEta.push_back(new TGraphErrors(netabins));
323    gSgmVsEta.push_back(new TGraphErrors(netabins));
324    gRspVsEta.back()->SetName(("RspVsEta_"+jetalgs[i]).c_str());
325    gSgmVsEta.back()->SetName(("SgmVsEta_"+jetalgs[i]).c_str());
326    fillRspAndSgm(gRspVsEta.back(),gSgmVsEta.back(),nsigma,
327                  etabins,hEta[i],hEtaPtCorr[i],hRspVsEta[i]);
328    
329    // response / resolution vs *phi*
330    gRspVsPhi.push_back(new TGraphErrors(nphibins));
331    gSgmVsPhi.push_back(new TGraphErrors(nphibins));
332    gRspVsPhi.back()->SetName(("RspVsPhi_"+jetalgs[i]).c_str());
333    gSgmVsPhi.back()->SetName(("SgmVsPhi_"+jetalgs[i]).c_str());
334    fillRspAndSgm(gRspVsPhi.back(),gSgmVsPhi.back(),nsigma,
335                  phibins,hPhi[i],hPhiPtCorr[i],hRspVsPhi[i]);
336    
337    // response / resolution vs *pt-eta*
338    TGraphErrors** g;
339    g=new TGraphErrors*[netabins];
340    for (int ieta=0;ieta<netabins;ieta++) g[ieta] = new TGraphErrors(nptbins);
341    gRspVsEtaPt.push_back(g);
342    g=new TGraphErrors*[netabins];
343    for (int ieta=0;ieta<netabins;ieta++) g[ieta] = new TGraphErrors(nptbins);
344    gSgmVsEtaPt.push_back(g);
345    for (int ieta=0;ieta<netabins;ieta++) {
346      gRspVsEtaPt[i][ieta]->SetName(("RspVsPhi_"+get_bin_name("Eta",ieta,etabins)+
347                                     "_"+jetalgs[i]).c_str());
348      gSgmVsEtaPt[i][ieta]->SetName(("SgmVsPhi_"+get_bin_name("Eta",ieta,etabins)+
349                                     "_"+jetalgs[i]).c_str());
350      fillRspAndSgm(gRspVsEtaPt[i][ieta],gSgmVsEtaPt[i][ieta],nsigma,ptbins,
351                    hEtaPtPt[i][ieta],hEtaPtPtCorr[i][ieta],hRspVsEtaPt[i][ieta]);
352    }
353  }
354  
355  
356  //
357  // make plots
358  //
359  TFile* f = new TFile("mcresponse.root","RECREATE");
487  
488 <  for (unsigned int ialg=0;ialg<jetalgs.size();ialg++) {
488 >    // replace histograms
489 >
490 >    replaceHistos(netbins,
491 >                  hGenEt,hEtCorrGenEt,hAbsRspGenEt,hRelRspGenEt,tGenEt);
492 >    replaceHistos(netbins,hEt,hEtCorrEt,hAbsRspEt,hRelRspEt,tEt);
493 >    replaceHistos(netabins,hEta,hEtCorrEta,hAbsRspEta,hRelRspEta,tEta);
494 >    replaceHistos(nphibins,hPhi,hEtCorrPhi,hAbsRspPhi,hRelRspPhi,tPhi);
495 >    replaceHistos(nemfbins,hEmf,hEtCorrEmf,hAbsRspEmf,hRelRspEmf,tEmf);
496 >    replaceHistos(netabins,netbins,
497 >                  hEtEtaEt,hEtCorrEtaEt,hAbsRspEtaEt,hRelRspEtaEt,
498 >                  tEtEtaEt);
499 >    replaceHistos(nemfbins,netbins,
500 >                  hEtEmfEt,hEtCorrEmfEt,hAbsRspEmfEt,hRelRspEmfEt,
501 >                  tEtEmfEt);
502 >    replaceHistos(nemfbins,netabins,netbins,
503 >                  hEtEmfEtaEt,hEtCorrEmfEtaEt,
504 >                  hAbsRspEmfEtaEt,hRelRspEmfEtaEt,
505 >                  tEtEmfEtaEt);
506 >    
507 >    cout<<jetalgs[i]<<": all histograms replaced, and tree deleted."<<endl;
508 >
509 >    
510 >    plotfile->cd();
511 >    TDirectory* d = plotfile->GetDirectory(jetalgs[i].c_str());
512 >    if (0!=d) plotfile->rmdir(jetalgs[i].c_str());
513 >    d = plotfile->mkdir(jetalgs[i].c_str());
514 >    d->cd();
515 >    
516 >    // fit response histos
517 >    fitHistos(hAbsRspGenEt,netbins,nsigma);
518 >    fitHistos(hRelRspGenEt,netbins,nsigma);
519 >    
520 >    fitHistos(hAbsRspEt,   netbins,nsigma);
521 >    fitHistos(hRelRspEt,   netbins,nsigma);
522 >
523 >    fitHistos(hAbsRspEta,  netabins,nsigma);
524 >    fitHistos(hRelRspEta,  netabins,nsigma);
525 >
526 >    fitHistos(hAbsRspPhi,  nphibins,nsigma);
527 >    fitHistos(hRelRspPhi,  nphibins,nsigma);
528 >
529 >    fitHistos(hAbsRspEmf,  nemfbins,nsigma);
530 >    fitHistos(hRelRspEmf,  nemfbins,nsigma);
531 >
532 >    fitHistos(hAbsRspEtaEt,netabins,netbins,nsigma);
533 >    fitHistos(hRelRspEtaEt,netabins,netbins,nsigma);
534 >
535 >    fitHistos(hAbsRspEmfEt,nemfbins,netbins,nsigma);
536 >    fitHistos(hRelRspEmfEt,nemfbins,netbins,nsigma);
537 >
538 >    fitHistos(hAbsRspEmfEtaEt,nemfbins,netabins,netbins,nsigma);
539 >    fitHistos(hRelRspEmfEtaEt,nemfbins,netabins,netbins,nsigma);
540 >
541 >    cout<<jetalgs[i]<<": fits done."<<endl;
542 >
543 >    
544 >    // save histograms
545 >    saveHistos(hGenEt,      netbins);
546 >    saveHistos(hEtCorrGenEt,netbins);
547 >    saveHistos(hAbsRspGenEt,netbins);
548 >    saveHistos(hRelRspGenEt,netbins);
549 >
550 >    saveHistos(hEt,         netbins);
551 >    saveHistos(hEtCorrEt,   netbins);
552 >    saveHistos(hAbsRspEt,   netbins);
553 >    saveHistos(hRelRspEt,   netbins);
554 >
555 >    saveHistos(hEta,        netabins);
556 >    saveHistos(hEtCorrEta,  netabins);
557 >    saveHistos(hAbsRspEta,  netabins);
558 >    saveHistos(hRelRspEta,  netabins);
559 >
560 >    saveHistos(hPhi,        nphibins);
561 >    saveHistos(hEtCorrPhi,  nphibins);
562 >    saveHistos(hAbsRspPhi,  nphibins);
563 >    saveHistos(hRelRspPhi,  nphibins);
564 >    
565 >    saveHistos(hEmf,        nemfbins);
566 >    saveHistos(hEtCorrEmf,  nemfbins);
567 >    saveHistos(hAbsRspEmf,  nemfbins);
568 >    saveHistos(hRelRspEmf,  nemfbins);
569 >    
570 >    saveHistos(hEtEtaEt,    netabins,netbins);
571 >    saveHistos(hEtCorrEtaEt,netabins,netbins);
572 >    saveHistos(hAbsRspEtaEt,netabins,netbins);
573 >    saveHistos(hRelRspEtaEt,netabins,netbins);
574 >
575 >    saveHistos(hEtEmfEt,    nemfbins,netbins);
576 >    saveHistos(hEtCorrEmfEt,nemfbins,netbins);
577 >    saveHistos(hAbsRspEmfEt,nemfbins,netbins);
578 >    saveHistos(hRelRspEmfEt,nemfbins,netbins);
579 >
580 >    saveHistos(hEtEmfEtaEt,    nemfbins,netabins,netbins);
581 >    saveHistos(hEtCorrEmfEtaEt,nemfbins,netabins,netbins);
582 >    saveHistos(hAbsRspEmfEtaEt,nemfbins,netabins,netbins);
583 >    saveHistos(hRelRspEmfEtaEt,nemfbins,netabins,netbins);
584 >
585 >    cout<<jetalgs[i]<<": histograms saved."<<endl;
586 >  }
587 >  
588 >  plotfile->Write();
589 >  plotfile->Close();
590 >  delete plotfile;
591  
363    // pt
364    TCanvas* cPt     = plotVarHistos(ptbins,hPt[ialg],true);
365    TCanvas* cPtCorr = plotVarHistos(ptbins,hPtCorr[ialg],true);
366    TCanvas* cRspPt  = plotRspHistos(ptbins,hRspVsPt[ialg]);
367    
368    delete cPt;
369    delete cPtCorr;
370    delete cRspPt;
371    
372    // eta
373    TCanvas* cEta       = plotVarHistos(etabins,hEta[ialg]);
374    TCanvas* cEtaPtCorr = plotVarHistos(etabins,hEtaPtCorr[ialg],true);
375    TCanvas* cRspEta    = plotRspHistos(etabins,hRspVsEta[ialg]);
376    
377    delete cEta;
378    delete cEtaPtCorr;
379    delete cRspEta;
380    
381    // phi
382    TCanvas* cPhi       = plotVarHistos(phibins,hPhi[ialg]);
383    TCanvas* cPhiPtCorr = plotVarHistos(phibins,hPhiPtCorr[ialg],true);
384    TCanvas* cRspPhi    = plotRspHistos(phibins,hRspVsPhi[ialg]);
385
386    delete cPhi;
387    delete cPhiPtCorr;
388    delete cRspPhi;
389    
390    // eta-pt
391    for (int ieta=0;ieta<netabins;ieta++) {
392      TCanvas* cEtaPtPt     = plotVarHistos(ptbins,hEtaPtPt[ialg][ieta],true);
393      TCanvas* cEtaPtPtCorr = plotVarHistos(ptbins,hEtaPtPtCorr[ialg][ieta],true);
394      TCanvas* cRspEtaPt    = plotRspHistos(ptbins,hRspVsEtaPt[ialg][ieta]);
395      
396      delete cEtaPtPt;
397      delete cEtaPtPtCorr;
398      delete cRspEtaPt;
399    }
400    
401  }
402  
403  // response & resolution vs pT
404  TCanvas* cRspVsPt  = plotResponse(jetalgs,applyjes,gRspVsPt,"Pt","jet p_{T} [GeV]");
405  TCanvas* cSgmVsPt  = plotResolution(jetalgs,gSgmVsPt,"Pt","jet p_{T} [GeV]");
406  
407  // response & resolution vs eta
408  TCanvas* cRspVsEta = plotResponse(jetalgs,applyjes,gRspVsEta,"Eta","jet #eta");
409  TCanvas* cSgmVsEta = plotResolution(jetalgs,gSgmVsEta,"Eta","jet #eta");
410  
411  // response & resolution vs phi
412  TCanvas* cRspVsPhi = plotResponse(jetalgs,applyjes,gRspVsPhi,"Phi","jet #phi");
413  TCanvas* cSgmVsPhi = plotResolution(jetalgs,gSgmVsPhi,"Phi","jet #phi");
414  
415  // response & resolution vs eta/pT
416  for (unsigned int ialg=0;ialg<jetalgs.size();ialg++) {
417    
418    TCanvas* cRspVsEtaPt = plotResponse(jetalgs[ialg],applyjes,fitcorr,
419                                        etabins,gRspVsEtaPt[ialg],
420                                        "Eta","#eta","Pt","jet p_{T} [GeV]");
421    TCanvas* cSgmVsEtaPt = plotResolution(jetalgs[ialg],etabins,gSgmVsEtaPt[ialg],
422                                          "Eta","#eta","Pt","jet p_{T} [GeV]");
423  }
424  
425  f->Write();
426  f->Close();
427  delete f;
428  
592    app->Run();
593    
594    return 0;
# Line 438 | Line 601 | int main(int argc,char**argv)
601   ////////////////////////////////////////////////////////////////////////////////
602  
603   //______________________________________________________________________________
604 < TH1F** initRspHistos(const string& jetalg,const string& varname,
605 <                     const vector<float>& bins,const string& xtitle)
606 < {
444 <  unsigned int nhistos = bins.size()+1;
445 <  TH1F** result = new TH1F*[nhistos];
446 <  for (unsigned int i=0;i<nhistos;i++) {
447 <    string hname = "Rsp_"+get_bin_name(varname,i,bins)+"_"+jetalg;
448 <    result[i] = new TH1F(hname.c_str(),hname.c_str(),51,-100.,100.);
449 <    result[i]->SetXTitle(xtitle.c_str());
450 <    result[i]->SetYTitle("number of jets");
451 <    result[i]->Sumw2();
452 <  }
453 <  
454 <  return result;
455 < }
456 <
457 <
458 < //______________________________________________________________________________
459 < TH1F*** initRspHistos(const string& jetalg,
460 <                      const string& varname1,const string& varname2,
461 <                      const vector<float>& bins1,const vector<float>& bins2,
462 <                      const string& xtitle)
463 < {
464 <  unsigned int n1 = bins1.size()+1;
465 <  TH1F*** result = new TH1F**[n1];
466 <  for (unsigned int i1=0;i1<n1;i1++) {
467 <    unsigned int n2 = bins2.size()+1;
468 <    result[i1] = new TH1F*[n2];
469 <    for (unsigned int i2=0;i2<n2;i2++) {
470 <      string hname =
471 <        "Rsp_"+
472 <        get_bin_name(varname1,i1,bins1)+"_"+
473 <        get_bin_name(varname2,i2,bins2)+"_"+
474 <        jetalg;
475 <      result[i1][i2] = new TH1F(hname.c_str(),hname.c_str(),51,-100.,100.);
476 <      result[i1][i2]->SetXTitle(xtitle.c_str());
477 <      result[i1][i2]->SetYTitle("number of jets");
478 <      result[i1][i2]->Sumw2();
479 <    }
480 <  }
481 <  return result;
482 < }
483 <
484 <
485 < //______________________________________________________________________________
486 < TH1F** initVarHistos(const string& jetalg,const string& varname,
487 <                     const vector<float>& bins,const string& xtitle)
604 > void replaceHistos(int nbins,
605 >                   TH1F**& hVar,TH1F**& hEtCorr,TH1F**& hAbsRsp,TH1F**& hRelRsp,
606 >                   TTree**& tVar)
607   {
608 <  unsigned int nhistos = bins.size()+1;
490 <  TH1F** result = new TH1F*[nhistos];
491 <  for (unsigned int i=0;i<nhistos;i++) {
492 <    string hname = get_bin_name(varname,i,bins)+"_"+jetalg;
493 <    float xmin,xmax;
494 <    get_bin_limits(xmin,xmax,i,bins);
495 <    result[i] = new TH1F(hname.c_str(),hname.c_str(),21,xmin,xmax);
496 <    result[i]->SetXTitle(xtitle.c_str());
497 <    result[i]->SetYTitle("number of jets");
498 <    result[i]->Sumw2();
499 <    }
608 >  if (nbins==0) return;
609    
610 <  return result;
502 < }
503 <
504 <
505 < //______________________________________________________________________________
506 < TH1F** initPtHistos(const string& jetalg,
507 <                    const string& varname,const vector<float>& bins)
508 < {
509 <  unsigned int nhistos = bins.size()+1;
510 <  TH1F** result = new TH1F*[nhistos];
511 <  for (unsigned int i=0;i<nhistos;i++) {
512 <    string hname = "PtCorr_"+get_bin_name(varname,i,bins)+"_"+jetalg;
513 <    result[i] = new TH1F(hname.c_str(),hname.c_str(),100,0.,300.);
514 <    result[i]->SetXTitle("jet p_{T} [GeV]");
515 <    result[i]->SetYTitle("number of jets");
516 <    result[i]->Sumw2();
517 <  }
518 <  
519 <  return result;
520 < }
521 <
522 <
523 < //______________________________________________________________________________
524 < TH1F*** initVarHistos(const string& jetalg,
525 <                      const string& varname1,const string& varname2,
526 <                      const vector<float>& bins1,const vector<float>& bins2,
527 <                      const string& xtitle)
528 < {
529 <  unsigned int n1 = bins1.size()+1;
530 <  unsigned int n2 = bins2.size()+1;
531 <  TH1F*** result = new TH1F**[n1];
532 <  for (unsigned int i1=0;i1<n1;i1++) {
533 <    result[i1] = new TH1F*[n2];
534 <    for (unsigned int i2=0;i2<n2;i2++) {
535 <      string hname =
536 <        get_bin_name(varname1,i1,bins1)+"_"+
537 <        get_bin_name(varname2,i2,bins2)+"_"+
538 <        jetalg;
539 <      float xmin,xmax;
540 <      get_bin_limits(xmin,xmax,i2,bins2);
541 <      result[i1][i2] = new TH1F(hname.c_str(),hname.c_str(),21,xmin,xmax);
542 <      result[i1][i2]->SetXTitle(xtitle.c_str());
543 <      result[i1][i2]->SetYTitle("number of jets");
544 <      result[i1][i2]->Sumw2();
545 <    }
546 <  }
547 <  
548 <  return result;
549 < }
550 <
551 <
552 < //______________________________________________________________________________
553 < TH1F*** initPtHistos(const string& jetalg,
554 <                     const string& varname1,const string& varname2,
555 <                     const vector<float>& bins1,const vector<float>& bins2)
556 <  
557 < {
558 <  unsigned int n1 = bins1.size()+1;
559 <  unsigned int n2 = bins2.size()+1;
560 <  TH1F*** result = new TH1F**[n1];
561 <  for (unsigned int i1=0;i1<n1;i1++) {
562 <    result[i1] = new TH1F*[n2];
563 <    for (unsigned int i2=0;i2<n2;i2++) {
564 <      string hname =
565 <        "PtCorr_"+
566 <        get_bin_name(varname1,i1,bins1)+"_"+
567 <        get_bin_name(varname2,i2,bins2)+"_"+
568 <        jetalg;
569 <      result[i1][i2] = new TH1F(hname.c_str(),hname.c_str(),100,0,300.);
570 <      result[i1][i2]->SetXTitle("jet p_{T} [GeV]");
571 <      result[i1][i2]->SetYTitle("number of jets");
572 <      result[i1][i2]->Sumw2();
573 <    }
574 <  }
575 <  
576 <  return result;
577 < }
578 <
579 <
580 < //______________________________________________________________________________
581 < void fillRspAndSgm(TGraphErrors* gRsp,TGraphErrors* gSgm,float nsigma,
582 <                   const vector<float>& bins,TH1F** hVar,TH1F** hPt,TH1F** hRsp)
583 < {
584 <  int nbins = bins.size()+1;
610 >  TH1::SetDefaultSumw2();
611    for (int ibin=0;ibin<nbins;ibin++) {
612      
613 <    float var = hVar[ibin]->GetMean();
588 <    float pt  = hPt[ibin]->GetMean();
589 <    TH1F* h   = hRsp[ibin];
590 <    
591 <    float de       = h->GetMean();
592 <    float errde    = h->GetMeanError();
593 <    float sgmde    = h->GetRMS();
594 <    float errsgmde = h->GetRMSError();
595 <    
596 <    if (h->GetEntries()>50) {
597 <      string fname = "fitfnc" + (string)h->GetName();
598 <      TF1* f = new TF1(fname.c_str(),"gaus",de-nsigma*sgmde,de+nsigma*sgmde);
599 <      f->SetLineColor(kRed);
600 <      f->SetLineWidth(1);
601 <      f->SetParameter(1,de);
602 <      f->SetParameter(2,sgmde);
603 <      h->Fit(f,"QR");
604 <      
605 <      de       = f->GetParameter(1);
606 <      errde    = f->GetParError(1);
607 <      sgmde    = f->GetParameter(2);
608 <      errsgmde = f->GetParError(2);
609 <    }
613 >    TH1F* h(0);
614      
615 <    float rsp    = pt/(pt+de);
612 <    float errrsp = pt/(pt+de)/(pt+de)*errde;
613 <    float sgm    = pt/(pt+de)/(pt+de)*sgmde;
614 <    float errsgm = 2*pt*sgmde/(pt+de)/(pt+de)/(pt+de)*errde;
615 <    
616 <    sgm    /= rsp;
617 <    errsgm /= rsp;
618 <    
619 <    gRsp->SetPoint(ibin,var,rsp);
620 <    gRsp->SetPointError(ibin,0.0,errrsp);
621 <    gSgm->SetPoint(ibin,var,sgm);
622 <    gSgm->SetPointError(ibin,0.0,errsgm);
623 <  }
624 <  
625 < }
626 <
627 <
628 < //______________________________________________________________________________
629 < TCanvas* plotVarHistos(const vector<float>& bins,TH1F** hVar,bool logy)
630 < {
631 <  string::size_type pos;
632 <  string cname,jetalg;
633 <  
634 <  cname  = hVar[0]->GetName();
635 <  pos    = cname.find_last_of('_');
636 <  jetalg = cname.substr(pos+1);
637 <  cname  = cname.substr(0,pos);
638 <  pos    = cname.find_last_of(':');
639 <  cname  = cname.substr(0,pos);
640 <  cname += "_"+jetalg;
641 <  
642 <  TCanvas* c = new TCanvas(cname.c_str(),cname.c_str());
643 <  
644 <  int nbins = bins.size()+1;
645 <  int ncx= int(std::sqrt((float)nbins));
646 <  int ncy= ncx;
647 <  if (ncx*ncy<nbins) ncx++;
648 <  if (ncx*ncy<nbins) ncy++;
649 <  
650 <  c->Divide(ncx,ncy);
651 <  
652 <  for (int ibin=0;ibin<nbins;ibin++) {
653 <    c->cd(ibin+1);
654 <    gPad->SetLogy(logy);
655 <    hVar[ibin]->Draw("EHIST");
656 <  }
657 <  
658 <  c->Write();
659 <  
660 <  return c;
661 < }
615 >    if (tVar[ibin]->GetEntries()==0) continue;
616  
617 +    tVar[ibin]->Project("h(50)","val","weight*(1)");
618 +    h = (TH1F*)gROOT->FindObject("h");
619 +    h->SetNameTitle(hVar[ibin]->GetName(),hVar[ibin]->GetTitle());
620 +    h->SetXTitle(hVar[ibin]->GetXaxis()->GetTitle());
621 +    h->SetYTitle(hVar[ibin]->GetYaxis()->GetTitle());
622 +    delete hVar[ibin];
623 +    hVar[ibin] = h;
624  
625 < //______________________________________________________________________________
626 < TCanvas* plotRspHistos(const vector<float>& bins,TH1F** hRsp)
627 < {
628 <  string::size_type pos;
629 <  string cname,jetalg;
630 <  
631 <  cname  = hRsp[0]->GetName();
632 <  pos    = cname.find_last_of('_');
633 <  jetalg = cname.substr(pos+1);
634 <  cname  = cname.substr(0,pos);
635 <  pos    = cname.find_last_of(':');
636 <  cname  = cname.substr(0,pos);
637 <  cname += "_"+jetalg;
638 <  
639 <  TCanvas* c = new TCanvas(cname.c_str(),cname.c_str());
679 <
680 <  int nbins = bins.size()+1;
681 <  int ncx= int(std::sqrt((float)nbins));
682 <  int ncy= ncx;
683 <  if (ncx*ncy<nbins) ncx++;
684 <  if (ncx*ncy<nbins) ncy++;
685 <  
686 <  c->Divide(ncx,ncy);
687 <  
688 <  for (int ibin=0;ibin<nbins;ibin++) {
689 <    c->cd(ibin+1);
690 <    if (hRsp[ibin]->GetEntries()>0) gPad->SetLogy();
691 <    hRsp[ibin]->Draw("EHIST");
692 <    string fname = "fitfnc" + (string)hRsp[ibin]->GetName();
693 <    TF1* fitfnc=hRsp[ibin]->GetFunction(fname.c_str());
694 <    if (0!=fitfnc) fitfnc->Draw("SAME");
695 <  }
696 <
697 <  c->Write();
698 <  
699 <  return c;
700 < }
701 <
702 <
703 < //______________________________________________________________________________
704 < TCanvas* plotResponse(const vector<string>& jetalgs,short applyjes,
705 <                      const vector<TGraphErrors*> gRsp,
706 <                      const string& varname,const string& xtitle)
707 < {
708 <  assert(jetalgs.size()==gRsp.size());
709 <  
710 <  string   cname = "RspVs"+varname;
711 <  TCanvas* c     = new TCanvas(cname.c_str(),cname.c_str());
712 <  TLegend* l     = new TLegend(0.7,0.25+jetalgs.size()*0.045,0.85,0.25);
713 <
714 <  l->SetFillColor(10);
715 <  Color_t color=kBlack;
716 <  TMultiGraph* mg = new TMultiGraph();
717 <
718 <  for (unsigned int i=0;i<gRsp.size();i++) {
719 <    TGraphErrors* g = gRsp[i];
720 <    l->AddEntry(g,jetalgs[i].c_str(),"l");
721 <    while (color==kYellow||color==kWhite||color==10) color++;
722 <    g->SetMarkerColor(color);
723 <    g->SetLineColor(color);
724 <    g->SetMarkerStyle(kFullCircle);
725 <    g->SetMarkerSize(0.5);
726 <    mg->Add(g,"P");
727 <
728 <    if (varname=="Pt") {
729 <      string fname = "fitfnc"+cname;
730 <      string fitfncAsString =
731 <        //(applyjes==0) ? "[0]+[1]*log(x)+[2]*log(x)*log(x)+[3]*x+[4]*x*x" : "pol0";
732 <        (applyjes==0) ? "[0]*(pow(log(x),[1])-1/x)" : "pol0";
733 <      
734 <      TF1* fitfnc = new TF1(fname.c_str(),fitfncAsString.c_str(),1,get_xmax(g));
735 <      
736 <      if (applyjes==0) {
737 <        fitfnc->SetParameter(0,0.4);
738 <        fitfnc->SetParameter(1,0.4);
739 <      }
740 <      else {
741 <        fitfnc->SetParameter(0,1.0);
742 <      }
743 <      
744 <      fitfnc->SetLineWidth(1);
745 <      fitfnc->SetLineColor(color);
746 <      g->Fit(fitfnc,"QR");
747 <    }
625 >    tVar[ibin]->Project("h(50)","etcorr","weight*(1)");
626 >    h = (TH1F*)gROOT->FindObject("h");
627 >    h->SetNameTitle(hEtCorr[ibin]->GetName(),hEtCorr[ibin]->GetTitle());
628 >    h->SetXTitle(hEtCorr[ibin]->GetXaxis()->GetTitle());
629 >    h->SetYTitle(hEtCorr[ibin]->GetYaxis()->GetTitle());
630 >    delete hEtCorr[ibin];
631 >    hEtCorr[ibin] = h;
632 >    
633 >    tVar[ibin]->Project("h(50)","absrsp","weight*(1)");
634 >    h = (TH1F*)gROOT->FindObject("h");
635 >    h->SetNameTitle(hAbsRsp[ibin]->GetName(),hAbsRsp[ibin]->GetTitle());
636 >    h->SetXTitle(hAbsRsp[ibin]->GetXaxis()->GetTitle());
637 >    h->SetYTitle(hAbsRsp[ibin]->GetYaxis()->GetTitle());
638 >    delete hAbsRsp[ibin];
639 >    hAbsRsp[ibin] = h;
640      
641 <    g->Write();
641 >    tVar[ibin]->Project("h(50)","relrsp","weight*(1)");
642 >    h = (TH1F*)gROOT->FindObject("h");
643 >    h->SetNameTitle(hRelRsp[ibin]->GetName(),hRelRsp[ibin]->GetTitle());
644 >    h->SetXTitle(hRelRsp[ibin]->GetXaxis()->GetTitle());
645 >    h->SetYTitle(hRelRsp[ibin]->GetYaxis()->GetTitle());
646 >    delete hRelRsp[ibin];
647 >    hRelRsp[ibin] = h;
648      
649 <    color++;
649 >    delete tVar[ibin];
650    }
651    
652 <  string mgtitle = "Jet Response Vs "+varname;
755 <  mg->Draw("a");
756 <  mg->SetTitle(mgtitle.c_str());
757 <  mg->GetXaxis()->SetTitle(xtitle.c_str());
758 <  mg->GetYaxis()->SetTitle("E_{T}^{rec}/E_{T}^{gen}");
759 <  if (varname=="Pt") mg->GetXaxis()->SetLimits(0.0,mg->GetXaxis()->GetXmax());
760 <  mg->SetMinimum(0.0);
761 <  mg->SetMaximum(1.1);
762 <  l->Draw();
763 <  
764 <  c->Write();
765 <
766 <  return c;
652 >  delete [] tVar;
653   }
654  
655  
656   //______________________________________________________________________________
657 < TCanvas* plotResponse(const string& jetalg,short applyjes,bool fitcorr,
658 <                      const vector<float>& bins1,TGraphErrors** gRsp,
659 <                      const string& varname1,const string vartitle1,
774 <                      const string& varname2,const string& xtitle)
775 <                      
657 > void replaceHistos(int nbins1,int nbins2,
658 >                   TH1F***& hVar,TH1F***& hEtCorr,TH1F***& hAbsRsp,TH1F***& hRelRsp,
659 >                   TTree***& tVar)
660   {
661 <  int      nbins = bins1.size()+1;
778 <  
779 <  string   fitfncAsString = "pol0";
780 <  int      fitfncNbParams = 1;
781 <  
782 <  ofstream fout;
783 <  
784 <  if (applyjes==0) {
785 <    //fitfncAsString = "[0]+[1]*log(x)+[2]*log(x)*log(x)+[3]*x+[4]*x*x";
786 <    //fitfncNbParams = 5;
787 <    fitfncAsString = "[0]*(pow(log(x),[1])-1/x)";
788 <    fitfncNbParams = 2;
789 <  }
790 <  if (fitcorr) {
791 <    fout.open((jetalg+".txt").c_str()); assert(fout.is_open());
792 <    fout<<"#\n# jet correction parameters for "<<jetalg<<" algorithm\n#\n\n"
793 <        <<"# number of eta bins\n"<<nbins
794 <        <<"\n\n# fit function\n"<<fitfncAsString<<"\n"<<fitfncNbParams
795 <        <<endl<<endl;
796 <  }
797 <  
798 <  string   cname = "RspVs"+varname1+varname2+"_"+jetalg;
799 <  TCanvas* c = new TCanvas(cname.c_str(),cname.c_str());
800 <  TLegend* l = new TLegend(0.7,0.25+nbins*0.045,0.85,0.25);
801 <  
802 <  l->SetFillColor(10);
803 <  Color_t color=kBlack;
804 <  TMultiGraph* mg = new TMultiGraph();
805 <  
806 <  for (int ibin=0;ibin<nbins;ibin++) {
807 <    
808 <    TGraphErrors* g = gRsp[ibin];
809 <    l->AddEntry(g,get_bin_title(vartitle1,ibin,bins1).c_str(),"l");
810 <    while (color==kYellow||color==kWhite||color==10) color++;
811 <    g->SetMarkerColor(color);
812 <    g->SetLineColor(color);
813 <    g->SetMarkerStyle(kFullCircle);
814 <    g->SetMarkerSize(0.5);
815 <    mg->Add(g,"P");
816 <    
817 <    if (varname2=="Pt") {
818 <      string fname = "fitfnc"+cname;
819 <      TF1* fitfnc = new TF1(fname.c_str(),fitfncAsString.c_str(),1,get_xmax(g));
820 <
821 <      if (applyjes==0) {
822 <        fitfnc->SetParameter(0,0.4);
823 <        fitfnc->SetParameter(1,0.4);
824 <      }
825 <      else {
826 <        fitfnc->SetParameter(0,1.0);
827 <      }
828 <      
829 <      fitfnc->SetLineWidth(1);
830 <      fitfnc->SetLineColor(color);
831 <      g->Fit(fitfnc,"QR");
832 <  
833 <      if (fitcorr==0) {
834 <        if (ibin==nbins-1)
835 <          fout<<"# eta > "<<bins1.back()<<"\n999.9"<<endl;
836 <        else
837 <          fout<<"# eta < "<<bins1[ibin]<<"\n"<<bins1[ibin]<<endl;
838 <        for (int ipar=0;ipar<fitfnc->GetNpar();ipar++)
839 <          fout<<setw(12)<<fitfnc->GetParameter(ipar)<<" "
840 <              <<setw(12)<<fitfnc->GetParError(ipar)<<endl;
841 <        fout<<endl;
842 <      }
843 <      
844 <    }
845 <    
846 <    g->Write();
847 <    
848 <    color++;
849 <  }
850 <
851 <  if (fout.is_open()) fout.close();
852 <  
853 <  string mgtitle = jetalg+": Jet Response vs "+varname1+" and "+varname2;
854 <  mg->Draw("a");
855 <  mg->SetTitle(mgtitle.c_str());
856 <  mg->GetXaxis()->SetTitle(xtitle.c_str());
857 <  mg->GetYaxis()->SetTitle("E_{T}^{rec}/E_{T}^{gen}");
858 <  if (varname2=="Pt") mg->GetXaxis()->SetLimits(0.0,mg->GetXaxis()->GetXmax());
859 <  mg->SetMinimum(0.0);
860 <  mg->SetMaximum(1.1);
861 <  l->Draw();
862 <
863 <  c->Write();
661 >  if (nbins1==0) return;
662    
663 <  return c;
663 >  for (int i1=0;i1<nbins1;i1++)
664 >    replaceHistos(nbins2,hVar[i1],hEtCorr[i1],hAbsRsp[i1],hRelRsp[i1],tVar[i1]);
665 >  delete [] tVar;
666   }
667  
668  
669   //______________________________________________________________________________
670 < TCanvas* plotResolution(const vector<string>& jetalgs,
671 <                        const vector<TGraphErrors*> gSgm,
672 <                        const string& varname,const string& xtitle)
670 > void replaceHistos(int nbins1,int nbins2,int nbins3,
671 >                   TH1F****& hVar,TH1F****& hEtCorr,TH1F****&hAbsRsp,TH1F****&hRelRsp,
672 >                   TTree****& tVar)
673   {
674 <  string   cname = "SgmVs"+varname;
675 <  TCanvas* c     = new TCanvas(cname.c_str(),cname.c_str());
676 <  TLegend* l     = new TLegend(0.7,0.85-jetalgs.size()*0.045,0.85,0.85);
677 <  
678 <  l->SetFillColor(10);
879 <  Color_t color=kBlack;
880 <  TMultiGraph* mg = new TMultiGraph();
881 <  
882 <  for (unsigned int i=0;i<gSgm.size();i++) {
883 <    TGraphErrors* g = gSgm[i];
884 <    l->AddEntry(g,jetalgs[i].c_str(),"l");
885 <    while (color==kYellow||color==kWhite||color==10) color++;
886 <    g->SetMarkerColor(color);
887 <    g->SetLineColor(color);
888 <    g->SetMarkerStyle(kFullCircle);
889 <    g->SetMarkerSize(0.5);
890 <    mg->Add(g,"P");
891 <
892 <    if (varname=="Pt") {
893 <      string fname = "fitfnc"+cname;
894 <      TF1* fitfnc = new TF1(fname.c_str(),"sqrt([0]*[0]/x*x+[1]*[1]/x+[2]*[2])");
895 <      fitfnc->SetParameter(0,0.0);
896 <      fitfnc->SetParameter(1,0.5);
897 <      fitfnc->SetParameter(2,0.1);
898 <      fitfnc->SetLineWidth(1);
899 <      fitfnc->SetLineColor(color);
900 <      fitfnc->SetRange(2.0,get_xmax(g));
901 <      g->Fit(fitfnc,"QR");
902 <    }
903 <
904 <    g->Write();
905 <    
906 <    color++;
907 <  }
908 <  
909 <  string mgtitle = "Jet Resolution Vs "+varname;
910 <  mg->Draw("a");
911 <  mg->SetTitle(mgtitle.c_str());
912 <  mg->GetXaxis()->SetTitle(xtitle.c_str());
913 <  mg->GetYaxis()
914 <    ->SetTitle("#sigma(E_{T}^{rec}/E_{T}^{gen})/<E_{T}^{rec}/E_{T}^{gen}>");
915 <  if (varname=="Pt") mg->GetXaxis()->SetLimits(0.0,mg->GetXaxis()->GetXmax());
916 <  mg->SetMinimum(0.0);
917 <  mg->SetMaximum(0.5);
918 <  l->Draw();  
919 <  
920 <  c->Write();
921 <  
922 <  return c;
674 >  if (nbins1==0) return;
675 >  for (int i1=0;i1<nbins1;i1++)
676 >    replaceHistos(nbins2,nbins3,
677 >                  hVar[i1],hEtCorr[i1],hAbsRsp[i1],hRelRsp[i1],tVar[i1]);
678 >  delete [] tVar;
679   }
680  
681  
682   //______________________________________________________________________________
683 < TCanvas* plotResolution(const string& jetalg,const vector<float>& bins1,
928 <                        TGraphErrors** gSgm,
929 <                        const string& varname1,const string vartitle1,
930 <                        const string& varname2,const string& xtitle)
683 > void fitHistos(TH1F** histos,int n,double nsigma)
684   {
685 <  int      nbins = bins1.size()+1;
686 <  
687 <  string   cname = "SgmVs"+varname1+varname2+"_"+jetalg;
688 <  TCanvas* c     = new TCanvas(cname.c_str(),cname.c_str());
689 <  TLegend* l     = new TLegend(0.7,0.85-nbins*0.045,0.85,0.85);
690 <  
691 <  l->SetFillColor(10);
692 <  Color_t color=kBlack;
693 <  TMultiGraph* mg = new TMultiGraph();
694 <
695 <  for (int ibin=0;ibin<nbins;ibin++) {
943 <    TGraphErrors* g = gSgm[ibin];
944 <    l->AddEntry(g,get_bin_title(vartitle1,ibin,bins1).c_str(),"l");
945 <    while (color==kYellow||color==kWhite||color==10) color++;
946 <    g->SetMarkerColor(color);
947 <    g->SetLineColor(color);
948 <    g->SetMarkerStyle(kFullCircle);
949 <    g->SetMarkerSize(0.5);
950 <    mg->Add(g,"P");
951 <  
952 <    if (varname2=="Pt") {
953 <      string fname = "fitfnc"+cname;
954 <      TF1* fitfnc = new TF1(fname.c_str(),"sqrt([0]*[0]/x*x+[1]*[1]/x+[2]*[2])");
955 <      fitfnc->SetParameter(0,0.0);
956 <      fitfnc->SetParameter(1,0.5);
957 <      fitfnc->SetParameter(2,0.1);
958 <      fitfnc->SetLineWidth(1);
959 <      fitfnc->SetLineColor(color);
960 <      fitfnc->SetRange(2.0,get_xmax(g));
961 <      g->Fit(fitfnc,"QR");
962 <    }
963 <  
964 <    g->Write();
965 <    
966 <    color++;
685 >  for (int i=0;i<n;i++) {
686 >    float nrm  = histos[i]->Integral();
687 >    float mean = histos[i]->GetMean();
688 >    float rms  = histos[i]->GetRMS();
689 >    TF1* f = new TF1("gaus","gaus",mean-nsigma*rms,mean+nsigma*rms);
690 >    f->SetParameter(0,nrm);
691 >    f->SetParameter(1,mean);
692 >    f->SetParameter(2,rms);
693 >    f->SetLineWidth(1);
694 >    f->SetLineColor(kRed);
695 >    histos[i]->Fit(f,"QR"); // Avoid TCanvas?
696    }
968  
969  string mgtitle=jetalg+": Jet Resolution Vs "+varname1+" and "+varname2;
970  mg->Draw("a");
971  mg->SetTitle(mgtitle.c_str());
972  mg->GetXaxis()->SetTitle(xtitle.c_str());
973  mg->GetYaxis()
974    ->SetTitle("#sigma(E_{T}^{rec}/E_{T}^{gen})/<E_{T}^{rec}/E_{T}^{gen}>");
975  if (varname2=="Pt") mg->GetXaxis()->SetLimits(0.0,mg->GetXaxis()->GetXmax());
976  mg->SetMinimum(0.0);
977  mg->SetMaximum(0.5);
978  l->Draw();
979  
980  c->Write();
981  
982  return c;
697   }
698  
699  
700   //______________________________________________________________________________
701 < int get_ibin(const vector<float>& bins,float value)
701 > void fitHistos(TH1F*** histos,int n1,int n2,double nsigma)
702   {
703 <  int result(-1);
704 <  if      (value< bins.front()) result=0;
991 <  else if (value>=bins.back())  result=(int)bins.size();
992 <  else {
993 <    for (int i=0;i<(int)bins.size()-1;i++)
994 <      if (value>=bins[i]&&value<bins[i+1]) { result=i+1; break; }
995 <    if (result<0) cout<<"get_ibin: FATAL ERROR!"<<endl;
996 <  }
997 <  return result;
703 >  if (n1==0||n2==0) return;
704 >  for (int i1=0;i1<n1;i1++) fitHistos(histos[i1],n2,nsigma);
705   }
706  
707  
708   //______________________________________________________________________________
709 < string get_bin_name(const string& varname,int ibin,const vector<float>& bins)
709 > void fitHistos(TH1F**** histos,int n1,int n2,int n3,double nsigma)
710   {
711 <  stringstream ss;
712 <  ss<<varname<<":";
1006 <  if      (ibin==0) ss<<"lt"<<bins.front();
1007 <  else if (ibin==(int)bins.size()) ss<<"gt"<<bins.back();
1008 <  else ss<<bins[ibin-1]<<"to"<<bins[ibin];
1009 <  return ss.str();
711 >  if (n1==0||n2==0||n3==0) return;
712 >  for (int i1=0;i1<n1;i1++) fitHistos(histos[i1],n2,n3,nsigma);
713   }
714  
715  
716   //______________________________________________________________________________
717 < string get_bin_title(const string& varname,int ibin,const vector<float>& bins)
717 > void saveHistos(TH1F**& histos,int n)
718   {
719 <  stringstream ss;
720 <  if (ibin==0) ss<<varname<<" < "<<setw(4)<<bins.front();
721 <  else if (ibin==(int)bins.size()) ss<<varname<<" > "<<setw(4)<<bins.back();
722 <  else ss<<setw(4)<<bins[ibin-1]<<" #leq "+varname+" < "<<setw(4)<<bins[ibin];
723 <  return ss.str();
719 >  if (n==0) return;
720 >  for (int i=0;i<n;i++) {
721 >    histos[i]->Write();
722 >    delete histos[i];
723 >  }
724 >  delete [] histos;
725   }
726  
727  
728   //______________________________________________________________________________
729 < void get_bin_limits(float& min,float& max,int ibin,const vector<float>& bins)
729 > void saveHistos(TH1F***& histos,int n1,int n2)
730   {
731 <  if (ibin==0) {
732 <    min=0.0;
733 <    max=bins.front();
1030 <  }
1031 <  else if (ibin==(int)bins.size()) {
1032 <    min=bins.back();
1033 <    max=min+2.*(bins[ibin-1]-bins[ibin-2]);
1034 <  }
1035 <  else {
1036 <    min = bins[ibin-1];
1037 <    max = bins[ibin];
1038 <  }
731 >  if (n1==0) return;
732 >  for (int i1=0;i1<n1;i1++) saveHistos(histos[i1],n2);
733 >  delete [] histos;
734   }
735  
736  
737   //______________________________________________________________________________
738 < float get_xmax(TGraph* g)
738 > void saveHistos(TH1F****& histos,int n1,int n2,int n3)
739   {
740 <  float result(-1e200);
741 <  for (int i=0;i<g->GetN();++i) if (g->GetX()[i]>result) result=g->GetX()[i];
742 <  return result;
740 >  if (n1==0) return;
741 >  for (int i1=0;i1<n1;i1++) saveHistos(histos[i1],n2,n3);
742 >  delete [] histos;
743   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines