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