ATLAS Offline Software
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
MuonGM::MuonChamber Class Reference

#include <MuonChamber.h>

Inheritance diagram for MuonGM::MuonChamber:
Collaboration diagram for MuonGM::MuonChamber:

Public Member Functions

void setFineClashFixingFlag (int value)
 
 MuonChamber (const MYSQL &mysql, Station *s)
 
GeoVPhysVol * build (StoredMaterialManager &matManager, const MYSQL &mysql, MuonDetectorManager *manager, int ieta, int iphi, bool is_mirrored, bool &isAssembly)
 
virtual void print () const override
 
void setFPVMAP (FPVMAP *fpvmap)
 
void setLogVolName (const std::string &str)
 
bool msgLvl (const MSG::Level lvl) const
 Test the output level. More...
 
MsgStream & msg () const
 The standard message stream. More...
 
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream. More...
 
void setLevel (MSG::Level lvl)
 Change the current logging level. More...
 

Public Attributes

double width {0.}
 
double length {0.}
 
double thickness {0.}
 
double longWidth {0.}
 
std::array< double, 10 > rotangle {}
 
std::string name {}
 
std::string logVolName {}
 

Private Member Functions

void setCscReadoutGeom (const MYSQL &mysql, CscReadoutElement *re, const CscComponent *cc, const Position &p)
 
void setMdtReadoutGeom (const MYSQL &mysql, MdtReadoutElement *re, const MdtComponent *cc, const Position &p)
 
void setRpcReadoutGeom (const MYSQL &mysql, RpcReadoutElement *re, const RpcComponent *cc, const Position &p)
 
void setTgcReadoutGeom (const MYSQL &mysql, TgcReadoutElement *re, const TgcComponent *cc, const Position &p, const std::string &statname)
 
void initMessaging () const
 Initialize our message level and MessageSvc. More...
 

Private Attributes

Stationm_station {nullptr}
 
int m_enableFineClashFixing {0}
 
FPVMAPm_FPVMAP = nullptr
 
std::string m_nm
 Message source name. More...
 
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels) More...
 
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer. More...
 
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level. More...
 
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging) More...
 

Detailed Description

Definition at line 29 of file MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h.

Constructor & Destructor Documentation

◆ MuonChamber()

MuonGM::MuonChamber::MuonChamber ( const MYSQL mysql,
Station s 
)

Definition at line 93 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

93  :
94  DetectorElement(s->GetName()),
95  AthMessaging{"MuGM::MuonChamber"} {
96  width = s->GetWidth1();
97  longWidth = s->GetWidth2();
98  thickness = s->GetThickness(mysql);
99  length = s->GetLength();
100  m_station = s;
101 
102  // CSL envelope is too small for its components - enlarge it slightly
103  std::string stname(m_station->GetName(), 0, 3);
104  if (stname == "CSL")
105  longWidth *= 1.015;
106 
107  }

Member Function Documentation

◆ build()

GeoVPhysVol * MuonGM::MuonChamber::build ( StoredMaterialManager matManager,
const MYSQL mysql,
MuonDetectorManager manager,
int  ieta,
int  iphi,
bool  is_mirrored,
bool &  isAssembly 
)

< fi here goes from 0 to 7; in amdb from 1 to 8;

< fi here goes from 0 to 7; in amdb from 1 to 8;

init design : design uses global (converting back to local) positions

Definition at line 109 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

