CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/Alignment/ReferenceTrajectories/src/TrajectoryFactoryBase.cc

Go to the documentation of this file.
00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00003 #include "FWCore/Utilities/interface/Exception.h"
00004 
00005 #include "RecoTracker/TransientTrackingRecHit/interface/ProjectedRecHit2D.h"
00006 
00007 #include "Alignment/ReferenceTrajectories/interface/TrajectoryFactoryBase.h"
00008 
00009 
00010 TrajectoryFactoryBase::TrajectoryFactoryBase( const edm::ParameterSet & config )
00011 {
00012   const std::string strMaterialEffects = config.getParameter< std::string >( "MaterialEffects" );
00013   theMaterialEffects = this->materialEffects( strMaterialEffects );
00014   
00015   const std::string strPropagationDirection = config.getParameter< std::string >( "PropagationDirection" );
00016   thePropDir = this->propagationDirection( strPropagationDirection );
00017 
00018   theUseWithoutDet = config.getParameter< bool >( "UseHitWithoutDet" );
00019   theUseInvalidHits = config.getParameter< bool >( "UseInvalidHits" );
00020   theUseProjectedHits = config.getParameter< bool >( "UseProjectedHits" );
00021   theUseBeamSpot = config.getParameter< bool >( "UseBeamSpot" );
00022 }
00023 
00024 
00025 TrajectoryFactoryBase::~TrajectoryFactoryBase( void ) {}
00026 
00027 
00028 const TrajectoryFactoryBase::TrajectoryInput
00029 TrajectoryFactoryBase::innermostStateAndRecHits( const ConstTrajTrackPair & track ) const
00030 {
00031   TrajectoryInput result;
00032 
00033   // get the trajectory measurements in the correct order, i.e. reverse if needed
00034   Trajectory::DataContainer trajectoryMeasurements 
00035     = this->orderedTrajectoryMeasurements( *track.first );
00036   Trajectory::DataContainer::iterator itM = trajectoryMeasurements.begin();
00037 
00038   // get the innermost valid trajectory state - the corresponding hit must be o.k. as well
00039   while ( itM != trajectoryMeasurements.end() )
00040   {
00041     if ( ( *itM ).updatedState().isValid() && useRecHit( ( *itM ).recHit() ) ) break;
00042     ++itM;
00043   }
00044   if ( itM != trajectoryMeasurements.end() ) result.first = ( *itM ).updatedState();
00045 
00046   // get the valid RecHits
00047   while ( itM != trajectoryMeasurements.end() )
00048   {
00049     TransientTrackingRecHit::ConstRecHitPointer aRecHit = ( *itM ).recHit();
00050     if ( useRecHit( aRecHit ) ) result.second.push_back( aRecHit );
00051     ++itM;
00052   }
00053 
00054   return result;
00055 }
00056 
00057 
00058 const Trajectory::DataContainer
00059 TrajectoryFactoryBase::orderedTrajectoryMeasurements( const Trajectory & trajectory ) const
00060 {
00061   const PropagationDirection dir = trajectory.direction();
00062   const bool hitsAreReverse = ( ( dir == thePropDir || thePropDir == anyDirection ) ? false : true );
00063 
00064   const Trajectory::DataContainer & original = trajectory.measurements();
00065 
00066   if ( hitsAreReverse )
00067   {
00068     // Simply use this line instead of the copying by hand?
00069     // const Trajectory::DataContainer reordered(original.rbegin(), original.rend());
00070     Trajectory::DataContainer reordered;
00071     reordered.reserve( original.size() );
00072 
00073     Trajectory::DataContainer::const_reverse_iterator itM;
00074     for ( itM = original.rbegin(); itM != original.rend(); ++itM )
00075     {
00076       reordered.push_back( *itM );
00077     }
00078     return reordered;
00079   }
00080 
00081   return original;
00082 }
00083 
00084 
00085 bool TrajectoryFactoryBase::sameSurface( const Surface& s1, const Surface& s2 ) const
00086 {
00087   // - Should use perp2() instead of perp()
00088   // - Should not rely on floating point equality, but make a minimal range, e.g. 1.e-6 ?
00089   return ( s1.eta() == s2.eta() ) && ( s1.phi() == s2.phi() ) && ( s1.position().perp() == s2.position().perp() );
00090 }
00091 
00092 
00093 bool
00094 TrajectoryFactoryBase::useRecHit( const TransientTrackingRecHit::ConstRecHitPointer& hitPtr ) const
00095 {
00096   const GeomDet* det = hitPtr->det();
00097   if ( !det && !theUseWithoutDet ) return false;
00098   
00099   if ( !( theUseInvalidHits || hitPtr->isValid() ) ) return false;
00100 
00101   if ( !theUseProjectedHits )
00102   {
00103     const ProjectedRecHit2D* projectedHit = dynamic_cast< const ProjectedRecHit2D* >( hitPtr.get() );
00104     if ( projectedHit != 0 ) return false;
00105   }
00106 
00107   return true;
00108 }
00109 
00110 
00111 TrajectoryFactoryBase::MaterialEffects
00112 TrajectoryFactoryBase::materialEffects( const std::string & strME ) const
00113 {
00114   if ( strME == "MultipleScattering" ) return ReferenceTrajectoryBase::multipleScattering;
00115   if ( strME == "EnergyLoss" ) return ReferenceTrajectoryBase::energyLoss;
00116   if ( strME == "Combined" ) return ReferenceTrajectoryBase::combined;
00117   if ( strME == "None" ) return ReferenceTrajectoryBase::none;
00118   if ( strME == "BreakPoints" ) return ReferenceTrajectoryBase::breakPoints;
00119   if ( strME == "BrokenLines" ) return ReferenceTrajectoryBase::brokenLinesCoarse;
00120   if ( strME == "BrokenLinesCoarse" ) return ReferenceTrajectoryBase::brokenLinesCoarse;
00121   if ( strME == "BrokenLinesFine" ) return ReferenceTrajectoryBase::brokenLinesFine;
00122           
00123   throw cms::Exception("BadConfig")
00124     << "[TrajectoryFactoryBase::materialEffects] Unknown parameter: " << strME;
00125 }
00126 
00127 
00128 PropagationDirection
00129 TrajectoryFactoryBase::propagationDirection( const std::string & strPD ) const
00130 {
00131   if ( strPD == "oppositeToMomentum" ) return oppositeToMomentum;
00132   if ( strPD == "alongMomentum" ) return alongMomentum;
00133   if ( strPD == "anyDirection" ) return anyDirection;
00134 
00135   throw cms::Exception("BadConfig")
00136     << "[TrajectoryFactoryBase::propagationDirection] Unknown parameter: " << strPD;
00137 }