CMS 3D CMS Logo

Principal.cc
Go to the documentation of this file.
1 
5 
14 #include "ProductResolvers.h"
20 
22 
23 #include <algorithm>
24 #include <cstring>
25 #include <limits>
26 #include <sstream>
27 #include <stdexcept>
28 #include <typeinfo>
29 #include <atomic>
30 
31 namespace edm {
32 
34 
35  static std::string appendCurrentProcessIfAlias(std::string const& processFromInputTag,
36  std::string const& currentProcess) {
37  if (processFromInputTag == InputTag::kCurrentProcess) {
38  std::string returnValue = processFromInputTag;
39  returnValue += " (";
40  returnValue += currentProcess;
41  returnValue += ")";
42  return returnValue;
43  }
44  return processFromInputTag;
45  }
46 
47  static void throwProductNotFoundException(char const* where, errors::ErrorCodes error, BranchID const& bid) {
48  throw Exception(error, "InvalidID") << "Principal::" << where << ": no product with given branch id: " << bid
49  << "\n";
50  }
51 
52  static std::shared_ptr<cms::Exception> makeNotFoundException(char const* where,
53  KindOfType kindOfType,
54  TypeID const& productType,
55  std::string const& label,
56  std::string const& instance,
57  std::string const& process) {
58  std::shared_ptr<cms::Exception> exception = std::make_shared<Exception>(errors::ProductNotFound);
59  if (kindOfType == PRODUCT_TYPE) {
60  *exception << "Principal::" << where
61  << ": Found zero products matching all criteria\nLooking for type: " << productType << "\n"
62  << "Looking for module label: " << label << "\n"
63  << "Looking for productInstanceName: " << instance << "\n"
64  << (process.empty() ? "" : "Looking for process: ") << process << "\n";
65  } else {
66  *exception << "Principal::" << where
67  << ": Found zero products matching all criteria\nLooking for a container with elements of type: "
68  << productType << "\n"
69  << "Looking for module label: " << label << "\n"
70  << "Looking for productInstanceName: " << instance << "\n"
71  << (process.empty() ? "" : "Looking for process: ") << process << "\n";
72  }
73  return exception;
74  }
75 
76  static void throwAmbiguousException(const char* where,
77  TypeID const& productType,
78  std::string const& label,
79  std::string const& instance,
80  std::string const& process) {
81  cms::Exception exception("AmbiguousProduct");
82  exception << "Principal::" << where
83  << ": More than 1 product matches all criteria\nLooking for type: " << productType << "\n"
84  << "Looking for module label: " << label << "\n"
85  << "Looking for productInstanceName: " << instance << "\n"
86  << (process.empty() ? "" : "Looking for process: ") << process << "\n"
87  << "This can only occur with get function calls using a Handle<View> argument.\n"
88  << "Try a get not using a View or change the instance name of one of the products";
89  throw exception;
90  }
91 
92  namespace {
93  void failedToRegisterConsumesMany(edm::TypeID const& iType) {
94  cms::Exception exception("GetManyWithoutRegistration");
95  exception << "::getManyByType called for " << iType
96  << " without a corresponding consumesMany being called for this module. \n";
97  throw exception;
98  }
99 
100  void failedToRegisterConsumes(KindOfType kindOfType,
101  TypeID const& productType,
102  std::string const& moduleLabel,
103  std::string const& productInstanceName,
104  std::string const& processName) {
105  cms::Exception exception("GetByLabelWithoutRegistration");
106  exception << "::getByLabel without corresponding call to consumes or mayConsumes for this module.\n"
107  << (kindOfType == PRODUCT_TYPE ? " type: " : " type: edm::View<") << productType
108  << (kindOfType == PRODUCT_TYPE ? "\n module label: " : ">\n module label: ") << moduleLabel
109  << "\n product instance name: '" << productInstanceName << "'\n process name: '" << processName
110  << "'\n";
111  throw exception;
112  }
113  } // namespace
114 
115  //0 means unset
116  static std::atomic<Principal::CacheIdentifier_t> s_nextIdentifier{1};
118  return s_nextIdentifier.fetch_add(1, std::memory_order_acq_rel);
119  }
120 
121  Principal::Principal(std::shared_ptr<ProductRegistry const> reg,
122  std::shared_ptr<ProductResolverIndexHelper const> productLookup,
123  ProcessConfiguration const& pc,
124  BranchType bt,
125  HistoryAppender* historyAppender,
126  bool isForPrimaryProcess)
127  : EDProductGetter(),
128  processHistoryPtr_(),
129  processHistoryID_(),
130  processHistoryIDBeforeConfig_(),
131  processConfiguration_(&pc),
132  productResolvers_(),
133  preg_(reg),
134  productLookup_(productLookup),
135  lookupProcessOrder_(productLookup->lookupProcessNames().size(), 0),
136  reader_(),
137  branchType_(bt),
138  historyAppender_(historyAppender),
139  cacheIdentifier_(nextIdentifier()) {
140  productResolvers_.resize(reg->getNextIndexValue(bt));
141  //Now that these have been set, we can create the list of Branches we need.
142  std::string const source("source");
143  ProductRegistry::ProductList const& prodsList = reg->productList();
144  // The constructor of an alias product holder takes as an argument the product holder for which it is an alias.
145  // So, the non-alias product holders must be created first.
146  // Therefore, on this first pass, skip current EDAliases.
147  bool hasAliases = false;
148  bool hasSwitchAliases = false;
149  for (auto const& prod : prodsList) {
150  BranchDescription const& bd = prod.second;
151  if (bd.branchType() == branchType_) {
152  if (isForPrimaryProcess or bd.processName() == pc.processName()) {
153  if (bd.isAlias()) {
154  hasAliases = true;
155  } else if (bd.isSwitchAlias()) {
156  hasSwitchAliases = true;
157  } else {
158  auto cbd = std::make_shared<BranchDescription const>(bd);
159  if (bd.produced()) {
160  if (bd.moduleLabel() == source) {
161  addSourceProduct(cbd);
162  } else if (bd.onDemand()) {
165  } else {
166  addScheduledProduct(cbd);
167  }
168  } else {
169  addInputProduct(cbd);
170  }
171  }
172  } else {
173  //We are in a SubProcess and this branch is from the parent
174  auto cbd = std::make_shared<BranchDescription const>(bd);
176  }
177  }
178  }
179  // Now process any EDAliases
180  if (hasAliases) {
181  for (auto const& prod : prodsList) {
182  BranchDescription const& bd = prod.second;
183  if (bd.isAlias() && bd.branchType() == branchType_) {
184  addAliasedProduct(std::make_shared<BranchDescription const>(bd));
185  }
186  }
187  }
188  // Finally process any SwitchProducer aliases
189  if (hasSwitchAliases) {
190  for (auto const& prod : prodsList) {
191  BranchDescription const& bd = prod.second;
192  if (bd.isSwitchAlias() && bd.branchType() == branchType_) {
194  auto cbd = std::make_shared<BranchDescription const>(bd);
195  // Need different implementation for SwitchProducers not
196  // in any Path (onDemand) and for those in a Path in order
197  // to prevent the switch-aliased-for EDProducers from
198  // being run when the SwitchProducer is in a Path after a
199  // failing EDFilter.
200  if (bd.onDemand()) {
202  } else {
204  }
205  }
206  }
207  }
208 
209  // Now create the ProductResolvers that search in reverse process
210  // order and are used for queries where the process name is the
211  // empty string
212  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
213  std::vector<ProductResolverIndex> matchingHolders(lookupProcessNames.size(), ProductResolverIndexInvalid);
214  std::vector<bool> ambiguous(lookupProcessNames.size(), false);
215  unsigned int beginElements = productLookup_->beginElements();
216  std::vector<TypeID> const& sortedTypeIDs = productLookup_->sortedTypeIDs();
217  std::vector<ProductResolverIndexHelper::Range> const& ranges = productLookup_->ranges();
218  std::vector<ProductResolverIndexHelper::IndexAndNames> const& indexAndNames = productLookup_->indexAndNames();
219  std::vector<char> const& processNamesCharArray = productLookup_->processNames();
220 
221  unsigned int numberOfMatches = 0;
223  if (!sortedTypeIDs.empty()) {
224  ProductResolverIndex productResolverIndex = ProductResolverIndexInvalid;
225  for (unsigned int k = 0, kEnd = sortedTypeIDs.size(); k < kEnd; ++k) {
227  for (unsigned int i = range.begin(); i < range.end(); ++i) {
228  ProductResolverIndexHelper::IndexAndNames const& product = indexAndNames.at(i);
229  if (product.startInProcessNames() == 0) {
230  if (productResolverIndex != ProductResolverIndexInvalid) {
231  if ((numberOfMatches == 1) and (lastMatchIndex != ProductResolverIndexAmbiguous)) {
232  //only one choice so use a special resolver
233  productResolvers_.at(productResolverIndex) =
234  std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
235  } else {
236  bool productMadeAtEnd = false;
237  //Need to know if the product from this processes is added at end of transition
238  for (unsigned int j = 0; j < matchingHolders.size(); ++j) {
239  if ((not ambiguous[j]) and ProductResolverIndexInvalid != matchingHolders[j] and
240  productResolvers_[matchingHolders[j]]->branchDescription().availableOnlyAtEndTransition()) {
241  productMadeAtEnd = true;
242  break;
243  }
244  }
245  std::shared_ptr<ProductResolverBase> newHolder =
246  std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous, productMadeAtEnd);
247  productResolvers_.at(productResolverIndex) = newHolder;
248  }
249  matchingHolders.assign(lookupProcessNames.size(), ProductResolverIndexInvalid);
250  ambiguous.assign(lookupProcessNames.size(), false);
251  numberOfMatches = 0;
252  lastMatchIndex = ProductResolverIndexInvalid;
253  }
254  productResolverIndex = product.index();
255  } else {
256  std::string process(&processNamesCharArray.at(product.startInProcessNames()));
257  auto iter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), process);
258  assert(iter != lookupProcessNames.end());
259  ProductResolverIndex iMatchingIndex = product.index();
260  lastMatchIndex = iMatchingIndex;
261  assert(iMatchingIndex != ProductResolverIndexInvalid);
262  ++numberOfMatches;
263  if (iMatchingIndex == ProductResolverIndexAmbiguous) {
264  assert(k >= beginElements);
265  ambiguous.at(iter - lookupProcessNames.begin()) = true;
266  } else {
267  matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
268  }
269  }
270  }
271  }
272  //Need to know if the product from this processes is added at end of transition
273  if ((numberOfMatches == 1) and (lastMatchIndex != ProductResolverIndexAmbiguous)) {
274  //only one choice so use a special resolver
275  productResolvers_.at(productResolverIndex) =
276  std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
277  } else {
278  bool productMadeAtEnd = false;
279  for (unsigned int i = 0; i < matchingHolders.size(); ++i) {
280  if ((not ambiguous[i]) and ProductResolverIndexInvalid != matchingHolders[i] and
281  productResolvers_[matchingHolders[i]]->branchDescription().availableOnlyAtEndTransition()) {
282  productMadeAtEnd = true;
283  break;
284  }
285  }
286  std::shared_ptr<ProductResolverBase> newHolder =
287  std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous, productMadeAtEnd);
288  productResolvers_.at(productResolverIndex) = newHolder;
289  }
290  }
291  }
292 
294 
295  // Number of products in the Principal.
296  // For products in an input file and not yet read in due to delayed read,
297  // this routine assumes a real product is there.
298  size_t Principal::size() const {
299  size_t size = 0U;
300  for (auto const& prod : *this) {
301  if (prod->singleProduct() && // Not a NoProcessProductResolver
302  !prod->productUnavailable() && !prod->unscheduledWasNotRun() && !prod->branchDescription().dropped()) {
303  ++size;
304  }
305  }
306  return size;
307  }
308 
309  // adjust provenance for input products after new input file has been merged
311  ProductRegistry::ProductList const& prodsList = reg.productList();
312  for (auto const& prod : prodsList) {
313  BranchDescription const& bd = prod.second;
314  if (!bd.produced() && (bd.branchType() == branchType_)) {
315  auto cbd = std::make_shared<BranchDescription const>(bd);
316  auto phb = getExistingProduct(cbd->branchID());
317  if (phb == nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
318  return false;
319  }
320  phb->resetBranchDescription(cbd);
321  }
322  }
323  return true;
324  }
325 
326  void Principal::addScheduledProduct(std::shared_ptr<BranchDescription const> bd) {
327  auto phb = std::make_unique<PuttableProductResolver>(std::move(bd));
329  }
330 
331  void Principal::addSourceProduct(std::shared_ptr<BranchDescription const> bd) {
332  auto phb = std::make_unique<PuttableProductResolver>(std::move(bd));
334  }
335 
336  void Principal::addInputProduct(std::shared_ptr<BranchDescription const> bd) {
337  addProductOrThrow(std::make_unique<InputProductResolver>(std::move(bd)));
338  }
339 
340  void Principal::addUnscheduledProduct(std::shared_ptr<BranchDescription const> bd) {
341  addProductOrThrow(std::make_unique<UnscheduledProductResolver>(std::move(bd)));
342  }
343 
344  void Principal::addAliasedProduct(std::shared_ptr<BranchDescription const> bd) {
345  ProductResolverIndex index = preg_->indexFrom(bd->originalBranchID());
347 
348  addProductOrThrow(std::make_unique<AliasProductResolver>(
349  std::move(bd), dynamic_cast<DataManagingOrAliasProductResolver&>(*productResolvers_[index])));
350  }
351 
352  void Principal::addSwitchProducerProduct(std::shared_ptr<BranchDescription const> bd) {
353  ProductResolverIndex index = preg_->indexFrom(bd->switchAliasForBranchID());
355 
356  addProductOrThrow(std::make_unique<SwitchProducerProductResolver>(
357  std::move(bd), dynamic_cast<DataManagingOrAliasProductResolver&>(*productResolvers_[index])));
358  }
359 
360  void Principal::addSwitchAliasProduct(std::shared_ptr<BranchDescription const> bd) {
361  ProductResolverIndex index = preg_->indexFrom(bd->switchAliasForBranchID());
363 
364  addProductOrThrow(std::make_unique<SwitchAliasProductResolver>(
365  std::move(bd), dynamic_cast<DataManagingOrAliasProductResolver&>(*productResolvers_[index])));
366  }
367 
368  void Principal::addParentProcessProduct(std::shared_ptr<BranchDescription const> bd) {
369  addProductOrThrow(std::make_unique<ParentProcessProductResolver>(std::move(bd)));
370  }
371 
372  // "Zero" the principal so it can be reused for another Event.
374  //We do not clear the product history information
375  // because it rarely changes and recalculating takes
376  // time.
377  reader_ = nullptr;
378  for (auto& prod : *this) {
379  prod->resetProductData();
380  }
381  }
382 
383  void Principal::deleteProduct(BranchID const& id) const {
384  auto phb = getExistingProduct(id);
385  assert(nullptr != phb);
386  phb->unsafe_deleteProduct();
387  }
388 
390  applyToResolvers([&iConfigure](ProductResolverBase* iResolver) { iResolver->setupUnscheduled(iConfigure); });
391  }
392 
393  // Set the principal for the Event, Lumi, or Run.
395  ProcessHistory const* processHistory,
397  //increment identifier here since clearPrincipal isn't called for Run/Lumi
399  if (reader) {
400  reader_ = reader;
401  }
402 
403  if (historyAppender_ && productRegistry().anyProductProduced()) {
408  }
409  } else {
410  std::shared_ptr<ProcessHistory const> inputProcessHistory;
412  if (hist.isValid()) {
413  //does not own the pointer
414  auto noDel = [](void const*) {};
415  inputProcessHistory = std::shared_ptr<ProcessHistory const>(processHistory, noDel);
416  if (inputProcessHistory.get() == nullptr) {
417  throw Exception(errors::LogicError) << "Principal::fillPrincipal\n"
418  << "Input ProcessHistory not found in registry\n"
419  << "Contact a Framework developer\n";
420  }
421  } else {
422  //Since this is static we don't want it deleted
423  inputProcessHistory = std::shared_ptr<ProcessHistory const>(&s_emptyProcessHistory, [](void const*) {});
424  //no need to do any ordering since it is empty
426  }
428  processHistoryPtr_ = inputProcessHistory;
430  }
431  }
432 
434  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
435  lookupProcessOrder_.assign(lookupProcessNames.size(), 0);
436  unsigned int k = 0;
437 
438  // We loop over processes in reverse order of the ProcessHistory.
439  // If any entries in the product lookup tables are associated with
440  // the process we add it to the vector of processes in the order
441  // the lookup should be performed. There is one exception though,
442  // We start with the current process even if it is not in the ProcessHistory.
443  // The current process might be needed but not be in the process
444  // history if all the products produced in the current process are
445  // transient.
446  {
447  auto nameIterCurrentProcess =
448  std::find(lookupProcessNames.begin(), lookupProcessNames.end(), processConfiguration_->processName());
449  if (nameIterCurrentProcess != lookupProcessNames.end()) {
450  lookupProcessOrder_.at(k) = nameIterCurrentProcess - lookupProcessNames.begin();
451  ++k;
452  }
453  }
454 
455  // We just looked for the current process so skip it if
456  // it is in the ProcessHistory.
457  auto iter = processHistoryPtr_->rbegin();
458  if (iter->processName() == processConfiguration_->processName()) {
459  ++iter;
460  }
461 
462  for (auto iEnd = processHistoryPtr_->rend(); iter != iEnd; ++iter) {
463  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
464  if (nameIter == lookupProcessNames.end()) {
465  continue;
466  }
467  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
468  ++k;
469  }
471  }
472  }
473 
475  return const_cast<ProductResolverBase*>(const_cast<const Principal*>(this)->getExistingProduct(branchID));
476  }
477 
479  ProductResolverIndex index = preg_->indexFrom(branchID);
481  return productResolvers_.at(index).get();
482  }
483 
485  auto phb = getExistingProduct(productResolver.branchDescription().branchID());
486  if (nullptr != phb && BranchKey(productResolver.branchDescription()) != BranchKey(phb->branchDescription())) {
487  BranchDescription const& newProduct = phb->branchDescription();
488  BranchDescription const& existing = productResolver.branchDescription();
489  if (newProduct.branchName() != existing.branchName() && newProduct.branchID() == existing.branchID()) {
490  throw cms::Exception("HashCollision")
491  << "Principal::getExistingProduct\n"
492  << " Branch " << newProduct.branchName() << " has same branch ID as branch " << existing.branchName()
493  << "\n"
494  << "Workaround: change process name or product instance name of " << newProduct.branchName() << "\n";
495  } else {
496  assert(nullptr == phb || BranchKey(productResolver.branchDescription()) == BranchKey(phb->branchDescription()));
497  }
498  }
499  return phb;
500  }
501 
502  void Principal::addProduct_(std::unique_ptr<ProductResolverBase> productResolver) {
503  BranchDescription const& bd = productResolver->branchDescription();
504  assert(!bd.className().empty());
505  assert(!bd.friendlyClassName().empty());
506  assert(!bd.moduleLabel().empty());
507  assert(!bd.processName().empty());
508  SharedProductPtr phb(productResolver.release());
509 
510  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
512  productResolvers_[index] = phb;
513  }
514 
515  void Principal::addProductOrThrow(std::unique_ptr<ProductResolverBase> productResolver) {
516  ProductResolverBase const* phb = getExistingProduct(*productResolver);
517  if (phb != nullptr) {
518  BranchDescription const& bd = productResolver->branchDescription();
519  throw Exception(errors::InsertFailure, "AlreadyPresent")
520  << "addProductOrThrow: Problem found while adding product, "
521  << "product already exists for (" << bd.friendlyClassName() << "," << bd.moduleLabel() << ","
522  << bd.productInstanceName() << "," << bd.processName() << ")\n";
523  }
524  addProduct_(std::move(productResolver));
525  }
526 
528  ProductResolverIndex index = preg_->indexFrom(bid);
530  return ConstProductResolverPtr();
531  }
533  }
534 
537  return phb;
538  }
539 
541  TypeID const& typeID,
542  InputTag const& inputTag,
543  EDConsumerBase const* consumer,
545  ModuleCallingContext const* mcc) const {
546  ProductData const* result = findProductByLabel(kindOfType, typeID, inputTag, consumer, sra, mcc);
547  if (result == nullptr) {
548  return BasicHandle(makeHandleExceptionFactory([=]() -> std::shared_ptr<cms::Exception> {
549  return makeNotFoundException(
550  "getByLabel",
551  kindOfType,
552  typeID,
553  inputTag.label(),
554  inputTag.instance(),
556  }));
557  }
558  return BasicHandle(result->wrapper(), &(result->provenance()));
559  }
560 
562  TypeID const& typeID,
563  std::string const& label,
564  std::string const& instance,
565  std::string const& process,
566  EDConsumerBase const* consumer,
568  ModuleCallingContext const* mcc) const {
569  ProductData const* result = findProductByLabel(kindOfType, typeID, label, instance, process, consumer, sra, mcc);
570  if (result == nullptr) {
571  return BasicHandle(makeHandleExceptionFactory([=]() -> std::shared_ptr<cms::Exception> {
572  return makeNotFoundException("getByLabel", kindOfType, typeID, label, instance, process);
573  }));
574  }
575  return BasicHandle(result->wrapper(), &(result->provenance()));
576  }
577 
579  TypeID const&,
581  bool skipCurrentProcess,
582  bool& ambiguous,
584  ModuleCallingContext const* mcc) const {
586  auto& productResolver = productResolvers_[index];
587  assert(nullptr != productResolver.get());
588  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
589  if (resolution.isAmbiguous()) {
590  ambiguous = true;
591  //The caller is looking explicitly for this case
592  // and uses the extra data at the caller to setup the exception
593  return BasicHandle::makeInvalid();
594  }
595  auto productData = resolution.data();
596  if (productData == nullptr) {
597  //The caller is looking explicitly for this case
598  // and uses the extra data at the caller to setup the exception
599  return BasicHandle::makeInvalid();
600  }
601  return BasicHandle(productData->wrapper(), &(productData->provenance()));
602  }
603 
606  bool skipCurrentProcess,
607  ServiceToken const& token,
608  ModuleCallingContext const* mcc) const {
609  auto const& productResolver = productResolvers_.at(index);
610  assert(nullptr != productResolver.get());
611  productResolver->prefetchAsync(task, *this, skipCurrentProcess, token, nullptr, mcc);
612  }
613 
614  void Principal::getManyByType(TypeID const& typeID,
616  EDConsumerBase const* consumer,
618  ModuleCallingContext const* mcc) const {
619  assert(results.empty());
620 
621  if (UNLIKELY(consumer and (not consumer->registeredToConsumeMany(typeID, branchType())))) {
622  failedToRegisterConsumesMany(typeID);
623  }
624 
625  // This finds the indexes to all the ProductResolver's matching the type
627 
628  if (matches.numberOfMatches() == 0) {
629  return;
630  }
631 
632  results.reserve(matches.numberOfMatches());
633 
634  // Loop over the ProductResolvers. Add the products that are actually
635  // present into the results. This will also trigger delayed reading,
636  // on demand production, and check for deleted products as appropriate.
637 
638  // Over the years the code that uses getManyByType has grown to depend
639  // on the ordering of the results. The order originally was just an
640  // accident of how previous versions of the code were written, but
641  // here we have to go through some extra effort to preserve that ordering.
642 
643  // We build a list of holders that match a particular label and instance.
644  // When that list is complete we call findProducts, which loops over
645  // that list in reverse order of the ProcessHistory (starts with the
646  // most recent). Then we clear the list and repeat this until all the
647  // matching label and instance subsets have been dealt with.
648 
649  // Note that the function isFullyResolved returns true for the ProductResolvers
650  // that are associated with an empty process name. Those are the ones that
651  // know how to search for the most recent process name matching
652  // a label and instance. We do not need these for getManyByType and
653  // skip them. In addition to skipping them, we make use of the fact
654  // that they mark the beginning of each subset of holders with the same
655  // label and instance. They tell us when to call findProducts.
656 
657  std::vector<ProductResolverBase const*> holders;
658 
659  for (unsigned int i = 0; i < matches.numberOfMatches(); ++i) {
661 
662  if (!matches.isFullyResolved(i)) {
663  if (!holders.empty()) {
664  // Process the ones with a particular module label and instance
665  findProducts(holders, typeID, results, sra, mcc);
666  holders.clear();
667  }
668  } else {
669  ProductResolverBase const* productResolver = productResolvers_.at(index).get();
670  assert(productResolver);
671  holders.push_back(productResolver);
672  }
673  }
674  // Do not miss the last subset of products
675  if (!holders.empty()) {
676  findProducts(holders, typeID, results, sra, mcc);
677  }
678  return;
679  }
680 
681  void Principal::findProducts(std::vector<ProductResolverBase const*> const& holders,
682  TypeID const&,
685  ModuleCallingContext const* mcc) const {
686  for (auto iter = processHistoryPtr_->rbegin(), iEnd = processHistoryPtr_->rend(); iter != iEnd; ++iter) {
687  std::string const& process = iter->processName();
688  for (auto productResolver : holders) {
689  BranchDescription const& bd = productResolver->branchDescription();
690  if (process == bd.processName()) {
691  // Ignore aliases to avoid matching the same product multiple times.
692  if (bd.isAnyAlias()) {
693  continue;
694  }
695 
696  ProductData const* productData = productResolver->resolveProduct(*this, false, sra, mcc).data();
697  if (productData) {
698  // Skip product if not available.
699  results.emplace_back(productData->wrapper(), &(productData->provenance()));
700  }
701  }
702  }
703  }
704  }
705 
707  TypeID const& typeID,
708  InputTag const& inputTag,
709  EDConsumerBase const* consumer,
711  ModuleCallingContext const* mcc) const {
712  bool skipCurrentProcess = inputTag.willSkipCurrentProcess();
713 
715 
717  char const* processName = inputTag.process().c_str();
718  if (skipCurrentProcess) {
719  processName = "\0";
720  } else if (inputTag.process() == InputTag::kCurrentProcess) {
722  }
723 
724  index =
725  productLookup().index(kindOfType, typeID, inputTag.label().c_str(), inputTag.instance().c_str(), processName);
726 
728  throwAmbiguousException("findProductByLabel",
729  typeID,
730  inputTag.label(),
731  inputTag.instance(),
733  } else if (index == ProductResolverIndexInvalid) {
734  return nullptr;
735  }
736  inputTag.tryToCacheIndex(index, typeID, branchType(), &productRegistry());
737  }
738  if (UNLIKELY(consumer and (not consumer->registeredToConsume(index, skipCurrentProcess, branchType())))) {
739  failedToRegisterConsumes(kindOfType,
740  typeID,
741  inputTag.label(),
742  inputTag.instance(),
744  }
745 
746  auto const& productResolver = productResolvers_[index];
747 
748  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
749  if (resolution.isAmbiguous()) {
750  throwAmbiguousException("findProductByLabel",
751  typeID,
752  inputTag.label(),
753  inputTag.instance(),
755  }
756  return resolution.data();
757  }
758 
760  TypeID const& typeID,
761  std::string const& label,
762  std::string const& instance,
763  std::string const& process,
764  EDConsumerBase const* consumer,
766  ModuleCallingContext const* mcc) const {
768  productLookup().index(kindOfType, typeID, label.c_str(), instance.c_str(), process.c_str());
769 
771  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
772  } else if (index == ProductResolverIndexInvalid) {
773  return nullptr;
774  }
775 
776  if (UNLIKELY(consumer and (not consumer->registeredToConsume(index, false, branchType())))) {
777  failedToRegisterConsumes(kindOfType, typeID, label, instance, process);
778  }
779 
780  auto const& productResolver = productResolvers_[index];
781 
782  auto resolution = productResolver->resolveProduct(*this, false, sra, mcc);
783  if (resolution.isAmbiguous()) {
784  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
785  }
786  return resolution.data();
787  }
788 
790  InputTag const& tag,
791  ModuleCallingContext const* mcc) const {
792  ProductData const* productData = findProductByLabel(PRODUCT_TYPE, typeID, tag, nullptr, nullptr, mcc);
793  return productData;
794  }
795 
798  if (phb == nullptr) {
800  }
801 
802  if (phb->unscheduledWasNotRun()) {
803  if (not phb->resolveProduct(*this, false, nullptr, mcc).data()) {
804  throwProductNotFoundException("getProvenance(onDemand)", errors::ProductNotFound, bid);
805  }
806  }
807  return *phb->provenance();
808  }
809 
810  // This one is mostly for test printout purposes
811  // No attempt to trigger on demand execution
812  // Skips provenance when the EDProduct is not there
813  void Principal::getAllProvenance(std::vector<Provenance const*>& provenances) const {
814  provenances.clear();
815  for (auto const& productResolver : *this) {
816  if (productResolver->singleProduct() && productResolver->provenanceAvailable() &&
817  !productResolver->branchDescription().isAnyAlias()) {
818  // We do not attempt to get the event/lumi/run status from the provenance,
819  // because the per event provenance may have been dropped.
820  if (productResolver->provenance()->branchDescription().present()) {
821  provenances.push_back(productResolver->provenance());
822  }
823  }
824  }
825  }
826 
827  // This one is also mostly for test printout purposes
828  // No attempt to trigger on demand execution
829  // Skips provenance for dropped branches.
830  void Principal::getAllStableProvenance(std::vector<StableProvenance const*>& provenances) const {
831  provenances.clear();
832  for (auto const& productResolver : *this) {
833  if (productResolver->singleProduct() && !productResolver->branchDescription().isAnyAlias()) {
834  if (productResolver->stableProvenance()->branchDescription().present()) {
835  provenances.push_back(productResolver->stableProvenance());
836  }
837  }
838  }
839  }
840 
841  void Principal::recombine(Principal& other, std::vector<BranchID> const& bids) {
842  for (auto& prod : bids) {
843  ProductResolverIndex index = preg_->indexFrom(prod);
845  ProductResolverIndex indexO = other.preg_->indexFrom(prod);
847  get_underlying_safe(productResolvers_[index]).swap(get_underlying_safe(other.productResolvers_[indexO]));
848  }
849  reader_->mergeReaders(other.reader());
850  }
851 
852  WrapperBase const* Principal::getIt(ProductID const&) const {
853  assert(false);
854  return nullptr;
855  }
856 
857  WrapperBase const* Principal::getThinnedProduct(ProductID const&, unsigned int&) const {
858  assert(false);
859  return nullptr;
860  }
861 
863  std::vector<WrapperBase const*>&,
864  std::vector<unsigned int>&) const {
865  assert(false);
866  }
867 
868  void Principal::putOrMerge(std::unique_ptr<WrapperBase> prod, ProductResolverBase const* phb) const {
870  }
871 
872  void Principal::putOrMerge(BranchDescription const& bd, std::unique_ptr<WrapperBase> edp) const {
873  if (edp.get() == nullptr) {
874  throw edm::Exception(edm::errors::InsertFailure, "Null Pointer")
875  << "put: Cannot put because unique_ptr to product is null."
876  << "\n";
877  }
878  auto phb = getExistingProduct(bd.branchID());
879  assert(phb);
880  // ProductResolver assumes ownership
881  putOrMerge(std::move(edp), phb);
882  }
883 
885  if (preg_->getNextIndexValue(branchType_) != productResolvers_.size()) {
886  bool changed = false;
887  productResolvers_.resize(preg_->getNextIndexValue(branchType_));
888  for (auto const& prod : preg_->productList()) {
889  BranchDescription const& bd = prod.second;
890  if (bd.branchType() == branchType_) {
891  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
893  if (!productResolvers_[index]) {
894  // no product holder. Must add one. The new entry must be an input product holder.
895  assert(!bd.produced());
896  auto cbd = std::make_shared<BranchDescription const>(bd);
897  addInputProduct(cbd);
898  changed = true;
899  }
900  }
901  }
902  if (changed) {
903  changedIndexes_();
904  }
905  }
906  assert(preg_->getNextIndexValue(branchType_) == productResolvers_.size());
907  }
908 
910  if (not reader()) {
911  return;
912  }
913 
914  for (auto& prod : *this) {
915  prod->retrieveAndMerge(*this, mergeableRunProductMetadata);
916  }
917  }
918 } // namespace edm
Likely.h
edm::SharedResourcesAcquirer
Definition: SharedResourcesAcquirer.h:34
edm::source
static const std::string source("source")
diffTwoXMLs.ranges
string ranges
Definition: diffTwoXMLs.py:79
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
edm::InputTag::kCurrentProcess
static const std::string kCurrentProcess
Definition: InputTag.h:54
ProductResolverIndexHelper.h
edm::ProductResolverIndex
unsigned int ProductResolverIndex
Definition: ProductResolverIndex.h:8
mps_fire.i
i
Definition: mps_fire.py:355
edm::appendCurrentProcessIfAlias
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const &currentProcess)
Definition: Principal.cc:35
edm::Principal::findProducts
void findProducts(std::vector< ProductResolverBase const * > const &holders, TypeID const &typeID, BasicHandleVec &results, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:681
MessageLogger.h
edm::ProductResolverBase::putOrMergeProduct
void putOrMergeProduct(std::unique_ptr< WrapperBase > edp, MergeableRunProductMetadata const *mergeableRunProductMetadata=nullptr) const
Definition: ProductResolverBase.h:166
FunctorHandleExceptionFactory.h
edm::PRODUCT_TYPE
Definition: ProductKindOfType.h:5
edm::BasicHandle
Definition: BasicHandle.h:43
edm::errors::LogicError
Definition: EDMException.h:37
edm::s_nextIdentifier
static std::atomic< Principal::CacheIdentifier_t > s_nextIdentifier
Definition: Principal.cc:116
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::Principal::readAllFromSourceAndMergeImmediately
void readAllFromSourceAndMergeImmediately(MergeableRunProductMetadata const *mergeableRunProductMetadata=nullptr)
Definition: Principal.cc:909
edm::ProductData::wrapper
WrapperBase const * wrapper() const
Definition: ProductData.h:35
deep_tau::DeepTauBase::BasicDiscriminator
BasicDiscriminator
Definition: DeepTauBase.h:115
edm::Principal::adjustToNewProductRegistry
bool adjustToNewProductRegistry(ProductRegistry const &reg)
Definition: Principal.cc:310
ProductResolverIndex.h
edm::ProductResolverIndexHelper::Range
Definition: ProductResolverIndexHelper.h:198
edm::Principal::ConstProductResolverPtr
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
edm::Principal::findProductByTag
ProductData const * findProductByTag(TypeID const &typeID, InputTag const &tag, ModuleCallingContext const *mcc) const
Definition: Principal.cc:789
dqmPostProcessing_online.existing
existing
Definition: dqmPostProcessing_online.py:126
cms::cuda::assert
assert(be >=bs)
TypeID.h
edm::Principal
Definition: Principal.h:57
edm::ProductResolverIndexHelper::index
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=nullptr) const
Definition: ProductResolverIndexHelper.cc:81
bookConverter.results
results
Definition: bookConverter.py:144
edm::errors::ErrorCodes
ErrorCodes
Definition: EDMException.h:22
DelayedReader.h
ProductRegistry.h
edm::Principal::addSwitchProducerProduct
void addSwitchProducerProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:352
edm::ProductResolverIndexHelper::relatedIndexes
Matches relatedIndexes(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance) const
Definition: ProductResolverIndexHelper.cc:142
edm::Principal::processHistory
ProcessHistory const & processHistory() const
Definition: Principal.h:139
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
relativeConstraints.error
error
Definition: relativeConstraints.py:53
edm::Principal::recombine
void recombine(Principal &other, std::vector< BranchID > const &bids)
Definition: Principal.cc:841
edm::ProductResolverIndexHelper::Matches
Definition: ProductResolverIndexHelper.h:127
edm::DelayedReader::mergeReaders
void mergeReaders(DelayedReader *other)
Definition: DelayedReader.h:36
edm::Principal::getProductResolverByIndex
ConstProductResolverPtr getProductResolverByIndex(ProductResolverIndex const &oid) const
Definition: Principal.cc:535
edm::BranchType
BranchType
Definition: BranchType.h:11
edm::ProductData::provenance
Provenance const & provenance() const
Definition: ProductData.h:33
edm::Principal::addParentProcessProduct
void addParentProcessProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:368
edm::Principal::adjustIndexesAfterProductRegistryAddition
void adjustIndexesAfterProductRegistryAddition()
Definition: Principal.cc:884
edm::Principal::addScheduledProduct
void addScheduledProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:326
edm::Principal::fillPrincipal
void fillPrincipal(ProcessHistoryID const &hist, ProcessHistory const *phr, DelayedReader *reader)
Definition: Principal.cc:394
edm::makeHandleExceptionFactory
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
Definition: FunctorHandleExceptionFactory.h:45
edm::ProductRegistry
Definition: ProductRegistry.h:34
EDMException.h
edm::EDProductGetter
Definition: EDProductGetter.h:32
edm::Principal::getProvenance
Provenance getProvenance(BranchID const &bid, ModuleCallingContext const *mcc) const
Definition: Principal.cc:796
edm::errors::ProductNotFound
Definition: EDMException.h:33
edm::ServiceToken
Definition: ServiceToken.h:40
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
edm::EDConsumerBase
Definition: EDConsumerBase.h:62
edm::Principal::getThinnedProducts
void getThinnedProducts(ProductID const &, std::vector< WrapperBase const * > &, std::vector< unsigned int > &) const override
Definition: Principal.cc:862
edm::Principal::getAllProvenance
void getAllProvenance(std::vector< Provenance const * > &provenances) const
Definition: Principal.cc:813
ProcessConfiguration.h
compare.hist
hist
Definition: compare.py:376
GlobalPosition_Frontier_DevDB_cff.tag
tag
Definition: GlobalPosition_Frontier_DevDB_cff.py:11
DQM.reader
reader
Definition: DQM.py:105
edm::ProductResolverIndexHelper::IndexAndNames
Definition: ProductResolverIndexHelper.h:209
edm::BranchID
Definition: BranchID.h:14
edm::Principal::reader
DelayedReader * reader() const
Definition: Principal.h:185
TrackValidation_cff.task
task
Definition: TrackValidation_cff.py:252
dumpMFGeometry_cfg.prod
prod
Definition: dumpMFGeometry_cfg.py:24
edm::Principal::getAllStableProvenance
void getAllStableProvenance(std::vector< StableProvenance const * > &provenances) const
Definition: Principal.cc:830
edm::Principal::BasicHandleVec
std::vector< BasicHandle > BasicHandleVec
Definition: Principal.h:64
edm::Principal::branchType
BranchType const & branchType() const
Definition: Principal.h:179
edm::Principal::processHistoryIDBeforeConfig_
ProcessHistoryID processHistoryIDBeforeConfig_
Definition: Principal.h:265
edm::MergeableRunProductMetadata
Definition: MergeableRunProductMetadata.h:52
L1TObjectsTimingClient_cff.resolution
resolution
Definition: L1TObjectsTimingClient_cff.py:52
edm::errors::InsertFailure
Definition: EDMException.h:35
edm::Principal::CacheIdentifier_t
unsigned long CacheIdentifier_t
Definition: Principal.h:182
edm::Principal::getProductResolver
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:527
edm::Hash< ProcessHistoryType >
trackingPlots.other
other
Definition: trackingPlots.py:1465
edm::InEvent
Definition: BranchType.h:11
edm::Principal::prefetchAsync
void prefetchAsync(WaitingTask *waitTask, ProductResolverIndex index, bool skipCurrentProcess, ServiceToken const &token, ModuleCallingContext const *mcc) const
Definition: Principal.cc:604
dqmdumpme.k
k
Definition: dqmdumpme.py:60
edm::ProcessConfiguration::processName
std::string const & processName() const
Definition: ProcessConfiguration.h:24
edm::Principal::productRegistry
ProductRegistry const & productRegistry() const
Definition: Principal.h:145
mitigatedMETSequence_cff.U
U
Definition: mitigatedMETSequence_cff.py:36
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::Principal::reader_
DelayedReader * reader_
Definition: Principal.h:282
edm::Principal::productLookup
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:147
HistoryAppender.h
Principal.h
edm::get_underlying_safe
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
Definition: get_underlying_safe.h:40
cppFunctionSkipper.exception
exception
Definition: cppFunctionSkipper.py:10
edm::makeNotFoundException
static std::shared_ptr< cms::Exception > makeNotFoundException(char const *where, KindOfType kindOfType, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
Definition: Principal.cc:52
edm::BasicHandle::makeInvalid
static BasicHandle makeInvalid()
Definition: BasicHandle.h:93
edm::ProductRegistry::ProductList
std::map< BranchKey, BranchDescription > ProductList
Definition: ProductRegistry.h:36
EDConsumerBase.h
edm::ProductResolverIndexHelper::IndexAndNames::index
ProductResolverIndex index() const
Definition: ProductResolverIndexHelper.h:213
edm::Principal::processHistoryPtr_
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:262
LaserDQM_cfg.process
process
Definition: LaserDQM_cfg.py:3
edm::Principal::processConfiguration_
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:267
edm::ProductResolverIndexInvalid
Definition: ProductResolverIndex.h:16
edm::Principal::addSwitchAliasProduct
void addSwitchAliasProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:360
edm::Principal::setupUnscheduled
void setupUnscheduled(UnscheduledConfigurator const &)
Definition: Principal.cc:389
edm::Principal::getThinnedProduct
WrapperBase const * getThinnedProduct(ProductID const &, unsigned int &) const override
Definition: Principal.cc:857
edm::WrapperBase
Definition: WrapperBase.h:23
edm::BranchDescription::branchName
std::string const & branchName() const
Definition: BranchDescription.h:119
edm::Principal::getExistingProduct
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:474
edm::Principal::branchType_
BranchType branchType_
Definition: Principal.h:284
edm::UnscheduledConfigurator
Definition: UnscheduledConfigurator.h:32
edm::HistoryAppender
Definition: HistoryAppender.h:13
edm::ProductResolverBase::resetBranchDescription
void resetBranchDescription(std::shared_ptr< BranchDescription const > bd)
Definition: ProductResolverBase.h:116
edm::Principal::clearPrincipal
void clearPrincipal()
Definition: Principal.cc:373
edm::Principal::SharedProductPtr
std::shared_ptr< ProductResolverBase > SharedProductPtr
Definition: Principal.h:67
instance
static PFTauRenderPlugin instance
Definition: PFTauRenderPlugin.cc:70
edm::ProductResolverIndexAmbiguous
Definition: ProductResolverIndex.h:18
SimL1EmulatorRepack_CalouGT_cff.processName
processName
Definition: SimL1EmulatorRepack_CalouGT_cff.py:17
edm::Principal::addAliasedProduct
void addAliasedProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:344
edm::Principal::getByToken
BasicHandle getByToken(KindOfType kindOfType, TypeID const &typeID, ProductResolverIndex index, bool skipCurrentProcess, bool &ambiguous, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:578
edm::Principal::addInputProduct
void addInputProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:336
WrappedClassName.h
edm::WaitingTask
Definition: WaitingTask.h:36
edm::TypeID
Definition: TypeID.h:22
edm::Principal::productResolvers_
ProductResolverCollection productResolvers_
Definition: Principal.h:270
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::ProductResolverBase::branchDescription
BranchDescription const & branchDescription() const
Definition: ProductResolverBase.h:110
edm::ProductRegistry::productList
ProductList const & productList() const
Definition: ProductRegistry.h:73
edm::nextIdentifier
static Principal::CacheIdentifier_t nextIdentifier()
Definition: Principal.cc:117
edm::throwAmbiguousException
static void throwAmbiguousException(const char *where, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
Definition: Principal.cc:76
edm::KindOfType
KindOfType
Definition: ProductKindOfType.h:5
edm::Principal::getManyByType
void getManyByType(TypeID const &typeID, BasicHandleVec &results, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:614
edm::ProductResolverBase
Definition: ProductResolverBase.h:34
edm::Principal::size
size_t size() const
Definition: Principal.cc:298
Exception
Definition: hltDiff.cc:246
edm::Principal::productLookup_
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
Definition: Principal.h:275
edm::ProductData
Definition: ProductData.h:20
edm::Principal::addProduct_
void addProduct_(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:502
ProductResolvers.h
ProductDeletedException.h
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
edm::DelayedReader
Definition: DelayedReader.h:29
edm::Principal::processHistoryID_
ProcessHistoryID processHistoryID_
Definition: Principal.h:264
edm::Principal::getByLabel
BasicHandle getByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:540
edm::ProductResolverBase::setupUnscheduled
virtual void setupUnscheduled(UnscheduledConfigurator const &)
Definition: ProductResolverBase.cc:43
OfflineOutput_cfi.consumer
consumer
Definition: OfflineOutput_cfi.py:3
patCandidatesForDimuonsSequences_cff.matches
matches
Definition: patCandidatesForDimuonsSequences_cff.py:131
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
edm::Principal::~Principal
~Principal() override
Definition: Principal.cc:293
edm::Principal::applyToResolvers
void applyToResolvers(F iFunc)
Definition: Principal.h:213
edm::Principal::changedIndexes_
virtual void changedIndexes_()
Definition: Principal.h:221
edm::BranchDescription
Definition: BranchDescription.h:32
edm::Principal::addSourceProduct
void addSourceProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:331
mps_fire.result
result
Definition: mps_fire.py:303
cms::Exception
Definition: Exception.h:70
edm::ProcessHistory
Definition: ProcessHistory.h:13
edm::Principal::putOrMerge
void putOrMerge(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
Definition: Principal.cc:872
edm::Principal::findProductByLabel
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:706
HerwigMaxPtPartonFilter_cfi.moduleLabel
moduleLabel
Definition: HerwigMaxPtPartonFilter_cfi.py:4
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
edm::throwProductNotFoundException
static void throwProductNotFoundException(char const *where, errors::ErrorCodes error, BranchID const &bid)
Definition: Principal.cc:47
SimL1EmulatorRepack_Full_cff.inputTag
inputTag
Definition: SimL1EmulatorRepack_Full_cff.py:56
edm::Principal::addProductOrThrow
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:515
edm::Provenance
Definition: Provenance.h:34
edm::Principal::cacheIdentifier_
CacheIdentifier_t cacheIdentifier_
Definition: Principal.h:291
edm::Principal::lookupProcessOrder_
std::vector< unsigned int > lookupProcessOrder_
Definition: Principal.h:277
edm::Principal::deleteProduct
void deleteProduct(BranchID const &id) const
Definition: Principal.cc:383
edm::Principal::historyAppender_
edm::propagate_const< HistoryAppender * > historyAppender_
Definition: Principal.h:289
edm::BranchDescription::branchID
BranchID const & branchID() const
Definition: BranchDescription.h:74
edm::Principal::getIt
WrapperBase const * getIt(ProductID const &) const override
Definition: Principal.cc:852
edm::Principal::addUnscheduledProduct
void addUnscheduledProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:340
edm::Principal::Principal
Principal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< ProductResolverIndexHelper const > productLookup, ProcessConfiguration const &pc, BranchType bt, HistoryAppender *historyAppender, bool isForPrimaryProcess=true)
Definition: Principal.cc:121
edm::ProductResolverIndexHelper::IndexAndNames::startInProcessNames
unsigned int startInProcessNames() const
Definition: ProductResolverIndexHelper.h:215
edm::InputTag
Definition: InputTag.h:15
label
const char * label
Definition: PFTauDecayModeTools.cc:11
edm::ProductID
Definition: ProductID.h:27
edm::ProcessConfiguration
Definition: ProcessConfiguration.h:14
edm::Principal::orderProcessHistoryID_
ProcessHistoryID orderProcessHistoryID_
Definition: Principal.h:278
edm::BranchKey
Definition: BranchKey.h:17
edm::s_emptyProcessHistory
static const ProcessHistory s_emptyProcessHistory
Definition: Principal.cc:33
findQualityFiles.size
size
Write out results.
Definition: findQualityFiles.py:443
edm::Principal::preg_
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:274
edm::ModuleCallingContext
Definition: ModuleCallingContext.h:29
unpackBuffers-CaloStage2.token
token
Definition: unpackBuffers-CaloStage2.py:316