12 #ifndef ROOT7_REveTrackPropagator
13 #define ROOT7_REveTrackPropagator
24 namespace Experimental {
36 Bool_t fFieldConstant{kFALSE};
39 REveMagField() =
default;
40 virtual ~REveMagField() {}
42 virtual Bool_t IsConst()
const {
return fFieldConstant; }
44 virtual void PrintField(Double_t x, Double_t y, Double_t z)
const
46 REveVector b = GetField(x, y, z);
47 printf(
"v(%f, %f, %f) B(%f, %f, %f) \n", x, y, z, b.fX, b.fY, b.fZ);
50 REveVectorD GetFieldD(
const REveVectorD &v)
const {
return GetFieldD(v.fX, v.fY, v.fZ); }
55 virtual REveVectorD GetFieldD(Double_t x, Double_t y, Double_t z)
const {
return GetField(x, y, z); }
56 virtual Double_t GetMaxFieldMagD()
const
58 return GetMaxFieldMag();
61 virtual REveVector GetField(Float_t, Float_t, Float_t)
const {
return REveVector(); }
62 virtual Float_t GetMaxFieldMag()
const {
return 4; }
71 class REveMagFieldConst :
public REveMagField
77 REveMagFieldConst(Double_t x, Double_t y, Double_t z) : REveMagField(), fB(x, y, z) { fFieldConstant = kTRUE; }
78 virtual ~REveMagFieldConst() {}
80 REveVectorD GetFieldD(Double_t , Double_t , Double_t )
const override {
return fB; }
82 Double_t GetMaxFieldMagD()
const override {
return fB.Mag(); };
90 class REveMagFieldDuo :
public REveMagField
98 REveMagFieldDuo(Double_t r, Double_t bIn, Double_t bOut)
99 : REveMagField(), fBIn(0, 0, bIn), fBOut(0, 0, bOut), fR2(r * r)
101 fFieldConstant = kFALSE;
103 virtual ~REveMagFieldDuo() {}
105 REveVectorD GetFieldD(Double_t x, Double_t y, Double_t )
const override
107 return ((x * x + y * y) < fR2) ? fBIn : fBOut;
110 Double_t GetMaxFieldMagD()
const override
112 Double_t b1 = fBIn.Mag(), b2 = fBOut.Mag();
113 return b1 > b2 ? b1 : b2;
122 class REveTrackPropagator :
public REveElement,
123 public REveRefBackPtr
126 enum EStepper_e { kHelix, kRungeKutta };
128 enum EProjTrackBreaking_e { kPTB_Break, kPTB_UseFirstPointPos, kPTB_UseLastPointPos };
153 REveVectorD fE1, fE2, fE3;
154 REveVectorD fPt, fPl;
163 void UpdateCommon(
const REveVectorD &p,
const REveVectorD &b);
164 void UpdateHelix(
const REveVectorD &p,
const REveVectorD &b, Bool_t full_update, Bool_t enforce_max_step);
165 void UpdateRK(
const REveVectorD &p,
const REveVectorD &b);
167 void Step(
const REveVector4D &v,
const REveVectorD &p, REveVector4D &vOut, REveVectorD &pOut);
169 Double_t GetStep() {
return fLStep * TMath::Sqrt(1 + fLam * fLam); }
170 Double_t GetStep2() {
return fLStep * fLStep * (1 + fLam * fLam); }
174 REveTrackPropagator(
const REveTrackPropagator &);
175 REveTrackPropagator &operator=(
const REveTrackPropagator &);
177 void DistributeOffset(
const REveVectorD &off, Int_t first_point, Int_t np, REveVectorD &p);
182 REveMagField *fMagFieldObj{
nullptr};
183 Bool_t fOwnMagFiledObj{kFALSE};
193 Bool_t fEditPathMarks;
194 Bool_t fFitDaughters;
195 Bool_t fFitReferences;
197 Bool_t fFitCluster2Ds;
198 Bool_t fFitLineSegments;
199 Bool_t fRnrDaughters;
200 Bool_t fRnrReferences;
202 Bool_t fRnrCluster2Ds;
208 UChar_t fProjTrackBreaking;
209 Bool_t fRnrPTBMarkers;
215 std::vector<REveVector4D> fPoints;
216 std::vector<REveVector4D> fLastPoints;
220 void RebuildTracks();
221 void Update(
const REveVector4D &v,
const REveVectorD &p, Bool_t full_update = kFALSE, Bool_t enforce_max_step = kFALSE);
222 void Step(
const REveVector4D &v,
const REveVectorD &p, REveVector4D &vOut, REveVectorD &pOut);
224 Bool_t LoopToVertex(REveVectorD &v, REveVectorD &p);
225 Bool_t LoopToLineSegment(
const REveVectorD &s,
const REveVectorD &r, REveVectorD &p);
226 void LoopToBounds(REveVectorD &p);
228 Bool_t LineToVertex(REveVectorD &v);
229 void LineToBounds(REveVectorD &p);
231 void StepRungeKutta(Double_t step, Double_t *vect, Double_t *vout);
233 Bool_t HelixIntersectPlane(
const REveVectorD &p,
const REveVectorD &point,
const REveVectorD &normal, REveVectorD &itsect);
234 Bool_t LineIntersectPlane(
const REveVectorD &p,
const REveVectorD &point,
const REveVectorD &normal, REveVectorD &itsect);
235 Bool_t PointOverVertex(
const REveVector4D &v0,
const REveVector4D &v, Double_t *p = 0);
237 void ClosestPointFromVertexToLineSegment(
const REveVectorD &v,
const REveVectorD &s,
const REveVectorD &r,
238 Double_t rMagInv, REveVectorD &c);
239 Bool_t ClosestPointBetweenLines(
const REveVectorD &,
const REveVectorD &,
const REveVectorD &,
const REveVectorD &,
243 REveTrackPropagator(
const std::string& n =
"REveTrackPropagator",
const std::string& t =
"", REveMagField *field =
nullptr,
244 Bool_t own_field = kTRUE);
245 virtual ~REveTrackPropagator();
247 void OnZeroRefCount()
override;
249 void CheckReferenceCount(
const std::string &from =
"<unknown>")
override;
251 void StampAllTracks();
254 void InitTrack(
const REveVectorD &v, Int_t charge);
257 Int_t GetCurrentPoint()
const;
258 Double_t GetTrackLength(Int_t start_point = 0, Int_t end_point = -1)
const;
260 virtual void GoToBounds(REveVectorD &p);
261 virtual Bool_t GoToVertex(REveVectorD &v, REveVectorD &p);
262 virtual Bool_t GoToLineSegment(
const REveVectorD &s,
const REveVectorD &r, REveVectorD &p);
265 void InitTrack(
const REveVectorF &v, Int_t charge);
266 void GoToBounds(REveVectorF &p);
267 Bool_t GoToVertex(REveVectorF &v, REveVectorF &p);
268 Bool_t GoToLineSegment(
const REveVectorF &s,
const REveVectorF &r, REveVectorF &p);
270 Bool_t IntersectPlane(
const REveVectorD &p,
const REveVectorD &point,
const REveVectorD &normal, REveVectorD &itsect);
272 void FillPointSet(REvePointSet *ps)
const;
274 void SetStepper(EStepper_e s) { fStepper = s; }
276 void SetMagField(Double_t bX, Double_t bY, Double_t bZ);
277 void SetMagField(Double_t b) { SetMagField(0, 0, b); }
278 void SetMagFieldObj(REveMagField *field, Bool_t own_field = kTRUE);
280 void SetMaxR(Double_t x);
281 void SetMaxZ(Double_t x);
282 void SetMaxOrbs(Double_t x);
283 void SetMinAng(Double_t x);
284 void SetMaxAng(Double_t x);
285 void SetMaxStep(Double_t x);
286 void SetDelta(Double_t x);
288 void SetEditPathMarks(Bool_t x) { fEditPathMarks = x; }
289 void SetRnrDaughters(Bool_t x);
290 void SetRnrReferences(Bool_t x);
291 void SetRnrDecay(Bool_t x);
292 void SetRnrCluster2Ds(Bool_t x);
293 void SetFitDaughters(Bool_t x);
294 void SetFitReferences(Bool_t x);
295 void SetFitDecay(Bool_t x);
296 void SetFitCluster2Ds(Bool_t x);
297 void SetFitLineSegments(Bool_t x);
298 void SetRnrFV(Bool_t x);
299 void SetProjTrackBreaking(UChar_t x);
300 void SetRnrPTBMarkers(Bool_t x);
302 REveVectorD GetMagField(Double_t x, Double_t y, Double_t z) {
return fMagFieldObj->GetField(x, y, z); }
303 void PrintMagField(Double_t x, Double_t y, Double_t z)
const;
305 EStepper_e GetStepper()
const {
return fStepper; }
307 Double_t GetMaxR()
const {
return fMaxR; }
308 Double_t GetMaxZ()
const {
return fMaxZ; }
309 Double_t GetMaxOrbs()
const {
return fMaxOrbs; }
310 Double_t GetMinAng()
const;
311 Double_t GetMaxAng()
const {
return fH.fMaxAng; }
312 Double_t GetMaxStep()
const {
return fH.fMaxStep; }
313 Double_t GetDelta()
const {
return fH.fDelta; }
315 Bool_t GetEditPathMarks()
const {
return fEditPathMarks; }
316 Bool_t GetRnrDaughters()
const {
return fRnrDaughters; }
317 Bool_t GetRnrReferences()
const {
return fRnrReferences; }
318 Bool_t GetRnrDecay()
const {
return fRnrDecay; }
319 Bool_t GetRnrCluster2Ds()
const {
return fRnrCluster2Ds; }
320 Bool_t GetFitDaughters()
const {
return fFitDaughters; }
321 Bool_t GetFitReferences()
const {
return fFitReferences; }
322 Bool_t GetFitDecay()
const {
return fFitDecay; }
323 Bool_t GetFitCluster2Ds()
const {
return fFitCluster2Ds; }
324 Bool_t GetFitLineSegments()
const {
return fFitLineSegments; }
325 Bool_t GetRnrFV()
const {
return fRnrFV; }
326 UChar_t GetProjTrackBreaking()
const {
return fProjTrackBreaking; }
327 Bool_t GetRnrPTBMarkers()
const {
return fRnrPTBMarkers; }
329 TMarker &RefPMAtt() {
return fPMAtt; }
330 TMarker &RefFVAtt() {
return fFVAtt; }
331 TMarker &RefPTBAtt() {
return fPTBAtt; }
333 const std::vector<REveVector4D> &GetLastPoints()
const {
return fLastPoints; }
335 static Bool_t IsOutsideBounds(
const REveVectorD &point, Double_t maxRsqr, Double_t maxZ);
337 static Double_t fgDefMagField;
338 static const Double_t fgkB2C;
339 static REveTrackPropagator fgDefault;
341 static Double_t fgEditorMaxR;
342 static Double_t fgEditorMaxZ;
346 inline Bool_t REveTrackPropagator::IsOutsideBounds(
const REveVectorD &point, Double_t maxRsqr, Double_t maxZ)
351 return TMath::Abs(point.fZ) > maxZ || point.fX * point.fX + point.fY * point.fY > maxRsqr;
355 inline Bool_t REveTrackPropagator::PointOverVertex(
const REveVector4D &v0,
const REveVector4D &v, Double_t *p)
357 static const Double_t kMinPl = 1e-5;
364 if (TMath::Abs(fH.fPlMag) > kMinPl) {
368 dotV = fH.fE1.Dot(dv);
374 dotV = fH.fE2.Dot(dv);