ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::TrkVKalVrtFitter Class Reference

#include <TrkVKalVrtFitter.h>

Inheritance diagram for Trk::TrkVKalVrtFitter:
Collaboration diagram for Trk::TrkVKalVrtFitter:

Classes

struct  TrkMatControl
class  CascadeState
class  State

Public Member Functions

virtual StatusCode initialize () override final
virtual StatusCode finalize () override final
 TrkVKalVrtFitter (const std::string &t, const std::string &name, const IInterface *parent)
virtual ~TrkVKalVrtFitter ()
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
 Interface for MeasuredPerigee with starting point.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const std::vector< const NeutralParameters * > &, const Amg::Vector3D &startingPoint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const xAOD::Vertex &constraint) const override final
 Interface for MeasuredPerigee with vertex constraint.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const std::vector< const NeutralParameters * > &, const xAOD::Vertex &constraint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &startingPoint) const override final
 Interface for xAOD::TrackParticle with starting point Implements the new style (unique_ptr,EventContext).
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint) const override final
 Interface for xAOD::TrackParticle with vertex constraint.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const Amg::Vector3D &startingPoint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const xAOD::Vertex &constraint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &, const std::vector< const Trk::NeutralParameters * > &) const override final
std::unique_ptr< xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &constraint, IVKalState &istate) const
std::unique_ptr< xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint, IVKalState &istate) const
VertexID startVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, IVKalState &istate, double massConstraint=0.) const override final
 Interface for cascade fit.
VertexID nextVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, IVKalState &istate, double massConstraint=0.) const override final
VertexID nextVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, const std::vector< VertexID > &precedingVertices, IVKalState &istate, double massConstraint=0.) const override final
VxCascadeInfofitCascade (IVKalState &istate, const Vertex *primVertex=0, bool FirstDecayAtPV=false) const override final
StatusCode addMassConstraint (VertexID Vertex, const std::vector< const xAOD::TrackParticle * > &tracksInConstraint, const std::vector< VertexID > &verticesInConstraint, IVKalState &istate, double massConstraint) const override final
virtual std::unique_ptr< IVKalStatemakeState (const EventContext &ctx) 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
virtual StatusCode VKalVrtFit (const std::vector< const Perigee * > &, 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
virtual StatusCode VKalVrtFit (const std::vector< const TrackParameters * > &, const std::vector< const NeutralParameters * > &, 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
virtual StatusCode VKalVrtCvtTool (const Amg::Vector3D &Vertex, const TLorentzVector &Momentum, const dvect &CovVrtMom, const long int &Charge, dvect &PerigeePerigee, dvect &CovPerigee, IVKalState &istate) const override final
virtual StatusCode VKalVrtFitFast (std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
virtual StatusCode VKalVrtFitFast (const std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, IVKalState &istate) const override final
virtual StatusCode VKalVrtFitFast (const std::vector< const TrackParameters * > &, Amg::Vector3D &Vertex, IVKalState &istate) const override final
virtual std::unique_ptr< Trk::PerigeeCreatePerigee (const std::vector< double > &VKPerigee, const std::vector< double > &VKCov, IVKalState &istate) const override final
virtual StatusCode VKalGetTrkWeights (dvect &Weights, const IVKalState &istate) const override final
virtual StatusCode VKalGetFullCov (long int, dvect &CovMtx, IVKalState &istate, bool=false) const override final
virtual StatusCode VKalGetMassError (double &Mass, double &MassError, const IVKalState &istate) const override final
virtual void setApproximateVertex (double X, double Y, double Z, IVKalState &istate) const override final
virtual void setMassForConstraint (double Mass, IVKalState &istate) const override final
virtual void setMassForConstraint (double Mass, std::span< const int >, IVKalState &istate) const override final
virtual void setRobustness (int, IVKalState &istate) const override final
virtual void setRobustScale (double, IVKalState &istate) const override final
virtual void setCnstType (int, IVKalState &istate) const override final
virtual void setVertexForConstraint (const xAOD::Vertex &, IVKalState &istate) const override final
virtual void setVertexForConstraint (double X, double Y, double Z, IVKalState &istate) const override final
virtual void setCovVrtForConstraint (double XX, double XY, double YY, double XZ, double YZ, double ZZ, IVKalState &istate) const override final
virtual void setMassInputParticles (const std::vector< double > &, IVKalState &istate) const override final
virtual double VKalGetImpact (const xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError, IVKalState &istate) const override final
virtual double VKalGetImpact (const Trk::Perigee *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError, IVKalState &istate) const override final
virtual double VKalGetImpact (const EventContext &ctx, const xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) const override final
virtual double VKalGetImpact (const EventContext &ctx, const Trk::Perigee *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) const override final

Private Member Functions

void initCnstList ()
void setAthenaPropagator (const Trk::IExtrapolator *)
void initState (const EventContext &ctx, State &state) const
bool convertAmg5SymMtx (const AmgSymMatrix(5) *, double[15]) const
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
std::unique_ptr< xAOD::VertexmakeXAODVertex (int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
StatusCode CvtPerigee (const std::vector< const Perigee * > &list, int &ntrk, State &state) const
StatusCode CvtTrackParticle (std::span< const xAOD::TrackParticle *const > list, int &ntrk, State &state) const
StatusCode CvtNeutralParticle (const std::vector< const xAOD::NeutralParticle * > &list, int &ntrk, State &state) const
StatusCode CvtTrackParameters (const std::vector< const TrackParameters * > &InpTrk, int &ntrk, State &state) const
StatusCode CvtNeutralParameters (const std::vector< const NeutralParameters * > &InpTrk, int &ntrk, State &state) const
void VKalVrtConfigureFitterCore (int NTRK, State &state) const
void VKalToTrkTrack (double curBMAG, double vp1, double vp2, double vp3, double &tp1, double &tp2, double &tp3) const
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
std::unique_ptr< PerigeeCreatePerigee (double Vx, double Vy, double Vz, const std::vector< double > &VKPerigee, const std::vector< double > &VKCov, State &state) const

Static Private Member Functions

static void makeSimpleCascade (std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, CascadeState &cstate)
static void printSimpleCascade (std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, const CascadeState &cstate)
static int findPositions (const std::vector< int > &, const std::vector< int > &, std::vector< int > &)
static int getSimpleVIndex (const VertexID &, const CascadeState &cstate)
static int indexInV (const VertexID &, const CascadeState &cstate)
static int getCascadeNDoF (const CascadeState &cstate)
static void FillMatrixP (AmgSymMatrix(5)&, std::vector< double > &)
static void FillMatrixP (int iTrk, AmgSymMatrix(5)&, std::vector< double > &)
static Amg::MatrixXGiveFullMatrix (int NTrk, std::vector< double > &)
static const PerigeeGetPerigee (const TrackParameters *i_ntrk)
static int VKalGetNDOF (const State &state)

Private Attributes

Gaudi::Property< int > m_Robustness {this, "Robustness", 0}
Gaudi::Property< double > m_RobustScale {this, "RobustScale", 1.0}
Gaudi::Property< double > m_cascadeCnstPrecision {this, "CascadeCnstPrecision", 1.e-4}
Gaudi::Property< double > m_massForConstraint {this, "MassForConstraint", -1.0}
Gaudi::Property< int > m_IterationNumber {this, "IterationNumber", 0}
Gaudi::Property< double > m_IterationPrecision {this, "IterationPrecision", 0.0}
Gaudi::Property< double > m_IDsizeR {this, "IDsizeR", 1150.0}
Gaudi::Property< double > m_IDsizeZ {this, "IDsizeZ", 3000.0}
Gaudi::Property< double > m_MSsizeR {this, "MSsizeR", 8000.0}
Gaudi::Property< double > m_MSsizeZ {this, "MSsizeZ", 10000.0}
Gaudi::Property< std::vector< double > > m_c_VertexForConstraint {this, "VertexForConstraint", {0,0,0}}
Gaudi::Property< std::vector< double > > m_c_CovVrtForConstraint {this, "CovVrtForConstraint", {0,0,0,0,0,0}}
Gaudi::Property< std::vector< double > > m_c_MassInputParticles {this, "InputParticleMasses", {}, "List of masses of input particles (pions assumed if absent)"}
ToolHandle< IExtrapolatorm_extPropagator {this, "Extrapolator", "", "External propagator"}
SG::ReadCondHandleKey< AtlasFieldCacheCondObjm_fieldCacheCondObjInputKey
Gaudi::Property< bool > m_firstMeasuredPoint {this, "FirstMeasuredPoint", false, "Use FirstMeasuredPoint strategy in fits"}
Gaudi::Property< bool > m_firstMeasuredPointLimit {this, "FirstMeasuredPointLimit", false, "Use FirstMeasuredPointLimit strategy"}
Gaudi::Property< bool > m_firstMeasuredRadiusLimit
Gaudi::Property< bool > m_makeExtendedVertex {this, "MakeExtendedVertex", false, "Return VxCandidate with full covariance matrix"}
Gaudi::Property< bool > m_useFixedField {this, "useFixedField", false, "Use fixed magnetic field instead of exact Atlas one"}
bool m_isAtlasField {false}
Gaudi::Property< bool > m_useAprioriVertex {this, "useAprioriVertexCnst", false, "Use a priori vertex constraint"}
Gaudi::Property< bool > m_useThetaCnst {this, "useThetaCnst", false, "Use angle dTheta=0 constraint"}
Gaudi::Property< bool > m_usePhiCnst {this, "usePhiCnst", false, "Use angle dPhi=0 constraint"}
Gaudi::Property< bool > m_usePointingCnst {this, "usePointingCnst", false, "Use pointing to other vertex constraint"}
Gaudi::Property< bool > m_useZPointingCnst {this, "useZPointingCnst", false, "Use ZPointing to other vertex constraint"}
Gaudi::Property< bool > m_usePassNear {this, "usePassNearCnst", false, "Use combined particle pass near other vertex constraint"}
Gaudi::Property< bool > m_usePassWithTrkErr {this, "usePassWithTrkErrCnst", false, "Use pass near with combined particle errors constraint"}
Gaudi::Property< bool > m_frozenVersionForBTagging {this, "FrozenVersionForBTagging", false, "Frozen version for BTagging"}
Gaudi::Property< bool > m_allowUltraDisplaced {this, "allowUltraDisplaced", false, "Allow ultra displaced vertices"}
double m_BMAG {1.997}
double m_CNVMAG {0.29979246}
VKalExtPropagatorm_fitPropagator {}
const IExtrapolatorm_InDetExtrapolator {}
 Pointer to Extrapolator AlgTool.

Friends

class VKalExtPropagator

Detailed Description

Definition at line 64 of file TrkVKalVrtFitter.h.

Constructor & Destructor Documentation

◆ TrkVKalVrtFitter()

Trk::TrkVKalVrtFitter::TrkVKalVrtFitter ( const std::string & t,
const std::string & name,
const IInterface * parent )

Definition at line 30 of file TrkVKalVrtFitter.cxx.

32 :
33 base_class(type,name,parent)
34 {
35 declareInterface<IVertexFitter>(this);
36 declareInterface<ITrkVKalVrtFitter>(this);
37 declareInterface<IVertexCascadeFitter>(this);
38
39/*--------------------------------------------------------------------------*/
40/* New propagator object is created. It's provided to VKalVrtCore. */
41/* VKalVrtFitter must set up Core BEFORE any call required propagation!!! */
42/* This object is created ONLY if IExtrapolator pointer is provideded. */
43/* see VKalExtPropagator.cxx for details */
44/*--------------------------------------------------------------------------*/
45 m_fitPropagator = nullptr; //Pointer to VKalVrtFitter propagator object to supply to VKalVrtCore (specific interface)
46 m_InDetExtrapolator = nullptr; //Direct pointer to Athena propagator
47}
const IExtrapolator * m_InDetExtrapolator
Pointer to Extrapolator AlgTool.
VKalExtPropagator * m_fitPropagator

◆ ~TrkVKalVrtFitter()

Trk::TrkVKalVrtFitter::~TrkVKalVrtFitter ( )
virtual

Definition at line 51 of file TrkVKalVrtFitter.cxx.

51 {
52 //log << MSG::DEBUG << "TrkVKalVrtFitter destructor called" << endmsg;
53 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<"TrkVKalVrtFitter destructor called" << endmsg;
55}
#define endmsg
MsgStream & msg
Definition testRead.cxx:32

Member Function Documentation

◆ addMassConstraint()

StatusCode Trk::TrkVKalVrtFitter::addMassConstraint ( VertexID Vertex,
const std::vector< const xAOD::TrackParticle * > & tracksInConstraint,
const std::vector< VertexID > & verticesInConstraint,
IVKalState & istate,
double massConstraint ) const
finaloverride

Definition at line 736 of file TrkCascadeFitter.cxx.

741{
742 assert(dynamic_cast<State*> (&istate)!=nullptr);
743 State& state = static_cast<State&> (istate);
744 CascadeState& cstate = *state.m_cascadeState;
745
746 int ivc, it, itc;
747 //int NV=m_cstate.cascadeVList.size(); // cascade size
748//----
749 if(Vertex < 0) return StatusCode::FAILURE;
750 //if(Vertex >= NV) return StatusCode::FAILURE; //Now this check is WRONG. Use indexInV(..) instead
751//
752//---- real tracks
753//
754 int cnstNTRK=tracksInConstraint.size(); // number of real tracks in constraints
755 int indexV = indexInV(Vertex, cstate); // index of vertex in cascade structure
756 if(indexV<0) return StatusCode::FAILURE;
757 int NTRK = cstate.m_cascadeVList[indexV].trkInVrt.size(); // number of real tracks in chosen vertex
758 int totNTRK = cstate.m_partListForCascade.size(); // total number of real tracks
759 if( cnstNTRK > NTRK ) return StatusCode::FAILURE;
760//-
761 PartialMassConstraint tmpMcnst;
762 tmpMcnst.Mass = massConstraint;
763 tmpMcnst.VRT = Vertex;
764//
765 double totMass=0;
766 for(itc=0; itc<cnstNTRK; itc++) {
767 for(it=0; it<totNTRK; it++) if(tracksInConstraint[itc]==cstate.m_partListForCascade[it]) break;
768 if(it==totNTRK) return StatusCode::FAILURE; //track in constraint doesn't correspond to any track in vertex
769 tmpMcnst.trkInVrt.push_back(it);
770 totMass += cstate.m_partMassForCascade[it];
771 }
772 if(totMass > massConstraint)return StatusCode::FAILURE;
773//
774//---- pseudo tracks
775//
776 int cnstNVP = pseudotracksInConstraint.size(); // number of pseudo-tracks in constraints
777 int NVP = cstate.m_cascadeVList[indexV].inPointingV.size(); // number of pseudo-tracks in chosen vertex
778 if( cnstNVP > NVP ) return StatusCode::FAILURE;
779//-
780 for(ivc=0; ivc<cnstNVP; ivc++) {
781 int tmpV = indexInV(pseudotracksInConstraint[ivc], cstate); // index of vertex in cascade structure
782 if( tmpV< 0) return StatusCode::FAILURE; //pseudotrack in constraint doesn't correspond to any pseudotrack in vertex
783 tmpMcnst.pseudoInVrt.push_back( pseudotracksInConstraint[ivc] );
784 }
785
786 cstate.m_partMassCnstForCascade.push_back(std::move(tmpMcnst));
787
788 return StatusCode::SUCCESS;
789}
boost::graph_traits< boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS > >::vertex_descriptor Vertex
static int indexInV(const VertexID &, const CascadeState &cstate)

◆ convertAmg5SymMtx()

bool Trk::TrkVKalVrtFitter::convertAmg5SymMtx ( const AmgSymMatrix(5) * AmgMtx,
double stdSymMtx[15] ) const
private

Definition at line 26 of file VKalTransform.cxx.

27 {
28 if(!AmgMtx) return false;
29 //----- Check perigee covarince matrix for safety
30 double DET=AmgMtx->determinant();
31 if( DET!=DET ) {
32 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<" NaN in Perigee covariance is detected! Stop fit."<<endmsg;
33 return false;
34 }
35 if( fabs(DET) < 1000.*std::numeric_limits<double>::min()) {
36 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<"Zero Perigee covariance DET is detected! Stop fit."<<endmsg;
37 return false;
38 }
39//std::cout.setf(std::ios::scientific); std::cout<<"VKMINNUMB="<<std::numeric_limits<double>::min()<<", "<<DET<<'\n';
40 //---------------------------------------------------------
41 stdSymMtx[ 0] =(*AmgMtx)(0,0);
42 stdSymMtx[ 1] =(*AmgMtx)(1,0);
43 stdSymMtx[ 2] =(*AmgMtx)(1,1);
44 stdSymMtx[ 3] =(*AmgMtx)(2,0);
45 stdSymMtx[ 4] =(*AmgMtx)(2,1);
46 stdSymMtx[ 5] =(*AmgMtx)(2,2);
47 stdSymMtx[ 6] =(*AmgMtx)(3,0);
48 stdSymMtx[ 7] =(*AmgMtx)(3,1);
49 stdSymMtx[ 8] =(*AmgMtx)(3,2);
50 stdSymMtx[ 9] =(*AmgMtx)(3,3);
51 stdSymMtx[10] =(*AmgMtx)(4,0);
52 stdSymMtx[11] =(*AmgMtx)(4,1);
53 stdSymMtx[12] =(*AmgMtx)(4,2);
54 stdSymMtx[13] =(*AmgMtx)(4,3);
55 stdSymMtx[14] =(*AmgMtx)(4,4);
56 return true;
57 }

◆ CreatePerigee() [1/2]

std::unique_ptr< Perigee > Trk::TrkVKalVrtFitter::CreatePerigee ( const std::vector< double > & VKPerigee,
const std::vector< double > & VKCov,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 160 of file CvtPerigee.cxx.

163 {
164 assert(dynamic_cast<const State*> (&istate)!=nullptr);
165 State& state = static_cast<State&> (istate);
166 return CreatePerigee(0., 0., 0., VKPerigee, VKCov, state);
167 }
virtual std::unique_ptr< Trk::Perigee > CreatePerigee(const std::vector< double > &VKPerigee, const std::vector< double > &VKCov, IVKalState &istate) const override final

◆ CreatePerigee() [2/2]

std::unique_ptr< Perigee > Trk::TrkVKalVrtFitter::CreatePerigee ( double Vx,
double Vy,
double Vz,
const std::vector< double > & VKPerigee,
const std::vector< double > & VKCov,
State & state ) const
private

!!! Change of sign !!!!

!!! Change of sign of charge!!!!

Definition at line 173 of file CvtPerigee.cxx.

177 {
178
179 // ------ Magnetic field access
180 double fx = 0., fy = 0., fz = 0.;
181 state.m_fitField.getMagFld(vX,vY,vZ,fx,fy,fz);
182 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VKPerigee[3], VKPerigee[2]);
183 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01; //safety
184
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];
190 TrkP5 = -TrkP5;
191
192 AmgSymMatrix(5) CovMtx;
193 double Deriv[5][5],CovMtxOld[5][5];
194 for(int i=0; i<5; i++){
195 for(int j=0; j<5; j++){
196 Deriv[i][j]=0.;
197 CovMtxOld[i][j]=0.;
198 }
199 }
200 Deriv[0][0] = -1.;
201 Deriv[1][1] = 1.;
202 Deriv[2][3] = 1.;
203 Deriv[3][2] = 1.;
204 Deriv[4][2] = (std::cos(VKPerigee[2])/(m_CNVMAG*effectiveBMAG)) * VKPerigee[4];
205 Deriv[4][4] = -(std::sin(VKPerigee[2])/(m_CNVMAG*effectiveBMAG));
206
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];
222
223 for(int i=0; i<5; i++){
224 for(int j=i; j<5; j++){
225 double tmp=0.;
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];
231 }
232 }
233 CovMtx(i,j) = CovMtx(j,i)=tmp;
234 }
235 }
236
237 auto surface = PerigeeSurface(Amg::Vector3D(state.m_refFrameX+vX,
238 state.m_refFrameY+vY,
239 state.m_refFrameZ+vZ));
240
241 return std::make_unique<Perigee>(TrkP1, TrkP2, TrkP3, TrkP4, TrkP5,
242 surface,
243 std::move(CovMtx));
244 }
#define AmgSymMatrix(dim)
void VKalToTrkTrack(double curBMAG, double vp1, double vp2, double vp3, double &tp1, double &tp2, double &tp3) const
Eigen::Matrix< double, 3, 1 > Vector3D
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ CvtNeutralParameters()

StatusCode Trk::TrkVKalVrtFitter::CvtNeutralParameters ( const std::vector< const NeutralParameters * > & InpTrk,
int & ntrk,
State & state ) const
private

Definition at line 179 of file CvtParametersBase.cxx.

