ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::VKalExtPropagator Class Reference

#include <VKalExtPropagator.h>

Inheritance diagram for Trk::VKalExtPropagator:
Collaboration diagram for Trk::VKalExtPropagator:

Public Member Functions

 VKalExtPropagator (TrkVKalVrtFitter *)
virtual ~VKalExtPropagator ()
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
virtual bool checkTarget (double *, const IVKalState &istate) const override
void setPropagator (const IExtrapolator *)
const TrackParametersmyExtrapWithMatUpdate (long int TrkID, const TrackParameters *inpPer, Amg::Vector3D *endPoint, const IVKalState &istate) const
const TrackParametersmyExtrapToLine (long int TrkID, const TrackParameters *inpPer, Amg::Vector3D *endPoint, StraightLineSurface &lineTarget, const IVKalState &istate) const
const NeutralParametersmyExtrapNeutral (const NeutralParameters *inpPer, Amg::Vector3D *endPoint) const
const PerigeemyxAODFstPntOnTrk (const xAOD::TrackParticle *xprt) const

Private Member Functions

double Protection (const double *, const IVKalState &istate) const

Private Attributes

const IExtrapolatorm_extrapolator
 Pointer to Extrapolator AlgTool.
TrkVKalVrtFitterm_vkalFitSvc
 Pointer to TrkVKalVrtFitter.

Detailed Description

Definition at line 21 of file VKalExtPropagator.h.

Constructor & Destructor Documentation

◆ VKalExtPropagator()

Trk::VKalExtPropagator::VKalExtPropagator ( TrkVKalVrtFitter * pnt)

Definition at line 33 of file VKalExtPropagator.cxx.

34 {
35 m_extrapolator = nullptr;
36 m_vkalFitSvc = pnt;
37 }
TrkVKalVrtFitter * m_vkalFitSvc
Pointer to TrkVKalVrtFitter.
const IExtrapolator * m_extrapolator
Pointer to Extrapolator AlgTool.

◆ ~VKalExtPropagator()

Trk::VKalExtPropagator::~VKalExtPropagator ( )
virtualdefault

Member Function Documentation

◆ checkTarget()

bool Trk::VKalExtPropagator::checkTarget ( double * RefEnd,
const IVKalState & istate ) const
overridevirtual

Implements Trk::basePropagator.

Definition at line 69 of file VKalExtPropagator.cxx.

71 {
72 //double targV[3]={ RefEnd[0], RefEnd[1], RefEnd[2]};
73 return Protection(RefEnd, istate) <= 1.;
74 }
double Protection(const double *, const IVKalState &istate) const

◆ myExtrapNeutral()

const NeutralParameters * Trk::VKalExtPropagator::myExtrapNeutral ( const NeutralParameters * inpPer,
Amg::Vector3D * endPoint ) const

Definition at line 420 of file VKalExtPropagator.cxx.

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 }
@ anyDirection
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters

◆ myExtrapToLine()

const TrackParameters * Trk::VKalExtPropagator::myExtrapToLine ( long int TrkID,
const TrackParameters * inpPer,
Amg::Vector3D * endPoint,
StraightLineSurface & lineTarget,
const IVKalState & istate ) const

Definition at line 355 of file VKalExtPropagator.cxx.

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 }
const Amg::Vector3D & position() const
Access method for the position.
Eigen::Matrix< double, 3, 1 > Vector3D
PropDirection
PropDirection, enum for direction of the propagation.
@ oppositeMomentum
@ alongMomentum
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

◆ myExtrapWithMatUpdate()

const TrackParameters * Trk::VKalExtPropagator::myExtrapWithMatUpdate ( long int TrkID,
const TrackParameters * inpPer,
Amg::Vector3D * endPoint,
const IVKalState & istate ) const

Definition at line 202 of file VKalExtPropagator.cxx.

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) {
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) {
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 }
Eigen::Affine3d Transform3D

◆ myxAODFstPntOnTrk()

const Perigee * Trk::VKalExtPropagator::myxAODFstPntOnTrk ( const xAOD::TrackParticle * xprt) const

Definition at line 437 of file VKalExtPropagator.cxx.

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 }
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
float radiusOfFirstHit() const
Returns the radius of the first hit.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee

◆ Propagate()

void Trk::VKalExtPropagator::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
overridevirtual

Implements Trk::basePropagator.

Definition at line 86 of file VKalExtPropagator.cxx.

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 }
#define AmgSymMatrix(dim)
#define AmgVector(rows)
if(pathvar)
const TrackParameters * myExtrapWithMatUpdate(long int TrkID, const TrackParameters *inpPer, Amg::Vector3D *endPoint, const IVKalState &istate) const
ParametersT< TrackParametersDim, Charged, StraightLineSurface > AtaStraightLine

◆ Protection()

double Trk::VKalExtPropagator::Protection ( const double * RefEnd,
const IVKalState & istate ) const
private

Definition at line 48 of file VKalExtPropagator.cxx.

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 }
void Scale(TH1 *h, double d=1)

◆ setPropagator()

void Trk::VKalExtPropagator::setPropagator ( const IExtrapolator * Pnt)

Definition at line 41 of file VKalExtPropagator.cxx.

42 {
43 m_extrapolator = Pnt;
44 }

Member Data Documentation

◆ m_extrapolator

const IExtrapolator* Trk::VKalExtPropagator::m_extrapolator
private

Pointer to Extrapolator AlgTool.

Definition at line 53 of file VKalExtPropagator.h.

◆ m_vkalFitSvc

TrkVKalVrtFitter* Trk::VKalExtPropagator::m_vkalFitSvc
private

Pointer to TrkVKalVrtFitter.

Definition at line 54 of file VKalExtPropagator.h.


The documentation for this class was generated from the following files: