File indexing completed on 2025-04-09 02:02:19
0001 #ifndef SimG4Core_Application_RunManagerMTWorker_H
0002 #define SimG4Core_Application_RunManagerMTWorker_H
0003
0004 #include "FWCore/Utilities/interface/EDGetToken.h"
0005
0006 #include "DataFormats/Provenance/interface/RunID.h"
0007 #include "SimDataFormats/Forward/interface/LHCTransportLinkContainer.h"
0008
0009 #include "SimG4Core/Generators/interface/Generator.h"
0010 #include "SimG4Core/Generators/interface/Generator3.h"
0011 #include "SimG4Core/Notification/interface/TmpSimEvent.h"
0012
0013 #include "MagneticField/Engine/interface/MagneticField.h"
0014 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0015
0016 #include <memory>
0017 #include <unordered_map>
0018 #include <string>
0019
0020 namespace edm {
0021 class ParameterSet;
0022 class Event;
0023 class EventSetup;
0024 class ConsumesCollector;
0025 class HepMCProduct;
0026 class HepMC3Product;
0027 }
0028
0029 class Generator;
0030 class RunManagerMT;
0031
0032 class G4Event;
0033 class G4Run;
0034 class SimTrackManager;
0035 class CustomUIsession;
0036
0037 class RunAction;
0038 class EventAction;
0039 class Phase2EventAction;
0040 class TrackingAction;
0041 class Phase2TrackingAction;
0042 class SteppingAction;
0043 class Phase2SteppingAction;
0044 class CMSSteppingVerbose;
0045 class CMSSimEventManager;
0046 class G4Field;
0047
0048 class SensitiveTkDetector;
0049 class SensitiveCaloDetector;
0050 class SensitiveDetectorMakerBase;
0051
0052 class SimWatcher;
0053 class SimProducer;
0054
0055 class RunManagerMTWorker {
0056 public:
0057 explicit RunManagerMTWorker(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC);
0058 ~RunManagerMTWorker();
0059
0060 void beginRun(const edm::EventSetup&);
0061 void endRun();
0062
0063 TmpSimEvent* produce(const edm::Event& inpevt, const edm::EventSetup& es, RunManagerMT& runManagerMaster);
0064
0065 void abortEvent();
0066 void abortRun(bool softAbort = false);
0067
0068 void Connect(RunAction*);
0069 void Connect(EventAction*);
0070 void Connect(Phase2EventAction*);
0071 void Connect(TrackingAction*);
0072 void Connect(Phase2TrackingAction*);
0073 void Connect(SteppingAction*);
0074 void Connect(Phase2SteppingAction*);
0075
0076 SimTrackManager* getSimTrackManager();
0077 std::vector<SensitiveTkDetector*>& sensTkDetectors();
0078 std::vector<SensitiveCaloDetector*>& sensCaloDetectors();
0079 std::vector<std::shared_ptr<SimProducer>>& producers();
0080
0081 void initializeG4(RunManagerMT* runManagerMaster, const edm::EventSetup& es);
0082
0083 inline TmpSimEvent* simEvent() { return &m_simEvent; }
0084 inline int getThreadIndex() const { return m_thread_index; }
0085
0086 private:
0087 void initializeTLS();
0088 void initializeUserActions();
0089 void initializeRun();
0090 void terminateRun();
0091
0092 G4Event* generateEvent(const edm::Event& inpevt);
0093 void resetGenParticleId(const edm::Event& inpevt);
0094
0095 void DumpMagneticField(const G4Field*, const std::string&) const;
0096
0097 Generator m_generator;
0098 Generator3 m_generator3;
0099 edm::EDGetTokenT<edm::HepMCProduct> m_InToken;
0100 edm::EDGetTokenT<edm::HepMC3Product> m_InToken3;
0101 edm::EDGetTokenT<edm::HepMCProduct> m_LHCToken;
0102 edm::EDGetTokenT<edm::LHCTransportLinkContainer> m_theLHCTlinkToken;
0103 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> m_MagField;
0104 const MagneticField* m_pMagField{nullptr};
0105
0106 bool m_nonBeam{false};
0107 bool m_UseG4EventManager{true};
0108 bool m_pUseMagneticField{true};
0109 bool m_hasWatchers{false};
0110 bool m_LHCTransport{false};
0111 bool m_dumpMF{false};
0112 bool m_dumpGDML{false};
0113 bool m_endOfRun{false};
0114 bool m_isPhase2{false};
0115
0116 const int m_thread_index{-1};
0117
0118 edm::ParameterSet m_pField;
0119 edm::ParameterSet m_pRunAction;
0120 edm::ParameterSet m_pEventAction;
0121 edm::ParameterSet m_pStackingAction;
0122 edm::ParameterSet m_pTrackingAction;
0123 edm::ParameterSet m_pSteppingAction;
0124 std::vector<std::string> m_G4Commands;
0125 std::vector<std::string> m_G4CommandsEndRun;
0126 edm::ParameterSet m_p;
0127
0128 struct TLSData;
0129 TLSData* m_tls{nullptr};
0130
0131 CustomUIsession* m_UIsession{nullptr};
0132 TmpSimEvent m_simEvent;
0133 std::unique_ptr<CMSSimEventManager> m_evtManager;
0134 std::unique_ptr<CMSSteppingVerbose> m_sVerbose;
0135 std::unordered_map<std::string, std::unique_ptr<SensitiveDetectorMakerBase>> m_sdMakers;
0136 };
0137
0138 #endif