12 #ifndef ROOT7_REveProjections
13 #define ROOT7_REveProjections
20 namespace Experimental {
29 class REveProjection {
31 enum EPType_e { kPT_Unknown, kPT_RPhi, kPT_RhoZ, kPT_3D, kPT_End };
32 enum EPProc_e { kPP_Plane, kPP_Distort, kPP_Full };
33 enum EGeoMode_e { kGM_Unknown, kGM_Polygons, kGM_Segments };
35 struct PreScaleEntry_t {
36 Float_t fMin{0}, fMax{0};
40 PreScaleEntry_t() =
default;
42 PreScaleEntry_t(Float_t min, Float_t max, Float_t off, Float_t scale)
43 : fMin(min), fMax(max), fOffset(off), fScale(scale)
48 typedef std::vector<PreScaleEntry_t> vPreScale_t;
60 vPreScale_t fPreScales[3];
69 Float_t fPastFixRScale;
70 Float_t fPastFixZScale;
71 Float_t fMaxTrackStep;
73 void PreScaleVariable(Int_t dim, Float_t &v);
77 virtual ~REveProjection() {}
79 virtual Bool_t Is2D()
const = 0;
80 virtual Bool_t Is3D()
const = 0;
82 virtual void ProjectPoint(Float_t &x, Float_t &y, Float_t &z, Float_t d, EPProc_e p = kPP_Full) = 0;
84 void ProjectPointfv(Float_t *v, Float_t d);
85 void ProjectPointdv(Double_t *v, Float_t d);
86 void ProjectVector(REveVector &v, Float_t d);
88 void ProjectPointfv(
const REveTrans *t,
const Float_t *p, Float_t *v, Float_t d);
89 void ProjectPointdv(
const REveTrans *t,
const Double_t *p, Double_t *v, Float_t d);
90 void ProjectVector(
const REveTrans *t, REveVector &v, Float_t d);
92 const char *GetName()
const {
return fName.c_str(); }
93 void SetName(
const char *txt) { fName = txt; }
95 const REveVector &RefCenter()
const {
return fCenter; }
96 virtual void SetCenter(REveVector &v) { fCenter = v; }
97 virtual Float_t *GetProjectedCenter();
99 void SetDisplaceOrigin(
bool);
100 Bool_t GetDisplaceOrigin()
const {
return fDisplaceOrigin; }
102 void SetType(EPType_e t) { fType = t; }
103 EPType_e GetType()
const {
return fType; }
105 void SetGeoMode(EGeoMode_e m) { fGeoMode = m; }
106 EGeoMode_e GetGeoMode()
const {
return fGeoMode; }
108 Bool_t GetUsePreScale()
const {
return fUsePreScale; }
109 void SetUsePreScale(Bool_t x) { fUsePreScale = x; }
111 void PreScalePoint(Float_t &x, Float_t &y);
112 void PreScalePoint(Float_t &x, Float_t &y, Float_t &z);
113 void AddPreScaleEntry(Int_t coord, Float_t max_val, Float_t scale);
114 void ChangePreScaleEntry(Int_t coord, Int_t entry, Float_t new_scale);
115 void ClearPreScales();
117 void SetDistortion(Float_t d);
118 Float_t GetDistortion()
const {
return fDistortion; }
119 Float_t GetFixR()
const {
return fFixR; }
120 Float_t GetFixZ()
const {
return fFixZ; }
121 void SetFixR(Float_t x);
122 void SetFixZ(Float_t x);
123 Float_t GetPastFixRFac()
const {
return fPastFixRFac; }
124 Float_t GetPastFixZFac()
const {
return fPastFixZFac; }
125 void SetPastFixRFac(Float_t x);
126 void SetPastFixZFac(Float_t x);
127 Float_t GetMaxTrackStep()
const {
return fMaxTrackStep; }
128 void SetMaxTrackStep(Float_t x) { fMaxTrackStep = TMath::Max(x, 1.0f); }
130 virtual Bool_t HasSeveralSubSpaces()
const {
return kFALSE; }
131 virtual Bool_t AcceptSegment(REveVector &, REveVector &, Float_t )
const {
return kTRUE; }
132 virtual Int_t SubSpaceId(
const REveVector &)
const {
return 0; }
133 virtual Bool_t IsOnSubSpaceBoundrary(
const REveVector &)
const {
return kFALSE; }
134 virtual void BisectBreakPoint(REveVector &vL, REveVector &vR, Float_t eps_sqr);
135 virtual void BisectBreakPoint(REveVector &vL, REveVector &vR, Bool_t project_result = kFALSE, Float_t depth = 0);
136 virtual void SetDirectionalVector(Int_t screenAxis, REveVector &vec);
139 REveVector GetOrthogonalCenter(
int idx, REveVector &out);
140 virtual Float_t GetValForScreenPos(Int_t ax, Float_t value);
141 virtual Float_t GetScreenVal(Int_t ax, Float_t value);
142 Float_t GetScreenVal(Int_t i, Float_t x, REveVector &dirVec, REveVector &oCenter);
143 Float_t GetLimit(Int_t i, Bool_t pos);
145 static Float_t fgEps;
146 static Float_t fgEpsSqr;
154 class REveRhoZProjection :
public REveProjection {
156 REveVector fProjectedCenter;
159 REveRhoZProjection();
160 virtual ~REveRhoZProjection() {}
162 Bool_t Is2D()
const override {
return kTRUE; }
163 Bool_t Is3D()
const override {
return kFALSE; }
165 void ProjectPoint(Float_t &x, Float_t &y, Float_t &z, Float_t d, EPProc_e proc = kPP_Full)
override;
167 void SetCenter(REveVector &v)
override;
168 Float_t *GetProjectedCenter()
override {
return fProjectedCenter.Arr(); }
170 Bool_t HasSeveralSubSpaces()
const override {
return kTRUE; }
171 Bool_t AcceptSegment(REveVector &v1, REveVector &v2, Float_t tolerance)
const override;
172 Int_t SubSpaceId(
const REveVector &v)
const override;
173 Bool_t IsOnSubSpaceBoundrary(
const REveVector &v)
const override;
174 void SetDirectionalVector(Int_t screenAxis, REveVector &vec)
override;
182 class REveRPhiProjection :
public REveProjection {
184 REveRPhiProjection();
185 virtual ~REveRPhiProjection() {}
187 Bool_t Is2D()
const override {
return kTRUE; }
188 Bool_t Is3D()
const override {
return kFALSE; }
190 void ProjectPoint(Float_t &x, Float_t &y, Float_t &z, Float_t d, EPProc_e proc = kPP_Full)
override;
198 class REve3DProjection :
public REveProjection {
201 virtual ~REve3DProjection() {}
203 Bool_t Is2D()
const override {
return kFALSE; }
204 Bool_t Is3D()
const override {
return kTRUE; }
206 void ProjectPoint(Float_t &x, Float_t &y, Float_t &z, Float_t d, EPProc_e proc = kPP_Full)
override;