#include "TPad.h" #include "TMath.h" #include "TPaveLabel.h" #include "TH2F.h" #include "TString.h" #include using namespace std; //________________________________________________________________________ class MyTPaveLabel : public TPaveLabel { protected: Int_t fInit; Int_t fAlign; TString fOption; public: MyTPaveLabel(Double_t x1, Double_t y1,Double_t x2, Double_t y2, const char *label, Option_t *option = ""); void ConvertNDCtoPad(); void Paint(Option_t *option); ~MyTPaveLabel() {}; ClassDef(MyTPaveLabel,1) //PaveLabel. A Pave with a label }; ClassImp(MyTPaveLabel) MyTPaveLabel::MyTPaveLabel(Double_t x1, Double_t y1,Double_t x2, Double_t y2, const char *label, Option_t *option) :TPaveLabel(x1,y1,x2,y2,label,option) { fInit = 0; fAlign = 11; // lower left corner fOption = option; fOption.ToUpper(); } //______________________________________________________________________________ void MyTPaveLabel::Paint(Option_t *option) { // Paint this pavelabel with its current attributes. // Convert from NDC to pad coordinates // Note: dont use the one from TPave ConvertNDCtoPad(); TPaveLabel::PaintPaveLabel(TBox::fX1, TBox::fY1, TBox::fX2, TBox::fY2, TPaveLabel::GetLabel(), strlen(option)?option:TPaveLabel::GetOption()); } //______________________________________________________________________________ void MyTPaveLabel::ConvertNDCtoPad() { // Convert pave coordinates from NDC to Pad coordinates. Double_t dpx = gPad->GetX2() - gPad->GetX1(); Double_t dpy = gPad->GetY2() - gPad->GetY1(); Double_t xp1 = gPad->GetX1(); Double_t yp1 = gPad->GetY1(); // Check if pave initialisation has been done. // This operation cannot take place in the Pave constructor because // the Pad range may not be known at this time. if (!fInit) { fInit = 1; if (fOption.Contains("NDC")) { TPave::fX1NDC = TBox::fX1; TPave::fY1NDC = fY1; TPave::fX2NDC = fX2; TPave::fY2NDC = fY2; TBox::fX1 = xp1 + TPave::fX1NDC*dpx; TBox::fY1 = yp1 + TPave::fY1NDC*dpy; TBox::fX2 = xp1 + TPave::fX2NDC*dpx; TBox::fY2 = yp1 + TPave::fY2NDC*dpy; } else { if (gPad->GetLogx()) { if (TBox::fX1 > 0) fX1 = TMath::Log10(fX1); if (TBox::fX2 > 0) fX2 = TMath::Log10(fX2); } if (gPad->GetLogy()) { if (TBox::fY1 > 0) fY1 = TMath::Log10(fY1); if (TBox::fY2 > 0) fY2 = TMath::Log10(fY2); } TPave::fX1NDC = (TBox::fX1-xp1)/dpx; TPave::fY1NDC = (TBox::fY1-yp1)/dpy; TPave::fX2NDC = (TBox::fX2-xp1)/dpx; TPave::fY2NDC = (TBox::fY2-yp1)/dpy; } } else { if (fOption.Contains("NDC")) { TBox::fX1 = xp1 + TPave::fX1NDC*dpx; TBox::fY1 = yp1 + TPave::fY1NDC*dpy; TBox::fX2 = xp1 + TPave::fX2NDC*dpx; TBox::fY2 = yp1 + TPave::fY2NDC*dpy; } else { // keep lower left corner, adjust size to original Double_t sizeX= dpx * (TPave::fX2NDC-TPave::fX1NDC); Double_t sizeY= dpy * (TPave::fY2NDC-TPave::fY1NDC); cout << TBox::fX1 << " " << TBox::fY1 << " " << sizeX << " " << sizeY << endl; // if (fAlign == 11) { // to be worked out TBox::fX2 = TBox::fX1 + sizeX; TBox::fY2 = TBox::fY1 + sizeY; // } } } } //_______________________________________________________________________ void testpl(){ TH2F *hist = new TH2F("name", "title", 100, 0, 100, 100, 0, 100); hist->Draw(); MyTPaveLabel* label_fixed = new MyTPaveLabel(40,50,60,60,"label_{fixed}"); label_fixed->Draw(); }