111  {
112  ATH_MSG_VERBOSE( " Building a MuonChamber for m_station " << m_station->GetName() << " at zi, fi " << zi << " " << fi + 1 << " is_mirrored " << is_mirrored
113  << " is assembly = " << isAssembly );
114 
115  std::string stname(m_station->GetName(), 0, 3);
116 
117  double halfpitch = m_station->mdtHalfPitch(mysql);
118  const std::string stName = m_station->GetName();
119 
120  const MdtIdHelper *mdt_id = manager->mdtIdHelper();
121  int stationType = mdt_id->stationNameIndex(stName.substr(0, 3));
122  bool is_barrel = (stName.compare(0, 1, "B") == 0);
123 
124  std::string geometry_version = manager->geometryVersion();
125  double extratop = m_station->GetExtraTopThickness();
126  double extrabottom = m_station->GetExtraBottomThickness();
127  double totthick = thickness + extratop + extrabottom;
128 
129  GeoTrd *maintrd;
130  maintrd = new GeoTrd(totthick / 2, totthick / 2, width / 2, longWidth / 2, length / 2);
131 
132  if (length <= 0) {
133  ATH_MSG_ERROR( " Invalid length " << length << " for m_station " << m_station->GetName() << " fi/zi " << fi + 1 << "/" << zi );
134  }
135 
136  ATH_MSG_VERBOSE( " MuonChamber size thick,w,lw,l " << totthick << ", " << width << ", " << longWidth << ", " << length );
137 
138  const GeoShape *strd = nullptr;
139  double dx = 0.;
140  if ((extratop + extrabottom) != 0.) {
141  // sup on top & bottom
142  dx = extratop / 2. - extrabottom / 2.;
143 
144  ATH_MSG_VERBOSE( " m_station name " << m_station->GetName() << " extra top, bottom, dx = " << extratop << " " << extrabottom );
145  strd = &((*maintrd) << GeoTrf::Translate3D(dx, 0., 0.));
146  } else {
147  strd = maintrd;
148  }
149 
150  double amdbOrigine_along_length = m_station->getAmdbOrigine_along_length();
151  double amdbOrigine_along_thickness = m_station->getAmdbOrigine_along_thickness(mysql);
152 
153  // Fix clash of EIS1 and CSS1. Cut out upper corner of CSS1 envelope (along long width)
154  if (stname == "CSS") {
155  StandardComponent *comp = nullptr;
156  double clen = 0;
157  double cthick = 0;
158  double cypos = 0;
159  double cxpos = 0;
160  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
161  comp = (StandardComponent *)m_station->GetComponent(i);
162  if ((comp->name).compare(0, 3, "CSC") == 0) {
163  clen = comp->dy;
164  cthick = comp->GetThickness(mysql);
165  cypos = clen - comp->posy + 1.0 - length / 2.;
166  cxpos = -totthick / 2. + comp->posz + cthick / 2. + 0.1;
167  break;
168  }
169  }
170  GeoIntrusivePtr<GeoShape> box{new GeoBox(cthick / 2., longWidth / 2., (length - clen) / 2.)};
171  strd = &(strd->subtract((*box) << GeoTrf::Translate3D(cxpos, 0., cypos)));
172  }
173 
174  if (m_enableFineClashFixing > 0) {
175  // Mother volume modifications for specific chambers
176 
177  // Fix clashes of non-cutout BMS with BTWingRib
178  if ((stname == "BMS" && std::abs(zi) == 5) || (stname == "BMS" && std::abs(zi) == 1 && fi != 3)) {
179  StandardComponent *comp = nullptr;
180  double cutlen = 0.;
181  double cutthick = 0.;
182  double top_edge = 0.;
183  for (int i = m_station->GetNrOfComponents() - 2; i > -1; i--) {
184  comp = (StandardComponent *)m_station->GetComponent(i);
185  top_edge = comp->posy + comp->dy;
186  cutlen = length - top_edge;
187  if ((comp->posy != 0 && cutlen > 0.1) || comp->dy > 0.75 * length) {
188  cutthick = comp->GetThickness(mysql) + 1.;
189  break;
190  }
191  }
192  GeoIntrusivePtr<GeoShape> box1{new GeoBox(cutthick / 2., (longWidth + 2.) / 2., cutlen)};
193  strd = &(strd->subtract((*box1) << GeoTrf::Translate3D((totthick - cutthick) / 2., 0., length / 2.)));
194  }
195  }
196 
197  // Skip mother volume modifications for assembly volumes since they cannot cause clash
198  if (!isAssembly) {
199  bool testEIL = (stname == "EIL" && std::abs(zi) != 1 && (std::abs(zi) != 4 || fi == 0 || fi == 4));
200 
201  if ((m_enableFineClashFixing && (stname == "BML" || stname == "BIL" || stname == "BOL" || stname == "BMS" || stname == "BIS" || stname == "BOS")) || testEIL) {
202  double root3 = 1.7320508;
203  StandardComponent *comp = nullptr;
204  double mdt_half_thick = -1.;
205  double mdt_pos = 0.;
206  double xtube1 = 0;
207  double xtube2 = 0;
208 
209  int index = 0;
210  int mdt_index[4] = {0, 0, 0, 0};
211  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
212  comp = (StandardComponent *)m_station->GetComponent(i);
213  if (comp->name.compare(0,3,"MDT") == 0) {
214  mdt_index[index] = i;
215  index += 1;
216  }
217  }
218 
219  // Prepare boxes and cylinders for chamber volume mods
220  GeoIntrusivePtr<GeoShape> box{new GeoBox((totthick + 2.) / 2., (longWidth + 2.) / 2., halfpitch)};
221  GeoIntrusivePtr<const GeoShape> frontcyl{new GeoTube(0.0, halfpitch + 0.001, longWidth / 2.)};
222  frontcyl = &((*frontcyl) << GeoTrf::RotateX3D(90. * Gaudi::Units::deg));
223  GeoIntrusivePtr<const GeoShape> backcyl{new GeoTube(0.0, halfpitch - 0.001, (longWidth + 2.) / 2.)};
224  backcyl = &((*backcyl) << GeoTrf::RotateX3D(90. * Gaudi::Units::deg));
225 
226  if (index > 0) {
227  // If chamber has MDTs, shorten length by halfpitch (remove what was added in DBReader.h)
228  strd = &(strd->subtract((*box) << GeoTrf::Translate3D(0., 0., length / 2.)));
229  double sign = 1.;
230  for (int i = 0; i < index; i++) {
231  comp = (StandardComponent *)m_station->GetComponent(mdt_index[i]);
232  mdt_half_thick = comp->GetThickness(mysql) / 2.;
233  mdt_pos = -totthick / 2. + comp->posz + mdt_half_thick;
234  mdt_pos += amdbOrigine_along_thickness;
235  xtube1 = sign * (mdt_half_thick - (root3 + 1.) * halfpitch);
236  xtube2 = sign * (mdt_half_thick - (3 * root3 + 1.) * halfpitch);
237  strd = &(strd->add((*frontcyl) << GeoTrf::Translate3D(mdt_pos + xtube1, 0., length / 2. - halfpitch)));
238  strd = &(strd->subtract((*backcyl) << GeoTrf::Translate3D(mdt_pos + xtube1, 0., -length / 2.)));
239 
240  if (stname == "BIL" || (stname == "BIS" && std::abs(zi) != 8) || testEIL) {
241  strd = &(strd->add((*frontcyl) << GeoTrf::Translate3D(mdt_pos + xtube2, 0., length / 2. - halfpitch)));
242  strd = &(strd->subtract((*backcyl) << GeoTrf::Translate3D(mdt_pos + xtube2, 0., -length / 2.)));
243  }
244 
245  sign *= -1.;
246  }
247  }
248  if (stname != "EIL") {
249  if (zi < 0 && !is_mirrored)
250  strd = &((*strd) << GeoTrf::RotateX3D(180. * Gaudi::Units::deg));
251  }
252 
253  } // fine clash fixing
254  } // !isAssembly
255 
256  // This will allow the MDT tube structure to be mirrored w.r.t. the chamber at z>0
257  // and to correctly place any other component in the m_station
258  if (zi < 0 && !is_mirrored && stName[0] == 'B') {
259  if (m_station->hasMdts()) {
260  amdbOrigine_along_length += halfpitch;
261  }
262  }
263  ATH_MSG_VERBOSE( "amdb origine: in the length direction = " << amdbOrigine_along_length
264  << " in the thickness direction = " << amdbOrigine_along_thickness);
265 
266  if (isAssembly) {
267  ATH_MSG_DEBUG( "Station " << stName << " at zi, fi " << zi << " " << fi + 1 << " will be described as Assembly" );
268  }
269 
270  // for BOG in layout Q we will have to shorten CHV, CMI as these
271  // are not shortened in AMDB
272  // double lengthShiftCP = 0.;
273 
274  // if this is a BOG, we want to make cutouts in the MOTHER VOLUME
275  if (stName.compare(0, 3, "BOG") == 0 && (manager->IncludeCutoutsBogFlag() || manager->IncludeCutoutsFlag())) {
276 
277  ATH_MSG_VERBOSE( "amdb org: length= " << amdbOrigine_along_length << " thickness= " << amdbOrigine_along_thickness );
278 
279  std::string statType = stName.substr(0, 3);
280  if (m_station->GetNrOfCutouts() > 0) {
281  ATH_MSG_DEBUG( "Station " << stName << " at zi, fi " << zi << " " << fi + 1 << " has components with cutouts " );
282  isAssembly = true;
283 
284  // look for FIRST component with cutouts and loop over all of the cutouts:
285  bool foundCutouts = false;
286  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
287  StandardComponent *c = (StandardComponent *)m_station->GetComponent(j);
288 
289  if (!foundCutouts) {
290  for (int ii = 0; ii < m_station->GetNrOfCutouts(); ii++) {
291  Cutout *cut = m_station->GetCutout(ii);
292  // if this is a BOG in layout Q, set the CP param:
293  // (both cuts have same length so ok to reset it)
294  // also do here some tweaking to prevent undershoot
295  // of the cutouts wrt mother volume:
296  if (std::abs(cut->dx - 600.7) < 0.1) {
297  cut->dx = cut->dx + 10. * Gaudi::Units::mm;
298  cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
299  cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
300  }
301  if (std::abs(cut->dx + 600.7) < 0.1) {
302  cut->dx = cut->dx - 10. * Gaudi::Units::mm;
303  cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
304  cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
305  }
306  if (std::abs(cut->lengthY - 180.2) < 0.001) {
307  cut->lengthY = cut->lengthY + (0.010) * Gaudi::Units::mm;
308  }
309  if (std::abs(cut->dy - 1019.8) < 0.001) {
310  cut->dy = 1216.4185 - cut->lengthY;
311  }
312  // create the cutout with the full thickness of the STATION
313  cut->setThickness(totthick * 1.01); // extra to be sure
314  if ((cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) &&
315  (cut->ijob == c->index)) {
316 
317  foundCutouts = true;
318  }
319  } // Loop over cutouts
320  } // If no cutouts
321  } // Loop over components
322  }
323  } // end of special loop just for cutouts
324 
325  // remove overlaps between end-cap and forward region of TGC stations,
326  // T[1-3]E1_station and T[1-3]F1_station
327  if (stName.compare(0, 1, "T") == 0 && stName.compare(2, 1, "E") == 0 && stName.compare(1, 1, "4") != 0) {
328  GeoTrd *strdoverlap = new GeoTrd(totthick / 4, totthick / 4, width / 2, longWidth / 2, 400. / 2);
329  strd = &(strd->subtract((*strdoverlap) << GeoTrf::Translate3D(-totthick / 4., 0., -length / 2 + 400. / 2.)));
330  }
331 
332  const GeoMaterial *mtrd = nullptr;
333  if (useAssemblies || isAssembly) {
334  mtrd = matManager.getMaterial("special::Ether");
335  } else {
336  mtrd = matManager.getMaterial("std::Air");
337  }
338  GeoLogVol *ltrd = new GeoLogVol(std::string(stName) + "_Station", strd, mtrd);
339  GeoPhysVol *ptrd = new GeoPhysVol(ltrd);
340 
341  double ypos{0.}, zpos{0.}, xpos{0.}, irad{0.};
342  std::array<int, 2> ndbz{0, 0};
343 
344  // Compute how many RPC modules there are in the m_station
345  int nDoubletR{0}, nRpc{0}, nTgc{0}, nCsc{0}, nMdt{0};
346  double previous_depth = 0.;
347  ATH_MSG_VERBOSE( " Station Name = " << stName << " fi/zi " << fi << "/" << zi << " defining the n. of DoubletR to " );
348 
349  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
350  StandardComponent *d = (StandardComponent *)m_station->GetComponent(j);
351  std::string_view cn = std::string_view(d->name).substr(0, 3);
352  if (cn == "RPC") {
353  nRpc++;
354  if (nRpc == 1)
355  nDoubletR++;
356  double depth = -thickness / 2. + d->posz + d->GetThickness(mysql) / 2.;
357  // std::cerr << " nRpc, nDoubletR, depth " << nRpc << " " << nDoubletR
358  // << " " << depth;
359  // BI RPC Chambers have one one doubletR
360  if (!(stname.compare(0, 2, "BI") == 0) && nDoubletR == 1 && nRpc > 1 && depth * previous_depth < 0)
361  nDoubletR++;
362  // std::cerr<<" updated to "<<nDoubletR<<std::endl;
363 
364  previous_depth = depth;
365  }
366  if (cn == "CSC") {
367  nCsc++;
368  }
369  if (cn == "TGC") {
370  nTgc++;
371  }
372  if (cn == "MDT") {
373  nMdt++;
374  }
375  }
376  ATH_MSG_DEBUG( " " << nDoubletR<<" nMdt/Rpc/Tgc/Csc " << nMdt << "/" << nRpc << "/" << nTgc << "/" << nCsc );
377 
378  // Get location and dimensions of long beams and pass them to cross beams
379  // in order to make holes
380  int numLB = -1;
381  double LBheight{0.}, LBwidth{0.}, LByShift{0.};
382  std::array<double, 2> LBpos{-1, -1};
383  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
384  StandardComponent *c = (StandardComponent *)m_station->GetComponent(i);
385  std::string_view cname = std::string_view(c->name).substr(0, 2);
386  if (cname == "LB") {
387  const LBI *lb = dynamic_cast<const LBI *>(mysql.GetTechnology(c->name));
388  LByShift = lb->yShift;
389 
390  numLB++;
391  LBpos[numLB] = c->posy + c->dy / 2.;
392  LBheight = lb->height;
393  LBwidth = c->dy;
394  }
395  if (numLB > 0)
396  break; // only 2 LBs per chamber
397  }
398 
399  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
400  StandardComponent *c = (StandardComponent *)m_station->GetComponent(i);
401  std::string_view cname = std::string_view(c->name).substr(0, 3);
402  if (cname == "CRO" || cname == "CMI" || cname == "CHV") {
403  CbmComponent *ccbm = (CbmComponent *)c;
404  ccbm->lb_height = LBheight;
405  ccbm->lb_width = LBwidth;
406  ccbm->hole_pos1 = LBpos[0];
407  ccbm->hole_pos2 = LBpos[1];
408  }
409  }
410 
411  // Look for the subtype of the CMI in the chamber to let LB know ...
412  std::string CMIcomponentNumber = "";
413  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
414  StandardComponent *d = (StandardComponent *)m_station->GetComponent(j);
415  std::string_view cn = std::string_view(d->name).substr(0, 3);
416  if (cn == "CMI") {
417  CMIcomponentNumber = (d->name).substr(3, 2);
418  break;
419  }
420  }
421 
422  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
423  StandardComponent *d = (StandardComponent *)m_station->GetComponent(j);
424  std::string_view cn = std::string_view(d->name).substr(0, 2);
425  if (cn == "LB") {
426  LbiComponent *lbic = (LbiComponent *)d;
427  if (lbic) {
428  lbic->associated_CMIsubtype = CMIcomponentNumber;
429  } else
430  ATH_MSG_ERROR( "MuonChamber :: cannot associate a CMI subtype to the LB component " );
431  }
432  }
433 
434  // Build the MuonStation(readout-geometry) corresponding to this MuonChamber(raw-geometry)
435  MuonStation *mstat{nullptr};
436  if (stName.compare(0, 1, "B") == 0) {
437  mstat = new MuonStation(stName.substr(0, 3), width, totthick, length, longWidth, totthick, length, zi, fi + 1,
438  (zi < 0 && !is_mirrored));
439  } else {
440  mstat = new MuonStation(stName.substr(0, 3), width, length, totthick, longWidth, length, totthick, zi, fi + 1,
441  (zi < 0 && !is_mirrored));
442  }
443  manager->addMuonStation(std::unique_ptr<MuonStation>(mstat));
444  ATH_MSG_DEBUG( " Building a MuonStation for this MuonChamber "
445  << m_station->GetName() << " at zi, fi " << zi << " " << fi + 1 << " is_mirrored " << is_mirrored);
446 
447  // here the big loop over the components !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
448 
449  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
450  StandardComponent *c = (StandardComponent *)m_station->GetComponent(i);
451  ATH_MSG_VERBOSE( " Component index " << c->index << " in loop for " << stName << " " << stationType << " at zi, fi " << zi << " " << fi + 1 << " cName "
452  << c->name << " thickness " << c->GetThickness(mysql) << " length " << c->dy << " w, lw " << c->dx1 << " " << c->dx2 );
453  ATH_MSG_VERBOSE( " Component local (amdb) coords " << c->posx << " " << c->posy << " " << c->posz );
454 
455  ypos = -thickness / 2. + c->posz + c->GetThickness(mysql) / 2.;
456  zpos = 0.;
457  xpos = 0.;
458 
459  ypos = -thickness / 2. + (c->posz + amdbOrigine_along_thickness) + c->GetThickness(mysql) / 2.;
460  zpos = -length / 2. + amdbOrigine_along_length + c->posy + c->dy / 2.;
461  xpos = c->posx;
462 
463  const std::string &techname = c->name;
464  std::string_view type = std::string_view(techname).substr(0, 3);
465 
466  GeoVPhysVol *lv = nullptr;
467  GeoVPhysVol *lvd = nullptr;
468  GeoVPhysVol *lvs = nullptr;
469  GeoVPhysVol *lvo = nullptr;
470  GeoFullPhysVol *lvm = nullptr;
471  GeoFullPhysVol *lvr = nullptr;
472  GeoFullPhysVol *lvt = nullptr;
473  GeoFullPhysVol *lvc = nullptr;
474 
475  double BeamHeight;
476 
477  // Are there cutouts?
478  std::string statType = stName.substr(0, 3);
479  double cthickness = c->GetThickness(mysql);
480  int ncutouts = 0;
481  std::vector<Cutout *> vcutdef;
482  std::vector<std::unique_ptr<Cutout>> vcutdef_todel;
483  for (int ii = 0; ii < m_station->GetNrOfCutouts(); ii++) {
484  Cutout *cut = m_station->GetCutout(ii);
485  cut->setThickness(cthickness * 1.01); // extra thickness to be sure
486 
487  if ((cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) && (cut->ijob == c->index)) {
488 
489  double tempdx = cut->dx;
490  double tempdy = cut->dy;
491  double templengthY = cut->lengthY;
492  cut->dx = 0.;
493  cut->dy = 0.;
494 
495  if (stName.compare(0, 3, "BOG") == 0) {
496  // make the cutouts a bit longer
497  cut->lengthY = templengthY + 31.;
498  }
499 
500  cut->dx = tempdx;
501  cut->dy = tempdy;
502 
503  if (std::abs(cut->dead1) > 1. && techname == "MDT03")
504  cut->dy = cut->dy + 15.0 * cos(cut->dead1 * Gaudi::Units::deg);
505  // should compensate for the dy position defined in amdb at the bottom of the foam in ML 1 of EMS1,3 and BOS 6
506  // can be applied only for layout >=r.04.04 in rel 15.6.X.Y due to the frozen Tier0 policy
507 
508  cut->lengthY = templengthY;
509  // in thickness, cutout will coincide with component
510  // not needed (DHW) double xposcut = 0.; // rel. to component thickness
511  // double yposcut = -xpos+cut->dx; // rel. to component width
512  // double zposcut = -zpos+cut->dy; // rel. to component length
513  // if (stName.substr(0,3)=="BOG")
514  // {
515  // move the extended cut region out a little
516  // if (cut->dy < 10.) zposcut = -zpos+cut->dy - 15.5;
517  // }
518  ncutouts++;
519  ATH_MSG_VERBOSE( "A new cutout for this component " );
520  ATH_MSG_VERBOSE( *cut );
521 
522  // Corrected cutout values for BMS7, BMS14
523  if (stName.compare(0, 3, "BMS") == 0) {
524  if (fi == 3) { // stationPhi = 4
525  if (std::abs(zi) == 1) { // stationEta = +-1
526  double margin = 1.0; // make cutout a little bigger to avoid coincident boundaries
527 
528  if (type == "RPC" || type == "DED") {
529  cut->widthXl += 2 * margin;
530  cut->widthXs += 2 * margin;
531  cut->dx += margin;
532  cut->lengthY += 2 * margin;
533 
534  if (zi > 0)
535  cut->dy = -margin;
536  }
537  }
538 
539  if (zi == -1) {
540  if (type == "MDT")
541  cut->dy = 0.;
542  }
543  }
544  }
545 
546  // the following is a fine tuning ----- MUST CHECK for a better solution
547  if (stName.compare(0, 3,"BOS") == 0 && zi == -6 && type == "MDT") {
548  cut->dy = c->dy - cut->dy - cut->lengthY - halfpitch;
549  cut->dead1 = 30.; // why this is not 30. or -30. already ?????
550  if (techname == "MDT03")
551  cut->dy = cut->dy + 30.0; // *cos(cut->dead1*Gaudi::Units::deg);
552 
553  ATH_MSG_VERBOSE( "Cut dead1 for BOS 6 on C side is " << cut->dead1 );
554 
555  }
556 
557  // this mirroring of the cutout is necessary only for barrel MDT chambers; for EC the cutout will be automatically mirrored
558  // this fix cannot be applied in 15.6.X.Y for layout < r.04.04 due to the frozen tier0 policy
559 
560  if (type == "MDT" && (is_mirrored || zi < 0) && stName.compare(0, 1, "B") == 0) {
561  // MDT in chambers explicitly described at z<0 have to be
562  // rotated by 180deg to adj. tube staggering
563  // reverse the position (x amdb) of the cutout if the m_station is mirrored
564  Cutout *cutmirr = new Cutout(*cut);
565  cutmirr->dx = -cutmirr->dx;
566  // this way, after the rotation by 180 Gaudi::Units::deg, the cut will be at the same global phi
567  // it has for the m_station at z>0
568  vcutdef.push_back(cutmirr);
569  vcutdef_todel.emplace_back(cutmirr);
570  ATH_MSG_VERBOSE( "adding for application mirrored cut \n" << *cutmirr );
571 
572  } else if (type == "RPC" || type == "DED") {
573  Cutout *cutRpcType = new Cutout(*cut);
574  // temporary for testing fixes to r.03.09
575  if (stName.compare(0, 3, "BMS") == 0 && zi == 4 && (c->index == 20 || c->index == 21 || c->index == 24 || c->index == 25)) {
576  cutRpcType->dy = 1102.5;
577  }
578 
579  if (stName.compare(0, 3, "BOS") == 0 && zi == 6 && type == "DED")
580  cutRpcType->dy = 706.;
581 
582  cutRpcType->dy = cutRpcType->dy - c->posy;
583  cutRpcType->dx = cutRpcType->dx - c->posx;
584 
585  if (type == "RPC") {
586  RpcComponent *rp = (RpcComponent *)c;
587  if (rp->iswap == -1) {
588  cutRpcType->dy = c->dy - (cutRpcType->dy + cutRpcType->lengthY);
589  }
590  }
591 
592  ATH_MSG_VERBOSE( " Rpc or ded cutout redefined as follows \n" << *cutRpcType );
593  vcutdef.push_back(cutRpcType);
594  vcutdef_todel.emplace_back(cutRpcType);
595  } else if (type == "TGC") {
596  // In AMDB, y coordinates of cutout and component are given by
597  // radius from detector z-axis. To get standard y value of cutout,
598  // subtract radius of component from radius of cutout
599  Cutout *tgccut = new Cutout(*cut);
600  tgccut->dy -= c->posy; //
601 
602  ATH_MSG_VERBOSE( " Tgc cutout redefined as follows \n" << *tgccut );
603  vcutdef.push_back(tgccut);
604  vcutdef_todel.emplace_back(tgccut);
605  } else {
606  vcutdef.push_back(cut);
607  }
608  }
609  } // Loop over cutouts in m_station
610 
611  if (ncutouts > 0) {
612  ATH_MSG_DEBUG( c->name << " of station " << stName << " at fi/zi " << fi + 1 << "/" << zi << " has " << ncutouts << " cutouts " );
613 
614  }
615  // define here the total transform that will be applied to component:
616  GeoTrf::Transform3D htcomponent(GeoTrf::Transform3D::Identity());
617  GeoTransform *xfcomponent{nullptr};
618  GeoAlignableTransform *xfaligncomponent{nullptr};
619  // for RPCs we need a vector of transforms for M28 geometry...
620 
621  if (type == "CRO") {
622  if (stName.compare(0, 1, "B") != 0 && is_mirrored)
623  mstat->setxAmdbCRO(-xpos);
624  else
625  mstat->setxAmdbCRO(xpos);
626  }
627 
628  if (type == "MDT") {
629  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
630 
631  if (zi < 0 && !is_mirrored && stName[0] == 'B') {
632  // this (rotation + shift of halfpitch) will mirror the tube structure w.r.t. the chamber at z>0
633  htcomponent = htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
634  htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
635  }
636 
637  // ss - 24-05-2006 I don't really understand if this is needed at all
638  // it was introduced by Isabel T.
639  if (zi < 0 && stName.compare(0, 3, "BOG") == 0 && is_mirrored) {
640  // htcomponent = htcomponent*GeoTrf::RotateX3D(180.*Gaudi::Units::deg);
641  // tubes OK but chambers wrong
642  // htcomponent = GeoTrf::RotateX3D(180.*Gaudi::Units::deg)*htcomponent;
643  // chambers OK but tubes wrong
644  htcomponent = GeoTrf::RotateX3D(180. * Gaudi::Units::deg) * htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg); // turn chambers but go back for tubes
645  } // ss - 24-05-2006 I don't really understand if this is needed at all
646 
647  xfaligncomponent = new GeoAlignableTransform(htcomponent);
648  std::string key =std::string( stName) + techname;
649 
650  // for cutouts:
651  // MDT cutouts for BOS1,5, BMS7,14, (problem with BMS4,10), EMS, BMG and BIS MDT14
652  bool mdtCutoutFlag = ((stname == "BOS" && std::abs(zi) == 6) || stname == "BMG" || techname == "MDT14" || (stname == "BMS" && (std::abs(zi) == 1 && fi == 3)) ||
653  (stname == "EMS" && (std::abs(zi) == 1 || std::abs(zi) == 3)));
654  if (((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
655  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
656  } else if (((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG")) == 0) && zi < 0) {
657  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
658  }
659 
660  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
661  if (fpv == nullptr) {
662  std::unique_ptr<Mdt> r = std::make_unique<Mdt>(mysql, c, stName + techname);
663  ATH_MSG_DEBUG( " Building an MDT for station " << key << " component name is " << c->name <<
664  " stName "<<stName<<" techName: "<<techname<< " manager->IncludeCutoutsFlag() "
665  << manager->IncludeCutoutsFlag() << " manager->IncludeCutoutsBogFlag() " << manager->IncludeCutoutsBogFlag() );
666 
667 
668  if ((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
669  lvm = r->build(matManager, mysql, vcutdef);
670  } else {
671  lvm = r->build(matManager, mysql);
672  }
673  m_FPVMAP->StoreDetector(lvm, key);
674  } else {
675  GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
676  ATH_MSG_VERBOSE( " This MDT for station " << key << " component name is " << c->name << " already exists; clone it " );
677  lvm = rfpv->clone();
678  }
679 
680  } else if (type == "SPA" && manager->MinimalGeoFlag() == 0) {
681  if (techname == "SPA01" && stName.compare(0, 1, "C") == 0) {
682  ATH_MSG_DEBUG( "Ficticious spacer SPA01 in CSC chamber - skip it " );
683  // ignore SPA 1 component of CSS/CSL chambers in R02.03 (it is there only for AMDB convenience,
684  // leaving the CSC envelop => global position of the m_station unchanged)
685  continue;
686  }
687 
688  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
689  xfcomponent = new GeoTransform(htcomponent);
690  std::string key = std::string(stName) + techname;
691  if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
692  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
693  } else if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,"BOG") == 0)) && zi < 0) {
694  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
695  }
696 
697  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
698  if (fpv == nullptr) {
699  std::unique_ptr<Spacer>r = std::make_unique<Spacer>(mysql, c);
700  ATH_MSG_DEBUG( " Building a SPA for m_station "<< key << " component name is " << c->name );
701  if (manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
702  lv = r->build(matManager, 1);
703  } else {
704  lv = r->build(matManager);
705  }
706  ATH_MSG_DEBUG( " Storing in FPVMAP with key " << key );
707  m_FPVMAP->StoreDetector(lv, key);
708  } else {
709  lv = fpv;
710  }
711  } else if ((type == "CHV" || type == "CRO" || type == "CMI" || type == "LB0" || type == "LBI") && manager->MinimalGeoFlag() == 0) {
712  std::unique_ptr<SpacerBeam> r = std::make_unique<SpacerBeam>(mysql, c);
713  BeamHeight = r->height;
714  ypos = c->posx;
715  double xpos = (c->posz + amdbOrigine_along_thickness) - thickness / 2. + BeamHeight / 2.;
716  if (type.compare(0, 2, "LB") == 0)
717  xpos -= LByShift;
718 
719  double angle = 0.;
720  if (std::abs(c->excent) > 0.001) {
721  angle = atan((longWidth - width) / length / 2.);
722  if (c->excent < 0.)
723  angle = -angle;
724  }
725 
726  // This is an attempt to provide some info to LB construction in order
727  // to avoid the clash of LB with CXx in the endcaps ...
728  if (type == "LB0") {
729  if (stName == "EML1" || stName == "EML6") {
730  if ((c->dx1 > width) && zpos < 0.) {
731  r->width = 0.98 * width;
732  }
733  if ((c->dx1 / longWidth) > 0.98 && zpos > 0.) {
734  double mywidth = 0.93 * longWidth;
735  r->width = mywidth;
736  }
737  }
738  }
739 
740  if (type == "CMI" || type == "CHV" || type == "CRO") {
741  // Shorten CHV, CMI lengths to fit in BOL4 envelope
742  if (stname == "BOL" && zi == 1 && (fi + 1) == 3) {
743  r->length = length - halfpitch;
744  zpos = -halfpitch / 2.;
745  }
746  }
747 
748  if (!is_mirrored) {
749  htcomponent = GeoTrf::Translate3D(xpos, ypos, zpos) * GeoTrf::RotateX3D(angle);
750  } else {
751  htcomponent = GeoTrf::Translate3D(xpos, -ypos, zpos) * GeoTrf::RotateX3D(-angle);
752  }
753  xfcomponent = new GeoTransform(htcomponent);
754 
755  std::string key = stName + techname;
756  if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
757  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
758  } else if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi < 0) {
759  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
760  }
761  // can have LB of different length in same m_station:
762  if (type.substr(0, 2) == "LB")
763  key += buildString(int(c->dx1), 0);
764 
765  ATH_MSG_DEBUG( " Building a SpacerBeam for m_station "<< key << " component name is "<< c->name );
766  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
767  if (fpv == nullptr || (stName.compare(0, 3, "BOG") == 0 && type == "CMI")) {
768  if (stName.compare(0, 3, "BOG") == 0) {
769  ATH_MSG_VERBOSE( " Building a SpacerBeam for station " << key << " component name is " << c->name );
770  }
771  if (manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
772  lvo = r->build(matManager, 1, is_barrel);
773  } else {
774  lvo = r->build(matManager, is_barrel);
775  }
776  m_FPVMAP->StoreDetector(lvo, key);
777  // AMDB origin is in bottom centre of bottom cross-piece at
778  // end of bar.
779  // From centre, it is -height/2 in x, 0 in y, -length/2 in z
780  } else {
781  if (stName.compare(0, 3,"BOG") == 0)
782  ATH_MSG_VERBOSE( " This spacerbeam for station " << key << " component name is " << c->name << " already exists; re-use it " );
783  lvo = fpv;
784  }
785 
786  } else if (type == "RPC") {
787  // position stuff needed for cutout, used to be below:
788  RpcComponent *rp = (RpcComponent *)c;
789  int ndivy = rp->ndivy;
790  int ndivz = rp->ndivz;
791 
792  if (ndivz != 1 || ndivy != 1) {
793  ATH_MSG_ERROR( " RPC segmentation z,y " << ndivz << " " << ndivy );
794  }
795 
796  double xpos = c->posx;
797  // implement really the mirror symmetry
798  if (is_mirrored)
799  xpos = -xpos;
800 
801  ATH_MSG_VERBOSE( " In station " << stName << " with " << nDoubletR << " doubletR,"
802  << " RPC " << (c->name).substr(3, 2) << " has swap flag = " << rp->iswap << " ypos, zpos " << ypos << " " << zpos << " " );
803 
804  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
805  if (rp->iswap == -1) { // this is like amdb iswap
806  htcomponent = htcomponent * GeoTrf::RotateY3D(180 * Gaudi::Units::deg);
807  }
808  xfaligncomponent = new GeoAlignableTransform(htcomponent);
809 
810  // end of position stuff
811 
812  bool rpcCutoutFlag = (stname == "BOS" && std::abs(zi) == 6) || (stname == "BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
813  (stname == "BMS" && std::abs(zi) == 1 && fi == 3);
814  std::string key = stName + techname;
815  if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
816  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
817  buildString(vcutdef.size(), 0) + "_" + buildString(rp->iswap, 0);
818  } else if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi < 0) {
819  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
820  buildString(vcutdef.size(), 0) + "_" + buildString(rp->iswap, 0);
821  }
822  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
823  if (fpv == nullptr) {
824  std::unique_ptr<Rpc> r = std::make_unique<Rpc>(mysql, c);
825  r->setLogVolName(std::string(stName) + techname);
826  if (stName.find("BI") != std::string::npos) {
827  std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
828  if (yItr != rpcYTrans.end())
829  r->y_translation = yItr->second;
830  std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
831  if (zItr != rpcZTrans.end())
832  r->z_translation = zItr->second;
833  }
834 
835  if ((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
836  lvr = r->build(matManager, mysql, manager->MinimalGeoFlag(), 1, vcutdef);
837  } else {
838  lvr = r->build(matManager, mysql, manager->MinimalGeoFlag());
839  }
840 
841  m_FPVMAP->StoreDetector(lvr, key);
842  } else {
843  GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
844  lvr = rfpv->clone();
845  }
846 
847  } else if (type == "DED" && manager->MinimalGeoFlag() == 0) {
848  double xpos = c->posx;
849  if (is_mirrored)
850  xpos = -xpos;
851  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
852 
853  xfcomponent = new GeoTransform(htcomponent);
854 
855  bool dedCutoutFlag = (stname == "BOS" && std::abs(zi) == 6) || (stname == "BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
856  (stname == "BMS" && std::abs(zi) == 1 && fi == 3);
857  std::string key = std::string(stName) + techname;
858  if (((manager->IncludeCutoutsFlag() && dedCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,"BOG") == 0)) && zi >= 0) {
859  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
860  buildString(vcutdef.size(), 0);
861  } else if (((manager->IncludeCutoutsFlag() && dedCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi < 0) {
862  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
863  buildString(vcutdef.size(), 0);
864  }
865  key += buildString(int(c->dy), 0) + "_" + buildString(int(c->dx1), 0);
866  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
867 
868  if (fpv == nullptr) {
869  std::unique_ptr<Ded> r = std::make_unique<Ded>(mysql, c);
870  ATH_MSG_VERBOSE( " Building a DED for station " << key << " component name is " << c->name );
871  if ((manager->IncludeCutoutsFlag() && dedCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
872  lvd = r->build(matManager, mysql, 1, vcutdef);
873  } else {
874  lvd = r->build(matManager, mysql);
875  }
876 
877  m_FPVMAP->StoreDetector(lvd, key);
878  } else {
879  lvd = fpv;
880  ATH_MSG_VERBOSE( " Re-using DED for station " << key << " component name is " << c->name );
881  }
882 
883  } else if (type == "SUP" && manager->MinimalGeoFlag() == 0) {
884  ypos = -thickness / 2. + c->posz;
885  double zpos = -length / 2. + c->posy + c->dy / 2. - SupComponent::zAMDB0(mysql, *c);
886  ypos = ypos - SupComponent::xAMDB0(mysql, *c);
887  double xpos = c->posx - SupComponent::yAMDB0(mysql, *c);
888 
889  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
890  std::string key = std::string(stName) + techname;
891  if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,"BOG") == 0)) && zi >= 0) {
892  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
893  } else if ((manager->IncludeCutoutsFlag() || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3,"BOG") == 0)) && zi < 0) {
894  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
895  }
896 
897  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
898  if (fpv == nullptr) {
899  m_FPVMAP->StoreDetector(lvs, key);
900  } else {
901  lvs = fpv;
902  }
903 
904  } else if (type == "TGC") {
905  TgcComponent *tg = (TgcComponent *)m_station->GetComponent(i);
906  TgcComponent *tgInner = (TgcComponent *)m_station->GetComponent(0);
907  irad = tgInner->posy;
908  TgcComponent *tgOuter = (TgcComponent *)m_station->GetComponent(m_station->GetNrOfComponents() - 1);
909  double orad = tgOuter->posy + tgOuter->dy;
910  double start = -(orad - irad) / 2. + (tg->posy - irad) + tg->dy / 2;
911  double xstart = -thickness / 2. + tg->GetThickness(mysql) / 2.;
912  htcomponent = GeoTrf::TranslateX3D(xstart + tg->posz) * GeoTrf::TranslateZ3D(start);
913  xfaligncomponent = new GeoAlignableTransform(htcomponent);
914 
915  // Define key for this TGC component
916  std::string key = std::string(stName) + techname;
917  if (manager->IncludeCutoutsFlag()) {
918  if (mysql.allocPosFindCutout(statType, fi, zi) > 0) {
919  // If there is a cutout for this chamber, give it a special key
920  if (zi >= 0) {
921  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
922  } else if (zi < 0) {
923  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
924  }
925  }
926  }
927 
928  char chswidth[32];
929  sprintf(chswidth, "%i", int(10 * c->dx1));
930  key += chswidth;
931 
932  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
933  if (fpv == nullptr) {
934  std::unique_ptr<Tgc> t = std::make_unique<Tgc>(mysql, c);
935  t->setLogVolName(std::string(stName) + techname);
936  if (manager->IncludeCutoutsFlag()) {
937  lvt = t->build(matManager, mysql, manager->MinimalGeoFlag(), 1, vcutdef);
938  } else {
939  lvt = t->build(matManager, mysql, manager->MinimalGeoFlag());
940  }
941  m_FPVMAP->StoreDetector(lvt, key);
942  } else {
943  GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
944  lvt = rfpv->clone();
945  }
946 
947  } else if (type == "CSC") {
948  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
949  xfaligncomponent = new GeoAlignableTransform(htcomponent);
950  // Here define the key for this CSC component
951  std::string key = std::string(stName) + techname;
952  if (manager->IncludeCutoutsFlag() && zi >= 0) {
953  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
954  } else if (manager->IncludeCutoutsFlag() && zi < 0) {
955  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
956  }
957 
958  GeoVPhysVol *fpv = m_FPVMAP->GetDetector(key);
959  if (fpv == nullptr) {
960  std::unique_ptr<Csc> t = std::make_unique<Csc>(mysql, c);
961  t->setLogVolName(std::string(stName) + techname);
962 
963  if (manager->IncludeCutoutsFlag()) {
964  lvc = t->build(matManager, mysql, manager->MinimalGeoFlag(), 1, vcutdef);
965  } else {
966  lvc = t->build(matManager, mysql, manager->MinimalGeoFlag());
967  }
968 
969  m_FPVMAP->StoreDetector(lvc, key);
970  } else {
971  GeoFullPhysVol *rfpv = (GeoFullPhysVol *)fpv;
972  lvc = rfpv->clone();
973  }
974 
975  } else {
976  if (type != "MDT" && type != "RPC" && type != "TGC" && type != "SUP" && type != "DED" && type != "SPA" && type != "CHV" && type != "CRO" && type != "CMI" &&
977  type != "LB0" && type != "LBI") {
978  ATH_MSG_INFO( "Unknown component " << type );
979  }
980  }
981 
982  // Place components in chamber envelope
983  if (lvm && manager->mdtIdHelper()) {
984  int stationEta = zi;
985  int stationPhi = fi + 1;
986  int ml = 1;
987  int tubel = 1;
988  int tube = 1;
989  if (ypos > 5.)
990  ml = 2; // Need >5 instead of >0 because BIS78 is not perfectly centered
991  std::string stag = "ml[" + MuonGM::buildString(ml, 0) + "]" + techname + "component";
992 
993  GeoNameTag *nm = new GeoNameTag(stag);
994  ptrd->add(new GeoIdentifierTag(c->index));
995  ptrd->add(nm);
996 
997  xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
998  // delete xfcomponent;
999  ptrd->add(xfaligncomponent);
1000  ptrd->add(lvm);
1001  const MdtIdHelper *mdt_id = manager->mdtIdHelper();
1002  std::unique_ptr<MdtReadoutElement> det = std::make_unique<MdtReadoutElement>(lvm, stName, manager);
1003  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
1004  setMdtReadoutGeom(mysql, det.get(), (MdtComponent *)c, ip);
1005  det->setHasCutouts(ncutouts > 0);
1006  det->setNMdtInStation(nMdt);
1007  Identifier id = mdt_id->channelID(stationType, stationEta, stationPhi, ml, tubel, tube);
1008  det->setIdentifier(id);
1009  det->setMultilayer(ml);
1010  det->setParentStationPV(PVConstLink(ptrd));
1011  det->setParentMuonStation(mstat);
1012  det->geoInitDone();
1013 
1014  if (ml == 1) {
1015  // set fixed point for MDT deformations: s0,z0,t0 for the point at lowest t,z (z,y amdb) and s=x=0
1016  mstat->setBlineFixedPointInAmdbLRS(c->posx, c->posy, c->posz);
1017  } else {
1018  Amg::Vector3D b0 = mstat->getBlineFixedPointInAmdbLRS();
1019  if (c->posy < b0.y())
1020  mstat->setBlineFixedPointInAmdbLRS(b0.x(), c->posy, b0.z());
1021  }
1022 
1023  int jobIndex = c->index;
1024 
1025  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
1026  ATH_MSG_DEBUG( std::string(stName + techname) << " trying to build a MDT Id from stType/eta/phi/ml/tl/t " << stationType << "/" << stationEta << "/"
1027  << stationPhi << "/" << ml << "/" << tubel << "/" << tube << endmsg << " Copy number is " << c->index << " tagName " << stag );
1028 
1029 
1030  manager->addMdtReadoutElement(std::move(det));
1031  }
1032 
1033  if (lvc && manager->cscIdHelper()) {
1034  CscComponent *cs = (CscComponent *)m_station->GetComponent(i);
1035  int stationEta = zi;
1036  int stationPhi = fi + 1;
1037  int chamberLayer = 1;
1038  if (ypos > 0.)
1039  chamberLayer = 2;
1040  std::string stag = "cl[" + MuonGM::buildString(chamberLayer, 0) + "]" + techname + "component";
1041  GeoNameTag *nm = new GeoNameTag(stag);
1042  ptrd->add(new GeoIdentifierTag(c->index));
1043  ptrd->add(nm);
1044 
1045  xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1046  // delete xfcomponent;
1047  ptrd->add(xfaligncomponent);
1048  ptrd->add(lvc);
1049 
1050  std::unique_ptr<CscReadoutElement> det = std::make_unique<CscReadoutElement>(lvc, stName, manager);
1051  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
1052  setCscReadoutGeom(mysql, det.get(), cs, ip);
1053 
1054  const CscIdHelper *csc_id = manager->cscIdHelper();
1055  det->setHasCutouts(ncutouts > 0);
1056  Identifier id = csc_id->channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
1057  det->setIdentifier(id);
1058  det->setChamberLayer(chamberLayer);
1059  det->setParentStationPV(PVConstLink(ptrd));
1060  det->setParentMuonStation(mstat);
1061 
1062  int jobIndex = c->index;
1063  // mstat->addMuonReadoutElement(det,jobIndex);
1064  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
1065  ATH_MSG_DEBUG( stName << techname << " trying to build a CSC Id from stType/eta/phi/ml " << stationType << "/" << stationEta << "/"
1066  << stationPhi << "/" << chamberLayer << "/ and /1/0/1" << endmsg << " Copy number is " << c->index << " tagName " << stag );
1067 
1068  // set alignment parameters for the wire layers
1069  manager->addCscReadoutElement(std::move(det));
1070  }
1071 
1072  if (lvt && manager->tgcIdHelper()) {
1073  ATH_MSG_DEBUG( " Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi << " " << fi + 1 << " " << is_mirrored );
1074 
1075  TgcComponent *tg = (TgcComponent *)m_station->GetComponent(i);
1076  ATH_MSG_VERBOSE( "There's a TGC named " << techname << " of thickness " << tg->GetThickness(mysql) );
1077 
1078  const TgcIdHelper *tgc_id = manager->tgcIdHelper();
1079  int stationEta = 0;
1080  stationEta = tg->index;
1081  if (zi < 0)
1083  int stationPhi = 0;
1084  stationPhi = MuonGM::stationPhiTGC(stName, fi + 1, zi);
1085  int ttag = 1000 * stationPhi + tg->index;
1086  std::string stag = "stPhiJob[" + MuonGM::buildString(ttag, 0) + "]" + techname + "tgccomponent";
1087  GeoNameTag *nm = new GeoNameTag(stag);
1088  int geoid = 0;
1089  if (useAssemblies || isAssembly) {
1090  geoid = c->index;
1091  } else {
1092  if (zi < 0)
1093  ttag = -ttag;
1094  geoid = ttag;
1095  }
1096  ptrd->add(new GeoIdentifierTag(geoid));
1097  ptrd->add(nm);
1098 
1099  xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1100 
1101  // delete xfcomponent;
1102  ptrd->add(xfaligncomponent);
1103  ptrd->add(lvt);
1104 
1105  std::unique_ptr<TgcReadoutElement> det = std::make_unique<TgcReadoutElement>(lvt, stName, manager);
1106  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
1107  setTgcReadoutGeom(mysql, det.get(), tg, ip, stName);
1108  det->setHasCutouts(ncutouts > 0);
1109  Identifier id = tgc_id->channelID(stationType, stationEta, stationPhi, 1, false, 1);
1110  det->setIdentifier(id);
1111  det->setParentStationPV(PVConstLink(ptrd));
1112  det->setParentMuonStation(mstat);
1113 
1114  int jobIndex = c->index;
1115 
1116  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
1117 
1118  ATH_MSG_DEBUG( stName << techname << " trying to build a TGC Id from stType/eta/phi " << stationType << "/" << stationEta << "/" << stationPhi
1119  << "/ and /1/0/1" << endmsg << " Copy number is " << geoid << " tagName = " << stag );
1120  manager->addTgcReadoutElement(std::move(det));
1121  }
1122 
1123  if (lvr && RPCON && manager->rpcIdHelper()) {
1124  RpcComponent *rp = (RpcComponent *)c;
1125  int ndivy = rp->ndivy;
1126  int ndivz = rp->ndivz;
1127 
1128  if (ndivz != 1 || ndivy != 1) {
1129  ATH_MSG_ERROR( " RPC segmentation z,y " << ndivz << " " << ndivy );
1130  }
1131 
1132  double zpos = -length / 2. + c->posy + c->dy / 2.;
1133  double xpos = c->posx;
1134 
1135  // implement really the mirror symmetry
1136  if (is_mirrored)
1137  xpos = -xpos;
1138  // ... putting back to here!
1139 
1140  const RpcIdHelper *rpc_id = manager->rpcIdHelper();
1141  int stationEta = zi;
1142  int stationPhi = fi + 1;
1143  int doubletR = 1;
1144  int doubletZ = 1;
1145 
1146  if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
1147  doubletR = 2;
1148  ndbz[doubletR - 1]++;
1149 
1150  // the BI RPCs are 3-gap RPCs mounted inside of the BI (s)MDTs
1151  if (stname.find("BI") != std::string::npos) {
1152  if (stname.find("BIS") != std::string::npos) {
1153  // for BIS78, there is a second RPC doubletZ at amdb-y (MuonGeoModel-z)=144mm inside the station
1154  if (std::abs(stationEta)>= 7){
1155  ATH_MSG_DEBUG("BIS78 station eta: "<<stationEta<<" phi: "<<stationPhi<<" dR: "<<doubletR<<" dZ:"<< doubletZ <<" rp: "<<rp->posz);
1156  }
1157  if (std::abs(stationEta) >= 7 && rp->posz > 80)
1158  doubletZ = 2;
1159  else
1160  doubletZ = 1;
1161  } else {
1162  // for BIL/BIM/BIR, we have 10 RPCs put on 6 MDT stations, thus, need to exploit doubletZ as additional variable on top of stationEta
1163  // only for BIL, there are sometimes 2 RPCs per 1 MDT station, namely for stationEta 1,3,4,6
1164  if (stname.find("BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
1165  if (rp->posy > 1)
1166  doubletZ = 2; // put the chamber with positive amdb-z to doubletZ=2
1167  } else
1168  doubletZ = 1;
1169  }
1170  } else {
1171  if (zi <= 0 && !is_mirrored) {
1172  if (zpos < -100 * Gaudi::Units::mm)
1173  doubletZ = 2;
1174  } else {
1175  if (zpos > 100 * Gaudi::Units::mm)
1176  doubletZ = 2;
1177  }
1178  }
1179 
1180  // BMS (BOG) RPCs can have |xpos|=950 (|xpos|=350)
1181  if (std::abs(xpos) > 100. * Gaudi::Units::mm) {
1182  if (ndbz[doubletR - 1] > 2) {
1183  doubletZ = 3;
1184  }
1185  ndbz[doubletR - 1]--;
1186  }
1187 
1188  int dbphi = 1;
1189 
1190  // this special patch is needed for BMS in the ribs where xpos is ~950mm;
1191  // the theshold to 100mm (too low) caused a bug
1192  // in BOG at eta +/-4 and stationEta 7 (not 6) ==>> 28 Jan 2016 raising the threshold to 400.mm
1193  // doublet phi not aware of pos. in space !!!
1194  if (xpos > 400. * Gaudi::Units::mm)
1195  dbphi = 2;
1196 
1197  int doubletPhi = dbphi;
1198  // doublet phi aware of pos. in space !!!
1199  if (zi < 0 && is_mirrored && doubletZ == 3) {
1200  doubletPhi++;
1201  if (doubletPhi > 2)
1202  doubletPhi = 1;
1203  } else if (zi < 0 && is_mirrored && doubletZ == 2 && doubletR == 1 && stName == "BMS6") {
1204  doubletPhi++;
1205  if (doubletPhi > 2)
1206  doubletPhi = 1;
1207  }
1208  // never defined fields: set to the lower limit
1209  int gasGap = 1;
1210  int measuresPhi = 0;
1211  int strip = 1;
1212 
1213  int geoid = 0;
1214  std::string stag;
1215  int tag = doubletZ + doubletR * 100 + dbphi * 1000;
1216  if (rp->iswap == -1)
1217  tag = -1 * tag;
1218  stag = "SwapdbPdbRdbZ[" + MuonGM::buildString(tag, 0) + "]" + techname + "rpccomponent";
1219  if (useAssemblies || isAssembly) {
1220  geoid = c->index;
1221  } else {
1222  int tag = rp->index + doubletR * 100 + dbphi * 1000;
1223  if (rp->iswap == -1)
1224  tag = -1 * tag;
1225  geoid = tag;
1226  }
1227 
1228  GeoNameTag *nm = new GeoNameTag(stag);
1229  ptrd->add(new GeoIdentifierTag(geoid));
1230  ptrd->add(nm);
1231 
1232  xfaligncomponent->setDelta(GeoTrf::Transform3D::Identity());
1233  // delete xfcomponent;
1234  ptrd->add(xfaligncomponent);
1235  ptrd->add(lvr);
1236 
1237  std::unique_ptr<RpcReadoutElement> det = std::make_unique<RpcReadoutElement>(lvr, stName, zi, fi + 1, is_mirrored, manager);
1238  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
1239  setRpcReadoutGeom(mysql, det.get(), rp, ip);
1240  Identifier id = rpc_id->channelID(stationType, stationEta, stationPhi, doubletR, doubletZ, doubletPhi, gasGap, measuresPhi, strip);
1241  det->setIdentifier(id);
1242  det->setHasCutouts(ncutouts > 0);
1243  det->setDoubletR(doubletR);
1244  det->setDoubletZ(doubletZ);
1245  det->setDoubletPhi(doubletPhi);
1246 
1247  ATH_MSG_DEBUG( stName << techname << " trying to build a RPC Id from stType/eta/phi/dbR/dbZ/dbP " << stationType << "/" << stationEta << "/"
1248  << stationPhi << "/" << doubletR << "/" << doubletZ << "/" << doubletPhi << "///" << gasGap << "/" << measuresPhi << "/" << strip << endmsg
1249  << " Copy number " << geoid << " tagName= " << stag );
1250  det->setParentStationPV(PVConstLink(ptrd));
1251  det->setParentMuonStation(mstat);
1252 
1253  int jobIndex = c->index;
1254 
1255  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
1256 
1257 
1258  if (stName.find("BI") != std::string::npos) {
1259  std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
1260  if (yItr != rpcYTrans.end())
1261  det->setYTranslation(yItr->second);
1262  std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
1263  if (zItr != rpcZTrans.end())
1264  det->setZTranslation(zItr->second);
1265  }
1266 
1267  det->fillCache(); // fill temporary cache (global position on known yet)
1268  det->initDesign();
1269  det->clearCache(); // clear temporary cache
1270  manager->addRpcReadoutElement(std::move(det));
1271  } // if (lvr && RPCON && manager->rpcIdHelper()) {
1272 
1273  if (lvs && RPCON) {
1274  std::string cname = c->name;
1275  ATH_MSG_VERBOSE( " yes, the component is a SupComponent named " << cname );
1276  GeoNameTag *nm = new GeoNameTag(stName + "_stName " + techname + " supcomponent");
1277  ptrd->add(new GeoIdentifierTag(c->index));
1278  ptrd->add(nm);
1279  ptrd->add(xfcomponent);
1280  ATH_MSG_VERBOSE( " register x" );
1281  ATH_MSG_VERBOSE( " register y" );
1282  ATH_MSG_VERBOSE( " register z" );
1283 
1284  ptrd->add(lvs);
1285  ATH_MSG_VERBOSE( " register lvs" );
1286  }
1287 
1288  if (lvd && RPCON) {
1289  GeoNameTag *nm = new GeoNameTag(stName + "_stName " + techname + " dedcomponent");
1290  ptrd->add(new GeoIdentifierTag(c->index));
1291  ptrd->add(nm);
1292 
1293  ptrd->add(xfcomponent);
1294  ptrd->add(lvd);
1295  }
1296 
1297  if (lvo) {
1298  // translate from AMDB chamber coordinates:
1299  // (move chamber origin and swap axes around)
1300  // D-line gives AMDB coords of AMDB component origin
1301  // we need MuonGM coords of MuonGM component origin...
1302  // take off length/2, thickness/2 to get to AMDB chamber org
1303  // then put back GetLength()/2, GetThickness()/2 to get to
1304  // component org.
1305  GeoNameTag *nm = new GeoNameTag(stName + "_stName " + techname + " component");
1306  ptrd->add(new GeoIdentifierTag(c->index));
1307  ptrd->add(nm);
1308 
1309  ptrd->add(xfcomponent);
1310  ptrd->add(lvo);
1311  }
1312 
1313  if (lv) {
1314  GeoNameTag *nm = new GeoNameTag(stName + "_stName " + techname + " component");
1315  ptrd->add(new GeoIdentifierTag(c->index));
1316  ptrd->add(nm);
1317  ptrd->add(xfcomponent);
1318  ptrd->add(lv);
1319  }
1320 
1321  } // End big loop over components
1322  mstat->updateBlineFixedPointInAmdbLRS();
1323 
1324  return ptrd;
1325  }

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40 {
42  m_lvl = m_imsg ?
43  static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
44  MSG::INFO;
45 }

