Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-23 03:13:32

0001 #ifndef RecoTracker_CkfPattern_BaseCkfTrajectoryBuilder_h
0002 #define RecoTracker_CkfPattern_BaseCkfTrajectoryBuilder_h
0003 
0004 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
0005 #include "TrackingTools/PatternTools/interface/TrajectoryBuilder.h"
0006 #include "FWCore/Framework/interface/ConsumesCollector.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0010 #include "FWCore/Utilities/interface/ESGetToken.h"
0011 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
0012 
0013 #include <cassert>
0014 #include "TrackingTools/PatternTools/interface/TempTrajectory.h"
0015 
0016 class CkfDebugger;
0017 class Chi2MeasurementEstimatorBase;
0018 class DetGroup;
0019 class FreeTrajectoryState;
0020 class IntermediateTrajectoryCleaner;
0021 class LayerMeasurements;
0022 class MeasurementTracker;
0023 class MeasurementTrackerEvent;
0024 class MeasurementEstimator;
0025 class NavigationSchool;
0026 class Propagator;
0027 class TrajectoryStateUpdator;
0028 class TrajectoryMeasurement;
0029 class TrajectoryContainer;
0030 class TrajectoryStateOnSurface;
0031 class TrajectoryFitter;
0032 class TransientRecHitRecord;
0033 class TransientTrackingRecHitBuilder;
0034 class Trajectory;
0035 class TempTrajectory;
0036 class TrajectoryFilter;
0037 class TrackingRegion;
0038 class TrajectoryMeasurementGroup;
0039 class TrajectoryCleaner;
0040 class TrackingComponentsRecord;
0041 namespace edm {
0042   class ConsumesCollector;
0043 }
0044 
0045 #include "RecoTracker/CkfPattern/interface/PrintoutHelper.h"
0046 
0047 #include <string>
0048 
0049 /** The component of track reconstruction that, strating from a seed,
0050  *  reconstructs all possible trajectories.
0051  *  The resulting trajectories may be mutually exclusive and require
0052  *  cleaning by a TrajectoryCleaner.
0053  *  The Trajectories are normally not smoothed.
0054  */
0055 
0056 class BaseCkfTrajectoryBuilder : public TrajectoryBuilder {
0057 protected:
0058   // short names
0059   typedef FreeTrajectoryState FTS;
0060   typedef TrajectoryStateOnSurface TSOS;
0061   typedef TrajectoryMeasurement TM;
0062   typedef std::pair<TSOS, std::vector<const DetLayer*> > StateAndLayers;
0063 
0064 public:
0065   typedef std::vector<Trajectory> TrajectoryContainer;
0066   typedef std::vector<TempTrajectory> TempTrajectoryContainer;
0067   typedef TrajectoryContainer::iterator TrajectoryIterator;
0068 
0069   // Claims ownership of TrajectoryFilter pointers
0070   BaseCkfTrajectoryBuilder(const edm::ParameterSet& conf,
0071                            edm::ConsumesCollector iC,
0072                            std::unique_ptr<TrajectoryFilter> filter,
0073                            std::unique_ptr<TrajectoryFilter> inOutFilter = nullptr);
0074   BaseCkfTrajectoryBuilder(const BaseCkfTrajectoryBuilder&) = delete;
0075   BaseCkfTrajectoryBuilder& operator=(const BaseCkfTrajectoryBuilder&) = delete;
0076   ~BaseCkfTrajectoryBuilder() override;
0077 
0078   static void fillPSetDescription(edm::ParameterSetDescription& iDesc);
0079 
0080   virtual void buildTrajectories(const TrajectorySeed& seed,
0081                                  TrajectoryContainer& ret,
0082                                  unsigned int& nCandPerSeed,
0083                                  const TrajectoryFilter*) const {
0084     assert(0 == 1);
0085   }
0086 
0087   virtual void rebuildTrajectories(const TrajectorySeed& seed, TrajectoryContainer& result) const { assert(0 == 1); }
0088 
0089   void setNavigationSchool(NavigationSchool const* nv) { theNavigationSchool = nv; }
0090 
0091   void setEvent(const edm::Event& event) const override;
0092   void unset() const override;
0093 
0094   void setEvent(const edm::Event& iEvent, const edm::EventSetup& iSetup, const MeasurementTrackerEvent* data);
0095 
0096   virtual void setDebugger(CkfDebugger* dbg) const { ; }
0097 
0098   /** Maximum number of lost hits per trajectory candidate. */
0099   //  int       maxLostHit()        {return theMaxLostHit;}
0100 
0101   /** Maximum number of consecutive lost hits per trajectory candidate. */
0102   //  int       maxConsecLostHit()  {return theMaxConsecLostHit;}
0103 
0104   const TransientTrackingRecHitBuilder* hitBuilder() const { return theTTRHBuilder; }
0105 
0106 protected:
0107   static std::unique_ptr<TrajectoryFilter> createTrajectoryFilter(const edm::ParameterSet& pset,
0108                                                                   edm::ConsumesCollector& iC);
0109 
0110   virtual void setEvent_(const edm::Event& iEvent, const edm::EventSetup& iSetup) = 0;
0111 
0112   //methods for dubugging
0113   virtual bool analyzeMeasurementsDebugger(Trajectory& traj,
0114                                            const std::vector<TrajectoryMeasurement>& meas,
0115                                            const MeasurementTrackerEvent* theMeasurementTracker,
0116                                            const Propagator* theForwardPropagator,
0117                                            const Chi2MeasurementEstimatorBase* theEstimator,
0118                                            const TransientTrackingRecHitBuilder* theTTRHBuilder) const {
0119     return true;
0120   }
0121   virtual bool analyzeMeasurementsDebugger(TempTrajectory& traj,
0122                                            const std::vector<TrajectoryMeasurement>& meas,
0123                                            const MeasurementTrackerEvent* theMeasurementTracker,
0124                                            const Propagator* theForwardPropagator,
0125                                            const Chi2MeasurementEstimatorBase* theEstimator,
0126                                            const TransientTrackingRecHitBuilder* theTTRHBuilder) const {
0127     return true;
0128   }
0129   virtual void fillSeedHistoDebugger(std::vector<TrajectoryMeasurement>::iterator begin,
0130                                      std::vector<TrajectoryMeasurement>::iterator end) const {
0131     ;
0132   }
0133 
0134 protected:
0135   TempTrajectory createStartingTrajectory(const TrajectorySeed& seed) const;
0136 
0137   /** Called after each new hit is added to the trajectory, to see if building this track should be continued */
0138   // If inOut is true, this is being called part-way through tracking, after the in-out tracking phase is complete.
0139   // If inOut is false, it is called at the end of tracking.
0140   bool toBeContinued(TempTrajectory& traj, bool inOut = false) const;
0141 
0142   /** Called at end of track building, to see if track should be kept */
0143   bool qualityFilter(const TempTrajectory& traj, bool inOut = false) const;
0144 
0145   void addToResult(std::shared_ptr<const TrajectorySeed> const& seed,
0146                    TempTrajectory& traj,
0147                    TrajectoryContainer& result,
0148                    bool inOut = false) const;
0149   void addToResult(TempTrajectory const& traj, TempTrajectoryContainer& result, bool inOut = false) const;
0150   void moveToResult(TempTrajectory&& traj, TempTrajectoryContainer& result, bool inOut = false) const;
0151 
0152   StateAndLayers findStateAndLayers(const TrajectorySeed& seed, const TempTrajectory& traj) const;
0153 
0154 private:
0155   void seedMeasurements(const TrajectorySeed& seed, TempTrajectory& result, bool as5D) const;
0156 
0157 protected:
0158   void setData(const MeasurementTrackerEvent* data);
0159 
0160   const Propagator* forwardPropagator(const TrajectorySeed& seed) const {
0161     return seed.direction() == alongMomentum ? thePropagatorAlong : thePropagatorOpposite;
0162   }
0163   const Propagator* backwardPropagator(const TrajectorySeed& seed) const {
0164     return seed.direction() == alongMomentum ? thePropagatorOpposite : thePropagatorAlong;
0165   }
0166 
0167 protected:
0168   typedef TrackingComponentsRecord Chi2MeasurementEstimatorRecord;
0169 
0170   const TrajectoryStateUpdator* theUpdator = nullptr;
0171   const Propagator* thePropagatorAlong = nullptr;
0172   const Propagator* thePropagatorOpposite = nullptr;
0173   const Chi2MeasurementEstimatorBase* theEstimator = nullptr;
0174   const TransientTrackingRecHitBuilder* theTTRHBuilder = nullptr;
0175   const MeasurementTrackerEvent* theMeasurementTracker = nullptr;
0176   const NavigationSchool* theNavigationSchool = nullptr;
0177 
0178 private:
0179   bool theSeedAs5DHit;
0180 
0181   std::unique_ptr<TrajectoryFilter> theFilter;      /** Filter used at end of complete tracking */
0182   std::unique_ptr<TrajectoryFilter> theInOutFilter; /** Filter used at end of in-out tracking */
0183 
0184   // for EventSetup
0185   const edm::ESGetToken<TrajectoryStateUpdator, TrackingComponentsRecord> theUpdatorToken;
0186   const edm::ESGetToken<Propagator, TrackingComponentsRecord> thePropagatorAlongToken;
0187   const edm::ESGetToken<Propagator, TrackingComponentsRecord> thePropagatorOppositeToken;
0188   const edm::ESGetToken<Chi2MeasurementEstimatorBase, TrackingComponentsRecord> theEstimatorToken;
0189   const edm::ESGetToken<TransientTrackingRecHitBuilder, TransientRecHitRecord> theRecHitBuilderToken;
0190 };
0191 
0192 #endif