CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TotemRPGeometryESModule.cc
Go to the documentation of this file.
1 /****************************************************************************
2 *
3 * Authors:
4 * Jan Kaspar (jan.kaspar@gmail.com)
5 * Dominik Mierzejewski <dmierzej@cern.ch>
6 *
7 ****************************************************************************/
8 
16 
27 
39 
40 #include <TMatrixD.h>
41 
54 {
55  public:
57  virtual ~TotemRPGeometryESModule();
58 
59  std::unique_ptr<DDCompactView> produceMeasuredDDCV(const VeryForwardMeasuredGeometryRecord &);
60 
61  std::unique_ptr<DetGeomDesc> produceMeasuredGD(const VeryForwardMeasuredGeometryRecord &);
62  std::unique_ptr<TotemRPGeometry> produceMeasuredTG(const VeryForwardMeasuredGeometryRecord &);
63 
64  std::unique_ptr<DetGeomDesc> produceRealGD(const VeryForwardRealGeometryRecord &);
65  std::unique_ptr<TotemRPGeometry> produceRealTG(const VeryForwardRealGeometryRecord &);
66 
67  std::unique_ptr<DetGeomDesc> produceMisalignedGD(const VeryForwardMisalignedGeometryRecord &);
68  std::unique_ptr<TotemRPGeometry> produceMisalignedTG(const VeryForwardMisalignedGeometryRecord &);
69 
70  protected:
71  unsigned int verbosity;
72 
73  void ApplyAlignments(const edm::ESHandle<DetGeomDesc> &measuredGD, const edm::ESHandle<RPAlignmentCorrectionsData> &alignments, DetGeomDesc* &newGD);
74  void ApplyAlignments(const edm::ESHandle<DDCompactView> &ideal_ddcv, const edm::ESHandle<RPAlignmentCorrectionsData> &alignments, DDCompactView *&measured_ddcv);
75 };
76 
77 
78 using namespace std;
79 using namespace edm;
80 
81 //----------------------------------------------------------------------------------------------------
82 //----------------------------------------------------------------------------------------------------
83 
85 {
86  verbosity = p.getUntrackedParameter<unsigned int>("verbosity", 1);
87 
88  setWhatProduced(this, &TotemRPGeometryESModule::produceMeasuredDDCV);
89  setWhatProduced(this, &TotemRPGeometryESModule::produceMeasuredGD);
90  setWhatProduced(this, &TotemRPGeometryESModule::produceMeasuredTG);
91 
92  setWhatProduced(this, &TotemRPGeometryESModule::produceRealGD);
93  setWhatProduced(this, &TotemRPGeometryESModule::produceRealTG);
94 
95  setWhatProduced(this, &TotemRPGeometryESModule::produceMisalignedGD);
96  setWhatProduced(this, &TotemRPGeometryESModule::produceMisalignedTG);
97 }
98 
99 //----------------------------------------------------------------------------------------------------
100 
102 {
103 }
104 
105 //----------------------------------------------------------------------------------------------------
106 
108  const ESHandle<RPAlignmentCorrectionsData> &alignments, DetGeomDesc* &newGD)
109 {
110  newGD = new DetGeomDesc( *(idealGD.product()) );
111  deque<const DetGeomDesc *> buffer;
112  deque<DetGeomDesc *> bufferNew;
113  buffer.push_back(idealGD.product());
114  bufferNew.push_back(newGD);
115 
116  while (buffer.size() > 0)
117  {
118  const DetGeomDesc *sD = buffer.front();
119  DetGeomDesc *pD = bufferNew.front();
120  buffer.pop_front();
121  bufferNew.pop_front();
122 
123  // Is it sensor? If yes, apply full sensor alignments
124  if (! pD->name().name().compare(DDD_TOTEM_RP_DETECTOR_NAME))
125  {
126  unsigned int plId = pD->geographicalID();
127 
128  if (alignments.isValid())
129  {
130  const RPAlignmentCorrectionData& ac = alignments->GetFullSensorCorrection(plId);
131  pD->ApplyAlignment(ac);
132  }
133  }
134 
135  // Is it RP box? If yes, apply RP alignments
136  if (! pD->name().name().compare(DDD_TOTEM_RP_PRIMARY_VACUUM_NAME))
137  {
138  unsigned int rpId = pD->geographicalID();
139 
140  if (alignments.isValid())
141  {
142  const RPAlignmentCorrectionData& ac = alignments->GetRPCorrection(rpId);
143  pD->ApplyAlignment(ac);
144  }
145  }
146 
147  // create and add children
148  for (unsigned int i = 0; i < sD->components().size(); i++)
149  {
150  const DetGeomDesc *sDC = sD->components()[i];
151  buffer.push_back(sDC);
152 
153  // create new node with the same information as in sDC and add it as a child of pD
154  DetGeomDesc * cD = new DetGeomDesc(*sDC);
155  pD->addComponent(cD);
156 
157  bufferNew.push_back(cD);
158  }
159  }
160 }
161 
162 
163 //----------------------------------------------------------------------------------------------------
164 
165 // Copies ideal_ddcv to measured_ddcv, applying the alignments if any
166 // WARNING: (TODO?) does not handle the "old" geometry
168  private:
173 
174  // -- Expanded view utilits ------------
175  // WTF WARNING
176  // DDExpandView's constructor sets DDRotation::StoreT to readonly
177  //
178  // Any newExpandedView() call will set this value before calling the constructor
179  // Any delExpandedView() call will the restore StoreT state to _the_last_ set value
180  static bool evRotationStoreState;
181 
182  // Allocate new ExpandedView and set it to point at the LogicalPart
183  //
184  // The LogicalPart _must_ be in the CompactView
185  // Only name and ns of the LogicalPart are taken into account
186  static DDExpandedView *newExpandedView(const DDCompactView &compactView, const DDLogicalPart &part) {
187  evRotationStoreState = DDRotation::StoreT::instance().readOnly();
188  DDExpandedView *expandedView = new DDExpandedView(compactView);
189  // traverse the tree until name and ns are mached
190  const string &name = part.name().name();
191  const string &ns = part.name().ns();
192  bool noMatch = true;
193 
194  noMatch = false;
195  noMatch |= expandedView->logicalPart().name().name().compare(name);
196  noMatch |= expandedView->logicalPart().name().ns().compare(ns);
197  while (noMatch) {
198  expandedView->next();
199  noMatch = false;
200  noMatch |= expandedView->logicalPart().name().name().compare(name);
201  noMatch |= expandedView->logicalPart().name().ns().compare(ns);
202  }
203  return expandedView;
204  }
205 
206  // Deallocate the ExpandedView
207  //
208  // Returns NULL
210  delete expandedView;
211  DDRotation::StoreT::instance().setReadOnly(evRotationStoreState);
212  return NULL;
213  }
214 
215  // -- Transformation matrix utils ------
216 
217  // Standard 4x4 tranformation matrixes are used for the alignments:
218  //
219  // | R R R x |
220  // | R R R y |
221  // | R R R z |
222  // | 0 0 0 1 |
223  //
224  // where R are parameters of rotation matrix and x,y,z are translation parametres.
225  // (Rotation and translation must be applied in this very order, as is done in CMSSW).
226  // Such matrixes can be easily used to compose the transformations,
227  // e.g to describe transformation C: "first do A, then do B", multiply
228  // C = B * A
229  // All tranformation matrixes are invertible.
230 
231  // Creates transformation matrix according to rotation and translation (applied in this order)
232  static void translRotToTransform(const DDTranslation &translation,const DDRotationMatrix &rotation,
233  TMatrixD &transform) {
234  // set rotation
235  double values[9];
236  rotation.GetComponents(values);
237  for (int i = 0; i < 9; ++i) {
238  transform[i / 3][i % 3] = values[i];
239  }
240  // set translation
241  transform[0][3] = translation.X();
242  transform[1][3] = translation.Y();
243  transform[2][3] = translation.Z();
244  transform[3][3] = 1.;
245  }
246 
247  // sets rotation and translation (applied in this order) from transformation matrix
249  const TMatrixD &transform) {
250  // set rotation
251  double values[9];
252  for (int i = 0; i < 9; ++i) {
253  values[i] = transform[i / 3][i % 3];
254  }
255  rotation.SetComponents(values, values + 9);
256  // set translation
257  translation.SetXYZ(transform[0][3], transform[1][3], transform[2][3]);
258  }
259 
260  // Gets global transform of given LogicalPart in given CompactView (uses ExpandedView to calculate)
261  static void getGlobalTransform(const DDLogicalPart &part, const DDCompactView &compactView, TMatrixD &transform) {
262  DDExpandedView *expandedView = newExpandedView(compactView, part);
263  translRotToTransform(expandedView->translation(), expandedView->rotation(), transform);
264  delExpandedView(expandedView);
265  }
266 
267  // -- Misc. utils ----------------------
268 
269  // true if part's name maches DDD_TOTEM_RP_PRIMARY_VACUUM_NAME
270  static inline bool isRPBox(const DDLogicalPart &part) {
271  return (! part.name().name().compare(DDD_TOTEM_RP_PRIMARY_VACUUM_NAME));
272  }
273 
274  // true if part's name maches DDD_TOTEM_RP_DETECTOR_NAME
275  static inline bool isDetector(const DDLogicalPart &part) {
276  return (! part.name().name().compare(DDD_TOTEM_RP_DETECTOR_NAME));
277  }
278 
279  // Extracts RP id from object namespace - object must be RP_Box, or RP_Hybrid (NOT RP_Silicon_Detector)
281  {
282  const int nsLength = part.name().ns().length();
283  const unsigned int rpDecId = atoi(part.name().ns().substr(nsLength - 3, nsLength).c_str());
284 
285  const unsigned int armIdx = rpDecId / 100;
286  const unsigned int stIdx = (rpDecId / 10) % 10;
287  const unsigned int rpIdx = rpDecId % 10;
288 
289  return TotemRPDetId(armIdx, stIdx, rpIdx);
290  }
291 
292  // -------------------------------------
293 
294  // Applies alignment (translation and rotation) to transformation matrix
295  //
296  // translation = alignmentTranslation + translation
297  // rotation = alignmentRotation + rotation
298  static void applyCorrectionToTransform(const RPAlignmentCorrectionData &correction, TMatrixD &transform) {
299  DDTranslation translation;
301 
302  translRotFromTransform(translation, rotation, transform);
303 
304  translation = correction.getTranslation() + translation;
305  rotation = correction.getRotationMatrix() * rotation;
306 
307  translRotToTransform(translation, rotation, transform);
308  }
309 
310  // Applies relative alignments to Detector rotation and translation
312  DDTranslation &translation, DDRotationMatrix &rotation, const bool useMeasuredParent = true) {
313  TMatrixD C(4,4); // child relative transform
314  TMatrixD iP(4,4); // ideal parent global transform
315  TMatrixD mP(4,4); // measured parent global transform
316  TMatrixD F(4,4); // final child transform
317 
318  translRotToTransform(translation, rotation, C);
319 
320  if (useMeasuredParent)
321  getGlobalTransform(parent, *measuredCV, mP);
322  else
323  getGlobalTransform(parent, idealCV, mP);
324  getGlobalTransform(parent, idealCV, iP);
325 
326  // global final transform
327  F = iP * C;
328  applyCorrectionToTransform(correction, F);
329  // relative final transform
330  mP.Invert();
331  F = mP * F;
332 
333  translRotFromTransform(translation, rotation, F);
334  }
335 
337  DDCompactView::graph_type::const_iterator it = idealCV.graph().begin_iter();
338  DDCompactView::graph_type::const_iterator itEnd = idealCV.graph().end_iter();
339  for (; it != itEnd; ++it) {
340  if (!isDetector(it->to())) {
341  const DDLogicalPart from = it->from();
342  const DDLogicalPart to = it->to();
343  const int copyNo = it->edge()->copyno_;
344  const DDDivision &division = it->edge()->division();
345  DDTranslation translation(it->edge()->trans());
346  DDRotationMatrix &rotationMatrix = *(new DDRotationMatrix(it->edge()->rot()));
347 
348  if (isRPBox(to))
349  {
350  if (alignments != NULL)
351  {
352  TotemRPDetId rpId = getRPIdFromNamespace(to);
353  const RPAlignmentCorrectionData correction = alignments->GetRPCorrection(rpId);
354  applyCorrection(from, to, correction, translation, rotationMatrix, false);
355  }
356  }
357 
358  const DDRotation rotation = DDanonymousRot(&rotationMatrix);
359  measuredCV->position(to, from, copyNo, translation, rotation, &division);
360  }
361  }
362  }
363 
364  void positionDetectors(void)
365  {
366  DDCompactView::graph_type::const_iterator it = idealCV.graph().begin_iter();
367  DDCompactView::graph_type::const_iterator itEnd = idealCV.graph().end_iter();
368  for (; it != itEnd; ++it) {
369  if (isDetector(it->to())) {
370  const DDLogicalPart from = it->from();
371  const DDLogicalPart to = it->to();
372  const int copyNo = it->edge()->copyno_;
373  const DDDivision &division = it->edge()->division();
374  DDTranslation translation(it->edge()->trans());
375  DDRotationMatrix &rotationMatrix = *(new DDRotationMatrix(it->edge()->rot()));
376 
377  if (alignments != NULL)
378  {
379  TotemRPDetId detId = getRPIdFromNamespace(from);
380  detId.setPlane(copyNo);
381 
382  const RPAlignmentCorrectionData correction = alignments->GetFullSensorCorrection(detId);
383  applyCorrection(from, to, correction, translation, rotationMatrix);
384  }
385 
386  const DDRotation rotation = DDanonymousRot(&rotationMatrix);
387  measuredCV->position(to, from, copyNo, translation, rotation, &division);
388  }
389  }
390  }
391 
392  public:
394  const edm::ESHandle<RPAlignmentCorrectionsData> &alignments) : idealCV(*idealCV),
395  alignments(alignments.isValid() ? &(*alignments) : NULL) {
396  root = this->idealCV.root();
397  }
398 
400  // create DDCompactView for measured geometry
401  // notice that this class is not responsible for deleting this object
402  measuredCV = new DDCompactView(root);
403  // CMSSW/DetectorDescription graph interface sucks, so instead of doing a one bfs
404  // we go over the tree twice (this is needed, as final detector postions are
405  // dependent on new positions of RP units).
406  positionEverythingButDetectors();
407  positionDetectors();
408  return measuredCV;
409  }
410 };
412 
414  const edm::ESHandle<RPAlignmentCorrectionsData> &alignments, DDCompactView *&measured_ddcv)
415 {
416  MeasuredGeometryProducer producer(ideal_ddcv, alignments);
417  measured_ddcv = producer.produce();
418  return;
419 }
420 
421 //----------------------------------------------------------------------------------------------------
422 
424 {
425  // get the ideal DDCompactView from EventSetup
427  iRecord.getRecord<IdealGeometryRecord>().get("XMLIdealGeometryESSource_CTPPS", idealCV);
428 
429  // load alignments
431  try {
432  iRecord.getRecord<RPMeasuredAlignmentRecord>().get(alignments);
433  } catch (...) {}
434 
435  if (alignments.isValid())
436  {
437  if (verbosity)
438  {
439  LogVerbatim("TotemRPGeometryESModule::produceMeasuredDDCV")
440  << ">> TotemRPGeometryESModule::produceMeasuredDDCV > Measured geometry: "
441  << alignments->GetRPMap().size() << " RP and "
442  << alignments->GetSensorMap().size() << " sensor alignments applied.";
443  }
444  } else {
445  if (verbosity)
446  LogVerbatim("TotemRPGeometryESModule::produceMeasuredDDCV")
447  << ">> TotemRPGeometryESModule::produceMeasuredDDCV > Measured geometry: No alignments applied.";
448  }
449 
450  DDCompactView *measuredCV = NULL;
451  ApplyAlignments(idealCV, alignments, measuredCV);
452  return std::unique_ptr<DDCompactView>(measuredCV);
453 }
454 
455 //----------------------------------------------------------------------------------------------------
456 
458 {
459  // get the DDCompactView from EventSetup
461  iRecord.get(cpv);
462 
463  // construct the tree of DetGeomDesc
464  DDDTotemRPContruction worker;
465  return std::unique_ptr<DetGeomDesc>( const_cast<DetGeomDesc*>( worker.construct(&(*cpv)) ) );
466 }
467 
468 //----------------------------------------------------------------------------------------------------
469 
470 std::unique_ptr<DetGeomDesc> TotemRPGeometryESModule::produceRealGD(const VeryForwardRealGeometryRecord &iRecord)
471 {
472  // get the input (= measured) GeometricalDet
473  edm::ESHandle<DetGeomDesc> measuredGD;
474  iRecord.getRecord<VeryForwardMeasuredGeometryRecord>().get(measuredGD);
475 
476  // load alignments
478  try { iRecord.getRecord<RPRealAlignmentRecord>().get(alignments); }
479  catch (...) {}
480 
481  if (alignments.isValid())
482  {
483  if (verbosity)
484  LogVerbatim("TotemRPGeometryESModule::produceRealGD")
485  << ">> TotemRPGeometryESModule::produceRealGD > Measured geometry: "
486  << alignments->GetRPMap().size() << " RP and "
487  << alignments->GetSensorMap().size() << " sensor alignments applied.";
488  } else {
489  if (verbosity)
490  LogVerbatim("TotemRPGeometryESModule::produceRealGD")
491  << ">> TotemRPGeometryESModule::produceRealGD > Real geometry: No alignments applied.";
492  }
493 
494  DetGeomDesc* newGD = NULL;
495  ApplyAlignments(measuredGD, alignments, newGD);
496  return std::unique_ptr<DetGeomDesc>(newGD);
497 }
498 
499 //----------------------------------------------------------------------------------------------------
500 
502 {
503  // get the input (= measured) GeometricalDet
504  edm::ESHandle<DetGeomDesc> measuredGD;
505  iRecord.getRecord<VeryForwardMeasuredGeometryRecord>().get(measuredGD);
506 
507  // load alignments
509  try { iRecord.getRecord<RPMisalignedAlignmentRecord>().get(alignments); }
510  catch (...) {}
511 
512  if (alignments.isValid())
513  {
514  if (verbosity)
515  LogVerbatim("TotemRPGeometryESModule::produceMisalignedGD")
516  << ">> TotemRPGeometryESModule::produceMisalignedGD > Measured geometry: "
517  << alignments->GetRPMap().size() << " RP and "
518  << alignments->GetSensorMap().size() << " sensor alignments applied.";
519  } else {
520  if (verbosity)
521  LogVerbatim("TotemRPGeometryESModule::produceMisalignedGD")
522  << ">> TotemRPGeometryESModule::produceMisalignedGD > Misaligned geometry: No alignments applied.";
523  }
524 
525  DetGeomDesc* newGD = NULL;
526  ApplyAlignments(measuredGD, alignments, newGD);
527  return std::unique_ptr<DetGeomDesc>(newGD);
528 }
529 
530 //----------------------------------------------------------------------------------------------------
531 
533 {
535  iRecord.get(gD);
536 
537  return std::make_unique<TotemRPGeometry>( gD.product() );
538 }
539 
540 //----------------------------------------------------------------------------------------------------
541 
542 std::unique_ptr<TotemRPGeometry> TotemRPGeometryESModule::produceRealTG(const VeryForwardRealGeometryRecord &iRecord)
543 {
545  iRecord.get(gD);
546 
547  return std::make_unique<TotemRPGeometry>( gD.product());
548 }
549 
550 //----------------------------------------------------------------------------------------------------
551 
553 {
555  iRecord.get(gD);
556 
557  return std::make_unique<TotemRPGeometry>( gD.product());
558 }
559 
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
bool next()
set current node to the next node in the expanded tree
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
const N & name() const
Definition: DDBase.h:78
const RPAlignmentCorrectionsData *const alignments
void ApplyAlignments(const edm::ESHandle< DetGeomDesc > &measuredGD, const edm::ESHandle< RPAlignmentCorrectionsData > &alignments, DetGeomDesc *&newGD)
static bool isDetector(const DDLogicalPart &part)
RotationMatrix getRotationMatrix() const
std::unique_ptr< TotemRPGeometry > produceMisalignedTG(const VeryForwardMisalignedGeometryRecord &)
Builds structure of DetGeomDesc objects out of DDCompactView (resp. DDFilteredView).
const std::string & ns() const
Returns the namespace.
Definition: DDName.cc:104
const char DDD_TOTEM_RP_PRIMARY_VACUUM_NAME[]
DDD name of RP.
#define NULL
Definition: scimark2.h:8
type of data representation of DDCompactView
Definition: DDCompactView.h:90
static void translRotFromTransform(DDTranslation &translation, DDRotationMatrix &rotation, const TMatrixD &transform)
Event setup record containing the real (actual) geometry information.
const DetGeomDesc * construct(const DDCompactView *cpv)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
DDRotation DDanonymousRot(DDRotationMatrix *rot)
Defines a anonymous rotation or rotation-reflection matrix.
Definition: DDRotation.cc:187
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
static value_type & instance()
static void applyCorrectionToTransform(const RPAlignmentCorrectionData &correction, TMatrixD &transform)
Event setup record containing the Measured (measured) geometry information.
const math::XYZVectorD & getTranslation() const
void ApplyAlignment(const RPAlignmentCorrectionData &)
alignment
Definition: DetGeomDesc.cc:184
static void getGlobalTransform(const DDLogicalPart &part, const DDCompactView &compactView, TMatrixD &transform)
virtual ConstContainer components() const
access to the tree structure
Definition: DetGeomDesc.cc:121
Builds ideal, real and misaligned geometries.
void get(HolderT &iHolder) const
Geometrical description of a detector.
Definition: DetGeomDesc.h:40
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:92
std::unique_ptr< DetGeomDesc > produceRealGD(const VeryForwardRealGeometryRecord &)
Alignment correction or result of alignment procedure for a single RP sensor. Within the geometry des...
std::unique_ptr< DDCompactView > produceMeasuredDDCV(const VeryForwardMeasuredGeometryRecord &)
std::unique_ptr< DetGeomDesc > produceMeasuredGD(const VeryForwardMeasuredGeometryRecord &)
DDName name() const
Definition: DetGeomDesc.h:90
const DDTranslation & translation() const
The absolute translation of the current node.
static bool isRPBox(const DDLogicalPart &part)
TotemRPGeometryESModule(const edm::ParameterSet &p)
virtual DetId geographicalID() const
Definition: DetGeomDesc.h:64
part
Definition: HCALResponse.h:20
std::unique_ptr< DetGeomDesc > produceMisalignedGD(const VeryForwardMisalignedGeometryRecord &)
void setPlane(uint32_t det)
Definition: TotemRPDetId.h:54
T const * product() const
Definition: ESHandle.h:86
#define DEFINE_FWK_EVENTSETUP_MODULE(type)
Definition: ModuleFactory.h:60
Container for RP alignment corrections. The corrections are stored on two levels - RP and sensor...
std::unique_ptr< TotemRPGeometry > produceRealTG(const VeryForwardRealGeometryRecord &)
static void translRotToTransform(const DDTranslation &translation, const DDRotationMatrix &rotation, TMatrixD &transform)
MeasuredGeometryProducer(const edm::ESHandle< DDCompactView > &idealCV, const edm::ESHandle< RPAlignmentCorrectionsData > &alignments)
Event setup record containing the misaligned geometry information. It is used for alignment studies o...
static TotemRPDetId getRPIdFromNamespace(const DDLogicalPart &part)
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the expanded-view.
const char DDD_TOTEM_RP_DETECTOR_NAME[]
DDD name of RP detector.
std::unique_ptr< TotemRPGeometry > produceMeasuredTG(const VeryForwardMeasuredGeometryRecord &)
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:281
bool isValid() const
Definition: ESHandle.h:47
void applyCorrection(const DDLogicalPart &parent, const DDLogicalPart &child, const RPAlignmentCorrectionData &correction, DDTranslation &translation, DDRotationMatrix &rotation, const bool useMeasuredParent=true)
Provides an exploded view of the detector (tree-view)
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
void addComponent(DetGeomDesc *)
Definition: DetGeomDesc.cc:159
const std::string & name() const
Returns the name.
Definition: DDName.cc:90
static DDExpandedView * delExpandedView(DDExpandedView *expandedView)
static DDExpandedView * newExpandedView(const DDCompactView &compactView, const DDLogicalPart &part)