CMS 3D CMS Logo

DualTrajectoryFactory Class Reference

A factory that produces instances of class ReferenceTrajectory from a given TrajTrackPairCollection. More...

#include <Alignment/ReferenceTrajectories/plugins/DualTrajectoryFactory.h>

Inheritance diagram for DualTrajectoryFactory:

TrajectoryFactoryBase

List of all members.

Public Member Functions

virtual DualTrajectoryFactoryclone (void) const
 DualTrajectoryFactory (const edm::ParameterSet &config)
virtual const
ReferenceTrajectoryCollection 
trajectories (const edm::EventSetup &setup, const ConstTrajTrackPairCollection &tracks, const ExternalPredictionCollection &external) const
virtual const
ReferenceTrajectoryCollection 
trajectories (const edm::EventSetup &setup, const ConstTrajTrackPairCollection &tracks) const
 Produce the reference trajectories.
virtual ~DualTrajectoryFactory (void)

Protected Member Functions

const TrajectoryStateOnSurface propagateExternal (const TrajectoryStateOnSurface &external, const Surface &surface, const MagneticField *magField) const
const DualTrajectoryInput referenceStateAndRecHits (const ConstTrajTrackPair &track) const

Protected Attributes

double theMass

Classes

struct  DualTrajectoryInput


Detailed Description

A factory that produces instances of class ReferenceTrajectory from a given TrajTrackPairCollection.

Definition at line 9 of file DualTrajectoryFactory.h.


Constructor & Destructor Documentation

DualTrajectoryFactory::DualTrajectoryFactory ( const edm::ParameterSet config  ) 

Definition at line 16 of file DualTrajectoryFactory.cc.

References edm::ParameterSet::getParameter(), and theMass.

Referenced by clone().

00016                                                                              :
00017   TrajectoryFactoryBase( config )
00018 {
00019   theMass = config.getParameter< double >( "ParticleMass" );
00020 }

DualTrajectoryFactory::~DualTrajectoryFactory ( void   )  [virtual]

Definition at line 23 of file DualTrajectoryFactory.cc.

00023 {}


Member Function Documentation

virtual DualTrajectoryFactory* DualTrajectoryFactory::clone ( void   )  const [inline, virtual]

Implements TrajectoryFactoryBase.

Definition at line 25 of file DualTrajectoryFactory.h.

References DualTrajectoryFactory().

00025 { return new DualTrajectoryFactory( *this ); }

const TrajectoryStateOnSurface DualTrajectoryFactory::propagateExternal ( const TrajectoryStateOnSurface external,
const Surface surface,
const MagneticField magField 
) const [protected]

Definition at line 176 of file DualTrajectoryFactory.cc.

References anyDirection, and AnalyticalPropagator::propagateWithPath().

Referenced by trajectories().

00179 {
00180   AnalyticalPropagator propagator( magField, anyDirection );
00181   const std::pair< TrajectoryStateOnSurface, double > tsosWithPath =
00182     propagator.propagateWithPath( external, surface );
00183   return tsosWithPath.first;
00184 }

const DualTrajectoryFactory::DualTrajectoryInput DualTrajectoryFactory::referenceStateAndRecHits ( const ConstTrajTrackPair track  )  const [protected]

Definition at line 129 of file DualTrajectoryFactory.cc.

References DualTrajectoryFactory::DualTrajectoryInput::bwdRecHits, DualTrajectoryFactory::DualTrajectoryInput::fwdRecHits, iggi_31X_cfg::input, TrajectoryFactoryBase::orderedTrajectoryMeasurements(), DualTrajectoryFactory::DualTrajectoryInput::refTsos, and TrajectoryFactoryBase::useRecHit().

Referenced by trajectories().

