772 Error(
"TGaxis",
"calling constructor with an unknown function: %s", funcname);
806 fGridLength(ax.fGridLength),
807 fTickSize(ax.fTickSize),
808 fLabelOffset(ax.fLabelOffset),
809 fLabelSize(ax.fLabelSize),
810 fTitleOffset(ax.fTitleOffset),
811 fTitleSize(ax.fTitleSize),
813 fLabelColor(ax.fLabelColor),
814 fLabelFont(ax.fLabelFont),
815 fNModLabs(ax.fNModLabs),
819 fTimeFormat(ax.fTimeFormat),
820 fFunctionName(ax.fFunctionName),
821 fFunction(ax.fFunction),
838 TAttText::operator=(ax);
1018 const char *where =
"PaintAxis";
1020 Double_t alfa, beta, ratio1, ratio2, grid_side;
1028 Double_t phil, phi, sinphi, cosphi;
1029 Double_t binLow = 0., binLow2 = 0., binLow3 = 0.;
1030 Double_t binHigh = 0., binHigh2 = 0., binHigh3 = 0.;
1031 Double_t binWidth = 0., binWidth2 = 0., binWidth3 = 0.;
1042 xx0 = xx1 = yy0 = yy1 = 0;
1043 Double_t xxmin, xxmax, yymin, yymax;
1044 xxmin = xxmax = yymin = yymax = 0;
1048 Double_t xmnlog, x00, x11, h2, h2sav, axmul,
y;
1051 Int_t nlabels, nticks, nticks0, nticks1;
1052 Int_t i, j, k,
l, decade, ltick;
1056 Int_t iexe, if1, if2, na, nf, ih1, ih2, nbinin, nch, kmod;
1057 Int_t optionLog,optionBlank,optionVert,optionPlus,optionMinus,optionUnlab,optionPara;
1058 Int_t optionDown,optionRight,optionLeft,optionCent,optionEqual,optionDecimals=0,optionDot;
1059 Int_t optionY,optionText,optionGrid,optionSize,optionNoopt,optionInt,optionM,optionUp,optionX;
1060 Int_t optionTime, optionArrow;
1062 Int_t xalign, yalign;
1063 Int_t nn1, nn2, nn3, n1a, n2a, n3a, nb2, nb3;
1064 Int_t nbins=10, n1aold, nn1old;
1066 n1aold = nn1old = 0;
1090 chtemp = &kchtemp[0];
1091 label = &chlabel[0];
1110 if(strchr(chopt,
'G')) optionLog = 1;
else optionLog = 0;
1111 if(strchr(chopt,
'B')) optionBlank= 1;
else optionBlank= 0;
1112 if(strchr(chopt,
'V')) optionVert = 1;
else optionVert = 0;
1113 if(strchr(chopt,
'+')) optionPlus = 1;
else optionPlus = 0;
1114 if(strchr(chopt,
'-')) optionMinus= 1;
else optionMinus= 0;
1115 if(strchr(chopt,
'U')) optionUnlab= 1;
else optionUnlab= 0;
1116 if(strchr(chopt,
'P')) optionPara = 1;
else optionPara = 0;
1117 if(strchr(chopt,
'O')) optionDown = 1;
else optionDown = 0;
1118 if(strchr(chopt,
'R')) optionRight= 1;
else optionRight= 0;
1119 if(strchr(chopt,
'L')) optionLeft = 1;
else optionLeft = 0;
1120 if(strchr(chopt,
'C')) optionCent = 1;
else optionCent = 0;
1121 if(strchr(chopt,
'=')) optionEqual= 1;
else optionEqual= 0;
1122 if(strchr(chopt,
'Y')) optionY = 1;
else optionY = 0;
1123 if(strchr(chopt,
'T')) optionText = 1;
else optionText = 0;
1124 if(strchr(chopt,
'W')) optionGrid = 1;
else optionGrid = 0;
1125 if(strchr(chopt,
'S')) optionSize = 1;
else optionSize = 0;
1126 if(strchr(chopt,
'N')) optionNoopt= 1;
else optionNoopt= 0;
1127 if(strchr(chopt,
'I')) optionInt = 1;
else optionInt = 0;
1128 if(strchr(chopt,
'M')) optionM = 1;
else optionM = 0;
1129 if(strchr(chopt,
'0')) optionUp = 1;
else optionUp = 0;
1130 if(strchr(chopt,
'X')) optionX = 1;
else optionX = 0;
1131 if(strchr(chopt,
't')) optionTime = 1;
else optionTime = 0;
1132 if(strchr(chopt,
'.')) optionDot = 1;
else optionDot = 0;
1139 if(strchr(chopt,
'>')) optionArrow = 1;
1140 if(strchr(chopt,
'<')) optionArrow = optionArrow+2;
1158 Error(where,
"Invalid number of divisions: %d",ndiv);
1165 if (gridlength == 0) gridlength = 0.8;
1195 Int_t year, mm, dd, hh, mi, ss;
1196 if (sscanf(stringtimeoffset.
Data(),
"%d-%d-%d %d:%d:%d", &year, &mm, &dd, &hh, &mi, &ss) == 6) {
1199 tp.tm_year = year-1900;
1213 TString sdp = stringtimeoffset(ids+1,lns);
1214 sscanf(sdp.
Data(),
"%g",&dp);
1218 Error(where,
"Time offset has not the right format");
1223 wmin += timeoffset - (
int)(timeoffset);
1224 wmax += timeoffset - (
int)(timeoffset);
1228 time_t timetp = (time_t)((
Long_t)(timeoffset));
1231 if (range>60) rangeBase = 60*20;
1232 if (range>3600) rangeBase = 3600*20;
1233 if (range>86400) rangeBase = 86400*20;
1234 if (range>2419200) rangeBase = 31556736;
1236 if (range>31536000) {
1237 tp0 = gmtime(&timetp);
1244 rangeBase = (timetp-mktime(tp0));
1245 rangeOffset = (
Double_t) (rangeBase);
1247 wmax += rangeOffset;
1248 wmin += rangeOffset;
1253 n2a = (ndiv%10000 - n1a)/100;
1254 n3a = (ndiv%1000000 - n2a -n1a)/10000;
1259 maxDigits = (ndiv/1000000);
1268 if (
wmin ==
wmax || ndiv == 0 || n1a <= 1 || optionLog) {
1274 if ( (
wmax-
wmin) < 1 && optionInt) {
1275 Error(where,
"option I not available");
1278 if (!optionNoopt || optionInt ) {
1286 if (binLow !=
Double_t(
int(binLow)) || binWidth !=
Double_t(
int(binWidth))) {
1290 if ((
wmin-binLow) >
epsilon) { binLow += binWidth; nbins--; }
1291 if ((binHigh-
wmax) >
epsilon) { binHigh -= binWidth; nbins--; }
1297 yymax = rtyw*(binHigh-
wmin) +
ymin;
1302 xxmax = rtxw*(binHigh-
wmin) +
xmin;
1310 yymin = alfa*xxmin + beta;
1311 yymax = alfa*xxmax + beta;
1326 if (!optionNoopt && n2a > 1 && binWidth > 0) {
1332 if (!optionNoopt && n3a > 1 && binWidth2 > 0) {
1346 ratio1 = 1/(rwxmax-rwxmin);
1347 ratio2 = 1/(rwymax-rwymin);
1348 x0 = ratio1*(
xmin-rwxmin);
1349 x1 = ratio1*(
xmax-rwxmin);
1350 y0 = ratio2*(
ymin-rwymin);
1351 y1 = ratio2*(
ymax-rwymin);
1352 if (!optionNoopt || optionInt ) {
1353 xx0 = ratio1*(xxmin-rwxmin);
1354 xx1 = ratio1*(xxmax-rwxmin);
1355 yy0 = ratio2*(yymin-rwymin);
1356 yy1 = ratio2*(yymax-rwymin);
1359 if ((x0 ==
x1) && (y0 ==
y1)) {
1360 Error(where,
"length of axis is 0");
1367 if (toffset==0 &&
x1 == x0) autotoff =
kTRUE;
1380 if (!
gPad->IsBatch()) {
1381 gVirtualX->GetCharacterUp(chupxvsav, chupyvsav);
1387 if (axis_length == 0) {
1388 Error(where,
"length of axis is 0");
1391 if (!optionNoopt || optionInt) {
1392 axis_lengthN =
TMath::Sqrt((xx1-xx0)*(xx1-xx0)+(yy1-yy0)*(yy1-yy0));
1393 axis_length0 =
TMath::Sqrt((xx0-x0)*(xx0-x0)+(yy0-y0)*(yy0-y0));
1404 wmin += timeoffset - (
int)(timeoffset) + rangeOffset;
1405 wmax += timeoffset - (
int)(timeoffset) + rangeOffset;
1411 if (
y1>=y0) phi = 0.5*
kPI;
1436 if (x0 ==
x1 &&
y1 > y0) mside = -1;
1437 if (optionPlus) mside = 1;
1438 if (optionMinus) mside = -1;
1439 if (optionPlus && optionMinus) mside = 0;
1442 if (optionEqual) lside = mside;
1443 if (optionPlus && optionMinus) {
1445 if (optionEqual) lside=1;
1450 if(xmside >= 0) tick_side = 1;
1451 else tick_side = -1;
1452 if (optionSize) atick[0] = tick_side*axis_length*
fTickSize;
1453 else atick[0] = tick_side*axis_length*0.03;
1455 atick[1] = 0.5*atick[0];
1456 atick[2] = 0.5*atick[1];
1459 if ((x0 ==
x1) && (
y1 > y0)) grid_side =-1;
1486 if (optionArrow==1)
a.PaintArrowNDC(xpl1, ypl1, xpl2, ypl2, as,
"|>");
1487 if (optionArrow==2)
a.PaintArrowNDC(xpl1, ypl1, xpl2, ypl2, as,
"<|");
1488 if (optionArrow==3)
a.PaintArrowNDC(xpl1, ypl1, xpl2, ypl2, as,
"<|>");
1496 if (ndiv == 0)
return;
1508 if (optionText &&
GetLabelFont()%10 != 3) charheight *= 0.66666;
1518 if (!optionUp && !optionDown && !optionY && !optionUnlab) {
1533 if (nl > 50)
angle = 90;
1565 double scale=
gPad->GetWw()*
gPad->GetWNDC();
1566 if (scale>0.0) toffset =
TMath::Max(toffset,(
double)
w/scale);
1591 if (!
gPad->IsBatch()) {
1592 if (cosphi > 0)
gVirtualX->SetCharacterUp(-sinphi,cosphi);
1593 else gVirtualX->SetCharacterUp(sinphi,-cosphi);
1595 if (optionVert)
gVirtualX->SetCharacterUp(0,1);
1596 if (optionPara)
gVirtualX->SetCharacterUp(-sinphi,cosphi);
1597 if (optionDown)
gVirtualX->SetCharacterUp(cosphi,sinphi);
1603 if (x0 ==
x1) xalign = 3;
1604 if (y0 !=
y1) yalign = 2;
1605 if (optionCent) xalign = 2;
1606 if (optionRight) xalign = 3;
1607 if (optionLeft) xalign = 1;
1611 if (cosphi*sinphi > 0) xalign = 1;
1612 if (cosphi*sinphi < 0) xalign = 3;
1618 if (optionPlus && !optionMinus) {
1623 if (lside < 0) ylabel += atick[0];
1625 }
else if (y0 ==
y1) {
1626 if (optionMinus && !optionPlus) {
1637 if (mside <= 0) ylabel -=
TMath::Abs(atick[0]);
1639 if (optionLog) ylabel -= 0.5*charheight;
1644 if (optionText) ylabel /= 2;
1650 dxtick=(binHigh-binLow)/
Double_t(nticks-1);
1652 if (optionNoopt && !optionInt) dxtick=axis_length/
Double_t(nticks-1);
1653 else dxtick=axis_lengthN/
Double_t(nticks-1);
1655 for (k=0;k<nticks; k++) {
1657 if (k%nn3 == 0) ltick = 1;
1658 if (k%nn2 == 0) ltick = 0;
1662 xtick = zz* axis_length /
TMath::Abs(rwma-rwmi);
1667 if (!mside) ytick -= atick[ltick];
1668 if ( optionNoopt && !optionInt) {
1669 Rotate(xtick,ytick,cosphi,sinphi,x0,y0,xpl2,ypl2);
1670 Rotate(xtick,atick[ltick],cosphi,sinphi,x0,y0,xpl1,ypl1);
1673 Rotate(xtick,ytick,cosphi,sinphi,xx0,yy0,xpl2,ypl2);
1674 Rotate(xtick,atick[ltick],cosphi,sinphi,xx0,yy0,xpl1,ypl1);
1677 if ((x0 !=
x1) && (y0 !=
y1)) {
1680 if (cosphi > 0) ypl1 = ypl2 + atick[ltick];
1681 else ypl1 = ypl2 - atick[ltick];
1684 xpl1 = 0.5*(xpl1 + xpl2);
1686 ypl1 = 0.5*(ypl1 + ypl2) + atick[ltick];
1687 ypl2 = 0.5*(ypl1 + ypl2) - atick[ltick];
1691 if (!drawGridOnly) {
1695 if (optionArrow==1) {
1702 if (optionArrow==2) {
1709 if (optionArrow==3) {
1721 if (optionNoopt && !optionInt) {
1722 Rotate(xtick,0,cosphi,sinphi,x0,y0 ,xpl2,ypl2);
1723 Rotate(xtick,grid_side*gridlength ,cosphi,sinphi,x0,y0 ,xpl1,ypl1);
1726 Rotate(xtick,0,cosphi ,sinphi,xx0,yy0 ,xpl2,ypl2);
1727 Rotate(xtick,grid_side*gridlength ,cosphi,sinphi,xx0,yy0 ,xpl1,ypl1);
1737 if ((!optionNoopt || optionInt) && axis_length0) {
1738 nticks0 =
Int_t(axis_length0/dxtick);
1739 if (nticks0 > 1000) nticks0 = 1000;
1740 for (k=0; k<=nticks0; k++) {
1742 if (k%nn3 == 0) ltick = 1;
1743 if (k%nn2 == 0) ltick = 0;
1745 if (!mside) ytick0 -= atick[ltick];
1750 Rotate(xtick0,ytick0,cosphi,sinphi,xx0,yy0 ,xpl2,ypl2);
1751 Rotate(xtick0,atick[ltick],cosphi,sinphi,xx0,yy0 ,xpl1,ypl1);
1753 if ((x0 !=
x1) && (y0 !=
y1)) {
1756 if (cosphi > 0) ypl1 = ypl2 + atick[ltick];
1757 else ypl1 = ypl2 - atick[ltick];
1760 xpl1 = 0.5*(xpl1 + xpl2);
1762 ypl1 = 0.5*(ypl1 + ypl2) + atick[ltick];
1763 ypl2 = 0.5*(ypl1 + ypl2) - atick[ltick];
1767 if (!drawGridOnly)
PaintLineNDC(xpl1, ypl1, xpl2, ypl2);
1771 Rotate(xtick0,0,cosphi,sinphi,xx0,yy0,xpl2,ypl2);
1772 Rotate(xtick0,grid_side*gridlength ,cosphi,sinphi,xx0,yy0 ,xpl1,ypl1);
1781 if ((!optionNoopt || optionInt) && axis_length1) {
1782 nticks1 =
int(axis_length1/dxtick);
1783 if (nticks1 > 1000) nticks1 = 1000;
1784 for (k=0; k<=nticks1; k++) {
1786 if (k%nn3 == 0) ltick = 1;
1787 if (k%nn2 == 0) ltick = 0;
1789 if (!mside) ytick1 -= atick[ltick];
1794 Rotate(xtick1,ytick1,cosphi,sinphi,xx0,yy0 ,xpl2,ypl2);
1795 Rotate(xtick1,atick[ltick],cosphi,sinphi,xx0,yy0 ,xpl1,ypl1);
1797 if ((x0 !=
x1) && (y0 !=
y1)) {
1800 if (cosphi > 0) ypl1 = ypl2 + atick[ltick];
1801 else ypl1 = ypl2 - atick[ltick];
1804 xpl1 = 0.5*(xpl1 + xpl2);
1806 ypl1 = 0.5*(ypl1 + ypl2) + atick[ltick];
1807 ypl2 = 0.5*(ypl1 + ypl2) - atick[ltick];
1811 if (!drawGridOnly)
PaintLineNDC(xpl1, ypl1, xpl2, ypl2);
1814 Rotate(xtick1,0,cosphi,sinphi,xx0,yy0 ,xpl2,ypl2);
1815 Rotate(xtick1,grid_side*gridlength,cosphi,sinphi,xx0,yy0,xpl1,ypl1);
1826 if (!drawGridOnly && !optionUnlab) {
1830 if ((
wmin ==
wmax) || (ndiv == 0)) {
1831 Error(where,
"wmin (%f) == wmax (%f), or ndiv == 0",
wmin,
wmax);
1836 if (optionNoopt && !optionInt) dxlabel = axis_length/
Double_t(n1a);
1837 else dxlabel = axis_lengthN/
Double_t(n1a);
1839 if (!optionText && !optionTime) {
1861 if (iexe%3 == 1) iexe += 2;
1862 else if(iexe%3 == 2) iexe += 1;
1863 if (nexe < 0) nexe = -iexe;
1876 if (!noExponent && nf > maxDigits) flexpo =
kTRUE;
1877 if (!noExponent && nf < -maxDigits) flexne =
kTRUE;
1888 if (nexe%3 == 0 && ww <=
TMath::Power(10,maxDigits-1))
break;
1900 if (nexe%3 == 0 && ww >= rne)
break;
1905 for (i=maxDigits-1; i>0; i--) {
1911 if (wdyn <= 0.999 && na < maxDigits-2) {
1931 if (if1 > 14) if1 = 14;
1932 if (if2 > 14) if2 = 14;
1933 if (if1 < 0) if1 = 0;
1936 len =
snprintf(chcoded,
sizeof(chcoded),
"%%%d.%df",if1,if2);
1938 len =
snprintf(chcoded,
sizeof(chcoded),
"%%%d.%df",if1+1,1);
1941 if ((
len < 0) || (
len >= (
int)
sizeof(chcoded)))
1942 strcpy(chcoded,
"%7.3f");
1948 Int_t ndecimals = 0;
1949 if (optionDecimals) {
1950 char *dot = strchr(chtemp,
'.');
1952 ndecimals = chtemp + strlen(chtemp) -dot;
1955 exp = strstr(chtemp,
"e-");
1957 sscanf(&exp[2],
"%d",&ndecimals);
1962 if (optionM) nlabels = n1a-1;
1965 for ( k=0; k<=nlabels; k++) {
1970 xlabel = zz* axis_length /
TMath::Abs(rwma-rwmi);
1974 if (optionM) xlabel += 0.5*dxlabel;
1976 if (!optionText && !optionTime) {
1977 snprintf(label,256,chcoded,wlabel);
1983 if (label[
first] ==
'.') {
1984 strncpy(chtemp,
"0",256);
1985 strlcat(chtemp, &label[
first],256);
1986 strncpy(label, chtemp,256);
1987 first = 1; last = strlen(label);
1989 if (label[
first] ==
'-' && label[
first+1] ==
'.') {
1990 strncpy(chtemp,
"-0",256);
1991 strlcat(chtemp, &label[
first+1],256);
1992 strncpy(label, chtemp, 256);
1993 first = 1; last = strlen(label);
1998 char *adot = strchr(label,
'.');
1999 if (adot) adot[ndecimals] = 0;
2001 while (label[last] ==
'0') { label[last] = 0; last--;}
2005 if (label[last] ==
'.') {
2006 if (!optionDot) { label[last] = 0; last--;}
2011 && label[last] ==
'0') {
2012 strncpy(label,
"0", 256);
2020 timed = wlabel + (
int)(timeoffset) - rangeOffset;
2021 timelabel = (time_t)((
Long_t)(timed));
2022 if (optionTime == 1) {
2023 utctis = localtime(&timelabel);
2025 utctis = gmtime(&timelabel);
2028 if (timeformat.
Length() < 220) timeformattmp = timeformat;
2029 else timeformattmp =
"#splitline{Format}{too long}";
2035 snprintf(label, 256,
"%%S%7.5f", modf(timed,&tmpdb));
2036 tmplast = strlen(label)-1;
2039 while (label[tmplast] ==
'0') {
2040 label[tmplast] = 0; tmplast--;
2049 if (utctis !=
nullptr) {
2050 strftime(label, 256, timeformattmp.
Data(), utctis);
2052 strncpy(label,
"invalid", 256);
2054 strncpy(chtemp, &label[0], 256);
2055 first = 0; last=strlen(label)-1;
2056 wlabel = wTimeIni + (k+1)*dwlabel;
2061 if (optionNoopt && !optionInt)
2062 Rotate (xlabel,ylabel,cosphi,sinphi,x0,y0,xx,yy);
2063 else Rotate (xlabel,ylabel,cosphi,sinphi,xx0,yy0,xx,yy);
2064 if (y0 ==
y1 && !optionDown && !optionUp) {
2065 yy -= 0.80*charheight;
2068 if (x0 !=
x1 && y0 !=
y1) {
2069 if (optionNoopt && !optionInt)
2070 Rotate (xlabel,0,cosphi,sinphi,x0,y0,xx,yy);
2071 else Rotate (xlabel,0,cosphi,sinphi,xx0,yy0,xx,yy);
2072 if (cosphi > 0 ) yy += ylabel;
2073 if (cosphi < 0 ) yy -= ylabel;
2076 if (!optionY || (x0 ==
x1)) {
2078 if (
first > last) strncpy(chtemp,
" ", 256);
2079 else strncpy(chtemp, &label[
first], 255);
2082 if (!optionTime) typolabel.
ReplaceAll(
"-",
"#minus");
2087 double scale=
gPad->GetWw()*
gPad->GetWNDC();
2088 if (scale>0.0) toffset =
TMath::Max(toffset,(
double)
w/scale);
2109 if (!optionText) lnlen = last-
first+1;
2111 if (k+1 > nhilab) lnlen = 0;
2113 for (
l=1;
l<=lnlen;
l++) {
2114 if (!optionText) *chtemp = label[
first+
l-2];
2116 if (lnlen == 0) strncpy(chtemp,
" ", 256);
2117 else strncpy(chtemp,
"1", 256);
2126 yy -= charheight*1.3;
2133 if (flexe && !optionText && nexe) {
2134 snprintf(label,256,
"#times10^{%d}", nexe);
2135 if (x0 !=
x1) { xfactor = axis_length+0.1*charheight; yfactor = 0; }
2136 else { xfactor =
y1-y0+0.1*charheight; yfactor = 0; }
2137 Rotate (xfactor,yfactor,cosphi,sinphi,x0,y0,xx,yy);
2163 if (optionLog && ndiv) {
2164 UInt_t xi1=0,xi2=0,wi=0,yi1=0,yi2=0,
hi=0,xl=0,xh=0;
2166 if ((
wmin ==
wmax) || (ndiv == 0)) {
2167 Error(where,
"wmin (%f) == wmax (%f), or ndiv == 0",
wmin,
wmax);
2171 Error(where,
"negative logarithmic axis");
2175 Error(where,
"negative logarithmic axis");
2179 if (xmnlog > 0) xmnlog += 1.E-6;
2180 else xmnlog -= 1.E-6;
2185 if (h2 > 0) h2 += 1.E-6;
2190 axmul = (x11-x00)/(h2sav-xmnlog);
2195 if ( xmnlog > 0 && (xmnlog-
Double_t(ih1) > 0) ) labelnumber++;
2196 Int_t changelablogid = 0;
2197 Int_t changelablognum = 0;
2198 for (j=1; j<=nbinin; j++) {
2203 if (x0 ==
x1 && j == 1) ylabel += charheight*0.33;
2204 if (y0 ==
y1 && j == 1) ylabel -= charheight*0.65;
2205 xone = x00+axmul*(
Double_t(decade)-xmnlog);
2207 if (j < 0) printf(
"j=%d\n",j);
2208 if (x00 > xone)
goto L160;
2209 if ((xone-x11)>
epsilon)
break;
2212 if (!mside)
y -= atick[0];
2213 Rotate(xone,
y,cosphi,sinphi,x0,y0,xpl2,ypl2);
2214 Rotate(xtwo,atick[0],cosphi,sinphi,x0,y0,xpl1,ypl1);
2216 if ((x0 !=
x1) && (y0 !=
y1)) {
2219 if (cosphi > 0) ypl1 = ypl2 + atick[0];
2220 else ypl1 = ypl2 - atick[0];
2223 xpl1 = 0.5*(xpl1 + xpl2);
2225 ypl1 = 0.5*(ypl1 + ypl2) + atick[0];
2226 ypl2 = 0.5*(ypl1 + ypl2) - atick[0];
2230 if (!drawGridOnly)
PaintLineNDC(xpl1, ypl1, xpl2, ypl2);
2233 Rotate(xone,0,cosphi,sinphi,x0,y0,xpl2,ypl2);
2234 Rotate(xone,grid_side*gridlength,cosphi,sinphi,x0,y0,xpl1,ypl1);
2238 if (!drawGridOnly && !optionUnlab) {
2245 while (last >
first) {
2246 if (label[last] !=
'0')
break;
2250 if (label[last] ==
'.') {label[last] = 0; last--;}
2252 snprintf(label,256,
"%d", labelnumber);
2255 Rotate (xone,ylabel,cosphi,sinphi,x0,y0,xx,yy);
2256 if ((x0 ==
x1) && !optionPara) {
2259 if (labelnumber == 0) nch=1;
2261 xx += nch*charheight;
2263 xx += 0.25*charheight;
2266 xx += 0.25*charheight;
2268 if ((y0 ==
y1) && !optionDown && !optionUp) {
2269 if (noExponent) yy += 0.33*charheight;
2271 if (n1a == 0)
return;
2273 if (kmod == 0) kmod=1000000;
2274 if ((nbinin <= n1a) || (j == 1) || (j == nbinin) || ((nbinin > n1a) && (j%kmod == 0))) {
2275 if (labelnumber == 0) {
2277 }
else if (labelnumber == 1) {
2281 chtemp = &label[
first];
2283 snprintf(chtemp,256,
"10^{%d}", labelnumber);
2287 if (changelablogid == 0) changelablognum = nbinin-j;
2297 double scale=
gPad->GetWw()*
gPad->GetWNDC();
2298 if (scale>0.0) toffset =
TMath::Max(toffset,(
double)
w/scale);
2308 for (k=2;k<10;k++) {
2312 if (x00 > xone)
continue;
2313 if (xone > x11)
goto L200;
2315 if (!mside)
y -= atick[1];
2317 Rotate(xone,
y,cosphi,sinphi,x0,y0,xpl2,ypl2);
2318 Rotate(xtwo,atick[1],cosphi,sinphi,x0,y0,xpl1,ypl1);
2320 if ((x0 !=
x1) && (y0 !=
y1)) {
2323 if (cosphi > 0) ypl1 = ypl2 + atick[1];
2324 else ypl1 = ypl2 - atick[1];
2327 xpl1 = 0.5*(xpl1+xpl2);
2329 ypl1 = 0.5*(ypl1+ypl2) + atick[1];
2330 ypl2 = 0.5*(ypl1+ypl2) - atick[1];
2335 if ((nbinin <= idn) || ((nbinin > idn) && (k == 5))) {
2336 if (!drawGridOnly)
PaintLineNDC(xpl1, ypl1, xpl2, ypl2);
2340 if (moreLogLabels && !optionUnlab && !drawGridOnly && !overlap) {
2345 if (labelnumber-1 == 0) {
2347 }
else if (labelnumber-1 == 1) {
2350 snprintf(chtemp,256,
"%d#times10^{%d}", k, labelnumber-1);
2353 Rotate (xone,ylabel,cosphi,sinphi,x0,y0,xx,yy);
2354 if ((x0 ==
x1) && !optionPara) {
2357 if (labelnumber == 0) nch=1;
2359 xx += nch*charheight;
2361 if (labelnumber >= 0) xx += 0.25*charheight;
2362 else xx += 0.50*charheight;
2365 xx += 0.25*charheight;
2367 if ((y0 ==
y1) && !optionDown && !optionUp) {
2368 if (noExponent) yy += 0.33*charheight;
2371 if ((x0 !=
x1) && (y0 !=
y1)) {
2372 Rotate(xone,ylabel,cosphi,sinphi,x0,y0,xx,yy);
2373 if (cosphi > 0) yy += ylabel;
2382 xi1 =
gPad->XtoAbsPixel(u);
2383 yi1 =
gPad->YtoAbsPixel(
v);
2394 xi2 =
gPad->XtoAbsPixel(u);
2395 yi2 =
gPad->YtoAbsPixel(
v);
2398 if ((x0 ==
x1 && yi1-
hi <= yi2) || (y0 ==
y1 && xl+wi >= xh)){
2417 if (optionGrid && nbinin <= 5 && ndiv > 100) {
2418 Rotate(xone,0,cosphi,sinphi,x0,y0,xpl2, ypl2);
2419 Rotate(xone,grid_side*gridlength,cosphi,sinphi,x0,y0, xpl1,ypl1);
2426 Int_t dummy = 0;
if (dummy) { }
2430 if (!drawGridOnly && strlen(
GetTitle())) {
2434 charheight /= ((
x1==x0) ? padw : padh);
2438 if (toffset) ylabel = xlside*charheight+toffset;
2439 else ylabel = xlside*1.6*charheight;
2441 ylabel = xlside*1.6*charheight*toffset;
2444 ylabel = xlside*1.3*charheight*toffset;
2448 ylabel = xlside*1.6*charheight*toffset;
2452 else axispos = axis_length;
2471 Rotate(axispos,ylabel,cosphi,sinphi,x0,y0,xpl1,ypl1);
2498 if (binWidth <= 1) { binWidth = 1; binLow =
int(A1); }
2502 binLow =
int(A1/binWidth)*binWidth;
2508 for (
Int_t ic=0; ic<1000; ic++) {
2511 if ( (rbl-ibl) == 0 || ic >
width) { binLow -= 5;
break;}
2518 while (xb <= binHigh) {
2522 binHigh = xb - binWidth;
2530 last = strlen(label)-1;
2531 for (
Int_t i=0; i<=last; i++) {
2532 if (strchr(
"1234567890-+.", label[i]) ) {
first = i;
return; }
2534 Error(
"LabelsLimits",
"attempt to draw a blank label");
2558 out<<
"gaxis = new TGaxis("<<
fX1<<
","<<
fY1<<
","<<
fX2<<
","<<
fY2
2560 out<<
" gaxis->SetLabelOffset("<<
GetLabelOffset()<<
");"<<std::endl;
2561 out<<
" gaxis->SetLabelSize("<<
GetLabelSize()<<
");"<<std::endl;
2562 out<<
" gaxis->SetTickSize("<<
GetTickSize()<<
");"<<std::endl;
2563 out<<
" gaxis->SetGridLength("<<
GetGridLength()<<
");"<<std::endl;
2564 out<<
" gaxis->SetTitleOffset("<<
GetTitleOffset()<<
");"<<std::endl;
2565 out<<
" gaxis->SetTitleSize("<<
GetTitleSize()<<
");"<<std::endl;
2566 out<<
" gaxis->SetTitleColor("<<
GetTextColor()<<
");"<<std::endl;
2567 out<<
" gaxis->SetTitleFont("<<
GetTextFont()<<
");"<<std::endl;
2570 out<<
" gaxis->SetName("<<quote<<
GetName()<<quote<<
");"<<std::endl;
2573 out<<
" gaxis->SetTitle("<<quote<<
GetTitle()<<quote<<
");"<<std::endl;
2578 out<<
" gaxis->SetLabelColor(ci);" << std::endl;
2580 out<<
" gaxis->SetLabelColor("<<
GetLabelColor()<<
");"<<std::endl;
2584 out<<
" gaxis->SetLineColor(ci);" << std::endl;
2586 out<<
" gaxis->SetLineColor("<<
GetLineColor()<<
");"<<std::endl;
2589 out<<
" gaxis->SetLineStyle("<<
GetLineStyle()<<
");"<<std::endl;
2592 out<<
" gaxis->SetLineWidth("<<
GetLineWidth()<<
");"<<std::endl;
2595 out<<
" gaxis->SetLabelFont("<<
GetLabelFont()<<
");"<<std::endl;
2598 out<<
" gaxis->SetMoreLogLabels();"<<std::endl;
2601 out<<
" gaxis->SetNoExponent();"<<std::endl;
2604 out<<
" gaxis->Draw();"<<std::endl;
2626 if (!funcname || !funcname[0]) {
2632 Error(
"SetFunction",
"unknown function: %s", funcname);
2742 Int_t labNum = ml->GetLabNum();
2745 Error(
"ChangeLabelAttributes",
"reverse numbering in ChangeLabel doesn't work when more log labels are requested");
2748 labNum = nlabels + labNum + 2;
2751 if (ml->GetAngle()>=0.) t->
SetTextAngle(ml->GetAngle());
2752 if (ml->GetSize()>=0.) t->
SetTextSize(ml->GetSize());
2754 if (ml->GetColor()>=0) t->
SetTextColor(ml->GetColor());
2755 if (ml->GetFont()>0) t->
SetTextFont(ml->GetFont());
2756 if (!(ml->GetText().IsNull())) strncpy(
c, (ml->GetText()).Data(), 256);
2865 if (timeformat.
Index(
"%F")>=0 || timeformat.
IsNull()) {
2897 timeoff = (time_t)((
Long_t)(toffset));
2901 utctis = gmtime(&timeoff);
2903 if (utctis !=
nullptr) {
2904 strftime(tmp, 20,
"%Y-%m-%d %H:%M:%S",utctis);
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmin
Option_t Option_t SetLineColor
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t SetTextFont
Option_t Option_t TPoint TPoint angle
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmax
Option_t Option_t TPoint TPoint const char y1
static Double_t SavedTextAngle
Global variable saving the current label's text angle. Used by TGaxis::ChangeLabelAttributes.
static Int_t SavedTextFont
Global variable saving the current label's text font. Used by TGaxis::ChangeLabelAttributes.
static Int_t SavedTextAlign
Global variable saving the current label's text alignment. Used by TGaxis::ChangeLabelAttributes.
static Double_t SavedTextSize
Global variable saving the current label's text size. Used by TGaxis::ChangeLabelAttributes.
static Int_t SavedTextColor
Global variable saving the current label's text color. Used by TGaxis::ChangeLabelAttributes.
R__EXTERN TStyle * gStyle
Draw all kinds of Arrows.
virtual Color_t GetTitleColor() const
virtual Color_t GetLabelColor() const
virtual Color_t GetAxisColor() const
virtual Style_t GetTitleFont() const
virtual Float_t GetLabelOffset() const
virtual Style_t GetLabelFont() const
virtual Float_t GetTitleSize() const
virtual Float_t GetLabelSize() const
virtual Float_t GetTickLength() const
virtual Float_t GetTitleOffset() const
virtual Color_t GetLineColor() const
Return the line color.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual Width_t GetLineWidth() const
Return the line width.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Width_t fLineWidth
Line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual Style_t GetLineStyle() const
Return the line style.
Style_t fLineStyle
Line style.
Color_t fLineColor
Line color.
virtual Float_t GetTextSize() const
Return the text size.
virtual void SetTextAlign(Short_t align=11)
Set the text alignment.
virtual Short_t GetTextAlign() const
Return the text alignment.
virtual Font_t GetTextFont() const
Return the text font.
Color_t fTextColor
Text color.
Float_t fTextAngle
Text angle.
virtual Color_t GetTextColor() const
Return the text color.
virtual void Streamer(TBuffer &)
virtual void SetTextAngle(Float_t tangle=0)
Set the text angle.
virtual Float_t GetTextAngle() const
Return the text angle.
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
Font_t fTextFont
Text font.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
Short_t fTextAlign
Text alignment.
Float_t fTextSize
Text size.
TAxis helper class used to store the modified labels.
void SetColor(Int_t c=-1)
Set modified label color.
void SetSize(Double_t s=-1.)
Set modified label size.
void SetFont(Int_t f=-1)
Set modified label font.
void SetText(TString t="")
Set modified label text.
void SetAlign(Int_t a=-1)
Set modified label alignment.
void SetLabNum(Int_t n=0)
Set modified label number.
void SetAngle(Double_t a=-1.)
Set modified label angle.
Class to manage histogram axis.
const char * GetTitle() const override
Returns title of object.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
@ kCenterLabels
Bit 13 is used by TObject.
const char * GetBinLabel(Int_t bin) const
Return label for bin.
Bool_t GetDecimals() const
Int_t GetLast() const
Return last bin on the axis i.e.
TList * GetModifiedLabels() const
virtual const char * GetTimeFormat() const
Int_t GetFirst() const
Return first bin on the axis i.e.
THashList * GetLabels() const
Buffer base class used for serializing objects.
virtual Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr)=0
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
TObject * Clone(const char *newname="") const override
Make a clone of an collection using the Streamer facility.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
static Bool_t SaveColor(std::ostream &out, Int_t ci)
Save a color with index > 228 as a C++ statement(s) on output stream out.
virtual Double_t GetXmax() const
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
Evaluate this function.
virtual Double_t GetXmin() const
static Int_t fgMaxDigits
! Number of digits above which the 10>N notation is used
virtual void SetNoExponent(Bool_t noExponent=kTRUE)
Set the NoExponent flag.
void SetTimeFormat(const char *tformat)
Change the format used for time plotting.
virtual void PaintAxis(Double_t xmin, Double_t ymin, Double_t xmax, Double_t ymax, Double_t &wmin, Double_t &wmax, Int_t &ndiv, Option_t *chopt="", Double_t gridlength=0, Bool_t drawGridOnly=kFALSE)
Control function to draw an axis.
static Float_t fYAxisExpYOffset
! Exponent Y offset for the Y axis
TGaxis()
TGaxis default constructor.
void SetTitleOffset(Float_t titleoffset=1)
Float_t fTitleSize
Size of title in NDC.
Float_t GetGridLength() const
void SetLabelFont(Int_t labelfont)
void SetTitleSize(Float_t titlesize)
void Streamer(TBuffer &) override
Stream an object of class TGaxis.
Float_t fTitleOffset
Offset of title wrt axis.
TString fTitle
Axis title.
Int_t fLabelFont
Font for labels.
virtual void SetTitle(const char *title="")
Change the title of the axis.
Int_t fLabelColor
Color for labels.
TAxis * fAxis
! Pointer to original TAxis axis (if any)
TString fTimeFormat
Time format, ex: 09/12/99 12:34:00.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
TString fFunctionName
Name of mapping function pointed by fFunction.
void SetLabelOffset(Float_t labeloffset)
virtual void Rotate(Double_t X, Double_t Y, Double_t CFI, Double_t SFI, Double_t XT, Double_t YT, Double_t &U, Double_t &V)
Internal method to rotate axis coordinates.
Float_t GetLabelOffset() const
void SetTimeOffset(Double_t toffset, Option_t *option="local")
Change the time offset. If option = "gmt", set display mode to GMT.
Float_t fTickSize
Size of primary tick mark in NDC.
static Float_t fYAxisExpXOffset
! Exponent X offset for the Y axis
virtual void ImportAxisAttributes(TAxis *axis)
Internal method to import TAxis attributes to this TGaxis.
Int_t GetLabelFont() const
Float_t fLabelOffset
Offset of label wrt axis.
static Float_t fXAxisExpYOffset
! Exponent Y offset for the X axis
static void SetMaxDigits(Int_t maxd=5)
Static function to set fgMaxDigits for axis.
Float_t fLabelSize
Size of labels in NDC.
Int_t fNdiv
Number of divisions.
void ChangeLabelAttributes(Int_t i, Int_t nlabels, TLatex *t, char *c)
Helper method used by TGaxis::ChangeLabel.
const char * GetTitle() const override
Returns title of object.
TString fChopt
Axis options.
TGaxis & operator=(const TGaxis &)
Assignment operator.
Float_t GetTitleOffset() const
TF1 * fFunction
! Pointer to function computing axis values
void ChangeLabel(Int_t labNum=0, Double_t labAngle=-1., Double_t labSize=-1., Int_t labAlign=-1, Int_t labColor=-1, Int_t labFont=-1, TString labText="")
Define new text attributes for the label number "labNum".
Float_t GetTitleSize() const
static Int_t GetMaxDigits()
Static function returning fgMaxDigits (See SetMaxDigits).
virtual void CenterLabels(Bool_t center=kTRUE)
If center = kTRUE axis labels are centered in the center of the bin.
const char * GetName() const override
Returns name of object.
void SetLabelColor(Int_t labelcolor)
virtual void AdjustBinSize(Double_t A1, Double_t A2, Int_t nold, Double_t &BinLow, Double_t &BinHigh, Int_t &nbins, Double_t &BinWidth)
Internal method for axis labels optimisation.
Float_t fGridLength
Length of the grid in NDC.
Int_t GetLabelColor() const
virtual void SetDecimals(Bool_t dot=kTRUE)
Set the decimals flag.
virtual void CenterTitle(Bool_t center=kTRUE)
If center = kTRUE axis title will be centered. The default is right adjusted.
virtual ~TGaxis()
TGaxis default destructor.
TList * fModLabs
List of modified labels.
void CleanupModLabs()
Correctly cleanup fModLabs - delete content when owned by TGaxis.
Double_t fWmax
Highest value on the axis.
Float_t GetTickSize() const
virtual TGaxis * DrawAxis(Double_t xmin, Double_t ymin, Double_t xmax, Double_t ymax, Double_t wmin, Double_t wmax, Int_t ndiv=510, Option_t *chopt="", Double_t gridlength=0)
Draw this axis with new attributes.
virtual void SetMoreLogLabels(Bool_t more=kTRUE)
Set the kMoreLogLabels bit flag.
void SetTickSize(Float_t ticksize)
void Paint(Option_t *chopt="") override
Draw this axis with its current attributes.
Int_t fNModLabs
Number of modified labels.
Double_t fWmin
Lowest value on the axis.
void SetLabelSize(Float_t labelsize)
void SetFunction(const char *funcname="")
Specify a function to map the axis values.
static Float_t fXAxisExpXOffset
! Exponent X offset for the X axis
virtual void SetName(const char *name)
Change the name of the axis.
static void SetExponentOffset(Float_t xoff=0., Float_t yoff=0., Option_t *axis="xy")
Static function to set X and Y offset of the axis 10^n notation.
void LabelsLimits(const char *label, Int_t &first, Int_t &last)
Internal method to find first and last character of a label.
Bool_t IsOwnedModLabs() const
Returns kTRUE when fModLabs owned by TGaxis and should be cleaned up.
void ResetLabelAttributes(TLatex *t)
Helper method used by TGaxis::ChangeLabel.
Float_t GetLabelSize() const
void SetOption(Option_t *option="")
To set axis options.
TClass * IsA() const override
static void Optimize(Double_t A1, Double_t A2, Int_t nold, Double_t &BinLow, Double_t &BinHigh, Int_t &nbins, Double_t &BWID, Option_t *option="")
Static function to compute reasonable axis limits.
To draw Mathematical Formula.
Double_t GetXsize()
Return size of the formula along X in pad coordinates when the text precision is smaller than 3.
void GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle=kFALSE) override
Return text size in pixels.
virtual void PaintLatex(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Main drawing function.
Use the TLine constructor to create a simple line.
Double_t fY1
Y of 1st point.
Double_t fX1
X of 1st point.
Double_t fX2
X of 2nd point.
TLine & operator=(const TLine &src)
Assignment operator.
Double_t fY2
Y of 2nd point.
virtual void PaintLineNDC(Double_t u1, Double_t v1, Double_t u2, Double_t v2)
Draw this line with new coordinates in NDC.
void Streamer(TBuffer &) override
Stream an object of class TLine.
void Add(TObject *obj) override
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
@ kCanDelete
if object in a list can be deleted
void ToLower()
Change string to lower-case.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
TString & Remove(Ssiz_t pos)
virtual void Streamer(TBuffer &)
Stream a string object.
TString & Append(const char *cs)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Double_t GetTimeOffset() const
Color_t GetGridColor() const
Style_t GetGridStyle() const
Float_t GetTitleOffset(Option_t *axis="X") const
Return title offset.
Width_t GetGridWidth() const
Int_t GetStripDecimals() const
virtual void SetText(Double_t x, Double_t y, const char *text)
static time_t MktimeFromUTC(tm_t *tmstruct)
Equivalent of standard routine "mktime" but using the assumption that tm struct is filled with UTC,...
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.