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, const double *ParOld,
87 const double *CovOld, const double *RefStart, const double *RefEnd,
88 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::span<const double, 5> PerigeeIni( ParOld, 5 );
103 std::array<double, 15> CovPerigeeIni{};
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 = myExtrapWithMatUpdate( trkID, inpPar, &endPointG, state);
124//-----------------------------------
125 if( endPer == nullptr ) { // No extrapolation done!!!
126 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
127 delete inpPer; return;
128 }
129 const Perigee* mPer = dynamic_cast<const Perigee*>(endPer);
130 const AtaStraightLine* Line = dynamic_cast<const AtaStraightLine*>(endPer);
131 AmgVector(5) VectPerig; VectPerig.setZero();
132 const AmgSymMatrix(5) *CovMtx=nullptr;
133 if( mPer ){
134 VectPerig = mPer->parameters();
135 CovMtx = mPer->covariance();
136 }
137 if( Line ){
138 VectPerig = Line->parameters();
139 CovMtx = Line->covariance();
140 }
141 if( (Line==nullptr && mPer==nullptr) || CovMtx==nullptr ){
142 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
143 delete endPer;
144 delete inpPer;
145 return;
146 }
147
148 if((*CovMtx)(0,0)<=0. || (*CovMtx)(1,1)<=0.){ //protection against bad error matrix
149 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
150 delete inpPer;
151 delete endPer;
152 return;
153 }
154 double CovVertTrk[15];
155 long int locCharge=Charge;
156 CovVertTrk[ 0] =(*CovMtx)(0,0);
157 CovVertTrk[ 1] =(*CovMtx)(1,0);
158 CovVertTrk[ 2] =(*CovMtx)(1,1);
159 CovVertTrk[ 3] =(*CovMtx)(2,0);
160 CovVertTrk[ 4] =(*CovMtx)(2,1);
161 CovVertTrk[ 5] =(*CovMtx)(2,2);
162 CovVertTrk[ 6] =(*CovMtx)(3,0);
163 CovVertTrk[ 7] =(*CovMtx)(3,1);
164 CovVertTrk[ 8] =(*CovMtx)(3,2);
165 CovVertTrk[ 9] =(*CovMtx)(3,3);
166 CovVertTrk[10] =(*CovMtx)(4,0);
167 CovVertTrk[11] =(*CovMtx)(4,1);
168 CovVertTrk[12] =(*CovMtx)(4,2);
169 CovVertTrk[13] =(*CovMtx)(4,3);
170 CovVertTrk[14] =(*CovMtx)(4,4);
171//std::cout<<" extrapPoint="<<endPer->position().x()<<", "<<endPer->position().y()<<", "<<endPer->position().y()<<'\n';
172//std::cout<<" extrapCov="<<(*CovMtx)(0,0)<<", "<<(*CovMtx)(1,1)<<", "<<(*CovMtx)(2,2)<<
173// ", "<<(*CovMtx)(3,3)<<", "<<(*CovMtx)(4,4)<<'\n';
174
175 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
176 if(fabs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
177 if(CovNew != nullptr) {
178 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
179 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
180 locCharge, &ParNew[0] , &CovNew[0]);
181 }else{
182 double CovVertTrkTmp[15];
183 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
184 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
185 locCharge, &ParNew[0] , CovVertTrkTmp);
186 }
187 delete inpPer; delete endPer;
188 }
189
190
191/*--------------------------------------------------------------------------------------*/
192/* Logic of material subtruction or addition to track error matrix is implemented here. */
193/* What to do depends on direction of extrapolation and relative position of initial, */
194/* final and track reference points */
195/* */
196/* All points are in GLOBAL Atlas frame here! */
197/* */
198/* Real track (TrkID>=0) extrapolation always starts from INITIAL track object */
199/* and NOT from parameters provided by VKalVrtCore. More CPU time but better precision*/
200/* Only combined (TrkID<0) tracks use VKalVrtCore parameters for start */
201/*--------------------------------------------------------------------------------------*/
203 const TrackParameters *inpPer,
204 Amg::Vector3D * endPoint,
205 const IVKalState& istate) const
206 {
207 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
208 const EventContext& ctx = (state.m_eventContext)
209 ? *(state.m_eventContext)
210 : Gaudi::Hive::currentContext();
211
212 const Trk::TrackParameters* endPer=nullptr;
213 const Trk::TrackParameters* tmpPer=nullptr;
214 ParticleHypothesis prtType = pion;
215 //End surface
216 PerigeeSurface surfEnd( *endPoint );
217 //Initial point (global frame)
218 Amg::Vector3D iniPoint = inpPer->position();
219 Amg::Vector3D pmom=inpPer->momentum();
220 //Track reference point ( some point on track provided initially, global frame )
221 Amg::Vector3D refPoint(0.,0.,0.);
222 if(TrkID>=0)refPoint = state.m_trkControl.at(TrkID).trkRefGlobPos;
223 //
224 Amg::Vector3D step = (*endPoint) - iniPoint;
225 //
226 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
227 //
228 // Extrapolation for new track - no material at all
229 //
230 const TrackParameters *pntOnTrk=nullptr;
231 if (TrkID < 0) {
232 prtType = undefined;
233 if (pmom.dot(step) > 0.) {
234 endPer = m_extrapolator->extrapolateDirectly(ctx,
235 *inpPer, surfEnd, alongMomentum, true, pion).release();
236 } else {
237 endPer = m_extrapolator->extrapolateDirectly(ctx,
238 *inpPer, surfEnd, oppositeMomentum, true, pion).release();
239 }
240 return endPer;
241 }
242 pntOnTrk = dynamic_cast<const TrackParameters*>(
243 state.m_trkControl.at(TrkID).TrkPnt);
244 if (pntOnTrk == nullptr){
245 return endPer;
246 }
247 prtType = pion; // Pion hypothesis is always used for extrapolation
248 // Redefinition of starting point for extrapolation
249 iniPoint = pntOnTrk->position();
250 step = (*endPoint) - iniPoint;
251
252 //
253 // Extrapolation for first measured point strategy. Start from it and
254 // always add material
255 //
256 if( Strategy == 0) {
258 if (pmom.dot(step) < 0) {
259 dir = oppositeMomentum;
260 }
261 endPer = m_extrapolator->extrapolate(
262 ctx, *pntOnTrk, surfEnd, dir, true, prtType, addNoise).release();
263 return endPer;
264 }
265 //
266 // Extrapolation for any measured point
267 //
268 if (Strategy == 1) {
271 if (pmom.dot(step) < 0) {
272 dir = oppositeMomentum;
273 mmode = removeNoise;
274 }
275 endPer = m_extrapolator->extrapolate(
276 ctx, *pntOnTrk, surfEnd, dir, true, prtType, mmode).release();
277 return endPer;
278 }
279 //
280 // Extrapolation for perigee and B-hit
281 //
282 if (Strategy == 2) {
283 double Border = 25.;
284 bool dirPositive = true;
285 if (pmom.dot(step) < 0.)
286 dirPositive = false;
287 if ((*endPoint).perp() > Border && iniPoint.perp() > Border) {
288 if (dirPositive) {
289 endPer = m_extrapolator->extrapolate(
290 ctx, *pntOnTrk, surfEnd, alongMomentum, true, prtType, addNoise).release();
291 } else {
292 endPer = m_extrapolator->extrapolate(ctx,
293 *pntOnTrk,
294 surfEnd,
296 true,
297 prtType,
298 removeNoise).release();
299 }
300 return endPer;
301 }
302 if ((*endPoint).perp() < Border && iniPoint.perp() < Border) {
303 if (dirPositive) {
304 endPer = m_extrapolator->extrapolate(ctx,
305 *pntOnTrk,
306 surfEnd,
308 true,
309 prtType,
310 removeNoise).release();
311 } else {
312 endPer = m_extrapolator->extrapolate(ctx,
313 *pntOnTrk,
314 surfEnd,
316 true,
317 prtType,
318 addNoise).release();
319 }
320 return endPer;
321 }
322 Amg::Transform3D trnsf;
323 trnsf.setIdentity();
324 CylinderSurface surfBorder(trnsf, Border, 3000.);
325 if (iniPoint.perp() < Border) {
326 tmpPer = m_extrapolator->extrapolate(ctx,
327 *pntOnTrk,
328 surfBorder,
330 true,
331 prtType,
332 removeNoise).release();
333 if (tmpPer == nullptr) {
334 return nullptr;
335 }
336 endPer = m_extrapolator->extrapolate(
337 ctx, *tmpPer, surfEnd, alongMomentum, true, prtType, addNoise).release();
338 } else {
339 endPer = m_extrapolator->extrapolate(
340 ctx, *pntOnTrk, surfEnd, oppositeMomentum, true, prtType, addNoise).release();
341 return endPer;
342 }
343 delete tmpPer;
344 return endPer;
345 }
346 return endPer;
347 }
348
349/*--------------------------------------------------------------------------------------*/
350/* Extrapolation to line */
351/* */
352/* All points are in GLOBAL Atlas frame here! */
353/* DOESN't WORK FOR COMBINED TRACKS! */
354/*--------------------------------------------------------------------------------------*/
356 const TrackParameters *inpPer,
357 Amg::Vector3D * endPoint,
358 StraightLineSurface &lineTarget,
359 const IVKalState& istate) const
360 {
361 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
362 const EventContext& ctx = (state.m_eventContext)
363 ? *(state.m_eventContext)
364 : Gaudi::Hive::currentContext();
365
366
367 const Trk::TrackParameters* endPer=nullptr;
368 ParticleHypothesis prtType = muon;
369//Initial point
370 Amg::Vector3D iniPoint = inpPer->position();
371 Amg::Vector3D step = (*endPoint) - iniPoint;
372//
373 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
374//
375// Extrapolation for new track - no material at all
376//
377 const TrackParameters *pntOnTrk=nullptr;
378 if(TrkID<0){
379 return endPer;
380 }
381 pntOnTrk=dynamic_cast<const TrackParameters*> (state.m_trkControl.at(TrkID).TrkPnt);
382 if(!pntOnTrk) return endPer;
383 //double inpMass=state.m_trkControl[TrkID].prtMass;
384 //if( inpMass > 0. && inpMass< 20.) { prtType=electron; } //VK Disabled according to users request
385 //else if(inpMass > 20. && inpMass<120.) { prtType=muon; } // May be activated in future
386 //else if(inpMass >120. && inpMass<200.) { prtType=pion; }
387 //else if(inpMass >200. && inpMass<700.) { prtType=kaon; }
388 //else if(inpMass >700. && inpMass<999.) { prtType=proton; }
389 //else { prtType=undefined; }
390 prtType=muon; // Muon hypothesis is always used for extrapolation
391 iniPoint = pntOnTrk->position();
392 step = (*endPoint) - iniPoint;
393
394 Amg::Vector3D pmom=pntOnTrk->momentum();
395//
396// Extrapolation for first measured point strategy. Start from it and always add material
397//
398 if( Strategy == 0) {
399 PropDirection dir=alongMomentum; if(pmom.dot(step)<0) dir=oppositeMomentum;
400 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, addNoise).release();
401 if (!endPer)
402 endPer = m_extrapolator->extrapolateDirectly(ctx, *pntOnTrk, lineTarget, dir, true, prtType).release();
403 return endPer;
404 }
405//
406// Extrapolation for any measured point
407//
408 if( Strategy == 1 || Strategy == 2) {
410 if(pmom.dot(step)<0){ dir=oppositeMomentum; mmode=removeNoise;}
411 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, mmode).release();
412 return endPer;
413 }
414 return endPer;
415 }
416
417/*--------------------------------------------------------------------------------------*/
418/* Simple extrapolation of neutral tracks */
419/*--------------------------------------------------------------------------------------*/
421 Amg::Vector3D * endPoint) const
422 {
423 const Trk::NeutralParameters* endPer=nullptr;
424//End surface
425 PerigeeSurface surfEnd( *endPoint );
426 endPer = m_extrapolator->extrapolate( *inpPer, surfEnd, anyDirection, true).release();
427 return endPer;
428 }
429
430/*--------------------------------------------------------------------------------------*/
431/* xAOD method to find FirstMeasuredPoint on TrackParticle. */
432/* */
433/* All points are in GLOBAL Atlas frame here! */
434/* */
435/* xAOD::TrackParticle Perigee is extrapolated to cylinder with radius of first hit */
436/*--------------------------------------------------------------------------------------*/
438 {
439 static const SG::ConstAccessor<float> radiusOfFirstHitAcc ("radiusOfFirstHit");
440 if(!radiusOfFirstHitAcc.isAvailable (*xprt)) return nullptr; // No radiusOfFirstHit on track
441
442 const EventContext& ctx = Gaudi::Hive::currentContext();
443 const Trk::Perigee* mPer = &(xprt->perigeeParameters());
444 Amg::Transform3D trnsf;
445 trnsf.setIdentity();
446 CylinderSurface surfacePntOnTrk( trnsf, xprt->radiusOfFirstHit(), 20000.);
447 ParticleHypothesis prtType = pion;
448
449 const TrackParameters *hitOnTrk =
450 m_extrapolator->extrapolate(ctx,
451 *mPer,
452 surfacePntOnTrk,
454 true, prtType, removeNoise).release();
455//std::cout<<" Radius="<<xprt->radiusOfFirstHit()<<" extrap="<<hitOnTrk<<'\n';
456 if(hitOnTrk==nullptr)hitOnTrk=m_extrapolator->extrapolateDirectly(ctx,
457 *mPer,
458 surfacePntOnTrk,
460 true, prtType).release();
461 if(hitOnTrk==nullptr)return nullptr;
462
463 //convert result to Perigee
464 PerigeeSurface surfacePerigee( hitOnTrk->position() );
465 const TrackParameters *hitOnTrkPerig = m_extrapolator->extrapolate(ctx,
466 *hitOnTrk,
467 surfacePerigee).release();
468 delete hitOnTrk; // Delete temporary results
469 if(hitOnTrkPerig==nullptr)return nullptr;
470//std::cout<<" perig="<<(*hitOnTrkPerig)<<'\n';
471 return dynamic_cast<const Perigee* > (hitOnTrkPerig);
472 }
473
474//--------------------------------------------------------------------------
475//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
476// Setting interface to setup VKalVrt InDet extrapolator
478 {
479 // Save external propagator in VKalExtPropagator object and send it to TrkVKalVrtCore
480//
481 if(m_fitPropagator != nullptr) delete m_fitPropagator;
483 m_fitPropagator->setPropagator(Pnt);
484 m_InDetExtrapolator = Pnt; // Pointer to InDet extrapolator
485 }
486
487}
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
void setPropagator(const IExtrapolator *)
virtual void Propagate(long int TrkID, long int Charge, const double *ParOld, const double *CovOld, const double *RefStart, const double *RefEnd, double *ParNew, double *CovNew, IVKalState &istate) const override
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: