CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EventPrincipal.cc
Go to the documentation of this file.
2 
24 
25 #include <algorithm>
26 #include <cassert>
27 #include <limits>
28 #include <memory>
29 
30 namespace edm {
32  std::shared_ptr<ProductRegistry const> reg,
33  std::shared_ptr<BranchIDListHelper const> branchIDListHelper,
34  std::shared_ptr<ThinnedAssociationsHelper const> thinnedAssociationsHelper,
35  ProcessConfiguration const& pc,
36  HistoryAppender* historyAppender,
37  unsigned int streamIndex) :
38  Base(reg, reg->productLookup(InEvent), pc, InEvent, historyAppender),
39  aux_(),
40  luminosityBlockPrincipal_(),
41  provRetrieverPtr_(new ProductProvenanceRetriever(streamIndex)),
42  unscheduledHandler_(),
43  moduleLabelsRunning_(),
44  eventSelectionIDs_(),
45  branchIDListHelper_(branchIDListHelper),
46  thinnedAssociationsHelper_(thinnedAssociationsHelper),
47  branchListIndexes_(),
48  branchListIndexToProcessIndex_(),
49  streamID_(streamIndex) {
51  }
52 
53  void
56  aux_ = EventAuxiliary();
58  provRetrieverPtr_->reset();
59  unscheduledHandler_.reset();
60  moduleLabelsRunning_.clear();
62  }
63 
64  void
66  ProcessHistoryRegistry const& processHistoryRegistry,
67  EventSelectionIDVector&& eventSelectionIDs,
68  BranchListIndexes&& branchListIndexes,
69  ProductProvenanceRetriever& provRetriever,
72  provRetrieverPtr_->deepSwap(provRetriever);
74  if(branchIDListHelper_->hasProducedProducts()) {
75  // Add index into BranchIDListRegistry for products produced this process
76  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
77  }
78  fillEventPrincipal(aux,processHistoryRegistry,reader);
79  }
80 
81  void
83  ProcessHistoryRegistry const& processHistoryRegistry,
84  EventSelectionIDVector&& eventSelectionIDs,
85  BranchListIndexes&& branchListIndexes) {
88  if(branchIDListHelper_->hasProducedProducts()) {
89  // Add index into BranchIDListRegistry for products produced this process
90  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
91  }
92  fillEventPrincipal(aux,processHistoryRegistry,nullptr);
93  }
94 
95  void
97  ProcessHistoryRegistry const& processHistoryRegistry,
99  if(aux.event() == invalidEventNumber) {
101  << "EventPrincipal::fillEventPrincipal, Invalid event number provided in EventAuxiliary, It is illegal for the event number to be 0\n";
102  }
103 
104  fillPrincipal(aux.processHistoryID(), processHistoryRegistry, reader);
105  aux_ = aux;
107 
108  if(branchListIndexes_.empty() and branchIDListHelper_->hasProducedProducts()) {
109  // Add index into BranchIDListRegistry for products produced this process
110  // if it hasn't already been filled in by the other fillEventPrincipal or by an earlier call to this function
111  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
112  }
113 
114  // Fill in helper map for Branch to ProductID mapping
115  ProcessIndex pix = 0;
116  for(auto const& blindex : branchListIndexes_) {
117  branchListIndexToProcessIndex_.insert(std::make_pair(blindex, pix));
118  ++pix;
119  }
120 
121  // Fill in the product ID's in the product holders.
122  for(auto const& prod : *this) {
123  if (prod->singleProduct()) {
124  // If an alias is in the same process as the original then isAlias will be true.
125  // Under that condition, we want the ProductID to be the same as the original.
126  // If not, then we've internally changed the original BranchID to the alias BranchID
127  // in the ProductID lookup so we need the alias BranchID.
128  auto const & bd =prod->branchDescription();
129  prod->setProvenance(productProvenanceRetrieverPtr(),
130  processHistory(),
131  branchIDToProductID(bd.isAlias()?bd.originalBranchID(): bd.branchID()));
132  }
133  }
134  }
135 
136  void
137  EventPrincipal::setLuminosityBlockPrincipal(std::shared_ptr<LuminosityBlockPrincipal> const& lbp) {
139  }
140 
141  void
143  assert(run == luminosityBlockPrincipal_->run());
144  assert(lumi == luminosityBlockPrincipal_->luminosityBlock());
145  EventNumber_t event = aux_.id().event();
146  aux_.id() = EventID(run, lumi, event);
147  }
148 
149  RunPrincipal const&
152  }
153 
154  void
156  BranchDescription const& bd,
157  std::unique_ptr<WrapperBase> edp,
158  ProductProvenance const& productProvenance) {
159 
160  // assert commented out for DaqSource. When DaqSource no longer uses put(), the assert can be restored.
161  //assert(produced());
162  if(edp.get() == nullptr) {
163  throw Exception(errors::InsertFailure, "Null Pointer")
164  << "put: Cannot put because ptr to product is null."
165  << "\n";
166  }
167  productProvenanceRetrieverPtr()->insertIntoSet(productProvenance);
169  assert(phb);
170  checkUniquenessAndType(edp.get(), phb);
171  // ProductHolder assumes ownership
172  phb->putProduct(std::move(edp), productProvenance);
173  }
174 
175  void
177  BranchDescription const& bd,
178  std::unique_ptr<WrapperBase> edp,
179  ProductProvenance const& productProvenance) {
180 
181  assert(!bd.produced());
182  productProvenanceRetrieverPtr()->insertIntoSet(productProvenance);
184  assert(phb);
185  checkUniquenessAndType(edp.get(), phb);
186  // ProductHolder assumes ownership
187  phb->putProduct(std::move(edp), productProvenance);
188  }
189 
190  void
192  if(phb.branchDescription().produced()) return; // nothing to do.
193  if(phb.product()) return; // nothing to do.
194  if(phb.productUnavailable()) return; // nothing to do.
195  if(!reader()) return; // nothing to do.
196 
197  // must attempt to load from persistent store
198  BranchKey const bk = BranchKey(phb.branchDescription());
199  {
200  if(mcc) {
202  }
203  std::shared_ptr<void> guard(nullptr,[this,mcc](const void*){
204  if(mcc) {
206  }
207  });
208 
209  std::unique_ptr<WrapperBase> edp(reader()->getProduct(bk, this));
210 
211  // Now fix up the ProductHolder
212  checkUniquenessAndType(edp.get(), &phb);
213  phb.putProduct(std::move(edp));
214  }
215  }
216 
217  BranchID
219  if(!pid.isValid()) {
220  throw Exception(errors::ProductNotFound, "InvalidID")
221  << "get by product ID: invalid ProductID supplied\n";
222  }
223  return productIDToBranchID(pid, branchIDListHelper_->branchIDLists(), branchListIndexes_);
224  }
225 
226  ProductID
228  if(!bid.isValid()) {
229  throw Exception(errors::NotFound, "InvalidID")
230  << "branchIDToProductID: invalid BranchID supplied\n";
231  }
232  typedef BranchIDListHelper::BranchIDToIndexMap BIDToIndexMap;
233  typedef BIDToIndexMap::const_iterator Iter;
234  typedef std::pair<Iter, Iter> IndexRange;
235 
236  IndexRange range = branchIDListHelper_->branchIDToIndexMap().equal_range(bid);
237  for(Iter it = range.first; it != range.second; ++it) {
238  BranchListIndex blix = it->second.first;
239  std::map<BranchListIndex, ProcessIndex>::const_iterator i = branchListIndexToProcessIndex_.find(blix);
240  if(i != branchListIndexToProcessIndex_.end()) {
241  ProductIndex productIndex = it->second.second;
242  ProcessIndex processIndex = i->second;
243  return ProductID(processIndex+1, productIndex+1);
244  }
245  }
246  // cannot throw, because some products may legitimately not have product ID's (e.g. pile-up).
247  return ProductID();
248  }
249 
250  unsigned int
252  return streamID_.value();
253  }
254 
257  exception<<"get by product ID: The product with given id: "<<pid
258  <<"\ntype: "<<phb->productType()
259  <<"\nproduct instance name: "<<phb->productInstanceName()
260  <<"\nprocess name: "<<phb->processName()
261  <<"\nwas already deleted. This is a configuration error. Please change the configuration of the module which caused this exception to state it reads this data.";
262  throw exception;
263  }
264 
265  BasicHandle
267  BranchID bid = pidToBid(pid);
268  ConstProductHolderPtr const phb = getProductHolder(bid);
269  if(phb == nullptr) {
270  return BasicHandle(makeHandleExceptionFactory([pid]()->std::shared_ptr<cms::Exception> {
271  std::shared_ptr<cms::Exception> whyFailed(std::make_shared<Exception>(errors::ProductNotFound, "InvalidID"));
272  *whyFailed
273  << "get by product ID: no product with given id: " << pid << "\n";
274  return whyFailed;
275  }));
276  }
277 
278  // Was this already deleted?
279  if(phb->productWasDeleted()) {
281  }
282  // Check for case where we tried on demand production and
283  // it failed to produce the object
284  if(phb->onDemand()) {
285  return BasicHandle(makeHandleExceptionFactory([pid]()->std::shared_ptr<cms::Exception> {
286  std::shared_ptr<cms::Exception> whyFailed(std::make_shared<Exception>(errors::ProductNotFound, "InvalidID"));
287  *whyFailed
288  << "get by ProductID: could not get product with id: " << pid << "\n"
289  << "Unscheduled execution not allowed to get via ProductID.\n";
290  return whyFailed;
291  }));
292  }
294  phb->resolveProduct(status,false,nullptr,nullptr);
295 
296  return BasicHandle(phb->productData());
297  }
298 
299  WrapperBase const*
301  return getByProductID(pid).wrapper();
302  }
303 
304  WrapperBase const*
305  EventPrincipal::getThinnedProduct(ProductID const& pid, unsigned int& key) const {
306 
307  BranchID parent = pidToBid(pid);
308 
309  // Loop over thinned containers which were made by selecting elements from the parent container
310  for(auto associatedBranches = thinnedAssociationsHelper_->parentBegin(parent),
311  iEnd = thinnedAssociationsHelper_->parentEnd(parent);
312  associatedBranches != iEnd; ++associatedBranches) {
313 
314  ThinnedAssociation const* thinnedAssociation =
315  getThinnedAssociation(associatedBranches->association());
316  if(thinnedAssociation == nullptr) continue;
317 
318  if(associatedBranches->parent() != pidToBid(thinnedAssociation->parentCollectionID())) {
319  continue;
320  }
321 
322  unsigned int thinnedIndex = 0;
323  // Does this thinned container have the element referenced by key?
324  // If yes, thinnedIndex is set to point to it in the thinned container
325  if(!thinnedAssociation->hasParentIndex(key, thinnedIndex)) {
326  continue;
327  }
328  // Get the thinned container and return a pointer if we can find it
329  ProductID const& thinnedCollectionPID = thinnedAssociation->thinnedCollectionID();
330  BasicHandle bhThinned = getByProductID(thinnedCollectionPID);
331  if(!bhThinned.isValid()) {
332  // Thinned container is not found, try looking recursively in thinned containers
333  // which were made by selecting elements from this thinned container.
334  WrapperBase const* wrapperBase = getThinnedProduct(thinnedCollectionPID, thinnedIndex);
335  if(wrapperBase != nullptr) {
336  key = thinnedIndex;
337  return wrapperBase;
338  } else {
339  continue;
340  }
341  }
342  key = thinnedIndex;
343  return bhThinned.wrapper();
344  }
345  return nullptr;
346  }
347 
348  void
350  std::vector<WrapperBase const*>& foundContainers,
351  std::vector<unsigned int>& keys) const {
352 
353  BranchID parent = pidToBid(pid);
354 
355  // Loop over thinned containers which were made by selecting elements from the parent container
356  for(auto associatedBranches = thinnedAssociationsHelper_->parentBegin(parent),
357  iEnd = thinnedAssociationsHelper_->parentEnd(parent);
358  associatedBranches != iEnd; ++associatedBranches) {
359 
360  ThinnedAssociation const* thinnedAssociation =
361  getThinnedAssociation(associatedBranches->association());
362  if(thinnedAssociation == nullptr) continue;
363 
364  if(associatedBranches->parent() != pidToBid(thinnedAssociation->parentCollectionID())) {
365  continue;
366  }
367 
368  unsigned nKeys = keys.size();
369  unsigned int doNotLookForThisIndex = std::numeric_limits<unsigned int>::max();
370  std::vector<unsigned int> thinnedIndexes(nKeys, doNotLookForThisIndex);
371  bool hasAny = false;
372  for(unsigned k = 0; k < nKeys; ++k) {
373  // Already found this one
374  if(foundContainers[k] != nullptr) continue;
375  // Already know this one is not in this thinned container
376  if(keys[k] == doNotLookForThisIndex) continue;
377  // Does the thinned container hold the entry of interest?
378  // Modifies thinnedIndexes[k] only if it returns true and
379  // sets it to the index in the thinned collection.
380  if(thinnedAssociation->hasParentIndex(keys[k], thinnedIndexes[k])) {
381  hasAny = true;
382  }
383  }
384  if(!hasAny) {
385  continue;
386  }
387  // Get the thinned container and set the pointers and indexes into
388  // it (if we can find it)
389  ProductID thinnedCollectionPID = thinnedAssociation->thinnedCollectionID();
390  BasicHandle bhThinned = getByProductID(thinnedCollectionPID);
391  if(!bhThinned.isValid()) {
392  // Thinned container is not found, try looking recursively in thinned containers
393  // which were made by selecting elements from this thinned container.
394  getThinnedProducts(thinnedCollectionPID, foundContainers, thinnedIndexes);
395  for(unsigned k = 0; k < nKeys; ++k) {
396  if(foundContainers[k] == nullptr) continue;
397  if(thinnedIndexes[k] == doNotLookForThisIndex) continue;
398  keys[k] = thinnedIndexes[k];
399  }
400  } else {
401  for(unsigned k = 0; k < nKeys; ++k) {
402  if(thinnedIndexes[k] == doNotLookForThisIndex) continue;
403  keys[k] = thinnedIndexes[k];
404  foundContainers[k] = bhThinned.wrapper();
405  }
406  }
407  }
408  }
409 
410  Provenance
412  BranchID bid = pidToBid(pid);
413  return getProvenance(bid, mcc);
414  }
415 
416  void
417  EventPrincipal::setUnscheduledHandler(std::shared_ptr<UnscheduledHandler> iHandler) {
418  unscheduledHandler_ = iHandler;
419  }
420 
421  std::shared_ptr<UnscheduledHandler>
423  return unscheduledHandler_;
424  }
425 
428  return eventSelectionIDs_;
429  }
430 
431  BranchListIndexes const&
433  return branchListIndexes_;
434  }
435 
438 
439  ConstProductHolderPtr const phb = getProductHolder(branchID);
440 
441  if(phb == nullptr) {
443  << "EventPrincipal::getThinnedAssociation, ThinnedAssociation ProductHolder cannot be found\n"
444  << "This should never happen. Contact a Framework developer";
445  }
447  ProductData const* productData = phb->resolveProduct(status,false,nullptr,nullptr);
448  if (productData == nullptr) {
449  return nullptr;
450  }
451  WrapperBase const* product = productData->wrapper_.get();
452  if(!(typeid(edm::ThinnedAssociation) == product->dynamicTypeInfo())) {
454  << "EventPrincipal::getThinnedProduct, product has wrong type, not a ThinnedAssociation.\n";
455  }
457  return wrapper->product();
458  }
459 
460  bool
463  ModuleCallingContext const* mcc) const {
464 
465  // If it is a module already currently running in unscheduled
466  // mode, then there is a circular dependency related to which
467  // EDProducts modules require and produce. There is no safe way
468  // to recover from this. Here we check for this problem and throw
469  // an exception.
470  std::vector<std::string>::const_iterator i =
471  find_in_all(moduleLabelsRunning_, moduleLabel);
472 
473  if(i != moduleLabelsRunning_.end()) {
475  << "Hit circular dependency while trying to run an unscheduled module.\n"
476  << "The last module on the stack shown above requested data from the\n"
477  << "module with label: '" << moduleLabel << "'.\n"
478  << "This is illegal because this module is already running (it is in the\n"
479  << "stack shown above, it might or might not be asking for data from itself).\n"
480  << "More information related to resolving circular dependences can be found here:\n"
481  << "https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideUnscheduledExecution#Circular_Dependence_Errors.";
482  }
483 
484  UnscheduledSentry sentry(&moduleLabelsRunning_, moduleLabel);
485 
486  if(unscheduledHandler_) {
487  if(mcc == nullptr) {
489  << "EventPrincipal::unscheduledFill, Attempting to run unscheduled production\n"
490  << "with a null pointer to the ModuleCalling Context. This should never happen.\n"
491  << "Contact a Framework developer";
492  }
494  std::shared_ptr<void> guard(nullptr,[this,mcc](const void*){
496  });
497  auto handlerCall = [this,&moduleLabel,&mcc]() {
498  unscheduledHandler_->tryToFill(moduleLabel, *const_cast<EventPrincipal*>(this), mcc);
499  };
500  if (sra) {
501  sra->temporaryUnlock(handlerCall);
502  } else {
503  handlerCall();
504  }
505  }
506  return true;
507  }
508 }
RunPrincipal const & runPrincipal() const
std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper_
EventNumber_t event() const
Definition: EventID.h:41
void clearPrincipal()
Definition: Principal.cc:319
int i
Definition: DBlmapReader.cc:9
unsigned short BranchListIndex
WrapperBase * product() const
Definition: ProductHolder.h:84
void setLuminosityBlockPrincipal(std::shared_ptr< LuminosityBlockPrincipal > const &lbp)
EventSelectionIDVector const & eventSelectionIDs() const
ConstProductHolderPtr getProductHolder(BranchID const &oid) const
Definition: Principal.cc:454
StreamContext const * getStreamContext() const
std::shared_ptr< LuminosityBlockPrincipal > luminosityBlockPrincipal_
list parent
Definition: dbtoconf.py:74
std::type_info const & dynamicTypeInfo() const
Definition: WrapperBase.h:38
std::shared_ptr< UnscheduledHandler > unscheduledHandler_
BasicHandle getByProductID(ProductID const &oid) const
EventSelectionIDVector eventSelectionIDs_
BranchID pidToBid(ProductID const &pid) const
tuple lumi
Definition: fjr2json.py:35
BranchListIndexes branchListIndexes_
edm::ThinnedAssociation const * getThinnedAssociation(edm::BranchID const &branchID) const
assert(m_qm.get())
Provenance getProvenance(ProductID const &pid, ModuleCallingContext const *mcc) const
std::map< BranchListIndex, ProcessIndex > branchListIndexToProcessIndex_
unsigned long long EventNumber_t
T const * getProduct(RefCore const &ref)
Definition: RefCoreGet.h:41
std::shared_ptr< BranchIDListHelper const > branchIDListHelper_
virtual void readFromSource_(ProductHolderBase const &phb, ModuleCallingContext const *mcc) const override
EventAuxiliary aux_
void putOnRead(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp, ProductProvenance const &productProvenance)
bool isValid() const
Definition: BranchID.h:24
BranchListIndexes const & branchListIndexes() const
unsigned int LuminosityBlockNumber_t
ProcessHistory const & processHistory() const
Definition: Principal.h:142
ProductID branchIDToProductID(BranchID const &bid) const
RunPrincipal const & runPrincipal() const
std::vector< EventSelectionID > EventSelectionIDVector
virtual WrapperBase const * getThinnedProduct(ProductID const &pid, unsigned int &key) const override
static void throwProductDeletedException(ProductID const &pid, edm::EventPrincipal::ConstProductHolderPtr const phb)
void setUnscheduledHandler(std::shared_ptr< UnscheduledHandler > iHandler)
EventNumber_t const invalidEventNumber
std::vector< BranchListIndex > BranchListIndexes
BranchDescription const & branchDescription() const
Definition: ProductHolder.h:93
BranchID productIDToBranchID(ProductID const &pid, BranchIDLists const &lists, BranchListIndexes const &indexes)
ProcessHistoryID const & processHistoryID() const
Definition: Principal.h:146
std::shared_ptr< ProductProvenanceRetriever > productProvenanceRetrieverPtr() const
LuminosityBlockPrincipal const & luminosityBlockPrincipal() const
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
void checkUniquenessAndType(WrapperBase const *prod, ProductHolderBase const *productHolder) const
Definition: Principal.cc:838
WrapperBase const * wrapper() const
Definition: BasicHandle.h:98
std::shared_ptr< WrapperBase > wrapper_
Definition: ProductData.h:46
virtual WrapperBase const * getIt(ProductID const &pid) const override
BranchID const & branchID() const
ProductID const & thinnedCollectionID() const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::multimap< BranchID, IndexPair > BranchIDToIndexMap
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
unsigned short ProcessIndex
Definition: ProductID.h:25
DelayedReader * reader() const
Definition: Principal.h:176
unsigned int value() const
Definition: StreamID.h:46
ForwardSequence::const_iterator find_in_all(ForwardSequence const &s, Datum const &d)
wrappers for std::find
Definition: Algorithms.h:32
virtual unsigned int transitionIndex_() const override
void put(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp, ProductProvenance const &productProvenance)
T const * product() const
Definition: Wrapper.h:34
std::shared_ptr< UnscheduledHandler > unscheduledHandler() const
tuple pid
Definition: sysUtil.py:22
string const
Definition: compareJSON.py:14
void setProcessHistoryID(ProcessHistoryID const &phid)
bool isValid() const
Definition: BasicHandle.h:90
ProcessHistoryID const & processHistoryID() const
EventID const & id() const
void fillEventPrincipal(EventAuxiliary const &aux, ProcessHistoryRegistry const &processHistoryRegistry, DelayedReader *reader=0)
std::shared_ptr< ProductProvenanceRetriever > provRetrieverPtr_
Base::ConstProductHolderPtr ConstProductHolderPtr
unsigned short ProductIndex
Definition: ProductID.h:26
EventPrincipal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< BranchIDListHelper const > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper, ProcessConfiguration const &pc, HistoryAppender *historyAppender, unsigned int streamIndex=0)
unsigned int RunNumber_t
ProductID const & parentCollectionID() const
signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> preModuleDelayedGetSignal_
bool isValid() const
Definition: ProductID.h:35
tuple status
Definition: ntuplemaker.py:245
bool hasParentIndex(unsigned int parentIndex, unsigned int &thinnedIndex) const
void setRunAndLumiNumber(RunNumber_t run, LuminosityBlockNumber_t lumi)
void fillPrincipal(ProcessHistoryID const &hist, ProcessHistoryRegistry const &phr, DelayedReader *reader)
Definition: Principal.cc:342
EventAuxiliary const & aux() const
virtual void getThinnedProducts(ProductID const &pid, std::vector< WrapperBase const * > &foundContainers, std::vector< unsigned int > &keys) const override
void putProduct(std::unique_ptr< WrapperBase > edp, ProductProvenance const &productProvenance)
EventNumber_t event() const
void emit(Args &&...args) const
Definition: Signal.h:47
ProductHolderBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:398
std::vector< std::string > moduleLabelsRunning_
static HepMC::HEPEVT_Wrapper wrapper
signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> postModuleDelayedGetSignal_
virtual bool unscheduledFill(std::string const &moduleLabel, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const override
bool productUnavailable() const
Definition: ProductHolder.h:72