182 {
183
184 std::vector<const NeutralParameters*>::const_iterator i_pbase;
185 AmgVector(5) VectPerig;
186 Amg::Vector3D perGlobalPos,perGlobalVrt;
187 const NeutralPerigee* mPerN = nullptr;
188 double CovVertTrk[15];
189 double tmp_refFrameX = 0, tmp_refFrameY = 0, tmp_refFrameZ = 0;
190 double rxyMin = 1000000.;
191
192 //
193 // ----- Set reference frame to (0.,0.,0.) == ATLAS frame
194 // ----- Magnetic field is taken in reference point
195 //
196 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
197 state.m_fitField.setAtlasMagRefFrame(0., 0., 0.);
198
199 if( m_InDetExtrapolator == nullptr ){
200 if(msgLvl(MSG::WARNING))msg()<< "No InDet extrapolator given. Can't use TrackParameters!!!" << endmsg;
201 return StatusCode::FAILURE;
202 }
203
204 //
205 // Cycle to determine common reference point for the fit
206 //
207 int counter = 0;
208 state.m_trkControl.clear();
209 state.m_trkControl.reserve(InpTrk.size());
210 for (i_pbase = InpTrk.begin(); i_pbase != InpTrk.end(); ++i_pbase) {
211 // Global position of hit
212 perGlobalPos = (*i_pbase)->position();
213 // Crazy user protection
214 if(std::abs(perGlobalPos.z()) > m_IDsizeZ) return StatusCode::FAILURE;
215 if(perGlobalPos.perp() > m_IDsizeR)return StatusCode::FAILURE;
216
217 tmp_refFrameX += perGlobalPos.x() ;
218 tmp_refFrameY += perGlobalPos.y() ;
219 tmp_refFrameZ += perGlobalPos.z() ;
220
221 // Here we create structure to control material effects
222 TrkMatControl tmpMat;
223 tmpMat.trkSavedLocalVertex.setZero();
224 // on track extrapolation
225 tmpMat.trkRefGlobPos = Amg::Vector3D(perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z());
226 // First measured point strategy
227 tmpMat.extrapolationType = 0;
228 //No reference point for neutral track for the moment !!!
229 tmpMat.TrkPnt = nullptr;
231 if(counter<(int)state.m_MassInputParticles.size()){
232 tmpMat.prtMass = state.m_MassInputParticles[counter];
233 }
234 tmpMat.TrkID = counter;
235 state.m_trkControl.push_back(tmpMat);
236 counter++;
237 if(perGlobalPos.perp()<rxyMin){
238 rxyMin = perGlobalPos.perp();
239 }
240 }
241
242 if(counter == 0) return StatusCode::FAILURE;
243 // Reference frame for the fit based on hits positions
244 tmp_refFrameX /= counter;
245 tmp_refFrameY /= counter;
246 tmp_refFrameZ /= counter;
247 Amg::Vector3D refGVertex (tmp_refFrameX, tmp_refFrameY, tmp_refFrameZ);
248
249 double fx,fy,fz;
250 //
251 // Common reference frame is ready. Start extraction of parameters for fit.
252 // TracksParameters are extrapolated to common point and converted to Perigee
253 // This is needed for VKalVrtCore engine.
254 //
255
256 for (i_pbase = InpTrk.begin(); i_pbase != InpTrk.end(); ++i_pbase) {
257 const Trk::NeutralParameters* neuparO = (*i_pbase);
258 if(neuparO == nullptr) return StatusCode::FAILURE;
259 const Trk::NeutralParameters* neuparN = m_fitPropagator->myExtrapNeutral(neuparO, &refGVertex);
260 mPerN = dynamic_cast<const Trk::NeutralPerigee*>(neuparN);
261 if(mPerN == nullptr) {
262 delete neuparN;
263 return StatusCode::FAILURE;
264 }
265
266 VectPerig = mPerN->parameters();
267 // Global position of perigee point
268 perGlobalPos = mPerN->position();
269 // Global position of reference point
270 perGlobalVrt = mPerN->associatedSurface().center();
271 // VK no good covariance matrix!
272 if( !convertAmg5SymMtx(mPerN->covariance(), CovVertTrk) ) {
273 delete mPerN;
274 return StatusCode::FAILURE;
275 }
276 delete neuparN;
277
278
279 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
280 // restore ATLAS frame for safety
281 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
282 // Magnetic field at perigee point
283 state.m_fitField.getMagFld(perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z(),
284 fx, fy, fz);
285 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
286 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
287
288 VKalTransform(effectiveBMAG,
289 (double)VectPerig[0], (double)VectPerig[1],
290 (double)VectPerig[2], (double)VectPerig[3],
291 (double)VectPerig[4], CovVertTrk,
292 state.m_ich[ntrk], &state.m_apar[ntrk][0],
293 &state.m_awgt[ntrk][0]);
294
295 state.m_ich[ntrk]=0;
296 if(state.m_apar[ntrk][4]<0){
297 // Charge=0 is always equal to Charge=+1
298 state.m_apar[ntrk][4] = -state.m_apar[ntrk][4];
299 state.m_awgt[ntrk][10] = -state.m_awgt[ntrk][10];
300 state.m_awgt[ntrk][11] = -state.m_awgt[ntrk][11];
301 state.m_awgt[ntrk][12] = -state.m_awgt[ntrk][12];
302 state.m_awgt[ntrk][13] = -state.m_awgt[ntrk][13];
303 }
304 ntrk++;
305 if(ntrk>=NTrMaxVFit) return StatusCode::FAILURE;
306 }
307
308 //-------------- Finally setting new reference frame common for ALL tracks
309 state.m_refFrameX = tmp_refFrameX;
310 state.m_refFrameY = tmp_refFrameY;
311 state.m_refFrameZ = tmp_refFrameZ;
312 state.m_fitField.setAtlasMagRefFrame(state.m_refFrameX, state.m_refFrameY, state.m_refFrameZ);
313
314 return StatusCode::SUCCESS;
315 }
#define AmgVector(rows)
if(pathvar)
Eigen::Matrix< double, 3, 1 > Vector3D
const Amg::Vector3D & position() const
Access method for the position.
bool convertAmg5SymMtx(const AmgSymMatrix(5) *, double[15]) const
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
Gaudi::Property< double > m_IDsizeZ
Gaudi::Property< double > m_IDsizeR
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters
ParametersT< NeutralParametersDim, Neutral, PerigeeSurface > NeutralPerigee

◆ CvtNeutralParticle()

StatusCode Trk::TrkVKalVrtFitter::CvtNeutralParticle ( const std::vector< const xAOD::NeutralParticle * > & list,
int & ntrk,
State & state ) const
private

Definition at line 126 of file CvtTrackParticle.cxx.

129 {
130 std::vector<const xAOD::NeutralParticle*>::const_iterator i_ntrk;
131 AmgVector(5) VectPerig; VectPerig.setZero();
132 const NeutralPerigee* mPer=nullptr;
133 double CovVertTrk[15]; std::fill(CovVertTrk,CovVertTrk+15,0.);
134 double tmp_refFrameX=0, tmp_refFrameY=0, tmp_refFrameZ=0;
135 double fx,fy,fz;
136//
137// ----- Set reference frame to (0.,0.,0.) == ATLAS frame
138// ----- Magnetic field is taken in reference point
139//
140 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.;
141 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
142//
143// Cycle to determine common reference point for the fit
144//
145 int counter =0;
146 Amg::Vector3D perGlobalPos;
147 state.m_trkControl.clear(); state.m_trkControl.reserve(InpTrk.size());
148 for (i_ntrk = InpTrk.begin(); i_ntrk != InpTrk.end(); ++i_ntrk) {
149//-- (Measured)Perigee in xAOD::NeutralParticle
150 mPer = &(*i_ntrk)->perigeeParameters();
151 if( mPer==nullptr ) continue; // No perigee!!!
152 perGlobalPos = mPer->position(); //Global position of perigee point
153 if(fabs(perGlobalPos.z()) > m_IDsizeZ)return StatusCode::FAILURE; // Crazy user protection
154 if( perGlobalPos.perp() > m_IDsizeR)return StatusCode::FAILURE;
155 tmp_refFrameX += perGlobalPos.x() ; // Reference system calculation
156 tmp_refFrameY += perGlobalPos.y() ; // Use hit position itself to get more precise
157 tmp_refFrameZ += perGlobalPos.z() ; // magnetic field
158 TrkMatControl tmpMat;
159 tmpMat.trkSavedLocalVertex.setZero();
160 tmpMat.trkRefGlobPos=Amg::Vector3D( perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z());
161 tmpMat.extrapolationType=2; // Perigee point strategy
162 tmpMat.TrkPnt=nullptr; //No reference point for neutral particle for the moment
164 if(counter<(int)state.m_MassInputParticles.size())tmpMat.prtMass = state.m_MassInputParticles[counter];
165 tmpMat.TrkID=counter; state.m_trkControl.push_back(tmpMat);
166 counter++;
167 }
168 if(counter == 0) return StatusCode::FAILURE;
169 tmp_refFrameX /= counter; // Reference frame for the fit
170 tmp_refFrameY /= counter;
171 tmp_refFrameZ /= counter;
172 Amg::Vector3D refGVertex (tmp_refFrameX, tmp_refFrameY, tmp_refFrameZ);
173 PerigeeSurface surfGRefPoint( refGVertex ); // Reference perigee surface for current fit
174//
175//std::cout.setf( std::ios::scientific); std::cout.precision(5);
176//std::cout<<" VK ref.frame="<<tmp_refFrameX<<", "<<tmp_refFrameY<<", "<<tmp_refFrameZ<<'\n';
177//
178// Common reference frame is ready. Start extraction of parameters for fit.
179//
180
181 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.; //set ATLAS frame
182 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.); //set ATLAS frame
183 for (i_ntrk = InpTrk.begin(); i_ntrk != InpTrk.end(); ++i_ntrk) {
184//
185//-- (Measured)Perigee in TrackParticle
186//
187 mPer = &(*i_ntrk)->perigeeParameters();
188 if( mPer==nullptr ) continue; // No perigee!!!
189 perGlobalPos = mPer->position(); //Global position of perigee point
190 if( !convertAmg5SymMtx(mPer->covariance(), CovVertTrk) ) return StatusCode::FAILURE; //VK no good covariance matrix!;
191 state.m_fitField.getMagFld( perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z(), // Magnetic field
192 fx, fy, fz); // at track perigee point
193//
194//--- Move ref. frame to the track common point refGVertex
195// Small beamline inclination doesn't change track covariance matrix
196//
197 AmgSymMatrix(5) tmpCov = AmgSymMatrix(5)(*(mPer->covariance()));
198 const Perigee tmpPer(mPer->position(),mPer->momentum(),mPer->charge(),surfGRefPoint,std::move(tmpCov));
199 VectPerig = tmpPer.parameters();
200 //--- Transform to internal parametrisation
201 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
202 if(fabs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
203 VKalTransform( effectiveBMAG, (double)VectPerig[0], (double)VectPerig[1],
204 (double)VectPerig[2], (double)VectPerig[3], (double)VectPerig[4], CovVertTrk,
205 state.m_ich[ntrk],&state.m_apar[ntrk][0],&state.m_awgt[ntrk][0]);
206 state.m_ich[ntrk]=0;
207 if(state.m_apar[ntrk][4]<0){ state.m_apar[ntrk][4] = -state.m_apar[ntrk][4]; // Charge=0 is always equal to Charge=+1
208 state.m_awgt[ntrk][10] = -state.m_awgt[ntrk][10];
209 state.m_awgt[ntrk][11] = -state.m_awgt[ntrk][11];
210 state.m_awgt[ntrk][12] = -state.m_awgt[ntrk][12];
211 state.m_awgt[ntrk][13] = -state.m_awgt[ntrk][13]; }
212
213 ntrk++;
214 if(ntrk>=NTrMaxVFit) {
215 return StatusCode::FAILURE;
216 }
217 }
218//-------------- Finally setting new reference frame common for ALL tracks
219 state.m_refFrameX=tmp_refFrameX;
220 state.m_refFrameY=tmp_refFrameY;
221 state.m_refFrameZ=tmp_refFrameZ;
222 state.m_fitField.setAtlasMagRefFrame( state.m_refFrameX, state.m_refFrameY, state.m_refFrameZ);
223 return StatusCode::SUCCESS;
224 }
double charge(const T &p)
Definition AtlasPID.h:1003
size_t size() const
Number of registered mappings.
void clear()
Empty the pool.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.
void fill(H5::Group &out_file, size_t iterations)

◆ CvtPerigee()

StatusCode Trk::TrkVKalVrtFitter::CvtPerigee ( const std::vector< const Perigee * > & list,
int & ntrk,
State & state ) const
private

Definition at line 25 of file CvtPerigee.cxx.

28 {
29
30 double tmp_refFrameX = 0, tmp_refFrameY = 0, tmp_refFrameZ = 0;
31
32 //
33 // ----- Set reference frame to (0.,0.,0.) == ATLAS frame
34 // ----- Magnetic field is taken in reference point
35 //
36 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
37 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
38
39 //
40 // Cycle to determine common reference point for the fit
41 //
42 int counter =0;
43 state.m_trkControl.clear();
44 for (const auto& mPer : InpPerigee) {
45 if( mPer == nullptr ){ continue; }
46
47 // Global position of perigee point
48 Amg::Vector3D perGlobalPos = mPer->position();
49 // Crazy user protection
50 if(!(state.m_allowUltraDisplaced) && std::abs(perGlobalPos.z()) > m_IDsizeZ) return StatusCode::FAILURE;
51 if(!(state.m_allowUltraDisplaced) && perGlobalPos.perp() > m_IDsizeR) return StatusCode::FAILURE;
52
53 // Reference system calculation
54 // Use hit position itself to get more precise magnetic field
55 tmp_refFrameX += perGlobalPos.x() ;
56 tmp_refFrameY += perGlobalPos.y() ;
57 tmp_refFrameZ += perGlobalPos.z() ;
58
59 TrkMatControl tmpMat;
60 tmpMat.trkRefGlobPos = Amg::Vector3D(perGlobalPos.x(),
61 perGlobalPos.y(),
62 perGlobalPos.z());
63 // Perigee point strategy
64 tmpMat.extrapolationType = 2;
65 tmpMat.TrkPnt = mPer;
67 if(counter < static_cast<int>(state.m_MassInputParticles.size())){
68 tmpMat.prtMass = state.m_MassInputParticles[counter];
69 }
70 tmpMat.trkSavedLocalVertex.setZero();
71 tmpMat.TrkID=counter;
72 state.m_trkControl.push_back(tmpMat);
73 counter++;
74 }
75
76 if(counter == 0) return StatusCode::FAILURE;
77
78 // Reference frame for the fit
79 tmp_refFrameX /= counter;
80 tmp_refFrameY /= counter;
81 tmp_refFrameZ /= counter;
82
83 //
84 // Common reference frame is ready. Start extraction of parameters for fit.
85 //
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();
90 // Global position of perigee point
91 Amg::Vector3D perGlobalPos = mPer->position();
92 // Global position of reference point
93 Amg::Vector3D perGlobalVrt = mPer->associatedSurface().center();
94 // Restore ATLAS frame
95 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
96 state.m_fitField.setAtlasMagRefFrame(0., 0., 0.);
97 // Magnetic field at perigee point
98 state.m_fitField.getMagFld(perGlobalPos.x(),
99 perGlobalPos.y(),
100 perGlobalPos.z(),
101 fx, fy, fz);
102 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
103 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
104
105 double CovVertTrk[15];
106 std::fill(CovVertTrk,CovVertTrk+15,0.);
107 // No good covariance matrix!
108 if(!convertAmg5SymMtx(mPer->covariance(), CovVertTrk)) return StatusCode::FAILURE;
109 VKalTransform(effectiveBMAG,
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)),
115 CovVertTrk,
116 state.m_ich[ntrk], &state.m_apar[ntrk][0],
117 &state.m_awgt[ntrk][0]);
118
119 // Check if propagation to common reference point is needed and make it
120 // initial track reference position
121 state.m_refFrameX=perGlobalVrt.x();
122 state.m_refFrameY=perGlobalVrt.y();
123 state.m_refFrameZ=perGlobalVrt.z();
124 state.m_fitField.setAtlasMagRefFrame(state.m_refFrameX,
125 state.m_refFrameY,
126 state.m_refFrameZ);
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;
138 Trk::vkalPropagator::Propagate(TrkID, Charge, pari, covi,
139 vrtini, vrtend, &state.m_apar[ntrk][0],
140 &state.m_awgt[ntrk][0],
141 &state.m_vkalFitControl);
142 }
143
144 ntrk++;
145 if(ntrk>=NTrMaxVFit) return StatusCode::FAILURE;
146 }
147
148 //-------------- Finally setting new reference frame common for ALL tracks
149 state.m_refFrameX = tmp_refFrameX;
150 state.m_refFrameY = tmp_refFrameY;
151 state.m_refFrameZ = tmp_refFrameZ;
152 state.m_fitField.setAtlasMagRefFrame(state.m_refFrameX,
153 state.m_refFrameY,
154 state.m_refFrameZ);
155
156 return StatusCode::SUCCESS;
157 }
static void Propagate(long int TrkID, long int Charge, double *ParOld, double *CovOld, double *RefStart, double *RefEnd, double *ParNew, double *CovNew, VKalVrtControlBase *FitControl=0)
@ x
Definition ParamDefs.h:55
@ z
global position (cartesian)
Definition ParamDefs.h:57
@ y
Definition ParamDefs.h:56

◆ CvtTrackParameters()

StatusCode Trk::TrkVKalVrtFitter::CvtTrackParameters ( const std::vector< const TrackParameters * > & InpTrk,
int & ntrk,
State & state ) const
private

Definition at line 23 of file CvtParametersBase.cxx.

26 {
27
28 std::vector<const TrackParameters*>::const_iterator i_pbase;
29 AmgVector(5) VectPerig;
30 VectPerig.setZero();
31 Amg::Vector3D perGlobalPos,perGlobalVrt;
32 const Trk::Perigee* mPer=nullptr;
33
34 double tmp_refFrameX = 0, tmp_refFrameY = 0, tmp_refFrameZ = 0;
35 double rxyMin = 1000000.;
36
37 //
38 // ----- Set reference frame to (0.,0.,0.) == ATLAS frame
39 // ----- Magnetic field is taken in reference point
40 //
41 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.;
42 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
43
44 if( m_InDetExtrapolator == nullptr ){
45 if(msgLvl(MSG::WARNING))msg()<< "No InDet extrapolator given. Can't use TrackParameters!!!" << endmsg;
46 return StatusCode::FAILURE;
47 }
48
49 //
50 // Cycle to determine common reference point for the fit
51 //
52 int counter =0;
53 state.m_trkControl.clear();
54 state.m_trkControl.reserve(InpTrk.size());
55 for (i_pbase = InpTrk.begin(); i_pbase != InpTrk.end(); ++i_pbase) {
56 // Global position of hit
57 perGlobalPos = (*i_pbase)->position();
58 // Crazy user protection
59 if(!(state.m_allowUltraDisplaced) && std::abs(perGlobalPos.z()) > m_IDsizeZ) return StatusCode::FAILURE;
60 if(!(state.m_allowUltraDisplaced) && perGlobalPos.perp() > m_IDsizeR) return StatusCode::FAILURE;
61 tmp_refFrameX += perGlobalPos.x();
62 tmp_refFrameY += perGlobalPos.y();
63 tmp_refFrameZ += perGlobalPos.z();
64
65 // Here we create structure to control material effects
66 TrkMatControl tmpMat;
67 tmpMat.trkSavedLocalVertex.setZero();
68 tmpMat.trkRefGlobPos = Amg::Vector3D(perGlobalPos.x(),
69 perGlobalPos.y(),
70 perGlobalPos.z());
71 // First measured point strategy
72 tmpMat.extrapolationType = m_firstMeasuredPoint ? 0 : 1;
73 tmpMat.TrkPnt = (*i_pbase);
75 if(counter < (int)state.m_MassInputParticles.size()){
76 tmpMat.prtMass = state.m_MassInputParticles[counter];
77 }
78 tmpMat.TrkID = counter;
79 state.m_trkControl.push_back(tmpMat);
80 counter++;
81
82 if(perGlobalPos.perp() < rxyMin){
83 rxyMin=perGlobalPos.perp();
84 state.m_globalFirstHit=(*i_pbase);
85 }
86 }
87
88 if(counter == 0) return StatusCode::FAILURE;
89 // Reference frame for the fit based on hits positions
90 tmp_refFrameX /= counter;
91 tmp_refFrameY /= counter;
92 tmp_refFrameZ /= counter;
93 Amg::Vector3D refGVertex(tmp_refFrameX, tmp_refFrameY, tmp_refFrameZ);
94
95 double fx, fy, fz;
96
97 //
98 // Common reference frame is ready. Start extraction of parameters for fit.
99 // TracksParameters are extrapolated to common point and converted to Perigee
100 // This is needed for VKalVrtCore engine.
101 //
102
103 double CovVertTrk[15];
104 std::fill(CovVertTrk, CovVertTrk+15, 0.);
105
106 for (i_pbase = InpTrk.begin(); i_pbase != InpTrk.end(); ++i_pbase) {
107 long int TrkID=ntrk;
108 const TrackParameters* trkparO = (*i_pbase);
109
110 if(trkparO){
111 const Trk::TrackParameters* trkparN =
112 m_fitPropagator->myExtrapWithMatUpdate(TrkID,
113 trkparO,
114 &refGVertex,
115 state);
116 if(trkparN == nullptr) return StatusCode::FAILURE;
117 mPer = dynamic_cast<const Trk::Perigee*>(trkparN);
118 if(mPer == nullptr) {
119 delete trkparN;
120 return StatusCode::FAILURE;
121 }
122
123 VectPerig = mPer->parameters();
124 // Global position of perigee point
125 perGlobalPos = mPer->position();
126 // Global position of reference point
127 perGlobalVrt = mPer->associatedSurface().center();
128 // VK no good covariance matrix!
129 if( !convertAmg5SymMtx(mPer->covariance(), CovVertTrk) ){
130 delete trkparN;
131 return StatusCode::FAILURE;
132 }
133 delete trkparN;
134 }
135
136 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
137 // Restore ATLAS frame for safety
138 state.m_fitField.setAtlasMagRefFrame(0., 0., 0.);
139 // Magnetic field at perigee point
140 state.m_fitField.getMagFld(perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z(),
141 fx, fy, fz);
142 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
143 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
144
145 VKalTransform(effectiveBMAG,
146 (double)VectPerig[0], (double)VectPerig[1],
147 (double)VectPerig[2], (double)VectPerig[3],
148 (double)VectPerig[4], CovVertTrk,
149 state.m_ich[ntrk], &state.m_apar[ntrk][0],
150 &state.m_awgt[ntrk][0]);
151
152 // Neutral track
153 if( trkparO==nullptr ) {
154 state.m_ich[ntrk]=0;
155 if(state.m_apar[ntrk][4]<0){
156 // Charge=0 is always equal to Charge=+1
157 state.m_apar[ntrk][4] = -state.m_apar[ntrk][4];
158 state.m_awgt[ntrk][10] = -state.m_awgt[ntrk][10];
159 state.m_awgt[ntrk][11] = -state.m_awgt[ntrk][11];
160 state.m_awgt[ntrk][12] = -state.m_awgt[ntrk][12];
161 state.m_awgt[ntrk][13] = -state.m_awgt[ntrk][13];
162 }
163 }
164 ntrk++;
165 if(ntrk>=NTrMaxVFit) return StatusCode::FAILURE;
166 }
167
168 //-------------- Finally setting new reference frame common for ALL tracks
169 state.m_refFrameX = tmp_refFrameX;
170 state.m_refFrameY = tmp_refFrameY;
171 state.m_refFrameZ = tmp_refFrameZ;
172 state.m_fitField.setAtlasMagRefFrame(state.m_refFrameX, state.m_refFrameY, state.m_refFrameZ);
173
174 return StatusCode::SUCCESS;
175 }
Gaudi::Property< bool > m_firstMeasuredPoint
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ CvtTrackParticle()

StatusCode Trk::TrkVKalVrtFitter::CvtTrackParticle ( std::span< const xAOD::TrackParticle *const > list,
int & ntrk,
State & state ) const
private

Definition at line 27 of file CvtTrackParticle.cxx.