◆ msg() [1/2]

MsgStream & AthMessaging::msg ( ) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 164 of file AthMessaging.h.

165 {
166  MsgStream* ms = m_msg_tls.get();
167  if (!ms) {
168  if (!m_initialized.test_and_set()) initMessaging();
169  ms = new MsgStream(m_imsg,m_nm);
170  m_msg_tls.reset( ms );
171  }
172 
173  ms->setLevel (m_lvl);
174  return *ms;
175 }

◆ msg() [2/2]

MsgStream & AthMessaging::msg ( const MSG::Level  lvl) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 179 of file AthMessaging.h.

180 { return msg() << lvl; }

◆ msgLvl()

bool AthMessaging::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Test the output level.

Parameters
lvlThe message level to test against
Returns
boolean Indicating if messages at given level will be printed
Return values
trueMessages at level "lvl" will be printed

Definition at line 151 of file AthMessaging.h.

152 {
153  if (!m_initialized.test_and_set()) initMessaging();
154  if (m_lvl <= lvl) {
155  msg() << lvl;
156  return true;
157  } else {
158  return false;
159  }
160 }

◆ print()

void MuonGM::MuonChamber::print ( ) const
overridevirtual

Implements MuonGM::DetectorElement.

Definition at line 1561 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1561  {
1562  ATH_MSG_INFO( "MuonChamber " << name << " :" );
1563  }

