ATLAS Offline Software
AlignmentErrorTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 
10 #include "AlignmentErrorTool.h"
11 
12 #include <boost/functional/hash.hpp>
13 #include <fstream>
14 #include <sstream>
15 
23 #include "TrkTrack/Track.h"
24 
25 namespace MuonAlign {
26 
27 AlignmentErrorTool::AlignmentErrorTool(const std::string& t, const std::string& n, const IInterface* p) : AthAlgTool(t, n, p) {
28  declareInterface<Trk::ITrkAlignmentDeviationTool>(this);
29 }
30 
32  ATH_MSG_INFO("*****************************************");
33  ATH_MSG_INFO("AlignmentErrorTool::initialize()");
34 
35  ATH_CHECK(m_idTool.retrieve());
36  ATH_CHECK(m_idHelperSvc.retrieve());
38 
39  return StatusCode::SUCCESS;
40 }
41 
42 void AlignmentErrorTool::makeAlignmentDeviations(const Trk::Track& track, std::vector<Trk::AlignmentDeviation*>& deviations) const {
43  ATH_MSG_DEBUG("AlignmentErrorTool::makeAlignmentDeviations()");
44 
46  const MuonAlignmentErrorData* readCdo{*readHandle};
47  if (!readCdo) {
48  ATH_MSG_ERROR("nullptr to the read conditions object");
49  return;
50  }
51  const auto& deviationVec = readCdo->getDeviations();
52  std::vector<deviationSummary_t> devSumVec;
53  devSumVec.reserve(deviationVec.size());
54  deviationSummary_t aDevSumm;
55  for (const auto & i : deviationVec) {
56  aDevSumm.translation = i.translation;
57  aDevSumm.rotation = i.rotation;
58  aDevSumm.stationName = i.stationName;
59  aDevSumm.multilayer = i.multilayer;
60  devSumVec.emplace_back(std::move(aDevSumm));
61  }
62 
63  typedef Trk::TrackStates tsosc_t;
64  const tsosc_t* tsosc = track.trackStateOnSurfaces();
65 
66  // LOOP ON HITS ON TRACK //
67  unsigned int nPrecisionHits = 0;
68  for (const auto *tsos : *tsosc) {
69  if (!tsos->type(Trk::TrackStateOnSurface::Measurement)) {
70  continue;
71  }
72  const Trk::MeasurementBase* meas = tsos->measurementOnTrack();
73  const auto* rot = dynamic_cast<const Trk::RIO_OnTrack*>(meas);
74 
75  if (!rot) {
76  const auto* crot = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(meas);
77  if (crot) {
78  unsigned int index = crot->indexOfMaxAssignProb();
79  rot = &(crot->rioOnTrack(index));
80  }
81  }
82  if (!rot) continue;
83 
84  Identifier channelId = rot->identify();
85  if (!m_idHelperSvc->isMuon(channelId)) {
86  // the RIO_OnTrack Identifiers could also come from ID or Calo, but this tool is only interested in MS hits
87  ATH_MSG_VERBOSE("Given Identifier " << channelId.get_compact() << " is not a muon Identifier, continuing");
88  continue;
89  }
90 
91  // Keep only the precision coordinate hits
92  if (m_idHelperSvc->isRpc(channelId)
93  || m_idHelperSvc->isTgc(channelId)
94  || (m_idHelperSvc->isCsc(channelId) && m_idHelperSvc->cscIdHelper().measuresPhi(channelId) == 1)
95  || (m_idHelperSvc->issTgc(channelId) && m_idHelperSvc->stgcIdHelper().channelType(channelId) != sTgcIdHelper::sTgcChannelTypes::Strip)) {
96  continue;
97  }
98 
99  // To maintain backward compatibility with the old error CLOBs, activate
100  // the NSW hits only if specified in the CLOB, else disccard them
101  if (!readCdo->hasNswHits()
102  && (m_idHelperSvc->issTgc(channelId) || m_idHelperSvc->isMM(channelId))) {
103  continue;
104  }
105 
106  MuonCalib::MuonFixedLongId calibId = m_idTool->idToFixedLongId(channelId);
107  if (!calibId.isValid()) continue;
108 
109  // GATHERING INFORMATION TO PUT TOGETHER THE STATION NAME //
110  std::string alignStationName = hardwareName(calibId);
111  int multilayer = 1;
112  if (calibId.is_mdt()) {
113  multilayer = calibId.mdtMultilayer();
114  } else if (calibId.is_mmg()) {
115  multilayer = calibId.mmgMultilayer();
116  } else if (calibId.is_stg()) {
117  multilayer = calibId.stgMultilayer();
118  }
119  std::string multilayerName = std::to_string(multilayer);
120 
121  ATH_MSG_DEBUG("Hit is in station " << alignStationName << " multilayer " << multilayerName);
122  ++nPrecisionHits;
123 
124  // Compute deviationSummary_t building blocks
125  const Trk::PrepRawData* prd = rot->prepRawData();
126  const Trk::Surface& sur = prd->detectorElement()->surface(prd->identify());
127 
128  double w2 = 1.0 / (rot->localCovariance()(Trk::loc1, Trk::loc1));
129  Amg::Vector3D hitP = tsos->trackParameters()->position();
130  Amg::Vector3D hitU = tsos->trackParameters()->momentum().unit();
131 
132  // Wire direction for MDT, strip direction for MM or sTGC
133  int icol = (calibId.is_mdt()||calibId.is_csc()) ? 2 : 1;
134  Amg::Vector3D hitV = sur.transform().rotation().col(icol);
135 
136  // Enforce orientation of the V vectors
137  static const Amg::Vector3D zATLAS(0., 0., 1.);
138  if (hitP.cross(zATLAS).dot(hitV)<0.0) {
139  hitV *= -1.0;
140  }
141 
142  // FOR CROSS-CHECK
143  bool is_matched = false;
144 
145  // LOOP ON STATION DEVIATIONS EXTRACTED FROM INPUT FILE //
146  for (auto & iDev : devSumVec) {
147  // try to regexp-match the station name and the multilayer name
148  if (!boost::regex_match(alignStationName, iDev.stationName)) {
149  continue;
150  }
151  if (!boost::regex_match(multilayerName, iDev.multilayer)) {
152  continue;
153  }
154 
155  // ASSOCIATE EACH NUISANCE TO A LIST OF HITS
156  iDev.hits.push_back(rot);
157 
158  iDev.sumW2 += w2;
159  iDev.sumP += w2 * hitP;
160  iDev.sumU += w2 * hitU;
161  iDev.sumV += w2 * hitV;
162 
163  // FOR CROSS-CHECK
164  is_matched = true;
165 
166 
167  } // LOOP ON DEVIATIONS
168 
169  if (!is_matched) {
170  ATH_MSG_WARNING("The hits in the station " << alignStationName << ", multilayer " << multilayerName
171  << " couldn't be matched to any deviation regexp in the list.");
172  }
173 
174  } // LOOP ON TSOS
175 
176  // Nuisance parameters covering the complete track are not wanted. (MS/ID
177  // error treated differently for now). Removing the deviations covering the
178  // full track in further processing.
179  for (auto& dev : devSumVec) {
180  if (dev.hits.size() == nPrecisionHits) {
181  dev.hits.clear();
182  }
183  }
184 
185  // GET RID OF PERFECT OVERLAPS BY COMBINING ERRORS
186  std::vector<const Trk::RIO_OnTrack*> v1, v2;
187  for (auto iti = devSumVec.begin(); iti != devSumVec.end(); ++iti) {
188 
189  v1 = iti->hits;
190  if (v1.empty()) {
191  continue;
192  }
193 
194  std::stable_sort(v1.begin(), v1.end());
195 
196  for (auto itj = iti+1; itj != devSumVec.end(); ++itj) {
197 
198  if (iti->hits.size() != itj->hits.size()) {
199  continue;
200  }
201 
202  v2 = itj->hits;
203  std::stable_sort(v2.begin(), v2.end());
204 
205  if (v1 == v2) {
206  auto iDev = std::distance(devSumVec.begin(), iti);
207  auto jDev = std::distance(devSumVec.begin(), itj);
208  ATH_MSG_DEBUG("Found deviations " << iDev << " and " << jDev << " related to the same list of hits. Merging...");
209  ATH_MSG_DEBUG("old (translation, rotation) systematic uncertainties for "
210  << iDev << ": " << iti->translation << ", " << iti->rotation);
211  ATH_MSG_DEBUG("old (translation, rotation) systematic uncertainties for "
212  << jDev << ": " << itj->translation << ", " << itj->rotation);
213 
214  // MERGE THE TWO DEVIATIONS ASSOCIATED TO THE SAME LIST OF HITS //
215  double new_translation = std::hypot(iti->translation, itj->translation);
216  double new_rotation = std::hypot(iti->rotation, itj->rotation);
217 
218  // NOW PREPARE TO ERASE ONE OF THE TWO COPIES //
219  itj->hits.clear();
220 
221  // ASSIGN NEW TRASLATION/ROTATION TO THE REMAINING COPY //
222  iti->translation = new_translation;
223  iti->rotation = new_rotation;
224  ATH_MSG_DEBUG("New combined (translation, rotation) systematic uncertainties: " << new_translation << ", " << new_rotation);
225 
226  } // FIND AN OVERLAP IN THE HITS LISTS
227  } // SECOND LOOP ON DEVIATIONS
228  } // FIRST LOOP ON DEVIATIONS
229 
230 
231  // NOW BUILD THE DEVIATIONS
232  deviations.clear();
233  ATH_MSG_DEBUG("************************************");
234  ATH_MSG_DEBUG("FINAL LIST OF DEVIATIONS");
235  for (const auto & iDev : devSumVec) {
236  if (iDev.hits.empty()) {
237  continue;
238  }
239 
240  double rotation = iDev.rotation;
241  double translation = iDev.translation;
242 
243  Amg::Vector3D sumP = iDev.sumP;
244  Amg::Vector3D sumU = iDev.sumU;
245  Amg::Vector3D sumV = iDev.sumV;
246  double sumW2 = iDev.sumW2;
247 
248  sumP *= (1. / sumW2);
249  sumU *= (1. / sumW2);
250  sumV *= (1. / sumW2);
251 
252  if (translation >= 0.001 * Gaudi::Units::mm) {
253  std::size_t hitshash = 0;
254  for (const auto *it : iDev.hits) {
255  boost::hash_combine(hitshash, (it->identify()).get_compact());
256  }
257  deviations.push_back(
258  new AlignmentTranslationDeviation(sumU.cross(sumV), translation * Gaudi::Units::mm, iDev.hits));
259  deviations.back()->setHashOfHits(hitshash);
260 
261  ATH_MSG_DEBUG("A translation along ("
262  << sumU.x() << ", " << sumU.y() << ", " << sumU.z() << ") with sigma=" << translation * Gaudi::Units::mm
263  << " mm was applied to " << iDev.hits.size()
264  << " hits matching the station: " << iDev.stationName.str() << " and the multilayer "
265  << iDev.multilayer.str());
266  }
267  if (rotation >= 0.000001 * Gaudi::Units::rad) {
268  std::size_t hitshash = 0;
269  for (const auto *it : iDev.hits) {
270  boost::hash_combine(hitshash, (it->identify()).get_compact());
271  }
272  deviations.push_back(new AlignmentRotationDeviation(sumP, sumV, rotation * Gaudi::Units::rad, iDev.hits));
273  deviations.back()->setHashOfHits(hitshash);
274 
275  ATH_MSG_DEBUG("A rotation around the center = (" << sumP.x() << ", " << sumP.y() << ", " << sumP.z() << ") and axis = ("
276  << sumV.x() << ", " << sumV.y() << ", " << sumV.z()
277  << ") with sigma=" << rotation / Gaudi::Units::mrad << " mrad was applied to "
278  << iDev.hits.size() << " hits matching the station "
279  << iDev.stationName.str() << " and the multilayer "
280  << iDev.multilayer.str());
281  }
282 
283  } // LOOP ON NUISANCES
284 
285  ATH_MSG_DEBUG("******************************");
286  ATH_MSG_DEBUG("FINAL CHECKUP");
287  ATH_MSG_DEBUG("Found " << deviations.size() << " nuisances after duplicates merging");
288  ATH_MSG_DEBUG("******************************");
289 }
290 
292 // RECOGNIZE STATION NAME //
294 
296  using StationName = MuonCalib::MuonFixedLongId::StationName;
297 
298  // The only exception that cannot be caught by hardwareEta() above
299  if (sector(calibId)==13) {
300  if (calibId.eta()== 7 && calibId.stationName()==StationName::BOL) return "BOE1A13"; // BOE1A13 not BOL7A13
301  if (calibId.eta()==-7 && calibId.stationName()==StationName::BOL) return "BOE1C13"; // BOE1C13 not BOL7C13
302  if (calibId.eta()== 8 && calibId.stationName()==StationName::BOL) return "BOE2A13"; // BOE2A13 not BOL8A13
303  if (calibId.eta()==-8 && calibId.stationName()==StationName::BOL) return "BOE2C13"; // BOE2C13 not BOL8C13
304  }
305 
306  std::string ret { calibId.stationNameString() };
307  ret.push_back(static_cast<char>('0'+std::abs(hardwareEta(calibId))));
308  ret.append(side(calibId)).append(sectorString(calibId));
309 
310  return ret;
311 }
312 
313 inline std::string_view AlignmentErrorTool::side(MuonCalib::MuonFixedLongId calibId) {
314  return calibId.eta()>0 ? "A" : calibId.eta()<0 ? "C" : "B";
315 }
316 
318  int sec = sector(calibId);
319  if (sec<0 || sec > 99) {
320  throw std::runtime_error("Unhandled sector number");
321  }
322  std::string ret = "00";
323  ret[0] += (sec/10);
324  ret[1] += (sec%10);
325  return ret;
326 }
327 
329  if (calibId.is_tgc()) {
330  // TGC sector convention is special
331  return calibId.phi();
332  } else {
333  return isSmallSector(calibId) ? 2*calibId.phi() : 2*calibId.phi()-1;
334  }
335 }
336 
338  using StationName = MuonCalib::MuonFixedLongId::StationName;
339  switch (calibId.stationName()) {
340  case StationName::BIS:
341  case StationName::BMS:
342  case StationName::BOS:
343  case StationName::BEE:
344  case StationName::BMF:
345  case StationName::BOF:
346  case StationName::BOG:
347  case StationName::EES:
348  case StationName::EMS:
349  case StationName::EOS:
350  case StationName::EIS:
351  case StationName::CSS:
352  case StationName::BMG:
353  case StationName::MMS:
354  case StationName::STS:
355  return true;
356  default:
357  return false;
358  }
359 }
360 
362  using StationName = MuonCalib::MuonFixedLongId::StationName;
363  switch (calibId.stationName()) {
364  case StationName::BML:
365  {
366  if (sector(calibId)==13) {
367  switch (calibId.eta()) {
368  case 4: return 5;
369  case 5: return 6;
370  case 6: return 7;
371  case -4: return -5;
372  case -5: return -6;
373  case -6: return -7;
374  }
375  }
376  return calibId.eta();
377  }
378  case StationName::BOL:
379  {
380  if (sector(calibId)==13) {
381  if (calibId.eta()== 7) return 1; // BOE1A13 not BOL7A13
382  if (calibId.eta()==-7) return -1; // BOE1C13 not BOL7C13
383  }
384  return calibId.eta();
385  }
386  case StationName::BOF:
387  return calibId.eta()>0 ? calibId.eta()*2-1 : calibId.eta()*2+1;
388  case StationName::BOG:
389  return calibId.eta()*2;
390  case StationName::EIL:
391  {
392  if ((sector(calibId) == 1) || (sector(calibId) == 9)) {
393  switch (calibId.eta()) {
394  case 4: return 5;
395  case 5: return 4;
396  case -4: return -5;
397  case -5: return -4;
398  }
399  }
400  return calibId.eta();
401  }
402  case StationName::EEL:
403  {
404  if ((sector(calibId) == 5) && (calibId.eta() == 1)) return 2;
405  if ((sector(calibId) == 5) && (calibId.eta() == -1)) return -2;
406  return calibId.eta();
407  }
408  default: return calibId.eta();
409  }
410 }
411 
412 } // namespace MuonAlign
BIS
@ BIS
Definition: RegSelEnums.h:11
MuonCalib::MuonFixedLongId::mmgMultilayer
int mmgMultilayer() const
Mmg specific:
Definition: MuonFixedLongId.h:1451
MuonCalib::MuonFixedLongId::phi
int phi() const
Definition: MuonFixedLongId.h:935
MuonCalib::MuonFixedLongId::is_tgc
bool is_tgc() const
Definition: MuonFixedLongId.h:778
MuonCalib::MuonFixedLongId::is_mdt
bool is_mdt() const
Definition: MuonFixedLongId.h:774
MuonAlign::AlignmentErrorTool::AlignmentErrorTool
AlignmentErrorTool(const std::string &, const std::string &, const IInterface *)
Definition: AlignmentErrorTool.cxx:27
MuonAlign::AlignmentRotationDeviation
Definition: AlignmentRotationDeviation.h:11
CSS
@ CSS
Definition: ParabolaCscClusterFitter.h:25
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
MuonAlign::AlignmentErrorTool::deviationSummary_t::rotation
double rotation
Definition: AlignmentErrorTool.h:49
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthMsgStreamMacros.h
CompetingRIOsOnTrack.h
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
MuonAlign::AlignmentErrorTool::deviationSummary_t
Definition: AlignmentErrorTool.h:46
BOG
@ BOG
Definition: RegSelEnums.h:19
index
Definition: index.py:1
MuonCalib::MuonFixedLongId::StationName
StationName
an enum with the station names
Definition: MuonFixedLongId.h:64
xAOD::L2MuonParameters::BEE
@ BEE
BEE measurement point.
Definition: TrigMuonDefs.h:24
skel.it
it
Definition: skel.GENtoEVGEN.py:423
MuonCalib::MuonFixedLongId::isValid
bool isValid() const
check validity of the identifier.
Definition: MuonFixedLongId.h:770
MuonCalib::MuonFixedLongId::is_mmg
bool is_mmg() const
Definition: MuonFixedLongId.h:790
BMF
@ BMF
Definition: RegSelEnums.h:16
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
MuonAlign::AlignmentErrorTool::m_idTool
ToolHandle< MuonCalib::IIdToFixedIdTool > m_idTool
Definition: AlignmentErrorTool.h:42
MuonCalib::MuonFixedLongId::is_stg
bool is_stg() const
Definition: MuonFixedLongId.h:794
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
BOL
@ BOL
Definition: RegSelEnums.h:14
python.SystemOfUnits.mrad
int mrad
Definition: SystemOfUnits.py:112
MuonAlign::AlignmentErrorTool::sector
int sector(MuonCalib::MuonFixedLongId calibId) const
Definition: AlignmentErrorTool.cxx:328
PrepRawData.h
MuonAlign::AlignmentErrorTool::deviationSummary_t::stationName
boost::regex stationName
Definition: AlignmentErrorTool.h:51
atlasStyleMacro.icol
int icol
Definition: atlasStyleMacro.py:13
MuonAlign::AlignmentErrorTool::m_readKey
SG::ReadCondHandleKey< MuonAlignmentErrorData > m_readKey
Definition: AlignmentErrorTool.h:72
AlignmentTranslationDeviation.h
Track.h
MuonCalib::MuonFixedLongId::stgMultilayer
int stgMultilayer() const
Stg specific:
Definition: MuonFixedLongId.h:1516
BOF
@ BOF
Definition: RegSelEnums.h:18
MuonAlign::AlignmentErrorTool::deviationSummary_t::translation
double translation
Definition: AlignmentErrorTool.h:48
GeoPrimitives.h
MuonCalib::MuonFixedLongId
Definition: MuonFixedLongId.h:50
MuonCalib::MuonFixedLongId::stationNameString
std::string_view stationNameString() const
Definition: MuonFixedLongId.h:886
MuonAlignmentErrorData
MuonAlignmentErrorData is condition data which is derived and recorded by MuonAlignmentErrorDbAlg.
Definition: MuonAlignmentErrorData.h:20
MuonAlign
Definition: AlignmentRotationDeviation.h:10
MuonAlign::AlignmentErrorTool::hardwareName
std::string hardwareName(MuonCalib::MuonFixedLongId calibId) const
Definition: AlignmentErrorTool.cxx:295
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MuonAlign::AlignmentErrorTool::initialize
StatusCode initialize() override
Definition: AlignmentErrorTool.cxx:31
MuonAlign::AlignmentTranslationDeviation
Definition: AlignmentTranslationDeviation.h:11
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
ret
T ret(T t)
Definition: rootspy.cxx:260
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
xAOD::rotation
rotation
Definition: TrackSurface_v1.cxx:15
Trk::CompetingRIOsOnTrack
Base class for all CompetingRIOsOnTack implementations, extends the common MeasurementBase.
Definition: CompetingRIOsOnTrack.h:64
Trk::TrkDetElementBase::surface
virtual const Surface & surface() const =0
Return surface associated with this detector element.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonAlign::AlignmentErrorTool::hardwareEta
int hardwareEta(MuonCalib::MuonFixedLongId calibId) const
Definition: AlignmentErrorTool.cxx:361
MuonCalib::MuonFixedLongId::eta
int eta() const
Definition: MuonFixedLongId.h:912
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
DataVector< const Trk::TrackStateOnSurface >
MuonCalib::MuonFixedLongId::is_csc
bool is_csc() const
Definition: MuonFixedLongId.h:782
MuonAlign::AlignmentErrorTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: AlignmentErrorTool.h:43
Trk::PrepRawData
Definition: PrepRawData.h:62
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk::PrepRawData::identify
Identifier identify() const
return the identifier
MuonAlign::AlignmentErrorTool::deviationSummary_t::multilayer
boost::regex multilayer
Definition: AlignmentErrorTool.h:52
RIO_OnTrack.h
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
AlignmentErrorTool.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
AlignmentRotationDeviation.h
MuonAlign::AlignmentErrorTool::sectorString
std::string sectorString(MuonCalib::MuonFixedLongId calibId) const
Definition: AlignmentErrorTool.cxx:317
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
ReadCellNoiseFromCoolCompare.v2
v2
Definition: ReadCellNoiseFromCoolCompare.py:364
MuonAlign::AlignmentErrorTool::makeAlignmentDeviations
void makeAlignmentDeviations(const Trk::Track &track, std::vector< Trk::AlignmentDeviation * > &deviations) const override
Compute alignment deviations, given a track as input.
Definition: AlignmentErrorTool.cxx:42
BML
@ BML
Definition: RegSelEnums.h:12
MuonCalib::MuonFixedLongId::stationName
StationName stationName() const
Definition: MuonFixedLongId.h:882
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
BMS
@ BMS
Definition: RegSelEnums.h:13
MuonCalib::MuonFixedLongId::mdtMultilayer
int mdtMultilayer() const
Mdt specific:
Definition: MuonFixedLongId.h:1070
MuonAlign::AlignmentErrorTool::isSmallSector
static bool isSmallSector(MuonCalib::MuonFixedLongId calibId)
Definition: AlignmentErrorTool.cxx:337
MuonAlign::AlignmentErrorTool::side
static std::string_view side(MuonCalib::MuonFixedLongId calibId)
Definition: AlignmentErrorTool.cxx:313
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
AthAlgTool
Definition: AthAlgTool.h:26
Trk::loc1
@ loc1
Definition: ParamDefs.h:40
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
BOS
@ BOS
Definition: RegSelEnums.h:15
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
Trk::Surface::transform
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
python.SystemOfUnits.rad
int rad
Definition: SystemOfUnits.py:111
Trk::PrepRawData::detectorElement
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...