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_CONDITIONDERIVED_H
0014 #define DD4HEP_CONDITIONDERIVED_H
0015
0016
0017 #include <DD4hep/Memory.h>
0018 #include <DD4hep/Conditions.h>
0019 #include <DD4hep/detail/ConditionsInterna.h>
0020
0021
0022 #include <memory>
0023
0024
0025 namespace dd4hep {
0026
0027
0028 class BasicGrammar;
0029
0030
0031 namespace cond {
0032
0033
0034 class DependencyBuilder;
0035 class ConditionResolver;
0036 class ConditionDependency;
0037 class ConditionUpdateCall;
0038 class ConditionUpdateContext;
0039 class ConditionUpdateUserContext;
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 class ConditionUpdateUserContext {
0050 public:
0051
0052 virtual ~ConditionUpdateUserContext();
0053 };
0054
0055
0056
0057
0058
0059
0060
0061 class ConditionResolver {
0062 public:
0063
0064 virtual ~ConditionResolver();
0065
0066 virtual Handle<NamedObject> manager() const = 0;
0067
0068 virtual Detector& detectorDescription() const = 0;
0069
0070 virtual const IOV& requiredValidity() const = 0;
0071
0072 virtual ConditionsMap& conditionsMap() const = 0;
0073
0074 virtual Condition get(const ConditionKey& key) = 0;
0075
0076 virtual Condition get(const ConditionKey& key, bool throw_if_not) = 0;
0077
0078 virtual Condition get(Condition::key_type key) = 0;
0079
0080 virtual Condition get(Condition::key_type key, bool throw_if_not) = 0;
0081
0082 virtual Condition get(Condition::key_type key,
0083 const ConditionDependency* dependency,
0084 bool throw_if_not) = 0;
0085
0086 virtual std::vector<Condition> get(DetElement de) = 0;
0087
0088 virtual std::vector<Condition> get(Condition::detkey_type key) = 0;
0089
0090 virtual std::vector<Condition> getByItem(Condition::itemkey_type key) = 0;
0091
0092
0093
0094
0095 virtual bool registerOne(const IOV& iov, Condition cond) = 0;
0096
0097 virtual size_t registerMany(const IOV& iov, const std::vector<Condition>& values) = 0;
0098
0099 template <typename CONT> size_t registerUnmapped(const IOV& iov, CONT& c) {
0100 std::vector<Condition> conditions;
0101 conditions.reserve(c.size());
0102 std::copy(std::begin(c), std::end(c), std::back_inserter(conditions));
0103 return this->registerMany(iov, conditions);
0104 }
0105
0106 template <typename CONT> size_t registerMapping(const IOV& iov, CONT& c) {
0107 std::vector<Condition> conditions;
0108 conditions.reserve(c.size());
0109 std::transform(std::begin(c), std::end(c), std::back_inserter(conditions), detail::get_2nd<CONT>());
0110 return this->registerMany(iov, conditions);
0111 }
0112 };
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 class ConditionUpdateContext final {
0137 public:
0138
0139 ConditionResolver* resolver;
0140
0141 const ConditionDependency* dependency;
0142
0143 IOV* iov;
0144
0145 ConditionUpdateUserContext* parameter;
0146
0147 public:
0148
0149 ConditionUpdateContext(ConditionResolver* r,
0150 const ConditionDependency* d,
0151 IOV* iov,
0152 ConditionUpdateUserContext* parameter);
0153
0154
0155 void accessFailure(const ConditionKey& key_value) const;
0156
0157
0158 Detector& detectorDescription() const {
0159 return resolver->detectorDescription();
0160 }
0161
0162
0163 DetElement world() const;
0164
0165
0166 const IOV& requiredValidity() const {
0167 return resolver->requiredValidity();
0168 }
0169
0170
0171 ConditionsMap& conditionsMap() const {
0172 return resolver->conditionsMap();
0173 }
0174
0175
0176 const ConditionKey& key(size_t which) const;
0177
0178
0179 template<typename Q> Q* param() const {
0180 return static_cast<Q*>(parameter);
0181 }
0182
0183
0184
0185
0186
0187
0188 std::vector<Condition> conditions(DetElement det) const {
0189 return conditions(det.key());
0190 }
0191
0192
0193
0194
0195
0196
0197 std::vector<Condition> conditions(Condition::detkey_type det_key) const;
0198
0199
0200
0201
0202
0203
0204 std::vector<Condition> getByItem(Condition::itemkey_type key) const;
0205
0206
0207
0208
0209
0210
0211 Condition condition(const ConditionKey& key_value) const;
0212
0213
0214
0215
0216
0217
0218 Condition condition(Condition::key_type key_value) const;
0219
0220
0221
0222
0223
0224
0225 Condition condition(Condition::key_type key_value, bool throw_if_not) const;
0226
0227
0228
0229
0230
0231
0232 template<typename T> T& get(const ConditionKey& key_value);
0233
0234
0235
0236
0237
0238
0239 template<typename T> const T& get(const ConditionKey& key_value) const;
0240
0241
0242
0243
0244
0245
0246 template<typename T> T& get(Condition::key_type key_value);
0247
0248
0249
0250
0251
0252
0253 template<typename T> const T& get(Condition::key_type key_value) const;
0254
0255
0256
0257
0258 bool registerOne(const IOV& iov, Condition cond);
0259
0260 size_t registerMany(const IOV& iov, const std::vector<Condition>& values);
0261
0262 template <typename CONT> size_t registerUnmapped(const IOV& iov_val, CONT& values) {
0263 std::vector<Condition> conds;
0264 conds.reserve(values.size());
0265 std::copy(std::begin(values), std::end(values), std::back_inserter(conds));
0266 return this->registerMany(iov_val, conds);
0267 }
0268
0269 template <typename CONT> size_t registerMapping(const IOV& iov_val, CONT& values) {
0270 std::vector<Condition> conds;
0271 conds.reserve(values.size());
0272 std::transform(std::begin(values), std::end(values), std::back_inserter(conds), detail::get_2nd<CONT>());
0273 return this->registerMany(iov_val, conds);
0274 }
0275 };
0276
0277
0278
0279
0280
0281
0282
0283 class ConditionUpdateCall {
0284 protected:
0285
0286 ConditionUpdateCall();
0287
0288 ConditionUpdateCall(const ConditionUpdateCall& copy) = delete;
0289
0290 virtual ~ConditionUpdateCall();
0291
0292 ConditionUpdateCall& operator=(const ConditionUpdateCall& copy) = delete;
0293
0294 public:
0295
0296 virtual Condition operator()(const ConditionKey& target,
0297 ConditionUpdateContext& ctxt) = 0;
0298
0299 virtual void resolve(Condition , ConditionUpdateContext& ) {}
0300 };
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316 class ConditionDependency {
0317 friend std::default_delete<ConditionDependency>;
0318 protected:
0319
0320 int m_refCount {0};
0321
0322 public:
0323
0324 DetElement detector;
0325
0326 ConditionKey target {0};
0327
0328 std::vector<ConditionKey> dependencies;
0329
0330 std::shared_ptr<ConditionUpdateCall> callback;
0331
0332 protected:
0333
0334 ConditionDependency(const ConditionDependency& c) = delete;
0335
0336 ConditionDependency& operator=(const ConditionDependency& c) = delete;
0337
0338 virtual ~ConditionDependency();
0339
0340 public:
0341
0342 ConditionDependency(DetElement de, const std::string& item, std::shared_ptr<ConditionUpdateCall> call);
0343
0344 ConditionDependency(DetElement de, Condition::itemkey_type item_key, std::shared_ptr<ConditionUpdateCall> call);
0345
0346 ConditionDependency();
0347
0348 Condition::key_type key() const { return target.hash; }
0349 #if defined(DD4HEP_CONDITIONS_HAVE_NAME)
0350
0351 const char* name() const { return target.name.c_str(); }
0352 #endif
0353
0354 ConditionDependency* addRef() { ++m_refCount; return this; }
0355
0356 void release() { if ( --m_refCount <= 0 ) delete this; }
0357 };
0358
0359
0360
0361
0362
0363
0364
0365 class DependencyBuilder {
0366 protected:
0367
0368 std::unique_ptr<ConditionDependency> m_dependency;
0369 public:
0370
0371 DependencyBuilder(DetElement de, Condition::itemkey_type item_key, std::shared_ptr<ConditionUpdateCall> call);
0372
0373 DependencyBuilder(DetElement de, const std::string& item, std::shared_ptr<ConditionUpdateCall> call);
0374
0375 virtual ~DependencyBuilder();
0376
0377 ConditionDependency* operator->() { return m_dependency.operator->(); }
0378
0379 void add(const ConditionKey& source_key);
0380
0381 ConditionDependency* release();
0382 };
0383
0384
0385 inline ConditionUpdateContext::ConditionUpdateContext(ConditionResolver* resolv,
0386 const ConditionDependency* dep,
0387 IOV* i,
0388 ConditionUpdateUserContext* user_param)
0389 : resolver(resolv), dependency(dep), iov(i), parameter(user_param)
0390 {
0391 }
0392
0393
0394 inline const ConditionKey&
0395 ConditionUpdateContext::key(size_t which) const {
0396 return dependency->dependencies.at(which);
0397 }
0398
0399
0400 template<typename T> inline T&
0401 ConditionUpdateContext::get(const ConditionKey& key_value) {
0402 Condition cond = condition(key_value);
0403 if ( cond.isValid() ) {
0404 return cond.get<T>();
0405 }
0406 accessFailure(key_value);
0407 throw std::runtime_error("ConditionUpdateCall");
0408 }
0409
0410
0411 template<typename T> inline const T&
0412 ConditionUpdateContext::get(const ConditionKey& key_value) const {
0413 Condition cond = condition(key_value);
0414 if ( cond.isValid() ) {
0415 return cond.get<T>();
0416 }
0417 accessFailure(key_value);
0418 throw std::runtime_error("ConditionUpdateCall");
0419 }
0420
0421
0422 template<typename T> inline T&
0423 ConditionUpdateContext::get(Condition::key_type key_value) {
0424 return condition(key_value).get<T>();
0425 }
0426
0427
0428 template<typename T> inline const T&
0429 ConditionUpdateContext::get(Condition::key_type key_value) const {
0430 return condition(key_value).get<T>();
0431 }
0432
0433 }
0434 }
0435 #endif