ATLAS Offline Software
InDetBoundaryCheckTool.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3  */
4 
10 
11 #include "InDetIdentifier/SCT_ID.h"
12 
14  const std::string& t,
15  const std::string& n,
16  const IInterface* p
17 ):
18  AthAlgTool(t, n, p),
19  m_geoModelSvc("GeoModelSvc", n),
20  m_atlasId(nullptr)
21 {
22  declareInterface<IBoundaryCheckTool>(this);
23  declareProperty("GeoModelService", m_geoModelSvc);
24 }
25 
28 
29  if (sc.isFailure()) return sc;
30 
31  ATH_CHECK(detStore()->retrieve(m_atlasId, "AtlasID"));
32 
33  ATH_CHECK(m_pixelLayerTool.retrieve(DisableTool{!m_usePixel.value()}));
34  ATH_CHECK(m_sctCondSummaryTool.retrieve(DisableTool{!m_useSCT.value() || (!m_sctDetElStatus.empty() && !VALIDATE_STATUS_ARRAY_ACTIVATED)}));
36  if (m_useSCT.value() && !m_sctDetElStatus.empty()) {
37  ATH_CHECK( detStore()->retrieve(m_sctID,"SCT_ID") );
38  }
39 
40  if (m_checkBadSCT.value()) {
41  /*
42  * Check if ITk Strip is used because isBadSCTChipStrip method is
43  * valid only for SCT.
44  */
45  ATH_CHECK(m_geoModelSvc.retrieve());
46 
47  if (m_geoModelSvc->geoConfig()==GeoModel::GEO_RUN4) {
48  m_checkBadSCT.set(false);
49  ATH_MSG_WARNING("Since ITk Strip is used, m_check_bad_sct is turned off.");
50  }
51  }
52  return StatusCode::SUCCESS;
53 }
54 
56  return AlgTool::finalize();
57 }
58 
60  [[maybe_unused]] const InDetDD::SiDetectorElement &element,
62 ) const {
63  return m_pixelLayerTool->expectHit(&parameters);
64 }
65 
67  const InDetDD::SiDetectorElement &element,
69 ) const {
70  const EventContext& ctx{Gaudi::Hive::currentContext()};
72  if (m_checkBadSCT.value() && isBadSCTChipStrip(!m_sctDetElStatus.empty() ? sctDetElStatus.cptr() : nullptr, element.identify(), parameters, element)) {
73  return false;
74  }
75  VALIDATE_STATUS_ARRAY(!m_sctDetElStatus.empty(),sctDetElStatus->isGood(element.identifyHash()), m_sctCondSummaryTool->isGood(element.identifyHash(), ctx));
76  return !m_sctDetElStatus.empty() ? sctDetElStatus->isGood(element.identifyHash()) : m_sctCondSummaryTool->isGood(element.identifyHash(), ctx);
77 }
78 
80  const InDetDD::SiDetectorElement &siElement,
82 ) const {
83  /*
84  * We're supporting SCT and Pixel elements. Some of the checking code can
85  * be shared, and some of it is different for these detector types. This
86  * method will perform all the shared checks that apply to both SCTs and
87  * pixels.
88  */
89  double phitol;
90  double etatol;
91 
92  /*
93  * We set our \phi and \eta tolerances by scaling the configured value in
94  * the tool's parameters by the standard deviation of the relative
95  * positions. If we do not have a covariance matrix to gather these \sigma
96  * values from, we use default parameters of 2.5 for \phi and 5.0 for
97  * \eta.
98  */
99  if (parameters.covariance() != nullptr) {
100  /*
101  * From the covariance matrix, we grab the diagonal to get the
102  * variance vector. Then, if we take the component-wise square root
103  * of that, we get a vector of \sigma. Then all we need to do is use
104  * the right indexes to retrieve the values for \eta and \phi.
105  */
106  Eigen::Matrix<double, 5, 1> var = parameters.covariance()->diagonal().cwiseSqrt();
107  etatol = m_etaTol.value() * var(Trk::iEta);
108  phitol = m_phiTol.value() * var(Trk::iPhi);
109  } else {
110  /*
111  * If we don't have the covariance matrix, set our defaults. In the
112  * future, these two default values could be lifted into separate
113  * configuration parameters.
114  */
115  phitol = 2.5;
116  etatol = 5;
117  }
118 
119 
120  /*
121  * Next, we determine whether the hit is in the active region of the
122  * element using the SiDetectorElement::inDetector() method followed by
123  * the SiIntersect::in() method.
124  */
126  parameters.localPosition(), phitol, etatol
127  );
128 
130  if (intersection.nearBoundary()){
131 
132  /*
133  * If we are around the boundary, we return a special state which
134  * will not be counted as a hole or missing hit in the pattern,
135  * while still being recorded on the trajectory for later
136  * refinement.
137  */
139  }
140 
141  if (intersection.out()) {
142  /*
143  * In this case, we are _not_ inside the active region of the element.
144  */
146  }
147 
148  /* Now, to proceed further we need to confirm that the module is actually active
149  */
150 
151  Identifier id = siElement.identify();
152 
153  bool alive;
154 
155  /*
156  * If we have not yet determined our hit to lie in any inactive region, we
157  * check whether the module hit is actually alive. For this, we deletage
158  * to two dedicated methods which essentially wrap external tools which
159  * know about element states.
160  */
161  if (m_usePixel.value() && m_atlasId->is_pixel(id)) {
162  alive = isAlivePixel(siElement, parameters);
163  } else if (m_useSCT.value() && m_atlasId->is_sct(id)) {
164  alive = isAliveSCT(siElement, parameters);
165  } else {
166  ATH_MSG_WARNING("Unsupported identifier type! "+m_atlasId->print_to_string(id));
168  }
169 
170  /*
171  * We now have all the necessary information to make a judgement about the
172  * track parameters.
173  */
174  if (alive) {
175 
176  /*
177  * now, we check whether the local position on the silicon element is
178  * near the bonding gap of the module, which is insensitive. For this, we
179  * can simply delegate to the SiDetectorElement::newBondGap() method.
180  *
181  * Keen-eyed readers may note that bond gaps are only relevant for SCT
182  * modules and that Pixels do not have them. Therefore, we can technically
183  * consider this a check relevant only to SCTs. However, as this logic is
184  * abstracted into the SiDetectorElement class, we will treat is as a
185  * shared property and a shared check.
186  */
187  if (siElement.nearBondGap(parameters.localPosition(), etatol )) {
189  }
190  /*
191  * If the module is alive and we hit the active region on it, we know
192  * we have a good hit. Note that this is the only way we can return a
193  * Candidate result! It's the only success state.
194  */
196 
197  }
198  else {
199  /*
200  * Finally, if the module is not alive, we simply return a DeadElement
201  * result.
202  */
204  }
205 }
206 
209 ) const {
210  /*
211  * Retrieve the detector element associated with our track parameters. If
212  * such an element does not exist for whatever reason, return a negative
213  * result.
214  */
215  const Trk::TrkDetElementBase *element = parameters.associatedSurface().associatedDetectorElement();
216 
217  if (element == nullptr) {
219  }
220 
221  /*
222  * Try to see if detector element is a silicon element, otherwise return a
223  * negative result: this tool is not designed to work on non-silicon
224  * elements.
225  */
226  const InDetDD::SiDetectorElement *siElement = dynamic_cast<const InDetDD::SiDetectorElement *>(element);
227 
228  if (siElement != nullptr) {
229  return boundaryCheckSiElement(*siElement, parameters);
230  } else {
231  ATH_MSG_DEBUG("TrackParameters do not belong to a type of element we can process");
233  }
234 }
235 
237  const InDet::SiDetectorElementStatus *sctDetElStatus,
238  const Identifier &waferId,
240  const InDetDD::SiDetectorElement &siElement
241 ) const {
242  // Check if the track passes through a bad SCT ABCD chip or a bad SCT strip.
243  // A chip and a strip are determined by the parameter position.
244  // Algorithm is based on InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTHitEffMonTool.cxx
245 
246  // Check the input.
247  if (!m_atlasId->is_sct(waferId)) {
248  ATH_MSG_ERROR(waferId << " is not an SCT Identifier");
249  return true;
250  }
251 
252  // Get strip id from local position.
253  // Due to the limited position resolution, we may pick up a neighboring strip...
254  const Amg::Vector2D localPos(parameters.localPosition());
255  const Identifier stripIdentifier(siElement.identifierOfPosition(localPos));
256 
257  if (!m_atlasId->is_sct(stripIdentifier)) {
258  ATH_MSG_WARNING(stripIdentifier << " is not an SCT Identifier");
259  return true;
260  }
261 
262  {
263  const EventContext& ctx{Gaudi::Hive::currentContext()};
264  if (sctDetElStatus) {
265  unsigned int chip_i=SCT::getGeometricalChipID(*m_sctID, stripIdentifier);
266  VALIDATE_STATUS_ARRAY(sctDetElStatus,sctDetElStatus->isChipGood(siElement.identifyHash(), chip_i) && sctDetElStatus->isCellGood(siElement.identifyHash(), m_sctID->strip(stripIdentifier) ),m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_CHIP, ctx) && m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_STRIP, ctx));
267  if (!sctDetElStatus->isChipGood(siElement.identifyHash(), chip_i)) return true;
268 
269  return !sctDetElStatus->isCellGood(siElement.identifyHash(), m_sctID->strip(stripIdentifier) );
270  }
271  else {
272  if (!m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_CHIP, ctx)) {
273  // The position is on a bad chip.
274  return true;
275  } else if (!m_sctCondSummaryTool->isGood(stripIdentifier, InDetConditions::SCT_STRIP, ctx)) {
276  // The position is on a bad strip. (We may need to check neighboring strips.)
277  return true;
278  }
279  }
280  }
281  return false;
282 }
InDet::InDetBoundaryCheckTool::m_etaTol
Gaudi::Property< double > m_etaTol
eta and phi tolerances
Definition: InDetBoundaryCheckTool.h:80
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
AtlasDetectorID::is_pixel
bool is_pixel(Identifier id) const
Definition: AtlasDetectorID.h:760
InDetDD::SolidStateDetectorElementBase::identifierOfPosition
Identifier identifierOfPosition(const Amg::Vector2D &localPos) const
Full identifier of the cell for a given position: assumes a raw local position (no Lorentz shift)
Definition: SolidStateDetectorElementBase.cxx:217
beamspotnt.var
var
Definition: bin/beamspotnt.py:1394
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:53
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
TrackParameters.h
Trk::BoundaryCheckResult::DeadElement
@ DeadElement
outside the element
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Trk::BoundaryCheckResult
BoundaryCheckResult
Definition: IBoundaryCheckTool.h:14
InDetDD::SolidStateDetectorElementBase::inDetector
SiIntersect inDetector(const Amg::Vector2D &localPosition, double phiTol, double etaTol) const
Test that it is in the active region.
Definition: SolidStateDetectorElementBase.cxx:204
Trk::BoundaryCheckResult::Insensitive
@ Insensitive
close to the edge of an active element
InDet::SiDetectorElementStatus::isChipGood
bool isChipGood(IdentifierHash hash, unsigned int chip) const
Definition: SiDetectorElementStatus.h:100
AtlasDetectorID::is_sct
bool is_sct(Identifier id) const
Definition: AtlasDetectorID.h:770
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
InDet::InDetBoundaryCheckTool::m_sctID
const SCT_ID * m_sctID
Definition: InDetBoundaryCheckTool.h:96
InDet::InDetBoundaryCheckTool::m_usePixel
Gaudi::Property< bool > m_usePixel
Control usage of pixel and SCT info.
Definition: InDetBoundaryCheckTool.h:84
InDetConditions::SCT_CHIP
@ SCT_CHIP
Definition: InDetHierarchy.h:14
initialize
void initialize()
Definition: run_EoverP.cxx:894
Trk::BoundaryCheckResult::Candidate
@ Candidate
SCT_ChipUtils.h
InDet::InDetBoundaryCheckTool::boundaryCheck
virtual Trk::BoundaryCheckResult boundaryCheck(const Trk::TrackParameters &) const override
Definition: InDetBoundaryCheckTool.cxx:207
InDet::InDetBoundaryCheckTool::isAliveSCT
bool isAliveSCT(const InDetDD::SiDetectorElement &element, const Trk::TrackParameters &parameters) const
Definition: InDetBoundaryCheckTool.cxx:66
InDet::InDetBoundaryCheckTool::m_geoModelSvc
ServiceHandle< IGeoModelSvc > m_geoModelSvc
Definition: InDetBoundaryCheckTool.h:61
Trk::TrkDetElementBase
Definition: TrkDetElementBase.h:52
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDet::SiDetectorElementStatus::isCellGood
bool isCellGood(IdentifierHash hash, unsigned short cell_i) const
Definition: SiDetectorElementStatus.h:107
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
intersection
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
Definition: compareFlatTrees.cxx:25
InDetDD::SolidStateDetectorElementBase::identifyHash
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
InDet::InDetBoundaryCheckTool::isAlivePixel
bool isAlivePixel(const InDetDD::SiDetectorElement &element, const Trk::TrackParameters &parameters) const
Definition: InDetBoundaryCheckTool.cxx:59
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Trk::iEta
@ iEta
(old readout) will be skipped
Definition: ParamDefs.h:54
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
VALIDATE_STATUS_ARRAY
#define VALIDATE_STATUS_ARRAY(use_info, info_val, summary_val)
Definition: SiDetectorElementStatus.h:51
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDet::InDetBoundaryCheckTool::initialize
virtual StatusCode initialize() override
Definition: InDetBoundaryCheckTool.cxx:26
InDet::InDetBoundaryCheckTool::finalize
virtual StatusCode finalize() override
Definition: InDetBoundaryCheckTool.cxx:55
GeoModel::GEO_RUN4
@ GEO_RUN4
Definition: IGeoDbTagSvc.h:21
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::ParametersBase
Definition: ParametersBase.h:55
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
Trk::BoundaryCheckResult::Outside
@ Outside
with the insensitive area of an active element
InDet::InDetBoundaryCheckTool::m_pixelLayerTool
ToolHandle< IInDetTestPixelLayerTool > m_pixelLayerTool
Definition: InDetBoundaryCheckTool.h:70
InDet::InDetBoundaryCheckTool::isBadSCTChipStrip
bool isBadSCTChipStrip(const InDet::SiDetectorElementStatus *, const Identifier &, const Trk::TrackParameters &, const InDetDD::SiDetectorElement &) const
Definition: InDetBoundaryCheckTool.cxx:236
InDetBoundaryCheckTool.h
InDet::InDetBoundaryCheckTool::m_useSCT
Gaudi::Property< bool > m_useSCT
Definition: InDetBoundaryCheckTool.h:85
InDet::InDetBoundaryCheckTool::getSCTDetElStatus
SG::ReadHandle< InDet::SiDetectorElementStatus > getSCTDetElStatus(const EventContext &ctx) const
Definition: InDetBoundaryCheckTool.h:100
AtlasDetectorID::print_to_string
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
Definition: AtlasDetectorID.cxx:655
InDet::SiDetectorElementStatus::isGood
bool isGood(IdentifierHash hash) const
Definition: SiDetectorElementStatus.h:97
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDet::InDetBoundaryCheckTool::InDetBoundaryCheckTool
InDetBoundaryCheckTool(const std::string &, const std::string &, const IInterface *)
Definition: InDetBoundaryCheckTool.cxx:13
Trk::iPhi
@ iPhi
Definition: ParamDefs.h:53
InDetDD::SiIntersect
Definition: SiIntersect.h:23
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_ID::strip
int strip(const Identifier &id) const
Definition: SCT_ID.h:764
InDet::InDetBoundaryCheckTool::m_atlasId
const AtlasDetectorID * m_atlasId
Definition: InDetBoundaryCheckTool.h:77
IBoundaryCheckTool.h
SCT::getGeometricalChipID
constexpr unsigned int getGeometricalChipID(unsigned int strip)
Get the geometrical chip ID for the given strip.
Definition: SCT_ChipUtils.h:71
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
InDetDD::SiDetectorElement::nearBondGap
bool nearBondGap(const Amg::Vector2D &localPosition, double etaTol) const
Test if near bond gap within tolerances.
Definition: SiDetectorElement.cxx:323
Trk::BoundaryCheckResult::Error
@ Error
within the nominally active area of a dead element
AthAlgTool
Definition: AthAlgTool.h:26
InDet::InDetBoundaryCheckTool::m_sctCondSummaryTool
ToolHandle< IInDetConditionsTool > m_sctCondSummaryTool
Definition: InDetBoundaryCheckTool.h:63
InDetConditions::SCT_STRIP
@ SCT_STRIP
Definition: InDetHierarchy.h:14
InDet::InDetBoundaryCheckTool::m_checkBadSCT
Gaudi::Property< bool > m_checkBadSCT
Control check of bad SCT chip (should be false for ITk Strip)
Definition: InDetBoundaryCheckTool.h:88
InDet::InDetBoundaryCheckTool::boundaryCheckSiElement
Trk::BoundaryCheckResult boundaryCheckSiElement(const InDetDD::SiDetectorElement &, const Trk::TrackParameters &) const
Definition: InDetBoundaryCheckTool.cxx:79
IGeoModelSvc.h
InDet::InDetBoundaryCheckTool::m_sctDetElStatus
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_sctDetElStatus
Optional read handle to get status data to test whether a SCT detector element is good.
Definition: InDetBoundaryCheckTool.h:94
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
InDet::InDetBoundaryCheckTool::m_phiTol
Gaudi::Property< double > m_phiTol
Definition: InDetBoundaryCheckTool.h:81
Trk::BoundaryCheckResult::OnEdge
@ OnEdge
within the sensitive area of an active element