File indexing completed on 2025-02-21 09:58:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef DD4HEP_DETECTORIMP_H
0014 #define DD4HEP_DETECTORIMP_H
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #if !defined(DD4HEP_MUST_USE_DETECTORIMP_H) && !defined(G__ROOT)
0027 #error "DetectorImp.h is a dd4hep internal header. Never use it in a depending compilation unit!"
0028 #endif
0029
0030
0031 #include <DD4hep/DetectorData.h>
0032 #include <DD4hep/DetectorLoad.h>
0033 #include <TNamed.h>
0034
0035
0036 class TGeoManager;
0037
0038
0039 #include <map>
0040
0041
0042 namespace dd4hep {
0043
0044
0045 namespace detail {
0046 class OpticalSurfaceManagerObject;
0047 }
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 class DetectorImp: public TNamed, public Detector, public DetectorData, public DetectorLoad {
0060 protected:
0061
0062 typedef std::map<std::string, std::vector<DetElement> > DetectorTypeMap;
0063
0064
0065 mutable STD_Conditions m_std_conditions;
0066
0067
0068 DetectorTypeMap m_detectorTypes;
0069
0070
0071 DetectorBuildType m_buildType;
0072
0073
0074 detail::OpticalSurfaceManagerObject* m_surfaceManager {nullptr};
0075
0076 private:
0077
0078 DetectorImp(DetectorImp&& copy) = delete;
0079
0080
0081 DetectorImp(const DetectorImp& copy) = delete;
0082
0083
0084 DetectorImp& operator=(const DetectorImp& copy) = delete;
0085
0086
0087 void mapDetectorTypes();
0088
0089
0090 Int_t saveObject(const char *name=0, Int_t option=0, Int_t bufsize=0) const;
0091 public:
0092
0093
0094 void imp_loadVolumeManager();
0095
0096
0097 DetectorImp();
0098
0099
0100 DetectorImp(const std::string& name);
0101
0102
0103 virtual ~DetectorImp();
0104
0105
0106 virtual State state() const override {
0107 return m_state;
0108 }
0109
0110
0111 virtual DetectorBuildType buildType() const override {
0112 return m_buildType;
0113 }
0114
0115
0116 virtual void fromCompact(const std::string& fname, DetectorBuildType type = BUILD_DEFAULT) override {
0117 fromXML(fname, type);
0118 }
0119
0120
0121 virtual void fromXML(const std::string& fname, DetectorBuildType type = BUILD_DEFAULT) override;
0122
0123
0124 virtual void fromXML(const std::string& fname,
0125 xml::UriReader* entity_resolver,
0126 DetectorBuildType type = BUILD_DEFAULT) override;
0127
0128 virtual void dump() const override;
0129
0130
0131 virtual long apply(const char* factory, int argc, char** argv) const override;
0132
0133
0134 virtual void init() override;
0135
0136
0137 virtual void endDocument(bool close_geometry) override;
0138
0139
0140 virtual void* addUserExtension(unsigned long long int key, ExtensionEntry* entry) override;
0141
0142
0143 virtual void* removeUserExtension(unsigned long long int key, bool destroy=true) override;
0144
0145
0146 virtual void* userExtension(unsigned long long int key, bool alert=true) const override;
0147
0148 virtual Handle<NamedObject> getRefChild(const HandleMap& e, const std::string& name, bool throw_if_not = true) const;
0149
0150
0151 virtual void declareParent(const std::string& detector_name, const DetElement& parent) override;
0152
0153
0154 virtual Volume pickMotherVolume(const DetElement& sd) const override;
0155
0156
0157 virtual TGeoManager& manager() const override {
0158 return *m_manager;
0159 }
0160
0161 Properties& properties() const override {
0162 return *(Properties*)&m_properties;
0163 }
0164
0165 virtual Material air() const override {
0166 return m_materialAir;
0167 }
0168
0169 virtual Material vacuum() const override {
0170 return m_materialVacuum;
0171 }
0172
0173 virtual VisAttr invisible() const override {
0174 return m_invisibleVis;
0175 }
0176
0177 virtual DetElement world() const override {
0178 return m_world;
0179 }
0180
0181 virtual DetElement trackers() const override {
0182 return m_trackers;
0183 }
0184
0185 virtual Volume worldVolume() const override {
0186 return m_worldVol;
0187 }
0188
0189 virtual Volume parallelWorldVolume() const override {
0190 return m_parallelWorldVol;
0191 }
0192
0193 virtual Volume trackingVolume() const override {
0194 return m_trackingVol;
0195 }
0196
0197 virtual void setTrackingVolume(Volume vol) override {
0198 m_trackingVol = vol;
0199 }
0200
0201 virtual VolumeManager volumeManager() const override {
0202 return m_volManager;
0203 }
0204
0205 virtual OpticalSurfaceManager surfaceManager() const override {
0206 return OpticalSurfaceManager(m_surfaceManager);
0207 }
0208
0209
0210 virtual OverlayedField field() const override {
0211 return m_field;
0212 }
0213
0214
0215 virtual const STD_Conditions& stdConditions() const override;
0216
0217 virtual void setStdConditions(double temp, double pressure) override;
0218
0219 virtual void setStdConditions(const std::string& type) override;
0220
0221
0222 virtual Header header() const override {
0223 return m_header;
0224 }
0225
0226 virtual void setHeader(Header h) override {
0227 m_header = h;
0228 }
0229
0230
0231 virtual std::string constantAsString(const std::string& name) const override;
0232
0233
0234 virtual long constantAsLong(const std::string& name) const override;
0235
0236
0237 virtual double constantAsDouble(const std::string& name) const override;
0238
0239
0240 virtual Constant constant(const std::string& name) const override;
0241
0242
0243 virtual LimitSet limitSet(const std::string& name) const override {
0244 return getRefChild(m_limits, name);
0245 }
0246
0247 virtual VisAttr visAttributes(const std::string& name) const override {
0248 return getRefChild(m_display, name, false);
0249 }
0250
0251 virtual Material material(const std::string& name) const override;
0252
0253
0254 virtual Region region(const std::string& name) const override {
0255 return getRefChild(m_regions, name);
0256 }
0257
0258 virtual IDDescriptor idSpecification(const std::string& name) const override {
0259 return getRefChild(m_idDict, name);
0260 }
0261
0262 virtual Readout readout(const std::string& name) const override {
0263 return getRefChild(m_readouts, name);
0264 }
0265
0266 virtual DetElement detector(const std::string& name) const override;
0267
0268
0269 virtual SensitiveDetector sensitiveDetector(const std::string& name) const override {
0270 return getRefChild(m_sensitive, name, false);
0271 }
0272
0273 virtual CartesianField field(const std::string& name) const override {
0274 return getRefChild(m_fields, name, false);
0275 }
0276
0277
0278 virtual const HandleMap& constants() const override {
0279 return m_define;
0280 }
0281
0282 virtual const HandleMap& visAttributes() const override {
0283 return m_display;
0284 }
0285
0286 virtual const HandleMap& limitsets() const override {
0287 return m_limits;
0288 }
0289
0290 virtual const HandleMap& regions() const override {
0291 return m_regions;
0292 }
0293
0294 virtual const HandleMap& readouts() const override {
0295 return m_readouts;
0296 }
0297
0298 virtual const HandleMap& detectors() const override {
0299 return m_detectors;
0300 }
0301
0302 virtual const HandleMap& sensitiveDetectors() const override {
0303 return m_sensitive;
0304 }
0305
0306 virtual const HandleMap& fields() const override {
0307 return m_fields;
0308 }
0309
0310 virtual const HandleMap& idSpecifications() const override {
0311 return m_idDict;
0312 }
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323 virtual const std::vector<DetElement>& detectors(const std::string& type, bool throw_exc) const override;
0324
0325
0326 virtual std::vector<DetElement> detectors(const std::string& type1,
0327 const std::string& type2,
0328 const std::string& type3="",
0329 const std::string& type4="",
0330 const std::string& type5="" ) override;
0331
0332
0333 virtual std::vector<std::string> detectorTypes() const override;
0334
0335
0336
0337
0338 virtual std::vector<DetElement> detectors(unsigned int includeFlag,
0339 unsigned int excludeFlag=0 ) const override;
0340
0341
0342 #define __R return *this
0343
0344 virtual Detector& add(Constant x) override {
0345 return addConstant(x);
0346 }
0347
0348 virtual Detector& add(LimitSet x) override {
0349 return addLimitSet(x);
0350 }
0351
0352 virtual Detector& add(Region x) override {
0353 return addRegion(x);
0354 }
0355
0356 virtual Detector& add(VisAttr x) override {
0357 return addVisAttribute(x);
0358 }
0359
0360 virtual Detector& add(IDDescriptor x) override {
0361 return addIDSpecification(x);
0362 }
0363
0364 virtual Detector& add(Readout x) override {
0365 return addReadout(x);
0366 }
0367
0368 virtual Detector& add(SensitiveDetector x) override {
0369 return addSensitiveDetector(x);
0370 }
0371
0372 virtual Detector& add(DetElement x) override {
0373 return addDetector(x);
0374 }
0375
0376 virtual Detector& add(CartesianField x) override {
0377 return addField(x);
0378 }
0379
0380
0381 virtual Detector& addConstant(const Handle<NamedObject>& x) override;
0382
0383
0384 virtual Detector& addLimitSet(const Handle<NamedObject>& x) override {
0385 m_limits.append(x);
0386 __R;
0387 }
0388
0389 virtual Detector& addRegion(const Handle<NamedObject>& x) override {
0390 m_regions.append(x);
0391 __R;
0392 }
0393
0394 virtual Detector& addIDSpecification(const Handle<NamedObject>& x) override {
0395 m_idDict.append(x);
0396 __R;
0397 }
0398
0399 virtual Detector& addReadout(const Handle<NamedObject>& x) override {
0400 m_readouts.append(x);
0401 __R;
0402 }
0403
0404 virtual Detector& addVisAttribute(const Handle<NamedObject>& x) override {
0405 m_display.append(x);
0406 __R;
0407 }
0408
0409 virtual Detector& addSensitiveDetector(const Handle<NamedObject>& x) override {
0410 m_sensitive.append(x);
0411 __R;
0412 }
0413
0414 virtual Detector& addDetector(const Handle<NamedObject>& x) override;
0415
0416 virtual Detector& addField(const Handle<NamedObject>& x) override;
0417 #undef __R
0418
0419 virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0) override {
0420 return saveObject(name, option, bufsize);
0421 }
0422
0423 virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0) const override {
0424 return saveObject(name, option, bufsize);
0425 }
0426
0427 ClassDefOverride(DetectorImp,100);
0428
0429 };
0430 }
0431
0432 #if defined(__CINT__) || defined(__MAKECINT__) || defined(__CLING__) || defined(__ROOTCLING__)
0433 #pragma link C++ class dd4hep::DetectorImp+;
0434 #endif
0435 #endif