ROOT logo
// @(#)root/histpainter:$Id$
// Author: Rene Brun   15/11/2002

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "Riostream.h"
#include "TROOT.h"
#include "TPaletteAxis.h"
#include "TVirtualPad.h"
#include "TStyle.h"
#include "TMath.h"
#include "TView.h"
#include "TH1.h"
#include "TGaxis.h"

ClassImp(TPaletteAxis)


//______________________________________________________________________________
/* Begin_Html
<center><h2>The palette painting class</h2></center>

A <tt>TPaletteAxis</tt> object is used to display the color palette when
drawing 2-d histograms.
<p>
The <tt>TPaletteAxis</tt> is automatically created drawn when drawing a 2-D
histogram when the option "Z" is specified.
<p>
A <tt>TPaletteAxis</tt> object is added to the histogram list of functions and
can be retrieved doing:
<pre>
   TPaletteAxis *palette = (TPaletteAxis*)h->GetListOfFunctions()->FindObject("palette");
</pre>
then the pointer <tt>palette</tt> can be used to change the pallette attributes.
<p>
Because the palette is created at painting time only, one must issue a:
<pre>
   gPad->Update();
</pre>
before retrieving the palette pointer in order to create the palette. The following
macro gives an example.

End_Html
Begin_Macro(source)
{
   TCanvas *c1 = new TCanvas("c1","c1",600,400);
   TH2F *h2 = new TH2F("h2","Example of a resized palette ",40,-4,4,40,-20,20);
   Float_t px, py;
   for (Int_t i = 0; i < 25000; i++) {
      gRandom->Rannor(px,py);
      h2->Fill(px,5*py);
   }
   gStyle->SetPalette(1);
   h2->Draw("COLZ");
   gPad->Update();
   TPaletteAxis *palette = (TPaletteAxis*)h2->GetListOfFunctions()->FindObject("palette");
   palette->SetY2NDC(0.7);
   return c1;
}
End_Macro
Begin_Html

<tt>TPaletteAxis</tt> inherits from <tt>TBox</tt> and <tt>TPave</tt>. The methods
allowing to specify the palette position are inherited from these two classes.
<p>
The palette can be interactively moved and resized. The context menu
can be used to set the axis attributes.
<p>
It is possible to select a range on the axis to set the min/max in z

End_Html */


//______________________________________________________________________________
TPaletteAxis::TPaletteAxis(): TPave()
{
   // Palette default constructor.

   fH  = 0;
   SetName("");
}


//______________________________________________________________________________
TPaletteAxis::TPaletteAxis(Double_t x1, Double_t y1, Double_t x2, Double_t  y2, TH1 *h)
   : TPave(x1, y1, x2, y2)
{
   // Palette normal constructor.

   fH = h;
   SetName("palette");
   TAxis *zaxis = fH->GetZaxis();
   fAxis.ImportAxisAttributes(zaxis);
   if (gPad->GetView()) SetBit(kHasView);
}


//______________________________________________________________________________
TPaletteAxis::~TPaletteAxis()
{
   // Palette destructor.
}


//______________________________________________________________________________
TPaletteAxis::TPaletteAxis(const TPaletteAxis &palette) : TPave(palette)
{
   // Palette copy constructor.

   ((TPaletteAxis&)palette).Copy(*this);
}


//______________________________________________________________________________
TPaletteAxis& TPaletteAxis::operator=(const TPaletteAxis &orig)
{
   // Assignment operator.

   orig.Copy( *this );
   return *this;
}


//______________________________________________________________________________
void TPaletteAxis::Copy(TObject &obj) const
{
   // Copy a palette to a palette.

   TPave::Copy(obj);
   ((TPaletteAxis&)obj).fH    = fH;
   ((TPaletteAxis&)obj).fName = fName;
}


//______________________________________________________________________________
Int_t TPaletteAxis::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Check if mouse on the axis region.

   Int_t plxmax = gPad->XtoAbsPixel(fX2);
   Int_t plymin = gPad->YtoAbsPixel(fY1);
   Int_t plymax = gPad->YtoAbsPixel(fY2);
   if (px > plxmax && px < plxmax + 30 && py >= plymax && py <= plymin) return px - plxmax;

   //otherwise check if inside the box
   return TPave::DistancetoPrimitive(px, py);
}


