38 namespace eventsetup {
41 unsigned subProcessIndex,
42 const PreferredProviderInfo* iInfo)
44 mustFinishConfiguration_(
true),
45 subProcessIndex_(subProcessIndex),
46 preferredProviderInfo_((
nullptr != iInfo) ? (new PreferredProviderInfo(*iInfo)) :
nullptr),
48 dataProviders_(new
std::vector<
std::shared_ptr<DataProxyProvider>>()),
56 EventSetupProvider::~EventSetupProvider() { forceCacheClear(); }
58 std::shared_ptr<EventSetupRecordProvider>& EventSetupProvider::recordProvider(
const EventSetupRecordKey& iKey) {
59 auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
60 if (lb == recordKeys_.end() || iKey != *lb) {
61 throw cms::Exception(
"LogicError") <<
"EventSetupProvider::recordProvider Could not find key\n" 62 <<
"Should be impossible. Please contact Framework developer.\n";
65 return recordProviders_[
index];
69 auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
70 if (lb == recordKeys_.end() || iKey != *lb) {
74 return recordProviders_[
index].get();
78 std::unique_ptr<EventSetupRecordProvider> iProvider) {
79 auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
81 if (lb == recordKeys_.end() || iKey != *lb) {
82 recordKeys_.insert(lb, iKey);
83 recordProviders_.insert(recordProviders_.begin() +
index,
std::move(iProvider));
90 assert(iProvider.get() !=
nullptr);
91 dataProviders_->push_back(iProvider);
94 void EventSetupProvider::replaceExisting(std::shared_ptr<DataProxyProvider> dataProxyProvider) {
96 std::set<EventSetupRecordKey>
const& keysForPSetID = (*psetIDToRecordKey_)[psetID];
97 for (
auto const&
key : keysForPSetID) {
98 recordProvider(
key)->resetProxyProvider(psetID, dataProxyProvider);
103 assert(iFinder.get() !=
nullptr);
104 finders_->push_back(iFinder);
108 using RecordToPreferred = std::map<EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap>;
114 bool foundProxyProvider =
false;
115 for (
auto const& recordProvider : iRecordProviders) {
116 std::set<ComponentDescription>
components = recordProvider->proxyProviderDescriptions();
117 if (components.find(iComponent) != components.end()) {
118 std::shared_ptr<DataProxyProvider> proxyProv = recordProvider->proxyProvider(*(components.find(iComponent)));
119 assert(proxyProv.get());
121 std::set<EventSetupRecordKey> records = proxyProv->usingRecords();
122 for (
auto const& recordKey : records) {
123 unsigned int iovIndex = 0;
129 for (
auto keyedProxy : keyedProxies) {
130 EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
131 dataToProviderMap.find(keyedProxy.dataKey_);
132 if (itFind != dataToProviderMap.end()) {
134 <<
"Two providers have been set to be preferred for\n" 135 << keyedProxy.dataKey_.type().name() <<
" \"" << keyedProxy.dataKey_.name().value() <<
"\"" 136 <<
"\n the providers are " 137 <<
"\n 1) type=" << itFind->second.type_ <<
" label=\"" << itFind->second.label_ <<
"\"" 138 <<
"\n 2) type=" << iComponent.
type_ <<
" label=\"" << iComponent.
label_ <<
"\"" 139 <<
"\nPlease modify configuration so only one is preferred";
141 dataToProviderMap.insert(std::make_pair(keyedProxy.dataKey_, iComponent));
145 foundProxyProvider =
true;
149 if (!foundProxyProvider) {
151 <<
"Could not make type=\"" << iComponent.
type_ <<
"\" label=\"" << iComponent.
label_ 152 <<
"\" a preferred Provider." 153 <<
"\n Please check spelling of name, or that it was loaded into the job.";
157 void EventSetupProvider::determinePreferred() {
159 if (preferredProviderInfo_) {
160 for (
auto const& itInfo : *preferredProviderInfo_) {
161 if (itInfo.second.empty()) {
165 for (
auto const& itRecData : itInfo.second) {
170 <<
"Unknown record \"" << recordName
171 <<
"\" used in es_prefer statement for type=" << itInfo.first.type_ <<
" label=\"" 172 << itInfo.first.label_ <<
"\"\n Please check spelling.";
179 std::set<ComponentDescription>::iterator itProxyProv = components.find(itInfo.first);
180 if (itProxyProv == components.end()) {
182 <<
"The type=" << itInfo.first.type_ <<
" label=\"" << itInfo.first.label_
183 <<
"\" does not provide data for the Record " <<
recordName;
190 <<
"The es_prefer statement for type=" << itInfo.first.type_ <<
" label=\"" << itInfo.first.label_
191 <<
"\" has the unknown data type \"" << itRecData.second.first <<
"\"" 192 <<
"\n Please check spelling";
197 std::shared_ptr<DataProxyProvider> proxyProv = recordProviderForKey.
proxyProvider(*itProxyProv);
198 unsigned int iovIndex = 0;
200 if (!keyedProxies.
contains(datumKey)) {
202 <<
"The es_prefer statement for type=" << itInfo.first.type_ <<
" label=\"" << itInfo.first.label_
203 <<
"\" specifies the data item \n" 204 <<
" type=\"" << itRecData.second.first <<
"\" label=\"" << itRecData.second.second <<
"\"" 205 <<
" which is not provided. Please check spelling.";
209 (*recordToPreferred_)[recordKey];
211 if (dataToProviderMap.end() != dataToProviderMap.find(datumKey)) {
212 EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
213 dataToProviderMap.find(datumKey);
215 <<
"Two providers have been set to be preferred for\n" 216 << datumKey.type().name() <<
" \"" << datumKey.name().value() <<
"\"" 217 <<
"\n the providers are " 218 <<
"\n 1) type=" << itFind->second.type_ <<
" label=\"" << itFind->second.label_ <<
"\"" 219 <<
"\n 2) type=" << itProxyProv->type_ <<
" label=\"" << itProxyProv->label_ <<
"\"" 220 <<
"\nPlease modify configuration so only one is preferred";
222 dataToProviderMap.insert(std::make_pair(datumKey, *itProxyProv));
230 bool& hasNonconcurrentFinder) {
232 recordToFinders_->clear();
233 for (
auto&
finder : *finders_) {
234 if (!
finder->concurrentFinder()) {
235 hasNonconcurrentFinder =
true;
238 const std::set<EventSetupRecordKey> recordsUsing =
finder->findingForRecords();
240 for (
auto const&
key : recordsUsing) {
241 (*recordToFinders_)[
key].push_back(
finder);
244 if (recProvider ==
nullptr) {
245 bool printInfoMsg =
true;
250 recProvider = tryToGetRecordProvider(
key);
260 psetIDToRecordKey_->clear();
261 for (
auto& dataProxyProvider : *dataProviders_) {
264 const std::set<EventSetupRecordKey> recordsUsing = dataProxyProvider->usingRecords();
265 for (
auto const&
key : recordsUsing) {
267 dataProxyProvider->createKeyedProxies(
key, nConcurrentIOVs);
269 if (dataProxyProvider->description().isLooper_) {
270 recordsWithALooperProxy_->insert(
key);
273 (*psetIDToRecordKey_)[psetID].insert(
key);
276 if (recProvider ==
nullptr) {
277 bool printInfoMsg =
true;
281 recProvider = tryToGetRecordProvider(
key);
283 recProvider->
add(dataProxyProvider);
290 determinePreferred();
295 for (
auto& itRecordProvider : recordProviders_) {
297 RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(itRecordProvider->key());
298 if (itRecordFound != recordToPreferred_->end()) {
299 preferredInfo = &(itRecordFound->second);
302 itRecordProvider->usePreferred(*preferredInfo);
304 std::set<EventSetupRecordKey> records = itRecordProvider->dependentRecords();
305 if (!records.empty()) {
307 std::vector<std::shared_ptr<EventSetupRecordProvider>> depProviders;
308 depProviders.reserve(records.size());
309 bool foundAllProviders =
true;
310 for (
auto const&
key : records) {
311 auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(),
key);
312 if (lb == recordKeys_.end() ||
key != *lb) {
313 foundAllProviders =
false;
314 if (missingRecords.empty()) {
315 missingRecords =
key.name();
317 missingRecords +=
", ";
318 missingRecords +=
key.name();
322 depProviders.push_back(recordProviders_[
index]);
326 if (!foundAllProviders) {
328 <<
"The EventSetup record " << itRecordProvider->key().name() <<
" depends on at least one Record \n (" 330 <<
") which is not present in the job." 331 "\n This may lead to an exception begin thrown during event processing.\n If no exception occurs " 332 "during the job than it is usually safe to ignore this message.";
338 itRecordProvider->setDependentProviders(depProviders);
342 auto indices = recordsToProxyIndices();
343 for (
auto& provider : *dataProviders_) {
344 provider->updateLookup(
indices);
346 dataProviders_.reset();
348 mustFinishConfiguration_ =
false;
351 using Itr = RecordProviders::iterator;
355 std::vector<std::shared_ptr<EventSetupRecordProvider>>& oDependents) {
356 for (
Itr it = itBegin; it != itEnd; ++it) {
358 const std::set<EventSetupRecordKey>&
deps = (*it)->dependentRecords();
359 if (deps.end() != deps.find(iKey)) {
360 oDependents.push_back(*it);
369 if (recProvider ==
nullptr) {
373 std::vector<std::shared_ptr<EventSetupRecordProvider>> dependents;
374 findDependents(iKey, recordProviders_.begin(), recordProviders_.end(), dependents);
376 dependents.erase(
std::unique(dependents.begin(), dependents.end()), dependents.end());
379 for (
auto&
d : dependents) {
384 void EventSetupProvider::forceCacheClear() {
385 for (
auto& recProvider : recordProviders_) {
387 recProvider->resetProxies();
392 void EventSetupProvider::checkESProducerSharing(
394 std::set<ParameterSetIDHolder>& sharingCheckDone,
398 <<
"EventSetupProvider::checkESProducerSharing: Checking processes with SubProcess Indexes " 399 << subProcessIndex() <<
" and " << precedingESProvider.
subProcessIndex();
401 if (referencedESProducers.empty()) {
402 for (
auto& recProvider : recordProviders_) {
403 recProvider->getReferencedESProducers(referencedESProducers);
410 std::map<EventSetupRecordKey, bool> allComponentsMatch;
412 std::map<ParameterSetID, bool> candidateNotRejectedYet;
416 for (
auto const& iRecord : referencedESProducers) {
417 for (
auto const& iComponent : iRecord.second) {
420 if (sharingCheckDone.find(psetIDHolder) != sharingCheckDone.end())
423 bool firstProcessWithThisPSet =
false;
424 bool precedingHasMatchingPSet =
false;
429 firstProcessWithThisPSet,
430 precedingHasMatchingPSet);
432 if (firstProcessWithThisPSet) {
433 sharingCheckDone.insert(psetIDHolder);
434 allComponentsMatch[iRecord.first] =
false;
438 if (!precedingHasMatchingPSet) {
439 allComponentsMatch[iRecord.first] =
false;
456 auto iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
457 if (iCandidateNotRejectedYet == candidateNotRejectedYet.end()) {
458 candidateNotRejectedYet[psetID] =
true;
459 iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
481 if (iCandidateNotRejectedYet->second ==
true) {
482 auto iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
483 if (iAllComponentsMatch == allComponentsMatch.end()) {
487 bool match = doRecordsMatch(precedingESProvider, iRecord.first, allComponentsMatch, esController);
488 allComponentsMatch[iRecord.first] =
match;
489 iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
491 if (!iAllComponentsMatch->second) {
492 iCandidateNotRejectedYet->second =
false;
499 for (
auto const& candidate : candidateNotRejectedYet) {
501 bool canBeShared = candidate.second;
504 logInfoWhenSharing(pset);
506 sharingCheckDone.insert(psetIDHolder);
514 std::shared_ptr<DataProxyProvider> dataProxyProvider;
515 std::set<EventSetupRecordKey>
const& keysForPSetID1 = (*precedingESProvider.
psetIDToRecordKey_)[psetIDHolder];
516 for (
auto const&
key : keysForPSetID1) {
517 dataProxyProvider = precedingESProvider.
recordProvider(
key)->proxyProvider(psetIDHolder);
518 assert(dataProxyProvider);
522 std::set<EventSetupRecordKey>
const& keysForPSetID2 = (*psetIDToRecordKey_)[psetIDHolder];
523 for (
auto const&
key : keysForPSetID2) {
524 recordProvider(
key)->resetProxyProvider(psetIDHolder, dataProxyProvider);
537 std::map<EventSetupRecordKey, bool>& allComponentsMatch,
552 if ((*recordToFinders_)[eventSetupRecordKey].size() !=
557 for (
auto const&
finder : (*recordToFinders_)[eventSetupRecordKey]) {
566 fillReferencedDataKeys(eventSetupRecordKey);
569 std::map<DataKey, ComponentDescription const*>
const& dataItems = (*referencedDataKeys_)[eventSetupRecordKey];
571 std::map<DataKey, ComponentDescription const*>
const& precedingDataItems =
574 if (dataItems.size() != precedingDataItems.size()) {
578 for (
auto const& dataItem : dataItems) {
579 auto precedingDataItem = precedingDataItems.find(dataItem.first);
580 if (precedingDataItem == precedingDataItems.end()) {
583 if (dataItem.second->pid_ != precedingDataItem->second->pid_) {
589 if (!dataItem.second->isSource_ && !dataItem.second->isLooper_) {
591 dataItem.second->pid_, subProcessIndex_, precedingESProvider.
subProcessIndex_);
598 if (recProvider !=
nullptr) {
599 std::set<EventSetupRecordKey> dependentRecords = recProvider->
dependentRecords();
600 for (
auto const& dependentRecord : dependentRecords) {
601 auto iter = allComponentsMatch.find(dependentRecord);
602 if (iter != allComponentsMatch.end()) {
609 bool match = doRecordsMatch(precedingESProvider, dependentRecord, allComponentsMatch, esController);
610 allComponentsMatch[dependentRecord] =
match;
619 if (referencedDataKeys_->find(eventSetupRecordKey) != referencedDataKeys_->end())
623 if (recProvider ==
nullptr) {
624 (*referencedDataKeys_)[eventSetupRecordKey];
630 void EventSetupProvider::resetRecordToProxyPointers() {
631 for (
auto const& recProvider : recordProviders_) {
634 RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(recProvider->key());
635 if (itRecordFound != recordToPreferred_->end()) {
636 preferredInfo = &(itRecordFound->second);
638 recProvider->resetRecordToProxyPointers(*preferredInfo);
642 void EventSetupProvider::clearInitializationData() {
643 preferredProviderInfo_.reset();
644 referencedDataKeys_.reset();
645 recordToFinders_.reset();
646 psetIDToRecordKey_.reset();
647 recordToPreferred_.reset();
648 recordsWithALooperProxy_.reset();
651 void EventSetupProvider::fillRecordsNotAllowingConcurrentIOVs(
652 std::set<EventSetupRecordKey>& recordsNotAllowingConcurrentIOVs)
const {
653 for (
auto const& dataProxyProvider : *dataProviders_) {
654 dataProxyProvider->fillRecordsNotAllowingConcurrentIOVs(recordsNotAllowingConcurrentIOVs);
658 void EventSetupProvider::setAllValidityIntervals(
const IOVSyncValue& iValue) {
662 for (
auto& recProvider : recordProviders_) {
663 recProvider->initializeForNewSyncValue();
666 for (
auto& recProvider : recordProviders_) {
667 recProvider->setValidityIntervalFor(iValue);
671 std::shared_ptr<const EventSetupImpl> EventSetupProvider::eventSetupForInstance(
const IOVSyncValue& iValue,
672 bool& newEventSetupImpl) {
680 bool needNewEventSetupImpl =
false;
681 if (eventSetupImpl_.get() ==
nullptr) {
682 needNewEventSetupImpl =
true;
684 for (
auto& recProvider : recordProviders_) {
686 if (eventSetupImpl_->validRecord(recProvider->key())) {
687 needNewEventSetupImpl =
true;
690 if (recProvider->newIntervalForAnySubProcess()) {
691 needNewEventSetupImpl =
true;
697 if (needNewEventSetupImpl) {
699 eventSetupImpl_ = std::shared_ptr<EventSetupImpl>(
new EventSetupImpl);
700 newEventSetupImpl =
true;
701 eventSetupImpl_->setKeyIters(recordKeys_.begin(), recordKeys_.end());
703 for (
auto& recProvider : recordProviders_) {
704 recProvider->setEventSetupImpl(eventSetupImpl_.get());
710 bool EventSetupProvider::doWeNeedToWaitForIOVsToFinish(
IOVSyncValue const& iValue)
const {
711 for (
auto& recProvider : recordProviders_) {
712 if (recProvider->doWeNeedToWaitForIOVsToFinish(iValue)) {
719 std::set<ComponentDescription> EventSetupProvider::proxyProviderDescriptions()
const {
720 typedef std::set<ComponentDescription> Set;
723 for (
auto const& recProvider : recordProviders_) {
724 auto const&
d = recProvider->proxyProviderDescriptions();
725 descriptions.insert(
d.begin(),
d.end());
727 if (dataProviders_.get()) {
728 for (
auto const&
p : *dataProviders_) {
729 descriptions.insert(
p->description());
737 insert(iKey, std::unique_ptr<EventSetupRecordProvider>());
738 eventSetupImpl_->setKeyIters(recordKeys_.begin(), recordKeys_.end());
742 preferredProviderInfo_ = std::make_unique<PreferredProviderInfo>(iInfo);
745 void EventSetupProvider::fillKeys(std::set<EventSetupRecordKey>&
keys)
const {
746 for (
auto const& recProvider : recordProviders_) {
747 keys.insert(recProvider->key());
754 unsigned int index = 0;
755 for (
auto provider : recordProviders_) {
757 index, provider->key(), provider->registeredDataKeys(), provider->componentsForRegisteredDataKeys());
766 void EventSetupProvider::logInfoWhenSharing(
ParameterSet const& iConfiguration) {
771 <<
"Sharing " << edmtype <<
": class=" << modtype <<
" label='" << label <<
"'";
ActivityRegistry const * activityRegistry_
static void findDependents(const EventSetupRecordKey &iKey, Itr itBegin, Itr itEnd, std::vector< std::shared_ptr< EventSetupRecordProvider >> &oDependents)
void lookForMatches(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex, bool &firstProcessWithThisPSet, bool &precedingHasMatchingPSet) const
T getParameter(std::string const &) const
bool isFirstMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
std::set< EventSetupRecordKey > dependentRecords() const
Returns the list of Records the provided Record depends on (usually none)
bool isMatchingESProducer(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
unsigned int dataKeysInRecord(unsigned int iRecordIndex, EventSetupRecordKey const &iRecord, std::vector< DataKey > const &iDataKeys, std::vector< ComponentDescription const * > const &iComponents)
void resetProxies()
This will clear the cache's of all the Proxies so that next time they are called they will run...
std::set< ComponentDescription > proxyProviderDescriptions() const
return information on which DataProxyProviders are supplying information
ret
prodAgent to be discontinued
std::unique_ptr< std::map< ParameterSetIDHolder, std::set< EventSetupRecordKey > > > psetIDToRecordKey_
static HCTypeTag findType(char const *iTypeName)
find a type based on the types name, if not found will return default HCTypeTag
bool isLastMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
std::unique_ptr< std::map< EventSetupRecordKey, std::map< DataKey, ComponentDescription const * > > > referencedDataKeys_
void addFinder(std::shared_ptr< EventSetupRecordIntervalFinder >)
For now, only use one finder.
ParameterSet const * getESProducerPSet(ParameterSetID const &psetID, unsigned subProcessIndex) const
void fillReferencedDataKeys(std::map< DataKey, ComponentDescription const * > &referencedDataKeys) const
std::map< ComponentDescription, RecordToDataMap > PreferredProviderInfo
RecordProviders::iterator Itr
std::shared_ptr< EventSetupRecordProvider > & recordProvider(const EventSetupRecordKey &iKey)
void fillReferencedDataKeys(EventSetupRecordKey const &eventSetupRecordKey)
void add(std::shared_ptr< DataProxyProvider >)
std::unique_ptr< std::set< EventSetupRecordKey > > recordsWithALooperProxy_
std::vector< std::shared_ptr< EventSetupRecordProvider >> RecordProviders
static void preferEverything(const ComponentDescription &iComponent, const RecordProviders &iRecordProviders, RecordToPreferred &iReturnValue)
find everything made by a DataProxyProvider and add it to the 'preferred' list
def unique(seq, keepstr=True)
std::shared_ptr< DataProxyProvider > proxyProvider(ComponentDescription const &)
returns the first matching DataProxyProvider or a 'null' if not found
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
bool contains(DataKey const &dataKey) const
unsigned int numberOfConcurrentIOVs(EventSetupRecordKey const &, bool printInfoMsg=false) const
std::unique_ptr< std::map< EventSetupRecordKey, std::vector< std::shared_ptr< EventSetupRecordIntervalFinder > > > > recordToFinders_
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
EventSetupProvider(ActivityRegistry const *, unsigned subProcessIndex=0U, PreferredProviderInfo const *iInfo=nullptr)
std::map< DataKey, ComponentDescription > DataToPreferredProviderMap
unsigned subProcessIndex() const
heterocontainer::HCTypeTag TypeTag
std::map< EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap > RecordToPreferred
const TypeTag & type() const
bool isMatchingESSource(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
unsigned subProcessIndex_
std::string match(BranchDescription const &a, BranchDescription const &b, std::string const &fileName)
bool unInitialized() const