30 {
31
32 AmgVector(5) VectPerig; VectPerig.setZero();
33 const Trk::Perigee* mPer=nullptr;
34 double CovVertTrk[15]; std::fill(CovVertTrk,CovVertTrk+15,0.);
35 double tmp_refFrameX=0, tmp_refFrameY=0, tmp_refFrameZ=0;
36 double fx,fy,fz;
37//
38// ----- Set reference frame to (0.,0.,0.) == ATLAS frame
39// ----- Magnetic field is taken in reference point
40//
41 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.;
42 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
43//
44// Cycle to determine common reference point for the fit
45//
46 int counter =0;
47 Amg::Vector3D perGlobalPos;
48 state.m_trkControl.clear(); state.m_trkControl.reserve(InpTrk.size());
49 for (auto i_ntrk = InpTrk.begin(); i_ntrk != InpTrk.end(); ++i_ntrk) {
50//-- (Measured)Perigee in xAOD::TrackParticle
51 mPer = &(*i_ntrk)->perigeeParameters();
52 if( mPer==nullptr ) continue; // No perigee!!!
53 perGlobalPos = mPer->position(); //Global position of perigee point
54 if(!(state.m_allowUltraDisplaced) && std::abs(perGlobalPos.z()) > m_IDsizeZ)return StatusCode::FAILURE; // Crazy user protection
55 if(!(state.m_allowUltraDisplaced) && perGlobalPos.perp() > m_IDsizeR)return StatusCode::FAILURE;
56 tmp_refFrameX += perGlobalPos.x() ; // Reference system calculation
57 tmp_refFrameY += perGlobalPos.y() ; // Use hit position itself to get more precise
58 tmp_refFrameZ += perGlobalPos.z() ; // magnetic field
59 TrkMatControl tmpMat;
60 tmpMat.trkSavedLocalVertex.setZero();
61 tmpMat.trkRefGlobPos=Amg::Vector3D( perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z());
62 tmpMat.extrapolationType=2; // Perigee point strategy
63 tmpMat.TrkPnt=mPer;
65 if(counter<(int)state.m_MassInputParticles.size())tmpMat.prtMass = state.m_MassInputParticles[counter];
66 tmpMat.TrkID=counter; state.m_trkControl.push_back(tmpMat);
67 counter++;
68 }
69 if(counter == 0) return StatusCode::FAILURE;
70 tmp_refFrameX /= counter; // Reference frame for the fit
71 tmp_refFrameY /= counter;
72 tmp_refFrameZ /= counter;
73 Amg::Vector3D refGVertex (tmp_refFrameX, tmp_refFrameY, tmp_refFrameZ);
74
75 PerigeeSurface surfGRefPoint( refGVertex ); // Reference perigee surface for current fit
76//
77//std::cout.setf( std::ios::scientific); std::cout.precision(9);
78//std::cout<<" VK ref.frame="<<tmp_refFrameX<<", "<<tmp_refFrameY<<", "<<tmp_refFrameZ<<'\n';
79//
80// Common reference frame is ready. Start extraction of parameters for fit.
81//
82
83 for (auto i_ntrk = InpTrk.begin(); i_ntrk != InpTrk.end(); ++i_ntrk) {
84//
85//-- (Measured)Perigee in TrackParticle
86//
87 mPer = &(*i_ntrk)->perigeeParameters();
88 if( mPer==nullptr ) continue; // No perigee!!!
89 perGlobalPos = mPer->position(); //Global position of perigee point
90 if( !convertAmg5SymMtx(mPer->covariance(), CovVertTrk) ) return StatusCode::FAILURE; //VK no good covariance matrix!;
91 state.m_fitField.getMagFld( perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z(), // Magnetic field
92 fx, fy, fz); // at the track perigee point
93//
94//--- Move ref. frame to the track common point refGVertex
95// Small beamline inclination doesn't change track covariance matrix
96 AmgSymMatrix(5) tmpCov = AmgSymMatrix(5)(*(mPer->covariance()));
97 const Perigee tmpPer(mPer->position(),mPer->momentum(),mPer->charge(),surfGRefPoint,std::move(tmpCov));
98 VectPerig = tmpPer.parameters();
99
100 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
101 if(fabs(effectiveBMAG) < 0.01) effectiveBMAG=0.01;
102//--- Transform to internal parametrisation
103 VKalTransform( effectiveBMAG, (double)VectPerig[0], (double)VectPerig[1],
104 (double)VectPerig[2], (double)VectPerig[3], (double)VectPerig[4], CovVertTrk,
105 state.m_ich[ntrk],&state.m_apar[ntrk][0],&state.m_awgt[ntrk][0]);
106//
107 ntrk++;
108 if(ntrk>=NTrMaxVFit) {
109 return StatusCode::FAILURE;
110 }
111 }
112//-------------- Finally setting new reference frame common for ALL tracks
113 state.m_refFrameX=tmp_refFrameX;
114 state.m_refFrameY=tmp_refFrameY;
115 state.m_refFrameZ=tmp_refFrameZ;
116 state.m_fitField.setAtlasMagRefFrame( state.m_refFrameX, state.m_refFrameY, state.m_refFrameZ);
117
118 return StatusCode::SUCCESS;
119 }

◆ FillMatrixP() [1/2]

void Trk::TrkVKalVrtFitter::FillMatrixP ( AmgSymMatrix(5)& CovMtx,
std::vector< double > & Matrix )
staticprivate

Definition at line 631 of file TrkVKalVrtFitter.cxx.

632{
633 CovMtx.setIdentity();
634 if( Matrix.size() < 21) return;
635 CovMtx(0,0) = 0;
636 CovMtx(1,1) = 0;
637 CovMtx(2,2)= Matrix[ 9];
638 CovMtx.fillSymmetric(2,3,Matrix[13]);
639 CovMtx(3,3)= Matrix[14];
640 CovMtx.fillSymmetric(2,4,Matrix[18]);
641 CovMtx.fillSymmetric(3,4,Matrix[19]);
642 CovMtx(4,4)= Matrix[20];
643}

◆ FillMatrixP() [2/2]

void Trk::TrkVKalVrtFitter::FillMatrixP ( int iTrk,
AmgSymMatrix(5)& CovMtx,
std::vector< double > & Matrix )
staticprivate

Definition at line 646 of file TrkVKalVrtFitter.cxx.

647{
648 int iTmp=(iTrk+1)*3;
649 int NContent = Matrix.size();
650 CovMtx.setIdentity(); //Clean matrix for the beginning, then fill needed elements
651 CovMtx(0,0) = 0;
652 CovMtx(1,1) = 0;
653 int pnt = (iTmp+1)*iTmp/2 + iTmp; if( pnt > NContent ) return;
654 CovMtx(2,2) = Matrix[pnt];
655 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp; if( pnt+1 > NContent ){ CovMtx.setIdentity(); return; }
656 CovMtx.fillSymmetric(2,3,Matrix[pnt]);
657 CovMtx(3,3) = Matrix[pnt+1];
658 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp; if( pnt+2 > NContent ){ CovMtx.setIdentity(); return; }
659 CovMtx.fillSymmetric(2,4,Matrix[pnt]);
660 CovMtx.fillSymmetric(3,4,Matrix[pnt+1]);
661 CovMtx(4,4) = Matrix[pnt+2];
662}

◆ finalize()

StatusCode Trk::TrkVKalVrtFitter::finalize ( )
finaloverridevirtual

Definition at line 65 of file TrkVKalVrtFitter.cxx.

66{
67 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"TrkVKalVrtFitter finalize() successful" << endmsg;
68 return StatusCode::SUCCESS;
69}

◆ findPositions()

int Trk::TrkVKalVrtFitter::findPositions ( const std::vector< int > & inputList,
const std::vector< int > & refList,
std::vector< int > & index )
staticprivate

Definition at line 795 of file TrkCascadeFitter.cxx.

796{
797 int R,I;
798 index.clear();
799 int nI=inputList.size(); if(nI==0) return 0; //all ok
800 int nR=refList.size(); if(nR==0) return 0; //all ok
801 //std::cout<<"inp="; for(I=0; I<nI; I++)std::cout<<inputList[I]; std::cout<<'\n';
802 //std::cout<<"ref="; for(R=0; R<nR; R++)std::cout<<refList[R]; std::cout<<'\n';
803 for(I=0; I<nI; I++){
804 for(R=0; R<nR; R++) if(inputList[I]==refList[R]){index.push_back(R); break;}
805 if(R==nR) return -1; //input element not found in reference list
806 }
807 return 0;
808}
#define I(x, y, z)
Definition MD5.cxx:116
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
str index
Definition DeMoScan.py:362

◆ fit() [1/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeListC ) const
finaloverridevirtual

Definition at line 570 of file TrkVKalVrtFitter.cxx.

