Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:07

0001 #ifndef RecoLocalMuon_DTParametrizedDriftAlgo_H
0002 #define RecoLocalMuon_DTParametrizedDriftAlgo_H
0003 
0004 /** \class DTParametrizedDriftAlgo
0005  *  Concrete implementation of DTRecHitBaseAlgo.
0006  *  Compute drift distance using the CIEMAT (by P.Garcia Abia and J. Puerta)
0007  *  parametrization of the cell behavior obtained with GARFIELD
0008  *
0009  *  \author G. Cerminara - INFN Torino
0010  */
0011 
0012 #include "RecoLocalMuon/DTRecHit/interface/DTRecHitBaseAlgo.h"
0013 #include "FWCore/Utilities/interface/ESGetToken.h"
0014 
0015 class MagneticField;
0016 class IdealMagneticFieldRecord;
0017 
0018 class DTParametrizedDriftAlgo : public DTRecHitBaseAlgo {
0019 public:
0020   /// Constructor
0021   DTParametrizedDriftAlgo(const edm::ParameterSet& config, edm::ConsumesCollector);
0022 
0023   /// Destructor
0024   ~DTParametrizedDriftAlgo() override;
0025 
0026   // Operations
0027 
0028   /// Pass the Event Setup to the algo at each event
0029   void setES(const edm::EventSetup& setup) override;
0030 
0031   /// First step in computation of Left/Right hits from a Digi.
0032   /// The results are the local position (in DTLayer frame) of the
0033   /// Left and Right hit, and the error (which is common).
0034   /// The center of the wire is assumed as hit coordinate along y.
0035   /// Returns false on failure.
0036   bool compute(const DTLayer* layer,
0037                const DTDigi& digi,
0038                LocalPoint& leftPoint,
0039                LocalPoint& rightPoint,
0040                LocalError& error) const override;
0041 
0042   /// Second step.
0043   /// The impact angle is given as input, and it's used to improve the hit
0044   /// position (and relative error). The angle is defined in radians, with
0045   /// respect to the perpendicular to the layer plane. Given the local direction,
0046   /// angle=atan(dir.x()/-dir.z()) . This can be used when a SL segment is
0047   /// built, so the impact angle is known but the position along wire is not.
0048   /// NOTE: Only position and error of the new hit are modified
0049   bool compute(const DTLayer* layer,
0050                const DTRecHit1D& recHit1D,
0051                const float& angle,
0052                DTRecHit1D& newHit1D) const override;
0053 
0054   /// Third (and final) step in hits position computation.
0055   /// In addition the the angle, also the global position of the hit is given
0056   /// as input. This allows to get the magnetic field at the hit position (and
0057   /// not only that at the center of the wire). Also the position along the
0058   /// wire is available and can be used to correct the drift time for particle
0059   /// TOF and propagation of signal along the wire.
0060   /// NOTE: Only position and error of the new hit are modified
0061   bool compute(const DTLayer* layer,
0062                const DTRecHit1D& recHit1D,
0063                const float& angle,
0064                const GlobalPoint& globPos,
0065                DTRecHit1D& newHit1D) const override;
0066 
0067 private:
0068   // Interpolate parametrization function
0069   const bool interpolate;
0070 
0071   // Times below MinTime (ns) are considered as coming from previous BXs.
0072   const float minTime;
0073 
0074   // Times above MaxTime (ns) are considered as coming from following BXs
0075   const float maxTime;
0076 
0077   // Do the actual work.
0078   virtual bool compute(const DTLayer* layer,
0079                        const DTWireId& wireId,
0080                        const float digiTime,
0081                        const float& angle,
0082                        const GlobalPoint& globPos,
0083                        LocalPoint& leftPoint,
0084                        LocalPoint& rightPoint,
0085                        LocalError& error,
0086                        int step) const;
0087 
0088   // Interface to the method which does the actual work suited for 2nd and 3rd steps
0089   virtual bool compute(const DTLayer* layer,
0090                        const DTWireId& wireId,
0091                        const float digiTime,
0092                        const float& angle,
0093                        const GlobalPoint& globPos,
0094                        DTRecHit1D& newHit1D,
0095                        int step) const;
0096 
0097   // Switch on/off the verbosity
0098   const bool debug;
0099 
0100   // Pointer to the magnetic field (read from ES once per event)
0101   const MagneticField* magField;
0102   const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magFieldToken_;
0103 };
0104 #endif