File indexing completed on 2025-03-13 02:31:48
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 ModuleProcessName;
0052 class ProductResolverIndexHelper;
0053 class EDConsumerBase;
0054 class PreallocationConfiguration;
0055 class ProductResolverIndexAndSkipBit;
0056 class ThinnedAssociationsHelper;
0057 class ActivityRegistry;
0058 class WaitingTaskHolder;
0059 class ServiceWeakToken;
0060 class SignallingProductRegistryFiller;
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 modulesWhoseProductsAreConsumed(std::array<std::vector<ModuleDescription const*>*, NumBranchTypes>& modules,
0117 std::vector<ModuleProcessName>& modulesInPreviousProcesses,
0118 ProductRegistry const& preg,
0119 std::map<std::string, ModuleDescription const*> const& labelsToDesc,
0120 std::string const& processName) const;
0121
0122 void esModulesWhoseProductsAreConsumed(
0123 std::array<std::vector<eventsetup::ComponentDescription const*>*, kNumberOfEventSetupTransitions>& esModules,
0124 eventsetup::ESRecordsToProductResolverIndices const&) const;
0125
0126 void convertCurrentProcessAlias(std::string const& processName);
0127
0128 std::vector<ModuleConsumesInfo> moduleConsumesInfos() const;
0129 std::vector<ModuleConsumesESInfo> moduleConsumesESInfos(
0130 eventsetup::ESRecordsToProductResolverIndices const&) const;
0131
0132 using ModuleToResolverIndicies =
0133 std::unordered_multimap<std::string, std::tuple<edm::TypeID const*, const char*, edm::ProductResolverIndex>>;
0134
0135 void resolvePutIndicies(BranchType iBranchType,
0136 ModuleToResolverIndicies const& iIndicies,
0137 std::string const& moduleLabel);
0138
0139 std::vector<edm::ProductResolverIndex> const& indiciesForPutProducts(BranchType iBranchType) const;
0140
0141 ProductResolverIndex transformPrefetch_(size_t iTransformIndex) const noexcept;
0142 size_t transformIndex_(edm::ProductDescription const& iBranch) const noexcept;
0143 void doTransformAsync(WaitingTaskHolder iTask,
0144 size_t iTransformIndex,
0145 EventPrincipal const& iEvent,
0146 ActivityRegistry*,
0147 ModuleCallingContext,
0148 ServiceWeakToken const&) noexcept;
0149
0150 protected:
0151 template <typename F>
0152 void createStreamModules(F iFunc) {
0153 unsigned int iStreamModule = 0;
0154 for (auto& m : m_streamModules) {
0155 m = iFunc(iStreamModule);
0156 m->setModuleDescriptionPtr(&moduleDescription_);
0157 ++iStreamModule;
0158 }
0159 }
0160
0161 void commit(ProcessBlock& iProcessBlock) {
0162 iProcessBlock.commit_(m_streamModules[0]->indiciesForPutProducts(InProcess));
0163 }
0164 void commit(Run& iRun) { iRun.commit_(m_streamModules[0]->indiciesForPutProducts(InRun)); }
0165 void commit(LuminosityBlock& iLumi) { iLumi.commit_(m_streamModules[0]->indiciesForPutProducts(InLumi)); }
0166 template <typename I>
0167 void commit(Event& iEvent, I* iID) {
0168 iEvent.commit_(m_streamModules[0]->indiciesForPutProducts(InEvent), iID);
0169 }
0170
0171 const EDConsumerBase* consumer() { return m_streamModules[0]; }
0172
0173 const ProducerBase* producer() { return m_streamModules[0]; }
0174
0175 void deleteModulesEarly();
0176
0177 private:
0178 void doPreallocate(PreallocationConfiguration const&);
0179 virtual void preallocRuns(unsigned int) {}
0180 virtual void preallocLumis(unsigned int) {}
0181 virtual void setupStreamModules() = 0;
0182 virtual void doBeginJob() = 0;
0183 virtual void doEndJob() = 0;
0184
0185 void doBeginStream(StreamID);
0186 void doEndStream(StreamID);
0187 void doStreamBeginRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0188 virtual void setupRun(T*, RunIndex) = 0;
0189 void doStreamEndRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0190 virtual void streamEndRunSummary(T*, edm::Run const&, edm::EventSetup const&) = 0;
0191
0192 void doStreamBeginLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0193 virtual void setupLuminosityBlock(T*, LuminosityBlockIndex) = 0;
0194 void doStreamEndLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0195 virtual void streamEndLuminosityBlockSummary(T*, edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
0196
0197 virtual void doBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0198 virtual void doAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0199 virtual void doEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0200 virtual void doBeginRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0201 virtual void doEndRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0202 virtual void doBeginLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0203 virtual void doEndLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0204
0205 void doRespondToOpenInputFile(FileBlock const&) {}
0206 void doRespondToCloseInputFile(FileBlock const&) {}
0207 virtual void doRespondToCloseOutputFile() = 0;
0208 void doRegisterThinnedAssociations(ProductRegistry const&, ThinnedAssociationsHelper&);
0209
0210
0211 void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0212 ModuleDescription moduleDescription_;
0213
0214 protected:
0215 std::vector<T*> m_streamModules;
0216 };
0217 }
0218 }
0219
0220 #endif