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, double *ParOld, double *CovOld, double *RefStart, 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 422 of file VKalExtPropagator.cxx.

424 {
425 const Trk::NeutralParameters* endPer=nullptr;
426//End surface
427 PerigeeSurface surfEnd( *endPoint );
428 endPer = m_extrapolator->extrapolate( *inpPer, surfEnd, anyDirection, true).release();
429 return endPer;
430 }
@ 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 357 of file VKalExtPropagator.cxx.

362 {
363 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
364 const EventContext& ctx = (state.m_eventContext)
365 ? *(state.m_eventContext)
366 : Gaudi::Hive::currentContext();
367
368
369 const Trk::TrackParameters* endPer=nullptr;
370 ParticleHypothesis prtType = muon;
371//Initial point
372 Amg::Vector3D iniPoint = inpPer->position();
373 Amg::Vector3D step = (*endPoint) - iniPoint;
374//
375 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
376//
377// Extrapolation for new track - no material at all
378//
379 const TrackParameters *pntOnTrk=nullptr;
380 if(TrkID<0){
381 return endPer;
382 }
383 pntOnTrk=dynamic_cast<const TrackParameters*> (state.m_trkControl.at(TrkID).TrkPnt);
384 if(!pntOnTrk) return endPer;
385 //double inpMass=state.m_trkControl[TrkID].prtMass;
386 //if( inpMass > 0. && inpMass< 20.) { prtType=electron; } //VK Disabled according to users request
387 //else if(inpMass > 20. && inpMass<120.) { prtType=muon; } // May be activated in future
388 //else if(inpMass >120. && inpMass<200.) { prtType=pion; }
389 //else if(inpMass >200. && inpMass<700.) { prtType=kaon; }
390 //else if(inpMass >700. && inpMass<999.) { prtType=proton; }
391 //else { prtType=undefined; }
392 prtType=muon; // Muon hypothesis is always used for extrapolation
393 iniPoint = pntOnTrk->position();
394 step = (*endPoint) - iniPoint;
395
396 Amg::Vector3D pmom=pntOnTrk->momentum();
397//
398// Extrapolation for first measured point strategy. Start from it and always add material
399//
400 if( Strategy == 0) {
401 PropDirection dir=alongMomentum; if(pmom.dot(step)<0) dir=oppositeMomentum;
402 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, addNoise).release();
403 if (!endPer)
404 endPer = m_extrapolator->extrapolateDirectly(ctx, *pntOnTrk, lineTarget, dir, true, prtType).release();
405 return endPer;
406 }
407//
408// Extrapolation for any measured point
409//
410 if( Strategy == 1 || Strategy == 2) {
412 if(pmom.dot(step)<0){ dir=oppositeMomentum; mmode=removeNoise;}
413 endPer = m_extrapolator->extrapolate(ctx, *pntOnTrk, lineTarget, dir, true, prtType, mmode).release();
414 return endPer;
415 }
416 return endPer;
417 }
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 204 of file VKalExtPropagator.cxx.