572{
573 //Local variable state uses 49312 bytes of stack space
574 //coverity[STACK_USE]
575 State state;
576 initState (ctx, state);
577 Amg::Vector3D VertexIni(0.,0.,0.);
578 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
579 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
580 std::vector<const NeutralParameters*> perigeeListN(0);
582 TLorentzVector Momentum;
583 long int Charge;
584 std::vector<double> ErrorMatrix;
585 std::vector<double> Chi2PerTrk;
586 std::vector< std::vector<double> > TrkAtVrt;
587 double Chi2;
588 sc=VKalVrtFit( perigeeListC, perigeeListN,
589 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
590
591 if(sc.isSuccess()) {
592 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
593 }
594 return {};
595}
static Double_t sc
virtual StatusCode VKalVrtFitFast(std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
void initState(const EventContext &ctx, State &state) const
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
std::unique_ptr< xAOD::Vertex > makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
virtual void setApproximateVertex(double X, double Y, double Z, IVKalState &istate) const override final
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ fit() [2/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeListC,
const std::vector< const Trk::NeutralParameters * > & perigeeListN ) const
finaloverridevirtual

Definition at line 597 of file TrkVKalVrtFitter.cxx.

600{
601 //Local variable state uses 49312 bytes of stack space
602 //coverity[STACK_USE]
603 State state;
604 initState (ctx, state);
605 Amg::Vector3D VertexIni(0.,0.,0.);
606 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
607 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
609 TLorentzVector Momentum;
610 long int Charge;
611 std::vector<double> ErrorMatrix;
612 std::vector<double> Chi2PerTrk;
613 std::vector< std::vector<double> > TrkAtVrt;
614 double Chi2;
615 sc=VKalVrtFit( perigeeListC, perigeeListN,
616 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
617
618 if(sc.isSuccess()) {
619 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
620 }
621 return {};
622}

◆ fit() [3/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeList,
const Amg::Vector3D & startingPoint ) const
finaloverridevirtual

Interface for MeasuredPerigee with starting point.

Definition at line 197 of file TrkVKalVrtFitter.cxx.

200{
201 //Local variable state uses 49312 bytes of stack space
202 //coverity[STACK_USE]
203 State state;
204 initState (ctx, state);
205 setApproximateVertex(startingPoint.x(),
206 startingPoint.y(),
207 startingPoint.z(),
208 state);
209 std::vector<const NeutralParameters*> perigeeListN(0);
211 TLorentzVector Momentum;
212 long int Charge;
213 std::vector<double> ErrorMatrix;
214 std::vector<double> Chi2PerTrk;
215 std::vector< std::vector<double> > TrkAtVrt;
216 double Chi2;
217 StatusCode sc=VKalVrtFit( perigeeListC, perigeeListN,
218 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
219
220 if(sc.isSuccess()) {
221 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
222 }
223 return {};
224}

◆ fit() [4/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeList,
const std::vector< const NeutralParameters * > & perigeeListN,
const Amg::Vector3D & startingPoint ) const
finaloverridevirtual

Definition at line 227 of file TrkVKalVrtFitter.cxx.

231{
232 //Local variable state uses 49312 bytes of stack space
233 //coverity[STACK_USE]
234 State state;
235 initState (ctx, state);
236 setApproximateVertex(startingPoint.x(),
237 startingPoint.y(),
238 startingPoint.z(),
239 state);
241 TLorentzVector Momentum;
242 long int Charge;
243 std::vector<double> ErrorMatrix;
244 std::vector<double> Chi2PerTrk;
245 std::vector< std::vector<double> > TrkAtVrt;
246 double Chi2;
247 StatusCode sc=VKalVrtFit( perigeeListC,perigeeListN,
248 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
249
250 if(sc.isSuccess()) {
251 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
252 }
253 return {};
254}

◆ fit() [5/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeList,
const std::vector< const NeutralParameters * > & perigeeListN,
const xAOD::Vertex & constraint ) const
finaloverridevirtual

Definition at line 313 of file TrkVKalVrtFitter.cxx.

317{
318 //Local variable state uses 49312 bytes of stack space
319 //coverity[STACK_USE]
320 State state;
321 initState (ctx, state);
322
323 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
324 Amg::Vector3D VertexIni(0.,0.,0.);
325 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
326 if( sc.isSuccess()){
327 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
328 }else{
329 setApproximateVertex(constraint.position().x(),
330 constraint.position().y(),
331 constraint.position().z(),
332 state);
333 }
334 setVertexForConstraint(constraint.position().x(),
335 constraint.position().y(),
336 constraint.position().z(),
337 state);
338 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
339 constraint.covariancePosition()(Trk::y,Trk::x),
340 constraint.covariancePosition()(Trk::y,Trk::y),
341 constraint.covariancePosition()(Trk::z,Trk::x),
342 constraint.covariancePosition()(Trk::z,Trk::y),
343 constraint.covariancePosition()(Trk::z,Trk::z),
344 state);
345 state.m_useAprioriVertex=true;
347 TLorentzVector Momentum;
348 long int Charge;
349 std::vector<double> ErrorMatrix;
350 std::vector<double> Chi2PerTrk;
351 std::vector< std::vector<double> > TrkAtVrt;
352 double Chi2;
353 sc=VKalVrtFit( perigeeListC, perigeeListN,
354 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
355
356
357 if(sc.isSuccess()) {
358 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
359 }
360 return {};
361}
virtual void setCovVrtForConstraint(double XX, double XY, double YY, double XZ, double YZ, double ZZ, IVKalState &istate) const override final
virtual void setVertexForConstraint(const xAOD::Vertex &, IVKalState &istate) const override final
const Amg::Vector3D & position() const
Returns the 3-pos.

◆ fit() [6/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const TrackParameters * > & perigeeListC,
const xAOD::Vertex & constraint ) const
finaloverridevirtual

Interface for MeasuredPerigee with vertex constraint.

the position of the constraint is ALWAYS the starting point

Definition at line 263 of file TrkVKalVrtFitter.cxx.

266{
267 //Local variable state uses 49312 bytes of stack space
268 //coverity[STACK_USE]
269 State state;
270 initState (ctx, state);
271 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
272 Amg::Vector3D VertexIni(0.,0.,0.);
273 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
274 if( sc.isSuccess()){
275 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
276 }else{
277 setApproximateVertex(constraint.position().x(),
278 constraint.position().y(),
279 constraint.position().z(),
280 state);
281 }
282 setVertexForConstraint(constraint.position().x(),
283 constraint.position().y(),
284 constraint.position().z(),
285 state);
286 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
287 constraint.covariancePosition()(Trk::y,Trk::x),
288 constraint.covariancePosition()(Trk::y,Trk::y),
289 constraint.covariancePosition()(Trk::z,Trk::x),
290 constraint.covariancePosition()(Trk::z,Trk::y),
291 constraint.covariancePosition()(Trk::z,Trk::z),
292 state);
293 state.m_useAprioriVertex=true;
294 std::vector<const NeutralParameters*> perigeeListN(0);
296 TLorentzVector Momentum;
297 long int Charge;
298 std::vector<double> ErrorMatrix;
299 std::vector<double> Chi2PerTrk;
300 std::vector< std::vector<double> > TrkAtVrt;
301 double Chi2;
302 sc=VKalVrtFit( perigeeListC, perigeeListN,
303 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
304
305
306 if(sc.isSuccess()) {
307 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
308 }
309 return {};
310}

◆ fit() [7/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const Amg::Vector3D & startingPoint ) const
finaloverridevirtual

Interface for xAOD::TrackParticle with starting point Implements the new style (unique_ptr,EventContext).

Definition at line 367 of file TrkVKalVrtFitter.cxx.

370{
371 //Local variable state uses 49312 bytes of stack space
372 //coverity[STACK_USE]
373 State state;
374 initState(ctx, state);
375 return std::unique_ptr<xAOD::Vertex>(fit(xtpListC, startingPoint, state));
376}
virtual std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.

◆ fit() [8/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const std::vector< const xAOD::NeutralParticle * > & vectorNeu,
const Amg::Vector3D & startingPoint ) const
finaloverridevirtual

Definition at line 414 of file TrkVKalVrtFitter.cxx.

418{
419 //Local variable state uses 49312 bytes of stack space
420 //coverity[STACK_USE]
421 State state;
422 initState (ctx, state);
423 std::unique_ptr<xAOD::Vertex> tmpVertex;
424 setApproximateVertex(startingPoint.x(),
425 startingPoint.y(),
426 startingPoint.z(),
427 state);
429 TLorentzVector Momentum;
430 long int Charge;
431 std::vector<double> ErrorMatrix;
432 std::vector<double> Chi2PerTrk;
433 std::vector< std::vector<double> > TrkAtVrt;
434 double Chi2;
435 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
436 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
437 if(sc.isSuccess()) {
438 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
439 dvect fittrkwgt;
440 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
441 for(int ii=0; ii<state.m_FitStatus; ii++) {
442 if(ii<(int)xtpListC.size()) {
443 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
444 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
445 else tmpVertex->addTrackAtVertex(TEL,1.);
446 }else{
447 ElementLink<xAOD::NeutralParticleContainer> TEL; TEL.setElement( xtpListN[ii] );
448 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
449 else tmpVertex->addNeutralAtVertex(TEL,1.);
450 }
451 }
452 }
453
454 return tmpVertex;
455}
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
std::vector< double > dvect

◆ fit() [9/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const std::vector< const xAOD::NeutralParticle * > & vectorNeu,
const xAOD::Vertex & constraint ) const
finaloverridevirtual

Definition at line 515 of file TrkVKalVrtFitter.cxx.

519{
520 //Local variable state uses 49312 bytes of stack space
521 //coverity[STACK_USE]
522 State state;
523 initState (ctx, state);
524
525 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
526 std::unique_ptr<xAOD::Vertex> tmpVertex;
527 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
528 setVertexForConstraint(constraint.position().x(),
529 constraint.position().y(),
530 constraint.position().z(),
531 state);
532 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
533 constraint.covariancePosition()(Trk::y,Trk::x),
534 constraint.covariancePosition()(Trk::y,Trk::y),
535 constraint.covariancePosition()(Trk::z,Trk::x),
536 constraint.covariancePosition()(Trk::z,Trk::y),
537 constraint.covariancePosition()(Trk::z,Trk::z),
538 state);
539 state.m_useAprioriVertex=true;
541 TLorentzVector Momentum;
542 long int Charge;
543 std::vector<double> ErrorMatrix;
544 std::vector<double> Chi2PerTrk;
545 std::vector< std::vector<double> > TrkAtVrt;
546 double Chi2;
547 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
548 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
549 if(sc.isSuccess()){
550 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
551 dvect fittrkwgt;
552 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
553 for(int ii=0; ii<state.m_FitStatus; ii++) {
554 if(ii<(int)xtpListC.size()) {
555 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
556 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
557 else tmpVertex->addTrackAtVertex(TEL,1.);
558 }else{
559 ElementLink<xAOD::NeutralParticleContainer> TEL; TEL.setElement( xtpListN[ii] );
560 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
561 else tmpVertex->addNeutralAtVertex(TEL,1.);
562 }
563 }
564 }
565
566 return tmpVertex;
567}

◆ fit() [10/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const EventContext & ctx,
const std::vector< const xAOD::TrackParticle * > & xtpListC,
const xAOD::Vertex & constraint ) const
finaloverridevirtual

Interface for xAOD::TrackParticle with vertex constraint.

the position of the constraint is ALWAYS the starting point

Definition at line 459 of file TrkVKalVrtFitter.cxx.

462{
463 //Local variable state uses 49312 bytes of stack space
464 //coverity[STACK_USE]
465 State state;
466 initState (ctx, state);
467 return fit (xtpListC, constraint, state);
468}

◆ fit() [11/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const Amg::Vector3D & constraint,
IVKalState & istate ) const

Definition at line 378 of file TrkVKalVrtFitter.cxx.

381{
382 assert(dynamic_cast<State*> (&istate)!=nullptr);
383 State& state = static_cast<State&> (istate);
384
385 std::unique_ptr<xAOD::Vertex> tmpVertex;
386 setApproximateVertex(startingPoint.x(),
387 startingPoint.y(),
388 startingPoint.z(),
389 state);
390 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
392 TLorentzVector Momentum;
393 long int Charge;
394 std::vector<double> ErrorMatrix;
395 std::vector<double> Chi2PerTrk;
396 std::vector< std::vector<double> > TrkAtVrt;
397 double Chi2;
398 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
399 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
400 if(sc.isSuccess()) {
401 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
402 dvect fittrkwgt;
403 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
404 for(int ii=0; ii<state.m_FitStatus; ii++) {
405 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
406 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
407 else tmpVertex->addTrackAtVertex(TEL,1.);
408 }
409 }
410
411 return tmpVertex;
412}

◆ fit() [12/12]

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::fit ( const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const xAOD::Vertex & constraint,
IVKalState & istate ) const

Definition at line 469 of file TrkVKalVrtFitter.cxx.

472{
473 assert(dynamic_cast<State*> (&istate)!=nullptr);
474 State& state = static_cast<State&> (istate);
475
476 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
477 std::unique_ptr<xAOD::Vertex> tmpVertex;
478 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
479 setVertexForConstraint(constraint.position().x(),
480 constraint.position().y(),
481 constraint.position().z(),
482 state);
483 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
484 constraint.covariancePosition()(Trk::y,Trk::x),
485 constraint.covariancePosition()(Trk::y,Trk::y),
486 constraint.covariancePosition()(Trk::z,Trk::x),
487 constraint.covariancePosition()(Trk::z,Trk::y),
488 constraint.covariancePosition()(Trk::z,Trk::z),
489 state);
490 state.m_useAprioriVertex=true;
491 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
493 TLorentzVector Momentum;
494 long int Charge;
495 std::vector<double> ErrorMatrix;
496 std::vector<double> Chi2PerTrk;
497 std::vector< std::vector<double> > TrkAtVrt;
498 double Chi2;
499 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
500 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
501 if(sc.isSuccess()) {
502 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
503 dvect fittrkwgt;
504 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
505 for(int ii=0; ii<state.m_FitStatus; ii++) {
506 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
507 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
508 else tmpVertex->addTrackAtVertex(TEL,1.);
509 }
510 }
511
512 return tmpVertex;
513}

◆ fitCascade()

VxCascadeInfo * Trk::TrkVKalVrtFitter::fitCascade ( IVKalState & istate,
const Vertex * primVertex = 0,
bool FirstDecayAtPV = false ) const
finaloverride

Definition at line 278 of file TrkCascadeFitter.cxx.

280{
281 assert(dynamic_cast<State*> (&istate)!=nullptr);
282 State& state = static_cast<State&> (istate);
283 CascadeState& cstate = *state.m_cascadeState;
284
285 int iv,it,jt;
286 std::vector< Vect3DF > cVertices;
287 std::vector< std::vector<double> > covVertices;
288 std::vector< std::vector< VectMOM> > fittedParticles;
289 std::vector< std::vector<double> > fittedCovariance;
290 std::vector<double> fitFullCovariance;
291 std::vector<double> particleChi2;
292//
293 int ntrk=0;
295 std::vector<const TrackParameters*> baseInpTrk;
296 if(m_firstMeasuredPoint){ //First measured point strategy
297 std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
298 //for (i_ntrk = cstate.m_partListForCascade.begin(); i_ntrk < cstate.m_partListForCascade.end(); ++i_ntrk) baseInpTrk.push_back(GetFirstPoint(*i_ntrk));
299 unsigned int indexFMP;
300 for (i_ntrk = cstate.m_partListForCascade.begin(); i_ntrk < cstate.m_partListForCascade.end(); ++i_ntrk) {
301 if ((*i_ntrk)->indexOfParameterAtPosition(indexFMP, xAOD::FirstMeasurement)){
302 ATH_MSG_DEBUG("FirstMeasuredPoint on track is discovered. Use it.");
303 baseInpTrk.push_back(new CurvilinearParameters((*i_ntrk)->curvilinearParameters(indexFMP)));
304 }else{
305 ATH_MSG_DEBUG("No FirstMeasuredPoint on track in CascadeFitter. Stop fit");
306 { CLEANCASCADE(); return nullptr; }
307 }
308 }
309 sc=CvtTrackParameters(baseInpTrk,ntrk,state);
310 if(sc.isFailure()){ntrk=0; sc=CvtTrackParticle(cstate.m_partListForCascade,ntrk,state);}
311 }else{
312 sc=CvtTrackParticle(cstate.m_partListForCascade,ntrk,state);
313 }
314 if(sc.isFailure()){ CLEANCASCADE(); return nullptr; }
315
316 VKalVrtConfigureFitterCore(ntrk, state);
317
318 std::vector< std::vector<int> > vertexDefinition; // track indices for vertex;
319 std::vector< std::vector<int> > cascadeDefinition; // cascade structure
320 makeSimpleCascade(vertexDefinition, cascadeDefinition, cstate);
321
322 double * partMass=new double[ntrk];
323 for(int i=0; i<ntrk; i++) partMass[i] = cstate.m_partMassForCascade[i];
324 int IERR = makeCascade(state.m_vkalFitControl, ntrk, state.m_ich, partMass, &state.m_apar[0][0], &state.m_awgt[0][0],
325 vertexDefinition,
326 cascadeDefinition,
327 m_cascadeCnstPrecision); delete[] partMass; if(IERR){ CLEANCASCADE(); return nullptr;}
328 CascadeEvent & refCascadeEvent=*(state.m_vkalFitControl.getCascadeEvent());
329//
330// Then set vertex mass constraints
331//
332 std::vector<int> indexT,indexV,indexTT,indexVV,tmpInd; // track indices for vertex;
333 for (const PartialMassConstraint& c : cstate.m_partMassCnstForCascade) {
334 //int index=c.VRT; // vertex position in simple structure
335 int index=getSimpleVIndex(c.VRT, cstate); // vertex position in simple structure
336 if (index < 0)[[unlikely]]{
337 throw std::runtime_error("TrkVKalVrtFitter::fitCascade: index into vector is negative.");
338 }
339 IERR = findPositions(c.trkInVrt, vertexDefinition[index], indexT);
340 if(IERR)break;
341 tmpInd.clear();
342 for (int idx : c.pseudoInVrt)
343 tmpInd.push_back( getSimpleVIndex(idx, cstate) );
344 IERR = findPositions( tmpInd, cascadeDefinition[index], indexV); if(IERR)break;
345 //IERR = findPositions(c.pseudoInVrt, cascadeDefinition[index], indexV); if(IERR)break; //VK 31.10.2011 ERROR!!!
346 IERR = setCascadeMassConstraint(refCascadeEvent,index, indexT, indexV, c.Mass);
347 if(IERR)break;
348 }
349 if(IERR){ CLEANCASCADE(); return nullptr;}
350 if(msgLvl(MSG::DEBUG)){
351 msg(MSG::DEBUG)<<"Standard cascade fit" << endmsg;
352 printSimpleCascade(vertexDefinition,cascadeDefinition, cstate);
353 }
354//
355// At last fit of cascade
356// primVrt == 0 - no primary vertex
357// primVrt is <Vertex*> - exact pointing to primary vertex
358// primVrt is <RecVertex*> - summary track pass near primary vertex
359//
360 if(primVrt){
361 double vertex[3] = {primVrt->position().x()-state.m_refFrameX, primVrt->position().y()-state.m_refFrameY,primVrt->position().z()-state.m_refFrameZ};
362 const RecVertex* primVrtRec=dynamic_cast< const RecVertex* > (primVrt);
363 if(primVrtRec){
364 double covari[6] = {primVrtRec->covariancePosition()(0,0),primVrtRec->covariancePosition()(0,1),
365 primVrtRec->covariancePosition()(1,1),primVrtRec->covariancePosition()(0,2),
366 primVrtRec->covariancePosition()(1,2),primVrtRec->covariancePosition()(2,2)};
367 if(FirstDecayAtPV) { IERR = processCascadePV(refCascadeEvent,vertex,covari);}
368 else { IERR = processCascade(refCascadeEvent,vertex,covari);}
369 }else{
370 IERR = processCascade(refCascadeEvent,vertex);
371 }
372 }else{
373 IERR = processCascade(refCascadeEvent);
374 }
375 if(IERR){ CLEANCASCADE(); return nullptr;}
376 getFittedCascade(refCascadeEvent, cVertices, covVertices, fittedParticles, fittedCovariance, particleChi2, fitFullCovariance );
377
378// for(int iv=0; iv<(int)cVertices.size(); iv++){ std::cout<<"iv="<<iv<<" masses=";
379// for(int it=0; it<(int)fittedParticles[iv].size(); it++){
380// double m=sqrt( fittedParticles[iv][it].E *fittedParticles[iv][it].E
381// -fittedParticles[iv][it].Pz*fittedParticles[iv][it].Pz
382// -fittedParticles[iv][it].Py*fittedParticles[iv][it].Py
383// -fittedParticles[iv][it].Px*fittedParticles[iv][it].Px);
384// std::cout<<m<<", "; } std::cout<<'\n'; }
385//-----------------------------------------------------------------------------
386//
387// Check cascade correctness
388//
389 int ip,ivFrom=0,ivTo;
390 double px,py,pz,Sign=10.;
391 for( ivTo=0; ivTo<(int)vertexDefinition.size(); ivTo++){ //Vertex to check
392 if(cascadeDefinition[ivTo].empty()) continue; //no pointing to it
393 for( ip=0; ip<(int)cascadeDefinition[ivTo].size(); ip++){
394 ivFrom=cascadeDefinition[ivTo][ip]; //pointing vertex
395 px=py=pz=0;
396 for(it=0; it<(int)fittedParticles[ivFrom].size(); it++){
397 px += fittedParticles[ivFrom][it].Px;
398 py += fittedParticles[ivFrom][it].Py;
399 pz += fittedParticles[ivFrom][it].Pz;
400 }
401 Sign= (cVertices[ivFrom].X-cVertices[ivTo].X)*px
402 +(cVertices[ivFrom].Y-cVertices[ivTo].Y)*py
403 +(cVertices[ivFrom].Z-cVertices[ivTo].Z)*pz;
404 if(Sign<0) break;
405 }
406 if(Sign<0) break;
407 }
408//
409//--------------- Wrong vertices in cascade precedence. Squeeze cascade and refit-----------
410//
411 int NDOFsqueezed=0;
412 if(Sign<0.){
413 int index,itmp;
414 std::vector< std::vector<int> > new_vertexDefinition; // track indices for vertex;
415 std::vector< std::vector<int> > new_cascadeDefinition; // cascade structure
416 cstate.m_cascadeVList[ivFrom].mergedTO=cstate.m_cascadeVList[ivTo].vID;
417 cstate.m_cascadeVList[ivTo].mergedIN.push_back(ivFrom);
418 makeSimpleCascade(new_vertexDefinition, new_cascadeDefinition, cstate);
419 if(msgLvl(MSG::DEBUG)){
420 msg(MSG::DEBUG)<<"Compressed cascade fit" << endmsg;
421 printSimpleCascade(new_vertexDefinition,new_cascadeDefinition, cstate);
422 }
423//-----------------------------------------------------------------------------------------
424 state.m_vkalFitControl.renewCascadeEvent(new CascadeEvent());
425 partMass=new double[ntrk];
426 for(int i=0; i<ntrk; i++) partMass[i] = cstate.m_partMassForCascade[i];
427 int IERR = makeCascade(state.m_vkalFitControl, ntrk, state.m_ich, partMass, &state.m_apar[0][0], &state.m_awgt[0][0],
428 new_vertexDefinition,
429 new_cascadeDefinition); delete[] partMass; if(IERR){ CLEANCASCADE(); return nullptr;}
430//------Set up mass constraints
431 for (const PartialMassConstraint& c : cstate.m_partMassCnstForCascade) {
432 indexT.clear(); indexV.clear();
433 index=getSimpleVIndex( c.VRT, cstate);
434 IERR = findPositions(c.trkInVrt, new_vertexDefinition[index], indexT); if(IERR)break;
435 for (VertexID inV : c.pseudoInVrt) { //cycle over pseudotracks
436 int icv=indexInV(inV, cstate); if(icv<0) break;
437 if(cstate.m_cascadeVList[icv].mergedTO == c.VRT){
438 IERR = findPositions(cstate.m_cascadeVList[icv].trkInVrt, new_vertexDefinition[index], indexTT);
439 if(IERR)break;
440 indexT.insert (indexT.end(), indexTT.begin(), indexTT.end());
441 }else{
442 std::vector<int> tmpI(1); tmpI[0]=inV;
443 IERR = findPositions(tmpI, new_cascadeDefinition[index], indexVV);
444 if(IERR)break;
445 indexV.insert (indexV.end(), indexVV.begin(), indexVV.end());
446 }
447 } if(IERR)break;
448 //std::cout<<"trk2="; for(int I=0; I<(int)indexT.size(); I++)std::cout<<indexT[I]; std::cout<<'\n';
449 //std::cout<<"pse="; for(int I=0; I<(int)indexV.size(); I++)std::cout<<indexV[I]; std::cout<<'\n';
450 IERR = setCascadeMassConstraint(*(state.m_vkalFitControl.getCascadeEvent()), index , indexT, indexV, c.Mass); if(IERR)break;
451 }
452 ATH_MSG_DEBUG("Setting compressed mass constraints ierr="<<IERR);
453 if(IERR){ CLEANCASCADE(); return nullptr;}
454//
455//--------------------------- Refit
456//
457 if(primVrt){
458 double vertex[3] = {primVrt->position().x()-state.m_refFrameX, primVrt->position().y()-state.m_refFrameY,primVrt->position().z()-state.m_refFrameZ};
459 const RecVertex* primVrtRec=dynamic_cast< const RecVertex* > (primVrt);
460 if(primVrtRec){
461 double covari[6] = {primVrtRec->covariancePosition()(0,0),primVrtRec->covariancePosition()(0,1),
462 primVrtRec->covariancePosition()(1,1),primVrtRec->covariancePosition()(0,2),
463 primVrtRec->covariancePosition()(1,2),primVrtRec->covariancePosition()(2,2)};
464 IERR = processCascade(*(state.m_vkalFitControl.getCascadeEvent()),vertex,covari);
465 }else{
466 IERR = processCascade(*(state.m_vkalFitControl.getCascadeEvent()),vertex);
467 }
468 }else{
469 IERR = processCascade(*(state.m_vkalFitControl.getCascadeEvent()));
470 }
471 if(IERR){ CLEANCASCADE(); return nullptr;}
472 NDOFsqueezed=getCascadeNDoF(cstate)+3-2; // Remove vertex (+3 ndf) and this vertex pointing (-2 ndf)
473//
474//-------------------- Get information according to old cascade structure
475//
476 std::vector< Vect3DF > t_cVertices;
477 std::vector< std::vector<double> > t_covVertices;
478 std::vector< std::vector< VectMOM> > t_fittedParticles;
479 std::vector< std::vector<double> > t_fittedCovariance;
480 std::vector<double> t_fitFullCovariance;
481 getFittedCascade(*(state.m_vkalFitControl.getCascadeEvent()), t_cVertices, t_covVertices, t_fittedParticles,
482 t_fittedCovariance, particleChi2, t_fitFullCovariance);
483 cVertices.clear(); covVertices.clear();
484//
485//------------------------- Real tracks
486//
487 if(msgLvl(MSG::DEBUG)){
488 msg(MSG::DEBUG)<<"Initial cascade momenta"<<endmsg;
489 for(int kv=0; kv<(int)fittedParticles.size(); kv++){
490 for(int kt=0; kt<(int)fittedParticles[kv].size(); kt++)
491 std::cout<<
492 " Px="<<fittedParticles[kv][kt].Px<<" Py="<<fittedParticles[kv][kt].Py<<";";
493 std::cout<<'\n';
494 }
495 msg(MSG::DEBUG)<<"Squized cascade momenta"<<endmsg;
496 for(int kv=0; kv<(int)t_fittedParticles.size(); kv++){
497 for(int kt=0; kt<(int)t_fittedParticles[kv].size(); kt++)
498 std::cout<<
499 " Px="<<t_fittedParticles[kv][kt].Px<<" Py="<<t_fittedParticles[kv][kt].Py<<";";
500 std::cout<<'\n';
501 }
502 }
503 for(iv=0; iv<(int)cstate.m_cascadeVList.size(); iv++){
504 index=getSimpleVIndex( cstate.m_cascadeVList[iv].vID, cstate ); //index of vertex in simplified structure
505 cVertices.push_back(t_cVertices[index]);
506 covVertices.push_back(t_covVertices[index]);
507 for(it=0; it<(int)cstate.m_cascadeVList[iv].trkInVrt.size(); it++){
508 int numTrk=cstate.m_cascadeVList[iv].trkInVrt[it]; //track itself
509 for(itmp=0; itmp<(int)new_vertexDefinition[index].size(); itmp++) if(numTrk==new_vertexDefinition[index][itmp])break;
510 fittedParticles[iv][it]=t_fittedParticles[index][itmp];
511//Update only particle covariance. Cross particle covariance remains old.
512 fittedCovariance[iv][SymIndex(it,0,0)]=t_fittedCovariance[index][SymIndex(itmp,0,0)];
513 fittedCovariance[iv][SymIndex(it,1,0)]=t_fittedCovariance[index][SymIndex(itmp,1,0)];
514 fittedCovariance[iv][SymIndex(it,1,1)]=t_fittedCovariance[index][SymIndex(itmp,1,1)];
515 fittedCovariance[iv][SymIndex(it,2,0)]=t_fittedCovariance[index][SymIndex(itmp,2,0)];
516 fittedCovariance[iv][SymIndex(it,2,1)]=t_fittedCovariance[index][SymIndex(itmp,2,1)];
517 fittedCovariance[iv][SymIndex(it,2,2)]=t_fittedCovariance[index][SymIndex(itmp,2,2)];
518 }
519 fittedCovariance[iv][SymIndex(0,0,0)]=t_fittedCovariance[index][SymIndex(0,0,0)]; // Update also vertex
520 fittedCovariance[iv][SymIndex(0,1,0)]=t_fittedCovariance[index][SymIndex(0,1,0)]; // covarinace
521 fittedCovariance[iv][SymIndex(0,1,1)]=t_fittedCovariance[index][SymIndex(0,1,1)];
522 fittedCovariance[iv][SymIndex(0,2,0)]=t_fittedCovariance[index][SymIndex(0,2,0)];
523 fittedCovariance[iv][SymIndex(0,2,1)]=t_fittedCovariance[index][SymIndex(0,2,1)];
524 fittedCovariance[iv][SymIndex(0,2,2)]=t_fittedCovariance[index][SymIndex(0,2,2)];
525 }
526// Pseudo-tracks. They are filled based on fitted results for nonmerged vertices
527// or as sum for merged vertices
528 VectMOM tmpMom{};
529 for(iv=0; iv<(int)cstate.m_cascadeVList.size(); iv++){
530 index=getSimpleVIndex( cstate.m_cascadeVList[iv].vID, cstate ); //index of current vertex in simplified structure
531 int NTrkInVrt=cstate.m_cascadeVList[iv].trkInVrt.size();
532 for(ip=0; ip<(int)cstate.m_cascadeVList[iv].inPointingV.size(); ip++){ //inPointing verties
533 int tmpIndexV=indexInV( cstate.m_cascadeVList[iv].inPointingV[ip], cstate); //index of inPointing vertex in full structure
534 if(cstate.m_cascadeVList[tmpIndexV].mergedTO){ //vertex is merged, so take pseudo-track as a sum
535 tmpMom.Px=tmpMom.Py=tmpMom.Pz=tmpMom.E=0.;
536 for(it=0; it<(int)(cstate.m_cascadeVList[tmpIndexV].trkInVrt.size()+
537 cstate.m_cascadeVList[tmpIndexV].inPointingV.size()); it++){
538 tmpMom.Px += fittedParticles[tmpIndexV][it].Px; tmpMom.Py += fittedParticles[tmpIndexV][it].Py;
539 tmpMom.Pz += fittedParticles[tmpIndexV][it].Pz; tmpMom.E += fittedParticles[tmpIndexV][it].E;
540 }
541 fittedParticles[iv][ip+NTrkInVrt]=tmpMom;
542 }else{
543 int indexS=getSimpleVIndex( cstate.m_cascadeVList[iv].inPointingV[ip], cstate ); //index of inPointing vertex in simplified structure
544 for(itmp=0; itmp<(int)new_cascadeDefinition[index].size(); itmp++) if(indexS==new_cascadeDefinition[index][itmp])break;
545 fittedParticles[iv][ip+NTrkInVrt]=t_fittedParticles[index][itmp+new_vertexDefinition[index].size()];
546 }
547 }
548 }
549 if(msgLvl(MSG::DEBUG)){
550 msg(MSG::DEBUG)<<"Refit cascade momenta"<<endmsg;
551 for(int kv=0; kv<(int)fittedParticles.size(); kv++){
552 for(int kt=0; kt<(int)fittedParticles[kv].size(); kt++)
553 std::cout<<
554 " Px="<<fittedParticles[kv][kt].Px<<" Py="<<fittedParticles[kv][kt].Py<<";";
555 std::cout<<'\n';
556 }
557 }
558// Covariance matrix for nonmerged vertices is updated.
559// For merged vertices (both IN and TO ) it's taken from old fit
560
561 for(iv=0; iv<(int)cstate.m_cascadeVList.size(); iv++){
562 bool isMerged=false;
563 if(cstate.m_cascadeVList[iv].mergedTO)isMerged=true; //vertex is merged
564 index=getSimpleVIndex( cstate.m_cascadeVList[iv].vID, cstate ); //index of current vertex in simplified structure
565 for(ip=0; ip<(int)cstate.m_cascadeVList[iv].inPointingV.size(); ip++){ //inPointing verties
566 int tmpIndexV=indexInV( cstate.m_cascadeVList[iv].inPointingV[ip], cstate); //index of inPointing vertex in full structure
567 if(cstate.m_cascadeVList[tmpIndexV].mergedTO)isMerged=true; //vertex is merged
568 }
569 if(!isMerged){
570 fittedCovariance[iv]=t_fittedCovariance[index]; //copy complete covarinace matrix for nonmerged vertices
571 }
572 }
573 }
574//
575//-------------------------------------Saving
576//
577 ATH_MSG_DEBUG("Now save results");
578 Amg::MatrixX VrtCovMtx(3,3);
579 Trk::Perigee * measPerigee;
580 std::vector<xAOD::Vertex*> xaodVrtList(0);
581 double phi, theta, invP, mom, fullChi2=0.;
582
583 int NDOF=getCascadeNDoF(cstate); if(NDOFsqueezed) NDOF=NDOFsqueezed;
584 if(primVrt){ if(FirstDecayAtPV){ NDOF+=3; }else{ NDOF+=2; } }
585
586 for(iv=0; iv<(int)cVertices.size(); iv++){
587 Amg::Vector3D FitVertex(cVertices[iv].X+state.m_refFrameX,cVertices[iv].Y+state.m_refFrameY,cVertices[iv].Z+state.m_refFrameZ);
588 VrtCovMtx(0,0) = covVertices[iv][0]; VrtCovMtx(0,1) = covVertices[iv][1];
589 VrtCovMtx(1,1) = covVertices[iv][2]; VrtCovMtx(0,2) = covVertices[iv][3];
590 VrtCovMtx(1,2) = covVertices[iv][4]; VrtCovMtx(2,2) = covVertices[iv][5];
591 VrtCovMtx(1,0) = VrtCovMtx(0,1);
592 VrtCovMtx(2,0) = VrtCovMtx(0,2);
593 VrtCovMtx(2,1) = VrtCovMtx(1,2);
594 double Chi2=0;
595 for(it=0; it<(int)vertexDefinition[iv].size(); it++) { Chi2 += particleChi2[vertexDefinition[iv][it]];};
596 fullChi2+=Chi2;
597
598//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-= xAOD::Vertex creation
599 xAOD::Vertex * tmpXAODVertex=new xAOD::Vertex();
600 tmpXAODVertex->makePrivateStore();
601 tmpXAODVertex->setPosition(FitVertex);
602 tmpXAODVertex->setFitQuality(Chi2, (float)NDOF);
603 std::vector<VxTrackAtVertex> & tmpVTAV=tmpXAODVertex->vxTrackAtVertex();
604 tmpVTAV.clear();
605
606 int NRealT=vertexDefinition[iv].size();
607 Amg::MatrixX genCOV( NRealT*3+3, NRealT*3+3 ); // Fill cov. matrix for vertex
608 for( it=0; it<NRealT*3+3; it++){ // (X,Y,Z,px1,py1,....pxn,pyn,pzn)
609 for( jt=0; jt<=it; jt++){ //
610 genCOV(it,jt) = genCOV(jt,it) = fittedCovariance[iv][it*(it+1)/2+jt]; // for real tracks only
611 } } // (first in the list)
612 Amg::MatrixX fullDeriv;
614 //VK fullDeriv=new CLHEP::HepMatrix( NRealT*3+3, NRealT*3+3, 0); // matrix is filled by zeros
615 fullDeriv=Amg::MatrixX::Zero(NRealT*3+3, NRealT*3+3); // matrix is filled by zeros
616 fullDeriv(0,0)=fullDeriv(1,1)=fullDeriv(2,2)=1.;
617 }
618 for( it=0; it<NRealT; it++) {
619 mom= sqrt( fittedParticles[iv][it].Pz*fittedParticles[iv][it].Pz
620 +fittedParticles[iv][it].Py*fittedParticles[iv][it].Py
621 +fittedParticles[iv][it].Px*fittedParticles[iv][it].Px);
622 double Px=fittedParticles[iv][it].Px;
623 double Py=fittedParticles[iv][it].Py;
624 double Pz=fittedParticles[iv][it].Pz;
625 double Pt= sqrt(Px*Px + Py*Py) ;
626 phi=atan2( Py, Px);
627 theta=acos( Pz/mom );
628 invP = - state.m_ich[vertexDefinition[iv][it]] / mom; // Change charge sign according to ATLAS
629// d(Phi,Theta,InvP)/d(Px,Py,Pz) - Perigee vs summary momentum
630 Amg::MatrixX tmpDeriv( 5, NRealT*3+3);
631 tmpDeriv.setZero(); // matrix is filled by zeros
632 tmpDeriv(0,1) = -sin(phi); // Space derivatives
633 tmpDeriv(0,2) = cos(phi);
634 tmpDeriv(1,1) = -cos(phi)/tan(theta);
635 tmpDeriv(1,2) = -sin(phi)/tan(theta);
636 tmpDeriv(1,3) = 1.;
637 tmpDeriv(2+0,3*it+3+0) = -Py/Pt/Pt; //dPhi/dPx
638 tmpDeriv(2+0,3*it+3+1) = Px/Pt/Pt; //dPhi/dPy
639 tmpDeriv(2+0,3*it+3+2) = 0; //dPhi/dPz
640 tmpDeriv(2+1,3*it+3+0) = Px*Pz/(Pt*mom*mom); //dTheta/dPx
641 tmpDeriv(2+1,3*it+3+1) = Py*Pz/(Pt*mom*mom); //dTheta/dPy
642 tmpDeriv(2+1,3*it+3+2) = -Pt/(mom*mom); //dTheta/dPz
643 tmpDeriv(2+2,3*it+3+0) = -Px/(mom*mom) * invP; //dInvP/dPx
644 tmpDeriv(2+2,3*it+3+1) = -Py/(mom*mom) * invP; //dInvP/dPy
645 tmpDeriv(2+2,3*it+3+2) = -Pz/(mom*mom) * invP; //dInvP/dPz
646//---------- Here for Eigen block(startrow,startcol,sizerow,sizecol)
647 if( m_makeExtendedVertex )fullDeriv.block<3,3>(3*it+3+0,3*it+3+0) = tmpDeriv.block<3,3>(2,3*it+3+0);
648//----------
649 AmgSymMatrix(5) tmpCovMtx ; // New Eigen based EDM
650 tmpCovMtx = genCOV.similarity(tmpDeriv); // New Eigen based EDM
651 measPerigee = new Perigee( 0.,0., phi, theta, invP, PerigeeSurface(FitVertex), std::move(tmpCovMtx) ); // New Eigen based EDM
652 tmpVTAV.emplace_back( particleChi2[vertexDefinition[iv][it]] , measPerigee ) ;
653 }
654 std::vector<float> floatErrMtx;
656 Amg::MatrixX tmpCovMtx(NRealT*3+3,NRealT*3+3); // New Eigen based EDM
657 tmpCovMtx=genCOV.similarity(fullDeriv);
658 floatErrMtx.resize((NRealT*3+3)*(NRealT*3+3+1)/2);
659 int ivk=0;
660 for(int i=0;i<NRealT*3+3;i++){
661 for(int j=0;j<=i;j++){
662 floatErrMtx.at(ivk++)=tmpCovMtx(i,j);
663 }
664 }
665 }else{
666 floatErrMtx.resize(6);
667 for(int i=0; i<6; i++) floatErrMtx[i]=covVertices[iv][i];
668 }
669 tmpXAODVertex->setCovariance(floatErrMtx);
670 for(int itvk=0; itvk<NRealT; itvk++) {
671 ElementLink<xAOD::TrackParticleContainer> TEL;
672 if(itvk < (int)cstate.m_cascadeVList[iv].trkInVrt.size()){
673 TEL.setElement( cstate.m_partListForCascade[ cstate.m_cascadeVList[iv].trkInVrt[itvk] ] );
674 }else{
675 TEL.setElement( nullptr );
676 }
677 tmpXAODVertex->addTrackAtVertex(TEL,1.);
678 }
679 xaodVrtList.push_back(tmpXAODVertex); //VK Save xAOD::Vertex
680//
681 }
682//
683// Save momenta of all particles including combined at vertex positions
684//
685 std::vector<TLorentzVector> tmpMoms;
686 std::vector<std::vector<TLorentzVector> > particleMoms;
687 std::vector<Amg::MatrixX> particleCovs;
688 int allFitPrt=0;
689 for(iv=0; iv<(int)cVertices.size(); iv++){
690 tmpMoms.clear();
691 int NTrkF=fittedParticles[iv].size();
692 for(it=0; it< NTrkF; it++) {
693 tmpMoms.emplace_back( fittedParticles[iv][it].Px, fittedParticles[iv][it].Py,
694 fittedParticles[iv][it].Pz, fittedParticles[iv][it].E );
695 }
696 //CLHEP::HepSymMatrix COV( NTrkF*3+3, 0 );
697 Amg::MatrixX COV(NTrkF*3+3,NTrkF*3+3); COV=Amg::MatrixX::Zero(NTrkF*3+3,NTrkF*3+3);
698 for( it=0; it<NTrkF*3+3; it++){
699 for( jt=0; jt<=it; jt++){
700 COV(it,jt) = COV(jt,it) = fittedCovariance[iv][it*(it+1)/2+jt];
701 } }
702 particleMoms.push_back( std::move(tmpMoms) );
703 particleCovs.push_back( std::move(COV) );
704 allFitPrt += NTrkF;
705 }
706//
707 int NAPAR=(allFitPrt+cVertices.size())*3; //Full size of complete covariance matrix
708 //CLHEP::HepSymMatrix FULL( NAPAR, 0 );
709 Amg::MatrixX FULL(NAPAR,NAPAR); FULL.setZero();
710 if( !NDOFsqueezed ){ //normal cascade
711 for( it=0; it<NAPAR; it++){
712 for( jt=0; jt<=it; jt++){
713 FULL(it,jt) = FULL(jt,it) = fitFullCovariance[it*(it+1)/2+jt];
714 } }
715 }else{ //squeezed cascade
716 //int mcount=1; //Indexing in SUB starts from 1 !!!!
717 int mcount=0; //Indexing in BLOCK starts from 0 !!!!
718 for(iv=0; iv<(int)cstate.m_cascadeVList.size(); iv++){
719 //FULL.sub(mcount,particleCovs[iv]); mcount += particleCovs[iv].num_col();
720 FULL.block(mcount,mcount,particleCovs[iv].rows(),particleCovs[iv].cols())=particleCovs[iv];
721 mcount += particleCovs[iv].rows();
722 }
723 }
724//
725//
726// VxCascadeInfo * recCascade= new VxCascadeInfo(vxVrtList,particleMoms,particleCovs, NDOF ,fullChi2);
727 VxCascadeInfo * recCascade= new VxCascadeInfo(std::move(xaodVrtList),std::move(particleMoms),std::move(particleCovs), NDOF ,fullChi2);
728 recCascade->setFullCascadeCovariance(FULL);
729 CLEANCASCADE();
730 return recCascade;
731}
Matrix< Scalar, OtherDerived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime > similarity(const MatrixBase< OtherDerived > &m) const
similarity method : yields ms = m*s*m^T
#define ATH_MSG_DEBUG(x)
int Sign(int in)
#define CLEANCASCADE()
static const Attributes_t empty
static int getSimpleVIndex(const VertexID &, const CascadeState &cstate)
StatusCode CvtTrackParameters(const std::vector< const TrackParameters * > &InpTrk, int &ntrk, State &state) const
void VKalVrtConfigureFitterCore(int NTRK, State &state) const
Gaudi::Property< bool > m_makeExtendedVertex
static int findPositions(const std::vector< int > &, const std::vector< int > &, std::vector< int > &)
static void makeSimpleCascade(std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, CascadeState &cstate)
static void printSimpleCascade(std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, const CascadeState &cstate)
Gaudi::Property< double > m_cascadeCnstPrecision
StatusCode CvtTrackParticle(std::span< const xAOD::TrackParticle *const > list, int &ntrk, State &state) const
static int getCascadeNDoF(const CascadeState &cstate)
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
int SymIndex(int it, int i, int j)
void getFittedCascade(CascadeEvent &cascadeEvent_, std::vector< Vect3DF > &cVertices, std::vector< std::vector< double > > &covVertices, std::vector< std::vector< VectMOM > > &fittedParticles, std::vector< std::vector< double > > &cascadeCovar, std::vector< double > &particleChi2, std::vector< double > &fullCovar)
int processCascade(CascadeEvent &cascadeEvent_)
int setCascadeMassConstraint(CascadeEvent &cascadeEvent_, long int IV, double Mass)
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
int makeCascade(VKalVrtControl &FitCONTROL, long int NTRK, const long int *ich, double *wm, double *inp_Trk5, double *inp_CovTrk5, const std::vector< std::vector< int > > &vertexDefinition, const std::vector< std::vector< int > > &cascadeDefinition, double definedCnstAccuracy)
@ pz
global momentum (cartesian)
Definition ParamDefs.h:61
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75
@ px
Definition ParamDefs.h:59
@ py
Definition ParamDefs.h:60
int processCascadePV(CascadeEvent &cascadeEvent_, const double *primVrt, const double *primVrtCov)
Vertex_v1 Vertex
Define the latest version of the vertex class.
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.
#define unlikely(x)

◆ getCascadeNDoF()

int Trk::TrkVKalVrtFitter::getCascadeNDoF ( const CascadeState & cstate)
staticprivate

Definition at line 80 of file TrkCascadeFitter.cxx.

81{
82
83// get Tracks, Vertices and Pointings in cascade
84//
85 int nTrack = cstate.m_partListForCascade.size();
86 int nVertex = cstate.m_cascadeVList.size();
87
88 int nPointing = 0;
89 for( int iv=0; iv<nVertex; iv++) nPointing += cstate.m_cascadeVList[iv].inPointingV.size();
90
91 int nMassCnst = cstate.m_partMassCnstForCascade.size(); // mass cnsts
92
93 return 2*nTrack - 3*nVertex + 2*nPointing + nMassCnst;
94}

◆ GetPerigee()

const Perigee * Trk::TrkVKalVrtFitter::GetPerigee ( const TrackParameters * i_ntrk)
staticprivate

Definition at line 228 of file CvtTrackParticle.cxx.

229 {
230 const Perigee* mPer = nullptr;
231 if(i_ntrk->surfaceType()==Trk::SurfaceType::Perigee && i_ntrk->covariance()!= nullptr ) {
232 mPer = dynamic_cast<const Perigee*> (i_ntrk);
233 }
234 return mPer;
235 }

◆ getSimpleVIndex()

int Trk::TrkVKalVrtFitter::getSimpleVIndex ( const VertexID & vrt,
const CascadeState & cstate )
staticprivate

Definition at line 812 of file TrkCascadeFitter.cxx.

814{
815 int NVRT=cstate.m_cascadeVList.size();
816
817 int iv=indexInV(vrt, cstate);
818 if(iv<0) return -1; //not found
819
820 int ivv=0;
821 if(cstate.m_cascadeVList[iv].mergedTO){
822 for(ivv=0; ivv<NVRT; ivv++) if(cstate.m_cascadeVList[iv].mergedTO == cstate.m_cascadeVList[ivv].vID) break;
823 if(iv==NVRT) return -1; //not found
824 iv=ivv;
825 }
826 return cstate.m_cascadeVList[iv].indexInSimpleCascade;
827}

◆ GiveFullMatrix()

Amg::MatrixX * Trk::TrkVKalVrtFitter::GiveFullMatrix ( int NTrk,
std::vector< double > & Matrix )
staticprivate

Definition at line 666 of file TrkVKalVrtFitter.cxx.

667{
668 Amg::MatrixX * mtx = new Amg::MatrixX(3+3*NTrk,3+3*NTrk);
669 long int ij=0;
670 for(int i=1; i<=(3+3*NTrk); i++){
671 for(int j=1; j<=i; j++){
672 if(i==j){ (*mtx)(i-1,j-1)=Matrix[ij];}
673 else { (*mtx).fillSymmetric(i-1,j-1,Matrix[ij]);}
674 ij++;
675 }
676 }
677 return mtx;
678}

◆ indexInV()

int Trk::TrkVKalVrtFitter::indexInV ( const VertexID & vrt,
const CascadeState & cstate )
staticprivate

Definition at line 831 of file TrkCascadeFitter.cxx.

833{ int icv; int NVRT=cstate.m_cascadeVList.size();
834 for(icv=0; icv<NVRT; icv++) if(vrt==cstate.m_cascadeVList[icv].vID)break;
835 if(icv==NVRT)return -1;
836 return icv;
837}

◆ initCnstList()

void Trk::TrkVKalVrtFitter::initCnstList ( )
private

◆ initialize()

StatusCode Trk::TrkVKalVrtFitter::initialize ( )
finaloverridevirtual

Definition at line 72 of file TrkVKalVrtFitter.cxx.

73{
74
75// Checking ROBUST algoritms
77
78
79 if(!m_useFixedField){
80 // Read handle for AtlasFieldCacheCondObj
81 if (!m_fieldCacheCondObjInputKey.key().empty()){
82 if( (m_fieldCacheCondObjInputKey.initialize()).isSuccess() ){
83 m_isAtlasField = true;
84 ATH_MSG_DEBUG( "Found AtlasFieldCacheCondObj with key ="<< m_fieldCacheCondObjInputKey.key());
85 }else{
86 ATH_MSG_INFO( "No AtlasFieldCacheCondObj with key ="<< m_fieldCacheCondObjInputKey.key());
87 ATH_MSG_INFO( "Use fixed magnetic field instead");
88 }
89 }
90 }
91//
92// Only here the VKalVrtFitter propagator object is created if ATHENA propagator is provided (see setAthenaPropagator)
93// In this case the ATHENA propagator can be used via pointers:
94// m_InDetExtrapolator - direct access
95// m_fitPropagator - via VKalVrtFitter object VKalExtPropagator
96// If ATHENA propagator is not provided, only defined object is
97// myPropagator - extern propagator from TrkVKalVrtCore
98//
99 if (m_extPropagator.empty()){
100 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "External propagator is not supplied - use internal one"<<endmsg;
101 m_extPropagator.disable();
102 }else{
103 if (m_extPropagator.retrieve().isFailure()) {
104 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "Could not find external propagator=" <<m_extPropagator<<endmsg;
105 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "TrkVKalVrtFitter will uses internal propagator" << endmsg;
106 m_extPropagator.disable();
107 }else{
108 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "External propagator="<<m_extPropagator<<" retrieved" << endmsg;
110 }
111 }
112
113//
114//
115//
116 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "TrkVKalVrtFitter initialize() successful" << endmsg;
117 if(msgLvl(MSG::DEBUG)){
118 msg(MSG::DEBUG)<< "TrkVKalVrtFitter configuration:" << endmsg;
119 msg(MSG::DEBUG)<< " Frozen version for BTagging: "<< m_frozenVersionForBTagging <<endmsg;
120 msg(MSG::DEBUG)<< " Allow ultra displaced vertices: "<< m_allowUltraDisplaced <<endmsg;
121 msg(MSG::DEBUG)<< " A priori vertex constraint: "<< m_useAprioriVertex <<endmsg;
122 msg(MSG::DEBUG)<< " Angle dTheta=0 constraint: "<< m_useThetaCnst <<endmsg;
123 msg(MSG::DEBUG)<< " Angle dPhi=0 constraint: "<< m_usePhiCnst <<endmsg;
124 msg(MSG::DEBUG)<< " Pointing to other vertex constraint: "<< m_usePointingCnst <<endmsg;
125 msg(MSG::DEBUG)<< " ZPointing to other vertex constraint: "<< m_useZPointingCnst <<endmsg;
126 msg(MSG::DEBUG)<< " Comb. particle pass near other vertex:"<< m_usePassNear <<endmsg;
127 msg(MSG::DEBUG)<< " Pass near with comb.particle errors: "<< m_usePassWithTrkErr <<endmsg;
129 msg(MSG::DEBUG)<< " Mass constraint M="<< m_massForConstraint <<endmsg;
130 msg(MSG::DEBUG)<< " with particles M=";
131 for(int i=0; i<(int)m_c_MassInputParticles.size(); i++) msg(MSG::DEBUG)<<m_c_MassInputParticles[i]<<", ";
132 msg(MSG::DEBUG)<<endmsg; ;
133 }
134 if(m_IterationNumber==0){
135 msg(MSG::DEBUG)<< " Default iteration number limit 50 is used " <<endmsg;
136 } else {
137 msg(MSG::DEBUG)<< " Iteration number limit: "<< m_IterationNumber <<endmsg;
138 }
139
140 if(m_isAtlasField){ msg(MSG::DEBUG)<< " ATLAS magnetic field is used!"<<endmsg; }
141 else { msg(MSG::DEBUG)<< " Constant magnetic field is used! B="<<m_BMAG<<endmsg; }
142
143 if(m_InDetExtrapolator){ msg(MSG::DEBUG)<< " InDet extrapolator is used!"<<endmsg; }
144 else { msg(MSG::DEBUG)<< " Internal VKalVrt extrapolator is used!"<<endmsg;}
145
146 if(m_Robustness) { msg(MSG::DEBUG)<< " VKalVrt uses robust algorithm! Type="<<m_Robustness<<" with Scale="<<m_RobustScale<<endmsg; }
147
148 if(m_firstMeasuredPoint){ msg(MSG::DEBUG)<< " VKalVrt will use FirstMeasuredPoint strategy in fits with InDetExtrapolator"<<endmsg; }
149 else { msg(MSG::DEBUG)<< " VKalVrt will use Perigee strategy in fits with InDetExtrapolator"<<endmsg; }
150 if(m_firstMeasuredPointLimit){ msg(MSG::DEBUG)<< " VKalVrt will use FirstMeasuredPointLimit strategy "<<endmsg; }
151 }
152
153
154 return StatusCode::SUCCESS;
155}
#define ATH_MSG_INFO(x)
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Gaudi::Property< bool > m_usePhiCnst
Gaudi::Property< bool > m_usePointingCnst
ToolHandle< IExtrapolator > m_extPropagator
Gaudi::Property< int > m_IterationNumber
Gaudi::Property< bool > m_allowUltraDisplaced
Gaudi::Property< double > m_RobustScale
Gaudi::Property< double > m_massForConstraint
Gaudi::Property< bool > m_frozenVersionForBTagging
Gaudi::Property< int > m_Robustness
Gaudi::Property< bool > m_usePassWithTrkErr
Gaudi::Property< bool > m_useZPointingCnst
Gaudi::Property< bool > m_useAprioriVertex
Gaudi::Property< bool > m_useFixedField
Gaudi::Property< bool > m_usePassNear
Gaudi::Property< std::vector< double > > m_c_MassInputParticles
Gaudi::Property< bool > m_firstMeasuredPointLimit
void setAthenaPropagator(const Trk::IExtrapolator *)
Gaudi::Property< bool > m_useThetaCnst

