CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Protected Member Functions | Private Member Functions
ReferenceTrajectory Class Reference

#include <ReferenceTrajectory.h>

Inheritance diagram for ReferenceTrajectory:
ReferenceTrajectoryBase ReferenceCounted BzeroReferenceTrajectory

Public Types

typedef
SurfaceSideDefinition::SurfaceSide 
SurfaceSide
 
- Public Types inherited from ReferenceTrajectoryBase
enum  MaterialEffects {
  none, multipleScattering, energyLoss, combined,
  breakPoints, brokenLinesCoarse, brokenLinesFine, localGBL,
  curvlinGBL
}
 
typedef
ReferenceCountingPointer
< ReferenceTrajectoryBase
ReferenceTrajectoryPtr
 

Public Member Functions

virtual ReferenceTrajectoryclone () const
 
 ReferenceTrajectory (const TrajectoryStateOnSurface &referenceTsos, const TransientTrackingRecHit::ConstRecHitContainer &recHits, bool hitsAreReverse, const MagneticField *magField, MaterialEffects materialEffects, PropagationDirection propDir, double mass, bool useBeamSpot, const reco::BeamSpot &beamSpot)
 
virtual ~ReferenceTrajectory ()
 
- Public Member Functions inherited from ReferenceTrajectoryBase
const AlgebraicMatrixderivatives () const
 
const TMatrixD & gblExtDerivatives () const
 
const TVectorD & gblExtMeasurements () const
 
const TVectorD & gblExtPrecisions () const
 
std::vector< std::pair
< std::vector< gbl::GblPoint >
, TMatrixD > > & 
gblInput ()
 
bool isValid ()
 
const AlgebraicMatrixlocalToTrajectory () const
 
const AlgebraicSymMatrixmeasurementErrors () const
 
const AlgebraicVectormeasurements () const
 
int nominalField () const
 
unsigned int numberOfHitMeas () const
 
unsigned int numberOfHits () const
 
unsigned int numberOfPar () const
 
unsigned int numberOfVirtualMeas () const
 
unsigned int numberOfVirtualPar () const
 
const AlgebraicSymMatrixparameterErrors () const
 
bool parameterErrorsAvailable () const
 
const AlgebraicVectorparameters () const
 
const
TransientTrackingRecHit::ConstRecHitContainer
recHits () const
 
void setParameterErrors (const AlgebraicSymMatrix &error)
 
const AlgebraicSymMatrixtrajectoryPositionErrors () const
 
const AlgebraicVectortrajectoryPositions () const
 
const std::vector
< TrajectoryStateOnSurface > & 
trajectoryStates () const
 
const AlgebraicMatrixtrajectoryToCurv () const
 
virtual ~ReferenceTrajectoryBase ()
 

Protected Member Functions

virtual bool addMaterialEffectsBp (const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv)
 
virtual bool addMaterialEffectsBrl (const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv, const GlobalTrajectoryParameters &gtp)
 
virtual bool addMaterialEffectsBrl (const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv, const std::vector< double > &allSteps, const GlobalTrajectoryParameters &gtp, const double minStep=1.0)
 
virtual bool addMaterialEffectsCov (const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs)
 
virtual bool addMaterialEffectsCurvlinGbl (const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv)
 
virtual bool addMaterialEffectsLocalGbl (const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvatureChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParameterCovs)
 
virtual bool construct (const TrajectoryStateOnSurface &referenceTsos, const TransientTrackingRecHit::ConstRecHitContainer &recHits, double mass, MaterialEffects materialEffects, const PropagationDirection propDir, const MagneticField *magField, bool useBeamSpot, const reco::BeamSpot &beamSpot)
 
MaterialEffectsUpdatorcreateUpdator (MaterialEffects materialEffects, double mass) const
 
virtual void fillDerivatives (const AlgebraicMatrix &projection, const AlgebraicMatrix &fullJacobian, unsigned int iRow)
 
virtual void fillMeasurementAndError (const TransientTrackingRecHit::ConstRecHitPointer &hitPtr, unsigned int iRow, const TrajectoryStateOnSurface &updatedTsos)
 
virtual void fillTrajectoryPositions (const AlgebraicMatrix &projection, const AlgebraicVector &mixedLocalParams, unsigned int iRow)
 
AlgebraicMatrix getHitProjectionMatrix (const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
 
template<unsigned int N>
AlgebraicMatrix getHitProjectionMatrixT (const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
 
virtual bool propagate (const Plane &previousSurface, const TrajectoryStateOnSurface &previousTsos, const Plane &newSurface, TrajectoryStateOnSurface &newTsos, AlgebraicMatrix &newJacobian, AlgebraicMatrix &newCurvlinJacobian, double &nextStep, const PropagationDirection propDir, const MagneticField *magField) const
 
 ReferenceTrajectory (unsigned int nPar, unsigned int nHits, MaterialEffects materialEffects)
 
SurfaceSide surfaceSide (const PropagationDirection dir) const
 
- Protected Member Functions inherited from ReferenceTrajectoryBase
unsigned int numberOfUsedRecHits (const TransientTrackingRecHit::ConstRecHitContainer &recHits) const
 
 ReferenceTrajectoryBase (unsigned int nPar, unsigned int nHits, unsigned int nVirtualPar, unsigned int nVirtualMeas)
 
bool useRecHit (const TransientTrackingRecHit::ConstRecHitPointer &hitPtr) const
 

Private Member Functions

void clhep2root (const AlgebraicVector &in, TVectorD &out)
 
void clhep2root (const AlgebraicMatrix &in, TMatrixD &out)
 
void clhep2root (const AlgebraicSymMatrix &in, TMatrixDSym &out)
 

Additional Inherited Members

- Protected Attributes inherited from ReferenceTrajectoryBase
AlgebraicMatrix theDerivatives
 
TMatrixD theGblExtDerivatives
 
TVectorD theGblExtMeasurements
 
TVectorD theGblExtPrecisions
 
std::vector< std::pair
< std::vector< gbl::GblPoint >
, TMatrixD > > 
theGblInput
 
AlgebraicMatrix theInnerLocalToTrajectory
 
AlgebraicMatrix theInnerTrajectoryToCurvilinear
 
AlgebraicVector theMeasurements
 
AlgebraicSymMatrix theMeasurementsCov
 
int theNomField
 
unsigned int theNumberOfHits
 
unsigned int theNumberOfPars
 
unsigned int theNumberOfVirtualMeas
 
unsigned int theNumberOfVirtualPars
 
bool theParamCovFlag
 
AlgebraicSymMatrix theParameterCov
 
AlgebraicVector theParameters
 
TransientTrackingRecHit::ConstRecHitContainer theRecHits
 
AlgebraicSymMatrix theTrajectoryPositionCov
 
AlgebraicVector theTrajectoryPositions
 
std::vector
< TrajectoryStateOnSurface
theTsosVec
 
bool theValidityFlag
 
- Static Protected Attributes inherited from ReferenceTrajectoryBase
static const unsigned int nMeasPerHit = 2
 

Detailed Description

Definition at line 56 of file ReferenceTrajectory.h.

Member Typedef Documentation

Definition at line 61 of file ReferenceTrajectory.h.

Constructor & Destructor Documentation

ReferenceTrajectory::ReferenceTrajectory ( const TrajectoryStateOnSurface referenceTsos,
const TransientTrackingRecHit::ConstRecHitContainer recHits,
bool  hitsAreReverse,
const MagneticField magField,
MaterialEffects  materialEffects,
PropagationDirection  propDir,
double  mass,
bool  useBeamSpot,
const reco::BeamSpot beamSpot 
)

Constructor with Tsos at first hit (in physical order) and list of hits [if (hitsAreReverse) ==> order of hits is in opposite direction compared to the flight of particle, but note that ReferenceTrajectory::recHits() returns the hits always in order of flight], the material effects to be considered and a particle mass, the magnetic field and beamSpot of the event are needed for propagations etc.

Definition at line 50 of file ReferenceTrajectory.cc.

References construct(), TrajectoryStateOnSurface::localParameters(), LocalTrajectoryParameters::mixedFormatVector(), ReferenceTrajectoryBase::theParameters, and ReferenceTrajectoryBase::theValidityFlag.

Referenced by clone().

59  (materialEffects >= brokenLinesCoarse) ? 1 : refTsos.localParameters().mixedFormatVector().kSize,
60  (useBeamSpot == true) ? recHits.size()+1 : recHits.size(),
61  (materialEffects >= brokenLinesCoarse) ?
62  2*((useBeamSpot == true) ? recHits.size()+1 : recHits.size()) :
63  ( (materialEffects == breakPoints) ? 2*((useBeamSpot == true) ? recHits.size()+1 : recHits.size())-2 : 0) ,
64  (materialEffects >= brokenLinesCoarse) ?
65  2*((useBeamSpot == true) ? recHits.size()+1 : recHits.size())-4 :
66  ( (materialEffects == breakPoints) ? 2*((useBeamSpot == true) ? recHits.size()+1 : recHits.size())-2 : 0) )
67 {
68  // no check against magField == 0
69  theParameters = asHepVector<5>( refTsos.localParameters().mixedFormatVector() );
70 
71  if (hitsAreReverse) {
73  fwdRecHits.reserve(recHits.size());
74  for (TransientTrackingRecHit::ConstRecHitContainer::const_reverse_iterator it=recHits.rbegin();
75  it != recHits.rend(); ++it) {
76  fwdRecHits.push_back(*it);
77  }
78  theValidityFlag = this->construct(refTsos, fwdRecHits, mass, materialEffects,
79  propDir, magField,
80  useBeamSpot, beamSpot);
81  } else {
82  theValidityFlag = this->construct(refTsos, recHits, mass, materialEffects,
83  propDir, magField,
84  useBeamSpot, beamSpot);
85  }
86 }
virtual bool construct(const TrajectoryStateOnSurface &referenceTsos, const TransientTrackingRecHit::ConstRecHitContainer &recHits, double mass, MaterialEffects materialEffects, const PropagationDirection propDir, const MagneticField *magField, bool useBeamSpot, const reco::BeamSpot &beamSpot)
ReferenceTrajectoryBase(unsigned int nPar, unsigned int nHits, unsigned int nVirtualPar, unsigned int nVirtualMeas)
const TransientTrackingRecHit::ConstRecHitContainer & recHits() const
std::vector< ConstRecHitPointer > ConstRecHitContainer
virtual ReferenceTrajectory::~ReferenceTrajectory ( )
inlinevirtual

Definition at line 79 of file ReferenceTrajectory.h.

79 {}
ReferenceTrajectory::ReferenceTrajectory ( unsigned int  nPar,
unsigned int  nHits,
MaterialEffects  materialEffects 
)
protected

Definition at line 91 of file ReferenceTrajectory.cc.

94  (materialEffects >= brokenLinesCoarse) ? 1 : nPar,
95  nHits,
96  (materialEffects >= brokenLinesCoarse) ? 2*nHits : ( (materialEffects == breakPoints) ? 2*nHits-2 : 0 ),
97  (materialEffects >= brokenLinesCoarse) ? 2*nHits-4 : ( (materialEffects == breakPoints) ? 2*nHits-2 : 0 ) )
98 {}
ReferenceTrajectoryBase(unsigned int nPar, unsigned int nHits, unsigned int nVirtualPar, unsigned int nVirtualMeas)