00130 {
00131   DualTrajectoryInput input;
00132  
00133   // get the trajectory measurements in the correct order, i.e. reverse if needed
00134   Trajectory::DataContainer allTrajMeas = this->orderedTrajectoryMeasurements( *track.first );
00135   Trajectory::DataContainer usedTrajMeas;
00136   Trajectory::DataContainer::iterator itM;
00137   // get all relevant trajectory measurements
00138   for ( itM = allTrajMeas.begin(); itM != allTrajMeas.end(); itM++ )
00139   {
00140     if ( useRecHit( ( *itM ).recHit() ) ) usedTrajMeas.push_back( *itM );
00141   }
00142 
00143   unsigned int iMeas = 0;
00144   unsigned int nMeas = usedTrajMeas.size();
00145   unsigned int nRefStateMeas = nMeas/2;
00146   // get the valid RecHits
00147   for ( itM = usedTrajMeas.begin(); itM != usedTrajMeas.end(); itM++, iMeas++ )
00148   {
00149     TransientTrackingRecHit::ConstRecHitPointer aRecHit = ( *itM ).recHit();
00150 
00151     if ( iMeas < nRefStateMeas ) {
00152       input.bwdRecHits.push_back( aRecHit );
00153     } else if ( iMeas > nRefStateMeas ) {
00154       input.fwdRecHits.push_back( aRecHit );
00155     } else { // iMeas == nRefStateMeas
00156       if ( ( *itM ).updatedState().isValid() )
00157       {
00158         input.refTsos = ( *itM ).updatedState();
00159         input.bwdRecHits.push_back( aRecHit );
00160         input.fwdRecHits.push_back( aRecHit );
00161       } else {
00162         // if the tsos of the middle hit is not valid, try the next one ...
00163         nRefStateMeas++;
00164         input.bwdRecHits.push_back( aRecHit );
00165       }
00166     }
00167   }
00168 
00169   // bring input.fwdRecHits into correct order
00170   std::reverse( input.bwdRecHits.begin(), input.bwdRecHits.end() );
00171 
00172   return input;
00173 }

const DualTrajectoryFactory::ReferenceTrajectoryCollection DualTrajectoryFactory::trajectories ( const edm::EventSetup setup,
const ConstTrajTrackPairCollection tracks,
const ExternalPredictionCollection external 
) const [virtual]

Definition at line 60 of file DualTrajectoryFactory.cc.

References DualTrajectoryFactory::DualTrajectoryInput::bwdRecHits, DualTrajectoryFactory::DualTrajectoryInput::fwdRecHits, edm::EventSetup::get(), iggi_31X_cfg::input, TrajectoryStateOnSurface::isValid(), TrajectoryStateOnSurface::localError(), TrajectoryFactoryBase::materialEffects(), LocalTrajectoryError::matrix(), edm::ESHandle< T >::product(), propagateExternal(), TrajectoryFactoryBase::propagationDirection(), ptr, referenceStateAndRecHits(), DualTrajectoryFactory::DualTrajectoryInput::refTsos, TrajectoryStateOnSurface::surface(), theMass, and trajectories().

