CMS 3D CMS Logo

ProductRegistry.cc
Go to the documentation of this file.
1 
11 
13 
20 
21 #include "TDictAttributeMap.h"
22 
23 #include <cassert>
24 #include <iterator>
25 #include <limits>
26 #include <set>
27 #include <sstream>
28 #include <ostream>
29 
30 namespace edm {
31 
32  ProductRegistry::ProductRegistry() : productList_(), transient_() {}
33 
35  : frozen_(false),
36  productProduced_(),
37  anyProductProduced_(false),
38  eventProductLookup_(new ProductResolverIndexHelper),
39  lumiProductLookup_(new ProductResolverIndexHelper),
40  runProductLookup_(new ProductResolverIndexHelper),
41  eventNextIndexValue_(0),
42  lumiNextIndexValue_(0),
43  runNextIndexValue_(0),
44 
45  branchIDToIndex_() {
46  for (bool& isProduced : productProduced_)
47  isProduced = false;
48  }
49 
51  frozen_ = false;
52  for (bool& isProduced : productProduced_)
53  isProduced = false;
54  anyProductProduced_ = false;
55 
56  // propagate_const<T> has no reset() function
57  eventProductLookup_ = std::make_unique<ProductResolverIndexHelper>();
58  lumiProductLookup_ = std::make_unique<ProductResolverIndexHelper>();
59  runProductLookup_ = std::make_unique<ProductResolverIndexHelper>();
60 
61  eventNextIndexValue_ = 0;
62  lumiNextIndexValue_ = 0;
63  runNextIndexValue_ = 0;
64 
65  branchIDToIndex_.clear();
66  }
67 
70  freezeIt(toBeFrozen);
71  }
72 
73  void ProductRegistry::addProduct(BranchDescription const& productDesc, bool fromListener) {
74  assert(productDesc.produced());
75  throwIfFrozen();
76  std::pair<ProductList::iterator, bool> ret =
77  productList_.insert(std::make_pair(BranchKey(productDesc), productDesc));
78  if (!ret.second) {
79  auto const& previous = *productList_.find(BranchKey(productDesc));
80  if (previous.second.produced()) {
81  // Duplicate registration in current process
82  throw Exception(errors::LogicError, "Duplicate Product Identifier")
83  << "\nThe Framework requires a unique branch name for each product\n"
84  << "which consists of four parts: a friendly class name, module label,\n"
85  << "product instance name, and process name. A product has been\n"
86  << "registered with a duplicate branch name. The most common way\n"
87  << "to fix this error is to modify the product instance name in\n"
88  << "one of the offending 'produces' function calls. Another fix\n"
89  << "would be to delete one of them if they are for the same product.\n\n"
90  << " friendly class name = " << previous.second.friendlyClassName() << "\n"
91  << " module label = " << previous.second.moduleLabel() << "\n"
92  << " product instance name = " << previous.second.productInstanceName() << "\n"
93  << " process name = " << previous.second.processName() << "\n\n"
94  << "The following additional information is not used as part of\n"
95  << "the unique branch identifier.\n\n"
96  << " branch types = " << previous.second.branchType() << " " << productDesc.branchType() << "\n"
97  << " class name = " << previous.second.fullClassName() << "\n\n"
98  << "Note that if the four parts of the branch name are the same,\n"
99  << "then this error will occur even if the branch types differ!\n\n";
100  } else {
101  // Duplicate registration in previous process
102  throw Exception(errors::Configuration, "Duplicate Process Name.\n")
103  << "The process name " << productDesc.processName() << " was previously used for products in the input.\n"
104  << "This has caused branch name conflicts between input products and new products.\n"
105  << "Please modify the configuration file to use a distinct process name.\n"
106  << "Alternately, drop all input products using that process name and the\n"
107  << "descendants of those products.\n";
108  }
109  }
110  addCalled(productDesc, fromListener);
111  }
112 
114  std::string const& labelAlias,
115  std::string const& instanceAlias) {
116  assert(productDesc.produced());
117  assert(productDesc.branchID().isValid());
118  throwIfFrozen();
119  BranchDescription bd(productDesc, labelAlias, instanceAlias);
120  std::pair<ProductList::iterator, bool> ret = productList_.insert(std::make_pair(BranchKey(bd), bd));
121  assert(ret.second);
122  transient_.aliasToOriginal_.emplace_back(labelAlias, productDesc.moduleLabel());
123  addCalled(bd, false);
124  }
125 
127  assert(!productDesc.produced());
128  throwIfFrozen();
129  BranchKey k = BranchKey(productDesc);
130  ProductList::iterator iter = productList_.find(k);
131  if (iter == productList_.end()) {
132  productList_.insert(std::make_pair(k, productDesc));
133  } else {
134  assert(combinable(iter->second, productDesc));
135  iter->second.merge(productDesc);
136  }
137  }
138 
141  for (ProductList::const_iterator it = productList_.begin(), itEnd = productList_.end(); it != itEnd; ++it) {
142  if (it->second.branchType() == brType) {
143  return true;
144  }
145  }
146  return false;
147  }
148 
149  std::shared_ptr<ProductResolverIndexHelper const> ProductRegistry::productLookup(BranchType branchType) const {
150  if (branchType == InEvent)
152  if (branchType == InLumi)
153  return transient_.lumiProductLookup();
154  return transient_.runProductLookup();
155  }
156 
157  std::shared_ptr<ProductResolverIndexHelper> ProductRegistry::productLookup(BranchType branchType) {
158  if (branchType == InEvent)
160  if (branchType == InLumi)
161  return transient_.lumiProductLookup();
162  return transient_.runProductLookup();
163  }
164 
165  void ProductRegistry::setFrozen(bool initializeLookupInfo) {
166  if (frozen())
167  return;
168  freezeIt();
169  if (initializeLookupInfo) {
170  initializeLookupTables(nullptr, nullptr, nullptr);
171  }
173  }
174 
175  void ProductRegistry::setFrozen(std::set<TypeID> const& productTypesConsumed,
176  std::set<TypeID> const& elementTypesConsumed,
177  std::string const& processName) {
178  if (frozen())
179  return;
180  freezeIt();
181  initializeLookupTables(&productTypesConsumed, &elementTypesConsumed, &processName);
183  }
184 
186  if (frozen()) {
187  throw cms::Exception("ProductRegistry", "throwIfFrozen")
188  << "cannot modify the ProductRegistry because it is frozen\n";
189  }
190  }
191 
193  if (!frozen()) {
194  throw cms::Exception("ProductRegistry", "throwIfNotFrozen")
195  << "cannot read the ProductRegistry because it is not yet frozen\n";
196  }
197  }
198 
200 
201  std::vector<std::string> ProductRegistry::allBranchNames() const {
202  std::vector<std::string> result;
203  result.reserve(productList().size());
204 
205  for (auto const& product : productList()) {
206  result.push_back(product.second.branchName());
207  }
208  return result;
209  }
210 
211  std::vector<BranchDescription const*> ProductRegistry::allBranchDescriptions() const {
212  std::vector<BranchDescription const*> result;
213  result.reserve(productList().size());
214 
215  for (auto const& product : productList()) {
216  result.push_back(&product.second);
217  }
218  return result;
219  }
220 
222  for (auto const& product : other) {
223  copyProduct(product.second);
224  }
225  }
226 
227  void ProductRegistry::updateFromInput(std::vector<BranchDescription> const& other) {
228  for (BranchDescription const& branchDescription : other) {
229  copyProduct(branchDescription);
230  }
231  }
232 
233  void ProductRegistry::setUnscheduledProducts(std::set<std::string> const& unscheduledLabels) {
234  throwIfFrozen();
235 
236  bool hasAliases = false;
237  std::vector<BranchID> onDemandIDs;
238  for (auto& prod : productList_) {
239  if (prod.second.produced() && prod.second.branchType() == InEvent &&
240  unscheduledLabels.end() != unscheduledLabels.find(prod.second.moduleLabel())) {
241  prod.second.setOnDemand(true);
242  onDemandIDs.push_back(prod.second.branchID());
243  }
244  if (prod.second.produced() && prod.second.isAlias()) {
245  hasAliases = true;
246  }
247  }
248 
249  // Need to loop over EDAliases to set their on-demand flag based on the pointed-to branch
250  if (hasAliases) {
251  std::sort(onDemandIDs.begin(), onDemandIDs.end());
252  for (auto& prod : productList_) {
253  if (prod.second.isAlias()) {
254  if (std::binary_search(onDemandIDs.begin(), onDemandIDs.end(), prod.second.aliasForBranchID())) {
255  prod.second.setOnDemand(true);
256  }
257  }
258  }
259  }
260  }
261 
263  std::string const& fileName,
264  BranchDescription::MatchMode branchesMustMatch) {
265  std::ostringstream differences;
266 
267  ProductRegistry::ProductList::iterator j = productList_.begin();
268  ProductRegistry::ProductList::iterator s = productList_.end();
269  ProductRegistry::ProductList::const_iterator i = other.productList().begin();
270  ProductRegistry::ProductList::const_iterator e = other.productList().end();
271 
272  // Loop over entries in the main product registry.
273  while (j != s || i != e) {
274  if (j != s && j->second.produced()) {
275  // Ignore branches just produced (i.e. not in input file).
276  ++j;
277  } else if (j == s || (i != e && i->first < j->first)) {
278  if (i->second.present()) {
279  differences << "Branch '" << i->second.branchName() << "' is in file '" << fileName << "'\n";
280  differences << " but not in previous files.\n";
281  } else {
282  productList_.insert(*i);
283  transient_.branchIDToIndex_[i->second.branchID()] = getNextIndexValue(i->second.branchType());
284  ++nextIndexValue(i->second.branchType());
285  }
286  ++i;
287  } else if (i == e || (j != s && j->first < i->first)) {
288  if (j->second.present() && branchesMustMatch == BranchDescription::Strict) {
289  differences << "Branch '" << j->second.branchName() << "' is in previous files\n";
290  differences << " but not in file '" << fileName << "'.\n";
291  }
292  ++j;
293  } else {
294  std::string difs = match(j->second, i->second, fileName);
295  if (difs.empty()) {
296  j->second.merge(i->second);
297  } else {
298  differences << difs;
299  }
300  ++i;
301  ++j;
302  }
303  }
304  return differences.str();
305  }
306 
307  void ProductRegistry::initializeLookupTables(std::set<TypeID> const* productTypesConsumed,
308  std::set<TypeID> const* elementTypesConsumed,
309  std::string const* processName) {
310  std::map<TypeID, TypeID> containedTypeMap;
311  std::map<TypeID, std::vector<TypeWithDict> > containedTypeToBaseTypesMap;
312 
313  std::vector<std::string> missingDictionaries;
314  std::vector<std::string> branchNamesForMissing;
315  std::vector<std::string> producedTypes;
316 
318 
319  for (auto const& product : productList_) {
320  auto const& desc = product.second;
321 
323 
324  if (desc.produced() && !desc.transient()) {
325  setProductProduced(desc.branchType());
326  }
327 
328  //only do the following if the data is supposed to be available in the event
329  if (desc.present()) {
330  // Check dictionaries (we already checked for the produced ones earlier somewhere else).
331  // We have to have the dictionaries to properly setup the lookup tables for support of
332  // Views. Also we need them to determine which present products are declared to be
333  // consumed in the case where the consumed type is a View<T>.
334  if (!desc.produced()) {
335  if (!checkDictionary(missingDictionaries, desc.className(), desc.unwrappedType())) {
336  checkDictionaryOfWrappedType(missingDictionaries, desc.className());
337  branchNamesForMissing.emplace_back(desc.branchName());
338  producedTypes.emplace_back(desc.className() + std::string(" (read from input)"));
339  continue;
340  }
341  }
342  TypeID typeID(desc.unwrappedType().typeInfo());
343 
344  auto iterContainedType = containedTypeMap.find(typeID);
345  bool alreadySawThisType = (iterContainedType != containedTypeMap.end());
346 
347  if (!desc.produced() && !alreadySawThisType) {
348  if (!checkDictionary(missingDictionaries, desc.wrappedName(), desc.wrappedType())) {
349  branchNamesForMissing.emplace_back(desc.branchName());
350  producedTypes.emplace_back(desc.className() + std::string(" (read from input)"));
351  continue;
352  }
353  }
354 
355  TypeID wrappedTypeID(desc.wrappedType().typeInfo());
356 
357  TypeID containedTypeID;
358  if (alreadySawThisType) {
359  containedTypeID = iterContainedType->second;
360  } else {
361  containedTypeID = productholderindexhelper::getContainedTypeFromWrapper(wrappedTypeID, typeID.className());
362  }
363  bool hasContainedType = (containedTypeID != TypeID(typeid(void)) && containedTypeID != TypeID());
364 
365  std::vector<TypeWithDict>* baseTypesOfContainedType = nullptr;
366 
367  if (!alreadySawThisType) {
368  bool alreadyCheckedConstituents = desc.produced() && !desc.transient();
369  if (!alreadyCheckedConstituents && !desc.transient()) {
370  // This checks dictionaries of the wrapped class and all its constituent classes
371  if (!checkClassDictionaries(missingDictionaries, desc.wrappedName(), desc.wrappedType())) {
372  branchNamesForMissing.emplace_back(desc.branchName());
373  producedTypes.emplace_back(desc.className() + std::string(" (read from input)"));
374  continue;
375  }
376  }
377 
378  if (hasContainedType) {
379  auto iterBaseTypes = containedTypeToBaseTypesMap.find(containedTypeID);
380  if (iterBaseTypes == containedTypeToBaseTypesMap.end()) {
381  std::vector<TypeWithDict> baseTypes;
382  if (!public_base_classes(missingDictionaries, containedTypeID, baseTypes)) {
383  branchNamesForMissing.emplace_back(desc.branchName());
384  if (desc.produced()) {
385  producedTypes.emplace_back(desc.className() + std::string(" (produced in current process)"));
386  } else {
387  producedTypes.emplace_back(desc.className() + std::string(" (read from input)"));
388  }
389  continue;
390  }
391  iterBaseTypes = containedTypeToBaseTypesMap.insert(std::make_pair(containedTypeID, baseTypes)).first;
392  }
393  baseTypesOfContainedType = &iterBaseTypes->second;
394  }
395 
396  // Do this after the dictionary checks of constituents so the list of branch names for missing types
397  // is complete
398  containedTypeMap.emplace(typeID, containedTypeID);
399  } else {
400  if (hasContainedType) {
401  auto iterBaseTypes = containedTypeToBaseTypesMap.find(containedTypeID);
402  if (iterBaseTypes != containedTypeToBaseTypesMap.end()) {
403  baseTypesOfContainedType = &iterBaseTypes->second;
404  }
405  }
406  }
407 
408  if (productTypesConsumed != nullptr && !desc.produced()) {
409  bool mainTypeConsumed = (productTypesConsumed->find(typeID) != productTypesConsumed->end());
410  bool containedTypeConsumed =
411  hasContainedType && (elementTypesConsumed->find(containedTypeID) != elementTypesConsumed->end());
412  if (hasContainedType && !containedTypeConsumed && baseTypesOfContainedType != nullptr) {
413  for (TypeWithDict const& baseType : *baseTypesOfContainedType) {
414  if (elementTypesConsumed->find(TypeID(baseType.typeInfo())) != elementTypesConsumed->end()) {
415  containedTypeConsumed = true;
416  break;
417  }
418  }
419  }
420  if (!containedTypeConsumed) {
421  if (mainTypeConsumed) {
422  // The main type is consumed, but either
423  // there is no contained type, or if there is,
424  // neither it nor any of its base classes are consumed.
425  // Set the contained type, if there is one, to void,
426  if (hasContainedType) {
427  containedTypeID = TypeID(typeid(void));
428  }
429  } else {
430  // The main type is not consumed, and either
431  // there is no contained type, or if there is,
432  // neither it nor any of its base classes are consumed.
433  // Don't insert anything in the lookup tables.
434  continue;
435  }
436  }
437  }
438  ProductResolverIndex index = productLookup(desc.branchType())
439  ->insert(typeID,
440  desc.moduleLabel().c_str(),
441  desc.productInstanceName().c_str(),
442  desc.processName().c_str(),
443  containedTypeID,
444  baseTypesOfContainedType);
445 
446  transient_.branchIDToIndex_[desc.branchID()] = index;
447  }
448  }
449  if (!missingDictionaries.empty()) {
450  std::string context("Calling ProductRegistry::initializeLookupTables");
451  throwMissingDictionariesException(missingDictionaries, context, producedTypes, branchNamesForMissing);
452  }
453 
454  productLookup(InEvent)->setFrozen();
455  productLookup(InLumi)->setFrozen();
456  productLookup(InRun)->setFrozen();
457 
459  transient_.lumiNextIndexValue_ = productLookup(InLumi)->nextIndexValue();
460  transient_.runNextIndexValue_ = productLookup(InRun)->nextIndexValue();
461 
462  for (auto const& product : productList_) {
463  auto const& desc = product.second;
464  if (transient_.branchIDToIndex_.find(desc.branchID()) == transient_.branchIDToIndex_.end()) {
465  transient_.branchIDToIndex_[desc.branchID()] = getNextIndexValue(desc.branchType());
466  ++nextIndexValue(desc.branchType());
467  }
468  }
470  productTypesConsumed, elementTypesConsumed, containedTypeMap, containedTypeToBaseTypesMap);
471  }
472 
474  std::set<TypeID> const* productTypesConsumed,
475  std::set<TypeID> const* elementTypesConsumed,
476  std::map<TypeID, TypeID> const& containedTypeMap,
477  std::map<TypeID, std::vector<TypeWithDict> >& containedTypeToBaseTypesMap) {
478  std::vector<std::string> missingDictionaries;
479  std::set<std::string> consumedTypesWithMissingDictionaries;
480 
481  if (productTypesConsumed) {
482  // Check dictionaries for all classes declared to be consumed
483  for (auto const& consumedTypeID : *productTypesConsumed) {
484  // We use the containedTypeMap to see which types have already
485  // had their dictionaries checked. We do not waste time rechecking
486  // those dictionaries.
487  if (containedTypeMap.find(consumedTypeID) == containedTypeMap.end()) {
488  std::string wrappedName = wrappedClassName(consumedTypeID.className());
489  TypeWithDict wrappedType = TypeWithDict::byName(wrappedName);
490  if (!checkDictionary(missingDictionaries, wrappedName, wrappedType)) {
491  checkDictionary(missingDictionaries, consumedTypeID);
492  consumedTypesWithMissingDictionaries.emplace(consumedTypeID.className());
493  continue;
494  }
495  bool transient = false;
496  TDictAttributeMap* wp = wrappedType.getClass()->GetAttributeMap();
497  if (wp && wp->HasKey("persistent") && !strcmp(wp->GetPropertyAsString("persistent"), "false")) {
498  transient = true;
499  }
500  if (transient) {
501  if (!checkDictionary(missingDictionaries, consumedTypeID)) {
502  consumedTypesWithMissingDictionaries.emplace(consumedTypeID.className());
503  }
504 
506  TypeID(wrappedType.typeInfo()), consumedTypeID.className());
507  bool hasContainedType = (containedTypeID != TypeID(typeid(void)) && containedTypeID != TypeID());
508  if (hasContainedType) {
509  if (containedTypeToBaseTypesMap.find(containedTypeID) == containedTypeToBaseTypesMap.end()) {
510  std::vector<TypeWithDict> bases;
511  // Run this to check for missing dictionaries, bases is not really used
512  if (!public_base_classes(missingDictionaries, containedTypeID, bases)) {
513  consumedTypesWithMissingDictionaries.emplace(consumedTypeID.className());
514  }
515  containedTypeToBaseTypesMap.insert(std::make_pair(containedTypeID, bases));
516  }
517  }
518  } else {
519  if (!checkClassDictionaries(missingDictionaries, wrappedName, wrappedType)) {
520  consumedTypesWithMissingDictionaries.emplace(consumedTypeID.className());
521  }
522  }
523  }
524  }
525  if (!missingDictionaries.empty()) {
526  std::string context(
527  "Calling ProductRegistry::initializeLookupTables, checking dictionaries for consumed products");
528  throwMissingDictionariesException(missingDictionaries, context, consumedTypesWithMissingDictionaries, false);
529  }
530  }
531 
532  if (elementTypesConsumed) {
533  missingDictionaries.clear();
534  consumedTypesWithMissingDictionaries.clear();
535  for (auto const& consumedTypeID : *elementTypesConsumed) {
536  if (containedTypeToBaseTypesMap.find(consumedTypeID) == containedTypeToBaseTypesMap.end()) {
537  std::vector<TypeWithDict> bases;
538  // Run this to check for missing dictionaries, bases is not really used
539  if (!public_base_classes(missingDictionaries, consumedTypeID, bases)) {
540  consumedTypesWithMissingDictionaries.emplace(consumedTypeID.className());
541  }
542  }
543  }
544  if (!missingDictionaries.empty()) {
545  std::string context(
546  "Calling ProductRegistry::initializeLookupTables, checking dictionaries for elements of products consumed "
547  "using View");
548  throwMissingDictionariesException(missingDictionaries, context, consumedTypesWithMissingDictionaries, true);
549  }
550  }
551  }
552 
554  std::string const* processName) const {
555  if (processName && !desc.produced() && (*processName == desc.processName())) {
556  throw Exception(errors::Configuration, "Duplicate Process Name.\n")
557  << "The process name " << *processName << " was previously used for products in the input.\n"
558  << "Please modify the configuration file to use a distinct process name.\n"
559  << "Alternately, drop all input products using that process name and the\n"
560  << "descendants of those products.\n";
561  }
562  }
563 
565  std::map<BranchID, ProductResolverIndex>::const_iterator itFind = transient_.branchIDToIndex_.find(iID);
566  if (itFind == transient_.branchIDToIndex_.end()) {
568  }
569  return itFind->second;
570  }
571 
572  void ProductRegistry::print(std::ostream& os) const {
573  for (auto const& product : productList_) {
574  os << product.second << "\n-----\n";
575  }
576  }
577 
579  if (branchType == InEvent)
581  if (branchType == InLumi)
584  }
585 
587  if (branchType == InEvent)
589  if (branchType == InLumi)
592  }
593 } // namespace edm
runTheMatrix.ret
ret
prodAgent to be discontinued
Definition: runTheMatrix.py:355
edm::ProductRegistry::Transients::productProduced_
std::array< bool, NumBranchTypes > productProduced_
Definition: ProductRegistry.h:154
edm::TypeWithDict::byName
static TypeWithDict byName(std::string const &name)
Definition: TypeWithDict.cc:74
edm::ProductRegistry::Transients::lumiProductLookup
std::shared_ptr< ProductResolverIndexHelper const > lumiProductLookup() const
Definition: ProductRegistry.h:141
ProductResolverIndexHelper.h
edm::ProductRegistry::checkDictionariesOfConsumedTypes
void checkDictionariesOfConsumedTypes(std::set< TypeID > const *productTypesConsumed, std::set< TypeID > const *elementTypesConsumed, std::map< TypeID, TypeID > const &containedTypeMap, std::map< TypeID, std::vector< TypeWithDict >> &containedTypeToBaseTypesMap)
Definition: ProductRegistry.cc:473
edm::ProductResolverIndex
unsigned int ProductResolverIndex
Definition: ProductResolverIndex.h:8
mps_fire.i
i
Definition: mps_fire.py:355
edm::throwMissingDictionariesException
void throwMissingDictionariesException(std::vector< std::string > &missingDictionaries, std::string const &context)
Definition: DictionaryTools.cc:193
edm::ProductRegistry::indexFrom
ProductResolverIndex indexFrom(BranchID const &iID) const
Definition: ProductRegistry.cc:564
edm::ProductRegistry::allBranchNames
std::vector< std::string > allBranchNames() const
Definition: ProductRegistry.cc:201
funct::false
false
Definition: Factorize.h:34
edm::ProductRegistry::transient_
Transients transient_
Definition: ProductRegistry.h:196
edm::ProductRegistry::setFrozen
void setFrozen(bool initializeLookupInfo=true)
Definition: ProductRegistry.cc:165
edm::sort_all
void sort_all(RandomAccessSequence &s)
wrappers for std::sort
Definition: Algorithms.h:92
bd
deep_tau::DeepTauBase::BasicDiscriminator bd
Definition: DeepTauId.cc:1081
edm::errors::LogicError
Definition: EDMException.h:37
pfClustersFromHGC3DClusters_cfi.wp
wp
Definition: pfClustersFromHGC3DClusters_cfi.py:20
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::ProductRegistry::size
ProductList::size_type size() const
Definition: ProductRegistry.h:106
deep_tau::DeepTauBase::BasicDiscriminator
BasicDiscriminator
Definition: DeepTauBase.h:115
edm::ProductRegistry::checkForDuplicateProcessName
void checkForDuplicateProcessName(BranchDescription const &desc, std::string const *processName) const
Definition: ProductRegistry.cc:553
Algorithms.h
edm::ProductRegistry::updateFromInput
void updateFromInput(ProductList const &other)
Definition: ProductRegistry.cc:221
cms::cuda::assert
assert(be >=bs)
TypeID.h
edm::ProductRegistry::productLookup
std::shared_ptr< ProductResolverIndexHelper const > productLookup(BranchType branchType) const
Definition: ProductRegistry.cc:149
edm::combinable
bool combinable(BranchDescription const &a, BranchDescription const &b)
Definition: BranchDescription.cc:340
TypeWithDict.h
ProductRegistry.h
edm::ProductResolverIndexHelper
Definition: ProductResolverIndexHelper.h:89
edm::ProductRegistry::getNextIndexValue
ProductResolverIndex const & getNextIndexValue(BranchType branchType) const
Definition: ProductRegistry.cc:578
MillePedeFileConverter_cfg.fileName
fileName
Definition: MillePedeFileConverter_cfg.py:32
edm::BranchDescription::Strict
Definition: BranchDescription.h:36
edm::checkDictionaryOfWrappedType
bool checkDictionaryOfWrappedType(std::vector< std::string > &missingDictionaries, TypeID const &unwrappedTypeID)
Definition: DictionaryTools.cc:80
edm::ProductRegistry::print
void print(std::ostream &os) const
Definition: ProductRegistry.cc:572
edm::InRun
Definition: BranchType.h:11
edm::productholderindexhelper::getContainedTypeFromWrapper
TypeID getContainedTypeFromWrapper(TypeID const &wrappedtypeID, std::string const &className)
Definition: ProductResolverIndexHelper.cc:19
edm::BranchType
BranchType
Definition: BranchType.h:11
edm::ProductRegistry::Transients::runNextIndexValue_
ProductResolverIndex runNextIndexValue_
Definition: ProductRegistry.h:163
edm::checkClassDictionaries
bool checkClassDictionaries(std::vector< std::string > &missingDictionaries, TypeID const &typeID)
Definition: DictionaryTools.cc:102
edm::ProductRegistry
Definition: ProductRegistry.h:34
EDMException.h
alignCSCRings.s
s
Definition: alignCSCRings.py:92
edm::ProductRegistry::anyProducts
bool anyProducts(BranchType const brType) const
Definition: ProductRegistry.cc:139
edm::BranchDescription::processName
std::string const & processName() const
Definition: BranchDescription.h:73
edm::ProductRegistry::Transients::eventProductLookup
std::shared_ptr< ProductResolverIndexHelper const > eventProductLookup() const
Definition: ProductRegistry.h:135
edm::BranchID
Definition: BranchID.h:14
dumpMFGeometry_cfg.prod
prod
Definition: dumpMFGeometry_cfg.py:24
edm::ProductRegistry::Transients::Transients
Transients()
Definition: ProductRegistry.cc:34
edm::BranchDescription::MatchMode
MatchMode
Definition: BranchDescription.h:36
trackingPlots.other
other
Definition: trackingPlots.py:1465
edm::InEvent
Definition: BranchType.h:11
dqmdumpme.k
k
Definition: dqmdumpme.py:60
edm::ProductRegistry::throwIfFrozen
void throwIfFrozen() const
Definition: ProductRegistry.cc:185
edm::ProductRegistry::addProduct
void addProduct(BranchDescription const &productdesc, bool iFromListener=false)
Definition: ProductRegistry.cc:73
edm::ProductRegistry::throwIfNotFrozen
void throwIfNotFrozen() const
Definition: ProductRegistry.cc:192
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::ProductRegistry::copyProduct
void copyProduct(BranchDescription const &productdesc)
Definition: ProductRegistry.cc:126
edm::ProductRegistry::Transients::branchIDToIndex_
std::map< BranchID, ProductResolverIndex > branchIDToIndex_
Definition: ProductRegistry.h:165
edm::ProductRegistry::ProductList
std::map< BranchKey, BranchDescription > ProductList
Definition: ProductRegistry.h:36
edm::ProductRegistry::Transients::reset
void reset()
Definition: ProductRegistry.cc:50
edm::TypeWithDict
Definition: TypeWithDict.h:38
edm::InLumi
Definition: BranchType.h:11
edm::ProductResolverIndexInvalid
Definition: ProductResolverIndex.h:16
edm::ProductRegistry::ProductRegistry
ProductRegistry()
Definition: ProductRegistry.cc:32
edm::ProductRegistry::allBranchDescriptions
std::vector< BranchDescription const * > allBranchDescriptions() const
Definition: ProductRegistry.cc:211
edm::BranchDescription::branchType
BranchType const & branchType() const
Definition: BranchDescription.h:121
edm::ProductRegistry::addLabelAlias
void addLabelAlias(BranchDescription const &productdesc, std::string const &labelAlias, std::string const &instanceAlias)
Definition: ProductRegistry.cc:113
edm::wrappedClassName
std::string wrappedClassName(std::string const &iFullName)
Definition: WrappedClassName.cc:4
edm::BranchDescription::produced
bool produced() const
Definition: BranchDescription.h:82
edm::ProductRegistry::productList_
ProductList productList_
Definition: ProductRegistry.h:195
edm::ProductRegistry::setProductProduced
void setProductProduced(BranchType branchType)
Definition: ProductRegistry.h:171
SimL1EmulatorRepack_CalouGT_cff.processName
processName
Definition: SimL1EmulatorRepack_CalouGT_cff.py:17
edm::TypeID::className
std::string const & className() const
Definition: TypeID.cc:40
edm::ProductRegistry::initializeLookupTables
void initializeLookupTables(std::set< TypeID > const *productTypesConsumed, std::set< TypeID > const *elementTypesConsumed, std::string const *processName)
Definition: ProductRegistry.cc:307
WrappedClassName.h
edm::TypeID
Definition: TypeID.h:22
edm::ProductRegistry::productList
ProductList const & productList() const
Definition: ProductRegistry.h:73
edm::match
std::string match(BranchDescription const &a, BranchDescription const &b, std::string const &fileName)
Definition: BranchDescription.cc:351
edm::public_base_classes
bool public_base_classes(std::vector< std::string > &missingDictionaries, TypeID const &typeID, std::vector< TypeWithDict > &baseTypes)
Definition: DictionaryTools.cc:319
edm::BranchDescription::moduleLabel
std::string const & moduleLabel() const
Definition: BranchDescription.h:72
edm::ProductRegistry::addCalled
virtual void addCalled(BranchDescription const &, bool iFromListener)
Definition: ProductRegistry.cc:199
Exception
Definition: hltDiff.cc:246
edm::eventsetup::heterocontainer::insert
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:50
edm::BranchID::isValid
bool isValid() const
Definition: BranchID.h:22
edm::ProductRegistry::frozen
bool frozen() const
Definition: ProductRegistry.h:129
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
edm::ProductRegistry::Transients::eventNextIndexValue_
ProductResolverIndex eventNextIndexValue_
Definition: ProductRegistry.h:161
edm::BranchDescription
Definition: BranchDescription.h:32
edm::checkDictionary
bool checkDictionary(std::vector< std::string > &missingDictionaries, TypeID const &typeID)
Definition: DictionaryTools.cc:67
mps_fire.result
result
Definition: mps_fire.py:303
edm::ProductRegistry::Transients::lumiNextIndexValue_
ProductResolverIndex lumiNextIndexValue_
Definition: ProductRegistry.h:162
edm::ProductRegistry::nextIndexValue
ProductResolverIndex & nextIndexValue(BranchType branchType)
Definition: ProductRegistry.cc:586
genParticles_cff.map
map
Definition: genParticles_cff.py:11
edm::ProductRegistry::merge
std::string merge(ProductRegistry const &other, std::string const &fileName, BranchDescription::MatchMode branchesMustMatch=BranchDescription::Permissive)
Definition: ProductRegistry.cc:262
edm::ProductRegistry::Transients::aliasToOriginal_
std::vector< std::pair< std::string, std::string > > aliasToOriginal_
Definition: ProductRegistry.h:167
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
DictionaryTools.h
edm::BranchDescription::branchID
BranchID const & branchID() const
Definition: BranchDescription.h:74
edm::ProductRegistry::freezeIt
void freezeIt(bool frozen=true)
Definition: ProductRegistry.h:176
edm::ProductRegistry::setUnscheduledProducts
void setUnscheduledProducts(std::set< std::string > const &unscheduledLabels)
Definition: ProductRegistry.cc:233
edm::errors::Configuration
Definition: EDMException.h:36
edm::BranchKey
Definition: BranchKey.h:17
edm::ProductRegistry::Transients::runProductLookup
std::shared_ptr< ProductResolverIndexHelper const > runProductLookup() const
Definition: ProductRegistry.h:147
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37