File indexing completed on 2023-03-17 11:01:58
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 "DataFormats/Provenance/interface/BranchType.h"
0030 #include "FWCore/Utilities/interface/ProductResolverIndex.h"
0031 #include "FWCore/Common/interface/FWCoreCommonFwd.h"
0032 #include "FWCore/Framework/interface/Frameworkfwd.h"
0033 #include "DataFormats/Provenance/interface/ModuleDescription.h"
0034 #include "FWCore/ParameterSet/interface/ParameterSetfwd.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/Framework/interface/Event.h"
0040 #include "FWCore/Framework/interface/ProcessBlock.h"
0041 #include "FWCore/Framework/interface/Run.h"
0042 #include "FWCore/Framework/interface/LuminosityBlock.h"
0043 #include "FWCore/ServiceRegistry/interface/ConsumesInfo.h"
0044
0045
0046
0047 namespace edm {
0048 class Event;
0049 class ModuleCallingContext;
0050 class ModuleProcessName;
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
0060 namespace maker {
0061 template <typename T>
0062 class ModuleHolderT;
0063 }
0064
0065 namespace eventsetup {
0066 class ESRecordsToProxyIndices;
0067 }
0068
0069 namespace stream {
0070 template <typename T>
0071 class ProducingModuleAdaptorBase {
0072 public:
0073 template <typename U>
0074 friend class edm::WorkerT;
0075 template <typename U>
0076 friend class edm::maker::ModuleHolderT;
0077
0078 ProducingModuleAdaptorBase();
0079 ProducingModuleAdaptorBase(const ProducingModuleAdaptorBase&) = delete;
0080 const ProducingModuleAdaptorBase& operator=(const ProducingModuleAdaptorBase&) = delete;
0081 virtual ~ProducingModuleAdaptorBase();
0082
0083
0084
0085
0086
0087
0088 const ModuleDescription& moduleDescription() const { return moduleDescription_; }
0089
0090 virtual bool wantsProcessBlocks() const = 0;
0091 virtual bool wantsInputProcessBlocks() const = 0;
0092 virtual bool wantsGlobalRuns() const = 0;
0093 virtual bool wantsGlobalLuminosityBlocks() const = 0;
0094 virtual bool hasAcquire() const = 0;
0095 virtual bool hasAccumulator() const = 0;
0096 bool wantsStreamRuns() const { return true; }
0097 bool wantsStreamLuminosityBlocks() const { return true; }
0098
0099 void registerProductsAndCallbacks(ProducingModuleAdaptorBase const*, ProductRegistry* reg);
0100
0101 void itemsToGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0102 void itemsMayGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0103 std::vector<ProductResolverIndexAndSkipBit> const& itemsToGetFrom(BranchType) const;
0104
0105 std::vector<ESProxyIndex> const& esGetTokenIndicesVector(edm::Transition iTrans) const;
0106 std::vector<ESRecordIndex> const& esGetTokenRecordIndicesVector(edm::Transition iTrans) const;
0107
0108 void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&, bool iPrefetchMayGet);
0109 void updateLookup(eventsetup::ESRecordsToProxyIndices const&);
0110 virtual void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) = 0;
0111
0112 void modulesWhoseProductsAreConsumed(std::array<std::vector<ModuleDescription const*>*, NumBranchTypes>& modules,
0113 std::vector<ModuleProcessName>& modulesInPreviousProcesses,
0114 ProductRegistry const& preg,
0115 std::map<std::string, ModuleDescription const*> const& labelsToDesc,
0116 std::string const& processName) const;
0117
0118 void convertCurrentProcessAlias(std::string const& processName);
0119
0120 std::vector<ConsumesInfo> consumesInfo() const;
0121
0122 using ModuleToResolverIndicies =
0123 std::unordered_multimap<std::string, std::tuple<edm::TypeID const*, const char*, edm::ProductResolverIndex>>;
0124
0125 void resolvePutIndicies(BranchType iBranchType,
0126 ModuleToResolverIndicies const& iIndicies,
0127 std::string const& moduleLabel);
0128
0129 std::vector<edm::ProductResolverIndex> const& indiciesForPutProducts(BranchType iBranchType) const;
0130
0131 ProductResolverIndex transformPrefetch_(size_t iTransformIndex) const;
0132 size_t transformIndex_(edm::BranchDescription const& iBranch) const;
0133 void doTransformAsync(WaitingTaskHolder iTask,
0134 size_t iTransformIndex,
0135 EventPrincipal const& iEvent,
0136 ActivityRegistry*,
0137 ModuleCallingContext const*,
0138 ServiceWeakToken const&);
0139
0140 protected:
0141 template <typename F>
0142 void createStreamModules(F iFunc) {
0143 unsigned int iStreamModule = 0;
0144 for (auto& m : m_streamModules) {
0145 m = iFunc(iStreamModule);
0146 m->setModuleDescriptionPtr(&moduleDescription_);
0147 ++iStreamModule;
0148 }
0149 }
0150
0151 void commit(ProcessBlock& iProcessBlock) {
0152 iProcessBlock.commit_(m_streamModules[0]->indiciesForPutProducts(InProcess));
0153 }
0154 void commit(Run& iRun) { iRun.commit_(m_streamModules[0]->indiciesForPutProducts(InRun)); }
0155 void commit(LuminosityBlock& iLumi) { iLumi.commit_(m_streamModules[0]->indiciesForPutProducts(InLumi)); }
0156 template <typename I>
0157 void commit(Event& iEvent, I* iID) {
0158 iEvent.commit_(m_streamModules[0]->indiciesForPutProducts(InEvent), iID);
0159 }
0160
0161 const EDConsumerBase* consumer() { return m_streamModules[0]; }
0162
0163 const ProducerBase* producer() { return m_streamModules[0]; }
0164
0165 void deleteModulesEarly();
0166
0167 private:
0168 void doPreallocate(PreallocationConfiguration const&);
0169 virtual void preallocRuns(unsigned int) {}
0170 virtual void preallocLumis(unsigned int) {}
0171 virtual void setupStreamModules() = 0;
0172 virtual void doBeginJob() = 0;
0173 virtual void doEndJob() = 0;
0174
0175 void doBeginStream(StreamID);
0176 void doEndStream(StreamID);
0177 void doStreamBeginRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0178 virtual void setupRun(T*, RunIndex) = 0;
0179 void doStreamEndRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0180 virtual void streamEndRunSummary(T*, edm::Run const&, edm::EventSetup const&) = 0;
0181
0182 void doStreamBeginLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0183 virtual void setupLuminosityBlock(T*, LuminosityBlockIndex) = 0;
0184 void doStreamEndLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0185 virtual void streamEndLuminosityBlockSummary(T*, edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
0186
0187 virtual void doBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0188 virtual void doAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0189 virtual void doEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0190 virtual void doBeginRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0191 virtual void doEndRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0192 virtual void doBeginLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0193 virtual void doEndLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0194
0195 void doRespondToOpenInputFile(FileBlock const&) {}
0196 void doRespondToCloseInputFile(FileBlock const&) {}
0197 virtual void doRespondToCloseOutputFile() = 0;
0198 void doRegisterThinnedAssociations(ProductRegistry const&, ThinnedAssociationsHelper&);
0199
0200
0201 void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0202 ModuleDescription moduleDescription_;
0203
0204 protected:
0205 std::vector<T*> m_streamModules;
0206 };
0207 }
0208 }
0209
0210 #endif