File indexing completed on 2025-12-15 10:11:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef DD4HEP_DETECTOR_H
0014 #define DD4HEP_DETECTOR_H
0015
0016 #include <DD4hep/Version.h>
0017
0018
0019 #include <DD4hep/Handle.h>
0020 #include <DD4hep/Fields.h>
0021 #include <DD4hep/Objects.h>
0022 #include <DD4hep/Shapes.h>
0023 #include <DD4hep/Volumes.h>
0024 #include <DD4hep/Readout.h>
0025 #include <DD4hep/DetElement.h>
0026 #include <DD4hep/NamedObject.h>
0027 #include <DD4hep/Segmentations.h>
0028 #include <DD4hep/VolumeManager.h>
0029 #include <DD4hep/OpticalSurfaceManager.h>
0030 #include <DD4hep/ExtensionEntry.h>
0031 #include <DD4hep/BuildType.h>
0032
0033
0034 #include <map>
0035 #include <vector>
0036 #include <string>
0037 #include <cstdio>
0038 #include <memory>
0039
0040
0041 class TGeoManager;
0042
0043
0044 namespace dd4hep {
0045
0046
0047 std::string versionString();
0048
0049
0050 class NamedObject;
0051
0052
0053 namespace xml {
0054 class UriReader;
0055 }
0056
0057
0058 class STD_Conditions {
0059 public:
0060 enum Conventions {
0061 STP = 1<<0,
0062 NTP = 1<<1,
0063 USER = 1<<2,
0064 USER_SET = 1<<3,
0065 USER_NOTIFIED = 1<<4
0066 };
0067 public:
0068 double pressure;
0069 double temperature;
0070 long convention;
0071 bool is_NTP() const { return (convention&NTP) != 0; }
0072 bool is_STP() const { return (convention&STP) != 0; }
0073 bool is_user_defined() const { return (convention&USER) != 0; }
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 class Detector {
0091 public:
0092
0093 typedef std::map<std::string, Handle<NamedObject> > HandleMap;
0094 typedef std::map<std::string, std::string> PropertyValues;
0095 typedef std::map<std::string, PropertyValues> Properties;
0096
0097
0098 enum State {
0099
0100 NOT_READY = 1<<0,
0101
0102 LOADING = 1<<1,
0103
0104 READY = 1<<2
0105 };
0106
0107
0108 virtual ~Detector() = default;
0109
0110
0111 virtual DetectorBuildType buildType() const = 0;
0112
0113 virtual void init() = 0;
0114
0115 virtual void endDocument(bool close_geometry=true) = 0;
0116
0117
0118 virtual State state() const = 0;
0119
0120 virtual TGeoManager& manager() const = 0;
0121
0122 virtual Properties& properties() const = 0;
0123
0124 virtual Material air() const = 0;
0125
0126 virtual Material vacuum() const = 0;
0127
0128 virtual VisAttr invisible() const = 0;
0129
0130
0131 virtual DetElement world() const = 0;
0132
0133 virtual DetElement trackers() const = 0;
0134
0135
0136 virtual Volume worldVolume() const = 0;
0137
0138 virtual Volume parallelWorldVolume() const = 0;
0139
0140 virtual Volume trackingVolume() const = 0;
0141
0142 virtual void setTrackingVolume(Volume vol) = 0;
0143
0144
0145 virtual VolumeManager volumeManager() const = 0;
0146
0147
0148 virtual OpticalSurfaceManager surfaceManager() const = 0;
0149
0150
0151 virtual const STD_Conditions& stdConditions() const = 0;
0152
0153 virtual void setStdConditions(double temp, double pressure) = 0;
0154
0155 virtual void setStdConditions(const std::string& type) = 0;
0156
0157
0158
0159 virtual Header header() const = 0;
0160
0161 virtual void setHeader(Header h) = 0;
0162
0163
0164 virtual OverlayedField field() const = 0;
0165
0166
0167 virtual const HandleMap& constants() const = 0;
0168
0169 virtual const HandleMap& regions() const = 0;
0170
0171 virtual const HandleMap& detectors() const = 0;
0172
0173 virtual const HandleMap& sensitiveDetectors() const = 0;
0174
0175 virtual const HandleMap& readouts() const = 0;
0176
0177 virtual const HandleMap& visAttributes() const = 0;
0178
0179 virtual const HandleMap& limitsets() const = 0;
0180
0181 virtual const HandleMap& fields() const = 0;
0182
0183 virtual const HandleMap& idSpecifications() const = 0;
0184
0185 #ifndef __MAKECINT__
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 virtual const std::vector<DetElement>& detectors(const std::string& type,
0197 bool throw_exc=false) const = 0;
0198
0199
0200 virtual std::vector<DetElement> detectors(const std::string& type1,
0201 const std::string& type2,
0202 const std::string& type3="",
0203 const std::string& type4="",
0204 const std::string& type5="" ) = 0;
0205
0206
0207 virtual std::vector<std::string> detectorTypes() const = 0;
0208
0209
0210
0211
0212
0213 virtual std::vector<DetElement> detectors(unsigned int includeFlag,
0214 unsigned int excludeFlag=0 ) const = 0 ;
0215 #endif
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227 virtual void declareParent(const std::string& detector_name, const DetElement& det) = 0;
0228
0229
0230
0231
0232
0233 virtual Volume pickMotherVolume(const DetElement& sd) const = 0;
0234
0235
0236 virtual std::string constantAsString(const std::string& name) const = 0;
0237
0238 virtual long constantAsLong(const std::string& name) const = 0;
0239
0240 virtual double constantAsDouble(const std::string& name) const = 0;
0241
0242
0243 virtual Constant constant(const std::string& name) const = 0;
0244
0245 template <class T> T constant(const std::string& name) const;
0246
0247
0248 virtual Material material(const std::string& name) const = 0;
0249
0250 virtual IDDescriptor idSpecification(const std::string& name) const = 0;
0251
0252 virtual Region region(const std::string& name) const = 0;
0253
0254 virtual VisAttr visAttributes(const std::string& name) const = 0;
0255
0256 virtual LimitSet limitSet(const std::string& name) const = 0;
0257
0258 virtual Readout readout(const std::string& name) const = 0;
0259
0260 virtual SensitiveDetector sensitiveDetector(const std::string& name) const = 0;
0261
0262 virtual CartesianField field(const std::string& name) const = 0;
0263
0264 virtual DetElement detector(const std::string& name) const = 0;
0265
0266
0267 virtual Detector& add(Constant constant) = 0;
0268
0269 virtual Detector& add(VisAttr attr) = 0;
0270
0271 virtual Detector& add(LimitSet limitset) = 0;
0272
0273 virtual Detector& add(Region region) = 0;
0274
0275 virtual Detector& add(IDDescriptor spec) = 0;
0276
0277 virtual Detector& add(Readout readout) = 0;
0278
0279 virtual Detector& add(SensitiveDetector entry) = 0;
0280
0281 virtual Detector& add(DetElement detector) = 0;
0282
0283 virtual Detector& add(CartesianField entry) = 0;
0284
0285
0286 virtual Detector& addConstant(const Handle<NamedObject>& element) = 0;
0287
0288 virtual Detector& addVisAttribute(const Handle<NamedObject>& element) = 0;
0289
0290 virtual Detector& addLimitSet(const Handle<NamedObject>& limset) = 0;
0291
0292 virtual Detector& addIDSpecification(const Handle<NamedObject>& element) = 0;
0293
0294 virtual Detector& addRegion(const Handle<NamedObject>& region) = 0;
0295
0296 virtual Detector& addReadout(const Handle<NamedObject>& readout) = 0;
0297
0298 virtual Detector& addSensitiveDetector(const Handle<NamedObject>& element) = 0;
0299
0300 virtual Detector& addDetector(const Handle<NamedObject>& detector) = 0;
0301
0302 virtual Detector& addField(const Handle<NamedObject>& field) = 0;
0303
0304
0305 virtual void fromCompact(const std::string& fname,
0306 DetectorBuildType type = BUILD_DEFAULT) = 0;
0307
0308 virtual void fromXML (const std::string& fname,
0309 DetectorBuildType type = BUILD_DEFAULT) = 0;
0310
0311 virtual void fromXML (const std::string& fname,
0312 xml::UriReader* entity_resolver,
0313 DetectorBuildType type = BUILD_DEFAULT) = 0;
0314
0315
0316 virtual void dump() const = 0;
0317
0318 virtual long apply(const char* factory, int argc, char** argv) const = 0;
0319
0320
0321 virtual void* addUserExtension(unsigned long long int key, ExtensionEntry* entry) = 0;
0322
0323
0324
0325 virtual void* removeUserExtension(unsigned long long int key, bool destroy) = 0;
0326
0327
0328 virtual void* userExtension(unsigned long long int key, bool alert=true) const = 0;
0329
0330
0331 template <typename IFACE, typename CONCRETE> IFACE* addExtension(CONCRETE* c) {
0332 return (IFACE*) addUserExtension(detail::typeHash64<IFACE>(),
0333 new detail::DeleteExtension<IFACE,CONCRETE>(c));
0334 }
0335
0336
0337 template <class IFACE> IFACE* removeExtension(bool destroy=true) {
0338 return (IFACE*) removeUserExtension(detail::typeHash64<IFACE>(),destroy);
0339 }
0340
0341
0342 template <class IFACE> IFACE* extension(bool alert=true) const {
0343 return (IFACE*) userExtension(detail::typeHash64<IFACE>(),alert);
0344 }
0345
0346
0347 static Detector& getInstance(const std::string& name="default");
0348
0349 static void destroyInstance(const std::string& name="default");
0350
0351 static std::unique_ptr<Detector> make_unique(const std::string& name);
0352
0353 };
0354
0355
0356
0357
0358
0359
0360 #ifndef __CINT__
0361
0362 template <> inline short Detector::constant<short>(const std::string& name) const {
0363 return (short) constantAsLong(name);
0364 }
0365
0366
0367 template <> inline unsigned short Detector::constant<unsigned short>(const std::string& name) const {
0368 return (unsigned short) constantAsLong(name);
0369 }
0370
0371
0372 template <> inline int Detector::constant<int>(const std::string& name) const {
0373 return (int) constantAsLong(name);
0374 }
0375
0376
0377 template <> inline unsigned int Detector::constant<unsigned int>(const std::string& name) const {
0378 return (unsigned int) constantAsLong(name);
0379 }
0380
0381
0382 template <> inline long Detector::constant<long>(const std::string& name) const {
0383 return constantAsLong(name);
0384 }
0385
0386
0387 template <> inline unsigned long Detector::constant<unsigned long>(const std::string& name) const {
0388 return (unsigned long) constantAsLong(name);
0389 }
0390
0391
0392 template <> inline float Detector::constant<float>(const std::string& name) const {
0393 return (float) constantAsDouble(name);
0394 }
0395
0396
0397 template <> inline double Detector::constant<double>(const std::string& name) const {
0398 return constantAsDouble(name);
0399 }
0400
0401
0402 template <> inline std::string Detector::constant<std::string>(const std::string& name) const {
0403 return constantAsString(name);
0404 }
0405 #endif
0406 }
0407 #endif