25 using namespace ROOT::Experimental;
26 namespace REX = ROOT::Experimental;
59 REveJetCone::REveJetCone(
const Text_t* n,
const Text_t* t) :
62 fLimits(), fThetaC(10),
63 fEta(0), fPhi(0), fDEta(0), fDPhi(0), fNDiv(36)
71 void REveJetCone::SetNDiv(Int_t n)
73 fNDiv = TMath::Max(4, n);
74 if (fNDiv % 4 > 0) { fNDiv += 4 - fNDiv % 4; };
81 Int_t REveJetCone::WriteCoreJson(nlohmann::json &j, Int_t rnr_offset)
83 Int_t ret = REveElement::WriteCoreJson(j, rnr_offset);
85 j[
"fMainColor"] = GetFillColor();
86 j[
"fLineColor"] = GetLineColor();
87 j[
"fNDiv"] = GetNDiv();
95 void REveJetCone::BuildRenderData()
99 const Int_t NP = 1 + fNDiv;
101 fRenderData = std::make_unique<REveRenderData>(
"makeJet", 3 * NP);
103 fRenderData->PushV(fApex);
105 Float_t angle_step = TMath::TwoPi() / fNDiv;
107 for (Int_t i = 0; i < fNDiv; ++i, angle += angle_step)
109 fRenderData->PushV( CalcBaseVec(angle) );
116 void REveJetCone::ComputeBBox()
119 BBoxCheckPoint(fApex);
120 BBoxCheckPoint(CalcBaseVec(0));
121 BBoxCheckPoint(CalcBaseVec(TMath::PiOver2()));
122 BBoxCheckPoint(CalcBaseVec(TMath::Pi()));
123 BBoxCheckPoint(CalcBaseVec(TMath::Pi() + TMath::PiOver2()));
129 TClass* REveJetCone::ProjectedClass(
const REveProjection*)
const
131 return TClass::GetClass<REveJetConeProjected>();
145 Int_t REveJetCone::AddCone(Float_t eta, Float_t phi, Float_t cone_r, Float_t length)
147 return AddEllipticCone(eta, phi, cone_r, cone_r, length);
161 Int_t REveJetCone::AddEllipticCone(Float_t eta, Float_t phi, Float_t reta, Float_t rphi, Float_t length)
163 if (length != 0) fLimits.fX = length;
165 if (fLimits.IsZero())
168 fEta = eta; fPhi = phi; fDEta = reta; fDPhi = rphi;
176 REveVector REveJetCone::CalcEtaPhiVec(Float_t eta, Float_t phi)
const
178 using namespace TMath;
180 return REveVector(Cos(phi) / CosH(eta), Sin(phi) / CosH(eta), TanH(eta));
186 REveVector REveJetCone::CalcBaseVec(Float_t eta, Float_t phi)
const
188 using namespace TMath;
190 REveVector vec = CalcEtaPhiVec(eta, phi);
193 if (fLimits.fY != 0 && fLimits.fZ != 0)
195 Float_t theta = vec.Theta();
197 vec *= fLimits.fZ / Cos(theta);
198 else if (theta > Pi() - fThetaC)
199 vec *= fLimits.fZ / Cos(theta - Pi());
201 vec *= fLimits.fY / Sin(theta);
203 if (fLimits.fX != 0) vec *= fLimits.fX;
217 REveVector REveJetCone::CalcBaseVec(Float_t alpha)
const
219 using namespace TMath;
221 return CalcBaseVec(fEta + fDEta * Cos(alpha), fPhi + fDPhi * Sin(alpha));
227 Bool_t REveJetCone::IsInTransitionRegion()
const
229 using namespace TMath;
231 Float_t tm = CalcBaseVec(0).Theta();
232 Float_t tM = CalcBaseVec(Pi()).Theta();
234 return (tM > fThetaC && tm < fThetaC) ||
235 (tM > Pi() - fThetaC && tm < Pi() - fThetaC);
247 REveJetConeProjected::REveJetConeProjected(
const std::string& n,
const std::string& t) :
255 REveJetConeProjected::~REveJetConeProjected()
262 void REveJetConeProjected::BuildRenderData()
264 static const REveException kEH(
"REveJetConeProjected::BuildRenderData ");
266 REveProjection *P = GetManager()->GetProjection();
267 REveJetCone *C =
dynamic_cast<REveJetCone*
>(GetProjectable());
269 fRenderData = std::make_unique<REveRenderData>(
"makeJetProjected", 4);
271 std::vector<REveVector> V;
275 switch (P->GetType())
277 case REveProjection::kPT_RPhi:
280 V[1] = C->CalcBaseVec(TMath::Pi() + TMath::PiOver2());
281 V[2] = C->CalcBaseVec(TMath::PiOver2());
283 for (Int_t i = 0; i < 3; ++i)
284 P->ProjectVector(V[i], fDepth);
289 case REveProjection::kPT_RhoZ:
292 V[1] = C->CalcBaseVec(0);
293 V[2] = C->CalcBaseVec(TMath::Pi());
295 Float_t tm = V[1].Theta();
296 Float_t tM = V[2].Theta();
298 if (tM > C->fThetaC && tm < C->fThetaC)
300 REveVector v(0, C->fLimits.fY, C->fLimits.fZ);
302 V.push_back(C->CalcBaseVec(v.Eta(), C->fPhi));
305 if (tM > TMath::Pi() - C->fThetaC && tm < TMath::Pi() - C->fThetaC)
307 REveVector v(0, C->fLimits.fY, -C->fLimits.fZ);
309 V.push_back(C->CalcBaseVec(v.Eta(), C->fPhi));
312 for (
auto &v : V) P->ProjectVector(v, fDepth);
314 std::sort(V.begin() + 1, V.end(),
315 [](
const auto& a,
const auto &b) ->
bool
316 {
return a.Phi() < b.Phi(); });
322 throw kEH +
"Unsupported projection type.";
325 for (
auto &v : V) fRenderData->PushV(v);
331 void REveJetConeProjected::ComputeBBox()
335 REveJetCone *cone =
dynamic_cast<REveJetCone*
>(fProjectable);
336 REveProjection *proj = GetManager()->GetProjection();
338 v = cone->fApex; proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
339 v = cone->CalcBaseVec(0); proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
340 v = cone->CalcBaseVec(TMath::PiOver2()); proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
341 v = cone->CalcBaseVec(TMath::Pi()); proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
342 v = cone->CalcBaseVec(TMath::Pi() + TMath::PiOver2()); proj->ProjectVector(v, fDepth); BBoxCheckPoint(v);
348 void REveJetConeProjected::SetDepthLocal(Float_t d)
350 SetDepthCommon(d,
this, fBBox);
356 void REveJetConeProjected::SetProjection(REveProjectionManager* mng, REveProjectable* model)
358 REveProjected::SetProjection(mng, model);
359 CopyVizParams(dynamic_cast<REveElement*>(model));
365 void REveJetConeProjected::UpdateProjection()