diff --git a/DDCond/include/DDCond/ConditionsIOVPool.h b/DDCond/include/DDCond/ConditionsIOVPool.h index 4c0d49158ee722c6d59133d1b5ff3218916da317..e25ac64ffcfe4ddfa6ca5278947a15ce85a72faf 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 6e795b47ecb58fc9e078b25a961379e757df3a1d..07eff440d217a5d380765eae7eac868575531f88 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 09f36f1963a71772a9ff7fc6dc58a64469ba656c..3385dec36dd10ed67ed274ae8f80aa902588e297 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 c65ef2062d7ca1528f3c324a215b359b81d1f157..8f0aa1175800d2e6e8eeff807cc6e8a5f196d246 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 4cf7325463a6f6c8fd396f13fd8d3bf124756256..06d07017d8c19bd8aefa858a8f0a64d3f626565a 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; }