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

class  CascadeState
class  State
struct  TrkMatControl

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 xAOD::Vertexfit (const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
 Interface for MeasuredPerigee with starting point.
virtual xAOD::Vertexfit (const std::vector< const TrackParameters * > &perigeeList, const std::vector< const NeutralParameters * > &, const Amg::Vector3D &startingPoint) const override final
virtual xAOD::Vertexfit (const std::vector< const TrackParameters * > &perigeeList, const xAOD::Vertex &constraint) const override final
 Interface for MeasuredPerigee with vertex constraint.
virtual xAOD::Vertexfit (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 xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint) const override final
 Interface for xAOD::TrackParticle with vertex constraint.
virtual xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const Amg::Vector3D &startingPoint) const override final
virtual xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const xAOD::Vertex &constraint) const override final
virtual xAOD::Vertexfit (const std::vector< const TrackParameters * > &) const override final
virtual xAOD::Vertexfit (const std::vector< const TrackParameters * > &, const std::vector< const Trk::NeutralParameters * > &) const override final
xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &constraint, IVKalState &istate) const
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 &Perigee, 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 xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) const override final
virtual double VKalGetImpact (const Trk::Perigee *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) 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 Amg::Vector3D &startingPoint) const
 Interface for xAOD::TrackParticle and xAOD::NeutralParticle with starting point.
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
 Interface for xAOD::TrackParticle and xAOD::NeutralParticle with vertex constraint the position of the constraint is ALWAYS the starting point Event Context aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint) const
 Interface for xAOD::TrackParticle with vertex constraint the position of the constraint is ALWAYS the starting point Event Context aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const std::vector< const Trk::NeutralParameters * > &neutralPerigeeList, const Amg::Vector3D &startingPoint) const
 Interface for TrackParameters and NeutralParameters with starting point Event Context aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const
 Interface for TrackParameters with starting point Event Context aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const std::vector< const Trk::NeutralParameters * > &neutralPerigeeList, const xAOD::Vertex &constraint) const
 Interface for TrackParameters and NeutralParameters with vertex constraint the position of the constraint is ALWAYS the starting point EventContext aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const xAOD::Vertex &constraint) const
 Interface for TrackParameters with vertex constraint the position of the constraint is ALWAYS the starting point EventContext aware method.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const std::vector< const Trk::NeutralParameters * > &neutralPerigeeList) const
 Fit method using the VertexSeedFinder to estimate initial position of the vertex and taking it as a first linearization point (in iterative fitters).
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList) const
 Fit method using the VertexSeedFinder to estimate initial position of the vertex and taking it as a first linearization point (in iterative fitters).
virtual xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &startingPoint) const
 Interface for xAOD::TrackParticle with starting point.
virtual std::unique_ptr< IVKalStatemakeState () const

Private Member Functions

