File indexing completed on 2025-04-30 22:24:05
0001 #ifndef FWCore_Framework_stream_ProducingModuleAdaptorBase_h
0002 #define FWCore_Framework_stream_ProducingModuleAdaptorBase_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <array>
0023 #include <map>
0024 #include <string>
0025 #include <vector>
0026 #include <unordered_map>
0027
0028
0029 #include "FWCore/Utilities/interface/ProductResolverIndex.h"
0030 #include "FWCore/Common/interface/FWCoreCommonFwd.h"
0031 #include "FWCore/Framework/interface/Frameworkfwd.h"
0032 #include "DataFormats/Provenance/interface/ModuleDescription.h"
0033 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0034 #include "FWCore/Utilities/interface/BranchType.h"
0035 #include "FWCore/Utilities/interface/StreamID.h"
0036 #include "FWCore/Utilities/interface/RunIndex.h"
0037 #include "FWCore/Utilities/interface/LuminosityBlockIndex.h"
0038 #include "FWCore/Utilities/interface/ESIndices.h"
0039 #include "FWCore/Utilities/interface/Transition.h"
0040 #include "FWCore/Framework/interface/Event.h"
0041 #include "FWCore/Framework/interface/ProcessBlock.h"
0042 #include "FWCore/Framework/interface/Run.h"
0043 #include "FWCore/Framework/interface/LuminosityBlock.h"
0044 #include "FWCore/ServiceRegistry/interface/ServiceRegistryfwd.h"
0045
0046
0047
0048 namespace edm {
0049 class Event;
0050 class ModuleCallingContext;
0051 class ProductResolverIndexHelper;
0052 class EDConsumerBase;
0053 class PreallocationConfiguration;
0054 class ProductResolverIndexAndSkipBit;
0055 class ThinnedAssociationsHelper;
0056 class ActivityRegistry;
0057 class WaitingTaskHolder;
0058 class ServiceWeakToken;
0059 class SignallingProductRegistryFiller;
0060 struct ModuleConsumesMinimalESInfo;
0061
0062 namespace maker {
0063 template <typename T>
0064 class ModuleHolderT;
0065 }
0066
0067 namespace eventsetup {
0068 struct ComponentDescription;
0069 class ESRecordsToProductResolverIndices;
0070 }
0071
0072 namespace stream {
0073 template <typename T>
0074 class ProducingModuleAdaptorBase {
0075 public:
0076 template <typename U>
0077 friend class edm::WorkerT;
0078 template <typename U>
0079 friend class edm::maker::ModuleHolderT;
0080
0081 ProducingModuleAdaptorBase();
0082 ProducingModuleAdaptorBase(const ProducingModuleAdaptorBase&) = delete;
0083 const ProducingModuleAdaptorBase& operator=(const ProducingModuleAdaptorBase&) = delete;
0084 virtual ~ProducingModuleAdaptorBase();
0085
0086
0087
0088
0089
0090
0091 const ModuleDescription& moduleDescription() const noexcept { return moduleDescription_; }
0092
0093 virtual bool wantsProcessBlocks() const noexcept = 0;
0094 virtual bool wantsInputProcessBlocks() const noexcept = 0;
0095 virtual bool wantsGlobalRuns() const noexcept = 0;
0096 virtual bool wantsGlobalLuminosityBlocks() const noexcept = 0;
0097 virtual bool hasAcquire() const noexcept = 0;
0098 virtual bool hasAccumulator() const noexcept = 0;
0099 virtual bool wantsStreamRuns() const noexcept = 0;
0100 virtual bool wantsStreamLuminosityBlocks() const noexcept = 0;
0101
0102 void registerProductsAndCallbacks(ProducingModuleAdaptorBase const*, SignallingProductRegistryFiller* reg);
0103
0104 void itemsToGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0105 void itemsMayGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0106 std::vector<ProductResolverIndexAndSkipBit> const& itemsToGetFrom(BranchType) const;
0107
0108 std::vector<ESResolverIndex> const& esGetTokenIndicesVector(edm::Transition iTrans) const;
0109 std::vector<ESRecordIndex> const& esGetTokenRecordIndicesVector(edm::Transition iTrans) const;
0110
0111 void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&, bool iPrefetchMayGet);
0112 void updateLookup(eventsetup::ESRecordsToProductResolverIndices const&);
0113 void releaseMemoryPostLookupSignal();
0114 virtual void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) = 0;
0115
0116 void convertCurrentProcessAlias(std::string const& processName);
0117
0118 std::vector<ModuleConsumesInfo> moduleConsumesInfos() const;
0119 std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const;
0120
0121 using ModuleToResolverIndicies =
0122 std::unordered_multimap<std::string, std::tuple<edm::TypeID const*, const char*, edm::ProductResolverIndex>>;
0123
0124 void resolvePutIndicies(BranchType iBranchType,
0125 ModuleToResolverIndicies const& iIndicies,
0126 std::string const& moduleLabel);
0127
0128 std::vector<edm::ProductResolverIndex> const& indiciesForPutProducts(BranchType iBranchType) const;
0129
0130 ProductResolverIndex transformPrefetch_(size_t iTransformIndex) const noexcept;
0131 size_t transformIndex_(edm::ProductDescription const& iBranch) const noexcept;
0132 void doTransformAsync(WaitingTaskHolder iTask,
0133 size_t iTransformIndex,
0134 EventPrincipal const& iEvent,
0135 ActivityRegistry*,
0136 ModuleCallingContext,
0137 ServiceWeakToken const&) noexcept;
0138
0139 protected:
0140 template <typename F>
0141 void createStreamModules(F iFunc) {
0142 unsigned int iStreamModule = 0;
0143 for (auto& m : m_streamModules) {
0144 m = iFunc(iStreamModule);
0145 m->setModuleDescriptionPtr(&moduleDescription_);
0146 ++iStreamModule;
0147 }
0148 }
0149
0150 void commit(ProcessBlock& iProcessBlock) {
0151 iProcessBlock.commit_(m_streamModules[0]->indiciesForPutProducts(InProcess));
0152 }
0153 void commit(Run& iRun) { iRun.commit_(m_streamModules[0]->indiciesForPutProducts(InRun)); }
0154 void commit(LuminosityBlock& iLumi) { iLumi.commit_(m_streamModules[0]->indiciesForPutProducts(InLumi)); }
0155 template <typename I>
0156 void commit(Event& iEvent, I* iID) {
0157 iEvent.commit_(m_streamModules[0]->indiciesForPutProducts(InEvent), iID);
0158 }
0159
0160 const EDConsumerBase* consumer() { return m_streamModules[0]; }
0161
0162 const ProducerBase* producer() { return m_streamModules[0]; }
0163
0164 void deleteModulesEarly();
0165
0166 private:
0167 void doPreallocate(PreallocationConfiguration const&);
0168 virtual void preallocRuns(unsigned int) {}
0169 virtual void preallocLumis(unsigned int) {}
0170 virtual void setupStreamModules() = 0;
0171 virtual void doBeginJob() = 0;
0172 virtual void doEndJob() = 0;
0173
0174 void doBeginStream(StreamID);
0175 void doEndStream(StreamID);
0176 void doStreamBeginRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0177 virtual void setupRun(T*, RunIndex) = 0;
0178 void doStreamEndRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0179 virtual void streamEndRunSummary(T*, edm::Run const&, edm::EventSetup const&) = 0;
0180
0181 void doStreamBeginLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0182 virtual void setupLuminosityBlock(T*, LuminosityBlockIndex) = 0;
0183 void doStreamEndLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0184 virtual void streamEndLuminosityBlockSummary(T*, edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
0185
0186 virtual void doBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0187 virtual void doAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0188 virtual void doEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0189 virtual void doBeginRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0190 virtual void doEndRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0191 virtual void doBeginLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0192 virtual void doEndLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0193
0194 void doRespondToOpenInputFile(FileBlock const&) {}
0195 void doRespondToCloseInputFile(FileBlock const&) {}
0196 virtual void doRespondToCloseOutputFile() = 0;
0197 void doRegisterThinnedAssociations(ProductRegistry const&, ThinnedAssociationsHelper&);
0198
0199
0200 void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0201 ModuleDescription moduleDescription_;
0202
0203 protected:
0204 std::vector<T*> m_streamModules;
0205 };
0206 }
0207 }
0208
0209 #endif