Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TAxis.cxx
Go to the documentation of this file.
1// @(#)root/hist:$Id$
2// Author: Rene Brun 12/12/94
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include "TAxis.h"
13#include "TVirtualPad.h"
14#include "TStyle.h"
15#include "TError.h"
16#include "THashList.h"
17#include "TList.h"
18#include "TAxisModLab.h"
19#include "TH1.h"
20#include "TObjString.h"
21#include "TDatime.h"
22#include "TTimeStamp.h"
23#include "TBuffer.h"
24#include "TMath.h"
25#include "THLimitsFinder.h"
26#include "strlcpy.h"
27#include "snprintf.h"
28
29#include <iostream>
30#include <cmath>
31#include <ctime>
32#include <cassert>
33
34
35////////////////////////////////////////////////////////////////////////////////
36/** \class TAxis
37 \ingroup Histograms
38 \brief Class to manage histogram axis
39
40This class manages histogram axis. It is referenced by TH1 and TGraph.
41To make a graphical representation of an histogram axis, this class
42references the TGaxis class. TAxis supports axis with fixed or variable bin sizes.
43Labels may be associated to individual bins.
44See examples of various axis representations drawn by class TGaxis.
45*///////////////////////////////////////////////////////////////////////////////
46
47////////////////////////////////////////////////////////////////////////////////
48/// Default constructor.
49
51{
52 fNbins = 1;
53 fXmin = 0;
54 fXmax = 1;
55 fFirst = 0;
56 fLast = 0;
57 fBits2 = 0;
58 fTimeDisplay = false;
59}
60
61////////////////////////////////////////////////////////////////////////////////
62/// Axis constructor for axis with fix bin size
63
65{
66 Set(nbins,xlow,xup);
67}
68
69////////////////////////////////////////////////////////////////////////////////
70/// Axis constructor for variable bin size
71
73{
74 Set(nbins,xbins);
75}
76
77TAxis::TAxis(std::vector<double> const &bins):
78 TAxis(bins.size()-1, bins.data())
79{}
81////////////////////////////////////////////////////////////////////////////////
82/// Destructor.
85{
86 if (fLabels) {
87 fLabels->Delete();
88 delete fLabels;
89 fLabels = nullptr;
90 }
91 if (fModLabs) {
93 delete fModLabs;
94 fModLabs = nullptr;
95 }
96}
97
98////////////////////////////////////////////////////////////////////////////////
99/// Copy constructor.
100
101TAxis::TAxis(const TAxis &axis) : TNamed(axis), TAttAxis(axis)
102{
103 fParent = nullptr;
104 fLabels = nullptr;
105 fModLabs = nullptr;
106
107 axis.TAxis::Copy(*this);
108}
109
110////////////////////////////////////////////////////////////////////////////////
111/// Assignment operator.
112
114{
115 if (this != &axis)
116 axis.TAxis::Copy(*this);
117 return *this;
118}
119
120
121////////////////////////////////////////////////////////////////////////////////
122/// Choose a reasonable time format from the coordinates in the active pad
123/// and the number of divisions in this axis
124/// If orientation = "X", the horizontal axis of the pad will be used for ref.
125/// If orientation = "Y", the vertical axis of the pad will be used for ref.
126
128{
129 const char *formatstr = nullptr;
130 Int_t reasformat = 0;
131 Int_t ndiv,nx1,nx2,n;
134
135 if (!axislength) {
136 length = gPad->GetUxmax() - gPad->GetUxmin();
137 } else {
139 }
140
141 ndiv = GetNdivisions();
142 if (ndiv > 1000) {
143 nx2 = ndiv/100;
144 nx1 = TMath::Max(1, ndiv%100);
145 ndiv = 100*nx2 + Int_t(Double_t(nx1)*gPad->GetAbsWNDC());
146 }
147 ndiv = TMath::Abs(ndiv);
148 n = ndiv - (ndiv/100)*100;
149 awidth = length/n;
150
151// width in seconds ?
152 if (awidth>=.5) {
153 reasformat = 1;
154// width in minutes ?
155 if (awidth>=30) {
156 awidth /= 60; reasformat = 2;
157// width in hours ?
158 if (awidth>=30) {
159 awidth /=60; reasformat = 3;
160// width in days ?
161 if (awidth>=12) {
162 awidth /= 24; reasformat = 4;
163// width in months ?
164 if (awidth>=15.218425) {
165 awidth /= 30.43685; reasformat = 5;
166// width in years ?
167 if (awidth>=6) {
168 awidth /= 12; reasformat = 6;
169 if (awidth>=2) {
170 awidth /= 12; reasformat = 7;
171 }
172 }
173 }
174 }
175 }
176 }
177 }
178// set reasonable format
179 switch (reasformat) {
180 case 0:
181 formatstr = "%S";
182 break;
183 case 1:
184 formatstr = "%Mm%S";
185 break;
186 case 2:
187 formatstr = "%Hh%M";
188 break;
189 case 3:
190 formatstr = "%d-%Hh";
191 break;
192 case 4:
193 formatstr = "%d/%m";
194 break;
195 case 5:
196 formatstr = "%d/%m/%y";
197 break;
198 case 6:
199 formatstr = "%d/%m/%y";
200 break;
201 case 7:
202 formatstr = "%m/%y";
203 break;
204 }
205 return formatstr;
206}
207
208////////////////////////////////////////////////////////////////////////////////
209/// Copy axis structure to another axis
210
211void TAxis::Copy(TObject &obj) const
212{
213 TAxis &axis = static_cast<TAxis &>(obj);
214 TNamed::Copy(axis);
215 TAttAxis::Copy(axis);
216 axis.fNbins = fNbins;
217 axis.fXmin = fXmin;
218 axis.fXmax = fXmax;
219 axis.fFirst = fFirst;
220 axis.fLast = fLast;
221 axis.fBits2 = fBits2;
222 fXbins.Copy(axis.fXbins);
225 axis.fParent = fParent;
226 if (axis.fLabels) {
227 axis.fLabels->Delete();
228 delete axis.fLabels;
229 axis.fLabels = nullptr;
230 }
231 if (fLabels) {
232 //Properly handle case where not all bins have labels
233 axis.fLabels = new THashList(axis.fNbins, 3);
234 TIter next(fLabels);
235 while(auto label = (TObjString *)next()) {
236 TObjString *copyLabel = new TObjString(*label);
237 axis.fLabels->Add(copyLabel);
238 copyLabel->SetUniqueID(label->GetUniqueID());
239 }
240 }
241 if (axis.fModLabs) {
242 axis.fModLabs->Delete();
243 delete axis.fModLabs;
244 axis.fModLabs = nullptr;
245 }
246 if (fModLabs) {
247 axis.fModLabs = new TList();
248 TIter next(fModLabs);
249 while(auto modlabel = (TAxisModLab *)next()) {
252 copyModLabel->SetUniqueID(modlabel->GetUniqueID());
253 }
254 }
255}
256
257////////////////////////////////////////////////////////////////////////////////
258/// Compute distance from point px,py to an axis
259
261{
262 return 9999;
263}
264
265////////////////////////////////////////////////////////////////////////////////
266/// Execute action corresponding to one event
267///
268/// This member function is called when an axis is clicked with the locator.
269/// The axis range is set between the position where the mouse is pressed
270/// and the position where it is released.
271/// If the mouse position is outside the current axis range when it is released
272/// the axis is unzoomed with the corresponding proportions.
273/// Note that the mouse does not need to be in the pad or even canvas
274/// when it is released.
275
277{
278 if (!gPad) return;
279 gPad->ExecuteEventAxis(event,px,py,this);
280}
281
282////////////////////////////////////////////////////////////////////////////////
283/// Find bin number corresponding to abscissa `x`. NOTE: this method does not work with alphanumeric bins !!!
284///
285/// If `x` is underflow or overflow, attempt to extend the axis if TAxis::kCanExtend is true.
286/// Otherwise, return `0` or `fNbins+1`.
287///
288/// @note The underflow bin (`0`) is for any `x` strictly smaller than `fXmin`,
289/// whereas the overflow bin (`nbins+1`) is for any `x` greater or equal than `fXmax`,
290/// as well as for `NaN`. The first regular bin (`1`) is for any `x`
291/// greater or equal than `fXmin` and strictly smaller than `fXmin + binwidth`, and so on.
292
294{
295 Int_t bin;
296 // NOTE: This should not be allowed for Alphanumeric histograms,
297 // but it is heavily used (legacy) in the TTreePlayer to fill alphanumeric histograms.
298 // but in case of alphanumeric do-not extend the axis. It makes no sense
299 if (IsAlphanumeric() && gDebug) Info("FindBin","Numeric query on alphanumeric axis - Sorting the bins or extending the axes / rebinning can alter the correspondence between the label and the bin interval.");
300 if (x < fXmin) { //*-* underflow
301 bin = 0;
302 if (fParent == nullptr) return bin;
303 if (!CanExtend() || IsAlphanumeric() ) return bin;
304 ((TH1*)fParent)->ExtendAxis(x,this);
305 return FindFixBin(x);
306 } else if ( !(x < fXmax)) { //*-* overflow (note the way to catch NaN)
307 bin = fNbins+1;
308 if (fParent == nullptr) return bin;
309 if (!CanExtend() || IsAlphanumeric() ) return bin;
310 ((TH1*)fParent)->ExtendAxis(x,this);
311 return FindFixBin(x);
312 } else {
313 if (!fXbins.fN) { //*-* fix bins
314 const double width = (fXmax-fXmin)/fNbins;
315 const int approxBin = (x-fXmin) / width; // Might be one unit too small/large due to limited precision of subtraction
316 bin = 1 + approxBin - (x < fXmin + width*approxBin) + (fXmin + width*(approxBin+1) <= x);
317 } else { //*-* variable bin sizes
318 //for (bin =1; x >= fXbins.fArray[bin]; bin++);
320 }
321 }
322 return bin;
323}
324
325////////////////////////////////////////////////////////////////////////////////
326/// Find bin number with label.
327/// If the List of labels does not exist create it and make the axis alphanumeric
328/// If one wants just to add a single label- just call TAxis::SetBinLabel
329/// If label is not in the list of labels do the following depending on the
330/// bit TAxis::kCanExtend; of the axis.
331/// - if the bit is set add the new label and if the number of labels exceeds
332/// the number of bins, double the number of bins via TH1::LabelsInflate
333/// - if the bit is not set and the histogram has labels in each bin
334/// set the bit automatically and consider the histogram as alphanumeric
335/// if histogram has only some bins with labels then the histogram is not
336/// consider alphanumeric and return -1
337///
338/// -1 is returned only when the Axis has no parent histogram
339
340Int_t TAxis::FindBin(const char *label)
341{
342 //create list of labels if it does not exist yet
343 if (!fLabels) {
344 if (!fParent) return -1;
345 fLabels = new THashList(fNbins,3);
346 // we set the axis alphanumeric
347 // when list of labels does not exist
348 // do we want to do this also when histogram is not empty ?????
349 if (CanBeAlphanumeric() ) {
352 if (fXmax <= fXmin) {
353 //L.M. Dec 2010 in case of no min and max specified use 0 ->NBINS
354 fXmin = 0;
355 fXmax = fNbins;
356 }
357 }
358 }
359
360 // search for label in the existing list and return it if it exists
361 TObjString *obj = (TObjString*)fLabels->FindObject(label);
362 if (obj) return (Int_t)obj->GetUniqueID();
363
364 // if labels is not in the list and we have already labels
365 if (!IsAlphanumeric()) {
366 // if bins without labels exist or if the axis cannot be set to alphanumeric
368 Info("FindBin","Label %s is not in the list and the axis is not alphanumeric - ignore it",label);
369 return -1;
370 }
371 else {
372 Info("FindBin","Label %s not in the list. It will be added to the histogram",label);
375 }
376 }
377
378 //Not yet in the list. Can we extend the axis ?
380 // {
381 // if (gDebug>0)
382 // Info("FindBin","Label %s is not in the list and the axis cannot be extended - the entry will be added in the underflow bin",label);
383 // return 0;
384 // }
385
387
388 //may be we have to resize the histogram (doubling number of channels)
389 if (n >= fNbins) ((TH1*)fParent)->LabelsInflate(GetName());
390
391 //add new label to the list: assign bin number
392 obj = new TObjString(label);
393 fLabels->Add(obj);
394 obj->SetUniqueID(n+1);
395 return n+1;
396}
397
398////////////////////////////////////////////////////////////////////////////////
399/// Find bin number with label.
400/// If the List of labels does not exist or the label does not exist just return -1 .
401/// Do not attempt to modify the axis. This is different than FindBin
402
403Int_t TAxis::FindFixBin(const char *label) const
404{
405 //create list of labels if it does not exist yet
406 if (!fLabels) return -1;
407
408 // search for label in the existing list and return it if it exists
409 TObjString *obj = (TObjString*)fLabels->FindObject(label);
410 if (obj) return (Int_t)obj->GetUniqueID();
411 return -1;
412}
413
414
415////////////////////////////////////////////////////////////////////////////////
416/// Find bin number corresponding to abscissa `x`
417///
418/// Identical to TAxis::FindBin except that if `x` is an underflow/overflow
419/// no attempt is made to extend the axis.
420/// @see TAxis::FindBin
421
423{
424 Int_t bin;
425 if (x < fXmin) { //*-* underflow
426 bin = 0;
427 } else if ( !(x < fXmax)) { //*-* overflow (note the way to catch NaN)
428 bin = fNbins+1;
429 } else {
430 if (!fXbins.fN) { //*-* fix bins
431 const double width = (fXmax-fXmin)/fNbins;
432 const int approxBin = (x-fXmin) / width; // Might be one unit too small/large due to limited precision of subtraction
433 bin = 1 + approxBin - (x < fXmin + width*approxBin) + (fXmin + width*(approxBin+1) <= x);
434 } else { //*-* variable bin sizes
436 }
437 }
438 return bin;
439}
440
441////////////////////////////////////////////////////////////////////////////////
442/// Return label for bin
443
444const char *TAxis::GetBinLabel(Int_t bin) const
445{
446 if (!fLabels) return "";
447 if (bin <= 0 || bin > fNbins) return "";
448 // Try to find the bin, assuming they are ordered
449 if (auto obj = (TObjString *)fLabels->At(bin - 1)) {
450 const auto binid = (Int_t)obj->GetUniqueID();
451 if (binid == bin) {
452 return obj->GetName();
453 }
454 }
455 // The shortcut did not bring results. We cannot but search linearly
456 TIter next(fLabels);
457 while (auto obj=(TObjString*)next()) {
458 const auto binid = (Int_t)obj->GetUniqueID();
459 if (binid == bin) return obj->GetName();
460 }
461 return "";
462}
463
464////////////////////////////////////////////////////////////////////////////////
465/// Return first bin on the axis
466/// i.e. 1 if no range defined
467/// \note in some cases a zero is returned (see TAxis::SetRange)
468
470{
471 if (!TestBit(kAxisRange)) return 1;
472 return fFirst;
473}
474
475////////////////////////////////////////////////////////////////////////////////
476/// Return last bin on the axis
477/// i.e. fNbins if no range defined
478/// \note in some cases a zero is returned (see TAxis::SetRange)
479
481{
482 if (!TestBit(kAxisRange)) return fNbins;
483 return fLast;
484}
485
486////////////////////////////////////////////////////////////////////////////////
487/// Return center of bin
488
490{
492 if (!fXbins.fN || bin<1 || bin>fNbins) {
494 return fXmin + (bin - 0.5) * binwidth;
495 } else {
496 binwidth = fXbins.fArray[bin] - fXbins.fArray[bin-1];
497 return fXbins.fArray[bin-1] + 0.5*binwidth;
498 }
499}
500
501////////////////////////////////////////////////////////////////////////////////
502/// Return center of bin in log
503/// With a log-equidistant binning for a bin with low and up edges, the mean is :
504/// 0.5*(ln low + ln up) i.e. sqrt(low*up) in logx (e.g. sqrt(10^0*10^2) = 10).
505/// Imagine a bin with low=1 and up=100 :
506/// - the center in lin is (100-1)/2=50.5
507/// - the center in log would be sqrt(1*100)=10 (!=log(50.5))
508///
509/// NB: if the low edge of the bin is negative, the function returns the bin center
510/// as computed by TAxis::GetBinCenter
511
513{
514 Double_t low,up;
515 if (!fXbins.fN || bin<1 || bin>fNbins) {
517 low = fXmin + (bin-1) * binwidth;
518 up = low+binwidth;
519 } else {
520 low = fXbins.fArray[bin-1];
521 up = fXbins.fArray[bin];
522 }
523 if (low <=0 ) return GetBinCenter(bin);
524 return TMath::Sqrt(low*up);
525}
526////////////////////////////////////////////////////////////////////////////////
527/// Return low edge of bin
528
530{
531 if (fXbins.fN && bin > 0 && bin <=fNbins) return fXbins.fArray[bin-1];
533 return fXmin + (bin-1) * binwidth;
534}
535
536////////////////////////////////////////////////////////////////////////////////
537/// Return up edge of bin
538
540{
543 return fXmin + bin*binwidth;
544 }
545 return fXbins.fArray[bin];
546}
547
548////////////////////////////////////////////////////////////////////////////////
549/// Return bin width
550///
551/// If `bin > fNbins` (overflow bin) or `bin < 1` (underflow bin), the returned bin width is `(fXmax - fXmin) / fNbins`.
552
554{
555 if (fNbins <= 0) return 0;
556 if (fXbins.fN <= 0 || bin >fNbins || bin <1)
557 return (fXmax - fXmin) / Double_t(fNbins);
558 return fXbins.fArray[bin] - fXbins.fArray[bin-1];
559}
560
561
562////////////////////////////////////////////////////////////////////////////////
563/// Return an array with the center of all bins
564
565void TAxis::GetCenter(Double_t *center) const
566{
567 for (Int_t bin = 1; bin <= fNbins; bin++)
568 *(center + bin - 1) = GetBinCenter(bin);
569}
570
571////////////////////////////////////////////////////////////////////////////////
572/// Return an array with the low edge of all bins
573
575{
576 for (Int_t bin = 1; bin <= fNbins; bin++)
577 *(edge + bin - 1) = GetBinLowEdge(bin);
578}
579
580////////////////////////////////////////////////////////////////////////////////
581/// Return the number of axis labels.
582///
583/// It is sometimes useful to know the number of labels on an axis. For instance
584/// when changing the labels with TAxis::ChangeLabel. The number of labels is equal
585/// to `the_number_of_divisions + 1`. By default the number of divisions is
586/// optimised to show a coherent labeling of the main tick marks. After optimisation the
587/// real number of divisions will be smaller or equal to number of divisions requested.
588/// In order to turn off the labeling optimization, it is enough to give a negative
589/// number of divisions to TAttAxis::SetNdivisions. The absolute value of this number will be use as
590/// the exact number of divisions. This method takes the two cases (optimised or not) into
591/// account.
592
594{
595 if (fNdivisions > 0) {
596 Int_t divxo = 0;
597 Double_t x1o = 0.;
598 Double_t x2o = 0.;
599 Double_t bwx = 0.;
601 return divxo+1;
602 } else {
604 return divx%100+1;
605 }
606}
607
608////////////////////////////////////////////////////////////////////////////////
609/// Return *only* the time format from the string fTimeFormat
610
611const char *TAxis::GetTimeFormatOnly() const
612{
613 static TString timeformat;
614 Int_t idF = fTimeFormat.Index("%F");
615 if (idF>=0) {
617 } else {
619 }
620 return timeformat.Data();
621}
622
623////////////////////////////////////////////////////////////////////////////////
624/// Return the time offset in GMT.
625
627
628 Int_t idF = fTimeFormat.Index("%F")+2;
629 if (idF<2) {
630 Warning("GetGMTimeOffset","Time format is not set!");
631 return 0;
632 }
634 if (stime.Length() != 19) {
635 Warning("GetGMTimeOffset","Bad time format!");
636 return 0;
637 }
638
639 TDatime datime(stime.Data());
640 return datime.Convert(kTRUE); // Convert to unix gmt time
641}
642
643////////////////////////////////////////////////////////////////////////////////
644/// Return the ticks option (see SetTicks)
645
646const char *TAxis::GetTicks() const
647{
648 if (TestBit(kTickPlus) && TestBit(kTickMinus)) return "+-";
649 if (TestBit(kTickMinus)) return "-";
650 if (TestBit(kTickPlus)) return "+";
651 return "";
652}
653
654////////////////////////////////////////////////////////////////////////////////
655/// This helper function checks if there is a bin without a label
656/// if all bins have labels, the axis can / will become alphanumeric
657
659{
660 return fLabels->GetSize() != fNbins;
661}
662
663////////////////////////////////////////////////////////////////////////////////
664/// Set option(s) to draw axis with labels
665/// option can be:
666/// - "a" sort by alphabetic order
667/// - ">" sort by decreasing values
668/// - "<" sort by increasing values
669/// - "h" draw labels horizontal
670/// - "v" draw labels vertical
671/// - "u" draw labels up (end of label right adjusted)
672/// - "d" draw labels down (start of label left adjusted)
673
675{
676 if (!fLabels) {
677 Warning("Sort","Cannot sort. No labels");
678 return;
679 }
680 TH1 *h = (TH1*)GetParent();
681 if (!h) {
682 Error("Sort","Axis has no parent");
683 return;
684 }
685
686 h->LabelsOption(option,GetName());
687}
688
689////////////////////////////////////////////////////////////////////////////////
690/// Copy axis attributes to this
691
716
717
718
719////////////////////////////////////////////////////////////////////////////////
720/// Save axis attributes as C++ statement(s) on output stream out
721
722void TAxis::SaveAttributes(std::ostream &out, const char *name, const char *subname)
723{
724 auto prefix = TString::Format(" %s%s->", name, subname);
725
726 if (strlen(GetTitle()))
727 out << prefix << "SetTitle(\"" << TString(GetTitle()).ReplaceSpecialCppChars() << "\");\n";
728 if (fTimeDisplay) {
729 out << prefix << "SetTimeDisplay(1);\n";
730 out << prefix << "SetTimeFormat(\"" << GetTimeFormat() << "\");\n";
731 }
732 if (fLabels) {
733 TIter next(fLabels);
734 while (auto obj = static_cast<TObjString *>(next())) {
735 out << prefix << "SetBinLabel(" << obj->GetUniqueID() << ", \""
736 << TString(obj->GetName()).ReplaceSpecialCppChars() << "\");\n";
737 }
738 }
739
740 if (fFirst || fLast)
741 out << prefix << "SetRange(" << fFirst << ", " << fLast << ");\n";
742
743 if (TestBit(kLabelsHori))
744 out << prefix << "SetBit(TAxis::kLabelsHori);\n";
745
746 if (TestBit(kLabelsVert))
747 out << prefix << "SetBit(TAxis::kLabelsVert);\n";
748
749 if (TestBit(kLabelsDown))
750 out << prefix << "SetBit(TAxis::kLabelsDown);\n";
751
752 if (TestBit(kLabelsUp))
753 out << prefix << "SetBit(TAxis::kLabelsUp);\n";
754
756 out << prefix << "CenterLabels(true);\n";
757
759 out << prefix << "CenterTitle(true);\n";
760
762 out << prefix << "RotateTitle(true);\n";
763
764 if (TestBit(kDecimals))
765 out << prefix << "SetDecimals();\n";
766
768 out << prefix << "SetMoreLogLabels();\n";
769
770 if (TestBit(kNoExponent))
771 out << prefix << "SetNoExponent();\n";
772
773 if (fModLabs) {
774 TIter next(fModLabs);
775 while (auto ml = static_cast<TAxisModLab *>(next())) {
776 if (ml->GetLabNum() == 0)
777 out << prefix << "ChangeLabelByValue(" << ml->GetLabValue();
778 else
779 out << prefix << "ChangeLabel(" << ml->GetLabNum();
780 out << ", " << ml->GetAngle() << ", " << ml->GetSize() << ", " << ml->GetAlign() << ", "
781 << TColor::SavePrimitiveColor(ml->GetColor()) << ", " << ml->GetFont() << ", \""
782 << TString(ml->GetText()).ReplaceSpecialCppChars() << "\");\n";
783 }
784 }
786}
787
788////////////////////////////////////////////////////////////////////////////////
789/// Initialize axis with fix bins
790///
791/// An error is printed if xup or xlow are infinite/nan
792/// (due to resulting undefined fixed bin width)
793///
794/// Set xup <= xlow to force the axis range and number of bins to be automatically
795/// deduced after buffer is full or BufferEmpty is called
796
798{
799 fNbins = nbins;
800 if (!std::isfinite(xlow) || !std::isfinite(xup))
801 Error("TAxis::Set", "Axis limits need to be finite numbers");
802 fXmin = xlow;
803 fXmax = xup;
804 if (!fParent) SetDefaults();
805 if (fXbins.fN > 0) fXbins.Set(0);
806}
807
808////////////////////////////////////////////////////////////////////////////////
809/// Initialize axis with variable bins
810///
811/// An error is printed if bin edges are not in strictly increasing order
812/// or if any of them is infinite or nan
813
814void TAxis::Set(Int_t nbins, const Float_t *xbins)
815{
816 Int_t bin;
817 fNbins = nbins;
818 fXbins.Set(fNbins+1);
819 for (bin = 0; bin <= fNbins; bin++) {
820 if (!std::isfinite(xbins[bin])) {
821 Error("TAxis::Set", "Bin edges need to be finite numbers. Use a large number instead.");
822 }
823 fXbins.fArray[bin] = xbins[bin];
824 }
825 for (bin=1; bin<= fNbins; bin++)
826 if (fXbins.fArray[bin] <= fXbins.fArray[bin - 1])
827 Error("TAxis::Set", "bin edges must be in increasing order");
828 fXmin = fXbins.fArray[0];
830 if (!fParent) SetDefaults();
831}
832
833////////////////////////////////////////////////////////////////////////////////
834/// Initialize axis with variable bins
835
836void TAxis::Set(Int_t nbins, const Double_t *xbins)
837{
838 Int_t bin;
839 fNbins = nbins;
840 fXbins.Set(fNbins+1);
841 for (bin=0; bin<= fNbins; bin++)
842 fXbins.fArray[bin] = xbins[bin];
843 for (bin=1; bin<= fNbins; bin++)
844 if (fXbins.fArray[bin] <= fXbins.fArray[bin - 1])
845 Error("TAxis::Set", "bin edges must be in increasing order");
846 fXmin = fXbins.fArray[0];
848 if (!fParent) SetDefaults();
849}
850
851////////////////////////////////////////////////////////////////////////////////
852/// Set axis alphanumeric
853
855{
857 else fBits2 &= ~kAlphanumeric;
858
859 // clear underflow and overflow (in an alphanumeric situation they do not make sense)
860 // NOTE: using AddBinContent instead of SetBinContent in order to not change
861 // the number of entries
862 //((TH1 *)fParent)->ClearUnderflowAndOverflow();
863 // L.M. 26.1.15 Keep underflow and overflows (see ROOT-7034)
864 if (gDebug && fParent) {
865 TH1 * h = dynamic_cast<TH1*>( fParent);
866 if (!h) return;
867 double s[TH1::kNstat];
868 h->GetStats(s);
869 if (s[0] != 0. && gDebug > 0)
870 Info("SetAlphanumeric","Cannot switch axis %s of histogram %s to alphanumeric: it has non-zero content",GetName(),h->GetName());
871 }
872}
873
874
875////////////////////////////////////////////////////////////////////////////////
876/// Set axis default values (from TStyle)
877
879{
880 fFirst = 0;
881 fLast = 0;
882 fBits2 = 0;
883 char name[2];
884 strlcpy(name,GetName(),2);
885 name[1] = 0;
887 fTimeDisplay = false;
889}
890
891////////////////////////////////////////////////////////////////////////////////
892/// Set label for bin.
893/// If no label list exists, it is created. If all the bins have labels, the
894/// axis becomes alphanumeric and extendable.
895/// New labels will not be added with the Fill method but will end-up in the
896/// underflow bin. See documentation of TAxis::FindBin(const char*)
897
898void TAxis::SetBinLabel(Int_t bin, const char *label)
899{
900 if (!fLabels) fLabels = new THashList(fNbins,3);
901
903 Error("SetBinLabel","Illegal bin number: %d",bin);
904 return;
905 }
906
907 // Check whether this bin already has a label.
908 TIter next(fLabels);
909 TObjString *obj;
910 while ((obj=(TObjString*)next())) {
911 if ( obj->GetUniqueID()==(UInt_t)bin ) {
912 // It does. Overwrite it.
913 obj->SetString(label);
914 // LM need to rehash the labels list (see ROOT-5025)
916 return;
917 }
918 }
919 // It doesn't. Add this new label.
920 obj = new TObjString(label);
921 fLabels->Add(obj);
922 obj->SetUniqueID((UInt_t)bin);
923
924 // check for Alphanumeric case (labels for each bin)
925 if (CanBeAlphanumeric() && fLabels->GetSize() == fNbins) {
928 }
929}
930
931////////////////////////////////////////////////////////////////////////////////
932/// Search for axis modifier by index or value
933
935{
936 if (!fModLabs)
937 return nullptr;
938
939 TIter next(fModLabs);
940 while (auto ml = (TAxisModLab*)next()) {
941 if (ml->GetLabNum() != num)
942 continue;
943
944 if ((num != 0) || (TMath::Abs(v - ml->GetLabValue()) <= eps))
945 return ml;
946 }
947
948 return nullptr;
949}
950
951
952////////////////////////////////////////////////////////////////////////////////
953/// Define new text attributes for the label number "labNum". It allows to do a
954/// fine tuning of the labels. All the attributes can be changed, even the
955/// label text itself.
956///
957/// \param[in] labNum Number of the label to be changed, negative numbers start from the end
958/// \param[in] labAngle New angle value
959/// \param[in] labSize New size (0 erase the label)
960/// \param[in] labAlign New alignment value
961/// \param[in] labColor New label color
962/// \param[in] labFont New label font
963/// \param[in] labText New label text
964///
965/// #### Notes:
966///
967/// - If an attribute should not be changed just give the value "-1".
968/// - If labnum=0 the list of modified labels is reset.
969/// - To erase a label set labSize to 0.
970/// - If labText is not specified or is an empty string, the text label is not changed.
971/// - To retrieve the number of axis labels use TAxis::GetNlabels.
972
975 const TString &labText)
976{
977 // Reset the list of modified labels.
978 if (labNum == 0) {
980 return;
981 }
982
983 if (!fModLabs) fModLabs = new TList();
984
986 if (!ml) {
987 ml = new TAxisModLab();
988 ml->SetLabNum(labNum);
989 fModLabs->Add(ml);
990 }
991
992 ml->SetAngle(labAngle);
993 ml->SetSize(labSize);
994 ml->SetAlign(labAlign);
995 ml->SetColor(labColor);
996 ml->SetFont(labFont);
997 ml->SetText(labText);
998}
999
1000////////////////////////////////////////////////////////////////////////////////
1001/// Define new text attributes for the label value "labValue". It allows to do a
1002/// fine tuning of the labels. All the attributes can be changed, even the
1003/// label text itself.
1004///
1005/// \param[in] labValue Axis value to be changed
1006/// \param[in] labAngle New angle value
1007/// \param[in] labSize New size (0 erase the label)
1008/// \param[in] labAlign New alignment value
1009/// \param[in] labColor New label color
1010/// \param[in] labFont New label font
1011/// \param[in] labText New label text
1012///
1013/// #### Notes:
1014///
1015/// - If an attribute should not be changed just give the value "-1".
1016/// - If labnum=0 the list of modified labels is reset.
1017/// - To erase a label set labSize to 0.
1018/// - If labText is not specified or is an empty string, the text label is not changed.
1019/// - To retrieve the number of axis labels use TAxis::GetNlabels.
1020
1023 const TString &labText)
1024{
1025 if (!fModLabs) fModLabs = new TList();
1026
1027 TAxisModLab *ml = FindModLab(0, labValue, 0.);
1028 if (!ml) {
1029 ml = new TAxisModLab();
1030 ml->SetLabValue(labValue);
1031 fModLabs->Add(ml);
1032 }
1033
1034 ml->SetAngle(labAngle);
1035 ml->SetSize(labSize);
1036 ml->SetAlign(labAlign);
1037 ml->SetColor(labColor);
1038 ml->SetFont(labFont);
1039 ml->SetText(labText);
1040}
1041
1042////////////////////////////////////////////////////////////////////////////////
1043/// Set the viewing range for the axis using bin numbers.
1044///
1045/// \param first First bin of the range.
1046/// \param last Last bin of the range.
1047///
1048/// To set a range using the axis coordinates, use TAxis::SetRangeUser.
1049///
1050/// If `first == last == 0` or if `first > last` or if the range specified does
1051/// not intersect at all with the maximum available range `[0, fNbins + 1]`,
1052/// then the viewing range is reset by removing the bit TAxis::kAxisRange. In this
1053/// case, the functions TAxis::GetFirst() and TAxis::GetLast() will return 1
1054/// and fNbins.
1055///
1056/// If the range specified partially intersects with `[0, fNbins + 1]`, then the
1057/// intersection range is accepted. For instance, if `first == -2` and `last == fNbins`,
1058/// the accepted range will be `[0, fNbins]` (`fFirst = 0` and `fLast = fNbins`).
1059///
1060/// If `last > fNbins`, the overflow bin is included in the range and will be displayed during drawing.
1061/// If `first < 1`, the underflow bin is included in the range and will be displayed during drawing.
1062///
1063/// \note For historical reasons, SetRange(0,0) resets the range even though bin 0 is
1064/// technically reserved for the underflow; in order to set the range of the axis
1065/// so that it only includes the underflow, use `SetRange(-1,0)`.
1066/// \note This function will also restrict the fitting range
1067
1068void TAxis::SetRange(Int_t first, Int_t last)
1069{
1070
1071 Int_t nCells = fNbins + 1; // bins + overflow
1072
1073 // special reset range cases
1074 if (last < first || (first < 0 && last < 0) ||
1075 (first > nCells && last > nCells) || (first == 0 && last == 0)
1076 ) {
1077 fFirst = 1;
1078 fLast = fNbins;
1079 SetBit(kAxisRange, false);
1080 } else {
1081 fFirst = std::max(first, 0);
1082 fLast = std::min(last, nCells);
1083 SetBit(kAxisRange, true);
1084 }
1085}
1086
1087////////////////////////////////////////////////////////////////////////////////
1088/// Set the viewing range for the axis from `ufirst` to `ulast` (in user coordinates,
1089/// that is, the "natural" axis coordinates).
1090/// To set a range using the axis bin numbers, use TAxis::SetRange.
1091///
1092/// If `ulast > fXmax`, the overflow bin is included in the range and will be displayed during drawing.
1093/// If `ufirst < fXmin`, the underflow bin is included in the range and will be displayed during drawing.
1094///
1095/// \note This function will also restrict the fitting range
1096
1098{
1099 if (!strstr(GetName(),"xaxis")) {
1100 TH1 *hobj = (TH1*)GetParent();
1101 if (hobj &&
1102 ((hobj->GetDimension() == 2 && strstr(GetName(),"zaxis"))
1103 || (hobj->GetDimension() == 1 && strstr(GetName(),"yaxis")))) {
1104 hobj->SetMinimum(ufirst);
1105 hobj->SetMaximum(ulast);
1106 return;
1107 }
1108 }
1111 // fixes for numerical error and for https://savannah.cern.ch/bugs/index.php?99777
1112 if (GetBinUpEdge(ifirst) <= ufirst ) ifirst += 1;
1113 if (GetBinLowEdge(ilast) >= ulast ) ilast -= 1;
1115}
1116
1117////////////////////////////////////////////////////////////////////////////////
1118/// Set ticks orientation.
1119/// option = "+" ticks drawn on the "positive side" (default)
1120/// option = "-" ticks drawn on the "negative side"
1121/// option = "+-" ticks drawn on both sides
1122/// option = "" ticks will be drawn as whatever is defined as default. No bit is set internally.
1123
1131
1132////////////////////////////////////////////////////////////////////////////////
1133/// Change the format used for time plotting
1134///
1135/// The format string for date and time use the same options as the one used
1136/// in the standard strftime C function, i.e. :
1137/// for date :
1138///
1139/// %a abbreviated weekday name
1140/// %b abbreviated month name
1141/// %d day of the month (01-31)
1142/// %m month (01-12)
1143/// %y year without century
1144///
1145/// for time :
1146///
1147/// %H hour (24-hour clock)
1148/// %I hour (12-hour clock)
1149/// %p local equivalent of AM or PM
1150/// %M minute (00-59)
1151/// %S seconds (00-61)
1152/// %% %
1153///
1154/// This function allows also to define the time offset. It is done via %F
1155/// which should be appended at the end of the format string. The time
1156/// offset has the following format: 'yyyy-mm-dd hh:mm:ss'
1157/// Example:
1158///
1159/// h = new TH1F("Test","h",3000,0.,200000.);
1160/// h->GetXaxis()->SetTimeDisplay(1);
1161/// h->GetXaxis()->SetTimeFormat("%d\/%m\/%y%F2000-02-28 13:00:01");
1162///
1163/// This defines the time format being "dd/mm/yy" and the time offset as the
1164/// February 28th 2003 at 13:00:01
1165///
1166/// If %F is not specified, the time offset used will be the one defined by:
1167/// gStyle->SetTimeOffset. For example like that:
1168///
1169/// TDatime da(2003,02,28,12,00,00);
1170/// gStyle->SetTimeOffset(da.Convert());
1171
1173{
1175
1176 if (timeformat.Index("%F")>=0 || timeformat.IsNull()) {
1178 return;
1179 }
1180
1181 Int_t idF = fTimeFormat.Index("%F");
1182 if (idF>=0) {
1187 } else {
1190 }
1191}
1192
1193
1194////////////////////////////////////////////////////////////////////////////////
1195/// Change the time offset
1196/// If option = "gmt", set display mode to GMT.
1197
1199{
1200 TString opt = option;
1201 opt.ToLower();
1202
1203 char tmp[20];
1204 time_t timeoff;
1205 struct tm* utctis;
1206 Int_t idF = fTimeFormat.Index("%F");
1207 if (idF>=0) fTimeFormat.Remove(idF);
1208 fTimeFormat.Append("%F");
1209
1210 timeoff = (time_t)((Long_t)(toffset));
1211 // offset is always saved in GMT to allow file transport
1212 // to different time zones
1213 utctis = gmtime(&timeoff);
1214
1215 strftime(tmp,20,"%Y-%m-%d %H:%M:%S",utctis);
1217
1218 // append the decimal part of the time offset
1220 snprintf(tmp,20,"s%g",ds);
1222
1223 // add GMT/local option
1224 if (opt.Contains("gmt")) fTimeFormat.Append(" GMT");
1225}
1226
1227
1228////////////////////////////////////////////////////////////////////////////////
1229/// Stream an object of class TAxis.
1230
1232{
1233 if (R__b.IsReading()) {
1234 UInt_t R__s, R__c;
1235 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1236 if (R__v > 5) {
1237 R__b.ReadClassBuffer(TAxis::Class(), this, R__v, R__s, R__c);
1238 return;
1239 }
1240 //====process old versions before automatic schema evolution
1243 R__b >> fNbins;
1244 if (R__v < 5) {
1246 R__b >> xmin; fXmin = xmin;
1247 R__b >> xmax; fXmax = xmax;
1248 Float_t *xbins = nullptr;
1249 Int_t n = R__b.ReadArray(xbins);
1250 fXbins.Set(n);
1251 for (Int_t i=0;i<n;i++) fXbins.fArray[i] = xbins[i];
1252 delete [] xbins;
1253 } else {
1254 R__b >> fXmin;
1255 R__b >> fXmax;
1257 }
1258 if (R__v > 2) {
1259 R__b >> fFirst;
1260 R__b >> fLast;
1261 // following lines required to repair for a bug in Root version 1.03
1264 if (fLast < fFirst) { fFirst = 0; fLast = 0;}
1265 if (fFirst ==0 && fLast == 0) SetBit(kAxisRange,false);
1266 }
1267 if (R__v > 3) {
1268 R__b >> fTimeDisplay;
1270 } else {
1271 SetTimeFormat();
1272 }
1273 R__b.CheckByteCount(R__s, R__c, TAxis::IsA());
1274 //====end of old versions
1275
1276 } else {
1277 R__b.WriteClassBuffer(TAxis::Class(),this);
1278 }
1279}
1280
1281////////////////////////////////////////////////////////////////////////////////
1282/// Reset first & last bin to the full range
1283
1285{
1286 if (!gPad) {
1287 Warning("TAxis::UnZoom","Cannot UnZoom if gPad does not exist. Did you mean to draw the TAxis first?");
1288 return;
1289 }
1290 gPad->SetView();
1291
1292 //unzoom object owning this axis
1293 SetRange(0,0);
1294 TH1 *hobj1 = dynamic_cast<TH1 *>(GetParent());
1295 if (!strstr(GetName(),"xaxis")) {
1296 if (!hobj1) return;
1297 if (hobj1->GetDimension() == 2) {
1298 if (strstr(GetName(),"zaxis")) {
1299 hobj1->SetMinimum();
1300 hobj1->SetMaximum();
1301 hobj1->ResetBit(TH1::kIsZoomed);
1302 }
1303 return;
1304 }
1305 if (strcmp(hobj1->GetName(),"hframe") == 0 ) {
1306 hobj1->SetMinimum(fXmin);
1307 hobj1->SetMaximum(fXmax);
1308 } else {
1309 if (fXmin == hobj1->GetMinimumStored() && fXmax == hobj1->GetMaximumStored()) {
1310 hobj1->SetMinimum(fXmin);
1311 hobj1->SetMaximum(fXmax);
1312 } else {
1313 hobj1->SetMinimum();
1314 hobj1->SetMaximum();
1315 }
1316 hobj1->ResetBit(TH1::kIsZoomed);
1317 }
1318 }
1319 //must unzoom all histograms in the pad
1320 TIter next(gPad->GetListOfPrimitives());
1321 TObject *obj;
1322 while ((obj= next())) {
1323 if (!obj->InheritsFrom(TH1::Class())) continue;
1324 TH1 *hobj = (TH1*)obj;
1325 if (hobj == hobj1) continue;
1326 if (!strstr(GetName(),"xaxis")) {
1327 if (hobj->GetDimension() == 2) {
1328 if (strstr(GetName(),"zaxis")) {
1329 hobj->SetMinimum();
1330 hobj->SetMaximum();
1331 hobj->ResetBit(TH1::kIsZoomed);
1332 } else {
1333 hobj->GetYaxis()->SetRange(0,0);
1334 }
1335 return;
1336 }
1337 if (strcmp(hobj->GetName(),"hframe") == 0 ) {
1338 hobj->SetMinimum(fXmin);
1339 hobj->SetMaximum(fXmax);
1340 } else {
1341 hobj->SetMinimum();
1342 hobj->SetMaximum();
1343 hobj->ResetBit(TH1::kIsZoomed);
1344 }
1345 } else {
1346 hobj->GetXaxis()->SetRange(0,0);
1347 }
1348 }
1349
1350 gPad->UnZoomed();
1351}
1352
1353////////////////////////////////////////////////////////////////////////////////
1354/// Zoom out by a factor of 'factor' (default =2)
1355/// uses previous zoom factor by default
1356/// Keep center defined by 'offset' fixed
1357/// ie. -1 at left of current range, 0 in center, +1 at right
1358
1360{
1361
1362 if (factor <= 0) factor = 2;
1363 Double_t center = (GetFirst()*(1-offset) + GetLast()*(1+offset))/2.;
1364 Int_t first = int(TMath::Floor(center+(GetFirst()-center)*factor + 0.4999999));
1365 Int_t last = int(TMath::Floor(center+(GetLast() -center)*factor + 0.5000001));
1366 if (first==GetFirst() && last==GetLast()) { first--; last++; }
1367 SetRange(first,last);
1368}
#define SafeDelete(p)
Definition RConfig.hxx:531
#define h(i)
Definition RSha256.hxx:106
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
short Version_t
Class version identifier (short)
Definition RtypesCore.h:79
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
Definition RtypesCore.h:68
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
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 offset
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 length
Option_t Option_t width
char name[80]
Definition TGX11.cxx:145
float xmin
float xmax
Int_t gDebug
Global variable setting the debug level. Set to 0 to disable, increase it in steps of 1 to increase t...
Definition TROOT.cxx:783
R__EXTERN TStyle * gStyle
Definition TStyle.h:442
#define gPad
#define snprintf
Definition civetweb.c:1579
Double_t * fArray
Definition TArrayD.h:30
void Streamer(TBuffer &) override
Stream a TArrayD object.
Definition TArrayD.cxx:148
void Copy(TArrayD &array) const
Definition TArrayD.h:42
void Set(Int_t n) override
Set size of this array to n doubles.
Definition TArrayD.cxx:105
Int_t fN
Definition TArray.h:38
Manages histogram axis attributes.
Definition TAttAxis.h:19
virtual Color_t GetTitleColor() const
Definition TAttAxis.h:47
virtual Color_t GetLabelColor() const
Definition TAttAxis.h:39
Int_t fNdivisions
Number of divisions(10000*n3 + 100*n2 + n1)
Definition TAttAxis.h:21
virtual Int_t GetNdivisions() const
Definition TAttAxis.h:37
virtual Color_t GetAxisColor() const
Definition TAttAxis.h:38
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title.
Definition TAttAxis.cxx:279
virtual Style_t GetTitleFont() const
Definition TAttAxis.h:48
virtual Float_t GetLabelOffset() const
Definition TAttAxis.h:41
virtual void SetAxisColor(Color_t color=1, Float_t alpha=1.)
Set color of the line axis and tick marks.
Definition TAttAxis.cxx:141
virtual void SetLabelSize(Float_t size=0.04)
Set size of axis labels.
Definition TAttAxis.cxx:184
virtual Style_t GetLabelFont() const
Definition TAttAxis.h:40
virtual void SetTitleFont(Style_t font=62)
Set the title font.
Definition TAttAxis.cxx:308
virtual void SetLabelOffset(Float_t offset=0.005)
Set distance between the axis and the labels.
Definition TAttAxis.cxx:172
virtual void SetLabelFont(Style_t font=62)
Set labels' font.
Definition TAttAxis.cxx:161
virtual void SetTitleSize(Float_t size=0.04)
Set size of axis title.
Definition TAttAxis.cxx:290
virtual void SaveAttributes(std::ostream &out, const char *name, const char *subname)
Save axis attributes as C++ statement(s) on output stream out.
Definition TAttAxis.cxx:110
virtual void SetTitleColor(Color_t color=1)
Set color of axis title.
Definition TAttAxis.cxx:299
virtual Float_t GetTitleSize() const
Definition TAttAxis.h:45
virtual void Streamer(TBuffer &)
Stream an object of class TAttAxis.
Definition TAttAxis.cxx:317
virtual Float_t GetLabelSize() const
Definition TAttAxis.h:42
virtual Float_t GetTickLength() const
Definition TAttAxis.h:46
virtual void ResetAttAxis(Option_t *option="")
Reset axis attributes.
Definition TAttAxis.cxx:78
virtual Float_t GetTitleOffset() const
Definition TAttAxis.h:44
virtual void SetTickLength(Float_t length=0.03)
Set tick mark length.
Definition TAttAxis.cxx:265
virtual void SetNdivisions(Int_t n=510, Bool_t optim=kTRUE)
Set the number of divisions for this axis.
Definition TAttAxis.cxx:214
void Copy(TAttAxis &attaxis) const
Copy of the object.
Definition TAttAxis.cxx:60
virtual void SetLabelColor(Color_t color=1, Float_t alpha=1.)
Set color of labels.
Definition TAttAxis.cxx:151
TAxis helper class used to store the modified labels.
Definition TAxisModLab.h:21
Class to manage histogram axis.
Definition TAxis.h:32
virtual void GetCenter(Double_t *center) const
Return an array with the center of all bins.
Definition TAxis.cxx:565
virtual void SetTimeOffset(Double_t toffset, Option_t *option="local")
Change the time offset If option = "gmt", set display mode to GMT.
Definition TAxis.cxx:1198
virtual void LabelsOption(Option_t *option="h")
Set option(s) to draw axis with labels option can be:
Definition TAxis.cxx:674
virtual void SetDefaults()
Set axis default values (from TStyle)
Definition TAxis.cxx:878
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
Definition TAxis.cxx:898
Int_t fLast
Last bin to display.
Definition TAxis.h:40
static TClass * Class()
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, const TString &labText="")
Define new text attributes for the label number "labNum".
Definition TAxis.cxx:973
Bool_t IsAlphanumeric() const
Definition TAxis.h:90
virtual void ZoomOut(Double_t factor=0, Double_t offset=0)
Zoom out by a factor of 'factor' (default =2) uses previous zoom factor by default Keep center define...
Definition TAxis.cxx:1359
const char * GetTitle() const override
Returns title of object.
Definition TAxis.h:137
Int_t GetNlabels() const
Return the number of axis labels.
Definition TAxis.cxx:593
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Definition TAxis.cxx:489
TObject * fParent
! Object owning this axis
Definition TAxis.h:44
Double_t fXmax
Upper edge of last bin.
Definition TAxis.h:37
Int_t DistancetoPrimitive(Int_t px, Int_t py) override
Compute distance from point px,py to an axis.
Definition TAxis.cxx:260
Bool_t CanExtend() const
Definition TAxis.h:88
TArrayD fXbins
Bin edges array in X.
Definition TAxis.h:38
TAxis()
Default constructor.
Definition TAxis.cxx:50
UInt_t GetTimeOffset()
Return the time offset in GMT.
Definition TAxis.cxx:626
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TAxis.cxx:276
virtual void UnZoom()
Reset first & last bin to the full range.
Definition TAxis.cxx:1284
THashList * fLabels
List of labels.
Definition TAxis.h:45
void SetCanExtend(Bool_t canExtend)
Definition TAxis.h:92
void Copy(TObject &axis) const override
Copy axis structure to another axis.
Definition TAxis.cxx:211
virtual void SetTicks(Option_t *option="+")
Set ticks orientation.
Definition TAxis.cxx:1124
@ kTickMinus
Definition TAxis.h:65
@ kLabelsUp
Definition TAxis.h:75
@ kCenterTitle
Definition TAxis.h:67
@ kRotateTitle
Definition TAxis.h:69
@ kNoExponent
Definition TAxis.h:71
@ kMoreLogLabels
Definition TAxis.h:77
@ kTickPlus
Definition TAxis.h:64
@ kLabelsDown
Definition TAxis.h:74
@ kLabelsHori
Definition TAxis.h:72
@ kAxisRange
Definition TAxis.h:66
@ kDecimals
Definition TAxis.h:63
@ kCenterLabels
Bit 13 is used by TObject.
Definition TAxis.h:68
@ kLabelsVert
Definition TAxis.h:73
Bool_t fTimeDisplay
On/off displaying time values instead of numerics.
Definition TAxis.h:42
TList * fModLabs
List of modified labels.
Definition TAxis.h:46
const char * GetBinLabel(Int_t bin) const
Return label for bin.
Definition TAxis.cxx:444
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
Definition TAxis.cxx:293
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Definition TAxis.cxx:529
Int_t fNbins
Number of bins.
Definition TAxis.h:35
Double_t fXmin
Low edge of first bin.
Definition TAxis.h:36
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
Definition TAxis.cxx:797
Bool_t HasBinWithoutLabel() const
This helper function checks if there is a bin without a label if all bins have labels,...
Definition TAxis.cxx:658
TAxisModLab * FindModLab(Int_t num, Double_t v=0., Double_t eps=0.) const
Search for axis modifier by index or value.
Definition TAxis.cxx:934
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x
Definition TAxis.cxx:422
const char * ChooseTimeFormat(Double_t axislength=0)
Choose a reasonable time format from the coordinates in the active pad and the number of divisions in...
Definition TAxis.cxx:127
@ kAlphanumeric
Axis is alphanumeric.
Definition TAxis.h:50
void SaveAttributes(std::ostream &out, const char *name, const char *subname) override
Save axis attributes as C++ statement(s) on output stream out.
Definition TAxis.cxx:722
TClass * IsA() const override
Definition TAxis.h:179
Int_t GetLast() const
Return last bin on the axis i.e.
Definition TAxis.cxx:480
virtual void ImportAttributes(const TAxis *axis)
Copy axis attributes to this.
Definition TAxis.cxx:692
virtual const char * GetTimeFormatOnly() const
Return only the time format from the string fTimeFormat.
Definition TAxis.cxx:611
virtual Double_t GetBinCenterLog(Int_t bin) const
Return center of bin in log With a log-equidistant binning for a bin with low and up edges,...
Definition TAxis.cxx:512
void SetAlphanumeric(Bool_t alphanumeric=kTRUE)
Set axis alphanumeric.
Definition TAxis.cxx:854
void Streamer(TBuffer &) override
Stream an object of class TAxis.
Definition TAxis.cxx:1231
TAxis & operator=(const TAxis &)
Assignment operator.
Definition TAxis.cxx:113
~TAxis() override
Destructor.
Definition TAxis.cxx:84
void ChangeLabelByValue(Double_t labValue, Double_t labAngle=-1., Double_t labSize=-1., Int_t labAlign=-1, Int_t labColor=-1, Int_t labFont=-1, const TString &labText="")
Define new text attributes for the label value "labValue".
Definition TAxis.cxx:1021
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
Set the viewing range for the axis from ufirst to ulast (in user coordinates, that is,...
Definition TAxis.cxx:1097
virtual const char * GetTimeFormat() const
Definition TAxis.h:134
virtual void GetLowEdge(Double_t *edge) const
Return an array with the low edge of all bins.
Definition TAxis.cxx:574
virtual void SetTimeFormat(const char *format="")
Change the format used for time plotting.
Definition TAxis.cxx:1172
Bool_t CanBeAlphanumeric()
Definition TAxis.h:89
TString fTimeFormat
Date&time format, ex: 09/12/99 12:34:00.
Definition TAxis.h:43
virtual TObject * GetParent() const
Definition TAxis.h:130
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
Definition TAxis.cxx:1068
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
Definition TAxis.cxx:553
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition TAxis.cxx:539
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition TAxis.cxx:469
virtual const char * GetTicks() const
Return the ticks option (see SetTicks)
Definition TAxis.cxx:646
UShort_t fBits2
Second bit status word.
Definition TAxis.h:41
Int_t fFirst
First bin to display.
Definition TAxis.h:39
Buffer base class used for serializing objects.
Definition TBuffer.h:43
virtual Int_t GetEntries() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
static TString SavePrimitiveColor(Int_t ci)
Convert color in C++ statement which can be used in SetColor directives Produced statement either inc...
Definition TColor.cxx:2556
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
Definition TDatime.h:37
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:109
virtual void GetStats(Double_t *stats) const
fill the array stats from the contents of this histogram The array stats must be correctly dimensione...
Definition TH1.cxx:7962
@ kNstat
Size of statistics data (up to TProfile3D)
Definition TH1.h:422
static TClass * Class()
@ kIsZoomed
Bit set when zooming on Y axis.
Definition TH1.h:407
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.
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition THashList.h:34
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
void Rehash(Int_t newCapacity)
Rehash the hashlist.
TObject * FindObject(const char *name) const override
Find object using its name.
A doubly linked list.
Definition TList.h:38
void Add(TObject *obj) override
Definition TList.h:81
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
Definition TList.cxx:600
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Definition TList.cxx:487
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
void Copy(TObject &named) const override
Copy this to obj.
Definition TNamed.cxx:93
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:173
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
void Streamer(TBuffer &) override
Stream an object of class TObject.
Collectable string class.
Definition TObjString.h:28
void SetString(const char *s)
Definition TObjString.h:45
Mother of all ROOT objects.
Definition TObject.h:42
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:204
virtual UInt_t GetUniqueID() const
Return the unique object id.
Definition TObject.cxx:477
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1081
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:885
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:546
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1095
virtual void SetUniqueID(UInt_t uid)
Set the unique object id.
Definition TObject.cxx:896
void ResetBit(UInt_t f)
Definition TObject.h:203
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:1069
Basic string class.
Definition TString.h:138
Ssiz_t Length() const
Definition TString.h:425
void ToLower()
Change string to lower-case.
Definition TString.cxx:1189
TString & ReplaceSpecialCppChars()
Find special characters which are typically used in printf() calls and replace them by appropriate es...
Definition TString.cxx:1121
TString & Remove(Ssiz_t pos)
Definition TString.h:694
virtual void Streamer(TBuffer &)
Stream a string object.
Definition TString.cxx:1418
TString & Append(const char *cs)
Definition TString.h:581
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2385
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:641
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:660
Double_t GetTimeOffset() const
Definition TStyle.h:271
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Definition TMathBase.h:249
Double_t Floor(Double_t x)
Rounds x downward, returning the largest integral value that is not greater than x.
Definition TMath.h:693
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:675
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Binary search in an array of n values to locate value.
Definition TMathBase.h:329
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:122