Go to the documentation of this file.00001 #include "TrackingTools/GsfTracking/interface/TsosGaussianStateConversions.h"
00002
00003 #include "TrackingTools/GsfTools/interface/SingleGaussianState.h"
00004 #include "TrackingTools/GsfTools/interface/BasicMultiTrajectoryState.h"
00005 #include "boost/shared_ptr.hpp"
00006
00007 using namespace SurfaceSideDefinition;
00008
00009 namespace GaussianStateConversions {
00010
00011 MultiGaussianState<5> multiGaussianStateFromTSOS (const TrajectoryStateOnSurface tsos)
00012 {
00013 if ( !tsos.isValid() ) return MultiGaussianState<5>();
00014
00015 typedef boost::shared_ptr< SingleGaussianState<5> > SingleStatePtr;
00016 const std::vector<TrajectoryStateOnSurface>& components = tsos.components();
00017 MultiGaussianState<5>::SingleStateContainer singleStates;
00018 singleStates.reserve(components.size());
00019 for ( std::vector<TrajectoryStateOnSurface>::const_iterator ic=components.begin();
00020 ic!=components.end(); ic ++ ) {
00021 if ( ic->isValid() ) {
00022 SingleStatePtr sgs(new SingleGaussianState<5>(ic->localParameters().vector(),
00023 ic->localError().matrix(),
00024 ic->weight()));
00025 singleStates.push_back(sgs);
00026 }
00027 }
00028 return MultiGaussianState<5>(singleStates);
00029 }
00030
00031 TrajectoryStateOnSurface tsosFromMultiGaussianState (const MultiGaussianState<5>& multiState,
00032 const TrajectoryStateOnSurface refTsos)
00033 {
00034 if ( multiState.components().empty() ) return TrajectoryStateOnSurface();
00035 const Surface& surface = refTsos.surface();
00036 SurfaceSide side = refTsos.surfaceSide();
00037 const MagneticField* field = refTsos.magneticField();
00038 TrajectoryStateOnSurface refTsos1 = refTsos.components().front();
00039 double pzSign = refTsos1.localParameters().pzSign();
00040 bool charged = refTsos1.charge()!=0;
00041
00042 const MultiGaussianState<5>::SingleStateContainer& singleStates =
00043 multiState.components();
00044 std::vector<TrajectoryStateOnSurface> components;
00045 components.reserve(singleStates.size());
00046 for ( MultiGaussianState<5>::SingleStateContainer::const_iterator ic=singleStates.begin();
00047 ic!=singleStates.end(); ic++ ) {
00048 components.push_back(TrajectoryStateOnSurface(LocalTrajectoryParameters((**ic).mean(),
00049 pzSign,charged),
00050 LocalTrajectoryError((**ic).covariance()),
00051 surface,field,side,(**ic).weight()));
00052 }
00053 return TrajectoryStateOnSurface(new BasicMultiTrajectoryState(components));
00054 }
00055 }
00056