CMS 3D CMS Logo

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