◆ initState()

void Trk::TrkVKalVrtFitter::initState ( const EventContext & ctx,
State & state ) const
private

Definition at line 158 of file TrkVKalVrtFitter.cxx.

160{
161 //----------------------------------------------------------------------
162 // New magnetic field object is created. It's provided to VKalVrtCore.
163 // VKalVrtFitter must set up Core BEFORE any call required propagation!!!
164 if (m_isAtlasField) {
165 // For the moment, use Gaudi Hive for the event context - would need to be passed in from clients
166 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCacheCondObjInputKey, ctx};
167 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
168 if (fieldCondObj == nullptr) {
169 ATH_MSG_ERROR("Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
170 return;
171 }
172 fieldCondObj->getInitializedCache (state.m_fieldCache);
173 state.m_fitField.setAtlasField(&state.m_fieldCache);
174 } else {
175 state.m_fitField.setAtlasField(m_BMAG);
176 }
177 state.m_eventContext = &ctx;
178 state.m_vkalFitControl.vk_objProp = m_fitPropagator;
179 state.m_useAprioriVertex = m_useAprioriVertex;
180 state.m_useThetaCnst = m_useThetaCnst;
181 state.m_usePhiCnst = m_usePhiCnst;
182 state.m_usePointingCnst = m_usePointingCnst;
183 state.m_useZPointingCnst = m_useZPointingCnst;
184 state.m_usePassNear = m_usePassNear;
185 state.m_usePassWithTrkErr = m_usePassWithTrkErr;
186 state.m_VertexForConstraint = m_c_VertexForConstraint;
187 state.m_CovVrtForConstraint = m_c_CovVrtForConstraint;
188 state.m_massForConstraint = m_massForConstraint;
189 state.m_Robustness = m_Robustness;
190 state.m_RobustScale = m_RobustScale;
191 state.m_MassInputParticles = m_c_MassInputParticles;
192 state.m_frozenVersionForBTagging = m_frozenVersionForBTagging;
193 state.m_allowUltraDisplaced = m_allowUltraDisplaced;
194}
#define ATH_MSG_ERROR(x)
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
Gaudi::Property< std::vector< double > > m_c_CovVrtForConstraint
Gaudi::Property< std::vector< double > > m_c_VertexForConstraint

◆ makeSimpleCascade()

void Trk::TrkVKalVrtFitter::makeSimpleCascade ( std::vector< std::vector< int > > & vrtDef,
std::vector< std::vector< int > > & cascadeDef,
CascadeState & cstate )
staticprivate

Definition at line 181 of file TrkCascadeFitter.cxx.

184{
185 int iv,ip,it, nVAdd, iva;
186 vrtDef.clear();
187 cascadeDef.clear();
188 int NVC=cstate.m_cascadeVList.size();
189 vrtDef.resize(NVC);
190 cascadeDef.resize(NVC);
191//
192//---- First set up position of each vertex in simple structure with merging(!!!)
193//
194 int vCounter=0;
195 for(iv=0; iv<NVC; iv++){
196 cascadeV &vrt=cstate.m_cascadeVList[iv];
197 vrt.indexInSimpleCascade=-1; // set to -1 for merged vertices not present in simple list
198 if(vrt.mergedTO) continue; // vertex is merged with another one;
199 vrt.indexInSimpleCascade=vCounter; // vertex position in simple cascade structure
200 vCounter++;
201 }
202//---- Fill vertices in simple structure
203 vCounter=0;
204 for(iv=0; iv<NVC; iv++){
205 const cascadeV &vrt=cstate.m_cascadeVList[iv];
206 if(vrt.mergedTO) continue; // vertex is merged with another one;
207 for(it=0; it<(int)vrt.trkInVrt.size(); it++) vrtDef[vCounter].push_back(vrt.trkInVrt[it]); //copy real tracks
208 for(ip=0; ip<(int)vrt.inPointingV.size(); ip++) {
209 //int indInFull=vrt.inPointingV[ip]; // pointing vertex in full list WRONG!!!
210 int indInFull = indexInV(vrt.inPointingV[ip], cstate); // pointing vertex in full list
211 if (indInFull < 0)[[unlikely]]{
212 throw std::runtime_error("TrkVKalVrtFitter::makeSimpleCascade: index into vector is negative.");
213 }
214 int indInSimple=cstate.m_cascadeVList[indInFull].indexInSimpleCascade; // its index in simple structure
215 if(indInSimple<0) continue; // merged out vertex. Will be added as tracks
216 cascadeDef[vCounter].push_back(indInSimple);
217 }
218 nVAdd=vrt.mergedIN.size();
219 if( nVAdd ) { //----------------------------- mergedIN(added) vertices exist
220 for(iva=0; iva<nVAdd; iva++){
221 const cascadeV &vrtM=cstate.m_cascadeVList[vrt.mergedIN[iva]]; // merged/added vertex itself
222 for(it=0; it<(int)vrtM.trkInVrt.size(); it++) vrtDef[vCounter].push_back(vrtM.trkInVrt[it]);
223 for(ip=0; ip<(int)vrtM.inPointingV.size(); ip++) {
224 //int indInFull=vrtM.inPointingV[ip]; // pointing vertex in full list WRONG!!!
225 int indInFull=indexInV(vrtM.inPointingV[ip], cstate); // pointing vertex in full list
226 int indInSimple=cstate.m_cascadeVList[indInFull].indexInSimpleCascade; // its index in simple structure
227 if(indInSimple<0) continue; // merged out vertex. Will be added as tracks
228 cascadeDef[vCounter].push_back(indInSimple);
229 }
230 }
231 }
232
233 vCounter++;
234 }
235 vrtDef.resize(vCounter);
236 cascadeDef.resize(vCounter);
237}
m_data push_back(elt)

◆ makeState()

std::unique_ptr< IVKalState > Trk::TrkVKalVrtFitter::makeState ( const EventContext & ctx) const
finaloverridevirtual

Definition at line 58 of file TrkVKalVrtFitter.cxx.

59{
60 auto state = std::make_unique<State>();
61 initState(ctx, *state);
62 return state;
63}

◆ makeXAODVertex()

std::unique_ptr< xAOD::Vertex > Trk::TrkVKalVrtFitter::makeXAODVertex ( int Neutrals,
const Amg::Vector3D & Vertex,
const dvect & fitErrorMatrix,
const dvect & Chi2PerTrk,
const std::vector< dvect > & TrkAtVrt,
double Chi2,
State & state ) const
private

Definition at line 682 of file TrkVKalVrtFitter.cxx.

