CMS 3D CMS Logo

EventSetupRecordProvider.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Framework
4 // Class : EventSetupRecordProvider
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Author: Chris Jones
10 // Created: Fri Mar 25 19:12:03 EST 2005
11 //
12 
13 // system include files
14 #include <algorithm>
15 #include <cassert>
16 
17 // user include files
31 
32 //
33 // constants, enums and typedefs
34 //
35 
36 namespace edm {
37  namespace eventsetup {
38  //
39  // static data member definitions
40  //
41 
42  //
43  // constructors and destructor
44  //
46  : record_(iKey),
47  key_(iKey),
48  validityInterval_(),
49  finder_(),
50  providers_(),
51  multipleFinders_(new std::vector<edm::propagate_const<std::shared_ptr<EventSetupRecordIntervalFinder>>>()),
52  lastSyncWasBeginOfRun_(true) {}
53 
54  // EventSetupRecordProvider::EventSetupRecordProvider(const EventSetupRecordProvider& rhs)
55  // {
56  // // do actual copying here;
57  // }
58 
59  //
60  // assignment operators
61  //
62  // const EventSetupRecordProvider& EventSetupRecordProvider::operator=(const EventSetupRecordProvider& rhs)
63  // {
64  // //An exception safe implementation is
65  // EventSetupRecordProvider temp(rhs);
66  // swap(rhs);
67  //
68  // return *this;
69  // }
70 
71  //
72  // member functions
73  //
74  void EventSetupRecordProvider::add(std::shared_ptr<DataProxyProvider> iProvider) {
75  assert(iProvider->isUsingRecord(key_));
77  assert(!search_all(providers_, pProvider));
78  providers_.emplace_back(iProvider);
79  }
80 
81  void EventSetupRecordProvider::addFinder(std::shared_ptr<EventSetupRecordIntervalFinder> iFinder) {
82  auto oldFinder = finder();
83  finder_ = iFinder;
84  if (nullptr != multipleFinders_.get()) {
85  multipleFinders_->emplace_back(iFinder);
86  } else {
87  //dependent records set there finders after the multipleFinders_ has been released
88  // but they also have never had a finder set
89  if (nullptr != oldFinder.get()) {
90  cms::Exception("EventSetupMultipleSources")
91  << "An additional source has been added to the Record " << key_.name() << "'\n"
92  << "after all the other sources have been dealt with. This is a logic error, please send email to the "
93  "framework group.";
94  }
95  }
96  }
98  validityInterval_ = iInterval;
99  }
100 
102  const std::vector<std::shared_ptr<EventSetupRecordProvider>>& iProviders) {
103  using std::placeholders::_1;
104  std::shared_ptr<DependentRecordIntervalFinder> newFinder =
105  make_shared_noexcept_false<DependentRecordIntervalFinder>(key());
106 
107  std::shared_ptr<EventSetupRecordIntervalFinder> old = swapFinder(newFinder);
108 
109  for (auto const& p : iProviders) {
110  newFinder->addProviderWeAreDependentOn(p);
111  };
112  //if a finder was already set, add it as a depedency. This is done to ensure that the IOVs properly change even if the
113  // old finder does not update each time a dependent record does change
114  if (old.get() != nullptr) {
115  newFinder->setAlternateFinder(old);
116  }
117  }
119  using std::placeholders::_1;
120  for_all(providers_, std::bind(&EventSetupRecordProvider::addProxiesToRecordHelper, this, _1, iMap));
121  if (1 < multipleFinders_->size()) {
122  std::shared_ptr<IntersectingIOVRecordIntervalFinder> intFinder =
123  make_shared_noexcept_false<IntersectingIOVRecordIntervalFinder>(key_);
124  intFinder->swapFinders(*multipleFinders_);
125  finder_ = intFinder;
126  }
127  //now we get rid of the temporary
128  multipleFinders_.reset(nullptr);
129  }
130 
131  void EventSetupRecordProvider::addProxiesToRecord(std::shared_ptr<DataProxyProvider> iProvider,
133  typedef DataProxyProvider::KeyedProxies ProxyList;
135 
136  const ProxyList& keyedProxies(iProvider->keyedProxies(this->key()));
137  ProxyList::const_iterator finishedProxyList(keyedProxies.end());
138  for (ProxyList::const_iterator keyedProxy(keyedProxies.begin()); keyedProxy != finishedProxyList; ++keyedProxy) {
139  PreferredMap::const_iterator itFound = iMap.find(keyedProxy->first);
140  if (iMap.end() != itFound) {
141  if (itFound->second.type_ != keyedProxy->second->providerDescription()->type_ ||
142  itFound->second.label_ != keyedProxy->second->providerDescription()->label_) {
143  //this is not the preferred provider
144  continue;
145  }
146  }
147  record_.add((*keyedProxy).first, (*keyedProxy).second.get());
148  }
149  }
150 
152  record_.set(this->validityInterval());
153  iEventSetupProvider.addRecordToEventSetup(record_);
154  }
155 
156  //
157  // const member functions
158  //
160  using std::placeholders::_1;
161  if (checkResetTransients()) {
162  for_all(providers_, std::bind(&DataProxyProvider::resetProxiesIfTransient, _1, key_));
163  }
164  }
165 
167  const IOVSyncValue& iTime) {
168  if (setValidityIntervalFor(iTime)) {
169  addRecordTo(iEventSetupProvider);
170  }
171  }
172 
174  //we want to wait until after the first event of a new run before
175  // we reset any transients just in case some modules get their data at beginRun or beginLumi
176  // and others wait till the first event
177  if (!lastSyncWasBeginOfRun_) {
178  resetTransients();
179  }
180  lastSyncWasBeginOfRun_ = iTime.eventID().event() == 0;
181 
182  if (validityInterval_.validFor(iTime)) {
183  return true;
184  }
185  bool returnValue = false;
186  //need to see if we get a new interval
187  if (nullptr != finder_.get()) {
188  IOVSyncValue oldFirst(validityInterval_.first());
189 
190  validityInterval_ = finder_->findIntervalFor(key_, iTime);
191  //are we in a valid range?
192  if (validityInterval_.first() != IOVSyncValue::invalidIOVSyncValue()) {
193  returnValue = true;
194  //did we actually change?
195  if (oldFirst != validityInterval_.first()) {
196  //tell all Providers to update
197  for (auto& provider : providers_) {
198  provider->newInterval(key_, validityInterval_);
199  }
200  cacheReset();
201  }
202  }
203  }
204  return returnValue;
205  }
206 
208  using std::placeholders::_1;
209  cacheReset();
210  for_all(providers_, std::bind(&DataProxyProvider::resetProxies, _1, key_));
211  //some proxies only clear if they were accessed transiently,
212  // since resetProxies resets that flag, calling resetTransients
213  // will force a clear
214  for_all(providers_, std::bind(&DataProxyProvider::resetProxiesIfTransient, _1, key_));
215  }
216 
218  std::map<EventSetupRecordKey, std::vector<ComponentDescription const*>>& referencedESProducers) {
219  record().getESProducers(referencedESProducers[key_]);
220  }
221 
223  std::map<DataKey, ComponentDescription const*>& referencedDataKeys) const {
224  std::vector<DataKey> keys;
225  record().fillRegisteredDataKeys(keys);
226  std::vector<ComponentDescription const*> components = record().componentsForRegisteredDataKeys();
227  auto itComponents = components.begin();
228  for (auto const& k : keys) {
229  referencedDataKeys.emplace(k, *itComponents);
230  ++itComponents;
231  }
232  }
233 
235  using std::placeholders::_1;
236  record().clearProxies();
237  for_all(providers_, std::bind(&EventSetupRecordProvider::addProxiesToRecordHelper, this, _1, iMap));
238  }
239 
240  void EventSetupRecordProvider::cacheReset() { record().cacheReset(); }
241 
242  bool EventSetupRecordProvider::checkResetTransients() { return record().transientReset(); }
243 
244  std::set<EventSetupRecordKey> EventSetupRecordProvider::dependentRecords() const { return dependencies(key()); }
245 
246  std::set<ComponentDescription> EventSetupRecordProvider::proxyProviderDescriptions() const {
247  using std::placeholders::_1;
248  std::set<ComponentDescription> descriptions;
249  std::transform(providers_.begin(),
250  providers_.end(),
251  std::inserter(descriptions, descriptions.end()),
252  std::bind(&DataProxyProvider::description, _1));
253  return descriptions;
254  }
255 
256  std::shared_ptr<DataProxyProvider> EventSetupRecordProvider::proxyProvider(ComponentDescription const& iDesc) {
257  using std::placeholders::_1;
258  auto itFound = std::find_if(
259  providers_.begin(),
260  providers_.end(),
261  std::bind(std::equal_to<ComponentDescription>(), iDesc, std::bind(&DataProxyProvider::description, _1)));
262  if (itFound == providers_.end()) {
263  return std::shared_ptr<DataProxyProvider>();
264  }
265  return get_underlying_safe(*itFound);
266  }
267 
268  std::shared_ptr<DataProxyProvider> EventSetupRecordProvider::proxyProvider(ParameterSetIDHolder const& psetID) {
269  for (auto& dataProxyProvider : providers_) {
270  if (dataProxyProvider->description().pid_ == psetID.psetID()) {
271  return get_underlying_safe(dataProxyProvider);
272  }
273  }
274  return std::shared_ptr<DataProxyProvider>();
275  }
276 
278  ParameterSetIDHolder const& psetID, std::shared_ptr<DataProxyProvider> const& sharedDataProxyProvider) {
279  for (auto& dataProxyProvider : providers_) {
280  if (dataProxyProvider->description().pid_ == psetID.psetID()) {
281  dataProxyProvider = sharedDataProxyProvider;
282  }
283  }
284  }
285 
286  std::vector<DataKey> EventSetupRecordProvider::registeredDataKeys() const {
287  std::vector<DataKey> ret;
288  record_.fillRegisteredDataKeys(ret);
289  return ret;
290  }
291 
292  std::vector<ComponentDescription const*> EventSetupRecordProvider::componentsForRegisteredDataKeys() const {
293  return record_.componentsForRegisteredDataKeys();
294  }
295 
296  //
297  // static member functions
298  //
299  } // namespace eventsetup
300 } // namespace edm
std::map< DataKey, ComponentDescription > DataToPreferredProviderMap
EventNumber_t event() const
Definition: EventID.h:41
void resetProxiesIfTransient(const EventSetupRecordKey &iRecordType)
void resetProxyProvider(ParameterSetIDHolder const &, std::shared_ptr< DataProxyProvider > const &)
void add(std::shared_ptr< DataProxyProvider >)
const EventID & eventID() const
Definition: IOVSyncValue.h:40
JetCorrectorParameters::Record record
Definition: classes.h:7
bool setValidityIntervalFor(IOVSyncValue const &)
sets interval to this time and returns true if have a valid interval for time
void fillReferencedDataKeys(std::map< DataKey, ComponentDescription const * > &referencedDataKeys) const
std::vector< std::pair< DataKey, edm::propagate_const< std::shared_ptr< DataProxy > > > > KeyedProxies
void addRecordToIfValid(EventSetupProvider &, IOVSyncValue const &)
std::vector< DataKey > registeredDataKeys() const
The available DataKeys in the Record. The order can be used to request the data by index...
Func for_all(ForwardSequence &s, Func f)
wrapper for std::for_each
Definition: Algorithms.h:14
std::vector< ComponentDescription const * > componentsForRegisteredDataKeys() const
void setValidityInterval(ValidityInterval const &)
ParameterSetID const & psetID() const
void resetProxies(const EventSetupRecordKey &iRecordType)
const ComponentDescription & description() const
void setDependentProviders(std::vector< std::shared_ptr< EventSetupRecordProvider >> const &)
If the provided Record depends on other Records, here are the dependent Providers.
EventSetupRecordProvider(EventSetupRecordKey const &iKey)
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void addFinder(std::shared_ptr< EventSetupRecordIntervalFinder >)
For now, only use one finder.
std::set< EventSetupRecordKey > dependencies(EventSetupRecordKey const &)
int k[5][pyjets_maxn]
std::shared_ptr< DataProxyProvider > proxyProvider(ComponentDescription const &)
returns the first matching DataProxyProvider or a &#39;null&#39; if not found
void addProxiesToRecordHelper(edm::propagate_const< std::shared_ptr< DataProxyProvider >> &dpp, DataToPreferredProviderMap const &mp)
bool search_all(ForwardSequence const &s, Datum const &d)
Definition: Algorithms.h:36
void addProxiesToRecord(std::shared_ptr< DataProxyProvider >, DataToPreferredProviderMap const &)
void getReferencedESProducers(std::map< EventSetupRecordKey, std::vector< ComponentDescription const * >> &referencedESProducers)
std::set< ComponentDescription > proxyProviderDescriptions() const
return information on which DataProxyProviders are supplying information
HLT enums.
std::set< EventSetupRecordKey > dependentRecords() const
Returns the list of Records the provided Record depends on (usually none)
void addRecordToEventSetup(EventSetupRecordImpl &iRecord)
void usePreferred(DataToPreferredProviderMap const &)
void resetProxies()
This will clear the cache&#39;s of all the Proxies so that next time they are called they will run...
void resetRecordToProxyPointers(DataToPreferredProviderMap const &iMap)
static const IOVSyncValue & invalidIOVSyncValue()
Definition: IOVSyncValue.cc:78