Member Function Documentation

bool ReferenceTrajectory::addMaterialEffectsBp ( const std::vector< AlgebraicMatrix > &  allJacobians,
const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allCurvChanges,
const std::vector< AlgebraicSymMatrix > &  allDeltaParaCovs,
const std::vector< AlgebraicMatrix > &  allLocalToCurv 
)
protectedvirtual

internal method to add material effects using break points

Definition at line 553 of file ReferenceTrajectory.cc.

References relval_2017::k, cmsLHEtoEOSManager::l, ReferenceTrajectoryBase::nMeasPerHit, ReferenceTrajectoryBase::theDerivatives, ReferenceTrajectoryBase::theMeasurementsCov, and ReferenceTrajectoryBase::theNumberOfPars.

Referenced by construct().

558 {
559 //CHK: add material effects using break points
560  int offsetPar = theNumberOfPars;
561  int offsetMeas = nMeasPerHit * allJacobians.size();
562  int ierr = 0;
563 
564  AlgebraicMatrix tempJacobian;
565  AlgebraicMatrix MSprojection(2,5);
566  MSprojection[0][1] = 1;
567  MSprojection[1][2] = 1;
568  AlgebraicSymMatrix tempMSCov;
569  AlgebraicSymMatrix tempMSCovProj;
570  AlgebraicMatrix tempMSJacProj;
571 
572  for (unsigned int k = 1; k < allJacobians.size(); ++k) {
573 // CHK
574  int kbp = k-1;
575  tempJacobian = allJacobians[k] * allCurvatureChanges[k];
576  tempMSCov = allDeltaParameterCovs[k-1].similarity(allLocalToCurv[k-1]);
577  tempMSCovProj = tempMSCov.similarity(MSprojection);
578  theMeasurementsCov[offsetMeas+nMeasPerHit*kbp ][offsetMeas+nMeasPerHit*kbp ] = tempMSCovProj[0][0];
579  theMeasurementsCov[offsetMeas+nMeasPerHit*kbp+1][offsetMeas+nMeasPerHit*kbp+1]= tempMSCovProj[1][1];
580  theDerivatives[offsetMeas+nMeasPerHit*kbp ][offsetPar+2*kbp ] = 1.0;
581  theDerivatives[offsetMeas+nMeasPerHit*kbp+1][offsetPar+2*kbp+1] = 1.0 ;
582 
583  tempMSJacProj = (allProjections[k] * ( tempJacobian * allLocalToCurv[k-1].inverse(ierr) )) * MSprojection.T();
584  if (ierr) {
585  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBp"
586  << "Inversion 1 for break points failed: " << ierr;
587  return false;
588  }
589  theDerivatives[nMeasPerHit*k ][offsetPar+2*kbp ] = tempMSJacProj[0][0];
590  theDerivatives[nMeasPerHit*k ][offsetPar+2*kbp+1] = tempMSJacProj[0][1];
591  theDerivatives[nMeasPerHit*k+1][offsetPar+2*kbp ] = tempMSJacProj[1][0];
592  theDerivatives[nMeasPerHit*k+1][offsetPar+2*kbp+1] = tempMSJacProj[1][1];
593 
594  for (unsigned int l = k+1; l < allJacobians.size(); ++l) {
595 // CHK
596  int kbp = k-1;
597  tempJacobian = allJacobians[l] * allCurvatureChanges[l] * tempJacobian;
598  tempMSJacProj = (allProjections[l] * ( tempJacobian * allLocalToCurv[k-1].inverse(ierr) )) * MSprojection.T();
599  if (ierr) {
600  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBp"
601  << "Inversion 2 for break points failed: " << ierr;
602  return false;
603  }
604  theDerivatives[nMeasPerHit*l ][offsetPar+2*kbp ] = tempMSJacProj[0][0];
605  theDerivatives[nMeasPerHit*l ][offsetPar+2*kbp+1] = tempMSJacProj[0][1];
606  theDerivatives[nMeasPerHit*l+1][offsetPar+2*kbp ] = tempMSJacProj[1][0];
607  theDerivatives[nMeasPerHit*l+1][offsetPar+2*kbp+1] = tempMSJacProj[1][1];
608 
609  }
610 
611  }
612 
613  return true;
614 }
static const unsigned int nMeasPerHit
CLHEP::HepMatrix AlgebraicMatrix
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepSymMatrix AlgebraicSymMatrix
bool ReferenceTrajectory::addMaterialEffectsBrl ( const std::vector< AlgebraicMatrix > &  allJacobians,
const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allCurvChanges,
const std::vector< AlgebraicSymMatrix > &  allDeltaParaCovs,
const std::vector< AlgebraicMatrix > &  allLocalToCurv,
const GlobalTrajectoryParameters gtp 
)
protectedvirtual

internal methods to add material effects using broken lines (fine version)

Definition at line 618 of file ReferenceTrajectory.cc.

References relval_2017::k, cmsLHEtoEOSManager::l, GlobalTrajectoryParameters::momentum(), gen::n, ReferenceTrajectoryBase::nMeasPerHit, AlCaHLTBitMon_ParallelJobs::p, mathSSE::sqrt(), ReferenceTrajectoryBase::theDerivatives, ReferenceTrajectoryBase::theInnerLocalToTrajectory, ReferenceTrajectoryBase::theInnerTrajectoryToCurvilinear, ReferenceTrajectoryBase::theMeasurementsCov, ReferenceTrajectoryBase::theNumberOfPars, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by construct().

