ATLAS Offline Software
MuonStationBuilderImpl.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 
10 
11 #include <fstream>
12 #include <map>
13 
15 #include "GeoModelKernel/GeoBox.h"
16 #include "GeoModelKernel/GeoCons.h"
17 #include "GeoModelKernel/GeoPara.h"
18 #include "GeoModelKernel/GeoPgon.h"
19 #include "GeoModelKernel/GeoShape.h"
20 #include "GeoModelKernel/GeoShapeIntersection.h"
21 #include "GeoModelKernel/GeoShapeShift.h"
22 #include "GeoModelKernel/GeoShapeSubtraction.h"
23 #include "GeoModelKernel/GeoShapeUnion.h"
24 #include "GeoModelKernel/GeoTrap.h"
25 #include "GeoModelKernel/GeoTrd.h"
26 #include "GeoModelKernel/GeoTube.h"
27 #include "GeoModelKernel/GeoTubs.h"
28 #include "GeoModelKernel/GeoVolumeCursor.h"
45 #include "TrkGeometry/Layer.h"
50 #include "TrkSurfaces/DiscBounds.h"
62 
63 
64 namespace Muon{
66 
67 // constructor
69  const std::string& n,
70  const IInterface* p)
71  : AthAlgTool(t, n, p) {}
72 
73 // Athena standard methods
74 // initialize
76  // Retrieve the tracking volume helper
77  // -------------------------------------------------
79  ATH_MSG_INFO("Retrieved tool " << m_trackingVolumeHelper);
80 
81  // Retrieve muon station builder tool
82  // -------------------------------------------------
84  ATH_MSG_INFO("Retrieved tool " << m_muonStationTypeBuilder);
85 
86  // if no muon materials are declared, take default ones
87 
88  // default material properties
89  m_muonMaterial = Trk::Material(10e10, 10e10, 0., 0., 0.);
90 
91  ATH_MSG_INFO(" initialize() successful");
92 
93  ATH_CHECK(m_idHelperSvc.retrieve());
94 
95  return StatusCode::SUCCESS;
96 }
97 
100 
101  DetachedVolVec translatedStations{};
102 
103  // retrieve muon station branches from GeoModel tree
104  std::vector<std::pair<const GeoVPhysVol*, std::vector<GMInfo>>> stations = retrieveGMsensitive(muonMgr);
105 
106  for (const auto& mstation : stations) {
107  // build prototype
108  std::unique_ptr<Trk::DetachedTrackingVolume> msType = buildDetachedTrackingVolumeType(muonMgr, mstation.first,
109  mstation.second[0]);
110  if (!msType) {
111  continue;
112  }
113  // clone prototype
114  std::string name = mstation.first->getLogVol()->getName();
115  // NSW prototypes built at position
116  if (name.substr(0, 4) == "sTGC" || name.substr(0, 2) == "MM") {
117  for (unsigned int i = 0; i < mstation.second.size(); i++) {
118  std::string sName = name.substr(name.find('-') + 1);
119  Identifier nswId = m_muonStationTypeBuilder->identifyNSW(sName, mstation.second[i].first);
120  // clone station from prototype
121  Amg::Transform3D trdef(mstation.second[i].first *
122  mstation.second[0].first.inverse());
123  std::unique_ptr<Trk::DetachedTrackingVolume> newStat{msType->clone(name, trdef)};
124  // identify layer representation
125  Trk::Layer* layer = (newStat->layerRepresentation());
126  layer->setLayerType(nswId.get_identifier32().get_compact());
127  // identify layers
128  identifyNSWLayers(*newStat, nswId);
129  // collect
130  translatedStations.push_back(std::move(newStat));
131  } // end clone NSW stations
132  } else {
133  for (auto gminfo : mstation.second) {
134  // clone station from prototype
135  std::unique_ptr<Trk::DetachedTrackingVolume> newStat{msType->clone(name, gminfo.first)};
136  // identify layer representation
137  Trk::Layer* layer = newStat->layerRepresentation();
138  int eta{0}, phi{0};
139  Identifier stId = resolveId(name, gminfo, eta, phi, muonMgr);
140  layer->setLayerType(stId.get_identifier32().get_compact());
141  // glue components
142  glueComponents(newStat.get());
143  // identify layers
144  identifyLayers(newStat.get(), stId, eta, phi, muonMgr);
145  // collect
146  translatedStations.push_back(std::move(newStat));
147  } // end clone non-NSW
148  }
149  } // end loop over prototypes
150 
151  ATH_MSG_DEBUG( "returns " << translatedStations.size() << " stations");
152  return translatedStations;
153 }
154 
156  Trk::TrackingVolumeArray* volArray = stat->trackingVolume()->confinedVolumes();
157  if (!volArray || volArray->arrayObjectsNumber() <= 1) {
158  return;
159  }
160 
162  const Trk::BinUtility* binUtilityX = volArray->binUtility();
163  const Trk::CuboidVolumeBounds* cubVolBounds = dynamic_cast<const Trk::CuboidVolumeBounds*>(&(components[0]->volumeBounds()));
164 
165  // identify 'lower' and 'upper' boundary surface
168 
169  // rectangular station in x ordering (MDT barrel)
170  if (cubVolBounds && binUtilityX) {
171  low = Trk::negativeFaceYZ;
173  }
174 
175  if (low >= 0 && up >= 0) {
176  // glue volumes
177  for (unsigned int i = 0; i < components.size() - 1; ++i) {
178  m_trackingVolumeHelper->glueTrackingVolumes(*(components[i]), up, *(components[i + 1]), low);
179  }
180  }
181 
182 
183 }
184 
186  Trk::DetachedTrackingVolume* station, Identifier /*stationID*/, int eta,
187  int phi, const MuonGM::MuonDetectorManager* muonMgr) const {
188  ATH_MSG_VERBOSE(name() << " identifying layers ");
189 
190  const std::string stationName = station->trackingVolume()->volumeName();
191  ATH_MSG_VERBOSE(" in station " << station->name());
192  const std::string stationStr = stationName.substr(0, 3);
193  bool is_valid{false};
194  if (m_idHelperSvc->hasCSC() && stationStr[0] == 'C') {
195  const int cscEtaSt = eta - MuonGM::MuonDetectorManager::NCscStEtaOffset;
196  const Identifier readout_id = muonMgr->cscIdHelper()->channelID(
197  stationStr, cscEtaSt, phi + 1, 1, 1, 0, 1, is_valid);
198  const MuonGM::CscReadoutElement* cscRE =
199  is_valid ? muonMgr->getCscReadoutElement(readout_id) : nullptr;
200  if (!cscRE) {
201  const Identifier backup_id = muonMgr->cscIdHelper()->channelID(
202  stationStr, cscEtaSt, phi + 1, 2, 1, 0, 1, is_valid);
203  cscRE =
204  is_valid ? muonMgr->getCscReadoutElement(backup_id) : nullptr;
205  }
206  if (cscRE) {
207  for (int gasgap = 0; gasgap < cscRE->Ngasgaps(); gasgap++) {
208  Identifier idi = m_idHelperSvc->cscIdHelper().channelID(
209  cscRE->identify(), cscRE->ChamberLayer(), gasgap + 1, 0, 1,
210  is_valid);
211  if (!is_valid)
212  continue;
213  auto stripSurf = dynamic_cast<const Trk::PlaneSurface*>(&(cscRE->surface(idi)));
214  const Amg::Vector3D& gpi = stripSurf->center();
215  Trk::TrackingVolume* assocVol =
216  station->trackingVolume()->associatedSubVolume(gpi);
217  Trk::Layer* assocLay = nullptr;
218  if (assocVol)
219  assocLay = assocVol->associatedLayer(gpi);
220  unsigned int iD = idi.get_identifier32().get_compact();
221  if (assocVol && assocLay) {
222  assocLay->setLayerType(iD);
223  }
224  if (assocLay) {
225  assocLay->setRef((assocLay->surfaceRepresentation().transform().inverse() *gpi)[1]);
226  }
227  }
228  } else {
229  ATH_MSG_DEBUG("cscRE not found:" << stationName << "," << eta << ","
230  << phi);
231  }
232  } else if (stationStr[0] == 'T') {
233  const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
234  int st = 7;
235  if (stationStr == "T1F") {
236  st = 0;
237  } else if (stationStr == "T1E") {
238  st = 1;
239  } else if (stationStr == "T2F") {
240  st = 2;
241  } else if (stationStr == "T2E") {
242  st = 3;
243  } else if (stationStr == "T3F") {
244  st = 4;
245  } else if (stationStr == "T3E") {
246  st = 5;
247  } else if (stationStr == "T4F") {
248  st = 6;
249  }
250 
251  const int stationName =
254  const int stationEta =
256  auto getReadout = [stationName, stationEta, muonMgr, &idHelper](int phi) {
257  const int stationPhi = phi + 1;
258  bool is_valid{false};
259  const Identifier id = idHelper.elementID(stationName, stationEta, stationPhi, is_valid);
260  return is_valid ? muonMgr->getTgcReadoutElement(id) : nullptr;
261  };
262  const MuonGM::TgcReadoutElement* tgc = getReadout(phi - 1);
263 
264  if (!tgc || !(station->trackingVolume()->inside(tgc->center(), 0.))) {
265  unsigned int phit = 0;
266 
267  while (phit < 48) {
268  const MuonGM::TgcReadoutElement* tgct = getReadout(phit);
269  if (tgct &&
270  station->trackingVolume()->inside(tgct->center(), 0.)) {
271  tgc = tgct;
272  phi = phit;
273  // update station identity
274  Identifier oldId(station->layerRepresentation()->layerType());
275  int stationName = idHelper.stationName(oldId);
276  int stationEta = idHelper.stationEta(oldId);
277  Identifier stId = idHelper.channelID(stationName, stationEta, phi,
278  1,1,1, is_valid);
279  station->layerRepresentation()->setLayerType(
280  stId.get_identifier32().get_compact());
281  break;
282  }
283  phit++;
284  }
285  }
286 
287  if (tgc) {
288  const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
289  int etaSt = tgc->getStationEta();
290  int phiSt = tgc->getStationPhi();
291 
292  bool validId{false};
293  Identifier wireId = idHelper.channelID(stationStr, etaSt, phiSt, 1, 0, 1, validId);
294  if (!validId) {
295  ATH_MSG_ERROR("invalid TGC channel:" << wireId);
296  }
297  const Amg::Vector3D gp = tgc->channelPos(wireId);
298  Trk::TrackingVolume* assocVol =
299  station->trackingVolume()->associatedSubVolume(gp);
300  if (!assocVol)
301  ATH_MSG_DEBUG("wrong tgcROE?" << stationStr << "," << etaSt
302  << "," << phiSt);
303  if (assocVol && assocVol->confinedLayers()) {
305  assocVol->confinedLayers()->arrayObjects();
306 
307  for (unsigned int il = 0; il < layers.size(); il++) {
308  wireId = idHelper.channelID(stationStr, etaSt, phiSt, il + 1, 1, 1, validId);
309  if (!validId) {
310  ATH_MSG_ERROR("invalid TGC channel:" << wireId);
311  layers[il]->setLayerType(1);
312  } else {
313  unsigned int id = wireId.get_identifier32().get_compact();
314  layers[il]->setLayerType(id);
315  // validation
316  Identifier checkId(layers[il]->layerType());
317  auto stripSurf = dynamic_cast<const Trk::PlaneSurface*>(&(tgc->surface(checkId)));
318  if ((layers[il]->surfaceRepresentation().transform().inverse() * stripSurf->center()).mag() > 0.001)
319  ATH_MSG_DEBUG("TGC strip plane shifted:"<< st << "," << eta << "," << phi
320  << ":"<< layers[il]->surfaceRepresentation().transform().inverse() * stripSurf->center());
321  }
322  }
323  }
324  } else {
325  ATH_MSG_WARNING(name() << "tgcROE not found for :" << stationName
326  << "," << eta << "," << phi);
327  }
328  } else if (m_idHelperSvc->hasMDT() &&
329  (stationName[0] == 'B' || stationName[0] == 'E')) {
330  // recalculate id
331  Identifier stId(station->layerRepresentation()->layerType());
332  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
333  const int nameIndex = idHelper.stationNameIndex(stationName.substr(0, 3));
334  if (station->trackingVolume()->confinedVolumes()) {
337  for (auto* cVol : cVols) {
338  if (cVol->confinedLayers()) {
339  Trk::BinnedArraySpan<Trk::Layer* const> cLays = cVol->confinedLayers()->arrayObjects();
340  const MuonGM::MdtReadoutElement* mdtROE = nullptr;
341  bool is_valid{false};
342 
343  for (auto* cLay : cLays) {
344  Identifier id(cLay->layerType());
345  if (id.get_compact() > 0 && m_idHelperSvc->isMdt(id)) {
346  Identifier newId = idHelper.channelID(nameIndex, eta, phi,
347  idHelper.multilayer(id),
348  idHelper.tubeLayer(id),
349  idHelper.tube(id),
350  is_valid);
351  if (!mdtROE) {
352  mdtROE = is_valid ? muonMgr->getMdtReadoutElement(newId) : nullptr;
353  }
354  unsigned int newid = newId.get_identifier32().get_compact();
355  cLay->setLayerType(newid);
356  // check reference position
357  if (mdtROE) {
358  double ref = cLay->getRef();
359  // double loc = mdtROE->localROPos(newId)[2]; //
360  // this does not take into account ROE shift wrt
361  // TG station/layer
362  double loc = (cLay->surfaceRepresentation().transform().inverse() * mdtROE->tubePos(newId))[1];
363  if (std::abs(ref) > 10e6) {
364  double sign = (ref > 0.) ? 1. : -1.;
365  int dec = int(ref / 1e5);
366  ref = ref - dec * 1e5 -
367  0.5 * (sign + 1) * 1e5;
368  if (std::abs(ref - loc) > 0.001) { // re-pack
369  cLay->setRef(loc + dec * 1e5 + 0.5 * (sign + 1) * 1e5);
370  }
371  } else if (std::abs(ref - loc) > 0.001) {
372  cLay->setRef(loc);
373  }
374  }
375  }
376  }
377  }
378  if (!cVol->confinedArbitraryLayers().empty()) {
379  Trk::ArraySpan<Trk::Layer* const> cLays = cVol->confinedArbitraryLayers();
380  const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
381  for (auto* cLay : cLays) {
382  Identifier id(cLay->layerType());
383  bool is_valid{false};
384  if (m_idHelperSvc->hasRPC() && id.get_compact() > 0 && m_idHelperSvc->isRpc(id)) {
385  Identifier newId = idHelper.channelID(nameIndex, eta, phi,
386  idHelper.doubletR(id), idHelper.doubletZ(id),
387  idHelper.doubletPhi(id), idHelper.gasGap(id),
388  1, idHelper.strip(id),
389  is_valid);
390  int newid = newId.get_identifier32().get_compact();
391  cLay->setLayerType(newid);
392  }
393  }
394  }
395  }
396  }
397  }
398  // by now, all the layers should be identified - verify
399  if (station->trackingVolume()->confinedVolumes()) {
402  for (auto* cVol : cVols) {
403  if (cVol->confinedLayers()) {
405  cVol->confinedLayers()->arrayObjects();
406  for (unsigned int il = 0; il < cLays.size(); il++) {
407  Identifier id(cLays[il]->layerType());
408  if (id == 1)
409  ATH_MSG_DEBUG(station->name()
410  << "," << cVol->volumeName()
411  << ", unidentified active layer:" << il);
412  else if (id != 0)
413  checkLayerId("check layer in " + station->name() +
414  " subvolume " + cVol->volumeName(),
415  muonMgr, id, cLays[il]);
416  }
417  }
418  if (!cVol->confinedArbitraryLayers().empty()) {
420  cVol->confinedArbitraryLayers();
421  for (unsigned int il = 0; il < cLays.size(); il++) {
422  Identifier id(cLays[il]->layerType());
423  if (id == 1)
424  ATH_MSG_DEBUG(station->name()
425  << "," << cVol->volumeName()
426  << ", unidentified active layer:" << il);
427  else if (id != 0)
428  checkLayerId("check arbitrary layer in " +
429  station->name() + " subvolume " +
430  cVol->volumeName(),
431  muonMgr, id, cLays[il]);
432  }
433  }
434  }
435  }
436  if (station->trackingVolume()->confinedLayers()) {
438  station->trackingVolume()->confinedLayers()->arrayObjects();
439  for (unsigned int il = 0; il < cLays.size(); il++) {
440  Identifier id(cLays[il]->layerType());
441  if (id == 1)
442  ATH_MSG_DEBUG(station->name()
443  << "," << station->name()
444  << ", unidentified active layer:" << il);
445  else if (id != 0)
446  checkLayerId("check confined layer in " + station->name(),
447  muonMgr, id, cLays[il]);
448  }
449  }
450  // end identification check
451 }
452 
454  const Identifier& id) const {
455 
456 
457  if (!station.trackingVolume()->confinedLayers()) return;
459  const bool isStgc{station.name().substr(0, 4) == "sTGC"};
460  const bool isMm{station.name().substr(0, 2) == "MM"};
461  if (!isMm && !isStgc) return;
462  for (unsigned int il = 0; il < lays.size(); il++) {
463  if (isStgc) {
464  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
465  const Identifier lid = idHelper.channelID(id, idHelper.multilayer(id), il + 1, 2, 1);
466  lays[il]->setLayerType(lid.get_identifier32().get_compact());
467 
468  } else if (isMm) {
469  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
470  const Identifier lid = idHelper.channelID(id, idHelper.multilayer(id), il + 1, 1);
471  lays[il]->setLayerType(lid.get_identifier32().get_compact());
472  }
473  }
474 }
475 
477  const Amg::Transform3D& transf,
478  const MuonGM::MuonDetectorManager* muonMgr) const {
479  ATH_MSG_VERBOSE(name() << " identifying prototype ");
480 
481  const std::string& stationName = station.volumeName();
482  ATH_MSG_VERBOSE(" for station " << stationName);
483  const std::string stationNameShort = stationName.substr(0, 3);
484  const char stationFirstChar = stationName[0];
485  bool is_valid{false};
486 
487  if (m_idHelperSvc->hasMDT() && (stationFirstChar == 'B' || stationFirstChar == 'E')) {
488  // MDT
489  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
490  const int nameIndex = idHelper.stationNameIndex(stationNameShort);
491  for (int multi = 1; multi <= 2; ++multi) {
492  const Identifier ele_id = idHelper.channelID(nameIndex, eta, phi, multi, 1, 1, is_valid);
493  if (!is_valid) {
494  continue;
495  }
496  const MuonGM::MdtReadoutElement* multilayer = muonMgr->getMdtReadoutElement(ele_id);
497  if (!multilayer) {
498  continue;
499  }
500  Trk::TrackingVolume* assocVol = station.associatedSubVolume(transf.inverse() * multilayer->center());
501  if (!assocVol) {
502  ATH_MSG_WARNING("valid multilayer outside station:" << stationName);
503  continue;
504  }
505  int nLayers = multilayer->getNLayers();
506  for (int layer = 1; layer <= nLayers; ++layer) {
507  Identifier id = idHelper.channelID(nameIndex, eta, phi, multi, layer, 1, is_valid);
508  if (!is_valid) {
509  continue;
510  }
511  // retrieve associated layer
512  Trk::Layer* assocLay = assocVol->associatedLayer(transf.inverse() * multilayer->tubePos(id));
513  if (assocLay) {
514  assocLay->setLayerType(id.get_identifier32().get_compact());
515  }
516  }
517  }
518 
519  // RPC ?
520  Trk::BinnedArray<Trk::TrackingVolume>* confinedVolumes = station.confinedVolumes();
521  if (confinedVolumes) {
523  for (auto* vol : vols) {
524  if (!m_idHelperSvc->hasRPC() || vol->volumeName() != "RPC") {
525  break;
526  }
527 
528  // for active layers do a search of associated ROE
529  Trk::ArraySpan<Trk::Layer* const> layers = vol->confinedArbitraryLayers();
530  int nameIndex = m_idHelperSvc->rpcIdHelper().stationNameIndex(stationNameShort);
532  if (stationNameShort == "BME" || stationNameShort == "BMG") {
533  continue;
534  }
535  // the following checks are not necessarily needed, since
536  // calling channelID with check=true would catch them
537  // However, since these validity checks are slow, let's
538  // manually skip the obvious non-existant ones
539  //
540  // only BOG7/8 and BMS2/4 have doubletZ=3, the remaing BOG
541  // and BOF4 have doubletZ=1
542  int doubletZMax = 2;
543  if (stationNameShort.find("BMS") != std::string::npos && (std::abs(eta) == 2 || std::abs(eta) == 4)) {
544  doubletZMax = 3;
545  }
546  else if (stationNameShort.find("BOG") != std::string::npos) {
547  if (std::abs(eta) == 7 || std::abs(eta) == 8) {
548  doubletZMax = 3;
549  } else {
550  doubletZMax = 1;
551  }
552  } else if (stationNameShort.find("BOF") != std::string::npos && std::abs(eta) == 4){
553  doubletZMax = 1;
554  }
555  // all BOL/BOS and BOF1 have doubletR=1
556  const RpcIdHelper& idHelper{m_idHelperSvc->rpcIdHelper()};
557  for (int doubletR = 1; doubletR <= 2; ++doubletR) {
558  bool isValid{false};
559  const Identifier stationId = idHelper.elementID(nameIndex, eta, phi, doubletR, isValid);
560  if (!isValid) {
561  continue;
562  }
563  for (int doubletZ = 1; doubletZ <= doubletZMax; ++doubletZ) {
564  for (int doubletPhi = 1; doubletPhi <= 2; doubletPhi++) {
565 
566  const Identifier id = idHelper.channelID(stationId, doubletZ, doubletPhi,
567  1, 0, 1, isValid);
568  if (!isValid) {
569  continue;
570  }
571  const MuonGM::RpcReadoutElement* rpc = muonMgr->getRpcReadoutElement(id);
572  if (!rpc) {
573  continue;
574  }
575  for (int gasGap = 1; gasGap <= rpc->numberOfLayers(); ++gasGap) {
576 
577  Identifier etaId = idHelper.channelID(id, doubletZ, doubletPhi,
578  gasGap, 0, 1, isValid);
579 
580  const Amg::Vector3D stripLocPos = transf.inverse() * rpc->stripPos(etaId);
581  for (auto* layer : layers) {
582  if (layer->layerType() == 0 ||
583  !layer->surfaceRepresentation().isOnSurface(stripLocPos, false, 0.5* layer->thickness())){
584  continue;
585  }
586  const Amg::Vector3D locPos1 =layer->surfaceRepresentation().transform().inverse() * stripLocPos;
587  const Amg::Vector3D locPos2 = rpc->surface(etaId).transform().inverse() * rpc->stripPos(etaId);
588 
589  double swap = (std::abs(locPos1[1] - locPos2[0]) > 0.001) ? 20000. : 0.;
590 
591  layer->setLayerType(etaId.get_identifier32().get_compact());
592 
593 
594  const Amg::Vector3D locPos = layer->surfaceRepresentation().transform() *
595  transf.inverse() * rpc->surface(etaId).center();
596  layer->setRef(swap + locPos[0]);
597 
598  }
599  }
600  }
601  }
602  }
603  }
604  }
605  }
606 
607  // by now, all the layers should be identified - verify
608  if (station.confinedVolumes()) {
610  for (auto* cVol : cVols) {
611  if (cVol->confinedLayers()) {
612  Trk::BinnedArraySpan<Trk::Layer* const> cLays = cVol->confinedLayers()->arrayObjects();
613  for (unsigned int il = 0; il < cLays.size(); il++) {
614  Identifier id(cLays[il]->layerType());
615  if (id == 1) {
616  ATH_MSG_DEBUG(station.volumeName()<< "," << cVol->volumeName() << ", unidentified active layer:" << il);
617  }
618  }
619  }
620  if (!cVol->confinedArbitraryLayers().empty()) {
621  Trk::ArraySpan<Trk::Layer* const> cLays = cVol->confinedArbitraryLayers();
622  for (unsigned int il = 0; il < cLays.size(); il++) {
623  Identifier id(cLays[il]->layerType());
624  if (id == 1) {
625  ATH_MSG_DEBUG(station.volumeName() << "," << cVol->volumeName() << ", unidentified active layer:" << il);
626  }
627  }
628  }
629  }
630  }
631  if (station.confinedLayers()) {
633  for (unsigned int il = 0; il < cLays.size(); il++) {
634  Identifier id(cLays[il]->layerType());
635  if (id == 1) {
636  ATH_MSG_DEBUG(station.volumeName() << ", unidentified active layer:" << il);
637  }
638  }
639  }
640  // end identification check
641 }
642 
643 void MuonStationBuilderImpl::getNSWStationsForTranslation(const GeoVPhysVol* pv, const std::string& name,
645  std::vector<std::pair<std::pair<const GeoLogVol*, Trk::MaterialProperties*>,
646  std::vector<Amg::Transform3D>>>& vols,
647  std::vector<std::string>& volNames) const {
648  // special code to get the Sensitive volume of the sTGC and MM (so the gas
649  // volume) throught the Frame
650 
651  // subcomponents
652  unsigned int nc = pv->getNChildVols();
653  ATH_MSG_DEBUG("getNSWStationsForTranslation from:"
654  << pv->getLogVol()->getName() << ","
655  << pv->getLogVol()->getMaterial()->getName()
656  << ", looping over " << nc << " children");
657 
658  for (unsigned int ic = 0; ic < nc; ic++) {
659  Amg::Transform3D transf = pv->getXToChildVol(ic);
660  const GeoVPhysVol* cv = pv->getChildVol(ic);
661  const GeoLogVol* clv = cv->getLogVol();
662  std::string childName = clv->getName();
663  ATH_MSG_DEBUG("getNSWStationsForTranslation child " << childName);
664 
665  if (childName.empty()) {
666  childName = "Spacer";
667  }
668  if (childName.size() > 9 && childName.substr(childName.size() - 9, 9) == "Sensitive") {
669  childName += std::to_string(ic);
670  }
671 
672  std::string cName = childName.compare(0, 3, "NSW") == 0 || childName.compare(0, 8, "NewSmall") == 0
673  ? name : name + childName;
674  ATH_MSG_VERBOSE("child number,name,position:" << ic << ":" << clv->getName() << ":"<< Amg::toString(transform * transf));
675 
676  if (!cv->getNChildVols()) {
677  bool found = false;
678  for (unsigned int is = 0; is < vols.size(); is++) {
679  if (cName == volNames[is]) {
680  if (std::abs((transform * transf).translation().perp() -
681  vols[is].second.front().translation().perp()) <
682  1.) {
683  found = true;
684  // order transforms to position prototype at phi=0/
685  // 0.125 pi
686  double phiTr = (transform * transf).translation().phi();
687  if (phiTr > -0.001 && phiTr < 0.4) {
688  vols[is].second.insert(vols[is].second.begin(),
689  transform * transf);
690  } else
691  vols[is].second.push_back(transform * transf);
693  "clone?"
694  << clv->getName() << ","
695  << (transform * transf).translation().perp() << ","
696  << (transform * transf).translation().z() << ","
697  << phiTr);
698 
699  break;
700  }
701  }
702  }
703  if (!found) {
704  std::vector<Amg::Transform3D> volTr;
705  volTr.push_back(transform * transf);
706  // divide mother material ? seems strange - check !
707  // double scale = 1.; // 1./nc;
708  double thick = 2 * m_muonStationTypeBuilder->get_x_size(pv);
709  if (pv->getLogVol()->getMaterial()->getName() != "Ether" &&
710  (childName == "MM_Frame" || childName == "sTGC_Frame")) {
711  Trk::MaterialProperties matComb(0., 10.e10, 10.e10, 13.,
712  26., 0.);
714  pv->getLogVol()->getMaterial());
715  matComb.addMaterial(newMat, thick / newMat.x0());
716  ATH_MSG_VERBOSE(" use mother volume thickness, x0: "
717  << matComb.thickness() << ", "
718  << matComb.x0()
719  << " mat: " << matComb.thicknessInX0());
721  new Trk::MaterialProperties(matComb);
722  // store mother volume (and not child = Frame)
723  std::pair<const GeoLogVol*, Trk::MaterialProperties*> cpair(
724  pv->getLogVol(), nMat);
725  vols.emplace_back(cpair, volTr);
726  // store extensive name
727  volNames.push_back(cName);
728  ATH_MSG_VERBOSE("new NSW station volume added:"
729  << cName << ", "
730  << clv->getMaterial()->getName() << ", "
731  << volTr.back().translation().z() << ", "
732  << volTr.back().translation().phi()
733  << " mat: " << matComb.thicknessInX0());
734  }
735  // printInfo(cv);
736  }
737  } else {
738  getNSWStationsForTranslation(cv, cName, transform * transf, vols,
739  volNames);
740  }
741  }
742 }
743 
744 std::vector<std::pair<const GeoVPhysVol*, std::vector<GMInfo>>>
746 
747  // a single loop over GM tree to retrieve all necessary information
748 
749  std::vector<std::pair<const GeoVPhysVol*,
750  std::vector<GMInfo>>> sensitive;
751 
752  const GeoVPhysVol* top = muonMgr->getTreeTop(0);
753 
754 
755  // NSW stations first to avoid double-counting
756  const GeoVPhysVol* sTGC_top = m_gmBrowser.findTopBranch(top, "sTGC_1");
757  const GeoVPhysVol* MM_top = m_gmBrowser.findTopBranch(top, "MM_1");
758  if (sTGC_top && sTGC_top != top) {
759  ATH_MSG_DEBUG("sTGC GeoModel branch found:" << sTGC_top->getLogVol()->getName());
760  GeoVolumeCursor vol(sTGC_top);
761  while (!vol.atEnd()) {
762  const GeoVPhysVol* cv = vol.getVolume();
763  const std::string& vname = cv->getLogVol()->getName();
764  if (vname.find("sTGC_1") == std::string::npos) {
765  vol.next();
766  continue;
767  }
768  std::vector<std::pair<const GeoVPhysVol*,
769  std::vector<GMInfo>>>::iterator it =
770  sensitive.begin();
771  while (it < sensitive.end()) {
772  if (vname == (*it).first->getLogVol()->getName() &&
773  m_gmBrowser.compareGeoVolumes(cv, (*it).first, 1.e-3) == 0)
774  break;
775  ++it;
776  }
777 
778  if (it == sensitive.end()) {
779  std::vector<std::pair<Amg::Transform3D, int>> cloneList;
780  cloneList.push_back(
781  std::make_pair(vol.getTransform(), 0));
782  sensitive.push_back(std::make_pair(cv, cloneList));
783  } else {
784  Amg::Transform3D transf = vol.getTransform();
785  // order transforms to position prototype at phi=0/ 0.125 pi
786  double phiTr = transf.translation().phi();
787  if (phiTr > -0.001 && phiTr < 0.4)
788  (*it).second.insert((*it).second.begin(),
789  std::make_pair(vol.getTransform(), 0));
790  else
791  (*it).second.push_back(std::make_pair(vol.getTransform(), 0));
792  }
793  vol.next();
794  }
795  }
796 
797  if (MM_top && MM_top != top) {
798  ATH_MSG_DEBUG("MM GeoModel branch found:" << MM_top->getLogVol()->getName());
799  GeoVolumeCursor vol(MM_top);
800  while (!vol.atEnd()) {
801  const GeoVPhysVol* cv = vol.getVolume();
802  const std::string& vname = cv->getLogVol()->getName();
803  if (vname.find("MM_1") == std::string::npos) {
804  vol.next();
805  continue;
806  }
807  std::vector<std::pair<const GeoVPhysVol*,
808  std::vector<GMInfo>>>::iterator it =
809  sensitive.begin();
810  while (it < sensitive.end()) {
811  if (vname == (*it).first->getLogVol()->getName() &&
812  m_gmBrowser.compareGeoVolumes(cv, (*it).first, 1.e-3) == 0)
813  break;
814  ++it;
815  }
816 
817  if (it == sensitive.end()) {
818  std::vector<std::pair<Amg::Transform3D, int>> cloneList;
819  cloneList.push_back(std::make_pair(vol.getTransform(), 0));
820  sensitive.push_back(std::make_pair(cv, cloneList));
821  } else {
822  Amg::Transform3D transf = vol.getTransform();
823  // order transforms to position prototype at phi=0/ 0.125 pi
824  double phiTr = transf.translation().phi();
825  if (phiTr > -0.001 && phiTr < 0.4)
826  (*it).second.insert((*it).second.begin(), std::make_pair(vol.getTransform(), 0));
827  else
828  (*it).second.push_back(std::make_pair(vol.getTransform(), 0));
829  }
830  vol.next();
831  }
832  }
833 
834  GeoVolumeCursor vol(top);
835  while (!vol.atEnd()) {
836  const GeoVPhysVol* cv = &(*(vol.getVolume()));
837  const std::string& vname = cv->getLogVol()->getName();
838  if (vname.find("Station") == std::string::npos &&
839  vname.find("MM_1") == std::string::npos &&
840  vname.find("sTGC_1") == std::string::npos) {
841  vol.next();
842  continue;
843  }
844 
845  // TGC stations retrieved at level-1
846  if (vname.substr(0, 1) == "T") {
847 
848  for (const auto&[tv, tvTrf] : geoGetVolumes(cv)) {
849  const GeoLogVol* tlv = tv->getLogVol();
850  const Amg::Transform3D transform = vol.getTransform() * tvTrf;
851  const std::string& tgc_name = tlv->getName();
852 
853  std::vector<std::pair<const GeoVPhysVol*,
854  std::vector<GMInfo>>>::iterator it =
855  sensitive.begin();
856  while (it < sensitive.end()) {
857  if (tgc_name == (*it).first->getLogVol()->getName() &&
858  m_gmBrowser.compareGeoVolumes(tv, (*it).first, 1.e-3) ==
859  0)
860  break;
861  ++it;
862  }
863 
864  if (it == sensitive.end()) {
865  std::vector<std::pair<Amg::Transform3D, int>> cloneList;
866  cloneList.push_back(std::make_pair(transform, vol.getId()));
867  sensitive.push_back(std::make_pair(tv, cloneList));
868  } else {
869  Amg::Transform3D transf = transform;
870  // order transforms to position prototype at phi=0/ 0.125 pi
871  double phiTr = transf.translation().phi();
872  if (phiTr > -0.001 && phiTr < 0.4)
873  (*it).second.insert((*it).second.begin(),
874  std::make_pair(transform, vol.getId()));
875  else
876  (*it).second.push_back(std::make_pair(transform, vol.getId()));
877  }
878 
879  } // end loop over TGC
880 
881  } else {
882 
883  std::vector<std::pair<const GeoVPhysVol*,
884  std::vector<GMInfo>>>::iterator it =
885  sensitive.begin();
886  while (it < sensitive.end()) {
887  if (vname == (*it).first->getLogVol()->getName() &&
888  m_gmBrowser.compareGeoVolumes(cv, (*it).first, 1.e-3) == 0)
889  break;
890  ++it;
891  }
892 
893  if (it == sensitive.end()) {
894  std::vector<std::pair<Amg::Transform3D, int>> cloneList;
895  cloneList.push_back(std::make_pair(vol.getTransform(), vol.getId()));
896  sensitive.push_back(std::make_pair(cv, cloneList));
897  } else {
898  Amg::Transform3D transf = vol.getTransform();
899  // order transforms to position prototype at phi=0/ 0.125 pi
900  double phiTr = transf.translation().phi();
901  if (phiTr > -0.001 && phiTr < 0.4)
902  (*it).second.insert((*it).second.begin(),
903  std::make_pair(vol.getTransform(), vol.getId()));
904  else
905  (*it).second.push_back(std::make_pair(vol.getTransform(), vol.getId()));
906  }
907  } // end non-TGC
908  vol.next();
909  }
910 
911  ATH_MSG_DEBUG("Number of muon station types in GeoModel tree:" << sensitive.size());
912 
913  return sensitive;
914 }
915 
916 std::unique_ptr<Trk::DetachedTrackingVolume>
918  const GeoVPhysVol* cv,
919  GMInfo gmInfo) const {
920  const GeoLogVol* clv = cv->getLogVol();
921  const std::string& vname = clv->getName();
922  ATH_MSG_DEBUG(name() << " building station prototype for " << cv->getLogVol()->getName());
925 
926  std::unique_ptr<Trk::DetachedTrackingVolume> typeStat{};
927 
928  if (vname.substr(0, 4) == "sTGC" || vname.substr(0, 2) == "MM") {
929  std::string sName = vname.substr(vname.find('-') + 1);
930  Identifier nswId = m_muonStationTypeBuilder->identifyNSW(sName, gmInfo.first);
931 
932  if (vname.substr(0, 4) == "sTGC" && m_idHelperSvc->issTgc(nswId)) {
933  return m_muonStationTypeBuilder->process_sTGC(nswId, cv, gmInfo.first);
934  } else if (vname.substr(0, 2) == "MM" && m_idHelperSvc->isMM(nswId)) {
935  return m_muonStationTypeBuilder->process_MM(nswId, cv, gmInfo.first);
936  }
937  }
938 
939  if (!m_buildBarrel && vname.compare(0, 1, "B") == 0)
940  return typeStat;
941  if (!m_buildEndcap && vname.compare(0, 1, "E") == 0)
942  return typeStat;
943  if (!m_buildCsc && vname.compare(0, 1, "C") == 0)
944  return typeStat;
945  if (!m_buildTgc && vname.compare(0, 1, "T") == 0)
946  return typeStat;
947 
948  int etaphi = gmInfo.second; // retrieve eta/phi indexes
949  int sign = (etaphi < 0) ? -1 : 1;
950  etaphi = sign * etaphi;
951  int is_mirr = etaphi / 1000;
952  etaphi = etaphi - is_mirr * 1000;
953  int eta = etaphi / 100;
954  int phi = etaphi - eta * 100;
955  eta = eta * sign;
956  const MuonGM::MuonStation* gmStation = muonMgr->getMuonStation(vname.substr(0, 3), eta, phi);
957  if (!gmStation) {
958  gmStation = muonMgr->getMuonStation(vname.substr(0, 4), eta, phi);
959  }
960  // assembly ?
961  if (!gmStation) {
962  int etaphi = gmInfo.second; // retrieve eta/phi indexes
963  int a_etaphi = static_cast<int>(etaphi / 100000);
964  int sideC = static_cast<int>(a_etaphi / 10000);
965  a_etaphi -= sideC * 10000;
966  is_mirr = static_cast<int>(a_etaphi / 1000);
967  a_etaphi -= is_mirr * 1000;
968  eta = static_cast<int>(a_etaphi / 100);
969  phi = a_etaphi - eta * 100;
970  if (sideC)
971  eta *= -1;
972  gmStation = muonMgr->getMuonStation(vname.substr(0, 3), eta, phi);
973  }
974  //
975  std::string stname = (vname.compare(0, 1, "T") == 0) ? vname : (clv->getName()).substr(0, vname.size() - 8);
976  //
977  if (stname.compare(0, 1, "B") == 0 && eta < 0) {
978  stname = (clv->getName()).substr(0, vname.size() - 8) + "-";
979  }
980  ATH_MSG_VERBOSE(" new station type " << stname << "," << clv->getShape()->type());
981  ATH_MSG_VERBOSE(" prototype built from eta, phi:" << eta << "," << phi);
982 
983  if (stname.compare(0, 2, "CS") == 0 || stname.compare(0, 1, "T") == 0) {
984 
985  if (stname.compare(0, 2, "CS") == 0) {
986  auto csc_station = m_muonStationTypeBuilder->processCscStation(cv, stname, cache);
987  // create layer representation
988  auto layerRepr = m_muonStationTypeBuilder->createLayerRepresentation(*csc_station);
989  // create prototype as detached tracking volume
990  auto layerVec = std ::make_unique<std::vector<Trk::Layer*>>(Muon::release(layerRepr.second));
991  typeStat = std::make_unique<Trk::DetachedTrackingVolume>(stname, csc_station.release(),
992  layerRepr.first.release(), layerVec.release());
993  } else {
994  std::unique_ptr<Trk::TrackingVolume> tgc_station{m_muonStationTypeBuilder->processTgcStation(cv, cache)};
995  // create layer representation
996  auto layerRepr = m_muonStationTypeBuilder->createLayerRepresentation(*tgc_station);
997  // create prototype as detached tracking volume
998  auto layerVec = std ::make_unique<std::vector<Trk::Layer*>>(Muon::release(layerRepr.second));
999  typeStat = std::make_unique<Trk::DetachedTrackingVolume>(stname, tgc_station.release(),
1000  layerRepr.first.release(), layerVec.release());
1001  }
1002 
1003  } else {
1004  const GeoShape* shapeS = clv->getShape();
1005  while (shapeS->type() != "Trd") {
1006  if (shapeS->type() == "Shift") {
1007  const GeoShapeShift* shift = dynamic_cast<const GeoShapeShift*>(shapeS);
1008  shapeS = shift->getOp();
1009  } else if (shapeS->type() == "Subtraction") {
1010  const GeoShapeSubtraction* sub = dynamic_cast<const GeoShapeSubtraction*>(shapeS);
1011  shapeS = sub->getOpA();
1012  } else if (shapeS->type() == "Union") {
1013  const GeoShapeUnion* uni = dynamic_cast<const GeoShapeUnion*>(shapeS);
1014  shapeS = uni->getOpA();
1015  } else {
1016  ATH_MSG_WARNING("unexpected station shape ? "<< shapeS->type() << ", station not built");
1017  break;
1018  }
1019  }
1020  const GeoTrd* trd = dynamic_cast<const GeoTrd*>(shapeS);
1021 
1022  double halfX1{0.}, halfX2{0.}, halfY1{0.}, halfY2{0.}, halfZ{0.};
1023  if (trd) {
1024  //
1025  halfX1 = trd->getXHalfLength1();
1026  halfX2 = trd->getXHalfLength2();
1027  halfY1 = trd->getYHalfLength1();
1028  halfY2 = trd->getYHalfLength2();
1029  halfZ = trd->getZHalfLength();
1030 
1031  // define enveloping volume
1032  std::unique_ptr<Trk::TrackingVolumeArray> confinedVolumes{};
1033  std::vector<std::unique_ptr<Trk::Layer>> confinedLayers{};
1034  std::unique_ptr<Trk::Volume> envelope;
1035  std::string shape = "Trd";
1036  if (halfX1 == halfX2 && halfY1 == halfY2)
1037  shape = "Box";
1038  if (shape == "Box") {
1039  auto envBounds = std::make_unique<Trk::CuboidVolumeBounds>(halfX1, halfY1, halfZ);
1040  // station components
1041  confinedVolumes = m_muonStationTypeBuilder->processBoxStationComponents(cv, *envBounds, cache);
1042  if (!confinedVolumes) {
1043  confinedLayers = m_muonStationTypeBuilder->processBoxComponentsArbitrary(cv, *envBounds, cache);
1044  }
1045  // enveloping volume
1046  envelope = std::make_unique<Trk::Volume>(nullptr, envBounds.release());
1047  } else if (shape == "Trd") {
1048  std::unique_ptr<Trk::TrapezoidVolumeBounds> envBounds{};
1049  Amg::Transform3D transf{Amg::Transform3D::Identity()};
1050  if (halfY1 == halfY2) {
1051  envBounds = std::make_unique<Trk::TrapezoidVolumeBounds>(halfX1, halfX2, halfY1, halfZ);
1052  ATH_MSG_VERBOSE("CAUTION!!!: this trapezoid volume does not require XY -> YZ switch");
1053  }
1054  if (halfY1 != halfY2 && halfX1 == halfX2) {
1055  transf = Amg::getRotateY3D(M_PI_2) * Amg::getRotateZ3D(M_PI_2);
1056  envBounds = std::make_unique<Trk::TrapezoidVolumeBounds>(halfY1, halfY2, halfZ, halfX1);
1057  }
1058  if (halfX1 != halfX2 && halfY1 != halfY2) {
1059  ATH_MSG_WARNING("station envelope arbitrary trapezoid?"<< stname);
1060  }
1061  if (envBounds) {
1062  // station components
1063  confinedVolumes = m_muonStationTypeBuilder->processTrdStationComponents(cv, *envBounds, cache);
1064  // enveloping volume
1065  envelope = std::make_unique<Trk::Volume>(makeTransform(transf), envBounds.release());
1066  }
1067  }
1068 
1069  if (envelope) {
1070  // ready to build the station prototype
1071  std::unique_ptr<Trk::TrackingVolume> newType{};
1072  if (!confinedLayers.empty()) {
1073  auto confinedLayerPtr = std::make_unique<std::vector<Trk::Layer*>>(Muon::release(confinedLayers));
1074  newType = std::make_unique<Trk::TrackingVolume>(*envelope, m_muonMaterial, confinedLayerPtr.release(), stname);
1075  } else {
1076  newType = std::make_unique<Trk::TrackingVolume>(*envelope, m_muonMaterial, nullptr, confinedVolumes.release(), stname);
1077  }
1078 
1079 
1080  // identify prototype
1081  if ((stname.compare(0, 1, "B") == 0 || stname.compare(0, 1, "E") == 0))
1082  identifyPrototype(*newType, eta, phi, gmStation->getTransform(), muonMgr);
1083 
1084  // create layer representation
1085  auto layerRepr = m_muonStationTypeBuilder->createLayerRepresentation(*newType);
1086 
1087  // create prototype as detached tracking volume
1088  auto layerVec = std::make_unique<std::vector<Trk::Layer*>>(Muon::release(layerRepr.second));
1089  typeStat = std::make_unique<Trk::DetachedTrackingVolume>(stname, newType.release(),
1090  layerRepr.first.release(), layerVec.release());
1091  }
1092  }
1093  } // end new station type
1094 
1095  ATH_MSG_DEBUG(" station prototype built for " << vname);
1096 
1098  return typeStat;
1099 }
1100 
1101 Identifier MuonStationBuilderImpl::resolveId(std::string vname, GMInfo gm_info, int& eta, int& phi,
1102  const MuonGM::MuonDetectorManager* muonMgr) const {
1103 
1104  Identifier stId(0);
1105 
1106  int etaphi = gm_info.second; // retrieve eta/phi indexes
1107  int sign = (etaphi < 0) ? -1 : 1;
1108  etaphi = sign * etaphi;
1109  int is_mirr = etaphi / 1000;
1110  etaphi = etaphi - is_mirr * 1000;
1111  eta = etaphi / 100;
1112  phi = etaphi - eta * 100;
1113  eta = eta * sign;
1114  const MuonGM::MuonStation* gmStation =
1115  muonMgr->getMuonStation(vname.substr(0, 3), eta, phi);
1116  // try to retrieve
1117  if (!gmStation) {
1118  gmStation = muonMgr->getMuonStation(vname.substr(0, 4), eta, phi);
1119  }
1120  // assembly ?
1121  if (!gmStation) {
1122  int etaphi = gm_info.second; // retrieve eta/phi indexes
1123  int a_etaphi = static_cast<int>(etaphi / 100000);
1124  int sideC = static_cast<int>(a_etaphi / 10000);
1125  a_etaphi -= sideC * 10000;
1126  is_mirr = static_cast<int>(a_etaphi / 1000);
1127  a_etaphi -= is_mirr * 1000;
1128  eta = static_cast<int>(a_etaphi / 100);
1129  phi = a_etaphi - eta * 100;
1130  if (sideC)
1131  eta *= -1;
1132  gmStation = muonMgr->getMuonStation(vname.substr(0, 3), eta, phi);
1133  }
1134  //
1135  if (!gmStation)
1136  ATH_MSG_WARNING("Muon station not found! " << vname << "," << eta << ","
1137  << phi);
1138 
1139  std::string stName;
1140  if (vname.compare(0, 1, "T") == 0 || vname.compare(0, 1, "C") == 0) {
1141  stName = vname.substr(0, 4);
1142  } else {
1143  stName = (vname.substr(0, vname.size() - 8));
1144  if (stName.compare(0, 1, "B") == 0 && eta < 0) {
1145  stName = vname.substr(0, vname.size() - 8) + "-";
1146  }
1147  }
1148  if (!gmStation)
1149  return stId;
1150  Amg::Transform3D transf = gmStation->getTransform();
1151  bool is_valid{false};
1152  if (m_idHelperSvc->hasCSC() && stName.compare(0, 1, "C") == 0) {
1153  stId = m_idHelperSvc->cscIdHelper().elementID(vname.substr(0, 3), eta,
1154  phi, is_valid);
1155  }
1156  // adjust eta,phi
1157  if (vname.compare(0, 1, "C") == 0) {
1158  eta = 1;
1159  if (transf.translation().z() < 0)
1160  eta = 0;
1161  double phic = transf.translation().phi() + 0.1;
1162  phi =
1163  static_cast<int>(phic < 0 ? 4 * phic / M_PI + 8 : 4 * phic / M_PI);
1164  }
1165  if (vname.compare(0, 1, "T") == 0) {
1166  bool az = true;
1167  std::string sub = vname.substr(7, 2);
1168  if (transf.translation().z() < 0)
1169  az = false;
1170  if (sub == "01")
1171  eta = az ? 5 : 4;
1172  else if (sub == "02")
1173  eta = az ? 5 : 4;
1174  else if (sub == "03")
1175  eta = az ? 6 : 3;
1176  else if (sub == "04")
1177  eta = az ? 7 : 2;
1178  else if (sub == "05")
1179  eta = az ? 8 : 1;
1180  else if (sub == "06")
1181  eta = az ? 5 : 4;
1182  else if (sub == "07")
1183  eta = az ? 5 : 4;
1184  else if (sub == "08")
1185  eta = az ? 6 : 3;
1186  else if (sub == "09")
1187  eta = az ? 7 : 2;
1188  else if (sub == "10")
1189  eta = az ? 8 : 1;
1190  else if (sub == "11")
1191  eta = az ? 9 : 0;
1192  else if (sub == "12")
1193  eta = az ? 5 : 4;
1194  else if (sub == "13")
1195  eta = az ? 5 : 4;
1196  else if (sub == "14")
1197  eta = az ? 6 : 3;
1198  else if (sub == "15")
1199  eta = az ? 7 : 2;
1200  else if (sub == "16")
1201  eta = az ? 8 : 1;
1202  else if (sub == "17")
1203  eta = az ? 9 : 0;
1204  else if (sub == "18")
1205  eta = az ? 5 : 4;
1206  else if (sub == "19")
1207  eta = az ? 5 : 4;
1208  else if (sub == "20")
1209  eta = az ? 5 : 4;
1210  else if (sub == "21")
1211  eta = az ? 5 : 4;
1212  else if (sub == "22")
1213  eta = az ? 5 : 4;
1214  }
1215  if (m_idHelperSvc->hasTGC() && stName[0] == 'T') {
1216  int etaSt = eta - 4;
1217  if (eta < 5)
1218  etaSt = eta - 5;
1219  double phic = transf.translation().phi();
1220  if (vname.compare(2, 1, "E") == 0 && vname.compare(0, 3, "T4E") != 0)
1221  phi = static_cast<int>(phic < 0 ? 24 * phic / M_PI + 48
1222  : 24 * phic / M_PI);
1223  else
1224  phi = static_cast<int>(phic < 0 ? 12 * phic / M_PI + 24
1225  : 12 * phic / M_PI);
1226  phi++;
1227  stId = m_idHelperSvc->tgcIdHelper().elementID(vname.substr(0, 3), etaSt,
1228  phi, is_valid);
1229  } else if (m_idHelperSvc->hasRPC() && stName.compare(0, 3, "BML") == 0) {
1230  stId = m_idHelperSvc->rpcIdHelper().elementID(vname.substr(0, 3), eta,
1231  phi, 1, is_valid);
1232  } else if (m_idHelperSvc->hasMDT() && stName.compare(0, 1, "C") != 0) {
1233  stId = m_idHelperSvc->mdtIdHelper().elementID(vname.substr(0, 3), eta,
1234  phi, is_valid);
1235  }
1236  if (!is_valid || !stId.get_compact()) {
1237  ATH_MSG_DEBUG("identifier of the station not found:"
1238  << vname << "," << eta << "," << phi);
1239  if (!stId.get_compact())
1240  return Identifier(0);
1241  }
1242  return stId;
1243 }
1244 
1246  Identifier id, const Trk::Layer* lay) const {
1247 
1248  // RE
1249  if (m_idHelperSvc->isMdt(id)) {
1250  const MuonGM::MdtReadoutElement* mdtRE = muonMgr->getMdtReadoutElement(id);
1251  constexpr double tol = 0.5*Gaudi::Units::mm;
1252  if (mdtRE && !lay->surfaceRepresentation().isOnSurface(mdtRE->transform(id).translation(), tol, tol)) {
1253  ATH_MSG_DEBUG(__FILE__<<":"<<__LINE__<<" "<<comment << ":tube(id) "
1254  <<m_idHelperSvc->toString(id)<<" "<<Amg::toString(mdtRE->transform(id).translation())
1255  <<" not on surface:"<<lay->surfaceRepresentation()<<std::endl<<
1256  " "<<Amg::toString(lay->surfaceRepresentation().transform().inverse()*(mdtRE->transform(id).translation())) );
1257  }
1258  } else if (m_idHelperSvc->isRpc(id)) {
1259  const MuonGM::RpcReadoutElement* rpcRE = muonMgr->getRpcReadoutElement(id);
1260  Amg::Transform3D trid = rpcRE->transform(id);
1261  Amg::Transform3D check_layer_identity = lay->surfaceRepresentation().transform().inverse() * trid;
1262  if (!Amg::doesNotDeform(check_layer_identity)) {
1263  ATH_MSG_DEBUG(__FILE__<<":"<<__LINE__<<" "<<comment<<" "<<Amg::toString(check_layer_identity));
1264  }
1265 
1266  } else if (m_idHelperSvc->isTgc(id)) {
1267  const Amg::Transform3D trid = muonMgr->getTgcReadoutElement(id)->transform(id);
1268  Amg::Transform3D check_layer_identity = lay->surfaceRepresentation().transform().inverse() * trid;
1269  if (!Amg::doesNotDeform(check_layer_identity)) {
1270  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" "<<comment <<" "<<Amg::toString(check_layer_identity));
1271  }
1272  }
1273 }
1274 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
MuonGM::MuonDetectorManager::getRpcReadoutElement
const RpcReadoutElement * getRpcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:168
geoGetVolumes
GeoVolumeVec_t geoGetVolumes(const GeoGraphNode *node, int depthLimit=1, int sizeHint=20)
Return the child volumes and associated transforms.
Definition: GeoVisitVolumes.cxx:211
PlotCalibFromCool.il
il
Definition: PlotCalibFromCool.py:381
Trk::Layer::setRef
void setRef(double)
set the reference measure
TrapezoidBounds.h
Muon::MuonStationBuilderImpl::checkLayerId
void checkLayerId(std::string_view comment, const MuonGM::MuonDetectorManager *muonMgr, Identifier id, const Trk::Layer *lay) const
Definition: MuonStationBuilderImpl.cxx:1245
Muon::makeTransform
Amg::Transform3D * makeTransform(const Amg::Transform3D &trf)
Definition: MuonSpectrometer/MuonDetDescr/MuonTrackingGeometry/MuonTrackingGeometry/Utils.h:14
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
MdtReadoutElement.h
MuonGM::MuonClusterReadoutElement::transform
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
Definition: MuonClusterReadoutElement.h:124
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
MuonGM::MdtReadoutElement::getNLayers
int getNLayers() const
Returns the number of tube layers inside the multilayer.
Trk::BinnedArray::binUtility
virtual const BinUtility * binUtility() const =0
Return the BinUtility.
DiscBounds.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
RectangleBounds.h
Trk::Layer::setLayerType
void setLayerType(int identifier)
set the Layer coding
MuonGM::MdtReadoutElement::center
virtual const Amg::Vector3D & center(const Identifier &) const override final
Return the center of the surface associated with this identifier In the case of silicon it returns th...
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
MuonGM::MuonClusterReadoutElement::center
virtual const Amg::Vector3D & center() const override
Return the center of the element.
Definition: MuonClusterReadoutElement.h:125
perp
Scalar perp() const
perp method - perpenticular length
Definition: AmgMatrixBasePlugin.h:44
MaterialProperties.h
Trk::Volume::inside
bool inside(const Amg::Vector3D &gp, double tol=0.) const
Inside() method for checks.
Definition: Volume.cxx:90
dumpTgcDigiDeadChambers.stationName
dictionary stationName
Definition: dumpTgcDigiDeadChambers.py:30
Trk::CuboidVolumeBounds
Definition: CuboidVolumeBounds.h:52
TgcIdHelper
Definition: TgcIdHelper.h:50
sTgcReadoutElement.h
Muon::MuonStationBuilderImpl::m_gmBrowser
Trk::GMTreeBrowser m_gmBrowser
Definition: MuonStationBuilderImpl.h:107
Trk::DetachedTrackingVolume::trackingVolume
const TrackingVolume * trackingVolume() const
returns the TrackingVolume
Definition: DetachedTrackingVolume.h:125
Muon::MuonStationBuilderImpl::identifyPrototype
void identifyPrototype(Trk::TrackingVolume &station, int eta, int phi, const Amg::Transform3D &transf, const MuonGM::MuonDetectorManager *muonMgr) const
Definition: MuonStationBuilderImpl.cxx:476
BinnedArray.h
Muon::MuonStationBuilderImpl::identifyNSWLayers
void identifyNSWLayers(Trk::DetachedTrackingVolume &station, const Identifier &id) const
Definition: MuonStationBuilderImpl.cxx:453
MuonGM::CscReadoutElement::ChamberLayer
int ChamberLayer() const
Definition: CscReadoutElement.h:290
MuonGM::MuonStation::getTransform
Amg::Transform3D getTransform() const
Definition: MuonStation.h:169
Trk::MaterialProperties::thicknessInX0
float thicknessInX0() const
Return the radiationlength fraction.
Trk::TrackingVolume::associatedSubVolume
const TrackingVolume * associatedSubVolume(const Amg::Vector3D &gp) const
Return the associated sub Volume, returns THIS if no subVolume exists.
Definition: TrackingVolume.cxx:710
BinUtility.h
Muon::MuonStationBuilderImpl::m_buildTgc
Gaudi::Property< bool > m_buildTgc
Definition: MuonStationBuilderImpl.h:114
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:114
skel.it
it
Definition: skel.GENtoEVGEN.py:396
Trk::GeoMaterialConverter::convert
static Material convert(const GeoMaterial *gm)
Single conversion , input type GeoMaterial - output type Trk::MaterialProperties.
Definition: GeoMaterialConverter.cxx:18
createCablingJSON.doubletR
int doubletR
Definition: createCablingJSON.py:15
M_PI
#define M_PI
Definition: ActiveFraction.h:11
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Identifier::get_compact
value_type get_compact() const
Get the compact id.
HomogeneousLayerMaterial.h
Trk::positiveFaceXY
@ positiveFaceXY
Definition: BoundarySurfaceFace.h:33
MuonGM::RpcReadoutElement
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/RpcReadoutElement.h:55
Layer.h
Trk::MaterialProperties::x0
float x0() const
Return the radiation length.
IDetachedTrackingVolumeBuilderCond.h
MuonGM::CscReadoutElement
Definition: CscReadoutElement.h:56
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
PlotCalibFromCool.multi
multi
Definition: PlotCalibFromCool.py:99
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:620
Muon::MuonStationBuilderImpl::retrieveGMsensitive
std::vector< std::pair< const GeoVPhysVol *, std::vector< GMInfo > > > retrieveGMsensitive(const MuonGM::MuonDetectorManager *muonMgr) const
Definition: MuonStationBuilderImpl.cxx:745
ITrackingVolumeArrayCreator.h
Trk::Surface::center
const Amg::Vector3D & center() const
Returns the center position of the Surface.
Muon
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition: TrackSystemController.h:45
MuonStationBuilderImpl.h
MuonGM::MuonClusterReadoutElement::surface
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
Definition: MuonClusterReadoutElement.h:123
Identifier32::get_compact
value_type get_compact() const
Get the compact id.
Definition: Identifier32.h:44
Trk::BoundarySurfaceFace
BoundarySurfaceFace
Definition: BoundarySurfaceFace.h:31
Trk::BinnedArray::arrayObjectsNumber
virtual unsigned int arrayObjectsNumber() const =0
Number of Entries in the Array.
RpcIdHelper
Definition: RpcIdHelper.h:51
TrapezoidVolumeBounds.h
Trk::Layer::layerType
int layerType() const
get the Layer coding
MuonGM::TgcReadoutElement::channelPos
Amg::Vector3D channelPos(const Identifier &id) const
Returns the position of the active channel (wireGang or strip)
Amg::getRotateZ3D
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Definition: GeoPrimitivesHelpers.h:270
Muon::MuonStationBuilderImpl::GMInfo
std::pair< Amg::Transform3D, int > GMInfo
Definition: MuonStationBuilderImpl.h:44
Trk::TrackingVolume::confinedLayers
const LayerArray * confinedLayers() const
Return the subLayer array.
MuonGM::MuonDetectorManager::getTgcReadoutElement
const TgcReadoutElement * getTgcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:247
Trk::MaterialProperties::thickness
float thickness() const
Return the thickness in mm.
MuonGM::CscReadoutElement::Ngasgaps
int Ngasgaps() const
Definition: CscReadoutElement.h:308
Muon::MuonStationBuilderImpl::initialize
virtual StatusCode initialize() override
Definition: MuonStationBuilderImpl.cxx:75
Trk::GMTreeBrowser::compareGeoVolumes
int compareGeoVolumes(const GeoVPhysVol *gv1, const GeoVPhysVol *gv2, double tolerance, bool printFullInfo=false, int level=0) const
Recursive comparison of trees/branches/volumes : in quiet mode (printFullInfo=False) ,...
Definition: GMTreeBrowser.cxx:42
DiamondBounds.h
GeoPrimitives.h
GeometryStatics.h
GeoVisitVolumes.h
Visitor to process all volumes under a GeoModel node.
CylinderVolumeBounds.h
MMReadoutElement.h
Trk::MaterialProperties::addMaterial
void addMaterial(const Material &mp, float dInX0)
Material averaging.
Definition: MaterialProperties.cxx:46
Trk::Surface::isOnSurface
virtual bool isOnSurface(const Amg::Vector3D &glopo, const BoundaryCheck &bchk=true, double tol1=0., double tol2=0.) const
This method returns true if the GlobalPosition is on the Surface for both, within or without check of...
Definition: Surface.cxx:123
Trk::Material::x0
float x0() const
Definition: Material.h:226
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Trk::Layer::surfaceRepresentation
virtual const Surface & surfaceRepresentation() const =0
Transforms the layer into a Surface representation for extrapolation.
Muon::MuonStationBuilderImpl::glueComponents
void glueComponents(Trk::DetachedTrackingVolume *) const
Definition: MuonStationBuilderImpl.cxx:155
MuonGM::MuonDetectorManager::getMdtReadoutElement
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:204
Muon::MuonStationTypeBuilder::Cache
Definition: MuonStationTypeBuilder.h:54
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:51
Muon::MuonStationBuilderImpl::m_muonStationTypeBuilder
ToolHandle< Muon::MuonStationTypeBuilder > m_muonStationTypeBuilder
Helper Tool to create TrackingVolume Arrays.
Definition: MuonStationBuilderImpl.h:91
lumiFormat.i
int i
Definition: lumiFormat.py:85
Trk::ArraySpan
std::span< T > ArraySpan
Definition: DetachedTrackingVolume.h:34
MuonGM::MuonDetectorManager::getCscReadoutElement
const CscReadoutElement * getCscReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:225
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MuonR4::inverse
CalibratedSpacePoint::Covariance_t inverse(const CalibratedSpacePoint::Covariance_t &mat)
Inverts the parsed matrix.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/UtilFunctions.cxx:65
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Amg::doesNotDeform
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
Definition: GeoPrimitivesHelpers.h:383
MuonGM::MuonStation
Definition: MuonStation.h:51
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
CalibCoolCompareRT.up
up
Definition: CalibCoolCompareRT.py:109
CscReadoutElement.h
MuonGM::TgcReadoutElement
A TgcReadoutElement corresponds to a single TGC chamber; therefore typically a TGC station contains s...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/TgcReadoutElement.h:42
MdtIdHelper
Definition: MdtIdHelper.h:61
Muon::MuonStationBuilderImpl::m_trackingVolumeHelper
ToolHandle< Trk::ITrackingVolumeHelper > m_trackingVolumeHelper
Helper Tool to create TrackingVolumes.
Definition: MuonStationBuilderImpl.h:98
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:107
Trk::GMTreeBrowser::findTopBranch
static const GeoVPhysVol * findTopBranch(const GeoVPhysVol *gv, std::string_view name)
search of top branch : returns mother volume for children matching name
Definition: GMTreeBrowser.cxx:442
RotatedDiamondBounds.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::negativeFaceXY
@ negativeFaceXY
Definition: BoundarySurfaceFace.h:32
Muon::GMInfo
MuonStationBuilderImpl::GMInfo GMInfo
Definition: MuonStationBuilderImpl.cxx:65
Muon::MuonStationBuilderImpl::buildDetachedTrackingVolumeType
std::unique_ptr< Trk::DetachedTrackingVolume > buildDetachedTrackingVolumeType(const MuonGM::MuonDetectorManager *muonMgr, const GeoVPhysVol *gv, GMInfo info) const
Definition: MuonStationBuilderImpl.cxx:917
MuonGM::MuonDetectorManager::NTgcStEtaOffset
static constexpr int NTgcStEtaOffset
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:163
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
SharedObject.h
beamspotman.stat
stat
Definition: beamspotman.py:266
Muon::MuonStationBuilderImpl::m_materialConverter
Trk::GeoMaterialConverter m_materialConverter
Definition: MuonStationBuilderImpl.h:110
Muon::MuonStationBuilderImpl::resolveId
Identifier resolveId(std::string vname, GMInfo gm_info, int &eta, int &phi, const MuonGM::MuonDetectorManager *muonMgr) const
Definition: MuonStationBuilderImpl.cxx:1101
Trk::BinUtility
Definition: BinUtility.h:39
grepfile.ic
int ic
Definition: grepfile.py:33
CaloCondBlobAlgs_fillNoiseFromASCII.comment
string comment
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:27
Trk::DetachedTrackingVolume::clone
DetachedTrackingVolume * clone(const std::string &name, Amg::Transform3D &shift) const
clone with transform
Definition: DetachedTrackingVolume.cxx:75
IOVInfiniteRange.h
MuonGM::MuonDetectorManager::NCscStEtaOffset
static constexpr int NCscStEtaOffset
Identifier <-> AMDB conversion constants in use.
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:161
Trk::TrackingVolume::volumeName
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
SimplePolygonBrepVolumeBounds.h
DoubleTrapezoidVolumeBounds.h
CscIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int chamberLayer, int wireLayer, int measuresPhi, int strip) const
Definition: CscIdHelper.cxx:706
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:227
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
Muon::MuonStationBuilderImpl::getNSWStationsForTranslation
void getNSWStationsForTranslation(const GeoVPhysVol *pv, const std::string &name, const Amg::Transform3D &, std::vector< std::pair< std::pair< const GeoLogVol *, Trk::MaterialProperties * >, std::vector< Amg::Transform3D >>> &vols, std::vector< std::string > &volNames) const
Definition: MuonStationBuilderImpl.cxx:643
MuonGM::RpcReadoutElement::stripPos
Amg::Vector3D stripPos(const Identifier &id) const
Definition: MuonDetDescr/MuonReadoutGeometry/src/RpcReadoutElement.cxx:177
Trk::BinnedArray::arrayObjects
virtual BinnedArraySpan< T *const > arrayObjects()=0
Return all objects of the Array non-const we can still modify the T.
BoundarySurfaceFace.h
sTgcIdHelper
Definition: sTgcIdHelper.h:55
Trk::DetachedTrackingVolume::name
const std::string & name() const
returns the Name
Definition: DetachedTrackingVolume.h:134
Amg::getRotateY3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Definition: GeoPrimitivesHelpers.h:261
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonGM::RpcReadoutElement::numberOfLayers
virtual int numberOfLayers(bool measphi=true) const override final
number of layers in phi/eta projection, same for eta/phi planes
BoundarySurface.h
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
MuonGM::MuonDetectorManager::getMuonStation
const MuonStation * getMuonStation(const std::string &stName, int eta, int phi) const
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:137
Muon::MuonStationBuilderImpl::m_buildEndcap
Gaudi::Property< bool > m_buildEndcap
Definition: MuonStationBuilderImpl.h:112
Trk::MaterialProperties
Definition: MaterialProperties.h:40
TrackingVolume.h
MuonGM::MdtReadoutElement::tubePos
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
MmIdHelper
Definition: MmIdHelper.h:54
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:50
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Muon::MuonStationBuilderImpl::MuonStationBuilderImpl
MuonStationBuilderImpl(const std::string &, const std::string &, const IInterface *)
Definition: MuonStationBuilderImpl.cxx:68
ref
const boost::regex ref(r_ef)
Trk::PlaneSurface
Definition: PlaneSurface.h:64
GeoPrimitivesHelpers.h
Trk::TrackingVolume::confinedVolumes
const TrackingVolumeArray * confinedVolumes() const
Return the subLayer array.
MuonGM::MuonReadoutElement::identify
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:184
RPDUtils::sideC
unsigned constexpr int sideC
Definition: RPDUtils.h:15
python.changerun.pv
pv
Definition: changerun.py:81
GeoPrimitivesToStringConverter.h
MuonGM::MuonDetectorManager::getTreeTop
virtual PVConstLink getTreeTop(unsigned int i) const
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:115
Trk::negativeFaceYZ
@ negativeFaceYZ
Definition: BoundarySurfaceFace.h:34
Muon::MuonStationBuilderImpl::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonStationBuilderImpl.h:56
Trk::DetachedTrackingVolume::layerRepresentation
const Layer * layerRepresentation() const
returns layer representation
Definition: DetachedTrackingVolume.h:136
Muon::MuonStationBuilderImpl::m_muonMaterial
Trk::Material m_muonMaterial
the material
Definition: MuonStationBuilderImpl.h:104
Muon::MuonStationBuilderImpl::buildDetachedTrackingVolumesImpl
DetachedVolVec buildDetachedTrackingVolumesImpl(const MuonGM::MuonDetectorManager *muonMgr, bool blend=false) const
Definition: MuonStationBuilderImpl.cxx:99
createCablingJSON.doubletPhi
int doubletPhi
Definition: createCablingJSON.py:16
TrackingGeometry.h
TgcReadoutElement.h
Muon::MuonStationBuilderImpl::m_buildCsc
Gaudi::Property< bool > m_buildCsc
Definition: MuonStationBuilderImpl.h:113
top
@ top
Definition: TruthClasses.h:64
MuonGM::MuonDetectorManager::cscIdHelper
const CscIdHelper * cscIdHelper() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:232
Trk::Material
Definition: Material.h:116
Trk::BinnedArray
Definition: BinnedArray.h:38
MuonGM::MdtReadoutElement::transform
virtual const Amg::Transform3D & transform(const Identifier &id) const override final
Return local to global transform associated with this identifier.
AthAlgTool
Definition: AthAlgTool.h:26
MuonGM::MuonDetectorManager::NTgcStatTypeOff
static constexpr int NTgcStatTypeOff
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:162
RotatedTrapezoidBounds.h
Trk::DetachedTrackingVolume
Definition: DetachedTrackingVolume.h:46
MuonStation.h
Trk::positiveFaceYZ
@ positiveFaceYZ
Definition: BoundarySurfaceFace.h:35
Trk::TrackingVolume
Definition: TrackingVolume.h:121
Trk::TrackingVolume::associatedLayer
const Layer * associatedLayer(const Amg::Vector3D &gp) const
Return the associated Layer.
Definition: TrackingVolume.cxx:569
Trk::Surface::transform
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Material
@ Material
Definition: MaterialTypes.h:8
Trk::BinnedArraySpan
std::span< T > BinnedArraySpan
Definition: BinnedArray.h:34
Utils.h
Muon::MuonStationBuilderImpl::identifyLayers
void identifyLayers(Trk::DetachedTrackingVolume *, Identifier, int, int, const MuonGM::MuonDetectorManager *) const
Definition: MuonStationBuilderImpl.cxx:185
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:26
Muon::release
std::vector< ObjType * > release(std::vector< std::unique_ptr< ObjType >> &objVec)
Definition: MuonSpectrometer/MuonDetDescr/MuonTrackingGeometry/MuonTrackingGeometry/Utils.h:18
Muon::MuonStationBuilderImpl::m_buildBarrel
Gaudi::Property< bool > m_buildBarrel
Definition: MuonStationBuilderImpl.h:111
plotBeamSpotMon.nc
int nc
Definition: plotBeamSpotMon.py:83
CuboidVolumeBounds.h
MuonGM::MuonReadoutElement::getStationPhi
int getStationPhi() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:194
MuonGM::MuonReadoutElement::getStationEta
int getStationEta() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:193
Trk::Layer
Definition: Layer.h:73
Muon::MuonStationBuilderImpl::DetachedVolVec
std::vector< std::unique_ptr< Trk::DetachedTrackingVolume > > DetachedVolVec
Definition: MuonStationBuilderImpl.h:48
RpcReadoutElement.h
Identifier
Definition: IdentifierFieldParser.cxx:14