//______________________________________________________________________________
void TPaletteAxis::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Check if mouse on the axis region.

   static Int_t kmode = 0;
   Int_t plxmin = gPad->XtoAbsPixel(fX1);
   Int_t plxmax = gPad->XtoAbsPixel(fX2);
   if (kmode != 0 || px <= plxmax) {
      if (event == kButton1Down) kmode = 1;
      TBox::ExecuteEvent(event, px, py);
      if (event == kButton1Up) kmode = 0;
      // In case palette coordinates have been modified, recompute NDC coordinates
      Double_t dpx  = gPad->GetX2() - gPad->GetX1();
      Double_t dpy  = gPad->GetY2() - gPad->GetY1();
      Double_t xp1  = gPad->GetX1();
      Double_t yp1  = gPad->GetY1();
      fX1NDC = (fX1 - xp1) / dpx;
      fY1NDC = (fY1 - yp1) / dpy;
      fX2NDC = (fX2 - xp1) / dpx;
      fY2NDC = (fY2 - yp1) / dpy;
      return;
   }
   gPad->SetCursor(kHand);
   static Double_t ratio1, ratio2;
   static Int_t px1old, py1old, px2old, py2old;
   Double_t temp, xmin, xmax;

   switch (event) {

      case kButton1Down:
         ratio1 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
         py1old = gPad->YtoAbsPixel(fY1 + ratio1 * (fY2 - fY1));
         px1old = plxmin;
         px2old = plxmax;
         py2old = py1old;
         gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
         gVirtualX->SetLineColor(-1);
         // No break !!!

      case kButton1Motion:
         gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
         ratio2 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
         py2old = gPad->YtoAbsPixel(fY1 + ratio2 * (fY2 - fY1));
         gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
         break;

      case kButton1Up:
         if (gROOT->IsEscaped()) {
            gROOT->SetEscape(kFALSE);
            break;
         }

         ratio2 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
         xmin = ratio1;
         xmax = ratio2;
         if (xmin > xmax) {
            temp   = xmin;
            xmin   = xmax;
            xmax   = temp;
            temp   = ratio1;
            ratio1 = ratio2;
            ratio2 = temp;
         }
         if (ratio2 - ratio1 > 0.05) {
            if (fH->GetDimension() == 2) {
               Double_t zmin = fH->GetMinimum();
               Double_t zmax = fH->GetMaximum();
               if (gPad->GetLogz()) {
                  if (zmin <= 0 && zmax > 0) zmin = TMath::Min((Double_t)1,
                                                                  (Double_t)0.001 * zmax);
                  zmin = TMath::Log10(zmin);
                  zmax = TMath::Log10(zmax);
               }
               Double_t newmin = zmin + (zmax - zmin) * ratio1;
               Double_t newmax = zmin + (zmax - zmin) * ratio2;
               if (newmin < zmin)newmin = fH->GetBinContent(fH->GetMinimumBin());
               if (newmax > zmax)newmax = fH->GetBinContent(fH->GetMaximumBin());
               if (gPad->GetLogz()) {
                  newmin = TMath::Exp(2.302585092994 * newmin);
                  newmax = TMath::Exp(2.302585092994 * newmax);
               }
               fH->SetMinimum(newmin);
               fH->SetMaximum(newmax);
               fH->SetBit(TH1::kIsZoomed);
            }
            gPad->Modified(kTRUE);
         }
         gVirtualX->SetLineColor(-1);
         kmode = 0;
         break;
   }
}


//______________________________________________________________________________
Int_t TPaletteAxis::GetBinColor(Int_t i, Int_t j)
{
   // Returns the color index of the bin (i,j).
   //
   // This function should be used after an histogram has been plotted with the
   // option COL or COLZ like in the following example:
   //
   //   h2->Draw("COLZ");
   //   gPad->Update();
   //   TPaletteAxis *palette =
   //      (TPaletteAxis*)h2->GetListOfFunctions()->FindObject("palette");
   //   Int_t ci = palette->GetBinColor(20,15);
   //
   // Then it is possible to retrieve the RGB components in the following way:
   //
   //   TColor *c = gROOT->GetColor(ci);
   //   float x,y,z;
   //   c->GetRGB(x,y,z);

   Double_t zc = fH->GetBinContent(i, j);
   return GetValueColor(zc);
}


