CMS 3D CMS Logo

RunManagerMTWorker.cc
Go to the documentation of this file.
13 
20 
28 
34 
38 
41 
43 
45 
47 
48 #include "G4Event.hh"
49 #include "G4Run.hh"
50 #include "G4SystemOfUnits.hh"
51 #include "G4Threading.hh"
52 #include "G4UImanager.hh"
53 #include "G4WorkerThread.hh"
54 #include "G4WorkerRunManagerKernel.hh"
55 #include "G4StateManager.hh"
56 #include "G4TransportationManager.hh"
57 
58 #include <atomic>
59 #include <thread>
60 #include <sstream>
61 #include <vector>
62 
63 // from https://hypernews.cern.ch/HyperNews/CMS/get/edmFramework/3302/2.html
64 namespace {
65  std::atomic<int> thread_counter{ 0 };
66 
67  int get_new_thread_index() {
68  return thread_counter++;
69  }
70 
71  thread_local int s_thread_index = get_new_thread_index();
72 
73  int getThreadIndex() { return s_thread_index; }
74 
75  void createWatchers(const edm::ParameterSet& iP,
76  SimActivityRegistry* iReg,
77  std::vector<std::shared_ptr<SimWatcher> >& oWatchers,
78  std::vector<std::shared_ptr<SimProducer> >& oProds,
79  int thisThreadID
80  )
81  {
82  if(!iP.exists("Watchers")) { return; }
83 
84  std::vector<edm::ParameterSet> watchers =
85  iP.getParameter<std::vector<edm::ParameterSet> >("Watchers");
86 
87  for(auto & watcher : watchers) {
88  std::unique_ptr<SimWatcherMakerBase> maker(
89  SimWatcherFactory::get()->create(watcher.getParameter<std::string>("type"))
90  );
91  if(maker==nullptr) {
93  << "Unable to find the requested Watcher <"
94  << watcher.getParameter<std::string>("type");
95  }
96  std::shared_ptr<SimWatcher> watcherTemp;
97  std::shared_ptr<SimProducer> producerTemp;
98  maker->make(watcher,*(iReg),watcherTemp,producerTemp);
99  oWatchers.push_back(watcherTemp);
100  if(producerTemp) {
101  oProds.push_back(producerTemp);
102  }
103  }
104  }
105 }
106 
108  std::unique_ptr<CustomUIsession> UIsession;
109  std::unique_ptr<RunAction> userRunAction;
110  std::unique_ptr<SimRunInterface> runInterface;
111  std::unique_ptr<SimActivityRegistry> registry;
112  std::unique_ptr<SimTrackManager> trackManager;
113  std::vector<SensitiveTkDetector*> sensTkDets;
114  std::vector<SensitiveCaloDetector*> sensCaloDets;
115  std::vector<std::shared_ptr<SimWatcher> > watchers;
116  std::vector<std::shared_ptr<SimProducer> > producers;
117  std::unique_ptr<G4Run> currentRun;
118  std::unique_ptr<G4Event> currentEvent;
119  std::unique_ptr<G4RunManagerKernel> kernel;
121  bool threadInitialized = false;
122  bool runTerminated = false;
123 };
124 
126 
128  m_generator(iConfig.getParameter<edm::ParameterSet>("Generator")),
129  m_InToken(iC.consumes<edm::HepMCProduct>(iConfig.getParameter<edm::ParameterSet>("Generator").getParameter<edm::InputTag>("HepMCProductLabel"))),
130  m_theLHCTlinkToken(iC.consumes<edm::LHCTransportLinkContainer>(iConfig.getParameter<edm::InputTag>("theLHCTlinkTag"))),
131  m_nonBeam(iConfig.getParameter<bool>("NonBeamEvent")),
132  m_pUseMagneticField(iConfig.getParameter<bool>("UseMagneticField")),
133  m_EvtMgrVerbosity(iConfig.getUntrackedParameter<int>("G4EventManagerVerbosity",0)),
134  m_pField(iConfig.getParameter<edm::ParameterSet>("MagneticField")),
135  m_pRunAction(iConfig.getParameter<edm::ParameterSet>("RunAction")),
136  m_pEventAction(iConfig.getParameter<edm::ParameterSet>("EventAction")),
137  m_pStackingAction(iConfig.getParameter<edm::ParameterSet>("StackingAction")),
138  m_pTrackingAction(iConfig.getParameter<edm::ParameterSet>("TrackingAction")),
139  m_pSteppingAction(iConfig.getParameter<edm::ParameterSet>("SteppingAction")),
140  m_pCustomUIsession(iConfig.getUntrackedParameter<edm::ParameterSet>("CustomUIsession")),
141  m_p(iConfig)
142 {
143  initializeTLS();
144  m_simEvent.reset(nullptr);
145  m_sVerbose.reset(nullptr);
146  std::vector<edm::ParameterSet> watchers =
147  iConfig.getParameter<std::vector<edm::ParameterSet> >("Watchers");
148  m_hasWatchers = (watchers.empty()) ? false : true;
149 }
150 
152  if(m_tls && !m_tls->runTerminated) { terminateRun(); }
153 }
154 
156  terminateRun();
157 }
158 
160  if(m_tls) { return; }
161  m_tls = new TLSData;
162  m_tls->registry.reset(new SimActivityRegistry());
163 
164  edm::Service<SimActivityRegistry> otherRegistry;
165  //Look for an outside SimActivityRegistry
166  // this is used by the visualization code
167  int thisID = getThreadIndex();
168  if(otherRegistry){
169  m_tls->registry->connect(*otherRegistry);
170  if(thisID > 0) {
171  throw edm::Exception(edm::errors::Configuration) << "SimActivityRegistry service (i.e. visualization) is not supported for more than 1 thread. If this use case is needed, RunManagerMTWorker has to be updated.";
172  }
173  }
174  if(m_hasWatchers) {
176  }
177 }
178 
180  // I guess everything initialized here should be in thread_local storage
181  initializeTLS();
182 
183  int thisID = getThreadIndex();
184 
185  edm::LogVerbatim("SimG4CoreApplication")
186  << "RunManagerMTWorker::initializeThread " << thisID;
187 
188  // Initialize per-thread output
189  G4Threading::G4SetThreadId( thisID );
190  G4UImanager::GetUIpointer()->SetUpForAThread( thisID );
192  if(uitype == "MessageLogger") {
193  m_tls->UIsession.reset(new CustomUIsession());
194  }
195  else if(uitype == "MessageLoggerThreadPrefix") {
197  }
198  else if(uitype == "FilePerThread") {
200  }
201  else {
203  << "Invalid value of CustomUIsession.Type '" << uitype
204  << "', valid are MessageLogger, MessageLoggerThreadPrefix, FilePerThread";
205  }
206 
207  // Initialize worker part of shared resources (geometry, physics)
208  G4WorkerThread::BuildGeometryAndPhysicsVector();
209 
210  // Create worker run manager
211  m_tls->kernel.reset(G4WorkerRunManagerKernel::GetRunManagerKernel());
212  if(!m_tls->kernel) { m_tls->kernel.reset(new G4WorkerRunManagerKernel()); }
213 
214  // Define G4 exception handler
215  G4StateManager::GetStateManager()->SetExceptionHandler(new ExceptionHandler());
216 
217  // Set the geometry for the worker, share from master
219 
220  // we need the track manager now
221  m_tls->trackManager.reset(new SimTrackManager());
222 
223  // Get DDCompactView, or would it be better to get the object from
224  // runManagerMaster instead of EventSetup in here?
226  es.get<IdealGeometryRecord>().get(pDD);
227 
228  // setup the magnetic field
230  {
231  const GlobalPoint g(0.,0.,0.);
232 
234  es.get<IdealMagneticFieldRecord>().get(pMF);
235 
236  sim::FieldBuilder fieldBuilder(pMF.product(), m_pField);
237  CMSFieldManager* fieldManager = new CMSFieldManager();
238  G4TransportationManager * tM =
239  G4TransportationManager::GetTransportationManager();
240  tM->SetFieldManager(fieldManager);
241  fieldBuilder.build( fieldManager, tM->GetPropagatorInField());
242  }
243 
244  // attach sensitive detector
245  AttachSD attach;
246  std::pair< std::vector<SensitiveTkDetector*>,
247  std::vector<SensitiveCaloDetector*> > sensDets =
248  attach.create(runManagerMaster.world(),
249  (*pDD),
250  runManagerMaster.catalog(),
251  m_p,
252  m_tls->trackManager.get(),
253  *(m_tls->registry.get()));
254 
255  m_tls->sensTkDets.swap(sensDets.first);
256  m_tls->sensCaloDets.swap(sensDets.second);
257 
258  edm::LogVerbatim("SimG4CoreApplication")
259  << " RunManagerMTWorker: Sensitive Detector building finished; found "
260  << m_tls->sensTkDets.size() << " Tk type Producers, and "
261  << m_tls->sensCaloDets.size() << " Calo type producers ";
262 
263  // Set the physics list for the worker, share from master
264  PhysicsList *physicsList = runManagerMaster.physicsListForWorker();
265 
266  edm::LogVerbatim("SimG4CoreApplication")
267  << "RunManagerMTWorker: start initialisation of PhysicsList for the thread";
268 
269  physicsList->InitializeWorker();
270  m_tls->kernel->SetPhysics(physicsList);
271  m_tls->kernel->InitializePhysics();
272 
273  const bool kernelInit = m_tls->kernel->RunInitialization();
274  if(!kernelInit) {
276  << "RunManagerMTWorker: Geant4 kernel initialization failed";
277  }
278  //tell all interesting parties that we are beginning the job
279  BeginOfJob aBeginOfJob(&es);
280  m_tls->registry->beginOfJobSignal_(&aBeginOfJob);
281 
282  G4int sv = m_p.getParameter<int>("SteppingVerbosity");
283  G4double elim = m_p.getParameter<double>("StepVerboseThreshold")*CLHEP::GeV;
284  std::vector<int> ve = m_p.getParameter<std::vector<int> >("VerboseEvents");
285  std::vector<int> vn = m_p.getParameter<std::vector<int> >("VertexNumber");
286  std::vector<int> vt = m_p.getParameter<std::vector<int> >("VerboseTracks");
287 
288  if(sv > 0) {
289  m_sVerbose.reset(new CMSSteppingVerbose(sv, elim, ve, vn, vt));
290  }
292 
293  edm::LogVerbatim("SimG4CoreApplication")
294  << "RunManagerMTWorker::initializeThread done for the thread " << thisID;
295 
296  for(const std::string& command: runManagerMaster.G4Commands()) {
297  edm::LogVerbatim("SimG4CoreApplication") << "RunManagerMTWorker:: Requests UI: "
298  << command;
299  G4UImanager::GetUIpointer()->ApplyCommand(command);
300  }
301 }
302 
304  m_tls->runInterface.reset(new SimRunInterface(this, false));
306  m_tls->runInterface.get(),false));
307  m_tls->userRunAction->SetMaster(false);
308  Connect(m_tls->userRunAction.get());
309 
310  G4EventManager * eventManager = m_tls->kernel->GetEventManager();
311  eventManager->SetVerboseLevel(m_EvtMgrVerbosity);
312 
313  EventAction * userEventAction =
315  m_tls->trackManager.get(), m_sVerbose.get());
316  Connect(userEventAction);
317  eventManager->SetUserAction(userEventAction);
318 
319  TrackingAction* userTrackingAction =
320  new TrackingAction(userEventAction, m_pTrackingAction, m_sVerbose.get());
321  Connect(userTrackingAction);
322  eventManager->SetUserAction(userTrackingAction);
323 
324  SteppingAction* userSteppingAction =
325  new SteppingAction(userEventAction,m_pSteppingAction,m_sVerbose.get(),m_hasWatchers);
326  Connect(userSteppingAction);
327  eventManager->SetUserAction(userSteppingAction);
328 
329  eventManager->SetUserAction(new StackingAction(userTrackingAction,
331 
332 }
333 
335 {
336  runAction->m_beginOfRunSignal.connect(m_tls->registry->beginOfRunSignal_);
337  runAction->m_endOfRunSignal.connect(m_tls->registry->endOfRunSignal_);
338 }
339 
341 {
342  eventAction->m_beginOfEventSignal.connect(m_tls->registry->beginOfEventSignal_);
343  eventAction->m_endOfEventSignal.connect(m_tls->registry->endOfEventSignal_);
344 }
345 
347 {
348  trackingAction->m_beginOfTrackSignal.connect(m_tls->registry->beginOfTrackSignal_);
349  trackingAction->m_endOfTrackSignal.connect(m_tls->registry->endOfTrackSignal_);
350 }
351 
353 {
354  steppingAction->m_g4StepSignal.connect(m_tls->registry->g4StepSignal_);
355 }
356 
358  initializeTLS();
359  return m_tls->trackManager.get();
360 }
361 std::vector<SensitiveTkDetector*>& RunManagerMTWorker::sensTkDetectors() {
362  initializeTLS();
363  return m_tls->sensTkDets;
364 }
365 std::vector<SensitiveCaloDetector*>& RunManagerMTWorker::sensCaloDetectors() {
366  initializeTLS();
367  return m_tls->sensCaloDets;
368 }
369 std::vector<std::shared_ptr<SimProducer> > RunManagerMTWorker::producers() {
370  initializeTLS();
371  return m_tls->producers;
372 }
373 
375  m_tls->currentRun.reset(new G4Run());
376  G4StateManager::GetStateManager()->SetNewState(G4State_GeomClosed);
377  if (m_tls->userRunAction) { m_tls->userRunAction->BeginOfRunAction(m_tls->currentRun.get()); }
378 }
379 
381  if(!m_tls || m_tls->runTerminated) { return; }
382  if(m_tls->userRunAction) {
383  m_tls->userRunAction->EndOfRunAction(m_tls->currentRun.get());
384  m_tls->userRunAction.reset();
385  }
386  m_tls->currentEvent.reset();
387  m_simEvent.reset();
388 
389  if(m_tls->kernel) {
390  m_tls->kernel->RunTermination();
391  }
392 
393  m_tls->runTerminated = true;
394 }
395 
397  RunManagerMT& runManagerMaster) {
398  // The initialization and begin/end run is a bit convoluted due to
399  // - Geant4 deals per-thread
400  // - OscarMTProducer deals per-stream
401  // and framework/TBB is free to schedule work in streams to the
402  // threads as it likes.
403  //
404  // We have to do the per-thread initialization, and per-thread
405  // per-run initialization here by ourselves.
406 
407  if(!(m_tls && m_tls->threadInitialized)) {
408  LogDebug("SimG4CoreApplication")
409  << "RunManagerMTWorker::produce(): stream "
410  << inpevt.streamID() << " thread " << getThreadIndex() << " initializing";
411  initializeThread(runManagerMaster, es);
412  m_tls->threadInitialized = true;
413  }
414  // Initialize run
415  if(inpevt.id().run() != m_tls->currentRunNumber) {
416  if(m_tls->currentRunNumber != 0 && !m_tls->runTerminated) {
417  // If previous run in this thread was not terminated via endRun() call, terminate it now
418  terminateRun();
419  }
420  initializeRun();
421  m_tls->currentRunNumber = inpevt.id().run();
422  }
423  m_tls->runInterface->setRunManagerMTWorker(this); // For UserActions
424 
425  m_tls->currentEvent.reset(generateEvent(inpevt));
426 
427  m_simEvent.reset(new G4SimEvent());
428  m_simEvent->hepEvent(m_generator.genEvent());
430  if (m_generator.genVertex() != nullptr ) {
431  auto genVertex = m_generator.genVertex();
432  m_simEvent->collisionPoint(
433  math::XYZTLorentzVectorD(genVertex->x()/centimeter,
434  genVertex->y()/centimeter,
435  genVertex->z()/centimeter,
436  genVertex->t()/second));
437  }
438  if (m_tls->currentEvent->GetNumberOfPrimaryVertex()==0) {
439  std::stringstream ss;
440  ss << "RunManagerMTWorker::produce(): event " << inpevt.id().event()
441  << " with no G4PrimaryVertices \n" ;
442  throw SimG4Exception(ss.str());
443 
444  } else {
445  if(!m_tls->kernel) {
446  std::stringstream ss;
447  ss << " RunManagerMT::produce(): "
448  << " no G4WorkerRunManagerKernel yet for thread index"
449  << getThreadIndex() << ", id " << std::hex
450  << std::this_thread::get_id() << " \n";
451  throw SimG4Exception(ss.str());
452  }
453 
454  edm::LogVerbatim("SimG4CoreApplication")
455  << " RunManagerMTWorker::produce: start Event " << inpevt.id().event()
456  << " stream id " << inpevt.streamID()
457  << " thread index " << getThreadIndex()
458  << " of weight " << m_simEvent->weight()
459  << " with " << m_simEvent->nTracks() << " tracks and "
460  << m_simEvent->nVertices()
461  << " vertices, generated by " << m_simEvent->nGenParts() << " particles ";
462 
463  m_tls->kernel->GetEventManager()->ProcessOneEvent(m_tls->currentEvent.get());
464 
465  edm::LogVerbatim("SimG4CoreApplication")
466  << " RunManagerMTWorker::produce: ended Event " << inpevt.id().event();
467  }
468 }
469 
471  if(m_tls->runTerminated) { return; }
472  G4Track* t = m_tls->kernel->GetEventManager()->GetTrackingManager()->GetTrack();
473  t->SetTrackStatus(fStopAndKill) ;
474 
475  // CMS-specific act
476  //
477  TrackingAction* uta =
478  static_cast<TrackingAction *>(m_tls->kernel->GetEventManager()->GetUserTrackingAction());
479  uta->PostUserTrackingAction(t) ;
480 
481  m_tls->currentEvent->SetEventAborted();
482  m_tls->kernel->GetEventManager()->GetStackManager()->clear();
483  m_tls->kernel->GetEventManager()->GetTrackingManager()->EventAborted();
484 }
485 
486 void RunManagerMTWorker::abortRun(bool softAbort) {
487  if (!softAbort) { abortEvent(); }
488  m_tls->currentRun.reset();
489  terminateRun();
490 }
491 
493  m_tls->currentEvent.reset();
494  m_simEvent.reset();
495 
496  // 64 bits event ID in CMSSW converted into Geant4 event ID
497  G4int evtid = (G4int)inpevt.id().event();
498  G4Event * evt = new G4Event(evtid);
499 
501 
502  inpevt.getByToken(m_InToken, HepMCEvt);
503 
504  m_generator.setGenEvent(HepMCEvt->GetEvent());
505 
506  // required to reset the GenParticle Id for particles transported
507  // along the beam pipe
508  // to their original value for SimTrack creation
509  resetGenParticleId( inpevt );
510 
511  if (!m_nonBeam)
512  {
513  m_generator.HepMC2G4(HepMCEvt->GetEvent(),evt);
514  }
515  else
516  {
517  m_generator.nonBeamEvent2G4(HepMCEvt->GetEvent(),evt);
518  }
519 
520  return evt;
521 }
522 
524 {
526  inpevt.getByToken( m_theLHCTlinkToken, theLHCTlink );
527  if ( theLHCTlink.isValid() ) {
528  m_tls->trackManager->setLHCTransportLink( theLHCTlink.product() );
529  }
530 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
edm::ParameterSet m_pSteppingAction
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
std::vector< std::shared_ptr< SimWatcher > > watchers
const SensitiveDetectorCatalog & catalog() const
Definition: RunManagerMT.h:79
T getUntrackedParameter(std::string const &, T const &) const
virtual const math::XYZTLorentzVector * genVertex() const
Definition: Generator.h:30
const double GeV
Definition: MathUtil.h:16
std::unique_ptr< G4Event > currentEvent
virtual const double eventWeight() const
Definition: Generator.h:31
std::pair< std::vector< SensitiveTkDetector * >, std::vector< SensitiveCaloDetector * > > create(const DDDWorld &, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *, SimActivityRegistry &reg) const
Definition: AttachSD.cc:15
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
def create(alignables, pedeDump, additionalData, outputFile, config)
virtual const HepMC::GenEvent * genEvent() const
Definition: Generator.h:29
SimActivityRegistry::G4StepSignal m_g4StepSignal
SimTrackManager * GetSimTrackManager()
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
void HepMC2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:104
std::unique_ptr< SimRunInterface > runInterface
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
SimActivityRegistry::EndOfRunSignal m_endOfRunSignal
Definition: RunAction.h:25
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::vector< SensitiveTkDetector * > sensTkDets
SimActivityRegistry::EndOfEventSignal m_endOfEventSignal
Definition: EventAction.h:51
static void createWatchers(const edm::ParameterSet &iP, SimActivityRegistry &iReg, std::vector< std::shared_ptr< SimWatcher > > &oWatchers, std::vector< std::shared_ptr< SimProducer > > &oProds)
Definition: RunManager.cc:87
#define nullptr
edm::EDGetTokenT< edm::HepMCProduct > m_InToken
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
std::unique_ptr< G4RunManagerKernel > kernel
U second(std::pair< T, U > const &p)
std::unique_ptr< SimActivityRegistry > registry
edm::ParameterSet m_pEventAction
const DDDWorld & world() const
Definition: RunManagerMT.h:75
RunAction
list of unwanted particles (gluons and quarks)
std::unique_ptr< SimTrackManager > trackManager
std::unique_ptr< CustomUIsession > UIsession
std::unique_ptr< G4SimEvent > m_simEvent
static thread_local TLSData * m_tls
edm::ParameterSet m_pRunAction
std::vector< SensitiveCaloDetector * > sensCaloDets
std::vector< SensitiveTkDetector * > & sensTkDetectors()
void resetGenParticleId(const edm::Event &inpevt)
std::unique_ptr< RunAction > userRunAction
void initializeThread(RunManagerMT &runManagerMaster, const edm::EventSetup &es)
void setGenEvent(const HepMC::GenEvent *inpevt)
Definition: Generator.h:25
SimActivityRegistry::EndOfTrackSignal m_endOfTrackSignal
bool isValid() const
Definition: HandleBase.h:74
std::vector< std::shared_ptr< SimProducer > > producers
void abortRun(bool softAbort=false)
RunManagerMTWorker(const edm::ParameterSet &iConfig, edm::ConsumesCollector &&i)
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
PhysicsList * physicsListForWorker() const
Definition: RunManagerMT.h:90
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
T const * product() const
Definition: Handle.h:81
std::vector< SensitiveCaloDetector * > & sensCaloDetectors()
edm::ParameterSet m_pTrackingAction
void produce(const edm::Event &inpevt, const edm::EventSetup &es, RunManagerMT &runManagerMaster)
std::unique_ptr< G4Run > currentRun
edm::ParameterSet m_pField
G4VPhysicalVolume * GetWorldVolumeForWorker() const
Definition: DDDWorld.h:24
G4Event * generateEvent(const edm::Event &inpevt)
edm::EDGetTokenT< edm::LHCTransportLinkContainer > m_theLHCTlinkToken
void nonBeamEvent2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:568
list command
Definition: mps_check.py:24
static void WorkerSetAsWorld(G4VPhysicalVolume *pv)
Definition: DDDWorld.cc:38
SimActivityRegistry::BeginOfRunSignal m_beginOfRunSignal
Definition: RunAction.h:24
const std::vector< std::string > & G4Commands() const
Definition: RunManagerMT.h:83
edm::EventID id() const
Definition: EventBase.h:60
HLT enums.
edm::ParameterSet m_pCustomUIsession
std::vector< std::shared_ptr< SimProducer > > producers()
T get() const
Definition: EventSetup.h:62
StreamID streamID() const
Definition: Event.h:96
std::vector< LHCTransportLink > LHCTransportLinkContainer
void PostUserTrackingAction(const G4Track *aTrack) override
unsigned int RunNumber_t
edm::ParameterSet m_p
T const * product() const
Definition: ESHandle.h:86
SimActivityRegistry::BeginOfEventSignal m_beginOfEventSignal
Definition: EventAction.h:50
T get(const Candidate &c)
Definition: component.h:55
edm::ParameterSet m_pStackingAction
void Connect(RunAction *)
SimActivityRegistry::BeginOfTrackSignal m_beginOfTrackSignal