687{
688 long int NTrk = state.m_FitStatus;
689 long int Ndf = VKalGetNDOF(state)+state.m_planeCnstNDOF;
690
691 auto tmpVertex = std::make_unique<xAOD::Vertex>();
692 tmpVertex->makePrivateStore();
693 tmpVertex->setPosition(Vertex);
694 tmpVertex->setFitQuality(Chi2, (float)Ndf);
695
696 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
697 tmpVTAV.clear();
698 std::vector <double> CovFull;
699 StatusCode sc = VKalGetFullCov( NTrk, CovFull, state);
700 int covarExist=0; if( sc.isSuccess() ) covarExist=1;
701
702 std::vector<float> floatErrMtx;
703 if( m_makeExtendedVertex && covarExist ) {
704 floatErrMtx.resize(CovFull.size());
705 for(int i=0; i<(int)CovFull.size(); i++) {
706 if( CovFull[i] < std::numeric_limits<float>::max() &&
707 CovFull[i] > std::numeric_limits<float>::lowest() ){
708 floatErrMtx[i]=static_cast<float>(CovFull[i]);
709 } else {
710 floatErrMtx[i]=std::numeric_limits<float>::max();
711 }
712 }
713 }else{
714 floatErrMtx.resize(fitErrorMatrix.size());
715 for(int i=0; i<(int)fitErrorMatrix.size(); i++) {
716 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
717 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
718 floatErrMtx[i]=static_cast<float>(fitErrorMatrix[i]);
719 } else {
720 floatErrMtx[i]=std::numeric_limits<float>::max();
721 }
722 }
723 }
724 tmpVertex->setCovariance(floatErrMtx);
725
726 for(int ii=0; ii<NTrk ; ii++) {
727 AmgSymMatrix(5) CovMtxP;
728 if(covarExist){ FillMatrixP( ii, CovMtxP, CovFull );}
729 else { CovMtxP.setIdentity();}
730 Perigee * tmpChargPer=nullptr;
731 NeutralPerigee * tmpNeutrPer=nullptr;
732 if(ii<NTrk-Neutrals){
733 tmpChargPer = new Perigee( 0.,0., TrkAtVrt[ii][0],
734 TrkAtVrt[ii][1],
735 TrkAtVrt[ii][2],
736 PerigeeSurface(Vertex), std::move(CovMtxP) );
737 }else{
738 tmpNeutrPer = new NeutralPerigee( 0.,0., TrkAtVrt[ii][0],
739 TrkAtVrt[ii][1],
740 TrkAtVrt[ii][2],
741 PerigeeSurface(Vertex),
742 std::move(CovMtxP) );
743 }
744 tmpVTAV.emplace_back(Chi2PerTrk[ii], tmpChargPer, tmpNeutrPer );
745 }
746
747 return tmpVertex;
748}
virtual StatusCode VKalGetFullCov(long int, dvect &CovMtx, IVKalState &istate, bool=false) const override final
static int VKalGetNDOF(const State &state)
static void FillMatrixP(AmgSymMatrix(5)&, std::vector< double > &)

◆ nextVertex() [1/2]

VertexID Trk::TrkVKalVrtFitter::nextVertex ( const std::vector< const xAOD::TrackParticle * > & list,
std::span< const double > particleMass,
const std::vector< VertexID > & precedingVertices,
IVKalState & istate,
double massConstraint = 0. ) const
finaloverride

Definition at line 145 of file TrkCascadeFitter.cxx.

150{
151 assert(dynamic_cast<State*> (&istate)!=nullptr);
152 State& state = static_cast<State&> (istate);
153 CascadeState& cstate = *state.m_cascadeState;
154
155 VertexID vID=nextVertex( list, particleMass, istate, massConstraint);
156//
157 int lastC=cstate.m_partMassCnstForCascade.size()-1; // Check if full vertex mass constraint exist
158 if( lastC>=0 ){ if( cstate.m_partMassCnstForCascade[lastC].VRT == vID ){
159 for(int iv=0; iv<(int)precedingVertices.size(); iv++){
160 cstate.m_partMassCnstForCascade[lastC].pseudoInVrt.push_back(precedingVertices[iv]); }
161 }
162 }
163//
164//-- New vertex structure-----------------------------------
165 int lastV=cstate.m_cascadeVList.size()-1;
166 for(int iv=0; iv<(int)precedingVertices.size(); iv++){
167 cstate.m_cascadeVList[lastV].inPointingV.push_back(precedingVertices[iv]); // fill preceding vertices list
168 }
169//--
170 return vID;
171}
VertexID nextVertex(const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, IVKalState &istate, double massConstraint=0.) const override final

◆ nextVertex() [2/2]

VertexID Trk::TrkVKalVrtFitter::nextVertex ( const std::vector< const xAOD::TrackParticle * > & list,
std::span< const double > particleMass,
IVKalState & istate,
double massConstraint = 0. ) const
finaloverride

Definition at line 98 of file TrkCascadeFitter.cxx.

102{
103 assert(dynamic_cast<State*> (&istate)!=nullptr);
104 State& state = static_cast<State&> (istate);
105 CascadeState& cstate = *state.m_cascadeState;
106
107//----
108 int NV = cstate.m_cascadeSize++;
109 VertexID new_vID=10000+NV;
110//----
111 int NTRK = list.size();
112 int presentNT = cstate.m_partListForCascade.size();
113//----
114
115 double totMass=0;
116 for(int it=0; it<NTRK; it++){
117 cstate.m_partListForCascade.push_back(list[it]);
118 cstate.m_partMassForCascade.push_back(particleMass[it]);
119 totMass += particleMass[it];
120 }
121//---------------------- Fill complete vertex mass constraint
122 if(totMass < massConstraint) {
123 PartialMassConstraint tmpMcnst;
124 tmpMcnst.Mass = massConstraint;
125 tmpMcnst.VRT = new_vID;
126 for(int it=0; it<NTRK; it++)tmpMcnst.trkInVrt.push_back(it+presentNT);
127 cstate.m_partMassCnstForCascade.push_back(std::move(tmpMcnst));
128 }
129//
130//
131//-- New vertex structure-----------------------------------
132 cascadeV newV; newV.vID=new_vID;
133 for(int it=0; it<NTRK; it++){
134 newV.trkInVrt.push_back(it+presentNT);
135 }
136 cstate.m_cascadeVList.push_back(std::move(newV));
137//--------------------------------------------------------------
138 return new_vID;
139}
list(name, path='/')
Definition histSizes.py:38

◆ printSimpleCascade()

void Trk::TrkVKalVrtFitter::printSimpleCascade ( std::vector< std::vector< int > > & vrtDef,
std::vector< std::vector< int > > & cascadeDef,
const CascadeState & cstate )
staticprivate

Definition at line 241 of file TrkCascadeFitter.cxx.

244{
245 int kk,kkk;
246 for(kk=0; kk<(int)vrtDef.size(); kk++){
247 std::cout<<" Vertex("<<kk<<"):: trk=";
248 for(kkk=0; kkk<(int)vrtDef[kk].size(); kkk++){
249 std::cout<<vrtDef[kk][kkk]<<", ";} std::cout<<" pseu=";
250 for(kkk=0; kkk<(int)cascadeDef[kk].size(); kkk++){
251 std::cout<<cascadeDef[kk][kkk]<<", ";}
252 } std::cout<<'\n';
253//---
254 for(kk=0; kk<(int)vrtDef.size(); kk++){
255 std::cout<<" Vertex("<<kk<<"):: trkM=";
256 for(kkk=0; kkk<(int)vrtDef[kk].size(); kkk++){
257 std::cout<<cstate.m_partMassForCascade[vrtDef[kk][kkk]]<<", ";}
258 }std::cout<<'\n';
259//--
260 for (const PartialMassConstraint& c : cstate.m_partMassCnstForCascade) {
261 std::cout<<" MCnst vID=";
262 std::cout<<c.VRT<<" m="<<c.Mass<<" trk=";
263 for(int idx : c.trkInVrt) {
264 std::cout<<idx<<", ";
265 }
266 std::cout<<" pseudo=";
267 for (VertexID id : c.pseudoInVrt) {
268 std::cout<<id<<", ";
269 }
270 std::cout<<'\n';
271 }
272}

◆ setApproximateVertex()