//______________________________________________________________________________
char *TPaletteAxis::GetObjectInfo(Int_t /* px */, Int_t py) const
{
   // Displays the z value corresponding to cursor position py.

   Double_t z;
   static char info[64];

   Double_t zmin = fH->GetMinimum();
   Double_t zmax = fH->GetMaximum();
   Int_t   y1   = gPad->GetWh() - gPad->VtoPixel(fY1NDC);
   Int_t   y2   = gPad->GetWh() - gPad->VtoPixel(fY2NDC);
   Int_t   y    = gPad->GetWh() - py;

   if (gPad->GetLogz()) {
      if (zmin <= 0 && zmax > 0) zmin = TMath::Min((Double_t)1,
                                                      (Double_t)0.001 * zmax);
      Double_t zminl = TMath::Log10(zmin);
      Double_t zmaxl = TMath::Log10(zmax);
      Double_t zl    = (zmaxl - zminl) * ((Double_t)(y - y1) / (Double_t)(y2 - y1)) + zminl;
      z = TMath::Power(10., zl);
   } else {
      z = (zmax - zmin) * ((Double_t)(y - y1) / (Double_t)(y2 - y1)) + zmin;
   }

   snprintf(info, 64, "(z=%g)", z);
   return info;
}


//______________________________________________________________________________
Int_t TPaletteAxis::GetValueColor(Double_t zc)
{
   // Returns the color index of the given z value
   //
   // This function should be used after an histogram has been plotted with the
   // option COL or COLZ like in the following example:
   //
   //   h2->Draw("COLZ");
   //   gPad->Update();
   //   TPaletteAxis *palette =
   //      (TPaletteAxis*)h2->GetListOfFunctions()->FindObject("palette");
   //   Int_t ci = palette->GetValueColor(30.);
   //
   // Then it is possible to retrieve the RGB components in the following way:
   //
   //   TColor *c = gROOT->GetColor(ci);
   //   float x,y,z;
   //   c->GetRGB(x,y,z);

   Double_t wmin  = fH->GetMinimum();
   Double_t wmax  = fH->GetMaximum();
   Double_t wlmin = wmin;
   Double_t wlmax = wmax;

   if (gPad->GetLogz()) {
      if (wmin <= 0 && wmax > 0) wmin = TMath::Min((Double_t)1,
                                                      (Double_t)0.001 * wmax);
      wlmin = TMath::Log10(wmin);
      wlmax = TMath::Log10(wmax);
   }

   Int_t ncolors = gStyle->GetNumberOfColors();
   Int_t ndivz = fH->GetContour();
   if (ndivz == 0) return 0;
   ndivz = TMath::Abs(ndivz);
   Int_t theColor, color;
   Double_t scale = ndivz / (wlmax - wlmin);

   if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz()) zc = TMath::Log10(zc);
   if (zc < wlmin) zc = wlmin;

   color = Int_t(0.01 + (zc - wlmin) * scale);

   theColor = Int_t((color + 0.99) * Double_t(ncolors) / Double_t(ndivz));
   return gStyle->GetColorPalette(theColor);
}


//______________________________________________________________________________
void TPaletteAxis::Paint(Option_t *)
{
   // Paint the palette.

   ConvertNDCtoPad();

   SetFillStyle(1001);
   Double_t ymin = fY1;
   Double_t ymax = fY2;
   Double_t xmin = fX1;
   Double_t xmax = fX2;
   Double_t wmin = fH->GetMinimum();
   Double_t wmax = fH->GetMaximum();
   Double_t wlmin = wmin;
   Double_t wlmax = wmax;
   Double_t y1, y2, w1, w2, zc;

   if ((wlmax - wlmin) <= 0) {
      Double_t mz = wlmin * 0.1;
      if (mz == 0) mz = 0.1;
      wlmin = wlmin - mz;
      wlmax = wlmax + mz;
      wmin  = wlmin;
      wmax  = wlmax;
   }

   if (gPad->GetLogz()) {
      if (wmin <= 0 && wmax > 0) wmin = TMath::Min((Double_t)1,
                                                      (Double_t)0.001 * wmax);
      wlmin = TMath::Log10(wmin);
      wlmax = TMath::Log10(wmax);
   }
   Double_t ws    = wlmax - wlmin;
   Int_t ncolors = gStyle->GetNumberOfColors();
   Int_t ndivz = fH->GetContour();
   if (ndivz == 0) return;
   ndivz = TMath::Abs(ndivz);
   Int_t theColor, color;
   Double_t scale = ndivz / (wlmax - wlmin);
   for (Int_t i = 0; i < ndivz; i++) {

      zc = fH->GetContourLevel(i);
      if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz())
         zc = TMath::Log10(zc);
      w1 = zc;
      if (w1 < wlmin) w1 = wlmin;

      w2 = wlmax;
      if (i < ndivz - 1) {
         zc = fH->GetContourLevel(i + 1);
         if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz())
            zc = TMath::Log10(zc);
         w2 = zc;
      }

      if (w2 <= wlmin) continue;
      y1 = ymin + (w1 - wlmin) * (ymax - ymin) / ws;
      y2 = ymin + (w2 - wlmin) * (ymax - ymin) / ws;

      if (fH->TestBit(TH1::kUserContour)) {
         color = i;
      } else {
         color = Int_t(0.01 + (w1 - wlmin) * scale);
      }

      theColor = Int_t((color + 0.99) * Double_t(ncolors) / Double_t(ndivz));
      SetFillColor(gStyle->GetColorPalette(theColor));
      TAttFill::Modify();
      gPad->PaintBox(xmin, y1, xmax, y2);
   }
   Int_t ndiv  = fH->GetZaxis()->GetNdivisions() % 100; //take primary divisions only
   char chopt[6] = "S   ";
   chopt[1] = 0;
   strncat(chopt, "+L", 2);
   if (ndiv < 0) {
      ndiv = TMath::Abs(ndiv);
      strncat(chopt, "N", 1);
   }
   if (gPad->GetLogz()) {
      wmin = TMath::Power(10., wlmin);
      wmax = TMath::Power(10., wlmax);
      strncat(chopt, "G", 1);
   }
   fAxis.ImportAxisAttributes(fH->GetZaxis());
   fAxis.PaintAxis(xmax, ymin, xmax, ymax, wmin, wmax, ndiv, chopt);
}


