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 "CLHEP/Random/Random.h"
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 
96  produces<edm::PCaloHitContainer>("EcalHitsEB");
97  produces<edm::PCaloHitContainer>("EcalHitsEE");
98  produces<edm::PCaloHitContainer>("EcalHitsES");
99  produces<edm::PCaloHitContainer>("HcalHits");
100  produces<edm::PCaloHitContainer>("CaloHitsTk");
101  produces<edm::PSimHitContainer>("MuonDTHits");
102  produces<edm::PSimHitContainer>("MuonCSCHits");
103  produces<edm::PSimHitContainer>("MuonRPCHits");
104  produces<edm::PSimHitContainer>("MuonGEMHits");
105  produces<edm::PCaloHitContainer>("CastorPL");
106  produces<edm::PCaloHitContainer>("CastorFI");
107  produces<edm::PCaloHitContainer>("CastorBU");
108  produces<edm::PCaloHitContainer>("CastorTU");
109  produces<edm::PCaloHitContainer>("EcalTBH4BeamHits");
110  produces<edm::PCaloHitContainer>("HcalTB06BeamHits");
111  produces<edm::PCaloHitContainer>("ZDCHITS");
112  produces<edm::PCaloHitContainer>("ChamberHits");
113  produces<edm::PCaloHitContainer>("FibreHits");
114  produces<edm::PCaloHitContainer>("WedgeHits");
115 
116  //register any products
117  m_producers = m_runManager->producers();
118 
119  for(Producers::iterator itProd = m_producers.begin();
120  itProd != m_producers.end(); ++itProd) {
121 
122  (*itProd)->registerProducts(*this);
123  }
124 
125  //UIsession manager for message handling
126  m_UIsession.reset(new CustomUIsession());
127 }
128 
130 { }
131 
132 void
134 {
135  // Random number generation not allowed here
136  StaticRandomEngineSetUnset random(nullptr);
137  m_runManager->initG4(es);
138 }
139 
140 void
142 {
143  m_runManager->stopG4();
144 }
145 
147 {
148  StaticRandomEngineSetUnset random(e.streamID());
149 
150  std::vector<SensitiveTkDetector*>& sTk =
151  m_runManager->sensTkDetectors();
152  std::vector<SensitiveCaloDetector*>& sCalo =
153  m_runManager->sensCaloDetectors();
154 
155  try {
156 
157  m_runManager->produce(e, es);
158 
159  std::auto_ptr<edm::SimTrackContainer>
161  std::auto_ptr<edm::SimVertexContainer>
163  G4SimEvent * evt = m_runManager->simEvent();
164  evt->load(*p1);
165  evt->load(*p2);
166 
167  e.put(p1);
168  e.put(p2);
169 
170  for (std::vector<SensitiveTkDetector*>::iterator it = sTk.begin();
171  it != sTk.end(); ++it) {
172 
173  std::vector<std::string> v = (*it)->getNames();
174  for (std::vector<std::string>::iterator in = v.begin();
175  in!= v.end(); ++in) {
176 
177  std::auto_ptr<edm::PSimHitContainer>
178  product(new edm::PSimHitContainer);
179  (*it)->fillHits(*product,*in);
180  e.put(product,*in);
181  }
182  }
183  for (std::vector<SensitiveCaloDetector*>::iterator it = sCalo.begin();
184  it != sCalo.end(); ++it) {
185 
186  std::vector<std::string> v = (*it)->getNames();
187 
188  for (std::vector<std::string>::iterator in = v.begin();
189  in!= v.end(); in++) {
190 
191  std::auto_ptr<edm::PCaloHitContainer>
192  product(new edm::PCaloHitContainer);
193  (*it)->fillHits(*product,*in);
194  e.put(product,*in);
195  }
196  }
197 
198  for(Producers::iterator itProd = m_producers.begin();
199  itProd != m_producers.end(); ++itProd) {
200 
201  (*itProd)->produce(e,es);
202  }
203 
204  } catch ( const SimG4Exception& simg4ex ) {
205 
206  edm::LogInfo("SimG4CoreApplication") << " SimG4Exception caght !"
207  << simg4ex.what();
208 
209  m_runManager->abortEvent();
211  }
212 }
213 
214 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
215  edm::StreamID const& streamID)
216 {
218  if ( ! rng.isAvailable()) {
219  throw cms::Exception("Configuration")
220  << "The OscarProducer module requires the RandomNumberGeneratorService\n"
221  "which is not present in the configuration file. You must add the service\n"
222  "in the configuration file if you want to run OscarProducer";
223  }
224  m_currentEngine = &(rng->getEngine(streamID));
225 
226  m_previousEngine = CLHEP::HepRandom::getTheEngine();
227  CLHEP::HepRandom::setTheEngine(m_currentEngine);
228 }
229 
230 StaticRandomEngineSetUnset::StaticRandomEngineSetUnset(
231  CLHEP::HepRandomEngine * engine)
232 {
233  m_currentEngine = engine;
234  m_previousEngine = CLHEP::HepRandom::getTheEngine();
235  CLHEP::HepRandom::setTheEngine(m_currentEngine);
236 }
237 
238 StaticRandomEngineSetUnset::~StaticRandomEngineSetUnset()
239 {
240  CLHEP::HepRandom::setTheEngine(m_previousEngine);
241 }
242 
243 CLHEP::HepRandomEngine* StaticRandomEngineSetUnset::getEngine() const
244 {
245  return m_currentEngine;
246 }
247 
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 ~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:116
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
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:75
std::vector< PSimHit > PSimHitContainer
std::vector< SimTrack > SimTrackContainer
std::unique_ptr< CustomUIsession > m_UIsession
Definition: OscarProducer.h:32
Definition: Run.h:41