42 const Acts::TrackingGeometryMaterial& detMaterial)
const
45 ActsPlugins::RootMaterialMapIo::Config accessorConfig;
47 ActsPlugins::RootMaterialMapIo::Options accessorOptions;
52 const auto& surfaceMaps = detMaterial.surfaceMaterials;
53 const auto& volumeMaps = detMaterial.volumeMaterials;
54 if (!detMaterial.keyedSurfaces.empty()) {
56 <<
" keyed surface material maps, which are not supported");
60 ActsPlugins::RootMaterialMapIo accessor(accessorConfig,
63 for (
const auto& [geoId, sMap] : surfaceMaps) {
65 accessor.write(*m_outputFile, geoId, *sMap, accessorOptions);
69 for (
auto& [key, value] : volumeMaps) {
71 const Acts::IVolumeMaterial* vMaterial = value.get();
72 if (vMaterial ==
nullptr) {
78 Acts::GeometryIdentifier geoID = key;
80 const auto gvolID = geoID.volume();
83 std::string tdName = accessorOptions.folderVolumeNameBase.c_str();
84 tdName += accessorConfig.volumePrefix + std::to_string(gvolID);
87 m_outputFile->mkdir(tdName.c_str());
88 m_outputFile->cd(tdName.c_str());
93 auto bvMaterial3D =
dynamic_cast<const Acts::InterpolatedMaterialMap<
94 Acts::MaterialMapLookup<Acts::MaterialGrid3D>
>*>(vMaterial);
95 auto bvMaterial2D =
dynamic_cast<const Acts::InterpolatedMaterialMap<
96 Acts::MaterialMapLookup<Acts::MaterialGrid2D>
>*>(vMaterial);
99 if (bvMaterial3D !=
nullptr || bvMaterial2D !=
nullptr) {
101 std::vector<Acts::BinningData> binningData;
102 if (bvMaterial3D !=
nullptr) {
103 binningData = bvMaterial3D->binUtility().binningData();
104 Acts::MaterialGrid3D grid = bvMaterial3D->getMapper().getGrid();
105 points =
static_cast<int>(grid.size());
107 binningData = bvMaterial2D->binUtility().binningData();
108 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
109 points =
static_cast<int>(grid.size());
113 auto bins =
static_cast<int>(binningData.size());
114 auto fBins =
static_cast<float>(
bins);
117 TH1F n(accessorConfig.nBinsHistName.c_str(),
"bins; bin",
bins, -0.5, fBins - 0.5);
120 TH1F v(accessorConfig.axisDirHistName.c_str(),
"binning values; bin",
bins, -0.5, fBins - 0.5);
123 TH1F o(accessorConfig.axisBoundaryTypeHistName.c_str(),
"binning options; bin",
bins, -0.5, fBins - 0.5);
126 TH1F rmin(accessorConfig.minRangeHistName.c_str(),
"min; bin",
bins, -0.5, fBins - 0.5);
129 TH1F rmax(accessorConfig.maxRangeHistName.c_str(),
"max; bin",
bins, -0.5, fBins - 0.5);
132 for (
const auto [b, bData] : enumerate(binningData)) {
134 n.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].
bins()));
135 v.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].binvalue));
136 o.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].option));
137 rmin.SetBinContent(
static_cast<int>(b), binningData[b - 1].
min);
138 rmax.SetBinContent(
static_cast<int>(b), binningData[b - 1].
max);
147 auto fPoints =
static_cast<float>(points);
148 TH1F x0(accessorConfig.x0HistName.c_str(),
"X_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
149 TH1F l0(accessorConfig.l0HistName.c_str(),
"#Lambda_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
150 TH1F
A(accessorConfig.aHistName.c_str(),
"X_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
151 TH1F Z(accessorConfig.zHistName.c_str(),
"#Lambda_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
152 TH1F rho(accessorConfig.rhoHistName.c_str(),
"#rho [g/mm^3] ;gridPoint", points, -0.5, fPoints - 0.5);
155 auto mat = vMaterial->material({0, 0, 0});
156 x0.SetBinContent(1, mat.X0());
157 l0.SetBinContent(1, mat.L0());
158 A.SetBinContent(1, mat.Ar());
159 Z.SetBinContent(1, mat.Z());
160 rho.SetBinContent(1, mat.massDensity());
163 if (bvMaterial3D !=
nullptr) {
164 Acts::MaterialGrid3D grid = bvMaterial3D->getMapper().getGrid();
165 for (
int point = 0; point < points; point++) {
166 auto mat = Acts::Material(grid.at(point));
167 if (!mat.isVacuum()) {
168 x0.SetBinContent(point + 1, mat.X0());
169 l0.SetBinContent(point + 1, mat.L0());
170 A.SetBinContent(point + 1, mat.Ar());
171 Z.SetBinContent(point + 1, mat.Z());
172 rho.SetBinContent(point + 1, mat.massDensity());
177 else if (bvMaterial2D !=
nullptr) {
178 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
179 for (
int point = 0; point < points; point++) {
180 auto mat = Acts::Material(grid.at(point));
181 if (!mat.isVacuum()) {
182 x0.SetBinContent(point + 1, mat.X0());
183 l0.SetBinContent(point + 1, mat.L0());
184 A.SetBinContent(point + 1, mat.Ar());
185 Z.SetBinContent(point + 1, mat.Z());
186 rho.SetBinContent(point + 1, mat.massDensity());