diff --git a/Tracking/TrkExtrapolation/TrkExSTEP_Propagator/src/STEP_Propagator.cxx b/Tracking/TrkExtrapolation/TrkExSTEP_Propagator/src/STEP_Propagator.cxx index dd632163aa12aac1df86f15bd34b09a2f0550dfc..b8474026acdab73ff1456cc5790fd76144278fc0 100755 --- a/Tracking/TrkExtrapolation/TrkExSTEP_Propagator/src/STEP_Propagator.cxx +++ b/Tracking/TrkExtrapolation/TrkExSTEP_Propagator/src/STEP_Propagator.cxx @@ -23,8 +23,8 @@ //#include "TrkEventPrimitives/Vector.h" #include "TrkExUtils/IntersectionSolution.h" #include "TrkExUtils/RungeKuttaUtils.h" -//#include "TrkEventPrimitives/CurvilinearUVT.h" -//#include "TrkEventPrimitives/JacobianCurvilinearToLocal.h" +#include "TrkEventPrimitives/CurvilinearUVT.h" +#include "TrkEventPrimitives/JacobianCurvilinearToLocal.h" #include "TrkExUtils/TransportJacobian.h" #include "TrkExInterfaces/ITimedMatEffUpdator.h" #include "TrkMaterialOnTrack/ScatteringAngles.h" @@ -768,9 +768,6 @@ const Trk::TrackParameters* // Bfield mode mft.magneticFieldMode()==2 ? m_solenoid = true : m_solenoid = false; - // double mom = inputTrackParameters.parameters()[Trk::qOverP] != 0 ? 1./inputTrackParameters.parameters()[Trk::qOverP] : 0.; - // ATH_MSG_DEBUG(" propagateRungeKutta : " << m_solenoid << " tol " << m_tolerance << " momC " << m_momentumCutOff - // << " mom " << mom ); //Check inputvalues if (m_tolerance <= 0.) return 0; if (m_momentumCutOff < 0.) return 0; @@ -940,9 +937,6 @@ const Trk::TrackParameters* covarianceContribution( trackParameters, path, onTargetSurf, measurementCovariance); delete onTargetSurf; // the covariance matrix can be just added instead of recreating ? - //Create new error matrix - //Trk::ErrorMatrix* errorMatrix = new Trk::ErrorMatrix( measurementCovariance); - if (trackParameters != &inputTrackParameters) delete trackParameters; return targetSurface.createTrackParameters(localp[0],localp[1],localp[2],localp[3],localp[4],measurementCovariance); } @@ -1014,21 +1008,11 @@ const Trk::TrackParameters* m_combinedThickness=0.; } -/* - if (errorPropagation && m_includeBgradients) { //m_magneticFieldTool is only used to fetch the B-field gradients needed by the error propagation - m_magneticFieldTool = dynamic_cast<const Trk::IMagneticFieldTool*>(magneticFieldProperties.magneticFieldTool()); - } -*/ - Trk::RungeKuttaUtils rungeKuttaUtils; - //double P[45]; // Track parameters and jacobian; use curvilinear representation - if (!rungeKuttaUtils.transformLocalToGlobal( false, *trackParameters, P)) { + //double P[45]; // Track parameters and jacobian + if (!rungeKuttaUtils.transformLocalToGlobal( errorPropagation, *trackParameters, P)) { if (trackParameters != &inputTrackParameters) delete trackParameters; return 0; - } else if (errorPropagation) { - const AmgVector(5) &Vp = trackParameters->parameters(); - double Tp[5] = {Vp[0], Vp[1], Vp[2], Vp[3], Vp[4]}; - rungeKuttaUtils.transformCurvilinearToGlobal(Tp,P); } double path = 0.; @@ -1042,8 +1026,6 @@ const Trk::TrackParameters* // Common transformation for all surfaces (angles and momentum) double localp[5]; double Jacobian[21]; - //std::vector<DestSurf>::iterator surfIter = targetSurfaces.begin(); - //std::vector<DestSurf>::iterator surfBeg = targetSurfaces.begin(); while ( validStep ) { // propagation to next surface validStep = propagateWithJacobian( errorPropagation, targetSurfaces, P, propagationDirection, solutions, path, totalPath); @@ -1094,8 +1076,8 @@ const Trk::TrackParameters* while ( iSol != solutions.end() ) { if ( targetSurfaces[*iSol].first->isOnSurface(gp,targetSurfaces[*iSol].second ,0.001,0.001) ) { if (!solution) { + rungeKuttaUtils.transformGlobalToLocal(P, localp); if (returnCurv || targetSurfaces[*iSol].first->type()==Trk::Surface::Cone) { - rungeKuttaUtils.transformGlobalToLocal(P, localp); rungeKuttaUtils.transformGlobalToCurvilinear(errorPropagation,P,localp,Jacobian); } else rungeKuttaUtils.transformGlobalToLocal(targetSurfaces[*iSol].first,errorPropagation,P,localp,Jacobian); solution = true; @@ -1135,12 +1117,11 @@ const Trk::TrackParameters* AmgSymMatrix(5)* measurementCovariance = rungeKuttaUtils.newCovarianceMatrix( Jacobian, *trackParameters->covariance()); - //Calculate multiple scattering and straggling covariance contribution. if (m_matPropOK && (m_multipleScattering || m_straggling) && fabs(totalPath)>0.) { - if (returnCurv || targetSurfaces[solutions[0]].first->type()==Trk::Surface::Cone) + if (returnCurv || targetSurfaces[solutions[0]].first->type()==Trk::Surface::Cone) { covarianceContribution( trackParameters, totalPath, fabs( 1./P[6]), measurementCovariance); - else { + } else { covarianceContribution( trackParameters, totalPath, onTargetSurf, measurementCovariance); } } @@ -2262,41 +2243,53 @@ void Trk::STEP_Propagator::covarianceContribution( const Trk::TrackParameters* const Trk::TrackParameters* targetParms, AmgSymMatrix(5)* measurementCovariance) const { - if (m_material->zOverAtimesRho()==0) return; - if (m_material->x0()==0 || m_material->averageZ()==0) return; - // kinematics - //double mom = trackParameters->parameters().mag(); - double finalMomentum = targetParms->parameters().mag(); - //double particleMass = s_particleMasses.mass[m_particle]; //Get particle mass from ParticleHypothesis - //double totalMomentumLoss = finalMomentum - mom; + double finalMomentum = targetParms->momentum().mag(); // first update to make sure all material counted updateMaterialEffects(finalMomentum, sin(trackParameters->momentum().theta()), path ); - - //Set up curvilinear system in the direction of the initial momentum - //Trk::CurvilinearUVT curvilinearUVT( trackParameters->momentum().normalized()); - + + //Set up curvilinear system + /* variant A Trk::RungeKuttaUtils rungeKuttaUtils; double Jac[21]; rungeKuttaUtils.jacobianTransformCurvilinearToLocal(*targetParms,Jac); - //Calculate tranformation contributions when going from the curvilinear to the local system at the target surface - //takes into accout change of path/eloss for tilted target plane - //commented till recalculated for all surface types - // double E = sqrt( finalMomentum*finalMomentum + particleMass*particleMass); - // double dLambdads = -trackParameters->charge()*(totalMomentumLoss/fabs(path))*E/std::pow(finalMomentum, 3); - // jacobianCurvToLocal(4,0) = -(curvilinearUVT.curvU().dot(localZ))/(curvilinearUVT.curvT().dot(localZ))*dLambdads; - // jacobianCurvToLocal(4,1) = -(curvilinearUVT.curvV().dot(localZ))/(curvilinearUVT.curvT().dot(localZ))*dLambdads; - //Transform multiple scattering and straggling covariance from curvilinear to local system AmgSymMatrix(5)* localMSCov = rungeKuttaUtils.newCovarianceMatrix( Jac, m_combinedCovariance+m_covariance ); - - //Add measurement errors and multiple scattering + straggling covariance *measurementCovariance += *localMSCov; - delete localMSCov; + */ + // variant B + double mom = trackParameters->momentum().mag(); + double particleMass = s_particleMasses.mass[m_particle]; //Get particle mass from ParticleHypothesis + double totalMomentumLoss = finalMomentum - mom; + + //Set up curvilinear system in the direction of the momentum + Trk::CurvilinearUVT curvilinearUVT( targetParms->momentum().normalized()); + + //Set up local system at the target surface + const Amg::Transform3D& surfaceRotation = targetParms->associatedSurface().transform(); + Amg::Vector3D localX( surfaceRotation(0,0), surfaceRotation(1,0), surfaceRotation(2,0) ); + Amg::Vector3D localY( surfaceRotation(0,1), surfaceRotation(1,1), surfaceRotation(2,1) ); + Amg::Vector3D localZ( surfaceRotation(0,2), surfaceRotation(1,2), surfaceRotation(2,2) ); + + //Calculate jacobian for transformation from curvilinear to local system at the target surface + Trk::JacobianCurvilinearToLocal jacobianCurvToLocal( curvilinearUVT, localX, localY, localZ); + + //Calculate tranformation contributions when going from the curvilinear to the local system at the target surface + double E = sqrt( finalMomentum*finalMomentum + particleMass*particleMass); + double dLambdads = -targetParms->charge()*(totalMomentumLoss/fabs(path))*E/std::pow(finalMomentum, 3); + + jacobianCurvToLocal(4,1) = -(curvilinearUVT.curvU().dot(localZ))/(curvilinearUVT.curvT().dot(localZ))*dLambdads; + jacobianCurvToLocal(4,2) = -(curvilinearUVT.curvV().dot(localZ))/(curvilinearUVT.curvT().dot(localZ))*dLambdads; + + //Transform multiple scattering and straggling covariance from curvilinear to local system + AmgSymMatrix(5) localMSCovariance = (m_combinedCovariance+m_covariance).similarity( jacobianCurvToLocal); + + //Add measurement errors and multiple scattering + straggling covariance + *measurementCovariance += localMSCovariance; } /////////////////////////////////////////////////////////////////////////////////////////////////////////