void Trk::TrkVKalVrtFitter::setApproximateVertex ( double X,
double Y,
double Z,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 114 of file SetFitOptions.cxx.

116 {
117 assert(dynamic_cast<State*> (&istate)!=nullptr);
118 State& state = static_cast<State&> (istate);
119 state.m_ApproximateVertex.assign ({X, Y, Z});
120 }
std::vector< double > m_ApproximateVertex

◆ setAthenaPropagator()

void Trk::TrkVKalVrtFitter::setAthenaPropagator ( const Trk::IExtrapolator * Pnt)
private

Definition at line 477 of file VKalExtPropagator.cxx.

478 {
479 // Save external propagator in VKalExtPropagator object and send it to TrkVKalVrtCore
480//
481 if(m_fitPropagator != nullptr) delete m_fitPropagator;
483 m_fitPropagator->setPropagator(Pnt);
484 m_InDetExtrapolator = Pnt; // Pointer to InDet extrapolator
485 }
friend class VKalExtPropagator

◆ setCnstType()

void Trk::TrkVKalVrtFitter::setCnstType ( int TYPE,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 88 of file SetFitOptions.cxx.

89 {
90 assert(dynamic_cast<State*> (&istate)!=nullptr);
91 State& state = static_cast<State&> (istate);
92 if(TYPE>0)msg(MSG::DEBUG)<< "ConstraintType is changed at execution stage. New type="<<TYPE<< endmsg;
93 if(TYPE<0)TYPE=0;
94 if(TYPE>14)TYPE=0;
95 if( TYPE == 2) state.m_usePointingCnst = true;
96 if( TYPE == 3) state.m_useZPointingCnst = true;
97 if( TYPE == 4) state.m_usePointingCnst = true;
98 if( TYPE == 5) state.m_useZPointingCnst = true;
99 if( TYPE == 6) state.m_useAprioriVertex = true;
100 if( TYPE == 7) state.m_usePassWithTrkErr = true;
101 if( TYPE == 8) state.m_usePassWithTrkErr = true;
102 if( TYPE == 9) state.m_usePassNear = true;
103 if( TYPE == 10) state.m_usePassNear = true;
104 if( TYPE == 11) state.m_usePhiCnst = true;
105 if( TYPE == 12) { state.m_usePhiCnst = true; state.m_useThetaCnst = true;}
106 if( TYPE == 13) { state.m_usePhiCnst = true; state.m_usePassNear = true;}
107 if( TYPE == 14) { state.m_usePhiCnst = true; state.m_useThetaCnst = true; state.m_usePassNear = true;}
108 }
#define TYPE(CODE, TYP, IOTYP)

◆ setCovVrtForConstraint()

void Trk::TrkVKalVrtFitter::setCovVrtForConstraint ( double XX,
double XY,
double YY,
double XZ,
double YZ,
double ZZ,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 184 of file SetFitOptions.cxx.

187 {
188 assert(dynamic_cast<State*> (&istate)!=nullptr);
189 State& state = static_cast<State&> (istate);
190 state.m_CovVrtForConstraint.assign ({XX, XY, YY, XZ, YZ, ZZ});
191 }
std::vector< double > m_CovVrtForConstraint

◆ setMassForConstraint() [1/2]

void Trk::TrkVKalVrtFitter::setMassForConstraint ( double Mass,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 140 of file SetFitOptions.cxx.

142 {
143 assert(dynamic_cast<State*> (&istate)!=nullptr);
144 State& state = static_cast<State&> (istate);
145 state.m_massForConstraint = MASS;
146 }

◆ setMassForConstraint() [2/2]

void Trk::TrkVKalVrtFitter::setMassForConstraint ( double Mass,
std::span< const int > TrkIndex,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 148 of file SetFitOptions.cxx.

151 {
152 assert(dynamic_cast<State*> (&istate)!=nullptr);
153 State& state = static_cast<State&> (istate);
154 state.m_partMassCnst.push_back(MASS);
155 state.m_partMassCnstTrk.emplace_back(TrkIndex.begin(), TrkIndex.end());
156 }
std::vector< double > m_partMassCnst

◆ setMassInputParticles()

void Trk::TrkVKalVrtFitter::setMassInputParticles ( const std::vector< double > & mass,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 193 of file SetFitOptions.cxx.

195 {
196 assert(dynamic_cast<State*> (&istate)!=nullptr);
197 State& state = static_cast<State&> (istate);
199 for (double& m : state.m_MassInputParticles) {
200 m = std::abs(m);
201 }
202 }
std::vector< double > m_MassInputParticles

◆ setRobustness()

void Trk::TrkVKalVrtFitter::setRobustness ( int IROB,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 122 of file SetFitOptions.cxx.

123 { if(IROB>0)msg(MSG::DEBUG)<< "Robustness is changed at execution stage "<<m_Robustness<<"=>"<<IROB<< endmsg;
124 assert(dynamic_cast<State*> (&istate)!=nullptr);
125 State& state = static_cast<State&> (istate);
126 state.m_Robustness = IROB;
127 if(state.m_Robustness<0)state.m_Robustness=0;
128 if(state.m_Robustness>7)state.m_Robustness=0;
129 }

◆ setRobustScale()

void Trk::TrkVKalVrtFitter::setRobustScale ( double Scale,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 131 of file SetFitOptions.cxx.

132 { if(Scale!=m_RobustScale)msg(MSG::DEBUG)<< "Robust Scale is changed at execution stage "<<m_RobustScale<<"=>"<<Scale<< endmsg;
133 assert(dynamic_cast<State*> (&istate)!=nullptr);
134 State& state = static_cast<State&> (istate);
135 state.m_RobustScale = Scale;
136 if(state.m_RobustScale<0.01) state.m_RobustScale=1.;
137 if(state.m_RobustScale>100.) state.m_RobustScale=1.;
138 }
void Scale(TH1 *h, double d=1)

◆ setVertexForConstraint() [1/2]

void Trk::TrkVKalVrtFitter::setVertexForConstraint ( const xAOD::Vertex & Vrt,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 158 of file SetFitOptions.cxx.

160 {
161 assert(dynamic_cast<State*> (&istate)!=nullptr);
162 State& state = static_cast<State&> (istate);
163 state.m_VertexForConstraint.assign ({Vrt.position().x(),
164 Vrt.position().y(),
165 Vrt.position().z()});
166
167 state.m_CovVrtForConstraint.assign ({
168 Vrt.covariancePosition()(Trk::x,Trk::x),
169 Vrt.covariancePosition()(Trk::x,Trk::y),
170 Vrt.covariancePosition()(Trk::y,Trk::y),
171 Vrt.covariancePosition()(Trk::x,Trk::z),
172 Vrt.covariancePosition()(Trk::y,Trk::z),
173 Vrt.covariancePosition()(Trk::z,Trk::z)});
174 }
std::vector< double > m_VertexForConstraint

◆ setVertexForConstraint() [2/2]

void Trk::TrkVKalVrtFitter::setVertexForConstraint ( double X,
double Y,
double Z,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 176 of file SetFitOptions.cxx.

178 {
179 assert(dynamic_cast<State*> (&istate)!=nullptr);
180 State& state = static_cast<State&> (istate);
181 state.m_VertexForConstraint.assign ({X, Y, Z});
182 }

◆ startVertex()

VertexID Trk::TrkVKalVrtFitter::startVertex ( const std::vector< const xAOD::TrackParticle * > & list,
std::span< const double > particleMass,
IVKalState & istate,
double massConstraint = 0. ) const
finaloverride

Interface for cascade fit.

Definition at line 63 of file TrkCascadeFitter.cxx.

67{
68 assert(dynamic_cast<State*> (&istate)!=nullptr);
69 State& state = static_cast<State&> (istate);
70 state.m_cascadeState = std::make_unique<CascadeState>();
71 state.m_vkalFitControl.renewCascadeEvent(new CascadeEvent());
72
73 return nextVertex (list, particleMass, istate, massConstraint);
74}
std::unique_ptr< CascadeState > m_cascadeState

◆ VKalGetFullCov()

StatusCode Trk::TrkVKalVrtFitter::VKalGetFullCov ( long int NTrk,
dvect & CovMtx,
IVKalState & istate,
bool useMom = false ) const
finaloverridevirtual

Definition at line 455 of file VKalVrtFitSvc.cxx.

458 {
459 assert(dynamic_cast<State*> (&istate)!=nullptr);
460 State& state = static_cast<State&> (istate);
461 if(!state.m_FitStatus) return StatusCode::FAILURE;
462 if(NTrk<1) return StatusCode::FAILURE;
463 if(NTrk>NTrMaxVFit) return StatusCode::FAILURE;
464 if(state.m_ErrMtx.empty()) return StatusCode::FAILURE; //Now error matrix is taken from CORE in VKalVrtFit3.
465//
466// ------ Magnetic field access
467//
468 double fx,fy,fz;
469 state.m_fitField.getMagFld(state.m_save_xyzfit[0],state.m_save_xyzfit[1],state.m_save_xyzfit[2],fx,fy,fz);
470//
471// ------ Base code
472//
473 int i,j,ik,jk,ip,iTrk;
474 int DIM=3*NTrk+3; //Current size of full covariance matrix
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);
478
479
480 CovVrtTrk.resize(DIM*(DIM+1)/2);
481
482 ip=0;
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++];
486 }
487 }
488
489 //delete [] ErrMtx;
490
491 for(i=0;i<DIM;i++){ for(j=0;j<DIM;j++) {Deriv[i][j]=0.;}}
492 Deriv[0][0]= 1.;
493 Deriv[1][1]= 1.;
494 Deriv[2][2]= 1.;
495
496 int iSt=0;
497 double Theta,invR,Phi;
498 for( iTrk=0; iTrk<NTrk; iTrk++){
499 Theta=state.m_parfs[iTrk][0];
500 Phi =state.m_parfs[iTrk][1];
501 invR =state.m_parfs[iTrk][2];
502 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, Phi, Theta);
503 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
504
505 /*-----------*/
506 /* dNew/dOld */
507 iSt = 3 + iTrk*3;
508 if( !useMom ){
509 Deriv[iSt ][iSt+1] = 1; // Phi <-> Theta
510 Deriv[iSt+1][iSt ] = 1; // Phi <-> Theta
511 Deriv[iSt+2][iSt ] = -(cos(Theta)/(m_CNVMAG*effectiveBMAG)) * invR ; // d1/p / dTheta
512 Deriv[iSt+2][iSt+2] = -(sin(Theta)/(m_CNVMAG*effectiveBMAG)) ; // d1/p / d1/R
513 }else{
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; //dPx/dTheta
519 Deriv[iSt ][iSt+1]= -py; //dPx/dPhi
520 Deriv[iSt ][iSt+2]= -px/invR; //dPx/dinvR
521
522 Deriv[iSt+1][iSt ]= 0; //dPy/dTheta
523 Deriv[iSt+1][iSt+1]= px; //dPy/dPhi
524 Deriv[iSt+1][iSt+2]= -py/invR; //dPy/dinvR
525
526 Deriv[iSt+2][iSt ]= -pt/sin(Theta)/sin(Theta); //dPz/dTheta
527 Deriv[iSt+2][iSt+1]= 0; //dPz/dPhi
528 Deriv[iSt+2][iSt+2]= -pz/invR; //dPz/dinvR
529 }
530 }
531//---------- Only upper half if filled and saved
532 int ipnt=0;
533 double tmp, tmpTmp;
534 for(i=0;i<DIM;i++){
535 for(j=0;j<=i;j++){
536 tmp=0.;
537 for(ik=0;ik<DIM;ik++){
538 if(Deriv[i][ik] == 0.) continue;
539 tmpTmp=0;
540 for(jk=DIM-1;jk>=0;jk--){
541 if(Deriv[j][jk] == 0.) continue;
542 tmpTmp += CovMtxOld[ik*DIM+jk]*Deriv[j][jk];
543 }
544 tmp += Deriv[i][ik]*tmpTmp;
545 }
546 CovVrtTrk[ipnt++]=tmp;
547 }}
548
549 return StatusCode::SUCCESS;
550
551 }
@ Phi
Definition RPCdef.h:8
virtual void getMagFld(const double, const double, const double, double &, double &, double &) override
@ v
Definition ParamDefs.h:78

◆ VKalGetImpact() [1/4]

double Trk::TrkVKalVrtFitter::VKalGetImpact ( const EventContext & ctx,
const Trk::Perigee * InpPerigee,
const Amg::Vector3D & Vertex,
const long int Charge,
dvect & Impact,
dvect & ImpactError ) const
finaloverridevirtual

Definition at line 21 of file VKalGetImpact.cxx.

27 {
28 //Local variable state uses 49312 bytes of stack space
29 //coverity[STACK_USE]
30 State state;
31 initState (ctx, state);
32 return VKalGetImpact (InpPerigee, Vertex, Charge, Impact, ImpactError, state);
33 }
virtual double VKalGetImpact(const xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError, IVKalState &istate) const override final

◆ VKalGetImpact() [2/4]

double Trk::TrkVKalVrtFitter::VKalGetImpact ( const EventContext & ctx,
const xAOD::TrackParticle * InpTrk,
const Amg::Vector3D & Vertex,
const long int Charge,
dvect & Impact,
dvect & ImpactError ) const
finaloverridevirtual

Definition at line 85 of file VKalGetImpact.cxx.

88 {
89 //Local variable state uses 49312 bytes of stack space
90 //coverity[STACK_USE]
91 State state;
92 initState (ctx, state);
93 return VKalGetImpact (InpTrk, Vertex, Charge, Impact, ImpactError, state);
94 }

◆ VKalGetImpact() [3/4]

double Trk::TrkVKalVrtFitter::VKalGetImpact ( const Trk::Perigee * InpPerigee,
const Amg::Vector3D & Vertex,
const long int Charge,
dvect & Impact,
dvect & ImpactError,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 35 of file VKalGetImpact.cxx.

41 {
42 assert(dynamic_cast<State*> (&istate)!=nullptr);
43 State& state = static_cast<State&> (istate);
44
45 //
46 //------ Variables and arrays needed for fitting kernel
47 //
48 double SIGNIF=0.;
49 std::vector<const Trk::Perigee*> InpPerigeeList;
50 InpPerigeeList.push_back(InpPerigee);
51
52 //
53 //------ extract information about selected tracks
54 //
55 int ntrk=0;
56 StatusCode sc = CvtPerigee(InpPerigeeList, ntrk, state);
57 if(sc.isFailure() || ntrk != 1) { //Something is wrong in conversion
58 Impact.assign(5,1.e10);
59 ImpactError.assign(3,1.e20);
60 return 1.e10;
61 }
62 long int vkCharge = state.m_ich[0];
63 if(Charge==0) vkCharge=0;
64
65 //
66 // Target vertex in ref.frame defined by track themself
67 //
68 double VrtInp[3]={Vertex.x()-state.m_refFrameX,
69 Vertex.y()-state.m_refFrameY,
70 Vertex.z()-state.m_refFrameZ};
71 double VrtCov[6]={0.,0.,0.,0.,0.,0.};
72
73 Impact.resize(5);
74 ImpactError.resize(3);
75 Trk::cfimp(0, vkCharge, 0,
76 &state.m_apar[0][0], &state.m_awgt[0][0],
77 &VrtInp[0], &VrtCov[0],
78 Impact.data(), ImpactError.data(),
79 &SIGNIF, &state.m_vkalFitControl);
80
81 return SIGNIF;
82 }
StatusCode CvtPerigee(const std::vector< const Perigee * > &list, int &ntrk, State &state) const
void cfimp(long int TrkID, long int ich, int IFL, double *par, const double *err, double *vrt, double *vcov, double *rimp, double *rcov, double *sign, VKalVrtControlBase *FitCONTROL)
Definition cfImp.cxx:43

◆ VKalGetImpact() [4/4]

double Trk::TrkVKalVrtFitter::VKalGetImpact ( const xAOD::TrackParticle * InpTrk,
const Amg::Vector3D & Vertex,
const long int Charge,
dvect & Impact,
dvect & ImpactError,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 97 of file VKalGetImpact.cxx.

100 {
101 assert(dynamic_cast<State*> (&istate)!=nullptr);
102 State& state = static_cast<State&> (istate);
103//
104//------ Variables and arrays needed for fitting kernel
105//
106 double SIGNIF=0.;
107
108 std::vector<const xAOD::TrackParticle*> InpTrkList(1,InpTrk);
109//
110
111//
112//------ extract information about selected tracks
113//
114 int ntrk=0;
115 StatusCode sc = CvtTrackParticle(InpTrkList,ntrk,state);
116 if(sc.isFailure() || ntrk != 1 ) { //Something is wrong in conversion
117 Impact.assign(5,1.e10);
118 ImpactError.assign(3,1.e20);
119 return 1.e10;
120 }
121 double sizeR = state.m_allowUltraDisplaced ? m_MSsizeR : m_IDsizeR;
122 double sizeZ = state.m_allowUltraDisplaced ? m_MSsizeZ : m_IDsizeZ;
123 if (std::abs(Vertex.z()) > sizeZ || Vertex.perp() > sizeR) {
124 Impact.assign(5, 1.e10);
125 ImpactError.assign(3, 1.e20);
126 return 1.e10;
127 }
128 long int vkCharge=state.m_ich[0];
129 if(Charge==0)vkCharge=0;
130//
131// Target vertex in ref.frame defined by track itself
132//
133 double VrtInp[3]={Vertex.x() -state.m_refFrameX, Vertex.y() -state.m_refFrameY, Vertex.z() -state.m_refFrameZ};
134 double VrtCov[6]={0.,0.,0.,0.,0.,0.};
135//
136//
137 Impact.resize(5); ImpactError.resize(3);
138 Trk::cfimp( 0, vkCharge, 0, &state.m_apar[0][0], &state.m_awgt[0][0], &VrtInp[0], &VrtCov[0], Impact.data(), ImpactError.data(), &SIGNIF, &state.m_vkalFitControl);
139
140 return SIGNIF;
141
142 }
Gaudi::Property< double > m_MSsizeZ
Gaudi::Property< double > m_MSsizeR

◆ VKalGetMassError()

StatusCode Trk::TrkVKalVrtFitter::VKalGetMassError ( double & Mass,
double & MassError,
const IVKalState & istate ) const
finaloverridevirtual

Definition at line 557 of file VKalVrtFitSvc.cxx.

559 {
560 assert(dynamic_cast<const State*> (&istate)!=nullptr);
561 const State& state = static_cast<const State&> (istate);
562 if(!state.m_FitStatus) return StatusCode::FAILURE;
563 dM = state.m_vkalFitControl.getVertexMass();
564 MassError = state.m_vkalFitControl.getVrtMassError();
565 return StatusCode::SUCCESS;
566 }
double getVertexMass() const

◆ VKalGetNDOF()

int Trk::TrkVKalVrtFitter::VKalGetNDOF ( const State & state)
staticprivate

Definition at line 585 of file VKalVrtFitSvc.cxx.

586 {
587 if(!state.m_FitStatus) return 0;
588 int NDOF=2*state.m_FitStatus-3;
589 if(state.m_usePointingCnst) { NDOF+=2; }
590 else if(state.m_useZPointingCnst) { NDOF+=1; }
591 if( state.m_usePassNear || state.m_usePassWithTrkErr ) { NDOF+= 2; }
592
593 if( state.m_massForConstraint>0. ) { NDOF+=1; }
594 if( !state.m_partMassCnst.empty() ) { NDOF+= state.m_partMassCnst.size(); }
595 if( state.m_useAprioriVertex ) { NDOF+= 3; }
596 if( state.m_usePhiCnst ) { NDOF+=1; }
597 if( state.m_useThetaCnst ) { NDOF+=1; }
598 return NDOF;
599 }

◆ VKalGetTrkWeights()

StatusCode Trk::TrkVKalVrtFitter::VKalGetTrkWeights ( dvect & Weights,
const IVKalState & istate ) const
finaloverridevirtual

Definition at line 569 of file VKalVrtFitSvc.cxx.

571 {
572 assert(dynamic_cast<const State*> (&istate)!=nullptr);
573 const State& state = static_cast<const State&> (istate);
574 if(!state.m_FitStatus) return StatusCode::FAILURE; // no fit made
575 trkWeights.clear();
576
577 int NTRK=state.m_FitStatus;
578
579 for (int i=0; i<NTRK; i++) trkWeights.push_back(state.m_vkalFitControl.vk_forcft.robres[i]);
580
581 return StatusCode::SUCCESS;
582 }

◆ VKalToTrkTrack()

void Trk::TrkVKalVrtFitter::VKalToTrkTrack ( double curBMAG,
double vp1,
double vp2,
double vp3,
double & tp1,
double & tp2,
double & tp3 ) const
private

Definition at line 427 of file VKalVrtFitSvc.cxx.

430 { tp1= vp2; //phi angle
431 tp2= vp1; //theta angle
432 tp3= vp3 * std::sin( vp1 ) /(m_CNVMAG*effectiveBMAG);
433 constexpr double pi = M_PI;
434 // -pi < phi < pi range
435 while ( tp1 > pi) tp1 -= 2.*pi;
436 while ( tp1 <-pi) tp1 += 2.*pi;
437 // 0 < Theta < pi range
438 while ( tp2 > pi) tp2 -= 2.*pi;
439 while ( tp2 <-pi) tp2 += 2.*pi;
440 if ( tp2 < 0.) {
441 tp2 = fabs(tp2); tp1 += pi;
442 while ( tp1 > pi) tp1 -= 2.*pi;
443 }
444
445 }
#define M_PI
#define pi

◆ VKalTransform()

void Trk::TrkVKalVrtFitter::VKalTransform ( double MAG,
double A0V,
double ZV,
double PhiV,
double ThetaV,
double PInv,
const double CovTrk[15],
long int & Charge,
double VTrkPar[5],
double VTrkCov[15] ) const
private

Definition at line 59 of file VKalTransform.cxx.

62 {
63 int i,j,ii,jj;
64 double CnvCst=m_CNVMAG*effectiveBMAG;
65 double sinT = sin(ThetaV);
66 double cosT = cos(ThetaV);
67
68 VTrkPar[0] = - A0V ;
69 VTrkPar[1] = ZV ;
70 VTrkPar[2] = ThetaV;
71 VTrkPar[3] = PhiV;
72 VTrkPar[4] = -PInv*CnvCst/sinT ;
73 Charge = PInv > 0 ? -1 : 1;
74//
75//
76 double CovI[5][5];
77 double Deriv[5][5] ={{0.,0.,0.,0.,0.},{0.,0.,0.,0.,0.},{0.,0.,0.,0.,0.},
78 {0.,0.,0.,0.,0.},{0.,0.,0.,0.,0.}};
79
80 CovI[0][0] = CovTrk[0];
81
82 CovI[1][0] = CovTrk[1];
83 CovI[0][1] = CovTrk[1];
84 CovI[1][1] = CovTrk[2];
85
86 CovI[0][2] = CovTrk[3];
87 CovI[2][0] = CovTrk[3];
88 CovI[1][2] = CovTrk[4];
89 CovI[2][1] = CovTrk[4];
90 CovI[2][2] = CovTrk[5];
91
92 CovI[0][3] = CovTrk[6];
93 CovI[3][0] = CovTrk[6];
94 CovI[1][3] = CovTrk[7];
95 CovI[3][1] = CovTrk[7];
96 CovI[2][3] = CovTrk[8];
97 CovI[3][2] = CovTrk[8];
98 CovI[3][3] = CovTrk[9];
99
100 CovI[0][4] = CovTrk[10] ;
101 CovI[4][0] = CovTrk[10] ;
102 CovI[1][4] = CovTrk[11] ;
103 CovI[4][1] = CovTrk[11] ;
104 CovI[2][4] = CovTrk[12] ;
105 CovI[4][2] = CovTrk[12] ;
106 CovI[3][4] = CovTrk[13] ;
107 CovI[4][3] = CovTrk[13] ;
108 CovI[4][4] = CovTrk[14] ;
109
110
111 Deriv[0][0] = -1.;
112 Deriv[1][1] = 1.;
113 Deriv[2][3] = 1.;
114 Deriv[3][2] = 1.;
115 Deriv[4][3] = PInv*CnvCst *(cosT/sinT/sinT) ;
116 Deriv[4][4] = -CnvCst/sinT;
117
118 double ct;
119 int ipnt=0;
120 for(i=0;i<5;i++){ for(j=0;j<=i;j++){
121 ct=0.;
122 for(ii=4;ii>=0;ii--){
123 if(Deriv[i][ii] == 0.) continue;
124 for(jj=4;jj>=0;jj--){
125 if(Deriv[j][jj] == 0.) continue;
126 ct += CovI[ii][jj]*Deriv[i][ii]*Deriv[j][jj];};};
127 VTrkCov[ipnt++]=ct;
128 };}
129
130}

◆ VKalVrtConfigureFitterCore()

void Trk::TrkVKalVrtFitter::VKalVrtConfigureFitterCore ( int NTRK,
State & state ) const
private

Definition at line 18 of file SetFitOptions.cxx.

19 {
20 state.m_FitStatus = 0; // Drop all previous fit results
21 state.m_vkalFitControl.vk_forcft = ForCFT();
22
23 //Set input particle masses
24 for(int it=0; it<NTRK; it++){
25 if( it<(int)state.m_MassInputParticles.size() ) {
26 state.m_vkalFitControl.vk_forcft.wm[it] = (double)(state.m_MassInputParticles[it]);
27 }
28 else { state.m_vkalFitControl.vk_forcft.wm[it]=ParticleConstants::chargedPionMassInMeV; }
29 }
30 // Set reference vertex for different pointing constraints
31 if(state.m_VertexForConstraint.size() >= 3){
32 state.m_vkalFitControl.vk_forcft.vrt[0] =state.m_VertexForConstraint[0] - state.m_refFrameX;
33 state.m_vkalFitControl.vk_forcft.vrt[1] =state.m_VertexForConstraint[1] - state.m_refFrameY;
34 state.m_vkalFitControl.vk_forcft.vrt[2] =state.m_VertexForConstraint[2] - state.m_refFrameZ;
35 }else {for( int i=0; i<3; i++) state.m_vkalFitControl.vk_forcft.vrt[i] = 0.; }
36 // Set covariance matrix for reference vertex
37 if(state.m_CovVrtForConstraint.size() >= 6){
38 for( int i=0; i<6; i++) { state.m_vkalFitControl.vk_forcft.covvrt[i] = (double)(state.m_CovVrtForConstraint[i]); }
39 }else{ for( int i=0; i<6; i++) { state.m_vkalFitControl.vk_forcft.covvrt[i] = 0.; } }
40
41 // Add global mass constraint if present
42 if(state.m_massForConstraint >= 0.) state.m_vkalFitControl.setMassCnstData(NTRK,state.m_massForConstraint);
43 // Add partial mass constraints if present
44 if(!state.m_partMassCnst.empty()) {
45 for(int ic=0; ic<(int)state.m_partMassCnst.size(); ic++){
46 state.m_vkalFitControl.setMassCnstData(NTRK, state.m_partMassCnstTrk[ic],state.m_partMassCnst[ic]);
47 }
48 }
49 // Set general configuration parameters
50 state.m_vkalFitControl.setRobustness(state.m_Robustness);
51 state.m_vkalFitControl.setRobustScale(state.m_RobustScale);
52 if(!m_firstMeasuredPointLimit)state.m_vkalFitControl.setUsePlaneCnst(0.,0.,0.,0.);
53 else state.m_vkalFitControl.setUsePlaneCnst(state.m_parPlaneCnst[0],state.m_parPlaneCnst[1],
54 state.m_parPlaneCnst[2],state.m_parPlaneCnst[3]);
55 if(m_firstMeasuredRadiusLimit)state.m_vkalFitControl.setUseRadiusCnst(state.m_cnstRadius,state.m_cnstRadiusRef);
56 if(state.m_useAprioriVertex) state.m_vkalFitControl.setUseAprioriVrt();
57 if(state.m_useThetaCnst) state.m_vkalFitControl.setUseThetaCnst();
58 if(state.m_usePhiCnst) state.m_vkalFitControl.setUsePhiCnst();
59 if(state.m_usePointingCnst) state.m_vkalFitControl.setUsePointingCnst(1);
60 if(state.m_useZPointingCnst) state.m_vkalFitControl.setUsePointingCnst(2);
61 if(state.m_usePassNear) state.m_vkalFitControl.setUsePassNear(1);
62 if(state.m_usePassWithTrkErr)state.m_vkalFitControl.setUsePassNear(2);
63
64 if(state.m_frozenVersionForBTagging)state.m_vkalFitControl.m_frozenVersionForBTagging=true;
65 if(state.m_allowUltraDisplaced)state.m_vkalFitControl.m_allowUltraDisplaced=true;
66
67 if(m_IterationPrecision>0.) state.m_vkalFitControl.setIterationPrec(m_IterationPrecision);
68 if(m_IterationNumber) state.m_vkalFitControl.setIterationNum(m_IterationNumber);
69
70 }
Gaudi::Property< bool > m_firstMeasuredRadiusLimit
Gaudi::Property< double > m_IterationPrecision
int ic
Definition grepfile.py:33

◆ VKalVrtCvtTool()

StatusCode Trk::TrkVKalVrtFitter::VKalVrtCvtTool ( const Amg::Vector3D & Vertex,
const TLorentzVector & Momentum,
const dvect & CovVrtMom,
const long int & Charge,
dvect & Perigee,
dvect & CovPerigee,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 385 of file VKalVrtFitSvc.cxx.

392 {
393 assert(dynamic_cast<State*> (&istate)!=nullptr);
394 State& state = static_cast<State&> (istate);
395 int i,j,ij;
396 double Vrt[3],PMom[4],Cov0[21],Per[5],CovPer[15];
397
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++){
401 for(j=0; j<=i; j++){
402 Cov0[ij]=CovVrtMom[ij];
403 ij++;
404 }
405 }
406 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.; //VK Work in ATLAS ref frame ONLY!!!
407 long int vkCharge=-Charge; //VK 30.11.2009 Change sign according to ATLAS
408//
409// ------ Magnetic field in vertex (solenoidal field, ID only)
410//
411 double fx,fy,BMAG_CUR;
412 state.m_fitField.getMagFld(Vrt[0], Vrt[1], Vrt[2] ,fx,fy,BMAG_CUR);
413 if(fabs(BMAG_CUR) < 0.01) BMAG_CUR=0.01; // Safety
414
415 Trk::xyztrp( vkCharge, Vrt, PMom, Cov0, BMAG_CUR, Per, CovPer );
416
417 Perigee.clear();
418 CovPerigee.clear();
419
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]);
422
423 return StatusCode::SUCCESS;
424 }
void xyztrp(const long int ich, double *vrt0, double *pv0, double *covi, double BMAG, double *paro, double *errt)
Definition XYZtrp.cxx:16

◆ VKalVrtFit() [1/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const Perigee * > & InpPerigee,
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
finaloverridevirtual

Definition at line 25 of file VKalVrtFitSvc.cxx.

35{
36 assert(dynamic_cast<State*> (&istate)!=nullptr);
37 State& state = static_cast<State&> (istate);
38//
39//------ extract information about selected tracks
40//
41
42 int ntrk=0;
43 state.m_globalFirstHit = nullptr;
44 StatusCode sc = CvtPerigee(InpPerigee, ntrk, state);
45 if(sc.isFailure())return StatusCode::FAILURE;
46
47 int ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix,
48 Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
49 if (ierr) return StatusCode::FAILURE;
50 return StatusCode::SUCCESS;
51}
const TrackParameters * m_globalFirstHit
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

◆ VKalVrtFit() [2/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const TrackParameters * > & InpTrkC,
const std::vector< const NeutralParameters * > & InpTrkN,
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
finaloverridevirtual

Definition at line 195 of file VKalVrtFitSvc.cxx.

206{
207 assert(dynamic_cast<State*> (&istate)!=nullptr);
208 State& state = static_cast<State&> (istate);
209
210//
211//------ extract information about selected tracks
212//
213 int ntrk=0;
214 state.m_globalFirstHit = nullptr;
216 if(!InpTrkC.empty()){
217 sc=CvtTrackParameters(InpTrkC,ntrk,state);
218 if(sc.isFailure())return StatusCode::FAILURE;
219 }
220 if(!InpTrkN.empty()){
221 sc=CvtNeutralParameters(InpTrkN,ntrk,state);
222 if(sc.isFailure())return StatusCode::FAILURE;
223 }
224
225 if(state.m_ApproximateVertex.empty() && state.m_globalFirstHit){ //Initial guess if absent
226 state.m_ApproximateVertex.reserve(3);
227 state.m_ApproximateVertex.push_back(state.m_globalFirstHit->position().x());
228 state.m_ApproximateVertex.push_back(state.m_globalFirstHit->position().y());
229 state.m_ApproximateVertex.push_back(state.m_globalFirstHit->position().z());
230 }
231 int ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
232 if (ierr) return StatusCode::FAILURE;
233//
234//-- Check vertex position with respect to first measured hit and refit with plane constraint if needed
235 state.m_planeCnstNDOF = 0;
236 if(state.m_globalFirstHit && m_firstMeasuredPointLimit && !ierr){
237 if(Vertex.perp()>state.m_globalFirstHit->position().perp()){
238 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<"Vertex behind first measured point is detected. Constraint is applied!"<<endmsg;
239 state.m_planeCnstNDOF = 1; // Additional NDOF due to plane constraint
240 double pp[3]={Momentum.Px()/Momentum.Rho(),Momentum.Py()/Momentum.Rho(),Momentum.Pz()/Momentum.Rho()};
241 double D= pp[0]*(state.m_globalFirstHit->position().x()-state.m_refFrameX)
242 +pp[1]*(state.m_globalFirstHit->position().y()-state.m_refFrameY)
243 +pp[2]*(state.m_globalFirstHit->position().z()-state.m_refFrameZ);
244 state.m_vkalFitControl.setUsePlaneCnst( pp[0], pp[1], pp[2], D);
245 std::vector<double> saveApproxV(3,0.); state.m_ApproximateVertex.swap(saveApproxV);
246 state.m_ApproximateVertex[0]=state.m_globalFirstHit->position().x();
247 state.m_ApproximateVertex[1]=state.m_globalFirstHit->position().y();
248 state.m_ApproximateVertex[2]=state.m_globalFirstHit->position().z();
249 ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
250 state.m_vkalFitControl.setUsePlaneCnst(0.,0.,0.,0.);
251 if (ierr) { // refit without plane cnst
252 ierr = VKalVrtFit3(ntrk,Vertex,Momentum,Charge,ErrorMatrix,Chi2PerTrk,TrkAtVrt,Chi2, state, ifCovV0 ) ; // if fit with it failed
253 state.m_planeCnstNDOF = 0;
254 }
255 state.m_ApproximateVertex.swap(saveApproxV);
256 }
257 }
258 if (ierr) return StatusCode::FAILURE;
259 return StatusCode::SUCCESS;
260}
StatusCode CvtNeutralParameters(const std::vector< const NeutralParameters * > &InpTrk, int &ntrk, State &state) const

◆ VKalVrtFit() [3/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const xAOD::TrackParticle * > & InpTrkC,
const std::vector< const xAOD::NeutralParticle * > & InpTrkN,
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
finaloverridevirtual

Definition at line 55 of file VKalVrtFitSvc.cxx.

66{
67 assert(dynamic_cast<State*> (&istate)!=nullptr);
68 State& state = static_cast<State&> (istate);
69
70//
71//------ extract information about selected tracks
72//
73 int ntrk=0;
74 state.m_globalFirstHit = nullptr;
75
76 // The tmpInputC will be not owning just holding plain ptr
77 // the ownership is handled via the TParamOwner
78 // and is unique_ptr so we do not leak
79 std::vector<const TrackParameters*> tmpInputC(0);
80 std::vector<std::unique_ptr<const TrackParameters>> TParamOwner(0);
82 double closestHitR=1.e6; //VK needed for FirstMeasuredPointLimit if this hit itself is absent
83 if(m_firstMeasuredPoint){ //First measured point strategy
84 //------
85 if(!InpTrkC.empty()){
86 if( m_InDetExtrapolator == nullptr ){
87 if(msgLvl(MSG::WARNING))msg()<< "No InDet extrapolator given."<<
88 "Can't use FirstMeasuredPoint with xAOD::TrackParticle!!!" << endmsg;
89 return StatusCode::FAILURE;
90 }
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) {
95 if ((*i_ntrk)->indexOfParameterAtPosition(indexFMP, xAOD::FirstMeasurement)){
96 if(msgLvl(MSG::DEBUG))msg()<< "FirstMeasuredPoint on track is discovered. Use it."<<'\n';
97 // create parameters
98 TParamOwner.emplace_back(std::make_unique<CurvilinearParameters>(
99 (*i_ntrk)->curvilinearParameters(indexFMP)));
100 //For the last one we created, push also a not owning / view ptr to tmpInputC
101 tmpInputC.push_back((TParamOwner.back()).get());
102 }else{
103 if(msgLvl(MSG::DEBUG)){
104 msg()<< "FirstMeasuredPoint on track is absent."<<
105 "Try extrapolation from Perigee to FisrtMeasuredPoint radius"<<endmsg;
106 }
107
108 TParamOwner.emplace_back(m_fitPropagator->myxAODFstPntOnTrk((*i_ntrk)));
109 //For the last one we created, push also a not owning / view ptr to tmpInputC
110 tmpInputC.push_back((TParamOwner.back()).get());
111 if(tmpInputC[tmpInputC.size()-1]==nullptr){
112 //Extrapolation failure
113 if(msgLvl(MSG::WARNING)){
114 msg()<< "InDetExtrapolator can't etrapolate xAOD::TrackParticle Perigee "<<
115 "to FirstMeasuredPoint radius! Stop vertex fit!" << endmsg;
116 }
117 return StatusCode::FAILURE;
118 }
119 }
120 if( (*i_ntrk)->radiusOfFirstHit() < closestHitR ) {
121 closestHitR=(*i_ntrk)->radiusOfFirstHit();
122 }
123 }
124 sc=CvtTrackParameters(tmpInputC,ntrk,state);
125 if(sc.isFailure()){
126 return StatusCode::FAILURE;
127 }
128 }
129 }else{
130 if(!InpTrkC.empty()) {
131 sc=CvtTrackParticle(InpTrkC,ntrk,state);
132 }
133 }
134 if(sc.isFailure())return StatusCode::FAILURE;
135 if(!InpTrkN.empty()){sc=CvtNeutralParticle(InpTrkN,ntrk,state); if(sc.isFailure())return StatusCode::FAILURE;}
136 //--
137 int ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, ifCovV0 ) ;
138 if (ierr) return StatusCode::FAILURE;
139 //
140 //-- Check vertex position with respect to first measured hit and refit with plane constraint if needed
141 state.m_planeCnstNDOF = 0;
143 Amg::Vector3D cnstRefPoint(0.,0.,0.);
144 if(closestHitR==1.e6){ // Not found previously
145 const xAOD::TrackParticle * trkFMP=nullptr;
146 for(auto &trka : InpTrkC){
147 double hitR=trka->radiusOfFirstHit();
148 if(closestHitR>hitR){
149 closestHitR=hitR;
150 trkFMP=trka;
151 }
152 }
153 if(closestHitR<1.e6){
154 auto perFMP=m_fitPropagator->myxAODFstPntOnTrk(trkFMP); //FMP is calculated by extrapolation to radiusOfFirstHit
155 if(perFMP) cnstRefPoint = perFMP->position();
156 delete perFMP;
157 }
158 }
159 Amg::Vector3D unitMom=Amg::Vector3D(Momentum.Px()/Momentum.P(),Momentum.Py()/Momentum.P(),Momentum.Pz()/Momentum.P());
160 //----------- Use as reference either hit(state.m_globalFirstHit) or its radius(closestHitR) if hit is absent
161 if(state.m_globalFirstHit)cnstRefPoint=state.m_globalFirstHit->position();
162 //------------
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;
165 state.m_planeCnstNDOF = 1; // Additional NDOF due to plane constraint
166 double D= unitMom.x()*(cnstRefPoint.x()-state.m_refFrameX)
167 +unitMom.y()*(cnstRefPoint.y()-state.m_refFrameY)
168 +unitMom.z()*(cnstRefPoint.z()-state.m_refFrameZ);
169 state.m_parPlaneCnst[0]=unitMom.x();
170 state.m_parPlaneCnst[1]=unitMom.y();
171 state.m_parPlaneCnst[2]=unitMom.z();
172 state.m_parPlaneCnst[3]=D;
173 state.m_cnstRadius=std::sqrt(std::pow(cnstRefPoint.x()-state.m_refFrameX,2.)+std::pow(cnstRefPoint.y()-state.m_refFrameY,2.));
174 state.m_cnstRadiusRef[0]=-state.m_refFrameX;
175 state.m_cnstRadiusRef[1]=-state.m_refFrameY;
176 std::vector<double> saveApproxV(3,0.); state.m_ApproximateVertex.swap(saveApproxV);
177 state.m_ApproximateVertex[0]=cnstRefPoint.x();
178 state.m_ApproximateVertex[1]=cnstRefPoint.y();
179 state.m_ApproximateVertex[2]=cnstRefPoint.z();
180 ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, ifCovV0 );
181 state.m_vkalFitControl.setUsePlaneCnst(0.,0.,0.,0.);
182 if (ierr) { // refit without plane cnst
183 ierr = VKalVrtFit3(ntrk,Vertex,Momentum,Charge,ErrorMatrix,Chi2PerTrk,TrkAtVrt,Chi2, state, ifCovV0); // if fit with it failed
184 state.m_planeCnstNDOF = 0;
185 }
186 state.m_ApproximateVertex.swap(saveApproxV);
187 }
188 }
189 //--
190 if (ierr) return StatusCode::FAILURE;
191 return StatusCode::SUCCESS;
192}
StatusCode CvtNeutralParticle(const std::vector< const xAOD::NeutralParticle * > &list, int &ntrk, State &state) const
TrackParticle_v1 TrackParticle
Reference the current persistent version:

◆ VKalVrtFit3()

int Trk::TrkVKalVrtFitter::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
private

Definition at line 270 of file VKalVrtFitSvc.cxx.

280{
281//
282//------ Variables and arrays needed for fitting kernel
283//
284 int ierr,i;
285 double xyz0[3],covf[21],chi2f=-10.;
286 double ptot[4]={0.};
287 double xyzfit[3]={0.};
288//
289//--- Set field value at (0.,0.,0.) - some safety
290//
291 double Bx,By,Bz;
292 state.m_fitField.getMagFld(-state.m_refFrameX,-state.m_refFrameY,-state.m_refFrameZ,Bx,By,Bz);
293//
294//------ Fit option setting
295//
296 VKalVrtConfigureFitterCore(ntrk, state);
297//
298//------ Fit itself
299//
300 state.m_FitStatus=0;
301 state.m_vkalFitControl.renewFullCovariance(nullptr); //
302 state.m_vkalFitControl.setVertexMass(-1.);
303 state.m_vkalFitControl.setVrtMassError(-1.);
304 if(state.m_ApproximateVertex.size()==3 && fabs(state.m_ApproximateVertex[2])<m_IDsizeZ &&
305 sqrt(state.m_ApproximateVertex[0]*state.m_ApproximateVertex[0]+state.m_ApproximateVertex[1]*state.m_ApproximateVertex[1])<m_IDsizeR)
306 {
307 xyz0[0]=(double)state.m_ApproximateVertex[0] - state.m_refFrameX;
308 xyz0[1]=(double)state.m_ApproximateVertex[1] - state.m_refFrameY;
309 xyz0[2]=(double)state.m_ApproximateVertex[2] - state.m_refFrameZ;
310 } else {
311 xyz0[0]=xyz0[1]=xyz0[2]=0.;
312 }
313 double par0[NTrMaxVFit][3]; //used only for fit preparation
314 Trk::cfpest( ntrk, xyz0, state.m_ich, state.m_apar, par0);
315
316 Chi2PerTrk.resize (ntrk);
317 ierr=Trk::CFit( &state.m_vkalFitControl, ifCovV0, ntrk, state.m_ich, xyz0, par0, state.m_apar, state.m_awgt,
318 xyzfit, state.m_parfs, ptot, covf, chi2f,
319 Chi2PerTrk.data());
320
321 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) << "VKalVrt fit status="<<ierr<<" Chi2="<<chi2f<<endmsg;
322
323 Chi2 = 100000000.;
324 if(ierr){
325 return ierr;
326 }
327 if(ptot[0]*ptot[0]+ptot[1]*ptot[1] == 0.) return -5; // Bad (divergent) fit
328//
329// Postfit operation. Creation of array for different error calculations and full error matrix copy
330//
331 state.m_FitStatus=ntrk;
332 if(ifCovV0 && state.m_vkalFitControl.getFullCovariance()){ //If full fit error matrix is returned by VKalVrtCORE
333 int SymCovMtxSize=(3*ntrk+3)*(3*ntrk+4)/2;
334 state.m_ErrMtx.assign (state.m_vkalFitControl.getFullCovariance(),
335 state.m_vkalFitControl.getFullCovariance()+SymCovMtxSize);
336 state.m_vkalFitControl.renewFullCovariance(nullptr);
337 ErrorMatrix.clear(); ErrorMatrix.reserve(21); ErrorMatrix.assign(covf,covf+21);
338 } else {
339 ErrorMatrix.clear(); ErrorMatrix.reserve(6); ErrorMatrix.assign(covf,covf+6);
340 }
341//---------------------------------------------------------------------------
342 Momentum.SetPxPyPzE( ptot[0], ptot[1], ptot[2], ptot[3] );
343 Chi2 = (double) chi2f;
344
345 Vertex[0]= xyzfit[0] + state.m_refFrameX;
346 Vertex[1]= xyzfit[1] + state.m_refFrameY;
347 Vertex[2]= xyzfit[2] + state.m_refFrameZ;
348
349 double sizeR = state.m_allowUltraDisplaced ? m_MSsizeR : m_IDsizeR;
350 double sizeZ = state.m_allowUltraDisplaced ? m_MSsizeZ : m_IDsizeZ;
351 if (Vertex.perp() > sizeR || std::abs(Vertex.z()) > sizeZ) return -5; // Solution outside acceptable volume due to divergence
352
353 state.m_save_xyzfit[0]=xyzfit[0]; // saving of vertex position
354 state.m_save_xyzfit[1]=xyzfit[1]; // for full error matrix
355 state.m_save_xyzfit[2]=xyzfit[2];
356//
357// ------ Magnetic field in fitted vertex
358//
359 double fx,fy,fz;
360 state.m_fitField.getMagFld(xyzfit[0] ,xyzfit[1] ,xyzfit[2] ,fx,fy,fz);
361
362 Charge=0; for(i=0; i<ntrk; i++){Charge+=state.m_ich[i];};
363 Charge=-Charge; //VK 30.11.2009 Change sign acoording to ATLAS
364
365
366 TrkAtVrt.clear(); TrkAtVrt.reserve(ntrk);
367 for(i=0; i<ntrk; i++){
368 std::vector<double> TrkPar(3);
369 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, state.m_parfs[i][1], state.m_parfs[i][0]);
370 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG=0.01; //safety
371 VKalToTrkTrack(effectiveBMAG,(double)state.m_parfs[i][0],(double)state.m_parfs[i][1],(double)state.m_parfs[i][2],
372 TrkPar[0],TrkPar[1],TrkPar[2]);
373 TrkPar[2] = -TrkPar[2]; // Change of sign needed
374 TrkAtVrt.push_back( std::move(TrkPar) );
375 }
376 return 0;
377 }
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)
Definition CFit.cxx:445
void cfpest(int ntrk, double *xyz, long int *ich, double(*parst)[5], double(*parf)[3])
Definition cfPEst.cxx:10