//______________________________________________________________________________
void TPaletteAxis::SavePrimitive(ostream &out, Option_t * /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out.

   //char quote = '"';
   out << "   " << endl;
   if (gROOT->ClassSaved(TPaletteAxis::Class())) {
      out << "   ";
   } else {
      out << "   " << ClassName() << " *";
   }
   if (fOption.Contains("NDC")) {
      out << "palette = new " << ClassName() << "(" << fX1NDC << "," << fY1NDC << "," << fX2NDC << "," << fY2NDC
          << "," << fH->GetName() << ");" << endl;
   } else {
      out << "palette = new " << ClassName() << "(" << fX1 << "," << fY1 << "," << fX2 << "," << fY2
          << "," << fH->GetName() << ");" << endl;
   }
   out << "palette->SetLabelColor(" << fAxis.GetLabelColor() << ");" << endl;
   out << "palette->SetLabelFont("  << fAxis.GetLabelFont() << ");" << endl;
   out << "palette->SetLabelOffset(" << fAxis.GetLabelOffset() << ");" << endl;
   out << "palette->SetLabelSize("  << fAxis.GetLabelSize() << ");" << endl;
   out << "palette->SetTitleOffset(" << fAxis.GetTitleOffset() << ");" << endl;
   out << "palette->SetTitleSize("  << fAxis.GetTitleSize() << ");" << endl;
   SaveFillAttributes(out, "palette", -1, -1);
   SaveLineAttributes(out, "palette", 1, 1, 1);
}