void initCnstList ()
void setAthenaPropagator (const Trk::IExtrapolator *)
void initState (const EventContext &ctx, State &state) const
void initState (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
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 728 of file TrkCascadeFitter.cxx.

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

◆ CvtNeutralParameters()

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

Definition at line 177 of file CvtParametersBase.cxx.

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

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

615{
616 CovMtx.setIdentity();
617 if( Matrix.size() < 21) return;
618 CovMtx(0,0) = 0;
619 CovMtx(1,1) = 0;
620 CovMtx(2,2)= Matrix[ 9];
621 CovMtx.fillSymmetric(2,3,Matrix[13]);
622 CovMtx(3,3)= Matrix[14];
623 CovMtx.fillSymmetric(2,4,Matrix[18]);
624 CovMtx.fillSymmetric(3,4,Matrix[19]);
625 CovMtx(4,4)= Matrix[20];
626}
list Matrix
Definition RTTAlgmain.py:19

◆ FillMatrixP() [2/2]

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

Definition at line 629 of file TrkVKalVrtFitter.cxx.

630{
631 int iTmp=(iTrk+1)*3;
632 int NContent = Matrix.size();
633 CovMtx.setIdentity(); //Clean matrix for the beginning, then fill needed elements
634 CovMtx(0,0) = 0;
635 CovMtx(1,1) = 0;
636 int pnt = (iTmp+1)*iTmp/2 + iTmp; if( pnt > NContent ) return;
637 CovMtx(2,2) = Matrix[pnt];
638 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp; if( pnt+1 > NContent ){ CovMtx.setIdentity(); return; }
639 CovMtx.fillSymmetric(2,3,Matrix[pnt]);
640 CovMtx(3,3) = Matrix[pnt+1];
641 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp; if( pnt+2 > NContent ){ CovMtx.setIdentity(); return; }
642 CovMtx.fillSymmetric(2,4,Matrix[pnt]);
643 CovMtx.fillSymmetric(3,4,Matrix[pnt+1]);
644 CovMtx(4,4) = Matrix[pnt+2];
645}

◆ 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 787 of file TrkCascadeFitter.cxx.

788{
789 int R,I;
790 index.clear();
791 int nI=inputList.size(); if(nI==0) return 0; //all ok
792 int nR=refList.size(); if(nR==0) return 0; //all ok
793 //std::cout<<"inp="; for(I=0; I<nI; I++)std::cout<<inputList[I]; std::cout<<'\n';
794 //std::cout<<"ref="; for(R=0; R<nR; R++)std::cout<<refList[R]; std::cout<<'\n';
795 for(I=0; I<nI; I++){
796 for(R=0; R<nR; R++) if(inputList[I]==refList[R]){index.push_back(R); break;}
797 if(R==nR) return -1; //input element not found in reference list
798 }
799 return 0;
800}
#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/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const Trk::TrackParameters * > & perigeeList ) const
inline

Fit method using the VertexSeedFinder to estimate initial position of the vertex and taking it as a first linearization point (in iterative fitters).

EventContext aware method.

Definition at line 215 of file IVertexFitter.h.

218 {
219 (void)(ctx);
220 return std::unique_ptr<xAOD::Vertex>(fit(perigeeList));
221 }
virtual xAOD::Vertex * fit(const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.

◆ fit() [2/22]

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

Interface for TrackParameters with starting point Event Context aware method.

Definition at line 154 of file IVertexFitter.h.

158 {
159 (void)(ctx);
160 return std::unique_ptr<xAOD::Vertex>(fit(perigeeList, startingPoint));
161 }

◆ fit() [3/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const Trk::TrackParameters * > & perigeeList,
const std::vector< const Trk::NeutralParameters * > & neutralPerigeeList ) const
inline

Fit method using the VertexSeedFinder to estimate initial position of the vertex and taking it as a first linearization point (in iterative fitters).

EventContext aware method.

Definition at line 200 of file IVertexFitter.h.

204 {
205 (void)(ctx);
206 return std::unique_ptr<xAOD::Vertex>(fit(perigeeList, neutralPerigeeList));
207 }

◆ fit() [4/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const Trk::TrackParameters * > & perigeeList,
const std::vector< const Trk::NeutralParameters * > & neutralPerigeeList,
const Amg::Vector3D & startingPoint ) const
inline

Interface for TrackParameters and NeutralParameters with starting point Event Context aware method.

Definition at line 138 of file IVertexFitter.h.

143 {
144 (void)(ctx);
145 return std::unique_ptr<xAOD::Vertex>(
146 fit(perigeeList, neutralPerigeeList, startingPoint));
147 }

◆ fit() [5/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const Trk::TrackParameters * > & perigeeList,
const std::vector< const Trk::NeutralParameters * > & neutralPerigeeList,
const xAOD::Vertex & constraint ) const
inline

Interface for TrackParameters and NeutralParameters with vertex constraint the position of the constraint is ALWAYS the starting point EventContext aware method.

Definition at line 169 of file IVertexFitter.h.

174 {
175 (void)(ctx);
176 return std::unique_ptr<xAOD::Vertex>(
177 fit(perigeeList, neutralPerigeeList, constraint));
178 }

◆ fit() [6/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const Trk::TrackParameters * > & perigeeList,
const xAOD::Vertex & constraint ) const
inline

Interface for TrackParameters with vertex constraint the position of the constraint is ALWAYS the starting point EventContext aware method.

Definition at line 185 of file IVertexFitter.h.

189 {
190 (void)(ctx);
191 return std::unique_ptr<xAOD::Vertex>(fit(perigeeList, constraint));
192 }

◆ fit() [7/22]

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 365 of file TrkVKalVrtFitter.cxx.

368{
369 State state;
370 initState(ctx, state);
371 return std::unique_ptr<xAOD::Vertex>(fit(xtpListC, startingPoint, state));
372}
void initState(const EventContext &ctx, State &state) const

◆ fit() [8/22]

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

Interface for xAOD::TrackParticle and xAOD::NeutralParticle with starting point.

Event Context aware method

Definition at line 91 of file IVertexFitter.h.

96 {
97 (void)(ctx);
98 return std::unique_ptr<xAOD::Vertex>(
99 fit(vectorTrk, vectorNeu, startingPoint));
100 }

◆ fit() [9/22]

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

Interface for xAOD::TrackParticle and xAOD::NeutralParticle with vertex constraint the position of the constraint is ALWAYS the starting point Event Context aware method.

Definition at line 108 of file IVertexFitter.h.

113 {
114 (void)(ctx);
115 return std::unique_ptr<xAOD::Vertex>(fit(vectorTrk, vectorNeu, constraint));
116 }

◆ fit() [10/22]

virtual std::unique_ptr< xAOD::Vertex > Trk::IVertexFitter::fit ( const EventContext & ctx,
const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const xAOD::Vertex & constraint ) const
inline

Interface for xAOD::TrackParticle with vertex constraint the position of the constraint is ALWAYS the starting point Event Context aware method.

Definition at line 124 of file IVertexFitter.h.

128 {
129 (void)(ctx);
130 return std::unique_ptr<xAOD::Vertex>(fit(vectorTrk, constraint));
131 }

◆ fit() [11/22]

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

Definition at line 557 of file TrkVKalVrtFitter.cxx.

558{
559 State state;
560 initState (state);
561 Amg::Vector3D VertexIni(0.,0.,0.);
562 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
563 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
564 std::vector<const NeutralParameters*> perigeeListN(0);
566 TLorentzVector Momentum;
567 long int Charge;
568 std::vector<double> ErrorMatrix;
569 std::vector<double> Chi2PerTrk;
570 std::vector< std::vector<double> > TrkAtVrt;
571 double Chi2;
572 sc=VKalVrtFit( perigeeListC, perigeeListN,
573 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
574
575 xAOD::Vertex * tmpVertex = nullptr;
576 if(sc.isSuccess()) {
577 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
578 }
579 return tmpVertex;
580}
static Double_t sc
virtual StatusCode VKalVrtFitFast(std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
xAOD::Vertex * makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, 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
virtual void setApproximateVertex(double X, double Y, double Z, IVKalState &istate) const override final
::StatusCode StatusCode
StatusCode definition for legacy code.
Vertex_v1 Vertex
Define the latest version of the vertex class.

◆ fit() [12/22]

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

Definition at line 582 of file TrkVKalVrtFitter.cxx.

584{
585 State state;
586 initState (state);
587 Amg::Vector3D VertexIni(0.,0.,0.);
588 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
589 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
591 TLorentzVector Momentum;
592 long int Charge;
593 std::vector<double> ErrorMatrix;
594 std::vector<double> Chi2PerTrk;
595 std::vector< std::vector<double> > TrkAtVrt;
596 double Chi2;
597 sc=VKalVrtFit( perigeeListC, perigeeListN,
598 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
599
600 xAOD::Vertex * tmpVertex = nullptr;
601 if(sc.isSuccess()) {
602 tmpVertex = makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
603 }
604 return tmpVertex;
605}

◆ fit() [13/22]

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

Interface for MeasuredPerigee with starting point.

Definition at line 203 of file TrkVKalVrtFitter.cxx.

205{
206 State state;
207 initState (state);
208 setApproximateVertex(startingPoint.x(),
209 startingPoint.y(),
210 startingPoint.z(),
211 state);
212 std::vector<const NeutralParameters*> perigeeListN(0);
214 TLorentzVector Momentum;
215 long int Charge;
216 std::vector<double> ErrorMatrix;
217 std::vector<double> Chi2PerTrk;
218 std::vector< std::vector<double> > TrkAtVrt;
219 double Chi2;
220 StatusCode sc=VKalVrtFit( perigeeListC, perigeeListN,
221 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
222
223 xAOD::Vertex * tmpVertex = nullptr;
224 if(sc.isSuccess()) {
225 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
226 }
227 return tmpVertex;
228}

◆ fit() [14/22]

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

Definition at line 231 of file TrkVKalVrtFitter.cxx.

234{
235 State state;
236 initState (state);
237 setApproximateVertex(startingPoint.x(),
238 startingPoint.y(),
239 startingPoint.z(),
240 state);
242 TLorentzVector Momentum;
243 long int Charge;
244 std::vector<double> ErrorMatrix;
245 std::vector<double> Chi2PerTrk;
246 std::vector< std::vector<double> > TrkAtVrt;
247 double Chi2;
248 StatusCode sc=VKalVrtFit( perigeeListC,perigeeListN,
249 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
250
251 xAOD::Vertex * tmpVertex = nullptr;
252 if(sc.isSuccess()) {
253 tmpVertex = makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
254 }
255 return tmpVertex;
256}

◆ fit() [15/22]

xAOD::Vertex * Trk::TrkVKalVrtFitter::fit ( 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.

316{
317 State state;
318 initState (state);
319
320 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
321 Amg::Vector3D VertexIni(0.,0.,0.);
322 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
323 if( sc.isSuccess()){
324 setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
325 }else{
326 setApproximateVertex(constraint.position().x(),
327 constraint.position().y(),
328 constraint.position().z(),
329 state);
330 }
331 setVertexForConstraint(constraint.position().x(),
332 constraint.position().y(),
333 constraint.position().z(),
334 state);
335 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
336 constraint.covariancePosition()(Trk::y,Trk::x),
337 constraint.covariancePosition()(Trk::y,Trk::y),
338 constraint.covariancePosition()(Trk::z,Trk::x),
339 constraint.covariancePosition()(Trk::z,Trk::y),
340 constraint.covariancePosition()(Trk::z,Trk::z),
341 state);
342 state.m_useAprioriVertex=true;
344 TLorentzVector Momentum;
345 long int Charge;
346 std::vector<double> ErrorMatrix;
347 std::vector<double> Chi2PerTrk;
348 std::vector< std::vector<double> > TrkAtVrt;
349 double Chi2;
350 sc=VKalVrtFit( perigeeListC, perigeeListN,
351 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
352
353
354 xAOD::Vertex * tmpVertex = nullptr;
355 if(sc.isSuccess()) {
356 tmpVertex = makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
357 }
358 return tmpVertex;
359}
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() [16/22]

xAOD::Vertex * Trk::TrkVKalVrtFitter::fit ( 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 265 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [17/22]

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

Definition at line 374 of file TrkVKalVrtFitter.cxx.

377{
378 assert(dynamic_cast<State*> (&istate)!=nullptr);
379 State& state = static_cast<State&> (istate);
380
381 xAOD::Vertex * tmpVertex = nullptr;
382 setApproximateVertex(startingPoint.x(),
383 startingPoint.y(),
384 startingPoint.z(),
385 state);
386 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
388 TLorentzVector Momentum;
389 long int Charge;
390 std::vector<double> ErrorMatrix;
391 std::vector<double> Chi2PerTrk;
392 std::vector< std::vector<double> > TrkAtVrt;
393 double Chi2;
394 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
395 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
396 if(sc.isSuccess()) {
397 tmpVertex = makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
398 dvect fittrkwgt;
399 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
400 for(int ii=0; ii<state.m_FitStatus; ii++) {
401 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
402 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
403 else tmpVertex->addTrackAtVertex(TEL,1.);
404 }
405 }
406
407 return tmpVertex;
408}
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
std::vector< double > dvect

◆ fit() [18/22]

virtual xAOD::Vertex * Trk::IVertexFitter::fit ( const std::vector< const xAOD::TrackParticle * > & vectorTrk,
const Amg::Vector3D & startingPoint ) const
inline

Interface for xAOD::TrackParticle with starting point.

Definition at line 229 of file IVertexFitter.h.

232 {
233 return fit(Gaudi::Hive::currentContext(), vectorTrk, startingPoint)
234 .release();
235 }

◆ fit() [19/22]

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

Definition at line 410 of file TrkVKalVrtFitter.cxx.

413{
414 State state;
415 initState (state);
416 xAOD::Vertex * tmpVertex = nullptr;
417 setApproximateVertex(startingPoint.x(),
418 startingPoint.y(),
419 startingPoint.z(),
420 state);
422 TLorentzVector Momentum;
423 long int Charge;
424 std::vector<double> ErrorMatrix;
425 std::vector<double> Chi2PerTrk;
426 std::vector< std::vector<double> > TrkAtVrt;
427 double Chi2;
428 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
429 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
430 if(sc.isSuccess()) {
431 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
432 dvect fittrkwgt;
433 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
434 for(int ii=0; ii<state.m_FitStatus; ii++) {
435 if(ii<(int)xtpListC.size()) {
436 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
437 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
438 else tmpVertex->addTrackAtVertex(TEL,1.);
439 }else{
440 ElementLink<xAOD::NeutralParticleContainer> TEL; TEL.setElement( xtpListN[ii] );
441 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
442 else tmpVertex->addNeutralAtVertex(TEL,1.);
443 }
444 }
445 }
446
447 return tmpVertex;
448}
void addNeutralAtVertex(const ElementLink< NeutralParticleContainer > &tr, float weight=1.0)
Add a new neutral to the vertex.

◆ fit() [20/22]

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

Definition at line 505 of file TrkVKalVrtFitter.cxx.

508{
509 State state;
510 initState (state);
511
512 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<< "A priori vertex constraint is activated in VKalVrt fitter!" << endmsg;
513 xAOD::Vertex * tmpVertex = nullptr;
514 setApproximateVertex(constraint.position().x(), constraint.position().y(),constraint.position().z(),state);
515 setVertexForConstraint(constraint.position().x(),
516 constraint.position().y(),
517 constraint.position().z(),
518 state);
519 setCovVrtForConstraint(constraint.covariancePosition()(Trk::x,Trk::x),
520 constraint.covariancePosition()(Trk::y,Trk::x),
521 constraint.covariancePosition()(Trk::y,Trk::y),
522 constraint.covariancePosition()(Trk::z,Trk::x),
523 constraint.covariancePosition()(Trk::z,Trk::y),
524 constraint.covariancePosition()(Trk::z,Trk::z),
525 state);
526 state.m_useAprioriVertex=true;
528 TLorentzVector Momentum;
529 long int Charge;
530 std::vector<double> ErrorMatrix;
531 std::vector<double> Chi2PerTrk;
532 std::vector< std::vector<double> > TrkAtVrt;
533 double Chi2;
534 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
535 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
536 if(sc.isSuccess()){
537 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix,Chi2PerTrk, TrkAtVrt, Chi2, state );
538 dvect fittrkwgt;
539 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
540 for(int ii=0; ii<state.m_FitStatus; ii++) {
541 if(ii<(int)xtpListC.size()) {
542 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
543 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
544 else tmpVertex->addTrackAtVertex(TEL,1.);
545 }else{
546 ElementLink<xAOD::NeutralParticleContainer> TEL; TEL.setElement( xtpListN[ii] );
547 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
548 else tmpVertex->addNeutralAtVertex(TEL,1.);
549 }
550 }
551 }
552
553 return tmpVertex;
554}

◆ fit() [21/22]

xAOD::Vertex * Trk::TrkVKalVrtFitter::fit ( 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 452 of file TrkVKalVrtFitter.cxx.

454{
455 State state;
456 initState (state);
457 return fit (xtpListC, constraint, state);
458}

◆ fit() [22/22]

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

Definition at line 459 of file TrkVKalVrtFitter.cxx.

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

◆ fitCascade()

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

Definition at line 274 of file TrkCascadeFitter.cxx.

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

◆ getCascadeNDoF()

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

Definition at line 79 of file TrkCascadeFitter.cxx.

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

◆ 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 804 of file TrkCascadeFitter.cxx.

806{
807 int NVRT=cstate.m_cascadeVList.size();
808
809 int iv=indexInV(vrt, cstate);
810 if(iv<0) return -1; //not found
811
812 int ivv=0;
813 if(cstate.m_cascadeVList[iv].mergedTO){
814 for(ivv=0; ivv<NVRT; ivv++) if(cstate.m_cascadeVList[iv].mergedTO == cstate.m_cascadeVList[ivv].vID) break;
815 if(iv==NVRT) return -1; //not found
816 iv=ivv;
817 }
818 return cstate.m_cascadeVList[iv].indexInSimpleCascade;
819}

◆ GiveFullMatrix()

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

Definition at line 649 of file TrkVKalVrtFitter.cxx.

650{
651 Amg::MatrixX * mtx = new Amg::MatrixX(3+3*NTrk,3+3*NTrk);
652 long int ij=0;
653 for(int i=1; i<=(3+3*NTrk); i++){
654 for(int j=1; j<=i; j++){
655 if(i==j){ (*mtx)(i-1,j-1)=Matrix[ij];}
656 else { (*mtx).fillSymmetric(i-1,j-1,Matrix[ij]);}
657 ij++;
658 }
659 }
660 return mtx;
661}

◆ indexInV()

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

Definition at line 823 of file TrkCascadeFitter.cxx.

825{ int icv; int NVRT=cstate.m_cascadeVList.size();
826 for(icv=0; icv<NVRT; icv++) if(vrt==cstate.m_cascadeVList[icv].vID)break;
827 if(icv==NVRT)return -1;
828 return icv;
829}

◆ 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() [1/2]

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

Definition at line 164 of file TrkVKalVrtFitter.cxx.

166{
167 //----------------------------------------------------------------------
168 // New magnetic field object is created. It's provided to VKalVrtCore.
169 // VKalVrtFitter must set up Core BEFORE any call required propagation!!!
170 if (m_isAtlasField) {
171 // For the moment, use Gaudi Hive for the event context - would need to be passed in from clients
172 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCacheCondObjInputKey, ctx};
173 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
174 if (fieldCondObj == nullptr) {
175 ATH_MSG_ERROR("Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
176 return;
177 }
178 fieldCondObj->getInitializedCache (state.m_fieldCache);
179 state.m_fitField.setAtlasField(&state.m_fieldCache);
180 } else {
181 state.m_fitField.setAtlasField(m_BMAG);
182 }
183 state.m_eventContext = &ctx;
184 state.m_vkalFitControl.vk_objProp = m_fitPropagator;
185 state.m_useAprioriVertex = m_useAprioriVertex;
186 state.m_useThetaCnst = m_useThetaCnst;
187 state.m_usePhiCnst = m_usePhiCnst;
188 state.m_usePointingCnst = m_usePointingCnst;
189 state.m_useZPointingCnst = m_useZPointingCnst;
190 state.m_usePassNear = m_usePassNear;
191 state.m_usePassWithTrkErr = m_usePassWithTrkErr;
192 state.m_VertexForConstraint = m_c_VertexForConstraint;
193 state.m_CovVrtForConstraint = m_c_CovVrtForConstraint;
194 state.m_massForConstraint = m_massForConstraint;
195 state.m_Robustness = m_Robustness;
196 state.m_RobustScale = m_RobustScale;
197 state.m_MassInputParticles = m_c_MassInputParticles;
198 state.m_frozenVersionForBTagging = m_frozenVersionForBTagging;
199 state.m_allowUltraDisplaced = m_allowUltraDisplaced;
200}
#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

◆ initState() [2/2]

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

Definition at line 158 of file TrkVKalVrtFitter.cxx.

159{
160 initState(Gaudi::Hive::currentContext(), state);
161}

◆ makeSimpleCascade()

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

Definition at line 180 of file TrkCascadeFitter.cxx.

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

◆ makeState() [1/2]

virtual std::unique_ptr< IVKalState > Trk::ITrkVKalVrtFitter::makeState ( ) const
inline

Definition at line 51 of file ITrkVKalVrtFitter.h.

52 {
53 return makeState(Gaudi::Hive::currentContext());
54 }
virtual std::unique_ptr< IVKalState > makeState() const

◆ makeState() [2/2]

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()

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 665 of file TrkVKalVrtFitter.cxx.

670{
671 long int NTrk = state.m_FitStatus;
672 long int Ndf = VKalGetNDOF(state)+state.m_planeCnstNDOF;
673
674 xAOD::Vertex * tmpVertex=new xAOD::Vertex();
675 tmpVertex->makePrivateStore();
676 tmpVertex->setPosition(Vertex);
677 tmpVertex->setFitQuality(Chi2, (float)Ndf);
678
679 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
680 tmpVTAV.clear();
681 std::vector <double> CovFull;
682 StatusCode sc = VKalGetFullCov( NTrk, CovFull, state);
683 int covarExist=0; if( sc.isSuccess() ) covarExist=1;
684
685 std::vector<float> floatErrMtx;
686 if( m_makeExtendedVertex && covarExist ) {
687 floatErrMtx.resize(CovFull.size());
688 for(int i=0; i<(int)CovFull.size(); i++) {
689 if( CovFull[i] < std::numeric_limits<float>::max() &&
690 CovFull[i] > std::numeric_limits<float>::lowest() ){
691 floatErrMtx[i]=static_cast<float>(CovFull[i]);
692 } else {
693 floatErrMtx[i]=std::numeric_limits<float>::max();
694 }
695 }
696 }else{
697 floatErrMtx.resize(fitErrorMatrix.size());
698 for(int i=0; i<(int)fitErrorMatrix.size(); i++) {
699 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
700 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
701 floatErrMtx[i]=static_cast<float>(fitErrorMatrix[i]);
702 } else {
703 floatErrMtx[i]=std::numeric_limits<float>::max();
704 }
705 }
706 }
707 tmpVertex->setCovariance(floatErrMtx);
708
709 for(int ii=0; ii<NTrk ; ii++) {
710 AmgSymMatrix(5) CovMtxP;
711 if(covarExist){ FillMatrixP( ii, CovMtxP, CovFull );}
712 else { CovMtxP.setIdentity();}
713 Perigee * tmpChargPer=nullptr;
714 NeutralPerigee * tmpNeutrPer=nullptr;
715 if(ii<NTrk-Neutrals){
716 tmpChargPer = new Perigee( 0.,0., TrkAtVrt[ii][0],
717 TrkAtVrt[ii][1],
718 TrkAtVrt[ii][2],
719 PerigeeSurface(Vertex), std::move(CovMtxP) );
720 }else{
721 tmpNeutrPer = new NeutralPerigee( 0.,0., TrkAtVrt[ii][0],
722 TrkAtVrt[ii][1],
723 TrkAtVrt[ii][2],
724 PerigeeSurface(Vertex),
725 std::move(CovMtxP) );
726 }
727 tmpVTAV.emplace_back(Chi2PerTrk[ii], tmpChargPer, tmpNeutrPer );
728 }
729
730 return tmpVertex;
731}
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 144 of file TrkCascadeFitter.cxx.

149{
150 assert(dynamic_cast<State*> (&istate)!=nullptr);
151 State& state = static_cast<State&> (istate);
152 CascadeState& cstate = *state.m_cascadeState;
153
154 VertexID vID=nextVertex( list, particleMass, istate, massConstraint);
155//
156 int lastC=cstate.m_partMassCnstForCascade.size()-1; // Check if full vertex mass constraint exist
157 if( lastC>=0 ){ if( cstate.m_partMassCnstForCascade[lastC].VRT == vID ){
158 for(int iv=0; iv<(int)precedingVertices.size(); iv++){
159 cstate.m_partMassCnstForCascade[lastC].pseudoInVrt.push_back(precedingVertices[iv]); }
160 }
161 }
162//
163//-- New vertex structure-----------------------------------
164 int lastV=cstate.m_cascadeVList.size()-1;
165 for(int iv=0; iv<(int)precedingVertices.size(); iv++){
166 cstate.m_cascadeVList[lastV].inPointingV.push_back(precedingVertices[iv]); // fill preceding vertices list
167 }
168//--
169 return vID;
170}
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 97 of file TrkCascadeFitter.cxx.

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

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

◆ setApproximateVertex()

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

Definition at line 115 of file SetFitOptions.cxx.

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

◆ setAthenaPropagator()

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

Definition at line 479 of file VKalExtPropagator.cxx.

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

◆ setCnstType()

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

Definition at line 89 of file SetFitOptions.cxx.

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

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

◆ setMassForConstraint() [1/2]

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

Definition at line 141 of file SetFitOptions.cxx.

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

◆ setMassForConstraint() [2/2]

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

Definition at line 149 of file SetFitOptions.cxx.

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

◆ setMassInputParticles()

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

Definition at line 194 of file SetFitOptions.cxx.

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

◆ setRobustness()

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

Definition at line 123 of file SetFitOptions.cxx.

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

◆ setRobustScale()

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

Definition at line 132 of file SetFitOptions.cxx.

133 { if(Scale!=m_RobustScale)msg(MSG::DEBUG)<< "Robust Scale is changed at execution stage "<<m_RobustScale<<"=>"<<Scale<< endmsg;
134 assert(dynamic_cast<State*> (&istate)!=nullptr);
135 State& state = static_cast<State&> (istate);
136 state.m_RobustScale = Scale;
137 if(state.m_RobustScale<0.01) state.m_RobustScale=1.;
138 if(state.m_RobustScale>100.) state.m_RobustScale=1.;
139 }
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 159 of file SetFitOptions.cxx.

161 {
162 assert(dynamic_cast<State*> (&istate)!=nullptr);
163 State& state = static_cast<State&> (istate);
164 state.m_VertexForConstraint.assign ({Vrt.position().x(),
165 Vrt.position().y(),
166 Vrt.position().z()});
167
168 state.m_CovVrtForConstraint.assign ({
169 Vrt.covariancePosition()(Trk::x,Trk::x),
170 Vrt.covariancePosition()(Trk::x,Trk::y),
171 Vrt.covariancePosition()(Trk::y,Trk::y),
172 Vrt.covariancePosition()(Trk::x,Trk::z),
173 Vrt.covariancePosition()(Trk::y,Trk::z),
174 Vrt.covariancePosition()(Trk::z,Trk::z)});
175 }
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 177 of file SetFitOptions.cxx.

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

◆ 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 62 of file TrkCascadeFitter.cxx.

66{
67 assert(dynamic_cast<State*> (&istate)!=nullptr);
68 State& state = static_cast<State&> (istate);
69 state.m_cascadeState = std::make_unique<CascadeState>();
70 state.m_vkalFitControl.renewCascadeEvent(new CascadeEvent());
71
72 return nextVertex (list, particleMass, istate, massConstraint);
73}
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 451 of file VKalVrtFitSvc.cxx.

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

26 {
27 State state;
28 initState (state);
29 return VKalGetImpact (InpPerigee, Vertex, Charge, Impact, ImpactError, state);
30 }
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 Trk::Perigee * InpPerigee,
const Amg::Vector3D & Vertex,
const long int Charge,
dvect & Impact,
dvect & ImpactError,
IVKalState & istate ) const
finaloverridevirtual

Definition at line 32 of file VKalGetImpact.cxx.

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

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

Definition at line 82 of file VKalGetImpact.cxx.

84 {
85 State state;
86 initState (state);
87 return VKalGetImpact (InpTrk, Vertex, Charge, Impact, ImpactError, state);
88 }

◆ 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 91 of file VKalGetImpact.cxx.

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

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

◆ VKalGetNDOF()

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

Definition at line 581 of file VKalVrtFitSvc.cxx.

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

◆ VKalGetTrkWeights()

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

Definition at line 565 of file VKalVrtFitSvc.cxx.

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

◆ VKalToTrkTrack()

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

Definition at line 423 of file VKalVrtFitSvc.cxx.

426 { tp1= vp2; //phi angle
427 tp2= vp1; //theta angle
428 tp3= vp3 * std::sin( vp1 ) /(m_CNVMAG*effectiveBMAG);
429 constexpr double pi = M_PI;
430 // -pi < phi < pi range
431 while ( tp1 > pi) tp1 -= 2.*pi;
432 while ( tp1 <-pi) tp1 += 2.*pi;
433 // 0 < Theta < pi range
434 while ( tp2 > pi) tp2 -= 2.*pi;
435 while ( tp2 <-pi) tp2 += 2.*pi;
436 if ( tp2 < 0.) {
437 tp2 = fabs(tp2); tp1 += pi;
438 while ( tp1 > pi) tp1 -= 2.*pi;
439 }
440
441 }
#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_globalFirstHit = nullptr;
22 state.m_vkalFitControl.vk_forcft = ForCFT();
23
24 //Set input particle masses
25 for(int it=0; it<NTRK; it++){
26 if( it<(int)state.m_MassInputParticles.size() ) {
27 state.m_vkalFitControl.vk_forcft.wm[it] = (double)(state.m_MassInputParticles[it]);
28 }
29 else { state.m_vkalFitControl.vk_forcft.wm[it]=ParticleConstants::chargedPionMassInMeV; }
30 }
31 // Set reference vertex for different pointing constraints
32 if(state.m_VertexForConstraint.size() >= 3){
33 state.m_vkalFitControl.vk_forcft.vrt[0] =state.m_VertexForConstraint[0] - state.m_refFrameX;
34 state.m_vkalFitControl.vk_forcft.vrt[1] =state.m_VertexForConstraint[1] - state.m_refFrameY;
35 state.m_vkalFitControl.vk_forcft.vrt[2] =state.m_VertexForConstraint[2] - state.m_refFrameZ;
36 }else {for( int i=0; i<3; i++) state.m_vkalFitControl.vk_forcft.vrt[i] = 0.; }
37 // Set covariance matrix for reference vertex
38 if(state.m_CovVrtForConstraint.size() >= 6){
39 for( int i=0; i<6; i++) { state.m_vkalFitControl.vk_forcft.covvrt[i] = (double)(state.m_CovVrtForConstraint[i]); }
40 }else{ for( int i=0; i<6; i++) { state.m_vkalFitControl.vk_forcft.covvrt[i] = 0.; } }
41
42 // Add global mass constraint if present
43 if(state.m_massForConstraint >= 0.) state.m_vkalFitControl.setMassCnstData(NTRK,state.m_massForConstraint);
44 // Add partial mass constraints if present
45 if(!state.m_partMassCnst.empty()) {
46 for(int ic=0; ic<(int)state.m_partMassCnst.size(); ic++){
47 state.m_vkalFitControl.setMassCnstData(NTRK, state.m_partMassCnstTrk[ic],state.m_partMassCnst[ic]);
48 }
49 }
50 // Set general configuration parameters
51 state.m_vkalFitControl.setRobustness(state.m_Robustness);
52 state.m_vkalFitControl.setRobustScale(state.m_RobustScale);
53 if(!m_firstMeasuredPointLimit)state.m_vkalFitControl.setUsePlaneCnst(0.,0.,0.,0.);
54 else state.m_vkalFitControl.setUsePlaneCnst(state.m_parPlaneCnst[0],state.m_parPlaneCnst[1],
55 state.m_parPlaneCnst[2],state.m_parPlaneCnst[3]);
56 if(m_firstMeasuredRadiusLimit)state.m_vkalFitControl.setUseRadiusCnst(state.m_cnstRadius,state.m_cnstRadiusRef);
57 if(state.m_useAprioriVertex) state.m_vkalFitControl.setUseAprioriVrt();
58 if(state.m_useThetaCnst) state.m_vkalFitControl.setUseThetaCnst();
59 if(state.m_usePhiCnst) state.m_vkalFitControl.setUsePhiCnst();
60 if(state.m_usePointingCnst) state.m_vkalFitControl.setUsePointingCnst(1);
61 if(state.m_useZPointingCnst) state.m_vkalFitControl.setUsePointingCnst(2);
62 if(state.m_usePassNear) state.m_vkalFitControl.setUsePassNear(1);
63 if(state.m_usePassWithTrkErr)state.m_vkalFitControl.setUsePassNear(2);
64
65 if(state.m_frozenVersionForBTagging)state.m_vkalFitControl.m_frozenVersionForBTagging=true;
66 if(state.m_allowUltraDisplaced)state.m_vkalFitControl.m_allowUltraDisplaced=true;
67
68 if(m_IterationPrecision>0.) state.m_vkalFitControl.setIterationPrec(m_IterationPrecision);
69 if(m_IterationNumber) state.m_vkalFitControl.setIterationNum(m_IterationNumber);
70
71 }
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 381 of file VKalVrtFitSvc.cxx.

388 {
389 assert(dynamic_cast<State*> (&istate)!=nullptr);
390 State& state = static_cast<State&> (istate);
391 int i,j,ij;
392 double Vrt[3],PMom[4],Cov0[21],Per[5],CovPer[15];
393
394 for(i=0; i<3; i++) Vrt[i]=Vertex[i];
395 for(i=0; i<3; i++) PMom[i]=Momentum[i];
396 for(ij=i=0; i<6; i++){
397 for(j=0; j<=i; j++){
398 Cov0[ij]=CovVrtMom[ij];
399 ij++;
400 }
401 }
402 state.m_refFrameX=state.m_refFrameY=state.m_refFrameZ=0.; //VK Work in ATLAS ref frame ONLY!!!
403 long int vkCharge=-Charge; //VK 30.11.2009 Change sign according to ATLAS
404//
405// ------ Magnetic field in vertex (solenoidal field, ID only)
406//
407 double fx,fy,BMAG_CUR;
408 state.m_fitField.getMagFld(Vrt[0], Vrt[1], Vrt[2] ,fx,fy,BMAG_CUR);
409 if(fabs(BMAG_CUR) < 0.01) BMAG_CUR=0.01; // Safety
410
411 Trk::xyztrp( vkCharge, Vrt, PMom, Cov0, BMAG_CUR, Per, CovPer );
412
413 Perigee.clear();
414 CovPerigee.clear();
415
416 for(i=0; i<5; i++) Perigee.push_back((double)Per[i]);
417 for(i=0; i<15; i++) CovPerigee.push_back((double)CovPer[i]);
418
419 return StatusCode::SUCCESS;
420 }
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 StatusCode sc = CvtPerigee(InpPerigee, ntrk, state);
44 if(sc.isFailure())return StatusCode::FAILURE;
45
46 int ierr = VKalVrtFit3( ntrk, Vertex, Momentum, Charge, ErrorMatrix,
47 Chi2PerTrk, TrkAtVrt,Chi2, state, ifCovV0 ) ;
48 if (ierr) return StatusCode::FAILURE;
49 return StatusCode::SUCCESS;
50}
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 192 of file VKalVrtFitSvc.cxx.

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

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

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

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

◆ m_BMAG

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

Definition at line 475 of file TrkVKalVrtFitter.h.

475{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 331 of file TrkVKalVrtFitter.h.

331{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 332 of file TrkVKalVrtFitter.h.

332{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 330 of file TrkVKalVrtFitter.h.

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

◆ m_cascadeCnstPrecision

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

Definition at line 322 of file TrkVKalVrtFitter.h.

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

◆ m_CNVMAG

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

Definition at line 476 of file TrkVKalVrtFitter.h.

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

◆ m_extPropagator

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

Definition at line 334 of file TrkVKalVrtFitter.h.

334{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 337 of file TrkVKalVrtFitter.h.

337 { this,
338 "AtlasFieldCacheCondObj",
339 "fieldCondObj",
340 "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 341 of file TrkVKalVrtFitter.h.

341{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 342 of file TrkVKalVrtFitter.h.

342{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 343 of file TrkVKalVrtFitter.h.

343 {this, "FirstMeasuredRadiusLimit", false,
344 "Use radius of FirstMeasuredRadiusLimit as maximal vertex radius"};

◆ m_fitPropagator

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

Definition at line 479 of file TrkVKalVrtFitter.h.

479{};

◆ m_frozenVersionForBTagging

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

Definition at line 357 of file TrkVKalVrtFitter.h.

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

◆ m_IDsizeR

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

Definition at line 326 of file TrkVKalVrtFitter.h.

326{this, "IDsizeR", 1150.0};

◆ m_IDsizeZ

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

Definition at line 327 of file TrkVKalVrtFitter.h.

327{this, "IDsizeZ", 3000.0};

◆ m_InDetExtrapolator

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

Pointer to Extrapolator AlgTool.

Definition at line 480 of file TrkVKalVrtFitter.h.

480{};

◆ m_isAtlasField

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

Definition at line 348 of file TrkVKalVrtFitter.h.

348{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 324 of file TrkVKalVrtFitter.h.

324{this, "IterationNumber", 0};

◆ m_IterationPrecision

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

Definition at line 325 of file TrkVKalVrtFitter.h.

325{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 345 of file TrkVKalVrtFitter.h.

345{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 323 of file TrkVKalVrtFitter.h.

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

◆ m_MSsizeR

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

Definition at line 328 of file TrkVKalVrtFitter.h.

328{this, "MSsizeR", 8000.0};

◆ m_MSsizeZ

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

Definition at line 329 of file TrkVKalVrtFitter.h.

329{this, "MSsizeZ", 10000.0};

◆ m_Robustness

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

Definition at line 320 of file TrkVKalVrtFitter.h.

320{this, "Robustness", 0};

◆ m_RobustScale

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

Definition at line 321 of file TrkVKalVrtFitter.h.

321{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 350 of file TrkVKalVrtFitter.h.

350{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 346 of file TrkVKalVrtFitter.h.

346{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 355 of file TrkVKalVrtFitter.h.

355{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 356 of file TrkVKalVrtFitter.h.

356{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 352 of file TrkVKalVrtFitter.h.

352{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 353 of file TrkVKalVrtFitter.h.

353{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 351 of file TrkVKalVrtFitter.h.

351{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 354 of file TrkVKalVrtFitter.h.

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

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