◆ VKalVrtFitFast() [1/3]

virtual StatusCode Trk::TrkVKalVrtFitter::VKalVrtFitFast ( const std::span< const xAOD::TrackParticle *const > ,
Amg::Vector3D & Vertex,
IVKalState & istate ) const
finaloverridevirtual

◆ VKalVrtFitFast() [2/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFitFast ( const std::vector< const TrackParameters * > & InpTrk,
Amg::Vector3D & Vertex,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 107 of file VKalVrtFitFastSvc.cxx.

110 {
111 assert(dynamic_cast<State*> (&istate)!=nullptr);
112 State& state = static_cast<State&> (istate);
113//
114// Convert particles and setup reference frame
115//
116 int ntrk=0;
117 StatusCode sc = CvtTrackParameters(InpTrk,ntrk,state);
118 if(sc.isFailure() || ntrk<1 ) return StatusCode::FAILURE;
119 double fx,fy,BMAG_CUR;
120 state.m_fitField.getMagFld(0.,0.,0.,fx,fy,BMAG_CUR);
121 if(fabs(BMAG_CUR) < 0.1) BMAG_CUR=0.1;
122//
123//------ Variables and arrays needed for fitting kernel
124//
125 double out[3];
126 std::vector<double> xx,yy,zz;
127 Vertex[0]=Vertex[1]=Vertex[2]=0.;
128//
129//
130 double xyz0[3]={ -state.m_refFrameX, -state.m_refFrameY, -state.m_refFrameZ};
131 if(ntrk==2){
132 Trk::vkvFastV(&state.m_apar[0][0],&state.m_apar[1][0], xyz0, BMAG_CUR, out);
133 } else {
134 for(int i=0;i<ntrk-1; i++){
135 for(int j=i+1; j<ntrk; j++){
136 Trk::vkvFastV(&state.m_apar[i][0],&state.m_apar[j][0], xyz0, BMAG_CUR, out);
137 xx.push_back(out[0]);
138 yy.push_back(out[1]);
139 zz.push_back(out[2]);
140 }
141 }
142 out[0] = median(xx);
143 out[1] = median(yy);
144 out[2] = median(zz);
145
146 }
147 Vertex[0]= out[0] + state.m_refFrameX;
148 Vertex[1]= out[1] + state.m_refFrameY;
149 Vertex[2]= out[2] + state.m_refFrameZ;
150
151
152 return StatusCode::SUCCESS;
153 }
float median(std::vector< float > &Vec)
double vkvFastV(double *p1, double *p2, const double *vRef, double dbmag, double *out)
Definition VKvFast.cxx:42

◆ VKalVrtFitFast() [3/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFitFast ( std::span< const xAOD::TrackParticle *const > InpTrk,
Amg::Vector3D & Vertex,
double & minDZ,
IVKalState & istate ) const
virtual

Definition at line 56 of file VKalVrtFitFastSvc.cxx.

59 {
60 assert(dynamic_cast<State*> (&istate)!=nullptr);
61 State& state = static_cast<State&> (istate);
62//
63// Convert particles and setup reference frame
64//
65 int ntrk=0;
66 StatusCode sc = CvtTrackParticle(InpTrk,ntrk,state);
67 if(sc.isFailure() || ntrk<1 ) return StatusCode::FAILURE;
68 double fx,fy,BMAG_CUR;
69 state.m_fitField.getMagFld(0.,0.,0.,fx,fy,BMAG_CUR);
70 if(fabs(BMAG_CUR) < 0.1) BMAG_CUR=0.1;
71//
72//------ Variables and arrays needed for fitting kernel
73//
74 double out[3];
75 std::vector<double> xx,yy,zz,difz;
76 Vertex[0]=Vertex[1]=Vertex[2]=0.;
77//
78//
79 double xyz0[3]={ -state.m_refFrameX, -state.m_refFrameY, -state.m_refFrameZ};
80 if(ntrk==2){
81 minDZ=Trk::vkvFastV(&state.m_apar[0][0],&state.m_apar[1][0], xyz0, BMAG_CUR, out);
82 } else {
83 for(int i=0;i<ntrk-1; i++){
84 for(int j=i+1; j<ntrk; j++){
85 double dZ=Trk::vkvFastV(&state.m_apar[i][0],&state.m_apar[j][0], xyz0, BMAG_CUR, out);
86 xx.push_back(out[0]);
87 yy.push_back(out[1]);
88 zz.push_back(out[2]);
89 difz.push_back(dZ);
90 }
91 }
92 out[0] = median(xx);
93 out[1] = median(yy);
94 out[2] = median(zz);
95 minDZ = median(difz);
96 }
97 Vertex[0]= out[0] + state.m_refFrameX;
98 Vertex[1]= out[1] + state.m_refFrameY;
99 Vertex[2]= out[2] + state.m_refFrameZ;
100
101
102 return StatusCode::SUCCESS;
103 }

◆ VKalExtPropagator

friend class VKalExtPropagator
friend

Definition at line 68 of file TrkVKalVrtFitter.h.

Member Data Documentation

◆ m_allowUltraDisplaced

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_allowUltraDisplaced {this, "allowUltraDisplaced", false, "Allow ultra displaced vertices"}
private

Definition at line 366 of file TrkVKalVrtFitter.h.

366{this, "allowUltraDisplaced", false, "Allow ultra displaced vertices"};

◆ m_BMAG

double Trk::TrkVKalVrtFitter::m_BMAG {1.997}
private

Definition at line 483 of file TrkVKalVrtFitter.h.

483{1.997}; /* const magnetic field if needed */

◆ m_c_CovVrtForConstraint

Gaudi::Property<std::vector<double> > Trk::TrkVKalVrtFitter::m_c_CovVrtForConstraint {this, "CovVrtForConstraint", {0,0,0,0,0,0}}
private

Definition at line 339 of file TrkVKalVrtFitter.h.

339{this, "CovVrtForConstraint", {0,0,0,0,0,0}};

◆ m_c_MassInputParticles

Gaudi::Property<std::vector<double> > Trk::TrkVKalVrtFitter::m_c_MassInputParticles {this, "InputParticleMasses", {}, "List of masses of input particles (pions assumed if absent)"}
private

Definition at line 340 of file TrkVKalVrtFitter.h.

340{this, "InputParticleMasses", {}, "List of masses of input particles (pions assumed if absent)"};

◆ m_c_VertexForConstraint

Gaudi::Property<std::vector<double> > Trk::TrkVKalVrtFitter::m_c_VertexForConstraint {this, "VertexForConstraint", {0,0,0}}
private

Definition at line 338 of file TrkVKalVrtFitter.h.

338{this, "VertexForConstraint", {0,0,0}};

◆ m_cascadeCnstPrecision

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_cascadeCnstPrecision {this, "CascadeCnstPrecision", 1.e-4}
private

Definition at line 330 of file TrkVKalVrtFitter.h.

330{this, "CascadeCnstPrecision", 1.e-4};

◆ m_CNVMAG

double Trk::TrkVKalVrtFitter::m_CNVMAG {0.29979246}
private

Definition at line 484 of file TrkVKalVrtFitter.h.

484{0.29979246}; /* conversion constant for MeV and MM */

◆ m_extPropagator

ToolHandle<IExtrapolator> Trk::TrkVKalVrtFitter::m_extPropagator {this, "Extrapolator", "", "External propagator"}
private

Definition at line 342 of file TrkVKalVrtFitter.h.

342{this, "Extrapolator", "", "External propagator"};

◆ m_fieldCacheCondObjInputKey

SG::ReadCondHandleKey<AtlasFieldCacheCondObj> Trk::TrkVKalVrtFitter::m_fieldCacheCondObjInputKey
private
Initial value:
{ this,
"AtlasFieldCacheCondObj",
"fieldCondObj",
"Name of the Magnetic Field key" }

Definition at line 345 of file TrkVKalVrtFitter.h.

345 { this,
346 "AtlasFieldCacheCondObj",
347 "fieldCondObj",
348 "Name of the Magnetic Field key" };

◆ m_firstMeasuredPoint

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_firstMeasuredPoint {this, "FirstMeasuredPoint", false, "Use FirstMeasuredPoint strategy in fits"}
private

Definition at line 349 of file TrkVKalVrtFitter.h.

349{this, "FirstMeasuredPoint", false, "Use FirstMeasuredPoint strategy in fits"};

◆ m_firstMeasuredPointLimit

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_firstMeasuredPointLimit {this, "FirstMeasuredPointLimit", false, "Use FirstMeasuredPointLimit strategy"}
private

Definition at line 350 of file TrkVKalVrtFitter.h.

350{this, "FirstMeasuredPointLimit", false, "Use FirstMeasuredPointLimit strategy"};

◆ m_firstMeasuredRadiusLimit

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_firstMeasuredRadiusLimit
private
Initial value:
{this, "FirstMeasuredRadiusLimit", false,
"Use radius of FirstMeasuredRadiusLimit as maximal vertex radius"}

Definition at line 351 of file TrkVKalVrtFitter.h.

351 {this, "FirstMeasuredRadiusLimit", false,
352 "Use radius of FirstMeasuredRadiusLimit as maximal vertex radius"};

◆ m_fitPropagator

VKalExtPropagator* Trk::TrkVKalVrtFitter::m_fitPropagator {}
private

Definition at line 487 of file TrkVKalVrtFitter.h.

487{};

◆ m_frozenVersionForBTagging

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_frozenVersionForBTagging {this, "FrozenVersionForBTagging", false, "Frozen version for BTagging"}
private

Definition at line 365 of file TrkVKalVrtFitter.h.

365{this, "FrozenVersionForBTagging", false, "Frozen version for BTagging"};

◆ m_IDsizeR

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_IDsizeR {this, "IDsizeR", 1150.0}
private

Definition at line 334 of file TrkVKalVrtFitter.h.

334{this, "IDsizeR", 1150.0};

◆ m_IDsizeZ

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_IDsizeZ {this, "IDsizeZ", 3000.0}
private

Definition at line 335 of file TrkVKalVrtFitter.h.

335{this, "IDsizeZ", 3000.0};

◆ m_InDetExtrapolator

const IExtrapolator* Trk::TrkVKalVrtFitter::m_InDetExtrapolator {}
private

Pointer to Extrapolator AlgTool.

Definition at line 488 of file TrkVKalVrtFitter.h.

488{};

◆ m_isAtlasField

bool Trk::TrkVKalVrtFitter::m_isAtlasField {false}
private

Definition at line 356 of file TrkVKalVrtFitter.h.

356{false}; // To allow callback and then field first call only at execute stage

◆ m_IterationNumber

Gaudi::Property<int> Trk::TrkVKalVrtFitter::m_IterationNumber {this, "IterationNumber", 0}
private

Definition at line 332 of file TrkVKalVrtFitter.h.

332{this, "IterationNumber", 0};

◆ m_IterationPrecision

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_IterationPrecision {this, "IterationPrecision", 0.0}
private

Definition at line 333 of file TrkVKalVrtFitter.h.

333{this, "IterationPrecision", 0.0};

◆ m_makeExtendedVertex

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_makeExtendedVertex {this, "MakeExtendedVertex", false, "Return VxCandidate with full covariance matrix"}
private

Definition at line 353 of file TrkVKalVrtFitter.h.

353{this, "MakeExtendedVertex", false, "Return VxCandidate with full covariance matrix"};

◆ m_massForConstraint

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_massForConstraint {this, "MassForConstraint", -1.0}
private

Definition at line 331 of file TrkVKalVrtFitter.h.

331{this, "MassForConstraint", -1.0};

◆ m_MSsizeR

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_MSsizeR {this, "MSsizeR", 8000.0}
private

Definition at line 336 of file TrkVKalVrtFitter.h.

336{this, "MSsizeR", 8000.0};

◆ m_MSsizeZ

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_MSsizeZ {this, "MSsizeZ", 10000.0}
private

Definition at line 337 of file TrkVKalVrtFitter.h.

337{this, "MSsizeZ", 10000.0};

◆ m_Robustness

Gaudi::Property<int> Trk::TrkVKalVrtFitter::m_Robustness {this, "Robustness", 0}
private

Definition at line 328 of file TrkVKalVrtFitter.h.

328{this, "Robustness", 0};

◆ m_RobustScale

Gaudi::Property<double> Trk::TrkVKalVrtFitter::m_RobustScale {this, "RobustScale", 1.0}
private

Definition at line 329 of file TrkVKalVrtFitter.h.

329{this, "RobustScale", 1.0};

◆ m_useAprioriVertex

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_useAprioriVertex {this, "useAprioriVertexCnst", false, "Use a priori vertex constraint"}
private

Definition at line 358 of file TrkVKalVrtFitter.h.

358{this, "useAprioriVertexCnst", false, "Use a priori vertex constraint"};

◆ m_useFixedField

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_useFixedField {this, "useFixedField", false, "Use fixed magnetic field instead of exact Atlas one"}
private

Definition at line 354 of file TrkVKalVrtFitter.h.

354{this, "useFixedField", false, "Use fixed magnetic field instead of exact Atlas one"};

◆ m_usePassNear

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_usePassNear {this, "usePassNearCnst", false, "Use combined particle pass near other vertex constraint"}
private

Definition at line 363 of file TrkVKalVrtFitter.h.

363{this, "usePassNearCnst", false, "Use combined particle pass near other vertex constraint"};

◆ m_usePassWithTrkErr

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_usePassWithTrkErr {this, "usePassWithTrkErrCnst", false, "Use pass near with combined particle errors constraint"}
private

Definition at line 364 of file TrkVKalVrtFitter.h.

364{this, "usePassWithTrkErrCnst", false, "Use pass near with combined particle errors constraint"};

◆ m_usePhiCnst

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_usePhiCnst {this, "usePhiCnst", false, "Use angle dPhi=0 constraint"}
private

Definition at line 360 of file TrkVKalVrtFitter.h.

360{this, "usePhiCnst", false, "Use angle dPhi=0 constraint"};

◆ m_usePointingCnst

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_usePointingCnst {this, "usePointingCnst", false, "Use pointing to other vertex constraint"}
private

Definition at line 361 of file TrkVKalVrtFitter.h.

361{this, "usePointingCnst", false, "Use pointing to other vertex constraint"};

◆ m_useThetaCnst

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_useThetaCnst {this, "useThetaCnst", false, "Use angle dTheta=0 constraint"}
private

Definition at line 359 of file TrkVKalVrtFitter.h.

359{this, "useThetaCnst", false, "Use angle dTheta=0 constraint"};

◆ m_useZPointingCnst

Gaudi::Property<bool> Trk::TrkVKalVrtFitter::m_useZPointingCnst {this, "useZPointingCnst", false, "Use ZPointing to other vertex constraint"}
private

Definition at line 362 of file TrkVKalVrtFitter.h.

362{this, "useZPointingCnst", false, "Use ZPointing to other vertex constraint"};

The documentation for this class was generated from the following files: