File indexing completed on 2025-07-02 07:50:46
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Material/Material.hpp"
0013
0014 #include <iosfwd>
0015 #include <limits>
0016 #include <utility>
0017 #include <vector>
0018
0019 namespace Acts {
0020
0021
0022
0023
0024
0025
0026 class MaterialSlab {
0027 public:
0028 static constexpr MaterialSlab Nothing() {
0029 return MaterialSlab(Material::Vacuum(), 0, false);
0030 }
0031
0032 static constexpr MaterialSlab Vacuum(float thickness) {
0033 return MaterialSlab(Material::Vacuum(), thickness, false);
0034 }
0035
0036
0037
0038
0039
0040
0041
0042
0043 static MaterialSlab combineLayers(const MaterialSlab& layerA,
0044 const MaterialSlab& layerB);
0045
0046
0047
0048
0049
0050
0051
0052 static MaterialSlab combineLayers(const std::vector<MaterialSlab>& layers);
0053
0054
0055
0056
0057 constexpr MaterialSlab() : m_material(Material::Vacuum()) {}
0058
0059
0060
0061
0062
0063 MaterialSlab(const Material& material, float thickness);
0064
0065
0066 void scaleThickness(float scale);
0067
0068
0069 bool isVacuum() const { return m_material.isVacuum() || m_thickness <= 0; }
0070
0071
0072 constexpr const Material& material() const { return m_material; }
0073
0074 constexpr float thickness() const { return m_thickness; }
0075
0076 constexpr float thicknessInX0() const { return m_thicknessInX0; }
0077
0078 constexpr float thicknessInL0() const { return m_thicknessInL0; }
0079
0080 private:
0081 Material m_material;
0082 float m_thickness = 0.0f;
0083 float m_thicknessInX0 = 0.0f;
0084 float m_thicknessInL0 = 0.0f;
0085
0086 static constexpr auto eps = 2 * std::numeric_limits<float>::epsilon();
0087
0088 constexpr MaterialSlab(const Material& material, float thickness,
0089 [[maybe_unused]] bool dummy)
0090 : m_material(material),
0091 m_thickness(thickness),
0092 m_thicknessInX0((eps < material.X0()) ? (thickness / material.X0())
0093 : 0),
0094 m_thicknessInL0((eps < material.L0()) ? (thickness / material.L0())
0095 : 0) {}
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 friend constexpr bool operator==(const MaterialSlab& lhs,
0107 const MaterialSlab& rhs) {
0108
0109 return (lhs.m_material == rhs.m_material) &&
0110 (lhs.m_thickness == rhs.m_thickness);
0111 }
0112 };
0113
0114 std::ostream& operator<<(std::ostream& os, const MaterialSlab& materialSlab);
0115
0116
0117 using MaterialSlabVector = std::vector<MaterialSlab>;
0118 using MaterialSlabMatrix = std::vector<MaterialSlabVector>;
0119
0120
0121 using RecordedMaterialVolumePoint =
0122 std::vector<std::pair<Acts::MaterialSlab, std::vector<Acts::Vector3>>>;
0123
0124 }