◆ setCscReadoutGeom()

void MuonGM::MuonChamber::setCscReadoutGeom ( const MYSQL mysql,
CscReadoutElement re,
const CscComponent cc,
const Position p 
)
private

Definition at line 1327 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1328  {
1329 
1330  re->m_Ssize = cc->dx1;
1331  re->m_LongSsize = cc->dx2;
1332  re->m_Rsize = cc->dy;
1333  re->m_LongRsize = cc->dy;
1334  re->m_Zsize = cc->GetThickness(mysql);
1335  re->m_LongZsize = cc->GetThickness(mysql);
1336  re->m_RlengthUpToMaxWidth = cc->maxwdy;
1337  re->m_excent = cc->excent;
1338 
1339  // Csc features specific to this readout element
1340  std::string tname = cc->name;
1341  re->setTechnologyName(tname);
1342 
1343  if (ip.isAssigned) {
1344  re->setStationS(ip.shift);
1345  } else {
1346  ATH_MSG_ERROR( " MuonChamber::setCscReadoutGeom: position not found " );
1347  assert(0);
1348  }
1349 
1350  const CSC *thisc = dynamic_cast<const CSC*>(mysql.GetTechnology(tname));
1351  re->m_anodecathode_distance = thisc->anocathodist;
1352  re->m_ngasgaps = thisc->numOfLayers;
1353  re->m_nstriplayers = thisc->numOfLayers;
1354  re->m_nwirelayers = thisc->numOfLayers;
1355  re->m_roxacellwidth = thisc->roxacellwith;
1356  re->m_nEtastripsperlayer = thisc->nEtastrips;
1357  re->m_nPhistripsperlayer = thisc->nPhistrips;
1358  re->m_Etastrippitch = thisc->cathreadoutpitch;
1359  re->m_Phistrippitch = thisc->phireadoutpitch;
1360  re->m_Etastripwidth = re->m_Etastrippitch;
1361  re->m_Phistripwidth = re->m_Phistrippitch;
1362  }