624 {
625 //CHK: add material effects using broken lines
626 //fine: use exact Jacobians, all detectors
627 //broken lines: pair of offsets (u1,u2) = (xt,yt) (in curvilinear frame (q/p,lambda,phi,xt,yt)) at each layer
628 // scattering angles (alpha1,alpha2) = (cosLambda*dPhi, dLambda) (cosLambda cancels in Chi2)
629 // DU' = (dU'/dU)*DU + (dU'/dAlpha)*DAlpha + (dU'/dQbyp)*DQbyp (propagation of U)
630 // = J*DU + S*DAlpha + d*DQbyp
631 // => DAlpha = S^-1 (DU' - J*DU - d*DQbyp)
632 
633  int offsetPar = theNumberOfPars;
634  int offsetMeas = nMeasPerHit*allCurvlinJacobians.size();
635  int ierr = 0;
636 
637  GlobalVector p = gtp.momentum();
638  double cosLambda = sqrt((p.x()*p.x()+p.y()*p.y())/(p.x()*p.x()+p.y()*p.y()+p.z()*p.z()));
639 
640 // transformations Curvilinear <-> BrokenLines
641  AlgebraicMatrix QbypToCurv(5,1); // dCurv/dQbyp
642  QbypToCurv[0][0] = 1.; // dQbyp/dQbyp
643  AlgebraicMatrix AngleToCurv(5,2); // dCurv/dAlpha
644  AngleToCurv[1][1] = 1.; // dlambda/dalpha2
645  AngleToCurv[2][0] = 1./cosLambda; // dphi/dalpha1
646  AlgebraicMatrix CurvToAngle(2,5); // dAlpha/dCurv
647  CurvToAngle[1][1] = 1.; // dalpha2/dlambda
648  CurvToAngle[0][2] = cosLambda; // dalpha1/dphi
649  AlgebraicMatrix OffsetToCurv(5,2); // dCurv/dU
650  OffsetToCurv[3][0] = 1.; // dxt/du1
651  OffsetToCurv[4][1] = 1.; // dyt/du2
652  AlgebraicMatrix CurvToOffset(2,5); // dU/dCurv
653  CurvToOffset[0][3] = 1.; // du1/dxt
654  CurvToOffset[1][4] = 1.; // du2/dyt
655 
656 // transformations trajectory to components (Qbyp, U1, U2)
657  AlgebraicMatrix TrajToQbyp(1,5);
658  TrajToQbyp[0][0] = 1.;
659  AlgebraicMatrix TrajToOff1(2,5);
660  TrajToOff1[0][1] = 1.;
661  TrajToOff1[1][2] = 1.;
662  AlgebraicMatrix TrajToOff2(2,5);
663  TrajToOff2[0][3] = 1.;
664  TrajToOff2[1][4] = 1.;
665 
666  AlgebraicMatrix JacOffsetToAngleC, JacQbypToAngleC;
667  AlgebraicMatrix JacCurvToOffsetL, JacOffsetToOffsetL, JacAngleToOffsetL, JacQbypToOffsetL, JacOffsetToAngleL;
668  AlgebraicMatrix JacCurvToOffsetN, JacOffsetToOffsetN, JacAngleToOffsetN, JacQbypToOffsetN, JacOffsetToAngleN;
669 
670 // transformation from trajectory to curvilinear parameters
671 
672  JacCurvToOffsetN = CurvToOffset * allCurvlinJacobians[1]; // (dU'/dCurv') * (dCurv'/dCurv) @ 2nd point
673  JacOffsetToOffsetN = JacCurvToOffsetN * OffsetToCurv; // J: (dU'/dU) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dU)
674  JacAngleToOffsetN = JacCurvToOffsetN * AngleToCurv; // S: (dU'/dAlpha) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dAlpha)
675  JacQbypToOffsetN = JacCurvToOffsetN * QbypToCurv; // d: (dU'/dQbyp) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dQbyp)
676  JacOffsetToAngleN = JacAngleToOffsetN.inverse(ierr); // W
677  if (ierr) {
678  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
679  << "Inversion 1 for fine broken lines failed: " << ierr;
680  return false;
681  }
682  JacOffsetToAngleC = -(JacOffsetToAngleN * JacOffsetToOffsetN); // (dAlpha/dU)
683  JacQbypToAngleC = -(JacOffsetToAngleN * JacQbypToOffsetN); // (dAlpha/dQbyp)
684  // (dAlpha/dTraj) = (dAlpha/dQbyp) * (dQbyp/dTraj) + (dAlpha/dU1) * (dU1/dTraj) + (dAlpha/dU2) * (dU2/dTraj)
685  AlgebraicMatrix JacTrajToAngle = JacQbypToAngleC * TrajToQbyp + JacOffsetToAngleC * TrajToOff1 + JacOffsetToAngleN * TrajToOff2;
686  // (dCurv/dTraj) = (dCurv/dQbyp) * (dQbyp/dTraj) + (dCurv/dAlpha) * (dAlpha/dTraj) + (dCurv/dU) * (dU/dTraj)
687  theInnerTrajectoryToCurvilinear = QbypToCurv * TrajToQbyp + AngleToCurv * JacTrajToAngle + OffsetToCurv * TrajToOff1;
688  theInnerLocalToTrajectory = theInnerTrajectoryToCurvilinear.inverse(ierr) * allLocalToCurv[0];
689  if (ierr) {
690  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
691  << "Inversion 2 for fine broken lines failed: " << ierr;
692  return false;
693  }
694 
695  AlgebraicMatrix tempJacobian(allCurvatureChanges[0]);
696  AlgebraicSymMatrix tempMSCov;
697  AlgebraicSymMatrix tempMSCovProj;
698  AlgebraicMatrix tempJacL, tempJacN;
699  AlgebraicMatrix JacOffsetToMeas;
700 
701 // measurements from hits
702  for (unsigned int k = 0; k < allCurvlinJacobians.size(); ++k) {
703 // (dMeas/dU) = (dMeas/dLoc) * (dLoc/dCurv) * (dCurv/dU)
704  JacOffsetToMeas = (allProjections[k] * allLocalToCurv[k].inverse(ierr) ) * OffsetToCurv;
705  if (ierr) {
706  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
707  << "Inversion 3 for fine broken lines failed: " << ierr;
708  return false;
709  }
710  theDerivatives[nMeasPerHit*k ][offsetPar+2*k ] = JacOffsetToMeas[0][0];
711  theDerivatives[nMeasPerHit*k ][offsetPar+2*k+1] = JacOffsetToMeas[0][1];
712  theDerivatives[nMeasPerHit*k+1][offsetPar+2*k ] = JacOffsetToMeas[1][0];
713  theDerivatives[nMeasPerHit*k+1][offsetPar+2*k+1] = JacOffsetToMeas[1][1];
714  }
715 
716 // measurement of MS kink
717  for (unsigned int k = 1; k < allCurvlinJacobians.size()-1; ++k) {
718 // CHK
719  int iMsMeas = k-1;
720  int l = k-1; // last hit
721  int n = k+1; // next hit
722 
723 // amount of multiple scattering in layer k (angular error perp to direction)
724  tempMSCov = allDeltaParameterCovs[k].similarity(allLocalToCurv[k]);
725  tempMSCovProj = tempMSCov.similarity(CurvToAngle);
726  theMeasurementsCov[offsetMeas+nMeasPerHit*iMsMeas ][offsetMeas+nMeasPerHit*iMsMeas ] = tempMSCovProj[1][1];
727  theMeasurementsCov[offsetMeas+nMeasPerHit*iMsMeas+1][offsetMeas+nMeasPerHit*iMsMeas+1] = tempMSCovProj[0][0];
728 
729 // transformation matices for offsets ( l <- k -> n )
730  tempJacL = allCurvlinJacobians[k] * tempJacobian;
731  JacCurvToOffsetL = CurvToOffset * tempJacL.inverse(ierr); // (dU'/dCurv') * (dCurv'/dCurv) @ last point
732 
733  if (ierr) {
734  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
735  << "Inversion 4 for fine broken lines failed: " << ierr;
736  return false;
737  }
738  JacOffsetToOffsetL = JacCurvToOffsetL * OffsetToCurv; // J-: (dU'/dU) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dU)
739  JacAngleToOffsetL = JacCurvToOffsetL * AngleToCurv; // S-: (dU'/dAlpha) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dAlpha)
740  JacQbypToOffsetL = JacCurvToOffsetL * QbypToCurv; // d-: (dU'/dQbyp) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dQbyp)
741  JacOffsetToAngleL =-JacAngleToOffsetL.inverse(ierr); // W-
742  if (ierr) {
743  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
744  << "Inversion 5 for fine broken lines failed: " << ierr;
745  return false;
746  }
747  tempJacobian = tempJacobian * allCurvatureChanges[k];
748  tempJacN = allCurvlinJacobians[n] * tempJacobian;
749  JacCurvToOffsetN = CurvToOffset * tempJacN; // (dU'/dCurv') * (dCurv'/dCurv) @ next point
750  JacOffsetToOffsetN = JacCurvToOffsetN * OffsetToCurv; // J+: (dU'/dU) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dU)
751  JacAngleToOffsetN = JacCurvToOffsetN * AngleToCurv; // S+: (dU'/dAlpha) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dAlpha)
752  JacQbypToOffsetN = JacCurvToOffsetN * QbypToCurv; // d+: (dU'/dQbyp) = (dU'/dCurv') * (dCurv'/dCurv) * (dCurv/dQbyp)
753  JacOffsetToAngleN = JacAngleToOffsetN.inverse(ierr); // W+
754  if (ierr) {
755  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
756  << "Inversion 6 for fine broken lines failed: " << ierr;
757  return false;
758  }
759  JacOffsetToAngleC = -(JacOffsetToAngleL * JacOffsetToOffsetL + JacOffsetToAngleN * JacOffsetToOffsetN);
760  JacQbypToAngleC = -(JacOffsetToAngleL * JacQbypToOffsetL + JacOffsetToAngleN * JacQbypToOffsetN);
761 
762  // bending
763  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][ 0] = JacQbypToAngleC[0][0];
764  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][ 0] = JacQbypToAngleC[1][0];
765  // last layer
766  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*l ] = JacOffsetToAngleL[0][0];
767  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*l+1] = JacOffsetToAngleL[0][1];
768  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*l ] = JacOffsetToAngleL[1][0];
769  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*l+1] = JacOffsetToAngleL[1][1];
770  // current layer
771  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*k ] = JacOffsetToAngleC[0][0];
772  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*k+1] = JacOffsetToAngleC[0][1];
773  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*k ] = JacOffsetToAngleC[1][0];
774  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*k+1] = JacOffsetToAngleC[1][1];
775 
776  // next layer
777  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*n ] = JacOffsetToAngleN[0][0];
778  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*n+1] = JacOffsetToAngleN[0][1];
779  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*n ] = JacOffsetToAngleN[1][0];
780  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*n+1] = JacOffsetToAngleN[1][1];
781 
782  }
783 
784  return true;
785 }
AlgebraicMatrix theInnerTrajectoryToCurvilinear
AlgebraicMatrix theInnerLocalToTrajectory
static const unsigned int nMeasPerHit
T y() const
Definition: PV3DBase.h:63
CLHEP::HepMatrix AlgebraicMatrix
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepSymMatrix AlgebraicSymMatrix
T x() const
Definition: PV3DBase.h:62
bool ReferenceTrajectory::addMaterialEffectsBrl ( const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allDeltaParaCovs,
const std::vector< AlgebraicMatrix > &  allLocalToCurv,
const std::vector< double > &  allSteps,
const GlobalTrajectoryParameters gtp,
const double  minStep = 1.0 
)
protectedvirtual

internal methods to add material effects using broken lines (coarse version)

Definition at line 789 of file ReferenceTrajectory.cc.

References delta, plotBeamSpotDB::first, i, relval_2017::k, cmsLHEtoEOSManager::l, plotBeamSpotDB::last, mag(), GlobalTrajectoryParameters::magneticFieldInInverseGeV(), GlobalTrajectoryParameters::momentum(), gen::n, ReferenceTrajectoryBase::nMeasPerHit, AlCaHLTBitMon_ParallelJobs::p, GlobalTrajectoryParameters::position(), mathSSE::sqrt(), ReferenceTrajectoryBase::theDerivatives, ReferenceTrajectoryBase::theInnerLocalToTrajectory, ReferenceTrajectoryBase::theInnerTrajectoryToCurvilinear, ReferenceTrajectoryBase::theMeasurementsCov, ReferenceTrajectoryBase::theNumberOfPars, ReferenceTrajectoryBase::theNumberOfVirtualMeas, ReferenceTrajectoryBase::theNumberOfVirtualPars, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

