12 #ifndef ROOT_TEveTrackPropagator
13 #define ROOT_TEveTrackPropagator
33 Bool_t fFieldConstant;
36 TEveMagField() : fFieldConstant(kFALSE) {}
37 virtual ~TEveMagField() {}
39 virtual Bool_t IsConst()
const {
return fFieldConstant; }
41 virtual void PrintField(Double_t x, Double_t y, Double_t z)
const
43 TEveVector b = GetField(x, y, z);
44 printf(
"v(%f, %f, %f) B(%f, %f, %f) \n", x, y, z, b.fX, b.fY, b.fZ);
47 TEveVectorD GetFieldD(
const TEveVectorD &v)
const {
return GetFieldD(v.fX, v.fY, v.fZ); }
52 virtual TEveVectorD GetFieldD(Double_t x, Double_t y, Double_t z)
const {
return GetField(x, y, z); }
53 virtual Double_t GetMaxFieldMagD()
const {
return GetMaxFieldMag(); }
55 virtual TEveVector GetField(Float_t, Float_t, Float_t)
const {
return TEveVector(); }
56 virtual Float_t GetMaxFieldMag()
const {
return 4; }
58 ClassDef(TEveMagField, 0);
66 class TEveMagFieldConst :
public TEveMagField
72 TEveMagFieldConst(Double_t x, Double_t y, Double_t z) :
73 TEveMagField(), fB(x, y, z)
74 { fFieldConstant = kTRUE; }
75 virtual ~TEveMagFieldConst() {}
77 using TEveMagField::GetField;
78 virtual TEveVectorD GetFieldD(Double_t , Double_t , Double_t )
const {
return fB; }
79 virtual Double_t GetMaxFieldMagD()
const {
return fB.Mag(); };
81 ClassDef(TEveMagFieldConst, 0);
89 class TEveMagFieldDuo :
public TEveMagField
97 TEveMagFieldDuo(Double_t r, Double_t bIn, Double_t bOut) :
99 fBIn(0,0,bIn), fBOut(0,0,bOut), fR2(r*r)
101 fFieldConstant = kFALSE;
103 virtual ~TEveMagFieldDuo() {}
105 using TEveMagField::GetField;
106 virtual TEveVectorD GetFieldD(Double_t x, Double_t y, Double_t )
const
107 {
return ((x*x+y*y)<fR2) ? fBIn : fBOut; }
109 virtual Double_t GetMaxFieldMagD()
const
110 { Double_t b1 = fBIn.Mag(), b2 = fBOut.Mag();
return b1 > b2 ? b1 : b2; }
112 ClassDef(TEveMagFieldDuo, 0);
120 class TEveTrackPropagator :
public TEveElementList,
121 public TEveRefBackPtr
123 friend class TEveTrackPropagatorSubEditor;
126 enum EStepper_e { kHelix, kRungeKutta };
128 enum EProjTrackBreaking_e { kPTB_Break, kPTB_UseFirstPointPos, kPTB_UseLastPointPos };
154 TEveVectorD fE1, fE2, fE3;
155 TEveVectorD fPt, fPl;
164 void UpdateCommon(
const TEveVectorD & p,
const TEveVectorD& b);
165 void UpdateHelix (
const TEveVectorD & p,
const TEveVectorD& b, Bool_t full_update, Bool_t enforce_max_step);
166 void UpdateRK (
const TEveVectorD & p,
const TEveVectorD& b);
168 void Step(
const TEveVector4D& v,
const TEveVectorD& p, TEveVector4D& vOut, TEveVectorD& pOut);
170 Double_t GetStep() {
return fLStep * TMath::Sqrt(1 + fLam*fLam); }
171 Double_t GetStep2() {
return fLStep * fLStep * (1 + fLam*fLam); }
176 TEveTrackPropagator(
const TEveTrackPropagator&);
177 TEveTrackPropagator& operator=(
const TEveTrackPropagator&);
179 void DistributeOffset(
const TEveVectorD& off, Int_t first_point, Int_t np, TEveVectorD& p);
184 TEveMagField* fMagFieldObj;
185 Bool_t fOwnMagFiledObj;
195 Bool_t fEditPathMarks;
196 Bool_t fFitDaughters;
197 Bool_t fFitReferences;
199 Bool_t fFitCluster2Ds;
200 Bool_t fFitLineSegments;
201 Bool_t fRnrDaughters;
202 Bool_t fRnrReferences;
204 Bool_t fRnrCluster2Ds;
210 UChar_t fProjTrackBreaking;
211 Bool_t fRnrPTBMarkers;
217 std::vector<TEveVector4D> fPoints;
218 std::vector<TEveVector4D> fLastPoints;
222 void RebuildTracks();
223 void Update(
const TEveVector4D& v,
const TEveVectorD& p, Bool_t full_update=kFALSE, Bool_t enforce_max_step=kFALSE);
224 void Step(
const TEveVector4D &v,
const TEveVectorD &p, TEveVector4D &vOut, TEveVectorD &pOut);
226 Bool_t LoopToVertex(TEveVectorD& v, TEveVectorD& p);
227 Bool_t LoopToLineSegment(
const TEveVectorD& s,
const TEveVectorD& r, TEveVectorD& p);
228 void LoopToBounds(TEveVectorD& p);
230 Bool_t LineToVertex (TEveVectorD& v);
231 void LineToBounds (TEveVectorD& p);
233 void StepRungeKutta(Double_t step, Double_t* vect, Double_t* vout);
235 Bool_t HelixIntersectPlane(
const TEveVectorD& p,
const TEveVectorD& point,
const TEveVectorD& normal,
237 Bool_t LineIntersectPlane(
const TEveVectorD& p,
const TEveVectorD& point,
const TEveVectorD& normal,
238 TEveVectorD& itsect);
239 Bool_t PointOverVertex(
const TEveVector4D& v0,
const TEveVector4D& v, Double_t* p=0);
241 void ClosestPointFromVertexToLineSegment(
const TEveVectorD& v,
const TEveVectorD& s,
const TEveVectorD& r, Double_t rMagInv, TEveVectorD& c);
242 Bool_t ClosestPointBetweenLines(
const TEveVectorD&,
const TEveVectorD&,
const TEveVectorD&,
const TEveVectorD&, TEveVectorD& out);
245 TEveTrackPropagator(
const char* n=
"TEveTrackPropagator",
const char* t=
"",
246 TEveMagField* field=0, Bool_t own_field=kTRUE);
247 virtual ~TEveTrackPropagator();
249 virtual void OnZeroRefCount();
251 virtual void CheckReferenceCount(
const TEveException& eh=
"TEveElement::CheckReferenceCount ");
253 virtual void ElementChanged(Bool_t update_scenes=kTRUE, Bool_t redraw=kFALSE);
256 void InitTrack(
const TEveVectorD& v, Int_t charge);
259 Int_t GetCurrentPoint()
const;
260 Double_t GetTrackLength(Int_t start_point=0, Int_t end_point=-1)
const;
262 virtual void GoToBounds(TEveVectorD& p);
263 virtual Bool_t GoToVertex(TEveVectorD& v, TEveVectorD& p);
264 virtual Bool_t GoToLineSegment(
const TEveVectorD& s,
const TEveVectorD& r, TEveVectorD& p);
267 void InitTrack(
const TEveVectorF& v, Int_t charge);
268 void GoToBounds(TEveVectorF& p);
269 Bool_t GoToVertex(TEveVectorF& v, TEveVectorF&p);
270 Bool_t GoToLineSegment(
const TEveVectorF& s,
const TEveVectorF& r, TEveVectorF& p);
272 Bool_t IntersectPlane(
const TEveVectorD& p,
const TEveVectorD& point,
const TEveVectorD& normal,
273 TEveVectorD& itsect);
275 void FillPointSet(TEvePointSet* ps)
const;
277 void SetStepper(EStepper_e s) { fStepper = s; }
279 void SetMagField(Double_t bX, Double_t bY, Double_t bZ);
280 void SetMagField(Double_t b) { SetMagField(0, 0, b); }
281 void SetMagFieldObj(TEveMagField* field, Bool_t own_field=kTRUE);
283 void SetMaxR(Double_t x);
284 void SetMaxZ(Double_t x);
285 void SetMaxOrbs(Double_t x);
286 void SetMinAng(Double_t x);
287 void SetMaxAng(Double_t x);
288 void SetMaxStep(Double_t x);
289 void SetDelta(Double_t x);
291 void SetEditPathMarks(Bool_t x) { fEditPathMarks = x; }
292 void SetRnrDaughters(Bool_t x);
293 void SetRnrReferences(Bool_t x);
294 void SetRnrDecay(Bool_t x);
295 void SetRnrCluster2Ds(Bool_t x);
296 void SetFitDaughters(Bool_t x);
297 void SetFitReferences(Bool_t x);
298 void SetFitDecay(Bool_t x);
299 void SetFitCluster2Ds(Bool_t x);
300 void SetFitLineSegments(Bool_t x);
301 void SetRnrFV(Bool_t x);
302 void SetProjTrackBreaking(UChar_t x);
303 void SetRnrPTBMarkers(Bool_t x);
305 TEveVectorD GetMagField(Double_t x, Double_t y, Double_t z) {
return fMagFieldObj->GetField(x, y, z); }
306 void PrintMagField(Double_t x, Double_t y, Double_t z)
const;
308 EStepper_e GetStepper()
const {
return fStepper;}
310 Double_t GetMaxR()
const {
return fMaxR; }
311 Double_t GetMaxZ()
const {
return fMaxZ; }
312 Double_t GetMaxOrbs()
const {
return fMaxOrbs; }
313 Double_t GetMinAng()
const;
314 Double_t GetMaxAng()
const {
return fH.fMaxAng; }
315 Double_t GetMaxStep()
const {
return fH.fMaxStep; }
316 Double_t GetDelta()
const {
return fH.fDelta; }
318 Bool_t GetEditPathMarks()
const {
return fEditPathMarks; }
319 Bool_t GetRnrDaughters()
const {
return fRnrDaughters; }
320 Bool_t GetRnrReferences()
const {
return fRnrReferences; }
321 Bool_t GetRnrDecay()
const {
return fRnrDecay; }
322 Bool_t GetRnrCluster2Ds()
const {
return fRnrCluster2Ds; }
323 Bool_t GetFitDaughters()
const {
return fFitDaughters; }
324 Bool_t GetFitReferences()
const {
return fFitReferences; }
325 Bool_t GetFitDecay()
const {
return fFitDecay; }
326 Bool_t GetFitCluster2Ds()
const {
return fFitCluster2Ds; }
327 Bool_t GetFitLineSegments()
const {
return fFitLineSegments; }
328 Bool_t GetRnrFV()
const {
return fRnrFV; }
329 UChar_t GetProjTrackBreaking()
const {
return fProjTrackBreaking; }
330 Bool_t GetRnrPTBMarkers()
const {
return fRnrPTBMarkers; }
332 TMarker& RefPMAtt() {
return fPMAtt; }
333 TMarker& RefFVAtt() {
return fFVAtt; }
334 TMarker& RefPTBAtt() {
return fPTBAtt; }
336 const std::vector<TEveVector4D>& GetLastPoints()
const {
return fLastPoints; }
338 static Bool_t IsOutsideBounds(
const TEveVectorD& point, Double_t maxRsqr, Double_t maxZ);
340 static Double_t fgDefMagField;
341 static const Double_t fgkB2C;
342 static TEveTrackPropagator fgDefault;
344 static Double_t fgEditorMaxR;
345 static Double_t fgEditorMaxZ;
347 ClassDef(TEveTrackPropagator, 0);
351 inline Bool_t TEveTrackPropagator::IsOutsideBounds(
const TEveVectorD& point,
358 return TMath::Abs(point.fZ) > maxZ ||
359 point.fX*point.fX + point.fY*point.fY > maxRsqr;
363 inline Bool_t TEveTrackPropagator::PointOverVertex(
const TEveVector4D &v0,
364 const TEveVector4D &v,
367 static const Double_t kMinPl = 1e-5;
369 TEveVectorD dv; dv.Sub(v0, v);
373 if (TMath::Abs(fH.fPlMag) > kMinPl)
378 dotV = fH.fE1.Dot(dv);
386 dotV = fH.fE2.Dot(dv);