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

#include <TrkVKalVrtFitter.h>

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

Classes

struct  TrkMatControl
class  CascadeState
class  State

Public Member Functions

virtual StatusCode initialize () override final
virtual StatusCode finalize () override final
 TrkVKalVrtFitter (const std::string &t, const std::string &name, const IInterface *parent)
virtual ~TrkVKalVrtFitter ()
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
 Interface for MeasuredPerigee with starting point.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const std::vector< const NeutralParameters * > &, const Amg::Vector3D &startingPoint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const xAOD::Vertex &constraint) const override final
 Interface for MeasuredPerigee with vertex constraint.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const std::vector< const NeutralParameters * > &, const xAOD::Vertex &constraint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &startingPoint) const override final
 Interface for xAOD::TrackParticle with starting point Implements the new style (unique_ptr,EventContext).
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint) const override final
 Interface for xAOD::TrackParticle with vertex constraint.
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const Amg::Vector3D &startingPoint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeu, const xAOD::Vertex &constraint) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &) const override final
virtual std::unique_ptr< xAOD::Vertexfit (const EventContext &ctx, const std::vector< const TrackParameters * > &, const std::vector< const Trk::NeutralParameters * > &) const override final
std::unique_ptr< xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const Amg::Vector3D &constraint, IVKalState &istate) const
std::unique_ptr< xAOD::Vertexfit (const std::vector< const xAOD::TrackParticle * > &vectorTrk, const xAOD::Vertex &constraint, IVKalState &istate) const
VertexID startVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, IVKalState &istate, double massConstraint=0.) const override final
 Interface for cascade fit.
