ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Common/CPlot.cc
Revision: 1.1
Committed: Sat Jun 4 14:09:51 2011 UTC (13 years, 11 months ago) by dkralph
Content type: text/plain
Branch: MAIN
Log Message:
new

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