From 695b69a8f4616a277671c0a82c94d5829055b0cc Mon Sep 17 00:00:00 2001 From: Markus Frank <Markus.Frank@cern.ch> Date: Thu, 5 Apr 2018 14:53:25 +0200 Subject: [PATCH] Add possibility to reference pools in used slices. --- DDCond/include/DDCond/ConditionsIOVPool.h | 10 ++++- DDCond/include/DDCond/ConditionsSlice.h | 20 +++++++++- DDCond/src/ConditionsIOVPool.cpp | 47 ++++++++++++++++++++--- DDCond/src/ConditionsSlice.cpp | 8 ++++ DDCond/src/plugins/ConditionsUserPool.cpp | 11 ++++++ 5 files changed, 88 insertions(+), 8 deletions(-) diff --git a/DDCond/include/DDCond/ConditionsIOVPool.h b/DDCond/include/DDCond/ConditionsIOVPool.h index 4c0d49158..e25ac64ff 100644 --- a/DDCond/include/DDCond/ConditionsIOVPool.h +++ b/DDCond/include/DDCond/ConditionsIOVPool.h @@ -59,9 +59,17 @@ namespace dd4hep { /// Select all ACTIVE conditions, which do match the IOV requirement size_t select(const IOV& req_validity, RangeConditions& valid, IOV& cond_validity); /// Select all ACTIVE conditions, which do match the IOV requirement - size_t select(const IOV& req_validity, const ConditionsSelect& valid, IOV& cond_validity); + size_t select(const IOV& req_validity, + const ConditionsSelect& valid, + IOV& cond_validity); /// Select all ACTIVE conditions pools, which do match the IOV requirement size_t select(const IOV& req_validity, Elements& valid, IOV& cond_validity); + /// Select all ACTIVE conditions pools, which do match the IOV requirement (faster) + size_t select(const IOV& req_validity, Elements& valid); + /// Select all ACTIVE conditions pools, which do match the IOV requirement + size_t select(const IOV& req_validity, std::vector<Element>& valid, IOV& cond_validity); + /// Select all ACTIVE conditions pools, which do match the IOV requirement (faster) + size_t select(const IOV& req_validity, std::vector<Element>& valid); /// Remove all key based pools with an age beyon the minimum age. /** @return Number of conditions cleaned up and removed. */ diff --git a/DDCond/include/DDCond/ConditionsSlice.h b/DDCond/include/DDCond/ConditionsSlice.h index 6e795b47e..07eff440d 100644 --- a/DDCond/include/DDCond/ConditionsSlice.h +++ b/DDCond/include/DDCond/ConditionsSlice.h @@ -52,13 +52,17 @@ namespace dd4hep { */ class ConditionsSlice : public ConditionsMap { public: - typedef Condition::key_type key_type; + typedef Condition::key_type key_type; + typedef std::vector<std::shared_ptr<ConditionsPool> > ContainedPools; enum ManageFlag { REGISTER_MANAGER= 1<<0, REGISTER_POOL = 1<<1, REGISTER_FULL = REGISTER_MANAGER|REGISTER_POOL }; + enum LoadFlags { + REF_POOLS = 1<<1 + }; /// Helper to simplify the registration of new condtitions from arbitrary containers. /** @@ -104,6 +108,13 @@ namespace dd4hep { /// Container of conditions required by this slice std::shared_ptr<ConditionsContent> content; + /// Store the result of the prepare step + ConditionsManager::Result status; + /// If requested refence the used pools with a shared pointer to inhibit cleanup + ContainedPools used_pools; + /// Flag to steer conditions management + unsigned long flags = 0; + protected: /// If flag conditonsManager["OutputUnloadedConditions"]=true: will contain conditions not loaded ConditionsContent::Conditions m_missingConditions; @@ -133,7 +144,11 @@ namespace dd4hep { virtual ~ConditionsSlice(); /// Total size of all conditions contained in the slice - size_t size() const { return content->conditions().size()+content->derived().size(); } + size_t size() const { return content->conditions().size()+content->derived().size(); } + /// Set flag to reference the used pools during prepare + void refPools() { this->flags |= REF_POOLS; } + /// Set flag to not reference the used pools during prepare (and drop possibly pending) + void derefPools(); /// Access the map of conditions from the desired content const ConditionsContent::Conditions& conditions() const { return content->conditions();} /// Access the map of computational conditions from the desired content @@ -146,6 +161,7 @@ namespace dd4hep { const IOV& iov() const; /// Clear the conditions content and the user pool. void reset(); + /// Insert a set of conditions to the slice AND register them to the conditions manager. /** Note: The conditions already require a valid hash key */ template <typename T> void manage(const T& conds, ManageFlag flg) { diff --git a/DDCond/src/ConditionsIOVPool.cpp b/DDCond/src/ConditionsIOVPool.cpp index 09f36f196..3385dec36 100644 --- a/DDCond/src/ConditionsIOVPool.cpp +++ b/DDCond/src/ConditionsIOVPool.cpp @@ -128,7 +128,7 @@ size_t ConditionsIOVPool::select(const IOV& req_validity, const ConditionsSelect& predicate_processor, IOV& cond_validity) { - size_t num_selected = 0; + size_t num_selected = 0, pool_selected = 0; if ( !elements.empty() ) { const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy! for( const auto& i : elements ) { @@ -137,7 +137,8 @@ size_t ConditionsIOVPool::select(const IOV& req_validity, continue; } cond_validity.iov_intersection(i.first); - num_selected += i.second->select_all(predicate_processor); + pool_selected = i.second->select_all(predicate_processor); + num_selected += pool_selected; i.second->age_value = 0; } } @@ -148,18 +149,54 @@ size_t ConditionsIOVPool::select(const IOV& req_validity, size_t ConditionsIOVPool::select(const IOV& req_validity, Elements& valid, IOV& cond_validity) +{ + size_t num_selected = select(req_validity, valid); + cond_validity.invert().reset(); + for( const auto& i : valid ) + cond_validity.iov_intersection(*(i.second->iov)); + return num_selected; +} + +/// Select all ACTIVE conditions, which do match the IOV requirement +size_t ConditionsIOVPool::select(const IOV& req_validity, Elements& valid) { size_t num_selected = 0; if ( !elements.empty() ) { const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy! for( const auto& i : elements ) { if ( !IOV::key_contains_range(i.first, req_key) ) { - ++i.second->age_value; continue; } - cond_validity.iov_intersection(i.first); valid[i.first] = i.second; - i.second->age_value = 0; + ++num_selected; + } + } + return num_selected; +} + +/// Select all ACTIVE conditions, which do match the IOV requirement +size_t ConditionsIOVPool::select(const IOV& req_validity, + std::vector<Element>& valid, + IOV& cond_validity) +{ + size_t num_selected = select(req_validity, valid); + cond_validity.invert().reset(); + for( const auto& i : valid ) + cond_validity.iov_intersection(*(i->iov)); + return num_selected; +} + +/// Select all ACTIVE conditions, which do match the IOV requirement +size_t ConditionsIOVPool::select(const IOV& req_validity, std::vector<Element>& valid) +{ + size_t num_selected = 0; + if ( !elements.empty() ) { + const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy! + for( const auto& i : elements ) { + if ( !IOV::key_contains_range(i.first, req_key) ) { + continue; + } + valid.push_back(i.second); ++num_selected; } } diff --git a/DDCond/src/ConditionsSlice.cpp b/DDCond/src/ConditionsSlice.cpp index c65ef2062..8f0aa1175 100644 --- a/DDCond/src/ConditionsSlice.cpp +++ b/DDCond/src/ConditionsSlice.cpp @@ -43,9 +43,16 @@ ConditionsSlice::ConditionsSlice(const ConditionsSlice& copy) /// Default destructor. ConditionsSlice::~ConditionsSlice() { + reset(); InstanceCount::decrement(this); } +/// Set flag to not reference the used pools during prepare (and drop possibly pending) +void ConditionsSlice::derefPools() { + used_pools.clear(); // Drop all refs possibly pending + this->flags &= ~REF_POOLS; +} + /// Access the combined IOV of the slice from the pool const IOV& ConditionsSlice::iov() const { if ( pool.get() ) return pool->validity(); @@ -56,6 +63,7 @@ const IOV& ConditionsSlice::iov() const { /// Clear the conditions access and the user pool. void ConditionsSlice::reset() { + derefPools(); if ( pool.get() ) pool->clear(); } diff --git a/DDCond/src/plugins/ConditionsUserPool.cpp b/DDCond/src/plugins/ConditionsUserPool.cpp index 4cf732546..06d07017d 100644 --- a/DDCond/src/plugins/ConditionsUserPool.cpp +++ b/DDCond/src/plugins/ConditionsUserPool.cpp @@ -572,6 +572,11 @@ ConditionsMappedUserPool<MAPPING>::prepare(const IOV& required, copy(begin(calc_missing), last_calc, inserter(slice_miss_calc, slice_miss_calc.begin())); } } + slice.status = result; + slice.used_pools.clear(); + if ( slice.flags&ConditionsSlice::REF_POOLS ) { + m_iovPool->select(required, slice.used_pools); + } return result; } @@ -643,6 +648,7 @@ ConditionsMappedUserPool<MAPPING>::load(const IOV& required, copy(begin(cond_missing), last_cond, inserter(slice_miss_cond, slice_miss_cond.begin())); } } + slice.status = result; return result; } @@ -706,6 +712,11 @@ ConditionsMappedUserPool<MAPPING>::compute(const IOV& required, copy(begin(calc_missing), last_calc, inserter(slice_miss_calc, slice_miss_calc.begin())); } } + slice.status += result; + slice.used_pools.clear(); + if ( slice.flags&ConditionsSlice::REF_POOLS ) { + m_iovPool->select(required, slice.used_pools); + } return result; } -- GitLab