CMS 3D CMS Logo

OscarMTProducer.cc
Go to the documentation of this file.
1 #include "OscarMTProducer.h"
2 
7 
12 
20 
25 
26 #include "Randomize.hh"
27 
28 #include <iostream>
29 #include <memory>
30 
31 namespace edm {
32  class StreamID;
33 }
34 
35 namespace {
36  //
37  // this machinery allows to set CLHEP static engine
38  // to the one defined by RandomNumberGenerator service
39  // at the beginning of an event, and reset it back to
40  // "default-default" at the end of the event;
41  // Dave D. has decided to implement it this way because
42  // we don't know if there're other modules using CLHEP
43  // static engine, thus we want to ensure that the one
44  // we use for OscarMTProducer is unique to OscarMTProducer
45  //
46  // !!! This not only sets the random engine used by GEANT.
47  // There are a few SimWatchers/SimProducers that generate
48  // random number and also use the global CLHEP random engine
49  // set by this code. If we ever change this design be careful
50  // not to forget about them!!!
51 
52  class StaticRandomEngineSetUnset {
53  public:
54  StaticRandomEngineSetUnset(edm::StreamID const&);
55  explicit StaticRandomEngineSetUnset(CLHEP::HepRandomEngine* engine);
56  ~StaticRandomEngineSetUnset();
57 
58  private:
59  CLHEP::HepRandomEngine* m_currentEngine;
60  CLHEP::HepRandomEngine* m_previousEngine;
61  };
62 } // namespace
63 
65  // Random number generation not allowed here
66  StaticRandomEngineSetUnset random(nullptr);
67 
68  m_runManagerWorker = std::make_unique<RunManagerMTWorker>(p, consumesCollector());
69  m_masterThread = ms;
70  m_masterThread->callConsumes(consumesCollector());
71 
72  // List of produced containers
73  produces<edm::SimTrackContainer>().setBranchAlias("SimTracks");
74  produces<edm::SimVertexContainer>().setBranchAlias("SimVertices");
75  produces<edm::PSimHitContainer>("TrackerHitsPixelBarrelLowTof");
76  produces<edm::PSimHitContainer>("TrackerHitsPixelBarrelHighTof");
77  produces<edm::PSimHitContainer>("TrackerHitsTIBLowTof");
78  produces<edm::PSimHitContainer>("TrackerHitsTIBHighTof");
79  produces<edm::PSimHitContainer>("TrackerHitsTIDLowTof");
80  produces<edm::PSimHitContainer>("TrackerHitsTIDHighTof");
81  produces<edm::PSimHitContainer>("TrackerHitsPixelEndcapLowTof");
82  produces<edm::PSimHitContainer>("TrackerHitsPixelEndcapHighTof");
83  produces<edm::PSimHitContainer>("TrackerHitsTOBLowTof");
84  produces<edm::PSimHitContainer>("TrackerHitsTOBHighTof");
85  produces<edm::PSimHitContainer>("TrackerHitsTECLowTof");
86  produces<edm::PSimHitContainer>("TrackerHitsTECHighTof");
87 
88  produces<edm::PSimHitContainer>("TotemHitsT1");
89  produces<edm::PSimHitContainer>("TotemHitsT2Gem");
90  produces<edm::PSimHitContainer>("TotemHitsRP");
91  produces<edm::PSimHitContainer>("CTPPSPixelHits");
92  produces<edm::PSimHitContainer>("CTPPSTimingHits");
93  produces<edm::PSimHitContainer>("FP420SI");
94  produces<edm::PSimHitContainer>("BSCHits");
95  produces<edm::PSimHitContainer>("PLTHits");
96  produces<edm::PSimHitContainer>("BCM1FHits");
97  produces<edm::PSimHitContainer>("BHMHits");
98  produces<edm::PSimHitContainer>("FastTimerHitsBarrel");
99  produces<edm::PSimHitContainer>("FastTimerHitsEndcap");
100 
101  produces<edm::PCaloHitContainer>("EcalHitsEB");
102  produces<edm::PCaloHitContainer>("EcalHitsEE");
103  produces<edm::PCaloHitContainer>("EcalHitsES");
104  produces<edm::PCaloHitContainer>("HcalHits");
105  produces<edm::PCaloHitContainer>("CaloHitsTk");
106  produces<edm::PCaloHitContainer>("HGCHitsEE");
107  produces<edm::PCaloHitContainer>("HGCHitsHEfront");
108  produces<edm::PCaloHitContainer>("HGCHitsHEback");
109 
110  produces<edm::PSimHitContainer>("MuonDTHits");
111  produces<edm::PSimHitContainer>("MuonCSCHits");
112  produces<edm::PSimHitContainer>("MuonRPCHits");
113  produces<edm::PSimHitContainer>("MuonGEMHits");
114  produces<edm::PSimHitContainer>("MuonME0Hits");
115  produces<edm::PCaloHitContainer>("CastorPL");
116  produces<edm::PCaloHitContainer>("CastorFI");
117  produces<edm::PCaloHitContainer>("CastorBU");
118  produces<edm::PCaloHitContainer>("CastorTU");
119  produces<edm::PCaloHitContainer>("EcalTBH4BeamHits");
120  produces<edm::PCaloHitContainer>("HcalTB06BeamHits");
121  produces<edm::PCaloHitContainer>("ZDCHITS");
122  produces<edm::PCaloHitContainer>("ChamberHits");
123  produces<edm::PCaloHitContainer>("FibreHits");
124  produces<edm::PCaloHitContainer>("WedgeHits");
125  produces<edm::PCaloHitContainer>("HFNoseHits");
126  produces<edm::PCaloHitContainer>("TotemHitsT2Scint");
127 
128  //register any products
129  auto& producers = m_runManagerWorker->producers();
130  for (auto& ptr : producers) {
131  ptr->registerProducts(producesCollector());
132  }
133  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer is constructed";
134 }
135 
137 
138 std::unique_ptr<OscarMTMasterThread> OscarMTProducer::initializeGlobalCache(const edm::ParameterSet& iConfig) {
139  // Random number generation not allowed here
140  StaticRandomEngineSetUnset random(nullptr);
141  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::initializeGlobalCache";
142 
143  return std::make_unique<OscarMTMasterThread>(iConfig);
144 }
145 
146 std::shared_ptr<int> OscarMTProducer::globalBeginRun(const edm::Run&,
147  const edm::EventSetup& iSetup,
148  const OscarMTMasterThread* masterThread) {
149  // Random number generation not allowed here
150  StaticRandomEngineSetUnset random(nullptr);
151  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::globalBeginRun";
152  masterThread->beginRun(iSetup);
153  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::globalBeginRun done";
154  return std::shared_ptr<int>();
155 }
156 
157 void OscarMTProducer::globalEndRun(const edm::Run&, const edm::EventSetup&, const RunContext* iContext) {
158  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::globalEndRun";
159  iContext->global()->endRun();
160 }
161 
163  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::globalEndJob";
164  masterThread->stopThread();
165 }
166 
168  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::beginRun";
169  m_runManagerWorker->beginRun(es);
171  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::beginRun done";
172 }
173 
175  // Random number generation not allowed here
176  StaticRandomEngineSetUnset random(nullptr);
177  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::endRun";
178  m_runManagerWorker->endRun();
179  edm::LogVerbatim("SimG4CoreApplication") << "OscarMTProducer::endRun done";
180 }
181 
183  StaticRandomEngineSetUnset random(e.streamID());
184  edm::LogVerbatim("SimG4CoreApplication") << "Produce event " << e.id() << " stream " << e.streamID();
185  //edm::LogVerbatim("SimG4CoreApplication") << " rand= " << G4UniformRand();
186 
187  auto& sTk = m_runManagerWorker->sensTkDetectors();
188  auto& sCalo = m_runManagerWorker->sensCaloDetectors();
189 
190  std::unique_ptr<G4SimEvent> evt;
191  try {
192  evt = m_runManagerWorker->produce(e, es, globalCache()->runManagerMaster());
193  } catch (const SimG4Exception& simg4ex) {
194  edm::LogWarning("SimG4CoreApplication") << "SimG4Exception caght! " << simg4ex.what();
195 
197  << "SimG4CoreApplication exception in generation of event " << e.id() << " in stream " << e.streamID() << " \n"
198  << simg4ex.what();
199  }
200 
201  std::unique_ptr<edm::SimTrackContainer> p1(new edm::SimTrackContainer);
202  std::unique_ptr<edm::SimVertexContainer> p2(new edm::SimVertexContainer);
203  evt->load(*p1);
204  evt->load(*p2);
205 
206  e.put(std::move(p1));
207  e.put(std::move(p2));
208 
209  for (auto& tracker : sTk) {
210  const std::vector<std::string>& v = tracker->getNames();
211  for (auto& name : v) {
212  std::unique_ptr<edm::PSimHitContainer> product(new edm::PSimHitContainer);
213  tracker->fillHits(*product, name);
214  if (product != nullptr && !product->empty())
215  edm::LogVerbatim("SimG4CoreApplication") << "Produced " << product->size() << " tracker hits <" << name << ">";
216  e.put(std::move(product), name);
217  }
218  }
219  for (auto& calo : sCalo) {
220  const std::vector<std::string>& v = calo->getNames();
221 
222  for (auto& name : v) {
223  std::unique_ptr<edm::PCaloHitContainer> product(new edm::PCaloHitContainer);
224  calo->fillHits(*product, name);
225  if (product != nullptr && !product->empty())
226  edm::LogVerbatim("SimG4CoreApplication") << "Produced " << product->size() << " calo hits <" << name << ">";
227  e.put(std::move(product), name);
228  }
229  }
230 
231  auto& producers = m_runManagerWorker->producers();
232  for (auto& prod : producers) {
233  prod.get()->produce(e, es);
234  }
235  edm::LogVerbatim("SimG4CoreApplication") << "Event is produced " << e.id() << " stream " << e.streamID();
236  //edm::LogVerbatim("SimG4CoreApplication") << " rand= " << G4UniformRand();
237 }
238 
239 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(edm::StreamID const& streamID) {
241  if (!rng.isAvailable()) {
242  throw cms::Exception("Configuration")
243  << "The OscarMTProducer module requires the RandomNumberGeneratorService\n"
244  "which is not present in the configuration file. You must add the service\n"
245  "in the configuration file if you want to run OscarMTProducer";
246  }
247  m_currentEngine = &(rng->getEngine(streamID));
248 
249  m_previousEngine = G4Random::getTheEngine();
250  G4Random::setTheEngine(m_currentEngine);
251 }
252 
253 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(CLHEP::HepRandomEngine* engine) {
254  m_currentEngine = engine;
255  m_previousEngine = G4Random::getTheEngine();
256  G4Random::setTheEngine(m_currentEngine);
257 }
258 
259 StaticRandomEngineSetUnset::~StaticRandomEngineSetUnset() { G4Random::setTheEngine(m_previousEngine); }
260 
edm::StreamID
Definition: StreamID.h:30
edm::RandomNumberGenerator::getEngine
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
MessageLogger.h
SensitiveCaloDetector.h
edm::Run
Definition: Run.h:45
edm
HLT enums.
Definition: AlignableModifier.h:19
SimProducer.h
RandomNumberGenerator.h
PSimHitContainer.h
SimG4Exception
Definition: SimG4Exception.h:13
edm::errors::EventCorruption
Definition: EDMException.h:43
RunManagerMTWorker.h
OscarMTProducer::globalEndRun
static void globalEndRun(const edm::Run &iRun, const edm::EventSetup &iSetup, const RunContext *iContext)
Definition: OscarMTProducer.cc:157
OscarMTProducer::OscarMTProducer
OscarMTProducer(edm::ParameterSet const &p, const OscarMTMasterThread *)
Definition: OscarMTProducer.cc:64
HLT_FULL_cff.producers
producers
Definition: HLT_FULL_cff.py:13113
findQualityFiles.v
v
Definition: findQualityFiles.py:179
OscarMTProducer
Definition: OscarMTProducer.h:17
edm::Service::isAvailable
bool isAvailable() const
Definition: Service.h:40
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
OscarMTProducer::initializeGlobalCache
static std::unique_ptr< OscarMTMasterThread > initializeGlobalCache(const edm::ParameterSet &iConfig)
Definition: OscarMTProducer.cc:138
OscarMTProducer::produce
void produce(edm::Event &e, const edm::EventSetup &c) override
Definition: OscarMTProducer.cc:182
SensitiveTkDetector.h
edm::stream::RunContextT
Definition: Contexts.h:31
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
OscarMTProducer::globalBeginRun
static std::shared_ptr< int > globalBeginRun(const edm::Run &iRun, const edm::EventSetup &iSetup, const OscarMTMasterThread *masterThread)
Definition: OscarMTProducer.cc:146
Service.h
dumpMFGeometry_cfg.prod
prod
Definition: dumpMFGeometry_cfg.py:24
p2
double p2[4]
Definition: TauolaWrapper.h:90
OscarMTProducer::m_runManagerWorker
std::unique_ptr< RunManagerMTWorker > m_runManagerWorker
Definition: OscarMTProducer.h:38
PbPb_ZMuSkimMuonDPG_cff.tracker
tracker
Definition: PbPb_ZMuSkimMuonDPG_cff.py:60
SimG4Exception.h
OscarMTMasterThread::stopThread
void stopThread()
Definition: OscarMTMasterThread.cc:159
edm::ParameterSet
Definition: ParameterSet.h:47
AlCaHLTBitMon_ParallelJobs.p
def p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
RunManagerMT.h
OscarMTMasterThread::runManagerMasterPtr
RunManagerMT * runManagerMasterPtr() const
Definition: OscarMTMasterThread.h:49
G4SimEvent.h
edm::Service< edm::RandomNumberGenerator >
p1
double p1[4]
Definition: TauolaWrapper.h:89
OscarMTProducer::~OscarMTProducer
~OscarMTProducer() override
Definition: OscarMTProducer.cc:136
edm::EventSetup
Definition: EventSetup.h:58
OscarMTMasterThread
Definition: OscarMTMasterThread.h:37
OscarMTProducer::globalEndJob
static void globalEndJob(OscarMTMasterThread *masterThread)
Definition: OscarMTProducer.cc:162
eostools.move
def move(src, dest)
Definition: eostools.py:511
PluginManager.h
edm::SimTrackContainer
std::vector< SimTrack > SimTrackContainer
Definition: SimTrackContainer.h:12
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
Exception
Definition: hltDiff.cc:245
edm::PCaloHitContainer
std::vector< PCaloHit > PCaloHitContainer
Definition: PCaloHitContainer.h:8
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
Exception.h
OscarMTMasterThread::beginRun
void beginRun(const edm::EventSetup &iSetup) const
Definition: OscarMTMasterThread.cc:120
PCaloHitContainer.h
OscarMTProducer::beginRun
void beginRun(const edm::Run &r, const edm::EventSetup &c) override
Definition: OscarMTProducer.cc:167
OscarMTProducer.h
OscarMTProducer::m_masterThread
const OscarMTMasterThread * m_masterThread
Definition: OscarMTProducer.h:39
ConsumesCollector.h
OscarMTProducer::endRun
void endRun(const edm::Run &r, const edm::EventSetup &c) override
Definition: OscarMTProducer.cc:174
edm::PSimHitContainer
std::vector< PSimHit > PSimHitContainer
Definition: PSimHitContainer.h:11
ParameterSet.h
calo
Definition: Common.h:9
edm::Event
Definition: Event.h:73
edm::Log
Definition: MessageLogger.h:70
SimG4Exception::what
const char * what() const override
Definition: SimG4Exception.h:17
SimTrackContainer.h
edm::SimVertexContainer
std::vector< SimVertex > SimVertexContainer
Definition: SimVertexContainer.h:12
SimVertexContainer.h
edm::stream::RunContextT::global
G const * global() const
Definition: Contexts.h:35
OscarMTMasterThread::callConsumes
void callConsumes(edm::ConsumesCollector &&iC) const
Definition: OscarMTMasterThread.cc:107
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37