115 return StatusCode::SUCCESS;
121 auto writeCdo = std::make_unique<RegSelSiLUT>();
129 gctx.
setStore(std::make_unique<ActsTrk::DetectorAlignStore>(*alignDeltas));
135 struct TempSelTable {
136 std::optional<double> centralPhi{};
137 double zMin{std::numeric_limits<double>::max()};
138 double zMax{-std::numeric_limits<double>::max()};
139 double rMin{std::numeric_limits<double>::max()};
140 double rMax{-std::numeric_limits<double>::max()};
141 double dPhiMin{std::numeric_limits<double>::max()};
142 double dPhiMax{-std::numeric_limits<double>::max()};
146 rMin = std::min(rMin, v.perp()); rMax = std::max(rMax, v.perp());
147 zMin = std::min(zMin, v.z()); zMax = std::max(zMax, v.z());
148 dPhiMin = std::min(dPhiMin, dPhi); dPhiMax = std::max(dPhiMax, dPhi);
155 std::vector<std::unique_ptr<Acts::Volume>> objVolumes{};
156 std::vector<std::shared_ptr<const Acts::Surface>> objSurfaces{};
159 const Acts::Surface& surface{reEle->surface()};
161 const double halfTck = 0.5*reEle->thickness();
163 std::vector<Amg::Vector3D> localVertices{};
164 localVertices.reserve(8);
166 std::ranges::for_each(
static_cast<const Acts::PlanarBounds&
>(surface.bounds()).vertices(),
168 ATH_MSG_VERBOSE(__LINE__<<
" - Local vertex: "<<Amg::toString(v)<<
", half thickness: "<<halfTck);
169 localVertices.emplace_back(v.x(), v.y(), halfTck);
170 localVertices.emplace_back(v.x(), v.y(), -halfTck);
174 std::unique_ptr<Acts::VolumeBounds> volBounds{};
175 objSurfaces.emplace_back(surface.getSharedPtr());
176 switch (surface.bounds().type()) {
177 using enum Acts::SurfaceBounds::BoundsType;
179 using vEnum = Acts::RectangleBounds::BoundValues;
180 const auto& bounds{
static_cast<const Acts::RectangleBounds&
>(surface.bounds())};
181 volBounds = std::make_unique<Acts::CuboidVolumeBounds>(bounds.get(vEnum::eMaxX),
182 bounds.get(vEnum::eMaxY),
186 using vEnum = Acts::TrapezoidBounds::BoundValues;
187 const auto& bounds{
static_cast<const Acts::TrapezoidBounds&
>(surface.bounds())};
188 volBounds = std::make_unique<Acts::TrapezoidVolumeBounds>(bounds.get(vEnum::eHalfLengthXnegY),
189 bounds.get(vEnum::eHalfLengthXposY),
190 bounds.get(vEnum::eHalfLengthY),
196 objVolumes.emplace_back(std::make_unique<Acts::Volume>(surface.localToGlobalTransform(gctx.
context()),
197 std::move(volBounds)));
200 ATH_MSG_VERBOSE(__LINE__<<
" - Fetched "<<localVertices.size()<<
" vertices.");
203 auto& lut = luts.at(modHash);
204 if (!lut.centralPhi) {
205 lut.centralPhi = loc2Glob.translation().phi();
210 <<std::format(
"{:.2f}/{:.2f}/{:.2f}", globVtx.perp(), globVtx.z(), globVtx.phi()));
217 module_itr != idHelper.
module_end(); ++module_itr) {
219 const auto& lut = luts.at(modHash);
221 if(!lut.centralPhi) {
227 ATH_MSG_DEBUG(__LINE__<<
" - Failed retrieving ExpandedIdentifier for PRD Identifier = "
228 <<
m_idHelperSvc->toString(*module_itr) <<
". Skipping to the next PRD.");
231 const int detid = ( exp_id[2]<0 ? -1 : 1 );
232 const int layerid = exp_id[1]+1;
234 const double phiMin = lut.centralPhi.value_or(0) + lut.dPhiMin;
235 const double phiMax = lut.centralPhi.value_or(0) + lut.dPhiMax;
238 for (
const std::uint32_t robID :
getRobIDs(ctx, *module_itr)) {
240 phiMin, phiMax, layerid, detid, robID, modHash};
243 writeCdo->addModule(m);
248 if (
const auto *lut =
dynamic_cast<const RegSelSiLUT*
>(writeCdo.get())) {
249 lut->write(std::format(
"{:}.map", name()));
252 if (!objVolumes.empty()) {
253 Acts::ObjVisualization3D visualHelper{};
254 for (
const auto& volume : objVolumes) {
255 Acts::GeometryView3D::drawVolume(visualHelper, *volume,
258 for (
const auto& surface : objSurfaces) {
259 Acts::GeometryView3D::drawSurface(visualHelper, *surface,
262 visualHelper.write(std::format(
"RegSelVolumes_{:}.obj", alignDeltas->
detType));
266 ATH_CHECK(writeHandle.
record(std::make_unique<IRegSelLUTCondData>(std::move(writeCdo))));
267 return StatusCode::SUCCESS;
void setStore(AlignmentStorePtr store)
Adds the store to the Geometry context.