CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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  CLHEP::HepRandomEngine* getEngine() const;
59  private:
60  CLHEP::HepRandomEngine* m_currentEngine;
61  CLHEP::HepRandomEngine* m_previousEngine;
62  };
63 }
64 
66 {
67  // Random number generation not allowed here
68  StaticRandomEngineSetUnset random(nullptr);
69 
71 
72  produces<edm::SimTrackContainer>().setBranchAlias("SimTracks");
73  produces<edm::SimVertexContainer>().setBranchAlias("SimVertices");
74  produces<edm::PSimHitContainer>("TrackerHitsPixelBarrelLowTof");
75  produces<edm::PSimHitContainer>("TrackerHitsPixelBarrelHighTof");
76  produces<edm::PSimHitContainer>("TrackerHitsTIBLowTof");
77  produces<edm::PSimHitContainer>("TrackerHitsTIBHighTof");
78  produces<edm::PSimHitContainer>("TrackerHitsTIDLowTof");
79  produces<edm::PSimHitContainer>("TrackerHitsTIDHighTof");
80  produces<edm::PSimHitContainer>("TrackerHitsPixelEndcapLowTof");
81  produces<edm::PSimHitContainer>("TrackerHitsPixelEndcapHighTof");
82  produces<edm::PSimHitContainer>("TrackerHitsTOBLowTof");
83  produces<edm::PSimHitContainer>("TrackerHitsTOBHighTof");
84  produces<edm::PSimHitContainer>("TrackerHitsTECLowTof");
85  produces<edm::PSimHitContainer>("TrackerHitsTECHighTof");
86 
87  produces<edm::PSimHitContainer>("TotemHitsT1");
88  produces<edm::PSimHitContainer>("TotemHitsT2Gem");
89  produces<edm::PSimHitContainer>("TotemHitsRP");
90  produces<edm::PSimHitContainer>("FP420SI");
91  produces<edm::PSimHitContainer>("BSCHits");
92  produces<edm::PSimHitContainer>("PLTHits");
93  produces<edm::PSimHitContainer>("BCM1FHits");
94 
95  produces<edm::PCaloHitContainer>("EcalHitsEB");
96  produces<edm::PCaloHitContainer>("EcalHitsEE");
97  produces<edm::PCaloHitContainer>("EcalHitsES");
98  produces<edm::PCaloHitContainer>("HcalHits");
99  produces<edm::PCaloHitContainer>("CaloHitsTk");
100  produces<edm::PSimHitContainer>("MuonDTHits");
101  produces<edm::PSimHitContainer>("MuonCSCHits");
102  produces<edm::PSimHitContainer>("MuonRPCHits");
103  produces<edm::PSimHitContainer>("MuonGEMHits");
104  produces<edm::PCaloHitContainer>("CastorPL");
105  produces<edm::PCaloHitContainer>("CastorFI");
106  produces<edm::PCaloHitContainer>("CastorBU");
107  produces<edm::PCaloHitContainer>("CastorTU");
108  produces<edm::PCaloHitContainer>("EcalTBH4BeamHits");
109  produces<edm::PCaloHitContainer>("HcalTB06BeamHits");
110  produces<edm::PCaloHitContainer>("ZDCHITS");
111  produces<edm::PCaloHitContainer>("ChamberHits");
112  produces<edm::PCaloHitContainer>("FibreHits");
113  produces<edm::PCaloHitContainer>("WedgeHits");
114 
115  //register any products
116  m_producers = m_runManagerWorker->producers();
117 
118  for(Producers::iterator itProd = m_producers.begin();
119  itProd != m_producers.end(); ++itProd) {
120 
121  (*itProd)->registerProducts(*this);
122  }
123 }
124 
126 { }
127 
128 std::unique_ptr<OscarMTMasterThread> OscarMTProducer::initializeGlobalCache(const edm::ParameterSet& iConfig) {
129  // Random number generation not allowed here
130  StaticRandomEngineSetUnset random(nullptr);
131 
132  return std::unique_ptr<OscarMTMasterThread>(new OscarMTMasterThread(iConfig));
133 }
134 
135 std::shared_ptr<int> OscarMTProducer::globalBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup, const OscarMTMasterThread *masterThread) {
136  // Random number generation not allowed here
137  StaticRandomEngineSetUnset random(nullptr);
138 
139  masterThread->beginRun(iSetup);
140 
141  return std::shared_ptr<int>();
142 }
143 
144 void OscarMTProducer::globalEndRun(const edm::Run& iRun, const edm::EventSetup& iSetup, const RunContext *iContext) {
145  iContext->global()->endRun();
146 }
147 
149  masterThread->stopThread();
150 }
151 
152 void
154 {
155  // Random number generation not allowed here
156  StaticRandomEngineSetUnset random(nullptr);
157  m_runManagerWorker->endRun();
158 }
159 
161 {
162  StaticRandomEngineSetUnset random(e.streamID());
163 
164  std::vector<SensitiveTkDetector*>& sTk =
165  m_runManagerWorker->sensTkDetectors();
166  std::vector<SensitiveCaloDetector*>& sCalo =
167  m_runManagerWorker->sensCaloDetectors();
168 
169  try {
170  m_runManagerWorker->produce(e, es, globalCache()->runManagerMaster());
171 
172  std::auto_ptr<edm::SimTrackContainer>
174  std::auto_ptr<edm::SimVertexContainer>
176  G4SimEvent * evt = m_runManagerWorker->simEvent();
177  evt->load(*p1);
178  evt->load(*p2);
179 
180  e.put(p1);
181  e.put(p2);
182 
183  for (std::vector<SensitiveTkDetector*>::iterator it = sTk.begin();
184  it != sTk.end(); ++it) {
185 
186  std::vector<std::string> v = (*it)->getNames();
187  for (std::vector<std::string>::iterator in = v.begin();
188  in!= v.end(); ++in) {
189 
190  std::auto_ptr<edm::PSimHitContainer>
191  product(new edm::PSimHitContainer);
192  (*it)->fillHits(*product,*in);
193  e.put(product,*in);
194  }
195  }
196  for (std::vector<SensitiveCaloDetector*>::iterator it = sCalo.begin();
197  it != sCalo.end(); ++it) {
198 
199  std::vector<std::string> v = (*it)->getNames();
200 
201  for (std::vector<std::string>::iterator in = v.begin();
202  in!= v.end(); in++) {
203 
204  std::auto_ptr<edm::PCaloHitContainer>
205  product(new edm::PCaloHitContainer);
206  (*it)->fillHits(*product,*in);
207  e.put(product,*in);
208  }
209  }
210 
211  for(Producers::iterator itProd = m_producers.begin();
212  itProd != m_producers.end(); ++itProd) {
213 
214  (*itProd)->produce(e,es);
215  }
216  } catch ( const SimG4Exception& simg4ex ) {
217 
218  edm::LogInfo("SimG4CoreApplication") << " SimG4Exception caght !"
219  << simg4ex.what();
220 
221  m_runManagerWorker->abortEvent();
223  }
224 
225 }
226 
227 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
228  edm::StreamID const& streamID)
229 {
231  if ( ! rng.isAvailable()) {
232  throw cms::Exception("Configuration")
233  << "The OscarMTProducer module requires the RandomNumberGeneratorService\n"
234  "which is not present in the configuration file. You must add the service\n"
235  "in the configuration file if you want to run OscarMTProducer";
236  }
237  m_currentEngine = &(rng->getEngine(streamID));
238 
239  m_previousEngine = G4Random::getTheEngine();
240  G4Random::setTheEngine(m_currentEngine);
241 }
242 
243 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
244  CLHEP::HepRandomEngine * engine)
245 {
246  m_currentEngine = engine;
247  m_previousEngine = G4Random::getTheEngine();
248  G4Random::setTheEngine(m_currentEngine);
249 }
250 
251 StaticRandomEngineSetUnset::~StaticRandomEngineSetUnset()
252 {
253  G4Random::setTheEngine(m_previousEngine);
254 }
255 
256 CLHEP::HepRandomEngine* StaticRandomEngineSetUnset::getEngine() const
257 {
258  return m_currentEngine;
259 }
260 
std::vector< PCaloHit > PCaloHitContainer
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)
Definition: MakerMacros.h:17
OscarMTProducer(edm::ParameterSet const &p, const OscarMTMasterThread *)
TRandom random
Definition: MVATrainer.cc:138
virtual ~OscarMTProducer()
void beginRun(const edm::EventSetup &iSetup) const
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
bool isAvailable() const
Definition: Service.h:46
Producers m_producers
virtual void produce(edm::Event &e, const edm::EventSetup &c) override
virtual const char * what() const
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)
void load(edm::SimTrackContainer &c) const
Definition: G4SimEvent.cc:55
static std::unique_ptr< OscarMTMasterThread > initializeGlobalCache(const edm::ParameterSet &iConfig)
virtual void endRun(const edm::Run &r, const edm::EventSetup &c) override
std::vector< SimVertex > SimVertexContainer
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &) const =0
Use this engine in event methods.
double p1[4]
Definition: TauolaWrapper.h:89
StreamID streamID() const
Definition: Event.h:72
std::vector< PSimHit > PSimHitContainer
static void globalEndJob(OscarMTMasterThread *masterThread)
std::vector< SimTrack > SimTrackContainer
Definition: Run.h:41