43{
45 ActsPlugins::RootMaterialMapIo::Config accessorConfig;
47 ActsPlugins::RootMaterialMapIo::Options accessorOptions;
48
49
50 m_outputFile->cd();
51
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");
57 }
58
59
60 ActsPlugins::RootMaterialMapIo
accessor(accessorConfig,
62
63 for (const auto& [geoId, sMap] : surfaceMaps) {
64
65 accessor.write(*m_outputFile, geoId, *sMap, accessorOptions);
66 }
67
68
69 for (auto& [key, value] : volumeMaps) {
70
71 const Acts::IVolumeMaterial* vMaterial =
value.get();
72 if (vMaterial == nullptr) {
74 continue;
75 }
76
77
78 Acts::GeometryIdentifier geoID =
key;
79
80 const auto gvolID = geoID.volume();
81
82
83 std::string tdName = accessorOptions.folderVolumeNameBase.c_str();
84 tdName += accessorConfig.volumePrefix + std::to_string(gvolID);
85
86
87 m_outputFile->mkdir(tdName.c_str());
88 m_outputFile->cd(tdName.c_str());
89
91
92
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);
97
98 int points = 1;
99 if (bvMaterial3D != nullptr || bvMaterial2D != nullptr) {
100
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());
106 } else {
107 binningData = bvMaterial2D->binUtility().binningData();
108 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
109 points = static_cast<int>(grid.size());
110 }
111
112
113 auto bins =
static_cast<int>(binningData.size());
114 auto fBins =
static_cast<float>(
bins);
115
116
117 TH1F n(accessorConfig.nBinsHistName.c_str(),
"bins; bin",
bins, -0.5, fBins - 0.5);
118
119
120 TH1F v(accessorConfig.axisDirHistName.c_str(),
"binning values; bin",
bins, -0.5, fBins - 0.5);
121
122
123 TH1F o(accessorConfig.axisBoundaryTypeHistName.c_str(),
"binning options; bin",
bins, -0.5, fBins - 0.5);
124
125
126 TH1F rmin(accessorConfig.minRangeHistName.c_str(),
"min; bin",
bins, -0.5, fBins - 0.5);
127
128
129 TH1F rmax(accessorConfig.maxRangeHistName.c_str(),
"max; bin",
bins, -0.5, fBins - 0.5);
130
131
132 for (const auto [b, bData] : enumerate(binningData)) {
133
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);
139 }
142 o.Write();
143 rmin.Write();
144 rmax.Write();
145 }
146
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);
153
154 if (points == 1) {
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());
161 } else {
162
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());
173 }
174 }
175 }
176
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());
187 }
188 }
189 }
190 }
191 x0.Write();
196 }
197
198 return;
199}
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static const std::vector< std::string > bins
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
const AccessorWrapper< T > * accessor(xAOD::JetAttribute::AttributeID id)
Returns an attribute accessor corresponding to an AttributeID.