Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:17:13

0001 
0002 #ifndef ACTSPROPAGATOR_H
0003 #define ACTSPROPAGATOR_H
0004 
0005 #include <trackbase/ActsGeometry.h>
0006 
0007 #include <Acts/Definitions/Algebra.hpp>
0008 #include <Acts/EventData/TrackParameters.hpp>
0009 
0010 #pragma GCC diagnostic push
0011 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
0012 #include <Acts/Propagator/EigenStepper.hpp>
0013 #pragma GCC diagnostic pop
0014 #pragma GCC diagnostic push
0015 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
0016 #include <Acts/Propagator/Propagator.hpp>
0017 #pragma GCC diagnostic pop
0018 #include <Acts/Propagator/Navigator.hpp>
0019 
0020 #include <Acts/Utilities/Result.hpp>
0021 
0022 #include <trackbase/ActsGeometry.h>
0023 
0024 class SvtxTrack;
0025 class SvtxVertex;
0026 class SvtxVertexMap;
0027 class SvtxTrackState;
0028 
0029 class ActsPropagator
0030 {
0031  public:
0032   using BoundTrackParam = Acts::BoundTrackParameters;
0033   using BoundTrackParamResult = Acts::Result<BoundTrackParam>;
0034   /// Return type of std::pair<path length, parameters>
0035   using BoundTrackParamPair = std::pair<float, BoundTrackParam>;
0036   using BTPPairResult = Acts::Result<BoundTrackParamPair>;
0037   using SurfacePtr = std::shared_ptr<const Acts::Surface>;
0038   using Stepper = Acts::EigenStepper<>;
0039   using FastPropagator = Acts::Propagator<Stepper>;
0040   using SphenixPropagator = Acts::Propagator<Stepper, Acts::Navigator>;
0041 
0042   ActsPropagator() {}
0043   ActsPropagator(ActsGeometry* geometry)
0044     : m_geometry(geometry)
0045   {
0046   }
0047   ~ActsPropagator() {}
0048 
0049   /// Helper functions for creating needed input for track propagation
0050   /// functions below
0051   SurfacePtr makeVertexSurface(const SvtxVertex* vertex);
0052   SurfacePtr makeVertexSurface(const Acts::Vector3& vertex);
0053   BoundTrackParamResult makeTrackParams(SvtxTrack* track, 
0054                     SvtxVertexMap* vertexMap);
0055   BoundTrackParamResult makeTrackParams(SvtxTrackState* state, 
0056                     int trackCharge,
0057                     SurfacePtr surf);
0058 
0059   /// The return type is an Acts::Result of a std::pair, where the pair is
0060   /// a path length and the track parameters at the surface in units of mm
0061   /// and GeV. For an example of how to unpack this, see
0062   /// PHActsTrackProjection::propagateTrack and
0063   /// PHActsTrackProjection::updateSvtxTrack
0064   BTPPairResult propagateTrack(const Acts::BoundTrackParameters& params,
0065                                        const unsigned int sphenixLayer);
0066   BTPPairResult propagateTrack(const Acts::BoundTrackParameters& params,
0067                                        const SurfacePtr& surface);
0068   /// The following function takes the track parameters at the vertex and
0069   /// propagates them in isolation to the requested surface, i.e. it does
0070   /// NOT stop at each layer in the sPHENIX detector on the way to the
0071   /// target surface
0072   BTPPairResult propagateTrackFast(const Acts::BoundTrackParameters& params,
0073                                            const SurfacePtr& surface);
0074 
0075   bool checkLayer(const unsigned int& sphenixlayer,
0076                   unsigned int& actsvolume,
0077                   unsigned int& actslayer);
0078   void verbosity(int verb) { m_verbosity = verb; }
0079   void setConstFieldValue(float field) { m_fieldval = field; }
0080   void constField() { m_constField = true; }
0081   void setOverstepLimit(const double overstep) { m_overstepLimit = overstep; }
0082   SphenixPropagator makePropagator();
0083   FastPropagator makeFastPropagator();
0084 
0085  private:
0086   void printTrackParams(const Acts::BoundTrackParameters& params);
0087 
0088   int m_verbosity = 0;
0089 
0090   bool m_constField = false;
0091 
0092   ActsGeometry* m_geometry = nullptr;
0093 
0094   float m_fieldval = 1.4 * Acts::UnitConstants::T;
0095 
0096   /// Default Acts limit
0097   float m_overstepLimit = 0.01 * Acts::UnitConstants::cm;  // sphenix units cm
0098 };
0099 
0100 #endif