ATLAS Offline Software
Loading...
Searching...
No Matches
MuonSeededSegmentFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <iostream>
8
17#include "TrkRoad/TrackRoad.h"
20
21namespace Muon {
22
23 MuonSeededSegmentFinder::MuonSeededSegmentFinder(const std::string& ty, const std::string& na, const IInterface* pa) :
24 base_class(ty, na, pa), m_magFieldProperties(Trk::NoField) {}
25
27
28
29 ATH_CHECK(m_key_mdt.initialize(!m_key_mdt.empty()));
30 ATH_CHECK(m_key_csc.initialize(!m_key_csc.empty())); // check for layouts without CSCs
31 ATH_CHECK(m_key_tgc.initialize(!m_key_tgc.empty()));
32 ATH_CHECK(m_key_rpc.initialize(!m_key_rpc.empty()));
33 ATH_CHECK(m_key_stgc.initialize(!m_key_stgc.empty())); // check for layouts without STGCs
34 ATH_CHECK(m_key_mm.initialize(!m_key_mm.empty())); // check for layouts without MicroMegas
35
36 ATH_CHECK(m_DetectorManagerKey.initialize());
37 ATH_CHECK(m_segMaker.retrieve());
38 ATH_CHECK(m_segMakerNoHoles.retrieve());
39 ATH_CHECK(m_propagator.retrieve());
40 ATH_CHECK(m_mdtRotCreator.retrieve());
41 ATH_CHECK(m_idHelperSvc.retrieve());
42 ATH_CHECK(m_printer.retrieve());
43
44
45
46 return StatusCode::SUCCESS;
47 }
48
49 std::unique_ptr<Trk::SegmentCollection> MuonSeededSegmentFinder::find(const EventContext& ctx, const Trk::TrackParameters& pars,
50 const std::set<Identifier>& chIds) const {
51 // get MdtPrepData collections correspondign to the chamber Identifiers
52 std::vector<const MdtPrepData*> mdtPrds = extractPrds(ctx, chIds);
53
54 if (mdtPrds.empty()) {
55 ATH_MSG_DEBUG(" no MdtPrepData found ");
56 return {};
57 }
58
59 // find segments
60 return find(ctx, pars, mdtPrds);
61 }
62
63 std::unique_ptr<Trk::SegmentCollection> MuonSeededSegmentFinder::find(const EventContext& ctx, const Trk::TrackParameters& pars,
64 const std::set<IdentifierHash>& chIdHs) const {
65 // get MdtPrepData collections correspondign to the chamber Identifiers
66 std::vector<const MdtPrepData*> mdtPrds = extractPrds(ctx, chIdHs);
67
68 if (mdtPrds.empty()) {
69 ATH_MSG_DEBUG(" no MdtPrepData found ");
70 return {};
71 }
72
73 // find segments
74 return find(ctx, pars, mdtPrds);
75 }
76
77 std::unique_ptr<Trk::SegmentCollection> MuonSeededSegmentFinder::find(const EventContext& ctx, const Trk::TrackParameters& pars,
78 const std::vector<const MdtPrepData*>& mdtPrds) const {
79 // are we close to the chamber edge?
80 bool doHoleSearch = true;
81
82 // select and calibrate the MdtPrepData
83 std::vector<const MdtDriftCircleOnTrack*> mdtROTs;
84 mdtROTs.reserve(mdtPrds.size());
85 selectAndCalibrate(ctx, pars, mdtPrds, mdtROTs, doHoleSearch);
86
87 if (mdtROTs.empty()) {
88 ATH_MSG_DEBUG(" no MdtDriftCircles selected ");
89 return nullptr;
90 }
91
92 // create track road
93 double roadWidthEta = 1.;
94 if (pars.covariance()) {
95 double trackError = Amg::error(*pars.covariance(), Trk::theta);
96 ATH_MSG_DEBUG(" local track Error on theta " << trackError);
97 if (trackError < 0.2) trackError = 0.2;
98 roadWidthEta = 5. * trackError;
99 }
100 Trk::TrackRoad road(pars.position(), pars.momentum(), roadWidthEta, 1.);
101
102 // create dummy vector<vector>
103 std::vector<std::vector<const MdtDriftCircleOnTrack*> > mdtROTsVec;
104 mdtROTsVec.push_back(mdtROTs);
105 std::vector<std::vector<const MuonClusterOnTrack*> > clusterROTsVec;
106
107 // call segment finder
108 std::unique_ptr<Trk::SegmentCollection> segments(new Trk::SegmentCollection());
109 doHoleSearch ? m_segMaker->find(road, mdtROTsVec, clusterROTsVec, segments.get(), true)
110 : m_segMakerNoHoles->find(road, mdtROTsVec, clusterROTsVec, segments.get(), true);
111
112 // delete ROTs
113 std::for_each(mdtROTs.begin(), mdtROTs.end(), MuonDeleteObject<const MdtDriftCircleOnTrack>());
114
115 if (!segments) {
116 ATH_MSG_DEBUG(" No segments found ");
117 } else {
118 ATH_MSG_DEBUG(" Number of segments found: " << segments->size());
119 }
120
121 return segments;
122 }
123
124 std::vector<const MdtPrepData*> MuonSeededSegmentFinder::extractPrds(const EventContext& ctx, const std::set<Identifier>& chIds) const {
126 const MuonGM::MuonDetectorManager* MuonDetMgr{*DetectorManagerHandle};
127 if (MuonDetMgr == nullptr) {
128 ATH_MSG_ERROR("Null pointer to the read MuonDetectorManager conditions object");
129 // return;
130 }
131
132 // set of IdHashes corresponding to these identifiers
133 std::set<IdentifierHash> chIdHs;
134
135 // loop over chambers and get collections
136 std::set<Identifier>::const_iterator chit = chIds.begin();
137 std::set<Identifier>::const_iterator chit_end = chIds.end();
138 for (; chit != chit_end; ++chit) {
139 if (!m_idHelperSvc->isMdt(*chit)) {
140 ATH_MSG_WARNING(" Requested chamber is not an MDT: " << m_idHelperSvc->toStringChamber(*chit));
141 continue;
142 }
143
144 const MuonGM::MdtReadoutElement* detEl = MuonDetMgr->getMdtReadoutElement(*chit);
145 if (!detEl) {
146 ATH_MSG_WARNING(" Requested chamber does not exist in geometry: " << m_idHelperSvc->toStringChamber(*chit));
147 continue;
148 }
149 chIdHs.insert(detEl->identifyHash());
150 }
151
152 // vector to store pointers to collections
153 std::vector<const MdtPrepData*> mdtPrds = extractPrds(ctx, chIdHs);
154
155 return mdtPrds;
156 }
157
158 std::vector<const MdtPrepData*> MuonSeededSegmentFinder::extractPrds(const EventContext& ctx,
159 const std::set<IdentifierHash>& chIdHs) const {
161 const Muon::MdtPrepDataContainer* mdtPrdContainer;
162 if (h_mdtPrdCont.isValid()) {
163 mdtPrdContainer = h_mdtPrdCont.cptr();
164 } else {
165 ATH_MSG_WARNING("Cannot retrieve mdtPrepDataContainer " << m_key_mdt.key());
166 return {};
167 }
168
169 // vector to store pointers to collections
170 std::vector<const MdtPrepData*> mdtPrds;
171
172 // loop over chambers and get collections
173 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
174 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
175 for (; chit != chit_end; ++chit) {
176 const auto* collptr = mdtPrdContainer->indexFindPtr(*chit);
177 if (collptr == nullptr) { continue; }
178
179 // reserve space for the new PRDs
180 mdtPrds.insert(mdtPrds.end(), collptr->begin(), collptr->end());
181 }
182
183 return mdtPrds;
184 }
185
186 void MuonSeededSegmentFinder::extractMdtPrdCols(const EventContext& ctx, const std::set<IdentifierHash>& chIdHs,
187 std::vector<const MdtPrepDataCollection*>& target) const {
188
189 if (m_key_mdt.empty()) return;
190 SG::ReadHandle mdtPrdContainer{m_key_mdt, ctx};
191 if (mdtPrdContainer->empty()) return;
192
193 // loop over chambers and get collections
194 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
195 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
196 for (; chit != chit_end; ++chit) {
197 const auto* collptr = mdtPrdContainer->indexFindPtr(*chit);
198 if (collptr == nullptr || collptr->empty()) { continue; }
199 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
200 << collptr->size());
201
202 // reserve space for the new PRDs
203 target.push_back(collptr);
204 }
205 }
206
207 void MuonSeededSegmentFinder::extractRpcPrdCols(const EventContext& ctx, const std::set<IdentifierHash>& chIdHs,
208 std::vector<const RpcPrepDataCollection*>& target) const {
209 if (m_key_rpc.empty()) return;
210 SG::ReadHandle rpcPrdContainer{m_key_rpc, ctx};
211 if (rpcPrdContainer->empty()) return;
212
213 // loop over chambers and get collections
214 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
215 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
216 for (; chit != chit_end; ++chit) {
217 const auto* collptr = rpcPrdContainer->indexFindPtr(*chit);
218 if (collptr == nullptr || collptr->empty()) { continue; }
219 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
220 << collptr->size());
221
222 // reserve space for the new PRDs
223 target.push_back(collptr);
224 }
225 }
226
227 void MuonSeededSegmentFinder::extractTgcPrdCols(const EventContext& ctx, const std::set<IdentifierHash>& chIdHs,
228 std::vector<const TgcPrepDataCollection*>& target) const {
229 if (m_key_tgc.empty()) return;
230 SG::ReadHandle tgcPrdContainer{m_key_tgc, ctx};
231 if (tgcPrdContainer->empty()) return;
232
233 // loop over chambers and get collections
234 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
235 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
236 for (; chit != chit_end; ++chit) {
237 const auto* collptr = tgcPrdContainer->indexFindPtr(*chit);
238 if (collptr == nullptr || collptr->empty()) { continue; }
239 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
240 << collptr->size());
241
242 // reserve space for the new PRDs
243 target.push_back(collptr);
244 }
245 }
246
247 void MuonSeededSegmentFinder::extractCscPrdCols(const std::set<IdentifierHash>& chIdHs,
248 std::vector<const CscPrepDataCollection*>& target) const {
249 if (m_key_csc.empty()) {
250 ATH_MSG_DEBUG("No CSC collection");
251 return;
252 }
253 SG::ReadHandle cscPrdContainer{m_key_csc};
254 if (cscPrdContainer->empty()) return;
255
256 // loop over chambers and get collections
257 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
258 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
259 for (; chit != chit_end; ++chit) {
260 const auto* collptr = cscPrdContainer->indexFindPtr(*chit);
261 if (collptr == nullptr || collptr->empty()) { continue; }
262
263 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
264 << collptr->size());
265
266 // reserve space for the new PRDs
267 target.push_back(collptr);
268 }
269 }
270
271 // New Small Wheel
272 // sTGC
273
274 void MuonSeededSegmentFinder::extractsTgcPrdCols(const EventContext& ctx, const std::set<IdentifierHash>& chIdHs,
275 std::vector<const sTgcPrepDataCollection*>& target) const {
276 if (m_key_stgc.key().empty()) {
277 ATH_MSG_DEBUG("no sTGC collection");
278 return;
279 }
280
282 const Muon::sTgcPrepDataContainer* stgcPrdContainer;
283 if (h_stgcPrdCont.isValid()) {
284 stgcPrdContainer = h_stgcPrdCont.cptr();
285 } else {
286 ATH_MSG_WARNING("Cannot retrieve stgcPrepDataContainer " << m_key_stgc.key());
287 return;
288 }
289 if (stgcPrdContainer->empty()) return;
290
291 // loop over chambers and get collections
292 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
293 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
294 for (; chit != chit_end; ++chit) {
295 const auto* collptr = stgcPrdContainer->indexFindPtr(*chit);
296 if (collptr == nullptr || collptr->empty()) { continue; }
297 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
298 << collptr->size());
299
300 // reserve space for the new PRDs
301 target.push_back(collptr);
302 }
303 }
304
305 // MM
306 void MuonSeededSegmentFinder::extractMMPrdCols(const std::set<IdentifierHash>& chIdHs,
307 std::vector<const MMPrepDataCollection*>& target) const {
308 if (m_key_mm.key().empty()) {
309 ATH_MSG_DEBUG("no MM collection");
310 return;
311 }
312
314 const Muon::MMPrepDataContainer* mmPrdContainer;
315 if (h_mmPrdCont.isValid()) {
316 mmPrdContainer = h_mmPrdCont.cptr();
317 } else {
318 ATH_MSG_WARNING("Cannot retrieve mmPrepDataContainer " << m_key_mm.key());
319 return;
320 }
321 if (mmPrdContainer->empty()) return;
322
323 // loop over chambers and get collections
324 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
325 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
326 for (; chit != chit_end; ++chit) {
327 const auto* collptr = mmPrdContainer->indexFindPtr(*chit);
328 if (collptr == nullptr || collptr->empty()) { continue; }
329 ATH_MSG_DEBUG(" Adding for: " << m_idHelperSvc->toStringChamber(collptr->front()->identify()) << " size "
330 << collptr->size());
331
332 target.push_back(collptr);
333 }
334 }
335
336 void MuonSeededSegmentFinder::selectAndCalibrate(const EventContext& ctx, const Trk::TrackParameters& pars,
337 const std::vector<const MdtPrepData*>& mdtPrdCols,
338 std::vector<const MdtDriftCircleOnTrack*>& mdtROTs, bool& doHoleSearch) const {
339 ATH_MSG_VERBOSE(" in selectAndCalibrate, get PRDs " << mdtPrdCols.size());
340
341 // loop over MdtPrepDataCollections
342 std::vector<const MdtPrepData*>::const_iterator mit = mdtPrdCols.begin();
343 std::vector<const MdtPrepData*>::const_iterator mit_end = mdtPrdCols.end();
344 for (; mit != mit_end; ++mit) {
345 if (!MC::isStable(*mit)) continue;
346 // calibrate MDT
347 const MdtDriftCircleOnTrack* mdt = handleMdtPrd(ctx, pars, **mit, doHoleSearch);
348
349 // not selected
350 if (!mdt) continue;
351
352 mdtROTs.push_back(mdt);
353 }
354 ATH_MSG_VERBOSE(" calibrated " << mdtROTs.size() << " prds out of " << mdtPrdCols.size());
355 }
356
358 const MdtPrepData& mdtPrd, bool& doHoleSearch) const {
359 // skip noise hits
360 if (mdtPrd.adc() < m_adcCut) return nullptr;
361
362 // get surface of PRD
363 const Identifier& id = mdtPrd.identify();
364 const MuonGM::MdtReadoutElement& detEl = *mdtPrd.detectorElement();
365 const Trk::StraightLineSurface& surf = detEl.surface(id);
366
367 // propagate segment parameters to first measurement
368 // retain ownership; this code deleted the exPars before
369 auto exPars = m_propagator->propagate(ctx, pars, surf, Trk::anyDirection, false, m_magFieldProperties);
370 if (!exPars) {
371 ATH_MSG_DEBUG(" Propagation failed!! ");
372 return nullptr;
373 }
374
375 // calculate position on wire + error
376 double distanceToWire = exPars->parameters()[Trk::locR];
377 double posAlongWire = exPars->parameters()[Trk::locZ];
378
379 double errorR = exPars->covariance() ? fabs(Amg::error(*exPars->covariance(), Trk::locR)) : 500.;
380 double errorZ = exPars->covariance() ? fabs(Amg::error(*exPars->covariance(), Trk::locZ)) : 300.;
381
382 // range check
383 bool isOnSurface = surf.isOnSurface(exPars->position(), true, 5 * errorR, 5 * errorZ);
384
385 // get tube length
386 int layer = m_idHelperSvc->mdtIdHelper().tubeLayer(id);
387 int tube = m_idHelperSvc->mdtIdHelper().tube(id);
388 double halfTubeLength = 0.5 * detEl.getActiveTubeLength(layer, tube);
389 double tubeRadius = detEl.innerTubeRadius();
390
391 // take into account the tube width
392 double roadWidthR = 5 * errorR + 4 * tubeRadius;
393 double roadWidthZ = 5 * errorZ + 100.;
394
395 double driftdr = Amg::error(mdtPrd.localCovariance(), Trk::locR);
396 double nSigmaFromTrack = fabs(fabs(distanceToWire) - mdtPrd.localPosition()[Trk::locR]) / sqrt(errorR * errorR + driftdr * driftdr);
397
398 if (msgLvl(MSG::VERBOSE)) {
399 std::string boundCheckStr = isOnSurface ? " onSurface" : " outOfSurface";
400 msg() << MSG::VERBOSE << " " << m_idHelperSvc->toString(mdtPrd.identify()) << " r " << distanceToWire << " range "
401 << roadWidthR << " z " << posAlongWire << " range " << halfTubeLength + roadWidthZ << boundCheckStr;
402 }
403
404 // if( fabs(distanceToWire) > roadWidthR || fabs(posAlongWire) > halfTubeLength + roadWidthZ ){
405 if (nSigmaFromTrack > m_maxSigma || fabs(posAlongWire) > halfTubeLength + roadWidthZ) {
406 if (msgLvl(MSG::VERBOSE)) msg() << " --- dropped" << endmsg;
407 // delete exPars;
408 return nullptr;
409 }
410
411 // update hole search flag, set to false if we are close to the tube edge
412 if (doHoleSearch && fabs(posAlongWire) < halfTubeLength + roadWidthZ) doHoleSearch = false;
413
414 Amg::Vector3D momentum = exPars->momentum();
415
416 // pointer to ROT
417 const MdtDriftCircleOnTrack* mdtROT = m_mdtRotCreator->createRIO_OnTrack(mdtPrd, exPars->position(), &momentum);
418
419 // clean up pointers
420 // delete exPars;
421
422 // check whether ROT is created
423 if (!mdtROT) {
424 ATH_MSG_DEBUG(" failed to calibrate MdtPrepData " << m_idHelperSvc->toString(mdtPrd.identify()));
425 return nullptr;
426 }
427
428 if (msgLvl(MSG::VERBOSE)) {
429 double radius = mdtROT->localParameters()[Trk::locR];
430 double error = driftdr;
431 double residual = radius - fabs(distanceToWire);
432 double fullError = sqrt(errorR * errorR + error * error);
433 double radialPull = residual / fullError;
434 std::string hitType;
435 if (fabs(radialPull) < 5)
436 hitType = "onTrack";
437 else if (fabs(radialPull) > 5 && residual > 0)
438 hitType = "delta";
439 else
440 hitType = "outOfTime";
441 msg() << " r_drift " << radius << " res " << residual << " pull " << radialPull << " " << hitType << endmsg;
442 }
443 return mdtROT;
444 }
445
446} // namespace Muon
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
ATLAS-specific HepMC functions.
bool empty() const
return true if container is empty
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
double getActiveTubeLength(const int tubeLayer, const int tube) const
virtual const Trk::Surface & surface() const override final
Return surface associated with this detector element.
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
IdentifierHash identifyHash() const override final
Returns the IdentifierHash of the MuonStation, i.e.
This class represents the corrected MDT measurements, where the corrections include the effects of wi...
Class to represent measurements from the Monitored Drift Tubes.
Definition MdtPrepData.h:33
int adc() const
Returns the ADC (typically range is 0 to 250)
virtual const MuonGM::MdtReadoutElement * detectorElement() const override
Returns the detector element corresponding to this PRD.
void extractRpcPrdCols(const EventContext &ctx, const std::set< IdentifierHash > &chIdHs, std::vector< const RpcPrepDataCollection * > &target) const
retrieve RPC PRD collections for the given hashes
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtRotCreator
IMdtDriftCircleOnTrackCreator.
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_key_mm
void extractMMPrdCols(const std::set< IdentifierHash > &chIdHs, std::vector< const MMPrepDataCollection * > &target) const
retrieve MM PRD collections for the given hashes
void extractCscPrdCols(const std::set< IdentifierHash > &chIdHs, std::vector< const CscPrepDataCollection * > &target) const
retrieve CSC PRD collections for the given hashes
void extractsTgcPrdCols(const EventContext &ctx, const std::set< IdentifierHash > &chIdHs, std::vector< const sTgcPrepDataCollection * > &target) const
retrieve STGC PRD collections for the given hashes
Trk::MagneticFieldProperties m_magFieldProperties
magnetic field properties
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_key_mdt
SG::ReadHandleKey< Muon::CscPrepDataContainer > m_key_csc
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_key_stgc
void extractTgcPrdCols(const EventContext &ctx, const std::set< IdentifierHash > &chIdHs, std::vector< const TgcPrepDataCollection * > &target) const
retrieve TGC PRD collections for the given hashes
MuonSeededSegmentFinder(const std::string &, const std::string &, const IInterface *)
constructor
ToolHandle< Muon::IMuonSegmentMaker > m_segMakerNoHoles
actual segment maker no hole search
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer
EDM printer tool.
std::unique_ptr< Trk::SegmentCollection > find(const EventContext &ctx, const Trk::TrackParameters &pars, const std::set< Identifier > &chIds) const
find segments in a set of chambers starting from seeding TrackParameters
void extractMdtPrdCols(const EventContext &ctx, const std::set< IdentifierHash > &chIdHs, std::vector< const MdtPrepDataCollection * > &target) const
retrieve MDT PRD collections for the given hashes
void selectAndCalibrate(const EventContext &ctx, const Trk::TrackParameters &pars, const std::vector< const MdtPrepData * > &mdtPrdCols, std::vector< const MdtDriftCircleOnTrack * > &mdtROTs, bool &doHoleSearch) const
select a set of Mdt hits and calibrate them
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
std::vector< const MdtPrepData * > extractPrds(const EventContext &ctx, const std::set< Identifier > &chIds) const
retrieve the MdtPrepDataCollections for the give Identifiers
Gaudi::Property< double > m_maxSigma
ToolHandle< Trk::IPropagator > m_propagator
propagator
ToolHandle< Muon::IMuonSegmentMaker > m_segMaker
actual segment maker with hole search
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_key_rpc
const MdtDriftCircleOnTrack * handleMdtPrd(const EventContext &ctx, const Trk::TrackParameters &pars, const MdtPrepData &mdtPrd, bool &doHoleSearch) const
select and calibrate a single MdtPrepData
StatusCode initialize()
AlgTool initilize.
SG::ReadHandleKey< Muon::TgcPrepDataContainer > m_key_tgc
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Amg::Vector2D & localPosition() const
return the local position reference
Identifier identify() const
return the identifier
const Amg::MatrixX & localCovariance() const
return const ref to the error matrix
Class for a StraightLineSurface in the ATLAS detector to describe dirft tube and straw like detectors...
virtual bool isOnSurface(const Amg::Vector3D &glopo, const BoundaryCheck &bchk=true, double tol1=0., double tol2=0.) const override final
This method checks if the provided GlobalPosition is inside the assigned straw radius,...
Encapsulates the information required by the find() method of the muon segment makers.
Definition TrackRoad.h:21
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Eigen::Matrix< double, 3, 1 > Vector3D
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
MuonPrepDataContainerT< MdtPrepData > MdtPrepDataContainer
MuonPrepDataContainerT< sTgcPrepData > sTgcPrepDataContainer
MuonPrepDataContainerT< MMPrepData > MMPrepDataContainer
Ensure that the ATLAS eigen extensions are properly loaded.
@ anyDirection
DataVector< Trk::Segment > SegmentCollection
@ locR
Definition ParamDefs.h:44
@ theta
Definition ParamDefs.h:66
@ locZ
local cylindrical
Definition ParamDefs.h:42
ParametersBase< TrackParametersDim, Charged > TrackParameters
MsgStream & msg
Definition testRead.cxx:32