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::auto_ptr<DDCompactView> produceMeasuredDDCV(const VeryForwardMeasuredGeometryRecord &);
60 
61  std::auto_ptr<DetGeomDesc> produceMeasuredGD(const VeryForwardMeasuredGeometryRecord &);
62  std::auto_ptr<TotemRPGeometry> produceMeasuredTG(const VeryForwardMeasuredGeometryRecord &);
63 
64  std::auto_ptr<DetGeomDesc> produceRealGD(const VeryForwardRealGeometryRecord &);
65  std::auto_ptr<TotemRPGeometry> produceRealTG(const VeryForwardRealGeometryRecord &);
66 
67  std::auto_ptr<DetGeomDesc> produceMisalignedGD(const VeryForwardMisalignedGeometryRecord &);
68  std::auto_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 decId = TotemRPDetId::rawToDecId(pD->geographicalID().rawId());
127 
128  if (alignments.isValid())
129  {
130  const RPAlignmentCorrectionData& ac = alignments->GetFullSensorCorrection(decId);
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->copyno();
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  expandedView = 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)
280  static inline int getRPIdFromNamespace(const DDLogicalPart &part) {
281  int nsLength = part.name().ns().length();
282  return atoi(part.name().ns().substr(nsLength - 3, nsLength).c_str());
283  }
284 
285  // Creates Detector id from RP id and Detector no
286  static inline int getDetectorId(const int rpId, const int detNo) {
287  return rpId * 10 + detNo;
288  }
289 
290  // -------------------------------------
291 
292  // Applies alignment (translation and rotation) to transformation matrix
293  //
294  // translation = alignmentTranslation + translation
295  // rotation = alignmentRotation + rotation
296  static void applyCorrectionToTransform(const RPAlignmentCorrectionData &correction, TMatrixD &transform) {
297  DDTranslation translation;
299 
300  translRotFromTransform(translation, rotation, transform);
301 
302  translation = correction.getTranslation() + translation;
303  rotation = correction.getRotationMatrix() * rotation;
304 
305  translRotToTransform(translation, rotation, transform);
306  }
307 
308  // Applies relative alignments to Detector rotation and translation
309  void applyCorrection(const DDLogicalPart &parent, const DDLogicalPart &child, const RPAlignmentCorrectionData &correction,
310  DDTranslation &translation, DDRotationMatrix &rotation, const bool useMeasuredParent = true) {
311  TMatrixD C(4,4); // child relative transform
312  TMatrixD iP(4,4); // ideal parent global transform
313  TMatrixD mP(4,4); // measured parent global transform
314  TMatrixD F(4,4); // final child transform
315 
316  translRotToTransform(translation, rotation, C);
317 
318  if (useMeasuredParent)
319  getGlobalTransform(parent, *measuredCV, mP);
320  else
321  getGlobalTransform(parent, idealCV, mP);
322  getGlobalTransform(parent, idealCV, iP);
323 
324  // global final transform
325  F = iP * C;
326  applyCorrectionToTransform(correction, F);
327  // relative final transform
328  mP.Invert();
329  F = mP * F;
330 
331  translRotFromTransform(translation, rotation, F);
332  }
333 
335  DDCompactView::graph_type::const_iterator it = idealCV.graph().begin_iter();
336  DDCompactView::graph_type::const_iterator itEnd = idealCV.graph().end_iter();
337  for (; it != itEnd; ++it) {
338  if (!isDetector(it->to())) {
339  const DDLogicalPart from = it->from();
340  const DDLogicalPart to = it->to();
341  const int copyNo = it->edge()->copyno_;
342  const DDDivision &division = it->edge()->division();
343  DDTranslation translation(it->edge()->trans());
344  DDRotationMatrix &rotationMatrix = *(new DDRotationMatrix(it->edge()->rot()));
345 
346  if (isRPBox(to)) {
347  const int rpId = getRPIdFromNamespace(to);
348  if (alignments != NULL) {
349  const RPAlignmentCorrectionData correction = alignments->GetRPCorrection(rpId);
350  applyCorrection(from, to, correction,
351  translation, rotationMatrix, false);
352  }
353  }
354 
355  const DDRotation rotation = DDanonymousRot(&rotationMatrix);
356  measuredCV->position(to, from, copyNo, translation, rotation, &division);
357  }
358  }
359  }
360 
361  void positionDetectors(void) {
362  DDCompactView::graph_type::const_iterator it = idealCV.graph().begin_iter();
363  DDCompactView::graph_type::const_iterator itEnd = idealCV.graph().end_iter();
364  for (; it != itEnd; ++it) {
365  if (isDetector(it->to())) {
366  const DDLogicalPart from = it->from();
367  const DDLogicalPart to = it->to();
368  const int copyNo = it->edge()->copyno_;
369  const DDDivision &division = it->edge()->division();
370  DDTranslation translation(it->edge()->trans());
371  DDRotationMatrix &rotationMatrix = *(new DDRotationMatrix(it->edge()->rot()));
372 
373  const int rpId = getRPIdFromNamespace(from);
374  const int detId = getDetectorId(rpId, copyNo);
375  if (alignments != NULL) {
376  const RPAlignmentCorrectionData correction = alignments->GetFullSensorCorrection(detId);
377  applyCorrection(from, to, correction,
378  translation, rotationMatrix);
379  }
380 
381  const DDRotation rotation = DDanonymousRot(&rotationMatrix);
382  measuredCV->position(to, from, copyNo, translation, rotation, &division);
383  }
384  }
385  }
386 
387  public:
389  const edm::ESHandle<RPAlignmentCorrectionsData> &alignments) : idealCV(*idealCV), alignments(alignments.isValid() ? &(*alignments) : NULL) {
390  root = this->idealCV.root();
391  }
392 
394  // create DDCompactView for measured geometry
395  // notice that this class is not responsible for deleting this object
396  measuredCV = new DDCompactView(root);
397  // CMSSW/DetectorDescription graph interface sucks, so instead of doing a one bfs
398  // we go over the tree twice (this is needed, as final detector postions are
399  // dependent on new positions of RP units).
400  positionEverythingButDetectors();
401  positionDetectors();
402  return measuredCV;
403  }
404 };
406 
408  const edm::ESHandle<RPAlignmentCorrectionsData> &alignments, DDCompactView *&measured_ddcv)
409 {
410  MeasuredGeometryProducer producer(ideal_ddcv, alignments);
411  measured_ddcv = producer.produce();
412  return;
413 }
414 
415 //----------------------------------------------------------------------------------------------------
416 
418 {
419  // get the ideal DDCompactView from EventSetup
421  iRecord.getRecord<IdealGeometryRecord>().get("XMLIdealGeometryESSource_CTPPS", idealCV);
422 
423  // load alignments
425  try {
426  iRecord.getRecord<RPMeasuredAlignmentRecord>().get(alignments);
427  } catch (...) {
428  cout<< "Exception in TotemRPGeometryESModule::produceMeasuredDDCV"
429  << " during iRecord.getRecord<RPMeasuredAlignmentRecord>().get(alignments)"<<endl;
430  }
431 
432  if (alignments.isValid()) {
433  if (verbosity){
434  cout << ">> TotemRPGeometryESModule::produceMeasuredDDCV > Measured geometry: "
435  << alignments->GetRPMap().size() << " RP and "
436  << alignments->GetSensorMap().size() << " sensor alignments applied.\n";
437  }
438  } else {
439  if (verbosity)
440  cout << ">> TotemRPGeometryESModule::produceMeasuredDDCV > Measured geometry: No alignments applied.\n";
441  }
442 
443  DDCompactView *measuredCV = NULL;
444  ApplyAlignments(idealCV, alignments, measuredCV);
445  return auto_ptr<DDCompactView>(measuredCV);
446 }
447 
448 //----------------------------------------------------------------------------------------------------
449 
451 {
452  // get the DDCompactView from EventSetup
454  iRecord.get(cpv);
455 
456  // construct the tree of DetGeomDesc
457  DDDTotemRPContruction worker;
458  return auto_ptr<DetGeomDesc>( const_cast<DetGeomDesc*>( worker.construct(&(*cpv)) ) );
459 }
460 
461 //----------------------------------------------------------------------------------------------------
462 
464 {
465  // get the input (= measured) GeometricalDet
466  edm::ESHandle<DetGeomDesc> measuredGD;
467  iRecord.getRecord<VeryForwardMeasuredGeometryRecord>().get(measuredGD);
468 
469  // load alignments
471  try { iRecord.getRecord<RPRealAlignmentRecord>().get(alignments); }
472  catch (...) {}
473  if (alignments.isValid()) {
474  if (verbosity)
475  printf(">> TotemRPGeometryESModule::produceRealGD > Real geometry: %lu RP and %lu sensor alignments applied.\n",
476  alignments->GetRPMap().size(), alignments->GetSensorMap().size());
477  } else {
478  if (verbosity)
479  printf(">> TotemRPGeometryESModule::produceRealGD > Real geometry: No alignments applied.\n");
480  }
481 
482  DetGeomDesc* newGD = NULL;
483  ApplyAlignments(measuredGD, alignments, newGD);
484  return auto_ptr<DetGeomDesc>(newGD);
485 }
486 
487 //----------------------------------------------------------------------------------------------------
488 
490 {
491  // get the input (= measured) GeometricalDet
492  edm::ESHandle<DetGeomDesc> measuredGD;
493  iRecord.getRecord<VeryForwardMeasuredGeometryRecord>().get(measuredGD);
494 
495  // load alignments
497  try { iRecord.getRecord<RPMisalignedAlignmentRecord>().get(alignments); }
498  catch (...) {}
499  if (alignments.isValid()) {
500  printf(">> TotemRPGeometryESModule::produceMisalignedGD > Misaligned geometry: %lu RP and %lu sensor alignments applied.\n",
501  alignments->GetRPMap().size(), alignments->GetSensorMap().size());
502  } else {
503  if (verbosity)
504  printf(">> TotemRPGeometryESModule::produceMisalignedGD > Misaligned geometry: No alignments applied.\n");
505  }
506 
507  DetGeomDesc* newGD = NULL;
508  ApplyAlignments(measuredGD, alignments, newGD);
509  return auto_ptr<DetGeomDesc>(newGD);
510 }
511 
512 //----------------------------------------------------------------------------------------------------
513 
515 {
517  iRecord.get(gD);
518 
519  std::auto_ptr<TotemRPGeometry> rpG( new TotemRPGeometry(gD.product()) );
520  return rpG;
521 }
522 
523 //----------------------------------------------------------------------------------------------------
524 
526 {
528  iRecord.get(gD);
529 
530  std::auto_ptr<TotemRPGeometry> rpG( new TotemRPGeometry(gD.product()) );
531  return rpG;
532 }
533 
534 //----------------------------------------------------------------------------------------------------
535 
537 {
539  iRecord.get(gD);
540 
541  std::auto_ptr<TotemRPGeometry> rpG( new TotemRPGeometry(gD.product()) );
542  return rpG;
543 }
544 
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
Builds structure of DetGeomDesc objects out of DDCompactView (resp. DDFilteredView).
std::auto_ptr< DDCompactView > produceMeasuredDDCV(const VeryForwardMeasuredGeometryRecord &)
const std::string & ns() const
Returns the namespace.
Definition: DDName.cc:101
static unsigned int rawToDecId(unsigned int raw)
fast conversion Raw to Decimal ID
Definition: TotemRPDetId.h:120
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:77
static int getDetectorId(const int rpId, const int detNo)
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:194
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
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
std::auto_ptr< DetGeomDesc > produceMeasuredGD(const VeryForwardMeasuredGeometryRecord &)
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:88
std::auto_ptr< TotemRPGeometry > produceRealTG(const VeryForwardRealGeometryRecord &)
Alignment correction or result of alignment procedure for a single RP sensor. Within the geometry des...
DDName name() const
Definition: DetGeomDesc.h:90
const DDTranslation & translation() const
The absolute translation of the current node.
static bool isRPBox(const DDLogicalPart &part)
std::auto_ptr< DetGeomDesc > produceRealGD(const VeryForwardRealGeometryRecord &)
virtual int copyno() const
Definition: DetGeomDesc.h:93
TotemRPGeometryESModule(const edm::ParameterSet &p)
virtual DetId geographicalID() const
Definition: DetGeomDesc.h:64
part
Definition: HCALResponse.h:20
T const * product() const
Definition: ESHandle.h:86
static int getRPIdFromNamespace(const DDLogicalPart &part)
#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...
The manager class for TOTEM RP geometry.
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...
tuple cout
Definition: gather_cfg.py:145
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.
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:87
static DDExpandedView * delExpandedView(DDExpandedView *expandedView)
std::auto_ptr< TotemRPGeometry > produceMisalignedTG(const VeryForwardMisalignedGeometryRecord &)
std::auto_ptr< TotemRPGeometry > produceMeasuredTG(const VeryForwardMeasuredGeometryRecord &)
std::auto_ptr< DetGeomDesc > produceMisalignedGD(const VeryForwardMisalignedGeometryRecord &)
static DDExpandedView * newExpandedView(const DDCompactView &compactView, const DDLogicalPart &part)