795 {
796 //CHK: add material effects using broken lines
797 //BrokenLinesCoarse: combine close by detectors,
798 // use approximate Jacobians from Steps (limit Qbyp -> 0),
799 // bending only in RPhi (B=(0,0,Bz)), no energy loss correction
800 
801  int offsetPar = theNumberOfPars;
802  int offsetMeas = nMeasPerHit*allSteps.size();
803  int ierr = 0;
804 
805  GlobalVector p = gtp.momentum();
806  double cosLambda = sqrt((p.x()*p.x()+p.y()*p.y())/(p.x()*p.x()+p.y()*p.y()+p.z()*p.z()));
807  double bFac = -gtp.magneticFieldInInverseGeV(gtp.position()).mag();
808 
809  // transformation from trajectory to curvilinear parameters at refTsos
810  double delta (1.0/allSteps[1]);
814  theInnerTrajectoryToCurvilinear[2][0] = -0.5*bFac/delta;
815  theInnerTrajectoryToCurvilinear[2][1] = -delta/cosLambda;
816  theInnerTrajectoryToCurvilinear[2][3] = delta/cosLambda;
819  theInnerLocalToTrajectory = theInnerTrajectoryToCurvilinear.inverse(ierr) * allLocalToCurv[0];
820  if (ierr) {
821  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
822  << "Inversion 1 for coarse broken lines failed: " << ierr;
823  return false;
824  }
825 
826  AlgebraicMatrix CurvToAngle(2,5); // dAlpha/dCurv
827  CurvToAngle[1][1] = 1.; // dalpha2/dlambda
828  CurvToAngle[0][2] = cosLambda; // dalpha1/dphi
829  AlgebraicMatrix OffsetToCurv(5,2); // dCurv/dU
830  OffsetToCurv[3][0] = 1.; // dxt/du1
831  OffsetToCurv[4][1] = 1.; // dyt/du2
832 
833  AlgebraicSymMatrix tempMSCov;
834  AlgebraicSymMatrix tempMSCovProj;
835  AlgebraicMatrix JacOffsetToMeas;
836 
837  // combine closeby detectors into single plane
838  std::vector<unsigned int> first(allSteps.size());
839  std::vector<unsigned int> last (allSteps.size());
840  std::vector<unsigned int> plane(allSteps.size());
841  std::vector<double> sPlane(allSteps.size());
842  unsigned int nPlane = 0;
843  double sTot = 0;
844 
845  for (unsigned int k = 1; k < allSteps.size(); ++k) {
846  sTot += allSteps[k];
847  if (fabs(allSteps[k])>minStep) { nPlane += 1; first[nPlane] = k; }
848  last[nPlane] = k;
849  plane[k] = nPlane;
850  sPlane[nPlane] += sTot;
851  }
852  if (nPlane < 2) return false; // pathological cases: need at least 2 planes
853 
854  theNumberOfVirtualPars = 2*(nPlane+1);
855  theNumberOfVirtualMeas = 2*(nPlane-1);// unsigned underflow for nPlane == 0...
856  for (unsigned int k = 0; k <= nPlane; ++k) { sPlane[k] /= (double) (last[k]-first[k]+1); }
857 
858  // measurements from hits
859  sTot = 0;
860  for (unsigned int k = 0; k < allSteps.size(); ++k) {
861  sTot += allSteps[k];
862 // (dMeas/dU) = (dMeas/dLoc) * (dLoc/dCurv) * (dCurv/dU)
863  JacOffsetToMeas = (allProjections[k] * allLocalToCurv[k].inverse(ierr) ) * OffsetToCurv;
864  if (ierr) {
865  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsBrl"
866  << "Inversion 2 for coarse broken lines failed: " << ierr;
867  return false;
868  }
869 
870  unsigned int iPlane = plane[k];
871  if (last[iPlane] == first[iPlane])
872  { // single plane
873  theDerivatives[nMeasPerHit*k ][offsetPar+2*iPlane ] = JacOffsetToMeas[0][0];
874  theDerivatives[nMeasPerHit*k ][offsetPar+2*iPlane+1] = JacOffsetToMeas[0][1];
875  theDerivatives[nMeasPerHit*k+1][offsetPar+2*iPlane ] = JacOffsetToMeas[1][0];
876  theDerivatives[nMeasPerHit*k+1][offsetPar+2*iPlane+1] = JacOffsetToMeas[1][1];
877  } else
878  { // combined plane: (linear) interpolation
879  unsigned int jPlane; // neighbor plane for interpolation
880  if (fabs(sTot) < fabs(sPlane[iPlane])) { jPlane = (iPlane>0) ? iPlane - 1 : 1; }
881  else { jPlane = (iPlane<nPlane) ? iPlane + 1 : nPlane -1 ;}
882  // interpolation weights
883  double sDiff = sPlane[iPlane] - sPlane[jPlane];
884  double iFrac = (sTot - sPlane[jPlane]) / sDiff;
885  double jFrac = 1.0 - iFrac;
886  theDerivatives[nMeasPerHit*k ][offsetPar+2*iPlane ] = JacOffsetToMeas[0][0]*iFrac;
887  theDerivatives[nMeasPerHit*k ][offsetPar+2*iPlane+1] = JacOffsetToMeas[0][1]*iFrac;
888  theDerivatives[nMeasPerHit*k+1][offsetPar+2*iPlane ] = JacOffsetToMeas[1][0]*iFrac;
889  theDerivatives[nMeasPerHit*k+1][offsetPar+2*iPlane+1] = JacOffsetToMeas[1][1]*iFrac;
890  theDerivatives[nMeasPerHit*k ][offsetPar+2*jPlane ] = JacOffsetToMeas[0][0]*jFrac;
891  theDerivatives[nMeasPerHit*k ][offsetPar+2*jPlane+1] = JacOffsetToMeas[0][1]*jFrac;
892  theDerivatives[nMeasPerHit*k+1][offsetPar+2*jPlane ] = JacOffsetToMeas[1][0]*jFrac;
893  theDerivatives[nMeasPerHit*k+1][offsetPar+2*jPlane+1] = JacOffsetToMeas[1][1]*jFrac;
894  // 2nd order neglected
895  // theDerivatives[nMeasPerHit*k ][ 0] = -0.5*bFac*sDiff*iFrac*sDiff*jFrac*cosLambda;
896  }
897  }
898 
899 // measurement of MS kink
900  for (unsigned int i = 1; i < nPlane; ++i) {
901 // CHK
902  int iMsMeas = i-1;
903  int l = i-1; // last hit
904  int n = i+1; // next hit
905 
906 // amount of multiple scattering in plane k
907  for (unsigned int k = first[i]; k <= last[i]; ++k) {
908  tempMSCov = allDeltaParameterCovs[k].similarity(allLocalToCurv[k]);
909  tempMSCovProj = tempMSCov.similarity(CurvToAngle);
910  theMeasurementsCov[offsetMeas+nMeasPerHit*iMsMeas ][offsetMeas+nMeasPerHit*iMsMeas ] += tempMSCovProj[0][0];
911  theMeasurementsCov[offsetMeas+nMeasPerHit*iMsMeas+1][offsetMeas+nMeasPerHit*iMsMeas+1] += tempMSCovProj[1][1];
912  }
913 // broken line measurements for layer k, correlations between both planes neglected
914  double stepK = sPlane[i] - sPlane[l];
915  double stepN = sPlane[n] - sPlane[i];
916  double deltaK (1.0/stepK);
917  double deltaN (1.0/stepN);
918  // bending (only in RPhi)
919  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][ 0] = -0.5*bFac*(stepK+stepN)*cosLambda;
920  // last layer
921  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*l ] = deltaK;
922  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*l+1] = deltaK;
923  // current layer
924  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*i ] = -(deltaK + deltaN);
925  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*i+1] = -(deltaK + deltaN);
926  // next layer
927  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas ][offsetPar+2*n ] = deltaN;
928  theDerivatives[offsetMeas+nMeasPerHit*iMsMeas+1][offsetPar+2*n+1] = deltaN;
929  }
930 
931  return true;
932 }
dbl * delta
Definition: mlp_gen.cc:36
AlgebraicMatrix theInnerTrajectoryToCurvilinear
int i
Definition: DBlmapReader.cc:9
AlgebraicMatrix theInnerLocalToTrajectory
static const unsigned int nMeasPerHit
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
T y() const
Definition: PV3DBase.h:63
GlobalVector magneticFieldInInverseGeV(const GlobalPoint &x) const
CLHEP::HepMatrix AlgebraicMatrix
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepSymMatrix AlgebraicSymMatrix
T x() const
Definition: PV3DBase.h:62
bool ReferenceTrajectory::addMaterialEffectsCov ( const std::vector< AlgebraicMatrix > &  allJacobians,
const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allCurvChanges,
const std::vector< AlgebraicSymMatrix > &  allDeltaParaCovs 
)
protectedvirtual

internal method to add material effects to measurments covariance matrix

Definition at line 485 of file ReferenceTrajectory.cc.

References relval_2017::k, cmsLHEtoEOSManager::l, ReferenceTrajectoryBase::nMeasPerHit, and ReferenceTrajectoryBase::theMeasurementsCov.

Referenced by construct().

489 {
490  // the uncertainty due to multiple scattering is 'transferred' to the error matrix of the hits
491 
492  // GF: Needs update once hit dimension is not hardcoded as nMeasPerHit!
493 
494  AlgebraicSymMatrix materialEffectsCov(nMeasPerHit * allJacobians.size(), 0);
495 
496  // additional covariance-matrix of the measurements due to material-effects (single measurement)
497  AlgebraicSymMatrix deltaMaterialEffectsCov;
498 
499  // additional covariance-matrix of the parameters due to material-effects
500  AlgebraicSymMatrix paramMaterialEffectsCov(allDeltaParameterCovs[0]); //initialization
501  // error-propagation to state after energy loss
502  //GFback paramMaterialEffectsCov = paramMaterialEffectsCov.similarity(allCurvatureChanges[0]);
503 
504  AlgebraicMatrix tempParameterCov;
505  AlgebraicMatrix tempMeasurementCov;
506 
507  for (unsigned int k = 1; k < allJacobians.size(); ++k) {
508  // error-propagation to next layer
509  paramMaterialEffectsCov = paramMaterialEffectsCov.similarity(allJacobians[k]);
510 
511  // get dependences for the measurements
512  deltaMaterialEffectsCov = paramMaterialEffectsCov.similarity(allProjections[k]);
513  materialEffectsCov[nMeasPerHit*k ][nMeasPerHit*k ] = deltaMaterialEffectsCov[0][0];
514  materialEffectsCov[nMeasPerHit*k ][nMeasPerHit*k+1] = deltaMaterialEffectsCov[0][1];
515  materialEffectsCov[nMeasPerHit*k+1][nMeasPerHit*k ] = deltaMaterialEffectsCov[1][0];
516  materialEffectsCov[nMeasPerHit*k+1][nMeasPerHit*k+1] = deltaMaterialEffectsCov[1][1];
517 
518  // GFback add uncertainties for the following layers due to scattering at this layer
519  paramMaterialEffectsCov += allDeltaParameterCovs[k];
520  // end GFback
521  tempParameterCov = paramMaterialEffectsCov;
522 
523  // compute "inter-layer-dependencies"
524  for (unsigned int l = k+1; l < allJacobians.size(); ++l) {
525  tempParameterCov = allJacobians[l] * allCurvatureChanges[l] * tempParameterCov;
526  tempMeasurementCov = allProjections[l] * tempParameterCov * allProjections[k].T();
527 
528  materialEffectsCov[nMeasPerHit*l][nMeasPerHit*k] = tempMeasurementCov[0][0];
529  materialEffectsCov[nMeasPerHit*k][nMeasPerHit*l] = tempMeasurementCov[0][0];
530 
531  materialEffectsCov[nMeasPerHit*l][nMeasPerHit*k+1] = tempMeasurementCov[0][1];
532  materialEffectsCov[nMeasPerHit*k+1][nMeasPerHit*l] = tempMeasurementCov[0][1];
533 
534  materialEffectsCov[nMeasPerHit*l+1][nMeasPerHit*k] = tempMeasurementCov[1][0];
535  materialEffectsCov[nMeasPerHit*k][nMeasPerHit*l+1] = tempMeasurementCov[1][0];
536 
537  materialEffectsCov[nMeasPerHit*l+1][nMeasPerHit*k+1] = tempMeasurementCov[1][1];
538  materialEffectsCov[nMeasPerHit*k+1][nMeasPerHit*l+1] = tempMeasurementCov[1][1];
539  }
540  // add uncertainties for the following layers due to scattering at this layer
541  // GFback paramMaterialEffectsCov += allDeltaParameterCovs[k];
542  // error-propagation to state after energy loss
543  paramMaterialEffectsCov = paramMaterialEffectsCov.similarity(allCurvatureChanges[k]);
544 
545  }
546  theMeasurementsCov += materialEffectsCov;
547 
548  return true; // cannot fail
549 }
static const unsigned int nMeasPerHit
CLHEP::HepMatrix AlgebraicMatrix
AlgebraicSymMatrix theMeasurementsCov
CLHEP::HepSymMatrix AlgebraicSymMatrix
bool ReferenceTrajectory::addMaterialEffectsCurvlinGbl ( const std::vector< AlgebraicMatrix > &  allJacobians,
const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allCurvChanges,
const std::vector< AlgebraicSymMatrix > &  allDeltaParaCovs,
const std::vector< AlgebraicMatrix > &  allLocalToCurv 
)
protectedvirtual

