ATLAS Offline Software
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 
17 #include "StoreGate/StoreGateSvc.h"
18 #include "InDetIdentifier/SCT_ID.h"
20 #include "Identifier/Identifier.h"
21 #include <utility>
22 #include <exception>
23 
24 namespace {
25 
26 //Helpers to do "pseudo retrievals"
27 //if this was an alg/tool these would have been done
28 //once in init.
29 
30 const StoreGateSvc*
31 getDetStore()
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 
41 const PixelID*
42 getPixelID(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 
51 const SCT_ID*
52 getSCT_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  std::vector<Trk::BinUtility*>* singleBinUtils,
65  bool isPixel):
66  m_bin_array(bin_array),
67  m_singleBinUtils(singleBinUtils),
68  m_pixelCase(isPixel)
69 {}
70 
71 bool 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 =
89  : sctIdHelper->eta_module(tsf.associatedDetectorElementIdentifier());
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 
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 
239 bool 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 
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
Trk::Intersection
Definition: Intersection.h:24
Trk::Surface::associatedDetectorElement
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
Surface.h
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
InDet::DiscOverlapDescriptor::m_singleBinUtils
std::vector< Trk::BinUtility * > * m_singleBinUtils
Definition: DiscOverlapDescriptor.h:119
Trk::Surface::associatedDetectorElementIdentifier
Identifier associatedDetectorElementIdentifier() const
return Identifier of the associated Detector Element
bin
Definition: BinsDiffFromStripMedian.h:43
DiscOverlapDescriptor.h
addOtherSideDO
#define addOtherSideDO(cur, surfaces)
Definition: DiscOverlapDescriptor.h:31
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
Trk::Surface::center
const Amg::Vector3D & center() const
Returns the center position of the Surface.
CaloSwCorrections.etamod
def etamod(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:206
GeoPrimitives.h
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:125
InDetDD::SiDetectorElement::nextInPhi
const SiDetectorElement * nextInPhi() const
plotting.yearwise_luminosity_vs_mu.bins
bins
Definition: yearwise_luminosity_vs_mu.py:30
InDetDD::SiDetectorElement::prevInPhi
const SiDetectorElement * prevInPhi() const
PixelID::layer_disk
int layer_disk(const Identifier &id) const
Definition: PixelID.h:626
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
PixelID::eta_module
int eta_module(const Identifier &id) const
Definition: PixelID.h:651
InDetDD::SiDetectorElement::otherSide
const SiDetectorElement * otherSide() const
Useful for SCT only.
InDet::DiscOverlapDescriptor::m_bin_array
const Trk::BinnedArray< Trk::Surface > * m_bin_array
Definition: DiscOverlapDescriptor.h:118
Trk::BinnedArray::arrayObjects
virtual BinnedArraySpan< T *const > arrayObjects()=0
Return all objects of the Array non-const we can still modify the T.
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
SiDetectorElement.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
SCT_ID
Definition: SCT_ID.h:68
InDet::DiscOverlapDescriptor::reachableSurfaces
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
Definition: DiscOverlapDescriptor.cxx:71
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
addNextInPhiDO
#define addNextInPhiDO(cur, surfaces)
Definition: DiscOverlapDescriptor.h:37
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
InDet::DiscOverlapDescriptor::m_pixelCase
bool m_pixelCase
Definition: DiscOverlapDescriptor.h:120
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
addPrevInPhiDO
#define addPrevInPhiDO(cur, surfaces)
Definition: DiscOverlapDescriptor.h:41
Trk::BinnedArray< Trk::Surface >
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
PixelID
Definition: PixelID.h:67
StoreGateSvc.h
Trk::BinnedArraySpan
std::span< T > BinnedArraySpan
Definition: BinnedArray.h:34
addSurfaceDO
#define addSurfaceDO(cur, surfaces)
Definition: DiscOverlapDescriptor.h:26
InDet::DiscOverlapDescriptor::DiscOverlapDescriptor
DiscOverlapDescriptor(const Trk::BinnedArray< Trk::Surface > *bin_array=0, std::vector< Trk::BinUtility * > *singleBinUtils=0, bool isPixel=false)
Constructor.
Definition: DiscOverlapDescriptor.cxx:63
InDet::DiscOverlapDescriptor::dumpSurfaces
bool dumpSurfaces(std::vector< Trk::SurfaceIntersection > &surfaces) const
Definition: DiscOverlapDescriptor.cxx:239
Identifier
Definition: IdentifierFieldParser.cxx:14