ATLAS Offline Software
MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /***************************************************************************
6  The sTgc detector = an assembly module = STGC in amdb
7  ----------------------------------------------------
8 ***************************************************************************/
9 
11 
14 
15 #include <GeoModelKernel/GeoLogVol.h>
16 #include <GeoModelKernel/GeoVFullPhysVol.h>
17 #include <GeoModelKernel/GeoVPhysVol.h>
18 #include <GeoModelHelpers/StringUtils.h>
19 
20 #include <cmath>
21 #include <ext/alloc_traits.h>
22 #include <map>
23 #include <memory>
24 #include <stdexcept>
25 #include <utility>
26 
27 #include "GeoModelKernel/GeoFullPhysVol.h"
39 
40 #include "GaudiKernel/ISvcLocator.h"
45 
46 #define THROW_EXCEPTION(MSG) \
47  { \
48  std::stringstream sstr{}; \
49  sstr<<"sTgcReadoutElement - "<<idHelperSvc()->toStringDetEl(identify())<<" "<<__LINE__<<": "; \
50  sstr<<MSG; \
51  throw std::runtime_error(sstr.str()); \
52  } \
53 
54 using namespace GeoStrUtils;
55 namespace MuonGM {
56 
57  //============================================================================
58  sTgcReadoutElement::sTgcReadoutElement(GeoVFullPhysVol* pv, const std::string& stName, int zi, int fi, int mL, MuonDetectorManager* mgr)
60  , m_ml(mL) {
61 
62  std::string fixName = (stName[1] == 'L') ? "STL" : "STS";
63  Identifier id = mgr->stgcIdHelper()->channelID(fixName, zi, fi, mL, 1,
64  sTgcIdHelper::sTgcChannelTypes::Strip, 1);
65 
66  setStationName(fixName);
67  setChamberLayer(mL);
68  setIdentifier(id); // representative identifier, with stName, stEta, stPhi, mL
69 
70  }
71 
72 
73  //============================================================================
75 
76  //============================================================================
78  ISvcLocator* svcLocator = Gaudi::svcLocator(); // from Bootstrap
79  IGeoDbTagSvc* geoDbTag{nullptr};
80  svcLocator->service("GeoDbTagSvc",geoDbTag).ignore();
81 
82  IRDBAccessSvc *accessSvc{nullptr};
83  svcLocator->service(geoDbTag->getParamSvcName(),accessSvc).ignore();
84  IRDBRecordset_ptr nswdimRec = accessSvc->getRecordsetPtr("NSWDIM","","");
85  IRDBRecordset_ptr wstgcRec = accessSvc->getRecordsetPtr("WSTGC","","");
86  IRDBRecordset_ptr nswPars = accessSvc->getRecordsetPtr("NSWPARS","","");
87 
88  PVConstLink parent = getMaterialGeom()->getParent();
89  unsigned int index=parent->indexOf(getMaterialGeom());
90  std::string pVName=parent->getNameOfChildVol(index);
91  float yCutoutCathode(0);
92  if (nswPars->size()==0) {
93  THROW_EXCEPTION("Error, cannot access NSWPARS record!");
94  } else {
95  yCutoutCathode=(*nswPars)[0]->getFloat("NSW_sTGC_yCutoutCathode");
96  }
97 
98  for (unsigned int ind = 0; ind < wstgcRec->size(); ind++) {
99  std::string WSTGC_TYPE = (*wstgcRec)[ind]->getString("WSTGC_TYPE");
100 
101  if (getStationName()[2] != WSTGC_TYPE[6]) continue;
102  if (std::abs(getStationEta())!=(int) (WSTGC_TYPE[7]-'0')) continue;
103  if (m_ml != (int) (pVName[7]-'0')) continue;
104  const IRDBRecord *nswdim{nullptr};
105  std::string logVolSubName=getMaterialGeom()->getLogVol()->getName().substr(7,4);
106 
107  size_t w{0};
108  for (w=0;w<nswdimRec->size();w++) {
109  nswdim = (*nswdimRec)[w];
110  const std::string type = nswdim->getString("NSW_TYPE").substr(5,4);
111  if (type==logVolSubName) {
112  break;
113  }
114  }
115 
116  m_sWidthChamber = nswdim->getDouble("BASE_WIDTH");; // bottom base length (full chamber)
117  m_lWidthChamber = nswdim->getDouble("TOP_WIDTH"); // top base length (full chamber)
118  m_lengthChamber = nswdim->getDouble("LENGTH"); // height of the trapezoid (full chamber)
119 
120  const double gasTck = (*wstgcRec)[ind]->getDouble("gasTck");
121  const double Tck = (*wstgcRec)[ind]->getDouble("Tck");
122  const double xFrame = (*wstgcRec)[ind]->getDouble("xFrame");
123  const double ylFrame = (*wstgcRec)[ind]->getDouble("ylFrame");
124  const double ysFrame = (*wstgcRec)[ind]->getDouble("ysFrame");
125  const double wirePitch = (*wstgcRec)[ind]->getDouble("wirePitch");
126  const double stripPitch = (*wstgcRec)[ind]->getDouble("stripPitch");
127  const double stripWidth = (*wstgcRec)[ind]->getDouble("stripWidth");
128  const double sPadWidth = (*wstgcRec)[ind]->getDouble("sPadWidth");
129  const double lPadWidth = (*wstgcRec)[ind]->getDouble("lPadWidth");
130  const double anglePadPhi = (*wstgcRec)[ind]->getDouble("anglePadPhi");
131  const double sStripWidth = (*wstgcRec)[ind]->getDouble("sStripWidth");
132  const double lStripWidth = (*wstgcRec)[ind]->getDouble("lStripWidth");
133  const int wireGroupWidth = (*wstgcRec)[ind]->getInt("wireGroupWidth");
134  const int nStrips = (*wstgcRec)[ind]->getInt("nStrips");
135  const std::vector<double> padH = tokenizeDouble((*wstgcRec)[ind]->getString("padH"),";");
136  const std::vector<double> rankPadPhi = tokenizeDouble((*wstgcRec)[ind]->getString("rankPadPhi"),";");
137  const std::vector<int> nPadPhi = tokenizeInt((*wstgcRec)[ind]->getString("nPadPhi"),";");
138  const std::vector<double> firstPadPhiDivision_C = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadPhiDivision_C"),";");
139  const std::vector<double> PadPhiShift_C = tokenizeDouble((*wstgcRec)[ind]->getString("PadPhiShift_C"),";");
140  const std::vector<double> firstPadPhiDivision_A = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadPhiDivision_A"),";");
141  const std::vector<double> PadPhiShift_A = tokenizeDouble((*wstgcRec)[ind]->getString("PadPhiShift_A"),";");
142  const std::vector<double> rankPadH = tokenizeDouble((*wstgcRec)[ind]->getString("rankPadH"),";");
143  const std::vector<int> nPadH = tokenizeInt((*wstgcRec)[ind]->getString("nPadH"),";");
144  const std::vector<double> firstPadH = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadH"),";");
145  const std::vector<double> firstPadRow = tokenizeDouble((*wstgcRec)[ind]->getString("firstPadRow"),";");
146  const std::vector<double> wireCutout = tokenizeDouble((*wstgcRec)[ind]->getString("wireCutout"),";");
147  const std::vector<int> nWires = tokenizeInt((*wstgcRec)[ind]->getString("nWires"),";");
148  const std::vector<int> firstWire = tokenizeInt((*wstgcRec)[ind]->getString("firstWire"),";");
149  const std::vector<double> firstTriggerBand = tokenizeDouble((*wstgcRec)[ind]->getString("firstTriggerBand"),";");
150  const std::vector<int> nTriggerBands = tokenizeInt((*wstgcRec)[ind]->getString("nTriggerBands"),";");
151  const std::vector<double> firstStripInTrigger = tokenizeDouble((*wstgcRec)[ind]->getString("firstStripInTrigger"),";");
152  const std::vector<double> firstStripWidth = tokenizeDouble((*wstgcRec)[ind]->getString("firstStripWidth"),";");
153  const std::vector<double> StripsInBandsLayer1 = tokenizeDouble((*wstgcRec)[ind]->getString("StripsInBandsLayer1"),";");
154  const std::vector<double> StripsInBandsLayer2 = tokenizeDouble((*wstgcRec)[ind]->getString("StripsInBandsLayer2"),";");
155  const std::vector<double> StripsInBandsLayer3 = tokenizeDouble((*wstgcRec)[ind]->getString("StripsInBandsLayer3"),";");
156  const std::vector<double> StripsInBandsLayer4 = tokenizeDouble((*wstgcRec)[ind]->getString("StripsInBandsLayer4"),";");
157  const std::vector<int> nWireGroups = tokenizeInt((*wstgcRec)[ind]->getString("nWireGroups"),";");
158  const std::vector<double> firstWireGroup = tokenizeDouble((*wstgcRec)[ind]->getString("firstWireGroup"),";");
159 
160  char sector_l = getStationName().substr(2, 1) == "L" ? 'L' : 'S';
161  int stEta = std::abs(getStationEta());
162  int Etasign = getStationEta() / stEta;
163  std::string side = (Etasign > 0) ? "A" : "C";
164  m_diamondShape = sector_l == 'L' && stEta == 3;
165 
166 
167  // Get frame widths
168  m_tckChamber = Tck; // thickness (full chamber)
169 
170  double yCutout = m_diamondShape ? yCutoutCathode: 0.0; // y of cutout of trapezoid (only in outermost detectors)
171 
172 
173  // Radial shift of the local frame origin w.r.t. the center of the quadruplet.
174  // For diamond shape (QL3) the origin is on the cutout base. For the rest, the it is at the center
175  // of the active area, therefore the shift is half the difference of the top and bottom frame widths.
176  m_offset = (m_diamondShape) ? 0.5*m_lengthChamber - (yCutout + ylFrame) : -0.5*(ylFrame - ysFrame);
177 
178  //-------------------
179  // Strips
180  //-------------------
181  for (int il = 0; il < m_nlayers; il++) {
184  if (yCutout == 0.) {
185  m_etaDesign[il].defineTrapezoid(0.5 * sStripWidth,
186  0.5 * lStripWidth,
187  0.5 * (m_lengthChamber - ysFrame - ylFrame));
188  } else {
189  m_etaDesign[il].defineDiamond(0.5 * sStripWidth,
190  0.5 * lStripWidth,
191  0.5 * (m_lengthChamber - ysFrame - ylFrame), yCutout);
192  }
193  m_etaDesign[il].inputPitch = stripPitch;
194  m_etaDesign[il].inputWidth = stripWidth;
195  m_etaDesign[il].thickness = gasTck;
196  m_etaDesign[il].firstPitch = firstStripWidth[il];
197  m_etaDesign[il].setFirstPos(m_diamondShape ? -(m_etaDesign[il].xSize()- yCutout) + m_etaDesign[il].firstPitch
198  : -0.5 * m_etaDesign[il].xSize()+ m_etaDesign[il].firstPitch);
199  m_etaDesign[il].nch = nStrips;
200  }
201 
202  //-------------------
203  // Wires
204  //-------------------
205  for (int il = 0; il < m_nlayers; il++) {
208  if (yCutout == 0.) {
209  m_phiDesign[il].defineTrapezoid(0.5 * sPadWidth,
210  0.5 * lPadWidth,
211  0.5 * (m_lengthChamber - ysFrame - ylFrame) );
212  } else {
213  m_phiDesign[il].defineDiamond(0.5 * sPadWidth,
214  0.5 * lPadWidth,
215  0.5 * (m_lengthChamber - ysFrame - ylFrame), yCutout);
216  }
217  m_phiDesign[il].inputPitch = wirePitch;
218  m_phiDesign[il].inputWidth = 0.015;
219  m_phiDesign[il].thickness = m_tckChamber;
220  m_phiDesign[il].setFirstPos(firstWire[il]); // Position of 1st wire, accounts for staggering
221  m_phiDesign[il].firstPitch = firstWireGroup[il]; // Number of Wires in 1st group, group staggering
222  m_phiDesign[il].groupWidth = wireGroupWidth; // Number of Wires normal group
223  m_phiDesign[il].nGroups = nWireGroups[il]; // Number of Wire Groups
224  m_phiDesign[il].wireCutout = wireCutout[il]; // Size of "active" wire region for digits
225  m_phiDesign[il].nch = nWires[il];
226 
227  }
228 
229  //-------------------
230  // Pads
231  //-------------------
232  double radius = absTransform().translation().perp() + m_offset;
233  for (int il = 0; il < m_nlayers; il++) {
234  m_padDesign[il].Length = m_lengthChamber;
235  m_padDesign[il].sWidth = m_sWidthChamber;
236  m_padDesign[il].lWidth = m_lWidthChamber;
237  m_padDesign[il].Size = m_lengthChamber - ylFrame - ysFrame;
238  m_padDesign[il].xFrame = xFrame;
239  m_padDesign[il].ysFrame = ysFrame;
240  m_padDesign[il].ylFrame = ylFrame;
241  m_padDesign[il].yCutout = yCutout;
242  m_padDesign[il].etasign = Etasign;
243  m_padDesign[il].setR(radius);
244  m_padDesign[il].sPadWidth = sPadWidth;
245  m_padDesign[il].lPadWidth = lPadWidth;
246 
247  m_padDesign[il].nPadColumns = nPadPhi[il];
248 
249  // The C side of the NSW is mirrored instead of rotated
250  // We should be using the same values for the pads for both A and C
251  // It is easier for us to simply read the same correct value once
252  // whereas changing the XML and the reading functions will make this incompatible with past versions
253  // Alexandre Laurier 12 Sept 2018
254  m_padDesign[il].firstPhiPos= firstPadPhiDivision_A[il];
255  m_padDesign[il].inputPhiPitch = anglePadPhi; // stEta<2 ? PAD_PHI_DIVISION/PAD_PHI_SUBDIVISION : PAD_PHI_DIVISION ;
256  m_padDesign[il].PadPhiShift= PadPhiShift_A[il];
257  m_padDesign[il].padEtaMin = firstPadRow[il]; // FIRST_PAD_ROW_DIVISION[2*sector+(m_ml-1)][stEta-1][il];
258  m_padDesign[il].nPadH = nPadH[il];
259  m_padDesign[il].padEtaMax = m_padDesign[il].padEtaMin + m_padDesign[il].nPadH; // PAD_ROWS[2*sector+(m_ml-1)][stEta-1][il];
260  m_padDesign[il].firstRowPos = firstPadH[il]; // H_PAD_ROW_0[2*sector+(m_ml-1)][il];
261  m_padDesign[il].inputRowPitch = padH[il]; // PAD_HEIGHT[2*sector+(m_ml-1)][il];
262 
263  if (sector_l == 'L') {
264  m_padDesign[il].isLargeSector = 1;
265  m_padDesign[il].sectorOpeningAngle = m_padDesign[il].largeSectorOpeningAngle;
266  } else {
267  m_padDesign[il].isLargeSector = 0;
268  m_padDesign[il].sectorOpeningAngle = m_padDesign[il].smallSectorOpeningAngle;
269  }
270  m_padDesign[il].thickness = thickness;
271  }
272  }
273  }
274  void sTgcReadoutElement::initDesignFromAGDD(double thickness) {
275 
276  char sector_l = getStationName().substr(2, 1) == "L" ? 'L' : 'S';
277  int stEta = std::abs(getStationEta());
278  int Etasign = getStationEta() / stEta;
279  std::string side = (Etasign > 0) ? "A" : "C";
280  m_diamondShape = sector_l == 'L' && stEta == 3;
281 
282  ATH_MSG_DEBUG("station name" << getStationName());
283 
284  sTGCDetectorHelper aHelper;
285  sTGCDetectorDescription* stgc = aHelper.Get_sTGCDetector(sector_l, stEta, getStationPhi(), m_ml, side.back());
286 
287  ATH_MSG_DEBUG( "Found sTGC Detector " << stgc->GetName() );
288 
289  MuonGM::sTGC_Technology *tech = stgc->GetTechnology();
290  if (!tech) THROW_EXCEPTION(" Failed To get Technology for stgc element:"<< stgc->GetName());
291 
292 
293  // Get Chamber length, width and frame widths
294  m_sWidthChamber = stgc->sWidth(); // bottom base length (full chamber)
295  m_lWidthChamber = stgc->lWidth(); // top base length (full chamber)
296  m_lengthChamber = stgc->Length(); // height of the trapezoid (full chamber)
297  m_tckChamber = stgc->Tck(); // thickness (full chamber)
298  double ysFrame = stgc->ysFrame(); // Frame thickness on short parallel edge
299  double ylFrame = stgc->ylFrame(); // Frame thickness on long parallel edge
300  double xFrame = stgc->xFrame(); // Frame thickness of non parallel edges
301  double yCutout = stgc->yCutoutCathode(); // y of cutout of trapezoid (only in outermost detectors)
303 
304 
305  // Radial shift of the local frame origin w.r.t. the center of the quadruplet.
306  // For diamond shape (QL3) the origin is on the cutout base. For the rest, the it is at the center
307  // of the active area, therefore the shift is half the difference of the top and bottom frame widths.
308  m_offset = (m_diamondShape) ? 0.5*m_lengthChamber - (yCutout + ylFrame) : -0.5*(ylFrame - ysFrame);
309 
310  //-------------------
311  // Strips
312  //-------------------
313  for (int il = 0; il < m_nlayers; il++) {
314  // identifier of the first channel - strip plane - to retrieve max number of strips
317  if (yCutout == 0.) {
318  m_etaDesign[il].defineTrapezoid(0.5 * roParam.sStripWidth,
319  0.5 * roParam.lStripWidth,
320  0.5 * (m_lengthChamber - ysFrame - ylFrame));
321  } else {
322  m_etaDesign[il].defineDiamond(0.5 * roParam.sStripWidth,
323  0.5 * roParam.lStripWidth,
324  0.5 * (m_lengthChamber - ysFrame - ylFrame), yCutout);
325  }
326  m_etaDesign[il].inputPitch = stgc->stripPitch();
327  m_etaDesign[il].inputWidth = stgc->stripWidth();
328  m_etaDesign[il].thickness = tech->gasThickness;
329  m_etaDesign[il].firstPitch = roParam.firstStripWidth[il];
330  m_etaDesign[il].setFirstPos((m_diamondShape) ? -(m_etaDesign[il].xSize()- yCutout) + m_etaDesign[il].firstPitch
331  : -0.5 * m_etaDesign[il].xSize()+ m_etaDesign[il].firstPitch);
332  m_etaDesign[il].nch = roParam.nStrips;
333 
334  ATH_MSG_DEBUG("initDesign:" << getStationName() << " layer " << il
335  << ", strip pitch " << m_etaDesign[il].inputPitch
336  << ", nstrips " << m_etaDesign[il].nch
337  << ", firstPos: " << m_etaDesign[il].firstPos() );
338  }
339 
340  //-------------------
341  // Wires
342  //-------------------
343  for (int il = 0; il < m_nlayers; il++) {
346  if (yCutout == 0.) {
347  m_phiDesign[il].defineTrapezoid(0.5 * roParam.sPadWidth,
348  0.5 * roParam.lPadWidth,
349  0.5 * (m_lengthChamber - ysFrame - ylFrame) );
350  } else {
351  m_phiDesign[il].defineDiamond(0.5 * roParam.sPadWidth,
352  0.5 * roParam.lPadWidth,
353  0.5 * (m_lengthChamber - ysFrame - ylFrame), yCutout);
354  }
355  m_phiDesign[il].inputPitch = stgc->wirePitch();
356  m_phiDesign[il].inputWidth = 0.015;
357  m_phiDesign[il].thickness = m_tckChamber;
358  m_phiDesign[il].setFirstPos(roParam.firstWire[il]); // Position of 1st wire, accounts for staggering
359  m_phiDesign[il].firstPitch = roParam.firstWireGroup[il]; // Number of Wires in 1st group, group staggering
360  m_phiDesign[il].groupWidth = roParam.wireGroupWidth; // Number of Wires normal group
361  m_phiDesign[il].nGroups = roParam.nWireGroups[il]; // Number of Wire Groups
362  m_phiDesign[il].wireCutout = roParam.wireCutout[il]; // Size of "active" wire region for digits
363  m_phiDesign[il].nch = roParam.nWires[il];
364 
365  ATH_MSG_DEBUG( "initDesign:" << getStationName() << " layer " << il << ", wireGang pitch "
366  << m_phiDesign[il].inputPitch << ", nWireGangs " << m_phiDesign[il].nch );
367  }
368 
369  //-------------------
370  // Pads
371  //-------------------
372  double radius = absTransform().translation().perp() + m_offset;
373  for (int il = 0; il < m_nlayers; il++) {
374  m_padDesign[il].Length = m_lengthChamber;
375  m_padDesign[il].sWidth = m_sWidthChamber;
376  m_padDesign[il].lWidth = m_lWidthChamber;
377  m_padDesign[il].Size = m_lengthChamber - ylFrame - ysFrame;
378  m_padDesign[il].xFrame = xFrame;
379  m_padDesign[il].ysFrame = ysFrame;
380  m_padDesign[il].ylFrame = ylFrame;
381  m_padDesign[il].yCutout = yCutout;
382  m_padDesign[il].etasign = Etasign;
383  m_padDesign[il].setR(radius);
384  m_padDesign[il].sPadWidth = roParam.sPadWidth;
385  m_padDesign[il].lPadWidth = roParam.lPadWidth;
386  m_padDesign[il].nPadColumns = roParam.nPadPhi[il];
387 
388  // The C side of the NSW is mirrored instead of rotated
389  // We should be using the same values for the pads for both A and C
390  // It is easier for us to simply read the same correct value once
391  // whereas changing the XML and the reading functions will make this incompatible with past versions
392  // Alexandre Laurier 12 Sept 2018
393  m_padDesign[il].firstPhiPos = roParam.firstPadPhiDivision_A[il];
394  m_padDesign[il].inputPhiPitch = roParam.anglePadPhi; // stEta<2 ? PAD_PHI_DIVISION/PAD_PHI_SUBDIVISION : PAD_PHI_DIVISION ;
395  m_padDesign[il].PadPhiShift = roParam.PadPhiShift_A[il];
396  m_padDesign[il].padEtaMin = roParam.firstPadRow[il]; // FIRST_PAD_ROW_DIVISION[2*sector+(m_ml-1)][stEta-1][il];
397  m_padDesign[il].nPadH = roParam.nPadH[il];
398  m_padDesign[il].padEtaMax = m_padDesign[il].padEtaMin + roParam.nPadH[il]; // PAD_ROWS[2*sector+(m_ml-1)][stEta-1][il];
399  m_padDesign[il].firstRowPos = roParam.firstPadH[il]; // H_PAD_ROW_0[2*sector+(m_ml-1)][il];
400  m_padDesign[il].inputRowPitch = roParam.padH[il]; // PAD_HEIGHT[2*sector+(m_ml-1)][il];
401 
402  if (sector_l == 'L') {
403  m_padDesign[il].isLargeSector = 1;
404  m_padDesign[il].sectorOpeningAngle = m_padDesign[il].largeSectorOpeningAngle;
405  } else {
406  m_padDesign[il].isLargeSector = 0;
407  m_padDesign[il].sectorOpeningAngle = m_padDesign[il].smallSectorOpeningAngle;
408  }
409 
410  m_padDesign[il].thickness = thickness;
411 
412  ATH_MSG_DEBUG( "initDesign stationname " << getStationName() << " layer " << il << ",pad phi angular width "
413  << m_padDesign[il].inputPhiPitch << ", eta pad size " << m_padDesign[il].inputRowPitch
414  << " Length: " << m_padDesign[il].Length << " sWidth: " << m_padDesign[il].sWidth
415  << " lWidth: " << m_padDesign[il].lWidth << " firstPhiPos:" << m_padDesign[il].firstPhiPos
416  << " padEtaMin:" << m_padDesign[il].padEtaMin << " padEtaMax:" << m_padDesign[il].padEtaMax
417  << " firstRowPos:" << m_padDesign[il].firstRowPos << " inputRowPitch:" << m_padDesign[il].inputRowPitch
418  << " thickness:" << m_padDesign[il].thickness << " sPadWidth: " << m_padDesign[il].sPadWidth
419  << " lPadWidth: " << m_padDesign[il].lPadWidth << " xFrame: " << m_padDesign[il].xFrame
420  << " ysFrame: " << m_padDesign[il].ysFrame << " ylFrame: " << m_padDesign[il].ylFrame
421  << " yCutout: " << m_padDesign[il].yCutout );
422  }
423  }
424 
425  void sTgcReadoutElement::initDesign(double thickness) {
426 
427  if (manager()->MinimalGeoFlag() == 0) {
428  PVConstLink pvc {getMaterialGeom()};
429  unsigned int nchildvol = pvc->getNChildVols();
430  int llay = 0;
431  std::string::size_type npos;
432  for (unsigned ich = 0; ich < nchildvol; ++ich) {
433  PVConstLink pc = pvc->getChildVol(ich);
434  std::string childname = (pc->getLogVol())->getName();
435 
436  ATH_MSG_DEBUG("Volume Type: " << pc->getLogVol()->getShape()->type());
437  if ((npos = childname.find("Sensitive")) != std::string::npos) {
438  ++llay;
439  if (llay > 4) {
440  ATH_MSG_DEBUG("number of sTGC layers > 4: increase transform array size");
441  continue;
442  }
443  m_Xlg[llay - 1] = pvc->getXToChildVol(ich);
444  }
445  }
446  assert(m_nlayers == llay);
447  }
448 
449  ISvcLocator* svcLocator = Gaudi::svcLocator(); // from Bootstrap
450  IGeoDbTagSvc* geoDbTag{nullptr};
451  StatusCode sc = svcLocator->service("GeoDbTagSvc",geoDbTag);
452  if (sc.isFailure()) THROW_EXCEPTION( "Could not locate GeoDbTagSvc" );
453  if (geoDbTag->getSqliteReader()) initDesignFromSQLite(thickness);
454  else initDesignFromAGDD(thickness);
455 
456  }
457 
458  //============================================================================
460 
461  if (m_surfaceData) {
462  ATH_MSG_WARNING("calling fillCache on an already filled cache" );
463  return;
464  }
465 
466  m_surfaceData = std::make_unique<SurfaceData>();
467 
468  for (int layer{0}; layer < m_nlayers; ++layer) {
469 
470  // Define the geometry for the strips, pads and wires of this readout element.
471  // For QL3 (cutoff trapezoid), diamondBounds are used, while trapezoid bounds are used for the rest.
472  // The assigned coordinate along the layer normal is at the center of the gas gap;
473  // wires are considered at x=0, while strips and pads are shifted by +10/-10 microns.
474 
475  //-------------------
476  // Layer boundaries
477  //-------------------
478 
479  if (m_diamondShape) {
480  m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::RotatedDiamondBounds>(m_etaDesign[layer].minYSize() / 2.,
481  m_etaDesign[layer].maxYSize() / 2.,
482  m_etaDesign[layer].maxYSize() / 2.,
483  m_etaDesign[layer].xSize() / 2. - m_etaDesign[layer].yCutout() / 2,
484  m_etaDesign[layer].yCutout() / 2)); // strips
485 
486  m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::DiamondBounds>(m_padDesign[layer].sPadWidth / 2.,
487  m_padDesign[layer].lPadWidth / 2.,
488  m_padDesign[layer].lPadWidth / 2.,
489  m_padDesign[layer].Size / 2. - m_padDesign[layer].yCutout / 2, m_padDesign[layer].yCutout / 2)); // pad and wires
490 
491  } else {
492  m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::RotatedTrapezoidBounds>(m_etaDesign[layer].xSize() / 2.,
493  m_etaDesign[layer].minYSize() / 2.,
494  m_etaDesign[layer].maxYSize() / 2.)); // strips
495 
496  m_surfaceData->m_surfBounds.push_back(std::make_unique<Trk::TrapezoidBounds>(m_padDesign[layer].sPadWidth /2.,
497  m_padDesign[layer].lPadWidth / 2.,
498  m_padDesign[layer].Size / 2.));
499 
500 
501  }
502 
503  //-------------------
504  // Wires
505  //-------------------
506 
507  // identifier of the first channel - wire plane - locX along phi, locY max->min R
508  Identifier id = m_idHelper.channelID(getStationName(), getStationEta(), getStationPhi(), m_ml, layer + 1, 2, 1);
509 
510  m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
511  m_surfaceData->m_layerTransforms.push_back(
512  absTransform() // transformation from chamber to ATLAS frame
513  * m_delta // transformations from the alignment group
514  * m_Xlg[layer] // x-shift of the gas-gap center w.r.t. quadruplet center
515  * Amg::getTranslateZ3D(m_offset) // z-shift to volume center (after m_delta!)
516  * Amg::getRotateY3D(-90 * CLHEP::deg) // x<->z because of GeoTrd definition
517  * Amg::getRotateZ3D(-90 * CLHEP::deg)); // x<->y for wires
518 
519  m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
520  m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
521 
522  //-------------------
523  // Strips
524  //-------------------
525 
526  const double shift{layer%2 == 0 ? 0.01 : -0.01}; // 1st layer gets +0.01; layer numbering starts from 0 here!
527 
528  // identifier of the first channel - strip plane
530 
531  m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
532 
533  m_surfaceData->m_layerTransforms.push_back(absTransform() * m_delta * m_Xlg[layer] *Amg::Translation3D(shift, 0., m_offset)
534  *Amg::getRotateY3D(-90 * CLHEP::deg)); // x<->z because of GeoTrd definition
535 
536  m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
537  m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
538 
539  //-------------------
540  // Trigger Pads
541  //-------------------
542 
543  // identifier of the first channel - pad plane
545 
546  m_surfaceData->m_layerSurfaces.push_back(std::make_unique<Trk::PlaneSurface>(*this, id));
547 
548  m_surfaceData->m_layerTransforms.push_back(absTransform() * m_delta * m_Xlg[layer] *
549  Amg::getTranslate3D(-shift, 0., m_offset)
550  * Amg::getRotateY3D(-90 * CLHEP::deg) // x<->z because of GeoTrd definition
551  * Amg::getRotateZ3D(-90 * CLHEP::deg)); // x<->y for pads
552 
553  m_surfaceData->m_layerCenters.emplace_back(m_surfaceData->m_layerTransforms.back().translation());
554  m_surfaceData->m_layerNormals.emplace_back(m_surfaceData->m_layerTransforms.back().linear() * Amg::Vector3D(0., 0., -1.));
555  }
556  }
557 
558 
559  //============================================================================
560  bool sTgcReadoutElement::containsId(const Identifier& id) const {
561  if (m_idHelper.stationEta(id) != getStationEta()) return false;
562  if (m_idHelper.stationPhi(id) != getStationPhi()) return false;
563 
564  if (m_idHelper.multilayerID(id) != m_ml) return false;
565 
566  int gasgap = m_idHelper.gasGap(id);
567  if (gasgap < 1 || gasgap > m_nlayers) return false;
568 
569  int strip = m_idHelper.channel(id);
570  if (strip < 1) return false;
571  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip && strip > m_etaDesign[gasgap - 1].nch) return false;
572  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire && strip > m_phiDesign[gasgap -1].nGroups) return false;
573  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) {
574  const auto [etaId, phiId] = m_padDesign[gasgap -1].etaPhiId(strip);
575  if (etaId < 0 || phiId < 0) return false;
576  }
577  return true;
578  }
579 
580 
581  //============================================================================
582  double sTgcReadoutElement::channelPitch(const Identifier& id) const {
583  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Pad) {
584  const MuonPadDesign* design = getPadDesign(id);
585  if (!design) {
586  ATH_MSG_WARNING( "no pad Design" );
587  return -1;
588  }
589  return design->channelWidth(Amg::Vector2D::Zero(), 0);
590  }
591 
592  const MuonChannelDesign* design = getDesign(id);
593  if (!design) return -1;
594  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Strip) // sTGC strips
595  return design->inputPitch;
596  else if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) // sTGC wires
597  return design->inputPitch * design->groupWidth; // wire Pitch * number of wires in a group
598  else
599  return -1;
600  }
601 
602 
603  //============================================================================
604  int sTgcReadoutElement::padNumber(const Amg::Vector2D& pos, const Identifier& id) const {
605  const MuonPadDesign* design = getPadDesign(id);
606  if (!design) {
607  ATH_MSG_WARNING( "no pad Design" );
608  return -1;
609  }
610  std::pair<int, int> pad(design->channelNumber(pos));
611  const sTgcIdHelper& id_helper{*manager()->stgcIdHelper()};
612  if (pad.first > 0 && pad.second > 0) {
613 #ifndef NDEBUG
614  bool is_valid {true};
615 #endif
616  const Identifier padID = id_helper.padID(id, id_helper.multilayer(id),
617  id_helper.gasGap(id), sTgcIdHelper::Pad, pad.first, pad.second
618 #ifndef NDEBUG
619  , is_valid
620 #endif
621 
622  );
623  int channel = id_helper.channel(padID);
624  int padEta = id_helper.padEta(padID);
625  int padPhi = id_helper.padPhi(padID);
626  if (
627 #ifndef NDEBUG
628  !is_valid ||
629 #endif
630  padEta != pad.first || padPhi != pad.second) {
631 
632  ATH_MSG_WARNING( " bad pad indices: input " << pad.first << " " << pad.second << " from ID " << padEta << " "
633  << padPhi );
634  return -1;
635  }
636  return channel;
637  }
638 
639  ATH_MSG_WARNING(__LINE__<< " bad channelNumber" <<pad.first<<" "<<pad.second );
640 
641  return -1;
642  }
643 
644 
645  //============================================================================
646  int sTgcReadoutElement::wireNumber(const Amg::Vector2D& pos, const Identifier& id) const {
647  const MuonChannelDesign* design = getDesign(id);
648  if (!design) {
649  ATH_MSG_WARNING( "no wire design when trying to get the wire number" );
650  return -1;
651  }
652  return design->wireNumber(pos);
653  }
654 
655 
656  //============================================================================
657  double sTgcReadoutElement::wirePitch(int gas_gap) const {
658  if (m_phiDesign.empty()) {
659  ATH_MSG_WARNING( "no wire design when trying to get the wire pitch" );
660  return -1.0;
661  }
662  return (m_phiDesign[gas_gap - 1]).inputPitch;
663  }
664 
665 
666  //============================================================================
667  double sTgcReadoutElement::positionFirstWire(const Identifier& id) const {
668  double pos_wire = -9999.9;
669  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) {
670  const MuonChannelDesign* design = getDesign(id);
671  if (!design) {
672  ATH_MSG_WARNING( "no wire design when trying to get the 1st wire position" );
673  return pos_wire;
674  }
675  pos_wire = design->firstPos();
676  } else {
677  ATH_MSG_WARNING( "attempt to retrieve the 1st wire position with a wrong identifier" );
678  }
679  return pos_wire;
680  }
681 
682 
683  //============================================================================
684  int sTgcReadoutElement::numberOfWires(const Identifier& id) const {
685  int nWires = -1;
686  if (m_idHelper.channelType(id) == sTgcIdHelper::sTgcChannelTypes::Wire) {
687  const MuonChannelDesign* design = getDesign(id);
688  if (!design) {
689  ATH_MSG_WARNING( "no wire design when trying to get the total number of wires" );
690  return nWires;
691  }
692  nWires = design->nch;
693  } else {
694  ATH_MSG_WARNING( "attempt to retrieve the number of wires with a wrong identifier" );
695  }
696  return nWires;
697  }
698 
699 
700  //============================================================================
702  int gg = m_idHelper.gasGap(id);
703  int channelType = m_idHelper.channelType(id);
704 
705  // The assigned coordinate along the layer normal is at the center of the gas gap;
706  // wires are considered at x=0, while:
707  // for layers 1, 3 strips (pads) are shifted by +10 (-10) microns
708  // for layers 2, 4 strips (pads) are shifted by -10 (+10) microns
709  double shift{0.};
710  if (channelType != 2) shift = ((gg % 2) ^ (channelType==0)) ? 0.01 : -0.01;
711  const Amg::Vector3D locPos_ML = m_Xlg[gg - 1] * Amg::getTranslate3D(shift, 0., m_offset) * locPos;
712 
713  ATH_MSG_DEBUG( "position coordinates in the gas-gap r.f.: " << Amg::toString(locPos) );
714  ATH_MSG_DEBUG( "position coordinates in the multilayer r.f.: " << Amg::toString(locPos_ML) );
715  return absTransform() * m_delta * locPos_ML;
716  }
717 
718 
719  //============================================================================
721  // amdb frame (s, z, t) = chamber frame (y, z, x)
722  if (aline) {
723  m_delta = aline.delta();
724  // The origin of the rotation axes is at the center of the active area
725  // in the z (radial) direction. Account for this shift in the definition
726  // of m_delta so that it can be applied on chamber frame coordinates.
727  m_ALinePar = &aline;
729  refreshCache();
730  } else {
731  clearALinePar();
732  }
733  }
734 
735  //============================================================================
737  if (has_ALines()) {
738  m_ALinePar = nullptr;
739  m_delta = Amg::Transform3D::Identity();
740  refreshCache();
741  }
742  }
743 
744  //============================================================================
746  ATH_MSG_DEBUG("Setting B-line for " <<idHelperSvc()->toStringDetEl(identify())<<" "<<bLine);
747  m_BLinePar = &bLine;
748  }
749 
750  //============================================================================
752 
753  // note: amdb frame (s, z, t) = chamber frame (y, z, x)
754  if (!has_BLines()) return;
755 
756  double t0 = locPosML.x();
757  double s0 = locPosML.y();
758  double z0 = locPosML.z();
759  double width = m_sWidthChamber + (m_lWidthChamber - m_sWidthChamber)*(z0/m_lengthChamber + 0.5); // because z0 is in [-length/2, length/2]
760 
761  double s_rel = s0/(width/2.); // in [-1, 1]
762  double z_rel = z0/(m_lengthChamber/2.); // in [-1, 1]
763  double t_rel = t0/(m_tckChamber/2.); // in [-1, 1]
764 
765  // b-line parameters
766  using Parameter = BLinePar::Parameter;
767  const double bp = m_BLinePar->getParameter(Parameter::bp);
768  const double bn = m_BLinePar->getParameter(Parameter::bn);
769  const double sp = m_BLinePar->getParameter(Parameter::sp);
770  const double sn = m_BLinePar->getParameter(Parameter::sn);
771  const double tw = m_BLinePar->getParameter(Parameter::tw);
772  const double eg = m_BLinePar->getParameter(Parameter::eg)*1.e-3;
773  const double ep = m_BLinePar->getParameter(Parameter::ep)*1.e-3;
774  const double en = m_BLinePar->getParameter(Parameter::en)*1.e-3;
775 
776  double ds{0.}, dz{0.}, dt{0.};
777 
778  if (bp != 0 || bn != 0)
779  dt += 0.5*(s_rel*s_rel - 1)*((bp + bn) + (bp - bn)*z_rel);
780 
781  if (sp != 0 || sn != 0)
782  dt += 0.5*(z_rel*z_rel - 1)*((sp + sn) + (sp - sn)*s_rel);
783 
784  if (tw != 0) {
785  dt -= tw*s_rel*z_rel;
786  dz += tw*s_rel*t_rel*m_tckChamber/m_lengthChamber;
787  }
788 
789  if (eg != 0) {
790  dt += t0*eg;
791  ds += s0*eg;
792  dz += z0*eg;
793  }
794 
795  if (ep != 0 || en != 0) {
796  // the formulas below differ from those in Christoph's talk
797  // because are origin for NSW is at the center of the chamber,
798  // whereas in the talk (i.e. MDTs), it is at the bottom!
799  double delta = s_rel*s_rel * ((ep + en)*s_rel/6 + (ep - en)/4);
800  double phi = s_rel * ((ep + en)*s_rel + (ep - en)) / 2;
801  dt += phi*t0;
802  ds += delta*width/2;
803  dz += phi*z0;
804  }
805 
806  locPosML[0] += dt;
807  locPosML[1] += ds;
808  locPosML[2] += dz;
809  }
810 
811 
812  //============================================================================
813  void sTgcReadoutElement::spacePointPosition(const Identifier& layerId, double locXpos, double locYpos, Amg::Vector3D& pos) const {
814 
815  pos = Amg::Vector3D(locXpos, locYpos, 0.);
816 
817  const MuonChannelDesign* design = getDesign(layerId);
818  if (!design) {
819  ATH_MSG_WARNING( "Unable to get MuonChannelDesign, therefore cannot provide position corrections. Returning." );
820  return;
821  }
822 
823  bool conditionsApplied{false};
824  Amg::Transform3D trfToML{Amg::Transform3D::Identity()};
825 
826 #ifndef SIMULATIONBASE
827  //*********************
828  // As-Built (MuonNswAsBuilt is not included in AthSimulation)
829  //*********************
832  Amg::Vector2D lpos(locXpos, locYpos);
833 
834  // express the local position w.r.t. the nearest active strip
835  Amg::Vector2D rel_pos;
836  int istrip = design->positionRelativeToStrip(lpos, rel_pos);
837  if (istrip < 0) {
838  ATH_MSG_WARNING( "As-built corrections are provided only for eta strips within the active area. Returning." );
839  return;
840  }
841 
842  // setup strip calculator
845  strip_id.ilayer = m_idHelper.gasGap(layerId);
846  strip_id.istrip = istrip;
847 
848  // get the position coordinates, in the chamber frame, from NswAsBuilt.
849  // applying the 10um shift along the beam axis for strips (see fillCache()).
850  NswAsBuilt::StgcStripCalculator::position_t calcPos = sc->getPositionAlongStgcStrip(NswAsBuilt::Element::ParameterClass::CORRECTION, strip_id, rel_pos.y(), rel_pos.x());
851 
853  pos = calcPos.pos;
854  pos[0] += (strip_id.ilayer%2) ? 0.01 : -0.01; // 1st layer gets +0.01; layer numbering starts from 1
855 
856  // signal that pos is now in the chamber reference frame
857  // (don't go back to the layer frame yet, since we may apply b-lines later on)
858  trfToML = m_delta.inverse()*absTransform().inverse()*transform(layerId);
859  conditionsApplied = true;
860  } else {
861  ATH_MSG_DEBUG( "No as-built corrections provided for stEta: "<<getStationEta() << " stPhi: "<<getStationPhi()<<" ml: "<<m_ml<<" layer: "<<strip_id.ilayer);
862  }
863  }
864 #endif
865 
866  //*********************
867  // B-Lines
868  //*********************
869  if (has_BLines()) {
870  // go to the multilayer reference frame if we are not already there
871  if (!conditionsApplied) {
872  trfToML = m_delta.inverse()*absTransform().inverse()*transform(layerId);
873  pos = trfToML*pos;
874  // signal that pos is now in the multilayer reference frame
875  conditionsApplied = true;
876  }
878  }
879 
880  // back to the layer reference frame from where we started
881  if (conditionsApplied) pos = trfToML.inverse()*pos;
882  }
883 
884 } // namespace MuonGM
PlotCalibFromCool.il
il
Definition: PlotCalibFromCool.py:381
python.changerun.bn
bn
Definition: changerun.py:79
MuonGM::sTgcReadoutElement::initDesignFromAGDD
void initDesignFromAGDD(double thickness)
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:274
TrapezoidBounds.h
sTGCReadoutParameters::sStripWidth
double sStripWidth
Definition: sTGCDetectorDescription.h:22
MuonGM::MuonPadDesign
Parameters defining the design of the readout sTGC pads.
Definition: MuonPadDesign.h:40
sTGCReadoutParameters::firstPadPhiDivision_A
std::vector< double > firstPadPhiDivision_A
Definition: sTGCDetectorDescription.h:27
MuonGM::MuonClusterReadoutElement::transform
virtual const Amg::Transform3D & transform() const override
Return local to global transform.
Definition: MuonClusterReadoutElement.h:124
MuonGM::MuonChannelDesign::inputPitch
double inputPitch
Definition: MuonChannelDesign.h:35
checkxAOD.ds
ds
Definition: Tools/PyUtils/bin/checkxAOD.py:257
MuonGM::MuonPadDesign::channelNumber
std::pair< int, int > channelNumber(const Amg::Vector2D &pos) const
calculate local channel number, range 1=nstrips like identifiers.
Definition: MuonPadDesign.cxx:39
sTGCDetectorDescription::ylFrame
void ylFrame(double y)
Definition: sTGCDetectorDescription.h:96
MuonGM::MuonChannelDesign::positionRelativeToStrip
int positionRelativeToStrip(const Amg::Vector2D &lpos, Amg::Vector2D &rel_pos) const
STRIPS ONLY.
Definition: MuonChannelDesign.h:282
MuonGM
Ensure that the Athena extensions are properly loaded.
Definition: GeoMuonHits.h:27
MuonGM::MuonChannelDesign::firstPos
double firstPos() const
Returns the position of the first strip along the x-axis.
Definition: MuonChannelDesign.h:481
CxxUtils::tokenizeDouble
std::vector< double > tokenizeDouble(const std::string &the_str, std::string_view delimiter)
Definition: Control/CxxUtils/Root/StringUtils.cxx:34
MuonGM::MuonReadoutElement::absTransform
const Amg::Transform3D & absTransform() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:210
sTGCDetectorDescription::sWidth
double sWidth() const
Definition: sTGCDetectorDescription.h:70
NswAsBuilt::StgcStripCalculator::position_t
The return object for querying strip positions with the method getPositionAlongStrip: a single point ...
Definition: StgcStripCalculator.h:67
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
MuonGM::sTgcReadoutElement::m_ALinePar
const ALinePar * m_ALinePar
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:225
AthCheckMacros.h
IRDBAccessSvc::getRecordsetPtr
virtual IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
Provides access to the Recordset object containing HVS-tagged data.
ParticleTest.eg
eg
Definition: ParticleTest.py:29
NswAsBuilt::stripIdentifier_t::quadruplet
quadrupletIdentifier_t quadruplet
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:82
MuonGM::sTgcReadoutElement::wireNumber
int wireNumber(const Amg::Vector2D &pos, const Identifier &id) const
wire number corresponding to local position
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:646
MuonGM::MuonChannelDesign::groupWidth
double groupWidth
Definition: MuonChannelDesign.h:39
sTGC_Technology.h
ALinePar
Definition: ALinePar.h:15
sTgcReadoutElement.h
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
CxxUtils::tokenizeInt
std::vector< int > tokenizeInt(const std::string &the_str, std::string_view delimiter)
Definition: Control/CxxUtils/Root/StringUtils.cxx:55
index
Definition: index.py:1
sTgcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
Definition: sTgcIdHelper.cxx:886
TrigConf::JetWindowSize::Size
Size
Definition: TriggerThresholdValue.h:17
MuonGM::sTgcReadoutElement::m_BLinePar
const BLinePar * m_BLinePar
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:226
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:46
ALinePar.h
Amg::getTranslateZ3D
Amg::Transform3D getTranslateZ3D(const double Z)
: Returns a shift transformation along the z-axis
Definition: GeoPrimitivesHelpers.h:285
MuonGM::MuonReadoutElement::largeSector
bool largeSector() const
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:49
ALFA_EventTPCnv_Dict::t0
std::vector< ALFA_RawData_p1 > t0
Definition: ALFA_EventTPCnvDict.h:42
sTGCReadoutParameters::nPadPhi
std::vector< int > nPadPhi
Definition: sTGCDetectorDescription.h:25
sTGCReadoutParameters::lPadWidth
double lPadWidth
Definition: sTGCDetectorDescription.h:21
MuonGM::sTgcReadoutElement::m_sWidthChamber
double m_sWidthChamber
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:220
MuonGM::sTgcReadoutElement::m_delta
Amg::Transform3D m_delta
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:227
sTGCDetectorDescription::Length
double Length() const
Definition: sTGCDetectorDescription.h:72
MuonGM::sTgcReadoutElement::getDesign
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:281
deg
#define deg
Definition: SbPolyhedron.cxx:17
NswAsBuilt::quadrupletIdentifier_t::STS
@ STS
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:29
MuonGM::sTgcReadoutElement::initDesign
void initDesign(double thickness)
initialize the design classes for this readout element
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:425
MuonGM::sTgcReadoutElement::has_ALines
bool has_ALines() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:189
MuonGM::sTgcReadoutElement::numberOfWires
int numberOfWires(const Identifier &id) const
Get the total number of wires (single wires) of a chamber.
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:684
sTGCReadoutParameters::nWireGroups
std::vector< int > nWireGroups
Definition: sTGCDetectorDescription.h:47
MuonGM::sTgcReadoutElement::spacePointPosition
virtual bool spacePointPosition(const Identifier &phiId, const Identifier &etaId, Amg::Vector2D &pos) const override final
space point position for a given pair of phi and eta identifiers The LocalPosition is expressed in th...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:438
BLinePar::getParameter
float getParameter(const Parameter p) const
Returns a given parameter.
Definition: BLinePar.h:39
MuonGM::sTgcReadoutElement::m_offset
double m_offset
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:218
sTGCReadoutParameters
Definition: sTGCDetectorDescription.h:19
sTGCDetectorDescription::Tck
double Tck() const
Definition: sTGCDetectorDescription.h:73
MuonGM::sTgcReadoutElement::m_padDesign
std::array< MuonPadDesign, 4 > m_padDesign
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:214
sTGCDetectorDescription::wirePitch
void wirePitch(double y)
Definition: sTGCDetectorDescription.h:81
MuonGM::sTgcReadoutElement::initDesignFromSQLite
void initDesignFromSQLite(double thickness)
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:77
MuonGM::sTgcReadoutElement::fillCache
virtual void fillCache() override final
function to fill tracking cache
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:459
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AGDDDetector::GetName
const std::string & GetName() const
Definition: AGDDDetector.h:40
sTGCDetectorDescription
Definition: sTGCDetectorDescription.h:51
Amg::getRotateZ3D
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Definition: GeoPrimitivesHelpers.h:270
MuonGM::MuonDetectorManager::getStgcAsBuiltCalculator
const NswAsBuilt::StgcStripCalculator * getStgcAsBuiltCalculator() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:152
MuonGM::sTgcReadoutElement::padNumber
int padNumber(const Amg::Vector2D &pos, const Identifier &id) const
pad number corresponding to local position
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:604
TRT::Hit::side
@ side
Definition: HitInfo.h:83
MuonGM::MuonReadoutElement::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:136
MuonGM::MuonChannelDesign::ChannelType::phiStrip
@ phiStrip
NswAsBuilt::StgcStripCalculator::IsValid::VALID
@ VALID
BchCleanup.mgr
mgr
Definition: BchCleanup.py:294
sTGCDetectorDescription.h
MuonGM::sTGC_Technology
Definition: MuonAGDDDescription/MuonAGDDDescription/sTGC_Technology.h:16
DiamondBounds.h
sTGCDetectorDescription::yCutoutCathode
void yCutoutCathode(double y)
Definition: sTGCDetectorDescription.h:87
MuonGM::MuonReadoutElement::refreshCache
void refreshCache()
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:177
MuonGM::MuonClusterReadoutElement::m_surfaceData
std::unique_ptr< SurfaceData > m_surfaceData
Definition: MuonClusterReadoutElement.h:120
MuonGM::sTgcReadoutElement::has_BLines
bool has_BLines() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:190
CorrContainer.h
sTGCReadoutParameters::PadPhiShift_A
std::vector< double > PadPhiShift_A
Definition: sTGCDetectorDescription.h:29
IRDBAccessSvc.h
Definition of the abstract IRDBAccessSvc interface.
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
sTgcIdHelper::channel
int channel(const Identifier &id) const override
Definition: sTgcIdHelper.cxx:1027
MuonGM::MuonReadoutElement::getStationName
const std::string & getStationName() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:190
IRDBAccessSvc
IRDBAccessSvc is an abstract interface to the athena service that provides the following functionalit...
Definition: IRDBAccessSvc.h:45
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MuonGM::MuonReadoutElement::setIdentifier
void setIdentifier(const Identifier &id)
Sets the Identifier, hashes & station names.
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:156
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MuonGM::sTgcReadoutElement::m_lWidthChamber
double m_lWidthChamber
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:221
CaloNoise_fillDB.dt
dt
Definition: CaloNoise_fillDB.py:58
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
sTGCDetectorDescription::stripWidth
void stripWidth(double y)
Definition: sTGCDetectorDescription.h:84
MuonGM::sTgcReadoutElement::m_diamondShape
bool m_diamondShape
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:224
MuonGM::sTgcReadoutElement::posOnDefChamber
void posOnDefChamber(Amg::Vector3D &locPosML) const
transform a position (in chamber-frame coordinates) to the deformed-chamber geometry
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:751
NswAsBuilt::stripIdentifier_t
Athena indices of a MM strip.
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:81
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
sTgcIdHelper::gasGap
int gasGap(const Identifier &id) const override
get the hashes
Definition: sTgcIdHelper.cxx:1020
test_pyathena.parent
parent
Definition: test_pyathena.py:15
RotatedDiamondBounds.h
MuonGM::MuonDetectorManager::stgcIdHelper
const sTgcIdHelper * stgcIdHelper() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:233
sTGCDetectorDescription::ysFrame
void ysFrame(double y)
Definition: sTGCDetectorDescription.h:93
Trk::DetectorElemType
DetectorElemType
Definition: TrkDetElementBase.h:39
MuonGM::sTgcReadoutElement::setDelta
void setDelta(const ALinePar &aline)
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:720
sTGCDetectorHelper.h
IGeoDbTagSvc
Definition: IGeoDbTagSvc.h:26
MuonGM::MuonReadoutElement::manager
const MuonDetectorManager * manager() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:204
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
ALinePar::delta
Amg::Transform3D delta() const
Definition: ALinePar.cxx:45
sTGCReadoutParameters::wireGroupWidth
int wireGroupWidth
Definition: sTGCDetectorDescription.h:37
BLinePar
Definition: BLinePar.h:14
sTGCReadoutParameters::nPadH
std::vector< double > nPadH
Definition: sTGCDetectorDescription.h:31
MuonGM::MuonPadDesign::channelWidth
double channelWidth(const Amg::Vector2D &pos, bool measPhi, bool preciseMeas=false) const
calculate local channel width
Definition: MuonPadDesign.h:142
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
sTGCDetectorDescription::GetTechnology
MuonGM::sTGC_Technology * GetTechnology()
Definition: sTGCDetectorDescription.cxx:49
MuonGM::sTgcReadoutElement::setChamberLayer
void setChamberLayer(int ml)
set methods only to be used by MuonGeoModel
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:174
MuonGM::sTgcReadoutElement::channelPitch
double channelPitch(const Identifier &id) const
Channel pitch.
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:582
MuonGM::MuonReadoutElement::setStationName
void setStationName(const std::string &)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:169
sTGCReadoutParameters::firstWireGroup
std::vector< int > firstWireGroup
Definition: sTGCDetectorDescription.h:48
MuonIdHelper::stationPhi
int stationPhi(const Identifier &id) const
Definition: MuonIdHelper.cxx:814
MuonGM::sTgcReadoutElement::clearALinePar
void clearALinePar()
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:736
MuonGM::sTgcReadoutElement::m_Xlg
std::array< Amg::Transform3D, 4 > m_Xlg
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:230
sTGCReadoutParameters::lStripWidth
double lStripWidth
Definition: sTGCDetectorDescription.h:23
MuonGM::nStrips
int nStrips(const MuonGM::TgcReadoutElement &readoutEle, int layer)
Definition: MuonDetDescr/MuonGeoModelTest/src/GeoModelTgcTest.cxx:46
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
sTGCReadoutParameters::padH
std::vector< double > padH
Definition: sTGCDetectorDescription.h:24
MuonGM::sTgcReadoutElement::containsId
virtual bool containsId(const Identifier &id) const override final
function to be used to check whether a given Identifier is contained in the readout element
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:560
sTGCReadoutParameters::firstStripWidth
std::vector< double > firstStripWidth
Definition: sTGCDetectorDescription.h:42
sTGCDetectorDescription::xFrame
void xFrame(double y)
Definition: sTGCDetectorDescription.h:90
sTGCReadoutParameters::wireCutout
std::vector< double > wireCutout
Definition: sTGCDetectorDescription.h:35
MuonGM::sTgcReadoutElement::m_nlayers
static constexpr int m_nlayers
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:216
IdentifierHash.h
sTgcIdHelper::padID
Identifier padID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int padEta, int padPhi) const
Definition: sTgcIdHelper.cxx:939
PlotCalibFromCool.en
en
Definition: PlotCalibFromCool.py:399
MuonGM::sTgcReadoutElement::m_idHelper
const sTgcIdHelper & m_idHelper
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:211
NswAsBuilt::StgcStripCalculator
The main interface of the NswAsBuilt package: determines strip positions in the frame of the quadrupl...
Definition: StgcStripCalculator.h:31
sTgcIdHelper
Definition: sTgcIdHelper.h:55
MuonIdHelper::stationEta
int stationEta(const Identifier &id) const
Definition: MuonIdHelper.cxx:809
MuonGM::sTgcReadoutElement::m_tckChamber
double m_tckChamber
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:223
Amg::getRotateY3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Definition: GeoPrimitivesHelpers.h:261
MuonGM::MuonChannelDesign::wireNumber
int wireNumber(const Amg::Vector2D &pos) const
calculate the sTGC wire number. The method can return a value outside the range [1,...
Definition: MuonChannelDesign.h:259
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonGM::MuonChannelDesign::DetType::STGC
@ STGC
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
sTGCReadoutParameters::firstPadRow
std::vector< int > firstPadRow
Definition: sTGCDetectorDescription.h:33
MuonGM::sTGC_Technology::gasThickness
double gasThickness
Definition: MuonAGDDDescription/MuonAGDDDescription/sTGC_Technology.h:20
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
sTGCReadoutParameters::firstPadH
std::vector< double > firstPadH
Definition: sTGCDetectorDescription.h:32
MuonGM::MuonClusterReadoutElement
Definition: MuonClusterReadoutElement.h:21
MuonGM::MuonChannelDesign::type
ChannelType type
Definition: MuonChannelDesign.h:32
BLinePar::Parameter
Parameter
Definition: BLinePar.h:21
MuonGM::MuonChannelDesign
Definition: MuonChannelDesign.h:24
NswAsBuilt::stripIdentifier_t::ilayer
int ilayer
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:83
MuonGM::sTgcReadoutElement::m_phiDesign
std::array< MuonChannelDesign, 4 > m_phiDesign
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:212
IRDBRecord.h
Definition of the abstract IRDBRecord interface.
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
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
sTGCReadoutParameters::firstWire
std::vector< double > firstWire
Definition: sTGCDetectorDescription.h:36
sTgcIdHelper::Pad
@ Pad
Definition: sTgcIdHelper.h:190
MuonGM::sTgcReadoutElement::setBLinePar
void setBLinePar(const BLinePar &bLine)
read B-line (chamber-deformation) parameters
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:745
sTGCDetectorDescription::lWidth
double lWidth() const
Definition: sTGCDetectorDescription.h:71
PlaneSurface.h
IRDBRecord
IRDBRecord is one record in the IRDBRecordset object.
Definition: IRDBRecord.h:27
GeoPrimitivesHelpers.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
NswAsBuilt::stripIdentifier_t::istrip
int istrip
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:84
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
MuonGM::sTgcReadoutElement::positionFirstWire
double positionFirstWire(const Identifier &id) const
Get the local position of the first wire of the chamber corresponding to the identifier.
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:667
MuonGM::MuonReadoutElement::identify
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:184
NswAsBuilt::StgcStripCalculator::position_t::pos
Amg::Vector3D pos
Definition: StgcStripCalculator.h:69
python.changerun.pv
pv
Definition: changerun.py:81
GeoPrimitivesToStringConverter.h
checkFileSG.fi
fi
Definition: checkFileSG.py:65
MuonGM::sTgcReadoutElement::m_ml
int m_ml
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:217
sTgcIdHelper::multilayerID
Identifier multilayerID(const Identifier &channeldID) const
Definition: sTgcIdHelper.cxx:296
NswAsBuilt::quadrupletIdentifier_t::STL
@ STL
Definition: MuonSpectrometer/MuonDetDescr/MuonNSWAsBuilt/MuonNSWAsBuilt/Identifier.h:30
MuonGM::MuonChannelDesign::nch
int nch
Definition: MuonChannelDesign.h:34
sTGCReadoutParameters::sPadWidth
double sPadWidth
Definition: sTGCDetectorDescription.h:20
MuonGM::sTgcReadoutElement::m_etaDesign
std::array< MuonChannelDesign, 4 > m_etaDesign
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:213
MuonGM::sTgcReadoutElement::getPadDesign
const MuonPadDesign * getPadDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:287
MuonGM::sTgcReadoutElement::wirePitch
double wirePitch(int gas_gap=1) const
single wire pitch.
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:657
NswAsBuilt::Element::ParameterClass::CORRECTION
@ CORRECTION
IRDBRecordset.h
Definition of the abstract IRDBRecordset interface.
MuonGM::sTgcReadoutElement::localToGlobalCoords
Amg::Vector3D localToGlobalCoords(const Amg::Vector3D &locPos, Identifier id) const
simHit local (SD) To Global position - to be used by MuonGeoAdaprors only
Definition: MuonDetDescr/MuonReadoutGeometry/src/sTgcReadoutElement.cxx:701
sTGCReadoutParameters::nWires
std::vector< int > nWires
Definition: sTGCDetectorDescription.h:34
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
RotatedTrapezoidBounds.h
MuonGM::sTgcReadoutElement::~sTgcReadoutElement
~sTgcReadoutElement()
destructor
sTgcIdHelper::channelType
int channelType(const Identifier &id) const
Definition: sTgcIdHelper.cxx:1022
sTGCDetectorHelper
Definition: sTGCDetectorHelper.h:24
NswAsBuilt::StgcStripCalculator::position_t::isvalid
IsValid isvalid
Definition: StgcStripCalculator.h:68
sTGCReadoutParameters::anglePadPhi
double anglePadPhi
Definition: sTGCDetectorDescription.h:26
python.SystemOfUnits.pc
float pc
Definition: SystemOfUnits.py:99
MuonGM::MuonReadoutElement::getStationPhi
int getStationPhi() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:194
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
MuonGM::MuonReadoutElement::getStationEta
int getStationEta() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:193
sTGCDetectorHelper::Get_sTGCDetector
sTGCDetectorDescription * Get_sTGCDetector(char type, int ieta, int iphi, int layer=1, char side='A')
Definition: sTGCDetectorHelper.cxx:35
MuonGM::MuonChannelDesign::ChannelType::etaStrip
@ etaStrip
sTGCDetectorDescription::stripPitch
void stripPitch(double y)
Definition: sTGCDetectorDescription.h:78
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
sTGCReadoutParameters::nStrips
int nStrips
Definition: sTGCDetectorDescription.h:38
Amg::getTranslate3D
Amg::Transform3D getTranslate3D(const double X, const double Y, const double Z)
: Returns a shift transformation along an arbitrary axis
Definition: GeoPrimitivesHelpers.h:289
MuonGM::sTgcReadoutElement::m_lengthChamber
double m_lengthChamber
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/sTgcReadoutElement.h:222
sTGCDetectorDescription::GetReadoutParameters
sTGCReadoutParameters & GetReadoutParameters()
Definition: sTGCDetectorDescription.h:101