38 using namespace ROOT::Experimental;
39 namespace REX = ROOT::Experimental;
46 TObjArray* REX::REveUtil::fgDefaultColors =
nullptr;
55 void ChompTailAndDir(TString& s,
char c=
'.')
61 Ssiz_t ls = s.Last(
'/');
70 Bool_t REveUtil::CheckMacro(
const char* mac)
78 TString foo(mac); ChompTailAndDir(foo);
79 if (gROOT->GetGlobalFunction(foo.Data(), 0, kFALSE) != 0)
82 return (gROOT->GetGlobalFunction(foo.Data(), 0, kTRUE) != 0);
88 void REveUtil::AssertMacro(
const char* mac)
90 if( CheckMacro(mac) == kFALSE) {
98 void REveUtil::Macro(
const char* mac)
100 if (CheckMacro(mac) == kFALSE) {
101 gROOT->LoadMacro(mac);
103 TString foo(mac); ChompTailAndDir(foo); foo +=
"()";
104 gROOT->ProcessLine(foo.Data());
110 void REveUtil::LoadMacro(
const char* mac)
112 if (CheckMacro(mac) == kFALSE) {
113 gROOT->LoadMacro(mac);
122 void REveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Bool_t alpha)
124 TColor* c = gROOT->GetColor(ci);
127 col[0] = (UChar_t)(255*c->GetRed());
128 col[1] = (UChar_t)(255*c->GetGreen());
129 col[2] = (UChar_t)(255*c->GetBlue());
130 if (alpha) col[3] = 255;
135 col[0] = 255; col[1] = 0; col[2] = 255;
136 if (alpha) col[3] = 255;
145 void REveUtil::ColorFromIdx(Color_t ci, UChar_t col[4], Char_t transparency)
147 UChar_t alpha = (255*(100 - transparency))/100;
149 TColor* c = gROOT->GetColor(ci);
152 col[0] = (UChar_t)(255*c->GetRed());
153 col[1] = (UChar_t)(255*c->GetGreen());
154 col[2] = (UChar_t)(255*c->GetBlue());
160 col[0] = 255; col[1] = 0; col[2] = 255; col[3] = alpha;
170 void REveUtil::ColorFromIdx(Float_t f1, Color_t c1, Float_t f2, Color_t c2,
171 UChar_t col[4], Bool_t alpha)
173 TColor* t1 = gROOT->GetColor(c1);
174 TColor* t2 = gROOT->GetColor(c2);
176 col[0] = (UChar_t)(255*(f1*t1->GetRed() + f2*t2->GetRed()));
177 col[1] = (UChar_t)(255*(f1*t1->GetGreen() + f2*t2->GetGreen()));
178 col[2] = (UChar_t)(255*(f1*t1->GetBlue() + f2*t2->GetBlue()));
179 if (alpha) col[3] = 255;
191 Color_t* REveUtil::FindColorVar(TObject* obj,
const char* varname)
193 static const REveException eh(
"REveUtil::FindColorVar");
195 Int_t off = obj->IsA()->GetDataMemberOffset(varname);
197 throw(eh +
"could not find member '" + varname +
"' in class " + obj->IsA()->GetName() +
".");
198 return (Color_t*) (((
char*)obj) + off);
210 void REveUtil::SetColorBrightness(Float_t value, Bool_t full_redraw)
212 if (value < -2.5 || value > 2.5)
214 Error(
"REveUtil::SetColorBrightness",
"value '%f' out of range [-0.5, 0.5].", value);
218 TObjArray *colors = (TObjArray*) gROOT->GetListOfColors();
220 if (fgDefaultColors == 0)
222 const Int_t n_col = colors->GetEntriesFast();
223 fgDefaultColors =
new TObjArray(n_col);
224 for (Int_t i = 0; i < n_col; ++i)
226 TColor* c = (TColor*) colors->At(i);
228 fgDefaultColors->AddAt(
new TColor(*c), i);
232 const Int_t n_col = fgDefaultColors->GetEntriesFast();
233 for (Int_t i = 0; i < n_col; ++i)
235 TColor* cdef = (TColor*) fgDefaultColors->At(i);
238 TColor* croot = (TColor*) colors->At(i);
241 croot =
new TColor(*cdef);
242 colors->AddAt(croot, i);
250 croot->GetRGB(r, g, b);
251 r = TMath::Power( r, (2.5 - value)/2.5);
252 g = TMath::Power(g, (2.5 - value)/2.5);
253 b = TMath::Power(b, (2.5 - value)/2.5);
255 r = TMath::Min(r, 1.0f);
256 g = TMath::Min(g, 1.0f);
257 b = TMath::Min(b, 1.0f);
259 croot->SetRGB(r, g, b);
263 delete colors->RemoveAt(i);
267 if (full_redraw && REX::gEve)
268 REX::gEve->FullRedraw3D();
276 Bool_t REveUtil::IsU1IntervalContainedByMinMax(Float_t minM, Float_t maxM,
277 Float_t minQ, Float_t maxQ)
279 using namespace TMath;
283 minQ += TwoPi(); maxQ += TwoPi();
285 else if (minQ > maxM)
287 minQ -= TwoPi(); maxQ -= TwoPi();
289 return minQ >= minM && maxQ <= maxM;
297 Bool_t REveUtil::IsU1IntervalOverlappingByMinMax(Float_t minM, Float_t maxM,
298 Float_t minQ, Float_t maxQ)
300 using namespace TMath;
304 minQ += TwoPi(); maxQ += TwoPi();
306 else if (minQ > maxM)
308 minQ -= TwoPi(); maxQ -= TwoPi();
310 return maxQ >= minM && minQ <= maxM;
316 Float_t REveUtil::GetFraction(Float_t minM, Float_t maxM, Float_t minQ, Float_t maxQ)
318 if (minQ>=minM && maxQ<=maxM)
321 else if (minQ<minM && maxQ>maxM)
322 return (maxM-minM)/(maxQ-minQ);
324 else if (minQ>=minM && maxQ>maxM)
325 return (maxM-minQ)/(maxQ-minQ);
327 else if (minQ<minM && maxQ<=maxM)
328 return (maxQ-minM)/(maxQ-minQ);
346 REveGeoManagerHolder::REveGeoManagerHolder(TGeoManager* new_gmgr, Int_t n_seg) :
347 fManager (gGeoManager),
350 gGeoManager = new_gmgr;
352 gGeoIdentity = (TGeoIdentity *)gGeoManager->GetListOfMatrices()->At(0);
354 fNSegments = gGeoManager->GetNsegments();
355 gGeoManager->SetNsegments(n_seg);
358 gGeoIdentity =
nullptr;
365 REveGeoManagerHolder::~REveGeoManagerHolder()
367 if (gGeoManager && fNSegments > 2) {
368 gGeoManager->SetNsegments(fNSegments);
370 gGeoManager = fManager;
372 gGeoIdentity = (TGeoIdentity *)gGeoManager->GetListOfMatrices()->At(0);
374 gGeoIdentity =
nullptr;
393 REveRefBackPtr::REveRefBackPtr() :
402 REveRefBackPtr::~REveRefBackPtr()
411 REveRefBackPtr::REveRefBackPtr(
const REveRefBackPtr&) :
422 REveRefBackPtr& REveRefBackPtr::operator=(
const REveRefBackPtr&)
430 void REveRefBackPtr::IncRefCount(REveElement* re)
432 REveRefCnt::IncRefCount();
439 void REveRefBackPtr::DecRefCount(REveElement *re)
441 auto i = fBackRefs.find(re);
442 if (i != fBackRefs.end()) {
443 if (--(i->second) <= 0)
445 REveRefCnt::DecRefCount();
447 Warning(
"REveRefBackPtr::DecRefCount",
"element '%s' not found in back-refs.", re->GetCName());
454 void REveRefBackPtr::StampBackPtrElements(UChar_t stamps)
456 for (
auto &i: fBackRefs)
457 i.first->AddStamp(stamps);