208 {
209 const TrkVKalVrtFitter::State& state = static_cast<const TrkVKalVrtFitter::State&> (istate);
210 const EventContext& ctx = (state.m_eventContext)
211 ? *(state.m_eventContext)
212 : Gaudi::Hive::currentContext();
213
214 const Trk::TrackParameters* endPer=nullptr;
215 const Trk::TrackParameters* tmpPer=nullptr;
216 ParticleHypothesis prtType = pion;
217 //End surface
218 PerigeeSurface surfEnd( *endPoint );
219 //Initial point (global frame)
220 Amg::Vector3D iniPoint = inpPer->position();
221 Amg::Vector3D pmom=inpPer->momentum();
222 //Track reference point ( some point on track provided initially, global frame )
223 Amg::Vector3D refPoint(0.,0.,0.);
224 if(TrkID>=0)refPoint = state.m_trkControl.at(TrkID).trkRefGlobPos;
225 //
226 Amg::Vector3D step = (*endPoint) - iniPoint;
227 //
228 int Strategy = 0; if(TrkID>=0) Strategy = state.m_trkControl[TrkID].extrapolationType;
229 //
230 // Extrapolation for new track - no material at all
231 //
232 const TrackParameters *pntOnTrk=nullptr;
233 if (TrkID < 0) {
234 prtType = undefined;
235 if (pmom.dot(step) > 0.) {
236 endPer = m_extrapolator->extrapolateDirectly(ctx,
237 *inpPer, surfEnd, alongMomentum, true, pion).release();
238 } else {
239 endPer = m_extrapolator->extrapolateDirectly(ctx,
240 *inpPer, surfEnd, oppositeMomentum, true, pion).release();
241 }
242 return endPer;
243 }
244 pntOnTrk = dynamic_cast<const TrackParameters*>(
245 state.m_trkControl.at(TrkID).TrkPnt);
246 if (pntOnTrk == nullptr){
247 return endPer;
248 }
249 prtType = pion; // Pion hypothesis is always used for extrapolation
250 // Redefinition of starting point for extrapolation
251 iniPoint = pntOnTrk->position();
252 step = (*endPoint) - iniPoint;
253
254 //
255 // Extrapolation for first measured point strategy. Start from it and
256 // always add material
257 //
258 if( Strategy == 0) {
260 if (pmom.dot(step) < 0) {
262 }
263 endPer = m_extrapolator->extrapolate(
264 ctx, *pntOnTrk, surfEnd, dir, true, prtType, addNoise).release();
265 return endPer;
266 }
267 //
268 // Extrapolation for any measured point
269 //
270 if (Strategy == 1) {
273 if (pmom.dot(step) < 0) {
275 mmode = removeNoise;
276 }
277 endPer = m_extrapolator->extrapolate(
278 ctx, *pntOnTrk, surfEnd, dir, true, prtType, mmode).release();
279 return endPer;
280 }
281 //
282 // Extrapolation for perigee and B-hit
283 //
284 if (Strategy == 2) {
285 double Border = 25.;
286 bool dirPositive = true;
287 if (pmom.dot(step) < 0.)
288 dirPositive = false;
289 if ((*endPoint).perp() > Border && iniPoint.perp() > Border) {
290 if (dirPositive) {
291 endPer = m_extrapolator->extrapolate(
292 ctx, *pntOnTrk, surfEnd, alongMomentum, true, prtType, addNoise).release();
293 } else {
294 endPer = m_extrapolator->extrapolate(ctx,
295 *pntOnTrk,
296 surfEnd,
298 true,
299 prtType,
300 removeNoise).release();
301 }
302 return endPer;
303 }
304 if ((*endPoint).perp() < Border && iniPoint.perp() < Border) {
305 if (dirPositive) {
306 endPer = m_extrapolator->extrapolate(ctx,
307 *pntOnTrk,
308 surfEnd,
310 true,
311 prtType,
312 removeNoise).release();
313 } else {
314 endPer = m_extrapolator->extrapolate(ctx,
315 *pntOnTrk,
316 surfEnd,
318 true,
319 prtType,
320 addNoise).release();
321 }
322 return endPer;
323 }
324 Amg::Transform3D trnsf;
325 trnsf.setIdentity();
326 CylinderSurface surfBorder(trnsf, Border, 3000.);
327 if (iniPoint.perp() < Border) {
328 tmpPer = m_extrapolator->extrapolate(ctx,
329 *pntOnTrk,
330 surfBorder,
332 true,
333 prtType,
334 removeNoise).release();
335 if (tmpPer == nullptr) {
336 return nullptr;
337 }
338 endPer = m_extrapolator->extrapolate(
339 ctx, *tmpPer, surfEnd, alongMomentum, true, prtType, addNoise).release();
340 } else {
341 endPer = m_extrapolator->extrapolate(
342 ctx, *pntOnTrk, surfEnd, oppositeMomentum, true, prtType, addNoise).release();
343 return endPer;
344 }
345 delete tmpPer;
346 return endPer;
347 }
348 return endPer;
349 }
Eigen::Affine3d Transform3D

◆ myxAODFstPntOnTrk()

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

Definition at line 439 of file VKalExtPropagator.cxx.

