ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Common/CPlot.cc
Revision: 1.2
Committed: Tue Jul 26 07:18:45 2011 UTC (13 years, 9 months ago) by dkralph
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +42 -24 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 dkralph 1.1 #include "CPlot.hh"
2     #include <TLatex.h>
3    
4     CPlot::CPlot()
5     {
6     TString name = "plot";
7     name += sCount;
8     CPlot(name,"","","");
9     }
10    
11     CPlot::CPlot(TString name, TString title, TString xtitle, TString ytitle):
12     fStack(0),
13     fName(name),
14     fTitle(title),
15     fXTitle(xtitle),
16     fYTitle(ytitle),
17     fXmin(0),
18     fXmax(0),
19     fYmin(0),
20     fYmax(0),
21     fLogx(0),
22     fLogy(0),
23     fGridx(0),
24     fGridy(0),
25     fRebin(1),
26     fLeg(0),
27     fShowStats(0),
28     fStatsX(0.68),
29     fStatsY(0.90),
30     fRooPlot(0)
31     {
32     sCount++;
33     }
34    
35     CPlot::CPlot(TString name, RooPlot* frame, TString title, TString xtitle, TString ytitle):
36     fStack(0),
37     fName(name),
38     fTitle(title),
39     fXTitle(xtitle),
40     fYTitle(ytitle),
41     fXmin(0),
42     fXmax(0),
43     fYmin(0),
44     fYmax(0),
45     fLogx(0),
46     fLogy(0),
47     fGridx(0),
48     fGridy(0),
49     fRebin(1),
50     fLeg(0),
51     fShowStats(0),
52     fStatsX(0.68),
53     fStatsY(0.90),
54     fRooPlot(frame)
55     {
56     fRooPlot->SetTitle(title);
57     fRooPlot->GetXaxis()->SetTitle(xtitle);
58     fRooPlot->GetYaxis()->SetTitle(ytitle);
59     sCount++;
60     }
61    
62    
63     //--------------------------------------------------------------------------------------------------
64 dkralph 1.2 void CPlot::AddHist1D(TH1F *h, TString drawopt, int color, int linesty, int fillsty, int linecolor)
65 dkralph 1.1 {
66     if(!h)
67     return;
68    
69 dkralph 1.2 if(linecolor==0)
70     h->SetLineColor(color);
71     else
72     h->SetLineColor(linecolor);
73 dkralph 1.1 h->SetLineStyle(linesty);
74     h->SetFillColor(color);
75     h->SetFillStyle(fillsty);
76    
77     if(drawopt.CompareTo("E",TString::kIgnoreCase)==0)
78     h->SetMarkerSize(0.9);
79    
80     CPlotItem item;
81     item.hist1D = h;
82     item.drawopt = drawopt;
83     fItems.push_back(item);
84     }
85    
86     void CPlot::AddHist1D(TH1F *h, TString label, TString drawopt, int color, int linesty, int fillsty)
87     {
88     if(!h)
89     return;
90    
91     if(!fLeg)
92     fLeg = new TLegend(0.6,0.84,0.93,0.9);
93     else
94     fLeg->SetY1(fLeg->GetY1()-0.06);
95    
96     if(drawopt.CompareTo("E",TString::kIgnoreCase)==0) {
97     //fLeg->AddEntry(h,label,"P");
98     fLeg->AddEntry(h,label,"PL");
99     h->SetMarkerSize(0.9);
100     } else {
101     if(fillsty>0) fLeg->AddEntry(h,label,"F");
102     else fLeg->AddEntry(h,label,"L");
103     }
104    
105     AddHist1D(h,drawopt,color,linesty,fillsty);
106     }
107    
108     void CPlot::AddHist1D(TFile *f, TString histName, TString drawopt, int color, int linesty, int fillsty)
109     {
110     if(!f)
111     return;
112    
113     TH1F *h = (TH1F*)f->FindObjectAny(histName);
114     AddHist1D(h,drawopt,color,linesty,fillsty);
115     }
116    
117     void CPlot::AddHist1D(TFile *f, TString histName, TString label, TString drawopt, int color, int linesty, int fillsty)
118     {
119     if(!f)
120     return;
121    
122     TH1F *h = (TH1F*)f->FindObjectAny(histName);
123     AddHist1D(h,label,drawopt,color,linesty,fillsty);
124     }
125    
126     //--------------------------------------------------------------------------------------------------
127     void CPlot::AddToStack(TH1F *h, int color)
128     {
129     if(!h)
130     return;
131    
132     if(!fStack)
133     fStack = new THStack(fName+TString("_stack"),"");
134    
135     fStack->Add(h);
136     AddHist1D(h,"",color,1,1001);
137     }
138    
139 dkralph 1.2 void CPlot::AddToStack(TH1F *h, TString label, int color, int linecolor,
140     int linestyle, int linewidth, int fillstyle)
141 dkralph 1.1 {
142     if(!h)
143     return;
144    
145     if(!fStack)
146     fStack = new THStack(fName+TString("_stack"),"");
147    
148     if(!fLeg)
149     fLeg = new TLegend(0.6,0.84,0.93,0.9);
150     else
151     fLeg->SetY1(fLeg->GetY1()-0.06);
152    
153     // make legend entries appear in reverse of the order the histograms are added
154 dkralph 1.2 if(label.Length()>0) {
155     fStackEntries.push_back(fLeg->AddEntry(h,label,"F"));
156     for(Int_t ientry=(fStackEntries.size()-2); ientry>=0; ientry--) {
157     TObject* hh = fStackEntries[ientry]->GetObject();
158     TString ll = fStackEntries[ientry]->GetLabel();
159     fStackEntries[ientry+1]->SetObject(hh);
160     fStackEntries[ientry+1]->SetLabel(ll);
161     }
162     fStackEntries[0]->SetObject(h);
163     fStackEntries[0]->SetLabel(label);
164 dkralph 1.1 }
165    
166     fStack->Add(h);
167 dkralph 1.2
168     h->SetLineColor(linecolor);
169     h->SetLineStyle(linestyle);
170     h->SetLineWidth(linewidth);
171     h->SetFillStyle(fillstyle);
172    
173     AddHist1D(h,"",color,linestyle,fillstyle,linecolor);
174     // cout << h->GetLineColor() << " " << h->GetLineStyle() << " " << h->GetLineWidth() << endl;
175 dkralph 1.1 }
176    
177     void CPlot::AddToStack(TFile *f, TString histName, int color)
178     {
179     if(!f)
180     return;
181    
182     TH1F *h = (TH1F*)f->FindObjectAny(histName);
183     AddToStack(h,color);
184     }
185    
186     void CPlot::AddToStack(TFile *f, TString histName, TString label, int color)
187     {
188     if(!f)
189     return;
190    
191     TH1F *h = (TH1F*)f->FindObjectAny(histName);
192     AddToStack(h,label,color);
193     }
194    
195     //--------------------------------------------------------------------------------------------------
196 dkralph 1.2 void CPlot::AddHist2D(TH2D *h, TString drawopt, int fillcolor, int linecolor)
197 dkralph 1.1 {
198     if(!h)
199     return;
200    
201     h->SetLineColor(linecolor);
202     h->SetFillColor(fillcolor);
203     h->SetMarkerStyle(kFullDotMedium);
204    
205     CPlotItem item;
206     item.hist2D = h;
207     item.drawopt = drawopt;
208     fItems.push_back(item);
209     }
210    
211     void CPlot::AddHist2D(TFile *f, TString histName, TString drawopt, int fillcolor, int linecolor)
212     {
213     if(!f)
214     return;
215    
216 dkralph 1.2 TH2D *h = (TH2D*)f->FindObjectAny(histName);
217 dkralph 1.1 AddHist2D(h,drawopt,linecolor,fillcolor);
218     }
219    
220     //--------------------------------------------------------------------------------------------------
221     void CPlot::AddGraph(TGraph *gr, TString drawopt, int color, int marksty, int linesty)
222     {
223     if(!gr)
224     return;
225    
226     gr->SetMarkerColor(color);
227     gr->SetLineColor(color);
228     gr->SetLineStyle(linesty);
229     gr->SetLineWidth(2);
230     gr->SetMarkerStyle(marksty);
231     gr->SetMarkerSize(1.2);
232 dkralph 1.2
233     if(gr->GetN()==1) gr->SetMarkerSize(3.5);
234 dkralph 1.1
235     CPlotItem item;
236     item.graph = gr;
237     item.drawopt = drawopt;
238     fItems.push_back(item);
239     }
240    
241     void CPlot::AddGraph(TGraph *gr, TString label, TString drawopt, int color, int marksty, int linesty)
242     {
243     if(!gr)
244     return;
245    
246     if(!fLeg)
247     fLeg = new TLegend(0.6,0.84,0.93,0.9);
248     else
249     fLeg->SetY1(fLeg->GetY1()-0.06);
250 dkralph 1.2 if( (drawopt.Contains("L",TString::kIgnoreCase) ||
251     drawopt.Contains("C",TString::kIgnoreCase))
252     && !(drawopt.Contains("P",TString::kIgnoreCase)) ) {
253     fLeg->AddEntry(gr,label,"L");
254 dkralph 1.1 } else {
255 dkralph 1.2 fLeg->AddEntry(gr,label,"LP");
256 dkralph 1.1 }
257    
258     AddGraph(gr,drawopt,color,marksty,linesty);
259     }
260    
261     void CPlot::AddGraph(TFile *f, TString grName, TString drawopt, int color, int marksty, int linesty)
262     {
263     if(!f)
264     return;
265    
266     TGraph *gr = (TGraph*)f->FindObjectAny(grName);
267     AddGraph(gr,drawopt,color,marksty,linesty);
268     }
269    
270     void CPlot::AddGraph(TFile *f, TString grName, TString label, TString drawopt, int color, int marksty, int linesty)
271     {
272     if(!f)
273     return;
274    
275     TGraph *gr = (TGraph*)f->FindObjectAny(grName);
276     AddGraph(gr,label,drawopt,color,marksty,linesty);
277     }
278    
279     //--------------------------------------------------------------------------------------------------
280     void CPlot::AddProfile(TProfile *pr, TString drawopt, int color, int marksty, int linesty)
281     {
282     if(!pr)
283     return;
284    
285     pr->SetMarkerColor(color);
286     pr->SetLineColor(color);
287     pr->SetLineStyle(linesty);
288     pr->SetLineWidth(2);
289     pr->SetMarkerStyle(marksty);
290     pr->SetMarkerSize(1.2);
291    
292     CPlotItem item;
293     item.prof = pr;
294     item.drawopt = drawopt;
295     fItems.push_back(item);
296     }
297    
298     void CPlot::AddProfile(TProfile *pr, TString label, TString drawopt, int color, int marksty, int linesty)
299     {
300     if(!pr)
301     return;
302    
303     if(!fLeg)
304     fLeg = new TLegend(0.6,0.84,0.93,0.9);
305     else
306     fLeg->SetY1(fLeg->GetY1()-0.06);
307    
308     fLeg->AddEntry(pr,label,"LP");
309    
310     AddProfile(pr,drawopt,color,marksty,linesty);
311     }
312    
313     void CPlot::AddProfile(TFile *f, TString prName, TString drawopt, int color, int marksty, int linesty)
314     {
315     if(!f)
316     return;
317    
318     TProfile *pr = (TProfile*)f->FindObjectAny(prName);
319     AddProfile(pr,drawopt,color,marksty,linesty);
320     }
321    
322     void CPlot::AddProfile(TFile *f, TString prName, TString label, TString drawopt, int color, int marksty, int linesty)
323     {
324     if(!f)
325     return;
326    
327     TProfile *pr = (TProfile*)f->FindObjectAny(prName);
328     AddProfile(pr,label,drawopt,color,marksty,linesty);
329     }
330    
331     //--------------------------------------------------------------------------------------------------
332     void CPlot::AddTextBox(TString text, double x1, double y1, double x2, double y2,
333     int bordersize, int textcolor, int fillcolor)
334     {
335     TPaveText *tb = new TPaveText(x1,y1,x2,y2,"NDC");
336     tb->SetTextColor(textcolor);
337     if(fillcolor==-1)
338     tb->SetFillStyle(0);
339     else
340     tb->SetFillColor(fillcolor);
341     tb->SetBorderSize(bordersize);
342     tb->AddText(text);
343     fTextBoxes.push_back(tb);
344     }
345    
346     void CPlot::AddTextBox(double x1, double y1, double x2, double y2,
347     int bordersize, int textcolor, int fillcolor, int nlines,...)
348     {
349     TPaveText *tb = new TPaveText(x1,y1,x2,y2,"NDC");
350     tb->SetTextColor(textcolor);
351     if(fillcolor==-1)
352     tb->SetFillStyle(0);
353     else
354     tb->SetFillColor(fillcolor);
355     tb->SetBorderSize(bordersize);
356     tb->SetTextAlign(12);
357    
358     va_list ap;
359     va_start(ap,nlines);
360     for(int i=0; i<nlines; i++) {
361     TString textline(va_arg(ap,char*));
362     tb->AddText(textline);
363     }
364     va_end(ap);
365    
366     fTextBoxes.push_back(tb);
367     }
368    
369     //--------------------------------------------------------------------------------------------------
370     void CPlot::AddLine(double x1, double y1, double x2, double y2, int color, int style)
371     {
372     TLine *line = new TLine(x1,y1,x2,y2);
373     line->SetLineColor(color);
374     line->SetLineStyle(style);
375     line->SetLineWidth(2);
376     fLines.push_back(line);
377     }
378    
379     void CPlot::AddLine(double x1, double y1, double x2, double y2,
380     int color, int style, TString label)
381     {
382     TLine *line = new TLine(x1,y1,x2,y2);
383     line->SetLineColor(color);
384     line->SetLineStyle(style);
385     line->SetLineWidth(2);
386     fLines.push_back(line);
387    
388     if(!fLeg)
389     fLeg = new TLegend(0.6,0.84,0.93,0.9);
390     else
391     fLeg->SetY1(fLeg->GetY1()-0.06);
392     fLeg->AddEntry(line,label,"L");
393     }
394    
395     //--------------------------------------------------------------------------------------------------
396     void CPlot::AddBox(double x1, double y1, double x2, double y2,
397     int linecolor, int linesty, int fillcolor)
398     {
399     TBox *box = new TBox(x1,y1,x2,y2);
400     box->SetLineColor(linecolor);
401     box->SetLineStyle(linesty);
402     if(fillcolor==-1)
403     box->SetFillStyle(0);
404     else
405     box->SetFillColor(fillcolor);
406     box->SetLineWidth(2);
407     fBoxes.push_back(box);
408     }
409    
410     void CPlot::AddBox(double x1, double y1, double x2, double y2,
411     int linecolor, int linesty, int fillcolor, TString label)
412     {
413     TBox *box = new TBox(x1,y1,x2,y2);
414     box->SetLineColor(linecolor);
415     box->SetLineStyle(linesty);
416     if(fillcolor==-1)
417     box->SetFillStyle(0);
418     else
419     box->SetFillColor(fillcolor);
420     box->SetLineWidth(2);
421     fBoxes.push_back(box);
422    
423     if(!fLeg)
424     fLeg = new TLegend(0.6,0.84,0.93,0.9);
425     else
426     fLeg->SetY1(fLeg->GetY1()-0.06);
427    
428     if(fillcolor<0) fLeg->AddEntry(box,label,"L");
429     else fLeg->AddEntry(box,label,"F");
430     }
431    
432     //--------------------------------------------------------------------------------------------------
433     void CPlot::AddFcn(TF1* fcn, int color, int linesty)
434     {
435     if(!fcn)
436     return;
437    
438     fcn->SetLineColor(color);
439     fcn->SetLineStyle(linesty);
440     fFcns.push_back(fcn);
441     }
442    
443     void CPlot::AddFcn(TF1* fcn, TString label, int color, int linesty)
444     {
445     if(!fcn)
446     return;
447    
448     if(!fLeg)
449     fLeg = new TLegend(0.6,0.84,0.93,0.9);
450     else
451     fLeg->SetY1(fLeg->GetY1()-0.06);
452     fLeg->AddEntry(fcn,label,"L");
453    
454     AddFcn(fcn,color,linesty);
455     }
456    
457     //--------------------------------------------------------------------------------------------------
458     void CPlot::Draw(TCanvas *c, bool doSave, TString format)
459     {
460     c->cd();
461    
462     c->SetLogy(0);
463     c->SetLogx(0);
464    
465     if(!fItems.size() && !fRooPlot)
466     return;
467    
468     if(fRooPlot) {
469     fRooPlot->Draw();
470     }
471    
472     int nHist1D=0, nHist2D=0, nGraph=0, nProf=0;
473     for(uint i=0; i<fItems.size(); i++) {
474     if(fItems[i].hist1D != 0) nHist1D++;
475     if(fItems[i].hist2D != 0) nHist2D++;
476     if(fItems[i].graph != 0) nGraph++;
477     if(fItems[i].prof != 0) nProf++;
478     }
479    
480     //
481     // Draw 2D histogram, save if necessary, then exit
482     // Suggested options for:
483     // contour plot -> "CONT4Z"
484     // lego plot -> "LEGO1 0"
485     // color plot -> "COLZ"
486     // Default is scatter plot
487     //
488     if(nHist2D>0) {
489     for(uint i=0; i<fItems.size(); i++) {
490     if(fItems[i].hist2D==0) continue;
491    
492     fItems[i].hist2D->Draw(fItems[i].drawopt);
493     fItems[i].hist2D->SetTitle(fTitle);
494     fItems[i].hist2D->GetXaxis()->SetTitle(fXTitle);
495     fItems[i].hist2D->GetYaxis()->SetTitle(fYTitle);
496    
497     //
498     // Set log scale if necessary
499     //
500     c->SetLogx(fLogx);
501     c->SetLogy(fLogy);
502    
503     for(uint k=0; k<fLines.size(); k++)
504     fLines[k]->Draw();
505    
506     for(uint k=0; k<fBoxes.size(); k++)
507     fBoxes[k]->Draw();
508    
509     for(uint j=0; j<fTextBoxes.size(); j++)
510     fTextBoxes[j]->Draw();
511    
512     if(doSave) {
513     gSystem->mkdir(sOutDir,true);
514     TString outname = sOutDir+TString("/")+fName+TString(".");
515     if(format.CompareTo("all",TString::kIgnoreCase)==0) {
516 dkralph 1.2 c->SaveAs(outname+TString("pdf"));
517 dkralph 1.1 c->SaveAs(outname+TString("png"));
518 dkralph 1.2 c->SaveAs(outname+TString("eps"));
519 dkralph 1.1 c->SaveAs(outname+TString("C"));
520     } else {
521     c->SaveAs(outname+format);
522     }
523     }
524    
525     return;
526     }
527     }
528    
529     //
530     // Draw 1D histograms
531     // Histograms are cloned so that content and properties
532     // of the original histograms are not changed
533     //
534     std::vector<TH1F*> vHists;
535     std::vector<TString> vHistOpts;
536     if(nHist1D>0) {
537    
538     double ymax=0;
539     uint ifirst=0;
540    
541     for(uint i=0; i<fItems.size(); i++) {
542     if(fItems[i].hist1D==0) continue;
543     if(fStack && fStack->GetHists()->Contains(fItems[i].hist1D)) continue;
544    
545     TString hname = fName;
546     hname += "_h_";
547     hname += i;
548    
549     TH1F *h;
550     if(fRebin>1)
551     h = (TH1F*)fItems[i].hist1D->Rebin(fRebin,hname);
552     else
553     h = (TH1F*)fItems[i].hist1D->Clone(hname);
554    
555 dkralph 1.2 if(fXmin < fXmax) {
556 dkralph 1.1 h->GetXaxis()->SetRangeUser(fXmin,fXmax);
557 dkralph 1.2 }
558 dkralph 1.1
559 dkralph 1.2 if(fYmin < fYmax) {
560 dkralph 1.1 h->GetYaxis()->SetRangeUser(fYmin,fYmax);
561     } else {
562     if(ymax < h->GetMaximum()) {
563     ymax = h->GetMaximum();
564     ifirst = vHists.size();
565     }
566     }
567    
568     vHists.push_back(h);
569     vHistOpts.push_back(fItems[i].drawopt);
570     }
571    
572     if(vHists.size()>0) {
573     vHists[ifirst]->SetTitle(fTitle);
574     vHists[ifirst]->GetXaxis()->SetTitle(fXTitle);
575     vHists[ifirst]->GetYaxis()->SetTitle(fYTitle);
576     vHists[ifirst]->SetLineWidth(2);
577     vHists[ifirst]->Draw(vHistOpts[ifirst].Data());
578 dkralph 1.2 }
579 dkralph 1.1
580     //
581     // Draw histogram stack
582     //
583     if(fStack) {
584     if(vHists.size()>0) {
585     if(fYmin < fYmax) {
586     fStack->Draw("hist same");
587     } else {
588     if(fStack->GetMaximum() > vHists[ifirst]->GetMaximum()) {
589     fStack->SetTitle(fTitle);
590     fStack->Draw();
591     fStack->GetXaxis()->SetTitle(fXTitle);
592     fStack->GetYaxis()->SetTitle(fYTitle);
593     fStack->Draw("hist");
594     } else {
595     fStack->Draw("hist same");
596     }
597     }
598    
599     } else {
600     // NOTE: Must draw first before accessing axes
601     fStack->Draw("hist");
602    
603     if(fXmin < fXmax)
604     fStack->GetXaxis()->SetRangeUser(fXmin,fXmax);
605    
606     if(fYmin < fYmax) {
607     fStack->SetMaximum(fYmax);
608     fStack->SetMinimum(fYmin);
609     }
610    
611     fStack->SetTitle(fTitle);
612     fStack->GetXaxis()->SetTitle(fXTitle);
613     fStack->GetYaxis()->SetTitle(fYTitle);
614     fStack->Draw("hist");
615     }
616     }
617    
618     for(uint i=0; i<vHists.size(); i++) {
619     TH1F *h = vHists[i];
620     h->SetLineWidth(2);
621     char opt[100];
622 dkralph 1.2 sprintf(opt,"same%s",vHistOpts[i].Data());
623 dkralph 1.1 h->Draw(opt);
624     }
625     }
626 dkralph 1.2 c->RedrawAxis();
627 dkralph 1.1
628     //
629     // Draw graphs
630     //
631     std::vector<TGraph*> vGraphs;
632     std::vector<TString> vGraphOpts;
633     if(nGraph>0) {
634     for(uint i=0; i<fItems.size(); i++) {
635     if(fItems[i].graph==0) continue;
636    
637     TString grName = fName;
638     grName += "_gr_";
639     grName += i;
640    
641     TGraph *gr = (TGraph*)fItems[i].graph->Clone(grName);
642    
643     if(fXmin < fXmax)
644     gr->GetXaxis()->SetLimits(fXmin,fXmax);
645     // gr->GetXaxis()->SetRangeUser(fXmin,fXmax);
646    
647     if(fYmin < fYmax)
648     gr->GetYaxis()->SetRangeUser(fYmin,fYmax);
649    
650     vGraphs.push_back(gr);
651     vGraphOpts.push_back(fItems[i].drawopt);
652     }
653    
654     if(vHists.size()==0) {
655     vGraphs[0]->SetTitle(fTitle);
656     vGraphs[0]->GetXaxis()->SetTitle(fXTitle);
657     vGraphs[0]->GetYaxis()->SetTitle(fYTitle);
658     }
659    
660     for(uint i=0; i<vGraphs.size(); i++) {
661     TGraph *gr = vGraphs[i];
662     char opt[100];
663     (i==0 && nHist1D==0) ? sprintf(opt,"AP%s",vGraphOpts[i].Data()) : sprintf(opt,"P%s",vGraphOpts[i].Data());
664     gr->Draw(opt);
665     }
666     }
667    
668     //
669     // Draw profile histograms
670     //
671     std::vector<TProfile*> vProfiles;
672     std::vector<TString> vProfileOpts;
673     if(nProf>0) {
674     for(uint i=0; i<fItems.size(); i++) {
675     if(fItems[i].prof==0) continue;
676    
677     TString prName = fName;
678     prName += "_pr_";
679     prName += i;
680    
681     TProfile *pr = (TProfile*)fItems[i].prof->Clone(prName);
682    
683     if(fXmin < fXmax)
684     pr->GetXaxis()->SetLimits(fXmin,fXmax);
685     // pr->GetXaxis()->SetRangeUser(fXmin,fXmax);
686    
687     if(fYmin < fYmax)
688     pr->GetYaxis()->SetRangeUser(fYmin,fYmax);
689    
690     vProfiles.push_back(pr);
691     vProfileOpts.push_back(fItems[i].drawopt);
692     }
693    
694     if(vHists.size()==0) {
695     vProfiles[0]->SetTitle(fTitle);
696     vProfiles[0]->GetXaxis()->SetTitle(fXTitle);
697     vProfiles[0]->GetYaxis()->SetTitle(fYTitle);
698     }
699    
700     for(uint i=0; i<vProfiles.size(); i++) {
701     TProfile *pr = vProfiles[i];
702     char opt[100];
703     if(i>0 || nHist1D>0 || nGraph>0)
704     sprintf(opt,"same%s",vProfileOpts[i].Data());
705     else
706     sprintf(opt,"%s",vProfileOpts[i].Data());
707     pr->Draw(opt);
708     }
709     }
710    
711     //
712     // Draw legend
713     //
714     if(fLeg) {
715     fLeg->SetFillStyle(0);
716     fLeg->SetBorderSize(0);
717     fLeg->Draw();
718     }
719    
720     //
721     // Draw statistics box
722     //
723     TLatex *stat=0, *sval=0;
724     if(fShowStats) {
725     char buffer[20];
726     stat = new TLatex[3*vHists.size()];
727     sval = new TLatex[3*vHists.size()];
728     for(uint i=0; i<vHists.size(); i++) {
729     int x = fShowStats;
730    
731     // number of entries
732     if(x / 100) {
733     stat[3*i].SetNDC(); stat[3*i].SetTextAlign(13); stat[3*i].SetTextSize(0.03);
734     stat[3*i].SetText(fStatsX,fStatsY-0.04*(3*i)-0.005*i,"Entries");
735     stat[3*i].SetTextColor(vHists[i]->GetLineColor());
736     stat[3*i].Draw();
737     sprintf(buffer,"%i",int(vHists[i]->Integral()));
738     sval[3*i].SetNDC(); sval[3*i].SetTextAlign(33); sval[3*i].SetTextSize(0.03);
739     sval[3*i].SetText(fStatsX+0.25,fStatsY-0.04*(3*i)-0.005*i,buffer);
740     sval[3*i].SetTextColor(vHists[i]->GetLineColor());
741     sval[3*i].Draw();
742     }
743    
744     // mean
745     x = x % 100;
746     if(x / 10) {
747     stat[3*i+1].SetNDC(); stat[3*i+1].SetTextAlign(13); stat[3*i+1].SetTextSize(0.03);
748     stat[3*i+1].SetText(fStatsX,fStatsY-0.04*(3*i+1)-0.005*i,"Mean");
749     stat[3*i+1].SetTextColor(vHists[i]->GetLineColor());
750     stat[3*i+1].Draw();
751     sprintf(buffer,"%g",vHists[i]->GetMean());
752     sval[3*i+1].SetNDC(); sval[3*i+1].SetTextAlign(33); sval[3*i+1].SetTextSize(0.03);
753     sval[3*i+1].SetText(fStatsX+0.25,fStatsY-0.04*(3*i+1)-0.005*i,buffer);
754     sval[3*i+1].SetTextColor(vHists[i]->GetLineColor());
755     sval[3*i+1].Draw();
756     }
757    
758     // RMS
759     x = x % 10;
760     if(x) {
761     stat[3*i+2].SetNDC(); stat[3*i+2].SetTextAlign(13); stat[3*i+2].SetTextSize(0.03);
762     stat[3*i+2].SetText(fStatsX,fStatsY-0.04*(3*i+2)-0.005*i,"RMS");
763     stat[3*i+2].SetTextColor(vHists[i]->GetLineColor());
764     stat[3*i+2].Draw();
765     sprintf(buffer,"%g",vHists[i]->GetRMS());
766     sval[3*i+2].SetNDC(); sval[3*i+2].SetTextAlign(33); sval[3*i+2].SetTextSize(0.03);
767     sval[3*i+2].SetText(fStatsX+0.25,fStatsY-0.04*(3*i+2)-0.005*i,buffer);
768     sval[3*i+2].SetTextColor(vHists[i]->GetLineColor());
769     sval[3*i+2].Draw();
770     }
771     }
772     }
773    
774     //
775     // Draw functions
776     //
777     for(uint i=0; i<fFcns.size(); i++)
778     (i==0 && vHists.size()==0 && vGraphs.size()==0) ? fFcns[i]->Draw() : fFcns[i]->Draw("sameC");
779    
780     //
781     // Draw lines
782     //
783     for(uint i=0; i<fLines.size(); i++)
784     fLines[i]->Draw();
785    
786     //
787     // Draw Boxes
788     //
789     for(uint i=0; i<fBoxes.size(); i++)
790     fBoxes[i]->Draw();
791    
792     //
793     // Draw textboxes
794     //
795     for(uint i=0; i<fTextBoxes.size(); i++)
796     fTextBoxes[i]->Draw();
797    
798     //
799     // Set log scale if necessary
800     //
801     c->SetLogx(fLogx);
802     c->SetLogy(fLogy);
803    
804     //
805     // Set grid lines if necessary
806     //
807     c->SetGridx(fGridx);
808     c->SetGridy(fGridy);
809    
810     //
811     // Save plot if necessary
812     //
813     if(doSave) {
814     gSystem->mkdir(sOutDir,true);
815     TString outname = sOutDir+TString("/")+fName+TString(".");
816     if(format.CompareTo("all",TString::kIgnoreCase)==0) {
817     c->SaveAs(outname+TString("png"));
818     c->SaveAs(outname+TString("eps"));
819     c->SaveAs(outname+TString("C"));
820     } else {
821     c->SaveAs(outname+format);
822     }
823    
824     delete [] stat;
825     delete [] sval;
826     // for(uint i=0; i<vHists.size(); i++)
827     // delete vHists[i];
828     }
829     }