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
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 }