CMS 3D CMS Logo

EDConsumerBase.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_EDConsumerBase_h
2 #define FWCore_Framework_EDConsumerBase_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/Framework
6 // Class : EDConsumerBase
7 //
16 //
17 // Original Author: Chris Jones
18 // Created: Tue, 02 Apr 2013 21:35:53 GMT
19 //
20 
21 // system include files
22 #include <map>
23 #include <string>
24 #include <vector>
25 #include <array>
26 
27 // user include files
47 
48 // forward declarations
49 
50 namespace edm {
51  class ModuleDescription;
52  class ProductResolverIndexHelper;
53  class ProductRegistry;
54  class ConsumesCollector;
55  template <typename T>
57 
58  namespace eventsetup {
60  }
61 
63  public:
65  virtual ~EDConsumerBase() noexcept(false);
66 
67  // disallow copying
70 
71  // allow moving
74 
75  // ---------- const member functions ---------------------
76  ProductResolverIndexAndSkipBit indexFrom(EDGetToken, BranchType, TypeID const&) const;
77  ProductResolverIndexAndSkipBit uncheckedIndexFrom(EDGetToken) const;
78 
79  void itemsToGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
80  void itemsMayGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
81 
83  return itemsToGetFromBranch_[iType];
84  }
85 
88 
90  bool registeredToConsumeMany(TypeID const&, BranchType) const;
91  // ---------- static member functions --------------------
92 
93  // ---------- member functions ---------------------------
94  void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&, bool iPrefetchMayGet);
96 
98  void labelsForToken(EDGetToken iToken, Labels& oLabels) const;
99 
100  void modulesWhoseProductsAreConsumed(std::vector<ModuleDescription const*>& modules,
101  ProductRegistry const& preg,
102  std::map<std::string, ModuleDescription const*> const& labelsToDesc,
103  std::string const& processName) const;
104 
107 
108  std::vector<ConsumesInfo> consumesInfo() const;
109 
111  auto const& v = esItemsToGetFromTransition_[static_cast<unsigned int>(iTrans)];
112  if (v.empty()) {
113  return nullptr;
114  }
115  return &(esItemsToGetFromTransition_[static_cast<unsigned int>(iTrans)].front());
116  }
117 
118  protected:
119  friend class ConsumesCollector;
120  template <typename T>
121  friend class WillGetIfMatch;
124 
125  template <typename ProductType, BranchType B = InEvent>
127  TypeToGet tid = TypeToGet::make<ProductType>();
129  }
130 
132  return EDGetToken{recordConsumes(InEvent, id, checkIfEmpty(tag), true)};
133  }
134 
135  template <BranchType B>
137  return EDGetToken{recordConsumes(B, id, checkIfEmpty(tag), true)};
138  }
139 
140  template <typename ProductType, BranchType B = InEvent>
142  TypeToGet tid = TypeToGet::make<ProductType>();
144  }
145 
146  EDGetToken mayConsume(const TypeToGet& id, edm::InputTag const& tag) { return mayConsume<InEvent>(id, tag); }
147 
148  template <BranchType B>
150  return EDGetToken{recordConsumes(B, id, checkIfEmpty(tag), false)};
151  }
152 
153  template <typename ProductType, BranchType B = InEvent>
154  void consumesMany() {
155  TypeToGet tid = TypeToGet::make<ProductType>();
156  consumesMany<B>(tid);
157  }
158 
159  void consumesMany(const TypeToGet& id) { consumesMany<InEvent>(id); }
160 
161  template <BranchType B>
162  void consumesMany(const TypeToGet& id) {
163  recordConsumes(B, id, edm::InputTag{}, true);
164  }
165 
166  // For consuming event-setup products
167  template <typename ESProduct, typename ESRecord, Transition Tr = Transition::Event>
168  auto esConsumes() {
169  return esConsumes<ESProduct, ESRecord, Tr>(ESInputTag{});
170  }
171 
172  template <typename ESProduct, typename ESRecord, Transition Tr = Transition::Event>
173  auto esConsumes(ESInputTag const& tag) {
174  auto index = recordESConsumes(Tr,
176  std::conditional_t<std::is_same_v<ESRecord, edm::DefaultRecord>,
178  ESRecord>>(),
179  eventsetup::heterocontainer::HCTypeTag::make<ESProduct>(),
180  tag);
181  return ESGetToken<ESProduct, ESRecord>{static_cast<unsigned int>(Tr), index, labelFor(index)};
182  }
183 
184  private:
185  unsigned int recordConsumes(BranchType iBranch, TypeToGet const& iType, edm::InputTag const& iTag, bool iAlwaysGets);
189  edm::ESInputTag const& iTag);
190 
191  const char* labelFor(ESTokenIndex) const;
192 
193  void throwTypeMismatch(edm::TypeID const&, EDGetToken) const;
195  void throwBadToken(edm::TypeID const& iType, EDGetToken iToken) const;
196  void throwConsumesCallAfterFrozen(TypeToGet const&, InputTag const&) const;
197 
199  // ---------- member data --------------------------------
200 
202  TokenLookupInfo(edm::TypeID const& iID, ProductResolverIndex iIndex, bool skipCurrentProcess, BranchType iBranch)
203  : m_type(iID), m_index(iIndex, skipCurrentProcess), m_branchType(iBranch) {}
207  };
208 
209  struct LabelPlacement {
210  LabelPlacement(unsigned int iStartOfModuleLabel,
211  unsigned short iDeltaToProductInstance,
212  unsigned short iDeltaToProcessName)
213  : m_startOfModuleLabel(iStartOfModuleLabel),
214  m_deltaToProductInstance(iDeltaToProductInstance),
215  m_deltaToProcessName(iDeltaToProcessName) {}
216  unsigned int m_startOfModuleLabel;
217  unsigned short m_deltaToProductInstance;
218  unsigned short m_deltaToProcessName;
219  };
220 
221  //define the purpose of each 'column' in m_tokenInfo
224 
225  //m_tokenStartOfLabels holds the entries into this container
226  // for each of the 3 labels needed to id the data
227  std::vector<char> m_tokenLabels;
228 
229  std::array<std::vector<ProductResolverIndexAndSkipBit>, edm::NumBranchTypes> itemsToGetFromBranch_;
230 
235  };
236 
237  // TODO We would like to be able to access m_esTokenInfo from the
238  // index in the token, but this is currently not possible. One idea
239  // for this is to order the entries in m_esToken so that all the ones
240  // for transition 0 come first, then the ones for for transition 1
241  // and so on for all the transitions. Within a transition, the
242  // entries would be in the same order in m_esTokenInfo and
243  // esItemsToGetFromTransition_. This is something for future
244  // development and might require a change to SoATuple to support
245  // inserts in the middle of the data structure.
248  std::array<std::vector<ESProxyIndex>, static_cast<unsigned int>(edm::Transition::NumberOfTransitions)>
250  bool frozen_;
252  };
253 } // namespace edm
254 
255 #endif
TypeToGet.h
edm::ESTokenIndex
Definition: ESIndices.h:54
edm::SoATuple
Definition: SoATuple.h:108
edm::EDConsumerBase::modulesWhoseProductsAreConsumed
void modulesWhoseProductsAreConsumed(std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
Definition: EDConsumerBase.cc:458
edm::ProductResolverIndex
unsigned int ProductResolverIndex
Definition: ProductResolverIndex.h:8
edm::EDConsumerBase::consumesMany
void consumesMany(const TypeToGet &id)
Definition: EDConsumerBase.h:159
edm::ESInputTag
Definition: ESInputTag.h:87
edm::eventsetup::ESRecordsToProxyIndices
Definition: ESRecordsToProxyIndices.h:35
funct::false
false
Definition: Factorize.h:34
edm::EDConsumerBase::registeredToConsumeMany
bool registeredToConsumeMany(TypeID const &, BranchType) const
Definition: EDConsumerBase.cc:368
edm::EDConsumerBase::Labels
ProductLabels Labels
Definition: EDConsumerBase.h:97
edm::EDConsumerBase::esItemsToGetFromTransition_
std::array< std::vector< ESProxyIndex >, static_cast< unsigned int >edm::Transition::NumberOfTransitions)> esItemsToGetFromTransition_
Definition: EDConsumerBase.h:249
edm::EDConsumerBase::recordConsumes
unsigned int recordConsumes(BranchType iBranch, TypeToGet const &iType, edm::InputTag const &iTag, bool iAlwaysGets)
Definition: EDConsumerBase.cc:85
SoATuple.h
edm::EDConsumerBase::ESTokenLookupInfo
Definition: EDConsumerBase.h:231
modules
Definition: ZHLTMatchFilter.cc:17
edm::ProductResolverIndexAndSkipBit
Definition: ProductResolverIndexAndSkipBit.h:28
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::WillGetIfMatch
Definition: EDConsumerBase.h:56
ProductResolverIndex.h
edm::EDConsumerBase::checkIfEmpty
edm::InputTag const & checkIfEmpty(edm::InputTag const &tag)
Definition: EDConsumerBase.cc:78
edm::EDConsumerBase::kLookupInfo
Definition: EDConsumerBase.h:222
edm::EDConsumerBase::m_esTokenInfo
edm::SoATuple< ESTokenLookupInfo, ESProxyIndex > m_esTokenInfo
Definition: EDConsumerBase.h:247
TypeID.h
edm::EDConsumerBase::consumesCollector
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
Definition: EDConsumerBase.cc:71
edm::eventsetup::DataKey
Definition: DataKey.h:29
edm::EDConsumerBase::kESProxyIndex
Definition: EDConsumerBase.h:246
edm::EDConsumerBase::TokenLookupInfo::TokenLookupInfo
TokenLookupInfo(edm::TypeID const &iID, ProductResolverIndex iIndex, bool skipCurrentProcess, BranchType iBranch)
Definition: EDConsumerBase.h:202
edm::ProductResolverIndexHelper
Definition: ProductResolverIndexHelper.h:89
findQualityFiles.v
v
Definition: findQualityFiles.py:179
edm::EDConsumerBase::itemsMayGet
void itemsMayGet(BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
Definition: EDConsumerBase.cc:315
edm::EDConsumerBase::itemsToGetFrom
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom(BranchType iType) const
Definition: EDConsumerBase.h:82
watchdog.const
const
Definition: watchdog.py:83
ESGetToken.h
ESIndices.h
edm::EDConsumerBase::throwConsumesCallAfterFrozen
void throwConsumesCallAfterFrozen(TypeToGet const &, InputTag const &) const
Definition: EDConsumerBase.cc:405
edm::eventsetup::EventSetupRecordKey
Definition: EventSetupRecordKey.h:30
edm::EDConsumerBase::registeredToConsume
bool registeredToConsume(ProductResolverIndex, bool, BranchType) const
Definition: EDConsumerBase.cc:356
edm::EDConsumerBase::ESTokenLookupInfo::m_startOfComponentName
unsigned int m_startOfComponentName
Definition: EDConsumerBase.h:234
edm::BranchType
BranchType
Definition: BranchType.h:11
edm::ESProxyIndex
Definition: ESIndices.h:29
edm::NumBranchTypes
Definition: BranchType.h:11
Utilities.operator
operator
Definition: Utilities.py:24
edm::EDConsumerBase::m_tokenLabels
std::vector< char > m_tokenLabels
Definition: EDConsumerBase.h:227
edm::EDConsumerBase::consumesInfo
std::vector< ConsumesInfo > consumesInfo() const
Definition: EDConsumerBase.cc:553
edm::ProductRegistry
Definition: ProductRegistry.h:34
edm::EDConsumerBase::kESLookupInfo
Definition: EDConsumerBase.h:246
edm::EDConsumerBase::uncheckedIndexFrom
ProductResolverIndexAndSkipBit uncheckedIndexFrom(EDGetToken) const
Definition: EDConsumerBase.cc:279
edm::EDConsumerBase
Definition: EDConsumerBase.h:62
edm::ESHandleAdapter
Definition: data_default_record_trait.h:72
GlobalPosition_Frontier_DevDB_cff.tag
tag
Definition: GlobalPosition_Frontier_DevDB_cff.py:11
edm::EDConsumerBase::mayConsume
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
Definition: EDConsumerBase.h:141
edm::eventsetup::default_record_t
typename default_record< T >::RecordT default_record_t
Definition: data_default_record_trait.h:68
ProductResolverIndexAndSkipBit.h
edm::Transition::NumberOfTransitions
edm::EDConsumerBase::itemsToGet
void itemsToGet(BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
Definition: EDConsumerBase.cc:283
edm::InEvent
Definition: BranchType.h:11
Transition.h
edm::EDConsumerBase::esConsumes
auto esConsumes(ESInputTag const &tag)
Definition: EDConsumerBase.h:173
edm::EDConsumerBase::TokenLookupInfo
Definition: EDConsumerBase.h:201
edm::eventsetup::EventSetupRecordKey::makeKey
static EventSetupRecordKey makeKey()
Definition: EventSetupRecordKey.h:49
EDGetToken.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::EDConsumerBase::TokenLookupInfo::m_branchType
BranchType m_branchType
Definition: EDConsumerBase.h:206
edm::EDConsumerBase::m_tokenInfo
edm::SoATuple< TokenLookupInfo, bool, LabelPlacement, edm::KindOfType > m_tokenInfo
Definition: EDConsumerBase.h:223
writedatasetfile.default
default
Definition: writedatasetfile.py:11
edm::Transition
Transition
Definition: Transition.h:12
edm::EDConsumerBase::consumesMany
void consumesMany()
Definition: EDConsumerBase.h:154
edm::EDConsumerBase::ESTokenLookupInfo::m_key
eventsetup::DataKey m_key
Definition: EDConsumerBase.h:233
edm::EDConsumerBase::ESTokenLookupInfo::m_record
eventsetup::EventSetupRecordKey m_record
Definition: EDConsumerBase.h:232
DataKey.h
edm::eventsetup::heterocontainer::HCTypeTag
Definition: HCTypeTag.h:38
ESRecordsToProxyIndices
edm::EDConsumerBase::LabelPlacement::m_deltaToProcessName
unsigned short m_deltaToProcessName
Definition: EDConsumerBase.h:218
edm::EDConsumerBase::throwBadToken
void throwBadToken(edm::TypeID const &iType, EDGetToken iToken) const
Definition: EDConsumerBase.cc:392
edm::EDConsumerBase::updateLookup
void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
Definition: EDConsumerBase.cc:136
edm::EDConsumerBase::~EDConsumerBase
virtual ~EDConsumerBase() noexcept(false)
Definition: EDConsumerBase.cc:54
BranchType.h
edm::EDConsumerBase::consumesMany
void consumesMany(const TypeToGet &id)
Definition: EDConsumerBase.h:162
edm::EDConsumerBase::kLabels
Definition: EDConsumerBase.h:222
edm::EDConsumerBase::itemsToGetFromBranch_
std::array< std::vector< ProductResolverIndexAndSkipBit >, edm::NumBranchTypes > itemsToGetFromBranch_
Definition: EDConsumerBase.h:229
edm::EDConsumerBase::containsCurrentProcessAlias_
bool containsCurrentProcessAlias_
Definition: EDConsumerBase.h:251
edm::EDGetToken
Definition: EDGetToken.h:35
edm::ESGetToken
Definition: EventSetup.h:48
InputTag.h
SimL1EmulatorRepack_CalouGT_cff.processName
processName
Definition: SimL1EmulatorRepack_CalouGT_cff.py:17
edm::EDConsumerBase::labelsForToken
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
Definition: EDConsumerBase.cc:347
EDGetToken
edm::EDConsumerBase::kKind
Definition: EDConsumerBase.h:222
TtFullHadDaughter::B
static const std::string B
Definition: TtFullHadronicEvent.h:9
data_default_record_trait.h
ESInputTag.h
edm::TypeID
Definition: TypeID.h:22
std
Definition: JetResolutionObject.h:76
edm::EDConsumerBase::EDConsumerBase
EDConsumerBase()
Definition: EDConsumerBase.h:64
edm::EDConsumerBase::frozen_
bool frozen_
Definition: EDConsumerBase.h:250
edm::EDConsumerBase::esGetTokenIndices
ESProxyIndex const * esGetTokenIndices(edm::Transition iTrans) const
Definition: EDConsumerBase.h:110
edm::EDConsumerBase::LabelPlacement::m_deltaToProductInstance
unsigned short m_deltaToProductInstance
Definition: EDConsumerBase.h:217
edm::EDConsumerBase::labelFor
const char * labelFor(ESTokenIndex) const
Definition: EDConsumerBase.cc:591
edm::EDConsumerBase::TokenLookupInfo::m_type
edm::TypeID m_type
Definition: EDConsumerBase.h:204
edm::EDConsumerBase::throwBranchMismatch
void throwBranchMismatch(BranchType, EDGetToken) const
Definition: EDConsumerBase.cc:385
edm::EDConsumerBase::LabelPlacement::LabelPlacement
LabelPlacement(unsigned int iStartOfModuleLabel, unsigned short iDeltaToProductInstance, unsigned short iDeltaToProcessName)
Definition: EDConsumerBase.h:210
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
edm::EDConsumerBase::mayConsume
EDGetToken mayConsume(const TypeToGet &id, edm::InputTag const &tag)
Definition: EDConsumerBase.h:146
edm::EDConsumerBase::esConsumes
auto esConsumes()
Definition: EDConsumerBase.h:168
edm::EDConsumerBase::TokenLookupInfo::m_index
ProductResolverIndexAndSkipBit m_index
Definition: EDConsumerBase.h:205
edm::EDConsumerBase::LabelPlacement
Definition: EDConsumerBase.h:209
edm::EDConsumerBase::consumes
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: EDConsumerBase.h:126
edm::EDConsumerBase::mayConsume
EDGetToken mayConsume(const TypeToGet &id, edm::InputTag const &tag)
Definition: EDConsumerBase.h:149
edm::EDConsumerBase::recordESConsumes
ESTokenIndex recordESConsumes(Transition, eventsetup::EventSetupRecordKey const &, eventsetup::heterocontainer::HCTypeTag const &, edm::ESInputTag const &iTag)
Definition: EDConsumerBase.cc:230
EventSetupRecordKey.h
edm::TypeToGet
Definition: TypeToGet.h:32
edm::EDConsumerBase::kAlwaysGets
Definition: EDConsumerBase.h:222
ConsumesInfo.h
edm::EDConsumerBase::consumes
EDGetToken consumes(const TypeToGet &id, edm::InputTag const &tag)
Definition: EDConsumerBase.h:131
edm::EDConsumerBase::throwTypeMismatch
void throwTypeMismatch(edm::TypeID const &, EDGetToken) const
Definition: EDConsumerBase.cc:379
ProductKindOfType.h
edm::InputTag
Definition: InputTag.h:15
edm::ConsumesCollector
Definition: ConsumesCollector.h:39
edm::EDConsumerBase::consumes
EDGetToken consumes(TypeToGet const &id, edm::InputTag const &tag)
Definition: EDConsumerBase.h:136
edm::EDConsumerBase::indexFrom
ProductResolverIndexAndSkipBit indexFrom(EDGetToken, BranchType, TypeID const &) const
Definition: EDConsumerBase.cc:260
ProductLabels.h
edm::ProductLabels
Definition: ProductLabels.h:4
HCTypeTag.h
edm::EDConsumerBase::convertCurrentProcessAlias
void convertCurrentProcessAlias(std::string const &processName)
Convert "@currentProcess" in InputTag process names to the actual current process name.
Definition: EDConsumerBase.cc:507
edm::EDConsumerBase::LabelPlacement::m_startOfModuleLabel
unsigned int m_startOfModuleLabel
Definition: EDConsumerBase.h:216