23 ClassImp(TPaletteAxis);
117 TPaletteAxis::TPaletteAxis(): TPave()
127 TPaletteAxis::TPaletteAxis(Double_t x1, Double_t y1, Double_t x2, Double_t y2, TH1 *h)
128 : TPave(x1, y1, x2, y2)
132 TAxis *zaxis = fH->GetZaxis();
133 fAxis.ImportAxisAttributes(zaxis);
134 if (gPad->GetView()) SetBit(kHasView);
141 TPaletteAxis::~TPaletteAxis()
149 TPaletteAxis::TPaletteAxis(
const TPaletteAxis &palette) : TPave(palette)
151 ((TPaletteAxis&)palette).Copy(*
this);
158 TPaletteAxis& TPaletteAxis::operator=(
const TPaletteAxis &orig)
168 void TPaletteAxis::Copy(TObject &obj)
const
171 ((TPaletteAxis&)obj).fH = fH;
172 ((TPaletteAxis&)obj).fName = fName;
179 Int_t TPaletteAxis::DistancetoPrimitive(Int_t px, Int_t py)
181 Int_t plxmax = gPad->XtoAbsPixel(fX2);
182 Int_t plymin = gPad->YtoAbsPixel(fY1);
183 Int_t plymax = gPad->YtoAbsPixel(fY2);
184 if (px > plxmax && px < plxmax + 30 && py >= plymax && py <= plymin)
return px - plxmax;
187 return TPave::DistancetoPrimitive(px, py);
194 void TPaletteAxis::ExecuteEvent(Int_t event, Int_t px, Int_t py)
198 static Int_t kmode = 0;
199 Int_t plxmin = gPad->XtoAbsPixel(fX1);
200 Int_t plxmax = gPad->XtoAbsPixel(fX2);
201 if (kmode != 0 || px <= plxmax) {
202 if (event == kButton1Down) kmode = 1;
203 TBox::ExecuteEvent(event, px, py);
204 if (event == kButton1Up) kmode = 0;
206 Double_t dpx = gPad->GetX2() - gPad->GetX1();
207 Double_t dpy = gPad->GetY2() - gPad->GetY1();
208 Double_t xp1 = gPad->GetX1();
209 Double_t yp1 = gPad->GetY1();
210 fX1NDC = (fX1 - xp1) / dpx;
211 fY1NDC = (fY1 - yp1) / dpy;
212 fX2NDC = (fX2 - xp1) / dpx;
213 fY2NDC = (fY2 - yp1) / dpy;
216 gPad->SetCursor(kHand);
217 static Double_t ratio1, ratio2;
218 static Int_t px1old, py1old, px2old, py2old;
219 Double_t temp, xmin, xmax;
224 ratio1 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
225 py1old = gPad->YtoAbsPixel(fY1 + ratio1 * (fY2 - fY1));
229 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
230 gVirtualX->SetLineColor(-1);
234 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
235 ratio2 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
236 py2old = gPad->YtoAbsPixel(fY1 + ratio2 * (fY2 - fY1));
237 gVirtualX->DrawBox(px1old, py1old, px2old, py2old, TVirtualX::kHollow);
241 if (gROOT->IsEscaped()) {
242 gROOT->SetEscape(kFALSE);
246 ratio2 = (gPad->AbsPixeltoY(py) - fY1) / (fY2 - fY1);
257 if (ratio2 - ratio1 > 0.05) {
258 if (fH->GetDimension() == 2) {
259 Double_t zmin = fH->GetMinimum();
260 Double_t zmax = fH->GetMaximum();
261 if (gPad->GetLogz()) {
262 if (zmin <= 0 && zmax > 0) zmin = TMath::Min((Double_t)1,
263 (Double_t)0.001 * zmax);
264 zmin = TMath::Log10(zmin);
265 zmax = TMath::Log10(zmax);
267 Double_t newmin = zmin + (zmax - zmin) * ratio1;
268 Double_t newmax = zmin + (zmax - zmin) * ratio2;
269 if (newmin < zmin)newmin = fH->GetBinContent(fH->GetMinimumBin());
270 if (newmax > zmax)newmax = fH->GetBinContent(fH->GetMaximumBin());
271 if (gPad->GetLogz()) {
272 newmin = TMath::Exp(2.302585092994 * newmin);
273 newmax = TMath::Exp(2.302585092994 * newmax);
275 fH->SetMinimum(newmin);
276 fH->SetMaximum(newmax);
277 fH->SetBit(TH1::kIsZoomed);
279 gPad->Modified(kTRUE);
281 gVirtualX->SetLineColor(-1);
305 Int_t TPaletteAxis::GetBinColor(Int_t i, Int_t j)
307 Double_t zc = fH->GetBinContent(i, j);
308 return GetValueColor(zc);
315 char *TPaletteAxis::GetObjectInfo(Int_t , Int_t py)
const
318 static char info[64];
320 Double_t zmin = fH->GetMinimum();
321 Double_t zmax = fH->GetMaximum();
322 Int_t y1 = gPad->GetWh() - gPad->VtoPixel(fY1NDC);
323 Int_t y2 = gPad->GetWh() - gPad->VtoPixel(fY2NDC);
324 Int_t y = gPad->GetWh() - py;
326 if (gPad->GetLogz()) {
327 if (zmin <= 0 && zmax > 0) zmin = TMath::Min((Double_t)1,
328 (Double_t)0.001 * zmax);
329 Double_t zminl = TMath::Log10(zmin);
330 Double_t zmaxl = TMath::Log10(zmax);
331 Double_t zl = (zmaxl - zminl) * ((Double_t)(y - y1) / (Double_t)(y2 - y1)) + zminl;
332 z = TMath::Power(10., zl);
334 z = (zmax - zmin) * ((Double_t)(y - y1) / (Double_t)(y2 - y1)) + zmin;
337 snprintf(info, 64,
"(z=%g)", z);
359 Int_t TPaletteAxis::GetValueColor(Double_t zc)
361 Double_t wmin = fH->GetMinimum();
362 Double_t wmax = fH->GetMaximum();
363 Double_t wlmin = wmin;
364 Double_t wlmax = wmax;
366 if (gPad->GetLogz()) {
367 if (wmin <= 0 && wmax > 0) wmin = TMath::Min((Double_t)1,
368 (Double_t)0.001 * wmax);
369 wlmin = TMath::Log10(wmin);
370 wlmax = TMath::Log10(wmax);
373 Int_t ncolors = gStyle->GetNumberOfColors();
374 Int_t ndivz = fH->GetContour();
375 if (ndivz == 0)
return 0;
376 ndivz = TMath::Abs(ndivz);
377 Int_t theColor, color;
378 Double_t scale = ndivz / (wlmax - wlmin);
380 if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz()) zc = TMath::Log10(zc);
381 if (zc < wlmin) zc = wlmin;
383 color = Int_t(0.01 + (zc - wlmin) * scale);
385 theColor = Int_t((color + 0.99) * Double_t(ncolors) / Double_t(ndivz));
386 return gStyle->GetColorPalette(theColor);
393 void TPaletteAxis::Paint(Option_t *)
402 Double_t wmin = fH->GetMinimum();
403 Double_t wmax = fH->GetMaximum();
404 Double_t wlmin = wmin;
405 Double_t wlmax = wmax;
406 Double_t y1, y2, w1, w2, zc;
408 if ((wlmax - wlmin) <= 0) {
409 Double_t mz = wlmin * 0.1;
410 if (mz == 0) mz = 0.1;
417 if (gPad->GetLogz()) {
418 if (wmin <= 0 && wmax > 0) wmin = TMath::Min((Double_t)1,
419 (Double_t)0.001 * wmax);
420 wlmin = TMath::Log10(wmin);
421 wlmax = TMath::Log10(wmax);
423 Double_t ws = wlmax - wlmin;
424 Int_t ncolors = gStyle->GetNumberOfColors();
425 Int_t ndivz = fH->GetContour();
426 if (ndivz == 0)
return;
427 ndivz = TMath::Abs(ndivz);
428 Int_t theColor, color;
430 fAxis.ImportAxisAttributes(fH->GetZaxis());
432 TLatex *label = NULL;
434 Double_t prevlab = 0;
435 TString opt(fH->GetDrawOption());
436 if (opt.Contains(
"CJUST", TString::kIgnoreCase)) {
437 label =
new TLatex();
438 label->SetTextFont(fAxis.GetLabelFont());
439 label->SetTextColor(fAxis.GetLabelColor());
440 label->SetTextAlign(kHAlignLeft+kVAlignCenter);
442 line->SetLineColor(fAxis.GetLineColor());
443 line->PaintLine(xmax, ymin, xmax, ymax);
445 Double_t scale = ndivz / (wlmax - wlmin);
446 for (Int_t i = 0; i < ndivz; i++) {
448 zc = fH->GetContourLevel(i);
449 if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz())
450 zc = TMath::Log10(zc);
452 if (w1 < wlmin) w1 = wlmin;
456 zc = fH->GetContourLevel(i + 1);
457 if (fH->TestBit(TH1::kUserContour) && gPad->GetLogz())
458 zc = TMath::Log10(zc);
462 if (w2 <= wlmin)
continue;
463 y1 = ymin + (w1 - wlmin) * (ymax - ymin) / ws;
464 y2 = ymin + (w2 - wlmin) * (ymax - ymin) / ws;
466 if (fH->TestBit(TH1::kUserContour)) {
469 color = Int_t(0.01 + (w1 - wlmin) * scale);
472 theColor = Int_t((color + 0.99) * Double_t(ncolors) / Double_t(ndivz));
473 SetFillColor(gStyle->GetColorPalette(theColor));
475 gPad->PaintBox(xmin, y1, xmax, y2);
478 Double_t lof = fAxis.GetLabelOffset()*(gPad->GetUxmax()-gPad->GetUxmin());
480 Double_t tlength = fAxis.GetTickSize() * (gPad->GetUxmax()-gPad->GetUxmin());
481 Double_t lsize = fAxis.GetLabelSize();
482 Double_t lsize_user = lsize*(gPad->GetUymax()-gPad->GetUymin());
483 Double_t zlab = fH->GetContourLevel(i);
484 if (gPad->GetLogz()&& !fH->TestBit(TH1::kUserContour)) {
485 zlab = TMath::Power(10, zlab);
488 if (i == 0 || (y1 - prevlab) > 1.5*lsize_user) {
489 label->PaintLatex(xmax + lof, y1, 0, lsize, Form(
"%g", zlab));
492 line->PaintLine(xmax-tlength, y1, xmax, y1);
495 if ((y2 - prevlab > 1.5*lsize_user))
496 label->PaintLatex(xmax + lof, y2, 0, lsize, Form(
"%g",fH->GetMaximum()));
497 line->PaintLine(xmax-tlength, y2, xmax, y2);
503 Int_t ndiv = fH->GetZaxis()->GetNdivisions();
504 Bool_t isOptimized = ndiv>0;
505 Int_t absDiv = abs(ndiv);
506 Int_t maxD = absDiv/1000000;
507 ndiv = absDiv%100 + maxD*1000000;
508 if (!isOptimized) ndiv = -ndiv;
510 char chopt[6] =
"S ";
512 strncat(chopt,
"+L", 3);
514 ndiv = TMath::Abs(ndiv);
515 strncat(chopt,
"N", 2);
517 if (gPad->GetLogz()) {
518 wmin = TMath::Power(10., wlmin);
519 wmax = TMath::Power(10., wlmax);
520 strncat(chopt,
"G", 2);
528 fAxis.PaintAxis(xmax, ymin, xmax, ymax, wmin, wmax, ndiv, chopt);
536 void TPaletteAxis::SavePrimitive(std::ostream &out, Option_t * )
539 out <<
" " << std::endl;
540 if (gROOT->ClassSaved(TPaletteAxis::Class())) {
543 out <<
" " << ClassName() <<
" *";
545 if (fOption.Contains(
"NDC")) {
546 out <<
"palette = new " << ClassName() <<
"(" << fX1NDC <<
"," << fY1NDC <<
"," << fX2NDC <<
"," << fY2NDC
547 <<
"," << fH->GetName() <<
");" << std::endl;
549 out <<
"palette = new " << ClassName() <<
"(" << fX1 <<
"," << fY1 <<
"," << fX2 <<
"," << fY2
550 <<
"," << fH->GetName() <<
");" << std::endl;
552 out <<
" palette->SetLabelColor(" << fAxis.GetLabelColor() <<
");" << std::endl;
553 out <<
" palette->SetLabelFont(" << fAxis.GetLabelFont() <<
");" << std::endl;
554 out <<
" palette->SetLabelOffset(" << fAxis.GetLabelOffset() <<
");" << std::endl;
555 out <<
" palette->SetLabelSize(" << fAxis.GetLabelSize() <<
");" << std::endl;
556 out <<
" palette->SetTitleOffset(" << fAxis.GetTitleOffset() <<
");" << std::endl;
557 out <<
" palette->SetTitleSize(" << fAxis.GetTitleSize() <<
");" << std::endl;
558 SaveFillAttributes(out,
"palette", -1, -1);
559 SaveLineAttributes(out,
"palette", 1, 1, 1);
566 void TPaletteAxis::UnZoom()
568 TView *view = gPad->GetView();
573 fH->GetZaxis()->SetRange(0, 0);
574 if (fH->GetDimension() == 2) {
577 fH->ResetBit(TH1::kIsZoomed);