File indexing completed on 2025-12-16 09:25:36
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Material/BinnedSurfaceMaterial.hpp"
0013 #include "Acts/Material/HomogeneousSurfaceMaterial.hpp"
0014 #include "Acts/Material/Material.hpp"
0015 #include "Acts/Material/MaterialSlab.hpp"
0016 #include "Acts/Surfaces/PlaneSurface.hpp"
0017 #include "Acts/Utilities/BinUtility.hpp"
0018 #include "ActsPlugins/Root/RootMaterialMapIo.hpp"
0019 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0020
0021 #include <memory>
0022 #include <tuple>
0023 #include <vector>
0024
0025 #include "TFile.h"
0026
0027 using namespace Acts;
0028 using namespace ActsPlugins;
0029
0030 using IdentifiedMaterial =
0031 std::tuple<GeometryIdentifier, std::shared_ptr<ISurfaceMaterial>>;
0032
0033 std::vector<IdentifiedMaterial> createHomogeneousSurfaceMaterial() {
0034 std::size_t nMaterials = 100;
0035
0036 std::vector<IdentifiedMaterial> homogeneousMaterials;
0037 homogeneousMaterials.reserve(nMaterials);
0038 for (std::size_t i = 0; i < nMaterials; ++i) {
0039
0040 Material mat = Material::fromMolarDensity(
0041 1. + i * 0.5, 2. + i * 0.5, 3. + i * 0.5, 4. + i * 0.5, 5. + i * 0.5);
0042 MaterialSlab mp(mat, 0.1);
0043 auto hMaterial = std::make_shared<HomogeneousSurfaceMaterial>(mp);
0044 auto geoID = GeometryIdentifier().withVolume(1).withSensitive(i + 1);
0045 homogeneousMaterials.push_back({geoID, hMaterial});
0046 }
0047 return homogeneousMaterials;
0048 }
0049
0050 std::vector<IdentifiedMaterial> createBinnedSurfaceMaterial() {
0051 std::size_t nMaterials = 100;
0052
0053 std::vector<IdentifiedMaterial> binnedMaterials;
0054 binnedMaterials.reserve(nMaterials);
0055 for (std::size_t i = 0; i < nMaterials; ++i) {
0056
0057
0058 BinUtility xyBinning(100, -1., 1., open, AxisDirection::AxisX);
0059 xyBinning += BinUtility(50, -3., 3., open, AxisDirection::AxisY);
0060
0061 std::vector<std::vector<MaterialSlab>> materialMatrix;
0062 for (std::size_t j = 0; j < xyBinning.bins(1); ++j) {
0063 std::vector<MaterialSlab> materialRow;
0064 for (std::size_t k = 0; k < xyBinning.bins(0); ++k) {
0065
0066 Material mat = Material::fromMolarDensity(
0067 i + j * 1. + k * 0.5, i + j * 2 + k * 0.5, i + j * 3. + k * 0.5,
0068 i + j * 4. + k * 0.5, i + j * 5. + k * 0.5);
0069 MaterialSlab mp(mat, 0.1);
0070 materialRow.push_back(mp);
0071 }
0072 materialMatrix.push_back(materialRow);
0073 }
0074 auto binnedMaterial =
0075 std::make_shared<BinnedSurfaceMaterial>(xyBinning, materialMatrix);
0076 auto geoID = GeometryIdentifier().withVolume(2).withSensitive(i + 1);
0077 binnedMaterials.push_back({geoID, binnedMaterial});
0078 }
0079 return binnedMaterials;
0080 }
0081
0082 namespace ActsTests {
0083
0084 BOOST_AUTO_TEST_SUITE(RootSuite)
0085
0086 BOOST_AUTO_TEST_CASE(RootMaterialMapIoHomogeneousReadWrite) {
0087 auto surfaceMaterials = createHomogeneousSurfaceMaterial();
0088
0089 auto rFile =
0090 TFile::Open("RootMaterialMapIoHomogeneousTests.root", "RECREATE");
0091 rFile->cd();
0092 BOOST_REQUIRE(rFile != nullptr);
0093
0094
0095 RootMaterialMapIo::Config cfg;
0096 RootMaterialMapIo accessor(cfg);
0097 RootMaterialMapIo::Options options;
0098
0099 for (const auto& [geoID, sMaterial] : surfaceMaterials) {
0100 accessor.write(*rFile, geoID, *sMaterial, options);
0101 }
0102
0103 rFile->Write();
0104 rFile->Close();
0105
0106
0107 auto iFile = TFile::Open("RootMaterialMapIoHomogeneousTests.root", "READ");
0108 BOOST_REQUIRE(iFile != nullptr);
0109
0110 auto [surfaceMapsRead, volumeMapsRead] = accessor.read(*iFile, options);
0111 BOOST_REQUIRE_EQUAL(surfaceMapsRead.size(), surfaceMaterials.size());
0112 BOOST_REQUIRE_EQUAL(volumeMapsRead.size(), 0);
0113
0114 Vector3 accessorPosition(0., 0., 0.);
0115
0116 for (const auto& [geoID, sMaterial] : surfaceMaterials) {
0117 auto it = surfaceMapsRead.find(geoID);
0118 BOOST_REQUIRE(it != surfaceMapsRead.end());
0119 const auto& readMaterial = it->second;
0120 BOOST_REQUIRE(readMaterial != nullptr);
0121 const auto* hMaterial =
0122 dynamic_cast<const HomogeneousSurfaceMaterial*>(readMaterial.get());
0123 BOOST_REQUIRE(hMaterial != nullptr);
0124 BOOST_CHECK_CLOSE(hMaterial->materialSlab(accessorPosition).material().X0(),
0125 sMaterial->materialSlab(accessorPosition).material().X0(),
0126 1e-6);
0127 BOOST_CHECK_CLOSE(hMaterial->materialSlab(accessorPosition).material().L0(),
0128 sMaterial->materialSlab(accessorPosition).material().L0(),
0129 1e-6);
0130 }
0131 }
0132
0133 BOOST_AUTO_TEST_CASE(RootMaterialMapIoBinnedReadWrite) {
0134 auto surfaceMaterials = createBinnedSurfaceMaterial();
0135
0136 auto rFile = TFile::Open("RootMaterialMapIoBinnedTests.root", "RECREATE");
0137 rFile->cd();
0138 BOOST_REQUIRE(rFile != nullptr);
0139
0140
0141 RootMaterialMapIo::Config cfg;
0142 RootMaterialMapIo accessor(cfg);
0143 RootMaterialMapIo::Options options;
0144
0145 for (const auto& [geoID, sMaterial] : surfaceMaterials) {
0146 accessor.write(*rFile, geoID, *sMaterial, options);
0147 }
0148
0149 rFile->Write();
0150 rFile->Close();
0151
0152
0153 auto iFile = TFile::Open("RootMaterialMapIoBinnedTests.root", "READ");
0154 BOOST_REQUIRE(iFile != nullptr);
0155 auto [surfaceMapsRead, volumeMapsRead] = accessor.read(*iFile, options);
0156 BOOST_REQUIRE_EQUAL(surfaceMapsRead.size(), surfaceMaterials.size());
0157 BOOST_REQUIRE_EQUAL(volumeMapsRead.size(), 0);
0158
0159
0160 for (const auto& [refGeoID, refSMaterial] : surfaceMaterials) {
0161 auto binnedReferenceMaterial =
0162 dynamic_cast<const BinnedSurfaceMaterial*>(refSMaterial.get());
0163
0164 BOOST_REQUIRE(binnedReferenceMaterial != nullptr);
0165
0166 auto it = surfaceMapsRead.find(refGeoID);
0167 BOOST_REQUIRE(it != surfaceMapsRead.end());
0168 const auto& readMaterial = it->second;
0169 BOOST_REQUIRE(readMaterial != nullptr);
0170 const auto* binnedMaterial =
0171 dynamic_cast<const BinnedSurfaceMaterial*>(readMaterial.get());
0172 BOOST_REQUIRE(binnedMaterial != nullptr);
0173
0174
0175 BOOST_CHECK_EQUAL(binnedMaterial->binUtility().bins(0),
0176 binnedReferenceMaterial->binUtility().bins(0));
0177 BOOST_CHECK_EQUAL(binnedMaterial->binUtility().bins(1),
0178 binnedReferenceMaterial->binUtility().bins(1));
0179
0180
0181 const auto& materialMatrix = binnedMaterial->fullMaterial();
0182 const auto& referenceMaterialMatrix =
0183 binnedReferenceMaterial->fullMaterial();
0184
0185 BOOST_REQUIRE_EQUAL(materialMatrix.size(), referenceMaterialMatrix.size());
0186 for (std::size_t i = 0; i < materialMatrix.size(); ++i) {
0187 BOOST_REQUIRE_EQUAL(materialMatrix[i].size(),
0188 referenceMaterialMatrix[i].size());
0189 for (std::size_t j = 0; j < materialMatrix[i].size(); ++j) {
0190 const auto& mat = materialMatrix[i][j];
0191 const auto& refMat = referenceMaterialMatrix[i][j];
0192 BOOST_CHECK_CLOSE(mat.material().X0(), refMat.material().X0(), 1e-6);
0193 BOOST_CHECK_CLOSE(mat.material().L0(), refMat.material().L0(), 1e-6);
0194 BOOST_CHECK_CLOSE(mat.material().Ar(), refMat.material().Ar(), 1e-6);
0195 BOOST_CHECK_CLOSE(mat.material().Z(), refMat.material().Z(), 1e-6);
0196 BOOST_CHECK_CLOSE(mat.thickness(), refMat.thickness(), 1e-6);
0197 }
0198 }
0199 }
0200
0201
0202 RootMaterialMapIo::Config cfgIndexed;
0203 RootMaterialMapIo accessorIndexed(cfgIndexed);
0204
0205 RootMaterialMapIo::Options optionsIndexed;
0206 optionsIndexed.indexedMaterial = true;
0207
0208 rFile = TFile::Open("RootMaterialMapIoBinnedIndexedTests.root", "RECREATE");
0209 rFile->cd();
0210 BOOST_REQUIRE(rFile != nullptr);
0211
0212 for (const auto& [geoID, sMaterial] : surfaceMaterials) {
0213 accessorIndexed.write(*rFile, geoID, *sMaterial, optionsIndexed);
0214 }
0215
0216 rFile->Write();
0217 rFile->Close();
0218
0219
0220 iFile = TFile::Open("RootMaterialMapIoBinnedIndexedTests.root", "READ");
0221 BOOST_REQUIRE(iFile != nullptr);
0222 auto [surfaceMapsIndexedRead, volumeMapsIndexedRead] =
0223 accessorIndexed.read(*iFile, optionsIndexed);
0224 BOOST_REQUIRE_EQUAL(surfaceMapsIndexedRead.size(), surfaceMaterials.size());
0225 BOOST_REQUIRE_EQUAL(volumeMapsIndexedRead.size(), 0);
0226
0227
0228 for (const auto& [refGeoID, refSMaterial] : surfaceMaterials) {
0229 auto binnedReferenceMaterial =
0230 dynamic_cast<const BinnedSurfaceMaterial*>(refSMaterial.get());
0231 BOOST_REQUIRE(binnedReferenceMaterial != nullptr);
0232 auto it = surfaceMapsIndexedRead.find(refGeoID);
0233 BOOST_REQUIRE(it != surfaceMapsIndexedRead.end());
0234 const auto& readMaterial = it->second;
0235 BOOST_REQUIRE(readMaterial != nullptr);
0236 const auto* binnedMaterial =
0237 dynamic_cast<const BinnedSurfaceMaterial*>(readMaterial.get());
0238 BOOST_REQUIRE(binnedMaterial != nullptr);
0239
0240 BOOST_CHECK_EQUAL(binnedMaterial->binUtility().bins(0),
0241 binnedReferenceMaterial->binUtility().bins(0));
0242 BOOST_CHECK_EQUAL(binnedMaterial->binUtility().bins(1),
0243 binnedReferenceMaterial->binUtility().bins(1));
0244
0245 const auto& materialMatrix = binnedMaterial->fullMaterial();
0246 const auto& referenceMaterialMatrix =
0247 binnedReferenceMaterial->fullMaterial();
0248 BOOST_REQUIRE_EQUAL(materialMatrix.size(), referenceMaterialMatrix.size());
0249 for (std::size_t i = 0; i < materialMatrix.size(); ++i) {
0250 BOOST_REQUIRE_EQUAL(materialMatrix[i].size(),
0251 referenceMaterialMatrix[i].size());
0252 for (std::size_t j = 0; j < materialMatrix[i].size(); ++j) {
0253 const auto& mat = materialMatrix[i][j];
0254 const auto& refMat = referenceMaterialMatrix[i][j];
0255 BOOST_CHECK_CLOSE(mat.material().X0(), refMat.material().X0(), 1e-6);
0256 BOOST_CHECK_CLOSE(mat.material().L0(), refMat.material().L0(), 1e-6);
0257 BOOST_CHECK_CLOSE(mat.material().Ar(), refMat.material().Ar(), 1e-6);
0258 BOOST_CHECK_CLOSE(mat.material().Z(), refMat.material().Z(), 1e-6);
0259 BOOST_CHECK_CLOSE(mat.thickness(), refMat.thickness(), 1e-6);
0260 }
0261 }
0262 }
0263 }
0264
0265 BOOST_AUTO_TEST_SUITE_END()
0266
0267 }