ATLAS Offline Software
MuonChamberLite.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 "GaudiKernel/MsgStream.h"
7 //
9 #include "MuonGeoModel/Csc.h"
10 #include "MuonGeoModel/Cutout.h"
11 #include "MuonGeoModel/Ded.h"
12 #include "MuonGeoModel/Mdt.h"
14 #include "MuonGeoModel/Position.h"
15 #include "MuonGeoModel/Rpc.h"
16 #include "MuonGeoModel/Spacer.h"
18 #include "MuonGeoModel/Station.h"
19 #include "MuonGeoModel/Tgc.h"
22 //
35 
36 // just to check subtype, cutout:
40 #include "MuonGeoModel/MYSQL.h"
43 //
48 //
49 #include "GaudiKernel/SystemOfUnits.h"
50 #include "GeoModelKernel/GeoDefinitions.h"
51 
52 
53 #include <fstream>
54 #include <iomanip>
55 #include <vector>
56 #include <stdexcept>
57 #include <set>
58 
59 #define RPCON true
60 #define useAssemblies false
61 namespace {
62  // const maps holding the y/z translation for BIS RPCs (since they cannot be parsed by amdb)
63  const std::map<std::string, float> rpcYTrans = {
64  std::make_pair<std::string, float>("RPC26", -9.1), // big RPC7
65  std::make_pair<std::string, float>("RPC27", -9.1), // small RPC7
66  std::make_pair<std::string, float>("RPC28", -27.7), // big RPC8
67  std::make_pair<std::string, float>("RPC29", -8.8), // small RPC8
68  };
69  const std::map<std::string, float> rpcZTrans = {
70  std::make_pair<std::string, float>("RPC26", 3.22), // big RPC7
71  std::make_pair<std::string, float>("RPC27", 3.06), // small RPC7
72  std::make_pair<std::string, float>("RPC28", 3.11), // big RPC8
73  std::make_pair<std::string, float>("RPC29", 3.11), // small RPC8
74  };
75 } // namespace
76 
77 
78 
79 namespace MuonGM {
80 
81  // cutouts for BMS at eta=+-1 and phi=4 (RPC/DED/MDT) ok //16 tubes shorter + entire RPC and DED (of dbz1) narrower
82 
84  std::map<std::string, GeoFullPhysVol*> * mapFPV,
85  std::map<std::string, GeoAlignableTransform *> *mapAXF) :
86  DetectorElement(s->GetName()),
87  AthMessaging{"MuonchamberLite"},
88  m_mapFPV(mapFPV),
89  m_mapAXF(mapAXF)
90  {
91  width = s->GetWidth1();
92  longWidth = s->GetWidth2();
93  thickness = s->GetThickness(mysql);
94  length = s->GetLength();
95  m_station = s;
96 
97  // CSL envelope is too small for its components - enlarge it slightly
98  std::string stname(m_station->GetName(), 0, 3);
99  if (stname == "CSL")
100  longWidth *= 1.015;
101 
102 
103  }
104 
106  const MYSQL& mysql,
107  MuonDetectorManager *manager, int zi, int fi, bool is_mirrored, bool &isAssembly) {
108 
109 
110 
111  ATH_MSG_VERBOSE( " Building a MuonChamberLite for m_station " << m_station->GetName() << " at zi, fi " << zi << " " << fi + 1 << " is_mirrored " << is_mirrored
112  << " is assembly = " << isAssembly );
113 
114  std::string stname(m_station->GetName(), 0, 3);
115 
116  double halfpitch = m_station->mdtHalfPitch(mysql);
117  const std::string stName = m_station->GetName();
118 
119  const MdtIdHelper *mdt_id = manager->mdtIdHelper();
120  int stationType = mdt_id->stationNameIndex(stName.substr(0, 3));
121 
122  double extratop = m_station->GetExtraTopThickness();
123  double extrabottom = m_station->GetExtraBottomThickness();
124  double totthick = thickness + extratop + extrabottom;
125 
126 
127  double amdbOrigine_along_length = m_station->getAmdbOrigine_along_length();
128  double amdbOrigine_along_thickness = m_station->getAmdbOrigine_along_thickness(mysql);
129 
130 
131  // This will allow the MDT tube structure to be mirrored w.r.t. the chamber at z>0
132  // and to correctly place any other component in the m_station
133  if (zi < 0 && !is_mirrored && stName[0] == 'B') {
134  if (m_station->hasMdts()) {
135  amdbOrigine_along_length += halfpitch;
136  }
137  }
138  ATH_MSG_VERBOSE( "amdb origine: in the length direction = "
139  << amdbOrigine_along_length << " in the thickness direction = " << amdbOrigine_along_thickness);
140 
141  if (isAssembly) {
142  ATH_MSG_DEBUG("Station " << stName << " at zi, fi " << zi << " " << fi + 1 << " will be described as Assembly" );
143 
144  }
145 
146  // for BOG in layout Q we will have to shorten CHV, CMI as these
147  // are not shortened in AMDB
148 
149 
150  // if this is a BOG, we want to make cutouts in the MOTHER VOLUME
151  if (stName.compare(0, 3, "BOG") == 0 && (manager->IncludeCutoutsBogFlag() || manager->IncludeCutoutsFlag())) {
152 
153  ATH_MSG_VERBOSE( "amdb org: length= " << amdbOrigine_along_length << " thickness= " << amdbOrigine_along_thickness );
154 
155  std::string statType = stName.substr(0, 3);
156  if (m_station->GetNrOfCutouts() > 0) {
157  ATH_MSG_DEBUG( "Station " << stName << " at zi, fi " << zi << " " << fi + 1 << " has components with cutouts " );
158  isAssembly = true;
159 
160  // look for FIRST component with cutouts and loop over all of the cutouts:
161  bool foundCutouts = false;
162  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
164 
165  if (!foundCutouts) {
166  for (int ii = 0; ii < m_station->GetNrOfCutouts(); ii++) {
167  Cutout *cut = m_station->GetCutout(ii);
168  // if this is a BOG in layout Q, set the CP param:
169  // (both cuts have same length so ok to reset it)
170  // also do here some tweaking to prevent undershoot
171  // of the cutouts wrt mother volume:
172  if (std::abs(cut->dx - 600.7) < 0.1) {
173  cut->dx = cut->dx + 10. * Gaudi::Units::mm;
174  cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
175  cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
176  }
177  if (std::abs(cut->dx + 600.7) < 0.1) {
178  cut->dx = cut->dx - 10. * Gaudi::Units::mm;
179  cut->widthXs = cut->widthXs + 20. * Gaudi::Units::mm;
180  cut->widthXl = cut->widthXl + 20. * Gaudi::Units::mm;
181  }
182  if (std::abs(cut->lengthY - 180.2) < 0.001) {
183  cut->lengthY = cut->lengthY + (0.010) * Gaudi::Units::mm;
184  }
185  if (std::abs(cut->dy - 1019.8) < 0.001) {
186  cut->dy = 1216.4185 - cut->lengthY;
187  }
188  // create the cutout with the full thickness of the STATION
189  cut->setThickness(totthick * 1.01); // extra to be sure
190  if ((cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) &&
191  (cut->ijob == c->index)) {
192 
193  foundCutouts = true;
194  }
195  } // Loop over cutouts
196  } // If no cutouts
197  } // Loop over components
198  }
199  } // end of special loop just for cutouts
200 
201 
202 
203  double ypos{0.}, zpos{0.}, xpos{0.}, irad{0.};
204  std::array<int, 2 > ndbz{0, 0};
205 
206  // Compute how many RPC modules there are in the m_station
207  int nDoubletR{0}, nRpc{0}, nTgc{0}, nCsc{0}, nMdt{0};
208  double previous_depth = 0.;
209 
210  ATH_MSG_VERBOSE( " Station Name = " << stName << " fi/zi " << fi << "/" << zi << " defining the n. of DoubletR to " );
211 
212 
213  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
215  std::string_view cn = std::string_view(d->name).substr(0, 3);
216  if (cn == "RPC") {
217  nRpc++;
218  if (nRpc == 1)
219  nDoubletR++;
220  double depth = -thickness / 2. + d->posz + d->GetThickness(mysql) / 2.;
221  // BI RPC Chambers have one one doubletR
222  if (!(stname.compare(0, 2, "BI") == 0) && nDoubletR == 1 && nRpc > 1 && depth * previous_depth < 0)
223  nDoubletR++;
224 
225  previous_depth = depth;
226  }
227  else if (cn == "CSC") {
228  nCsc++;
229  }
230  else if (cn == "TGC") {
231  nTgc++;
232  }
233  else if (cn == "MDT") {
234  nMdt++;
235  }
236  }
237  ATH_MSG_DEBUG( "nDoubletR: " << nDoubletR<<" nMdt/Rpc/Tgc/Csc " << nMdt << "/" << nRpc << "/" << nTgc << "/" << nCsc );
238 
239  // Get location and dimensions of long beams and pass them to cross beams
240  // in order to make holes
241  int numLB = -1;
242  double LBheight{0.}, LBwidth{0.};
243  std::array<double, 2> LBpos{-1, -1};
244  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
246  std::string_view cname = std::string_view(c->name).substr(0, 2);
247  if (cname == "LB") {
248  const LBI *lb = dynamic_cast<const LBI *>(mysql.GetTechnology(c->name));
249  numLB++;
250  LBpos[numLB] = c->posy + c->dy / 2.;
251  LBheight = lb->height;
252  LBwidth = c->dy;
253  }
254  if (numLB > 0)
255  break; // only 2 LBs per chamber
256  }
257 
258  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
260  std::string_view cname = std::string_view(c->name).substr(0, 3);
261  if (cname == "CRO" || cname == "CMI" || cname == "CHV") {
262  CbmComponent *ccbm = (CbmComponent *)c;
263  ccbm->lb_height = LBheight;
264  ccbm->lb_width = LBwidth;
265  ccbm->hole_pos1 = LBpos[0];
266  ccbm->hole_pos2 = LBpos[1];
267  }
268  }
269 
270  // Look for the subtype of the CMI in the chamber to let LB know ...
271  std::string CMIcomponentNumber = "";
272  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
274  std::string_view cn = std::string_view(d->name).substr(0, 3);
275  if (cn == "CMI") {
276  CMIcomponentNumber = (d->name).substr(3, 2);
277  break;
278  }
279  }
280 
281  for (int j = 0; j < m_station->GetNrOfComponents(); j++) {
283  std::string_view cn = std::string_view(d->name).substr(0, 2);
284  if (cn == "LB") {
285  LbiComponent *lbic = (LbiComponent *)d;
286  if (lbic) {
287  lbic->associated_CMIsubtype = CMIcomponentNumber;
288  } else
289  ATH_MSG_ERROR( "MuonChamberLite :: cannot associate a CMI subtype to the LB component " );
290  }
291  }
292 
293  // Build the MuonStation(readout-geometry) corresponding to this MuonChamberLite(raw-geometry)
294  MuonStation *mstat;
295  if (stName.compare(0, 1, "B") == 0) {
296  mstat = new MuonStation(stName.substr(0, 3), width, totthick, length, longWidth, totthick, length, zi, fi + 1,
297  (zi < 0 && !is_mirrored));
298  } else {
299  mstat = new MuonStation(stName.substr(0, 3), width, length, totthick, longWidth, length, totthick, zi, fi + 1,
300  (zi < 0 && !is_mirrored));
301  }
302  manager->addMuonStation(std::unique_ptr<MuonStation>(mstat));
303  ATH_MSG_DEBUG( " Building a MuonStation for this MuonChamberLite " << m_station->GetName()
304  << " at zi, fi " << zi << " " << fi + 1 << " is_mirrored " << is_mirrored);
305 
306  GeoFullPhysVol *ptrd=(*m_mapFPV)[std::string(stName)+"_Station"+"_"+std::to_string(zi)+"_"+std::to_string(fi)];
307  // here the big loop over the components !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
308  for (int i = 0; i < m_station->GetNrOfComponents(); i++) {
310  ATH_MSG_VERBOSE( " Component index " << c->index << " in loop for " << stName << " " << stationType << " at zi, fi " << zi << " " << fi + 1 << " cName "
311  << c->name << " thickness " << c->GetThickness(mysql) << " length " << c->dy << " w, lw " << c->dx1 << " " << c->dx2 );
312  ATH_MSG_VERBOSE( " Component local (amdb) coords " << c->posx << " " << c->posy << " " << c->posz );
313 
314  ypos = -thickness / 2. + c->posz + c->GetThickness(mysql) / 2.;
315  zpos = 0.;
316  xpos = 0.;
317 
318  ypos = -thickness / 2. + (c->posz + amdbOrigine_along_thickness) + c->GetThickness(mysql) / 2.;
319  zpos = -length / 2. + amdbOrigine_along_length + c->posy + c->dy / 2.;
320  xpos = c->posx;
321 
322  const std::string &techname = c->name;
323  std::string_view type = std::string_view(techname).substr(0, 3);
324 
325 
326 
327  GeoFullPhysVol *lvm = nullptr;
328  GeoFullPhysVol *lvr = nullptr;
329  GeoFullPhysVol *lvt = nullptr;
330  GeoFullPhysVol *lvc = nullptr;
331 
332 
333 
334  // Are there cutouts?
335  std::string statType = stName.substr(0, 3);
336  double cthickness = c->GetThickness(mysql);
337  int ncutouts = 0;
338  std::vector<Cutout *> vcutdef;
339  std::vector<std::unique_ptr<Cutout>> vcutdef_todel;
340  for (int ii = 0; ii < m_station->GetNrOfCutouts(); ii++) {
341  Cutout *cut = m_station->GetCutout(ii);
342  cut->setThickness(cthickness * 1.01); // extra thickness to be sure
343 
344  if ((cut->subtype == mysql.allocPosFindSubtype(std::string(statType), fi, zi)) && (cut->icut == mysql.allocPosFindCutout(std::string(statType), fi, zi)) && (cut->ijob == c->index)) {
345 
346  double tempdx = cut->dx;
347  double tempdy = cut->dy;
348  double templengthY = cut->lengthY;
349  cut->dx = 0.;
350  cut->dy = 0.;
351 
352  if (stName.compare(0, 3, "BOG") == 0) {
353  // make the cutouts a bit longer
354  cut->lengthY = templengthY + 31.;
355  }
356 
357  cut->dx = tempdx;
358  cut->dy = tempdy;
359 
360  if (std::abs(cut->dead1) > 1. && techname == "MDT03")
361  cut->dy = cut->dy + 15.0 * cos(cut->dead1 * Gaudi::Units::deg);
362  // should compensate for the dy position defined in amdb at the bottom of the foam in ML 1 of EMS1,3 and BOS 6
363  // can be applied only for layout >=r.04.04 in rel 15.6.X.Y due to the frozen Tier0 policy
364 
365  cut->lengthY = templengthY;
366  // in thickness, cutout will coincide with component
367  // not needed (DHW) double xposcut = 0.; // rel. to component thickness
368  ncutouts++;
369  ATH_MSG_VERBOSE( "A new cutout for this component " );
370  ATH_MSG_VERBOSE( *cut );
371 
372  // Corrected cutout values for BMS7, BMS14
373  if (stName.compare(0, 3, "BMS") == 0) {
374  if (fi == 3) { // stationPhi = 4
375  if (std::abs(zi) == 1) { // stationEta = +-1
376  double margin = 1.0; // make cutout a little bigger to avoid coincident boundaries
377 
378  if (type == "RPC" || type == "DED") {
379  cut->widthXl += 2 * margin;
380  cut->widthXs += 2 * margin;
381  cut->dx += margin;
382  cut->lengthY += 2 * margin;
383 
384  if (zi > 0)
385  cut->dy = -margin;
386  }
387  }
388 
389  if (zi == -1) {
390  if (type == "MDT")
391  cut->dy = 0.;
392  }
393  }
394  }
395 
396  // the following is a fine tuning ----- MUST CHECK for a better solution
397  if (stName.compare(0, 3,"BOS") == 0 && zi == -6 && type == "MDT") {
398  cut->dy = c->dy - cut->dy - cut->lengthY - halfpitch;
399  cut->dead1 = 30.; // why this is not 30. or -30. already ?????
400  if (techname == "MDT03")
401  cut->dy = cut->dy + 30.0; // *cos(cut->dead1*Gaudi::Units::deg);
402  ATH_MSG_VERBOSE( "Cut dead1 for BOS 6 on C side is " << cut->dead1 );
403 
404  }
405 
406  // this mirroring of the cutout is necessary only for barrel MDT chambers; for EC the cutout will be automatically mirrored
407  // this fix cannot be applied in 15.6.X.Y for layout < r.04.04 due to the frozen tier0 policy
408 
409  if (type == "MDT" && (is_mirrored || zi < 0) && stName.compare(0, 1, "B") == 0) {
410  // MDT in chambers explicitly described at z<0 have to be
411  // rotated by 180deg to adj. tube staggering
412  // reverse the position (x amdb) of the cutout if the m_station is mirrored
413  Cutout *cutmirr = new Cutout(*cut);
414  cutmirr->dx = -cutmirr->dx;
415  // this way, after the rotation by 180 Gaudi::Units::deg, the cut will be at the same global phi
416  // it has for the m_station at z>0
417  vcutdef.push_back(cutmirr);
418  vcutdef_todel.emplace_back(cutmirr);
419  ATH_MSG_VERBOSE( "adding for application mirrored cut \n" << *cutmirr );
420 
421  } else if (type == "RPC" || type == "DED") {
422  Cutout *cutRpcType = new Cutout(*cut);
423  // temporary for testing fixes to r.03.09
424  if (stName.compare(0, 3, "BMS") == 0 && zi == 4 && (c->index == 20 || c->index == 21 || c->index == 24 || c->index == 25)) {
425  cutRpcType->dy = 1102.5;
426  }
427 
428  if (stName.compare(0, 3, "BOS") == 0 && zi == 6 && type == "DED")
429  cutRpcType->dy = 706.;
430 
431  cutRpcType->dy = cutRpcType->dy - c->posy;
432  cutRpcType->dx = cutRpcType->dx - c->posx;
433 
434  if (type == "RPC") {
436  if (rp->iswap == -1) {
437  cutRpcType->dy = c->dy - (cutRpcType->dy + cutRpcType->lengthY);
438  }
439  }
440 
441  ATH_MSG_VERBOSE( " Rpc or ded cutout redefined as follows \n" << *cutRpcType );
442  vcutdef.push_back(cutRpcType);
443  vcutdef_todel.emplace_back(cutRpcType);
444  } else if (type == "TGC") {
445  // In AMDB, y coordinates of cutout and component are given by
446  // radius from detector z-axis. To get standard y value of cutout,
447  // subtract radius of component from radius of cutout
448  Cutout *tgccut = new Cutout(*cut);
449  tgccut->dy -= c->posy; //
450 
451  ATH_MSG_VERBOSE( " Tgc cutout redefined as follows \n" << *tgccut );
452  vcutdef.push_back(tgccut);
453  vcutdef_todel.emplace_back(tgccut);
454  } else {
455  vcutdef.push_back(cut);
456  }
457  }
458  } // Loop over cutouts in m_station
459 
460  if (ncutouts > 0) {
461  ATH_MSG_DEBUG( c->name << " of station " << stName << " at fi/zi " << fi + 1 << "/" << zi << " has " << ncutouts << " cutouts " );
462  }
463  // define here the total transform that will be applied to component:
464  GeoTrf::Transform3D htcomponent(GeoTrf::Transform3D::Identity());
465  GeoAlignableTransform *xfaligncomponent{nullptr};
466  // for RPCs we need a vector of transforms for M28 geometry...
467 
468  if (type == "CRO") {
469  if (stName.compare(0, 1, "B") != 0 && is_mirrored)
470  mstat->setxAmdbCRO(-xpos);
471  else
472  mstat->setxAmdbCRO(xpos);
473  }
474 
475  if (type == "MDT") {
476  MdtComponent *md= (MdtComponent *) c;
477  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos) * GeoTrf::TranslateY3D(xpos);
478 
479  if (zi < 0 && !is_mirrored && stName[0] == 'B') {
480  // this (rotation + shift of halfpitch) will mirror the tube structure w.r.t. the chamber at z>0
481  htcomponent = htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg);
482  htcomponent = htcomponent * GeoTrf::TranslateZ3D(halfpitch);
483  }
484 
485  // ss - 24-05-2006 I don't really understand if this is needed at all
486  // it was introduced by Isabel T.
487  if (zi < 0 && stName.compare(0, 3, "BOG") == 0 && is_mirrored) {
488  // htcomponent = htcomponent*GeoTrf::RotateX3D(180.*Gaudi::Units::deg);
489  // tubes OK but chambers wrong
490  // htcomponent = GeoTrf::RotateX3D(180.*Gaudi::Units::deg)*htcomponent;
491  // chambers OK but tubes wrong
492  htcomponent = GeoTrf::RotateX3D(180. * Gaudi::Units::deg) * htcomponent * GeoTrf::RotateX3D(180. * Gaudi::Units::deg); // turn chambers but go back for tubes
493  } // ss - 24-05-2006 I don't really understand if this is needed at all
494 
495  std::string key =std::string( stName) + techname;
496  xfaligncomponent = (*m_mapAXF)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)+"_"+std::to_string(md->index)];
497 
498  // for cutouts:
499  // MDT cutouts for BOS1,5, BMS7,14, (problem with BMS4,10), EMS, BMG and BIS MDT14
500  bool mdtCutoutFlag = ((stname == "BOS" && std::abs(zi) == 6) || stname == "BMG" || techname == "MDT14" || (stname == "BMS" && (std::abs(zi) == 1 && fi == 3)) ||
501  (stname == "EMS" && (std::abs(zi) == 1 || std::abs(zi) == 3)));
502  if (((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
503  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
504  } else if (((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG")) == 0) && zi < 0) {
505  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
506  }
507  if (m_keySet->find(key)==m_keySet->end()) {
508  std::unique_ptr<Mdt> r = std::make_unique<Mdt>(mysql, c, stName + techname);
509  if ((manager->IncludeCutoutsFlag() && mdtCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) {
510  if (!vcutdef.empty()) r->processCutouts(vcutdef);
511  }
512  m_keySet->insert(key);
513  }
514  lvm = (*m_mapFPV)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)+"_"+std::to_string(md->index)];
515 
516  } else if (type == "RPC") {
517  // position stuff needed for cutout, used to be below:
519  int ndivy = rp->ndivy;
520  int ndivz = rp->ndivz;
521 
522  if (ndivz != 1 || ndivy != 1) {
523  ATH_MSG_ERROR( " RPC segmentation z,y " << ndivz << " " << ndivy );
524  }
525 
526  double xpos = c->posx;
527  // implement really the mirror symmetry
528  if (is_mirrored)
529  xpos = -xpos;
530 
531  ATH_MSG_VERBOSE( " In station " << stName << " with " << nDoubletR << " doubletR,"
532  << " RPC " << (c->name).substr(3, 2) << " has swap flag = " << rp->iswap << " ypos, zpos " << ypos << " " << zpos << " " );
533 
534  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateY3D(xpos) * GeoTrf::TranslateZ3D(zpos);
535  if (rp->iswap == -1) { // this is like amdb iswap
536  htcomponent = htcomponent * GeoTrf::RotateY3D(180 * Gaudi::Units::deg);
537  }
538 
539  // end of position stuff
540 
541  bool rpcCutoutFlag = (stname == "BOS" && std::abs(zi) == 6) || (stname == "BMS" && (std::abs(zi) == 2 || std::abs(zi) == 4 || std::abs(zi) == 6)) ||
542  (stname == "BMS" && std::abs(zi) == 1 && fi == 3);
543  std::string key = stName + techname;
544  if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi >= 0) {
545  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
546  buildString(vcutdef.size(), 0) + "_" + buildString(rp->iswap, 0);
547  } else if (((manager->IncludeCutoutsFlag() && rpcCutoutFlag) || (manager->IncludeCutoutsBogFlag() && stName.compare(0, 3, "BOG") == 0)) && zi < 0) {
548  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0) + "_" +
549  buildString(vcutdef.size(), 0) + "_" + buildString(rp->iswap, 0);
550  }
551  xfaligncomponent = (*m_mapAXF)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)+"_"+std::to_string(rp->index)];
552  lvr = (*m_mapFPV)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)+"_"+std::to_string(rp->index)];
553  } else if (type == "TGC") {
556  irad = tgInner->posy;
558  double orad = tgOuter->posy + tgOuter->dy;
559  double start = -(orad - irad) / 2. + (tg->posy - irad) + tg->dy / 2;
560  double xstart = -thickness / 2. + tg->GetThickness(mysql) / 2.;
561  htcomponent = GeoTrf::TranslateX3D(xstart + tg->posz) * GeoTrf::TranslateZ3D(start);
562 
563  // Define key for this TGC component
564  std::string key = std::string(stName) + techname;
565  if (manager->IncludeCutoutsFlag()) {
566  if (mysql.allocPosFindCutout(statType, fi, zi) > 0) {
567  // If there is a cutout for this chamber, give it a special key
568  if (zi >= 0) {
569  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
570  } else if (zi < 0) {
571  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
572  }
573  }
574  }
575 
576  char chswidth[32];
577  sprintf(chswidth, "%i", int(10 * c->dx1));
578  key += chswidth;
579  xfaligncomponent = (*m_mapAXF)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)];
580 
581  lvt = (*m_mapFPV)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)];
582 
583  } else if (type == "CSC") {
584  htcomponent = GeoTrf::TranslateX3D(ypos) * GeoTrf::TranslateZ3D(zpos);
585  // Here define the key for this CSC component
586  std::string key = std::string(stName) + techname;
587  if (manager->IncludeCutoutsFlag() && zi >= 0) {
588  key += "p" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
589  } else if (manager->IncludeCutoutsFlag() && zi < 0) {
590  key += "m" + buildString(mysql.allocPosFindSubtype(statType, fi, zi), 0) + "_" + buildString(mysql.allocPosFindCutout(statType, fi, zi), 0);
591  }
592 
593  xfaligncomponent = (*m_mapAXF)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)];
594  lvc=(*m_mapFPV)[key+"_"+std::to_string(zi)+"_"+std::to_string(fi)];
595  } else {
596  if (type != "MDT" && type != "RPC" && type != "TGC" && type != "SUP" && type != "DED" && type != "SPA" && type != "CHV" && type != "CRO" && type != "CMI" &&
597  type != "LB0" && type != "LBI") {
598  ATH_MSG_WARNING("Unknown component " << type );
599  }
600  }
601 
602  // Place components in chamber envelope
603  if (lvm && manager->mdtIdHelper()) {
604  int stationEta = zi;
605  int stationPhi = fi + 1;
606  int ml = 1;
607  int tubel = 1;
608  int tube = 1;
609  if (ypos > 5.)
610  ml = 2; // Need >5 instead of >0 because BIS78 is not perfectly centered
611 
612 
613  const MdtIdHelper *mdt_id = manager->mdtIdHelper();
614  std::unique_ptr<MdtReadoutElement> det = std::make_unique<MdtReadoutElement>(lvm, stName, manager);
615  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
616  setMdtReadoutGeom(mysql, det.get(), (MdtComponent *)c, ip);
617  det->setHasCutouts(ncutouts > 0);
618  det->setNMdtInStation(nMdt);
619  Identifier id = mdt_id->channelID(stationType, stationEta, stationPhi, ml, tubel, tube);
620  det->setIdentifier(id);
621  det->setMultilayer(ml);
622  det->setParentStationPV(PVConstLink(ptrd));
623  det->setParentMuonStation(mstat);
624  det->geoInitDone();
625 
626  if (ml == 1) {
627  // set fixed point for MDT deformations: s0,z0,t0 for the point at lowest t,z (z,y amdb) and s=x=0
628  mstat->setBlineFixedPointInAmdbLRS(c->posx, c->posy, c->posz);
629  } else {
630  const Amg::Vector3D b0 = mstat->getBlineFixedPointInAmdbLRS();
631  if (c->posy < b0.y())
632  mstat->setBlineFixedPointInAmdbLRS(b0.x(), c->posy, b0.z());
633  }
634 
635  int jobIndex = c->index;
636 
637  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
638  manager->addMdtReadoutElement(std::move(det));
639  }
640 
641  if (lvc && manager->cscIdHelper()) {
643  int stationEta = zi;
644  int stationPhi = fi + 1;
645  int chamberLayer = 1;
646  if (ypos > 0.)
647  chamberLayer = 2;
648 
649  std::unique_ptr<CscReadoutElement> det = std::make_unique<CscReadoutElement>(lvc, stName, manager);
650  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
651  setCscReadoutGeom(mysql, det.get(), cs, ip);
652 
653  const CscIdHelper *csc_id = manager->cscIdHelper();
654  det->setHasCutouts(ncutouts > 0);
655  Identifier id = csc_id->channelID(stationType, stationEta, stationPhi, chamberLayer, 1, 0, 1);
656  det->setIdentifier(id);
657 
658  det->setChamberLayer(chamberLayer);
659  det->setParentStationPV(PVConstLink(ptrd));
660  det->setParentMuonStation(mstat);
661 
662  int jobIndex = c->index;
663  //
664  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
665 
666 
667 
668  // set alignment parameters for the wire layers
669  manager->addCscReadoutElement(std::move(det));
670  }
671 
672  if (lvt && manager->tgcIdHelper()) {
673 
674  ATH_MSG_DEBUG( " Adding a TGC chamber to the tree zi,fi, is_mirrored " << zi << " " << fi + 1 << " " << is_mirrored );
675 
676 
678 
679  ATH_MSG_VERBOSE( "There's a TGC named " << techname << " of thickness " << tg->GetThickness(mysql) );
680 
681  const TgcIdHelper *tgc_id = manager->tgcIdHelper();
682  int stationEta = 0;
683  stationEta = tg->index;
684  if (zi < 0)
685  stationEta = -stationEta;
686  int stationPhi = 0;
687  stationPhi = stationPhiTGC(stName, fi + 1,zi);
688 
689  std::unique_ptr<TgcReadoutElement> det = std::make_unique<TgcReadoutElement>(lvt, stName, manager);
690  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
691  setTgcReadoutGeom(mysql, det.get(), tg, ip, stName);
692  det->setHasCutouts(ncutouts > 0);
693  Identifier id = tgc_id->channelID(stationType, stationEta, stationPhi, 1, false, 1);
694  det->setIdentifier(id);
695  det->setParentStationPV(PVConstLink(ptrd));
696  det->setParentMuonStation(mstat);
697 
698  int jobIndex = c->index;
699 
700  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
701 
702  manager->addTgcReadoutElement(std::move(det));
703  }
704  if (lvr && RPCON && manager->rpcIdHelper()) {
706  int ndivy = rp->ndivy;
707  int ndivz = rp->ndivz;
708 
709  if (ndivz != 1 || ndivy != 1) {
710  ATH_MSG_ERROR( " RPC segmentation z,y " << ndivz << " " << ndivy );
711  }
712 
713  double zpos = -length / 2. + c->posy + c->dy / 2.;
714  double xpos = c->posx;
715 
716  // implement really the mirror symmetry
717  if (is_mirrored)
718  xpos = -xpos;
719  // ... putting back to here!
720 
721  const RpcIdHelper *rpc_id = manager->rpcIdHelper();
722  int stationEta = zi;
723  int stationPhi = fi + 1;
724  int doubletR = 1;
725  int doubletZ = 1;
726 
727  if (nRpc > 1 && nDoubletR == 2 && ypos > 0.)
728  doubletR = 2;
729  ndbz[doubletR - 1]++;
730 
731  // the BI RPCs are 3-gap RPCs mounted inside of the BI (s)MDTs
732  if (stname.find("BI") != std::string::npos) {
733  if (stname.find("BIS") != std::string::npos) {
734  // for BIS78, there is a second RPC doubletZ at amdb-y (MuonGeoModel-z)=144mm inside the station
735  if (std::abs(stationEta)>= 7){
736  ATH_MSG_DEBUG("BIS78 station eta: "<<stationEta<<" phi: "<<stationPhi<<" dR: "<<doubletR<<" dZ:"<< doubletZ <<" rp: "<<rp->posz);
737  }
738  if (std::abs(stationEta) >= 7 && rp->posz > 80)
739  doubletZ = 2;
740  else
741  doubletZ = 1;
742  } else {
743  // 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
744  // only for BIL, there are sometimes 2 RPCs per 1 MDT station, namely for stationEta 1,3,4,6
745  if (stname.find("BIL") != std::string::npos && std::abs(stationEta) < 7 && std::abs(stationEta) != 2 && std::abs(stationEta) != 5) {
746  if (rp->posy > 1)
747  doubletZ = 2; // put the chamber with positive amdb-z to doubletZ=2
748  } else
749  doubletZ = 1;
750  }
751  } else {
752  if (zi <= 0 && !is_mirrored) {
753  if (zpos < -100 * Gaudi::Units::mm)
754  doubletZ = 2;
755  } else {
756  if (zpos > 100 * Gaudi::Units::mm)
757  doubletZ = 2;
758  }
759  }
760 
761  // BMS (BOG) RPCs can have |xpos|=950 (|xpos|=350)
762  if (std::abs(xpos) > 100. * Gaudi::Units::mm) {
763  if (ndbz[doubletR - 1] > 2) {
764  doubletZ = 3;
765  }
766  ndbz[doubletR - 1]--;
767  }
768 
769  int dbphi = 1;
770 
771  // this special patch is needed for BMS in the ribs where xpos is ~950mm;
772  // the theshold to 100mm (too low) caused a bug
773  // in BOG at eta +/-4 and stationEta 7 (not 6) ==>> 28 Jan 2016 raising the threshold to 400.mm
774  // doublet phi not aware of pos. in space !!!
775  if (xpos > 400. * Gaudi::Units::mm)
776  dbphi = 2;
777 
778  int doubletPhi = dbphi;
779  //
780  if (zi < 0 && is_mirrored && doubletZ == 3) {
781  doubletPhi++;
782  if (doubletPhi > 2)
783  doubletPhi = 1;
784  } else if (zi < 0 && is_mirrored && doubletZ == 2 && doubletR == 1 && stName == "BMS6") {
785  doubletPhi++;
786  if (doubletPhi > 2)
787  doubletPhi = 1;
788  }
789  // never defined fields: set to the lower limit
790  int gasGap = 1;
791  int measuresPhi = 0;
792  int strip = 1;
793 
794  int tag = doubletZ + doubletR * 100 + dbphi * 1000;
795  if (rp->iswap == -1)
796  tag = -1 * tag;
797  if (useAssemblies || isAssembly) {
798  //
799  } else {
800  int tag = rp->index + doubletR * 100 + dbphi * 1000;
801  if (rp->iswap == -1)
802  tag = -1 * tag;
803 
804  }
805 
806 
807  std::unique_ptr<RpcReadoutElement> det = std::make_unique<RpcReadoutElement>(lvr, stName, zi, fi + 1, is_mirrored, manager);
808  Position ip = mysql.GetStationPosition(stName.substr(0, 3), fi, zi);
809  setRpcReadoutGeom(mysql, det.get(), rp, ip);
810  det->setHasCutouts(ncutouts > 0);
811  Identifier id = rpc_id->channelID(stationType, stationEta, stationPhi, doubletR, doubletZ, doubletPhi, gasGap, measuresPhi, strip);
812  det->setIdentifier(id);
813  det->setDoubletR(doubletR);
814  det->setDoubletZ(doubletZ);
815  det->setDoubletPhi(doubletPhi);
816  if (stName.find("BI") != std::string::npos)
817  det->setNumberOfLayers(3); // all BI RPCs always have 3 gas gaps
818  det->setParentStationPV(PVConstLink(ptrd));
819  det->setParentMuonStation(mstat);
820 
821  int jobIndex = c->index;
822 
823  mstat->addMuonReadoutElementWithAlTransf(det.get(), xfaligncomponent, jobIndex);
824 
825 
826 
827  if (stName.find("BI") != std::string::npos) {
828  std::map<std::string, float>::const_iterator yItr = rpcYTrans.find(techname);
829  if (yItr != rpcYTrans.end())
830  det->setYTranslation(yItr->second);
831  std::map<std::string, float>::const_iterator zItr = rpcZTrans.find(techname);
832  if (zItr != rpcZTrans.end())
833  det->setZTranslation(zItr->second);
834  }
835 
836  det->fillCache(); // fill temporary cache (global position on known yet)
837  det->initDesign();
838  det->clearCache(); // clear temporary cache
839  manager->addRpcReadoutElement(std::move(det));
840 
841  } // if (lvr && RPCON && manager->rpcIdHelper()) {
842 
843  } // End big loop over components
845 
846  return ptrd;
847  }
848 
850  CscReadoutElement *re, const CscComponent *cc, const Position &ip) {
851 
852  re->m_Ssize = cc->dx1;
853  re->m_LongSsize = cc->dx2;
854  re->m_Rsize = cc->dy;
855  re->m_LongRsize = cc->dy;
856  re->m_Zsize = cc->GetThickness(mysql);
857  re->m_LongZsize = cc->GetThickness(mysql);
858  re->m_RlengthUpToMaxWidth = cc->maxwdy;
859  re->m_excent = cc->excent;
860 
861  // Csc features specific to this readout element
862  std::string tname = cc->name;
863  re->setTechnologyName(tname);
864 
865  if (ip.isAssigned) {
866  re->setStationS(ip.shift);
867  } else {
868  throw std::runtime_error(" MuonChamberLite::setCscReadoutGeom: position not found ");
869  }
870 
871  const CSC *thisc = dynamic_cast<const CSC*>(mysql.GetTechnology(tname));
872  re->m_anodecathode_distance = thisc->anocathodist;
873  re->m_ngasgaps = thisc->numOfLayers;
874  re->m_nstriplayers = thisc->numOfLayers;
875  re->m_nwirelayers = thisc->numOfLayers;
876  re->m_roxacellwidth = thisc->roxacellwith;
877  re->m_nEtastripsperlayer = thisc->nEtastrips;
878  re->m_nPhistripsperlayer = thisc->nPhistrips;
879  re->m_Etastrippitch = thisc->cathreadoutpitch;
880  re->m_Phistrippitch = thisc->phireadoutpitch;
881  re->m_Etastripwidth = re->m_Etastrippitch;
882  re->m_Phistripwidth = re->m_Phistrippitch;
883  }
884 
886  MdtReadoutElement *re, const MdtComponent *cc, const Position &ip) {
887  re->m_Ssize = cc->dx1;
888  re->m_LongSsize = cc->dx2;
889 
890  if (re->m_inBarrel) {
891  re->m_Rsize = cc->GetThickness(mysql);
892  re->m_LongRsize = cc->GetThickness(mysql);
893  re->m_Zsize = cc->dy;
894  re->m_LongZsize = cc->dy;
895  } else {
896  re->m_Rsize = cc->dy;
897  re->m_LongRsize = cc->dy;
898  re->m_Zsize = cc->GetThickness(mysql);
899  re->m_LongZsize = cc->GetThickness(mysql);
900  }
901 
902  re->m_cutoutShift = cc->cutoutTubeXShift;
903  re->m_tubelenStepSize = cc->tubelenStepSize;
904 
905  if (ip.isAssigned) {
906  re->setStationS(ip.shift);
907  } else {
908  throw std::runtime_error(" MuonChamberLite::setMdtReadoutGeom: position not found ");
909  }
910 
911  std::string tname = cc->name;
912  re->setTechnologyName(tname);
913  const MDT *thism = dynamic_cast<const MDT*>(mysql.GetTechnology(tname));
914  re->m_nlayers = thism->numOfLayers;
915  re->m_tubepitch = thism->pitch;
916  re->m_tubelayerpitch = thism->y[1] - thism->y[0];
917  re->m_endpluglength = thism->tubeEndPlugLength;
918  re->m_deadlength = cc->deadx; // thism->tubeDeadLength;
919  re->m_innerRadius = thism->innerRadius;
920  re->m_tubeWallThickness = thism->tubeWallThickness;
921 
922  if (re->m_inBarrel) {
923  re->m_ntubesperlayer = int(re->m_Zsize / re->m_tubepitch);
924  re->m_nsteps = 1; // all tubes have the same length
925  re->m_ntubesinastep = re->m_ntubesperlayer;
926  re->m_tubelength[0] = re->m_Ssize;
927  } else {
928  re->m_ntubesperlayer = int(re->m_Rsize / re->m_tubepitch);
929  re->m_nsteps = int(re->m_Rsize / re->m_tubelenStepSize);
930  re->m_ntubesinastep = int(re->m_tubelenStepSize / re->m_tubepitch);
931  re->m_tubelength[0] = re->m_Ssize;
932  double diff = (re->m_LongSsize - re->m_Ssize) * (re->m_LongRsize - re->m_tubepitch / 2.) / re->m_LongRsize;
933  for (int is = 0; is < re->m_nsteps; ++is) {
934  double len = re->m_Ssize + is * diff / re->m_nsteps;
935  re->m_tubelength[is] = len;
936  }
937  }
938 
939  for (int tl = 0; tl < re->m_nlayers; ++tl) {
940  re->m_firstwire_x[tl] = thism->x[tl];
941  re->m_firstwire_y[tl] = thism->y[tl];
942  }
943  }
944 
947  const RpcComponent *cc,
948  const Position &ip) {
949 
950  re->m_Ssize = cc->dx1;
951  re->m_LongSsize = cc->dx2;
952  re->m_Rsize = cc->GetThickness(mysql);
953  re->m_LongRsize = cc->GetThickness(mysql);
954  re->m_Zsize = cc->dy;
955  re->m_LongZsize = cc->dy;
956 
957  re->m_hasDEDontop = true;
958  if (cc->iswap == -1)
959  re->m_hasDEDontop = false;
960 
961  if (ip.isAssigned) {
962  re->setStationS(ip.shift);
963  } else {
964  ATH_MSG_ERROR( " MuonChamber::setRpcReadoutGeom: position not found " );
965  assert(0);
966  }
967 
968  std::string tname = cc->name;
969  re->setTechnologyName(tname);
970  const RPC *thisr = dynamic_cast<const RPC*>(mysql.GetTechnology(tname));
971  re->m_nphigasgaps = thisr->NGasGaps_in_s;
972  re->m_gasgapssize = re->m_Ssize / re->m_nphigasgaps - 2. * thisr->bakeliteframesize;
973  re->m_gasgapzsize = re->m_Zsize - 2. * thisr->bakeliteframesize;
974  re->m_nphistrippanels = thisr->NstripPanels_in_s;
975  re->m_phistrippitch = thisr->stripPitchS;
976  re->m_etastrippitch = thisr->stripPitchZ;
977 
978  if (re->getStationName().find("BI") != std::string::npos) {
979  re->setNumberOfLayers(3); // all BI RPCs always have 3 gas gaps
980 
981  }
982  const RPC* genericRpc = dynamic_cast<const RPC*>(mysql.GetATechnology("RPC0"));
983 
984  if (re->numberOfLayers() == 3) {
985  constexpr double rpc3GapLayerThickness = 11.8; // gas vol. + ( bakelite + graphite + PET )x2
986  for (int gasGap =1 ; gasGap <= re->numberOfLayers(); ++gasGap) {
989  re->m_gasGap_xPos[gasGap -1] = (gasGap - 2) * rpc3GapLayerThickness - 0.74;
990  }
991  } else {
992  re->m_gasGap_xPos[0] = -re->m_Rsize / 2. + thisr->externalSupPanelThickness + genericRpc->stripPanelThickness
993  + genericRpc->GasGapThickness / 2;
994  re->m_gasGap_xPos[1] = re->m_gasGap_xPos[0] + genericRpc->rpcLayerThickness +
995  genericRpc->centralSupPanelThickness;
996  if (!re->m_hasDEDontop) {
997  std::swap(re->m_gasGap_xPos[0], re->m_gasGap_xPos[1]);
998  }
999  }
1000 
1001  re->m_phistripwidth = re->m_phistrippitch - genericRpc->stripSeparation;
1002  re->m_etastripwidth = re->m_etastrippitch - genericRpc->stripSeparation;
1003  re->m_nphistripsperpanel = int((re->m_Ssize / re->m_nphistrippanels) / re->m_phistrippitch);
1004  if (re->getStationName().compare(0, 3, "BME") != 0) {
1005  re->m_nphistripsperpanel-=(re->m_nphistripsperpanel % 8) ;
1006  }
1007  re->m_netastripsperpanel = int((re->m_Zsize) / re->m_etastrippitch);
1008  re->m_netastripsperpanel -= (re->m_netastripsperpanel % 8);
1009 
1010  re->m_phipaneldead = re->m_Ssize / re->m_nphistrippanels -
1011  re->m_nphistripsperpanel * re->m_phistrippitch +
1012  genericRpc->stripSeparation;
1013  re->m_phipaneldead = re->m_phipaneldead / 2.;
1014  re->m_etapaneldead = re->m_Zsize - re->m_netastripsperpanel * re->m_etastrippitch + genericRpc->stripSeparation;
1015  re->m_etapaneldead = re->m_etapaneldead / 2.;
1016  re->m_phistriplength = re->m_LongZsize;
1017  re->m_etastriplength = re->m_LongSsize / re->m_nphistrippanels;
1018 
1019  re->m_first_phistrip_s[0] = -re->m_Ssize / 2. + re->m_phipaneldead + re->m_phistripwidth / 2.;
1020  if (re->m_nphistrippanels == 2) {
1021  re->m_first_phistrip_s[1] = re->m_phipaneldead + re->m_phistripwidth / 2.;
1022  }
1023 
1024  double offset = 0.;
1025  re->m_phistrip_z = -re->m_Zsize / 2. + offset + re->m_phistriplength / 2.;
1026 
1027  // first strip position on each eta panel
1028  re->m_first_etastrip_z = -re->m_Zsize / 2. + re->m_etapaneldead + re->m_etastripwidth / 2.;
1029  re->m_etastrip_s[0] = -re->m_Ssize / 2. + offset + re->m_etastriplength / 2.;
1030  if (re->m_nphistrippanels == 2) {
1031  re->m_etastrip_s[1] = re->m_Ssize / 2. - offset - re->m_etastriplength / 2.;
1032  }
1033 
1034  }
1035 
1038  const TgcComponent *cc,
1039  const Position &ip,
1040  const std::string& stName) {
1041 
1042  re->setSsize(cc->dx1);
1043  re->setLongSsize(cc->dx2);
1044  re->setRsize(cc->dy);
1045  re->setLongRsize(cc->dy);
1046  re->setZsize(cc->GetThickness(mysql));
1047  re->setLongZsize(cc->GetThickness(mysql));
1048 
1049 
1050  const TGC *genericTgc = dynamic_cast<const TGC*>(mysql.GetATechnology("TGC0"));
1051  re->setFrameThickness(genericTgc->frame_h,
1052  genericTgc->frame_ab);
1053 
1054 
1055  const std::string &tname = cc->name;
1056  int tname_index = MuonGM::strtoint(tname, 3, 2);
1057  re->setTechnologyName(tname);
1058 
1059  if (ip.isAssigned) {
1060  re->setStationS(ip.shift);
1061  } else {
1062  throw std::runtime_error(" MuonChamberLite::setTgcReadoutGeom position not found ");
1063  }
1064 
1065  char index[2];
1066  sprintf(index, "%i", cc->index);
1067 
1068  re->setReadOutName(stName.substr(0, 4) + '_' + index);
1069  re->setReadOutParams(mysql.GetTgcRPars(tname_index));
1070 
1071  const TGC *thist = dynamic_cast<const TGC*>(mysql.GetTechnology(tname));
1072  const std::size_t ncomp = (thist->materials).size();
1073 
1074  unsigned int gasGap{0};
1075  for (std::size_t i = 0; i < ncomp; ++i) {
1076  double newpos = -re->getZsize() / 2. + thist->positions[i] + thist->tck[i] / 2.;
1077 
1078  if ( thist->materials[i].find("TGCGas") != std::string::npos) {
1079  re->setPlaneZ(newpos, ++gasGap);
1080  }
1081  }
1082  }
1083 
1084  void MuonChamberLite::print() const {
1085  ATH_MSG_INFO("MuonChamberLite " << name << " :" );
1086  }
1087 } // 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
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
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
MuonGM::MuonChamberLite::m_station
Station * m_station
Definition: MuonChamberLite.h:59
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
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CscComponent.h
MuonGM::Station::GetExtraBottomThickness
double GetExtraBottomThickness() const
Definition: Station.cxx:155
MuonGM::MuonChamberLite::print
virtual void print() const override
Definition: MuonChamberLite.cxx:1084
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
RPCON
#define RPCON
Definition: MuonChamberLite.cxx:59
MuonGM::TGC::frame_ab
double frame_ab
Definition: TGC_Technology.h:19
MuonGM::MuonChamberLite::longWidth
double longWidth
Definition: MuonChamberLite.h:37
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
index
Definition: index.py:1
hist_file_dump.d
d
Definition: hist_file_dump.py:137
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
MuonGM::Cutout::dx
double dx
Definition: Cutout.h:23
MuonGM::Station
Definition: Station.h:40
MuonGM::MuonChamberLite::width
double width
Definition: MuonChamberLite.h:34
MuonGM::MuonStation::setBlineFixedPointInAmdbLRS
void setBlineFixedPointInAmdbLRS(double s0, double z0, double t0)
Definition: MuonStation.cxx:65
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::MuonChamberLite::m_keySet
std::set< std::string > * m_keySet
Definition: MuonChamberLite.h:63
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::MDT::tubeWallThickness
double tubeWallThickness
Definition: MDT_Technology.h:23
MuonGM::MuonStation::updateBlineFixedPointInAmdbLRS
void updateBlineFixedPointInAmdbLRS()
Definition: MuonStation.cxx:88
MuonGM::CscReadoutElement
Definition: CscReadoutElement.h:56
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::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
MuonGM::CbmComponent::lb_height
double lb_height
Definition: CbmComponent.h:15
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::MDT
Definition: MDT_Technology.h:15
MuonGM::MuonChamberLite::setCscReadoutGeom
void setCscReadoutGeom(const MYSQL &mysql, CscReadoutElement *re, const CscComponent *cc, const Position &p)
Definition: MuonChamberLite.cxx:849
TgcComponent.h
MuonGM::TGC::frame_h
double frame_h
Definition: TGC_Technology.h:18
MuonGM::MuonChamberLite::setRpcReadoutGeom
void setRpcReadoutGeom(const MYSQL &mysql, RpcReadoutElement *re, const RpcComponent *cc, const Position &p)
Definition: MuonChamberLite.cxx:945
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
GeoPrimitives.h
MuonGM::MdtComponent
Definition: MdtComponent.h:12
MuonGM::Component::dy
double dy
Definition: Component.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
python.BunchSpacingUtils.lb
lb
Definition: BunchSpacingUtils.py:88
useAssemblies
#define useAssemblies
Definition: MuonChamberLite.cxx:60
MuonGM::MuonChamberLite::addReadoutLayers
GeoVPhysVol * addReadoutLayers(const MYSQL &mysql, MuonDetectorManager *manager, int ieta, int iphi, bool is_mirrored, bool &isAssembly)
Definition: MuonChamberLite.cxx:105
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
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
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
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::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
LBI_Technology.h
MYSQL.h
MuonGM::StandardComponent::posy
double posy
Definition: StandardComponent.h:20
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::MuonChamberLite::length
double length
Definition: MuonChamberLite.h:35
MdtIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
Definition: MdtIdHelper.cxx:659
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
MuonGM::MuonChamberLite::thickness
double thickness
Definition: MuonChamberLite.h:36
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
MuonDetectorManager.h
MuonGM::MuonStation::addMuonReadoutElementWithAlTransf
void addMuonReadoutElementWithAlTransf(MuonReadoutElement *a, GeoAlignableTransform *ptrsf, int jobIndex)
Definition: MuonStation.cxx:180
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
MuonChamberLite.h
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::MuonChamberLite::setMdtReadoutGeom
void setMdtReadoutGeom(const MYSQL &mysql, MdtReadoutElement *re, const MdtComponent *cc, const Position &p)
Definition: MuonChamberLite.cxx:885
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
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
re
const boost::regex re(r_e)
MuonGM::MYSQL::GetATechnology
const Technology * GetATechnology(const std::string &name) const
Definition: MYSQL.cxx:162
MuonGM::RPC
Definition: RPC_Technology.h:14
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
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
rp
ReadCards * rp
Definition: IReadCards.cxx:26
MuonGM::MDT::pitch
double pitch
Definition: MDT_Technology.h:18
MuonGM::MuonStation::getBlineFixedPointInAmdbLRS
const Amg::Vector3D & getBlineFixedPointInAmdbLRS() const
Definition: MuonStation.cxx:81
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
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
MuonGM::LbiComponent::associated_CMIsubtype
std::string associated_CMIsubtype
Definition: LbiComponent.h:14
SupComponent.h
calibdata.tube
tube
Definition: calibdata.py:31
Tgc.h
MuonGM::MuonStation::setxAmdbCRO
void setxAmdbCRO(double xpos)
Definition: MuonStation.cxx:52
python.handimod.cc
int cc
Definition: handimod.py:523
MuonGM::MuonChamberLite::MuonChamberLite
MuonChamberLite(const MYSQL &mysql, Station *s, std::map< std::string, GeoFullPhysVol * > *mapFPV, std::map< std::string, GeoAlignableTransform * > *mapAXF)
Definition: MuonChamberLite.cxx:83
MuonGM::CSC::nPhistrips
int nPhistrips
Definition: CSC_Technology.h:40
MuonGM::MuonChamberLite::setTgcReadoutGeom
void setTgcReadoutGeom(const MYSQL &mysql, TgcReadoutElement *re, const TgcComponent *cc, const Position &p, const std::string &statname)
Definition: MuonChamberLite.cxx:1036
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
MuonGM::StandardComponent::posz
double posz
Definition: StandardComponent.h:21
RpcReadoutElement.h