CMS 3D CMS Logo

RunManagerMTWorker.cc
Go to the documentation of this file.
14 
21 
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  using namespace std;
83  using namespace edm;
84  if(!iP.exists("Watchers")) { return; }
85 
86  vector<ParameterSet> watchers = iP.getParameter<vector<ParameterSet> >("Watchers");
87 
88  if(thisThreadID > 0) {
89  throw edm::Exception(edm::errors::Configuration) << "SimWatchers are not supported for more than 1 thread. If this use case is needed, RunManagerMTWorker has to be updated, and SimWatchers and SimProducers have to be made thread safe.";
90  }
91 
92  for(vector<ParameterSet>::iterator itWatcher = watchers.begin();
93  itWatcher != watchers.end();
94  ++itWatcher) {
95  std::unique_ptr<SimWatcherMakerBase> maker(
96  SimWatcherFactory::get()->create(itWatcher->getParameter<std::string>("type"))
97  );
98  if(maker.get()==nullptr) {
100  << "Unable to find the requested Watcher";
101  }
102 
103  std::shared_ptr<SimWatcher> watcherTemp;
104  std::shared_ptr<SimProducer> producerTemp;
105  maker->make(*itWatcher,iReg,watcherTemp,producerTemp);
106  oWatchers.push_back(watcherTemp);
107  if(producerTemp) {
108  oProds.push_back(producerTemp);
109  }
110  }
111  }
112 }
113 
115  std::unique_ptr<CustomUIsession> UIsession;
116  std::unique_ptr<RunAction> userRunAction;
117  std::unique_ptr<SimRunInterface> runInterface;
119  std::unique_ptr<SimTrackManager> trackManager;
120  std::vector<SensitiveTkDetector*> sensTkDets;
121  std::vector<SensitiveCaloDetector*> sensCaloDets;
122  std::vector<std::shared_ptr<SimWatcher> > watchers;
123  std::vector<std::shared_ptr<SimProducer> > producers;
124  std::unique_ptr<G4Run> currentRun;
125  std::unique_ptr<G4Event> currentEvent;
126  edm::RunNumber_t currentRunNumber = 0;
127  G4RunManagerKernel* kernel = nullptr;
128  bool threadInitialized = false;
129  bool runTerminated = false;
130 };
131 
133 
135  m_generator(iConfig.getParameter<edm::ParameterSet>("Generator")),
136  m_InToken(iC.consumes<edm::HepMCProduct>(iConfig.getParameter<edm::ParameterSet>("Generator").getParameter<edm::InputTag>("HepMCProductLabel"))),
137  m_theLHCTlinkToken(iC.consumes<edm::LHCTransportLinkContainer>(iConfig.getParameter<edm::InputTag>("theLHCTlinkTag"))),
138  m_nonBeam(iConfig.getParameter<bool>("NonBeamEvent")),
139  m_pUseMagneticField(iConfig.getParameter<bool>("UseMagneticField")),
140  m_EvtMgrVerbosity(iConfig.getUntrackedParameter<int>("G4EventManagerVerbosity",0)),
141  m_pField(iConfig.getParameter<edm::ParameterSet>("MagneticField")),
142  m_pRunAction(iConfig.getParameter<edm::ParameterSet>("RunAction")),
143  m_pEventAction(iConfig.getParameter<edm::ParameterSet>("EventAction")),
144  m_pStackingAction(iConfig.getParameter<edm::ParameterSet>("StackingAction")),
145  m_pTrackingAction(iConfig.getParameter<edm::ParameterSet>("TrackingAction")),
146  m_pSteppingAction(iConfig.getParameter<edm::ParameterSet>("SteppingAction")),
147  m_pCustomUIsession(iConfig.getUntrackedParameter<edm::ParameterSet>("CustomUIsession")),
148  m_p(iConfig)
149 {
150  initializeTLS();
151  m_simEvent.reset(nullptr);
152  m_sVerbose.reset(nullptr);
153  std::vector<edm::ParameterSet> watchers =
154  iConfig.getParameter<std::vector<edm::ParameterSet> >("Watchers");
155  m_hasWatchers = (watchers.empty()) ? false : true;
156 }
157 
159  if(m_tls && !m_tls->runTerminated) { terminateRun(); }
160 }
161 
163  terminateRun();
164 }
165 
167  if(m_tls) { return; }
168  m_tls = new TLSData;
169 
170  edm::Service<SimActivityRegistry> otherRegistry;
171  //Look for an outside SimActivityRegistry
172  // this is used by the visualization code
173  int thisID = getThreadIndex();
174  if(otherRegistry){
175  m_tls->registry.connect(*otherRegistry);
176  if(thisID > 0) {
177  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.";
178  }
179  }
180  if(m_hasWatchers) {
182  }
183 }
184 
186  // I guess everything initialized here should be in thread_local storage
187  initializeTLS();
188 
189  int thisID = getThreadIndex();
190 
191  edm::LogInfo("SimG4CoreApplication")
192  << "RunManagerMTWorker::initializeThread " << thisID;
193 
194  // Initialize per-thread output
195  G4Threading::G4SetThreadId( thisID );
196  G4UImanager::GetUIpointer()->SetUpForAThread( thisID );
198  if(uitype == "MessageLogger") {
199  m_tls->UIsession.reset(new CustomUIsession());
200  }
201  else if(uitype == "MessageLoggerThreadPrefix") {
203  }
204  else if(uitype == "FilePerThread") {
206  }
207  else {
209  << "Invalid value of CustomUIsession.Type '" << uitype
210  << "', valid are MessageLogger, MessageLoggerThreadPrefix, FilePerThread";
211  }
212 
213  // Initialize worker part of shared resources (geometry, physics)
214  G4WorkerThread::BuildGeometryAndPhysicsVector();
215 
216  // Create worker run manager
217  m_tls->kernel = G4WorkerRunManagerKernel::GetRunManagerKernel();
218  if(!m_tls->kernel) { m_tls->kernel = new G4WorkerRunManagerKernel(); }
219 
220  // Define G4 exception handler
221  G4StateManager::GetStateManager()->SetExceptionHandler(new ExceptionHandler());
222 
223  // Set the geometry for the worker, share from master
225 
226  // we need the track manager now
227  m_tls->trackManager.reset(new SimTrackManager());
228 
229  // Get DDCompactView, or would it be better to get the object from
230  // runManagerMaster instead of EventSetup in here?
232  es.get<IdealGeometryRecord>().get(pDD);
233 
234  // setup the magnetic field
236  {
237  const GlobalPoint g(0.,0.,0.);
238 
240  es.get<IdealMagneticFieldRecord>().get(pMF);
241 
242  sim::FieldBuilder fieldBuilder(pMF.product(), m_pField);
243  CMSFieldManager* fieldManager = new CMSFieldManager();
244  G4TransportationManager * tM =
245  G4TransportationManager::GetTransportationManager();
246  tM->SetFieldManager(fieldManager);
247  fieldBuilder.build( fieldManager, tM->GetPropagatorInField());
248  }
249 
250  // attach sensitive detector
251  AttachSD attach;
252  std::pair< std::vector<SensitiveTkDetector*>,
253  std::vector<SensitiveCaloDetector*> > sensDets =
254  attach.create(runManagerMaster.world(),
255  (*pDD),
256  runManagerMaster.catalog(),
257  m_p,
258  m_tls->trackManager.get(),
259  m_tls->registry);
260 
261  m_tls->sensTkDets.swap(sensDets.first);
262  m_tls->sensCaloDets.swap(sensDets.second);
263 
264  edm::LogInfo("SimG4CoreApplication")
265  << " RunManagerMTWorker: Sensitive Detector "
266  << "building finished; found "
267  << m_tls->sensTkDets.size()
268  << " Tk type Producers, and "
269  << m_tls->sensCaloDets.size()
270  << " Calo type producers ";
271 
272  // Set the physics list for the worker, share from master
273  PhysicsList *physicsList = runManagerMaster.physicsListForWorker();
274 
275  edm::LogInfo("SimG4CoreApplication")
276  << "RunManagerMTWorker: start initialisation of PhysicsList for a thread";
277 
278  physicsList->InitializeWorker();
279  m_tls->kernel->SetPhysics(physicsList);
280  m_tls->kernel->InitializePhysics();
281 
282  const bool kernelInit = m_tls->kernel->RunInitialization();
283  if(!kernelInit) {
284  throw SimG4Exception("G4WorkerRunManagerKernel initialization failed");
285  }
286  //tell all interesting parties that we are beginning the job
287  BeginOfJob aBeginOfJob(&es);
288  m_tls->registry.beginOfJobSignal_(&aBeginOfJob);
289 
290  G4int sv = m_p.getParameter<int>("SteppingVerbosity");
291  G4double elim = m_p.getParameter<double>("StepVerboseThreshold")*CLHEP::GeV;
292  std::vector<int> ve = m_p.getParameter<std::vector<int> >("VerboseEvents");
293  std::vector<int> vn = m_p.getParameter<std::vector<int> >("VertexNumber");
294  std::vector<int> vt = m_p.getParameter<std::vector<int> >("VerboseTracks");
295 
296  if(sv > 0) {
297  m_sVerbose.reset(new CMSSteppingVerbose(sv, elim, ve, vn, vt));
298  }
300 
301  edm::LogInfo("SimG4CoreApplication")
302  << "RunManagerMTWorker::initializeThread done for the thread " << thisID;
303 
304  for(const std::string& command: runManagerMaster.G4Commands()) {
305  edm::LogInfo("SimG4CoreApplication") << "RunManagerMTWorker:: Requests UI: "
306  << command;
307  G4UImanager::GetUIpointer()->ApplyCommand(command);
308  }
309 }
310 
312  m_tls->runInterface.reset(new SimRunInterface(this, false));
314  m_tls->runInterface.get(),false));
315  m_tls->userRunAction->SetMaster(false);
316  Connect(m_tls->userRunAction.get());
317 
318  G4EventManager * eventManager = m_tls->kernel->GetEventManager();
319  eventManager->SetVerboseLevel(m_EvtMgrVerbosity);
320 
321  EventAction * userEventAction =
323  m_tls->trackManager.get(), m_sVerbose.get());
324  Connect(userEventAction);
325  eventManager->SetUserAction(userEventAction);
326 
327  TrackingAction* userTrackingAction =
328  new TrackingAction(userEventAction, m_pTrackingAction, m_sVerbose.get());
329  Connect(userTrackingAction);
330  eventManager->SetUserAction(userTrackingAction);
331 
332  SteppingAction* userSteppingAction =
333  new SteppingAction(userEventAction,m_pSteppingAction,m_sVerbose.get(),m_hasWatchers);
334  Connect(userSteppingAction);
335  eventManager->SetUserAction(userSteppingAction);
336 
337  eventManager->SetUserAction(new StackingAction(userTrackingAction,
339 
340 }
341 
343 {
346 }
347 
349 {
352 }
353 
355 {
358 }
359 
361 {
363 }
364 
366  initializeTLS();
367  return m_tls->trackManager.get();
368 }
369 std::vector<SensitiveTkDetector*>& RunManagerMTWorker::sensTkDetectors() {
370  initializeTLS();
371  return m_tls->sensTkDets;
372 }
373 std::vector<SensitiveCaloDetector*>& RunManagerMTWorker::sensCaloDetectors() {
374  initializeTLS();
375  return m_tls->sensCaloDets;
376 }
377 std::vector<std::shared_ptr<SimProducer> > RunManagerMTWorker::producers() {
378  initializeTLS();
379  return m_tls->producers;
380 }
381 
383  m_tls->currentRun.reset(new G4Run());
384  G4StateManager::GetStateManager()->SetNewState(G4State_GeomClosed);
385  if (m_tls->userRunAction) { m_tls->userRunAction->BeginOfRunAction(m_tls->currentRun.get()); }
386 }
387 
389  if(!m_tls || m_tls->runTerminated) { return; }
390  if(m_tls->userRunAction) {
391  m_tls->userRunAction->EndOfRunAction(m_tls->currentRun.get());
392  m_tls->userRunAction.reset();
393  }
394  m_tls->currentEvent.reset();
395  m_simEvent.reset();
396 
397  if(m_tls->kernel) {
398  m_tls->kernel->RunTermination();
399  }
400 
401  m_tls->runTerminated = true;
402 }
403 
405  RunManagerMT& runManagerMaster) {
406  // The initialization and begin/end run is a bit convoluted due to
407  // - Geant4 deals per-thread
408  // - OscarMTProducer deals per-stream
409  // and framework/TBB is free to schedule work in streams to the
410  // threads as it likes.
411  //
412  // We have to do the per-thread initialization, and per-thread
413  // per-run initialization here by ourselves.
414 
415  if(!(m_tls && m_tls->threadInitialized)) {
416  LogDebug("SimG4CoreApplication")
417  << "RunManagerMTWorker::produce(): stream "
418  << inpevt.streamID() << " thread " << getThreadIndex() << " initializing";
419  initializeThread(runManagerMaster, es);
420  m_tls->threadInitialized = true;
421  }
422  // Initialize run
423  if(inpevt.id().run() != m_tls->currentRunNumber) {
424  if(m_tls->currentRunNumber != 0 && !m_tls->runTerminated) {
425  // If previous run in this thread was not terminated via endRun() call, terminate it now
426  terminateRun();
427  }
428  initializeRun();
429  m_tls->currentRunNumber = inpevt.id().run();
430  }
431  m_tls->runInterface->setRunManagerMTWorker(this); // For UserActions
432 
433  m_tls->currentEvent.reset(generateEvent(inpevt));
434 
435  m_simEvent.reset(new G4SimEvent());
436  m_simEvent->hepEvent(m_generator.genEvent());
438  if (m_generator.genVertex() != nullptr ) {
439  auto genVertex = m_generator.genVertex();
440  m_simEvent->collisionPoint(
441  math::XYZTLorentzVectorD(genVertex->x()/centimeter,
442  genVertex->y()/centimeter,
443  genVertex->z()/centimeter,
444  genVertex->t()/second));
445  }
446  if (m_tls->currentEvent->GetNumberOfPrimaryVertex()==0) {
447  std::stringstream ss;
448  ss << "RunManagerMTWorker::produce(): event " << inpevt.id().event()
449  << " with no G4PrimaryVertices \n" ;
450  throw SimG4Exception(ss.str());
451 
452  } else {
453  if(!m_tls->kernel) {
454  std::stringstream ss;
455  ss << " RunManagerMT::produce(): "
456  << " no G4WorkerRunManagerKernel yet for thread index"
457  << getThreadIndex() << ", id " << std::hex
458  << std::this_thread::get_id() << " \n";
459  throw SimG4Exception(ss.str());
460  }
461 
462  edm::LogInfo("SimG4CoreApplication")
463  << " RunManagerMTWorker::produce: start Event " << inpevt.id().event()
464  << " stream id " << inpevt.streamID()
465  << " thread index " << getThreadIndex()
466  << " of weight " << m_simEvent->weight()
467  << " with " << m_simEvent->nTracks() << " tracks and "
468  << m_simEvent->nVertices()
469  << " vertices, generated by " << m_simEvent->nGenParts() << " particles ";
470 
471  m_tls->kernel->GetEventManager()->ProcessOneEvent(m_tls->currentEvent.get());
472 
473  edm::LogInfo("SimG4CoreApplication")
474  << " RunManagerMTWorker::produce: ended Event " << inpevt.id().event();
475  }
476 }
477 
479  if(m_tls->runTerminated) { return; }
480  G4Track* t = m_tls->kernel->GetEventManager()->GetTrackingManager()->GetTrack();
481  t->SetTrackStatus(fStopAndKill) ;
482 
483  // CMS-specific act
484  //
485  TrackingAction* uta =
486  static_cast<TrackingAction *>(m_tls->kernel->GetEventManager()->GetUserTrackingAction());
487  uta->PostUserTrackingAction(t) ;
488 
489  m_tls->currentEvent->SetEventAborted();
490  m_tls->kernel->GetEventManager()->GetStackManager()->clear();
491  m_tls->kernel->GetEventManager()->GetTrackingManager()->EventAborted();
492 }
493 
494 void RunManagerMTWorker::abortRun(bool softAbort) {
495  if (!softAbort) { abortEvent(); }
496  m_tls->currentRun.reset();
497  terminateRun();
498 }
499 
501  m_tls->currentEvent.reset();
502  m_simEvent.reset();
503 
504  // 64 bits event ID in CMSSW converted into Geant4 event ID
505  G4int evtid = (G4int)inpevt.id().event();
506  G4Event * evt = new G4Event(evtid);
507 
509 
510  inpevt.getByToken(m_InToken, HepMCEvt);
511 
512  m_generator.setGenEvent(HepMCEvt->GetEvent());
513 
514  // required to reset the GenParticle Id for particles transported
515  // along the beam pipe
516  // to their original value for SimTrack creation
517  resetGenParticleId( inpevt );
518 
519  if (!m_nonBeam)
520  {
521  m_generator.HepMC2G4(HepMCEvt->GetEvent(),evt);
522  }
523  else
524  {
525  m_generator.nonBeamEvent2G4(HepMCEvt->GetEvent(),evt);
526  }
527 
528  return evt;
529 }
530 
532 {
534  inpevt.getByToken( m_theLHCTlinkToken, theLHCTlink );
535  if ( theLHCTlink.isValid() ) {
536  m_tls->trackManager->setLHCTransportLink( theLHCTlink.product() );
537  }
538 }
#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:519
void connect(Observer< const BeginOfJob * > *iObject)
void HepMC2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:104
EndOfEventSignal endOfEventSignal_
std::unique_ptr< SimRunInterface > runInterface
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
SimActivityRegistry::EndOfRunSignal m_endOfRunSignal
Definition: RunAction.h:26
bool exists(std::string const &parameterName) const
checks if a parameter exists
BeginOfRunSignal beginOfRunSignal_
std::vector< SensitiveTkDetector * > sensTkDets
SimActivityRegistry::EndOfEventSignal m_endOfEventSignal
Definition: EventAction.h:54
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:85
#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
BeginOfJobSignal beginOfJobSignal_
U second(std::pair< T, U > const &p)
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
BeginOfEventSignal beginOfEventSignal_
SimActivityRegistry::EndOfTrackSignal m_endOfTrackSignal
bool isValid() const
Definition: HandleBase.h:74
EndOfRunSignal endOfRunSignal_
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
const T & get() const
Definition: EventSetup.h:59
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:23
static void WorkerSetAsWorld(G4VPhysicalVolume *pv)
Definition: DDDWorld.cc:38
SimActivityRegistry::BeginOfRunSignal m_beginOfRunSignal
Definition: RunAction.h:25
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()
StreamID streamID() const
Definition: Event.h:95
std::vector< LHCTransportLink > LHCTransportLinkContainer
void PostUserTrackingAction(const G4Track *aTrack) override
unsigned int RunNumber_t
EndOfTrackSignal endOfTrackSignal_
edm::ParameterSet m_p
T const * product() const
Definition: ESHandle.h:86
SimActivityRegistry::BeginOfEventSignal m_beginOfEventSignal
Definition: EventAction.h:53
T get(const Candidate &c)
Definition: component.h:55
BeginOfTrackSignal beginOfTrackSignal_
edm::ParameterSet m_pStackingAction
void Connect(RunAction *)
SimActivityRegistry::BeginOfTrackSignal m_beginOfTrackSignal