13#include "GaudiKernel/IChronoStatSvc.h"
27 TLorentzVector& Momentum,
31 std::vector< std::vector<double> >& TrkAtVrt,
36 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
45 if(
sc.isFailure())
return StatusCode::FAILURE;
48 Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
49 if (ierr)
return StatusCode::FAILURE;
50 return StatusCode::SUCCESS;
56 const std::vector<const xAOD::NeutralParticle*> & InpTrkN,
58 TLorentzVector& Momentum,
62 std::vector< std::vector<double> >& TrkAtVrt,
67 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
79 std::vector<const TrackParameters*> tmpInputC(0);
80 std::vector<std::unique_ptr<const TrackParameters>> TParamOwner(0);
82 double closestHitR=1.e6;
87 if(msgLvl(MSG::WARNING))
msg()<<
"No InDet extrapolator given."<<
88 "Can't use FirstMeasuredPoint with xAOD::TrackParticle!!!" <<
endmsg;
89 return StatusCode::FAILURE;
91 std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
92 if(msgLvl(MSG::DEBUG))
msg()<<
"Start FirstMeasuredPoint handling"<<
'\n';
93 unsigned int indexFMP;
94 for (i_ntrk = InpTrkC.begin(); i_ntrk < InpTrkC.end(); ++i_ntrk) {
96 if(msgLvl(MSG::DEBUG))
msg()<<
"FirstMeasuredPoint on track is discovered. Use it."<<
'\n';
98 TParamOwner.emplace_back(std::make_unique<CurvilinearParameters>(
99 (*i_ntrk)->curvilinearParameters(indexFMP)));
101 tmpInputC.push_back((TParamOwner.back()).get());
103 if(msgLvl(MSG::DEBUG)){
104 msg()<<
"FirstMeasuredPoint on track is absent."<<
105 "Try extrapolation from Perigee to FisrtMeasuredPoint radius"<<
endmsg;
108 TParamOwner.emplace_back(
m_fitPropagator->myxAODFstPntOnTrk((*i_ntrk)));
110 tmpInputC.push_back((TParamOwner.back()).get());
111 if(tmpInputC[tmpInputC.size()-1]==
nullptr){
113 if(msgLvl(MSG::WARNING)){
114 msg()<<
"InDetExtrapolator can't etrapolate xAOD::TrackParticle Perigee "<<
115 "to FirstMeasuredPoint radius! Stop vertex fit!" <<
endmsg;
117 return StatusCode::FAILURE;
120 if( (*i_ntrk)->radiusOfFirstHit() < closestHitR ) {
121 closestHitR=(*i_ntrk)->radiusOfFirstHit();
126 return StatusCode::FAILURE;
130 if(!InpTrkC.empty()) {
134 if(
sc.isFailure())
return StatusCode::FAILURE;
135 if(!InpTrkN.empty()){
sc=
CvtNeutralParticle(InpTrkN,ntrk,state);
if(
sc.isFailure())
return StatusCode::FAILURE;}
138 if (ierr)
return StatusCode::FAILURE;
144 if(closestHitR==1.e6){
146 for(
auto &trka : InpTrkC){
147 double hitR=trka->radiusOfFirstHit();
148 if(closestHitR>hitR){
153 if(closestHitR<1.e6){
155 if(perFMP) cnstRefPoint=perFMP->position();
162 if(
Vertex.perp()>closestHitR && cnstRefPoint.perp()>0.){
163 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
165 double D= unitMom.x()*(cnstRefPoint.x()-state.
m_refFrameX)
189 if (ierr)
return StatusCode::FAILURE;
190 return StatusCode::SUCCESS;
195 const std::vector<const NeutralParameters*> & InpTrkN,
197 TLorentzVector& Momentum,
201 std::vector< std::vector<double> >& TrkAtVrt,
206 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
215 if(!InpTrkC.empty()){
217 if(
sc.isFailure())
return StatusCode::FAILURE;
219 if(!InpTrkN.empty()){
221 if(
sc.isFailure())
return StatusCode::FAILURE;
231 if (ierr)
return StatusCode::FAILURE;
237 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
239 double pp[3]={Momentum.Px()/Momentum.Rho(),Momentum.Py()/Momentum.Rho(),Momentum.Pz()/Momentum.Rho()};
257 if (ierr)
return StatusCode::FAILURE;
258 return StatusCode::SUCCESS;
271 TLorentzVector& Momentum,
275 std::vector< std::vector<double> >& TrkAtVrt,
284 double xyz0[3],covf[21],chi2f=-10.;
286 double xyzfit[3]={0.};
310 xyz0[0]=xyz0[1]=xyz0[2]=0.;
315 Chi2PerTrk.resize (ntrk);
317 xyzfit, state.
m_parfs, ptot, covf, chi2f,
320 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"VKalVrt fit status="<<ierr<<
" Chi2="<<chi2f<<
endmsg;
326 if(ptot[0]*ptot[0]+ptot[1]*ptot[1] == 0.)
return -5;
332 int SymCovMtxSize=(3*ntrk+3)*(3*ntrk+4)/2;
341 Momentum.SetPxPyPzE( ptot[0], ptot[1], ptot[2], ptot[3] );
342 Chi2 = (double) chi2f;
350 if (
Vertex.perp() > sizeR || std::abs(
Vertex.z()) > sizeZ)
return -5;
361 Charge=0;
for(i=0; i<ntrk; i++){Charge+=state.
m_ich[i];};
365 TrkAtVrt.clear(); TrkAtVrt.reserve(ntrk);
366 for(i=0; i<ntrk; i++){
367 std::vector<double> TrkPar(3);
369 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
371 TrkPar[0],TrkPar[1],TrkPar[2]);
372 TrkPar[2] = -TrkPar[2];
373 TrkAtVrt.push_back( TrkPar );
385 const TLorentzVector& Momentum,
386 const dvect& CovVrtMom,
387 const long int& Charge,
392 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
395 double Vrt[3],PMom[4],Cov0[21],Per[5],CovPer[15];
397 for(i=0; i<3; i++) Vrt[i]=
Vertex[i];
398 for(i=0; i<3; i++) PMom[i]=Momentum[i];
399 for(ij=i=0; i<6; i++){
401 Cov0[ij]=CovVrtMom[ij];
406 long int vkCharge=-Charge;
410 double fx,fy,BMAG_CUR;
412 if(fabs(BMAG_CUR) < 0.01) BMAG_CUR=0.01;
414 Trk::xyztrp( vkCharge, Vrt, PMom, Cov0, BMAG_CUR, Per, CovPer );
419 for(i=0; i<5; i++)
Perigee.push_back((
double)Per[i]);
420 for(i=0; i<15; i++) CovPerigee.push_back((
double)CovPer[i]);
422 return StatusCode::SUCCESS;
427 double& tp1,
double& tp2,
double& tp3)
const
431 tp3= vp3 * std::sin( vp1 ) /(
m_CNVMAG*effectiveBMAG);
432 constexpr double pi =
M_PI;
434 while ( tp1 >
pi) tp1 -= 2.*
pi;
435 while ( tp1 <-
pi) tp1 += 2.*
pi;
437 while ( tp2 >
pi) tp2 -= 2.*
pi;
438 while ( tp2 <-
pi) tp2 += 2.*
pi;
440 tp2 = fabs(tp2); tp1 +=
pi;
441 while ( tp1 >
pi) tp1 -= 2.*
pi;
458 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
461 if(NTrk<1)
return StatusCode::FAILURE;
462 if(NTrk>
NTrMaxVFit)
return StatusCode::FAILURE;
463 if(state.
m_ErrMtx.empty())
return StatusCode::FAILURE;
472 int i,j,ik,jk,ip,iTrk;
474 std::vector<std::vector<double> > Deriv (DIM);
475 for (std::vector<double>&
v : Deriv)
v.resize (DIM);
476 std::vector<double> CovMtxOld(DIM*DIM);
479 CovVrtTrk.resize(DIM*(DIM+1)/2);
482 for( i=0; i<DIM;i++) {
483 for( j=0; j<=i; j++) {
484 CovMtxOld[i*DIM+j]=CovMtxOld[j*DIM+i]=state.
m_ErrMtx[ip++];
490 for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++) {Deriv[i][j]=0.;}}
496 double Theta,invR,Phi;
497 for( iTrk=0; iTrk<NTrk; iTrk++){
502 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
508 Deriv[iSt ][iSt+1] = 1;
509 Deriv[iSt+1][iSt ] = 1;
510 Deriv[iSt+2][iSt ] = -(cos(Theta)/(
m_CNVMAG*effectiveBMAG)) * invR ;
511 Deriv[iSt+2][iSt+2] = -(sin(Theta)/(
m_CNVMAG*effectiveBMAG)) ;
513 double pt=std::abs(
m_CNVMAG*effectiveBMAG/invR);
514 double px=pt*cos(Phi);
515 double py=pt*sin(Phi);
516 double pz=pt/tan(Theta);
517 Deriv[iSt ][iSt ]= 0;
518 Deriv[iSt ][iSt+1]= -
py;
519 Deriv[iSt ][iSt+2]= -
px/invR;
521 Deriv[iSt+1][iSt ]= 0;
522 Deriv[iSt+1][iSt+1]=
px;
523 Deriv[iSt+1][iSt+2]= -
py/invR;
525 Deriv[iSt+2][iSt ]= -pt/sin(Theta)/sin(Theta);
526 Deriv[iSt+2][iSt+1]= 0;
527 Deriv[iSt+2][iSt+2]= -
pz/invR;
536 for(ik=0;ik<DIM;ik++){
537 if(Deriv[i][ik] == 0.)
continue;
539 for(jk=DIM-1;jk>=0;jk--){
540 if(Deriv[j][jk] == 0.)
continue;
541 tmpTmp += CovMtxOld[ik*DIM+jk]*Deriv[j][jk];
543 tmp += Deriv[i][ik]*tmpTmp;
545 CovVrtTrk[ipnt++]=tmp;
548 return StatusCode::SUCCESS;
559 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
560 const State& state =
static_cast<const State&
> (istate);
564 return StatusCode::SUCCESS;
571 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
572 const State& state =
static_cast<const State&
> (istate);
580 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.