VertexID nextVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, IVKalState &istate, double massConstraint=0.) const override final
VertexID nextVertex (const std::vector< const xAOD::TrackParticle * > &list, std::span< const double > particleMass, const std::vector< VertexID > &precedingVertices, IVKalState &istate, double massConstraint=0.) const override final
VxCascadeInfofitCascade (IVKalState &istate, const Vertex *primVertex=0, bool FirstDecayAtPV=false) const override final
StatusCode addMassConstraint (VertexID Vertex, const std::vector< const xAOD::TrackParticle * > &tracksInConstraint, const std::vector< VertexID > &verticesInConstraint, IVKalState &istate, double massConstraint) const override final
virtual std::unique_ptr< IVKalStatemakeState (const EventContext &ctx) const override final
virtual StatusCode VKalVrtFit (const std::vector< const xAOD::TrackParticle * > &, const std::vector< const xAOD::NeutralParticle * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
virtual StatusCode VKalVrtFit (const std::vector< const Perigee * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
virtual StatusCode VKalVrtFit (const std::vector< const TrackParameters * > &, const std::vector< const NeutralParameters * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
virtual StatusCode VKalVrtCvtTool (const Amg::Vector3D &Vertex, const TLorentzVector &Momentum, const dvect &CovVrtMom, const long int &Charge, dvect &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 EventContext &ctx, const xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) const override final
virtual double VKalGetImpact (const EventContext &ctx, const Trk::Perigee *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError) const override final

Private Member Functions

void initCnstList ()
void setAthenaPropagator (const Trk::IExtrapolator *)
void initState (const EventContext &ctx, State &state) const
bool convertAmg5SymMtx (const AmgSymMatrix(5) *, double[15]) const
void VKalTransform (double MAG, double A0V, double ZV, double PhiV, double ThetaV, double PInv, const double[15], long int &Charge, double[5], double[15]) const
std::unique_ptr< xAOD::VertexmakeXAODVertex (int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
StatusCode CvtPerigee (const std::vector< const Perigee * > &list, int &ntrk, State &state) const
StatusCode CvtTrackParticle (std::span< const xAOD::TrackParticle *const > list, int &ntrk, State &state) const
StatusCode CvtNeutralParticle (const std::vector< const xAOD::NeutralParticle * > &list, int &ntrk, State &state) const
StatusCode CvtTrackParameters (const std::vector< const TrackParameters * > &InpTrk, int &ntrk, State &state) const
StatusCode CvtNeutralParameters (const std::vector< const NeutralParameters * > &InpTrk, int &ntrk, State &state) const
void VKalVrtConfigureFitterCore (int NTRK, State &state) const
void VKalToTrkTrack (double curBMAG, double vp1, double vp2, double vp3, double &tp1, double &tp2, double &tp3) const
int VKalVrtFit3 (int ntrk, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, State &state, bool ifCovV0) const
std::unique_ptr< PerigeeCreatePerigee (double Vx, double Vy, double Vz, const std::vector< double > &VKPerigee, const std::vector< double > &VKCov, State &state) const

Static Private Member Functions

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

Private Attributes

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

Friends

class VKalExtPropagator

Detailed Description

Definition at line 64 of file TrkVKalVrtFitter.h.

Constructor & Destructor Documentation

◆ TrkVKalVrtFitter()

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

Definition at line 30 of file TrkVKalVrtFitter.cxx.

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

◆ ~TrkVKalVrtFitter()

Trk::TrkVKalVrtFitter::~TrkVKalVrtFitter ( )
virtual

Definition at line 51 of file TrkVKalVrtFitter.cxx.

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

Member Function Documentation

◆ addMassConstraint()

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

Definition at line 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
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ CvtNeutralParameters()

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

Definition at line 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 }
238 }
239
240 if(counter == 0) return StatusCode::FAILURE;
241 // Reference frame for the fit based on hits positions
242 tmp_refFrameX /= counter;
243 tmp_refFrameY /= counter;
244 tmp_refFrameZ /= counter;
245 Amg::Vector3D refGVertex (tmp_refFrameX, tmp_refFrameY, tmp_refFrameZ);
246
247 double fx,fy,fz;
248 //
249 // Common reference frame is ready. Start extraction of parameters for fit.
250 // TracksParameters are extrapolated to common point and converted to Perigee
251 // This is needed for VKalVrtCore engine.
252 //
253
254 for (i_pbase = InpTrk.begin(); i_pbase != InpTrk.end(); ++i_pbase) {
255 const Trk::NeutralParameters* neuparO = (*i_pbase);
256 if(neuparO == nullptr) return StatusCode::FAILURE;
257 const Trk::NeutralParameters* neuparN = m_fitPropagator->myExtrapNeutral(neuparO, &refGVertex);
258 mPerN = dynamic_cast<const Trk::NeutralPerigee*>(neuparN);
259 if(mPerN == nullptr) {
260 delete neuparN;
261 return StatusCode::FAILURE;
262 }
263
264 VectPerig = mPerN->parameters();
265 // Global position of perigee point
266 perGlobalPos = mPerN->position();
267 // Global position of reference point
268 perGlobalVrt = mPerN->associatedSurface().center();
269 // VK no good covariance matrix!
270 if( !convertAmg5SymMtx(mPerN->covariance(), CovVertTrk) ) return StatusCode::FAILURE;
271 delete neuparN;
272
273 state.m_refFrameX = state.m_refFrameY = state.m_refFrameZ = 0.;
274 // restore ATLAS frame for safety
275 state.m_fitField.setAtlasMagRefFrame( 0., 0., 0.);
276 // Magnetic field at perigee point
277 state.m_fitField.getMagFld(perGlobalPos.x(), perGlobalPos.y(), perGlobalPos.z(),
278 fx, fy, fz);
279 double effectiveBMAG=state.m_fitField.getEffField(fx, fy, fz, VectPerig[2], VectPerig[3]);
280 if(std::abs(effectiveBMAG) < 0.01) effectiveBMAG = 0.01;
281
282 VKalTransform(effectiveBMAG,
283 (double)VectPerig[0], (double)VectPerig[1],
284 (double)VectPerig[2], (double)VectPerig[3],
285 (double)VectPerig[4], CovVertTrk,
286 state.m_ich[ntrk], &state.m_apar[ntrk][0],
287 &state.m_awgt[ntrk][0]);
288
289 state.m_ich[ntrk]=0;
290 if(state.m_apar[ntrk][4]<0){
291 // Charge=0 is always equal to Charge=+1
292 state.m_apar[ntrk][4] = -state.m_apar[ntrk][4];
293 state.m_awgt[ntrk][10] = -state.m_awgt[ntrk][10];
294 state.m_awgt[ntrk][11] = -state.m_awgt[ntrk][11];
295 state.m_awgt[ntrk][12] = -state.m_awgt[ntrk][12];
296 state.m_awgt[ntrk][13] = -state.m_awgt[ntrk][13];
297 }
298 ntrk++;
299 if(ntrk>=NTrMaxVFit) return StatusCode::FAILURE;
300 }
301
302 //-------------- Finally setting new reference frame common for ALL tracks
303 state.m_refFrameX = tmp_refFrameX;
304 state.m_refFrameY = tmp_refFrameY;
305 state.m_refFrameZ = tmp_refFrameZ;
306 state.m_fitField.setAtlasMagRefFrame(state.m_refFrameX, state.m_refFrameY, state.m_refFrameZ);
307
308 return StatusCode::SUCCESS;
309 }
#define AmgVector(rows)
if(pathvar)
Eigen::Matrix< double, 3, 1 > Vector3D
const Amg::Vector3D & position() const
Access method for the position.
bool convertAmg5SymMtx(const AmgSymMatrix(5) *, double[15]) const
void VKalTransform(double MAG, double A0V, double ZV, double PhiV, double ThetaV, double PInv, const double[15], long int &Charge, double[5], double[15]) const
Gaudi::Property< double > m_IDsizeZ
Gaudi::Property< double > m_IDsizeR
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters
ParametersT< NeutralParametersDim, Neutral, PerigeeSurface > NeutralPerigee

◆ CvtNeutralParticle()

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

Definition at line 126 of file CvtTrackParticle.cxx.

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

◆ CvtPerigee()

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

Definition at line 25 of file CvtPerigee.cxx.

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

◆ CvtTrackParameters()

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

Definition at line 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 611 of file TrkVKalVrtFitter.cxx.

612{
613 CovMtx.setIdentity();
614 if( Matrix.size() < 21) return;
615 CovMtx(0,0) = 0;
616 CovMtx(1,1) = 0;
617 CovMtx(2,2)= Matrix[ 9];
618 CovMtx.fillSymmetric(2,3,Matrix[13]);
619 CovMtx(3,3)= Matrix[14];
620 CovMtx.fillSymmetric(2,4,Matrix[18]);
621 CovMtx.fillSymmetric(3,4,Matrix[19]);
622 CovMtx(4,4)= Matrix[20];
623}

◆ FillMatrixP() [2/2]

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

Definition at line 626 of file TrkVKalVrtFitter.cxx.

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

◆ 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/12]

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

