Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-18 03:42:22

0001 #ifndef TrackProducerAlgorithm_h
0002 #define TrackProducerAlgorithm_h
0003 
0004 /** \class TrackProducerAlgorithm
0005  *  This class calls the Final Fit and builds the Tracks then produced by the TrackProducer or by the TrackRefitter
0006  *
0007  *  \author cerati
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   /// Constructor
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   /// Destructor
0073   ~TrackProducerAlgorithm() {}
0074 
0075   /// Run the Final Fit taking TrackCandidates as input
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   /// Run the Final Fit taking Tracks as input (for Refitter)
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   /// Run the Final Fit taking TrackMomConstraintAssociation as input (Refitter with momentum constraint)
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   /// Run the Final Fit taking TrackVtxConstraintAssociation as input (Refitter with vertex constraint)
0106   ///   currently hit sorting is disabled - will work (only) with standard tracks
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   /// Run the Final Fit taking TrackParamConstraintAssociation as input (Refitter with complete track parameters constraint)
0117   ///   currently hit sorting is disabled - will work (only) with standard tracks
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   /// Construct Tracks to be put in the event
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