internal methods to add material effects using broken lines (fine version, curvilinear system)

Definition at line 1014 of file ReferenceTrajectory.cc.

References gbl::GblPoint::addMeasurement(), gbl::GblPoint::addScatterer(), clhep2root(), relval_2017::k, ReferenceTrajectoryBase::theGblInput, ReferenceTrajectoryBase::theMeasurements, ReferenceTrajectoryBase::theMeasurementsCov, and ReferenceTrajectoryBase::theTrajectoryPositions.

Referenced by construct().

1019 {
1020 //CHK: add material effects using general broken lines
1021 // local track parameters are defined in the curvilinear system
1022 
1023  const double minPrec = 1.0; // minimum precision to use measurement (reject measurements in strip direction)
1024  int ierr = 0;
1025 
1026  AlgebraicMatrix OffsetToCurv(5,2); // dCurv/dU
1027  OffsetToCurv[3][0] = 1.; // dxt/du1
1028  OffsetToCurv[4][1] = 1.; // dyt/du2
1029 
1030  AlgebraicMatrix JacOffsetToMeas, tempMSCov;
1031 
1032  // GBL uses ROOT matrices as interface
1033  TMatrixDSym covariance(2), measPrecision(2);
1034  TMatrixD jacPointToPoint(5,5), firstLocalToCurv(5,5), proLocalToMeas(2,2);
1035  TVectorD measurement(2), scatterer(2), measPrecDiag(2), scatPrecDiag(2);
1036  scatterer.Zero();
1037 
1038 // measurements and scatterers from hits
1039  unsigned int numHits = allCurvlinJacobians.size();
1040  std::vector<GblPoint> GblPointList;
1041  GblPointList.reserve(numHits);
1042  for (unsigned int k = 0; k < numHits; ++k) {
1043 // (dMeas/dU) = (dMeas/dLoc) * (dLoc/dCurv) * (dCurv/dU)
1044  JacOffsetToMeas = (allProjections[k] * allLocalToCurv[k].inverse(ierr) ) * OffsetToCurv;
1045  if (ierr) {
1046  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::addMaterialEffectsGbl"
1047  << "Inversion 1 for general broken lines failed: " << ierr;
1048  return false;
1049  }
1050 
1051  // GBL point to point jacobian
1052  clhep2root(allCurvlinJacobians[k] * allCurvatureChanges[k], jacPointToPoint);
1053 
1054  // GBL point
1055  GblPoint aGblPoint( jacPointToPoint );
1056 
1057  // GBL projection from local to measurement system
1058  clhep2root(JacOffsetToMeas, proLocalToMeas);
1059 
1060  // GBL measurement (residuum to initial trajectory)
1061  clhep2root(theMeasurements.sub(2*k+1,2*k+2) - theTrajectoryPositions.sub(2*k+1,2*k+2), measurement);
1062 
1063  // GBL measurement covariance matrix
1064  clhep2root(theMeasurementsCov.sub(2*k+1,2*k+2), covariance);
1065 
1066  // GBL add measurement to point
1067  if (covariance(0,1) == 0.) {
1068  // covariance matrix is diagonal, independent measurements
1069  for (unsigned int row = 0; row < 2; ++row) {
1070  measPrecDiag(row) = ( 0. < covariance(row,row) ? 1.0/covariance(row,row) : 0. );
1071  }
1072  aGblPoint.addMeasurement(proLocalToMeas, measurement, measPrecDiag, minPrec);
1073  } else
1074  {
1075  // covariance matrix needs diagonalization
1076  measPrecision = covariance; measPrecision.InvertFast();
1077  aGblPoint.addMeasurement(proLocalToMeas, measurement, measPrecision, minPrec);
1078  }
1079 
1080  // GBL multiple scattering (diagonal matrix in curvilinear system)
1081  tempMSCov = allDeltaParameterCovs[k].similarity(allLocalToCurv[k]);
1082  for (unsigned int row = 0; row < 2; ++row) {
1083  scatPrecDiag(row) = 1.0/tempMSCov[row+1][row+1];
1084  }
1085 
1086  // GBL add scatterer to point
1087  aGblPoint.addScatterer(scatterer, scatPrecDiag);
1088 
1089  // add point to list
1090  GblPointList.push_back( aGblPoint );
1091  }
1092  // add list of points and transformation local to fit (=curvilinear) system at first hit
1093  clhep2root(allLocalToCurv[0], firstLocalToCurv);
1094  theGblInput.push_back(std::make_pair(GblPointList, firstLocalToCurv));
1095 
1096  return true;
1097 }
CLHEP::HepMatrix AlgebraicMatrix
std::vector< std::pair< std::vector< gbl::GblPoint >, TMatrixD > > theGblInput
AlgebraicSymMatrix theMeasurementsCov
void clhep2root(const AlgebraicVector &in, TVectorD &out)
Point on trajectory.
Definition: GblPoint.h:46
bool ReferenceTrajectory::addMaterialEffectsLocalGbl ( const std::vector< AlgebraicMatrix > &  allJacobians,
const std::vector< AlgebraicMatrix > &  allProjections,
const std::vector< AlgebraicSymMatrix > &  allCurvatureChanges,
const std::vector< AlgebraicSymMatrix > &  allDeltaParameterCovs 
)
protectedvirtual

internal methods to add material effects using broken lines (fine version, local system)

Definition at line 936 of file ReferenceTrajectory.cc.

References gbl::GblPoint::addMeasurement(), gbl::GblPoint::addScatterer(), clhep2root(), relval_2017::k, ReferenceTrajectoryBase::theGblInput, ReferenceTrajectoryBase::theMeasurements, ReferenceTrajectoryBase::theMeasurementsCov, and ReferenceTrajectoryBase::theTrajectoryPositions.

Referenced by construct().

940 {
941 //CHK: add material effects using general broken lines, no initial kinks
942 // local track parameters are defined in the TSO system
943 
944  const double minPrec = 1.0; // minimum precision to use measurement (reject measurements in strip direction)
945 
946  AlgebraicMatrix OffsetToLocal(5,2); // dLocal/dU
947  OffsetToLocal[3][0] = 1.;
948  OffsetToLocal[4][1] = 1.;
949  AlgebraicMatrix SlopeToLocal(5,2); // dLocal/dU'
950  SlopeToLocal[1][0] = 1.;
951  SlopeToLocal[2][1] = 1.;
952 
953  // GBL uses ROOT matrices as interface
954  TMatrixDSym covariance(2), measPrecision(2), scatPrecision(2);
955  TMatrixD jacPointToPoint(5,5), identity(5,5), proLocalToMeas(2,2);
956  identity.UnitMatrix();
957  TVectorD measurement(2), scatterer(2), measPrecDiag(2);
958  scatterer.Zero();
959  //bool initialKinks = (allCurvlinKinks.size()>0);
960 
961 // measurements and scatterers from hits
962  unsigned int numHits = allJacobians.size();
963  std::vector<GblPoint> GblPointList;
964  GblPointList.reserve(numHits);
965  for (unsigned int k = 0; k < numHits; ++k) {
966 
967  // GBL point to point jacobian
968  clhep2root(allJacobians[k] * allCurvatureChanges[k], jacPointToPoint);
969 
970  // GBL point
971  GblPoint aGblPoint( jacPointToPoint );
972 
973  // GBL projection from local to measurement system
974  clhep2root(allProjections[k] * OffsetToLocal, proLocalToMeas);
975 
976  // GBL measurement (residuum to initial trajectory)
977  clhep2root(theMeasurements.sub(2*k+1,2*k+2) - theTrajectoryPositions.sub(2*k+1,2*k+2), measurement);
978 
979  // GBL measurement covariance matrix
980  clhep2root(theMeasurementsCov.sub(2*k+1,2*k+2), covariance);
981 
982  // GBL add measurement to point
983  if (covariance(0,1) == 0.) {
984  // covariance matrix is diagonal, independent measurements
985  for (unsigned int row = 0; row < 2; ++row) {
986  measPrecDiag(row) = ( 0. < covariance(row,row) ? 1.0/covariance(row,row) : 0. );
987  }
988  aGblPoint.addMeasurement(proLocalToMeas, measurement, measPrecDiag, minPrec);
989  } else
990  {
991  // covariance matrix needs diagonalization
992  measPrecision = covariance; measPrecision.InvertFast();
993  aGblPoint.addMeasurement(proLocalToMeas, measurement, measPrecision, minPrec);
994  }
995 
996  // GBL multiple scattering (full matrix in local system)
997  clhep2root(allDeltaParameterCovs[k].similarityT(SlopeToLocal), scatPrecision);
998  scatPrecision.InvertFast();
999 
1000  // GBL add scatterer to point
1001  aGblPoint.addScatterer(scatterer, scatPrecision);
1002 
1003  // add point to list
1004  GblPointList.push_back( aGblPoint );
1005  }
1006  // add list of points and transformation local to fit (=local) system at first hit
1007  theGblInput.push_back(std::make_pair(GblPointList, identity));
1008 
1009  return true;
1010 }
CLHEP::HepMatrix AlgebraicMatrix
std::vector< std::pair< std::vector< gbl::GblPoint >, TMatrixD > > theGblInput
AlgebraicSymMatrix theMeasurementsCov
void clhep2root(const AlgebraicVector &in, TVectorD &out)
Point on trajectory.
Definition: GblPoint.h:46
void ReferenceTrajectory::clhep2root ( const AlgebraicVector in,
TVectorD &  out 
)
private

Definition at line 1101 of file ReferenceTrajectory.cc.

Referenced by addMaterialEffectsCurvlinGbl(), and addMaterialEffectsLocalGbl().

1101  {
1102  // convert from CLHEP to ROOT matrix
1103  for (int row = 0; row < in.num_row(); ++row) {
1104  out[row] = in[row];
1105  }
1106 }
void ReferenceTrajectory::clhep2root ( const AlgebraicMatrix in,
TMatrixD &  out 
)
private

Definition at line 1108 of file ReferenceTrajectory.cc.

References cuy::col.

1108  {
1109  // convert from CLHEP to ROOT matrix
1110  for (int row = 0; row < in.num_row(); ++row) {
1111  for (int col = 0; col < in.num_col(); ++col) {
1112  out[row][col] = in[row][col];
1113  }
1114  }
1115 }
int col
Definition: cuy.py:1008
void ReferenceTrajectory::clhep2root ( const AlgebraicSymMatrix in,
TMatrixDSym &  out 
)
private

Definition at line 1117 of file ReferenceTrajectory.cc.

References cuy::col.