440 {
441 static const SG::ConstAccessor<float> radiusOfFirstHitAcc ("radiusOfFirstHit");
442 if(!radiusOfFirstHitAcc.isAvailable (*xprt)) return nullptr; // No radiusOfFirstHit on track
443
444 const EventContext& ctx = Gaudi::Hive::currentContext();
445 const Trk::Perigee* mPer = &(xprt->perigeeParameters());
446 Amg::Transform3D trnsf;
447 trnsf.setIdentity();
448 CylinderSurface surfacePntOnTrk( trnsf, xprt->radiusOfFirstHit(), 20000.);
449 ParticleHypothesis prtType = pion;
450
451 const TrackParameters *hitOnTrk =
452 m_extrapolator->extrapolate(ctx,
453 *mPer,
454 surfacePntOnTrk,
456 true, prtType, removeNoise).release();
457//std::cout<<" Radius="<<xprt->radiusOfFirstHit()<<" extrap="<<hitOnTrk<<'\n';
458 if(hitOnTrk==nullptr)hitOnTrk=m_extrapolator->extrapolateDirectly(ctx,
459 *mPer,
460 surfacePntOnTrk,
462 true, prtType).release();
463 if(hitOnTrk==nullptr)return nullptr;
464
465 //convert result to Perigee
466 PerigeeSurface surfacePerigee( hitOnTrk->position() );
467 const TrackParameters *hitOnTrkPerig = m_extrapolator->extrapolate(ctx,
468 *hitOnTrk,
469 surfacePerigee).release();
470 delete hitOnTrk; // Delete temporary results
471 if(hitOnTrkPerig==nullptr)return nullptr;
472//std::cout<<" perig="<<(*hitOnTrkPerig)<<'\n';
473 return dynamic_cast<const Perigee* > (hitOnTrkPerig);
474 }
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,
double * ParOld,
double * CovOld,
double * RefStart,
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::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 inpPer; return;
149 }
150
151 if((*CovMtx)(0,0)<=0. || (*CovMtx)(1,1)<=0.){ //protection against bad error matrix
152 ParNew[0]=0.; ParNew[1]=0.;ParNew[2]=0.;ParNew[3]=0.;ParNew[4]=0.;
153 delete inpPer; delete endPer;
154 return;
155 }
156 double CovVertTrk[15];
157 long int locCharge=Charge;
158 CovVertTrk[ 0] =(*CovMtx)(0,0);
159 CovVertTrk[ 1] =(*CovMtx)(1,0);
160 CovVertTrk[ 2] =(*CovMtx)(1,1);
161 CovVertTrk[ 3] =(*CovMtx)(2,0);
162 CovVertTrk[ 4] =(*CovMtx)(2,1);
163 CovVertTrk[ 5] =(*CovMtx)(2,2);
164 CovVertTrk[ 6] =(*CovMtx)(3,0);
165 CovVertTrk[ 7] =(*CovMtx)(3,1);
166 CovVertTrk[ 8] =(*CovMtx)(3,2);
167 CovVertTrk[ 9] =(*CovMtx)(3,3);
168 CovVertTrk[10] =(*CovMtx)(4,0);
169 CovVertTrk[11] =(*CovMtx)(4,1);
170 CovVertTrk[12] =(*CovMtx)(4,2);
171 CovVertTrk[13] =(*CovMtx)(4,3);
172 CovVertTrk[14] =(*CovMtx)(4,4);
173//std::cout<<" extrapPoint="<<endPer->position().x()<<", "<<endPer->position().y()<<", "<<endPer->position().y()<<'\n';
174//std::cout<<" extrapCov="<<(*CovMtx)(0,0)<<", "<<(*CovMtx)(1,1)<<", "<<(*CovMtx)(2,2)<<
175// ", "<<(*CovMtx)(3,3)<<", "<<(*CovMtx)(4,4)<<'\n';
176
177 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
178 if(fabs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
179 if(CovNew != nullptr) {
180 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
181 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
182 locCharge, &ParNew[0] , &CovNew[0]);
183 }else{
184 double CovVertTrkTmp[15];
185 m_vkalFitSvc->VKalTransform( effectiveBMAG, VectPerig(0), VectPerig(1),
186 VectPerig(2), VectPerig(3), VectPerig(4), CovVertTrk,
187 locCharge, &ParNew[0] , CovVertTrkTmp);
188 }
189 delete inpPer; delete endPer;
190 }
#define AmgSymMatrix(dim)
#define AmgVector(rows)
if(febId1==febId2)
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: