#include "TLabel.hh" #include #include "TPad.h" #include "TMath.h" using std::cout; using std::cerr; using std::endl; ClassImp(TLabel) TLabel::TLabel(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(false), fFixPointAlign(11), fSizeX(X2-X1), fSizeY(Y2-Y1), fFixedNDCSize(false), fOption(Option) { fOption.ToUpper(); CalculateFixPoint(); } void TLabel::Paint(Option_t *option) { ConvertNDCtoPad(); TPaveLabel::PaintPaveLabel(TBox::fX1, TBox::fY1, TBox::fX2, TBox::fY2, TPaveLabel::GetLabel(), strlen(option)?option:TPaveLabel::GetOption()); } void TLabel::SetFixPointAlign(Short_t Align) { fFixPointAlign = Align; CalculateFixPoint(); } void TLabel::CalculateFixPoint() { switch (auto y = fFixPointAlign % 10) { //get y alignment case 1: //Bottom fFixPointY = TBox::fY1; break; case 2: //Middle fFixPointY = TBox::fY2 - (TBox::fY2 - TBox::fY1)/2.; break; case 3: //Top fFixPointY = TBox::fY2; break; default: cout << fFixPointAlign << " -> Unkown y alignment" << y << endl; } switch (auto x = fFixPointAlign / 10) { //get x alignment case 1: //Left fFixPointX = TBox::fX1; break; case 2: //Middle fFixPointX = TBox::fX2 - (TBox::fX2 - TBox::fX1)/2.; break; case 3: //Right fFixPointX = TBox::fX2; break; default: cout << fFixPointAlign << " -> Unkown x alignment" << x << endl; } } void TLabel::GetCoordsFromFixPoint() { switch (auto y = fFixPointAlign % 10) { //get y alignment case 1: //Bottom TBox::fY1 = fFixPointY; TBox::fY2 = fFixPointY + fSizeY; break; case 2: //Middle TBox::fY1 = fFixPointY - fSizeY/2.; TBox::fY2 = fFixPointY + fSizeY/2.; break; case 3: //Top TBox::fY1 = fFixPointY - fSizeY; TBox::fY2 = fFixPointY; break; default: cout << fFixPointAlign << " -> Unkown y alignment" << y << endl; } switch (auto x = fFixPointAlign / 10) { //get x alignment case 1: //Left TBox::fX1 = fFixPointX; TBox::fX2 = fFixPointX + fSizeX; break; case 2: //Middle TBox::fX1 = fFixPointX - fSizeX/2.; TBox::fX2 = fFixPointX + fSizeX/2.; break; case 3: //Right TBox::fX1 = fFixPointX - fSizeX; TBox::fX2 = fFixPointX; break; default: cout << fFixPointAlign << " -> Unkown x alignment" << x << endl; } } void TLabel::FixNDCSize(Double_t NDCsizeX, Double_t NDCsizeY) { fFixedNDCSize = true; if (fInit) {//TODO different if already initialized } else { if (NDCsizeX <= 0) { fNDCSizeX = NDCsizeX; } else { //get current size fNDCSizeX = NDCsizeX; fSizeX = TBox::fX2-TBox::fX1; } if (NDCsizeY <= 0) { fNDCSizeY = NDCsizeY; } else { //get current size fNDCSizeY = NDCsizeY; fSizeY = TBox::fY2-TBox::fY1; } } } void TLabel::ConvertNDCtoPad() { if (gPad == nullptr) { cerr << "cannot convert from NDC to pad coordinates without pad\n"; return; } // 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 = true; if (fOption.Contains("NDC")) { TPave::fX1NDC = TBox::fX1; TPave::fY1NDC = TBox::fY1; TPave::fX2NDC = TBox::fX2; TPave::fY2NDC = TBox::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) { TBox::fX1 = TMath::Log10(TBox::fX1); } if (TBox::fX2 > 0) { TBox::fX2 = TMath::Log10(TBox::fX2); } } if (gPad->GetLogy()) { if (TBox::fY1 > 0) { TBox::fY1 = TMath::Log10(TBox::fY1); } if (TBox::fY2 > 0) { TBox::fY2 = TMath::Log10(TBox::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; } CalculateFixPoint(); if (fFixedNDCSize) { if (fNDCSizeX < 0) { fNDCSizeX = TPave::fX2NDC - TPave::fX1NDC; } if (fNDCSizeY < 0) { fNDCSizeY = TPave::fY2NDC - TPave::fY1NDC; } fSizeX = fNDCSizeX*dpx; fSizeY = fNDCSizeY*dpy; GetCoordsFromFixPoint(); } else { fSizeX = TBox::fX2 - TBox::fX1; fSizeY = TBox::fY2 - TBox::fY1; } } 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 { if (fFixedNDCSize) { fSizeX = dpx * fNDCSizeX; fSizeY = dpy * fNDCSizeY; } GetCoordsFromFixPoint(); } } }