44 for (
const auto& mPer : InpPerigee) {
45 if( mPer ==
nullptr ){
continue; }
55 tmp_refFrame += perGlobalPos;
72 if(counter == 0)
return StatusCode::FAILURE;
75 tmp_refFrame /= counter;
80 double fx = 0., fy = 0., fz = 0.;
81 for (
const auto& mPer : InpPerigee) {
82 if(mPer ==
nullptr){
continue; }
83 AmgVector(5) VectPerig = mPer->parameters();
87 Amg::Vector3D perGlobalVrt = mPer->associatedSurface().center();
97 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
99 double CovVertTrk[15];
100 std::fill(CovVertTrk,CovVertTrk+15,0.);
102 if(!
convertAmg5SymMtx(mPer->covariance(), CovVertTrk))
return StatusCode::FAILURE;
104 static_cast<double>(VectPerig(0)),
105 static_cast<double>(VectPerig(1)),
106 static_cast<double>(VectPerig(2)),
107 static_cast<double>(VectPerig(3)),
108 static_cast<double>(VectPerig(4)),
122 if(dref != Amg::Vector3D::Zero()) {
123 double pari[5], covi[15];
124 double vrtini[3] = {0.,0.,0.};
125 for(
int i=0; i<5; i++) pari[i] = state.
m_apar[ntrk][i];
126 for(
int i=0; i<15;i++) covi[i] = state.
m_awgt[ntrk][i];
127 long int Charge = (
long int) mPer->charge();
128 long int TrkID = ntrk;
130 vrtini, dref.data(), &state.
m_apar[ntrk][0],
136 if(ntrk>=
NTrMaxVFit)
return StatusCode::FAILURE;
147 return StatusCode::SUCCESS;
152 const std::span<const double, 15> VKCov,
155 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
165 const std::span<const double, 5> VKPerigee,
166 const std::span<const double, 15> VKCov,
170 double fx = 0., fy = 0., fz = 0.;
173 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
175 double TrkP3 = 0., TrkP4 = 0., TrkP5 = 0.;
176 VKalToTrkTrack(effectiveBMAG, VKPerigee[2], VKPerigee[3], VKPerigee[4],
177 TrkP3, TrkP4, TrkP5);
178 double TrkP1 = -VKPerigee[0];
179 double TrkP2 = VKPerigee[1];
183 double Deriv[5][5],CovMtxOld[5][5];
184 for(
int i=0; i<5; i++){
185 for(
int j=0; j<5; j++){
194 Deriv[4][2] = (std::cos(VKPerigee[2])/(
m_CNVMAG*effectiveBMAG)) * VKPerigee[4];
195 Deriv[4][4] = -(std::sin(VKPerigee[2])/(
m_CNVMAG*effectiveBMAG));
197 CovMtxOld[0][0] = VKCov[0];
198 CovMtxOld[0][1] = CovMtxOld[1][0] = VKCov[1];
199 CovMtxOld[1][1] = VKCov[2];
200 CovMtxOld[0][2] = CovMtxOld[2][0] = VKCov[3];
201 CovMtxOld[1][2] = CovMtxOld[2][1] = VKCov[4];
202 CovMtxOld[2][2] = VKCov[5];
203 CovMtxOld[0][3] = CovMtxOld[3][0] = VKCov[6];
204 CovMtxOld[1][3] = CovMtxOld[3][1] = VKCov[7];
205 CovMtxOld[2][3] = CovMtxOld[3][2] = VKCov[8];
206 CovMtxOld[3][3] = VKCov[9];
207 CovMtxOld[0][4] = CovMtxOld[4][0] = VKCov[10];
208 CovMtxOld[1][4] = CovMtxOld[4][1] = VKCov[11];
209 CovMtxOld[2][4] = CovMtxOld[4][2] = VKCov[12];
210 CovMtxOld[3][4] = CovMtxOld[4][3] = VKCov[13];
211 CovMtxOld[4][4] = VKCov[14];
213 for(
int i=0; i<5; i++){
214 for(
int j=i; j<5; j++){
216 for(
int ik=4; ik>=0; ik--){
217 if(Deriv[i][ik]==0.)
continue;
218 for(
int jk=4; jk>=0; jk--){
219 if(Deriv[j][jk]==0.)
continue;
220 tmp += Deriv[i][ik]*CovMtxOld[ik][jk]*Deriv[j][jk];
223 CovMtx(i,j) = CovMtx(j,i)=tmp;
231 return std::make_unique<Perigee>(TrkP1, TrkP2, TrkP3, TrkP4, TrkP5,
void VKalTransform(double MAG, double A0V, double ZV, double PhiV, double ThetaV, double PInv, const double[15], long int &Charge, double[5], double[15]) const
virtual std::unique_ptr< Trk::Perigee > CreatePerigee(const std::span< const double, 5 > VKPerigee, const std::span< const double, 15 > VKCov, IVKalState &istate) const override final
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)
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)