1117  {
1118  // convert from CLHEP to ROOT matrix
1119  for (int row = 0; row < in.num_row(); ++row) {
1120  for (int col = 0; col < in.num_col(); ++col) {
1121  out[row][col] = in[row][col];
1122  }
1123  }
1124 }
int col
Definition: cuy.py:1008
virtual ReferenceTrajectory* ReferenceTrajectory::clone ( void  ) const
inlinevirtual

Implements ReferenceTrajectoryBase.

Reimplemented in BzeroReferenceTrajectory.

Definition at line 81 of file ReferenceTrajectory.h.

References ReferenceTrajectory().

81 { return new ReferenceTrajectory(*this); }
ReferenceTrajectory(const TrajectoryStateOnSurface &referenceTsos, const TransientTrackingRecHit::ConstRecHitContainer &recHits, bool hitsAreReverse, const MagneticField *magField, MaterialEffects materialEffects, PropagationDirection propDir, double mass, bool useBeamSpot, const reco::BeamSpot &beamSpot)
bool ReferenceTrajectory::construct ( const TrajectoryStateOnSurface referenceTsos,
const TransientTrackingRecHit::ConstRecHitContainer recHits,
double  mass,
MaterialEffects  materialEffects,
const PropagationDirection  propDir,
const MagneticField magField,
bool  useBeamSpot,
const reco::BeamSpot beamSpot 
)
protectedvirtual

internal method to calculate members

Definition at line 103 of file ReferenceTrajectory.cc.

References addMaterialEffectsBp(), addMaterialEffectsBrl(), addMaterialEffectsCov(), addMaterialEffectsCurvlinGbl(), addMaterialEffectsLocalGbl(), alongMomentum, AnalyticalPropagator_cfi::AnalyticalPropagator, ReferenceTrajectoryBase::breakPoints, ReferenceTrajectoryBase::brokenLinesCoarse, ReferenceTrajectoryBase::brokenLinesFine, Plane::build(), ReferenceTrajectoryBase::combined, createUpdator(), Vector3DBase< T, FrameTag >::cross(), ReferenceTrajectoryBase::curvlinGBL, reco::BeamSpot::dxdz(), reco::BeamSpot::dydz(), ReferenceTrajectoryBase::energyLoss, fillDerivatives(), fillMeasurementAndError(), fillTrajectoryPositions(), TrajectoryStateOnSurface::freeState(), getHitProjectionMatrix(), TrajectoryStateOnSurface::globalParameters(), TrajectoryStateOnSurface::hasError(), TrajectoryStateOnSurface::localError(), ReferenceTrajectoryBase::localGBL, TrajectoryStateOnSurface::localParameters(), LocalTrajectoryError::matrix(), FreeTrajectoryState::momentum(), ReferenceTrajectoryBase::multipleScattering, ReferenceTrajectoryBase::nMeasPerHit, MagneticField::nominalValue(), ReferenceTrajectoryBase::none, PV3DBase< T, PVType, FrameType >::phi(), propagate(), HLT_FULL_cff::propagator, idealTransformation::rotation, LocalTrajectoryParameters::signedInverseMomentum(), GeomDet::surface(), TrajectoryStateOnSurface::surface(), surfaceSide(), ReferenceTrajectoryBase::theDerivatives, ReferenceTrajectoryBase::theInnerLocalToTrajectory, ReferenceTrajectoryBase::theInnerTrajectoryToCurvilinear, ReferenceTrajectoryBase::theNomField, ReferenceTrajectoryBase::theNumberOfHits, ReferenceTrajectoryBase::theNumberOfVirtualPars, ReferenceTrajectoryBase::theParameters, ReferenceTrajectoryBase::theRecHits, ReferenceTrajectoryBase::theTrajectoryPositionCov, ReferenceTrajectoryBase::theTsosVec, TSCBLBuilderNoMaterial_cfi::TSCBLBuilderNoMaterial, ReferenceTrajectoryBase::useRecHit(), reco::BeamSpot::x0(), reco::BeamSpot::y0(), and reco::BeamSpot::z0().

Referenced by BzeroReferenceTrajectory::BzeroReferenceTrajectory(), and ReferenceTrajectory().

