File indexing completed on 2025-01-18 09:27:40
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/Common.hpp"
0013 #include "Acts/Definitions/Direction.hpp"
0014 #include "Acts/Geometry/GeometryIdentifier.hpp"
0015 #include "Acts/Material/MaterialSlab.hpp"
0016
0017 #include <memory>
0018 #include <vector>
0019
0020 namespace Acts {
0021
0022
0023 enum MappingType { PreMapping = -1, Default = 0, PostMapping = 1, Sensor = 2 };
0024
0025
0026
0027
0028
0029
0030
0031
0032 class ISurfaceMaterial {
0033 public:
0034
0035 ISurfaceMaterial() = default;
0036
0037
0038
0039
0040 ISurfaceMaterial(double splitFactor) : m_splitFactor(splitFactor) {}
0041
0042
0043
0044
0045
0046 ISurfaceMaterial(double splitFactor, Acts::MappingType mappingType)
0047 : m_splitFactor(splitFactor), m_mappingType(mappingType) {}
0048
0049
0050 virtual ~ISurfaceMaterial() = default;
0051
0052
0053
0054
0055 virtual ISurfaceMaterial& operator*=(double scale) = 0;
0056
0057
0058
0059
0060
0061
0062
0063 virtual const MaterialSlab& materialSlab(const Vector2& lp) const = 0;
0064
0065
0066
0067
0068
0069
0070
0071 virtual const MaterialSlab& materialSlab(const Vector3& gp) const = 0;
0072
0073
0074
0075
0076
0077 double factor(Direction pDir, MaterialUpdateStage mStage) const;
0078
0079
0080
0081 MappingType mappingType() const { return m_mappingType; }
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 MaterialSlab materialSlab(const Vector2& lp, Direction pDir,
0092 MaterialUpdateStage mStage) const;
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102 MaterialSlab materialSlab(const Vector3& gp, Direction pDir,
0103 MaterialUpdateStage mStage) const;
0104
0105
0106
0107
0108
0109
0110
0111 friend std::ostream& operator<<(std::ostream& out,
0112 const ISurfaceMaterial& sm) {
0113 sm.toStream(out);
0114 return out;
0115 }
0116
0117
0118 virtual std::ostream& toStream(std::ostream& sl) const = 0;
0119
0120 protected:
0121 double m_splitFactor{1.};
0122 MappingType m_mappingType{
0123 Acts::MappingType::Default};
0124 };
0125
0126 inline double ISurfaceMaterial::factor(Direction pDir,
0127 MaterialUpdateStage mStage) const {
0128 if (mStage == Acts::MaterialUpdateStage::FullUpdate) {
0129 return 1.;
0130 } else if (mStage == Acts::MaterialUpdateStage::PreUpdate) {
0131 return pDir == Direction::Negative ? m_splitFactor : 1 - m_splitFactor;
0132 } else {
0133 return pDir == Direction::Positive ? m_splitFactor : 1 - m_splitFactor;
0134 }
0135 }
0136
0137 inline MaterialSlab ISurfaceMaterial::materialSlab(
0138 const Vector2& lp, Direction pDir, MaterialUpdateStage mStage) const {
0139
0140 MaterialSlab plainMatProp = materialSlab(lp);
0141
0142 if (plainMatProp) {
0143 double scaleFactor = factor(pDir, mStage);
0144 if (scaleFactor == 0.) {
0145 return MaterialSlab();
0146 }
0147 plainMatProp.scaleThickness(scaleFactor);
0148 }
0149 return plainMatProp;
0150 }
0151
0152 inline MaterialSlab ISurfaceMaterial::materialSlab(
0153 const Vector3& gp, Direction pDir, MaterialUpdateStage mStage) const {
0154
0155 MaterialSlab plainMatProp = materialSlab(gp);
0156
0157 if (plainMatProp) {
0158 double scaleFactor = factor(pDir, mStage);
0159 if (scaleFactor == 0.) {
0160 return MaterialSlab();
0161 }
0162 plainMatProp.scaleThickness(scaleFactor);
0163 }
0164 return plainMatProp;
0165 }
0166
0167 }