ATLAS Offline Software
MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "MuonGeoModel/Csc.h"
7 #include "MuonGeoModel/Cutout.h"
8 #include "MuonGeoModel/Ded.h"
9 #include "MuonGeoModel/FPVMAP.h"
10 #include "MuonGeoModel/Mdt.h"
12 #include "MuonGeoModel/Position.h"
13 #include "MuonGeoModel/Rpc.h"
14 #include "MuonGeoModel/Spacer.h"
16 #include "MuonGeoModel/Station.h"
17 #include "MuonGeoModel/Tgc.h"
21 //
34 
35 // just to check subtype, cutout:
39 #include "MuonGeoModel/MYSQL.h"
42 //
47 //
48 #include "GaudiKernel/SystemOfUnits.h"
49 #include "GeoModelKernel/GeoBox.h"
50 #include "GeoModelKernel/GeoDefinitions.h"
51 #include "GeoModelKernel/GeoFullPhysVol.h"
52 #include "GeoModelKernel/GeoIdentifierTag.h"
53 #include "GeoModelKernel/GeoLogVol.h"
54 #include "GeoModelKernel/GeoMaterial.h"
55 #include "GeoModelKernel/GeoNameTag.h"
56 #include "GeoModelKernel/GeoPhysVol.h"
57 #include "GeoModelKernel/GeoSerialDenominator.h"
58 #include "GeoModelKernel/GeoShapeIntersection.h"
59 #include "GeoModelKernel/GeoShapeShift.h"
60 #include "GeoModelKernel/GeoShapeSubtraction.h"
61 #include "GeoModelKernel/GeoShapeUnion.h"
62 #include "GeoModelKernel/GeoTransform.h"
63 #include "GeoModelKernel/GeoTrd.h"
64 #include "GeoModelKernel/GeoTube.h"
65 
66 #include <fstream>
67 #include <iomanip>
68 #include <vector>
69 
70 #define RPCON true
71 #define useAssemblies false
72 
73 namespace {
74  // const maps holding the y/z translation for BIS RPCs (since they cannot be parsed by amdb)
75  const std::map<std::string, float> rpcYTrans = {
76  std::make_pair<std::string, float>("RPC26", -9.1), // big RPC7
77  std::make_pair<std::string, float>("RPC27", -9.1), // small RPC7
78  std::make_pair<std::string, float>("RPC28", -27.7), // big RPC8
79  std::make_pair<std::string, float>("RPC29", -8.8), // small RPC8
80  };
81  const std::map<std::string, float> rpcZTrans = {
82  std::make_pair<std::string, float>("RPC26", 3.22), // big RPC7
83  std::make_pair<std::string, float>("RPC27", 3.06), // small RPC7
84  std::make_pair<std::string, float>("RPC28", 3.11), // big RPC8
85  std::make_pair<std::string, float>("RPC29", 3.11), // small RPC8
86  };
87 } // namespace
88 
89 namespace MuonGM {
90 
91  // cutouts for BMS at eta=+-1 and phi=4 (RPC/DED/MDT) ok //16 tubes shorter + entire RPC and DED (of dbz1) narrower
92 
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  }
108 
109  GeoVPhysVol *MuonChamber::build(StoredMaterialManager& matManager,
110  const MYSQL& mysql,
111  MuonDetectorManager *manager, int zi, int fi, bool is_mirrored, bool &isAssembly) {
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++) {
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--) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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++) {
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") {
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:
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") {
907  irad = tgInner->posy;
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()) {
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 
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)
1082  stationEta = -stationEta;
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  }
1326 
1328  CscReadoutElement *re, const CscComponent *cc, const Position &ip) {
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  }
1363 
1365  MdtReadoutElement *re, const MdtComponent *cc, const Position &ip) {
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  }
1425 
1428  const RpcComponent *cc,
1429  const Position &ip) {
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  }
1514 
1517  const TgcComponent *cc,
1518  const Position &ip,
1519  const std::string& stName) {
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  }
1560 
1561  void MuonChamber::print() const {
1562  ATH_MSG_INFO( "MuonChamber " << name << " :" );
1563  }
1565  void MuonChamber::setFPVMAP(FPVMAP *fpvmap) { m_FPVMAP = fpvmap; }
1566 
1567 
1568 } // namespace MuonGM
CscIdHelper.h
MuonGM::CbmComponent::lb_width
double lb_width
Definition: CbmComponent.h:16
MuonGM::CbmComponent::hole_pos1
double hole_pos1
Definition: CbmComponent.h:17
MuonGM::Station::hasMdts
bool hasMdts() const
Definition: Station.h:88
MuonGM::MuonChamber::setFineClashFixingFlag
void setFineClashFixingFlag(int value)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1564
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
MuonGM::RPC::bakeliteframesize
double bakeliteframesize
Definition: RPC_Technology.h:47
MuonGM::MYSQL::GetTechnology
Technology * GetTechnology(const std::string &name)
Definition: MYSQL.cxx:105
MuonGM::MuonChamber::print
virtual void print() const override
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1561
MdtReadoutElement.h
MuonGM::TGC::materials
std::vector< std::string > materials
Definition: TGC_Technology.h:20
MuonGM::StandardComponent::index
int index
Definition: StandardComponent.h:27
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
MuonGM::DetectorElement::name
std::string name
Definition: DetectorElement.h:17
MuonGM
Ensure that the Athena extensions are properly loaded.
Definition: GeoMuonHits.h:27
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
MuonGM::TgcComponent
Definition: TgcComponent.h:14
MuonGM::CSC::phireadoutpitch
double phireadoutpitch
Definition: CSC_Technology.h:38
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CscComponent.h
MuonGM::Station::GetExtraBottomThickness
double GetExtraBottomThickness() const
Definition: Station.cxx:155
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
MuonGM::CbmComponent
Definition: CbmComponent.h:12
MuonGM::MYSQL::allocPosFindSubtype
int allocPosFindSubtype(const std::string &statType, int fi, int zi) const
Definition: MYSQL.cxx:196
MuonGM::TGC::frame_ab
double frame_ab
Definition: TGC_Technology.h:19
TgcIdHelper
Definition: TgcIdHelper.h:50
MuonGM::Station::getAmdbOrigine_along_thickness
double getAmdbOrigine_along_thickness(const MYSQL &mysql) const
Definition: Station.cxx:558
MuonGM::StandardComponent::GetThickness
double GetThickness(const MYSQL &mysql) const
Definition: StandardComponent.cxx:27
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
MuonGM::TGC::tck
std::vector< double > tck
Definition: TGC_Technology.h:22
Rpc.h
Spacer.h
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
FPVMAP.h
MuonGM::Cutout::dx
double dx
Definition: Cutout.h:23
MuonGM::MuonChamber::width
double width
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:32
MuonGM::Station
Definition: Station.h:40
createCablingJSON.doubletR
int doubletR
Definition: createCablingJSON.py:10
MuonGM::MDT::tubeEndPlugLength
double tubeEndPlugLength
Definition: MDT_Technology.h:22
MuonGM::RPC::stripPitchS
double stripPitchS
Definition: RPC_Technology.h:64
deg
#define deg
Definition: SbPolyhedron.cxx:17
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
MuonGM::MDT::numOfLayers
int numOfLayers
Definition: MDT_Technology.h:17
MuonGM::MYSQL
Definition: MYSQL.h:43
MuonGM::CscComponent
Definition: CscComponent.h:11
MuonGM::RPC::NGasGaps_in_s
int NGasGaps_in_s
Definition: RPC_Technology.h:43
MuonGM::RpcReadoutElement
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/RpcReadoutElement.h:54
Csc.h
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
MuonGM::MDT::tubeWallThickness
double tubeWallThickness
Definition: MDT_Technology.h:23
MuonGM::CscReadoutElement
Definition: CscReadoutElement.h:56
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
MuonGM::MYSQL::allocPosFindCutout
int allocPosFindCutout(const std::string &statType, int fi, int zi) const
Definition: MYSQL.cxx:201
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
MuonGM::LBI
Definition: LBI_Technology.h:13
MuonGM::MYSQL::GetStationPosition
Position GetStationPosition(const std::string &nameType, int fi, int zi) const
Definition: MYSQL.cxx:71
MuonGM::MuonChamber::MuonChamber
MuonChamber(const MYSQL &mysql, Station *s)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:93
MuonGM::CSC::roxacellwith
double roxacellwith
Definition: CSC_Technology.h:29
RpcIdHelper
Definition: RpcIdHelper.h:51
MuonGM::DetectorElement
Definition: DetectorElement.h:15
MuonGM::StandardComponent
Definition: StandardComponent.h:15
RpcIdHelper.h
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
MuonGM::CbmComponent::lb_height
double lb_height
Definition: CbmComponent.h:15
RPCON
#define RPCON
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:70
Ded.h
Station.h
MuonGM::CSC
Definition: CSC_Technology.h:13
MuonGM::CSC::anocathodist
double anocathodist
Definition: CSC_Technology.h:23
MuonGM::CSC::nEtastrips
int nEtastrips
Definition: CSC_Technology.h:39
MuonGM::RPC::GasGapThickness
double GasGapThickness
Definition: RPC_Technology.h:45
MuonGM::SupComponent::xAMDB0
static double xAMDB0(const MYSQL &mysql, const StandardComponent &c)
Definition: SupComponent.cxx:12
MuonGM::MDT
Definition: MDT_Technology.h:15
TgcComponent.h
MuonGM::TGC::frame_h
double frame_h
Definition: TGC_Technology.h:18
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
GeoPrimitives.h
MuonGM::MuonChamber::m_enableFineClashFixing
int m_enableFineClashFixing
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:59
MuonGM::MdtComponent
Definition: MdtComponent.h:12
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
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
MuonGM::Position
Definition: Position.h:11
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:50
StandardComponent.h
CbmComponent.h
lumiFormat.i
int i
Definition: lumiFormat.py:92
MuonGM::LbiComponent
Definition: LbiComponent.h:12
TGC
Definition: TgcBase.h:6
MuonGM::CbmComponent::hole_pos2
double hole_pos2
Definition: CbmComponent.h:18
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
MuonGM::FPVMAP
Definition: FPVMAP.h:17
angle
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Definition: TRTDetectorFactory_Full.cxx:73
MuonGM::MDT::y
std::array< double, 4 > y
Definition: MDT_Technology.h:25
MuonGM::RpcComponent
Definition: RpcComponent.h:12
WritePulseShapeToCool.det
det
Definition: WritePulseShapeToCool.py:204
Cutout.h
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
RPC_Technology.h
MuonGM::MuonStation
Definition: MuonStation.h:51
MuonGM::Station::getAmdbOrigine_along_length
double getAmdbOrigine_along_length() const
Definition: Station.cxx:553
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
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
MuonGM::Cutout::dy
double dy
Definition: Cutout.h:24
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
MdtIdHelper.h
find_tgc_unfilled_channelids.ip
ip
Definition: find_tgc_unfilled_channelids.py:3
MuonGM::Station::GetExtraTopThickness
double GetExtraTopThickness() const
Definition: Station.cxx:151
SpacerBeam.h
MuonGM::MuonChamber::longWidth
double longWidth
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:35
MuonGM::CSC::cathreadoutpitch
double cathreadoutpitch
Definition: CSC_Technology.h:37
MuonGM::RPC::centralSupPanelThickness
double centralSupPanelThickness
Definition: RPC_Technology.h:28
MuonGM::MDT::innerRadius
double innerRadius
Definition: MDT_Technology.h:19
MuonGM::Station::GetName
std::string GetName() const
Definition: Station.cxx:110
CSC_Technology.h
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
GlobalUtilities.h
useAssemblies
#define useAssemblies
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:71
LBI_Technology.h
MYSQL.h
MuonGM::StandardComponent::posy
double posy
Definition: StandardComponent.h:20
MuonGM::SupComponent::yAMDB0
static double yAMDB0(const MYSQL &mysql, const StandardComponent &c)
Definition: SupComponent.cxx:16
MuonGM::TGC::positions
std::vector< double > positions
Definition: TGC_Technology.h:21
CscIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int chamberLayer, int wireLayer, int measuresPhi, int strip) const
Definition: CscIdHelper.cxx:706
MuonGM::MuonChamber::build
GeoVPhysVol * build(StoredMaterialManager &matManager, const MYSQL &mysql, MuonDetectorManager *manager, int ieta, int iphi, bool is_mirrored, bool &isAssembly)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:109
MdtIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
Definition: MdtIdHelper.cxx:659
MuonGM::CSC::numOfLayers
int numOfLayers
Definition: CSC_Technology.h:16
LbiComponent.h
MuonGM::MDT::x
std::array< double, 4 > x
Definition: MDT_Technology.h:26
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
MuonDetectorManager.h
MDT_Technology.h
MuonGM::RPC::stripPitchZ
double stripPitchZ
Definition: RPC_Technology.h:65
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
Position.h
MuonGM::RPC::externalSupPanelThickness
double externalSupPanelThickness
Definition: RPC_Technology.h:19
Mdt.h
DeMoScan.index
string index
Definition: DeMoScan.py:362
CalibCoolCompareRT.nm
nm
Definition: CalibCoolCompareRT.py:110
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
MuonGM::Station::GetNrOfComponents
int GetNrOfComponents() const
Definition: Station.cxx:322
MuonGM::RPC::rpcLayerThickness
double rpcLayerThickness
Definition: RPC_Technology.h:34
CscIdHelper
Definition: CscIdHelper.h:52
MuonGM::RPC::stripPanelThickness
double stripPanelThickness
Definition: RPC_Technology.h:67
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:49
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
re
const boost::regex re(r_e)
MuonGM::MuonChamber::thickness
double thickness
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:34
MuonGM::MYSQL::GetATechnology
const Technology * GetATechnology(const std::string &name) const
Definition: MYSQL.cxx:162
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
MuonChamber.h
MuonGM::RPC
Definition: RPC_Technology.h:14
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
MuonGM::Cutout::lengthY
double lengthY
Definition: Cutout.h:27
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
checkFileSG.fi
fi
Definition: checkFileSG.py:65
MuonGM::Station::GetCutout
Cutout * GetCutout(int i) const
Definition: Station.cxx:85
MuonGM::MYSQL::GetTgcRPars
GeoModel::TransientConstSharedPtr< TgcReadoutParams > GetTgcRPars(const std::string &name) const
Definition: MYSQL.cxx:88
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
TgcReadoutElement.h
TgcIdHelper.h
MuonGM::RPC::NstripPanels_in_s
int NstripPanels_in_s
Definition: RPC_Technology.h:60
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
RpcComponent.h
dqt_zlumi_alleff_HIST.tl
tl
Definition: dqt_zlumi_alleff_HIST.py:73
TGC_Technology.h
MdtComponent.h
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
MuonGM::FPVMAP::GetDetector
GeoVPhysVol * GetDetector(const std::string &name)
Definition: FPVMAP.cxx:17
rp
ReadCards * rp
Definition: IReadCards.cxx:26
MuonGM::MDT::pitch
double pitch
Definition: MDT_Technology.h:18
MuonStation.h
MuonGM::Cutout
Definition: Cutout.h:14
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
MuonGM::RPC::stripSeparation
double stripSeparation
Definition: RPC_Technology.h:66
python.compressB64.c
def c
Definition: compressB64.py:93
MuonGM::FPVMAP::StoreDetector
void StoreDetector(GeoVPhysVol *s, const std::string &name)
Definition: FPVMAP.cxx:27
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
MuonGM::LbiComponent::associated_CMIsubtype
std::string associated_CMIsubtype
Definition: LbiComponent.h:14
MuonGM::MuonChamber::setRpcReadoutGeom
void setRpcReadoutGeom(const MYSQL &mysql, RpcReadoutElement *re, const RpcComponent *cc, const Position &p)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1426
SupComponent.h
calibdata.tube
tube
Definition: calibdata.py:31
Tgc.h
python.handimod.cc
int cc
Definition: handimod.py:523
MuonGM::MuonChamber::setFPVMAP
void setFPVMAP(FPVMAP *fpvmap)
Definition: MuonDetDescr/MuonGeoModel/src/MuonChamber.cxx:1565
MuonGM::CSC::nPhistrips
int nPhistrips
Definition: CSC_Technology.h:40
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
MuonGM::StandardComponent::posz
double posz
Definition: StandardComponent.h:21
RpcReadoutElement.h
MuonGM::MuonChamber::length
double length
Definition: MuonDetDescr/MuonGeoModel/MuonGeoModel/MuonChamber.h:33