File indexing completed on 2024-04-06 12:27:17
0001 #ifndef RecoMuon_TrackingTools_MuonTrajectoryUpdator_H
0002 #define RecoMuon_TrackingTools_MuonTrajectoryUpdator_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
0018 #include "TrackingTools/DetLayers/interface/NavigationDirection.h"
0019
0020 #include <functional>
0021
0022 class Propagator;
0023 class MeasurementEstimator;
0024 class TrajectoryMeasurement;
0025 class Trajectory;
0026 class TrajectoryStateOnSurface;
0027 class TrajectoryStateUpdator;
0028 class DetLayer;
0029
0030 namespace edm {
0031 class ParameterSet;
0032 }
0033
0034 class MuonTrajectoryUpdator {
0035 public:
0036
0037 MuonTrajectoryUpdator(const edm::ParameterSet &par, NavigationDirection fitDirection);
0038
0039
0040 MuonTrajectoryUpdator(NavigationDirection fitDirection, double chi2, int granularity);
0041
0042
0043 virtual ~MuonTrajectoryUpdator();
0044
0045
0046
0047
0048 virtual std::pair<bool, TrajectoryStateOnSurface> update(const TrajectoryMeasurement *measurement,
0049 Trajectory &trajectory,
0050 const Propagator *propagator);
0051
0052
0053 const MeasurementEstimator *estimator() const { return theEstimator; }
0054 const TrajectoryStateUpdator *measurementUpdator() const { return theUpdator; }
0055
0056
0057 double maxChi2() const { return theMaxChi2; }
0058
0059
0060 NavigationDirection fitDirection() { return theFitDirection; }
0061
0062
0063 void setMaxChi2(double chi2) { theMaxChi2 = chi2; }
0064
0065
0066 void setFitDirection(NavigationDirection fitDirection) { theFitDirection = fitDirection; }
0067
0068
0069 void makeFirstTime();
0070
0071 protected:
0072 private:
0073
0074
0075
0076 TrajectoryStateOnSurface propagateState(const TrajectoryStateOnSurface &state,
0077 const TrajectoryMeasurement *measurement,
0078 const TransientTrackingRecHit::ConstRecHitPointer ¤t,
0079 const Propagator *propagator) const;
0080
0081
0082 double theMaxChi2;
0083
0084
0085
0086
0087
0088
0089
0090 int theGranularity;
0091
0092
0093
0094 struct RadiusComparatorInOut {
0095 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
0096 const TransientTrackingRecHit::ConstRecHitPointer &b) const {
0097 return a->det()->surface().position().perp() < b->det()->surface().position().perp();
0098 }
0099 };
0100
0101
0102 struct RadiusComparatorOutIn {
0103 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
0104 const TransientTrackingRecHit::ConstRecHitPointer &b) const {
0105 return a->det()->surface().position().perp() > b->det()->surface().position().perp();
0106 }
0107 };
0108
0109
0110 struct ZedComparatorInOut {
0111 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
0112 const TransientTrackingRecHit::ConstRecHitPointer &b) const {
0113 return fabs(a->globalPosition().z()) < fabs(b->globalPosition().z());
0114 }
0115 };
0116
0117
0118 struct ZedComparatorOutIn {
0119 bool operator()(const TransientTrackingRecHit::ConstRecHitPointer &a,
0120 const TransientTrackingRecHit::ConstRecHitPointer &b) const {
0121 return fabs(a->globalPosition().z()) > fabs(b->globalPosition().z());
0122 }
0123 };
0124
0125 void sort(TransientTrackingRecHit::ConstRecHitContainer &, const DetLayer *);
0126
0127
0128 TrajectoryMeasurement updateMeasurement(const TrajectoryStateOnSurface &propagatedTSOS,
0129 const TrajectoryStateOnSurface &lastUpdatedTSOS,
0130 const TransientTrackingRecHit::ConstRecHitPointer &recHit,
0131 const double &chi2,
0132 const DetLayer *detLayer,
0133 const TrajectoryMeasurement *initialMeasurement);
0134
0135
0136 MeasurementEstimator *theEstimator;
0137 TrajectoryStateUpdator *theUpdator;
0138
0139
0140
0141
0142 NavigationDirection theFitDirection;
0143
0144
0145 bool theFirstTSOSFlag;
0146 bool theRescaleErrorFlag;
0147 double theRescaleFactor;
0148
0149
0150 bool useInvalidHits;
0151
0152 bool theRPCExFlag;
0153 };
0154 #endif