Go to the documentation of this file.00001 #include "TrackingTools/GsfTracking/interface/GsfMaterialEffectsUpdator.h"
00002
00003 #include "TrackingTools/GsfTools/interface/MultiTrajectoryStateAssembler.h"
00004 #include "TrackingTools/TrajectoryState/interface/SurfaceSideDefinition.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 #include "FWCore/Utilities/interface/Exception.h"
00007
00008
00009
00010
00011
00012 using namespace SurfaceSideDefinition;
00013
00014 TrajectoryStateOnSurface
00015 GsfMaterialEffectsUpdator::updateState (const TrajectoryStateOnSurface& TSoS,
00016 const PropagationDirection propDir) const {
00017
00018
00019
00020 const Surface& surface = TSoS.surface();
00021 if ( !surface.mediumProperties().isValid() ) return TSoS;
00022 SurfaceSide side = propDir==alongMomentum ? afterSurface : beforeSurface;
00023
00024 if ( TSoS.components().size()>1 )
00025 throw cms::Exception("LogicError") << "GsfMaterialEffectsUpdator::updateState used with MultiTSOS";
00026 double weight = TSoS.weight();
00027
00028
00029
00030 Effect effects[size()];
00031 compute(TSoS,propDir,effects);
00032
00033
00034
00035
00036 MultiTrajectoryStateAssembler result;
00037
00038
00039
00040
00041
00042 for ( auto const & effect : effects ) {
00043
00044
00045
00046
00047
00048
00049
00050
00051 LocalTrajectoryParameters lp = TSoS.localParameters();
00052 if ( !lp.updateP(effect.deltaP) )
00053 return TrajectoryStateOnSurface();
00054
00055
00056
00057 if ( TSoS.hasError() ) {
00058 AlgebraicSymMatrix55 eloc = TSoS.localError().matrix();
00059 effect.deltaCov.add(eloc);
00060 result.addState(TrajectoryStateOnSurface(lp,
00061 LocalTrajectoryError(eloc),
00062 surface,
00063 &(TSoS.globalParameters().magneticField()),
00064 side,
00065 weight*effect.weight));
00066
00067
00068 }
00069 else {
00070 result.addState(TrajectoryStateOnSurface(lp,surface,
00071 &(TSoS.globalParameters().magneticField()),
00072 side));
00073 }
00074 }
00075
00076
00077 return result.combinedState();
00078 }
00079