Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // -*- C++ -*-
0004 //
0005 // Package:     FWCore/Framework
0006 // Class  :     ProducingModuleAdaptorBase
0007 //
0008 /**\class edm::stream::ProducingModuleAdaptorBase ProducingModuleAdaptorBase.h "FWCore/Framework/interface/stream/ProducingModuleAdaptorBase.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 #include <unordered_map>
0027 
0028 // user include files
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 // forward declarations
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   }  // namespace eventsetup
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;                   // stop default
0083       const ProducingModuleAdaptorBase& operator=(const ProducingModuleAdaptorBase&) = delete;  // stop default
0084       virtual ~ProducingModuleAdaptorBase();
0085 
0086       // ---------- const member functions ---------------------
0087 
0088       // ---------- static member functions --------------------
0089 
0090       // ---------- member functions ---------------------------
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       // ---------- member data --------------------------------
0211       void setModuleDescription(ModuleDescription const& md) { moduleDescription_ = md; }
0212       ModuleDescription moduleDescription_;
0213 
0214     protected:
0215       std::vector<T*> m_streamModules;
0216     };
0217   }  // namespace stream
0218 }  // namespace edm
0219 
0220 #endif