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();
163 if(
Vertex.perp()>closestHitR && cnstRefPoint.perp()>0.){
164 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
166 double D= unitMom.x()*(cnstRefPoint.x()-state.
m_refFrameX)
190 if (ierr)
return StatusCode::FAILURE;
191 return StatusCode::SUCCESS;
196 const std::vector<const NeutralParameters*> & InpTrkN,
198 TLorentzVector& Momentum,
202 std::vector< std::vector<double> >& TrkAtVrt,
207 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
216 if(!InpTrkC.empty()){
218 if(
sc.isFailure())
return StatusCode::FAILURE;
220 if(!InpTrkN.empty()){
222 if(
sc.isFailure())
return StatusCode::FAILURE;
232 if (ierr)
return StatusCode::FAILURE;
238 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"Vertex behind first measured point is detected. Constraint is applied!"<<
endmsg;
240 double pp[3]={Momentum.Px()/Momentum.Rho(),Momentum.Py()/Momentum.Rho(),Momentum.Pz()/Momentum.Rho()};
258 if (ierr)
return StatusCode::FAILURE;
259 return StatusCode::SUCCESS;
272 TLorentzVector& Momentum,
276 std::vector< std::vector<double> >& TrkAtVrt,
285 double xyz0[3],covf[21],chi2f=-10.;
287 double xyzfit[3]={0.};
311 xyz0[0]=xyz0[1]=xyz0[2]=0.;
316 Chi2PerTrk.resize (ntrk);
318 xyzfit, state.
m_parfs, ptot, covf, chi2f,
321 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"VKalVrt fit status="<<ierr<<
" Chi2="<<chi2f<<
endmsg;
327 if(ptot[0]*ptot[0]+ptot[1]*ptot[1] == 0.)
return -5;
333 int SymCovMtxSize=(3*ntrk+3)*(3*ntrk+4)/2;
342 Momentum.SetPxPyPzE( ptot[0], ptot[1], ptot[2], ptot[3] );
343 Chi2 = (double) chi2f;
351 if (
Vertex.perp() > sizeR || std::abs(
Vertex.z()) > sizeZ)
return -5;
362 Charge=0;
for(i=0; i<ntrk; i++){Charge+=state.
m_ich[i];};
366 TrkAtVrt.clear(); TrkAtVrt.reserve(ntrk);
367 for(i=0; i<ntrk; i++){
368 std::vector<double> TrkPar(3);
370 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
372 TrkPar[0],TrkPar[1],TrkPar[2]);
373 TrkPar[2] = -TrkPar[2];
374 TrkAtVrt.push_back( std::move(TrkPar) );
386 const TLorentzVector& Momentum,
387 const dvect& CovVrtMom,
388 const long int& Charge,
393 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
396 double Vrt[3],PMom[4],Cov0[21],Per[5],CovPer[15];
398 for(i=0; i<3; i++) Vrt[i]=
Vertex[i];
399 for(i=0; i<3; i++) PMom[i]=Momentum[i];
400 for(ij=i=0; i<6; i++){
402 Cov0[ij]=CovVrtMom[ij];
407 long int vkCharge=-Charge;
411 double fx,fy,BMAG_CUR;
413 if(fabs(BMAG_CUR) < 0.01) BMAG_CUR=0.01;
415 Trk::xyztrp( vkCharge, Vrt, PMom, Cov0, BMAG_CUR, Per, CovPer );
420 for(i=0; i<5; i++)
Perigee.push_back((
double)Per[i]);
421 for(i=0; i<15; i++) CovPerigee.push_back((
double)CovPer[i]);
423 return StatusCode::SUCCESS;
428 double& tp1,
double& tp2,
double& tp3)
const
432 tp3= vp3 * std::sin( vp1 ) /(
m_CNVMAG*effectiveBMAG);
433 constexpr double pi =
M_PI;
435 while ( tp1 >
pi) tp1 -= 2.*
pi;
436 while ( tp1 <-
pi) tp1 += 2.*
pi;
438 while ( tp2 >
pi) tp2 -= 2.*
pi;
439 while ( tp2 <-
pi) tp2 += 2.*
pi;
441 tp2 = fabs(tp2); tp1 +=
pi;
442 while ( tp1 >
pi) tp1 -= 2.*
pi;
459 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
462 if(NTrk<1)
return StatusCode::FAILURE;
463 if(NTrk>
NTrMaxVFit)
return StatusCode::FAILURE;
464 if(state.
m_ErrMtx.empty())
return StatusCode::FAILURE;
473 int i,j,ik,jk,ip,iTrk;
475 std::vector<std::vector<double> > Deriv (DIM);
476 for (std::vector<double>&
v : Deriv)
v.resize (DIM);
477 std::vector<double> CovMtxOld(DIM*DIM);
480 CovVrtTrk.resize(DIM*(DIM+1)/2);
483 for( i=0; i<DIM;i++) {
484 for( j=0; j<=i; j++) {
485 CovMtxOld[i*DIM+j]=CovMtxOld[j*DIM+i]=state.
m_ErrMtx[ip++];
491 for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++) {Deriv[i][j]=0.;}}
497 double Theta,invR,Phi;
498 for( iTrk=0; iTrk<NTrk; iTrk++){
503 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
509 Deriv[iSt ][iSt+1] = 1;
510 Deriv[iSt+1][iSt ] = 1;
511 Deriv[iSt+2][iSt ] = -(cos(Theta)/(
m_CNVMAG*effectiveBMAG)) * invR ;
512 Deriv[iSt+2][iSt+2] = -(sin(Theta)/(
m_CNVMAG*effectiveBMAG)) ;
514 double pt=std::abs(
m_CNVMAG*effectiveBMAG/invR);
515 double px=pt*cos(Phi);
516 double py=pt*sin(Phi);
517 double pz=pt/tan(Theta);
518 Deriv[iSt ][iSt ]= 0;
519 Deriv[iSt ][iSt+1]= -
py;
520 Deriv[iSt ][iSt+2]= -
px/invR;
522 Deriv[iSt+1][iSt ]= 0;
523 Deriv[iSt+1][iSt+1]=
px;
524 Deriv[iSt+1][iSt+2]= -
py/invR;
526 Deriv[iSt+2][iSt ]= -pt/sin(Theta)/sin(Theta);
527 Deriv[iSt+2][iSt+1]= 0;
528 Deriv[iSt+2][iSt+2]= -
pz/invR;
537 for(ik=0;ik<DIM;ik++){
538 if(Deriv[i][ik] == 0.)
continue;
540 for(jk=DIM-1;jk>=0;jk--){
541 if(Deriv[j][jk] == 0.)
continue;
542 tmpTmp += CovMtxOld[ik*DIM+jk]*Deriv[j][jk];
544 tmp += Deriv[i][ik]*tmpTmp;
546 CovVrtTrk[ipnt++]=tmp;
549 return StatusCode::SUCCESS;
560 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
561 const State& state =
static_cast<const State&
> (istate);
565 return StatusCode::SUCCESS;
572 assert(
dynamic_cast<const State*
> (&istate)!=
nullptr);
573 const State& state =
static_cast<const State&
> (istate);
581 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.