ATLAS Offline Software
Loading...
Searching...
No Matches
TrkVKalVrtCoreBase.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#include <algorithm>
6#include <cmath>
7#include <memory>
8#include <iostream>
9
15
16namespace Trk {
17
24
26 const basePropagator* baseP, const addrPropagator addrP,
27 IVKalState* istate):
28 vk_objMagFld(baseFld),
29 vk_funcMagFld(addrFld),
30 vk_objProp(baseP),
31 vk_funcProp(addrP),
32 vk_istate(istate)
33 {}
34
55
56 VKTrack::VKTrack(long int iniId,
57 const double Perigee[],
58 const double Covariance[],
59 VKVertex* vk,
60 double m)
61 : Id(iniId)
62 , Charge(1)
63 , Chi2(0)
64 , m_mass(m)
65 {
66 if (Perigee[4] < 0)
67 Charge = -1;
68 for (int i = 0; i < 3; i++) {
69 fitP[i] = 0;
70 cnstP[i] = 0.;
71 iniP[i] = 0.;}
72 std::copy(Perigee, Perigee+5, Perig);
73 std::copy(Perigee, Perigee+5, refPerig);
74 for(int i=0; i<5; i++) { rmnd[i]=0;}
75 std::copy(Covariance, Covariance+15, refCovar);
76 m_originVertex = vk;
77 }
78
79 void VKTrack::setCurrent(const double Perigee[], const double Weight[])
80 {
81 std::copy(Perigee, Perigee+5, Perig);
82 std::copy(Weight, Weight+15, WgtM);
83 std::copy(Weight, Weight+15, WgtM_save);
84 }
85 void VKTrack::setReference(const double Perigee[], const double Covariance[])
86 {
87 std::copy(Perigee, Perigee+5, refPerig);
88 std::copy(Covariance, Covariance+15, refCovar);
89 }
91 {
92 std::copy(WgtM_save, WgtM_save+15, WgtM);
93 }
94
95// VKTrack::VKTrack(const VKTrack & src ) // copy operator
96// { Charge =src.Charge;
97// m_mass =src.m_mass;
98// for(int i=0; i<5; i++) {Perig[i]=src.Perig[i];refPerig[i]=src.refPerig[i];}
99// for(int i=0; i<15; i++) {refCovar[i]=src.refCovar[i];WgtM[i]=src.WgtM[i];}
100// for(int i=0; i<3; i++) {fitP[i]=src.fitP[i];}
101// }
102
103 std::ostream & operator << ( std::ostream& out, const VKTrack& track )
104 {
105 //out.setf( std::ios::defaultfloat ); out.precision(5); out << std::endl;
106 out.precision(5); out << std::defaultfloat;
107 out << " Track par: Iteration <-> Ref" << std::endl;
108 out << " * a_0 : "<< track.a0() <<" "<< track.r_a0() << std::endl;
109 out << " * z_0 : "<< track.z() <<" "<< track.r_z() << std::endl;
110 out << " * theta : "<< track.theta()<<" "<< track.r_theta()<< std::endl;
111 out << " * phi : "<< track.phi() <<" "<< track.r_phi() << std::endl;
112 out << " * q/R : "<< track.invR() <<" "<< track.r_invR() << std::endl;
113 out << " * Charge: "<< track.Charge <<" Mass: "<<track.m_mass<< std::endl;
114 out << "-> with ref ErrorMatrix: " << std::endl;out.precision(5);
115 out << track.refCovar[0] <<std::endl;
116 out << track.refCovar[1] <<", "<<track.refCovar[2] <<std::endl;
117 out << track.refCovar[3] <<", "<<track.refCovar[4] <<", "<<track.refCovar[5] <<std::endl;
118 out << track.refCovar[6] <<", "<<track.refCovar[7] <<", "<<track.refCovar[8] <<", "
119 << track.refCovar[9]<<std::endl;
120 out << track.refCovar[10]<<", "<<track.refCovar[11]<<", "<<track.refCovar[12]<<", "
121 << track.refCovar[13]<<", "<<track.refCovar[14]<<std::endl;
122 out << "-> and iteration WeightMatrix: " << std::endl;
123 out << track.WgtM[0] <<std::endl;
124 out << track.WgtM[1] <<", "<<track.WgtM[2] <<std::endl;
125 out << track.WgtM[3] <<", "<<track.WgtM[4] <<", "<<track.WgtM[5] <<std::endl;
126 out << track.WgtM[6] <<", "<<track.WgtM[7] <<", "<<track.WgtM[8] <<", "
127 << track.WgtM[9]<<std::endl;
128 out << track.WgtM[10]<<", "<<track.WgtM[11]<<", "<<track.WgtM[12]<<", "
129 << track.WgtM[13]<<", "<<track.WgtM[14]<<std::endl;
130 return out;
131 }
132
133
134
135 // cppcheck-suppress uninitMemberVar; large ader array not initialized
137 { vk_fitterControl = std::make_unique<VKalVrtControl>(FitControl); }
138
139 // cppcheck-suppress uninitMemberVar; large ader array not initialized
143 {
144 for(int i=0; i<3; i++) apriorV[i]=refV[i]=iniV[i]=fitV[i]=cnstV[i]=fitMom[i]=0.;
145 for(int i=0; i<6; i++) apriorVWGT[i]=0.;
146 for(int i=0; i<21; i++) fitCovXYZMom[i]=savedVrtMomCov[i]=0.;
149 Chi2=0.;
150 truncatedStep=false;
151 existFullCov=0;
152 }
153
154 VKVertex::~VKVertex() = default;
155
156 void VKVertex::setRefV(double v[3]) noexcept { std::copy(v, v+3, refV);}
157 void VKVertex::setRefIterV(double v[]) noexcept { std::copy(v, v+3, refIterV); }
158 void VKVertex::setIniV(double v[3]) noexcept { std::copy(v, v+3, iniV); }
159 void VKVertex::setFitV(double v[3]) noexcept { std::copy(v, v+3, fitV); }
160 void VKVertex::setCnstV(double v[3]) noexcept { std::copy(v, v+3, cnstV);}
161
162
163 VKVertex::VKVertex(const VKVertex & src): //copy constructor
164 Chi2(src.Chi2), // vertex Chi2
165 useApriorVertex(src.useApriorVertex), //for a priory vertex position knowledge usage
166 passNearVertex(src.passNearVertex), // needed for "passing near vertex" constraint
167 passWithTrkCov(src.passWithTrkCov), // Vertex, CovVertex, Charge and derivatives
168 FVC(src.FVC),
169 TrackList(0),
171 {
172 for( int i=0; i<6; i++) {
173 fitVcov[i] =src.fitVcov[i]; // range[0:5]
174 apriorVWGT[i] =src.apriorVWGT[i];
175 if(i>=3) continue;
176 fitV[i] =src.fitV[i]; // range[0:2]
177 iniV[i] =src.iniV[i];
178 cnstV[i] =src.cnstV[i];
179 refIterV[i]=src.refIterV[i];
180 refV[i] =src.refV[i];
181 apriorV[i] =src.apriorV[i];
182 fitMom[i] = src.fitMom[i];
183 }
184 for( int i=0; i<21; i++){
185 savedVrtMomCov[i]=src.savedVrtMomCov[i];
186 fitCovXYZMom[i]=src.fitCovXYZMom[i];
187 }
188 nextCascadeVrt = nullptr;
189 truncatedStep = src.truncatedStep;
190 existFullCov = src.existFullCov;
191
192 int NTrack=src.TrackList.size();
193 int FULLSIZE=3*vkalNTrkM+3;
194 int SIZE=3*NTrack+3;
195 for(int i=0; i<SIZE; i++) for(int j=0; j<SIZE; j++) { ader[i*FULLSIZE+j]=src.ader[i*FULLSIZE+j]; }
196 //----- Creation of track and constraint copies
197 for( int i=0; i<NTrack; i++) TrackList.emplace_back( new VKTrack(*(src.TrackList[i])) );
198 ConstraintList.reserve(src.ConstraintList.size());
199 for( int ic=0; ic<(int)src.ConstraintList.size(); ic++){
200 ConstraintList.emplace_back(src.ConstraintList[ic]->clone());
201 }
202 vk_fitterControl = std::make_unique<VKalVrtControl>(*src.vk_fitterControl);
203 }
204
205 VKVertex& VKVertex::operator= (const VKVertex & src) //Assignment operator
206 {
207 if (this!=&src){
208 vk_fitterControl.reset();
209 vk_fitterControl=std::make_unique<VKalVrtControl>(*(src.vk_fitterControl));
210 Chi2=src.Chi2; // vertex Chi2
211 useApriorVertex=src.useApriorVertex; //for a priory vertex position knowledge usage
212 passNearVertex=src.passNearVertex; // needed for "passing near vertex" constraint
213 passWithTrkCov=src.passWithTrkCov; // Vertex, CovVertex, Charge and derivatives
214 FVC=src.FVC;
215 for( int i=0; i<6; i++) {
216 fitVcov[i] =src.fitVcov[i]; // range[0:5]
217 apriorVWGT[i] =src.apriorVWGT[i];
218 if(i>=3) continue;
219 fitV[i] =src.fitV[i]; // range[0:2]
220 iniV[i] =src.iniV[i];
221 cnstV[i] =src.cnstV[i];
222 refIterV[i]=src.refIterV[i];
223 refV[i] =src.refV[i];
224 apriorV[i] =src.apriorV[i];
225 fitMom[i] = src.fitMom[i];
226 }
227 for( int i=0; i<21; i++){
228 savedVrtMomCov[i]=src.savedVrtMomCov[i];
229 fitCovXYZMom[i]=src.fitCovXYZMom[i];
230 }
231 nextCascadeVrt = nullptr;
232 truncatedStep = src.truncatedStep;
233 existFullCov = src.existFullCov;
234
235 int NTrack=src.TrackList.size();
236 int FULLSIZE=3*vkalNTrkM+3;
237 int SIZE=3*NTrack+3;
238 for(int i=0; i<SIZE; i++) for(int j=0; j<SIZE; j++) { ader[i*FULLSIZE+j]=src.ader[i*FULLSIZE+j]; }
239 //----- Creation of track and constraint copies
240 TrackList.clear();
241 tmpArr.clear();
242 ConstraintList.clear();
243 for( int i=0; i<NTrack; i++) TrackList.emplace_back( new VKTrack(*(src.TrackList[i])) );
244 ConstraintList.reserve(src.ConstraintList.size());
245 for( int ic=0; ic<(int)src.ConstraintList.size(); ic++){
246 ConstraintList.emplace_back(src.ConstraintList[ic]->clone());
247 }
248
249 std::copy (std::begin(src.T), std::end(src.T), std::begin(T));
250 std::copy (std::begin(src.wa), std::end(src.wa), std::begin(wa));
251 std::copy (std::begin(src.dxyz0), std::end(src.dxyz0), std::begin(dxyz0));
252 }
253 return *this;
254 }
255
256
258 {
259 if (Iter<3) Iter=3;
260 if (Iter>100) Iter=100;
261 vk_forcft.IterationNumber = Iter;
262 }
263
265 {
266 if (Prec<1.e-5) Prec=1.e-5;
267 if (Prec>1.e-1) Prec=1.e-1;
268 vk_forcft.IterationPrecision = Prec;
269 }
270
272 {
273 if (Scale<0.01) Scale=0.01;
274 if (Scale>100.) Scale=100.;
275 vk_forcft.RobustScale = Scale;
276 }
277
279 {
280 if (Rob<0) Rob=0;
281 if (Rob>7) Rob=7;
282 vk_forcft.irob = Rob;
283 }
284 void VKalVrtControl::setMassCnstData(int Ntrk, double Mass){ // Define global mass constraint. It must be first
285 double sumM(0.);
286 for(int it=0; it<Ntrk; it++) sumM += vk_forcft.wm[it]; //sum of particle masses
287 if(sumM<Mass) {
288 vk_forcft.wmfit[0]=Mass;
289 for(int it=0; it<Ntrk; it++) vk_forcft.indtrkmc[0][it]=1; //Set participating particles
290 vk_forcft.nmcnst=1;
291 }
292 vk_forcft.useMassCnst = 1;
293 }
294 void VKalVrtControl::setMassCnstData(int NtrkTot, const std::vector<int> & Index, double Mass){
295 double sumM(0.);
296 int Ntrk=std::min((int)Index.size(),NtrkTot);
297 for(int it=0; it<Ntrk; it++) sumM += vk_forcft.wm[Index[it]]; //sum of particle masses
298 if(sumM<Mass) {
299 vk_forcft.wmfit[vk_forcft.nmcnst]=Mass;
300 for(int it=0; it<Ntrk; it++) vk_forcft.indtrkmc[vk_forcft.nmcnst][Index[it]-1]=1; //Set participating particles
301 vk_forcft.nmcnst++;
302 }
303 vk_forcft.useMassCnst = 1;
304 }
305
306 void VKalVrtControl::setUsePhiCnst() { vk_forcft.usePhiCnst = 1;}
307 void VKalVrtControl::setUsePlaneCnst(double a, double b, double c, double d) {
308 if(a+b+c+d == 0.){ vk_forcft.usePlaneCnst = 0;
309 }else{ vk_forcft.usePlaneCnst = 1; }
310 vk_forcft.Ap = a; vk_forcft.Bp = b; vk_forcft.Cp = c; vk_forcft.Dp = d;
311 }
312 void VKalVrtControl::setUseRadiusCnst(double R, double RefP[2]) {
313 if(R == 0.){ vk_forcft.useRadiusCnst = 0;
314 }else{ vk_forcft.useRadiusCnst = 1; }
315 vk_forcft.RC = R;
316 vk_forcft.radiusRefP[0]=RefP[0];
317 vk_forcft.radiusRefP[1]=RefP[1];
318 }
319 void VKalVrtControl::setUseThetaCnst() { vk_forcft.useThetaCnst = 1;}
320 void VKalVrtControl::setUseAprioriVrt(){ vk_forcft.useAprioriVrt = 1;}
321 void VKalVrtControl::setUsePointingCnst(int iType = 1 ) { vk_forcft.usePointingCnst = iType<2 ? 1 : 2 ;}
322 void VKalVrtControl::setUsePassNear(int iType = 1 ) { vk_forcft.usePassNear = iType<2 ? 1 : 2 ;}
327 void VKalVrtControl::renewFullCovariance(double * newarray) {
328 m_fullCovariance.reset(newarray);
329 }
330
331} /* End of namespace */
#define vkalNTrkM
Definition CommonPars.h:22
IndexedConstituentUserInfo::Index Index
static Double_t a
std::vector< int > matrixPnt
std::unique_ptr< double[]> fullCovMatrix
std::vector< std::unique_ptr< VKVertex > > cascadeVertexList
double WgtM_save[15]
double refCovar[15]
void setReference(const double[], const double[])
void setCurrent(const double[], const double[])
VKVertex * m_originVertex
VKTrack(long int, const double[], const double[], VKVertex *, double)
double savedVrtMomCov[21]
VKVertex(const VKalVrtControl &)
void setRefIterV(double v[]) noexcept
void setFitV(double v[3]) noexcept
void setCnstV(double v[3]) noexcept
std::vector< VKVertex * > includedVrt
VKVertex & operator=(const VKVertex &src)
void setIniV(double v[3]) noexcept
std::vector< std::unique_ptr< VKTrack > > TrackList
double ader[(3 *vkalNTrkM+3) *(3 *vkalNTrkM+3)]
std::vector< std::unique_ptr< VKConstraintBase > > ConstraintList
double fitCovXYZMom[21]
void setRefV(double v[3]) noexcept
std::vector< std::unique_ptr< TWRK > > tmpArr
VKVertex * nextCascadeVrt
std::unique_ptr< VKalVrtControl > vk_fitterControl
const basePropagator * vk_objProp
const addrPropagator vk_funcProp
VKalVrtControlBase(baseMagFld *, const addrMagHandler, const basePropagator *, const addrPropagator, IVKalState *istate=nullptr)
const addrMagHandler vk_funcMagFld
void renewFullCovariance(double *)
void renewCascadeEvent(CascadeEvent *)
void setIterationPrec(double Prec)
void setMassCnstData(int Ntrk, double Mass)
VKalVrtControl(const VKalVrtControlBase &)
void setRobustScale(double Scale)
CascadeEvent * m_cascadeEvent
void setUsePlaneCnst(double a, double b, double c, double d)
void setUseRadiusCnst(double R, double RefP[2])
std::unique_ptr< double[]> m_fullCovariance
void Scale(TH1 *h, double d=1)
std::string base
Definition hcg.cxx:81
Ensure that the ATLAS eigen extensions are properly loaded.
void(* addrMagHandler)(double, double, double, double &, double &, double &)
Definition VKalVrtBMag.h:23
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
MsgStream & operator<<(MsgStream &sl, const AlignModule &alignModule)
overload of << operator for MsgStream for debug output
@ v
Definition ParamDefs.h:78
void(* addrPropagator)(long int, long int, double *, double *, double *, double *, double *, double *)
Definition Propagator.h:23