CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
OscarProducer.cc
Go to the documentation of this file.
2 
5 
8 
13 
15 
18 
21 #include "Randomize.hh"
22 
25 
26 #include <iostream>
27 
28 namespace edm {
29  class StreamID;
30 }
31 
32 namespace {
33  //
34  // this machinery allows to set CLHEP static engine
35  // to the one defined by RandomNumberGenerator service
36  // at the beginning of an event, and reset it back to
37  // "default-default" at the end of the event;
38  // Dave D. has decided to implement it this way because
39  // we don't know if there're other modules using CLHEP
40  // static engine, thus we want to ensure that the one
41  // we use for OscarProducer is unique to OscarProducer
42  //
43  // !!! This not only sets the random engine used by GEANT.
44  // There are a few SimWatchers/SimProducers that generate
45  // random number and also use the global CLHEP random engine
46  // set by this code. If we ever change this design be careful
47  // not to forget about them!!!
48 
49  class StaticRandomEngineSetUnset {
50  public:
51  StaticRandomEngineSetUnset(edm::StreamID const&);
52  explicit StaticRandomEngineSetUnset(CLHEP::HepRandomEngine * engine);
53  ~StaticRandomEngineSetUnset();
54  CLHEP::HepRandomEngine* getEngine() const;
55  private:
56  CLHEP::HepRandomEngine* m_currentEngine;
57  CLHEP::HepRandomEngine* m_previousEngine;
58  };
59 }
60 
62 {
63  // Random number generation not allowed here
64  StaticRandomEngineSetUnset random(nullptr);
65 
68 
69  consumes<edm::HepMCProduct>(p.getParameter<edm::InputTag>("HepMCProductLabel"));
70  m_runManager.reset(new RunManager(p));
71  //m_runManager.reset(new RunManager(p, consumesCollector()));
72 
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>("FP420SI");
92  produces<edm::PSimHitContainer>("BSCHits");
93  produces<edm::PSimHitContainer>("PLTHits");
94  produces<edm::PSimHitContainer>("BCM1FHits");
95  produces<edm::PSimHitContainer>("BHMHits");
96  produces<edm::PSimHitContainer>("FastTimerHits");
97 
98  produces<edm::PCaloHitContainer>("EcalHitsEB");
99  produces<edm::PCaloHitContainer>("EcalHitsEE");
100  produces<edm::PCaloHitContainer>("EcalHitsES");
101  produces<edm::PCaloHitContainer>("HcalHits");
102  produces<edm::PCaloHitContainer>("CaloHitsTk");
103  produces<edm::PCaloHitContainer>("HGCHitsEE");
104  produces<edm::PCaloHitContainer>("HGCHitsHEfront");
105  produces<edm::PCaloHitContainer>("HGCHitsHEback");
106 
107  produces<edm::PSimHitContainer>("MuonDTHits");
108  produces<edm::PSimHitContainer>("MuonCSCHits");
109  produces<edm::PSimHitContainer>("MuonRPCHits");
110  produces<edm::PSimHitContainer>("MuonGEMHits");
111  produces<edm::PSimHitContainer>("MuonME0Hits");
112 
113  produces<edm::PCaloHitContainer>("CastorPL");
114  produces<edm::PCaloHitContainer>("CastorFI");
115  produces<edm::PCaloHitContainer>("CastorBU");
116  produces<edm::PCaloHitContainer>("CastorTU");
117  produces<edm::PCaloHitContainer>("EcalTBH4BeamHits");
118  produces<edm::PCaloHitContainer>("HcalTB06BeamHits");
119  produces<edm::PCaloHitContainer>("ZDCHITS");
120  produces<edm::PCaloHitContainer>("ChamberHits");
121  produces<edm::PCaloHitContainer>("FibreHits");
122  produces<edm::PCaloHitContainer>("WedgeHits");
123 
124  //register any products
125  m_producers = m_runManager->producers();
126 
127  for(Producers::iterator itProd = m_producers.begin();
128  itProd != m_producers.end(); ++itProd) {
129 
130  (*itProd)->registerProducts(*this);
131  }
132 
133  //UIsession manager for message handling
134  m_UIsession.reset(new CustomUIsession());
135 }
136 
138 { }
139 
140 void
142 {
143  // Random number generation not allowed here
144  StaticRandomEngineSetUnset random(nullptr);
145  m_runManager->initG4(es);
146 }
147 
148 void
150 {
151  m_runManager->stopG4();
152 }
153 
155 {
156  StaticRandomEngineSetUnset random(e.streamID());
157 
158  std::vector<SensitiveTkDetector*>& sTk =
159  m_runManager->sensTkDetectors();
160  std::vector<SensitiveCaloDetector*>& sCalo =
161  m_runManager->sensCaloDetectors();
162 
163  try {
164 
165  m_runManager->produce(e, es);
166 
167  std::auto_ptr<edm::SimTrackContainer>
169  std::auto_ptr<edm::SimVertexContainer>
171  G4SimEvent * evt = m_runManager->simEvent();
172  evt->load(*p1);
173  evt->load(*p2);
174 
175  e.put(p1);
176  e.put(p2);
177 
178  for (std::vector<SensitiveTkDetector*>::iterator it = sTk.begin();
179  it != sTk.end(); ++it) {
180 
181  std::vector<std::string> v = (*it)->getNames();
182  for (std::vector<std::string>::iterator in = v.begin();
183  in!= v.end(); ++in) {
184 
185  std::auto_ptr<edm::PSimHitContainer>
186  product(new edm::PSimHitContainer);
187  (*it)->fillHits(*product,*in);
188  e.put(product,*in);
189  }
190  }
191  for (std::vector<SensitiveCaloDetector*>::iterator it = sCalo.begin();
192  it != sCalo.end(); ++it) {
193 
194  std::vector<std::string> v = (*it)->getNames();
195 
196  for (std::vector<std::string>::iterator in = v.begin();
197  in!= v.end(); in++) {
198 
199  std::auto_ptr<edm::PCaloHitContainer>
200  product(new edm::PCaloHitContainer);
201  (*it)->fillHits(*product,*in);
202  e.put(product,*in);
203  }
204  }
205 
206  for(Producers::iterator itProd = m_producers.begin();
207  itProd != m_producers.end(); ++itProd) {
208 
209  (*itProd)->produce(e,es);
210  }
211 
212  } catch ( const SimG4Exception& simg4ex ) {
213 
214  edm::LogInfo("SimG4CoreApplication") << " SimG4Exception caght !"
215  << simg4ex.what();
216 
217  m_runManager->abortEvent();
219  }
220 }
221 
222 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
223  edm::StreamID const& streamID)
224 {
226  if ( ! rng.isAvailable()) {
227  throw cms::Exception("Configuration")
228  << "The OscarProducer module requires the RandomNumberGeneratorService\n"
229  "which is not present in the configuration file. You must add the service\n"
230  "in the configuration file if you want to run OscarProducer";
231  }
232  m_currentEngine = &(rng->getEngine(streamID));
233 
234  // Must use G4Random instead of CLHEP::HepRandom even for the serial
235  // version if Geant4 has been built with MT enabled. If G4 was built
236  // with MT disabled G4Random is defined to be CLHEP::HepRandom,
237  // preserving the old behaviour.
238  m_previousEngine = G4Random::getTheEngine();
239  G4Random::setTheEngine(m_currentEngine);
240 }
241 
242 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
243  CLHEP::HepRandomEngine * engine)
244 {
245  m_currentEngine = engine;
246  m_previousEngine = G4Random::getTheEngine();
247  G4Random::setTheEngine(m_currentEngine);
248 }
249 
250 StaticRandomEngineSetUnset::~StaticRandomEngineSetUnset()
251 {
252  G4Random::setTheEngine(m_previousEngine);
253 }
254 
255 CLHEP::HepRandomEngine* StaticRandomEngineSetUnset::getEngine() const
256 {
257  return m_currentEngine;
258 }
259 
T getParameter(std::string const &) const
Producers m_producers
Definition: OscarProducer.h:31
std::unique_ptr< RunManager > m_runManager
Definition: OscarProducer.h:30
std::vector< PCaloHit > PCaloHitContainer
virtual void endRun(const edm::Run &r, const edm::EventSetup &c) override
OscarProducer(edm::ParameterSet const &p)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
TRandom random
Definition: MVATrainer.cc:138
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
virtual ~OscarProducer()
virtual void beginRun(const edm::Run &r, const edm::EventSetup &c) override
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:121
static const std::string kGEANT
bool isAvailable() const
Definition: Service.h:46
virtual void produce(edm::Event &e, const edm::EventSetup &c) override
static const std::string kCLHEPRandomEngine
virtual const char * what() const
double p2[4]
Definition: TauolaWrapper.h:90
void load(edm::SimTrackContainer &c) const
Definition: G4SimEvent.cc:55
std::vector< SimVertex > SimVertexContainer
double p1[4]
Definition: TauolaWrapper.h:89
StreamID streamID() const
Definition: Event.h:80
std::vector< PSimHit > PSimHitContainer
std::vector< SimTrack > SimTrackContainer
std::unique_ptr< CustomUIsession > m_UIsession
Definition: OscarProducer.h:32
Definition: Run.h:43