CMS 3D CMS Logo

DualReferenceTrajectory.cc

Go to the documentation of this file.
00001 
00002 #include "Alignment/ReferenceTrajectories/interface/DualReferenceTrajectory.h"
00003 
00004 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00005 
00006 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h" 
00007 #include "DataFormats/TrajectoryState/interface/LocalTrajectoryParameters.h"
00008 
00009 #include "Alignment/ReferenceTrajectories/interface/ReferenceTrajectory.h"
00010 
00011 
00012 DualReferenceTrajectory::DualReferenceTrajectory( const TrajectoryStateOnSurface &referenceTsos,
00013                                                   const ConstRecHitContainer &forwardRecHits,
00014                                                   const ConstRecHitContainer &backwardRecHits,
00015                                                   const MagneticField *magField,
00016                                                   MaterialEffects materialEffects,
00017                                                   PropagationDirection propDir,
00018                                                   double mass )
00019   : ReferenceTrajectoryBase( referenceTsos.localParameters().mixedFormatVector().kSize,
00020                              numberOfUsedRecHits(forwardRecHits) + numberOfUsedRecHits(backwardRecHits) - 1 )
00021 {
00022   theValidityFlag = this->construct( referenceTsos, forwardRecHits, backwardRecHits,
00023                                      mass, materialEffects, propDir, magField );
00024 }
00025 
00026 
00027 
00028 DualReferenceTrajectory::DualReferenceTrajectory( unsigned int nPar, unsigned int nHits )
00029   : ReferenceTrajectoryBase( nPar, nHits )
00030 {}
00031 
00032 
00033 bool DualReferenceTrajectory::construct( const TrajectoryStateOnSurface &refTsos, 
00034                                          const ConstRecHitContainer &forwardRecHits,
00035                                          const ConstRecHitContainer &backwardRecHits,
00036                                          double mass, MaterialEffects materialEffects,
00037                                          const PropagationDirection propDir,
00038                                          const MagneticField *magField)
00039 {
00040   ReferenceTrajectoryBase* fwdTraj = construct(refTsos, forwardRecHits,
00041                                                mass, materialEffects,
00042                                                propDir, magField);
00043 
00044   ReferenceTrajectoryBase* bwdTraj = construct(refTsos, backwardRecHits,
00045                                                mass, materialEffects,
00046                                                oppositeDirection(propDir), magField);
00047 
00048   if ( !( fwdTraj->isValid() && bwdTraj->isValid() ) )
00049   {
00050     delete fwdTraj;
00051     delete bwdTraj;
00052     return false;
00053   }
00054 
00055   //
00056   // Combine both reference trajactories to a dual reference trajectory
00057   //
00058 
00059   const std::vector<TrajectoryStateOnSurface>& fwdTsosVec = fwdTraj->trajectoryStates();
00060   const std::vector<TrajectoryStateOnSurface>& bwdTsosVec = bwdTraj->trajectoryStates();
00061   theTsosVec.insert( theTsosVec.end(), fwdTsosVec.begin(), fwdTsosVec.end() );
00062   theTsosVec.insert( theTsosVec.end(), ++bwdTsosVec.begin(), bwdTsosVec.end() );
00063 
00064   ConstRecHitContainer fwdRecHits = fwdTraj->recHits();
00065   ConstRecHitContainer bwdRecHits = bwdTraj->recHits();
00066   theRecHits.insert( theRecHits.end(), fwdRecHits.begin(), fwdRecHits.end() );
00067   theRecHits.insert( theRecHits.end(), ++bwdRecHits.begin(), bwdRecHits.end() );
00068 
00069   theParameters = extractParameters( refTsos );
00070 
00071   unsigned int nParam = theParameters.num_row();
00072   unsigned int nFwdMeas = nMeasPerHit*fwdTraj->numberOfHits();
00073   unsigned int nBwdMeas = nMeasPerHit*bwdTraj->numberOfHits();
00074 
00075   theMeasurements.sub( 1, fwdTraj->measurements() );
00076   theMeasurements.sub( nFwdMeas+1, bwdTraj->measurements().sub( nMeasPerHit+1, nBwdMeas ) );
00077 
00078   theMeasurementsCov.sub( 1, fwdTraj->measurementErrors() );
00079   theMeasurementsCov.sub( nFwdMeas+1, bwdTraj->measurementErrors().sub( nMeasPerHit+1, nBwdMeas ) );
00080 
00081   theTrajectoryPositions.sub( 1, fwdTraj->trajectoryPositions() );
00082   theTrajectoryPositions.sub( nFwdMeas+1, bwdTraj->trajectoryPositions().sub( nMeasPerHit+1, nBwdMeas ) );
00083 
00084   theTrajectoryPositionCov.sub( 1, fwdTraj->trajectoryPositionErrors() );
00085   theTrajectoryPositionCov.sub( nFwdMeas+1, bwdTraj->trajectoryPositionErrors().sub( nMeasPerHit+1, nBwdMeas ) );
00086 
00087   theDerivatives.sub( 1, 1, fwdTraj->derivatives() );
00088   theDerivatives.sub( nFwdMeas+1, 1, bwdTraj->derivatives().sub( nMeasPerHit+1, nBwdMeas, 1, nParam ) );
00089 
00090   delete fwdTraj;
00091   delete bwdTraj;
00092 
00093   return true; 
00094 }
00095 
00096 
00097 ReferenceTrajectory*
00098 DualReferenceTrajectory::construct(const TrajectoryStateOnSurface &referenceTsos, 
00099                                    const ConstRecHitContainer &recHits,
00100                                    double mass, MaterialEffects materialEffects,
00101                                    const PropagationDirection propDir,
00102                                    const MagneticField *magField) const
00103 {
00104   return new ReferenceTrajectory(referenceTsos, recHits, false,
00105                                  magField, materialEffects, propDir, mass);
00106 }
00107 
00108 
00109 AlgebraicVector
00110 DualReferenceTrajectory::extractParameters(const TrajectoryStateOnSurface &referenceTsos) const
00111 {
00112   return asHepVector<5>( referenceTsos.localParameters().mixedFormatVector() );
00113 }

Generated on Tue Jun 9 17:24:59 2009 for CMSSW by  doxygen 1.5.4