ATLAS Offline Software
Loading...
Searching...
No Matches
DiscOverlapDescriptor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6// DiscOverlapDescriptor.cxx, (c) ATLAS Detector software
8
9// Amg
11// iFatras
14// Trk
15#include "TrkSurfaces/Surface.h"
16
20#include "Identifier/Identifier.h"
21#include <utility>
22#include <exception>
23
24namespace {
25
26//Helpers to do "pseudo retrievals"
27//if this was an alg/tool these would have been done
28//once in init.
29
30const StoreGateSvc*
31getDetStore()
32{
33 SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service("DetectorStore")};
34 if (!detStore.isValid()) {
35 throw std::runtime_error("DiscOverlapDescriptor can not locate DetectorStore");
36 }
37
38 return detStore.get();
39}
40
41const PixelID*
42getPixelID(StoreGateSvc const * const detStore)
43{
44 const PixelID* pixIdHelper = nullptr;
45 if (detStore->retrieve(pixIdHelper, "PixelID").isFailure()) {
46 throw std::runtime_error("DiscOverlapDescriptor can not locate PixelID");
47 }
48 return pixIdHelper;
49}
50
51const SCT_ID*
52getSCT_ID(StoreGateSvc const * const detStore)
53{
54 const SCT_ID* sctIdHelper = nullptr;
55 if (detStore->retrieve(sctIdHelper, "SCT_ID").isFailure()) {
56 throw std::runtime_error("DiscOverlapDescriptor can not locate SCT_ID");
57 }
58 return sctIdHelper;
59}
60
61} // end anonymous namespace
62
64 const std::vector<Trk::BinUtility>& singleBinUtils,
65 bool isPixel):
66 m_bin_array(bin_array),
67 m_singleBinUtils(singleBinUtils),
68 m_pixelCase(isPixel)
69{}
70
71bool InDet::DiscOverlapDescriptor::reachableSurfaces(std::vector<Trk::SurfaceIntersection>& surfaces,
72 const Trk::Surface& tsf,
73 const Amg::Vector3D& pos,
74 const Amg::Vector3D&) const
75{ //These are done once no matter how many
76 //instances of DiscOverlapDescriptor we have
77 static const StoreGateSvc* const detStore = getDetStore();
78 static const PixelID* const pixIdHelper = getPixelID(detStore);
79 static const SCT_ID* const sctIdHelper = getSCT_ID(detStore);
80
81 // get the according detector element
82 const InDetDD::SiDetectorElement* pElement = dynamic_cast<const InDetDD::SiDetectorElement*>(tsf.associatedDetectorElement());
83
84 // first add the target surface
85 surfaces.emplace_back(Trk::Intersection(pos, 0., true),&tsf);
86 int etaModule =
90
91 // return empty cell vector
92 if (pElement) {
93 size_t newCapacity = surfaces.size() + 19;
94 if (pElement->otherSide()) newCapacity += 19;
95 surfaces.reserve(newCapacity);
96
97 addOtherSideDO(pElement,surfaces);
98
99 addNextInPhiDO(pElement,surfaces);
100 addPrevInPhiDO(pElement,surfaces);
101
102 addNextInPhiDO(pElement->nextInPhi(),surfaces);
103 addPrevInPhiDO(pElement->prevInPhi(),surfaces);
104
105 // First use the bin utiliy to find the surfaces on the same disc but in different rings
106 // This is done as follows:
107 // 1 -> Find at which bin corresponds the surface, i.e. at which ring on the disc it corresponds
108 // 2 -> If it is not 0 (i.e. the surface doesn't belong to the innermost ring),
109 // look for the surfaces in the ring with smaller eta value (it returns 2 or 3 surfaces)
110 // 3 -> If it is smaller than the number of rings (i.e. the surface doen't belong to the outermost ring),
111 // look for the surfaces in the ring with bigger eta value (it returns 2 or 3 surfaces)//
112
113 if (m_bin_array && !m_singleBinUtils.empty()){
114
115 const Trk::Surface* samePhi_PrevEta = nullptr;
116 const Trk::Surface* samePhi_NextEta = nullptr;
117
118 const Trk::Surface* previousPhi_PrevEta = nullptr;
119 const Trk::Surface* nextPhi_PrevEta = nullptr;
120
121 const Trk::Surface* previousPhi_NextEta = nullptr;
122 const Trk::Surface* nextPhi_NextEta = nullptr;
123
124 std::span<Trk::Surface const * const> surf = m_bin_array->arrayObjects();
125 size_t offset = 0;
126 for (unsigned int bin = 0; bin < m_singleBinUtils.size(); bin++) {
127 int etamod =
129 ? pixIdHelper->eta_module(
130 (*(surf[offset])).associatedDetectorElementIdentifier())
131 : sctIdHelper->eta_module(
132 (*(surf[offset])).associatedDetectorElementIdentifier());
133
134 if (etamod == etaModule || etamod < (etaModule - 1) ||
135 etamod > (etaModule + 1)) {
136 offset += (std::as_const(m_singleBinUtils).at(bin)).bins();
137 continue;
138 }
139
140 double PrevDeltaPhi = 9999.;
141 double NextDeltaPhi = -9999.;
142 for (unsigned int ss = offset; ss < (offset+(std::as_const(m_singleBinUtils).at(bin)).bins()); ss++ ) {
143 if (etamod == (etaModule-1) ) {
144 if( tsf.center().phi() == (*(surf[ss])).center().phi() )
145 samePhi_PrevEta = surf[ss];
146 double DeltaPhi = tsf.center().phi() - (*(surf[ss])).center().phi();
147 if( DeltaPhi < PrevDeltaPhi && DeltaPhi > 0) {
148 previousPhi_PrevEta = surf[ss];
149 PrevDeltaPhi = DeltaPhi;
150 }
151 if( DeltaPhi > NextDeltaPhi && DeltaPhi < 0) {
152 nextPhi_PrevEta = surf[ss];
153 NextDeltaPhi = DeltaPhi;
154 }
155 } else if (etamod == (etaModule+1) ) {
156 if( tsf.center().phi() == (*(surf[ss])).center().phi() )
157 samePhi_NextEta = surf[ss];
158 double DeltaPhi = tsf.center().phi() - (*(surf[ss])).center().phi();
159 if( DeltaPhi < PrevDeltaPhi && DeltaPhi > 0) {
160 previousPhi_NextEta = surf[ss];
161 PrevDeltaPhi = DeltaPhi;
162 }
163
164 if( DeltaPhi > NextDeltaPhi && DeltaPhi < 0) {
165 nextPhi_NextEta = surf[ss];
166 NextDeltaPhi = DeltaPhi;
167 }
168 }
169 }
170 offset += (std::as_const(m_singleBinUtils).at(bin)).bins();
171 }
172
173 if (samePhi_PrevEta) {
174 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(samePhi_PrevEta->associatedDetectorElement());
175 if (PhiEta_Element) {
176 addSurfaceDO(PhiEta_Element,surfaces);
177 addOtherSideDO(PhiEta_Element, surfaces);
178 }
179 }
180
181 if (previousPhi_PrevEta) {
182 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(previousPhi_PrevEta->associatedDetectorElement());
183 if (PhiEta_Element) {
184 addSurfaceDO(PhiEta_Element,surfaces);
185 addOtherSideDO(PhiEta_Element, surfaces);
186
187 addPrevInPhiDO(PhiEta_Element,surfaces);
188 addPrevInPhiDO(PhiEta_Element->prevInPhi(),surfaces);
189 }
190 }
191
192 if (nextPhi_PrevEta) {
193 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(nextPhi_PrevEta->associatedDetectorElement());
194 if (PhiEta_Element) {
195 addSurfaceDO(PhiEta_Element,surfaces);
196 addOtherSideDO(PhiEta_Element, surfaces);
197
198 addNextInPhiDO(PhiEta_Element,surfaces);
199 addNextInPhiDO(PhiEta_Element->nextInPhi(),surfaces);
200 }
201 }
202
203 if (samePhi_NextEta) {
204 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(samePhi_NextEta->associatedDetectorElement());
205 if (PhiEta_Element) {
206 addSurfaceDO(PhiEta_Element,surfaces);
207 addOtherSideDO(PhiEta_Element, surfaces);
208 }
209 }
210
211 if (previousPhi_NextEta) {
212 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(previousPhi_NextEta->associatedDetectorElement());
213 if (PhiEta_Element) {
214 addSurfaceDO(PhiEta_Element,surfaces);
215 addOtherSideDO(PhiEta_Element, surfaces);
216
217 addPrevInPhiDO(PhiEta_Element,surfaces);
218 addPrevInPhiDO(PhiEta_Element->prevInPhi(),surfaces);
219 }
220 }
221
222 if (nextPhi_NextEta) {
223 const InDetDD::SiDetectorElement* PhiEta_Element = dynamic_cast<const InDetDD::SiDetectorElement*>(nextPhi_NextEta->associatedDetectorElement());
224 if (PhiEta_Element) {
225 addSurfaceDO(PhiEta_Element,surfaces);
226 addOtherSideDO(PhiEta_Element, surfaces);
227
228 addNextInPhiDO(PhiEta_Element,surfaces);
229 addNextInPhiDO(PhiEta_Element->nextInPhi(),surfaces);
230 }
231 }
232 }
233 }
234
235 return false;
236
237}
238
239bool InDet::DiscOverlapDescriptor::dumpSurfaces(std::vector<Trk::SurfaceIntersection>& surfaces) const {
240 std::cout << "Dumping Surfaces for " << (m_pixelCase ? "Pixel " : "SCT ")
241 << "with size = " << surfaces.size() << std::endl;
242 static const StoreGateSvc* const detStore = getDetStore();
243 static const PixelID* const pixIdHelper = getPixelID(detStore);
244 static const SCT_ID* const sctIdHelper = getSCT_ID(detStore);
245
246 for (auto & surface : surfaces) {
247 Identifier hitId = (surface.object)->associatedDetectorElementIdentifier();
248 if (m_pixelCase)
249 std::cout << "barrel_ec " << pixIdHelper->barrel_ec(hitId)
250 << ", layer_disk " << pixIdHelper->layer_disk(hitId)
251 << ", phi_module " << pixIdHelper->phi_module(hitId)
252 << ", eta_module " << pixIdHelper->eta_module(hitId) << std::endl;
253 else
254 std::cout << "barrel_ec " << sctIdHelper->barrel_ec(hitId)
255 << ", layer_disk " << sctIdHelper->layer_disk(hitId)
256 << ", phi_module " << sctIdHelper->phi_module(hitId)
257 << ", eta_module " << sctIdHelper->eta_module(hitId)
258 << ", side " << sctIdHelper->side(hitId) << std::endl;
259 }
260 return true;
261}
262
263
#define addNextInPhiDO(cur, surfaces)
#define addPrevInPhiDO(cur, surfaces)
#define addSurfaceDO(cur, surfaces)
#define addOtherSideDO(cur, surfaces)
static Double_t ss
static const std::vector< std::string > bins
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
Class to hold geometrical description of a silicon detector element.
const SiDetectorElement * prevInPhi() const
const SiDetectorElement * nextInPhi() const
const SiDetectorElement * otherSide() const
Useful for SCT only.
std::vector< Trk::BinUtility > m_singleBinUtils
bool dumpSurfaces(std::vector< Trk::SurfaceIntersection > &surfaces) const
bool reachableSurfaces(std::vector< Trk::SurfaceIntersection > &surfaces, const Trk::Surface &sf, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const override
get the compatible surfaces
const Trk::BinnedArray< Trk::Surface > * m_bin_array
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:67
int layer_disk(const Identifier &id) const
Definition PixelID.h:607
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition PixelID.h:600
int eta_module(const Identifier &id) const
Definition PixelID.h:632
int phi_module(const Identifier &id) const
Definition PixelID.h:625
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
int layer_disk(const Identifier &id) const
Definition SCT_ID.h:687
int side(const Identifier &id) const
Definition SCT_ID.h:705
int phi_module(const Identifier &id) const
Definition SCT_ID.h:693
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition SCT_ID.h:681
int eta_module(const Identifier &id) const
Definition SCT_ID.h:699
The Athena Transient Store API.
Binned Array for avoiding map searches/.
Definition BinnedArray.h:36
Abstract Base Class for tracking surfaces.
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
Identifier associatedDetectorElementIdentifier() const
return Identifier of the associated Detector Element
const Amg::Vector3D & center() const
Returns the center position of the Surface.
Eigen::Matrix< double, 3, 1 > Vector3D