DD4hep - The AIDA detector description toolkit for high energy physics experiments
DD4hep  Rev:Unversioneddirectory
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Detector.cpp
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation for LCD
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 // Author : M.Frank
11 //
12 //==========================================================================
13 
14 // Framework include files
18 #include "DD4hep/AlignmentTools.h"
19 #include "DD4hep/DetectorTools.h"
20 #include "DD4hep/World.h"
21 #include "DD4hep/LCDD.h"
22 
23 using namespace std;
24 using namespace DD4hep::Geometry;
26 
27 namespace {
28  static string s_empty_string;
29 }
30 
33 }
34 
36 DetElement::Processor::~Processor() {
37 }
38 
40 DetElement::DetElement(Object* det_data, const string& det_name, const string& det_type)
41  : RefObject(det_data)
42 {
43  this->assign(det_data, det_name, det_type);
44 }
45 
47 DetElement::DetElement(const string& det_name, const string& det_type, int det_id) {
48  assign(new Object(det_name,det_id), det_name, det_type);
49  ptr()->id = det_id;
50 }
51 
53 DetElement::DetElement(const string& det_name, int det_id) {
54  assign(new Object(det_name,det_id), det_name, "");
55  ptr()->id = det_id;
56 }
57 
59 DetElement::DetElement(DetElement det_parent, const string& det_name, int det_id) {
60  assign(new Object(det_name,det_id), det_name, det_parent.type());
61  ptr()->id = det_id;
62  det_parent.add(*this);
63 }
64 
66 void* DetElement::i_addExtension(void* ext_ptr, const type_info& info, copy_t ctor, destruct_t dtor) const {
67  return access()->addExtension(ext_ptr, info, ObjectExtensions::copy_t(ctor), dtor);
68 }
69 
71 void* DetElement::i_extension(const type_info& info) const {
72  return access()->extension(info);
73 }
74 
76 void DetElement::i_addUpdateCall(unsigned int callback_type, const Callback& callback) const {
77  access()->updateCalls.push_back(make_pair(callback,callback_type));
78 }
79 
81 void DetElement::removeAtUpdate(unsigned int typ, void* pointer) const {
82  access()->removeAtUpdate(typ,pointer);
83 }
84 
86 const string& DetElement::placementPath() const {
87  Object* o = ptr();
88  if ( o ) {
89  if (o->placementPath.empty()) {
91  }
92  return o->placementPath;
93  }
94  return s_empty_string;
95 }
96 
98 string DetElement::type() const {
99  return m_element ? m_element->GetTitle() : "";
100 }
101 
103 DetElement& DetElement::setType(const string& typ) {
104  Object* o = access();
105  o->SetTitle(typ.c_str());
106  return *this;
107 }
108 
109 unsigned int DetElement::typeFlag() const {
110  return m_element ? m_element->typeFlag : 0 ;
111 }
112 
114 DetElement& DetElement::setTypeFlag(unsigned int types) {
115  Object* o = access();
116  o->typeFlag = types ;
117  return *this;
118 }
119 
120 namespace {
121  static void make_path(DetElement::Object* o) {
122  DetElement par = o->parent;
123  if ( par.isValid() ) {
124  o->path = par.path() + "/" + o->name;
125  if ( o->level < 0 ) o->level = par.level() + 1;
126  }
127  else {
128  o->path = "/" + o->name;
129  o->level = 0;
130  }
131  o->key = DD4hep::hash32(o->path);
132  }
133 }
134 
136 unsigned int DetElement::key() const {
137  Object* o = ptr();
138  if ( o ) {
139  if ( o->key != 0 )
140  return o->key;
141  make_path(o);
142  return o->key;
143  }
144  return 0;
145 }
146 
148 int DetElement::level() const {
149  Object* o = ptr();
150  if ( o ) {
151  if ( o->level >= 0 )
152  return o->level;
153  make_path(o);
154  return o->level;
155  }
156  return -1;
157 }
158 
160 const string& DetElement::path() const {
161  Object* o = ptr();
162  if ( o ) {
163  if ( !o->path.empty() )
164  return o->path;
165  make_path(o);
166  return o->path;
167  }
168  return s_empty_string;
169 }
170 
171 int DetElement::id() const {
172  return access()->id;
173 }
174 
176  return access()->combineHits != 0;
177 }
178 
180  access()->combineHits = value;
181  if (sens.isValid())
182  sens.setCombineHits(value);
183  return *this;
184 }
185 
188  Object* o = access();
189  if ( !o->nominal.isValid() ) {
190  o->nominal = Alignment("nominal");
191  o->nominal->detector = *this;
193  }
194  return o->nominal;
195 }
196 
199  Object* o = access();
200  if ( !o->survey.isValid() ) {
201  o->survey = Alignment("survey");
203  }
204  return o->survey;
205 }
206 
208  return access()->children;
209 }
210 
212 DetElement DetElement::child(const string& child_name) const {
213  if (isValid()) {
214  const Children& c = ptr()->children;
215  Children::const_iterator i = c.find(child_name);
216  return i == c.end() ? DetElement() : (*i).second;
217  }
218  return DetElement();
219 }
220 
223  Object* o = ptr();
224  return (o) ? o->parent : 0;
225 }
226 
229  Object* o = ptr();
230  return (o) ? o->world() : 0;
231 }
232 
235  Object* o = access();
236  if ( o->conditions.isValid() && !o->conditions->keys.empty() )
237  return true;
238  return false;
239 }
240 
243  Object* o = access();
244  if ( o->alignments.isValid() && !o->alignments->keys.empty() )
245  return true;
246  return false;
247 }
248 
249 void DetElement::check(bool cond, const string& msg) const {
250  if (cond) {
251  throw runtime_error("DD4hep: " + msg);
252  }
253 }
254 
256  if (isValid()) {
257  pair<Children::iterator, bool> r = object<Object>().children.insert(make_pair(sdet.name(), sdet));
258  if (r.second) {
259  sdet.access()->parent = *this;
260  return *this;
261  }
262  throw runtime_error("DD4hep: DetElement::add: Element " + string(sdet.name()) +
263  " is already present in path " + path() + " [Double-Insert]");
264  }
265  throw runtime_error("DD4hep: DetElement::add: Self is not defined [Invalid Handle]");
266 }
267 
268 DetElement DetElement::clone(const string& new_name) const {
269  Object* o = access();
270  return DetElement(o->clone(o->id, COPY_NONE), new_name, o->GetTitle());
271 }
272 
273 DetElement DetElement::clone(const string& new_name, int new_id) const {
274  Object* o = access();
275  return DetElement(o->clone(new_id, COPY_NONE), new_name, o->GetTitle());
276 }
277 
280  if (isValid()) {
281  Object& o = object<Object>();
282  if (o.placement.isValid()) {
283  return o.placement;
284  }
285  }
286  return PlacedVolume();
287 }
288 
291  if (pv.isValid()) {
292  Object* o = access();
293  o->placement = pv;
294  if ( !o->idealPlace.isValid() ) {
295  o->idealPlace = pv;
296  }
297  return *this;
298  }
299  throw runtime_error("DD4hep: DetElement::setPlacement: Placement is not defined [Invalid Handle]");
300 }
301 
304  if (isValid()) {
305  return object<Object>().volumeID;
306  }
307  return 0;
308 }
309 
312  return access()->placement.volume();
313 }
314 
315 DetElement& DetElement::setVisAttributes(const LCDD& lcdd, const string& nam, const Volume& vol) {
316  vol.setVisAttributes(lcdd, nam);
317  return *this;
318 }
319 
320 DetElement& DetElement::setRegion(const LCDD& lcdd, const string& nam, const Volume& vol) {
321  if (!nam.empty()) {
322  vol.setRegion(lcdd.region(nam));
323  }
324  return *this;
325 }
326 
327 DetElement& DetElement::setLimitSet(const LCDD& lcdd, const string& nam, const Volume& vol) {
328  if (!nam.empty()) {
329  vol.setLimitSet(lcdd.limitSet(nam));
330  }
331  return *this;
332 }
333 
334 DetElement& DetElement::setAttributes(const LCDD& lcdd, const Volume& vol, const string& region, const string& limits,
335  const string& vis) {
336  return setRegion(lcdd, region, vol).setLimitSet(lcdd, limits, vol).setVisAttributes(lcdd, vis, vol);
337 }
338 #if 0
339 DetElement& DetElement::setReference(DetElement reference) {
341  Object& o = object<Object>();
342  if (o.referenceTrafo) {
343  delete o.referenceTrafo;
344  o.referenceTrafo = 0;
345  }
346  object<Object>().reference = reference;
347  return *this;
348 }
349 
351 const TGeoHMatrix& DetElement::referenceTransformation() const {
352  return access()->referenceTransformation();
353 }
354 
356 bool DetElement::localToReference(const Position& local, Position& global) const {
357  // If the path is unknown an exception will be thrown inside referenceTransformation() !
358  Double_t master_point[3] = { 0, 0, 0 }, local_point[3] = { local.X(), local.Y(), local.Z() };
359  referenceTransformation().LocalToMaster(local_point, master_point);
360  global.SetCoordinates(master_point);
361  return true;
362 }
363 
365 bool DetElement::referenceToLocal(const Position& global, Position& local) const {
366  // If the path is unknown an exception will be thrown inside referenceTransformation() !
367  Double_t master_point[3] = { global.X(), global.Y(), global.Z() }, local_point[3] = { 0, 0, 0 };
368  referenceTransformation().MasterToLocal(master_point, local_point);
369  local.SetCoordinates(local_point);
370  return true;
371 }
372 #endif
373 
375 const TGeoHMatrix& DetElement::worldTransformation() const {
376  return access()->worldTransformation();
377 }
378 
380 const TGeoHMatrix& DetElement::parentTransformation() const {
381  return access()->parentTransformation();
382 }
383 
385 bool DetElement::localToWorld(const Position& local, Position& global) const {
386  Double_t master_point[3] = { 0, 0, 0 }, local_point[3] = { local.X(), local.Y(), local.Z() };
387  // If the path is unknown an exception will be thrown inside worldTransformation() !
388  worldTransformation().LocalToMaster(local_point, master_point);
389  global.SetCoordinates(master_point);
390  return true;
391 }
392 
394 bool DetElement::localToParent(const Position& local, Position& global) const {
395  // If the path is unknown an exception will be thrown inside parentTransformation() !
396  Double_t master_point[3] = { 0, 0, 0 }, local_point[3] = { local.X(), local.Y(), local.Z() };
397  parentTransformation().LocalToMaster(local_point, master_point);
398  global.SetCoordinates(master_point);
399  return true;
400 }
401 
403 bool DetElement::worldToLocal(const Position& global, Position& local) const {
404  // If the path is unknown an exception will be thrown inside worldTransformation() !
405  Double_t master_point[3] = { global.X(), global.Y(), global.Z() }, local_point[3] = { 0, 0, 0 };
406  worldTransformation().MasterToLocal(master_point, local_point);
407  local.SetCoordinates(local_point);
408  return true;
409 }
410 
412 bool DetElement::parentToLocal(const Position& global, Position& local) const {
413  // If the path is unknown an exception will be thrown inside parentTransformation() !
414  Double_t master_point[3] = { global.X(), global.Y(), global.Z() }, local_point[3] = { 0, 0, 0 };
415  parentTransformation().MasterToLocal(master_point, local_point);
416  local.SetCoordinates(local_point);
417  return true;
418 }
419 
421 SensitiveDetector::SensitiveDetector(const string& nam, const string& typ) {
422  /*
423  <calorimeter ecut="0" eunit="MeV" hits_collection="EcalEndcapHits" name="EcalEndcap" verbose="0">
424  <global_grid_xy grid_size_x="3.5" grid_size_y="3.5"/>
425  <idspecref ref="EcalEndcapHits"/>
426  </calorimeter>
427  */
428  assign(new Object(nam), nam, typ);
429  object<Object>().ecut = 0e0;
430  object<Object>().verbose = 0;
431 }
432 
435  access()->SetTitle(typ.c_str());
436  return *this;
437 }
438 
440 string SensitiveDetector::type() const {
441  return m_element ? m_element->GetTitle() : s_empty_string;
442 }
443 
446  access()->readout = ro;
447  return *this;
448 }
449 
452  return access()->readout;
453 }
454 
457  access()->ecut = value;
458  return *this;
459 }
460 
463  return access()->ecut;
464 }
465 
468  access()->hitsCollection = collection;
469  return *this;
470 }
471 
473 const string& SensitiveDetector::hitsCollection() const {
474  return access()->hitsCollection;
475 }
476 
479  int v = value ? 1 : 0;
480  access()->verbose = v;
481  return *this;
482 }
483 
486  return access()->verbose == 1;
487 }
488 
491  int v = value ? 1 : 0;
492  access()->combineHits = v;
493  return *this;
494 }
495 
498  return access()->combineHits == 1;
499 }
500 
503  access()->region = reg;
504  return *this;
505 }
506 
509  return access()->region;
510 }
511 
514  access()->limits = ls;
515  return *this;
516 }
517 
520  return access()->limits;
521 }
522 
524 void* SensitiveDetector::i_addExtension(void* ext_ptr, const type_info& info, destruct_t dtor) {
525  return access()->addExtension(ext_ptr, info, dtor);
526 }
527 
529 void* SensitiveDetector::i_extension(const type_info& info) const {
530  return access()->extension(info);
531 }
Alignment nominal
Basic ideal/nominal detector element alignment entry.
SensitiveDetector & setVerbose(bool value)
Set flag to handle hits collection.
Definition: Detector.cpp:478
Handle class to hold the information of a sensitive detector.
Definition: Detector.h:47
bool hasAlignments() const
Check if this DetElement has time dependent Alignments attached.
Definition: Detector.cpp:242
SensitiveDetector & setHitsCollection(const std::string &spec)
Assign the name of the hits collection.
Definition: Detector.cpp:467
const Volume & setLimitSet(const LCDD &lcdd, const std::string &name) const
Set the limits to the volume. Note: If the name string is empty, the action is ignored.
Definition: Volumes.cpp:717
PlacedVolume idealPlace
The subdetector placement corresponding to the ideal detector element's volume.
Handle class holding a placed volume (also called physical volume)
Definition: Volumes.h:135
DetElement world() const
Access to the world object. Only possible once the geometry is closed.
Definition: Detector.cpp:228
SensitiveDetectorObject Object
Internal object type.
Definition: Detector.h:52
Volume volume() const
Access to the logical volume of the detector element's placement.
Definition: Detector.cpp:311
bool hasConditions() const
Check if this DetElement has time dependent Conditions attached.
Definition: Detector.cpp:234
const char * name() const
Access the object name (or "" if not supported by the object)
Definition: Handle.inl:36
DetElement & setLimitSet(const LCDD &lcdd, const std::string &name, const Volume &volume)
Set the limits to the detector element.
Definition: Detector.cpp:327
Alignment nominal() const
Access to the constant ideal (nominal) alignment information.
Definition: Detector.cpp:187
unsigned int typeFlag
Flag to encode detector types.
bool isValid() const
Check the validity of the object held by the handle.
Definition: Handle.h:124
const std::string & hitsCollection() const
Access the hits collection name.
Definition: Detector.cpp:473
SensitiveDetector & setRegion(Region reg)
Set the regional attributes to the sensitive detector.
Definition: Detector.cpp:502
PlacedVolume placement
The subdetector placement corresponding to the actual detector element's volume.
DetElement & setType(const std::string &typ)
Set detector type (structure, tracker, calorimeter, etc.).
Definition: Detector.cpp:103
LimitSet limits() const
Access to the limit set of the sensitive detector (not mandatory).
Definition: Detector.cpp:519
bool combineHits() const
Getter: Combine hits attribute.
Definition: Detector.cpp:175
void * i_extension(const std::type_info &info) const
Access an existing extension object from the detector element.
Definition: Detector.cpp:529
Main handle class to hold an alignment object.
Definition: Alignments.h:65
int level() const
Access the hierarchical level of the detector element (Only valid once geometry is closed!) ...
Definition: Detector.cpp:148
DetElement & setVisAttributes(const LCDD &lcdd, const std::string &name, const Volume &volume)
Set Visualization attributes to the detector element.
Definition: Detector.cpp:315
void computeIdeal(Alignment alignment)
Compute the ideal/nominal to-world transformation from the detector element placement.
SensitiveDetector()
Default constructor.
Definition: Detector.h:71
const Children & children() const
Access to the list of children.
Definition: Detector.cpp:207
bool parentToLocal(const Position &parent, Position &local) const
Transformation from world coordinates of the local placed volume coordinates.
Definition: Detector.cpp:412
void copy(Alignment from, Alignment to)
Copy alignment object from source object.
std::string type() const
Access detector type (structure, tracker, calorimeter, etc.).
Definition: Detector.cpp:98
SensitiveDetector & setType(const std::string &typ)
Set detector type (structure, tracker, calorimeter, etc.).
Definition: Detector.cpp:434
SensitiveDetector & setCombineHits(bool value)
Set flag to handle hits collection.
Definition: Detector.cpp:490
DetElement & setRegion(const LCDD &lcdd, const std::string &name, const Volume &volume)
Set the regional attributes to the detector element.
Definition: Detector.cpp:320
Handle to the implementation of the readout structure of a subdetector.
Definition: Readout.h:46
T * ptr() const
Access to the held object.
Definition: Handle.h:149
unsigned int typeFlag() const
Definition: Detector.cpp:109
DD4hep::Geometry::DetElement DetElement
const char * GetTitle() const
Get name (used by Handle)
Definition: NamedObject.h:66
Handle class holding a placed volume (also called physical volume)
Definition: Volumes.h:237
Abstract base for processing callbacks to DetElement objects.
Definition: Detector.h:180
void removeAtUpdate(unsigned int type, void *pointer) const
Remove callback from object.
Definition: Detector.cpp:81
const Keys & keys() const
Known keys of conditions in this container.
Definition: Alignments.cpp:132
const Volume & setVisAttributes(const VisAttr &obj) const
Set Visualization attributes to the volume.
Definition: Volumes.cpp:564
const Keys & keys() const
Known keys of conditions in this container.
Definition: Conditions.cpp:180
DetElement & add(DetElement sub_element)
Add new child to the detector structure.
Definition: Detector.cpp:255
virtual LimitSet limitSet(const std::string &name) const =0
Retrieve a limitset by it's name from the detector description.
unsigned int key
Access hash key of this detector element (Only valid once geometry is closed!)
DetElement & setTypeFlag(unsigned int types)
Set the flag word encoding detector types ( ideally use DD4hep::DetType for encoding ) ...
Definition: Detector.cpp:114
DetElement child(const std::string &name) const
Access to individual children by name.
Definition: Detector.cpp:212
std::string placementPath(DetElement element)
Assemble the placement path from a given detector element to the world volume.
void i_addUpdateCall(unsigned int callback_type, const Callback &callback) const
Internal call to extend the detector element with an arbitrary structure accessible by the type...
Definition: Detector.cpp:76
int id
Unique integer identifier of the detector instance.
VolumeID volumeID() const
The cached VolumeID of this subdetector element.
Definition: Detector.cpp:303
DetElement()
Default constructor.
Definition: Detector.h:243
std::string name
The object name.
Definition: NamedObject.h:34
DetElementObject Object
Internal object type.
Definition: Detector.h:191
DetElement & setPlacement(const PlacedVolume &volume)
Set the physical volumes of the detector element.
Definition: Detector.cpp:290
void assign(Implementation *n, const std::string &nam, const std::string &title)
Assign a new named object. Note: object references must be managed by the user.
Definition: Handle.inl:27
Alignment survey
Basic detector element alignment entry containing the survey data.
Definition of the generic callback structure for member functions.
Definition: Callback.h:38
ConditionsContainer conditions
The detector elements conditions access.
DetElement & setCombineHits(bool value, SensitiveDetector &sens)
Setter: Combine hits attribute.
Definition: Detector.cpp:179
T * access() const
Checked object access. Throws invalid handle runtime exception.
Definition: Handle.inl:41
DetElement clone(const std::string &new_name) const
Clone (Deep copy) the DetElement structure with a new name.
Definition: Detector.cpp:268
DetElement parent
Reference to the parent element.
void * i_addExtension(void *ptr, const std::type_info &info, copy_t ctor, destruct_t dtor) const
Add an extension object to the detector element.
Definition: Detector.cpp:66
SensitiveDetector & setLimitSet(LimitSet limits)
Set the limits to the sensitive detector.
Definition: Detector.cpp:513
ROOT::Math::XYZVector Position
Definition: Objects.h:75
Alignments::Alignment Alignment
Definition: Detector.h:195
void check(bool condition, const std::string &msg) const
Internal assert function to check conditions.
Definition: Detector.cpp:249
bool verbose() const
Access flag to combine hist.
Definition: Detector.cpp:485
const std::string & path() const
Path of the detector element (not necessarily identical to placement path!)
Definition: Detector.cpp:160
PlacedVolume placement() const
Access to the physical volume of this detector element.
Definition: Detector.cpp:279
World world()
Access to the world object. Only possible once the geometry is closed.
int level
Hierarchical level within the detector description.
void SetTitle(const char *tit)
Set Title (used by Handle)
Definition: NamedObject.h:62
int id() const
Get the detector identifier.
Definition: Detector.cpp:171
void *(* copy_t)(const void *, void *arg)
Extensions copy constructor type.
TGeoHMatrix * referenceTrafo
Intermediate buffer for the transformation to an arbitrary DetElement.
DetElement parent() const
Access to the detector elements's parent.
Definition: Detector.cpp:222
std::string placementPath
The path to the placement of the detector element (if placed)
virtual Region region(const std::string &name) const =0
Retrieve a region object by it's name from the detector description.
unsigned int hash32(const char *key)
We need it so often: one-at-time 32 bit hash function.
Definition: Primitives.h:39
Handle class describing a detector element.
Definition: Detector.h:172
Readout readout() const
Access readout structure of the sensitive detector.
Definition: Detector.cpp:451
View * v
Definition: MultiView.cpp:30
bool localToParent(const Position &local, Position &parent) const
Transformation from local coordinates of the placed volume to the parent system.
Definition: Detector.cpp:394
Handle class describing a set of limits as they are used for simulation.
Definition: Objects.h:475
long long int VolumeID
Definition: Primitives.h:35
Handle class describing a region as used in simulation.
Definition: Objects.h:516
const Volume & setRegion(const LCDD &lcdd, const std::string &name) const
Set the regional attributes to the volume. Note: If the name string is empty, the action is ignored...
Definition: Volumes.cpp:698
The main interface to the DD4hep detector description package.
Definition: LCDD.h:82
bool localToWorld(const Position &local, Position &global) const
Create cached matrix to transform to reference coordinates.
Definition: Detector.cpp:385
DetElement & setAttributes(const LCDD &lcdd, const Volume &volume, const std::string &region, const std::string &limits, const std::string &vis)
Set all attributes in one go.
Definition: Detector.cpp:334
bool worldToLocal(const Position &global, Position &local) const
Transformation from local coordinates of the placed volume to arbitrary parent system set as referenc...
Definition: Detector.cpp:403
std::map< std::string, DetElement > Children
Definition: Detector.h:202
T * m_element
Single and only data member: Reference to the actual element.
Definition: Handle.h:96
Data class with properties of a detector element.
unsigned int key() const
Access hash key of this detector element (Only valid once geometry is closed!)
Definition: Detector.cpp:136
const TGeoHMatrix & parentTransformation() const
Create cached matrix to transform to parent coordinates.
Definition: Detector.cpp:380
bool combineHits() const
Access flag to combine hist.
Definition: Detector.cpp:497
std::string type() const
Access the type of the sensitive detector.
Definition: Detector.cpp:440
Region region() const
Access to the region setting of the sensitive detector (not mandatory)
Definition: Detector.cpp:508
AlignmentsContainer alignments
The detector elements alignments access.
SensitiveDetector & setReadout(Readout readout)
Assign the IDDescriptor reference.
Definition: Detector.cpp:445
const TGeoHMatrix & worldTransformation() const
Set detector element for reference transformations. Will delete existing reference trafo...
Definition: Detector.cpp:375
SensitiveDetector & setEnergyCutoff(double value)
Set energy cut off.
Definition: Detector.cpp:456
std::string path
Full path to this detector element. May be invalid.
void * i_extension(const std::type_info &info) const
Access an existing extension object from the detector element.
Definition: Detector.cpp:71
virtual DetElementObject * clone(int new_id, int flag) const
Deep object copy to replicate DetElement trees e.g. for reflection.
const std::string & placementPath() const
Access to the full path to the placed object.
Definition: Detector.cpp:86
void * i_addExtension(void *ptr, const std::type_info &info, void(*destruct)(void *))
Add an extension object to the detector element.
Definition: Detector.cpp:524
Alignment survey() const
Access to the constant survey alignment information.
Definition: Detector.cpp:198
double energyCutoff() const
Access energy cut off.
Definition: Detector.cpp:462