00001 #include "FWCore/Framework/interface/ESHandle.h"
00002 #include "FWCore/Framework/interface/EventSetup.h"
00003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00006 #include "Alignment/ReferenceTrajectories/interface/TrajectoryFactoryPlugin.h"
00007
00008 #include "ReferenceTrajectoryFactory.h"
00009 #include "Alignment/ReferenceTrajectories/interface/ReferenceTrajectory.h"
00010
00011
00012 ReferenceTrajectoryFactory::ReferenceTrajectoryFactory( const edm::ParameterSet & config ) :
00013 TrajectoryFactoryBase( config )
00014 {
00015 theMass = config.getParameter< double >( "ParticleMass" );
00016 }
00017
00018
00019 ReferenceTrajectoryFactory::~ReferenceTrajectoryFactory( void ) {}
00020
00021
00022 const ReferenceTrajectoryFactory::ReferenceTrajectoryCollection
00023 ReferenceTrajectoryFactory::trajectories( const edm::EventSetup & setup,
00024 const ConstTrajTrackPairCollection & tracks ) const
00025 {
00026 ReferenceTrajectoryCollection trajectories;
00027
00028 edm::ESHandle< MagneticField > magneticField;
00029 setup.get< IdealMagneticFieldRecord >().get( magneticField );
00030
00031 ConstTrajTrackPairCollection::const_iterator itTracks = tracks.begin();
00032
00033 while ( itTracks != tracks.end() )
00034 {
00035 TrajectoryInput input = this->innermostStateAndRecHits( *itTracks );
00036
00037 if ( input.first.isValid() )
00038 {
00039
00040 trajectories.push_back(ReferenceTrajectoryPtr(new ReferenceTrajectory(input.first, input.second, false,
00041 magneticField.product(), materialEffects(),
00042 propagationDirection(), theMass)));
00043 }
00044
00045 ++itTracks;
00046 }
00047
00048 return trajectories;
00049 }
00050
00051
00052 const ReferenceTrajectoryFactory::ReferenceTrajectoryCollection
00053 ReferenceTrajectoryFactory::trajectories( const edm::EventSetup & setup,
00054 const ConstTrajTrackPairCollection& tracks,
00055 const ExternalPredictionCollection& external ) const
00056 {
00057 ReferenceTrajectoryCollection trajectories;
00058
00059 if ( tracks.size() != external.size() )
00060 {
00061 edm::LogInfo("ReferenceTrajectories") << "@SUB=ReferenceTrajectoryFactory::trajectories"
00062 << "Inconsistent input:\n"
00063 << "\tnumber of tracks = " << tracks.size()
00064 << "\tnumber of external predictions = " << external.size();
00065 return trajectories;
00066 }
00067
00068 edm::ESHandle< MagneticField > magneticField;
00069 setup.get< IdealMagneticFieldRecord >().get( magneticField );
00070
00071 ConstTrajTrackPairCollection::const_iterator itTracks = tracks.begin();
00072 ExternalPredictionCollection::const_iterator itExternal = external.begin();
00073
00074 while ( itTracks != tracks.end() )
00075 {
00076 TrajectoryInput input = innermostStateAndRecHits( *itTracks );
00077
00078 if ( input.first.isValid() )
00079 {
00080 if ( (*itExternal).isValid() && sameSurface( (*itExternal).surface(), input.first.surface() ) )
00081 {
00082
00083 ReferenceTrajectoryPtr refTraj( new ReferenceTrajectory( *itExternal, input.second, false,
00084 magneticField.product(), materialEffects(),
00085 propagationDirection(), theMass) );
00086
00087 AlgebraicSymMatrix externalParamErrors( asHepMatrix<5>( (*itExternal).localError().matrix() ) );
00088 refTraj->setParameterErrors( externalParamErrors );
00089
00090 trajectories.push_back( refTraj );
00091 }
00092 else
00093 {
00094 trajectories.push_back(ReferenceTrajectoryPtr(new ReferenceTrajectory(input.first, input.second, false,
00095 magneticField.product(), materialEffects(),
00096 propagationDirection(), theMass)));
00097 }
00098 }
00099
00100 ++itTracks;
00101 ++itExternal;
00102 }
00103
00104 return trajectories;
00105 }
00106
00107
00108 DEFINE_EDM_PLUGIN( TrajectoryFactoryPlugin, ReferenceTrajectoryFactory, "ReferenceTrajectoryFactory" );