00001 #include "TCanvas.h"
00002 #include "TLegend.h"
00003 #include "TPaveText.h"
00004 #include "TH1.h"
00005 #include "TMath.h"
00006 #include "TList.h"
00007
00008 #include "MessageService/MsgService.h"
00009
00010 #include "AtNuUtils/UtilHist.h"
00011 #include "AtNuUtils/UtilCanvas.h"
00012
00013 CVSID("$Id: UtilCanvas.cxx,v 1.4 2007/02/01 21:40:17 rhatcher Exp $");
00014
00015 using namespace std;
00016
00017 TCanvas* UtilCanvas::NewCanvas(string cn, string ti) {
00018 TCanvas *tc = 0;
00019 if(cn.size()==0) tc = new TCanvas();
00020 else {
00021 if(ti.size()==0) tc = new TCanvas(cn.c_str(),cn.c_str());
00022 else tc = new TCanvas(cn.c_str(),ti.c_str());
00023 }
00024 tc->SetBorderSize(2);
00025 tc->Range(0.0, 0.0, 100.0, 100.0);
00026 tc->SetFrameFillColor(0);
00027 return tc;
00028 }
00029
00030 TCanvas* UtilCanvas::NewLetterCanvas(string cn, string ti) {
00031 TCanvas *tc = NewCanvas(cn,ti);
00032 tc->SetWindowSize(930, 750);
00033 return(tc);
00034 }
00035
00036 TCanvas* UtilCanvas::NewNHighCanvas(int NHigh, string cn, string ti) {
00037 TCanvas *tc = NewLetterCanvas(cn,ti);
00038 tc->Divide(1, NHigh);
00039 return(tc);
00040 }
00041
00042 TCanvas* UtilCanvas::NewNWideCanvas(int NWide, string cn, string ti) {
00043 TCanvas *tc = NewLetterCanvas(cn,ti);
00044 tc->Divide(NWide, 1);
00045 return(tc);
00046 }
00047
00048 TCanvas* UtilCanvas::NewFourByCanvas(string cn, string ti) {
00049 TCanvas *tc = NewLetterCanvas(cn,ti);
00050 tc->Divide(2, 2);
00051 return(tc);
00052 }
00053
00054 TCanvas* UtilCanvas::NewSixByCanvas(string cn, string ti) {
00055 TCanvas *tc = NewLetterCanvas(cn,ti);
00056 tc->Divide(3, 2);
00057 return(tc);
00058 }
00059
00060 void UtilCanvas::FixPad(TPad *pad) {
00061 MSG("Util",Msg::kSynopsis) << "UtilCanvas::FixPad" << endl;
00062 if(!pad) return;
00063 static vector<TH1*> histos; histos.clear();
00064
00065 pad->Modified();
00066 pad->Update();
00067
00068 TObject *obj = 0;
00069 TIterator *itr2 = pad->GetListOfPrimitives()->MakeIterator();
00070 while ( (obj = itr2->Next()) ) {
00071 TH1* h1 = dynamic_cast<TH1*>(obj);
00072 if(h1) histos.push_back(h1);
00073 TLegend *leg = dynamic_cast<TLegend*>(obj);
00074 if(leg) leg->SetBorderSize(0);
00075 TPaveText *pav = dynamic_cast<TPaveText*>(obj);
00076 if(pav) pav->SetFillStyle(0);
00077 TPad *inpad = dynamic_cast<TPad*>(obj);
00078 if(inpad) UtilCanvas::FixPad(inpad);
00079 }
00080 pad->Modified();
00081
00082
00083 if (histos.size() < 2) {
00084 MSG("Util",Msg::kSynopsis) << "This pad only has " << histos.size()
00085 << " hists, no need to fix" << endl;
00086 return;
00087 }
00088
00089 double Max = UtilHist::HMax(histos);
00090 double Min = UtilHist::HMin(histos);
00091 double Min0 = UtilHist::HMin(histos, 0);
00092
00093
00094 if((Max==0 && Min==0) || Max==Min) return;
00095
00096 if (pad->GetLogy()) {
00097 MSG("Util",Msg::kSynopsis) << "Correcting for Y Axis Log Scale" << endl;
00098
00099
00100 if(Min <= 0.0) Min = Min0;
00101
00102 double Buf = TMath::Power(Max/Min, 0.05);
00103
00104 MSG("Util",Msg::kSynopsis) << "For Max = " << Max << ", Min = " << Min
00105 << ", Using Buf = " << Buf << endl;
00106
00107 Max *= Buf;
00108 Min /= Buf;
00109 }
00110 else {
00111 MSG("Util",Msg::kSynopsis) << "Correcting for Y Axis Linear Scale" << endl;
00112 double Buf = (Max-Min) * 0.05;
00113
00114 MSG("Util",Msg::kSynopsis) << "For Max = " << Max << ", Min = " << Min
00115 << ", Using Buf = " << Buf << endl;
00116
00117 Max += Buf;
00118 if(Min<0 || Min>Buf) Min -= Buf;
00119 else Min = 0.0;
00120 }
00121
00122 histos[0]->GetYaxis()->SetRangeUser(Min, Max);
00123 pad->Modified();
00124 }
00125
00126 void UtilCanvas::UpdatePad(TPad *pad) {
00127 if(!pad) return;
00128 TList *tl = pad->GetListOfPrimitives();
00129 TIterator *itr2 = tl->MakeIterator();
00130 TObject *obj = 0;
00131
00132 while ( (obj=itr2->Next()) ) {
00133 TPad* p1 = dynamic_cast<TPad*>(obj);
00134 if(p1) p1->Modified();
00135 }
00136 pad->Modified();
00137 pad->Update();
00138 }
00139
00140 bool UtilCanvas::PadFilled(TPad *pad) {
00141 if(!pad) return false;
00142 TList *tl = pad->GetListOfPrimitives();
00143 TIterator *itr2 = tl->MakeIterator();
00144 TObject *obj = 0;
00145 bool IsFilled = false;
00146
00147 while ( (obj=itr2->Next()) ) {
00148 TPad* p1 = dynamic_cast<TPad*>(obj);
00149 if(p1) IsFilled = IsFilled || UtilCanvas::PadFilled(p1);
00150 if((dynamic_cast<TH1*>(obj))) IsFilled = true;;
00151 }
00152 return IsFilled;
00153 }