42 const Acts::TrackingGeometryMaterial& detMaterial)
const
45 ActsPlugins::RootMaterialMapIo::Config accessorConfig;
47 ActsPlugins::RootMaterialMapIo::Options accessorOptions;
52 const auto& [surfaceMaps, volumeMaps] = detMaterial;
55 ActsPlugins::RootMaterialMapIo accessor(accessorConfig,
58 for (
const auto& [geoId, sMap] : surfaceMaps) {
60 accessor.write(*m_outputFile, geoId, *sMap, accessorOptions);
64 for (
auto& [key, value] : volumeMaps) {
66 const Acts::IVolumeMaterial* vMaterial = value.get();
67 if (vMaterial ==
nullptr) {
73 Acts::GeometryIdentifier geoID = key;
75 const auto gvolID = geoID.volume();
78 std::string tdName = accessorOptions.folderVolumeNameBase.c_str();
79 tdName += accessorConfig.volumePrefix + std::to_string(gvolID);
82 m_outputFile->mkdir(tdName.c_str());
83 m_outputFile->cd(tdName.c_str());
88 auto bvMaterial3D =
dynamic_cast<const Acts::InterpolatedMaterialMap<
89 Acts::MaterialMapLookup<Acts::MaterialGrid3D>
>*>(vMaterial);
90 auto bvMaterial2D =
dynamic_cast<const Acts::InterpolatedMaterialMap<
91 Acts::MaterialMapLookup<Acts::MaterialGrid2D>
>*>(vMaterial);
94 if (bvMaterial3D !=
nullptr || bvMaterial2D !=
nullptr) {
96 std::vector<Acts::BinningData> binningData;
97 if (bvMaterial3D !=
nullptr) {
98 binningData = bvMaterial3D->binUtility().binningData();
99 Acts::MaterialGrid3D grid = bvMaterial3D->getMapper().getGrid();
100 points =
static_cast<int>(grid.size());
102 binningData = bvMaterial2D->binUtility().binningData();
103 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
104 points =
static_cast<int>(grid.size());
108 auto bins =
static_cast<int>(binningData.size());
109 auto fBins =
static_cast<float>(
bins);
112 TH1F n(accessorConfig.nBinsHistName.c_str(),
"bins; bin",
bins, -0.5, fBins - 0.5);
115 TH1F v(accessorConfig.axisDirHistName.c_str(),
"binning values; bin",
bins, -0.5, fBins - 0.5);
118 TH1F o(accessorConfig.axisBoundaryTypeHistName.c_str(),
"binning options; bin",
bins, -0.5, fBins - 0.5);
121 TH1F rmin(accessorConfig.minRangeHistName.c_str(),
"min; bin",
bins, -0.5, fBins - 0.5);
124 TH1F rmax(accessorConfig.maxRangeHistName.c_str(),
"max; bin",
bins, -0.5, fBins - 0.5);
127 for (
const auto& [b, bData] : enumerate(binningData)) {
129 n.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].
bins()));
130 v.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].binvalue));
131 o.SetBinContent(
static_cast<int>(b),
static_cast<int>(binningData[b - 1].option));
132 rmin.SetBinContent(
static_cast<int>(b), binningData[b - 1].
min);
133 rmax.SetBinContent(
static_cast<int>(b), binningData[b - 1].
max);
142 auto fPoints =
static_cast<float>(points);
143 TH1F x0(accessorConfig.x0HistName.c_str(),
"X_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
144 TH1F l0(accessorConfig.l0HistName.c_str(),
"#Lambda_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
145 TH1F
A(accessorConfig.aHistName.c_str(),
"X_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
146 TH1F Z(accessorConfig.zHistName.c_str(),
"#Lambda_{0} [mm] ;gridPoint", points, -0.5, fPoints - 0.5);
147 TH1F rho(accessorConfig.rhoHistName.c_str(),
"#rho [g/mm^3] ;gridPoint", points, -0.5, fPoints - 0.5);
150 auto mat = vMaterial->material({0, 0, 0});
151 x0.SetBinContent(1, mat.X0());
152 l0.SetBinContent(1, mat.L0());
153 A.SetBinContent(1, mat.Ar());
154 Z.SetBinContent(1, mat.Z());
155 rho.SetBinContent(1, mat.massDensity());
158 if (bvMaterial3D !=
nullptr) {
159 Acts::MaterialGrid3D grid = bvMaterial3D->getMapper().getGrid();
160 for (
int point = 0; point < points; point++) {
161 auto mat = Acts::Material(grid.at(point));
162 if (!mat.isVacuum()) {
163 x0.SetBinContent(point + 1, mat.X0());
164 l0.SetBinContent(point + 1, mat.L0());
165 A.SetBinContent(point + 1, mat.Ar());
166 Z.SetBinContent(point + 1, mat.Z());
167 rho.SetBinContent(point + 1, mat.massDensity());
172 else if (bvMaterial2D !=
nullptr) {
173 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
174 for (
int point = 0; point < points; point++) {
175 auto mat = Acts::Material(grid.at(point));
176 if (!mat.isVacuum()) {
177 x0.SetBinContent(point + 1, mat.X0());
178 l0.SetBinContent(point + 1, mat.L0());
179 A.SetBinContent(point + 1, mat.Ar());
180 Z.SetBinContent(point + 1, mat.Z());
181 rho.SetBinContent(point + 1, mat.massDensity());