File indexing completed on 2025-06-29 22:58:01
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 void registerProductsAndCallbacks(EDAnalyzerAdaptorBase const*, SignallingProductRegistryFiller* reg);
0095
0096 protected:
0097 template <typename T>
0098 void createStreamModules(T iFunc) {
0099 unsigned int iStreamModule = 0;
0100 for (auto& m : m_streamModules) {
0101 m = iFunc(iStreamModule);
0102 setModuleDescriptionPtr(m);
0103 ++iStreamModule;
0104 }
0105 }
0106
0107
0108 void itemsToGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0109 void itemsMayGet(BranchType, std::vector<ProductResolverIndexAndSkipBit>&) const;
0110 std::vector<ProductResolverIndexAndSkipBit> const& itemsToGetFrom(BranchType) const;
0111
0112 std::vector<ESResolverIndex> const& esGetTokenIndicesVector(edm::Transition iTrans) const;
0113 std::vector<ESRecordIndex> const& esGetTokenRecordIndicesVector(edm::Transition iTrans) const;
0114
0115 void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&, bool iPrefetchMayGet);
0116 void updateLookup(eventsetup::ESRecordsToProductResolverIndices const&);
0117 void releaseMemoryPostLookupSignal();
0118
0119 virtual void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) = 0;
0120
0121 const EDConsumerBase* consumer() const;
0122
0123 void convertCurrentProcessAlias(std::string const& processName);
0124
0125 std::vector<ModuleConsumesInfo> moduleConsumesInfos() const;
0126 std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const;
0127 void deleteModulesEarly();
0128
0129 private:
0130 bool doEvent(EventTransitionInfo const&, ActivityRegistry*, ModuleCallingContext const*);
0131 void doPreallocate(PreallocationConfiguration const&);
0132 virtual void preallocRuns(unsigned int) {}
0133 virtual void preallocLumis(unsigned int) {}
0134
0135
0136 void preActionBeforeRunEventAsync(WaitingTaskHolder,
0137 ModuleCallingContext const&,
0138 Principal const&) const noexcept {}
0139
0140 virtual void setupStreamModules() = 0;
0141 virtual void doBeginJob() = 0;
0142 virtual void doEndJob() = 0;
0143
0144 void doBeginStream(StreamID id);
0145 void doEndStream(StreamID id);
0146 void doStreamBeginRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0147 virtual void setupRun(EDAnalyzerBase*, RunIndex) = 0;
0148 void doStreamEndRun(StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0149 virtual void streamEndRunSummary(EDAnalyzerBase*, edm::Run const&, edm::EventSetup const&) = 0;
0150
0151 void doStreamBeginLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0152 virtual void setupLuminosityBlock(EDAnalyzerBase*, LuminosityBlockIndex) = 0;
0153 void doStreamEndLuminosityBlock(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0154 virtual void streamEndLuminosityBlockSummary(EDAnalyzerBase*,
0155 edm::LuminosityBlock const&,
0156 edm::EventSetup const&) = 0;
0157
0158 virtual void doBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0159 virtual void doAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0160 virtual void doEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) = 0;
0161 virtual void doBeginRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0162 virtual void doEndRun(RunTransitionInfo const&, ModuleCallingContext const*) = 0;
0163 virtual void doBeginLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0164 virtual void doEndLuminosityBlock(LumiTransitionInfo const&, ModuleCallingContext const*) = 0;
0165
0166 void doRespondToOpenInputFile(FileBlock const&) {}
0167 void doRespondToCloseInputFile(FileBlock const&) {}
0168 virtual void doRespondToCloseOutputFile() = 0;
0169 void doRegisterThinnedAssociations(ProductRegistry const&, ThinnedAssociationsHelper&) {}
0170
0171 bool hasAcquire() const noexcept { return false; }
0172 bool hasAccumulator() const noexcept { return false; }
0173
0174
0175 void setModuleDescriptionPtr(EDAnalyzerBase* m);
0176 void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0177 ModuleDescription moduleDescription_;
0178
0179 std::vector<EDAnalyzerBase*> m_streamModules;
0180 };
0181 }
0182 }
0183 #endif