Go to the documentation of this file.00001 #include "TrackingTools/TrajectoryState/interface/SurfaceSideDefinition.h"
00002 #include "TrackingTools/MaterialEffects/interface/MaterialEffectsUpdator.h"
00003
00004 using namespace SurfaceSideDefinition;
00005
00006
00007 AlgebraicSymMatrix55 MaterialEffectsUpdator::theNullMatrix;
00008
00009
00010
00013 MaterialEffectsUpdator::MaterialEffectsUpdator ( double mass ) :
00014 theMass(mass),
00015 theLastOverP(0),
00016 theLastDxdz(0),
00017 theLastRL(0),
00018 theLastPropDir(anyDirection),
00019 theDeltaP(0.),
00020 theDeltaCov() {}
00021
00022 MaterialEffectsUpdator::~MaterialEffectsUpdator () {}
00023
00027 TrajectoryStateOnSurface MaterialEffectsUpdator::updateState (const TrajectoryStateOnSurface& TSoS,
00028 const PropagationDirection propDir) const {
00029 TrajectoryStateOnSurface shallowCopy = TSoS;
00030
00031 return updateStateInPlace(shallowCopy, propDir) ? shallowCopy : TrajectoryStateOnSurface();
00032 }
00033
00034
00037 double MaterialEffectsUpdator::deltaP (const TrajectoryStateOnSurface& TSoS, const PropagationDirection propDir) const {
00038
00039 if ( !TSoS.surface().mediumProperties() ) return 0.;
00040
00041 if ( newArguments(TSoS,propDir) ) compute(TSoS,propDir);
00042 return theDeltaP;
00043 }
00044
00045
00048 const AlgebraicSymMatrix55 & MaterialEffectsUpdator::deltaLocalError (const TrajectoryStateOnSurface& TSoS,
00049 const PropagationDirection propDir) const {
00050
00051 if ( !TSoS.surface().mediumProperties() ) return theNullMatrix;
00052
00053 if ( newArguments(TSoS,propDir) ) compute(TSoS,propDir);
00054 return theDeltaCov;
00055 }
00056
00057
00058
00059
00060
00061
00062 bool MaterialEffectsUpdator::updateStateInPlace (TrajectoryStateOnSurface& TSoS,
00063 const PropagationDirection propDir) const {
00064
00065
00066
00067
00068
00069
00070 const Surface& surface = TSoS.surface();
00071 if ( !surface.mediumProperties() || propDir==anyDirection ||
00072 TSoS.surfaceSide()==atCenterOfSurface ) return true;
00073
00074
00075
00076 if ( (propDir==alongMomentum && TSoS.surfaceSide()==afterSurface ) ||
00077 (propDir==oppositeToMomentum && TSoS.surfaceSide()==beforeSurface ) ) return true;
00078
00079
00080
00081 LocalTrajectoryParameters lp = TSoS.localParameters();
00082 if ( !lp.updateP(deltaP(TSoS,propDir)) )
00083 return false;
00084
00085
00086
00087 SurfaceSide side = propDir==alongMomentum ? afterSurface : beforeSurface;
00088 if ( TSoS.hasError() ) {
00089 AlgebraicSymMatrix55 eloc = TSoS.localError().matrix() + deltaLocalError(TSoS,propDir);
00090
00091 TSoS.update(lp,LocalTrajectoryError(eloc),surface,
00092 &(TSoS.globalParameters().magneticField()),side);
00093 }
00094 else {
00095 TSoS.update(lp,surface,&(TSoS.globalParameters().magneticField()),side);
00096
00097 }
00098 return true;
00099 }
00100
00101 bool MaterialEffectsUpdator::newArguments (const TrajectoryStateOnSurface & TSoS, PropagationDirection propDir) const {
00102
00103
00104
00105 bool ok =
00106 theLastOverP != TSoS.localParameters().qbp() ||
00107 theLastDxdz != TSoS.localParameters().dxdz() ||
00108 theLastRL != TSoS.surface().mediumProperties()->radLen() ||
00109 theLastPropDir != propDir;
00110 if (ok) {
00111 theLastOverP = TSoS.localParameters().qbp();
00112 theLastDxdz = TSoS.localParameters().dxdz();
00113 theLastRL = TSoS.surface().mediumProperties()->radLen();
00114 theLastPropDir = propDir;
00115 }
00116 return ok;
00117 }
00118