ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/NonMCBackground/src/compute_fakes.cc
Revision: 1.3
Committed: Wed Jun 13 21:31:57 2012 UTC (12 years, 11 months ago) by dkralph
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -2 lines
Log Message:
tweaking the binning for fake rate compuations

File Contents

# User Rev Content
1 dkralph 1.1 #include "compute_fakes.h"
2    
3     //=== MAIN =================================================================================================
4 dkralph 1.2 void makeHTML(FOFlags &ctrl, const TString outDir);
5     TGraphAsymmErrors* computeFakeRate1D(const TH1D* hpass, const TH1D* htotal);
6 dkralph 1.1 void computeFakeRate2D(const TH2D *hpass, const TH2D* htotal,
7     TH2D *hresult, TH2D* herrl, TH2D* herrh);
8    
9     int main(int argc, char** argv)
10     {
11    
12     TString format("png");
13     Bool_t doAbsEta = kFALSE;
14 dkralph 1.2 TString seletype("ID mva + Iso mva");
15     TString tightness("loose");
16 dkralph 1.1
17     //
18     // args
19     //--------------------------------------------------------------------------------------------------------------
20     FOFlags ctrl;
21     parse_foargs( argc, argv, ctrl );
22     ctrl.dump();
23    
24     //--------------------------------------------------------------------------------------------------------------
25     // Settings
26     //==============================================================================================================
27    
28     // bin edges for kinematic variables
29     vector<Double_t> ptBinEdgesv;
30     vector<Double_t> etaBinEdgesv;
31     vector<Double_t> phiBinEdgesv;
32    
33 dkralph 1.2 ifstream ifs;
34     string line;
35    
36     // parse input information
37     TString ntupledir;
38     vector<TString> infiles;
39     ifs.open(ctrl.config); assert(ifs.is_open());
40     while(getline(ifs,line)) {
41     if(line[0]=='#') continue;
42     if(line[0]=='$') continue;
43    
44     stringstream ss(line);
45     if(line[0]=='^') {
46     TString dummy;
47     if(TString(line).Contains("^ntupdir")) ss >> dummy >> ntupledir;
48     // if(TString(line).Contains("^skim")) ss >> dummy >> ntupledir;
49     continue;
50     }
51    
52    
53     TString dataset;
54     ss >> dataset;
55     infiles.push_back(ntupledir+"/"+ctrl.faketype+"/"+dataset+"/merged.root");
56     }
57     ifs.close();
58 dkralph 1.1
59     vector<TString> fnamev;
60     vector<Int_t> colorv;
61     vector<TString> labelv;
62 dkralph 1.2
63     // parse FR config info
64 dkralph 1.3 ifs.open(ctrl.inputfile.c_str());
65 dkralph 1.1 assert(ifs.is_open());
66     Int_t state=0;
67     while(getline(ifs,line)) {
68     if(line[0]=='#') continue;
69     if(line[0]=='%') {
70     state++;
71     continue;
72     }
73    
74     if(state==0) {
75    
76     } else if(state==1) {
77     stringstream ss(line);
78     string fname;
79     Int_t color;
80     ss >> fname >> color;
81     string label = line.substr(line.find('@')+1);
82     // fnamev.push_back(fname);
83     fnamev.push_back(ctrl.inputdir); // not used!
84     colorv.push_back(color);
85     labelv.push_back(label);
86    
87     } else if(state>=2 && state<=4) {
88     Double_t edge;
89     stringstream ss(line);
90     ss >> edge;
91     if(state==2) { etaBinEdgesv.push_back(edge); }
92     else if(state==3) { ptBinEdgesv.push_back(edge); }
93     else if(state==4) { phiBinEdgesv.push_back(edge); }
94     }
95     }
96     ifs.close();
97    
98     //--------------------------------------------------------------------------------------------------------------
99     // Main analysis code
100     //==============================================================================================================
101    
102     //
103     // Set up histograms
104     //
105 dkralph 1.2 TH1D *hNumerPt0=0, *hNumerEta0=0, *hNumerPhi0=0;
106     TH1D *hDenomPt0=0, *hDenomEta0=0, *hDenomPhi0=0;
107 dkralph 1.1
108 dkralph 1.2 vector<TH1D*> hNumerPtv;
109     vector<TH1D*> hNumerEtav;
110     vector<TH1D*> hNumerPhiv;
111    
112     vector<TH1D*> hDenomPtv;
113     vector<TH1D*> hDenomEtav;
114     vector<TH1D*> hDenomPhiv;
115 dkralph 1.1
116     vector<TGraphAsymmErrors*> effPtv;
117     vector<TGraphAsymmErrors*> effEtav;
118     vector<TGraphAsymmErrors*> effPhiv;
119    
120     vector<TH2D*> hNumerEtaPtv, hDenomEtaPtv, hEffEtaPtv, hErrlEtaPtv, hErrhEtaPtv;
121    
122     Int_t nbins = ptBinEdgesv.size()-1;
123     Double_t *ptbinning = new Double_t[ptBinEdgesv.size()];
124     for(UInt_t i=0; i<ptBinEdgesv.size(); i++) { ptbinning[i] = ptBinEdgesv[i]; }
125 dkralph 1.2 hNumerPt0 = new TH1D("hNumerPt0","",nbins,ptbinning);
126     hDenomPt0 = new TH1D("hDenomPt0","",nbins,ptbinning);
127 dkralph 1.1 for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) {
128     char hname[100];
129 dkralph 1.2 sprintf(hname,"hNumerPt_%i",ifile); hNumerPtv.push_back(new TH1D(hname,"",nbins,ptbinning)); hNumerPtv[ifile]->Sumw2();
130     sprintf(hname,"hDenomPt_%i",ifile); hDenomPtv.push_back(new TH1D(hname,"",nbins,ptbinning)); hDenomPtv[ifile]->Sumw2();
131 dkralph 1.1 }
132    
133     nbins = etaBinEdgesv.size()-1;
134     Double_t *etabinning = new Double_t[etaBinEdgesv.size()];
135     for(UInt_t i=0; i<etaBinEdgesv.size(); i++) { etabinning[i] = etaBinEdgesv[i]; }
136 dkralph 1.2 hNumerEta0 = new TH1D("hNumerEta0","",nbins,etabinning);
137     hDenomEta0 = new TH1D("hDenomEta0","",nbins,etabinning);
138 dkralph 1.1 for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) {
139     char hname[100];
140 dkralph 1.2 sprintf(hname,"hNumerEta_%i",ifile); hNumerEtav.push_back(new TH1D(hname,"",nbins,etabinning)); hNumerEtav[ifile]->Sumw2();
141     sprintf(hname,"hDenomEta_%i",ifile); hDenomEtav.push_back(new TH1D(hname,"",nbins,etabinning)); hDenomEtav[ifile]->Sumw2();
142 dkralph 1.1 }
143    
144     nbins = phiBinEdgesv.size()-1;
145     Double_t *phibinning = new Double_t[phiBinEdgesv.size()];
146     for(UInt_t i=0; i<phiBinEdgesv.size(); i++) { phibinning[i] = phiBinEdgesv[i]; }
147 dkralph 1.2 hNumerPhi0 = new TH1D("hNumerPhi0","",nbins,phibinning);
148     hDenomPhi0 = new TH1D("hDenomPhi0","",nbins,phibinning);
149 dkralph 1.1 for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) {
150     char hname[100];
151 dkralph 1.2 sprintf(hname,"hNumerPhi_%i",ifile); hNumerPhiv.push_back(new TH1D(hname,"",nbins,phibinning)); hNumerPhiv[ifile]->Sumw2();
152     sprintf(hname,"hDenomPhi_%i",ifile); hDenomPhiv.push_back(new TH1D(hname,"",nbins,phibinning)); hDenomPhiv[ifile]->Sumw2();
153 dkralph 1.1 }
154    
155     for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) {
156     char hname[100];
157     sprintf(hname,"hNumerEtaPt_%i",ifile);
158     hNumerEtaPtv.push_back(new TH2D(hname,"",etaBinEdgesv.size()-1,etabinning,ptBinEdgesv.size()-1,ptbinning));
159     hNumerEtaPtv[ifile]->Sumw2();
160    
161     sprintf(hname,"hDenomEtaPt_%i",ifile);
162     hDenomEtaPtv.push_back(new TH2D(hname,"",etaBinEdgesv.size()-1,etabinning,ptBinEdgesv.size()-1,ptbinning));
163     hDenomEtaPtv[ifile]->Sumw2();
164    
165     sprintf(hname,"hEffEtaPt_%i",ifile);
166     hEffEtaPtv.push_back(new TH2D(hname,"",etaBinEdgesv.size()-1,etabinning,ptBinEdgesv.size()-1,ptbinning));
167     hEffEtaPtv[ifile]->Sumw2();
168    
169     sprintf(hname,"hErrlEtaPt_%i",ifile);
170     hErrlEtaPtv.push_back(new TH2D(hname,"",etaBinEdgesv.size()-1,etabinning,ptBinEdgesv.size()-1,ptbinning));
171     hErrlEtaPtv[ifile]->Sumw2();
172    
173     sprintf(hname,"hErrhEtaPt_%i",ifile);
174     hErrhEtaPtv.push_back(new TH2D(hname,"",etaBinEdgesv.size()-1,etabinning,ptBinEdgesv.size()-1,ptbinning));
175     hErrhEtaPtv[ifile]->Sumw2();
176     }
177    
178     delete [] ptbinning;
179     delete [] etabinning;
180     delete [] phibinning;
181    
182     TChain *inchain = new TChain("FO","FO");
183 dkralph 1.2 for(unsigned ifile=0; ifile<infiles.size(); ifile++) {
184     cout << "Adding: " << infiles[ifile] << "... " << endl;
185     inchain->Add(infiles[ifile]);
186     }
187    
188     Double_t yhigh1 = 3*(double(inchain->GetEntries("pass")) / inchain->GetEntries());
189 dkralph 1.1
190     Float_t pt,eta,phi,pass,jpt;
191     inchain->SetBranchAddress( "pt", &pt);
192     inchain->SetBranchAddress( "eta", &eta);
193     inchain->SetBranchAddress( "phi", &phi);
194     inchain->SetBranchAddress( "pass", &pass);
195     inchain->SetBranchAddress( "jpt", &jpt);
196    
197     for(UInt_t ientry=0; ientry<inchain->GetEntries(); ientry++) {
198     inchain->GetEntry(ientry);
199    
200     if(pt < ptBinEdgesv.front() || pt > ptBinEdgesv.back()) continue;
201     if(doAbsEta) {
202     if(fabs(eta) < etaBinEdgesv.front() || fabs(eta) > etaBinEdgesv.back()) continue;
203     } else {
204     if(eta < etaBinEdgesv.front() || eta > etaBinEdgesv.back()) continue;
205     }
206    
207     double weight = 1;
208    
209     hDenomPt0 ->Fill(pt,weight);
210     hDenomEta0->Fill(doAbsEta ? fabs(eta) : eta,weight);
211    
212     hDenomPtv[0] ->Fill(pt,weight);
213     hDenomEtav[0]->Fill(doAbsEta ? fabs(eta) : eta,weight);
214     hDenomEtaPtv[0]->Fill(doAbsEta ? fabs(eta) : eta,pt,weight);
215    
216     if(pass) {
217     hNumerPt0 ->Fill(pt,weight);
218     hNumerEta0->Fill(doAbsEta ? fabs(eta) : eta,weight);
219    
220     hNumerPtv[0] ->Fill(pt,weight);
221     hNumerEtav[0]->Fill(doAbsEta ? fabs(eta) : eta,weight);
222     hNumerEtaPtv[0]->Fill(doAbsEta ? fabs(eta) : eta,pt,weight);
223     }
224    
225     }
226    
227     TGraphAsymmErrors *frPt = computeFakeRate1D(hNumerPtv[0],hDenomPtv[0]);
228     TGraphAsymmErrors *frEta = computeFakeRate1D(hNumerEtav[0],hDenomEtav[0]);
229    
230     computeFakeRate2D(hNumerEtaPtv[0],hDenomEtaPtv[0],hEffEtaPtv[0],hErrlEtaPtv[0],hErrhEtaPtv[0]);
231    
232     TH2D *frEtaPt = (TH2D*)hEffEtaPtv[0]->Clone("frEtaPt");
233     TH2D *errlEtaPt = (TH2D*)hErrlEtaPtv[0]->Clone("errlEtaPt");
234     TH2D *errhEtaPt = (TH2D*)hErrhEtaPtv[0]->Clone("errhEtaPt");
235    
236     //--------------------------------------------------------------------------------------------------------------
237     // Make plots
238     //==============================================================================================================
239     TCanvas *c = new TCanvas("c","c",800,600);
240     char ylabel[100];
241     TString etalabel = (doAbsEta) ? "#scale[1.3]{|#eta|}" : "#scale[1.3]{#eta}";
242    
243     //
244     // Denominator distributions
245     //
246     sprintf(ylabel,"Events / %.1f GeV/c",hDenomPtv[0]->GetBinWidth(1));
247 dkralph 1.2 CPlot plotDenomPt("denompt","","denominator p_{T} [GeV/c]",ylabel,ctrl.outdir+"/plots");
248 dkralph 1.1 for(UInt_t ifile=0; ifile<1; ifile++) {
249     plotDenomPt.AddToStack(hDenomPtv[ifile],labelv[ifile],colorv[ifile]);
250     }
251     plotDenomPt.TransLegend(0.1,0);
252     plotDenomPt.Draw(c,kTRUE,format);
253    
254     plotDenomPt.SetName("denomptlog");
255     // plotDenomPt.SetLogy();
256     plotDenomPt.Draw(c,kTRUE,format);
257    
258     sprintf(ylabel,"Events / %.1f",hDenomEtav[0]->GetBinWidth(1));
259 dkralph 1.2 CPlot plotDenomEta("denometa","","denominator #eta",ylabel,ctrl.outdir+"/plots");
260 dkralph 1.1 for(UInt_t ifile=0; ifile<1; ifile++) {
261     plotDenomEta.AddToStack(hDenomEtav[ifile],labelv[ifile],colorv[ifile]);
262     }
263     plotDenomEta.SetYRange(0,2.0*(plotDenomEta.GetStack()->GetMaximum()));
264     plotDenomEta.Draw(c,kTRUE,format);
265    
266     //
267     // Numerator distributions
268     //
269     sprintf(ylabel,"Events / %.1f GeV/c",hNumerPtv[0]->GetBinWidth(1));
270 dkralph 1.2 CPlot plotNumerPt("numerpt","","numerator p_{T} [GeV/c]",ylabel,ctrl.outdir+"/plots");
271 dkralph 1.1 for(UInt_t ifile=0; ifile<1; ifile++) {
272     plotNumerPt.AddToStack(hNumerPtv[ifile],labelv[ifile],colorv[ifile]);
273     }
274     plotNumerPt.TransLegend(0.1,0);
275     plotNumerPt.Draw(c,kTRUE,format);
276    
277     plotNumerPt.SetName("numerptlog");
278     // plotNumerPt.SetLogy();
279     plotNumerPt.Draw(c,kTRUE,format);
280    
281     sprintf(ylabel,"Events / %.1f",hNumerEtav[0]->GetBinWidth(1));
282 dkralph 1.2 CPlot plotNumerEta("numereta","","numerator #eta",ylabel,ctrl.outdir+"/plots");
283 dkralph 1.1 for(UInt_t ifile=0; ifile<1; ifile++) {
284     plotNumerEta.AddToStack(hNumerEtav[ifile],labelv[ifile],colorv[ifile]);
285     }
286     plotNumerEta.SetYRange(0,2.0*(plotNumerEta.GetStack()->GetMaximum()));
287     plotNumerEta.Draw(c,kTRUE,format);
288    
289     //
290     // Fakeable object kinematic distributions
291     //
292     sprintf(ylabel,"Events / %.1f GeV/c",hDenomPt0->GetBinWidth(1));
293 dkralph 1.2 CPlot plotPt("pt","","p_{T} [GeV/c]",ylabel,ctrl.outdir+"/plots");
294 dkralph 1.1 plotPt.AddHist1D(hDenomPt0,"loose","hist",kBlue,7);
295     plotPt.AddHist1D(hNumerPt0,"tight","hist",kRed);
296     plotPt.TransLegend(0.1,0);
297     plotPt.Draw(c,kTRUE,format);
298    
299     plotPt.SetName("ptlog");
300     plotPt.SetYRange(1e-4*(hDenomPt0->GetMaximum()),10*(hDenomPt0->GetMaximum()));
301     // plotPt.SetLogy();
302     plotPt.Draw(c,kTRUE,format);
303    
304     sprintf(ylabel,"Events / %.1f",hDenomEta0->GetBinWidth(1));
305 dkralph 1.2 CPlot plotEta("eta","","#eta",ylabel,ctrl.outdir+"/plots");
306 dkralph 1.1 plotEta.AddHist1D(hDenomEta0,"loose","hist",kBlue,7);
307     plotEta.AddHist1D(hNumerEta0,"tight","hist",kRed);
308     plotEta.SetYRange(0,2.0*(hDenomEta0->GetMaximum()));
309     plotEta.Draw(c,kTRUE,format);
310    
311     //
312     // Fake rate plots
313     //
314 dkralph 1.2 CPlot plotFRPt("frpt","","#scale[1.3]{p_{T} [GeV/c]}","#scale[1.5]{#varepsilon_{fake}}",ctrl.outdir+"/plots");
315 dkralph 1.1 plotFRPt.AddGraph(frPt,"");
316     plotFRPt.SetYRange(0,yhigh1);
317     plotFRPt.AddTextBox(seletype+" "+tightness,0.25,0.75,0.45,0.85);
318     plotFRPt.Draw(c,kTRUE,format);
319    
320 dkralph 1.2 CPlot plotFREta("freta","",etalabel,"#scale[1.5]{#varepsilon_{fake}}",ctrl.outdir+"/plots");
321 dkralph 1.1 plotFREta.AddGraph(frEta,"");
322     plotFREta.SetYRange(0,yhigh1);
323     plotFREta.AddTextBox(seletype+" "+tightness,0.25,0.75,0.45,0.85);
324     plotFREta.Draw(c,kTRUE,format);
325    
326     // gStyle->SetPalette(1);
327     c->SetRightMargin(0.15);
328     c->SetLeftMargin(0.15);
329     frEtaPt->SetTitleOffset(1.2,"Y");
330     // TPaletteAxis *paxis = (TPaletteAxis*)frEtaPt->GetListOfFunctions()->FindObject("palette");
331     // paxis->SetX1NDC(0.87);
332     // paxis->SetX2NDC(0.92);
333 dkralph 1.2 CPlot plotFRPtEta("frpteta","",etalabel,"p_{T} [GeV/c]",ctrl.outdir+"/plots");
334 dkralph 1.1 plotFRPtEta.AddHist2D(frEtaPt,"COLZ");
335     plotFRPtEta.Draw(c,kTRUE,format);
336    
337     //--------------------------------------------------------------------------------------------------------------
338     // Summary print out
339     //==============================================================================================================
340    
341 dkralph 1.2 TFile outfile(ctrl.outdir + TString("/fr.root"),"RECREATE");
342 dkralph 1.1 frPt->Write();
343     frEta->Write();
344     frEtaPt->Write();
345     errlEtaPt->Write();
346     errhEtaPt->Write();
347     outfile.Close();
348    
349 dkralph 1.2 makeHTML(ctrl,ctrl.outdir);
350 dkralph 1.1
351 dkralph 1.2 cout << " <> Output saved in " << ctrl.outdir << "/" << endl;
352 dkralph 1.1 cout << endl;
353     }
354    
355    
356     //=== FUNCTION DEFINITIONS ======================================================================================
357    
358     //--------------------------------------------------------------------------------------------------
359 dkralph 1.2 TGraphAsymmErrors* computeFakeRate1D(const TH1D* hpass, const TH1D* htotal)
360 dkralph 1.1 {
361     const Int_t nbins = htotal->GetNbinsX();
362     Double_t xval[nbins], xerr[nbins], yval[nbins], yerrl[nbins], yerrh[nbins];
363     for(Int_t ibin=1; ibin<=nbins; ibin++) {
364     xval[ibin-1] = htotal->GetBinCenter(ibin);
365     xerr[ibin-1] = 0.5*htotal->GetBinWidth(ibin);
366    
367     Int_t total = htotal->GetBinContent(ibin);
368     Int_t passed = hpass->GetBinContent(ibin);
369     yval[ibin-1] = (total>0) ? (Double_t)passed/(Double_t)total : 0;
370     yerrl[ibin-1] = (total>0) ? yval[ibin-1] - TEfficiency::ClopperPearson(total,passed,0.68269,kFALSE) : 0;
371     yerrh[ibin-1] = (total>0) ? TEfficiency::ClopperPearson(total,passed,0.68269,kTRUE) - yval[ibin-1] : 0;
372     }
373    
374     return new TGraphAsymmErrors(nbins,xval,yval,xerr,xerr,yerrl,yerrh);
375     }
376    
377     //--------------------------------------------------------------------------------------------------
378     void computeFakeRate2D(const TH2D *hpass, const TH2D* htotal,
379     TH2D *hresult, TH2D* herrl, TH2D* herrh)
380     {
381     assert(hresult);
382     assert(herrl);
383     assert(herrh);
384    
385     const Int_t nbinsx = htotal->GetNbinsX();
386     const Int_t nbinsy = htotal->GetNbinsY();
387     for(Int_t ix=1; ix<=nbinsx; ix++) {
388     for(Int_t iy=1; iy<=nbinsy; iy++) {
389     Int_t total = htotal->GetCellContent(ix,iy);
390     Int_t passed = hpass->GetCellContent(ix,iy);
391     Double_t eff = (total>0) ? (Double_t)passed/(Double_t)total : 0;
392     Double_t errl = (total>0) ? eff - TEfficiency::ClopperPearson(total,passed,0.68269,kFALSE) : 0;
393     Double_t errh = (total>0) ? TEfficiency::ClopperPearson(total,passed,0.68269,kTRUE) - eff : 0;
394     hresult->SetCellContent(ix,iy,eff);
395     herrl ->SetCellContent(ix,iy,errl);
396     herrh ->SetCellContent(ix,iy,errh);
397     }
398     }
399     }
400    
401     //--------------------------------------------------------------------------------------------------
402 dkralph 1.2 void makeHTML(FOFlags &ctrl, const TString outDir)
403 dkralph 1.1 {
404 dkralph 1.2 TString title(ctrl.inputdir);
405     title = title(title.Last('/')+1,title.Length());
406 dkralph 1.1 ofstream htmlfile;
407     char htmlfname[100];
408     sprintf(htmlfname,"%s/fr.html",outDir.Data());
409     htmlfile.open(htmlfname);
410 dkralph 1.2
411 dkralph 1.1 htmlfile << "<!DOCTYPE html" << endl;
412     htmlfile << " PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
413     htmlfile << "<html>" << endl;
414    
415 dkralph 1.2 htmlfile << "<head><title>"+title+"</title></head>" << endl;
416 dkralph 1.1 htmlfile << "<body bgcolor=\"EEEEEE\">" << endl;
417 dkralph 1.2 htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">"+title+"</h3>" << endl;
418 dkralph 1.1
419     htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;
420     htmlfile << "<tr>" << endl;
421     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frpteta.png\"><img src=\"plots/frpteta.png\" alt=\"plots/frpteta.png\" width=\"100%\"></a></td>" << endl;
422     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frpt.png\"><img src=\"plots/frpt.png\" alt=\"plots/frpt.png\" width=\"100%\"></a></td>" << endl;
423     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/freta.png\"><img src=\"plots/freta.png\" alt=\"plots/freta.png\" width=\"100%\"></a></td>" << endl;
424 dkralph 1.2 // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frphi.png\"><img src=\"plots/frphi.png\" alt=\"plots/frphi.png\" width=\"100%\"></a></td>" << endl;
425 dkralph 1.1 htmlfile << "</tr>" << endl;
426     htmlfile << "<tr>" << endl;
427 dkralph 1.2 // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frnpv.png\"><img src=\"plots/frnpv.png\" alt=\"plots/frnpv.png\" width=\"100%\"></a></td>" << endl;
428     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frptnpv.png\"><img src=\"plots/frptnpv.png\" alt=\"plots/frptnpv.png\" width=\"100%\"></a></td>" << endl;
429     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fretanpv.png\"><img src=\"plots/fretanpv.png\" alt=\"plots/fretanpv.png\" width=\"100%\"></a></td>" << endl;
430     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frphinpv.png\"><img src=\"plots/frphinpv.png\" alt=\"plots/frphinpv.png\" width=\"100%\"></a></td>" << endl;
431 dkralph 1.1 htmlfile << "</tr>" << endl;
432     htmlfile << "</table>" << endl;
433     htmlfile << "<hr />" << endl;
434    
435     htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;
436     htmlfile << "<tr>" << endl;
437     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/denompt.png\"><img src=\"plots/denompt.png\" alt=\"plots/denompt.png\" width=\"100%\"></a></td>" << endl;
438     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/denomptlog.png\"><img src=\"plots/denomptlog.png\" alt=\"plots/denomptlog.png\" width=\"100%\"></a></td>" << endl;
439     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/denometa.png\"><img src=\"plots/denometa.png\" alt=\"plots/denometa.png\" width=\"100%\"></a></td>" << endl;
440 dkralph 1.2 // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/denomphi.png\"><img src=\"plots/denomphi.png\" alt=\"plots/denomphi.png\" width=\"100%\"></a></td>" << endl;
441 dkralph 1.1 htmlfile << "</tr>" << endl;
442     htmlfile << "<tr>" << endl;
443     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/numerpt.png\"><img src=\"plots/numerpt.png\" alt=\"plots/numerpt.png\" width=\"100%\"></a></td>" << endl;
444     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/numerptlog.png\"><img src=\"plots/numerptlog.png\" alt=\"plots/numerptlog.png\" width=\"100%\"></a></td>" << endl;
445     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/numereta.png\"><img src=\"plots/numereta.png\" alt=\"plots/numereta.png\" width=\"100%\"></a></td>" << endl;
446 dkralph 1.2 // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/numerphi.png\"><img src=\"plots/numerphi.png\" alt=\"plots/numerphi.png\" width=\"100%\"></a></td>" << endl;
447 dkralph 1.1 htmlfile << "</tr>" << endl;
448     htmlfile << "<tr>" << endl;
449     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt.png\"><img src=\"plots/pt.png\" alt=\"plots/pt.png\" width=\"100%\"></a></td>" << endl;
450     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ptlog.png\"><img src=\"plots/ptlog.png\" alt=\"plots/ptlog.png\" width=\"100%\"></a></td>" << endl;
451     htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta.png\"><img src=\"plots/eta.png\" alt=\"plots/eta.png\" width=\"100%\"></a></td>" << endl;
452 dkralph 1.2 // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/phi.png\"><img src=\"plots/phi.png\" alt=\"plots/phi.png\" width=\"100%\"></a></td>" << endl;
453 dkralph 1.1 htmlfile << "</tr>" << endl;
454     htmlfile << "</table>" << endl;
455     htmlfile << "<hr />" << endl;
456    
457     htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;
458 dkralph 1.2 // htmlfile << "<tr>" << endl;
459     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/jetpt.png\"><img src=\"plots/jetpt.png\" alt=\"plots/jetpt.png\" width=\"100%\"></a></td>" << endl;
460     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/jetptlog.png\"><img src=\"plots/jetptlog.png\" alt=\"plots/jetptlog.png\" width=\"100%\"></a></td>" << endl;
461     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frjetpt.png\"><img src=\"plots/frjetpt.png\" alt=\"plots/frjetpt.png\" width=\"100%\"></a></td>" << endl;
462     // htmlfile << "<td width=\"25%\"></td>" << endl;
463     // htmlfile << "</tr>" << endl;
464     // htmlfile << "<tr>" << endl;
465     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fojetpt.png\"><img src=\"plots/fojetpt.png\" alt=\"plots/fojetpt.png\" width=\"100%\"></a></td>" << endl;
466     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fojetptlog.png\"><img src=\"plots/fojetptlog.png\" alt=\"plots/fojetptlog.png\" width=\"100%\"></a></td>" << endl;
467     // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/frfojetpt.png\"><img src=\"plots/frfojetpt.png\" alt=\"plots/frfojetpt.png\" width=\"100%\"></a></td>" << endl;
468     // htmlfile << "<td width=\"25%\"></td>" << endl;
469     // htmlfile << "</tr>" << endl;
470 dkralph 1.1 htmlfile << "</table>" << endl;
471     htmlfile << "<hr />" << endl;
472    
473     htmlfile << "</body>" << endl;
474     htmlfile << "</html>" << endl;
475     htmlfile.close();
476     }