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() ) 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 std::vector<double> Ws = weights(TSoS,propDir);
00031 if ( Ws.empty() ) return TrajectoryStateOnSurface();
00032 std::vector<double> dPs = deltaPs(TSoS,propDir);
00033 if ( dPs.size()!=Ws.size() )
00034 throw cms::Exception("LogicError")
00035 << "GsfMaterialEffectsUpdator: inconsistency in number of components";
00036 std::vector<AlgebraicSymMatrix55> deltaErrors;
00037 if ( TSoS.hasError() )
00038 deltaErrors = deltaLocalErrors(TSoS,propDir);
00039
00040
00041
00042 MultiTrajectoryStateAssembler result;
00043
00044
00045
00046
00047
00048 for ( unsigned int ic=0; ic<Ws.size(); ic++ ) {
00049
00050
00051
00052
00053
00054
00055
00056
00057 LocalTrajectoryParameters lp = TSoS.localParameters();
00058 if ( !lp.updateP(dPs[ic]) )
00059 return TrajectoryStateOnSurface();
00060
00061
00062
00063 if ( TSoS.hasError() ) {
00064 AlgebraicSymMatrix55 eloc = TSoS.localError().matrix();
00065 eloc += deltaErrors[ic];
00066 result.addState(TrajectoryStateOnSurface(lp,
00067 LocalTrajectoryError(eloc),
00068 surface,
00069 &(TSoS.globalParameters().magneticField()),
00070 side,
00071 weight*Ws[ic]));
00072
00073
00074 }
00075 else {
00076 result.addState(TrajectoryStateOnSurface(lp,surface,
00077 &(TSoS.globalParameters().magneticField()),
00078 side));
00079 }
00080 }
00081
00082
00083 return result.combinedState();
00084 }
00085