CMS 3D CMS Logo

ME0GeometryBuilder.cc
Go to the documentation of this file.
1 /*
2 //\class ME0GeometryBuilder
3 
4  Description: ME0 Geometry builder from DD & DD4hep
5  DD4hep part added to the original old file (DD version) made by M. Maggi (INFN Bari)
6  Sergio Lo Meo (sergio.lo.meo@cern.ch) following what Ianna Osborne made for DTs (DD4hep migration)
7  Updated by Sunanda Banerjee (Fermilab) to make it work for DDD/DD4hep
8  Updated: 7 August 2020
9 */
13 
20 
25 
29 
30 #include <algorithm>
31 #include <iostream>
32 #include <string>
33 
34 using namespace geant_units::operators;
35 //#define EDM_ML_DEBUG
36 
38 
40 
42  std::string attribute = "MuStructure";
43  std::string value = "MuonEndCapME0";
45  DDFilteredView fview(*cview, filter);
46  return this->buildGeometry(fview, muonConstants);
47 }
48 
49 // for DD4hep
51  std::string attribute = "MuStructure";
52  std::string value = "MuonEndCapME0";
53  const cms::DDFilter filter(attribute, value);
54  cms::DDFilteredView fview(*cview, filter);
55  return this->buildGeometry(fview, muonConstants);
56 }
57 
60  MuonGeometryNumbering mdddnum(muonConstants);
61  ME0NumberingScheme me0Num(muonConstants);
62 
63  LogTrace("ME0Geometry") << "Building the geometry service";
64  LogTrace("ME0Geometry") << "About to run through the ME0 structure\n"
65  << "Top level logical part: " << fv.logicalPart().name().name();
66 
67 // ==========================================
68 // === Test to understand the structure ===
69 // ==========================================
70 #ifdef EDM_ML_DEBUG
71  bool testChambers = fv.firstChild();
72  LogTrace("ME0Geometry") << "doChamber = fv.firstChild() = " << testChambers;
73 
74  while (testChambers) {
75  // to etapartitions
76  LogTrace("ME0Geometry") << "to layer " << fv.firstChild();
77  LogTrace("ME0Geometry") << "to etapt " << fv.firstChild();
80  ME0DetId detIdCh = detId.chamberId();
81  // back to chambers
82  LogTrace("ME0Geometry") << "back to layer " << fv.parent();
83  LogTrace("ME0Geometry") << "back to chamb " << fv.parent();
84 
85  LogTrace("ME0Geometry") << "In DoChambers Loop :: ME0DetId " << detId << " = " << detId.rawId()
86  << " (which belongs to ME0Chamber " << detIdCh << " = " << detIdCh.rawId() << ")";
87  LogTrace("ME0Geometry") << "Second level logical part: " << fv.logicalPart().name().name();
89  std::vector<double> dpar2 = solid2.parameters();
90  std::stringstream parameters2;
91  for (unsigned int i = 0; i < dpar2.size(); ++i) {
92  parameters2 << " dpar[" << i << "]=" << convertMmToCm(dpar2[i]) << "cm ";
93  }
94  LogTrace("ME0Geometry") << "Second level parameters: vector with size = " << dpar2.size() << " and elements "
95  << parameters2.str();
96 
97  bool doLayers = fv.firstChild();
98 
99  LogTrace("ME0Geometry") << "doLayer = fv.firstChild() = " << doLayers;
100  while (doLayers) {
101  // to etapartitions
102  LogTrace("ME0Geometry") << "to etapt " << fv.firstChild();
105  ME0DetId detIdLa = detId.layerId();
106  // back to layers
107  LogTrace("ME0Geometry") << "back to layer " << fv.parent();
108  LogTrace("ME0Geometry") << "In DoLayers Loop :: ME0DetId " << detId << " = " << detId.rawId()
109  << " (which belongs to ME0Layer " << detIdLa << " = " << detIdLa.rawId() << ")";
110  LogTrace("ME0Geometry") << "Third level logical part: " << fv.logicalPart().name().name();
111  DDBooleanSolid solid3 = (DDBooleanSolid)(fv.logicalPart().solid());
112  std::vector<double> dpar3 = solid3.parameters();
113  std::stringstream parameters3;
114  for (unsigned int i = 0; i < dpar3.size(); ++i) {
115  parameters3 << " dpar[" << i << "]=" << convertMmToCm(dpar3[i]) << "cm ";
116  }
117  LogTrace("ME0Geometry") << "Third level parameters: vector with size = " << dpar3.size() << " and elements "
118  << parameters3.str();
119  bool doEtaParts = fv.firstChild();
120 
121  LogTrace("ME0Geometry") << "doEtaPart = fv.firstChild() = " << doEtaParts;
122  while (doEtaParts) {
123  LogTrace("ME0Geometry") << "In DoEtaParts Loop :: ME0DetId " << detId << " = " << detId.rawId();
124  LogTrace("ME0Geometry") << "Fourth level logical part: " << fv.logicalPart().name().name();
125  DDBooleanSolid solid4 = (DDBooleanSolid)(fv.logicalPart().solid());
126  std::vector<double> dpar4 = solid4.parameters();
127  std::stringstream parameters4;
128  for (unsigned int i = 0; i < dpar4.size(); ++i) {
129  parameters4 << " dpar[" << i << "]=" << convertMmToCm(dpar4[i]) << "cm ";
130  }
131  LogTrace("ME0Geometry") << "Fourth level parameters: vector with size = " << dpar4.size() << " and elements "
132  << parameters4.str();
133 
134  doEtaParts = fv.nextSibling();
135  LogTrace("ME0Geometry") << "doEtaPart = fv.nextSibling() = " << doEtaParts;
136  }
137  fv.parent();
138  LogTrace("ME0Geometry") << "went back to parent :: name = " << fv.logicalPart().name().name()
139  << " will now ask for nextSibling";
140  doLayers = fv.nextSibling();
141  LogTrace("ME0Geometry") << "doLayer = fv.nextSibling() = " << doLayers;
142  }
143  fv.parent();
144  LogTrace("ME0Geometry") << "went back to parent :: name = " << fv.logicalPart().name().name()
145  << " will now ask for nextSibling";
146  testChambers = fv.nextSibling();
147  LogTrace("ME0Geometry") << "doChamber = fv.nextSibling() = " << testChambers;
148  }
149  fv.parent();
150 #endif
151 
152  // ==========================================
153  // === Here the Real ME0 Geometry Builder ===
154  // ==========================================
155  bool doChambers = fv.firstChild();
156 
157  while (doChambers) {
158  // to etapartitions and back again to pick up DetId
159  fv.firstChild();
160  fv.firstChild();
161 
162 #ifdef EDM_ML_DEBUG
163  edm::LogVerbatim("ME0Geometry") << "MuonGeometry 1 " << fv.geoHistory() << " Levels "
164  << mdddnum.geoHistoryToBaseNumber(fv.geoHistory()).getLevels();
165 #endif
168  ME0DetId detIdCh = detId.chamberId();
169 
170  fv.parent();
171  fv.parent();
172 #ifdef EDM_ML_DEBUG
173  edm::LogVerbatim("ME0Geometry") << "MuonGeometry 2 " << fv.geoHistory() << " Levels "
174  << mdddnum.geoHistoryToBaseNumber(fv.geoHistory()).getLevels();
175 #endif
176  // build chamber
177  ME0Chamber* me0Chamber = buildChamber(fv, detIdCh);
178  geometry->add(me0Chamber);
179 
180  // loop over layers of the chamber
181  bool doLayers = fv.firstChild();
182 
183  while (doLayers) {
184  // to etapartitions and back again to pick up DetId
185  fv.firstChild();
188  ME0DetId detIdLa = detId.layerId();
189  fv.parent();
190 #ifdef EDM_ML_DEBUG
191  edm::LogVerbatim("ME0Geometry") << "MuonGeometry 3 " << fv.geoHistory() << " Levels "
192  << mdddnum.geoHistoryToBaseNumber(fv.geoHistory()).getLevels();
193 #endif
194  // build layer
195  ME0Layer* me0Layer = buildLayer(fv, detIdLa);
196  me0Chamber->add(me0Layer);
197  geometry->add(me0Layer);
198 
199  // loop over etapartitions of the layer
200  bool doEtaParts = fv.firstChild();
201 
202  while (doEtaParts) {
203  // pick up DetId
204 #ifdef EDM_ML_DEBUG
205  edm::LogVerbatim("ME0Geometry") << "MuonGeometry 4 " << fv.geoHistory() << " Levels "
206  << mdddnum.geoHistoryToBaseNumber(fv.geoHistory()).getLevels();
207 #endif
210 
211  // build etapartition
212  ME0EtaPartition* etaPart = buildEtaPartition(fv, detId);
213  me0Layer->add(etaPart);
214  geometry->add(etaPart);
215 
216  doEtaParts = fv.nextSibling();
217  }
218  fv.parent();
219 
220  doLayers = fv.nextSibling();
221  }
222  fv.parent();
223 
224  doChambers = fv.nextSibling();
225  }
226  return geometry;
227 }
228 
230  LogTrace("ME0Geometry") << "buildChamber " << fv.logicalPart().name().name() << " " << detId << std::endl;
232 
233  std::vector<double> dpar = solid.parameters();
234 
235  double L = convertMmToCm(dpar[0]); // length is along local Y
236  double T = convertMmToCm(dpar[3]); // thickness is long local Z
237  double b = convertMmToCm(dpar[4]); // bottom width is along local X
238  double B = convertMmToCm(dpar[8]); // top width is along local X
239 
240 #ifdef EDM_ML_DEBUG
241  LogTrace("ME0Geometry") << " name of logical part = " << fv.logicalPart().name().name() << std::endl;
242  LogTrace("ME0Geometry") << " dpar is vector with size = " << dpar.size() << std::endl;
243  for (unsigned int i = 0; i < dpar.size(); ++i) {
244  LogTrace("ME0Geometry") << " dpar [" << i << "] = " << convertMmToCm(dpar[i]) << " cm " << std::endl;
245  }
246  LogTrace("ME0Geometry") << "size b: " << b << "cm, B: " << B << "cm, L: " << L << "cm, T: " << T << "cm "
247  << std::endl;
248 #endif
249 
250  bool isOdd = false; // detId.chamber()%2;
251  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, T), isOdd));
252  ME0Chamber* chamber = new ME0Chamber(detId.chamberId(), surf);
253  return chamber;
254 }
255 
257  LogTrace("ME0Geometry") << "buildLayer " << fv.logicalPart().name().name() << " " << detId << std::endl;
258 
260 
261  std::vector<double> dpar = solid.parameters();
262  double L = convertMmToCm(dpar[0]); // length is along local Y
263  double t = convertMmToCm(dpar[3]); // thickness is long local Z
264  double b = convertMmToCm(dpar[4]); // bottom width is along local X
265  double B = convertMmToCm(dpar[8]); // top width is along local X
266 
267 #ifdef EDM_ML_DEBUG
268  LogTrace("ME0Geometry") << " name of logical part = " << fv.logicalPart().name().name() << std::endl;
269  LogTrace("ME0Geometry") << " dpar is vector with size = " << dpar.size() << std::endl;
270  for (unsigned int i = 0; i < dpar.size(); ++i) {
271  LogTrace("ME0Geometry") << " dpar [" << i << "] = " << convertMmToCm(dpar[i]) << " cm " << std::endl;
272  }
273  LogTrace("ME0Geometry") << "size b: " << b << "cm, B: " << B << "cm, L: " << L << "cm, t: " << t << "cm "
274  << std::endl;
275 #endif
276 
277  bool isOdd = false; // detId.chamber()%2;
278  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, t), isOdd));
279  ME0Layer* layer = new ME0Layer(detId.layerId(), surf);
280  return layer;
281 }
282 
284  LogTrace("ME0Geometry") << "buildEtaPartition " << fv.logicalPart().name().name() << " " << detId << std::endl;
285 
286  // EtaPartition specific parameter (nstrips and npads)
287  DDValue numbOfStrips("nStrips");
288  DDValue numbOfPads("nPads");
289  std::vector<const DDsvalues_type*> specs(fv.specifics());
290  double nStrips = 0., nPads = 0.;
291  for (const auto& is : specs) {
292  if (DDfetch(is, numbOfStrips))
293  nStrips = numbOfStrips.doubles()[0];
294  if (DDfetch(is, numbOfPads))
295  nPads = numbOfPads.doubles()[0];
296  }
297 
298  LogTrace("ME0Geometry") << ((nStrips == 0.) ? ("No nStrips found!!")
299  : ("Number of strips: " + std::to_string(nStrips)));
300  LogTrace("ME0Geometry") << ((nPads == 0.) ? ("No nPads found!!") : ("Number of pads: " + std::to_string(nPads)));
301 
302  // EtaPartition specific parameter (size)
303  std::vector<double> dpar = fv.logicalPart().solid().parameters();
304  double b = convertMmToCm(dpar[4]); // half bottom edge
305  double B = convertMmToCm(dpar[8]); // half top edge
306  double L = convertMmToCm(dpar[0]); // half apothem
307  double t = convertMmToCm(dpar[3]); // half thickness
308 
309 #ifdef EDM_ML_DEBUG
310  LogTrace("ME0Geometry") << " name of logical part = " << fv.logicalPart().name().name() << std::endl;
311  LogTrace("ME0Geometry") << " dpar is vector with size = " << dpar.size() << std::endl;
312  for (unsigned int i = 0; i < dpar.size(); ++i) {
313  LogTrace("ME0Geometry") << " dpar [" << i << "] = " << convertMmToCm(dpar[i]) << " cm " << std::endl;
314  }
315  LogTrace("ME0Geometry") << "size b: " << b << "cm, B: " << B << "cm, L: " << L << "cm, t: " << t << "cm "
316  << std::endl;
317 #endif
318 
319  std::vector<float> pars;
320  pars.emplace_back(b);
321  pars.emplace_back(B);
322  pars.emplace_back(L);
323  pars.emplace_back(nStrips);
324  pars.emplace_back(nPads);
325 
326  bool isOdd = false; // detId.chamber()%2;
327  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, t), isOdd));
328  std::string name = fv.logicalPart().name().name();
330 
331  ME0EtaPartition* etaPartition = new ME0EtaPartition(detId, surf, e_p_specs);
332  return etaPartition;
333 }
334 
336  Bounds* bounds,
337  bool isOddChamber) const {
338  // extract the position
339  const DDTranslation& trans(fv.translation());
340  const Surface::PositionType posResult(
341  float(convertMmToCm(trans.x())), float(convertMmToCm(trans.y())), float(convertMmToCm(trans.z())));
342 
343  const DDRotationMatrix& rotation = fv.rotation();
344  DD3Vector x, y, z;
345  rotation.GetComponents(x, y, z);
346 
347  Surface::RotationType rotResult(float(x.X()),
348  float(x.Y()),
349  float(x.Z()),
350  float(y.X()),
351  float(y.Y()),
352  float(y.Z()),
353  float(z.X()),
354  float(z.Y()),
355  float(z.Z()));
356 
357  //Change of axes for the forward
358  Basic3DVector<float> newX(1., 0., 0.);
359  Basic3DVector<float> newY(0., 0., 1.);
360  Basic3DVector<float> newZ(0., 1., 0.);
361  newY *= -1;
362 
363  rotResult.rotateAxes(newX, newY, newZ);
364 
365  return ME0BoundPlane(new BoundPlane(posResult, rotResult, bounds));
366 }
367 
368 // dd4hep
369 
372  MuonGeometryNumbering mdddnum(muonConstants);
373  ME0NumberingScheme me0Num(muonConstants);
374 
375  static constexpr uint32_t levelChamber = 7;
376  static constexpr uint32_t levelLayer = 8;
377  uint32_t theLevelPart = muonConstants.getValue("level");
378  uint32_t theSectorLevel = muonConstants.getValue("m0_sector") / theLevelPart;
379  std::vector<ME0Chamber*> chambers;
380  std::vector<ME0Layer*> layers;
381 
382  while (fv.firstChild()) {
383  const auto& history = fv.history();
386 #ifdef EDM_ML_DEBUG
387  edm::LogVerbatim("ME0Geometry") << fv.name() << " with " << history.tags.size() << " Levels and ID " << detId
388  << " Mask " << std::hex << ME0DetId::chamberIdMask_ << ":" << ME0DetId::layerIdMask_
389  << std::dec << " and " << ME0DetId(((detId.rawId()) & ME0DetId::chamberIdMask_))
390  << ":" << ME0DetId(((detId.rawId()) & ME0DetId::layerIdMask_)) << " Sector Level "
391  << theSectorLevel << ":" << history.tags.size() << ":" << fv.level();
392  for (unsigned int k = 0; k < history.tags.size(); ++k)
393  edm::LogVerbatim("ME0Geometry") << "[" << k << "] Tag " << history.tags[k] << " Offset " << history.offsets[k]
394  << " copy " << history.copyNos[k];
395 #endif
396 
397  if (fv.level() == levelChamber) {
398  // build chamber
399  ME0Chamber* me0Chamber = buildChamber(fv, detId);
400  chambers.emplace_back(me0Chamber);
401  } else if (fv.level() == levelLayer) {
402  // build layer
403  ME0Layer* me0Layer = buildLayer(fv, detId);
404  layers.emplace_back(me0Layer);
405  } else if (history.tags.size() > theSectorLevel) {
406  // build first eta partition
407  ME0EtaPartition* etaPart = buildEtaPartition(fv, detId);
408  geometry->add(etaPart);
409  }
410  }
411 
412  auto const& partitions = geometry->etaPartitions();
413  for (auto& layer : layers) {
414  uint32_t id0 = ((layer->id().rawId()) & ME0DetId::layerIdMask_);
415  for (auto& etaPart : partitions) {
416  if (((etaPart->id().rawId()) & ME0DetId::layerIdMask_) == id0) {
417  layer->add(etaPart);
418  }
419  }
420  geometry->add(layer);
421  }
422  for (auto& chamber : chambers) {
423  uint32_t id0 = ((chamber->id().rawId()) & ME0DetId::chamberIdMask_);
424  for (auto& layer : layers) {
425  if (((layer->id().rawId()) & ME0DetId::chamberIdMask_) == id0) {
426  chamber->add(layer);
427  }
428  }
429  geometry->add(chamber);
430  }
431  return geometry;
432 }
433 
435  std::vector<double> dpar = fv.parameters();
436 
437  double L = k_ScaleFromDD4hep * dpar[3];
438  double T = k_ScaleFromDD4hep * dpar[2];
439  double b = k_ScaleFromDD4hep * dpar[0];
440  double B = k_ScaleFromDD4hep * dpar[1];
441  bool isOdd = false;
442  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, T), isOdd));
443  ME0Chamber* chamber = new ME0Chamber(detId.chamberId(), surf);
444 
445  return chamber;
446 }
447 
449  std::vector<double> dpar = fv.parameters();
450 
451  double L = k_ScaleFromDD4hep * dpar[3];
452  double t = k_ScaleFromDD4hep * dpar[2];
453  double b = k_ScaleFromDD4hep * dpar[0];
454  double B = k_ScaleFromDD4hep * dpar[1];
455  bool isOdd = false;
456  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, t), isOdd));
457  ME0Layer* layer = new ME0Layer(detId.layerId(), surf);
458 
459  return layer;
460 }
461 
463  // auto nStrips = fv.get<double>("nStrips"); //it doesn't work
464  // auto nPads = fv.get<double>("nPads"); //it doesn't work
465 
466  auto nStrips = 384; // from GEMSpecs
467  auto nPads = 192; // from GEMSpecs
468 
469  std::vector<double> dpar = fv.parameters();
470 
471  double b = k_ScaleFromDD4hep * dpar[0];
472  double B = k_ScaleFromDD4hep * dpar[1];
473  double L = k_ScaleFromDD4hep * dpar[3];
474  double t = k_ScaleFromDD4hep * dpar[2];
475 
476  const std::vector<float> pars{float(dpar[0]), float(dpar[1]), float(dpar[3]), float(nStrips), float(nPads)};
477 
478  bool isOdd = false;
479  ME0BoundPlane surf(boundPlane(fv, new TrapezoidalPlaneBounds(b, B, L, t), isOdd));
480 
481  std::string_view name = fv.name();
482 
484 
485  ME0EtaPartition* etaPartition = new ME0EtaPartition(detId, surf, e_p_specs);
486 
487  return etaPartition;
488 }
489 
491  Bounds* bounds,
492  bool isOddChamber) const {
493  // extract the position
494  const Double_t* trans = fv.trans();
495  Surface::PositionType posResult(
496  k_ScaleFromDD4hep * trans[0], k_ScaleFromDD4hep * trans[1], k_ScaleFromDD4hep * trans[2]);
497 
498  // now the rotation
500  fv.rot(rotation);
501  DD3Vector x, y, z;
502  rotation.GetComponents(x, y, z);
503  Surface::RotationType rotResult(float(x.X()),
504  float(x.Y()),
505  float(x.Z()),
506  float(y.X()),
507  float(y.Y()),
508  float(y.Z()),
509  float(z.X()),
510  float(z.Y()),
511  float(z.Z()));
512 
513  //Change of axes for the forward
514  Basic3DVector<float> newX(1., 0., 0.);
515  Basic3DVector<float> newY(0., 0., 1.);
516  Basic3DVector<float> newZ(0., 1., 0.);
517  newY *= -1;
518 
519  rotResult.rotateAxes(newX, newY, newZ);
520 
521  return ME0BoundPlane(new BoundPlane(posResult, rotResult, bounds));
522 }
int getValue(const std::string &name) const
Log< level::Info, true > LogVerbatim
bool parent()
set the current node to the parent node ...
Definition: APVGainStruct.h:7
ME0Geometry * build(const DDCompactView *cview, const MuonGeometryConstants &muonConstants)
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
Definition: DDValue.cc:111
bool nextSibling()
set the current node to the next sibling ...
Plane BoundPlane
Definition: Plane.h:94
const Double_t * rot() const
The absolute rotation of the current node.
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:125
int baseNumberToUnitNumber(const MuonBaseNumber &) const override
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
static constexpr uint32_t chamberIdMask_
Definition: ME0DetId.h:93
void add(ME0Layer *layer)
Add Layer to the chamber which takes ownership.
Definition: ME0Chamber.cc:16
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:79
static std::string to_string(const XMLCh *ch)
nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
TkRotation & rotateAxes(const Basic3DVector< T > &newX, const Basic3DVector< T > &newY, const Basic3DVector< T > &newZ)
#define LogTrace(id)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
std::string_view name() const
const Double_t * trans() const
The absolute translation of the current node.
const std::string & name() const
Returns the name.
Definition: DDName.cc:41
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
ME0Layer * buildLayer(DDFilteredView &fv, ME0DetId detId) const
const ExpandedNodes & history()
The numbering history of the current node.
ME0BoundPlane boundPlane(const DDFilteredView &fv, Bounds *bounds, bool isOddChamber) const
const int level() const
get Iterator level
void add(const ME0EtaPartition *roll)
Add EtaPartition to the layer which takes ownership.
Definition: ME0Layer.cc:15
Definition: value.py:1
bool firstChild()
set the current node to the first child
const N & name() const
Definition: DDBase.h:58
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the filtered-view.
static constexpr uint32_t layerIdMask_
Definition: ME0DetId.h:94
std::vector< const DDsvalues_type * > specifics() const
constexpr NumType convertMmToCm(NumType millimeters)
Definition: angle_units.h:44
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
double b
Definition: hdecay.h:120
ME0Geometry * buildGeometry(DDFilteredView &fview, const MuonGeometryConstants &muonConstants)
ME0Chamber * buildChamber(DDFilteredView &fv, ME0DetId detId) const
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
bool firstChild()
set the current node to the first child ...
float x
Definition: Bounds.h:18
static char chambers[264][20]
Definition: ReadPGInfo.cc:243
const DDTranslation & translation() const
The absolute translation of the current node.
long double T
const std::vector< double > parameters() const
extract shape parameters
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
MuonBaseNumber geoHistoryToBaseNumber(const DDGeoHistory &history) const
ME0EtaPartition * buildEtaPartition(DDFilteredView &fv, ME0DetId detId) const