◆ setFineClashFixingFlag()

void MuonGM::MuonChamber::setFineClashFixingFlag ( int  value)

◆ setFPVMAP()

void MuonGM::MuonChamber::setFPVMAP ( FPVMAP fpvmap)

Definition at line 1565 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1565 { m_FPVMAP = fpvmap; }

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level  lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29 {
30  m_lvl = lvl;
31 }

◆ setLogVolName()

void MuonGM::DetectorElement::setLogVolName ( const std::string &  str)
inlineinherited

Definition at line 22 of file DetectorElement.h.

22 { logVolName = str; }

◆ setMdtReadoutGeom()

void MuonGM::MuonChamber::setMdtReadoutGeom ( const MYSQL mysql,
MdtReadoutElement re,
const MdtComponent cc,
const Position p 
)
private

Definition at line 1364 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1365  {
1366 
1367  re->m_Ssize = cc->dx1;
1368  re->m_LongSsize = cc->dx2;
1369 
1370  if (re->m_inBarrel) {
1371  re->m_Rsize = cc->GetThickness(mysql);
1372  re->m_LongRsize = cc->GetThickness(mysql);
1373  re->m_Zsize = cc->dy;
1374  re->m_LongZsize = cc->dy;
1375  } else {
1376  re->m_Rsize = cc->dy;
1377  re->m_LongRsize = cc->dy;
1378  re->m_Zsize = cc->GetThickness(mysql);
1379  re->m_LongZsize = cc->GetThickness(mysql);
1380  }
1381 
1382  re->m_cutoutShift = cc->cutoutTubeXShift;
1383  re->m_tubelenStepSize = cc->tubelenStepSize;
1384 
1385  if (ip.isAssigned) {
1386  re->setStationS(ip.shift);
1387  } else {
1388  ATH_MSG_ERROR( " MuonChamber::setMdtReadoutGeom: position not found " );
1389  assert(0);
1390  }
1391 
1392  std::string tname = cc->name;
1393  re->setTechnologyName(tname);
1394  const MDT *thism = dynamic_cast<const MDT*>(mysql.GetTechnology(tname));
1395  re->m_nlayers = thism->numOfLayers;
1396  re->m_tubepitch = thism->pitch;
1397  re->m_tubelayerpitch = thism->y[1] - thism->y[0];
1398  re->m_endpluglength = thism->tubeEndPlugLength;
1399  re->m_deadlength = cc->deadx; // thism->tubeDeadLength;
1400  re->m_innerRadius = thism->innerRadius;
1401  re->m_tubeWallThickness = thism->tubeWallThickness;
1402 
1403  if (re->m_inBarrel) {
1404  re->m_ntubesperlayer = int(re->m_Zsize / re->m_tubepitch);
1405  re->m_nsteps = 1; // all tubes have the same length
1406  re->m_ntubesinastep = re->m_ntubesperlayer;
1407  re->m_tubelength[0] = re->m_Ssize;
1408  } else {
1409  re->m_ntubesperlayer = int(re->m_Rsize / re->m_tubepitch);
1410  re->m_nsteps = int(re->m_Rsize / re->m_tubelenStepSize);
1411  re->m_ntubesinastep = int(re->m_tubelenStepSize / re->m_tubepitch);
1412  re->m_tubelength[0] = re->m_Ssize;
1413  double diff = (re->m_LongSsize - re->m_Ssize) * (re->m_LongRsize - re->m_tubepitch / 2.) / re->m_LongRsize;
1414  for (int is = 0; is < re->m_nsteps; ++is) {
1415  double len = re->m_Ssize + is * diff / re->m_nsteps;
1416  re->m_tubelength[is] = len;
1417  }
1418  }
1419 
1420  for (int tl = 0; tl < re->m_nlayers; ++tl) {
1421  re->m_firstwire_x[tl] = thism->x[tl];
1422  re->m_firstwire_y[tl] = thism->y[tl];
1423  }
1424  }

