ATLAS Offline Software
Loading...
Searching...
No Matches
Propagator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Creates interface vkalPropagator object which contains pointers to real
6// propagators ( external or internal)
7//
8// Single myPropagator object of vkalPropagator type is created in CFit.cxx
9//------------------------------------------------------------------------
10// Header include
12
13#include <cmath>
14
20//-------------------------------------------------
21
22namespace {
23// anonymous namespace for keeping internal
24// implementation methods
25// So as to have internal linkage
26// no symbols exported
27using namespace Trk;
28
29//-------------------------------------------------------------------------
30// Simple propagator in constant field
31// Due to a translation invariance propagation is done in relative coordinates
32// assuming that starting point is (0,0,0)
33//
34void PropagateSTD(long int /*TrkID*/, long int Charge,
35 const double *ParOld, const double *CovOld,
36 const double *RefStart, const double *RefEnd,
37 double *ParNew, double *CovNew,
38 const VKalVrtControlBase *CONTROL) {
39 double Way, closePoint[3], Goal[3];
40 Goal[0] = RefEnd[0] - RefStart[0];
41 Goal[1] = RefEnd[1] - RefStart[1];
42 Goal[2] = RefEnd[2] - RefStart[2];
43 cfnewp(Charge, ParOld, &Goal[0], &Way, ParNew, closePoint);
44 if (CovOld != nullptr)
45 cferpr(Charge, ParOld, &Goal[0], Way, CovOld, CovNew);
46 if (Charge ==
47 0) { // Correction for different magnetic field values in Ini and End
48 double vBx, vBy, vBz, vBzn;
49 Trk::vkalMagFld::getMagFld(RefStart[0], RefStart[1], RefStart[2], vBx, vBy,
50 vBz, CONTROL);
51 Trk::vkalMagFld::getMagFld(RefEnd[0], RefEnd[1], RefEnd[2], vBx, vBy, vBzn,
52 CONTROL);
53 double Corr = vBzn / vBz;
54 ParNew[4] *= Corr;
55 if (CovOld != nullptr) {
56 CovNew[10] *= Corr;
57 CovNew[11] *= Corr;
58 CovNew[12] *= Corr;
59 CovNew[13] *= Corr;
60 CovNew[14] *= Corr * Corr;
61 }
62 }
63}
64
65//--------------------------------------------------------------------------------
66// Runge-Kutta propagator in nonuniform field
67//
68void PropagateRKM(long int Charge,
69 const double *ParOld, const double *CovOld,
70 const double *RefStart, const double *RefEnd,
71 double *ParNew, double *CovNew,
72 VKalVrtControlBase *CONTROL){
73 double Way;
74 double closePoint[3], Goal[3];
75 Goal[0] = RefEnd[0] - RefStart[0];
76 Goal[1] = RefEnd[1] - RefStart[1];
77 Goal[2] = RefEnd[2] - RefStart[2];
78 cfnewp(Charge, ParOld, &Goal[0], &Way, ParNew, closePoint);
79 if (CovOld != nullptr)
80 cferpr(Charge, ParOld, &Goal[0], Way, CovOld, CovNew);
81
82 if (Charge != 0)
83 cfnewpm(ParOld, RefStart, RefEnd, Way, ParNew, closePoint, CONTROL);
84
85 if (Charge ==
86 0) { // Correction for different magnetic field values in Ini and End
87 double vBx, vBy, vBz, vBzn;
88 Trk::vkalMagFld::getMagFld(RefStart[0], RefStart[1], RefStart[2], vBx, vBy,
89 vBz, CONTROL);
90 Trk::vkalMagFld::getMagFld(RefEnd[0], RefEnd[1], RefEnd[2], vBx, vBy, vBzn,
91 CONTROL);
92 double Corr = vBzn / vBz;
93 ParNew[4] *= Corr;
94 if (CovOld != nullptr) {
95 CovNew[10] *= Corr;
96 CovNew[11] *= Corr;
97 CovNew[12] *= Corr;
98 CovNew[13] *= Corr;
99 CovNew[14] *= Corr * Corr;
100 }
101 }
102}
103
104} // namespace
105
106namespace Trk {
107
111
112bool vkalPropagator::checkTarget(const double *) {
113 // if ( m_typePropagator == 3 ) return vk_objectProp->checkTarget(RefNew);
114 return true;
115}
116//------------------------------------------------------------------------
117// Old propagator functions:
118// CFNEWP - doesn't use magnetic field at all. Only track curvature.
119// So it's symmetric for back and forward propagation
120// CFNEWPM - use exact nonuniform magnetic field so is not symmetric.
121// Used for forward propagation (0,0,0) -> REF.
122// Returns perigee parameters with respect to REF
123// (then in new reference system with center at REF!!!)
124//
125// Usually all package routines propagate from (0,0,0) to REF.
126// Only XYZTRP propagates from REF to (0,0,0) and then uses BACKPROPAGATION
127// Propagation now is done from RefStart point to RefEnd point
128// A final position after propagation is PERIGEE assuming that a REF(target)
129// is a CENTER OF NEW COORDINATE SYSTEM with axes parallel to initial ones
130
131void vkalPropagator::Propagate(long int TrkID, long int Charge, const double *ParOld,
132 const double *CovOld, const double *RefOld, double *RefNew,
133 double *ParNew, double *CovNew,
134 VKalVrtControlBase *FitControl) {
135 if (RefOld[0] == RefNew[0] && RefOld[1] == RefNew[1] &&
136 RefOld[2] == RefNew[2]) {
137 std::copy(ParOld, ParOld + 5, ParNew);
138 if (CovOld != nullptr) {
139 std::copy(CovOld, CovOld + 15, CovNew);
140 }
141 return;
142 }
143 //
144 //-- Propagation itself
145 //
146 if (FitControl == nullptr ||
147 (FitControl->vk_objProp == nullptr &&
148 FitControl->vk_funcProp ==
149 nullptr)) { // No external propagators, use internal ones
150 // std::cout<<" Core: use INTERNAL propagator. Charge="<<Charge<<'\n';
152 PropagateRKM(Charge, ParOld, CovOld, RefOld, RefNew, ParNew, CovNew,
153 FitControl);
154 } else {
155 PropagateSTD(TrkID, Charge, ParOld, CovOld, RefOld, RefNew, ParNew,
156 CovNew, FitControl);
157 }
158 return;
159 }
160
161 if (FitControl->vk_objProp) {
162 // std::cout<<" Core: use EXTERNAL propagator. Charge="<<Charge<<'\n';
163 if (Charge == 0) {
164 PropagateSTD(TrkID, Charge, ParOld, CovOld, RefOld, RefNew, ParNew,
165 CovNew, FitControl);
166 } else {
167 FitControl->vk_objProp->Propagate(TrkID, Charge, ParOld, CovOld, RefOld,
168 RefNew, ParNew, CovNew,
169 *FitControl->vk_istate);
170 if (ParNew[0] == 0. && ParNew[1] == 0. && ParNew[2] == 0. &&
171 ParNew[3] == 0. && ParNew[4] == 0.) {
172 PropagateRKM(Charge, ParOld, CovOld, RefOld, RefNew, ParNew, CovNew,
173 FitControl);
174 }
175 }
176 return;
177 }
178 //-------------------
179 if (FitControl->vk_funcProp) {
180 FitControl->vk_funcProp(TrkID, Charge, ParOld, CovOld, RefOld, RefNew,
181 ParNew, CovNew);
182 return;
183 }
184 //-------------------
185}
186
187void vkalPropagator::Propagate(VKTrack *trk, const double *RefOld, const double *RefNew,
188 double *ParNew, double *CovNew,
189 VKalVrtControlBase *FitControl) {
190 if (RefOld[0] == RefNew[0] && RefOld[1] == RefNew[1] &&
191 RefOld[2] == RefNew[2]) {
192 std::copy(trk->refPerig, trk->refPerig + 5, ParNew);
193 std::copy(trk->refCovar, trk->refCovar + 15, CovNew);
194 return;
195 }
196 long int TrkID = trk->Id;
197 long int Charge = trk->Charge;
198 //
199 //-- Propagation itself
200 //
201 if (FitControl == nullptr ||
202 (FitControl->vk_objProp == nullptr &&
203 FitControl->vk_funcProp ==
204 nullptr)) { // No external propagators, use internal ones
206 PropagateRKM(Charge, trk->refPerig, trk->refCovar, RefOld, RefNew, ParNew,
207 CovNew, FitControl);
208 } else {
209 PropagateSTD(TrkID, Charge, trk->refPerig, trk->refCovar, RefOld, RefNew,
210 ParNew, CovNew, FitControl);
211 }
212 return;
213 }
214
215 if (FitControl->vk_objProp) {
216 if (Charge == 0) {
217 PropagateSTD(TrkID, Charge, trk->refPerig, trk->refCovar, RefOld, RefNew,
218 ParNew, CovNew, FitControl);
219 } else {
220 FitControl->vk_objProp->Propagate(TrkID, Charge, trk->refPerig,
221 trk->refCovar, RefOld, RefNew, ParNew,
222 CovNew, *FitControl->vk_istate);
223 if (ParNew[0] == 0. && ParNew[1] == 0. && ParNew[2] == 0. &&
224 ParNew[3] == 0. && ParNew[4] == 0.) {
225 PropagateRKM(Charge, trk->refPerig, trk->refCovar, RefOld, RefNew,
226 ParNew, CovNew, FitControl);
227 }
228 }
229 return;
230 }
231 //-------------------
232 if (FitControl->vk_funcProp) {
233 FitControl->vk_funcProp(TrkID, Charge, trk->refPerig, trk->refCovar, RefOld,
234 RefNew, ParNew, CovNew);
235 return;
236 }
237}
238
239} // namespace Trk
240
#define vkalUseRKMPropagator
Definition Propagator.h:18
double refCovar[15]
const basePropagator * vk_objProp
const addrPropagator vk_funcProp
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 =0
virtual ~basePropagator()
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
static void Propagate(long int TrkID, long int Charge, const double *ParOld, const double *CovOld, const double *RefOld, double *RefNew, double *ParNew, double *CovNew, VKalVrtControlBase *FitControl=0)
static bool checkTarget(const double *RefEnd)
Ensure that the ATLAS eigen extensions are properly loaded.
void cferpr(const long int ich, const double *par, const double *ref, const double s0, const double *errold, double *errnew)
Definition cfErPr.cxx:12
void cfnewpm(const double *par, const double *xyzStart, const double *xyzEnd, const double ustep, double *parn, double *closePoint, const VKalVrtControlBase *CONTROL)
Definition cfNewPm.cxx:16
void cfnewp(const long int ich, const double *parold, const double *ref, double *s, double *parnew, double *per)
Definition cfNewP.cxx:10