43{
45 ActsPlugins::RootMaterialMapIo::Config accessorConfig;
47 ActsPlugins::RootMaterialMapIo::Options accessorOptions;
48
49
50 m_outputFile->cd();
51
52 const auto& [surfaceMaps, volumeMaps] = detMaterial;
53
54
55 ActsPlugins::RootMaterialMapIo
accessor(accessorConfig,
57
58 for (const auto& [geoId, sMap] : surfaceMaps) {
59
60 accessor.write(*m_outputFile, geoId, *sMap, accessorOptions);
61 }
62
63
64 for (auto& [key, value] : volumeMaps) {
65
66 const Acts::IVolumeMaterial* vMaterial =
value.get();
67 if (vMaterial == nullptr) {
69 continue;
70 }
71
72
73 Acts::GeometryIdentifier geoID =
key;
74
75 const auto gvolID = geoID.volume();
76
77
78 std::string tdName = accessorOptions.folderVolumeNameBase.c_str();
79 tdName += accessorConfig.volumePrefix + std::to_string(gvolID);
80
81
82 m_outputFile->mkdir(tdName.c_str());
83 m_outputFile->cd(tdName.c_str());
84
86
87
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);
92
93 int points = 1;
94 if (bvMaterial3D != nullptr || bvMaterial2D != nullptr) {
95
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());
101 } else {
102 binningData = bvMaterial2D->binUtility().binningData();
103 Acts::MaterialGrid2D grid = bvMaterial2D->getMapper().getGrid();
104 points = static_cast<int>(grid.size());
105 }
106
107
108 auto bins =
static_cast<int>(binningData.size());
109 auto fBins =
static_cast<float>(
bins);
110
111
112 TH1F n(accessorConfig.nBinsHistName.c_str(),
"bins; bin",
bins, -0.5, fBins - 0.5);
113
114
115 TH1F v(accessorConfig.axisDirHistName.c_str(),
"binning values; bin",
bins, -0.5, fBins - 0.5);
116
117
118 TH1F o(accessorConfig.axisBoundaryTypeHistName.c_str(),
"binning options; bin",
bins, -0.5, fBins - 0.5);
119
120
121 TH1F rmin(accessorConfig.minRangeHistName.c_str(),
"min; bin",
bins, -0.5, fBins - 0.5);
122
123
124 TH1F rmax(accessorConfig.maxRangeHistName.c_str(),
"max; bin",
bins, -0.5, fBins - 0.5);
125
126
127 for (const auto& [b, bData] : enumerate(binningData)) {
128
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);
134 }
137 o.Write();
138 rmin.Write();
139 rmax.Write();
140 }
141
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);
148
149 if (points == 1) {
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());
156 } else {
157
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());
168 }
169 }
170 }
171
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());
182 }
183 }
184 }
185 }
186 x0.Write();
191 }
192
193 return;
194}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(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.