◆ setRpcReadoutGeom()

void MuonGM::MuonChamber::setRpcReadoutGeom ( const MYSQL mysql,
RpcReadoutElement re,
const RpcComponent cc,
const Position p 
)
private

the values from MuonGeoModel have an offset of 0.74, TO BE INVESTIGATED, cf. ATLASSIM-5021 On the other hand this detector has never sent any good data. So the investigation doesn't really matter

Definition at line 1426 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1429  {
1430  re->m_Ssize = cc->dx1;
1431  re->m_LongSsize = cc->dx2;
1432  re->m_Rsize = cc->GetThickness(mysql);
1433  re->m_LongRsize = cc->GetThickness(mysql);
1434  re->m_Zsize = cc->dy;
1435  re->m_LongZsize = cc->dy;
1436 
1437  re->m_hasDEDontop = true;
1438  if (cc->iswap == -1)
1439  re->m_hasDEDontop = false;
1440 
1441  if (ip.isAssigned) {
1442  re->setStationS(ip.shift);
1443  } else {
1444  ATH_MSG_ERROR( " MuonChamber::setRpcReadoutGeom: position not found " );
1445  assert(0);
1446  }
1447 
1448  std::string tname = cc->name;
1449  re->setTechnologyName(tname);
1450  const RPC *thisr = dynamic_cast<const RPC*>(mysql.GetTechnology(tname));
1451  re->m_nphigasgaps = thisr->NGasGaps_in_s;
1452  re->m_gasgapssize = re->m_Ssize / re->m_nphigasgaps - 2. * thisr->bakeliteframesize;
1453  re->m_gasgapzsize = re->m_Zsize - 2. * thisr->bakeliteframesize;
1454  re->m_nphistrippanels = thisr->NstripPanels_in_s;
1455  re->m_phistrippitch = thisr->stripPitchS;
1456  re->m_etastrippitch = thisr->stripPitchZ;
1457 
1458  if (re->getStationName().find("BI") != std::string::npos) {
1459  re->setNumberOfLayers(3); // all BI RPCs always have 3 gas gaps
1460 
1461  }
1462  const RPC* genericRpc = dynamic_cast<const RPC*>(mysql.GetATechnology("RPC0"));
1463 
1464  if (re->numberOfLayers() == 3) {
1465  constexpr double rpc3GapLayerThickness = 11.8; // gas vol. + ( bakelite + graphite + PET )x2
1466  for (int gasGap =1 ; gasGap <= re->numberOfLayers(); ++gasGap) {
1469  re->m_gasGap_xPos[gasGap -1] = (gasGap - 2) * rpc3GapLayerThickness - 0.74;
1470  }
1471  } else {
1472  re->m_gasGap_xPos[0] = -re->m_Rsize / 2. + thisr->externalSupPanelThickness + genericRpc->stripPanelThickness
1473  + genericRpc->GasGapThickness / 2;
1474  re->m_gasGap_xPos[1] = re->m_gasGap_xPos[0] + genericRpc->rpcLayerThickness +
1475  genericRpc->centralSupPanelThickness;
1476  if (!re->m_hasDEDontop) {
1477  std::swap(re->m_gasGap_xPos[0], re->m_gasGap_xPos[1]);
1478  }
1479  }
1480 
1481  re->m_phistripwidth = re->m_phistrippitch - genericRpc->stripSeparation;
1482  re->m_etastripwidth = re->m_etastrippitch - genericRpc->stripSeparation;
1483  re->m_nphistripsperpanel = int((re->m_Ssize / re->m_nphistrippanels) / re->m_phistrippitch);
1484  if (re->getStationName().compare(0, 3, "BME") != 0) {
1485  re->m_nphistripsperpanel-=(re->m_nphistripsperpanel % 8) ;
1486  }
1487  re->m_netastripsperpanel = int((re->m_Zsize) / re->m_etastrippitch);
1488  re->m_netastripsperpanel -= (re->m_netastripsperpanel % 8);
1489 
1490  re->m_phipaneldead = re->m_Ssize / re->m_nphistrippanels -
1491  re->m_nphistripsperpanel * re->m_phistrippitch +
1492  genericRpc->stripSeparation;
1493  re->m_phipaneldead = re->m_phipaneldead / 2.;
1494  re->m_etapaneldead = re->m_Zsize - re->m_netastripsperpanel * re->m_etastrippitch + genericRpc->stripSeparation;
1495  re->m_etapaneldead = re->m_etapaneldead / 2.;
1496  re->m_phistriplength = re->m_LongZsize;
1497  re->m_etastriplength = re->m_LongSsize / re->m_nphistrippanels;
1498 
1499  re->m_first_phistrip_s[0] = -re->m_Ssize / 2. + re->m_phipaneldead + re->m_phistripwidth / 2.;
1500  if (re->m_nphistrippanels == 2) {
1501  re->m_first_phistrip_s[1] = re->m_phipaneldead + re->m_phistripwidth / 2.;
1502  }
1503 
1504  double offset = 0.;
1505  re->m_phistrip_z = -re->m_Zsize / 2. + offset + re->m_phistriplength / 2.;
1506 
1507  // first strip position on each eta panel
1508  re->m_first_etastrip_z = -re->m_Zsize / 2. + re->m_etapaneldead + re->m_etastripwidth / 2.;
1509  re->m_etastrip_s[0] = -re->m_Ssize / 2. + offset + re->m_etastriplength / 2.;
1510  if (re->m_nphistrippanels == 2) {
1511  re->m_etastrip_s[1] = re->m_Ssize / 2. - offset - re->m_etastriplength / 2.;
1512  }
1513  }

