File indexing completed on 2024-04-06 12:28:58
0001 #ifndef TrackProducerAlgorithm_h
0002 #define TrackProducerAlgorithm_h
0003
0004
0005
0006
0007
0008
0009
0010 #include "AlgoProductTraits.h"
0011
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
0015 #include "DataFormats/TrackReco/interface/Track.h"
0016 #include "DataFormats/TrackReco/interface/TrackExtra.h"
0017 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
0018 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
0019 #include "TrackingTools/PatternTools/interface/TrackConstraintAssociation.h"
0020 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0021 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
0022 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
0023
0024 class MagneticField;
0025 class TrackingGeometry;
0026 class Propagator;
0027 class Trajectory;
0028 class TrajectoryStateOnSurface;
0029
0030 struct FitterCloner {
0031 std::unique_ptr<TrajectoryFitter> fitter;
0032 TkClonerImpl hitCloner;
0033
0034 FitterCloner(const TrajectoryFitter *theFitter, const TransientTrackingRecHitBuilder *builder)
0035 : fitter(theFitter->clone()),
0036 hitCloner(static_cast<TkTransientTrackingRecHitBuilder const *>(builder)->cloner()) {
0037 fitter->setHitCloner(&hitCloner);
0038 }
0039 };
0040
0041 template <class T>
0042 class TrackProducerAlgorithm : public AlgoProductTraits<T> {
0043 public:
0044 using Base = AlgoProductTraits<T>;
0045 using TrackCollection = typename Base::TrackCollection;
0046 using TrackView = typename Base::TrackView;
0047 using AlgoProductCollection = typename Base::AlgoProductCollection;
0048
0049 using SeedRef = edm::RefToBase<TrajectorySeed>;
0050 using VtxConstraintAssociationCollection =
0051 edm::AssociationMap<edm::OneToOne<std::vector<T>, std::vector<VertexConstraint> > >;
0052
0053 public:
0054
0055 TrackProducerAlgorithm(const edm::ParameterSet &conf)
0056 : algo_(reco::TrackBase::algoByName(conf.getParameter<std::string>("AlgorithmName"))),
0057 originalAlgo_(reco::TrackBase::undefAlgorithm),
0058 stopReason_(0),
0059 reMatchSplitHits_(false),
0060 usePropagatorForPCA_(false) {
0061 geometricInnerState_ = (conf.exists("GeometricInnerState") ? conf.getParameter<bool>("GeometricInnerState") : true);
0062 if (conf.exists("reMatchSplitHits"))
0063 reMatchSplitHits_ = conf.getParameter<bool>("reMatchSplitHits");
0064 if (conf.exists("usePropagatorForPCA"))
0065 usePropagatorForPCA_ = conf.getParameter<bool>("usePropagatorForPCA");
0066 }
0067
0068
0069 ~TrackProducerAlgorithm() {}
0070
0071
0072 void runWithCandidate(const TrackingGeometry *,
0073 const MagneticField *,
0074 const TrackCandidateCollection &,
0075 const TrajectoryFitter *,
0076 const Propagator *,
0077 const TransientTrackingRecHitBuilder *,
0078 const reco::BeamSpot &,
0079 AlgoProductCollection &);
0080
0081
0082 void runWithTrack(const TrackingGeometry *,
0083 const MagneticField *,
0084 const TrackView &,
0085 const TrajectoryFitter *,
0086 const Propagator *,
0087 const TransientTrackingRecHitBuilder *,
0088 const reco::BeamSpot &,
0089 AlgoProductCollection &);
0090
0091
0092 void runWithMomentum(const TrackingGeometry *,
0093 const MagneticField *,
0094 const TrackMomConstraintAssociationCollection &,
0095 const TrajectoryFitter *,
0096 const Propagator *,
0097 const TransientTrackingRecHitBuilder *,
0098 const reco::BeamSpot &,
0099 AlgoProductCollection &);
0100
0101
0102
0103 void runWithVertex(const TrackingGeometry *,
0104 const MagneticField *,
0105 const VtxConstraintAssociationCollection &,
0106 const TrajectoryFitter *,
0107 const Propagator *,
0108 const TransientTrackingRecHitBuilder *,
0109 const reco::BeamSpot &,
0110 AlgoProductCollection &);
0111
0112
0113
0114 void runWithTrackParameters(const TrackingGeometry *,
0115 const MagneticField *,
0116 const TrackParamConstraintAssociationCollection &,
0117 const TrajectoryFitter *,
0118 const Propagator *,
0119 const TransientTrackingRecHitBuilder *,
0120 const reco::BeamSpot &,
0121 AlgoProductCollection &);
0122
0123
0124 bool buildTrack(const TrajectoryFitter *,
0125 const Propagator *,
0126 AlgoProductCollection &,
0127 TransientTrackingRecHit::RecHitContainer &,
0128 TrajectoryStateOnSurface &,
0129 const TrajectorySeed &,
0130 float,
0131 const reco::BeamSpot &,
0132 SeedRef seedRef = SeedRef(),
0133 int qualityMask = 0,
0134 signed char nLoops = 0);
0135
0136 private:
0137 reco::TrackBase::TrackAlgorithm algo_;
0138 reco::TrackBase::TrackAlgorithm originalAlgo_;
0139 reco::TrackBase::AlgoMask algoMask_;
0140 uint8_t stopReason_;
0141
0142 bool reMatchSplitHits_;
0143 bool geometricInnerState_;
0144 bool usePropagatorForPCA_;
0145
0146 TrajectoryStateOnSurface getInitialState(const T *theT,
0147 TransientTrackingRecHit::RecHitContainer &hits,
0148 const TrackingGeometry *theG,
0149 const MagneticField *theMF);
0150 };
0151
0152 #include "RecoTracker/TrackProducer/interface/TrackProducerAlgorithm.icc"
0153
0154 template <>
0155 bool TrackProducerAlgorithm<reco::Track>::buildTrack(const TrajectoryFitter *,
0156 const Propagator *,
0157 AlgoProductCollection &,
0158 TransientTrackingRecHit::RecHitContainer &,
0159 TrajectoryStateOnSurface &,
0160 const TrajectorySeed &,
0161 float,
0162 const reco::BeamSpot &,
0163 SeedRef seedRef,
0164 int qualityMask,
0165 signed char nLoops);
0166
0167 template <>
0168 bool TrackProducerAlgorithm<reco::GsfTrack>::buildTrack(const TrajectoryFitter *,
0169 const Propagator *,
0170 AlgoProductCollection &,
0171 TransientTrackingRecHit::RecHitContainer &,
0172 TrajectoryStateOnSurface &,
0173 const TrajectorySeed &,
0174 float,
0175 const reco::BeamSpot &,
0176 SeedRef seedRef,
0177 int qualityMask,
0178 signed char nLoops);
0179
0180 #endif