58 ClassImp(TGeoPainter);
63 TGeoPainter::TGeoPainter(TGeoManager *manager) : TVirtualGeoPainter(manager)
65 TVirtualGeoPainter::SetPainter(
this);
66 if (manager) fGeoManager = manager;
68 Error(
"ctor",
"No geometry loaded");
71 fNsegments = fGeoManager->GetNsegments();
77 fVisLevel = fGeoManager->GetVisLevel();
78 fVisOption = fGeoManager->GetVisOption();
79 fExplodedView = fGeoManager->GetBombMode();
83 fIsRaytracing = kFALSE;
85 fPaintingOverlaps = kFALSE;
87 fVisVolumes =
new TObjArray();
89 fGlobal =
new TGeoHMatrix();
90 fBuffer =
new TBuffer3D(TBuffer3DTypes::kGeneric,20,3*20,0,0,0,0);
94 fIsPaintingShape = kFALSE;
95 memset(&fCheckedBox[0], 0, 6*
sizeof(Double_t));
97 fCheckedNode = fGeoManager->GetTopNode();
98 fChecker =
new TGeoChecker(fGeoManager);
105 TGeoPainter::~TGeoPainter()
107 if (fChecker)
delete fChecker;
111 if (fPlugin)
delete fPlugin;
116 void TGeoPainter::AddSize3D(Int_t numpoints, Int_t numsegs, Int_t numpolys)
118 gSize3D.numPoints += numpoints;
119 gSize3D.numSegs += numsegs;
120 gSize3D.numPolys += numpolys;
125 TVirtualGeoTrack *TGeoPainter::AddTrack(Int_t
id, Int_t pdgcode, TObject *particle)
127 return (TVirtualGeoTrack*)(
new TGeoTrack(
id,pdgcode,0,particle));
133 void TGeoPainter::AddTrackPoint(Double_t *point, Double_t *box, Bool_t reset)
135 static Int_t npoints = 0;
136 static Double_t xmin[3] = {0,0,0};
137 static Double_t xmax[3] = {0,0,0};
140 memset(box, 0, 6*
sizeof(Double_t));
141 memset(xmin, 0, 3*
sizeof(Double_t));
142 memset(xmax, 0, 3*
sizeof(Double_t));
147 for (i=0; i<3; i++) xmin[i]=xmax[i]=0;
151 Double_t ninv = 1./Double_t(npoints);
152 for (i=0; i<3; i++) {
153 box[i] += ninv*(point[i]-box[i]);
154 if (point[i]<xmin[i]) xmin[i]=point[i];
155 if (point[i]>xmax[i]) xmax[i]=point[i];
156 box[i+3] = 0.5*(xmax[i]-xmin[i]);
163 void TGeoPainter::BombTranslation(
const Double_t *tr, Double_t *bombtr)
165 memcpy(bombtr, tr, 3*
sizeof(Double_t));
166 switch (fExplodedView) {
194 void TGeoPainter::CheckBoundaryErrors(Int_t ntracks, Double_t radius)
196 fChecker->CheckBoundaryErrors(ntracks, radius);
204 void TGeoPainter::CheckBoundaryReference(Int_t icheck)
206 fChecker->CheckBoundaryReference(icheck);
212 void TGeoPainter::CheckGeometryFull(Bool_t checkoverlaps, Bool_t checkcrossings, Int_t ntracks,
const Double_t *vertex)
214 fChecker->CheckGeometryFull(checkoverlaps,checkcrossings,ntracks,vertex);
220 void TGeoPainter::CheckGeometry(Int_t nrays, Double_t startx, Double_t starty, Double_t startz)
const
222 fChecker->CheckGeometry(nrays, startx, starty, startz);
228 void TGeoPainter::CheckOverlaps(
const TGeoVolume *vol, Double_t ovlp, Option_t *option)
const
230 fChecker->CheckOverlaps(vol, ovlp, option);
236 void TGeoPainter::CheckPoint(Double_t x, Double_t y, Double_t z, Option_t *option)
238 fChecker->CheckPoint(x,y,z,option);
248 void TGeoPainter::CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option)
250 fChecker->CheckShape(shape, testNo, nsamples, option);
257 void TGeoPainter::ClearVisibleVolumes()
259 if (!fVisVolumes)
return;
260 TIter next(fVisVolumes);
262 while ((vol = (TGeoVolume*)next())) {
263 vol->ResetAttBit(TGeoAtt::kVisOnScreen);
265 fVisVolumes->Clear();
273 void TGeoPainter::DefineColors()
const
275 static Int_t color = 0;
277 TColor::InitializeColors();
278 for (
auto icol=1; icol<10; ++icol)
279 color = GetColor(icol, 0.5);
286 Int_t TGeoPainter::GetColor(Int_t base, Float_t light)
const
288 using IntMap_t = std::map<Int_t, Int_t>;
289 constexpr Int_t ncolors = 100;
290 constexpr Float_t lmin = 0.25;
291 constexpr Float_t lmax = 0.75;
292 static IntMap_t colmap;
295 auto it = colmap.find(base);
296 if (it != colmap.end())
return (it->second + light*(ncolors-1));
298 TColor* col_base = gROOT->GetColor(base);
301 it = colmap.find(kBlack);
302 if (it != colmap.end())
return (it->second + light*(ncolors-1));
303 col_base = gROOT->GetColor(kBlack);
307 Float_t r=0., g=0., b=0., h=0., l=0., s=0.;
308 Double_t red[2], green[2], blue[2];
309 Double_t stop[] = {0., 1.0};
311 if (col_base) col_base->GetRGB(r,g,b);
312 TColor::RGB2HLS(r,g,b,h,l,s);
313 TColor::HLS2RGB(h,lmin,s,r,g,b);
317 TColor::HLS2RGB(h,lmax,s,r,g,b);
321 Int_t color_map_idx = TColor::CreateGradientColorTable(2, stop, red, green, blue, ncolors);
322 colmap[color] = color_map_idx;
323 return (color_map_idx + light*(ncolors-1));
329 TGeoVolume *TGeoPainter::GetDrawnVolume()
const
338 Int_t TGeoPainter::DistanceToPrimitiveVol(TGeoVolume *volume, Int_t px, Int_t py)
340 const Int_t big = 9999;
341 const Int_t inaxis = 7;
342 const Int_t maxdist = 5;
344 if (fTopVolume != volume) fTopVolume = volume;
345 TView *view = gPad->GetView();
346 if (!view)
return big;
349 TGeoShape::SetTransform(fGlobal);
351 Int_t puxmin = gPad->XtoAbsPixel(gPad->GetUxmin());
352 Int_t puymin = gPad->YtoAbsPixel(gPad->GetUymin());
353 Int_t puxmax = gPad->XtoAbsPixel(gPad->GetUxmax());
354 Int_t puymax = gPad->YtoAbsPixel(gPad->GetUymax());
356 if (px < puxmin - inaxis)
return big;
357 if (py > puymin + inaxis)
return big;
358 if (px > puxmax + inaxis)
return big;
359 if (py < puymax - inaxis)
return big;
361 fCheckedNode = fGeoManager->GetTopNode();
362 gPad->SetSelected(view);
366 if (fPaintingOverlaps) {
368 crt = fOverlap->GetFirstVolume();
369 *fGlobal = fOverlap->GetFirstMatrix();
370 dist = crt->GetShape()->DistancetoPrimitive(px,py);
372 gPad->SetSelected(crt);
373 box = (TGeoBBox*)crt->GetShape();
374 fGlobal->LocalToMaster(box->GetOrigin(), &fCheckedBox[0]);
375 fCheckedBox[3] = box->GetDX();
376 fCheckedBox[4] = box->GetDY();
377 fCheckedBox[5] = box->GetDZ();
380 crt = fOverlap->GetSecondVolume();
381 *fGlobal = fOverlap->GetSecondMatrix();
382 dist = crt->GetShape()->DistancetoPrimitive(px,py);
384 gPad->SetSelected(crt);
385 box = (TGeoBBox*)crt->GetShape();
386 fGlobal->LocalToMaster(box->GetOrigin(), &fCheckedBox[0]);
387 fCheckedBox[3] = box->GetDX();
388 fCheckedBox[4] = box->GetDY();
389 fCheckedBox[5] = box->GetDZ();
395 if ((puxmax+inaxis-px) < 40) {
396 if ((py-puymax+inaxis) < 40) {
398 gPad->SetSelected(fGeoManager);
399 fVolInfo = fGeoManager->GetName();
400 box = (TGeoBBox*)volume->GetShape();
401 memcpy(fCheckedBox, box->GetOrigin(), 3*
sizeof(Double_t));
402 fCheckedBox[3] = box->GetDX();
403 fCheckedBox[4] = box->GetDY();
404 fCheckedBox[5] = box->GetDZ();
408 gPad->SetSelected(volume);
409 fVolInfo = volume->GetName();
410 box = (TGeoBBox*)volume->GetShape();
411 memcpy(fCheckedBox, box->GetOrigin(), 3*
sizeof(Double_t));
412 fCheckedBox[3] = box->GetDX();
413 fCheckedBox[4] = box->GetDY();
414 fCheckedBox[5] = box->GetDZ();
418 TGeoVolume *vol = volume;
419 Bool_t vis = vol->IsVisible();
422 if (volume->IsVisBranch()) {
423 if (!fGeoManager->IsClosed())
return big;
424 fGeoManager->PushPath();
425 fGeoManager->cd(fVisBranch.Data());
426 while (fGeoManager->GetLevel()) {
427 vol = fGeoManager->GetCurrentVolume();
428 *fGlobal = gGeoManager->GetCurrentMatrix();
429 dist = vol->GetShape()->DistancetoPrimitive(px,py);
431 fVolInfo = fVisBranch;
432 box = (TGeoBBox*)vol->GetShape();
433 fGeoManager->LocalToMaster(box->GetOrigin(), &fCheckedBox[0]);
434 fCheckedNode = gGeoManager->GetCurrentNode();
435 if (fGeoManager->IsNodeSelectable()) gPad->SetSelected(fCheckedNode);
436 else gPad->SetSelected(vol);
437 fCheckedBox[3] = box->GetDX();
438 fCheckedBox[4] = box->GetDY();
439 fCheckedBox[5] = box->GetDZ();
440 fGeoManager->PopPath();
445 fGeoManager->PopPath();
450 if ((fTopVisible && vis) || !vol->GetNdaughters() || !vol->IsVisDaughters() || vol->IsVisOnly()) {
451 dist = vol->GetShape()->DistancetoPrimitive(px,py);
453 fVolInfo = vol->GetName();
454 gPad->SetSelected(vol);
455 box = (TGeoBBox*)vol->GetShape();
456 memcpy(fCheckedBox, box->GetOrigin(), 3*
sizeof(Double_t));
457 fCheckedBox[3] = box->GetDX();
458 fCheckedBox[4] = box->GetDY();
459 fCheckedBox[5] = box->GetDZ();
462 if (vol->IsVisOnly() || !vol->GetNdaughters() || !vol->IsVisDaughters())
467 TGeoIterator next(vol);
468 next.SetTopName(TString::Format(
"%s_1",vol->GetName()));
474 while ((daughter=next())) {
475 vol = daughter->GetVolume();
476 level = next.GetLevel();
477 nd = daughter->GetNdaughters();
478 vis = daughter->IsVisible();
479 if (volume->IsVisContainers()) {
480 if (vis && level<=fVisLevel) {
481 *fGlobal = next.GetCurrentMatrix();
482 dist = vol->GetShape()->DistancetoPrimitive(px,py);
484 next.GetPath(fVolInfo);
485 box = (TGeoBBox*)vol->GetShape();
486 fGlobal->LocalToMaster(box->GetOrigin(), &fCheckedBox[0]);
487 fCheckedNode = daughter;
488 if (fGeoManager->IsNodeSelectable()) gPad->SetSelected(fCheckedNode);
489 else gPad->SetSelected(vol);
490 fCheckedBox[3] = box->GetDX();
491 fCheckedBox[4] = box->GetDY();
492 fCheckedBox[5] = box->GetDZ();
493 fGeoManager->PopPath();
498 if (level==fVisLevel || !daughter->IsVisDaughters()) {
502 }
else if (volume->IsVisLeaves()) {
503 last = ((nd==0) || (level==fVisLevel) || (!daughter->IsVisDaughters()))?kTRUE:kFALSE;
505 *fGlobal = next.GetCurrentMatrix();
506 dist = vol->GetShape()->DistancetoPrimitive(px,py);
508 next.GetPath(fVolInfo);
509 box = (TGeoBBox*)vol->GetShape();
510 fGlobal->LocalToMaster(box->GetOrigin(), &fCheckedBox[0]);
511 fCheckedNode = daughter;
512 if (fGeoManager->IsNodeSelectable()) gPad->SetSelected(fCheckedNode);
513 else gPad->SetSelected(vol);
514 fCheckedBox[3] = box->GetDX();
515 fCheckedBox[4] = box->GetDY();
516 fCheckedBox[5] = box->GetDZ();
517 fGeoManager->PopPath();
522 if (last || !daughter->IsVisDaughters()) next.Skip();
531 void TGeoPainter::DefaultAngles()
535 TView *view = gPad->GetView();
537 view->SetView(-206,126,75,irep);
545 void TGeoPainter::DefaultColors()
547 TIter next(fGeoManager->GetListOfVolumes());
549 while ((vol=(TGeoVolume*)next()))
550 vol->SetLineColor(vol->GetMaterial()->GetDefaultColor());
557 Int_t TGeoPainter::CountNodes(TGeoVolume *volume, Int_t rlevel)
const
559 TGeoVolume *vol = volume;
561 Bool_t vis = vol->IsVisible();
563 if ((fTopVisible && vis) || !vol->GetNdaughters() || !vol->IsVisDaughters() || vol->IsVisOnly())
566 if (volume->IsVisOnly())
return count;
569 if (volume->IsVisBranch()) {
570 fGeoManager->PushPath();
571 fGeoManager->cd(fVisBranch.Data());
572 count = fGeoManager->GetLevel() + 1;
573 fGeoManager->PopPath();
577 TGeoIterator next(vol);
582 while ((daughter=next())) {
584 level = next.GetLevel();
585 nd = daughter->GetNdaughters();
586 vis = daughter->IsVisible();
587 if (volume->IsVisContainers()) {
588 if (vis && level<=rlevel) count++;
590 if (level==rlevel || !daughter->IsVisDaughters()) {
594 }
else if (volume->IsVisLeaves()) {
595 last = ((nd==0) || (level==rlevel) || (!daughter->IsVisDaughters()))?kTRUE:kFALSE;
596 if (vis && last) count++;
598 if (last) next.Skip();
607 Int_t TGeoPainter::CountVisibleNodes()
609 Int_t maxnodes = fGeoManager->GetMaxVisNodes();
610 Int_t vislevel = fGeoManager->GetVisLevel();
612 TGeoVolume *top = fTopVolume;
613 if (maxnodes <= 0 && top) {
614 fNVisNodes = CountNodes(top, vislevel);
615 SetVisLevel(vislevel);
622 SetVisLevel(vislevel);
626 Bool_t again = kFALSE;
627 for (Int_t level = 1;level<20;level++) {
629 Int_t nnodes = CountNodes(top, level);
630 if (top->IsVisOnly() || top->IsVisBranch()) {
631 vislevel = fVisLevel;
635 if (nnodes > maxnodes) {
639 if (nnodes == fNVisNodes) {
645 SetVisLevel(vislevel);
652 void TGeoPainter::CheckEdit()
654 if (fIsEditable)
return;
655 if (!TClass::GetClass(
"TGedEditor"))
return;
657 if ((h = gROOT->GetPluginManager()->FindHandler(
"TGeoManagerEditor"))) {
658 if (h->LoadPlugin() == -1)
return;
667 void TGeoPainter::EditGeometry(Option_t *option)
671 if (!option[0]) gPad->GetCanvas()->GetCanvasImp()->ShowEditor();
672 else TVirtualPadEditor::ShowEditor();
675 gPad->SetSelected(fGeoManager);
676 gPad->GetCanvas()->Selected(gPad,fGeoManager,kButton1Down);
682 void TGeoPainter::Draw(Option_t *option)
684 DrawVolume(fGeoManager->GetTopVolume(), option);
690 void TGeoPainter::DrawBatemanSol(TGeoBatemanSol *sol, Option_t *option)
692 Int_t ncoeff = sol->GetNcoeff();
694 Double_t tlo=0., thi=0.;
695 Double_t cn=0., lambda=0.;
697 sol->GetRange(tlo, thi);
698 Bool_t autorange = (thi==0.)?kTRUE:kFALSE;
701 if (autorange) tlo = 0.;
702 sol->GetCoeff(0, cn, lambda);
703 Double_t lambdamin = lambda;
704 TString formula =
"";
705 for (i=0; i<ncoeff; i++) {
706 sol->GetCoeff(i, cn, lambda);
707 formula += TString::Format(
"%g*exp(-%g*x)",cn, lambda);
708 if (i < ncoeff-1) formula +=
"+";
709 if (lambda < lambdamin &&
710 lambda > 0.) lambdamin = lambda;
712 if (autorange) thi = 10./lambdamin;
714 TF1 *func =
new TF1(TString::Format(
"conc%s",sol->GetElement()->GetName()), formula.Data(), tlo,thi);
715 func->SetTitle(formula +
";time[s]" + TString::Format(
";Concentration_of_%s",sol->GetElement()->GetName()));
716 func->SetMinimum(1.e-3);
717 func->SetMaximum(1.25*TMath::Max(sol->Concentration(tlo), sol->Concentration(thi)));
718 func->SetLineColor(sol->GetLineColor());
719 func->SetLineStyle(sol->GetLineStyle());
720 func->SetLineWidth(sol->GetLineWidth());
721 func->SetMarkerColor(sol->GetMarkerColor());
722 func->SetMarkerStyle(sol->GetMarkerStyle());
723 func->SetMarkerSize(sol->GetMarkerSize());
730 void TGeoPainter::DrawPolygon(
const TGeoPolygon *poly)
732 Int_t nvert = poly->GetNvert();
734 Error(
"DrawPolygon",
"No vertices defined");
737 Int_t nconv = poly->GetNconvex();
738 Double_t *x =
new Double_t[nvert+1];
739 Double_t *y =
new Double_t[nvert+1];
740 poly->GetVertices(x,y);
743 TGraph *g1 =
new TGraph(nvert+1, x,y);
744 g1->SetTitle(Form(
"Polygon with %d vertices (outscribed %d)",nvert, nconv));
745 g1->SetLineColor(kRed);
746 g1->SetMarkerColor(kRed);
747 g1->SetMarkerStyle(4);
748 g1->SetMarkerSize(0.8);
754 if (nconv && !poly->IsConvex()) {
755 xc =
new Double_t[nconv+1];
756 yc =
new Double_t[nconv+1];
757 poly->GetConvexVertices(xc,yc);
760 g2 =
new TGraph(nconv+1, xc,yc);
761 g2->SetLineColor(kBlue);
762 g2->SetLineColor(kBlue);
763 g2->SetMarkerColor(kBlue);
764 g2->SetMarkerStyle(21);
765 g2->SetMarkerSize(0.4);
770 gROOT->MakeDefCanvas();
773 if (g2) g2->Draw(
"LP");
779 void TGeoPainter::DrawVolume(TGeoVolume *vol, Option_t *option)
783 fIsPaintingShape = kFALSE;
787 TString opt = option;
789 fPaintingOverlaps = kFALSE;
793 ClearVisibleVolumes();
796 Bool_t has_pad = (gPad==0)?kFALSE:kTRUE;
799 gROOT->MakeDefCanvas();
801 if (!opt.Contains(
"same")) gPad->Clear();
803 fTopVolume->AppendPad(option);
806 TView *view = gPad->GetView();
808 view = TView::CreateView(11,0,0);
811 view->SetAutoRange(kTRUE);
812 if (has_pad) gPad->Update();
814 if (!opt.Contains(
"same")) Paint(
"range");
816 view->SetAutoRange(kFALSE);
821 fLastVolume = fTopVolume;
824 gPad->GetViewer3D(option);
830 void TGeoPainter::DrawShape(TGeoShape *shape, Option_t *option)
832 TString opt = option;
834 fPaintingOverlaps = kFALSE;
836 fIsPaintingShape = kTRUE;
838 Bool_t has_pad = (gPad==0)?kFALSE:kTRUE;
841 gROOT->MakeDefCanvas();
843 if (!opt.Contains(
"same")) gPad->Clear();
845 shape->AppendPad(option);
848 TView *view = gPad->GetView();
850 view = TView::CreateView(11,0,0);
853 view->SetAutoRange(kTRUE);
854 if (has_pad) gPad->Update();
856 PaintShape(shape,
"range");
857 view->SetAutoRange(kFALSE);
858 view->SetPerspective();
860 gPad->GetViewer3D(option);
866 void TGeoPainter::DrawOverlap(
void *ovlp, Option_t *option)
868 TString opt = option;
869 fIsPaintingShape = kFALSE;
870 TGeoOverlap *overlap = (TGeoOverlap*)ovlp;
871 if (!overlap)
return;
873 fPaintingOverlaps = kTRUE;
877 ClearVisibleVolumes();
880 Bool_t has_pad = (gPad==0)?kFALSE:kTRUE;
883 gROOT->MakeDefCanvas();
885 if (!opt.Contains(
"same")) gPad->Clear();
887 overlap->AppendPad(option);
891 gPad->GetViewer3D(option);
892 TView *view = gPad->GetView();
894 view = TView::CreateView(11,0,0);
897 view->SetAutoRange(kTRUE);
898 PaintOverlap(ovlp,
"range");
899 overlap->GetPolyMarker()->Draw(
"SAME");
900 if (has_pad) gPad->Update();
913 void TGeoPainter::DrawOnly(Option_t *option)
915 TString opt = option;
918 ClearVisibleVolumes();
921 fPaintingOverlaps = kFALSE;
922 fIsPaintingShape = kFALSE;
923 Bool_t has_pad = (gPad==0)?kFALSE:kTRUE;
926 gROOT->MakeDefCanvas();
928 if (!opt.Contains(
"same")) gPad->Clear();
930 fTopVolume = fGeoManager->GetCurrentVolume();
931 fTopVolume->AppendPad(option);
934 TView *view = gPad->GetView();
936 view = TView::CreateView(11,0,0);
939 view->SetAutoRange(kTRUE);
940 fVisOption = kGeoVisOnly;
941 if (has_pad) gPad->Update();
953 void TGeoPainter::DrawCurrentPoint(Int_t color)
956 if (!gPad->GetView())
return;
957 TPolyMarker3D *pm =
new TPolyMarker3D();
958 pm->SetMarkerColor(color);
959 const Double_t *point = fGeoManager->GetCurrentPoint();
960 pm->SetNextPoint(point[0], point[1], point[2]);
961 pm->SetMarkerStyle(8);
962 pm->SetMarkerSize(0.5);
968 void TGeoPainter::DrawPanel()
975 void TGeoPainter::DrawPath(
const char *path, Option_t *option)
977 fVisOption=kGeoVisBranch;
979 fIsPaintingShape = kFALSE;
980 fTopVolume = fGeoManager->GetTopVolume();
981 fTopVolume->SetVisRaytrace(kFALSE);
982 DrawVolume(fTopVolume,option);
988 void TGeoPainter::EstimateCameraMove(Double_t tmin, Double_t tmax, Double_t *start, Double_t *end)
991 TIter next(gPad->GetListOfPrimitives());
992 TVirtualGeoTrack *track;
996 AddTrackPoint(point, start, kTRUE);
997 while ((obj=next())) {
998 if (strcmp(obj->ClassName(),
"TGeoTrack"))
continue;
999 track = (TVirtualGeoTrack*)obj;
1001 track->PaintCollect(tmin, start);
1004 if (!ntracks)
return;
1006 AddTrackPoint(point, end, kTRUE);
1007 while ((obj=next())) {
1008 if (strcmp(obj->ClassName(),
"TGeoTrack"))
continue;
1009 track = (TVirtualGeoTrack*)obj;
1010 if (!track)
continue;
1011 track->PaintCollect(tmax, end);
1018 void TGeoPainter::ExecuteManagerEvent(TGeoManager * , Int_t event, Int_t , Int_t )
1021 gPad->SetCursor(kPointer);
1024 if (!fIsEditable) CheckEdit();
1031 void TGeoPainter::ExecuteShapeEvent(TGeoShape * , Int_t event, Int_t , Int_t )
1034 gPad->SetCursor(kHand);
1037 if (!fIsEditable) CheckEdit();
1044 void TGeoPainter::ExecuteVolumeEvent(TGeoVolume * , Int_t event, Int_t , Int_t )
1047 if (!fIsEditable) CheckEdit();
1052 gPad->SetCursor(kHand);
1079 case kButton1Double:
1080 gPad->SetCursor(kWatch);
1089 const char *TGeoPainter::GetVolumeInfo(
const TGeoVolume *volume, Int_t , Int_t )
const
1091 static TString info;
1093 if (!gPad)
return info;
1094 if (fPaintingOverlaps) {
1096 info =
"wrong overlapping flag";
1099 TString ovtype, name;
1100 if (fOverlap->IsExtrusion()) ovtype=
"EXTRUSION";
1101 else ovtype =
"OVERLAP";
1102 if (volume==fOverlap->GetFirstVolume()) name=volume->GetName();
1103 else name=fOverlap->GetSecondVolume()->GetName();
1104 info = TString::Format(
"%s: %s of %g", name.Data(), ovtype.Data(), fOverlap->GetOverlap());
1107 else info = TString::Format(
"%s, shape=%s", fVolInfo.Data(), volume->GetShape()->ClassName());
1114 TGeoChecker *TGeoPainter::GetChecker()
1116 if (!fChecker) fChecker =
new TGeoChecker(fGeoManager);
1123 void TGeoPainter::GetViewAngles(Double_t &longitude, Double_t &latitude, Double_t &psi)
1126 TView *view = gPad->GetView();
1128 longitude = view->GetLongitude();
1129 latitude = view->GetLatitude();
1130 psi = view->GetPsi();
1136 void TGeoPainter::GrabFocus(Int_t nfr, Double_t dlong, Double_t dlat, Double_t dpsi)
1139 TView *view = gPad->GetView();
1141 if (!fCheckedNode && !fPaintingOverlaps) {
1142 printf(
"Woops!!!\n");
1143 TGeoBBox *box = (TGeoBBox*)fGeoManager->GetTopVolume()->GetShape();
1144 memcpy(&fCheckedBox[0], box->GetOrigin(), 3*
sizeof(Double_t));
1145 fCheckedBox[3] = box->GetDX();
1146 fCheckedBox[4] = box->GetDY();
1147 fCheckedBox[5] = box->GetDZ();
1149 view->SetPerspective();
1150 Int_t nvols = fVisVolumes->GetEntriesFast();
1151 Int_t nframes = nfr;
1154 if (nvols<1500) nframes=10;
1155 if (nvols<1000) nframes=20;
1156 if (nvols<200) nframes = 50;
1157 if (nvols<100) nframes = 100;
1159 view->MoveFocus(&fCheckedBox[0], fCheckedBox[3], fCheckedBox[4], fCheckedBox[5], nframes, dlong, dlat, dpsi);
1165 TH2F *TGeoPainter::LegoPlot(Int_t ntheta, Double_t themin, Double_t themax,
1166 Int_t nphi, Double_t phimin, Double_t phimax,
1167 Double_t rmin, Double_t rmax, Option_t *option)
1169 return fChecker->LegoPlot(ntheta, themin, themax, nphi, phimin, phimax, rmin, rmax, option);
1174 void TGeoPainter::LocalToMasterVect(
const Double_t *local, Double_t *master)
const
1176 for (Int_t i=0; i<3; i++)
1177 master[i] = -local[0]*fMat[i]-local[1]*fMat[i+3]-local[2]*fMat[i+6];
1183 void TGeoPainter::ModifiedPad(Bool_t update)
const
1190 TView *view = gPad->GetView();
1192 view->SetViewChanged();
1194 if (gROOT->FromPopUp()) gPad->Update();
1200 void TGeoPainter::Paint(Option_t *option)
1202 if (!fGeoManager || !fTopVolume)
return;
1203 Bool_t is_padviewer = kTRUE;
1204 if (gPad) is_padviewer = (!strcmp(gPad->GetViewer3D()->ClassName(),
"TViewer3DPad"))?kTRUE:kFALSE;
1206 fIsRaytracing = fTopVolume->IsRaytracing();
1207 if (fTopVolume->IsVisContainers()) fVisOption = kGeoVisDefault;
1208 else if (fTopVolume->IsVisLeaves()) fVisOption = kGeoVisLeaves;
1209 else if (fTopVolume->IsVisOnly()) fVisOption = kGeoVisOnly;
1210 else if (fTopVolume->IsVisBranch()) fVisOption = kGeoVisBranch;
1213 if (!fIsRaytracing || !is_padviewer) {
1214 if (fGeoManager->IsDrawingExtra()) {
1216 fGeoManager->CdTop();
1217 TObjArray *nodeList = fGeoManager->GetListOfPhysicalNodes();
1218 Int_t nnodes = nodeList->GetEntriesFast();
1220 TGeoPhysicalNode *node;
1221 for (inode=0; inode<nnodes; inode++) {
1222 node = (TGeoPhysicalNode*)nodeList->UncheckedAt(inode);
1223 PaintPhysicalNode(node, option);
1226 PaintVolume(fTopVolume,option);
1231 if (fIsRaytracing && is_padviewer) Raytrace();
1237 void TGeoPainter::PaintOverlap(
void *ovlp, Option_t *option)
1239 if (!fGeoManager)
return;
1240 TGeoOverlap *overlap = (TGeoOverlap *)ovlp;
1241 if (!overlap)
return;
1242 Int_t color, transparency;
1243 if (fOverlap != overlap) fOverlap = overlap;
1244 TGeoShape::SetTransform(fGlobal);
1245 TGeoHMatrix *hmat = fGlobal;
1247 TGeoVolume *vol1 = overlap->GetFirstVolume();
1248 TGeoVolume *vol2 = overlap->GetSecondVolume();
1249 TGeoHMatrix *matrix1 = overlap->GetFirstMatrix();
1250 TGeoHMatrix *matrix2 = overlap->GetSecondMatrix();
1254 fGeoManager->SetMatrixReflection(matrix1->IsReflection());
1255 if (!fVisLock) fVisVolumes->Add(vol);
1256 fGeoManager->SetPaintVolume(vol);
1257 color = vol->GetLineColor();
1258 transparency = vol->GetTransparency();
1259 vol->SetLineColor(kGreen);
1260 vol->SetTransparency(40);
1261 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1262 PaintShape(*(vol->GetShape()),option);
1263 vol->SetLineColor(color);
1264 vol->SetTransparency(transparency);
1267 fGeoManager->SetMatrixReflection(matrix2->IsReflection());
1268 if (!fVisLock) fVisVolumes->Add(vol);
1269 fGeoManager->SetPaintVolume(vol);
1270 color = vol->GetLineColor();
1271 transparency = vol->GetTransparency();
1272 vol->SetLineColor(kBlue);
1273 vol->SetTransparency(40);
1274 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1275 PaintShape(*(vol->GetShape()),option);
1276 vol->SetLineColor(color);
1277 vol->SetTransparency(transparency);
1278 fGeoManager->SetMatrixReflection(kFALSE);
1285 void TGeoPainter::PaintNode(TGeoNode *node, Option_t *option, TGeoMatrix* global)
1287 PaintVolume(node->GetVolume(), option, global);
1293 void TGeoPainter::PaintVolume(TGeoVolume *top, Option_t *option, TGeoMatrix* global)
1295 if (fTopVolume != top) {
1296 ClearVisibleVolumes();
1300 if (!fVisLevel)
return;
1301 TGeoVolume *vol = top;
1306 TGeoShape::SetTransform(fGlobal);
1307 Bool_t drawDaughters = kTRUE;
1308 Bool_t vis = (top->IsVisible() && !top->IsAssembly());
1309 Int_t transparency = 0;
1312 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1315 if (top->IsVisBranch()) {
1316 fGeoManager->PushPath();
1317 fGeoManager->cd(fVisBranch.Data());
1319 vol = fGeoManager->GetCurrentVolume();
1321 fVisVolumes->Add(vol);
1322 vol->SetAttBit(TGeoAtt::kVisOnScreen);
1324 fGeoManager->SetPaintVolume(vol);
1325 transparency = vol->GetTransparency();
1326 vol->SetTransparency(40);
1327 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1330 *fGlobal *= *fGeoManager->GetCurrentMatrix();
1332 *fGlobal = fGeoManager->GetCurrentMatrix();
1334 fGeoManager->SetMatrixReflection(fGlobal->IsReflection());
1335 PaintShape(*(vol->GetShape()),option);
1336 vol->SetTransparency(transparency);
1337 fGeoManager->CdUp();
1340 fGeoManager->PopPath();
1341 fGeoManager->SetMatrixReflection(kFALSE);
1346 if ((fTopVisible && vis) || !top->GetNdaughters() || !top->IsVisDaughters() || top->IsVisOnly()) {
1347 fGeoManager->SetPaintVolume(vol);
1348 fGeoManager->SetMatrixReflection(fGlobal->IsReflection());
1349 PaintShape(*(vol->GetShape()),option);
1350 if (!fVisLock && !vol->TestAttBit(TGeoAtt::kVisOnScreen)) {
1351 fVisVolumes->Add(vol);
1352 vol->SetAttBit(TGeoAtt::kVisOnScreen);
1354 if (top->IsVisOnly() || !top->GetNdaughters() || !top->IsVisDaughters()) {
1361 TGeoIterator next(vol);
1362 if (fPlugin) next.SetUserPlugin(fPlugin);
1367 Int_t line_color=0, line_width=0, line_style=0;
1368 while ((daughter=next())) {
1369 vol = daughter->GetVolume();
1370 fGeoManager->SetPaintVolume(vol);
1371 level = next.GetLevel();
1372 nd = daughter->GetNdaughters();
1373 vis = daughter->IsVisible();
1374 drawDaughters = kTRUE;
1375 if (top->IsVisContainers()) {
1376 if (vis && level<=fVisLevel) {
1378 line_color = vol->GetLineColor();
1379 line_width = vol->GetLineWidth();
1380 line_style = vol->GetLineStyle();
1381 transparency = vol->GetTransparency();
1382 fPlugin->ProcessNode();
1384 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1387 *fGlobal *= *next.GetCurrentMatrix();
1389 *fGlobal = next.GetCurrentMatrix();
1391 fGeoManager->SetMatrixReflection(fGlobal->IsReflection());
1392 drawDaughters = PaintShape(*(vol->GetShape()),option);
1394 vol->SetLineColor(line_color);
1395 vol->SetLineWidth(line_width);
1396 vol->SetLineStyle(line_style);
1397 vol->SetTransparency(transparency);
1399 if (!fVisLock && !daughter->IsOnScreen()) {
1400 fVisVolumes->Add(vol);
1401 vol->SetAttBit(TGeoAtt::kVisOnScreen);
1405 if (!drawDaughters || level==fVisLevel || !daughter->IsVisDaughters()) {
1409 }
else if (top->IsVisLeaves()) {
1410 last = ((nd==0) || (level==fVisLevel) || (!daughter->IsVisDaughters()))?kTRUE:kFALSE;
1413 line_color = vol->GetLineColor();
1414 line_width = vol->GetLineWidth();
1415 line_style = vol->GetLineStyle();
1416 transparency = vol->GetTransparency();
1417 fPlugin->ProcessNode();
1419 if (!strstr(option,
"range")) ((TAttLine*)vol)->Modify();
1422 *fGlobal *= *next.GetCurrentMatrix();
1424 *fGlobal = next.GetCurrentMatrix();
1426 fGeoManager->SetMatrixReflection(fGlobal->IsReflection());
1427 drawDaughters = PaintShape(*(vol->GetShape()),option);
1429 vol->SetLineColor(line_color);
1430 vol->SetLineWidth(line_width);
1431 vol->SetLineStyle(line_style);
1432 vol->SetTransparency(transparency);
1434 if (!fVisLock && !daughter->IsOnScreen()) {
1435 fVisVolumes->Add(vol);
1436 vol->SetAttBit(TGeoAtt::kVisOnScreen);
1440 if (!drawDaughters || last || !daughter->IsVisDaughters()) next.Skip();
1443 if (fPlugin) fPlugin->SetIterator(0);
1444 fGeoManager->SetMatrixReflection(kFALSE);
1451 Bool_t TGeoPainter::PaintShape(
const TGeoShape & shape, Option_t * option )
const
1453 Bool_t addDaughters = kTRUE;
1455 TVirtualViewer3D * viewer = gPad->GetViewer3D();
1457 if (!viewer || shape.IsA()==TGeoShapeAssembly::Class()) {
1458 return addDaughters;
1463 if (!shape.IsComposite()) {
1465 Bool_t localFrame = viewer->PreferLocalFrame();
1468 const TBuffer3D & buffer =
1469 shape.GetBuffer3D(TBuffer3D::kCore|TBuffer3D::kBoundingBox|TBuffer3D::kShapeSpecific, localFrame);
1470 Int_t reqSections = viewer->AddObject(buffer, &addDaughters);
1474 if (reqSections != TBuffer3D::kNone) {
1475 shape.GetBuffer3D(reqSections, localFrame);
1476 viewer->AddObject(buffer, &addDaughters);
1484 const TGeoCompositeShape * composite =
static_cast<const TGeoCompositeShape *
>(&shape);
1490 addDaughters = composite->PaintComposite(option);
1493 return addDaughters;
1499 void TGeoPainter::PaintShape(TGeoShape *shape, Option_t *option)
1501 TGeoShape::SetTransform(fGlobal);
1503 fGeoManager->SetPaintVolume(0);
1504 PaintShape(*shape,option);
1510 void TGeoPainter::PaintPhysicalNode(TGeoPhysicalNode *node, Option_t *option)
1512 if (!node->IsVisible())
return;
1513 Int_t level = node->GetLevel();
1514 Int_t i, col, wid, sty;
1516 TGeoShape::SetTransform(fGlobal);
1517 TGeoHMatrix *matrix = fGlobal;
1519 if (!node->IsVisibleFull()) {
1521 vcrt = node->GetVolume();
1522 if (!strstr(option,
"range")) ((TAttLine*)vcrt)->Modify();
1523 shape = vcrt->GetShape();
1524 *matrix = node->GetMatrix();
1525 fGeoManager->SetMatrixReflection(matrix->IsReflection());
1526 fGeoManager->SetPaintVolume(vcrt);
1527 if (!node->IsVolAttributes() && !strstr(option,
"range")) {
1528 col = vcrt->GetLineColor();
1529 wid = vcrt->GetLineWidth();
1530 sty = vcrt->GetLineStyle();
1531 vcrt->SetLineColor(node->GetLineColor());
1532 vcrt->SetLineWidth(node->GetLineWidth());
1533 vcrt->SetLineStyle(node->GetLineStyle());
1534 ((TAttLine*)vcrt)->Modify();
1535 PaintShape(*shape,option);
1536 vcrt->SetLineColor(col);
1537 vcrt->SetLineWidth(wid);
1538 vcrt->SetLineStyle(sty);
1540 PaintShape(*shape,option);
1544 for (i=1;i<=level; i++) {
1545 vcrt = node->GetVolume(i);
1546 if (!strstr(option,
"range")) ((TAttLine*)vcrt)->Modify();
1547 shape = vcrt->GetShape();
1548 *matrix = node->GetMatrix(i);
1549 fGeoManager->SetMatrixReflection(matrix->IsReflection());
1550 fGeoManager->SetPaintVolume(vcrt);
1551 if (!node->IsVolAttributes() && !strstr(option,
"range")) {
1552 col = vcrt->GetLineColor();
1553 wid = vcrt->GetLineWidth();
1554 sty = vcrt->GetLineStyle();
1555 vcrt->SetLineColor(node->GetLineColor());
1556 vcrt->SetLineWidth(node->GetLineWidth());
1557 vcrt->SetLineStyle(node->GetLineStyle());
1558 ((TAttLine*)vcrt)->Modify();
1559 PaintShape(*shape,option);
1560 vcrt->SetLineColor(col);
1561 vcrt->SetLineWidth(wid);
1562 vcrt->SetLineStyle(sty);
1564 PaintShape(*shape,option);
1568 fGeoManager->SetMatrixReflection(kFALSE);
1574 void TGeoPainter::PrintOverlaps()
const
1576 fChecker->PrintOverlaps();
1582 void TGeoPainter::OpProgress(
const char *opname, Long64_t current, Long64_t size, TStopwatch *watch, Bool_t last, Bool_t refresh,
const char *msg)
1584 fChecker->OpProgress(opname,current,size,watch,last,refresh, msg);
1590 void TGeoPainter::RandomPoints(
const TGeoVolume *vol, Int_t npoints, Option_t *option)
1592 fChecker->RandomPoints((TGeoVolume*)vol, npoints, option);
1598 void TGeoPainter::RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz,
const char *target_vol, Bool_t check_norm)
1600 fChecker->RandomRays(nrays, startx, starty, startz, target_vol, check_norm);
1606 void TGeoPainter::Raytrace(Option_t *)
1608 if (!gPad || gPad->IsBatch())
return;
1609 TView *view = gPad->GetView();
1611 Int_t rtMode = fGeoManager->GetRTmode();
1612 TGeoVolume *top = fGeoManager->GetTopVolume();
1613 if (top != fTopVolume) fGeoManager->SetTopVolume(fTopVolume);
1614 if (!view->IsPerspective()) view->SetPerspective();
1615 gVirtualX->SetMarkerSize(1);
1616 gVirtualX->SetMarkerStyle(1);
1617 Bool_t inclipst=kFALSE, inclip=kFALSE;
1618 Double_t krad = TMath::DegToRad();
1619 Double_t lat = view->GetLatitude();
1620 Double_t longit = view->GetLongitude();
1621 Double_t psi = view->GetPsi();
1622 Double_t c1 = TMath::Cos(psi*krad);
1623 Double_t s1 = TMath::Sin(psi*krad);
1624 Double_t c2 = TMath::Cos(lat*krad);
1625 Double_t s2 = TMath::Sin(lat*krad);
1626 Double_t s3 = TMath::Cos(longit*krad);
1627 Double_t c3 = -TMath::Sin(longit*krad);
1628 fMat[0] = c1*c3 - s1*c2*s3;
1629 fMat[1] = c1*s3 + s1*c2*c3;
1632 fMat[3] = -s1*c3 - c1*c2*s3;
1633 fMat[4] = -s1*s3 + c1*c2*c3;
1639 Double_t u0, v0, du, dv;
1640 view->GetWindow(u0,v0,du,dv);
1641 Double_t dview = view->GetDview();
1642 Double_t dproj = view->GetDproj();
1643 Double_t local[3] = {0,0,1};
1644 Double_t dir[3], normal[3];
1645 LocalToMasterVect(local,dir);
1646 Double_t min[3], max[3];
1647 view->GetRange(min, max);
1649 for (Int_t i=0; i<3; i++) cov[i] = 0.5*(min[i]+max[i]);
1651 for (Int_t i=0; i<3; i++) cop[i] = cov[i] - dir[i]*dview;
1652 fGeoManager->InitTrack(cop, dir);
1653 Bool_t outside = fGeoManager->IsOutside();
1654 fGeoManager->DoBackupState();
1655 if (fClippingShape) inclipst = inclip = fClippingShape->Contains(cop);
1657 Double_t xloc, yloc, modloc;
1658 Int_t pxmin,pxmax, pymin,pymax;
1659 pxmin = gPad->UtoAbsPixel(0);
1660 pxmax = gPad->UtoAbsPixel(1);
1661 pymin = gPad->VtoAbsPixel(1);
1662 pymax = gPad->VtoAbsPixel(0);
1663 TGeoNode *next =
nullptr;
1664 TGeoNode *nextnode =
nullptr;
1665 Double_t step,steptot;
1667 const Double_t *point = fGeoManager->GetCurrentPoint();
1668 Double_t *ppoint = (Double_t*)point;
1669 Double_t tosource[3];
1671 Double_t phi = 45.*krad;
1672 tosource[0] = -dir[0]*TMath::Cos(phi)+dir[1]*TMath::Sin(phi);
1673 tosource[1] = -dir[0]*TMath::Sin(phi)-dir[1]*TMath::Cos(phi);
1674 tosource[2] = -dir[2];
1678 Int_t base_color, color;
1680 Double_t stemin=0, stemax=TGeoShape::Big();
1681 TPoint *pxy =
new TPoint[1];
1682 TGeoVolume *nextvol;
1684 Int_t ntotal = pxmax*pymax;
1686 TStopwatch *timer =
new TStopwatch();
1688 for (px=pxmin; px<pxmax; px++) {
1689 for (py=pymin; py<pymax; py++) {
1690 if ((nrays%100)==0) OpProgress(
"Raytracing",nrays,ntotal,timer,kFALSE);
1695 xloc = gPad->AbsPixeltoX(pxmin+pxmax-px);
1697 yloc = gPad->AbsPixeltoY(pymin+pymax-py);
1699 modloc = TMath::Sqrt(xloc*xloc+yloc*yloc+dproj*dproj);
1700 local[0] = xloc/modloc;
1701 local[1] = yloc/modloc;
1702 local[2] = dproj/modloc;
1703 LocalToMasterVect(local,dir);
1704 fGeoManager->DoRestoreState();
1705 fGeoManager->SetOutside(outside);
1706 fGeoManager->SetCurrentPoint(cop);
1707 fGeoManager->SetCurrentDirection(dir);
1713 if (fClippingShape) {
1715 stemin = fClippingShape->DistFromInside(cop,dir,3);
1716 stemax = TGeoShape::Big();
1718 stemax = fClippingShape->DistFromOutside(cop,dir,3);
1724 if (fClippingShape) {
1725 if (stemin>1E10)
break;
1728 fGeoManager->SetStep(stemin);
1729 next = fGeoManager->Step();
1735 nextvol = next->GetVolume();
1736 if (nextvol->TestAttBit(TGeoAtt::kVisOnScreen)) {
1738 base_color = nextvol->GetLineColor();
1739 fClippingShape->ComputeNormal(ppoint, dir, normal);
1744 next = fGeoManager->GetMother(up);
1747 inclip = fClippingShape->Contains(ppoint);
1748 fGeoManager->SetStep(1E-3);
1750 fGeoManager->Step();
1751 inclip = fClippingShape->Contains(ppoint);
1753 stemax = fClippingShape->DistFromOutside(ppoint,dir,3);
1756 nextnode = fGeoManager->FindNextBoundaryAndStep();
1757 step = fGeoManager->GetStep();
1758 if (step>1E10)
break;
1762 if (fClippingShape) {
1763 if (steptot>stemax) {
1765 inclip = fClippingShape->Contains(ppoint);
1767 stemin = fClippingShape->DistFromInside(ppoint,dir,3);
1768 stemax = TGeoShape::Big();
1772 stemax = fClippingShape->DistFromOutside(ppoint,dir,3);
1777 if (!nextnode)
continue;
1778 nextvol = nextnode->GetVolume();
1779 if (nextvol->TestAttBit(TGeoAtt::kVisOnScreen)) {
1781 base_color = nextvol->GetLineColor();
1786 if (!done)
continue;
1789 fGeoManager->MasterToLocal(gGeoManager->GetCurrentPoint(), local);
1790 fGeoManager->MasterToLocalVect(gGeoManager->GetCurrentDirection(), dir);
1791 for (Int_t i=0; i<3; ++i) local[i] += 1.E-8*dir[i];
1792 step = next->GetVolume()->GetShape()->DistFromInside(local,dir,3);
1793 for (Int_t i=0; i<3; ++i) local[i] += step*dir[i];
1794 next->GetVolume()->GetShape()->ComputeNormal(local, dir, normal);
1797 if (!norm) norm = fGeoManager->FindNormalFast();
1798 if (!norm)
continue;
1800 calf = norm[0]*tosource[0]+norm[1]*tosource[1]+norm[2]*tosource[2];
1801 light = TMath::Abs(calf);
1802 color = GetColor(base_color, light);
1804 gVirtualX->SetMarkerColor(color);
1807 gVirtualX->DrawPolyMarker(1,pxy);
1812 fChecker->OpProgress(
"Raytracing",nrays,ntotal,timer,kTRUE);
1820 TGeoNode *TGeoPainter::SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil,
1823 return fChecker->SamplePoints(npoints, dist, epsil, g3path);
1829 void TGeoPainter::SetBombFactors(Double_t bombx, Double_t bomby, Double_t bombz, Double_t bombr)
1835 if (IsExplodedView()) ModifiedPad();
1841 void TGeoPainter::SetExplodedView(Int_t ibomb)
1843 if ((ibomb<0) || (ibomb>3)) {
1844 Warning(
"SetExplodedView",
"exploded view can be 0-3");
1847 if ((Int_t)ibomb==fExplodedView)
return;
1848 Bool_t change = (gPad==0)?kFALSE:kTRUE;
1850 if (ibomb==kGeoNoBomb) {
1851 change &= ((fExplodedView==kGeoNoBomb)?kFALSE:kTRUE);
1853 if (ibomb==kGeoBombXYZ) {
1854 change &= ((fExplodedView==kGeoBombXYZ)?kFALSE:kTRUE);
1856 if (ibomb==kGeoBombCyl) {
1857 change &= ((fExplodedView==kGeoBombCyl)?kFALSE:kTRUE);
1859 if (ibomb==kGeoBombSph) {
1860 change &= ((fExplodedView==kGeoBombSph)?kFALSE:kTRUE);
1862 fExplodedView = ibomb;
1863 if (change) ModifiedPad();
1869 void TGeoPainter::SetNsegments(Int_t nseg)
1872 Warning(
"SetNsegments",
"number of segments should be > 2");
1875 if (fNsegments==nseg)
return;
1883 void TGeoPainter::SetNmeshPoints(Int_t npoints) {
1884 fChecker->SetNmeshPoints(npoints);
1891 void TGeoPainter::SetCheckedNode(TGeoNode *node) {
1892 fChecker->SetSelectedNode(node);
1898 void TGeoPainter::SetVisLevel(Int_t level) {
1899 if (level==fVisLevel && fLastVolume==fTopVolume)
return;
1901 if (!fTopVolume)
return;
1903 ClearVisibleVolumes();
1911 if (gPad->GetView()) {
1920 void TGeoPainter::SetTopVisible(Bool_t vis)
1922 if (fTopVisible==vis)
return;
1933 void TGeoPainter::SetVisOption(Int_t option) {
1934 if ((fVisOption<0) || (fVisOption>4)) {
1935 Warning(
"SetVisOption",
"wrong visualization option");
1939 if (option == kGeoVisChanged) {
1941 ClearVisibleVolumes();
1949 TGeoAtt *att = (TGeoAtt*)fTopVolume;
1950 att->SetAttBit(TGeoAtt::kVisBranch,kFALSE);
1951 att->SetAttBit(TGeoAtt::kVisContainers,kFALSE);
1952 att->SetAttBit(TGeoAtt::kVisOnly,kFALSE);
1954 case kGeoVisDefault:
1955 att->SetAttBit(TGeoAtt::kVisContainers,kTRUE);
1960 att->SetAttBit(TGeoAtt::kVisOnly,kTRUE);
1965 if (fVisOption==option)
return;
1968 ClearVisibleVolumes();
1977 Int_t TGeoPainter::ShapeDistancetoPrimitive(
const TGeoShape *shape, Int_t numpoints, Int_t px, Int_t py)
const
1979 const Int_t inaxis = 7;
1980 const Int_t maxdist = 5;
1981 const Int_t big = 9999;
1983 if (!gPad)
return dist;
1984 TView *view = gPad->GetView();
1985 if (!(numpoints && view))
return dist;
1986 if (shape->IsA()==TGeoShapeAssembly::Class())
return dist;
1988 if (fIsPaintingShape) {
1989 Int_t puxmin = gPad->XtoAbsPixel(gPad->GetUxmin());
1990 Int_t puymin = gPad->YtoAbsPixel(gPad->GetUymin());
1991 Int_t puxmax = gPad->XtoAbsPixel(gPad->GetUxmax());
1992 Int_t puymax = gPad->YtoAbsPixel(gPad->GetUymax());
1994 if (px < puxmin - inaxis)
return big;
1995 if (py > puymin + inaxis)
return big;
1996 if (px > puxmax + inaxis)
return big;
1997 if (py < puymax - inaxis)
return big;
1998 if ((puxmax+inaxis-px) < 40) {
2000 gPad->SetSelected(fGeoManager);
2005 fBuffer->SetRawSizes(numpoints, 3*numpoints, 0, 0, 0, 0);
2006 Double_t *points = fBuffer->fPnts;
2007 shape->SetPoints(points);
2008 Double_t dpoint2, x1, y1, xndc[3];
2009 Double_t dmaster[3];
2011 for (Int_t i=0; i<numpoints; i++) {
2013 TGeoShape::GetTransform()->LocalToMaster(&points[j], dmaster);
2014 points[j]=dmaster[0]; points[j+1]=dmaster[1]; points[j+2]=dmaster[2];
2015 view->WCtoNDC(&points[j], xndc);
2016 x1 = gPad->XtoAbsPixel(xndc[0]);
2017 y1 = gPad->YtoAbsPixel(xndc[1]);
2018 dpoint2 = (px-x1)*(px-x1) + (py-y1)*(py-y1);
2019 if (dpoint2 < dist) dist=(Int_t)dpoint2;
2021 if (dist > 100)
return dist;
2022 dist = Int_t(TMath::Sqrt(Double_t(dist)));
2023 if (dist<maxdist && fIsPaintingShape) gPad->SetSelected((TObject*)shape);
2030 void TGeoPainter::Test(Int_t npoints, Option_t *option)
2032 fChecker->Test(npoints, option);
2038 void TGeoPainter::TestOverlaps(
const char* path)
2040 fChecker->TestOverlaps(path);
2046 Bool_t TGeoPainter::TestVoxels(TGeoVolume *vol)
2048 return fChecker->TestVoxels(vol);
2054 void TGeoPainter::UnbombTranslation(
const Double_t *tr, Double_t *bombtr)
2056 memcpy(bombtr, tr, 3*
sizeof(Double_t));
2057 switch (fExplodedView) {
2061 bombtr[0] /= fBombX;
2062 bombtr[1] /= fBombY;
2063 bombtr[2] /= fBombZ;
2066 bombtr[0] /= fBombR;
2067 bombtr[1] /= fBombR;
2068 bombtr[2] /= fBombZ;
2071 bombtr[0] /= fBombR;
2072 bombtr[1] /= fBombR;
2073 bombtr[2] /= fBombR;
2083 Double_t TGeoPainter::Weight(Double_t precision, Option_t *option)
2085 return fChecker->Weight(precision, option);