CMS 3D CMS Logo

EventSetupProvider.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Framework
4 // Module: EventSetupProvider
5 //
6 // Description: <one line class summary>
7 //
8 // Implementation:
9 // <Notes on implementation>
10 //
11 // Author: Chris Jones
12 // Created: Thu Mar 24 16:27:14 EST 2005
13 //
14 
15 // system include files
16 #include <algorithm>
17 #include <cassert>
18 
19 // user include files
31 
32 
33 namespace edm {
34  namespace eventsetup {
35 
36  namespace {
37  class KnownRecordsSupplierImpl : public EventSetupKnownRecordsSupplier {
38  public:
39  using Map = std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> >;
40 
41  explicit KnownRecordsSupplierImpl( Map const& iMap) : map_(iMap) {}
42 
43  bool isKnown(EventSetupRecordKey const& iKey) const override {
44  return map_.find(iKey) != map_.end();
45  }
46 
47  private:
48  Map map_;
49  };
50  }
51 
52 //
53 // constants, enums and typedefs
54 //
55 
56 //
57 // static data member definitions
58 //
59 
60 //
61 // constructors and destructor
62 //
64  unsigned subProcessIndex,
65  const PreferredProviderInfo* iInfo) :
66 eventSetup_(activityRegistry),
67 providers_(),
68 knownRecordsSupplier_( std::make_unique<KnownRecordsSupplierImpl>(providers_)),
69 mustFinishConfiguration_(true),
70 subProcessIndex_(subProcessIndex),
71 preferredProviderInfo_((nullptr!=iInfo) ? (new PreferredProviderInfo(*iInfo)): nullptr),
72 finders_(new std::vector<std::shared_ptr<EventSetupRecordIntervalFinder> >() ),
73 dataProviders_(new std::vector<std::shared_ptr<DataProxyProvider> >() ),
74 referencedDataKeys_(new std::map<EventSetupRecordKey, std::map<DataKey, ComponentDescription const*> >),
75 recordToFinders_(new std::map<EventSetupRecordKey, std::vector<std::shared_ptr<EventSetupRecordIntervalFinder> > >),
76 psetIDToRecordKey_(new std::map<ParameterSetIDHolder, std::set<EventSetupRecordKey> >),
77 recordToPreferred_(new std::map<EventSetupRecordKey, std::map<DataKey, ComponentDescription> >),
78 recordsWithALooperProxy_(new std::set<EventSetupRecordKey>)
79 {
80  eventSetup_.setKnownRecordsSupplier(knownRecordsSupplier_.get());
81 }
82 
83 // EventSetupProvider::EventSetupProvider(const EventSetupProvider& rhs)
84 // {
85 // // do actual copying here;
86 // }
87 
88 EventSetupProvider::~EventSetupProvider()
89 {
90  forceCacheClear();
91 }
92 
93 //
94 // assignment operators
95 //
96 // const EventSetupProvider& EventSetupProvider::operator=(const EventSetupProvider& rhs)
97 // {
98 // //An exception safe implementation is
99 // EventSetupProvider temp(rhs);
100 // swap(rhs);
101 //
102 // return *this;
103 // }
104 
105 //
106 // member functions
107 //
108 void
109 EventSetupProvider::insert(const EventSetupRecordKey& iKey, std::unique_ptr<EventSetupRecordProvider> iProvider)
110 {
111  std::shared_ptr<EventSetupRecordProvider> temp(iProvider.release());
112  providers_[iKey] = temp;
113  //temp->addRecordTo(*this);
114 }
115 
116 void
117 EventSetupProvider::add(std::shared_ptr<DataProxyProvider> iProvider)
118 {
119  assert(iProvider.get() != nullptr);
120  dataProviders_->push_back(iProvider);
121 }
122 
123 void
124 EventSetupProvider::replaceExisting(std::shared_ptr<DataProxyProvider> dataProxyProvider)
125 {
126  ParameterSetIDHolder psetID(dataProxyProvider->description().pid_);
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);
131  }
132 }
133 
134 void
135 EventSetupProvider::add(std::shared_ptr<EventSetupRecordIntervalFinder> iFinder)
136 {
137  assert(iFinder.get() != nullptr);
138  finders_->push_back(iFinder);
139 }
140 
141 typedef std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> > Providers;
142 typedef std::map<EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap> RecordToPreferred;
144 static
145 void
147  const Providers& iProviders,
148  RecordToPreferred& iReturnValue)
149 {
150  //need to get our hands on the actual DataProxyProvider
151  bool foundProxyProvider = false;
152  for(Providers::const_iterator itProvider = iProviders.begin(), itProviderEnd = iProviders.end();
153  itProvider!= itProviderEnd;
154  ++itProvider) {
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());
160 
161  std::set<EventSetupRecordKey> records = proxyProv->usingRecords();
162  for(std::set<EventSetupRecordKey>::iterator itRecord = records.begin(),
163  itRecordEnd = records.end();
164  itRecord != itRecordEnd;
165  ++itRecord){
166  const DataProxyProvider::KeyedProxies& keyedProxies = proxyProv->keyedProxies(*itRecord);
167  if(!keyedProxies.empty()){
168  //add them to our output
170  iReturnValue[*itRecord];
171 
172  for(DataProxyProvider::KeyedProxies::const_iterator itProxy = keyedProxies.begin(),
173  itProxyEnd = keyedProxies.end();
174  itProxy != itProxyEnd;
175  ++itProxy) {
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";
185  }
186  dataToProviderMap.insert(std::make_pair(itProxy->first,iComponent));
187  }
188  }
189  }
190  foundProxyProvider=true;
191  break;
192  }
193  }
194  if(!foundProxyProvider) {
195  throw cms::Exception("ESPreferNoProvider")<<"Could not make type=\""<<iComponent.type_
196  <<"\" label=\""<<iComponent.label_<<"\" a preferred Provider."<<
197  "\n Please check spelling of name, or that it was loaded into the job.";
198  }
199 }
200 static
202  const Providers& iProviders)
203 {
204  using namespace edm::eventsetup;
205  RecordToPreferred returnValue;
206  if(nullptr != iInfo){
207  for(EventSetupProvider::PreferredProviderInfo::const_iterator itInfo = iInfo->begin(),
208  itInfoEnd = iInfo->end();
209  itInfo != itInfoEnd;
210  ++itInfo) {
211  if(itInfo->second.empty()) {
212  //want everything
213  preferEverything(itInfo->first, iProviders, returnValue);
214  } else {
215  for(EventSetupProvider::RecordToDataMap::const_iterator itRecData = itInfo->second.begin(),
216  itRecDataEnd = itInfo->second.end();
217  itRecData != itRecDataEnd;
218  ++itRecData) {
219  std::string recordName= itRecData->first;
221  if(recordKey.type() == eventsetup::EventSetupRecordKey::TypeTag()) {
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.";
226  //record not found
227  }
228  //See if the ProxyProvider provides something for this Record
229  Providers::const_iterator itRecordProvider = iProviders.find(recordKey);
230  assert(itRecordProvider != iProviders.end());
231 
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;
237  }
238  //Does it data type exist?
239  eventsetup::TypeTag datumType = eventsetup::TypeTag::findType(itRecData->second.first);
240  if(datumType == eventsetup::TypeTag()) {
241  //not found
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";
245  }
246  eventsetup::DataKey datumKey(datumType, itRecData->second.second.c_str());
247 
248  //Does the proxyprovider make this?
249  std::shared_ptr<DataProxyProvider> proxyProv =
250  itRecordProvider->second->proxyProvider(*itProxyProv);
251  const DataProxyProvider::KeyedProxies& keyedProxies = proxyProv->keyedProxies(recordKey);
252  if(std::find_if(keyedProxies.begin(), keyedProxies.end(),
253  [&datumKey](auto const& kp) { return kp.first == datumKey;}) ==
254  keyedProxies.end()){
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.";
259  }
260 
262  =returnValue[recordKey];
263  //has another provider already been specified?
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";
273  }
274  dataToProviderMap.insert(std::make_pair(datumKey,*itProxyProv));
275  }
276  }
277  }
278  }
279  return returnValue;
280 }
281 
282 void
283 EventSetupProvider::finishConfiguration()
284 {
285  //we delayed adding finders to the system till here so that everything would be loaded first
286  recordToFinders_->clear();
287  for(std::vector<std::shared_ptr<EventSetupRecordIntervalFinder> >::iterator itFinder=finders_->begin(),
288  itEnd = finders_->end();
289  itFinder != itEnd;
290  ++itFinder) {
291  typedef std::set<EventSetupRecordKey> Keys;
292  const Keys recordsUsing = (*itFinder)->findingForRecords();
293 
294  for(Keys::const_iterator itKey = recordsUsing.begin(), itKeyEnd = recordsUsing.end();
295  itKey != itKeyEnd;
296  ++itKey) {
297  (*recordToFinders_)[*itKey].push_back(*itFinder);
298  Providers::iterator itFound = providers_.find(*itKey);
299  if(providers_.end() == itFound) {
300  //create a provider for this record
301  insert(*itKey,
302  std::make_unique<EventSetupRecordProvider>(*itKey) );
303  itFound = providers_.find(*itKey);
304  }
305  itFound->second->addFinder(*itFinder);
306  }
307  }
308  //we've transfered our ownership so this is no longer needed
309  finders_.reset();
310 
311  //Now handle providers since sources can also be finders and the sources can delay registering
312  // their Records and therefore could delay setting up their Proxies
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();
317  itProvider != itEnd;
318  ++itProvider) {
319 
320  ParameterSetIDHolder psetID((*itProvider)->description().pid_);
321 
322  const Keys recordsUsing = (*itProvider)->usingRecords();
323 
324  for(Keys::const_iterator itKey = recordsUsing.begin(), itKeyEnd = recordsUsing.end();
325  itKey != itKeyEnd;
326  ++itKey) {
327 
328  if ((*itProvider)->description().isLooper_) {
329  recordsWithALooperProxy_->insert(*itKey);
330  }
331 
332  (*psetIDToRecordKey_)[psetID].insert(*itKey);
333 
334  Providers::iterator itFound = providers_.find(*itKey);
335  if(providers_.end() == itFound) {
336  //create a provider for this record
337  insert(*itKey, std::make_unique<EventSetupRecordProvider>(*itKey));
338  itFound = providers_.find(*itKey);
339  }
340  itFound->second->add(*itProvider);
341  }
342  }
343  dataProviders_.reset();
344 
345  //used for the case where no preferred Providers have been specified for the Record
347 
348  *recordToPreferred_ = determinePreferred(preferredProviderInfo_.get(),providers_);
349  //For each Provider, find all the Providers it depends on. If a dependent Provider
350  // can not be found pass in an empty list
351  //CHANGE: now allow for missing Providers
352  for(Providers::iterator itProvider = providers_.begin(), itProviderEnd = providers_.end();
353  itProvider != itProviderEnd;
354  ++itProvider) {
355  const EventSetupRecordProvider::DataToPreferredProviderMap* preferredInfo = &kEmptyMap;
356  RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(itProvider->first);
357  if(itRecordFound != recordToPreferred_->end()) {
358  preferredInfo = &(itRecordFound->second);
359  }
360  //Give it our list of preferred
361  itProvider->second->usePreferred(*preferredInfo);
362 
363  std::set<EventSetupRecordKey> records = itProvider->second->dependentRecords();
364  if(!records.empty()) {
365  std::string missingRecords;
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;
372  ++itRecord) {
373  Providers::iterator itFound = providers_.find(*itRecord);
374  if(itFound == providers_.end()) {
375  foundAllProviders = false;
376  if(missingRecords.empty()) {
377  missingRecords = itRecord->name();
378  } else {
379  missingRecords += ", ";
380  missingRecords += itRecord->name();
381  }
382  //break;
383  } else {
384  depProviders.push_back(itFound->second);
385  }
386  }
387 
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.";
392 
393  //depProviders.clear();
394  //NOTE: should provide a warning
395  }
396 
397  itProvider->second->setDependentProviders(depProviders);
398  }
399  }
400  mustFinishConfiguration_ = false;
401 }
402 
403 typedef std::map<EventSetupRecordKey, std::shared_ptr<EventSetupRecordProvider> > Providers;
404 typedef Providers::iterator Itr;
405 static
406 void
408  Itr itBegin,
409  Itr itEnd,
410  std::vector<std::shared_ptr<EventSetupRecordProvider> >& oDependents)
411 {
412 
413  for(Itr it = itBegin; it != itEnd; ++it) {
414  //does it depend on the record in question?
415  const std::set<EventSetupRecordKey>& deps = it->second->dependentRecords();
416  if(deps.end() != deps.find(iKey)) {
417  oDependents.push_back(it->second);
418  //now see who is dependent on this record since they will be indirectly dependent on iKey
419  findDependents(it->first, itBegin, itEnd, oDependents);
420  }
421  }
422 }
423 
424 void
425 EventSetupProvider::resetRecordPlusDependentRecords(const EventSetupRecordKey& iKey)
426 {
427  Providers::iterator itFind = providers_.find(iKey);
428  if(itFind == providers_.end()) {
429  return;
430  }
431 
432 
433  std::vector<std::shared_ptr<EventSetupRecordProvider> > dependents;
434  findDependents(iKey, providers_.begin(), providers_.end(), dependents);
435 
436  dependents.erase(std::unique(dependents.begin(),dependents.end()), dependents.end());
437 
438  itFind->second->resetProxies();
439  for(auto& d: dependents) {
440  d->resetProxies();
441  }
442 }
443 
444 void
445 EventSetupProvider::forceCacheClear()
446 {
447  for(Providers::iterator it=providers_.begin(), itEnd = providers_.end();
448  it != itEnd;
449  ++it) {
450  it->second->resetProxies();
451  }
452 }
453 
454 void
455 EventSetupProvider::checkESProducerSharing(EventSetupProvider& precedingESProvider,
456  std::set<ParameterSetIDHolder>& sharingCheckDone,
457  std::map<EventSetupRecordKey, std::vector<ComponentDescription const*> >& referencedESProducers,
458  EventSetupsController& esController) {
459 
460  edm::LogVerbatim("EventSetupSharing") << "EventSetupProvider::checkESProducerSharing: Checking processes with SubProcess Indexes "
461  << subProcessIndex() << " and " << precedingESProvider.subProcessIndex();
462 
463  if (referencedESProducers.empty()) {
464  for (auto const& recordProvider : providers_) {
465  recordProvider.second->getReferencedESProducers(referencedESProducers);
466  }
467  }
468 
469  // This records whether the configurations of all the DataProxyProviders
470  // and finders matches for a particular pair of processes and
471  // a particular record and also the records it depends on.
472  std::map<EventSetupRecordKey, bool> allComponentsMatch;
473 
474  std::map<ParameterSetID, bool> candidateNotRejectedYet;
475 
476  // Loop over all the ESProducers which have a DataProxy
477  // referenced by any EventSetupRecord in this EventSetupProvider
478  for (auto const& iRecord : referencedESProducers) {
479  for (auto const& iComponent : iRecord.second) {
480 
481  ParameterSetID const& psetID = iComponent->pid_;
482  ParameterSetIDHolder psetIDHolder(psetID);
483  if (sharingCheckDone.find(psetIDHolder) != sharingCheckDone.end()) continue;
484 
485  bool firstProcessWithThisPSet = false;
486  bool precedingHasMatchingPSet = false;
487 
488  esController.lookForMatches(psetID,
489  subProcessIndex_,
490  precedingESProvider.subProcessIndex_,
491  firstProcessWithThisPSet,
492  precedingHasMatchingPSet);
493 
494  if (firstProcessWithThisPSet) {
495  sharingCheckDone.insert(psetIDHolder);
496  allComponentsMatch[iRecord.first] = false;
497  continue;
498  }
499 
500  if (!precedingHasMatchingPSet) {
501  allComponentsMatch[iRecord.first] = false;
502  continue;
503  }
504 
505  // An ESProducer that survives to this point is a candidate.
506  // It was shared with some other process in the first pass where
507  // ESProducers were constructed and one of three possibilities exists:
508  // 1) It should not have been shared and a new ESProducer needs
509  // to be created and the proper pointers set.
510  // 2) It should have been shared with a different preceding process
511  // in which case some pointers need to be modified.
512  // 3) It was originally shared which the correct prior process
513  // in which case nothing needs to be done, but we do need to
514  // do some work to verify that.
515  // Make an entry in a map for each of these ESProducers. We
516  // will set the value to false if and when we determine
517  // the ESProducer cannot be shared between this pair of processes.
518  auto iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
519  if (iCandidateNotRejectedYet == candidateNotRejectedYet.end()) {
520  candidateNotRejectedYet[psetID] = true;
521  iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
522  }
523 
524  // At this point we know that the two processes both
525  // have an ESProducer matching the type and label in
526  // iComponent and also with exactly the same configuration.
527  // And there was not an earlier preceding process
528  // where the same instance of the ESProducer could
529  // have been shared. And this ESProducer was referenced
530  // by the later process's EventSetupRecord (prefered or
531  // or just the only thing that could have made the data).
532  // To determine if sharing is allowed, now we need to
533  // check if all the DataProxyProviders and all the
534  // finders are the same for this record and also for
535  // all records this record depends on. And even
536  // if this is true, we have to wait until the loop
537  // ends because some other DataProxy associated with
538  // the ESProducer could write to a different record where
539  // the same determination will need to be repeated. Only if
540  // all of the the DataProxy's can be shared, can the ESProducer
541  // instance be shared across processes.
542 
543  if (iCandidateNotRejectedYet->second == true) {
544 
545  auto iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
546  if (iAllComponentsMatch == allComponentsMatch.end()) {
547 
548  // We do not know the value in AllComponents yet and
549  // we need it now so we have to do the difficult calculation
550  // now.
551  bool match = doRecordsMatch(precedingESProvider,
552  iRecord.first,
553  allComponentsMatch,
554  esController);
555  allComponentsMatch[iRecord.first] = match;
556  iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
557  }
558  if (!iAllComponentsMatch->second) {
559  iCandidateNotRejectedYet->second = false;
560  }
561  }
562  } // end loop over components used by record
563  } // end loop over records
564 
565  // Loop over candidates
566  for (auto const& candidate : candidateNotRejectedYet) {
567  ParameterSetID const& psetID = candidate.first;
568  bool canBeShared = candidate.second;
569  if (canBeShared) {
570  ParameterSet const& pset = *esController.getESProducerPSet(psetID, subProcessIndex_);
571  logInfoWhenSharing(pset);
572  ParameterSetIDHolder psetIDHolder(psetID);
573  sharingCheckDone.insert(psetIDHolder);
574  if (esController.isFirstMatch(psetID,
575  subProcessIndex_,
576  precedingESProvider.subProcessIndex_)) {
577  continue; // Proper sharing was already done. Nothing more to do.
578  }
579 
580  // Need to reset the pointer from the EventSetupRecordProvider to the
581  // the DataProxyProvider so these two processes share an ESProducer.
582 
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);
589  break;
590  }
591 
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);
596  }
597  } else {
598  if (esController.isLastMatch(psetID,
599  subProcessIndex_,
600  precedingESProvider.subProcessIndex_)) {
601 
602 
603  ParameterSet const& pset = *esController.getESProducerPSet(psetID, subProcessIndex_);
604  ModuleFactory::get()->addTo(esController,
605  *this,
606  pset,
607  true);
608 
609  }
610  }
611  }
612 }
613 
614 bool
615 EventSetupProvider::doRecordsMatch(EventSetupProvider & precedingESProvider,
616  EventSetupRecordKey const& eventSetupRecordKey,
617  std::map<EventSetupRecordKey, bool> & allComponentsMatch,
618  EventSetupsController const& esController) {
619  // first check if this record matches. If not just return false
620 
621  // then find the directly dependent records and iterate over them
622  // recursively call this function on them. If they return false
623  // set allComponentsMatch to false for them and return false.
624  // if they all return true then set allComponents to true
625  // and return true.
626 
627  if (precedingESProvider.recordsWithALooperProxy_->find(eventSetupRecordKey) != precedingESProvider.recordsWithALooperProxy_->end()) {
628  return false;
629  }
630 
631  if ((*recordToFinders_)[eventSetupRecordKey].size() != (*precedingESProvider.recordToFinders_)[eventSetupRecordKey].size()) {
632  return false;
633  }
634 
635  for (auto const& finder : (*recordToFinders_)[eventSetupRecordKey]) {
636  ParameterSetID const& psetID = finder->descriptionForFinder().pid_;
637  bool itMatches = esController.isMatchingESSource(psetID,
638  subProcessIndex_,
639  precedingESProvider.subProcessIndex_);
640  if (!itMatches) {
641  return false;
642  }
643  }
644 
645  fillReferencedDataKeys(eventSetupRecordKey);
646  precedingESProvider.fillReferencedDataKeys(eventSetupRecordKey);
647 
648  std::map<DataKey, ComponentDescription const*> const& dataItems = (*referencedDataKeys_)[eventSetupRecordKey];
649 
650  std::map<DataKey, ComponentDescription const*> const& precedingDataItems = (*precedingESProvider.referencedDataKeys_)[eventSetupRecordKey];
651 
652  if (dataItems.size() != precedingDataItems.size()) {
653  return false;
654  }
655 
656  for (auto const& dataItem : dataItems) {
657  auto precedingDataItem = precedingDataItems.find(dataItem.first);
658  if (precedingDataItem == precedingDataItems.end()) {
659  return false;
660  }
661  if (dataItem.second->pid_ != precedingDataItem->second->pid_) {
662  return false;
663  }
664  // Check that the configurations match exactly for the ESProducers
665  // (We already checked the ESSources above and there should not be
666  // any loopers)
667  if (!dataItem.second->isSource_ && !dataItem.second->isLooper_) {
668  bool itMatches = esController.isMatchingESProducer(dataItem.second->pid_,
669  subProcessIndex_,
670  precedingESProvider.subProcessIndex_);
671  if (!itMatches) {
672  return false;
673  }
674  }
675  }
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()) {
682  if (iter->second) {
683  continue;
684  } else {
685  return false;
686  }
687  }
688  bool match = doRecordsMatch(precedingESProvider,
689  dependentRecord,
690  allComponentsMatch,
691  esController);
692  allComponentsMatch[dependentRecord] = match;
693  if (!match) return false;
694  }
695  }
696  return true;
697 }
698 
699 void
700 EventSetupProvider::fillReferencedDataKeys(EventSetupRecordKey const& eventSetupRecordKey) {
701 
702  if (referencedDataKeys_->find(eventSetupRecordKey) != referencedDataKeys_->end()) return;
703 
704  auto recordProvider = providers_.find(eventSetupRecordKey);
705  if (recordProvider == providers_.end()) {
706  (*referencedDataKeys_)[eventSetupRecordKey];
707  return;
708  }
709  if (recordProvider->second) {
710  recordProvider->second->fillReferencedDataKeys((*referencedDataKeys_)[eventSetupRecordKey]);
711  }
712 }
713 
714 void
715 EventSetupProvider::resetRecordToProxyPointers() {
716  for (auto const& recordProvider : providers_) {
718  const EventSetupRecordProvider::DataToPreferredProviderMap* preferredInfo = &kEmptyMap;
719  RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(recordProvider.first);
720  if(itRecordFound != recordToPreferred_->end()) {
721  preferredInfo = &(itRecordFound->second);
722  }
723  recordProvider.second->resetRecordToProxyPointers(*preferredInfo);
724  }
725 }
726 
727 void
728 EventSetupProvider::clearInitializationData() {
729  preferredProviderInfo_.reset();
730  referencedDataKeys_.reset();
731  recordToFinders_.reset();
732  psetIDToRecordKey_.reset();
733  recordToPreferred_.reset();
734  recordsWithALooperProxy_.reset();
735 }
736 
737 void
738 EventSetupProvider::addRecordToEventSetup(EventSetupRecordImpl& iRecord) {
739  iRecord.setEventSetup(&eventSetup_);
740  eventSetup_.add(iRecord);
741 }
742 
743 void
744 EventSetupProvider::insert(std::unique_ptr<EventSetupRecordProvider> iRecordProvider) {
745  auto key =iRecordProvider->key();
746  insert( key, std::move(iRecordProvider));
747 }
748 
749 //
750 // const member functions
751 //
752 EventSetup const&
753 EventSetupProvider::eventSetupForInstance(const IOVSyncValue& iValue)
754 {
755  eventSetup_.clear();
756 
757  // In a cmsRun job this does nothing because the EventSetupsController
758  // will have already called finishConfiguration, but some tests will
759  // call finishConfiguration here.
760  if(mustFinishConfiguration_) {
761  finishConfiguration();
762  }
763 
764  for(Providers::iterator itProvider = providers_.begin(), itProviderEnd = providers_.end();
765  itProvider != itProviderEnd;
766  ++itProvider) {
767  itProvider->second->addRecordToIfValid(*this, iValue);
768  }
769  return eventSetup_;
770 }
771 
772 std::set<ComponentDescription>
773 EventSetupProvider::proxyProviderDescriptions() const
774 {
775  typedef std::set<ComponentDescription> Set;
776  Set descriptions;
777 
778  for(auto const& p: providers_) {
779  auto const& d = p.second->proxyProviderDescriptions();
780  descriptions.insert(d.begin(),d.end());
781  }
782  if(dataProviders_.get()) {
783  for(auto const& p: *dataProviders_) {
784  descriptions.insert(p->description());
785  }
786  }
787 
788  return descriptions;
789 }
790 
791 bool
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)) ) {
797  return false;
798  }
799  }
800  return true;
801 }
802 //
803 // static member functions
804 //
805 void EventSetupProvider::logInfoWhenSharing(ParameterSet const& iConfiguration) {
806 
807  std::string edmtype = iConfiguration.getParameter<std::string>("@module_edm_type");
808  std::string modtype = iConfiguration.getParameter<std::string>("@module_type");
809  std::string label = iConfiguration.getParameter<std::string>("@module_label");
810  edm::LogVerbatim("EventSetupSharing") << "Sharing " << edmtype << ": class=" << modtype << " label='" << label << "'";
811 }
812  }
813 }
size
Write out results.
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
Map map_
void setEventSetup(EventSetup const *iEventSetup)
std::pair< const char *, const std::type_info * > findType(const char *iClassName)
Definition: typelookup.cc:76
bool isFirstMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
bool isMatchingESProducer(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
int kp
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_
#define nullptr
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
char const * label
static void findDependents(const EventSetupRecordKey &iKey, Itr itBegin, Itr itEnd, std::vector< std::shared_ptr< EventSetupRecordProvider > > &oDependents)
heterocontainer::HCTypeTag TypeTag
Definition: DataKeyTags.h:30
std::unique_ptr< std::set< EventSetupRecordKey > > recordsWithALooperProxy_
def unique(seq, keepstr=True)
Definition: tier0.py:25
std::map< EventSetupRecordKey, std::shared_ptr< EventSetupRecordProvider > > Providers
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
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 &#39;preferred&#39; list
std::vector< size_type > Keys
HLT enums.
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.
Definition: Utils.h:10
def move(src, dest)
Definition: eostools.py:511
T get(const Candidate &c)
Definition: component.h:55
Providers::iterator Itr