ATLAS Offline Software
Loading...
Searching...
No Matches
VKalExtPropagator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4//
5// The VKalExtPropagator object is created if ATHENA propagator exists
6// and is supplied via jobOptions. A pointer to it is supplied to VKalVrtCore
7// for every vertex fit via VKalVrtControlBase object.
8// VKalVrtCore uses it to extrapolate tracks for a vertex fit.
9//
10// If ATHENA propagator doesn't exist, the VKalVrtCore uses its internal
11// propagator without material.
12//
13//-------------------------------------------------------------------------
14
15
16// Header include
18
23//-------------------------------------------------
24#include <iostream>
25
26
27//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
28// External propagator access for VKalVrt
29
30namespace Trk {
31
32 // Constructor
39
40
45
46//Protection against exit outside ID volume (unless explicitly requested in configuration for LLP scenarios -- then uses MS volume)
47//
48 double VKalExtPropagator::Protection(const double *RefEnd,
49 const IVKalState& istate) const
50 {
51 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
52
53 double Xend=RefEnd[0] + state.m_refFrameX;
54 double Yend=RefEnd[1] + state.m_refFrameY;
55 double Zend=RefEnd[2] + state.m_refFrameZ;
56
57 double sizeR = state.m_allowUltraDisplaced ? m_vkalFitSvc->m_MSsizeR : m_vkalFitSvc->m_IDsizeR;
58 double sizeZ = state.m_allowUltraDisplaced ? m_vkalFitSvc->m_MSsizeZ : m_vkalFitSvc->m_IDsizeZ;
59 double Rlim=std::hypot(Xend, Yend) / sizeR;
60 double Zlim=std::abs(Zend) / sizeZ;
61
62 double Scale = Rlim; if(Zlim>Rlim) Scale=Zlim;
63//std::cout<<"relative TARG="<<RefEnd[0]<<","<<RefEnd[1]<<","<<RefEnd[2]
64//<<" global ref.="<<m_vkalFitSvc->state.m_refFrameX<<","<<m_vkalFitSvc->state.m_refFrameY<<","<<m_vkalFitSvc->state.m_refFrameZ
65//<<" Limits="<<m_vkalFitSvc->m_IDsizeR<<","<<m_vkalFitSvc->m_IDsizeZ<<" scale="<<Scale<<'\n';
66 return Scale;
67 }
68
69 bool VKalExtPropagator::checkTarget( double *RefEnd,
70 const IVKalState& istate) const
71 {
72 //double targV[3]={ RefEnd[0], RefEnd[1], RefEnd[2]};
73 return Protection(RefEnd, istate) <= 1.;
74 }
75/*----------------------------------------------------------------------------------*/
76// Addres of this fuction is supplied to TrkVKalVrtCore for ATLAS InDet extrapolation
77// with material. Each time VKalVrt needs propagation - it calls it.
78//
79// In case of usage with first measured point
80// it always use this point as starting point,
81// so ParOld,CovOld,RefStart are irrelevant
82//
83// VKalVrtCore works in relative coordinates wrt (state.m_refFrameX,state.m_refFrameY,state.m_refFrameZ)
84// For ATLAS propagator the Core coordinates must be moved back to global ref.frame
85/*------------------------------------------------------------------------------------*/
86 void VKalExtPropagator::Propagate( long int trkID, long int Charge,
87 double *ParOld, double *CovOld, double *RefStart,
88 double *RefEnd, double *ParNew, double *CovNew,
89 IVKalState& istate) const
90 {
91 TrkVKalVrtFitter::State& state = static_cast<TrkVKalVrtFitter::State&> (istate);
92
93 int trkID_loc=trkID; if(trkID_loc<0)trkID_loc=0;
94//std::cout<<__func__<<" Ext.Propagator TrkID="<<trkID<<"to (local!!!)="<<RefEnd[0]<<", "<<RefEnd[1]<<", "<<RefEnd[2]<<'\n';
95//-----------
96 double vX=RefEnd[0]; double vY=RefEnd[1]; double vZ=RefEnd[2]; //relative coords
97 // Propagation target in GLOBAL frame
98 Amg::Vector3D endPointG( vX + state.m_refFrameX, vY + state.m_refFrameY, vZ + state.m_refFrameZ);
99//
100// ---- Make MeasuredPerigee from input. Mag.field at start point is used here
101//
102 std::vector<double> PerigeeIni( ParOld, ParOld+5 );
103 std::vector<double> CovPerigeeIni( 15, 0. );
104 if( CovOld != nullptr) {
105// for(int i=0; i<15;i++) CovPerigeeIni.push_back( CovOld[i] );
106 std::copy(CovOld,CovOld+15,CovPerigeeIni.begin() );
107 }else{
108// for(int i=0; i<15;i++) CovPerigeeIni.push_back(0.);
109 CovPerigeeIni[0]=1.e6;CovPerigeeIni[2]=1.e6;CovPerigeeIni[5]=1.;CovPerigeeIni[9]=1.;CovPerigeeIni[14]=fabs(PerigeeIni[4]);
110 }
111 //--- This creates Perigee in GLOBAL frame from input in realtive coordinates
112 const Perigee* inpPer =
113 m_vkalFitSvc->CreatePerigee( RefStart[0], RefStart[1], RefStart[2], PerigeeIni, CovPerigeeIni, state).release();
114 const TrackParameters * inpPar= inpPer;
115//
116// ----- Magnetic field is taken at target point (GLOBAL calculated from relative frame input)
117//
118 double fx,fy,fz;
119 state.m_fitField.getMagFld(vX,vY,vZ,fx,fy,fz);
120//
121//-------------------- Extrapolation itself
122//
123 const Trk::TrackParameters* endPer = nullptr;
124 if(trkID<0){
125 endPer = myExtrapWithMatUpdate( trkID, inpPar, &endPointG, state);
126 }else{
127 endPer = myExtrapWithMatUpdate( trkID, inpPar, &endPointG, state);
128 }
129//-----------------------------------
130 if( endPer == nullptr ) { // No extrapolation done!!!
131 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
132 delete inpPer; return;
133 }
134 const Perigee* mPer = dynamic_cast<const Perigee*>(endPer);
135 const AtaStraightLine* Line = dynamic_cast<const AtaStraightLine*>(endPer);
136 AmgVector(5) VectPerig; VectPerig.setZero();
137 const AmgSymMatrix(5) *CovMtx=nullptr;
138 if( mPer ){
139 VectPerig = mPer->parameters();
140 CovMtx = mPer->covariance();
141 }
142 if( Line ){
143 VectPerig = Line->parameters();
144 CovMtx = Line->covariance();
145 }
146 if( (Line==nullptr && mPer==nullptr) || CovMtx==nullptr ){
147 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
148 delete endPer;
149 delete inpPer;
150 return;
151 }
152
153 if((*CovMtx)(0,0)<=0. || (*CovMtx)(1,1)<=0.){ //protection against bad error matrix
154 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
155 delete inpPer;
156 delete endPer;
157 return;
158 }
159 double CovVertTrk[15];
160 long int locCharge=Charge;
161 CovVertTrk[ 0] =(*CovMtx)(0,0);
162 CovVertTrk[ 1] =(*CovMtx)(1,0);
163 CovVertTrk[ 2] =(*CovMtx)(1,1);
164 CovVertTrk[ 3] =(*CovMtx)(2,0);
165 CovVertTrk[ 4] =(*CovMtx)(2,1);
166 CovVertTrk[ 5] =(*CovMtx)(2,2);
167 CovVertTrk[ 6] =(*CovMtx)(3,0);
168 CovVertTrk[ 7] =(*CovMtx)(3,1);
169 CovVertTrk[ 8] =(*CovMtx)(3,2);
170 CovVertTrk[ 9] =(*CovMtx)(3,3);
171 CovVertTrk[10] =(*CovMtx)(4,0);
172 CovVertTrk[11] =(*CovMtx)(4,1);
173 CovVertTrk[12] =(*CovMtx)(4,2);
174 CovVertTrk[13] =(*CovMtx)(4,3);
175 CovVertTrk[14] =(*CovMtx)(4,4);
176//std::cout<<" extrapPoint="<<endPer->position().x()<<", "<<endPer->position().y()<<", "<<endPer->position().y()<<'\n';
177//std::cout<<" extrapCov="<<(*CovMtx)(0,0)<<", "<<(*CovMtx)(1,1)<<", "<<(*CovMtx)(2,2)<<
178// ", "<<(*CovMtx)(3,3)<<", "<<(*CovMtx)(4,4)<<'\n';
179
180 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
181 if(fabs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
182 if(CovNew != nullptr) {
183 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
184 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
185 locCharge, &ParNew[0] , &CovNew[0]);
186 }else{
187 double CovVertTrkTmp[15];
188 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
189 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
190 locCharge, &ParNew[0] , CovVertTrkTmp);
191 }
192 delete inpPer; delete endPer;
193 }
194
195
196/*--------------------------------------------------------------------------------------*/
197/* Logic of material subtruction or addition to track error matrix is implemented here. */
198/* What to do depends on direction of extrapolation and relative position of initial, */
199/* final and track reference points */
200/* */
201/* All points are in GLOBAL Atlas frame here! */
202/* */
203/* Real track (TrkID>=0) extrapolation always starts from INITIAL track object */
204/* and NOT from parameters provided by VKalVrtCore. More CPU time but better precision*/
205/* Only combined (TrkID<0) tracks use VKalVrtCore parameters for start */
206/*--------------------------------------------------------------------------------------*/
208 const TrackParameters *inpPer,
209 Amg::Vector3D * endPoint,
210 const IVKalState& istate) const
211 {
212 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
213 const EventContext& ctx = (state.m_eventContext)
214 ? *(state.m_eventContext)
215 : Gaudi::Hive::currentContext();
216
217 const Trk::TrackParameters* endPer=nullptr;
218 const Trk::TrackParameters* tmpPer=nullptr;
219 ParticleHypothesis prtType = pion;
220 //End surface
221 PerigeeSurface surfEnd( *endPoint );
222 //Initial point (global frame)
223 Amg::Vector3D iniPoint = inpPer->position();
224 Amg::Vector3D pmom=inpPer->momentum();
225 //Track reference point ( some point on track provided initially, global frame )
226 Amg::Vector3D refPoint(0.,0.,0.);
227 if(TrkID>=0)refPoint = state.m_trkControl.at(TrkID).trkRefGlobPos;
228 //
229 Amg::Vector3D step = (*endPoint) - iniPoint;
230 //
231 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
232 //
233 // Extrapolation for new track - no material at all
234 //
235 const TrackParameters *pntOnTrk=nullptr;
236 if (TrkID < 0) {
237 prtType = undefined;
238 if (pmom.dot(step) > 0.) {
239 endPer = m_extrapolator->extrapolateDirectly(ctx,
240 *inpPer, surfEnd, alongMomentum, true, pion).release();
241 } else {
242 endPer = m_extrapolator->extrapolateDirectly(ctx,
243 *inpPer, surfEnd, oppositeMomentum, true, pion).release();
244 }
245 return endPer;
246 }
247 pntOnTrk = dynamic_cast<const TrackParameters*>(
248 state.m_trkControl.at(TrkID).TrkPnt);
249 if (pntOnTrk == nullptr){
250 return endPer;
251 }
252 prtType = pion; // Pion hypothesis is always used for extrapolation
253 // Redefinition of starting point for extrapolation
254 iniPoint = pntOnTrk->position();
255 step = (*endPoint) - iniPoint;
256
257 //
258 // Extrapolation for first measured point strategy. Start from it and
259 // always add material
260 //
261 if( Strategy == 0) {
263 if (pmom.dot(step) < 0) {
264 dir = oppositeMomentum;
265 }
266 endPer = m_extrapolator->extrapolate(
267 ctx, *pntOnTrk, surfEnd, dir, true, prtType, addNoise).release();
268 return endPer;
269 }
270 //
271 // Extrapolation for any measured point
272 //
273 if (Strategy == 1) {
276 if (pmom.dot(step) < 0) {
277 dir = oppositeMomentum;
278 mmode = removeNoise;
279 }
280 endPer = m_extrapolator->extrapolate(
281 ctx, *pntOnTrk, surfEnd, dir, true, prtType, mmode).release();
282 return endPer;
283 }
284 //
285 // Extrapolation for perigee and B-hit
286 //
287 if (Strategy == 2) {
288 double Border = 25.;
289 bool dirPositive = true;
290 if (pmom.dot(step) < 0.)
291 dirPositive = false;
292 if ((*endPoint).perp() > Border && iniPoint.perp() > Border) {
293 if (dirPositive) {
294 endPer = m_extrapolator->extrapolate(
295 ctx, *pntOnTrk, surfEnd, alongMomentum, true, prtType, addNoise).release();
296 } else {
297 endPer = m_extrapolator->extrapolate(ctx,
298 *pntOnTrk,
299 surfEnd,
301 true,
302 prtType,
303 removeNoise).release();
304 }
305 return endPer;
306 }
307 if ((*endPoint).perp() < Border && iniPoint.perp() < Border) {
308 if (dirPositive) {
309 endPer = m_extrapolator->extrapolate(ctx,
310 *pntOnTrk,
311 surfEnd,
313 true,
314 prtType,
315 removeNoise).release();
316 } else {
317 endPer = m_extrapolator->extrapolate(ctx,
318 *pntOnTrk,
319 surfEnd,
321 true,
322 prtType,
323 addNoise).release();
324 }
325 return endPer;
326 }
327 Amg::Transform3D trnsf;
328 trnsf.setIdentity();
329 CylinderSurface surfBorder(trnsf, Border, 3000.);
330 if (iniPoint.perp() < Border) {
331 tmpPer = m_extrapolator->extrapolate(ctx,
332 *pntOnTrk,
333 surfBorder,
335 true,
336 prtType,
337 removeNoise).release();
338 if (tmpPer == nullptr) {
339 return nullptr;
340 }
341 endPer = m_extrapolator->extrapolate(
342 ctx, *tmpPer, surfEnd, alongMomentum, true, prtType, addNoise).release();
343 } else {
344 endPer = m_extrapolator->extrapolate(
345 ctx, *pntOnTrk, surfEnd, oppositeMomentum, true, prtType, addNoise).release();
346 return endPer;
347 }
348 delete tmpPer;
349 return endPer;
350 }
351 return endPer;
352 }
353
354/*--------------------------------------------------------------------------------------*/
355/* Extrapolation to line */
356/* */
357/* All points are in GLOBAL Atlas frame here! */
358/* DOESN't WORK FOR COMBINED TRACKS! */
359/*--------------------------------------------------------------------------------------*/
361 const TrackParameters *inpPer,
362 Amg::Vector3D * endPoint,
363 StraightLineSurface &lineTarget,
364 const IVKalState& istate) const
365 {
366 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
367 const EventContext& ctx = (state.m_eventContext)
368 ? *(state.m_eventContext)
369 : Gaudi::Hive::currentContext();
370
371
372 const Trk::TrackParameters* endPer=nullptr;
373 ParticleHypothesis prtType = muon;
374//Initial point
375 Amg::Vector3D iniPoint = inpPer->position();
376 Amg::Vector3D step = (*endPoint) - iniPoint;
377//
378 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
379//
380// Extrapolation for new track - no material at all
381//
382 const TrackParameters *pntOnTrk=nullptr;
383 if(TrkID<0){
384 return endPer;
385 }
386 pntOnTrk=dynamic_cast<const TrackParameters*> (state.m_trkControl.at(TrkID).TrkPnt);
387 if(!pntOnTrk) return endPer;
388 //double inpMass=state.m_trkControl[TrkID].prtMass;
389 //if( inpMass > 0. && inpMass< 20.) { prtType=electron; } //VK Disabled according to users request
390 //else if(inpMass > 20. && inpMass<120.) { prtType=muon; } // May be activated in future
391 //else if(inpMass >120. && inpMass<200.) { prtType=pion; }
392 //else if(inpMass >200. && inpMass<700.) { prtType=kaon; }
393 //else if(inpMass >700. && inpMass<999.) { prtType=proton; }
394 //else { prtType=undefined; }
395 prtType=muon; // Muon hypothesis is always used for extrapolation
396 iniPoint = pntOnTrk->position();
397 step = (*endPoint) - iniPoint;
398
399 Amg::Vector3D pmom=pntOnTrk->momentum();
400//
401// Extrapolation for first measured point strategy. Start from it and always add material
402//
403 if( Strategy == 0) {
404 PropDirection dir=alongMomentum; if(pmom.dot(step)<0) dir=oppositeMomentum;
405 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, addNoise).release();
406 if (!endPer)
407 endPer = m_extrapolator->extrapolateDirectly(ctx, *pntOnTrk, lineTarget, dir, true, prtType).release();
408 return endPer;
409 }
410//
411// Extrapolation for any measured point
412//
413 if( Strategy == 1 || Strategy == 2) {
415 if(pmom.dot(step)<0){ dir=oppositeMomentum; mmode=removeNoise;}
416 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, mmode).release();
417 return endPer;
418 }
419 return endPer;
420 }
421
422/*--------------------------------------------------------------------------------------*/
423/* Simple extrapolation of neutral tracks */
424/*--------------------------------------------------------------------------------------*/
426 Amg::Vector3D * endPoint) const
427 {
428 const Trk::NeutralParameters* endPer=nullptr;
429//End surface
430 PerigeeSurface surfEnd( *endPoint );
431 endPer = m_extrapolator->extrapolate( *inpPer, surfEnd, anyDirection, true).release();
432 return endPer;
433 }
434
435/*--------------------------------------------------------------------------------------*/
436/* xAOD method to find FirstMeasuredPoint on TrackParticle. */
437/* */
438/* All points are in GLOBAL Atlas frame here! */
439/* */
440/* xAOD::TrackParticle Perigee is extrapolated to cylinder with radius of first hit */
441/*--------------------------------------------------------------------------------------*/
443 {
444 static const SG::ConstAccessor<float> radiusOfFirstHitAcc ("radiusOfFirstHit");
445 if(!radiusOfFirstHitAcc.isAvailable (*xprt)) return nullptr; // No radiusOfFirstHit on track
446
447 const EventContext& ctx = Gaudi::Hive::currentContext();
448 const Trk::Perigee* mPer = &(xprt->perigeeParameters());
449 Amg::Transform3D trnsf;
450 trnsf.setIdentity();
451 CylinderSurface surfacePntOnTrk( trnsf, xprt->radiusOfFirstHit(), 20000.);
452 ParticleHypothesis prtType = pion;
453
454 const TrackParameters *hitOnTrk =
455 m_extrapolator->extrapolate(ctx,
456 *mPer,
457 surfacePntOnTrk,
459 true, prtType, removeNoise).release();
460//std::cout<<" Radius="<<xprt->radiusOfFirstHit()<<" extrap="<<hitOnTrk<<'\n';
461 if(hitOnTrk==nullptr)hitOnTrk=m_extrapolator->extrapolateDirectly(ctx,
462 *mPer,
463 surfacePntOnTrk,
465 true, prtType).release();
466 if(hitOnTrk==nullptr)return nullptr;
467
468 //convert result to Perigee
469 PerigeeSurface surfacePerigee( hitOnTrk->position() );
470 const TrackParameters *hitOnTrkPerig = m_extrapolator->extrapolate(ctx,
471 *hitOnTrk,
472 surfacePerigee).release();
473 delete hitOnTrk; // Delete temporary results
474 if(hitOnTrkPerig==nullptr)return nullptr;
475//std::cout<<" perig="<<(*hitOnTrkPerig)<<'\n';
476 return dynamic_cast<const Perigee* > (hitOnTrkPerig);
477 }
478
479//--------------------------------------------------------------------------
480//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
481// Setting interface to setup VKalVrt InDet extrapolator
483 {
484 // Save external propagator in VKalExtPropagator object and send it to TrkVKalVrtCore
485//
486 if(m_fitPropagator != nullptr) delete m_fitPropagator;
488 m_fitPropagator->setPropagator(Pnt);
489 m_InDetExtrapolator = Pnt; // Pointer to InDet extrapolator
490 }
491
492}
Helper class to provide constant type-safe access to aux data.
#define AmgSymMatrix(dim)
#define AmgVector(rows)
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Class for a CylinderSurface in the ATLAS detector.
Interface class for the extrapolation AlgTool, it inherits from IAlgTool Detailed information about p...
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
Class describing the Line to which the Perigee refers to.
Class for a StraightLineSurface in the ATLAS detector to describe dirft tube and straw like detectors...
const EventContext * m_eventContext
std::vector< TrkMatControl > m_trkControl
const IExtrapolator * m_InDetExtrapolator
Pointer to Extrapolator AlgTool.
VKalExtPropagator * m_fitPropagator
friend class VKalExtPropagator
void setAthenaPropagator(const Trk::IExtrapolator *)
virtual void getMagFld(const double, const double, const double, double &, double &, double &) override
virtual void Propagate(long int trkID, long int Charge, double *ParOld, double *CovOld, double *RefStart, double *RefEnd, double *ParNew, double *CovNew, IVKalState &istate) const override
void setPropagator(const IExtrapolator *)
double Protection(const double *, const IVKalState &istate) const
const TrackParameters * myExtrapWithMatUpdate(long int TrkID, const TrackParameters *inpPer, Amg::Vector3D *endPoint, const IVKalState &istate) const
const Perigee * myxAODFstPntOnTrk(const xAOD::TrackParticle *xprt) const
virtual ~VKalExtPropagator()
virtual bool checkTarget(double *, const IVKalState &istate) const override
TrkVKalVrtFitter * m_vkalFitSvc
Pointer to TrkVKalVrtFitter.
VKalExtPropagator(TrkVKalVrtFitter *)
const IExtrapolator * m_extrapolator
Pointer to Extrapolator AlgTool.
const TrackParameters * myExtrapToLine(long int TrkID, const TrackParameters *inpPer, Amg::Vector3D *endPoint, StraightLineSurface &lineTarget, const IVKalState &istate) const
const NeutralParameters * myExtrapNeutral(const NeutralParameters *inpPer, Amg::Vector3D *endPoint) const
double getEffField(double bx, double by, double bz, double phi, double theta)
Definition VKalVrtBMag.h:41
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
float radiusOfFirstHit() const
Returns the radius of the first hit.
void Scale(TH1 *h, double d=1)
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
PropDirection
PropDirection, enum for direction of the propagation.
@ oppositeMomentum
@ alongMomentum
@ anyDirection
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters
ParametersT< TrackParametersDim, Charged, StraightLineSurface > AtaStraightLine
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
MaterialUpdateMode
This is a steering enum to force the material update it can be: (1) addNoise (-1) removeNoise Second ...
ParametersBase< TrackParametersDim, Charged > TrackParameters
TrackParticle_v1 TrackParticle
Reference the current persistent version: