Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:09:58

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2016-2018 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 #include "Acts/Definitions/Algebra.hpp"
0011 #include "Acts/Digitization/DigitizationCell.hpp"
0012 #include "Acts/Surfaces/RegularSurface.hpp"
0013 
0014 #include <memory>
0015 #include <vector>
0016 
0017 namespace Acts {
0018 
0019 class SurfaceBounds;
0020 class Surface;
0021 class BinUtility;
0022 using SurfacePtr = std::shared_ptr<const RegularSurface>;
0023 using SurfacePtrVector = std::vector<SurfacePtr>;
0024 
0025 /// @brief Segmentation Base class
0026 ///
0027 /// This helper class allows to define an arbitrary readout
0028 /// segmentation for the geoemtric digitization, provided a shape of the module,
0029 /// it creates the segmentation surfaces and hands them to the digitization
0030 /// module
0031 ///
0032 /// Since the segmentation description might be identical for many elements
0033 /// while the lorentz angle may change, lorentzAngle and readoutDirection
0034 /// are provided and th the segmenation class only creates the surfaces for the
0035 /// module,
0036 /// but hosts the binning information.
0037 ///
0038 class Segmentation {
0039  public:
0040   /// Virtual Destructor
0041   virtual ~Segmentation() = default;
0042 
0043   /// Create the segmentation surfaces in X
0044   ///
0045   /// This method is only used if the full 3D digitization is done
0046   ///
0047   /// @param boundarySurfaces vector to be filled
0048   /// @param segmentationSurfacesX are the segmetation boundaries in X
0049   /// @param segmentationSurfacesY are the segmetation boundaries in Y
0050   /// @param halfThickness is the half thickness in z of the module
0051   /// @param readoutDirection is the direction w.r.t normal vector
0052   /// where the readout is given : -1, 0, 1 possible
0053   /// @param lorentzAngle is the lorentz angle measured from the local z
0054   /// towards x axis
0055   virtual void createSegmentationSurfaces(
0056       SurfacePtrVector& boundarySurfaces,
0057       SurfacePtrVector& segmentationSurfacesX,
0058       SurfacePtrVector& segmentationSurfacesY, double halfThickness,
0059       int readoutDirection, double lorentzAngle) const = 0;
0060 
0061   /// Get the digitization cell from a 3D position
0062   /// - ignores the shift, i.e. assumenes in to be in cell frame
0063   ///
0064   /// @param position is the position for which the cell is requested
0065   ///
0066   /// @return is a cell with cell ids
0067   virtual DigitizationCell cell(const Vector3& position) const = 0;
0068 
0069   /// Get the digitization cell from a 2D position
0070   /// - ignores the shift, i.e. assumenes in to be in cell frame
0071   ///
0072   /// @param position is the position for which the cell is requested
0073   ///
0074   /// @return is a cell with cell ids
0075   virtual DigitizationCell cell(const Vector2& position) const = 0;
0076 
0077   /// Calculate the cell Position from the Id
0078   ///
0079   /// @param dCell the digitization cell
0080   ///
0081   /// @return the center position of the associated cell
0082   virtual Vector2 cellPosition(const DigitizationCell& dCell) const = 0;
0083 
0084   /// Fill the associated digitization cell from the start and end position in
0085   /// 3D correct for lorentz effect if needed
0086   ///
0087   /// @param start is the start position of the step
0088   /// @param end is the end position of the step
0089   /// @param halfThickness is the half thickness in z
0090   /// @param readoutDirection is the readout direction with respect to local z
0091   /// @param lorentzAngle is the lorentz angle measured from local z towards x
0092   ///
0093   /// @return is a fully calculated digitzation step
0094   virtual DigitizationStep digitizationStep(const Vector3& start,
0095                                             const Vector3& end,
0096                                             double halfThickness,
0097                                             int readoutDirection,
0098                                             double lorentzAngle) const = 0;
0099 
0100   /// return the surface bounds by reference
0101   virtual const SurfaceBounds& moduleBounds() const = 0;
0102 
0103   /// return the bin utility that defines the readout
0104   virtual const BinUtility& binUtility() const = 0;
0105 };
0106 }  // namespace Acts