ATLAS Offline Software
MuonChamberHoleRecoveryTool.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 
7 #include <map>
8 
32 #include "TrkVolumes/Volume.h"
33 
34 namespace {
35  struct PullCluster {
37  std::unique_ptr<Trk::TrackParameters> pars{};
38  std::unique_ptr<Muon::MuonClusterOnTrack> clus{};
39  };
40  using ClusterLayerMap = std::map<Identifier, PullCluster>;
41 
42 } // namespace
43 namespace Muon {
45 
46 
49  return m_trk.trackStateOnSurfaces()->begin();
50  }
52  return m_trk.trackStateOnSurfaces()->end();
53  }
55  return m_curr_itr != end() ? (*m_curr_itr) : nullptr;
56  }
58  if (!m_nextCalled) {
59  m_nextCalled = true;
60  return true;
61  }
62  if (m_curr_itr == end()) return false;
63  return (++m_curr_itr) != end();
64  }
66  if (!m_copiedStates.insert(tsos()).second) return;
67  if (target == CopyTarget::GlobalTrkStates) m_newStates.emplace_back(tsos()->clone());
68  else chamberStates.emplace_back(tsos()->clone());
69  }
71  return chamberStates.empty() ? tsos()->trackParameters() : chamberStates[0]->trackParameters();
72  }
74  if (chamberStates.empty()) return;
75  std::stable_sort(chamberStates.begin(), chamberStates.end(), SortTSOSByDistanceToPars(chamberPars()));
76  m_newStates.insert(m_newStates.end(), std::make_move_iterator(chamberStates.begin()),
77  std::make_move_iterator(chamberStates.end()));
78  chamberStates.clear();
79  }
80  std::unique_ptr<Trk::TrackStates> MuonChamberHoleRecoveryTool::RecoveryState::releaseStates() {
81  finalizeChamber();
82  std::unique_ptr<Trk::TrackStates> outVec = std::make_unique<Trk::TrackStates>();
83  for (std::unique_ptr<const Trk::TrackStateOnSurface>& tsos : m_newStates){
84  outVec->push_back(std::move(tsos));
85  }
86  return outVec;
87  }
88 
89  MuonChamberHoleRecoveryTool::MuonChamberHoleRecoveryTool(const std::string& ty, const std::string& na, const IInterface* pa) :
90  AthAlgTool(ty, na, pa) {
91  declareInterface<IMuonHoleRecoveryTool>(this);
92  }
93 
96  ATH_CHECK(m_edmHelperSvc.retrieve());
97  ATH_CHECK(m_idHelperSvc.retrieve());
98  ATH_CHECK(m_trackingVolumesSvc.retrieve());
99  ATH_CHECK(m_printer.retrieve());
100  ATH_CHECK(m_extrapolator.retrieve());
101  ATH_CHECK(m_mdtRotCreator.retrieve());
102 
103  ATH_CHECK(m_key_csc.initialize(!m_key_csc.empty()));
104  ATH_CHECK(m_key_stgc.initialize(!m_key_stgc.empty()));
105  ATH_CHECK(m_key_mm.initialize(!m_key_mm.empty()));
106 
107  ATH_CHECK(m_key_mdt.initialize(!m_key_mdt.empty()));
108  ATH_CHECK(m_key_tgc.initialize(!m_key_tgc.empty()));
109  ATH_CHECK(m_key_rpc.initialize(!m_key_rpc.empty()));
110 
111  ATH_CHECK(m_cscRotCreator.retrieve(DisableTool{m_key_csc.empty()}));
112 
113  ATH_CHECK(m_clusRotCreator.retrieve());
114  ATH_CHECK(m_pullCalculator.retrieve());
115 
117  return StatusCode::SUCCESS;
118  }
120  while(trkRecov.nextState()) {
121  const Trk::TrackParameters* pars = trkRecov.tsos()->trackParameters();
122  ATH_MSG_VERBOSE("Track parameters "<<(*pars));
125  if (msVol.inside(pars->position())) {
126  ATH_MSG_VERBOSE("Tracking parameters are inside the MS");
127  trkRecov.copyState(target);
128  continue;
129  }
130 
131  if (trkRecov.tsos()->type(Trk::TrackStateOnSurface::Hole)) {
132  ATH_MSG_VERBOSE("Skip hole in MS");
133  continue;
134  }
136  const Trk::MeasurementBase* meas = trkRecov.tsos()->measurementOnTrack();
137  if (!meas) {
138  ATH_MSG_VERBOSE("The track state does not have an associated measurement");
139  trkRecov.copyState(target);
140  continue;
141  }
142  trkRecov.tsosId = m_edmHelperSvc->getIdentifier(*meas);
143  // Potentially a pseudo measurement. Anyway keep it
144  if (!trkRecov.tsosId.is_valid() || !m_idHelperSvc->isMuon(trkRecov.tsosId)) {
145  ATH_MSG_VERBOSE("No muon measurement");
146  trkRecov.copyState(target);
147  continue;
148  }
149  return true;
150  }
151  return false;
152  }
153 
154  std::set<Identifier> MuonChamberHoleRecoveryTool::layersOnTrkIds(const Trk::Track& track) const {
155  std::set<Identifier> layerIds{};
156  for (const Trk::TrackStateOnSurface* tsos: *track.trackStateOnSurfaces()){
157  const Trk::MeasurementBase* meas = tsos->measurementOnTrack();
158  if (!meas) continue;
159  const Identifier measId = m_edmHelperSvc->getIdentifier(*meas);
160 
161  if (!m_idHelperSvc->isMuon(measId)) continue;
162  layerIds.insert(measId);
163  layerIds.insert(m_idHelperSvc->layerId(measId));
164  // split competing ROTs into constituents
165  const CompetingMuonClustersOnTrack* comp = dynamic_cast<const CompetingMuonClustersOnTrack*>(meas);
166  if (!comp) { continue; }
167 
168  for (const Muon::MuonClusterOnTrack* clust : comp->containedROTs()) {
169  layerIds.insert(m_idHelperSvc->layerId(clust->identify()));
170  }
171  }
172  return layerIds;
173  }
174 
175  std::unique_ptr<Trk::Track> MuonChamberHoleRecoveryTool::recover(const Trk::Track& track, const EventContext& ctx) const {
176  ATH_MSG_DEBUG(" performing hole search track " << std::endl
177  << m_printer->print(track) << std::endl
178  << m_printer->printMeasurements(track));
179 
180  RecoveryState recovState{track};
181  recovState.layersOnTrk = layersOnTrkIds(track);
182 
186  recoverHitsInChamber(ctx, recovState);
187  std::unique_ptr<Trk::Track> newTrack = std::make_unique<Trk::Track>(track.info(), recovState.releaseStates(),
188  track.fitQuality() ? track.fitQuality()->uniqueClone() : nullptr);
189  return newTrack;
190  }
191  void MuonChamberHoleRecoveryTool::recoverHitsInChamber(const EventContext& ctx, RecoveryState& trkRecov) const {
192  const Muon::MuonStationIndex::ChIndex currStation = m_idHelperSvc->chamberIndex(trkRecov.tsosId);
194  std::set<Identifier> chambInStation{};
195  do {
196  if (currStation != m_idHelperSvc->chamberIndex(trkRecov.tsosId)) {
197  trkRecov.finalizeChamber();
198  recoverHitsInChamber(ctx, trkRecov);
199  return;
200  }
203  if (chambInStation.insert(m_idHelperSvc->chamberId(trkRecov.tsosId)).second) {
204  if (m_idHelperSvc->isMdt(trkRecov.tsosId)) {
205  recoverMdtHits(ctx, trkRecov.tsosId, *trkRecov.tsos()->trackParameters(),
206  trkRecov.chamberStates, trkRecov.layersOnTrk);
207  } else {
208  recoverClusterHits(ctx, trkRecov.tsosId, *trkRecov.tsos()->trackParameters(),
209  trkRecov.chamberStates, trkRecov.layersOnTrk);
210  }
211  }
213  trkRecov.finalizeChamber();
214  }
215  void MuonChamberHoleRecoveryTool::recoverMdtHits(const EventContext& ctx,
216  const Identifier& chId,
217  const Trk::TrackParameters& pars,
218  NewTrackStates& newStates, std::set<Identifier>& knownLayers) const {
219 
220 
221  std::set<Identifier> chHoles = holesInMdtChamber(ctx, pars.position(), pars.momentum().unit(), chId, knownLayers);
222  ATH_MSG_VERBOSE(" chamber " << m_idHelperSvc->toStringChamber(chId) << " has holes " << chHoles.size());
223  if (chHoles.empty()) return;
224 
225  const std::vector<const MdtPrepData*> prdCandidates{loadPrepDataHits<MdtPrepData>(ctx, m_key_mdt, chHoles)};
226  bool addedState{false};
227  for (const MdtPrepData* mdtPrd : prdCandidates) {
228  const Trk::StraightLineSurface& surf{mdtPrd->detectorElement()->surface(mdtPrd->identify())};
229  std::unique_ptr<Trk::TrackParameters> exPars = m_extrapolator->extrapolateDirectly(ctx, pars, surf, Trk::anyDirection, false, Trk::muon);
230  if (!exPars) {
231  ATH_MSG_WARNING("Propagation to "<<m_idHelperSvc->toString(mdtPrd->identify())<<" failed.");
232  continue;
233  }
234 
237  if (!surf.globalToLocal(exPars->position(), exPars->momentum(), locPos)) {
238  ATH_MSG_DEBUG(" failed to calculate drift sign ");
239  continue;
240  }
241  if (!surf.insideBounds(locPos)) {
242  chHoles.erase(mdtPrd->identify());
243  continue;
244  }
245 
246  // calibrate Mdt PRD
247  const Amg::Vector3D momentum = exPars->momentum();
248  std::unique_ptr<MdtDriftCircleOnTrack> mdtROT{m_mdtRotCreator->createRIO_OnTrack(*mdtPrd,
249  exPars->position(),
250  &momentum)};
251  if (!mdtROT) continue;
252 
256  m_mdtRotCreator->updateSign(*mdtROT, side);
257 
259  std::optional<const Trk::ResidualPull> resPull{m_pullCalculator->residualPull(mdtROT.get(),
260  exPars.get(),
262  if (!resPull) { continue; }
263 
264  const double pull = resPull->pull().front();
265  const double radialResidual = std::abs(mdtROT->localParameters()[Trk::locR]) -
266  std::abs(exPars->parameters()[Trk::locR]);
267 
268  unsigned int hitFlag = 1;
269  if (mdtPrd->adc() < m_adcCut || mdtPrd->status() != MdtStatusDriftTime)
270  hitFlag = 3; // noise
271  else if (std::abs(pull) < m_associationPullCutEta)
272  hitFlag = 0; // hit on track
273  else if (radialResidual > 0.)
274  hitFlag = 2; // out of time
275 
276  ATH_MSG_VERBOSE(__func__<<"() - Recover "<<m_printer->print(*mdtROT)<<" pull: "<<pull<<" hitFlag: "<<hitFlag);
277  std::unique_ptr<Trk::TrackStateOnSurface> tsos = MuonTSOSHelper::createMeasTSOS(std::move(mdtROT),
278  std::move(exPars),
279  (hitFlag != 0 || !m_addMeasurements) ?
282 
283  if (!addedState) {
284  newStates.emplace_back(std::move(tsos));
285  addedState = true;
286  } else {
287  const MdtDriftCircleOnTrack* prevDC = static_cast<const MdtDriftCircleOnTrack*>(newStates.back()->measurementOnTrack());
288  if (prevDC->identify() != mdtPrd->identify()) {
289  newStates.emplace_back(std::move(tsos));
290  } else {
291  ATH_MSG_DEBUG("Two hits recorded for the same tube "<<std::endl<<
292  " *** current: "<<m_printer->print(*tsos->measurementOnTrack())<<std::endl<<
293  " *** previous: "<<m_printer->print(*prevDC));
294  std::optional<Trk::ResidualPull> prevPullObj{m_pullCalculator->residualPull(prevDC,
295  tsos->trackParameters(),
297  const double prevPull = prevPullObj->pull().front();
299  if (std::abs(pull) < std::abs(prevPull) ||
301  newStates.back()->type(Trk::TrackStateOnSurface::Outlier))) {
302  newStates.back() = std::move(tsos);
303  }
304 
305  }
306  }
307  chHoles.erase(mdtPrd->identify());
308  knownLayers.insert(mdtPrd->identify());
309  }
310 
311  for (const Identifier& hole : chHoles) {
312  const Trk::Surface& surf{getDetectorElement(ctx, hole)->surface(hole)};
313  std::unique_ptr<Trk::TrackParameters> exPars = m_extrapolator->extrapolateDirectly(ctx, pars, surf, Trk::anyDirection, false, Trk::muon);
314  if (!exPars) {
315  ATH_MSG_WARNING("Propagation to "<<m_idHelperSvc->toString(hole)<<" failed.");
316  continue;
317  }
318  ATH_MSG_VERBOSE(__func__<<"() - Add hole "<<m_idHelperSvc->toString(hole));
319  newStates.emplace_back(MuonTSOSHelper::createHoleTSOS(std::move(exPars)));
320  }
321  }
323  const Identifier& chambId,
324  const Trk::TrackParameters& pars,
325  NewTrackStates& states, std::set<Identifier>& knownLayers) const {
326 
327  NewTrackStates recovered{};
328  if (m_idHelperSvc->isRpc(chambId)) {
329  recovered = recoverChamberClusters(ctx, m_key_rpc, chambId, pars, knownLayers);
330  } else if (m_idHelperSvc->isTgc(chambId)) {
331  recovered = recoverChamberClusters(ctx, m_key_tgc, chambId, pars, knownLayers);
332  } else if (m_idHelperSvc->isCsc(chambId)) {
333  recovered = recoverChamberClusters(ctx, m_key_csc, chambId, pars, knownLayers);
334  } else if (m_idHelperSvc->isMM(chambId)) {
335  recovered = recoverChamberClusters(ctx, m_key_mm, chambId, pars, knownLayers);
336  } else if (m_idHelperSvc->issTgc(chambId)) {
337  recovered = recoverChamberClusters(ctx, m_key_stgc, chambId, pars, knownLayers);
338  }
339  states.insert(states.end(), std::make_move_iterator(recovered.begin()),
340  std::make_move_iterator(recovered.end()));
341  }
343  const EventContext& ctx,
344  const Trk::TrackParameters& pars,
345  std::set<Identifier>& layIds,
346  NewTrackStates& states) const {
347  ATH_MSG_VERBOSE(" performing holes search in chamber " << m_idHelperSvc->toString(detElId));
348  recoverClusterHits(ctx, detElId, pars, states, layIds);
349  }
350 
351 
353  const Identifier& detElId) const {
355  const MuonGM::MuonDetectorManager* MuonDetMgr{*DetectorManagerHandle};
356  if (!MuonDetMgr) {
357  ATH_MSG_ERROR("Null pointer to the read MuonDetectorManager conditions object");
358  return nullptr;
359  }
360  if (m_idHelperSvc->isMdt(detElId))
361  return MuonDetMgr->getMdtReadoutElement(detElId);
362  else if (m_idHelperSvc->isTgc(detElId))
363  return MuonDetMgr->getTgcReadoutElement(detElId);
364  else if (m_idHelperSvc->isRpc(detElId))
365  return MuonDetMgr->getRpcReadoutElement(detElId);
366  else if (m_idHelperSvc->isCsc(detElId))
367  return MuonDetMgr->getCscReadoutElement(detElId);
368  // New Small Wheel
369  else if (m_idHelperSvc->issTgc(detElId))
370  return MuonDetMgr->getsTgcReadoutElement(detElId);
371  else if (m_idHelperSvc->isMM(detElId))
372  return MuonDetMgr->getMMReadoutElement(detElId);
373  return nullptr;
374  }
375 
376  std::set<Identifier> MuonChamberHoleRecoveryTool::holesInMdtChamber(const EventContext& ctx, const Amg::Vector3D& position, const Amg::Vector3D& direction,
377  const Identifier& chId, const std::set<Identifier>& tubeIds) const {
378 
380  if (!interSectSvc.isValid()) {
381  ATH_MSG_ERROR("Failed to retrieve chamber intersection service");
382  throw std::runtime_error("No chamber intersection service");
383  }
384  const MuonGM::MdtReadoutElement* readoutEle = interSectSvc->detMgr()->getMdtReadoutElement(chId);
385 
386  MuonStationIntersect intersect = interSectSvc->tubesCrossedByTrack(chId, position, direction);
387 
388  // clear hole vector
389  std::set<Identifier> holes;
390  for (unsigned int ii = 0; ii < intersect.tubeIntersects().size(); ++ii) {
391  const MuonTubeIntersect& tint = intersect.tubeIntersects()[ii];
392 
393  if (tubeIds.count(tint.tubeId)) { continue; }
394  ATH_MSG_VERBOSE(" intersect " << m_idHelperSvc->toString(tint.tubeId) << " dist wire " << tint.rIntersect
395  << " dist to tube end " << tint.xIntersect);
396 
397  if (std::abs(tint.rIntersect) > readoutEle->innerTubeRadius() || tint.xIntersect > -10.) {
398  ATH_MSG_VERBOSE(" not counted");
399  continue;
400  }
401  // check whether there is a hit in this tube
402  ATH_MSG_VERBOSE(" hole tube");
403  holes.insert(tint.tubeId);
404 
405  }
406  return holes;
407  }
408  template <class Prd> std::vector<const Prd*> MuonChamberHoleRecoveryTool::loadPrepDataHits(const EventContext& ctx,
410  const std::set<Identifier>& gasGapIds) const {
411  std::vector<const Prd*> collectedHits{};
412  if (key.empty()) {
413  ATH_MSG_DEBUG("No container configured for "<<typeid(Prd).name());
414  return collectedHits;
415  }
417  if (!prdContainer.isPresent()) {
418  ATH_MSG_FATAL("Failed to load prep data collection "<<key.fullKey());
419  throw std::runtime_error("Invalid prepdata container");
420  }
422  std::set<IdentifierHash> chamberIds{};
423  std::transform(gasGapIds.begin(), gasGapIds.end(),
424  std::inserter(chamberIds, chamberIds.end()),
425  [this](const Identifier& id){
426  return m_idHelperSvc->moduleHash(id);
427  });
428  for (const IdentifierHash& moduleHash : chamberIds) {
429  const MuonPrepDataCollection<Prd>* prdColl = prdContainer->indexFindPtr(moduleHash);
430  if (!prdColl) continue;
431  collectedHits.reserve(collectedHits.size() + prdColl->size());
432  for (const Prd* prd: *prdColl) {
433  bool appendPrd{false};
435  appendPrd = gasGapIds.count(prd->identify());
436  } else {
437  appendPrd = gasGapIds.count(m_idHelperSvc->layerId(prd->identify()));
438  }
439  if (appendPrd) {
440  ATH_MSG_VERBOSE(__func__<<"() - Add prd candidate "<<m_printer->print(*prd));
441  collectedHits.push_back(prd);
442  }
443  }
444  }
448  std::sort(collectedHits.begin(), collectedHits.end(), [](const Prd* a, const Prd* b){
449  return a->identify() < b->identify();
450  });
451  }
452  return collectedHits;
453  }
454  std::set<Identifier> MuonChamberHoleRecoveryTool::getHoleLayerIds(const Identifier& detElId,
455  const std::set<Identifier>& knownLayers) const {
456  std::set<Identifier> holeGaps{};
457  if (m_idHelperSvc->isMdt(detElId)) {
458  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
459  for (int ml = 1; ml <= idHelper.numberOfMultilayers(detElId); ++ml) {
460  for (int layer = idHelper.tubeLayerMin(detElId);
461  layer <= idHelper.tubeLayerMax(detElId); ++layer) {
462  const Identifier layerId = idHelper.channelID(detElId, ml, layer, 1);
463  if (!knownLayers.count(layerId)) holeGaps.insert(layerId);
464  }
465  }
466  } else if (m_idHelperSvc->isMM(detElId)) {
467  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
468  for (int ml : {1 ,2}) {
469  for (int gap = MmIdHelper::gasGapMin(); gap <= MmIdHelper::gasGapMax(); ++gap) {
470  const Identifier layerId = idHelper.channelID(detElId, ml, gap, 1);
471  if (!knownLayers.count(layerId)) holeGaps.insert(layerId);
472  }
473  }
474  } else if (m_idHelperSvc->issTgc(detElId)) {
475  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
476  using channelType = sTgcIdHelper::sTgcChannelTypes;
477  for (int ml : {1, 2}) {
478  for (const channelType chType : {channelType::Strip,
479  channelType::Pad,
480  channelType::Wire}){
481  for (int gap = sTgcIdHelper::gasGapMin();
482  gap <= sTgcIdHelper::gasGapMax(); ++gap) {
483  const Identifier layerId = idHelper.channelID(detElId, ml, gap, chType, 1);
484  if (!knownLayers.count(layerId)) holeGaps.insert(layerId);
485  }
486  }
487  }
488  } else if (m_idHelperSvc->isTgc(detElId)) {
489  const TgcIdHelper& idHelper = m_idHelperSvc->tgcIdHelper();
490  const int gapMax{idHelper.gasGapMax(detElId)};
491  for (int gasgap = idHelper.gasGapMin(detElId);
492  gasgap < gapMax; ++gasgap){
493  for (int measPhi: {0,1}) {
495  if (gapMax == 3 && gasgap ==2 && measPhi == 1) continue;
496  const Identifier layerId = idHelper.channelID(detElId, gasgap, measPhi, 1);
497  if (!knownLayers.count(layerId)) holeGaps.insert(layerId);
498  }
499  }
500  } else if (m_idHelperSvc->isRpc(detElId)) {
501  const RpcIdHelper& idHelper = m_idHelperSvc->rpcIdHelper();
502  const int doubZ{idHelper.doubletZ(detElId)};
503  const int gapMax{idHelper.gasGapMax(detElId)};
504  for (int phiGap = idHelper.doubletPhi(detElId);
505  phiGap <= RpcIdHelper::doubletPhiMax(); ++phiGap) {
506  for (int gap = idHelper.gasGapMin(detElId);
507  gap <= gapMax; ++gap) {
508  for (int measPhi: {0, 1}) {
509  const Identifier layerId = idHelper.channelID(detElId, doubZ, phiGap, gap, measPhi, 1);
510  if (!knownLayers.count(layerId)) holeGaps.insert(layerId);
511  }
512  }
513  }
514  } else if (m_idHelperSvc->isCsc(detElId)) {
515  const CscIdHelper& idHelper{m_idHelperSvc->cscIdHelper()};
516  for (int layer = 1; layer <= 4; ++ layer) {
517  for (bool measPhi: {false, true}) {
518  const Identifier layId = idHelper.channelID(detElId, 2, layer, measPhi, 1);
519  if (!knownLayers.count(layId)) holeGaps.insert(layId);
520  }
521  }
522  }
523  return holeGaps;
524  }
525  template <class Prd> NewTrackStates MuonChamberHoleRecoveryTool::recoverChamberClusters(const EventContext& ctx,
527  const Identifier& detElId,
528  const Trk::TrackParameters& parsInChamb,
529  std::set<Identifier>& knownLayers) const {
530  NewTrackStates recoveredStates{};
531  const std::set<Identifier> missingLayers = getHoleLayerIds(detElId, knownLayers);
532  std::vector<const Prd*> prdCandidates = loadPrepDataHits(ctx, prdKey, missingLayers);
534  using LayerParsMap = std::map<Identifier, std::unique_ptr<Trk::TrackParameters>>;
535  LayerParsMap parsAtSurfMap{};
536  for (const Identifier& holeId : missingLayers) {
537  const Trk::TrkDetElementBase* detEl = getDetectorElement(ctx, holeId);
538  const Trk::Surface& surf{detEl->surface(holeId)};
539  std::unique_ptr<Trk::TrackParameters> pars = m_extrapolator->extrapolateDirectly(ctx, parsInChamb, surf,
540  Trk::anyDirection, false, Trk::muon);
541  if (!pars) {
542  ATH_MSG_VERBOSE("Surface layer "<<m_idHelperSvc->toStringGasGap(holeId)<<" cannot be reached");
543  continue;
544  }
545  if (!Amg::hasPositiveDiagElems(*pars->covariance())) {
546  ATH_MSG_DEBUG("Uncertainties of extraploation to "<<m_idHelperSvc->toStringGasGap(holeId)<<" blew up");
547  continue;
548  }
549  const Amg::Vector2D locExPos{pars->parameters()[Trk::locX],
550  pars->parameters()[Trk::locY]};
551  bool inbounds{false};
553  inbounds = static_cast<const MuonGM::MMReadoutElement*>(detEl)->insideActiveBounds(holeId, locExPos, 10.,10.);
554  } else {
555  inbounds = surf.insideBounds(locExPos, 10., 10.);
556  }
558  if (!inbounds) {
559  ATH_MSG_VERBOSE("Extrapolation to layer "<<m_idHelperSvc->toStringGasGap(holeId)
560  <<" is outside of the chamber "<<Amg::toString(locExPos, 2));
561  continue;
562  }
563  parsAtSurfMap[holeId] = std::move(pars);
564  }
565  ClusterLayerMap bestClusterInLay;
567  for (const Prd* hit : prdCandidates) {
568  const Identifier layId = m_idHelperSvc->layerId(hit->identify());
570  LayerParsMap::const_iterator pars_itr = parsAtSurfMap.find(layId);
571  if (pars_itr == parsAtSurfMap.end()) {
572  continue;
573  }
574  const std::unique_ptr<Trk::TrackParameters>& parsInLay{pars_itr->second};
575  std::unique_ptr<MuonClusterOnTrack> calibClus{};
577  calibClus.reset(m_cscRotCreator->createRIO_OnTrack(*hit,
578  parsInLay->position(),
579  parsInLay->momentum().unit()));
580  } else {
581  calibClus.reset(m_clusRotCreator->createRIO_OnTrack(*hit,
582  parsInLay->position(),
583  parsInLay->momentum().unit()));
584  }
585  if (!calibClus) continue;
586 
588  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
589  if (idHelper.channelType(hit->identify()) == sTgcIdHelper::sTgcChannelTypes::Pad){
591  const Amg::Vector2D locExPos{parsInLay->parameters()[Trk::locX],
592  parsInLay->parameters()[Trk::locY]};
593 
594  const MuonGM::MuonPadDesign* pad = hit->detectorElement()->getPadDesign(hit->identify());
595  const Amg::Vector2D padDist = pad->distanceToPad(locExPos, idHelper.channel(hit->identify()));
596 
598  const double xCov = std::hypot(Amg::error(*parsInLay->covariance(), Trk::locX),
599  Amg::error(hit->localCovariance(), Trk::locX));
601  const double yCov =Amg::error(*parsInLay->covariance(), Trk::locY);
602 
603  const double xPull = padDist.x() / xCov;
604  const double yPull = padDist.y() / yCov;
605 
606  ATH_MSG_VERBOSE(__func__<<"() - check "<<m_printer->print(*calibClus)
607  <<" diff "<<Amg::toString(padDist, 2)
608  <<" covariance: ("<<xCov<<", "<<yCov<<")"
609  <<" pull: ("<<xPull<<","<<yPull<<").");
610 
612  if (xPull > m_associationPullCutEta || yPull > m_associationPullCutPhi) continue;
613  const double pull = std::hypot(xPull, yPull);
614 
616  PullCluster& bestClus = bestClusterInLay[layId];
617  if (bestClus.pull < pull) continue;
618  bestClus.pull = pull;
619  bestClus.clus = std::move(calibClus);
620  bestClus.pars = parsInLay->uniqueClone();
621  continue;
622  }
623  }
624 
626  std::optional<const Trk::ResidualPull> resPull{
627  m_pullCalculator->residualPull(calibClus.get(), parsInLay.get(),
629  if (!resPull || resPull->pull().empty()) {
630  continue;
631  }
632 
633  const double pull = std::abs(resPull->pull().front());
634  const double pullCut = m_idHelperSvc->measuresPhi(layId) ? m_associationPullCutPhi
636  if (pull > pullCut) continue;
637 
638  PullCluster& bestClus = bestClusterInLay[layId];
639  if (bestClus.pull < pull) continue;
640  bestClus.pull = pull;
641  bestClus.clus = std::move(calibClus);
642  bestClus.pars = parsInLay->uniqueClone();
643 
644  }
646  for (auto& [layerId, foundClus]: bestClusterInLay) {
647  ATH_MSG_VERBOSE(__func__<<"() recovered hit " << m_printer->print(*foundClus.clus)<<" pull: "<<foundClus.pull);
648  std::unique_ptr<Trk::TrackStateOnSurface> tsos = MuonTSOSHelper::createMeasTSOS(std::move(foundClus.clus),
649  std::move(foundClus.pars),
651  recoveredStates.emplace_back(std::move(tsos));
652  knownLayers.insert(layerId);
653  parsAtSurfMap[layerId].reset();
654  }
656  for (auto& [layerId, exPars] : parsAtSurfMap) {
657  if (!exPars) continue;
658  ATH_MSG_VERBOSE(__func__<<"() add new hole state "<<m_idHelperSvc->toStringGasGap(layerId));
659  recoveredStates.emplace_back(MuonTSOSHelper::createHoleTSOS(std::move(exPars)));
660  }
661  return recoveredStates;
662  }
663 } // namespace Muon
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
plotting.yearwise_luminosity_vs_mu.comp
comp
Definition: yearwise_luminosity_vs_mu.py:24
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
MuonCluster.h
Muon::MuonChamberHoleRecoveryTool::m_key_mm
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_key_mm
Definition: MuonChamberHoleRecoveryTool.h:187
Trk::TrackStateOnSurface::trackParameters
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
MuonGM::MuonPadDesign
Parameters defining the design of the readout sTGC pads.
Definition: MuonPadDesign.h:40
MdtReadoutElement.h
Muon::MuonPrepDataContainer
Template for Muon PRD containers (which are basically collections of MuonPrepDataCollections).
Definition: MuonPrepDataContainer.h:42
Muon::MuonChamberHoleRecoveryTool::m_key_stgc
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_key_stgc
Definition: MuonChamberHoleRecoveryTool.h:186
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Muon::MuonChamberHoleRecoveryTool::layersOnTrkIds
std::set< Identifier > layersOnTrkIds(const Trk::Track &track) const
Returns a set of all layer Identifiers of the associated track hits.
Definition: MuonChamberHoleRecoveryTool.cxx:154
Amg::hasPositiveDiagElems
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
Definition: EventPrimitivesCovarianceHelpers.h:96
Muon::MuonChamberHoleRecoveryTool::m_addMeasurements
Gaudi::Property< bool > m_addMeasurements
Definition: MuonChamberHoleRecoveryTool.h:192
sTgcClusterOnTrack.h
Muon::MuonChamberHoleRecoveryTool::getNextMuonMeasurement
bool getNextMuonMeasurement(RecoveryState &trkRecov, RecoveryState::CopyTarget target) const
Increments the internal iterator of the RecoveryState until the next muon measurement on track is fou...
Definition: MuonChamberHoleRecoveryTool.cxx:119
Muon::MuonChamberHoleRecoveryTool::recoverChamberClusters
NewTrackStates recoverChamberClusters(const EventContext &ctx, const SG::ReadHandleKey< MuonPrepDataContainerT< Prd >> &prdKey, const Identifier &chambId, const Trk::TrackParameters &parsInChamb, std::set< Identifier > &knownLayers) const
Attempts to recover all missing hits in a chamber.
Definition: MuonChamberHoleRecoveryTool.cxx:525
max
#define max(a, b)
Definition: cfImp.cxx:41
StraightLineSurface.h
TrackParameters.h
MeasurementBase.h
Muon::MuonTubeIntersect
Definition: MuonTubeIntersect.h:12
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
Muon::MuonChamberHoleRecoveryTool::recover
std::unique_ptr< Trk::Track > recover(const Trk::Track &track, const EventContext &ctx) const override
returns a new track with holes recovered
Definition: MuonChamberHoleRecoveryTool.cxx:175
Trk::locX
@ locX
Definition: ParamDefs.h:43
Trk::locY
@ locY
local cartesian
Definition: ParamDefs.h:44
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
MuonGM::MdtReadoutElement::innerTubeRadius
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
Muon::MuonChamberHoleRecoveryTool::loadPrepDataHits
std::vector< const Prd * > loadPrepDataHits(const EventContext &ctx, const SG::ReadHandleKey< MuonPrepDataContainerT< Prd >> &key, const std::set< Identifier > &layerIds) const
Definition: MuonChamberHoleRecoveryTool.cxx:408
Muon::MuonChamberHoleRecoveryTool::RecoveryState::finalizeChamber
void finalizeChamber()
Sorts the hits accumulated in the current chamber using the first track parameters in that chamber.
Definition: MuonChamberHoleRecoveryTool.cxx:73
sTgcIdHelper::gasGapMax
static int gasGapMax()
Definition: sTgcIdHelper.cxx:1044
TgcIdHelper
Definition: TgcIdHelper.h:50
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
Muon::MuonChamberHoleRecoveryTool::m_key_rpc
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_key_rpc
Definition: MuonChamberHoleRecoveryTool.h:185
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
Muon::MuonChamberHoleRecoveryTool::m_key_mdt
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_key_mdt
Definition: MuonChamberHoleRecoveryTool.h:182
RpcIdHelper::doubletZ
int doubletZ(const Identifier &id) const
Definition: RpcIdHelper.cxx:1062
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
InDetDD::holes
@ holes
Definition: InDetDD_Defs.h:17
Muon::MuonTSOSHelper::createHoleTSOS
static std::unique_ptr< Trk::TrackStateOnSurface > createHoleTSOS(std::unique_ptr< Trk::TrackParameters > pars)
create a hole TSOS, takes ownership of the pointers
Definition: MuonTSOSHelper.h:92
EventPrimitivesHelpers.h
Muon::MuonChamberHoleRecoveryTool::m_cscRotCreator
ToolHandle< Muon::IMuonClusterOnTrackCreator > m_cscRotCreator
Definition: MuonChamberHoleRecoveryTool.h:171
sTgcIdHelper::gasGapMin
static int gasGapMin()
Definition: sTgcIdHelper.cxx:1042
Trk::ResidualPull::Unbiased
@ Unbiased
RP with track state that has measurement not included.
Definition: ResidualPull.h:57
Trk::ITrackingVolumesSvc::MuonSpectrometerEntryLayer
@ MuonSpectrometerEntryLayer
Tracking Volume which defines the entrance surfaces of the MS.
Definition: ITrackingVolumesSvc.h:41
CompetingMuonClustersOnTrack.h
Trk::TrackStateOnSurface::measurementOnTrack
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
athena.value
value
Definition: athena.py:122
Muon::MuonChamberHoleRecoveryTool::NewTrackStates
std::vector< std::unique_ptr< const Trk::TrackStateOnSurface > > NewTrackStates
Definition: MuonChamberHoleRecoveryTool.h:40
Trk::TrkDetElementBase
Definition: TrkDetElementBase.h:52
RpcIdHelper::doubletPhiMax
static int doubletPhiMax()
Definition: RpcIdHelper.cxx:1094
Trk::locR
@ locR
Definition: ParamDefs.h:50
Muon::MuonChamberHoleRecoveryTool::recoverHitsInChamber
void recoverHitsInChamber(const EventContext &ctx, RecoveryState &trkRecov) const
Loops over all muon hits in a muon chamber and tries to find missed ones by checking each tracking la...
Definition: MuonChamberHoleRecoveryTool.cxx:191
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Muon::CompetingMuonClustersOnTrack
Definition: CompetingMuonClustersOnTrack.h:54
Muon::MuonChamberHoleRecoveryTool::MuonChamberHoleRecoveryTool
MuonChamberHoleRecoveryTool(const std::string &, const std::string &, const IInterface *)
Definition: MuonChamberHoleRecoveryTool.cxx:89
MdtDriftCircleOnTrack.h
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
RpcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
Definition: RpcIdHelper.cxx:940
sTgcIdHelper::sTgcChannelTypes
sTgcChannelTypes
Definition: sTgcIdHelper.h:190
Muon
This class provides conversion from CSC RDO data to CSC Digits.
Definition: TrackSystemController.h:49
Muon::MuonChamberHoleRecoveryTool::RecoveryState::nextState
bool nextState()
Increments the internal iterator.
Definition: MuonChamberHoleRecoveryTool.cxx:57
CaloSwCorrections.gap
def gap(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:212
Identifier::is_valid
bool is_valid() const
Check if id is in a valid state.
RpcIdHelper
Definition: RpcIdHelper.h:51
Muon::MuonChamberHoleRecoveryTool::getDetectorElement
const Trk::TrkDetElementBase * getDetectorElement(const EventContext &ctx, const Identifier &id) const
Returns the detector element associated with the muon Identifier.
Definition: MuonChamberHoleRecoveryTool.cxx:352
Muon::MdtStatusDriftTime
@ MdtStatusDriftTime
The tube produced a vaild measurement.
Definition: MdtDriftCircleStatus.h:34
python.Utilities.clone
clone
Definition: Utilities.py:134
MuonTrackMakerStlTools.h
MMClusterOnTrack.h
Muon::MuonChamberHoleRecoveryTool::RecoveryState::copyState
void copyState(CopyTarget target)
Definition: MuonChamberHoleRecoveryTool.cxx:65
Muon::MuonChamberHoleRecoveryTool::m_extrapolator
ToolHandle< Trk::IExtrapolator > m_extrapolator
Definition: MuonChamberHoleRecoveryTool.h:167
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
Muon::MuonChamberHoleRecoveryTool::RecoveryState::RecoveryState
RecoveryState(const Trk::Track &trk)
Definition: MuonChamberHoleRecoveryTool.cxx:47
RpcIdHelper::gasGapMin
static int gasGapMin()
Definition: RpcIdHelper.cxx:1096
Muon::MuonChamberHoleRecoveryTool::m_associationPullCutEta
Gaudi::Property< double > m_associationPullCutEta
Definition: MuonChamberHoleRecoveryTool.h:195
Trk::TrackStateOnSurface::Outlier
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
Definition: TrackStateOnSurface.h:122
TRT::Hit::side
@ side
Definition: HitInfo.h:83
MagneticFieldProperties.h
Muon::MuonChamberHoleRecoveryTool::m_chamberGeoKey
SG::ReadCondHandleKey< Muon::MuonIntersectGeoData > m_chamberGeoKey
Definition: MuonChamberHoleRecoveryTool.h:190
TgcClusterOnTrack.h
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
Trk::TrackStateOnSurface::type
bool type(const TrackStateOnSurfaceType type) const
Use this method to find out if the TSoS is of a certain type: i.e.
MuonTSOSHelper.h
Volume.h
RpcClusterOnTrack.h
Muon::MuonChamberHoleRecoveryTool::RecoveryState::tsosId
Identifier tsosId
Identifier of the current trackStateOnSurface.
Definition: MuonChamberHoleRecoveryTool.h:75
Muon::MuonChamberHoleRecoveryTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonChamberHoleRecoveryTool.h:157
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
Muon::MuonChamberHoleRecoveryTool::m_DetectorManagerKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
Definition: MuonChamberHoleRecoveryTool.h:179
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ResidualPull.h
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
Muon::MuonChamberHoleRecoveryTool::initialize
StatusCode initialize() override
Definition: MuonChamberHoleRecoveryTool.cxx:94
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:50
Trk::TrackStateOnSurface::Hole
@ Hole
A hole on the track - this is defined in the following way.
Definition: TrackStateOnSurface.h:128
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
Muon::MuonChamberHoleRecoveryTool::m_edmHelperSvc
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
Definition: MuonChamberHoleRecoveryTool.h:158
Muon::MuonChamberHoleRecoveryTool::m_pullCalculator
ToolHandle< Trk::IResidualPullCalculator > m_pullCalculator
Definition: MuonChamberHoleRecoveryTool.h:176
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
urldecode::states
states
Definition: urldecode.h:39
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Trk::driftRadius
@ driftRadius
trt, straws
Definition: ParamDefs.h:59
MuonChamberHoleRecoveryTool.h
Muon::MuonTSOSHelper::createMeasTSOS
static std::unique_ptr< Trk::TrackStateOnSurface > createMeasTSOS(std::unique_ptr< Trk::MeasurementBase > meas, std::unique_ptr< Trk::TrackParameters > pars, Trk::TrackStateOnSurface::TrackStateOnSurfaceType type)
create a TSOS with a measurement, takes ownership of the pointers
Definition: MuonTSOSHelper.h:62
Trk::RIGHT
@ RIGHT
the drift radius is positive (see Trk::AtaStraightLine)
Definition: DriftCircleSide.h:22
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
CscClusterOnTrack.h
MdtIdHelper
Definition: MdtIdHelper.h:61
PseudoMeasurementOnTrack.h
Trk::TrkDetElementBase::surface
virtual const Surface & surface() const =0
Return surface associated with this detector element.
MmIdHelper::gasGapMax
static int gasGapMax()
Definition: MmIdHelper.cxx:827
python.StandardJetMods.pull
pull
Definition: StandardJetMods.py:264
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::ParametersBase
Definition: ParametersBase.h:55
Muon::MuonChamberHoleRecoveryTool::RecoveryState::begin
Trk::TrackStates::const_iterator begin() const
Definition: MuonChamberHoleRecoveryTool.cxx:48
Muon::MuonChamberHoleRecoveryTool::m_clusRotCreator
ToolHandle< Muon::IMuonClusterOnTrackCreator > m_clusRotCreator
Definition: MuonChamberHoleRecoveryTool.h:173
Trk::muon
@ muon
Definition: ParticleHypothesis.h:28
Muon::MuonPrepDataCollection
Template to hold collections of MuonPrepRawData objects.
Definition: MuonPrepDataCollection.h:46
Muon::MuonChamberHoleRecoveryTool::getHoleLayerIds
std::set< Identifier > getHoleLayerIds(const Identifier &detElId, const std::set< Identifier > &knownLayers) const
Returns a set of all layer Identifiers (GasGap + channel orientation) in a muon chamber of type X exc...
Definition: MuonChamberHoleRecoveryTool.cxx:454
SortMeasurementsByPosition.h
TgcIdHelper::gasGapMax
static int gasGapMax(bool triplet)
Definition: TgcIdHelper.cxx:663
Muon::MuonChamberHoleRecoveryTool::createHoleTSOSsForClusterChamber
void createHoleTSOSsForClusterChamber(const Identifier &detElId, const EventContext &ctx, const Trk::TrackParameters &pars, std::set< Identifier > &layIds, NewTrackStates &states) const override
Definition: MuonChamberHoleRecoveryTool.cxx:342
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Muon::MuonTubeIntersect::tubeId
Identifier tubeId
Definition: MuonTubeIntersect.h:14
Muon::MuonChamberHoleRecoveryTool::RecoveryState::tsos
const Trk::TrackStateOnSurface * tsos() const
Definition: MuonChamberHoleRecoveryTool.cxx:54
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
Muon::MuonChamberHoleRecoveryTool::RecoveryState::chamberPars
const Trk::TrackParameters * chamberPars() const
Track parameters of the chamber.
Definition: MuonChamberHoleRecoveryTool.cxx:70
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
Amg::error
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 ...
Definition: EventPrimitivesHelpers.h:40
RpcIdHelper::gasGapMax
int gasGapMax() const
Definition: RpcIdHelper.cxx:1098
Muon::MdtDriftCircleOnTrack
This class represents the corrected MDT measurements, where the corrections include the effects of wi...
Definition: MdtDriftCircleOnTrack.h:37
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
sTgcIdHelper
Definition: sTgcIdHelper.h:55
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
Muon::MdtPrepData
Class to represent measurements from the Monitored Drift Tubes.
Definition: MdtPrepData.h:37
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Muon::MuonChamberHoleRecoveryTool::RecoveryState::end
Trk::TrackStates::const_iterator end() const
Definition: MuonChamberHoleRecoveryTool.cxx:51
MuonDetectorManager.h
Muon::MuonChamberHoleRecoveryTool::recoverMdtHits
void recoverMdtHits(const EventContext &ctx, const Identifier &chId, const Trk::TrackParameters &pars, NewTrackStates &newStates, std::set< Identifier > &knownLayers) const
Definition: MuonChamberHoleRecoveryTool.cxx:215
Muon::MuonChamberHoleRecoveryTool::RecoveryState::layersOnTrk
std::set< Identifier > layersOnTrk
List of all measurement layers on track.
Definition: MuonChamberHoleRecoveryTool.h:73
Trk::DriftCircleSide
DriftCircleSide
Enumerates the 'side' of the wire on which the tracks passed (i.e.
Definition: DriftCircleSide.h:16
Muon::MuonChamberHoleRecoveryTool::m_key_csc
SG::ReadHandleKey< Muon::CscPrepDataContainer > m_key_csc
Definition: MuonChamberHoleRecoveryTool.h:183
Muon::MuonStationIntersect
Definition: MuonStationIntersect.h:12
EventPrimitivesCovarianceHelpers.h
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
a
TList * a
Definition: liststreamerinfos.cxx:10
Muon::MuonChamberHoleRecoveryTool::holesInMdtChamber
std::set< Identifier > holesInMdtChamber(const EventContext &ctx, const Amg::Vector3D &position, const Amg::Vector3D &direction, const Identifier &chId, const std::set< Identifier > &tubeIds) const
calculate holes in a given chamber using local straight line extrapolation
Definition: MuonChamberHoleRecoveryTool.cxx:376
MmIdHelper
Definition: MmIdHelper.h:54
Muon::MuonTubeIntersect::xIntersect
double xIntersect
Definition: MuonTubeIntersect.h:16
CscIdHelper
Definition: CscIdHelper.h:52
Amg::intersect
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the closest approach of two lines.
Definition: GeoPrimitivesHelpers.h:302
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:49
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Muon::MuonChamberHoleRecoveryTool::m_key_tgc
SG::ReadHandleKey< Muon::TgcPrepDataContainer > m_key_tgc
Definition: MuonChamberHoleRecoveryTool.h:184
Muon::MuonChamberHoleRecoveryTool::m_trackingVolumesSvc
ServiceHandle< Trk::ITrackingVolumesSvc > m_trackingVolumesSvc
Definition: MuonChamberHoleRecoveryTool.h:161
Muon::SortTSOSByDistanceToPars
Definition: SortMeasurementsByPosition.h:55
Muon::MuonChamberHoleRecoveryTool::RecoveryState::CopyTarget
CopyTarget
Switch indicating whether the track states are copied onto the global cache vector or onto the chambe...
Definition: MuonChamberHoleRecoveryTool.h:66
Trk::RIO_OnTrack::identify
virtual Identifier identify() const final
return the identifier -extends MeasurementBase
Definition: RIO_OnTrack.h:155
GeoPrimitivesToStringConverter.h
MuonGM::MMReadoutElement
An MMReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station con...
Definition: MMReadoutElement.h:23
Muon::MuonChamberHoleRecoveryTool::RecoveryState
Definition: MuonChamberHoleRecoveryTool.h:53
Muon::MuonChamberHoleRecoveryTool::RecoveryState::CopyTarget::ChamberTrkStates
@ ChamberTrkStates
Muon::MuonChamberHoleRecoveryTool::m_adcCut
Gaudi::Property< double > m_adcCut
Definition: MuonChamberHoleRecoveryTool.h:197
TgcIdHelper::gasGapMin
static int gasGapMin()
Definition: TgcIdHelper.cxx:661
Muon::MuonChamberHoleRecoveryTool::m_mdtRotCreator
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtRotCreator
Definition: MuonChamberHoleRecoveryTool.h:168
Muon::MuonStationIndex::ChIndex
ChIndex
enum to classify the different chamber layers in the muon spectrometer
Definition: MuonStationIndex.h:15
Muon::MuonTubeIntersect::rIntersect
double rIntersect
Definition: MuonTubeIntersect.h:15
MuonSegment.h
Trk::hole
@ hole
Definition: MeasurementType.h:36
TgcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int gasGap, int isStrip, int channel) const
Definition: TgcIdHelper.cxx:583
Trk::LEFT
@ LEFT
the drift radius is negative (see Trk::AtaStraightLine)
Definition: DriftCircleSide.h:20
Muon::MuonChamberHoleRecoveryTool::recoverClusterHits
void recoverClusterHits(const EventContext &ctx, const Identifier &chId, const Trk::TrackParameters &chambPars, NewTrackStates &newStates, std::set< Identifier > &knownLayers) const
Definition: MuonChamberHoleRecoveryTool.cxx:322
Muon::MuonChamberHoleRecoveryTool::RecoveryState::CopyTarget::GlobalTrkStates
@ GlobalTrkStates
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
Muon::MuonChamberHoleRecoveryTool::RecoveryState::releaseStates
std::unique_ptr< Trk::TrackStates > releaseStates()
Moves the recovered track states on surface onto a Trk::TrackStates to be piped into a new Trk::Track...
Definition: MuonChamberHoleRecoveryTool.cxx:80
COOLRates.target
target
Definition: COOLRates.py:1106
Muon::NewTrackStates
MuonChamberHoleRecoveryTool::NewTrackStates NewTrackStates
Definition: MuonChamberHoleRecoveryTool.cxx:44
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
Definition: IdentifierHash.h:38
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
Trk::Volume
Definition: Volume.h:35
MuonGM::MuonPadDesign::distanceToPad
Amg::Vector2D distanceToPad(const Amg::Vector2D &pos, int channel) const
Definition: MuonPadDesign.cxx:118
Muon::MuonChamberHoleRecoveryTool::m_printer
ToolHandle< Muon::MuonEDMPrinterTool > m_printer
Definition: MuonChamberHoleRecoveryTool.h:166
DataVector< PrepDataT >::size
size_type size() const noexcept
Returns the number of elements in the collection.
Muon::MuonChamberHoleRecoveryTool::m_associationPullCutPhi
Gaudi::Property< double > m_associationPullCutPhi
Definition: MuonChamberHoleRecoveryTool.h:196
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
Muon::MuonChamberHoleRecoveryTool::RecoveryState::chamberStates
NewTrackStates chamberStates
Vector of the track states on surface in the current chamber.
Definition: MuonChamberHoleRecoveryTool.h:78
Trk::StraightLineSurface
Definition: StraightLineSurface.h:51
Muon::MuonClusterOnTrack
Base class for Muon cluster RIO_OnTracks.
Definition: MuonClusterOnTrack.h:34
MmIdHelper::gasGapMin
static int gasGapMin()
Definition: MmIdHelper.cxx:815
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
RpcIdHelper::doubletPhi
int doubletPhi(const Identifier &id) const
Definition: RpcIdHelper.cxx:1064
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37