30 double tmp_refFrameX = 0, tmp_refFrameY = 0, tmp_refFrameZ = 0;
44 for (
const auto& mPer : InpPerigee) {
45 if( mPer ==
nullptr ){
continue; }
55 tmp_refFrameX += perGlobalPos.x() ;
56 tmp_refFrameY += perGlobalPos.y() ;
57 tmp_refFrameZ += perGlobalPos.z() ;
76 if(
counter == 0)
return StatusCode::FAILURE;
86 double fx = 0., fy = 0., fz = 0.;
87 for (
const auto& mPer : InpPerigee) {
88 if(mPer ==
nullptr){
continue; }
89 AmgVector(5) VectPerig = mPer->parameters();
93 Amg::Vector3D perGlobalVrt = mPer->associatedSurface().center();
103 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
105 double CovVertTrk[15];
108 if(!
convertAmg5SymMtx(mPer->covariance(), CovVertTrk))
return StatusCode::FAILURE;
110 static_cast<double>(VectPerig(0)),
111 static_cast<double>(VectPerig(1)),
112 static_cast<double>(VectPerig(2)),
113 static_cast<double>(VectPerig(3)),
114 static_cast<double>(VectPerig(4)),
127 double dX = tmp_refFrameX-perGlobalVrt.x();
128 double dY = tmp_refFrameY-perGlobalVrt.y();
129 double dZ = tmp_refFrameZ-perGlobalVrt.z();
130 if(std::abs(dX)+std::abs(dY)+std::abs(dZ) != 0.) {
131 double pari[5], covi[15];
132 double vrtini[3] = {0.,0.,0.};
133 double vrtend[3] = {dX,dY,dZ};
134 for(
int i=0;
i<5;
i++) pari[
i] = state.
m_apar[ntrk][
i];
135 for(
int i=0;
i<15;
i++) covi[
i] = state.
m_awgt[ntrk][
i];
136 long int Charge = (
long int) mPer->charge();
137 long int TrkID = ntrk;
139 vrtini, vrtend, &state.
m_apar[ntrk][0],
145 if(ntrk>=
NTrMaxVFit)
return StatusCode::FAILURE;
156 return StatusCode::SUCCESS;
159 std::unique_ptr<Perigee>
161 const std::vector<double>& VKCov,
164 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
172 std::unique_ptr<Perigee>
174 const std::vector<double>& VKPerigee,
175 const std::vector<double>& VKCov,
180 double fx = 0., fy = 0., fz = 0.;
183 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
185 double TrkP3 = 0., TrkP4 = 0., TrkP5 = 0.;
186 VKalToTrkTrack(effectiveBMAG, VKPerigee[2], VKPerigee[3], VKPerigee[4],
187 TrkP3, TrkP4, TrkP5);
188 double TrkP1 = -VKPerigee[0];
189 double TrkP2 = VKPerigee[1];
193 double Deriv[5][5],CovMtxOld[5][5];
194 for(
int i=0;
i<5;
i++){
195 for(
int j=0; j<5; j++){
204 Deriv[4][2] = (
std::cos(VKPerigee[2])/(
m_CNVMAG*effectiveBMAG)) * VKPerigee[4];
207 CovMtxOld[0][0] = VKCov[0];
208 CovMtxOld[0][1] = CovMtxOld[1][0] = VKCov[1];
209 CovMtxOld[1][1] = VKCov[2];
210 CovMtxOld[0][2] = CovMtxOld[2][0] = VKCov[3];
211 CovMtxOld[1][2] = CovMtxOld[2][1] = VKCov[4];
212 CovMtxOld[2][2] = VKCov[5];
213 CovMtxOld[0][3] = CovMtxOld[3][0] = VKCov[6];
214 CovMtxOld[1][3] = CovMtxOld[3][1] = VKCov[7];
215 CovMtxOld[2][3] = CovMtxOld[3][2] = VKCov[8];
216 CovMtxOld[3][3] = VKCov[9];
217 CovMtxOld[0][4] = CovMtxOld[4][0] = VKCov[10];
218 CovMtxOld[1][4] = CovMtxOld[4][1] = VKCov[11];
219 CovMtxOld[2][4] = CovMtxOld[4][2] = VKCov[12];
220 CovMtxOld[3][4] = CovMtxOld[4][3] = VKCov[13];
221 CovMtxOld[4][4] = VKCov[14];
223 for(
int i=0;
i<5;
i++){
224 for(
int j=
i; j<5; j++){
226 for(
int ik=4; ik>=0; ik--){
227 if(Deriv[
i][ik]==0.)
continue;
228 for(
int jk=4; jk>=0; jk--){
229 if(Deriv[j][jk]==0.)
continue;
230 tmp += Deriv[
i][ik]*CovMtxOld[ik][jk]*Deriv[j][jk];
233 CovMtx(
i,j) = CovMtx(j,
i)=
tmp;
241 return std::make_unique<Perigee>(TrkP1, TrkP2, TrkP3, TrkP4, TrkP5,