00063 {
00064   ReferenceTrajectoryCollection trajectories;
00065 
00066   if ( tracks.size() != external.size() )
00067   {
00068     edm::LogInfo("ReferenceTrajectories") << "@SUB=DualTrajectoryFactory::trajectories"
00069                                           << "Inconsistent input:\n"
00070                                           << "\tnumber of tracks = " << tracks.size()
00071                                           << "\tnumber of external predictions = " << external.size();
00072     return trajectories;
00073   }
00074 
00075   edm::ESHandle< MagneticField > magneticField;
00076   setup.get< IdealMagneticFieldRecord >().get( magneticField );
00077 
00078   ConstTrajTrackPairCollection::const_iterator itTracks = tracks.begin();
00079   ExternalPredictionCollection::const_iterator itExternal = external.begin();
00080 
00081   while ( itTracks != tracks.end() )
00082   {
00083     const DualTrajectoryInput input = referenceStateAndRecHits( *itTracks );
00084     // Check input: If all hits were rejected, the TSOS is initialized as invalid.
00085     if ( input.refTsos.isValid() )
00086     {
00087       if ( (*itExternal).isValid() )
00088       {
00089         TrajectoryStateOnSurface propExternal =
00090           propagateExternal( *itExternal, input.refTsos.surface(), magneticField.product() );
00091 
00092         if ( !propExternal.isValid() ) continue;
00093 
00094         // set the flag for reversing the RecHits to false, since they are already in the correct order.
00095         ReferenceTrajectoryPtr ptr( new DualReferenceTrajectory( propExternal,
00096                                                                  input.fwdRecHits,
00097                                                                  input.bwdRecHits,
00098                                                                  magneticField.product(),
00099                                                                  materialEffects(),
00100                                                                  propagationDirection(),
00101                                                                  theMass ) );
00102 
00103         AlgebraicSymMatrix externalParamErrors( asHepMatrix<5>( propExternal.localError().matrix() ) );
00104         ptr->setParameterErrors( externalParamErrors );
00105         trajectories.push_back( ptr );
00106       }
00107       else
00108       {
00109         ReferenceTrajectoryPtr ptr( new DualReferenceTrajectory( input.refTsos,
00110                                                                  input.fwdRecHits,
00111                                                                  input.bwdRecHits,
00112                                                                  magneticField.product(),
00113                                                                  materialEffects(),
00114                                                                  propagationDirection(),
00115                                                                  theMass ) );
00116         trajectories.push_back( ptr );
00117       }
00118     }
00119 
00120     ++itTracks;
00121     ++itExternal;
00122   }
00123 
00124   return trajectories;
00125 }

const DualTrajectoryFactory::ReferenceTrajectoryCollection DualTrajectoryFactory::trajectories ( const edm::EventSetup setup,
const ConstTrajTrackPairCollection tracks 
) const [virtual]

Produce the reference trajectories.

Definition at line 27 of file DualTrajectoryFactory.cc.

References DualTrajectoryFactory::DualTrajectoryInput::bwdRecHits, DualTrajectoryFactory::DualTrajectoryInput::fwdRecHits, edm::EventSetup::get(), iggi_31X_cfg::input, TrajectoryStateOnSurface::isValid(), TrajectoryFactoryBase::materialEffects(), edm::ESHandle< T >::product(), TrajectoryFactoryBase::propagationDirection(), ptr, referenceStateAndRecHits(), DualTrajectoryFactory::DualTrajectoryInput::refTsos, and theMass.

Referenced by trajectories().

00029 {
00030   ReferenceTrajectoryCollection trajectories;
00031 
00032   edm::ESHandle< MagneticField > magneticField;
00033   setup.get< IdealMagneticFieldRecord >().get( magneticField );
00034 
00035   ConstTrajTrackPairCollection::const_iterator itTracks = tracks.begin();
00036 
00037   while ( itTracks != tracks.end() )
00038   { 
00039     const DualTrajectoryInput input = this->referenceStateAndRecHits( *itTracks );
00040     // Check input: If all hits were rejected, the TSOS is initialized as invalid.
00041     if ( input.refTsos.isValid() )
00042     {
00043       ReferenceTrajectoryPtr ptr( new DualReferenceTrajectory( input.refTsos,
00044                                                                input.fwdRecHits,
00045                                                                input.bwdRecHits,
00046                                                                magneticField.product(),
00047                                                                materialEffects(),
00048                                                                propagationDirection(),
00049                                                                theMass ) );
00050       trajectories.push_back( ptr );
00051     }
00052 
00053     ++itTracks;
00054   }
00055 
00056   return trajectories;
00057 }


Member Data Documentation

double DualTrajectoryFactory::theMass [protected]

Definition at line 42 of file DualTrajectoryFactory.h.

Referenced by DualTrajectoryFactory(), and trajectories().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:19:13 2009 for CMSSW by  doxygen 1.5.4