40 #include "Randomize.hh"
45 typedef std::vector<std::shared_ptr<SimProducer> >
Producers;
88 class StaticRandomEngineSetUnset {
91 explicit StaticRandomEngineSetUnset(CLHEP::HepRandomEngine* engine);
92 ~StaticRandomEngineSetUnset();
94 CLHEP::HepRandomEngine* currentEngine() {
return m_currentEngine; }
97 CLHEP::HepRandomEngine* m_currentEngine;
98 CLHEP::HepRandomEngine* m_previousEngine;
105 StaticRandomEngineSetUnset random(
nullptr);
110 StaticRandomEngineSetUnset random(
nullptr);
117 produces<edm::SimTrackContainer>().setBranchAlias(
"SimTracks");
118 produces<edm::SimVertexContainer>().setBranchAlias(
"SimVertices");
119 produces<edm::PSimHitContainer>(
"TrackerHitsPixelBarrelLowTof");
120 produces<edm::PSimHitContainer>(
"TrackerHitsPixelBarrelHighTof");
121 produces<edm::PSimHitContainer>(
"TrackerHitsTIBLowTof");
122 produces<edm::PSimHitContainer>(
"TrackerHitsTIBHighTof");
123 produces<edm::PSimHitContainer>(
"TrackerHitsTIDLowTof");
124 produces<edm::PSimHitContainer>(
"TrackerHitsTIDHighTof");
125 produces<edm::PSimHitContainer>(
"TrackerHitsPixelEndcapLowTof");
126 produces<edm::PSimHitContainer>(
"TrackerHitsPixelEndcapHighTof");
127 produces<edm::PSimHitContainer>(
"TrackerHitsTOBLowTof");
128 produces<edm::PSimHitContainer>(
"TrackerHitsTOBHighTof");
129 produces<edm::PSimHitContainer>(
"TrackerHitsTECLowTof");
130 produces<edm::PSimHitContainer>(
"TrackerHitsTECHighTof");
132 produces<edm::PSimHitContainer>(
"TotemHitsT1");
133 produces<edm::PSimHitContainer>(
"TotemHitsT2Gem");
134 produces<edm::PSimHitContainer>(
"TotemHitsRP");
135 produces<edm::PSimHitContainer>(
"CTPPSPixelHits");
136 produces<edm::PSimHitContainer>(
"CTPPSTimingHits");
137 produces<edm::PSimHitContainer>(
"FP420SI");
138 produces<edm::PSimHitContainer>(
"BSCHits");
139 produces<edm::PSimHitContainer>(
"PLTHits");
140 produces<edm::PSimHitContainer>(
"BCM1FHits");
141 produces<edm::PSimHitContainer>(
"BHMHits");
142 produces<edm::PSimHitContainer>(
"FastTimerHitsBarrel");
143 produces<edm::PSimHitContainer>(
"FastTimerHitsEndcap");
145 produces<edm::PCaloHitContainer>(
"EcalHitsEB");
146 produces<edm::PCaloHitContainer>(
"EcalHitsEE");
147 produces<edm::PCaloHitContainer>(
"EcalHitsES");
148 produces<edm::PCaloHitContainer>(
"HcalHits");
149 produces<edm::PCaloHitContainer>(
"CaloHitsTk");
150 produces<edm::PCaloHitContainer>(
"HGCHitsEE");
151 produces<edm::PCaloHitContainer>(
"HGCHitsHEfront");
152 produces<edm::PCaloHitContainer>(
"HGCHitsHEback");
154 produces<edm::PSimHitContainer>(
"MuonDTHits");
155 produces<edm::PSimHitContainer>(
"MuonCSCHits");
156 produces<edm::PSimHitContainer>(
"MuonRPCHits");
157 produces<edm::PSimHitContainer>(
"MuonGEMHits");
158 produces<edm::PSimHitContainer>(
"MuonME0Hits");
159 produces<edm::PCaloHitContainer>(
"CastorPL");
160 produces<edm::PCaloHitContainer>(
"CastorFI");
161 produces<edm::PCaloHitContainer>(
"CastorBU");
162 produces<edm::PCaloHitContainer>(
"CastorTU");
163 produces<edm::PCaloHitContainer>(
"EcalTBH4BeamHits");
164 produces<edm::PCaloHitContainer>(
"HcalTB06BeamHits");
165 produces<edm::PCaloHitContainer>(
"ZDCHITS");
166 produces<edm::PCaloHitContainer>(
"ChamberHits");
167 produces<edm::PCaloHitContainer>(
"FibreHits");
168 produces<edm::PCaloHitContainer>(
"WedgeHits");
169 produces<edm::PCaloHitContainer>(
"HFNoseHits");
170 produces<edm::PCaloHitContainer>(
"TotemHitsT2Scint");
174 for (
auto& ptr : producers) {
175 ptr->registerProducts(producesCollector());
177 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer is constructed";
190 StaticRandomEngineSetUnset random(
nullptr);
191 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::initializeGlobalCache";
193 return std::make_unique<OscarMTMasterThread>(
iConfig);
200 StaticRandomEngineSetUnset random(
nullptr);
201 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::globalBeginRun";
203 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::globalBeginRun done";
204 return std::shared_ptr<int>();
208 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::globalEndRun";
209 iContext->
global()->endRun();
213 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::globalEndJob";
225 edm::LogVerbatim(
"SimG4CoreApplication") <<
"OscarMTProducer::beginRun done";
230 StaticRandomEngineSetUnset random(
nullptr);
234 StaticRandomEngineSetUnset random(
nullptr);
242 StaticRandomEngineSetUnset random(e.
streamID());
243 auto engine = random.currentEngine();
250 std::unique_ptr<G4SimEvent> evt;
255 StaticRandomEngineSetUnset random(engine);
262 <<
"SimG4CoreApplication exception in generation of event " << e.
id() <<
" in stream " << e.
streamID() <<
" \n"
274 for (
auto& tracker : sTk) {
275 const std::vector<std::string>&
v = tracker->getNames();
276 for (
auto&
name : v) {
278 tracker->fillHits(*product,
name);
279 if (product !=
nullptr && !product->empty())
280 edm::LogVerbatim(
"SimG4CoreApplication") <<
"Produced " << product->size() <<
" tracker hits <" <<
name <<
">";
284 for (
auto& calo : sCalo) {
285 const std::vector<std::string>&
v = calo->getNames();
287 for (
auto&
name : v) {
289 calo->fillHits(*product,
name);
290 if (product !=
nullptr && !product->empty())
291 edm::LogVerbatim(
"SimG4CoreApplication") <<
"Produced " << product->size() <<
" calo hits <" <<
name <<
">";
298 prod.get()->produce(e, es);
304 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
edm::StreamID const& streamID) {
308 <<
"The OscarMTProducer module requires the RandomNumberGeneratorService\n"
309 "which is not present in the configuration file. You must add the service\n"
310 "in the configuration file if you want to run OscarMTProducer";
312 m_currentEngine = &(rng->
getEngine(streamID));
314 m_previousEngine = G4Random::getTheEngine();
315 G4Random::setTheEngine(m_currentEngine);
318 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(CLHEP::HepRandomEngine* engine) {
319 m_currentEngine = engine;
320 m_previousEngine = G4Random::getTheEngine();
321 G4Random::setTheEngine(m_currentEngine);
324 StaticRandomEngineSetUnset::~StaticRandomEngineSetUnset() { G4Random::setTheEngine(m_previousEngine); }
Log< level::Info, true > LogVerbatim
T getUntrackedParameter(std::string const &, T const &) const
std::vector< PCaloHit > PCaloHitContainer
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const edm::EventSetup & c
static std::shared_ptr< int > globalBeginRun(const edm::Run &iRun, const edm::EventSetup &iSetup, const OscarMTMasterThread *masterThread)
std::unique_ptr< RunManagerMTWorker > m_runManagerWorker
#define DEFINE_FWK_MODULE(type)
OscarMTProducer(edm::ParameterSet const &p, const OscarMTMasterThread *)
~OscarMTProducer() override
std::vector< std::shared_ptr< SimProducer > > Producers
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
ServiceToken presentToken() const
void beginRun(const edm::EventSetup &iSetup) const
const OscarMTMasterThread * m_masterThread
static ServiceRegistry & instance()
void produce(edm::Event &e, const edm::EventSetup &c) override
static void globalEndRun(const edm::Run &iRun, const edm::EventSetup &iSetup, const RunContext *iContext)
RunManagerMT * runManagerMasterPtr() const
static std::unique_ptr< OscarMTMasterThread > initializeGlobalCache(const edm::ParameterSet &iConfig)
void endRun(const edm::Run &r, const edm::EventSetup &c) override
std::vector< SimVertex > SimVertexContainer
StreamID streamID() const
void callConsumes(edm::ConsumesCollector &&iC) const
std::vector< PSimHit > PSimHitContainer
omt::ThreadHandoff m_handoff
static void globalEndJob(OscarMTMasterThread *masterThread)
Log< level::Warning, false > LogWarning
std::vector< SimTrack > SimTrackContainer
const char * what() const override
void beginRun(const edm::Run &r, const edm::EventSetup &c) override