◆ setTgcReadoutGeom()

void MuonGM::MuonChamber::setTgcReadoutGeom ( const MYSQL mysql,
TgcReadoutElement re,
const TgcComponent cc,
const Position p,
const std::string &  statname 
)
private

Definition at line 1515 of file MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx.

1519  {
1520 
1521  re->setSsize(cc->dx1);
1522  re->setLongSsize(cc->dx2);
1523  re->setRsize(cc->dy);
1524  re->setLongRsize(cc->dy);
1525  re->setZsize(cc->GetThickness(mysql));
1526  re->setLongZsize(cc->GetThickness(mysql));
1527 
1528  const TGC *genericTgc = dynamic_cast<const TGC*>(mysql.GetATechnology("TGC0"));
1529  re->setFrameThickness(genericTgc->frame_h,
1530  genericTgc->frame_ab);
1531 
1532 
1533  const std::string &tname = cc->name;
1534  int tname_index = MuonGM::strtoint(tname, 3, 2);
1535  re->setTechnologyName(tname);
1536 
1537  if (ip.isAssigned) {
1538  re->setStationS(ip.shift);
1539  } else {
1540  throw std::runtime_error(" MuonChamberLite::setTgcReadoutGeom position not found ");
1541  }
1542 
1543  char index[2];
1544  sprintf(index, "%i", cc->index);
1545 
1546  re->setReadOutName(stName.substr(0, 4) + '_' + index);
1547  re->setReadOutParams(mysql.GetTgcRPars(tname_index));
1548 
1549  const TGC *thist = dynamic_cast<const TGC*>(mysql.GetTechnology(tname));
1550  const std::size_t ncomp = (thist->materials).size();
1551 
1552  unsigned int gasGap{0};
1553  for (std::size_t i = 0; i < ncomp; ++i) {
1554  double newpos = -re->getZsize() / 2. + thist->positions[i] + thist->tck[i] / 2.;
1555  if ( thist->materials[i].find("TGCGas") != std::string::npos) {
1556  re->setPlaneZ(newpos, ++gasGap);
1557  }
1558  }
1559  }

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging)

