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
00009 MaterialEffectsUpdator::MaterialEffectsUpdator ( double mass ) :
00010 theMass(mass) {}
00011
00012 MaterialEffectsUpdator::~MaterialEffectsUpdator () {}
00013
00017 TrajectoryStateOnSurface MaterialEffectsUpdator::updateState (const TrajectoryStateOnSurface& TSoS,
00018 const PropagationDirection propDir) const {
00019 TrajectoryStateOnSurface shallowCopy = TSoS;
00020
00021 return updateStateInPlace(shallowCopy, propDir) ? shallowCopy : TrajectoryStateOnSurface();
00022 }
00023
00024
00025
00026
00027
00028
00029
00030 bool MaterialEffectsUpdator::updateStateInPlace (TrajectoryStateOnSurface& TSoS,
00031 const PropagationDirection propDir) const {
00032
00033
00034
00035
00036
00037
00038 const Surface& surface = TSoS.surface();
00039 if ( !surface.mediumProperties().isValid() || propDir==anyDirection ||
00040 TSoS.surfaceSide()==atCenterOfSurface ) return true;
00041
00042
00043
00044 if ( (propDir==alongMomentum && TSoS.surfaceSide()==afterSurface ) ||
00045 (propDir==oppositeToMomentum && TSoS.surfaceSide()==beforeSurface ) ) return true;
00046
00047
00048
00049 LocalTrajectoryParameters lp = TSoS.localParameters();
00050 Effect effect;
00051 compute (TSoS,propDir,effect);
00052 if ( !lp.updateP(effect.deltaP) )
00053 return false;
00054
00055
00056
00057 SurfaceSide side = propDir==alongMomentum ? afterSurface : beforeSurface;
00058 if ( TSoS.hasError() ) {
00059 AlgebraicSymMatrix55 eloc = TSoS.localError().matrix();
00060 effect.deltaCov.add(eloc);
00061
00062 TSoS.update(lp,LocalTrajectoryError(eloc),surface,
00063 &(TSoS.globalParameters().magneticField()),side);
00064 }
00065 else {
00066 TSoS.update(lp,surface,&(TSoS.globalParameters().magneticField()),side);
00067
00068 }
00069 return true;
00070 }
00071
00072