File indexing completed on 2025-04-30 22:24:05
0001 #ifndef FWCore_Framework_stream_EDAnalyzerAdaptorBase_h
0002 #define FWCore_Framework_stream_EDAnalyzerAdaptorBase_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
0027
0028 #include "FWCore/Utilities/interface/ProductResolverIndex.h"
0029 #include "FWCore/Common/interface/FWCoreCommonFwd.h"
0030 #include "FWCore/Framework/interface/Frameworkfwd.h"
0031 #include "DataFormats/Provenance/interface/ModuleDescription.h"
0032 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0033 #include "FWCore/ServiceRegistry/interface/ServiceRegistryfwd.h"
0034 #include "FWCore/Concurrency/interface/WaitingTaskHolder.h"
0035 #include "FWCore/Utilities/interface/BranchType.h"
0036 #include "FWCore/Utilities/interface/StreamID.h"
0037 #include "FWCore/Utilities/interface/RunIndex.h"
0038 #include "FWCore/Utilities/interface/LuminosityBlockIndex.h"
0039 #include "FWCore/Utilities/interface/ESIndices.h"
0040 #include "FWCore/Utilities/interface/Transition.h"
0041
0042
0043
0044 namespace edm {
0045 class ModuleCallingContext;
0046 class ProductResolverIndexHelper;
0047 class EDConsumerBase;
0048 class PreallocationConfiguration;
0049 class ProductResolverIndexAndSkipBit;
0050 class ActivityRegistry;
0051 class ThinnedAssociationsHelper;
0052 class SignallingProductRegistryFiller;
0053 struct ModuleConsumesMinimalESInfo;
0054
0055 namespace maker {
0056 template <typename T>
0057 class ModuleHolderT;
0058 }
0059
0060 namespace eventsetup {
0061 struct ComponentDescription;
0062 class ESRecordsToProductResolverIndices;
0063 }
0064
0065 namespace stream {
0066 class EDAnalyzerBase;
0067
0068 class EDAnalyzerAdaptorBase {
0069 public:
0070 template <typename T>
0071 friend class edm::WorkerT;
0072 template <typename T>
0073 friend class edm::maker::ModuleHolderT;
0074
0075 EDAnalyzerAdaptorBase();
0076 EDAnalyzerAdaptorBase(const EDAnalyzerAdaptorBase&) = delete;
0077 const EDAnalyzerAdaptorBase& operator=(const EDAnalyzerAdaptorBase&) = delete;
0078 virtual ~EDAnalyzerAdaptorBase();
0079
0080
0081
0082
0083
0084
0085 const ModuleDescription& moduleDescription() const { return moduleDescription_; }
0086
0087 virtual bool wantsProcessBlocks() const noexcept = 0;
0088 virtual bool wantsInputProcessBlocks() const noexcept = 0;
0089 virtual bool wantsGlobalRuns() const noexcept = 0;
0090 virtual bool wantsGlobalLuminosityBlocks() const noexcept = 0;
0091 virtual bool wantsStreamRuns() const noexcept = 0;
0092 virtual bool wantsStreamLuminosityBlocks() const noexcept = 0;
0093
0094 std::string workerType() const { return "WorkerT<EDAnalyzerAdaptorBase>"; }
0095 void registerProductsAndCallbacks(EDAnalyzerAdaptorBase const*, SignallingProductRegistryFiller* reg);
0096
0097 protected:
0098 template <typename T>
0099 void createStreamModules(T iFunc) {
0100 unsigned int iStreamModule = 0;
0101 for (auto& m : m_streamModules) {
0102 m = iFunc(iStreamModule);
0103 setModuleDescriptionPtr(m);
0104 ++iStreamModule;
0105 }
0106 }
0107
0108
0109 void itemsToGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0110 void itemsMayGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0111 std::vector<ProductResolverIndexAndSkipBit> const& itemsToGetFrom(BranchType) const;
0112
0113 std::vector<ESResolverIndex> const& esGetTokenIndicesVector(edm::Transition iTrans) const;
0114 std::vector<ESRecordIndex> const& esGetTokenRecordIndicesVector(edm::Transition iTrans) const;
0115
0116 void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&, bool iPrefetchMayGet);
0117 void updateLookup(eventsetup::ESRecordsToProductResolverIndices const&);
0118 void releaseMemoryPostLookupSignal();
0119
0120 virtual void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) = 0;
0121
0122 const EDConsumerBase* consumer() const;
0123
0124 void convertCurrentProcessAlias(std::string const& processName);
0125
0126 std::vector<ModuleConsumesInfo> moduleConsumesInfos() const;
0127 std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const;
0128 void deleteModulesEarly();
0129
0130 private:
0131 bool doEvent(EventTransitionInfo const&, ActivityRegistry*, ModuleCallingContext const*);
0132 void doPreallocate(PreallocationConfiguration const&);
0133 virtual void preallocRuns(unsigned int) {}
0134 virtual void preallocLumis(unsigned int) {}
0135
0136
0137 void preActionBeforeRunEventAsync(WaitingTaskHolder,
0138 ModuleCallingContext const&,
0139 Principal const&) const noexcept {}
0140
0141 virtual void setupStreamModules() = 0;
0142 virtual void doBeginJob() = 0;
0143 virtual void doEndJob() = 0;
0144
0145 void doBeginStream(StreamID id);
0146 void doEndStream(StreamID id);
0147 void doStreamBeginRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0148 virtual void setupRun(EDAnalyzerBase*, RunIndex) = 0;
0149 void doStreamEndRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0150 virtual void streamEndRunSummary(EDAnalyzerBase*, edm::Run const&, edm::EventSetup const&) = 0;
0151
0152 void doStreamBeginLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0153 virtual void setupLuminosityBlock(EDAnalyzerBase*, LuminosityBlockIndex) = 0;
0154 void doStreamEndLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0155 virtual void streamEndLuminosityBlockSummary(EDAnalyzerBase*,
0156 edm::LuminosityBlock const&,
0157 edm::EventSetup const&) = 0;
0158
0159 virtual void doBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0160 virtual void doAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0161 virtual void doEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0162 virtual void doBeginRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0163 virtual void doEndRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0164 virtual void doBeginLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0165 virtual void doEndLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0166
0167 void doRespondToOpenInputFile(FileBlock const&) {}
0168 void doRespondToCloseInputFile(FileBlock const&) {}
0169 virtual void doRespondToCloseOutputFile() = 0;
0170 void doRegisterThinnedAssociations(ProductRegistry const&, ThinnedAssociationsHelper&) {}
0171
0172 bool hasAcquire() const noexcept { return false; }
0173 bool hasAccumulator() const noexcept { return false; }
0174
0175
0176 void setModuleDescriptionPtr(EDAnalyzerBase* m);
0177 void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0178 ModuleDescription moduleDescription_;
0179
0180 std::vector<EDAnalyzerBase*> m_streamModules;
0181 };
0182 }
0183 }
0184 #endif