Definition at line 141 of file AthMessaging.h.

◆ length

double MuonGM::MuonChamber::length {0.}

◆ logVolName

std::string MuonGM::DetectorElement::logVolName {}
inherited

Definition at line 18 of file DetectorElement.h.

◆ longWidth

double MuonGM::MuonChamber::longWidth {0.}

◆ m_enableFineClashFixing

int MuonGM::MuonChamber::m_enableFineClashFixing {0}
private

◆ m_FPVMAP

FPVMAP* MuonGM::MuonChamber::m_FPVMAP = nullptr
private

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels)

Definition at line 132 of file AthMessaging.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_station

Station* MuonGM::MuonChamber::m_station {nullptr}
private

◆ name

std::string MuonGM::DetectorElement::name {}
inherited

Definition at line 17 of file DetectorElement.h.

◆ rotangle

std::array<double, 10> MuonGM::MuonChamber::rotangle {}

◆ thickness

double MuonGM::MuonChamber::thickness {0.}

◆ width

double MuonGM::MuonChamber::width {0.}

The documentation for this class was generated from the following files:
MuonGM::Station::hasMdts
bool hasMdts() const
Definition: Station.h:88
AthMessaging::m_lvl
std::atomic< MSG::Level > m_lvl
Current logging level.
Definition: AthMessaging.h:138
plotting.yearwise_luminosity_vs_mu.comp
comp
Definition: yearwise_luminosity_vs_mu.py:24
MuonIdHelper::stationNameIndex
int stationNameIndex(const std::string &name) const
Definition: MuonIdHelper.cxx:846
beamspotman.r
def r
Definition: beamspotman.py:676
Muon::nsw::STGTPSegments::moduleIDBits::stationPhi
constexpr uint8_t stationPhi
station Phi 1 to 8
Definition: NSWSTGTPDecodeBitmaps.h:129
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
MuonGM::DetectorElement::name
std::string name
Definition: DetectorElement.h:17
egammaParameters::depth
@ depth
pointing depth of the shower as calculated in egammaqgcld
Definition: egammaParamDefs.h:276
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MuonGM::Station::GetExtraBottomThickness
double GetExtraBottomThickness() const
Definition: Station.cxx:155
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TgcIdHelper
Definition: TgcIdHelper.h:50
MuonGM::Station::getAmdbOrigine_along_thickness
double getAmdbOrigine_along_thickness(const MYSQL &mysql) const
Definition: Station.cxx:558
MuonGM::MuonChamber::setTgcReadoutGeom
void setTgcReadoutGeom(const MYSQL &mysql, TgcReadoutElement *re, const TgcComponent *cc, const Position &p, const std::string &statname)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1515
index
Definition: index.py:1
hist_file_dump.d
d
Definition: hist_file_dump.py:137
MuonGM::MuonChamber::m_station
Station * m_station
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:58
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
MuonGM::MuonChamber::width
double width
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:32
createCablingJSON.doubletR
int doubletR
Definition: createCablingJSON.py:10
deg
#define deg
Definition: SbPolyhedron.cxx:17
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
MuonGM::MuonChamber::setCscReadoutGeom
void setCscReadoutGeom(const MYSQL &mysql, CscReadoutElement *re, const CscComponent *cc, const Position &p)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1327
athena.value
value
Definition: athena.py:122
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
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
AthMessaging::m_imsg
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
Definition: AthMessaging.h:135
python.SystemOfUnits.ms
int ms
Definition: SystemOfUnits.py:132
RpcIdHelper
Definition: RpcIdHelper.h:51
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
keylayer_zslicemap.strip
strip
Definition: keylayer_zslicemap.py:151
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
RPCON
#define RPCON
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:70
MuonGM::SupComponent::xAMDB0
static double xAMDB0(const MYSQL &mysql, const StandardComponent &c)
Definition: SupComponent.cxx:12
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
MuonGM::MuonChamber::m_enableFineClashFixing
int m_enableFineClashFixing
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:59
MuonGM::Component::dy
double dy
Definition: Component.h:21
MuonGM::MuonChamber::setMdtReadoutGeom
void setMdtReadoutGeom(const MYSQL &mysql, MdtReadoutElement *re, const MdtComponent *cc, const Position &p)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1364
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
lumiFormat.i
int i
Definition: lumiFormat.py:92
TGC
Definition: TgcBase.h:6
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
angle
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Definition: TRTDetectorFactory_Full.cxx:73
WritePulseShapeToCool.det
det
Definition: WritePulseShapeToCool.py:204
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonGM::Station::getAmdbOrigine_along_length
double getAmdbOrigine_along_length() const
Definition: Station.cxx:553
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
MdtIdHelper
Definition: MdtIdHelper.h:61
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:127
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
find_tgc_unfilled_channelids.ip
ip
Definition: find_tgc_unfilled_channelids.py:3
MuonGM::Station::GetExtraTopThickness
double GetExtraTopThickness() const
Definition: Station.cxx:151
MuonGM::MuonChamber::longWidth
double longWidth
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:35
MuonGM::Station::GetName
std::string GetName() const
Definition: Station.cxx:110
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
AthMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AthMessaging.h:164
useAssemblies
#define useAssemblies
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:71
MuonGM::SupComponent::yAMDB0
static double yAMDB0(const MYSQL &mysql, const StandardComponent &c)
Definition: SupComponent.cxx:16
RPC
@ RPC
Definition: RegSelEnums.h:32
CscIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int chamberLayer, int wireLayer, int measuresPhi, int strip) const
Definition: CscIdHelper.cxx:706
MdtIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
Definition: MdtIdHelper.cxx:659
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonGM::MuonChamber::m_FPVMAP
FPVMAP * m_FPVMAP
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:61
MuonGM::SupComponent::zAMDB0
static double zAMDB0(const MYSQL &mysql, const StandardComponent &c)
Definition: SupComponent.cxx:20
MuonGM::Station::GetNrOfCutouts
int GetNrOfCutouts() const
Definition: Station.cxx:324
MuonGM::strtoint
int strtoint(std::string_view str, unsigned int istart, unsigned int length)
Definition: GlobalUtilities.cxx:37
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
DeMoScan.index
string index
Definition: DeMoScan.py:362
CalibCoolCompareRT.nm
nm
Definition: CalibCoolCompareRT.py:110
python.CaloScaleNoiseConfig.str
str
Definition: CaloScaleNoiseConfig.py:78
MuonGM::Station::GetNrOfComponents
int GetNrOfComponents() const
Definition: Station.cxx:322
CscIdHelper
Definition: CscIdHelper.h:52
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
AthMessaging::m_nm
std::string m_nm
Message source name.
Definition: AthMessaging.h:129
re
const boost::regex re(r_e)
MuonGM::MuonChamber::thickness
double thickness
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:34
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
MuonGM::stationPhiTGC
int stationPhiTGC(std::string_view stName, int fi, int zi_input)
Converts the AMDB phi index to the Identifier phi Index.
Definition: GlobalUtilities.cxx:44
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
checkFileSG.fi
fi
Definition: checkFileSG.py:65
MuonGM::Station::GetCutout
Cutout * GetCutout(int i) const
Definition: Station.cxx:85
createCablingJSON.doubletPhi
int doubletPhi
Definition: createCablingJSON.py:11
TgcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int gasGap, int isStrip, int channel) const
Definition: TgcIdHelper.cxx:583
MuonGM::DetectorElement::logVolName
std::string logVolName
Definition: DetectorElement.h:18
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
dqt_zlumi_alleff_HIST.tl
tl
Definition: dqt_zlumi_alleff_HIST.py:73
CSC
@ CSC
Definition: RegSelEnums.h:34
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
AthMessaging::initMessaging
void initMessaging() const
Initialize our message level and MessageSvc.
Definition: AthMessaging.cxx:39
MuonGM::FPVMAP::GetDetector
GeoVPhysVol * GetDetector(const std::string &name)
Definition: FPVMAP.cxx:17
Muon::nsw::STGTPSegments::moduleIDBits::stationEta
constexpr uint8_t stationEta
1 to 3
Definition: NSWSTGTPDecodeBitmaps.h:127
rp
ReadCards * rp
Definition: IReadCards.cxx:26
AthMessaging::m_msg_tls
boost::thread_specific_ptr< MsgStream > m_msg_tls
MsgStream instance (a std::cout like with print-out levels)
Definition: AthMessaging.h:132
MuonGM::buildString
std::string buildString(int i, int ncha)
Definition: GlobalUtilities.cxx:23
MuonGM::Station::GetComponent
Component * GetComponent(int i) const
Definition: Station.cxx:83
MuonGM::Station::mdtHalfPitch
double mdtHalfPitch(const MYSQL &mysql) const
Definition: Station.cxx:343
python.compressB64.c
def c
Definition: compressB64.py:93
MuonGM::FPVMAP::StoreDetector
void StoreDetector(GeoVPhysVol *s, const std::string &name)
Definition: FPVMAP.cxx:27
MuonGM::MuonChamber::setRpcReadoutGeom
void setRpcReadoutGeom(const MYSQL &mysql, RpcReadoutElement *re, const RpcComponent *cc, const Position &p)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1426
calibdata.tube
tube
Definition: calibdata.py:31
MuonGM::DetectorElement::DetectorElement
DetectorElement(const std::string &n)
Definition: DetectorElement.h:20
MDT
@ MDT
Definition: RegSelEnums.h:31
python.handimod.cc
int cc
Definition: handimod.py:523
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
MuonGM::MuonChamber::length
double length
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:33