Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // -*- C++ -*-
0004 //
0005 // Package:     FWCore/Framework
0006 // Class  :     EDAnalyzerAdaptorBase
0007 //
0008 /**\class edm::stream::EDAnalyzerAdaptorBase EDAnalyzerAdaptorBase.h "FWCore/Framework/interface/stream/EDAnalyzerAdaptorBase.h"
0009 
0010  Description: [one line class summary]
0011 
0012  Usage:
0013     <usage>
0014 
0015 */
0016 //
0017 // Original Author:  Chris Jones
0018 //         Created:  Fri, 02 Aug 2013 18:09:15 GMT
0019 //
0020 
0021 // system include files
0022 #include <array>
0023 #include <map>
0024 #include <string>
0025 #include <vector>
0026 
0027 // user include files
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 // forward declarations
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   }  // namespace eventsetup
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;                   // stop default
0077       const EDAnalyzerAdaptorBase& operator=(const EDAnalyzerAdaptorBase&) = delete;  // stop default
0078       virtual ~EDAnalyzerAdaptorBase();
0079 
0080       // ---------- const member functions ---------------------
0081 
0082       // ---------- static member functions --------------------
0083 
0084       // ---------- member functions ---------------------------
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       //Same interface as EDConsumerBase
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       //For now this is a placeholder
0137       /*virtual*/ 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       // ---------- member data --------------------------------
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   }  // namespace stream
0183 }  // namespace edm
0184 #endif