14#include "GaudiKernel/SmartDataPtr.h"
36 const std::string & name,
37 const IInterface * parent)
41 declareInterface<IAlignTrackPreProcessor>(
this);
51 ATH_MSG_INFO(
"BeamspotVertexPreProcessor::initialize()");
65 return StatusCode::FAILURE;
73 return StatusCode::FAILURE;
81 return StatusCode::FAILURE;
89 return StatusCode::FAILURE;
101 ATH_MSG_FATAL(
"Requested BeamSpot track selection but Track Selector not configured");
102 return StatusCode::FAILURE;
106 return StatusCode::FAILURE;
114 ATH_MSG_FATAL(
"Requested beam-spot constraint but RefitTracks is False.");
115 return StatusCode::FAILURE;
121 return StatusCode::FAILURE;
126 ATH_MSG_INFO(
"************************************************************************");
128 ATH_MSG_INFO(
"* You have requested the Full Vertex Constraint option. *");
129 ATH_MSG_INFO(
"* It is your duty to assure that all detector elements *");
130 ATH_MSG_INFO(
"* used for track fitting are also loaded in the alignment framework!!! *");
132 ATH_MSG_INFO(
"* Also make sure the accurate track covariance matrix *");
133 ATH_MSG_INFO(
"* is returned by the GlobalChi2Fitter! *");
135 ATH_MSG_INFO(
"************************************************************************");
139 return StatusCode::SUCCESS;
147 if(!linkToTrackParticle)
return false;
154 if(
m_method.find(
"compareAddress") != std::string::npos){
155 if (
m_track == originalTrk) equal =
true;
159 if(
m_method.find(
"comparePerigee") != std::string::npos){
162 if(! (measPer1 && measPer2 )) equal =
false;
164 float diff = std::abs(std::numeric_limits<float>::epsilon());
165 if( ( std::abs(measPer1->parameters()[
Trk::d0] - measPer2->parameters()[
Trk::d0]) >
diff)
166 || ( std::abs(measPer1->parameters()[
Trk::z0] - measPer2->parameters()[
Trk::z0]) >
diff)
181 ATH_MSG_DEBUG(
"this primary vertex has been rejected as type dummy");
185 ATH_MSG_WARNING(
" VERY STRANGE!!!, this primary vertex has been rejected as non-positive DoF "<< vtx->
numberDoF() <<
" the type of this vertex: "<< vtx->
vertexType() );
199 ATH_MSG_WARNING(
" VERY STRANGE!!! , the updated vertex has been rejected as non-positive DoF: "<< vtx->
numberDoF() <<
" the type of this vertex:"<< vtx->
vertexType() );
208 if ((vtx->covariancePosition())(0,0)<=0 ||
209 (vtx->covariancePosition())(1,1)<=0 ||
210 (vtx->covariancePosition())(2,2)<=0){
211 ATH_MSG_WARNING(
" VERY STRANGE!!! , this updated vertex has been rejected as negative diagonal error matrix ");
220 if(!vertices)
return false;
223 if (vtx->vertexType() != 1)
break;
236 std::vector<VxTrackAtVertex > vertexTracks =
vertex->vxTrackAtVertex();
239 std::vector<VxTrackAtVertex >::const_iterator iVxTrackBegin = vertexTracks.begin();
240 std::vector<VxTrackAtVertex >::const_iterator iVxTrackEnd = vertexTracks.end();
242 std::vector<VxTrackAtVertex>::const_iterator findResult = std::find_if(iVxTrackBegin, iVxTrackEnd, std::move(thisCompare));
244 return findResult != iVxTrackEnd;
253 const EventContext& ctx = Gaudi::Hive::currentContext();
258 ATH_MSG_DEBUG(
"this vertex did not pass the primary vertex selection...");
261 if (vtx->vxTrackAtVertexAvailable()){
262 std::vector<VxTrackAtVertex> vtxTracks = vtx->vxTrackAtVertex();
266 ATH_MSG_DEBUG(
"this vertex did not pass the vxTrackAtVertexAvailable() call...");
280 auto iVxTrackBegin = thisPair.second.begin();
281 auto iVxTrackEnd = thisPair.second.end();
284 auto findResult = std::find_if(iVxTrackBegin, iVxTrackEnd, std::move(thisCompare));
286 if(findResult != iVxTrackEnd){
288 findVxCandidate = thisPair.first;
293 return findVxCandidate;
299 const EventContext& ctx = Gaudi::Hive::currentContext();
308 if (!(
nullptr==findVtx) ) {
323 if ( tmpVtx!= updatedVtx)
delete updatedVtx;
328 ATH_MSG_DEBUG(
" updated Vertex by KalmanVertexUpdator: "<<updatedVtx);
333 const Perigee* perigee =
nullptr;
334 std::unique_ptr<const Trk::TrackParameters> tmp =
338 perigee =
static_cast<const Perigee*
> (tmp.release());
341 const Perigee * trackPerigee = track->perigeeParameters();
343 perigee = trackPerigee->
clone();
348 if (updatedVtx!= tmpVtx)
delete updatedVtx;
360 double ptInv = 1./perigee->
momentum().perp();
361 Jacobian(0,0) = -ptInv*perigee->
momentum().y();
362 Jacobian(0,1) = ptInv*perigee->
momentum().x();
365 ATH_MSG_DEBUG(
" Jacobian matrix from Cartesian to Perigee: "<< Jacobian);
367 AmgSymMatrix(3) vtxCov = updatedVtx->covariancePosition();
374 tmpCov(0,0) = 1.e-10 ;
375 tmpCov(1,1) = 1.e-10;
376 tmpCov(2,2) = 1.e-10;
377 errorMatrix =
Amg::MatrixX( tmpCov.similarity(Jacobian) );
379 errorMatrix =
Amg::MatrixX( vtxCov.similarity(Jacobian) );
385 if (tmpVtx != updatedVtx){
395 vot =
new VertexOnTrack(std::move(localParams), std::move(errorMatrix), surface);
396 ATH_MSG_DEBUG(
"the VertexOnTrack created from vertex: "<<*vot);
401 if ( tmpVtx!= updatedVtx)
delete updatedVtx;
409 const EventContext& ctx = Gaudi::Hive::currentContext();
414 float beamSpotX = bpos.x();
415 float beamSpotY = bpos.y();
416 float beamSpotZ = bpos.z();
417 float beamTiltX = beamSpotHandle->beamTilt(0);
418 float beamTiltY = beamSpotHandle->beamTilt(1);
424 float z0 = track->perigeeParameters()->parameters()[
Trk::z0];
425 float beamX = beamSpotX + std::tan(beamTiltX) * (
z0-beamSpotZ);
426 float beamY = beamSpotY + std::tan(beamTiltY) * (
z0-beamSpotZ);
428 ATH_MSG_DEBUG(
"constructing beam point (x,y,z) = ( "<<beamX<<
" , "<<beamY<<
" , "<<
z0<<
" )");
429 std::optional<PerigeeSurface> surface = std::nullopt;
435 beamSpotCov.setZero();
436 beamSpotCov(0,0) = beamSigmaX * beamSigmaX;
437 beamSpotCov(1,1) = beamSigmaY * beamSigmaY;
442 surface.emplace(globPos);
449 const Perigee* perigee =
nullptr;
450 std::unique_ptr<const Trk::TrackParameters> tmp =
454 perigee =
static_cast<const Perigee*
>(tmp.release());
458 const Perigee * trackPerigee = track->perigeeParameters();
460 perigee = trackPerigee->
clone();
467 Eigen::Matrix<double,1,2> jacobian;
470 double ptInv = 1./perigee->
momentum().perp();
471 jacobian(0,0) = -ptInv * perigee->
momentum().y();
472 jacobian(0,1) = ptInv * perigee->
momentum().x();
474 errorMatrix =
Amg::MatrixX( jacobian*(beamSpotCov*jacobian.transpose()));
475 if( errorMatrix.cols() != 1 )
481 std::move(errorMatrix),
487 ATH_MSG_DEBUG(
" the VertexOnTrack objects created from BeamSpot are " << *vot);
499 float beamSpotX = bpos.x();
500 float beamSpotY = bpos.y();
501 float beamSpotZ = bpos.z();
502 float beamTiltX = beamSpotHandle->beamTilt(0);
503 float beamTiltY = beamSpotHandle->beamTilt(1);
508 float z0 = b->originalPosition()->z();
509 (*v)(0) = beamSpotX + std::tan(beamTiltX) * (
z0-beamSpotZ);
510 (*v)(1) = beamSpotY + std::tan(beamTiltY) * (
z0-beamSpotZ);
512 (*q)(0,0) = beamSigmaX*beamSigmaX;
513 (*q)(1,1) = beamSigmaY*beamSigmaY;
514 (*q)(2,2) = beamSigmaZ*beamSigmaZ;
516 ATH_MSG_DEBUG(
"VTX constraint point (x,y,z) = ( "<< (*
v)[0] <<
" , "<< (*
v)[1] <<
" , "<< (*
v)[2] <<
" )");
517 ATH_MSG_DEBUG(
"VTX constraint size (x,y,z) = ( "<< beamSigmaX <<
" , "<< beamSigmaY <<
" , "<< beamSigmaZ <<
" )");
522 ToolHandle<Trk::IGlobalTrackFitter>& fitter,
527 const EventContext& ctx = Gaudi::Hive::currentContext();
528 const Track* newTrack =
nullptr;
532 std::vector<const MeasurementBase *> measurementCollection;
533 measurementCollection.push_back(vot);
535 const auto &measurements = *(track->measurementsOnTrack());
537 measurementCollection.push_back(meas);
542 ATH_MSG_DEBUG(
" Track reference surface will be: " << surface);
546 newTrack = (fitter->
fit(ctx, measurementCollection,
550 newTrack = (fitter->
fit(ctx,
551 measurementCollection, *(track->trackParameters()->front()),
563 bool haveVertex =
false;
568 const EventContext& ctx = Gaudi::Hive::currentContext();
574 vertices = vtxReadHandle.
cptr();
577 ATH_MSG_DEBUG(
"Primary vertex collection for this event has "<<vertices->
size()<<
" vertices");
578 if (vertices->
size()<2){
579 ATH_MSG_DEBUG(
"Only Dummy vertex present, no Primary vertices.");
586 ATH_MSG_DEBUG(
"Could not retrieve primary vertex collection from the StoreGate");
596 const Trk::Perigee* perigee = track->perigeeParameters();
601 const double qoverP = perigee->parameters()[
Trk::qOverP] * 1000.;
604 pt = std::abs(1.0/qoverP)*sin(perigee->parameters()[
Trk::theta]);
610 ATH_MSG_DEBUG(
"this track passes the beamspot track selection, will do beamspot constraint on it ");
620 const Track* newTrack =
nullptr;
627 const EventContext& ctx = Gaudi::Hive::currentContext();
640 if( !vot )
ATH_MSG_INFO(
"VoT not found for this track! ");
641 if( !vtx )
ATH_MSG_INFO(
"VTX pointer not found for this track! ");
688 newTrack = fitter->alignmentFit(ctx,alignCache,*track,
m_runOutlierRemoval,particleHypothesis);
729 if( (ivtx->originalVertex())==vtx ) {
739 ATH_MSG_DEBUG(
" The Beam Spot constraint will be added to the vertex.." );
743 (qtemp)(2,2) = 1000000.0;
768 ATH_MSG_DEBUG(
"BeamspotVertexPreProcessor::processTrackCollection()");
770 if( !tracks || (tracks->
empty()) )
786 for (
const auto* track : *tracks){
790 if (not track)
continue;
805 alignTrack->
setTrackSummary( std::make_unique<Trk::TrackSummary> (*track->trackSummary()) );
807 if( !(alignTrack->
getVtx()) ) {
816 ATH_MSG_DEBUG(
"No Track refit for track " <<
index <<
" --> building new aligntrack");
822 if (alignTrack) newTrks->
push_back(alignTrack);
825 ATH_MSG_INFO(
"Processing of input track collection completed (size: " << tracks->
size() <<
"). Size of the alignTrack collection: " << newTrks->
size() );
827 if (newTrks->
empty()) {
844 ATH_MSG_DEBUG(
"This alignTrack is not associated to any vertex -> return. ");
852 const std::vector<AlignModuleDerivatives> * ptrDerivs = alignTrack->
derivatives();
855 if (!ptrWeights || !ptrWeightsFD || !ptrResiduals || !ptrDerivs) {
858 if (!ptrWeightsFD)
ATH_MSG_ERROR(
"no weights for first deriv!");
866 std::vector<AlignModuleDerivatives> derivatives = *ptrDerivs;
875 ATH_MSG_DEBUG(
"accumulateVTX: The derivative vector size is " << derivatives.size() );
877 std::vector<const Amg::VectorX*> allDerivatives[3];
879 const int WSize(
weights.cols());
881 std::vector<AlignModuleVertexDerivatives> derivX;
883 for (
const auto& deriv : derivatives) {
890 const std::vector<Amg::VectorX>& deriv_vec = deriv.second;
891 ATH_MSG_VERBOSE(
"accumulateVTX: The deriv_vec size is " << deriv_vec.size() );
893 int nModPars = alignPars->
size();
894 if ((nModPars+3) != std::ssize(deriv_vec)) {
895 ATH_MSG_ERROR(
"accumulateVTX: Derivatives w.r.t. the vertex seem to be missing");
898 for (
int i=0;i<3;i++) {
899 allDerivatives[i].push_back(&deriv_vec[nModPars+i]);
900 for (
int j=0;j<WSize;j++) {
901 F(i,j) = deriv_vec[nModPars+i][j];
909 ATH_MSG_ERROR(
"accumulateVTX: Derivatives do not have a valid pointer to the module.");
916 for (
const auto& deriv : derivatives) {
922 const std::vector<Amg::VectorX>& deriv_vec = deriv.second;
923 std::vector<Amg::VectorX> drdaWF;
925 << deriv_vec.size());
927 int nModPars = alignPars->
size();
928 if ((nModPars + 3) != std::ssize(deriv_vec)) {
930 "accumulateVTX: Derivatives w.r.t. the vertex seem to be missing");
933 drdaWF.reserve(nModPars);
934 for (
int i = 0; i < nModPars; i++) {
935 drdaWF.emplace_back(2.0 * WF * deriv_vec[i]);
937 ATH_MSG_DEBUG(
"accumulateVTX: derivX incremented by: " << drdaWF);
939 derivX.emplace_back(module,std::move(drdaWF));
942 ATH_MSG_ERROR(
"accumulateVTX: Derivatives do not have a valid pointer to the module.");
948 int nmodules = allDerivatives[0].size();
949 ATH_MSG_DEBUG(
"accumulateVTX: allDerivatives size is " << nmodules);
950 for(
int ii=0; ii<3; ++ii ) {
951 VTXDerivatives[ii] = (*(allDerivatives[ii])[0]);
952 for(
int jj=1; jj<nmodules; ++jj ) {
953 VTXDerivatives[ii] += (*(allDerivatives[ii])[jj]);
963 for (
int ipar=0;ipar<3;ipar++) {
966 Amg::MatrixX derivativesT = (VTXDerivatives[ipar]).transpose();
967 ATH_MSG_DEBUG(
"derivativesT (size "<<derivativesT.cols()<<
"): "<<derivativesT);
970 vtxV[ipar] = tempV(0,0);
972 for (
int jpar=ipar;jpar<3;jpar++) {
978 vtxM(ipar,jpar) = tempM(0,0);
1000 if( ivtx->Ntracks()>1 ) {
1003 ATH_MSG_WARNING(
"This vertex contains " << ivtx->Ntracks() <<
" tracks. No solution possible.");
1006 ATH_MSG_DEBUG(
"This vertex contains " << ivtx->Ntracks() <<
" tracks.");
1007 if(
msgLvl(MSG::DEBUG) ) ivtx->dump(
msg(MSG::DEBUG));
1017 *
m_logStream<<
"*************************************************************"<<std::endl;
1018 *
m_logStream<<
"****** BeamspotVertexPreProcessor summary ******"<<std::endl;
1022 *
m_logStream<<
"* --------------------------------------------"<<std::endl;
1039 ATH_MSG_INFO(
"BeamspotVertexPreProcessor::finalize()");
1041 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
An STL vector of pointers that by default owns its pointed-to elements.
#define AmgSymMatrix(dim)
#define AmgMatrix(rows, cols)
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
bool msgLvl(const MSG::Level lvl) const
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
bool fit(const LArSamples::AbsShape &data, const AbsShape &reference, double &k, double &deltaT, double &chi2, const ScaledErrorData *sed=0) const
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const std::vector< AlignModuleDerivatives > * derivatives() const
The Amg::VectorX is a vector of first-derivatives of the alignTSOS on the alignTrack w....
void setOriginalTrack(const Track *track)
set pointer to original track
@ NTrackTypes
total number of track types
@ NormalRefitted
normally refitted, without adding any pseudo-measurement
@ Original
not refitted, just copy constructed from original Track
@ BeamspotConstrained
refitted with beamspot constraint
@ VertexConstrained
refitted with vertex constraint
const Amg::VectorX * residualVector() const
Vector of residuals of the alignTSOS on the alignTrack, to be set by AlignTrackDresser.
static void dumpLessTrackInfo(const Track &track, MsgStream &msg)
dump less track information
void doFindPerigee() const
For the AlignTrack, if there is pseudo-measurement in the TSOS collection, the perigee will not alway...
void setType(AlignTrackType type)
const Amg::SymMatrixX * weightMatrixFirstDeriv() const
First deriv weight matrix can be either W from Si alignment (see Eqn.
void setDerivativeMatrix(const Amg::MatrixX *matrix)
const AlignVertex * getVtx() const
set and get pointer to the associated vertex
const Amg::SymMatrixX * weightMatrix() const
Weight matrix is W from Si alignment (see Eqn.
void setFullCovarianceMatrix(const Amg::SymMatrixX *matrix)
bool isSLTrack() const
method to determine whether a straight line track or not
void addDerivatives(std::vector< AlignModuleVertexDerivatives > *vec)
void incrementMatrix(const AmgSymMatrix(3) vtxM)
void setConstraint(AmgSymMatrix(3) *, Amg::Vector3D *)
set and get the constraint on VTX position
void incrementVector(const Amg::Vector3D &vtxV)
increment algebra objects for this verterx:
bool doBeamspotConstraintTrackSelection(const Track *track)
PublicToolHandle< IAlignModuleTool > m_alignModuleTool
Pointer to AlignModuleTool.
IntegerProperty m_minTrksInVtx
SG::ReadHandleKey< xAOD::VertexContainer > m_PVContainerName
void accumulateVTX(AlignTrack *alignTrack) override
methods added for the full VTX fit:
BooleanProperty m_doTrkSelection
const VertexOnTrack * provideVotFromVertex(const Track *track, const xAOD::Vertex *&vtx) const
bool selectVertices(const xAOD::Vertex *vtx) const
virtual ~BeamspotVertexPreProcessor()
DoubleProperty m_BSScalingFactor
BooleanProperty m_doNormalRefit
BooleanProperty m_storeFitMatrices
BooleanProperty m_doFullVertexConstraint
bool isAssociatedToVertex(const Track *track, const xAOD::Vertex *vertex)
std::vector< int > m_trackTypeCounter
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkSelector
bool isAssociatedToPV(const Track *track, const xAOD::VertexContainer *vertices)
ToolHandle< IGlobalTrackFitter > m_trackFitter
int m_nFailedNormalRefits
void prepareAllTracksVector()
const xAOD::Vertex * findVertexCandidate(const Track *track) const
AlignTrack * doTrackRefit(const Track *track)
virtual DataVector< Track > * processTrackCollection(const DataVector< Track > *trks) override
Main processing of track collection.
IntegerProperty m_particleNumber
void provideVtxBeamspot(const AlignVertex *b, AmgSymMatrix(3) *q, Amg::Vector3D *v) const
UnsignedIntegerProperty m_constraintMode
ToolHandle< IExtrapolator > m_extrapolator
DataVector< AlignVertex > m_AlignVertices
collection of AlignVertices used in FullVertex constraint option
std::vector< std::pair< const xAOD::Vertex *, std::vector< VxTrackAtVertex > > > m_allTracksVector
DoubleProperty m_PVScalingFactor
const Track * doConstraintRefit(ToolHandle< IGlobalTrackFitter > &fitter, const Track *track, const VertexOnTrack *vot, const ParticleHypothesis &particleHypothesis) const
BooleanProperty m_useSingleFitter
virtual StatusCode finalize() override
BooleanProperty m_runOutlierRemoval
ToolHandle< IGlobalTrackFitter > m_SLTrackFitter
virtual StatusCode initialize() override
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
ToolHandle< InDet::IInDetTrackSelectionTool > m_BSTrackSelector
ToolHandle< ITrackToVertexIPEstimator > m_trackToVertexIPEstimatorTool
BooleanProperty m_refitTracks
BooleanProperty m_doBeamspotConstraint
BooleanProperty m_doBSTrackSelection
virtual void printSummary() override
Print processing summary to logfile.
bool selectUpdatedVertices(const xAOD::Vertex *updatedVtx) const
BooleanProperty m_doPrimaryVertexConstraint
BeamspotVertexPreProcessor(const std::string &type, const std::string &name, const IInterface *parent)
const VertexOnTrack * provideVotFromBeamspot(const Track *track) const
BooleanProperty m_doAssociatedToPVSelection
bool operator()(VxTrackAtVertex vtxTrk)
std::ostream * m_logStream
logfile output stream
An abstract class which is meant to represent an element link to the Trk::Track or Trk::TrackParticle...
This class is the pure abstract base class for all fittable tracking measurements.
const Amg::Vector3D & momentum() const
Access method for the momentum.
virtual ParametersT< DIM, T, S > * clone() const override final
Virtual clone.
virtual const S & associatedSurface() const override final
Access to the Surface method.
Class describing the Line to which the Perigee refers to.
const Track * originalTrack() const
Return pointer to associated track.
void setTrackSummary(std::unique_ptr< Trk::TrackSummary > input)
Set the track summary.
const Perigee * perigeeParameters() const
return Perigee.
Class to handle Vertex On Tracks, it inherits from the common MeasurementBase.
virtual const PerigeeSurface & associatedSurface() const override final
returns the surface for the local to global transformation
The VxTrackAtVertex is a common class for all present TrkVertexFitters The VxTrackAtVertex is designe...
const ITrackLink * trackOrParticleLink(void) const
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
VxType::VertexType vertexType() const
The type of the vertex.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ u
Enums for curvilinear frames.
std::pair< double, ParamDefs > DefinedParameter
Typedef to of a std::pair<double, ParamDefs> to identify a passed-through double as a specific type o...
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
std::unique_ptr< Amg::MatrixX > m_fullCovarianceMatrix
access to the global fitter's full covariance matrix.
std::unique_ptr< Amg::MatrixX > m_derivMatrix
access to the matrix of derivatives used during the latest global-chi2 track fit.