34 namespace eventsetup {
39 using Map = std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> >;
41 explicit KnownRecordsSupplierImpl( Map
const& iMap) :
map_(iMap) {}
44 return map_.find(iKey) !=
map_.end();
64 unsigned subProcessIndex,
65 const PreferredProviderInfo* iInfo) :
66 eventSetup_(activityRegistry),
68 knownRecordsSupplier_(
std::make_unique<KnownRecordsSupplierImpl>(providers_)),
69 mustFinishConfiguration_(
true),
70 subProcessIndex_(subProcessIndex),
71 preferredProviderInfo_((
nullptr!=iInfo) ? (new PreferredProviderInfo(*iInfo)):
nullptr),
80 eventSetup_.setKnownRecordsSupplier(knownRecordsSupplier_.get());
88 EventSetupProvider::~EventSetupProvider()
111 std::shared_ptr<EventSetupRecordProvider>
temp(iProvider.release());
112 providers_[iKey] =
temp;
119 assert(iProvider.get() !=
nullptr);
120 dataProviders_->push_back(iProvider);
124 EventSetupProvider::replaceExisting(std::shared_ptr<DataProxyProvider> dataProxyProvider)
127 std::set<EventSetupRecordKey>
const& keysForPSetID = (*psetIDToRecordKey_)[psetID];
128 for (
auto const&
key : keysForPSetID) {
129 std::shared_ptr<EventSetupRecordProvider>
const& recordProvider = providers_[
key];
130 recordProvider->resetProxyProvider(psetID, dataProxyProvider);
137 assert(iFinder.get() !=
nullptr);
138 finders_->push_back(iFinder);
141 typedef std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> >
Providers;
142 typedef std::map<EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap>
RecordToPreferred;
147 const Providers& iProviders,
148 RecordToPreferred& iReturnValue)
151 bool foundProxyProvider =
false;
152 for(Providers::const_iterator itProvider = iProviders.begin(), itProviderEnd = iProviders.end();
153 itProvider!= itProviderEnd;
155 std::set<ComponentDescription>
components = itProvider->second->proxyProviderDescriptions();
156 if(components.find(iComponent)!= components.end()) {
157 std::shared_ptr<DataProxyProvider> proxyProv =
158 itProvider->second->proxyProvider(*(components.find(iComponent)));
159 assert(proxyProv.get());
161 std::set<EventSetupRecordKey> records = proxyProv->usingRecords();
162 for(std::set<EventSetupRecordKey>::iterator itRecord = records.begin(),
163 itRecordEnd = records.end();
164 itRecord != itRecordEnd;
167 if(!keyedProxies.empty()){
170 iReturnValue[*itRecord];
172 for(DataProxyProvider::KeyedProxies::const_iterator itProxy = keyedProxies.begin(),
173 itProxyEnd = keyedProxies.end();
174 itProxy != itProxyEnd;
176 EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
177 dataToProviderMap.find(itProxy->first);
178 if(itFind != dataToProviderMap.end()){
179 throw cms::Exception(
"ESPreferConflict") <<
"Two providers have been set to be preferred for\n" 180 <<itProxy->first.type().name()<<
" \""<<itProxy->first.name().value()<<
"\"" 181 <<
"\n the providers are " 182 <<
"\n 1) type="<<itFind->second.type_<<
" label=\""<<itFind->second.label_<<
"\"" 183 <<
"\n 2) type="<<iComponent.
type_<<
" label=\""<<iComponent.
label_<<
"\"" 184 <<
"\nPlease modify configuration so only one is preferred";
186 dataToProviderMap.insert(std::make_pair(itProxy->first,iComponent));
190 foundProxyProvider=
true;
194 if(!foundProxyProvider) {
196 <<
"\" label=\""<<iComponent.
label_<<
"\" a preferred Provider."<<
197 "\n Please check spelling of name, or that it was loaded into the job.";
202 const Providers& iProviders)
205 RecordToPreferred returnValue;
206 if(
nullptr != iInfo){
207 for(EventSetupProvider::PreferredProviderInfo::const_iterator itInfo = iInfo->begin(),
208 itInfoEnd = iInfo->end();
211 if(itInfo->second.empty()) {
215 for(EventSetupProvider::RecordToDataMap::const_iterator itRecData = itInfo->second.begin(),
216 itRecDataEnd = itInfo->second.end();
217 itRecData != itRecDataEnd;
222 throw cms::Exception(
"ESPreferUnknownRecord") <<
"Unknown record \""<<recordName
223 <<
"\" used in es_prefer statement for type=" 224 <<itInfo->first.type_<<
" label=\""<<itInfo->first.label_
225 <<
"\"\n Please check spelling.";
229 Providers::const_iterator itRecordProvider = iProviders.find(recordKey);
230 assert(itRecordProvider != iProviders.end());
232 std::set<ComponentDescription>
components = itRecordProvider->second->proxyProviderDescriptions();
233 std::set<ComponentDescription>::iterator itProxyProv = components.find(itInfo->first);
234 if(itProxyProv == components.end()){
235 throw cms::Exception(
"ESPreferWrongRecord")<<
"The type="<<itInfo->first.type_<<
" label=\""<<
236 itInfo->first.label_<<
"\" does not provide data for the Record "<<
recordName;
242 throw cms::Exception(
"ESPreferWrongDataType")<<
"The es_prefer statement for type="<<itInfo->first.type_<<
" label=\""<<
243 itInfo->first.label_<<
"\" has the unknown data type \""<<itRecData->second.first<<
"\"" 244 <<
"\n Please check spelling";
249 std::shared_ptr<DataProxyProvider> proxyProv =
250 itRecordProvider->second->proxyProvider(*itProxyProv);
252 if(std::find_if(keyedProxies.begin(), keyedProxies.end(),
253 [&datumKey](
auto const&
kp) {
return kp.first == datumKey;}) ==
255 throw cms::Exception(
"ESPreferWrongData")<<
"The es_prefer statement for type="<<itInfo->first.type_<<
" label=\""<<
256 itInfo->first.label_<<
"\" specifies the data item \n" 257 <<
" type=\""<<itRecData->second.first<<
"\" label=\""<<itRecData->second.second<<
"\"" 258 <<
" which is not provided. Please check spelling.";
262 =returnValue[recordKey];
264 if(dataToProviderMap.end() != dataToProviderMap.find(datumKey)) {
265 EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
266 dataToProviderMap.find(datumKey);
267 throw cms::Exception(
"ESPreferConflict") <<
"Two providers have been set to be preferred for\n" 268 <<datumKey.type().name()<<
" \""<<datumKey.name().value()<<
"\"" 269 <<
"\n the providers are " 270 <<
"\n 1) type="<<itFind->second.type_<<
" label=\""<<itFind->second.label_<<
"\"" 271 <<
"\n 2) type="<<itProxyProv->type_<<
" label=\""<<itProxyProv->label_<<
"\"" 272 <<
"\nPlease modify configuration so only one is preferred";
274 dataToProviderMap.insert(std::make_pair(datumKey,*itProxyProv));
283 EventSetupProvider::finishConfiguration()
286 recordToFinders_->clear();
287 for(std::vector<std::shared_ptr<EventSetupRecordIntervalFinder> >::iterator itFinder=finders_->begin(),
288 itEnd = finders_->end();
291 typedef std::set<EventSetupRecordKey>
Keys;
292 const Keys recordsUsing = (*itFinder)->findingForRecords();
294 for(Keys::const_iterator itKey = recordsUsing.begin(), itKeyEnd = recordsUsing.end();
297 (*recordToFinders_)[*itKey].push_back(*itFinder);
298 Providers::iterator itFound = providers_.find(*itKey);
299 if(providers_.end() == itFound) {
302 std::make_unique<EventSetupRecordProvider>(*itKey) );
303 itFound = providers_.find(*itKey);
305 itFound->second->addFinder(*itFinder);
313 psetIDToRecordKey_->clear();
314 typedef std::set<EventSetupRecordKey>
Keys;
315 for(std::vector<std::shared_ptr<DataProxyProvider> >::iterator itProvider=dataProviders_->begin(),
316 itEnd = dataProviders_->end();
322 const Keys recordsUsing = (*itProvider)->usingRecords();
324 for(Keys::const_iterator itKey = recordsUsing.begin(), itKeyEnd = recordsUsing.end();
328 if ((*itProvider)->description().isLooper_) {
329 recordsWithALooperProxy_->insert(*itKey);
332 (*psetIDToRecordKey_)[psetID].insert(*itKey);
334 Providers::iterator itFound = providers_.find(*itKey);
335 if(providers_.end() == itFound) {
337 insert(*itKey, std::make_unique<EventSetupRecordProvider>(*itKey));
338 itFound = providers_.find(*itKey);
340 itFound->second->add(*itProvider);
343 dataProviders_.reset();
352 for(Providers::iterator itProvider = providers_.begin(), itProviderEnd = providers_.end();
353 itProvider != itProviderEnd;
356 RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(itProvider->first);
357 if(itRecordFound != recordToPreferred_->end()) {
358 preferredInfo = &(itRecordFound->second);
361 itProvider->second->usePreferred(*preferredInfo);
363 std::set<EventSetupRecordKey> records = itProvider->second->dependentRecords();
364 if(!records.empty()) {
366 std::vector<std::shared_ptr<EventSetupRecordProvider> > depProviders;
367 depProviders.reserve(records.size());
368 bool foundAllProviders =
true;
369 for(std::set<EventSetupRecordKey>::iterator itRecord = records.begin(),
370 itRecordEnd = records.end();
371 itRecord != itRecordEnd;
373 Providers::iterator itFound = providers_.find(*itRecord);
374 if(itFound == providers_.end()) {
375 foundAllProviders =
false;
376 if(missingRecords.empty()) {
377 missingRecords = itRecord->name();
379 missingRecords +=
", ";
380 missingRecords += itRecord->name();
384 depProviders.push_back(itFound->second);
388 if(!foundAllProviders) {
389 edm::LogInfo(
"EventSetupDependency")<<
"The EventSetup record "<<itProvider->second->key().name()
390 <<
" depends on at least one Record \n ("<<missingRecords<<
") which is not present in the job." 391 "\n This may lead to an exception begin thrown during event processing.\n If no exception occurs during the job than it is usually safe to ignore this message.";
397 itProvider->second->setDependentProviders(depProviders);
400 mustFinishConfiguration_ =
false;
403 typedef std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> >
Providers;
404 typedef Providers::iterator
Itr;
410 std::vector<std::shared_ptr<EventSetupRecordProvider> >& oDependents)
413 for(Itr it = itBegin; it != itEnd; ++it) {
415 const std::set<EventSetupRecordKey>&
deps = it->second->dependentRecords();
416 if(deps.end() != deps.find(iKey)) {
417 oDependents.push_back(it->second);
427 Providers::iterator itFind = providers_.find(iKey);
428 if(itFind == providers_.end()) {
433 std::vector<std::shared_ptr<EventSetupRecordProvider> > dependents;
434 findDependents(iKey, providers_.begin(), providers_.end(), dependents);
436 dependents.erase(
std::unique(dependents.begin(),dependents.end()), dependents.end());
438 itFind->second->resetProxies();
439 for(
auto&
d: dependents) {
445 EventSetupProvider::forceCacheClear()
447 for(Providers::iterator it=providers_.begin(), itEnd = providers_.end();
450 it->second->resetProxies();
456 std::set<ParameterSetIDHolder>& sharingCheckDone,
460 edm::LogVerbatim(
"EventSetupSharing") <<
"EventSetupProvider::checkESProducerSharing: Checking processes with SubProcess Indexes " 461 << subProcessIndex() <<
" and " << precedingESProvider.
subProcessIndex();
463 if (referencedESProducers.empty()) {
464 for (
auto const& recordProvider : providers_) {
465 recordProvider.second->getReferencedESProducers(referencedESProducers);
472 std::map<EventSetupRecordKey, bool> allComponentsMatch;
474 std::map<ParameterSetID, bool> candidateNotRejectedYet;
478 for (
auto const& iRecord : referencedESProducers) {
479 for (
auto const& iComponent : iRecord.second) {
483 if (sharingCheckDone.find(psetIDHolder) != sharingCheckDone.end())
continue;
485 bool firstProcessWithThisPSet =
false;
486 bool precedingHasMatchingPSet =
false;
491 firstProcessWithThisPSet,
492 precedingHasMatchingPSet);
494 if (firstProcessWithThisPSet) {
495 sharingCheckDone.insert(psetIDHolder);
496 allComponentsMatch[iRecord.first] =
false;
500 if (!precedingHasMatchingPSet) {
501 allComponentsMatch[iRecord.first] =
false;
518 auto iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
519 if (iCandidateNotRejectedYet == candidateNotRejectedYet.end()) {
520 candidateNotRejectedYet[psetID] =
true;
521 iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
543 if (iCandidateNotRejectedYet->second ==
true) {
545 auto iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
546 if (iAllComponentsMatch == allComponentsMatch.end()) {
551 bool match = doRecordsMatch(precedingESProvider,
555 allComponentsMatch[iRecord.first] =
match;
556 iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
558 if (!iAllComponentsMatch->second) {
559 iCandidateNotRejectedYet->second =
false;
566 for (
auto const& candidate : candidateNotRejectedYet) {
568 bool canBeShared = candidate.second;
571 logInfoWhenSharing(pset);
573 sharingCheckDone.insert(psetIDHolder);
583 std::shared_ptr<DataProxyProvider> dataProxyProvider;
584 std::set<EventSetupRecordKey>
const& keysForPSetID1 = (*precedingESProvider.
psetIDToRecordKey_)[psetIDHolder];
585 for (
auto const&
key : keysForPSetID1) {
586 std::shared_ptr<EventSetupRecordProvider>
const& recordProvider = precedingESProvider.
providers_[
key];
587 dataProxyProvider = recordProvider->proxyProvider(psetIDHolder);
588 assert(dataProxyProvider);
592 std::set<EventSetupRecordKey>
const& keysForPSetID2 = (*psetIDToRecordKey_)[psetIDHolder];
593 for (
auto const&
key : keysForPSetID2) {
594 std::shared_ptr<EventSetupRecordProvider>
const& recordProvider = providers_[
key];
595 recordProvider->resetProxyProvider(psetIDHolder, dataProxyProvider);
617 std::map<EventSetupRecordKey, bool> & allComponentsMatch,
631 if ((*recordToFinders_)[eventSetupRecordKey].size() != (*precedingESProvider.
recordToFinders_)[eventSetupRecordKey].
size()) {
635 for (
auto const&
finder : (*recordToFinders_)[eventSetupRecordKey]) {
645 fillReferencedDataKeys(eventSetupRecordKey);
648 std::map<DataKey, ComponentDescription const*>
const& dataItems = (*referencedDataKeys_)[eventSetupRecordKey];
650 std::map<DataKey, ComponentDescription const*>
const& precedingDataItems = (*precedingESProvider.
referencedDataKeys_)[eventSetupRecordKey];
652 if (dataItems.size() != precedingDataItems.size()) {
656 for (
auto const& dataItem : dataItems) {
657 auto precedingDataItem = precedingDataItems.find(dataItem.first);
658 if (precedingDataItem == precedingDataItems.end()) {
661 if (dataItem.second->pid_ != precedingDataItem->second->pid_) {
667 if (!dataItem.second->isSource_ && !dataItem.second->isLooper_) {
676 Providers::iterator itFound = providers_.find(eventSetupRecordKey);
677 if (itFound != providers_.end()) {
678 std::set<EventSetupRecordKey> dependentRecords = itFound->second->dependentRecords();
679 for (
auto const& dependentRecord : dependentRecords) {
680 auto iter = allComponentsMatch.find(dependentRecord);
681 if (iter != allComponentsMatch.end()) {
688 bool match = doRecordsMatch(precedingESProvider,
692 allComponentsMatch[dependentRecord] =
match;
693 if (!match)
return false;
702 if (referencedDataKeys_->find(eventSetupRecordKey) != referencedDataKeys_->end())
return;
704 auto recordProvider = providers_.find(eventSetupRecordKey);
705 if (recordProvider == providers_.end()) {
706 (*referencedDataKeys_)[eventSetupRecordKey];
709 if (recordProvider->second) {
710 recordProvider->second->fillReferencedDataKeys((*referencedDataKeys_)[eventSetupRecordKey]);
715 EventSetupProvider::resetRecordToProxyPointers() {
716 for (
auto const& recordProvider : providers_) {
719 RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(recordProvider.first);
720 if(itRecordFound != recordToPreferred_->end()) {
721 preferredInfo = &(itRecordFound->second);
723 recordProvider.second->resetRecordToProxyPointers(*preferredInfo);
728 EventSetupProvider::clearInitializationData() {
729 preferredProviderInfo_.reset();
730 referencedDataKeys_.reset();
731 recordToFinders_.reset();
732 psetIDToRecordKey_.reset();
733 recordToPreferred_.reset();
734 recordsWithALooperProxy_.reset();
740 eventSetup_.add(iRecord);
745 auto key =iRecordProvider->key();
760 if(mustFinishConfiguration_) {
761 finishConfiguration();
764 for(Providers::iterator itProvider = providers_.begin(), itProviderEnd = providers_.end();
765 itProvider != itProviderEnd;
767 itProvider->second->addRecordToIfValid(*
this, iValue);
772 std::set<ComponentDescription>
773 EventSetupProvider::proxyProviderDescriptions()
const 775 typedef std::set<ComponentDescription> Set;
778 for(
auto const&
p: providers_) {
779 auto const&
d =
p.second->proxyProviderDescriptions();
780 descriptions.insert(
d.begin(),
d.end());
782 if(dataProviders_.get()) {
783 for(
auto const&
p: *dataProviders_) {
784 descriptions.insert(
p->description());
792 EventSetupProvider::isWithinValidityInterval(
IOVSyncValue const& iSync)
const {
793 for(
auto const& provider: providers_) {
794 auto const& iov =provider.second->validityInterval();
795 if( (iov != ValidityInterval::invalidInterval()) and
796 (not provider.second->validityInterval().validFor(iSync)) ) {
805 void EventSetupProvider::logInfoWhenSharing(
ParameterSet const& iConfiguration) {
810 edm::LogVerbatim(
"EventSetupSharing") <<
"Sharing " << edmtype <<
": class=" << modtype <<
" label='" << label <<
"'";
std::map< DataKey, ComponentDescription > DataToPreferredProviderMap
void lookForMatches(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex, bool &firstProcessWithThisPSet, bool &precedingHasMatchingPSet) const
T getParameter(std::string const &) const
void setEventSetup(EventSetup const *iEventSetup)
std::pair< const char *, const std::type_info * > findType(const char *iClassName)
bool isFirstMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
bool isMatchingESProducer(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
EventSetupProvider(ActivityRegistry *, unsigned subProcessIndex=0U, PreferredProviderInfo const *iInfo=0)
std::unique_ptr< std::map< ParameterSetIDHolder, std::set< EventSetupRecordKey > > > psetIDToRecordKey_
bool isLastMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
std::unique_ptr< std::map< EventSetupRecordKey, std::map< DataKey, ComponentDescription const * > > > referencedDataKeys_
void fillReferencedDataKeys(EventSetupRecordKey const &eventSetupRecordKey)
std::map< EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap > RecordToPreferred
std::vector< std::pair< DataKey, edm::propagate_const< std::shared_ptr< DataProxy > > > > KeyedProxies
ParameterSet const * getESProducerPSet(ParameterSetID const &psetID, unsigned subProcessIndex) const
std::map< ComponentDescription, RecordToDataMap > PreferredProviderInfo
static void findDependents(const EventSetupRecordKey &iKey, Itr itBegin, Itr itEnd, std::vector< std::shared_ptr< EventSetupRecordProvider > > &oDependents)
heterocontainer::HCTypeTag TypeTag
std::unique_ptr< std::set< EventSetupRecordKey > > recordsWithALooperProxy_
def unique(seq, keepstr=True)
std::map< EventSetupRecordKey, std::shared_ptr< EventSetupRecordProvider > > Providers
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
static RecordToPreferred determinePreferred(const EventSetupProvider::PreferredProviderInfo *iInfo, const Providers &iProviders)
std::unique_ptr< std::map< EventSetupRecordKey, std::vector< std::shared_ptr< EventSetupRecordIntervalFinder > > > > recordToFinders_
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
static void preferEverything(const ComponentDescription &iComponent, const Providers &iProviders, RecordToPreferred &iReturnValue)
find everything made by a DataProxyProvider and add it to the 'preferred' list
std::vector< size_type > Keys
unsigned subProcessIndex() const
const TypeTag & type() const
bool isMatchingESSource(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
unsigned subProcessIndex_
T get(const Candidate &c)