Definition at line 554 of file TrkVKalVrtFitter.cxx.

556{
557 State state;
558 initState (ctx, state);
559 Amg::Vector3D VertexIni(0.,0.,0.);
560 StatusCode sc=VKalVrtFitFast(perigeeListC, VertexIni, state);
561 if( sc.isSuccess()) setApproximateVertex(VertexIni.x(),VertexIni.y(),VertexIni.z(),state);
562 std::vector<const NeutralParameters*> perigeeListN(0);
564 TLorentzVector Momentum;
565 long int Charge;
566 std::vector<double> ErrorMatrix;
567 std::vector<double> Chi2PerTrk;
568 std::vector< std::vector<double> > TrkAtVrt;
569 double Chi2;
570 sc=VKalVrtFit( perigeeListC, perigeeListN,
571 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
572
573 if(sc.isSuccess()) {
574 return makeXAODVertex( 0, Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
575 }
576 return {};
577}
static Double_t sc
virtual StatusCode VKalVrtFitFast(std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
void initState(const EventContext &ctx, State &state) const
virtual StatusCode VKalVrtFit(const std::vector< const xAOD::TrackParticle * > &, const std::vector< const xAOD::NeutralParticle * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
std::unique_ptr< xAOD::Vertex > makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
virtual void setApproximateVertex(double X, double Y, double Z, IVKalState &istate) const override final
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ fit() [2/12]

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

Definition at line 579 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [3/12]

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

Interface for MeasuredPerigee with starting point.

Definition at line 197 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [4/12]

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

Definition at line 225 of file TrkVKalVrtFitter.cxx.

229{
230 State state;
231 initState (ctx, state);
232 setApproximateVertex(startingPoint.x(),
233 startingPoint.y(),
234 startingPoint.z(),
235 state);
237 TLorentzVector Momentum;
238 long int Charge;
239 std::vector<double> ErrorMatrix;
240 std::vector<double> Chi2PerTrk;
241 std::vector< std::vector<double> > TrkAtVrt;
242 double Chi2;
243 StatusCode sc=VKalVrtFit( perigeeListC,perigeeListN,
244 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
245
246 if(sc.isSuccess()) {
247 return makeXAODVertex( (int)perigeeListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
248 }
249 return {};
250}

◆ fit() [5/12]

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

Definition at line 307 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [6/12]

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

Interface for MeasuredPerigee with vertex constraint.

the position of the constraint is ALWAYS the starting point

Definition at line 259 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [7/12]

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

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

Definition at line 359 of file TrkVKalVrtFitter.cxx.

362{
363 State state;
364 initState(ctx, state);
365 return std::unique_ptr<xAOD::Vertex>(fit(xtpListC, startingPoint, state));
366}
virtual std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.

◆ fit() [8/12]

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

Definition at line 404 of file TrkVKalVrtFitter.cxx.

408{
409 State state;
410 initState (ctx, state);
411 std::unique_ptr<xAOD::Vertex> tmpVertex;
412 setApproximateVertex(startingPoint.x(),
413 startingPoint.y(),
414 startingPoint.z(),
415 state);
417 TLorentzVector Momentum;
418 long int Charge;
419 std::vector<double> ErrorMatrix;
420 std::vector<double> Chi2PerTrk;
421 std::vector< std::vector<double> > TrkAtVrt;
422 double Chi2;
423 StatusCode sc=VKalVrtFit( xtpListC, xtpListN,
424 Vertex, Momentum, Charge, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state, true );
425 if(sc.isSuccess()) {
426 tmpVertex = makeXAODVertex( (int)xtpListN.size(), Vertex, ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state );
427 dvect fittrkwgt;
428 sc=VKalGetTrkWeights(fittrkwgt, state); if(sc.isFailure())fittrkwgt.clear();
429 for(int ii=0; ii<state.m_FitStatus; ii++) {
430 if(ii<(int)xtpListC.size()) {
431 ElementLink<xAOD::TrackParticleContainer> TEL; TEL.setElement( xtpListC[ii] );
432 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
433 else tmpVertex->addTrackAtVertex(TEL,1.);
434 }else{
435 ElementLink<xAOD::NeutralParticleContainer> TEL; TEL.setElement( xtpListN[ii] );
436 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
437 else tmpVertex->addNeutralAtVertex(TEL,1.);
438 }
439 }
440 }
441
442 return tmpVertex;
443}
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
std::vector< double > dvect

◆ fit() [9/12]

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

Definition at line 501 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [10/12]

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

Interface for xAOD::TrackParticle with vertex constraint.

the position of the constraint is ALWAYS the starting point

Definition at line 447 of file TrkVKalVrtFitter.cxx.

450{
451 State state;
452 initState (ctx, state);
453 return fit (xtpListC, constraint, state);
454}

◆ fit() [11/12]

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

Definition at line 368 of file TrkVKalVrtFitter.cxx.

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

◆ fit() [12/12]

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

Definition at line 455 of file TrkVKalVrtFitter.cxx.

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

◆ 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,3>(3*it+3+0,3*it+3+0) = tmpDeriv.block<3,3>(2,3*it+3+0);
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
static int getSimpleVIndex(const VertexID &, const CascadeState &cstate)
StatusCode CvtTrackParameters(const std::vector< const TrackParameters * > &InpTrk, int &ntrk, State &state) const
void VKalVrtConfigureFitterCore(int NTRK, State &state) const
Gaudi::Property< bool > m_makeExtendedVertex
static int findPositions(const std::vector< int > &, const std::vector< int > &, std::vector< int > &)
static void makeSimpleCascade(std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, CascadeState &cstate)
static void printSimpleCascade(std::vector< std::vector< int > > &, std::vector< std::vector< int > > &, const CascadeState &cstate)
Gaudi::Property< double > m_cascadeCnstPrecision
StatusCode CvtTrackParticle(std::span< const xAOD::TrackParticle *const > list, int &ntrk, State &state) const
static int getCascadeNDoF(const CascadeState &cstate)
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
int SymIndex(int it, int i, int j)
void getFittedCascade(CascadeEvent &cascadeEvent_, std::vector< Vect3DF > &cVertices, std::vector< std::vector< double > > &covVertices, std::vector< std::vector< VectMOM > > &fittedParticles, std::vector< std::vector< double > > &cascadeCovar, std::vector< double > &particleChi2, std::vector< double > &fullCovar)
int processCascade(CascadeEvent &cascadeEvent_)
int setCascadeMassConstraint(CascadeEvent &cascadeEvent_, long int IV, double Mass)
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
int makeCascade(VKalVrtControl &FitCONTROL, long int NTRK, const long int *ich, double *wm, double *inp_Trk5, double *inp_CovTrk5, const std::vector< std::vector< int > > &vertexDefinition, const std::vector< std::vector< int > > &cascadeDefinition, double definedCnstAccuracy)
@ pz
global momentum (cartesian)
Definition ParamDefs.h:61
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75
@ px
Definition ParamDefs.h:59
@ py
Definition ParamDefs.h:60
int processCascadePV(CascadeEvent &cascadeEvent_, const double *primVrt, const double *primVrtCov)
Vertex_v1 Vertex
Define the latest version of the vertex class.
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.

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

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

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

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

Definition at line 158 of file TrkVKalVrtFitter.cxx.

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

◆ makeSimpleCascade()

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

Definition at line 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}
m_data push_back(elt)

◆ makeState()

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

Definition at line 58 of file TrkVKalVrtFitter.cxx.

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

◆ makeXAODVertex()

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

Definition at line 662 of file TrkVKalVrtFitter.cxx.

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

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

◆ setAthenaPropagator()

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

Definition at line 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 88 of file SetFitOptions.cxx.

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

◆ setCovVrtForConstraint()

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

Definition at line 184 of file SetFitOptions.cxx.

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

◆ setMassForConstraint() [1/2]

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

Definition at line 140 of file SetFitOptions.cxx.

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

◆ setMassForConstraint() [2/2]

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

Definition at line 148 of file SetFitOptions.cxx.

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

◆ setMassInputParticles()

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

Definition at line 193 of file SetFitOptions.cxx.

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

◆ setRobustness()

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

Definition at line 122 of file SetFitOptions.cxx.

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

◆ setRobustScale()

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

Definition at line 131 of file SetFitOptions.cxx.

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

◆ setVertexForConstraint() [1/2]

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

Definition at line 158 of file SetFitOptions.cxx.

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

◆ setVertexForConstraint() [2/2]

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

Definition at line 176 of file SetFitOptions.cxx.

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

◆ startVertex()

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

Interface for cascade fit.

Definition at line 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 454 of file VKalVrtFitSvc.cxx.

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

◆ VKalGetImpact() [1/4]

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

Definition at line 21 of file VKalGetImpact.cxx.

27 {
28 State state;
29 initState (ctx, state);
30 return VKalGetImpact (InpPerigee, Vertex, Charge, Impact, ImpactError, state);
31 }
virtual double VKalGetImpact(const xAOD::TrackParticle *, const Amg::Vector3D &Vertex, const long int Charge, dvect &Impact, dvect &ImpactError, IVKalState &istate) const override final

◆ VKalGetImpact() [2/4]

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

Definition at line 83 of file VKalGetImpact.cxx.

86 {
87 State state;
88 initState (ctx, state);
89 return VKalGetImpact (InpTrk, Vertex, Charge, Impact, ImpactError, state);
90 }

◆ VKalGetImpact() [3/4]

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

Definition at line 33 of file VKalGetImpact.cxx.

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

◆ VKalGetImpact() [4/4]

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

Definition at line 93 of file VKalGetImpact.cxx.

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

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

◆ VKalGetNDOF()

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

Definition at line 584 of file VKalVrtFitSvc.cxx.

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

◆ VKalGetTrkWeights()

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

Definition at line 568 of file VKalVrtFitSvc.cxx.

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

◆ VKalToTrkTrack()

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

Definition at line 426 of file VKalVrtFitSvc.cxx.

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

◆ VKalTransform()

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

Definition at line 59 of file VKalTransform.cxx.

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

◆ VKalVrtConfigureFitterCore()

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

Definition at line 18 of file SetFitOptions.cxx.

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

◆ VKalVrtCvtTool()

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

Definition at line 384 of file VKalVrtFitSvc.cxx.

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

◆ VKalVrtFit() [1/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const Perigee * > & InpPerigee,
Amg::Vector3D & Vertex,
TLorentzVector & Momentum,
long int & Charge,
dvect & ErrorMatrix,
dvect & Chi2PerTrk,
std::vector< std::vector< double > > & TrkAtVrt,
double & Chi2,
IVKalState & istate,
bool ifCovV0 = false ) const
finaloverridevirtual

Definition at line 25 of file VKalVrtFitSvc.cxx.

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

◆ VKalVrtFit() [2/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const TrackParameters * > & InpTrkC,
const std::vector< const NeutralParameters * > & InpTrkN,
Amg::Vector3D & Vertex,
TLorentzVector & Momentum,
long int & Charge,
dvect & ErrorMatrix,
dvect & Chi2PerTrk,
std::vector< std::vector< double > > & TrkAtVrt,
double & Chi2,
IVKalState & istate,
bool ifCovV0 = false ) const
finaloverridevirtual

Definition at line 194 of file VKalVrtFitSvc.cxx.

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

◆ VKalVrtFit() [3/3]

StatusCode Trk::TrkVKalVrtFitter::VKalVrtFit ( const std::vector< const xAOD::TrackParticle * > & InpTrkC,
const std::vector< const xAOD::NeutralParticle * > & InpTrkN,
Amg::Vector3D & Vertex,
TLorentzVector & Momentum,
long int & Charge,
dvect & ErrorMatrix,
dvect & Chi2PerTrk,
std::vector< std::vector< double > > & TrkAtVrt,
double & Chi2,
IVKalState & istate,
bool ifCovV0 = false ) const
finaloverridevirtual

Definition at line 55 of file VKalVrtFitSvc.cxx.

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

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

◆ VKalVrtFitFast() [1/3]

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

◆ VKalVrtFitFast() [2/3]

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

Definition at line 107 of file VKalVrtFitFastSvc.cxx.

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

◆ VKalVrtFitFast() [3/3]

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

Definition at line 56 of file VKalVrtFitFastSvc.cxx.

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

◆ VKalExtPropagator

friend class VKalExtPropagator
friend

Definition at line 68 of file TrkVKalVrtFitter.h.

Member Data Documentation

◆ m_allowUltraDisplaced

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

Definition at line 366 of file TrkVKalVrtFitter.h.

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

◆ m_BMAG

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

Definition at line 483 of file TrkVKalVrtFitter.h.

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

◆ m_c_CovVrtForConstraint

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

Definition at line 339 of file TrkVKalVrtFitter.h.

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

◆ m_c_MassInputParticles

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

Definition at line 340 of file TrkVKalVrtFitter.h.

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

◆ m_c_VertexForConstraint

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

Definition at line 338 of file TrkVKalVrtFitter.h.

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

◆ m_cascadeCnstPrecision

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

Definition at line 330 of file TrkVKalVrtFitter.h.

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

◆ m_CNVMAG

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

Definition at line 484 of file TrkVKalVrtFitter.h.

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

◆ m_extPropagator

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

Definition at line 342 of file TrkVKalVrtFitter.h.

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

◆ m_fieldCacheCondObjInputKey

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

Definition at line 345 of file TrkVKalVrtFitter.h.

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

◆ m_firstMeasuredPoint

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

Definition at line 349 of file TrkVKalVrtFitter.h.

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

◆ m_firstMeasuredPointLimit

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

Definition at line 350 of file TrkVKalVrtFitter.h.

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

◆ m_firstMeasuredRadiusLimit

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

Definition at line 351 of file TrkVKalVrtFitter.h.

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

◆ m_fitPropagator

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

Definition at line 487 of file TrkVKalVrtFitter.h.

487{};

◆ m_frozenVersionForBTagging

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

Definition at line 365 of file TrkVKalVrtFitter.h.

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

◆ m_IDsizeR

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

Definition at line 334 of file TrkVKalVrtFitter.h.

334{this, "IDsizeR", 1150.0};

◆ m_IDsizeZ

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

Definition at line 335 of file TrkVKalVrtFitter.h.

335{this, "IDsizeZ", 3000.0};

◆ m_InDetExtrapolator

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

Pointer to Extrapolator AlgTool.

Definition at line 488 of file TrkVKalVrtFitter.h.

488{};

◆ m_isAtlasField

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

Definition at line 356 of file TrkVKalVrtFitter.h.

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

◆ m_IterationNumber

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

Definition at line 332 of file TrkVKalVrtFitter.h.

332{this, "IterationNumber", 0};

◆ m_IterationPrecision

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

Definition at line 333 of file TrkVKalVrtFitter.h.

333{this, "IterationPrecision", 0.0};

◆ m_makeExtendedVertex

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

Definition at line 353 of file TrkVKalVrtFitter.h.

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

◆ m_massForConstraint

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

Definition at line 331 of file TrkVKalVrtFitter.h.

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

◆ m_MSsizeR

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

Definition at line 336 of file TrkVKalVrtFitter.h.

336{this, "MSsizeR", 8000.0};

◆ m_MSsizeZ

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

Definition at line 337 of file TrkVKalVrtFitter.h.

337{this, "MSsizeZ", 10000.0};

◆ m_Robustness

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

Definition at line 328 of file TrkVKalVrtFitter.h.

328{this, "Robustness", 0};

◆ m_RobustScale

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

Definition at line 329 of file TrkVKalVrtFitter.h.

329{this, "RobustScale", 1.0};

◆ m_useAprioriVertex

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

Definition at line 358 of file TrkVKalVrtFitter.h.

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

◆ m_useFixedField

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

Definition at line 354 of file TrkVKalVrtFitter.h.

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

◆ m_usePassNear

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

Definition at line 363 of file TrkVKalVrtFitter.h.

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

◆ m_usePassWithTrkErr

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

Definition at line 364 of file TrkVKalVrtFitter.h.

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

◆ m_usePhiCnst

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

Definition at line 360 of file TrkVKalVrtFitter.h.

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

◆ m_usePointingCnst

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

Definition at line 361 of file TrkVKalVrtFitter.h.

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

◆ m_useThetaCnst

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

Definition at line 359 of file TrkVKalVrtFitter.h.

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

◆ m_useZPointingCnst

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

Definition at line 362 of file TrkVKalVrtFitter.h.

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

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