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()