//______________________________________________________________________________
void TPaletteAxis::UnZoom()
{
   // Unzoom the palette

   TView *view = gPad->GetView();
   if (view) {
      delete view;
      gPad->SetView(0);
   }
   fH->GetZaxis()->SetRange(0, 0);
   if (fH->GetDimension() == 2) {
      fH->SetMinimum();
      fH->SetMaximum();
      fH->ResetBit(TH1::kIsZoomed);
   }
}
 TPaletteAxis.cxx:1
 TPaletteAxis.cxx:2
 TPaletteAxis.cxx:3
 TPaletteAxis.cxx:4
 TPaletteAxis.cxx:5
 TPaletteAxis.cxx:6
 TPaletteAxis.cxx:7
 TPaletteAxis.cxx:8
 TPaletteAxis.cxx:9
 TPaletteAxis.cxx:10
 TPaletteAxis.cxx:11
 TPaletteAxis.cxx:12
 TPaletteAxis.cxx:13
 TPaletteAxis.cxx:14
 TPaletteAxis.cxx:15
 TPaletteAxis.cxx:16
 TPaletteAxis.cxx:17
 TPaletteAxis.cxx:18
 TPaletteAxis.cxx:19
 TPaletteAxis.cxx:20
 TPaletteAxis.cxx:21
 TPaletteAxis.cxx:22
 TPaletteAxis.cxx:23
 TPaletteAxis.cxx:24
 TPaletteAxis.cxx:25
 TPaletteAxis.cxx:26
 TPaletteAxis.cxx:27
 TPaletteAxis.cxx:28
 TPaletteAxis.cxx:29
 TPaletteAxis.cxx:30
 TPaletteAxis.cxx:31
 TPaletteAxis.cxx:32
 TPaletteAxis.cxx:33
 TPaletteAxis.cxx:34
 TPaletteAxis.cxx:35
 TPaletteAxis.cxx:36
 TPaletteAxis.cxx:37
 TPaletteAxis.cxx:38
 TPaletteAxis.cxx:39
 TPaletteAxis.cxx:40
 TPaletteAxis.cxx:41
 TPaletteAxis.cxx:42
 TPaletteAxis.cxx:43
 TPaletteAxis.cxx:44
 TPaletteAxis.cxx:45
 TPaletteAxis.cxx:46
 TPaletteAxis.cxx:47
 TPaletteAxis.cxx:48
 TPaletteAxis.cxx:49
 TPaletteAxis.cxx:50
 TPaletteAxis.cxx:51
 TPaletteAxis.cxx:52
 TPaletteAxis.cxx:53
 TPaletteAxis.cxx:54
 TPaletteAxis.cxx:55
 TPaletteAxis.cxx:56
 TPaletteAxis.cxx:57
 TPaletteAxis.cxx:58
 TPaletteAxis.cxx:59
 TPaletteAxis.cxx:60
 TPaletteAxis.cxx:61
 TPaletteAxis.cxx:62
 TPaletteAxis.cxx:63
 TPaletteAxis.cxx:64
 TPaletteAxis.cxx:65
 TPaletteAxis.cxx:66
 TPaletteAxis.cxx:67
 TPaletteAxis.cxx:68
 TPaletteAxis.cxx:69
 TPaletteAxis.cxx:70
 TPaletteAxis.cxx:71
 TPaletteAxis.cxx:72
 TPaletteAxis.cxx:73
 TPaletteAxis.cxx:74
 TPaletteAxis.cxx:75
 TPaletteAxis.cxx:76
 TPaletteAxis.cxx:77
 TPaletteAxis.cxx:78
 TPaletteAxis.cxx:79
 TPaletteAxis.cxx:80
 TPaletteAxis.cxx:81
 TPaletteAxis.cxx:82
 TPaletteAxis.cxx:83
 TPaletteAxis.cxx:84
 TPaletteAxis.cxx:85
 TPaletteAxis.cxx:86
 TPaletteAxis.cxx:87
 TPaletteAxis.cxx:88
 TPaletteAxis.cxx:89
 TPaletteAxis.cxx:90
 TPaletteAxis.cxx:91
 TPaletteAxis.cxx:92
 TPaletteAxis.cxx:93
 TPaletteAxis.cxx:94
 TPaletteAxis.cxx:95
 TPaletteAxis.cxx:96
 TPaletteAxis.cxx:97
 TPaletteAxis.cxx:98
 TPaletteAxis.cxx:99
 TPaletteAxis.cxx:100
 TPaletteAxis.cxx:101
 TPaletteAxis.cxx:102
 TPaletteAxis.cxx:103
 TPaletteAxis.cxx:104
 TPaletteAxis.cxx:105
 TPaletteAxis.cxx:106
 TPaletteAxis.cxx:107
 TPaletteAxis.cxx:108
 TPaletteAxis.cxx:109
 TPaletteAxis.cxx:110
 TPaletteAxis.cxx:111
 TPaletteAxis.cxx:112
 TPaletteAxis.cxx:113
 TPaletteAxis.cxx:114
 TPaletteAxis.cxx:115
 TPaletteAxis.cxx:116
 TPaletteAxis.cxx:117
 TPaletteAxis.cxx:118
 TPaletteAxis.cxx:119
 TPaletteAxis.cxx:120
 TPaletteAxis.cxx:121
 TPaletteAxis.cxx:122
 TPaletteAxis.cxx:123
 TPaletteAxis.cxx:124
 TPaletteAxis.cxx:125
 TPaletteAxis.cxx:126
 TPaletteAxis.cxx:127
 TPaletteAxis.cxx:128
 TPaletteAxis.cxx:129
 TPaletteAxis.cxx:130
 TPaletteAxis.cxx:131
 TPaletteAxis.cxx:132
 TPaletteAxis.cxx:133
 TPaletteAxis.cxx:134
 TPaletteAxis.cxx:135
 TPaletteAxis.cxx:136
 TPaletteAxis.cxx:137
 TPaletteAxis.cxx:138
 TPaletteAxis.cxx:139
 TPaletteAxis.cxx:140
 TPaletteAxis.cxx:141
 TPaletteAxis.cxx:142
 TPaletteAxis.cxx:143
 TPaletteAxis.cxx:144
 TPaletteAxis.cxx:145
 TPaletteAxis.cxx:146
 TPaletteAxis.cxx:147
 TPaletteAxis.cxx:148
 TPaletteAxis.cxx:149
 TPaletteAxis.cxx:150
 TPaletteAxis.cxx:151
 TPaletteAxis.cxx:152
 TPaletteAxis.cxx:153
 TPaletteAxis.cxx:154
 TPaletteAxis.cxx:155
 TPaletteAxis.cxx:156
 TPaletteAxis.cxx:157
 TPaletteAxis.cxx:158
 TPaletteAxis.cxx:159
 TPaletteAxis.cxx:160
 TPaletteAxis.cxx:161
 TPaletteAxis.cxx:162
 TPaletteAxis.cxx:163
 TPaletteAxis.cxx:164
 TPaletteAxis.cxx:165
 TPaletteAxis.cxx:166
 TPaletteAxis.cxx:167
 TPaletteAxis.cxx:168
 TPaletteAxis.cxx:169
 TPaletteAxis.cxx:170
 TPaletteAxis.cxx:171
 TPaletteAxis.cxx:172
 TPaletteAxis.cxx:173
 TPaletteAxis.cxx:174
 TPaletteAxis.cxx:175
 TPaletteAxis.cxx:176
 TPaletteAxis.cxx:177
 TPaletteAxis.cxx:178
 TPaletteAxis.cxx:179
 TPaletteAxis.cxx:180
 TPaletteAxis.cxx:181
 TPaletteAxis.cxx:182
 TPaletteAxis.cxx:183
 TPaletteAxis.cxx:184
 TPaletteAxis.cxx:185
 TPaletteAxis.cxx:186
 TPaletteAxis.cxx:187
 TPaletteAxis.cxx:188
 TPaletteAxis.cxx:189
 TPaletteAxis.cxx:190
 TPaletteAxis.cxx:191
 TPaletteAxis.cxx:192
 TPaletteAxis.cxx:193
 TPaletteAxis.cxx:194
 TPaletteAxis.cxx:195
 TPaletteAxis.cxx:196
 TPaletteAxis.cxx:197
 TPaletteAxis.cxx:198
 TPaletteAxis.cxx:199
 TPaletteAxis.cxx:200
 TPaletteAxis.cxx:201
 TPaletteAxis.cxx:202
 TPaletteAxis.cxx:203
 TPaletteAxis.cxx:204
 TPaletteAxis.cxx:205
 TPaletteAxis.cxx:206
 TPaletteAxis.cxx:207
 TPaletteAxis.cxx:208
 TPaletteAxis.cxx:209
 TPaletteAxis.cxx:210
 TPaletteAxis.cxx:211
 TPaletteAxis.cxx:212
 TPaletteAxis.cxx:213
 TPaletteAxis.cxx:214
 TPaletteAxis.cxx:215
 TPaletteAxis.cxx:216
 TPaletteAxis.cxx:217
 TPaletteAxis.cxx:218
 TPaletteAxis.cxx:219
 TPaletteAxis.cxx:220
 TPaletteAxis.cxx:221
 TPaletteAxis.cxx:222
 TPaletteAxis.cxx:223
 TPaletteAxis.cxx:224
 TPaletteAxis.cxx:225
 TPaletteAxis.cxx:226
 TPaletteAxis.cxx:227
 TPaletteAxis.cxx:228
 TPaletteAxis.cxx:229
 TPaletteAxis.cxx:230
 TPaletteAxis.cxx:231
 TPaletteAxis.cxx:232
 TPaletteAxis.cxx:233
 TPaletteAxis.cxx:234
 TPaletteAxis.cxx:235
 TPaletteAxis.cxx:236
 TPaletteAxis.cxx:237
 TPaletteAxis.cxx:238
 TPaletteAxis.cxx:239
 TPaletteAxis.cxx:240
 TPaletteAxis.cxx:241
 TPaletteAxis.cxx:242
 TPaletteAxis.cxx:243
 TPaletteAxis.cxx:244
 TPaletteAxis.cxx:245
 TPaletteAxis.cxx:246
 TPaletteAxis.cxx:247
 TPaletteAxis.cxx:248
 TPaletteAxis.cxx:249
 TPaletteAxis.cxx:250
 TPaletteAxis.cxx:251
 TPaletteAxis.cxx:252
 TPaletteAxis.cxx:253
 TPaletteAxis.cxx:254
 TPaletteAxis.cxx:255
 TPaletteAxis.cxx:256
 TPaletteAxis.cxx:257
 TPaletteAxis.cxx:258
 TPaletteAxis.cxx:259
 TPaletteAxis.cxx:260
 TPaletteAxis.cxx:261
 TPaletteAxis.cxx:262
 TPaletteAxis.cxx:263
 TPaletteAxis.cxx:264
 TPaletteAxis.cxx:265
 TPaletteAxis.cxx:266
 TPaletteAxis.cxx:267
 TPaletteAxis.cxx:268
 TPaletteAxis.cxx:269
 TPaletteAxis.cxx:270
 TPaletteAxis.cxx:271
 TPaletteAxis.cxx:272
 TPaletteAxis.cxx:273
 TPaletteAxis.cxx:274
 TPaletteAxis.cxx:275
 TPaletteAxis.cxx:276
 TPaletteAxis.cxx:277
 TPaletteAxis.cxx:278
 TPaletteAxis.cxx:279
 TPaletteAxis.cxx:280
 TPaletteAxis.cxx:281
 TPaletteAxis.cxx:282
 TPaletteAxis.cxx:283
 TPaletteAxis.cxx:284
 TPaletteAxis.cxx:285
 TPaletteAxis.cxx:286
 TPaletteAxis.cxx:287
 TPaletteAxis.cxx:288
 TPaletteAxis.cxx:289
 TPaletteAxis.cxx:290
 TPaletteAxis.cxx:291
 TPaletteAxis.cxx:292
 TPaletteAxis.cxx:293
 TPaletteAxis.cxx:294
 TPaletteAxis.cxx:295
 TPaletteAxis.cxx:296
 TPaletteAxis.cxx:297
 TPaletteAxis.cxx:298
 TPaletteAxis.cxx:299
 TPaletteAxis.cxx:300
 TPaletteAxis.cxx:301
 TPaletteAxis.cxx:302
 TPaletteAxis.cxx:303
 TPaletteAxis.cxx:304
 TPaletteAxis.cxx:305
 TPaletteAxis.cxx:306
 TPaletteAxis.cxx:307
 TPaletteAxis.cxx:308
 TPaletteAxis.cxx:309
 TPaletteAxis.cxx:310
 TPaletteAxis.cxx:311
 TPaletteAxis.cxx:312
 TPaletteAxis.cxx:313
 TPaletteAxis.cxx:314
 TPaletteAxis.cxx:315
 TPaletteAxis.cxx:316
 TPaletteAxis.cxx:317
 TPaletteAxis.cxx:318
 TPaletteAxis.cxx:319
 TPaletteAxis.cxx:320
 TPaletteAxis.cxx:321
 TPaletteAxis.cxx:322
 TPaletteAxis.cxx:323
 TPaletteAxis.cxx:324
 TPaletteAxis.cxx:325
 TPaletteAxis.cxx:326
 TPaletteAxis.cxx:327
 TPaletteAxis.cxx:328
 TPaletteAxis.cxx:329
 TPaletteAxis.cxx:330
 TPaletteAxis.cxx:331
 TPaletteAxis.cxx:332
 TPaletteAxis.cxx:333
 TPaletteAxis.cxx:334
 TPaletteAxis.cxx:335
 TPaletteAxis.cxx:336
 TPaletteAxis.cxx:337
 TPaletteAxis.cxx:338
 TPaletteAxis.cxx:339
 TPaletteAxis.cxx:340
 TPaletteAxis.cxx:341
 TPaletteAxis.cxx:342
 TPaletteAxis.cxx:343
 TPaletteAxis.cxx:344
 TPaletteAxis.cxx:345
 TPaletteAxis.cxx:346
 TPaletteAxis.cxx:347
 TPaletteAxis.cxx:348
 TPaletteAxis.cxx:349
 TPaletteAxis.cxx:350
 TPaletteAxis.cxx:351
 TPaletteAxis.cxx:352
 TPaletteAxis.cxx:353
 TPaletteAxis.cxx:354
 TPaletteAxis.cxx:355
 TPaletteAxis.cxx:356
 TPaletteAxis.cxx:357
 TPaletteAxis.cxx:358
 TPaletteAxis.cxx:359
 TPaletteAxis.cxx:360
 TPaletteAxis.cxx:361
 TPaletteAxis.cxx:362
 TPaletteAxis.cxx:363
 TPaletteAxis.cxx:364
 TPaletteAxis.cxx:365
 TPaletteAxis.cxx:366
 TPaletteAxis.cxx:367
 TPaletteAxis.cxx:368
 TPaletteAxis.cxx:369
 TPaletteAxis.cxx:370
 TPaletteAxis.cxx:371
 TPaletteAxis.cxx:372
 TPaletteAxis.cxx:373
 TPaletteAxis.cxx:374
 TPaletteAxis.cxx:375
 TPaletteAxis.cxx:376
 TPaletteAxis.cxx:377
 TPaletteAxis.cxx:378
 TPaletteAxis.cxx:379
 TPaletteAxis.cxx:380
 TPaletteAxis.cxx:381
 TPaletteAxis.cxx:382
 TPaletteAxis.cxx:383
 TPaletteAxis.cxx:384
 TPaletteAxis.cxx:385
 TPaletteAxis.cxx:386
 TPaletteAxis.cxx:387
 TPaletteAxis.cxx:388
 TPaletteAxis.cxx:389
 TPaletteAxis.cxx:390
 TPaletteAxis.cxx:391
 TPaletteAxis.cxx:392
 TPaletteAxis.cxx:393
 TPaletteAxis.cxx:394
 TPaletteAxis.cxx:395
 TPaletteAxis.cxx:396
 TPaletteAxis.cxx:397
 TPaletteAxis.cxx:398
 TPaletteAxis.cxx:399
 TPaletteAxis.cxx:400
 TPaletteAxis.cxx:401
 TPaletteAxis.cxx:402
 TPaletteAxis.cxx:403
 TPaletteAxis.cxx:404
 TPaletteAxis.cxx:405
 TPaletteAxis.cxx:406
 TPaletteAxis.cxx:407
 TPaletteAxis.cxx:408
 TPaletteAxis.cxx:409
 TPaletteAxis.cxx:410
 TPaletteAxis.cxx:411
 TPaletteAxis.cxx:412
 TPaletteAxis.cxx:413
 TPaletteAxis.cxx:414
 TPaletteAxis.cxx:415
 TPaletteAxis.cxx:416
 TPaletteAxis.cxx:417
 TPaletteAxis.cxx:418
 TPaletteAxis.cxx:419
 TPaletteAxis.cxx:420
 TPaletteAxis.cxx:421
 TPaletteAxis.cxx:422
 TPaletteAxis.cxx:423
 TPaletteAxis.cxx:424
 TPaletteAxis.cxx:425
 TPaletteAxis.cxx:426
 TPaletteAxis.cxx:427
 TPaletteAxis.cxx:428
 TPaletteAxis.cxx:429
 TPaletteAxis.cxx:430
 TPaletteAxis.cxx:431
 TPaletteAxis.cxx:432
 TPaletteAxis.cxx:433
 TPaletteAxis.cxx:434
 TPaletteAxis.cxx:435
 TPaletteAxis.cxx:436
 TPaletteAxis.cxx:437
 TPaletteAxis.cxx:438
 TPaletteAxis.cxx:439
 TPaletteAxis.cxx:440
 TPaletteAxis.cxx:441
 TPaletteAxis.cxx:442
 TPaletteAxis.cxx:443
 TPaletteAxis.cxx:444
 TPaletteAxis.cxx:445
 TPaletteAxis.cxx:446
 TPaletteAxis.cxx:447
 TPaletteAxis.cxx:448
 TPaletteAxis.cxx:449
 TPaletteAxis.cxx:450
 TPaletteAxis.cxx:451
 TPaletteAxis.cxx:452
 TPaletteAxis.cxx:453
 TPaletteAxis.cxx:454
 TPaletteAxis.cxx:455
 TPaletteAxis.cxx:456
 TPaletteAxis.cxx:457
 TPaletteAxis.cxx:458
 TPaletteAxis.cxx:459
 TPaletteAxis.cxx:460
 TPaletteAxis.cxx:461
 TPaletteAxis.cxx:462
 TPaletteAxis.cxx:463
 TPaletteAxis.cxx:464
 TPaletteAxis.cxx:465
 TPaletteAxis.cxx:466
 TPaletteAxis.cxx:467
 TPaletteAxis.cxx:468
 TPaletteAxis.cxx:469
 TPaletteAxis.cxx:470
 TPaletteAxis.cxx:471
 TPaletteAxis.cxx:472
 TPaletteAxis.cxx:473
 TPaletteAxis.cxx:474
 TPaletteAxis.cxx:475
 TPaletteAxis.cxx:476
 TPaletteAxis.cxx:477
 TPaletteAxis.cxx:478
 TPaletteAxis.cxx:479
 TPaletteAxis.cxx:480
 TPaletteAxis.cxx:481
 TPaletteAxis.cxx:482
 TPaletteAxis.cxx:483
 TPaletteAxis.cxx:484
 TPaletteAxis.cxx:485
 TPaletteAxis.cxx:486
 TPaletteAxis.cxx:487
 TPaletteAxis.cxx:488
 TPaletteAxis.cxx:489
 TPaletteAxis.cxx:490