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.2 by schiefer, Tue Aug 21 06:42:45 2007 UTC vs.
Revision 1.13 by schiefer, Mon Sep 3 17:20:56 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines