13#include "GaudiKernel/IChronoStatSvc.h"
27 TLorentzVector& Momentum,
31 std::vector< std::vector<double> >& TrkAtVrt,
36 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
44 if(
sc.isFailure())
return StatusCode::FAILURE;
47 Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
48 if (ierr)
return StatusCode::FAILURE;
49 return StatusCode::SUCCESS;
55 const std::vector<const xAOD::NeutralParticle*> & InpTrkN,
57 TLorentzVector& Momentum,
61 std::vector< std::vector<double> >& TrkAtVrt,
66 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
77 std::vector<const TrackParameters*> tmpInputC(0);
78 std::vector<std::unique_ptr<const TrackParameters>> TParamOwner(0);
80 double closestHitR=1.e6;
85 if(msgLvl(MSG::WARNING))
msg()<<
"No InDet extrapolator given."<<
86 "Can't use FirstMeasuredPoint with xAOD::TrackParticle!!!" <<
endmsg;
87 return StatusCode::FAILURE;
89 std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
90 if(msgLvl(MSG::DEBUG))
msg()<<
"Start FirstMeasuredPoint handling"<<
'\n';
91 unsigned int indexFMP;
92 for (i_ntrk = InpTrkC.begin(); i_ntrk < InpTrkC.end(); ++i_ntrk) {
94 if(msgLvl(MSG::DEBUG))
msg()<<
"FirstMeasuredPoint on track is discovered. Use it."<<
'\n';
96 TParamOwner.emplace_back(std::make_unique<CurvilinearParameters>(
97 (*i_ntrk)->curvilinearParameters(indexFMP)));
99 tmpInputC.push_back((TParamOwner.back()).get());
101 if(msgLvl(MSG::DEBUG)){
102 msg()<<
"FirstMeasuredPoint on track is absent."<<
103 "Try extrapolation from Perigee to FisrtMeasuredPoint radius"<<
endmsg;
106 TParamOwner.emplace_back(
m_fitPropagator->myxAODFstPntOnTrk((*i_ntrk)));
108 tmpInputC.push_back((TParamOwner.back()).get());
109 if(tmpInputC[tmpInputC.size()-1]==
nullptr){
111 if(msgLvl(MSG::WARNING)){
112 msg()<<
"InDetExtrapolator can't etrapolate xAOD::TrackParticle Perigee "<<
113 "to FirstMeasuredPoint radius! Stop vertex fit!" <<
endmsg;
115 return StatusCode::FAILURE;
118 if( (*i_ntrk)->radiusOfFirstHit() < closestHitR ) {
119 closestHitR=(*i_ntrk)->radiusOfFirstHit();
124 return StatusCode::FAILURE;
128 if(!InpTrkC.empty()) {
132 if(
sc.isFailure())
return StatusCode::FAILURE;
133 if(!InpTrkN.empty()){
sc=
CvtNeutralParticle(InpTrkN,ntrk,state);
if(
sc.isFailure())
return StatusCode::FAILURE;}
136 if (ierr)
return StatusCode::FAILURE;
142 if(closestHitR==1.e6){
144 for(
auto &trka : InpTrkC){
145 double hitR=trka->radiusOfFirstHit();
146 if(closestHitR>hitR){
151 if(closestHitR<1.e6){
153 if(perFMP) cnstRefPoint=perFMP->position();
160 if(
Vertex.perp()>closestHitR && cnstRefPoint.perp()>0.){
161 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
163 double D= unitMom.x()*(cnstRefPoint.x()-state.
m_refFrameX)
187 if (ierr)
return StatusCode::FAILURE;
188 return StatusCode::SUCCESS;
193 const std::vector<const NeutralParameters*> & InpTrkN,
195 TLorentzVector& Momentum,
199 std::vector< std::vector<double> >& TrkAtVrt,
204 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
212 if(!InpTrkC.empty()){
214 if(
sc.isFailure())
return StatusCode::FAILURE;
216 if(!InpTrkN.empty()){
218 if(
sc.isFailure())
return StatusCode::FAILURE;
228 if (ierr)
return StatusCode::FAILURE;
234 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
236 double pp[3]={Momentum.Px()/Momentum.Rho(),Momentum.Py()/Momentum.Rho(),Momentum.Pz()/Momentum.Rho()};
254 if (ierr)
return StatusCode::FAILURE;
255 return StatusCode::SUCCESS;
268 TLorentzVector& Momentum,
272 std::vector< std::vector<double> >& TrkAtVrt,
281 double xyz0[3],covf[21],chi2f=-10.;
283 double xyzfit[3]={0.};
307 xyz0[0]=xyz0[1]=xyz0[2]=0.;
312 Chi2PerTrk.resize (ntrk);
314 xyzfit, state.
m_parfs, ptot, covf, chi2f,
317 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"VKalVrt fit status="<<ierr<<
" Chi2="<<chi2f<<
endmsg;
323 if(ptot[0]*ptot[0]+ptot[1]*ptot[1] == 0.)
return -5;
329 int SymCovMtxSize=(3*ntrk+3)*(3*ntrk+4)/2;
338 Momentum.SetPxPyPzE( ptot[0], ptot[1], ptot[2], ptot[3] );
339 Chi2 = (double) chi2f;
347 if (
Vertex.perp() > sizeR || std::abs(
Vertex.z()) > sizeZ)
return -5;
358 Charge=0;
for(i=0; i<ntrk; i++){Charge+=state.
m_ich[i];};
362 TrkAtVrt.clear(); TrkAtVrt.reserve(ntrk);
363 for(i=0; i<ntrk; i++){
364 std::vector<double> TrkPar(3);
366 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
368 TrkPar[0],TrkPar[1],TrkPar[2]);
369 TrkPar[2] = -TrkPar[2];
370 TrkAtVrt.push_back( TrkPar );
382 const TLorentzVector& Momentum,
383 const dvect& CovVrtMom,
384 const long int& Charge,
389 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
392 double Vrt[3],PMom[4],Cov0[21],Per[5],CovPer[15];
394 for(i=0; i<3; i++) Vrt[i]=
Vertex[i];
395 for(i=0; i<3; i++) PMom[i]=Momentum[i];
396 for(ij=i=0; i<6; i++){
398 Cov0[ij]=CovVrtMom[ij];
403 long int vkCharge=-Charge;
407 double fx,fy,BMAG_CUR;
409 if(fabs(BMAG_CUR) < 0.01) BMAG_CUR=0.01;
411 Trk::xyztrp( vkCharge, Vrt, PMom, Cov0, BMAG_CUR, Per, CovPer );
416 for(i=0; i<5; i++)
Perigee.push_back((
double)Per[i]);
417 for(i=0; i<15; i++) CovPerigee.push_back((
double)CovPer[i]);
419 return StatusCode::SUCCESS;
424 double& tp1,
double& tp2,
double& tp3)
const
428 tp3= vp3 * std::sin( vp1 ) /(
m_CNVMAG*effectiveBMAG);
429 constexpr double pi =
M_PI;
431 while ( tp1 >
pi) tp1 -= 2.*
pi;
432 while ( tp1 <-
pi) tp1 += 2.*
pi;
434 while ( tp2 >
pi) tp2 -= 2.*
pi;
435 while ( tp2 <-
pi) tp2 += 2.*
pi;
437 tp2 = fabs(tp2); tp1 +=
pi;
438 while ( tp1 >
pi) tp1 -= 2.*
pi;
455 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
458 if(NTrk<1)
return StatusCode::FAILURE;
459 if(NTrk>
NTrMaxVFit)
return StatusCode::FAILURE;
460 if(state.
m_ErrMtx.empty())
return StatusCode::FAILURE;
469 int i,j,ik,jk,ip,iTrk;
471 std::vector<std::vector<double> > Deriv (DIM);
472 for (std::vector<double>&
v : Deriv)
v.resize (DIM);
473 std::vector<double> CovMtxOld(DIM*DIM);
476 CovVrtTrk.resize(DIM*(DIM+1)/2);
479 for( i=0; i<DIM;i++) {
480 for( j=0; j<=i; j++) {
481 CovMtxOld[i*DIM+j]=CovMtxOld[j*DIM+i]=state.
m_ErrMtx[ip++];
487 for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++) {Deriv[i][j]=0.;}}
494 for( iTrk=0; iTrk<NTrk; iTrk++){
499 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
505 Deriv[iSt ][iSt+1] = 1;
506 Deriv[iSt+1][iSt ] = 1;
507 Deriv[iSt+2][iSt ] = -(cos(
Theta)/(
m_CNVMAG*effectiveBMAG)) * invR ;
508 Deriv[iSt+2][iSt+2] = -(sin(
Theta)/(
m_CNVMAG*effectiveBMAG)) ;
510 double pt=std::abs(
m_CNVMAG*effectiveBMAG/invR);
511 double px=pt*cos(
Phi);
512 double py=pt*sin(
Phi);
514 Deriv[iSt ][iSt ]= 0;
515 Deriv[iSt ][iSt+1]= -
py;
516 Deriv[iSt ][iSt+2]= -
px/invR;
518 Deriv[iSt+1][iSt ]= 0;
519 Deriv[iSt+1][iSt+1]=
px;
520 Deriv[iSt+1][iSt+2]= -
py/invR;
522 Deriv[iSt+2][iSt ]= -pt/sin(
Theta)/sin(
Theta);
523 Deriv[iSt+2][iSt+1]= 0;
524 Deriv[iSt+2][iSt+2]= -
pz/invR;
533 for(ik=0;ik<DIM;ik++){
534 if(Deriv[i][ik] == 0.)
continue;
536 for(jk=DIM-1;jk>=0;jk--){
537 if(Deriv[j][jk] == 0.)
continue;
538 tmpTmp += CovMtxOld[ik*DIM+jk]*Deriv[j][jk];
540 tmp += Deriv[i][ik]*tmpTmp;
542 CovVrtTrk[ipnt++]=tmp;
545 return StatusCode::SUCCESS;
556 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
557 const State& state =
static_cast<const State&
> (istate);
561 return StatusCode::SUCCESS;
568 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
569 const State& state =
static_cast<const State&
> (istate);
577 return StatusCode::SUCCESS;
const Amg::Vector3D & position() const
Access method for the position.
VKalAtlasMagFld m_fitField
std::vector< double > m_partMassCnst
long int m_ich[NTrMaxVFit]
std::vector< double > m_ApproximateVertex
double m_apar[NTrMaxVFit][5]
bool m_allowUltraDisplaced
double m_awgt[NTrMaxVFit][15]
double m_parfs[NTrMaxVFit][3]
const TrackParameters * m_globalFirstHit
VKalVrtControl m_vkalFitControl
double m_massForConstraint
std::vector< double > m_ErrMtx
double m_cnstRadiusRef[2]
StatusCode CvtTrackParameters(const std::vector< const TrackParameters * > &InpTrk, int &ntrk, State &state) const
void VKalVrtConfigureFitterCore(int NTRK, State &state) const
const IExtrapolator * m_InDetExtrapolator
Pointer to Extrapolator AlgTool.
Gaudi::Property< double > m_MSsizeZ
virtual StatusCode VKalVrtCvtTool(const Amg::Vector3D &Vertex, const TLorentzVector &Momentum, const dvect &CovVrtMom, const long int &Charge, dvect &Perigee, dvect &CovPerigee, IVKalState &istate) const override final
StatusCode CvtPerigee(const std::vector< const Perigee * > &list, int &ntrk, State &state) const
virtual StatusCode VKalGetMassError(double &Mass, double &MassError, const IVKalState &istate) const override final
Gaudi::Property< double > m_IDsizeZ
int VKalVrtFit3(int ntrk, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, State &state, bool ifCovV0) const
virtual StatusCode VKalGetFullCov(long int, dvect &CovMtx, IVKalState &istate, bool=false) const override final
virtual StatusCode VKalVrtFit(const std::vector< const xAOD::TrackParticle * > &, const std::vector< const xAOD::NeutralParticle * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
Gaudi::Property< bool > m_firstMeasuredPoint
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
static int VKalGetNDOF(const State &state)
Gaudi::Property< bool > m_firstMeasuredRadiusLimit
StatusCode CvtTrackParticle(std::span< const xAOD::TrackParticle *const > list, int &ntrk, State &state) const
VKalExtPropagator * m_fitPropagator
Gaudi::Property< double > m_IDsizeR
Gaudi::Property< bool > m_firstMeasuredPointLimit
StatusCode CvtNeutralParticle(const std::vector< const xAOD::NeutralParticle * > &list, int &ntrk, State &state) const
Gaudi::Property< double > m_MSsizeR
void VKalToTrkTrack(double curBMAG, double vp1, double vp2, double vp3, double &tp1, double &tp2, double &tp3) const
StatusCode CvtNeutralParameters(const std::vector< const NeutralParameters * > &InpTrk, int &ntrk, State &state) const
virtual void getMagFld(const double, const double, const double, double &, double &, double &) override
void renewFullCovariance(double *)
double getVertexMass() const
void setVertexMass(double mass)
double getVrtMassError() const
void setUsePlaneCnst(double a, double b, double c, double d)
void setVrtMassError(double error)
const double * getFullCovariance() const
This class is a simplest representation of a vertex candidate.
double getEffField(double bx, double by, double bz, double phi, double theta)
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
void xyztrp(const long int ich, double *vrt0, double *pv0, double *covi, double BMAG, double *paro, double *errt)
int CFit(VKalVrtControl *FitCONTROL, int ifCovV0, int NTRK, long int *ich, double xyz0[3], double(*par0)[3], double(*inp_Trk5)[5], double(*inp_CovTrk5)[15], double xyzfit[3], double(*parfs)[3], double ptot[4], double covf[21], double &chi2, double *chi2tr)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
void cfpest(int ntrk, double *xyz, long int *ich, double(*parst)[5], double(*parf)[3])
@ z
global position (cartesian)
@ pz
global momentum (cartesian)
std::vector< double > dvect
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.