110 {
111  TrajectoryStateOnSurface theRefTsos = refTsos;
112 
113  const SurfaceSide surfaceSide = this->surfaceSide(propDir);
114  // auto_ptr to avoid memory leaks in case of not reaching delete at end of method:
115  std::auto_ptr<MaterialEffectsUpdator> aMaterialEffectsUpdator
116  (this->createUpdator(materialEffects, mass));
117  if (!aMaterialEffectsUpdator.get()) return false; // empty auto_ptr
118 
119  AlgebraicMatrix fullJacobian(theParameters.num_row(), theParameters.num_row());
120  std::vector<AlgebraicMatrix> allJacobians;
121  allJacobians.reserve(theNumberOfHits);
122 
124  TrajectoryStateOnSurface previousTsos;
125  AlgebraicSymMatrix previousChangeInCurvature(theParameters.num_row(), 1);
126  std::vector<AlgebraicSymMatrix> allCurvatureChanges;
127  allCurvatureChanges.reserve(theNumberOfHits);
128 
129  const LocalTrajectoryError zeroErrors(0., 0., 0., 0., 0.);
130 
131  std::vector<AlgebraicMatrix> allProjections;
132  allProjections.reserve(theNumberOfHits);
133  std::vector<AlgebraicSymMatrix> allDeltaParameterCovs;
134  allDeltaParameterCovs.reserve(theNumberOfHits);
135 
136  // CHK
137  std::vector<AlgebraicMatrix> allLocalToCurv;
138  allLocalToCurv.reserve(theNumberOfHits);
139  std::vector<double> allSteps;
140  allSteps.reserve(theNumberOfHits);
141  std::vector<AlgebraicMatrix> allCurvlinJacobians;
142  allCurvlinJacobians.reserve(theNumberOfHits);
143 
144  AlgebraicMatrix firstCurvlinJacobian(5, 5, 1);
145 
146  unsigned int iRow = 0;
147 
148  theNomField = magField->nominalValue(); // nominal magnetic field in kGauss
149  // local storage vector of all rechits (including rechit for beam spot in case it is used)
151 
152  if (useBeamSpot && propDir==alongMomentum) {
153 
154  GlobalPoint bs(beamSpot.x0(), beamSpot.y0(), beamSpot.z0());
155 
156  TrajectoryStateClosestToBeamLine tsctbl(TSCBLBuilderNoMaterial()(*(refTsos.freeState()), beamSpot));
157  if (!tsctbl.isValid()) {
158  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::construct"
159  << "TrajectoryStateClostestToBeamLine invalid. Skip track.";
160  return false;
161  }
162 
163  FreeTrajectoryState pcaFts = tsctbl.trackStateAtPCA();
164  GlobalVector bd(beamSpot.dxdz(), beamSpot.dydz(), 1.0);
165 
166  //propagation FIXME: Should use same propagator everywhere...
168  std::pair< TrajectoryStateOnSurface, double > tsosWithPath =
169  propagator.propagateWithPath(pcaFts, refTsos.surface());
170 
171  if (!tsosWithPath.first.isValid()) return false;
172 
173  GlobalVector momDir(pcaFts.momentum());
174  GlobalVector perpDir(bd.cross(momDir));
175  Plane::RotationType rotation(perpDir, bd);
176 
178 
179  // There is also a constructor taking the magentic field. Use this one instead?
180  theRefTsos = TrajectoryStateOnSurface(pcaFts, bsGeom->surface());
181 
183  bsGeom,
184  theRefTsos.freeState()->momentum().phi()));
185  allRecHits.push_back(bsRecHit);
186 
187  }
188 
189  // copy all rechits to the local storage vector
190  TransientTrackingRecHit::ConstRecHitContainer::const_iterator itRecHit;
191  for ( itRecHit = recHits.begin(); itRecHit != recHits.end(); ++itRecHit ) {
192  const TransientTrackingRecHit::ConstRecHitPointer &hitPtr = *itRecHit;
193  allRecHits.push_back(hitPtr);
194  }
195 
196  for ( itRecHit = allRecHits.begin(); itRecHit != allRecHits.end(); ++itRecHit ) {
197 
198  const TransientTrackingRecHit::ConstRecHitPointer &hitPtr = *itRecHit;
199  theRecHits.push_back(hitPtr);
200 
201  if (0 == iRow) {
202 
203  // compute the derivatives of the reference-track's parameters w.r.t. the initial ones
204  // derivative of the initial reference-track parameters w.r.t. themselves is of course the identity
205  fullJacobian = AlgebraicMatrix(theParameters.num_row(), theParameters.num_row(), 1);
206  allJacobians.push_back(fullJacobian);
207  theTsosVec.push_back(theRefTsos);
208  const JacobianLocalToCurvilinear startTrafo(hitPtr->det()->surface(), theRefTsos.localParameters(), *magField);
209  const AlgebraicMatrix localToCurvilinear = asHepMatrix<5>(startTrafo.jacobian());
210  if (materialEffects <= breakPoints) {
211  theInnerTrajectoryToCurvilinear = asHepMatrix<5>(startTrafo.jacobian());
213  }
214  allLocalToCurv.push_back(localToCurvilinear);
215  allSteps.push_back(0.);
216  allCurvlinJacobians.push_back(firstCurvlinJacobian);
217 
218  } else {
219 
220  AlgebraicMatrix nextJacobian;
221  AlgebraicMatrix nextCurvlinJacobian;
222  double nextStep = 0.;
223  TrajectoryStateOnSurface nextTsos;
224 
225  if (!this->propagate(previousHitPtr->det()->surface(), previousTsos,
226  hitPtr->det()->surface(), nextTsos,
227  nextJacobian, nextCurvlinJacobian, nextStep, propDir, magField)) {
228  return false; // stop if problem...// no delete aMaterialEffectsUpdator needed
229  }
230 
231  allJacobians.push_back(nextJacobian);
232  fullJacobian = nextJacobian * previousChangeInCurvature * fullJacobian;
233  theTsosVec.push_back(nextTsos);
234 
235  const JacobianLocalToCurvilinear startTrafo(hitPtr->det()->surface(), nextTsos.localParameters(), *magField);
236  const AlgebraicMatrix localToCurvilinear = asHepMatrix<5>(startTrafo.jacobian());
237  allLocalToCurv.push_back(localToCurvilinear);
238  if (nextStep == 0.) {
239  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::construct"
240  << "step 0. from id " << previousHitPtr->geographicalId()
241  << " to " << hitPtr->det()->geographicalId() << ".";
242  // brokenLinesFine will not work, brokenLinesCoarse combines close by layers
243  if (materialEffects == brokenLinesFine) {
244  edm::LogError("Alignment") << "@SUB=ReferenceTrajectory::construct" << "Skip track.";
245  return false;
246  }
247  }
248  allSteps.push_back(nextStep);
249  allCurvlinJacobians.push_back(nextCurvlinJacobian);
250 
251  }
252 
253  // take material effects into account. since trajectory-state is constructed with errors equal zero,
254  // the updated state contains only the uncertainties due to interactions in the current layer.
255  const TrajectoryStateOnSurface tmpTsos(theTsosVec.back().localParameters(), zeroErrors,
256  theTsosVec.back().surface(), magField, surfaceSide);
257  const TrajectoryStateOnSurface updatedTsos = aMaterialEffectsUpdator->updateState(tmpTsos, propDir);
258 
259  if ( !updatedTsos.isValid() ) return false;// no delete aMaterialEffectsUpdator needed
260 
261  if ( theTsosVec.back().localParameters().charge() )
262  {
263  previousChangeInCurvature[0][0] = updatedTsos.localParameters().signedInverseMomentum()
264  / theTsosVec.back().localParameters().signedInverseMomentum();
265  }
266 
267  // get multiple-scattering covariance-matrix
268  allDeltaParameterCovs.push_back( asHepMatrix<5>(updatedTsos.localError().matrix()) );
269  allCurvatureChanges.push_back(previousChangeInCurvature);
270 
271  // projection-matrix tsos-parameters -> measurement-coordinates
272  allProjections.push_back(this->getHitProjectionMatrix(hitPtr));
273  // set start-parameters for next propagation. trajectory-state without error
274  // - no error propagation needed here.
275  previousHitPtr = hitPtr;
276  previousTsos = TrajectoryStateOnSurface(updatedTsos.globalParameters(),
277  updatedTsos.surface(), surfaceSide);
278 
279  if (materialEffects < brokenLinesCoarse) {
280  this->fillDerivatives(allProjections.back(), fullJacobian, iRow);
281  }
282 
283  AlgebraicVector mixedLocalParams = asHepVector<5>(theTsosVec.back().localParameters().mixedFormatVector());
284  this->fillTrajectoryPositions(allProjections.back(), mixedLocalParams, iRow);
285  if ( useRecHit( hitPtr ) ) this->fillMeasurementAndError(hitPtr, iRow, updatedTsos);
286 
287  iRow += nMeasPerHit;
288  } // end of loop on hits
289 
290  bool msOK = true;
291  switch (materialEffects) {
292  case none:
293  break;
294  case multipleScattering:
295  case energyLoss:
296  case combined:
297  msOK = this->addMaterialEffectsCov(allJacobians, allProjections, allCurvatureChanges,
298  allDeltaParameterCovs);
299  break;
300  case breakPoints:
301  msOK = this->addMaterialEffectsBp(allJacobians, allProjections, allCurvatureChanges,
302  allDeltaParameterCovs, allLocalToCurv);
303  break;
304  case brokenLinesCoarse:
305  msOK = this->addMaterialEffectsBrl(allProjections, allDeltaParameterCovs, allLocalToCurv,
306  allSteps, refTsos.globalParameters());
307  break;
308  case brokenLinesFine:
309  msOK = this->addMaterialEffectsBrl(allCurvlinJacobians, allProjections, allCurvatureChanges,
310  allDeltaParameterCovs, allLocalToCurv, refTsos.globalParameters());
311  break;
312  case localGBL:
313  msOK = this->addMaterialEffectsLocalGbl(allJacobians, allProjections, allCurvatureChanges,
314  allDeltaParameterCovs);
315  break;
316  case curvlinGBL:
317  msOK = this->addMaterialEffectsCurvlinGbl(allCurvlinJacobians, allProjections, allCurvatureChanges,
318  allDeltaParameterCovs, allLocalToCurv);
319  }
320  if (!msOK) return false;
321 
322  if (refTsos.hasError()) {
323  AlgebraicSymMatrix parameterCov = asHepMatrix<5>(refTsos.localError().matrix());
324  AlgebraicMatrix parDeriv;
325  if (theNumberOfVirtualPars>0) {
326  parDeriv = theDerivatives.sub( 1, nMeasPerHit*allJacobians.size(), 1, theParameters.num_row() );
327  } else {
328  parDeriv = theDerivatives;
329  }
330  theTrajectoryPositionCov = parameterCov.similarity(parDeriv);
331  } else {
333  }
334 
335  return true;
336 }
AlgebraicMatrix theInnerTrajectoryToCurvilinear
double z0() const
z coordinate
Definition: BeamSpot.h:68
tuple propagator
AlgebraicMatrix getHitProjectionMatrix(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
virtual bool addMaterialEffectsBrl(const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv, const GlobalTrajectoryParameters &gtp)
const LocalTrajectoryParameters & localParameters() const
AlgebraicMatrix theInnerLocalToTrajectory
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:56
virtual void fillMeasurementAndError(const TransientTrackingRecHit::ConstRecHitPointer &hitPtr, unsigned int iRow, const TrajectoryStateOnSurface &updatedTsos)
static const unsigned int nMeasPerHit
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
const TransientTrackingRecHit::ConstRecHitContainer & recHits() const
virtual bool addMaterialEffectsLocalGbl(const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvatureChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParameterCovs)
SurfaceSide surfaceSide(const PropagationDirection dir) const
virtual bool addMaterialEffectsBp(const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv)
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
float signedInverseMomentum() const
Signed inverse momentum q/p (zero for neutrals).
virtual bool propagate(const Plane &previousSurface, const TrajectoryStateOnSurface &previousTsos, const Plane &newSurface, TrajectoryStateOnSurface &newTsos, AlgebraicMatrix &newJacobian, AlgebraicMatrix &newCurvlinJacobian, double &nextStep, const PropagationDirection propDir, const MagneticField *magField) const
AlgebraicSymMatrix theTrajectoryPositionCov
double dydz() const
dydz slope
Definition: BeamSpot.h:84
virtual bool addMaterialEffectsCurvlinGbl(const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs, const std::vector< AlgebraicMatrix > &allLocalToCurv)
const SurfaceType & surface() const
SurfaceSideDefinition::SurfaceSide SurfaceSide
CLHEP::HepMatrix AlgebraicMatrix
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
static PlanePointer build(Args &&...args)
Definition: Plane.h:33
FreeTrajectoryState const * freeState(bool withErrors=true) const
MaterialEffectsUpdator * createUpdator(MaterialEffects materialEffects, double mass) const
virtual void fillDerivatives(const AlgebraicMatrix &projection, const AlgebraicMatrix &fullJacobian, unsigned int iRow)
GlobalVector momentum() const
double dxdz() const
dxdz slope
Definition: BeamSpot.h:82
TransientTrackingRecHit::ConstRecHitContainer theRecHits
std::vector< ConstRecHitPointer > ConstRecHitContainer
CLHEP::HepVector AlgebraicVector
CLHEP::HepSymMatrix AlgebraicSymMatrix
std::vector< TrajectoryStateOnSurface > theTsosVec
double y0() const
y coordinate
Definition: BeamSpot.h:66
virtual bool addMaterialEffectsCov(const std::vector< AlgebraicMatrix > &allJacobians, const std::vector< AlgebraicMatrix > &allProjections, const std::vector< AlgebraicSymMatrix > &allCurvChanges, const std::vector< AlgebraicSymMatrix > &allDeltaParaCovs)
virtual void fillTrajectoryPositions(const AlgebraicMatrix &projection, const AlgebraicVector &mixedLocalParams, unsigned int iRow)
bool useRecHit(const TransientTrackingRecHit::ConstRecHitPointer &hitPtr) const
double x0() const
x coordinate
Definition: BeamSpot.h:64
MaterialEffectsUpdator * ReferenceTrajectory::createUpdator ( MaterialEffects  materialEffects,
double  mass 
) const
protected

internal method to get apropriate updator

Definition at line 341 of file ReferenceTrajectory.cc.

References ReferenceTrajectoryBase::breakPoints, ReferenceTrajectoryBase::brokenLinesCoarse, ReferenceTrajectoryBase::brokenLinesFine, ReferenceTrajectoryBase::combined, ReferenceTrajectoryBase::curvlinGBL, ReferenceTrajectoryBase::energyLoss, HLT_FULL_cff::EnergyLossUpdator, ReferenceTrajectoryBase::localGBL, ReferenceTrajectoryBase::multipleScattering, HLT_FULL_cff::MultipleScatteringUpdator, and ReferenceTrajectoryBase::none.

Referenced by construct().

342 {
343  switch (materialEffects) {
344  // MultipleScatteringUpdator doesn't change the trajectory-state
345  // during update and can therefore be used if material effects should be ignored:
346  case none:
347  case multipleScattering:
348  return new MultipleScatteringUpdator(mass);
349  case energyLoss:
350  return new EnergyLossUpdator(mass);
351  case combined:
352  return new CombinedMaterialEffectsUpdator(mass);
353  case breakPoints:
354  return new CombinedMaterialEffectsUpdator(mass);
355  case brokenLinesCoarse:
356  case brokenLinesFine:
357  case localGBL:
358  case curvlinGBL:
359  return new CombinedMaterialEffectsUpdator(mass);
360 }
361 
362  return 0;
363 }
tuple MultipleScatteringUpdator
tuple EnergyLossUpdator
void ReferenceTrajectory::fillDerivatives ( const AlgebraicMatrix projection,
const AlgebraicMatrix fullJacobian,
unsigned int  iRow 
)
protectedvirtual

internal method to fill derivatives for hit iRow/2

Definition at line 451 of file ReferenceTrajectory.cc.

References i, ReferenceTrajectoryBase::parameters(), and ReferenceTrajectoryBase::theDerivatives.

Referenced by construct().

454 {
455  // derivatives of the local coordinates of the reference track w.r.t. to the inital track-parameters
456  const AlgebraicMatrix projectedJacobian(projection * fullJacobian);
457  for (int i = 0; i < parameters().num_row(); ++i) {
458  theDerivatives[iRow ][i] = projectedJacobian[0][i];
459  theDerivatives[iRow+1][i] = projectedJacobian[1][i];
460  // GF: Should be a loop once the hit dimension is not hardcoded as nMeasPerHit (to be checked):
461  // for (int j = 0; j < projection.num_col(); ++j) {
462  // theDerivatives[iRow+j][i] = projectedJacobian[j][i];
463  // }
464  }
465 }
int i
Definition: DBlmapReader.cc:9
CLHEP::HepMatrix AlgebraicMatrix
const AlgebraicVector & parameters() const
void ReferenceTrajectory::fillMeasurementAndError ( const TransientTrackingRecHit::ConstRecHitPointer hitPtr,
unsigned int  iRow,
const TrajectoryStateOnSurface updatedTsos 
)
protectedvirtual

internal method to fill measurement and error matrix for hit iRow/2

Definition at line 416 of file ReferenceTrajectory.cc.

References ReferenceTrajectoryBase::theMeasurements, ReferenceTrajectoryBase::theMeasurementsCov, PV3DBase< T, PVType, FrameType >::x(), LocalError::xx(), LocalError::xy(), PV3DBase< T, PVType, FrameType >::y(), and LocalError::yy().

Referenced by construct().

419 {
420  // get the measurements and their errors, use information updated with tsos if improving
421  // (GF: Also for measurements or only for errors or do the former not change?)
422  // GF 10/2008: I doubt that it makes sense to update the hit with the tsos here:
423  // That is an analytical extrapolation and not the best guess of the real
424  // track state on the module, but the latter should be better to get the best
425  // hit uncertainty estimate!
426 
427  // FIXME FIXME CLONE
428  auto newHitPtr = hitPtr;
429 // TransientTrackingRecHit::ConstRecHitPointer newHitPtr(hitPtr->canImproveWithTrack() ?
430 // hitPtr->clone(updatedTsos) : hitPtr);
431 
432  const LocalPoint localMeasurement = newHitPtr->localPosition();
433  const LocalError localMeasurementCov = newHitPtr->localPositionError();
434 
435  theMeasurements[iRow] = localMeasurement.x();
436  theMeasurements[iRow+1] = localMeasurement.y();
437  theMeasurementsCov[iRow][iRow] = localMeasurementCov.xx();
438  theMeasurementsCov[iRow][iRow+1] = localMeasurementCov.xy();
439  theMeasurementsCov[iRow+1][iRow+1] = localMeasurementCov.yy();
440  // GF: Should be a loop once the hit dimension is not hardcoded as nMeasPerHit (to be checked):
441  // for (int i = 0; i < hitPtr->dimension(); ++i) {
442  // theMeasurements[iRow+i] = hitPtr->parameters()[i]; // fixme: parameters() is by value!
443  // for (int j = i; j < hitPtr->dimension(); ++j) {
444  // theMeasurementsCov[iRow+i][iRow+j] = hitPtr->parametersError()[i][j];
445  // }
446  // }
447 }
float xx() const
Definition: LocalError.h:24
T y() const
Definition: PV3DBase.h:63
float xy() const
Definition: LocalError.h:25
float yy() const
Definition: LocalError.h:26
AlgebraicSymMatrix theMeasurementsCov
T x() const
Definition: PV3DBase.h:62
void ReferenceTrajectory::fillTrajectoryPositions ( const AlgebraicMatrix projection,
const AlgebraicVector mixedLocalParams,
unsigned int  iRow 
)
protectedvirtual

internal method to fill the trajectory positions for hit iRow/2

Definition at line 469 of file ReferenceTrajectory.cc.

References ReferenceTrajectoryBase::theTrajectoryPositions.

Referenced by construct().

472 {
473  // get the local coordinates of the reference trajectory
474  const AlgebraicVector localPosition(projection * mixedLocalParams);
475  theTrajectoryPositions[iRow] = localPosition[0];
476  theTrajectoryPositions[iRow+1] = localPosition[1];
477  // GF: Should be a loop once the hit dimension is not hardcoded as nMeasPerHit (to be checked):
478  // for (int j = 0; j < projection.num_col(); ++j) {
479  // theTrajectoryPositions[iRow+j] = localPosition[j];
480  // }
481 }
CLHEP::HepVector AlgebraicVector
AlgebraicMatrix ReferenceTrajectory::getHitProjectionMatrix ( const TransientTrackingRecHit::ConstRecHitPointer recHit) const
protected

first (generic) helper to get the projection matrix

Definition at line 1130 of file ReferenceTrajectory.cc.

References Exception.

Referenced by construct().

1131 {
1132  if (this->useRecHit(hitPtr)) {
1133  // check which templated non-member function to call:
1134  switch (hitPtr->dimension()) {
1135  case 1:
1136  return getHitProjectionMatrixT<1>(hitPtr);
1137  case 2:
1138  return getHitProjectionMatrixT<2>(hitPtr);
1139  case 3:
1140  return getHitProjectionMatrixT<3>(hitPtr);
1141  case 4:
1142  return getHitProjectionMatrixT<4>(hitPtr);
1143  case 5:
1144  return getHitProjectionMatrixT<5>(hitPtr);
1145  default:
1146  throw cms::Exception("ReferenceTrajectory::getHitProjectionMatrix")
1147  << "Unexpected hit dimension: " << hitPtr->dimension() << "\n";
1148  }
1149  }
1150  // invalid or (to please compiler) unknown dimension
1151  return AlgebraicMatrix(2, 5, 0); // get size from ???
1152 }
CLHEP::HepMatrix AlgebraicMatrix
bool useRecHit(const TransientTrackingRecHit::ConstRecHitPointer &hitPtr) const
template<unsigned int N>
AlgebraicMatrix ReferenceTrajectory::getHitProjectionMatrixT ( const TransientTrackingRecHit::ConstRecHitPointer recHit) const
protected

second helper (templated on the dimension) to get the projection matrix

Definition at line 1159 of file ReferenceTrajectory.cc.

References N, KfComponentsHolder::projection(), alignCSCRings::r, and KfComponentsHolder::setup().

1160 {
1161  // define variables that will be used to setup the KfComponentsHolder
1162  // (their allocated memory is needed by 'hitPtr->getKfComponents(..)'
1163 
1165  typename AlgebraicROOTObject<N>::Vector r, rMeas;
1166  typename AlgebraicROOTObject<N,N>::SymMatrix V, VMeas;
1167  // input for the holder - but dummy is OK here to just get the projection matrix:
1168  const AlgebraicVector5 dummyPars;
1169  const AlgebraicSymMatrix55 dummyErr;
1170 
1171  // setup the holder with the correct dimensions and get the values
1172  KfComponentsHolder holder;
1173  holder.setup<N>(&r, &V, &pf, &rMeas, &VMeas, dummyPars, dummyErr);
1174  hitPtr->getKfComponents(holder);
1175 
1176  return asHepMatrix<N,5>(holder.projection<N>());
1177 }
void setup(typename AlgebraicROOTObject< D >::Vector *params, typename AlgebraicROOTObject< D, D >::SymMatrix *errors, ProjectMatrix< double, 5, D > *projFunc, typename AlgebraicROOTObject< D >::Vector *measuredParams, typename AlgebraicROOTObject< D, D >::SymMatrix *measuredErrors, const AlgebraicVector5 &tsosLocalParameters, const AlgebraicSymMatrix55 &tsosLocalErrors)
ROOT::Math::SMatrix< double, D1, D1, ROOT::Math::MatRepSym< double, D1 > > SymMatrix
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
AlgebraicROOTObject< D, 5 >::Matrix projection()
ROOT::Math::SVector< double, D1 > Vector
#define N
Definition: blowfish.cc:9
ROOT::Math::SVector< double, 5 > AlgebraicVector5
bool ReferenceTrajectory::propagate ( const Plane previousSurface,
const TrajectoryStateOnSurface previousTsos,
const Plane newSurface,
TrajectoryStateOnSurface newTsos,
AlgebraicMatrix newJacobian,
AlgebraicMatrix newCurvlinJacobian,
double &  nextStep,
const PropagationDirection  propDir,
const MagneticField magField 
) const
protectedvirtual

internal method to calculate jacobian

From TrackingTools/ GeomPropagators/ interface/ AnalyticalPropagator.h NB: this propagator assumes constant, non-zero magnetic field parallel to the z-axis!

Definition at line 367 of file ReferenceTrajectory.cc.

References TrajectoryStateOnSurface::globalParameters(), TrajectoryStateOnSurface::localParameters(), Propagator::propagateWithPath(), and defaultRKPropagator::Product::propagator.

Referenced by construct().

371 {
372  // propagate to next layer
376  //AnalyticalPropagator aPropagator(magField, propDir);
377  // Hard coded RungeKutta instead Analytical (avoid bias in TEC), but
378  // work around TrackPropagation/RungeKutta/interface/RKTestPropagator.h and
379  // http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9
380  defaultRKPropagator::Product rkprod(magField, propDir); //double tolerance = 5.e-5)
381  Propagator &aPropagator = rkprod.propagator;
382  const std::pair<TrajectoryStateOnSurface, double> tsosWithPath =
383  aPropagator.propagateWithPath(previousTsos, newSurface);
384 
385  // stop if propagation wasn't successful
386  if (!tsosWithPath.first.isValid()) return false;
387 
388  nextStep = tsosWithPath.second;
389  // calculate derivative of reference-track parameters on the actual layer w.r.t. the ones
390  // on the previous layer (both in global coordinates)
391  const AnalyticalCurvilinearJacobian aJacobian(previousTsos.globalParameters(),
392  tsosWithPath.first.globalPosition(),
393  tsosWithPath.first.globalMomentum(),
394  tsosWithPath.second);
395  const AlgebraicMatrix curvilinearJacobian = asHepMatrix<5,5>(aJacobian.jacobian());
396 
397  // jacobian of the track parameters on the previous layer for local->global transformation
398  const JacobianLocalToCurvilinear startTrafo(previousSurface, previousTsos.localParameters(), *magField);
399  const AlgebraicMatrix localToCurvilinear = asHepMatrix<5>(startTrafo.jacobian());
400 
401  // jacobian of the track parameters on the actual layer for global->local transformation
402  const JacobianCurvilinearToLocal endTrafo(newSurface, tsosWithPath.first.localParameters(), *magField);
403  const AlgebraicMatrix curvilinearToLocal = asHepMatrix<5>(endTrafo.jacobian());
404 
405  // compute derivative of reference-track parameters on the actual layer w.r.t. the ones on
406  // the previous layer (both in their local representation)
407  newCurvlinJacobian = curvilinearJacobian;
408  newJacobian = curvilinearToLocal * curvilinearJacobian * localToCurvilinear;
409  newTsos = tsosWithPath.first;
410 
411  return true;
412 }
const LocalTrajectoryParameters & localParameters() const
CLHEP::HepMatrix AlgebraicMatrix
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Surface &) const final
Definition: Propagator.cc:15
const GlobalTrajectoryParameters & globalParameters() const
SurfaceSide ReferenceTrajectory::surfaceSide ( const PropagationDirection  dir) const
inlineprotected

Don't care for propagation direction 'anyDirection' - in that case the material effects are anyway not updated ...

Definition at line 173 of file ReferenceTrajectory.h.

References SurfaceSideDefinition::afterSurface, alongMomentum, and SurfaceSideDefinition::beforeSurface.

Referenced by BzeroReferenceTrajectory::BzeroReferenceTrajectory(), and construct().