CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes
RunManagerMTWorker Class Reference

#include <RunManagerMTWorker.h>

Classes

struct  TLSData
 

Public Member Functions

void abortEvent ()
 
void abortRun (bool softAbort=false)
 
void Connect (RunAction *)
 
void Connect (EventAction *)
 
void Connect (TrackingAction *)
 
void Connect (SteppingAction *)
 
void endRun ()
 
SimTrackManagerGetSimTrackManager ()
 
void produce (const edm::Event &inpevt, const edm::EventSetup &es, RunManagerMT &runManagerMaster)
 
std::vector< std::shared_ptr< SimProducer > > producers ()
 
 RunManagerMTWorker (const edm::ParameterSet &iConfig, edm::ConsumesCollector &&i)
 
std::vector< SensitiveCaloDetector * > & sensCaloDetectors ()
 
std::vector< SensitiveTkDetector * > & sensTkDetectors ()
 
G4SimEventsimEvent ()
 
 ~RunManagerMTWorker ()
 

Private Member Functions

G4Event * generateEvent (const edm::Event &inpevt)
 
void initializeRun ()
 
void initializeThread (RunManagerMT &runManagerMaster, const edm::EventSetup &es)
 
void initializeTLS ()
 
void initializeUserActions ()
 
void resetGenParticleId (const edm::Event &inpevt)
 
void terminateRun ()
 

Private Attributes

int m_EvtMgrVerbosity
 
Generator m_generator
 
bool m_hasWatchers
 
edm::EDGetTokenT< edm::HepMCProductm_InToken
 
bool m_nonBeam
 
edm::ParameterSet m_p
 
edm::ParameterSet m_pCustomUIsession
 
edm::ParameterSet m_pEventAction
 
edm::ParameterSet m_pField
 
edm::ParameterSet m_pRunAction
 
edm::ParameterSet m_pStackingAction
 
edm::ParameterSet m_pSteppingAction
 
edm::ParameterSet m_pTrackingAction
 
bool m_pUseMagneticField
 
std::unique_ptr< G4SimEventm_simEvent
 
std::unique_ptr< CMSSteppingVerbosem_sVerbose
 
edm::EDGetTokenT< edm::LHCTransportLinkContainerm_theLHCTlinkToken
 

Static Private Attributes

static thread_local TLSDatam_tls = 0
 

Detailed Description

Definition at line 39 of file RunManagerMTWorker.h.

Constructor & Destructor Documentation

RunManagerMTWorker::RunManagerMTWorker ( const edm::ParameterSet iConfig,
edm::ConsumesCollector &&  i 
)
explicit

Definition at line 134 of file RunManagerMTWorker.cc.

References edm::ParameterSet::getParameter(), initializeTLS(), m_hasWatchers, m_simEvent, and m_sVerbose.

134  :
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 }
edm::ParameterSet m_pSteppingAction
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
edm::EDGetTokenT< edm::HepMCProduct > m_InToken
edm::ParameterSet m_pEventAction
std::unique_ptr< G4SimEvent > m_simEvent
edm::ParameterSet m_pRunAction
edm::ParameterSet m_pTrackingAction
edm::ParameterSet m_pField
edm::EDGetTokenT< edm::LHCTransportLinkContainer > m_theLHCTlinkToken
edm::ParameterSet m_pCustomUIsession
std::vector< LHCTransportLink > LHCTransportLinkContainer
edm::ParameterSet m_p
edm::ParameterSet m_pStackingAction
RunManagerMTWorker::~RunManagerMTWorker ( )

Definition at line 158 of file RunManagerMTWorker.cc.

References m_tls, RunManagerMTWorker::TLSData::runTerminated, and terminateRun().

158  {
159  if(m_tls && !m_tls->runTerminated) { terminateRun(); }
160 }
static thread_local TLSData * m_tls

Member Function Documentation

void RunManagerMTWorker::abortEvent ( )

Definition at line 478 of file RunManagerMTWorker.cc.

References RunManagerMTWorker::TLSData::currentEvent, RunManagerMTWorker::TLSData::kernel, m_tls, TrackingAction::PostUserTrackingAction(), RunManagerMTWorker::TLSData::runTerminated, and lumiQTWidget::t.

Referenced by SimRunInterface::abortEvent(), and abortRun().

478  {
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 }
std::unique_ptr< G4Event > currentEvent
static thread_local TLSData * m_tls
void PostUserTrackingAction(const G4Track *aTrack) override
void RunManagerMTWorker::abortRun ( bool  softAbort = false)

Definition at line 494 of file RunManagerMTWorker.cc.

References abortEvent(), RunManagerMTWorker::TLSData::currentRun, m_tls, and terminateRun().

Referenced by SimRunInterface::abortRun().

494  {
495  if (!softAbort) { abortEvent(); }
496  m_tls->currentRun.reset();
497  terminateRun();
498 }
static thread_local TLSData * m_tls
std::unique_ptr< G4Run > currentRun
void RunManagerMTWorker::Connect ( RunAction runAction)

Definition at line 342 of file RunManagerMTWorker.cc.

References SimActivityRegistry::beginOfRunSignal_, sim_act::Signaler< T >::connect(), SimActivityRegistry::endOfRunSignal_, RunAction::m_beginOfRunSignal, RunAction::m_endOfRunSignal, m_tls, and RunManagerMTWorker::TLSData::registry.

Referenced by SimRunInterface::Connect(), and initializeUserActions().

343 {
346 }
SimActivityRegistry::EndOfRunSignal m_endOfRunSignal
Definition: RunAction.h:26
BeginOfRunSignal beginOfRunSignal_
static thread_local TLSData * m_tls
EndOfRunSignal endOfRunSignal_
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
SimActivityRegistry::BeginOfRunSignal m_beginOfRunSignal
Definition: RunAction.h:25
void RunManagerMTWorker::Connect ( EventAction eventAction)

Definition at line 348 of file RunManagerMTWorker.cc.

References SimActivityRegistry::beginOfEventSignal_, sim_act::Signaler< T >::connect(), SimActivityRegistry::endOfEventSignal_, EventAction::m_beginOfEventSignal, EventAction::m_endOfEventSignal, m_tls, and RunManagerMTWorker::TLSData::registry.

349 {
352 }
EndOfEventSignal endOfEventSignal_
SimActivityRegistry::EndOfEventSignal m_endOfEventSignal
Definition: EventAction.h:54
static thread_local TLSData * m_tls
BeginOfEventSignal beginOfEventSignal_
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
SimActivityRegistry::BeginOfEventSignal m_beginOfEventSignal
Definition: EventAction.h:53
void RunManagerMTWorker::Connect ( TrackingAction trackingAction)

Definition at line 354 of file RunManagerMTWorker.cc.

References SimActivityRegistry::beginOfTrackSignal_, sim_act::Signaler< T >::connect(), SimActivityRegistry::endOfTrackSignal_, TrackingAction::m_beginOfTrackSignal, TrackingAction::m_endOfTrackSignal, m_tls, and RunManagerMTWorker::TLSData::registry.

355 {
358 }
static thread_local TLSData * m_tls
SimActivityRegistry::EndOfTrackSignal m_endOfTrackSignal
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
EndOfTrackSignal endOfTrackSignal_
BeginOfTrackSignal beginOfTrackSignal_
SimActivityRegistry::BeginOfTrackSignal m_beginOfTrackSignal
void RunManagerMTWorker::Connect ( SteppingAction steppingAction)

Definition at line 360 of file RunManagerMTWorker.cc.

References sim_act::Signaler< T >::connect(), SimActivityRegistry::g4StepSignal_, SteppingAction::m_g4StepSignal, m_tls, and RunManagerMTWorker::TLSData::registry.

361 {
363 }
SimActivityRegistry::G4StepSignal m_g4StepSignal
static thread_local TLSData * m_tls
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
void RunManagerMTWorker::endRun ( )

Definition at line 162 of file RunManagerMTWorker.cc.

References terminateRun().

162  {
163  terminateRun();
164 }
G4Event * RunManagerMTWorker::generateEvent ( const edm::Event inpevt)
private

Definition at line 500 of file RunManagerMTWorker.cc.

References RunManagerMTWorker::TLSData::currentEvent, edm::EventID::event(), runTauDisplay::evtid, edm::Event::getByToken(), edm::HepMCProduct::GetEvent(), Generator::HepMC2G4(), edm::EventBase::id(), m_generator, m_InToken, m_nonBeam, m_simEvent, m_tls, Generator::nonBeamEvent2G4(), resetGenParticleId(), and Generator::setGenEvent().

Referenced by produce().

500  {
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 }
EventNumber_t event() const
Definition: EventID.h:41
std::unique_ptr< G4Event > currentEvent
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
void HepMC2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:104
edm::EDGetTokenT< edm::HepMCProduct > m_InToken
std::unique_ptr< G4SimEvent > m_simEvent
static thread_local TLSData * m_tls
void resetGenParticleId(const edm::Event &inpevt)
void setGenEvent(const HepMC::GenEvent *inpevt)
Definition: Generator.h:25
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
void nonBeamEvent2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:568
edm::EventID id() const
Definition: EventBase.h:60
SimTrackManager * RunManagerMTWorker::GetSimTrackManager ( )

Definition at line 365 of file RunManagerMTWorker.cc.

References initializeTLS(), m_tls, and RunManagerMTWorker::TLSData::trackManager.

Referenced by SimRunInterface::SimRunInterface().

365  {
366  initializeTLS();
367  return m_tls->trackManager.get();
368 }
std::unique_ptr< SimTrackManager > trackManager
static thread_local TLSData * m_tls
void RunManagerMTWorker::initializeRun ( )
private

Definition at line 382 of file RunManagerMTWorker.cc.

References RunManagerMTWorker::TLSData::currentRun, m_tls, and RunManagerMTWorker::TLSData::userRunAction.

Referenced by produce().

382  {
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 }
static thread_local TLSData * m_tls
std::unique_ptr< RunAction > userRunAction
std::unique_ptr< G4Run > currentRun
void RunManagerMTWorker::initializeThread ( RunManagerMT runManagerMaster,
const edm::EventSetup es 
)
private

Definition at line 185 of file RunManagerMTWorker.cc.

References SimActivityRegistry::beginOfJobSignal_, RunManagerMT::catalog(), mps_check::command, edm::errors::Configuration, AttachSD::create(), g4SimHits_cfi::CustomUIsession, Exception, g, RunManagerMT::G4Commands(), edm::EventSetup::get(), edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), DDDWorld::GetWorldVolumeForWorker(), GeV, initializeTLS(), initializeUserActions(), RunManagerMTWorker::TLSData::kernel, m_p, m_pCustomUIsession, m_pField, m_pUseMagneticField, m_sVerbose, m_tls, RunManagerMT::physicsListForWorker(), edm::ESHandle< T >::product(), RunManagerMTWorker::TLSData::registry, RunManagerMTWorker::TLSData::sensCaloDets, RunManagerMTWorker::TLSData::sensTkDets, AlCaHLTBitMon_QueryRunRegistry::string, RunManagerMTWorker::TLSData::trackManager, RunManagerMTWorker::TLSData::UIsession, DDDWorld::WorkerSetAsWorld(), and RunManagerMT::world().

Referenced by produce().

185  {
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 }
T getParameter(std::string const &) const
const SensitiveDetectorCatalog & catalog() const
Definition: RunManagerMT.h:79
T getUntrackedParameter(std::string const &, T const &) const
const double GeV
Definition: MathUtil.h:16
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
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
std::vector< SensitiveTkDetector * > sensTkDets
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_
const DDDWorld & world() const
Definition: RunManagerMT.h:75
std::unique_ptr< SimTrackManager > trackManager
std::unique_ptr< CustomUIsession > UIsession
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > sensCaloDets
PhysicsList * physicsListForWorker() const
Definition: RunManagerMT.h:90
edm::ParameterSet m_pField
const T & get() const
Definition: EventSetup.h:59
G4VPhysicalVolume * GetWorldVolumeForWorker() const
Definition: DDDWorld.h:24
list command
Definition: mps_check.py:23
static void WorkerSetAsWorld(G4VPhysicalVolume *pv)
Definition: DDDWorld.cc:38
const std::vector< std::string > & G4Commands() const
Definition: RunManagerMT.h:83
edm::ParameterSet m_pCustomUIsession
edm::ParameterSet m_p
T const * product() const
Definition: ESHandle.h:86
void RunManagerMTWorker::initializeTLS ( )
private

Definition at line 166 of file RunManagerMTWorker.cc.

References edm::errors::Configuration, SimActivityRegistry::connect(), createWatchers(), Exception, m_hasWatchers, m_p, m_tls, RunManagerMTWorker::TLSData::producers, RunManagerMTWorker::TLSData::registry, and RunManagerMTWorker::TLSData::watchers.

Referenced by GetSimTrackManager(), initializeThread(), producers(), RunManagerMTWorker(), sensCaloDetectors(), and sensTkDetectors().

166  {
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 }
std::vector< std::shared_ptr< SimWatcher > > watchers
void connect(Observer< const BeginOfJob * > *iObject)
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
static thread_local TLSData * m_tls
std::vector< std::shared_ptr< SimProducer > > producers
edm::ParameterSet m_p
void RunManagerMTWorker::initializeUserActions ( )
private

Definition at line 311 of file RunManagerMTWorker.cc.

References Connect(), g4SimHits_cfi::EventAction, RunManagerMTWorker::TLSData::kernel, m_EvtMgrVerbosity, m_hasWatchers, m_pEventAction, m_pRunAction, m_pStackingAction, m_pSteppingAction, m_pTrackingAction, m_sVerbose, m_tls, g4SimHits_cfi::RunAction, RunManagerMTWorker::TLSData::runInterface, CastorDigiValidation::StackingAction, CastorDigiValidation::SteppingAction, g4SimHits_cfi::TrackingAction, RunManagerMTWorker::TLSData::trackManager, and RunManagerMTWorker::TLSData::userRunAction.

Referenced by initializeThread().

311  {
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 }
edm::ParameterSet m_pSteppingAction
std::unique_ptr< SimRunInterface > runInterface
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
edm::ParameterSet m_pEventAction
RunAction
list of unwanted particles (gluons and quarks)
std::unique_ptr< SimTrackManager > trackManager
static thread_local TLSData * m_tls
edm::ParameterSet m_pRunAction
std::unique_ptr< RunAction > userRunAction
edm::ParameterSet m_pTrackingAction
edm::ParameterSet m_pStackingAction
void Connect(RunAction *)
void RunManagerMTWorker::produce ( const edm::Event inpevt,
const edm::EventSetup es,
RunManagerMT runManagerMaster 
)

Definition at line 404 of file RunManagerMTWorker.cc.

References RunManagerMTWorker::TLSData::currentEvent, RunManagerMTWorker::TLSData::currentRunNumber, edm::EventID::event(), Generator::eventWeight(), generateEvent(), Generator::genEvent(), Generator::genVertex(), edm::EventBase::id(), initializeRun(), initializeThread(), RunManagerMTWorker::TLSData::kernel, LogDebug, m_generator, m_simEvent, m_tls, nullptr, edm::EventID::run(), RunManagerMTWorker::TLSData::runInterface, RunManagerMTWorker::TLSData::runTerminated, edm::second(), edm::Event::streamID(), terminateRun(), and RunManagerMTWorker::TLSData::threadInitialized.

405  {
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 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
EventNumber_t event() const
Definition: EventID.h:41
virtual const math::XYZTLorentzVector * genVertex() const
Definition: Generator.h:30
std::unique_ptr< G4Event > currentEvent
virtual const double eventWeight() const
Definition: Generator.h:31
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
virtual const HepMC::GenEvent * genEvent() const
Definition: Generator.h:29
std::unique_ptr< SimRunInterface > runInterface
#define nullptr
U second(std::pair< T, U > const &p)
std::unique_ptr< G4SimEvent > m_simEvent
static thread_local TLSData * m_tls
void initializeThread(RunManagerMT &runManagerMaster, const edm::EventSetup &es)
G4Event * generateEvent(const edm::Event &inpevt)
edm::EventID id() const
Definition: EventBase.h:60
StreamID streamID() const
Definition: Event.h:95
std::vector< std::shared_ptr< SimProducer > > RunManagerMTWorker::producers ( )

Definition at line 377 of file RunManagerMTWorker.cc.

References initializeTLS(), m_tls, and RunManagerMTWorker::TLSData::producers.

377  {
378  initializeTLS();
379  return m_tls->producers;
380 }
static thread_local TLSData * m_tls
std::vector< std::shared_ptr< SimProducer > > producers
void RunManagerMTWorker::resetGenParticleId ( const edm::Event inpevt)
private

Definition at line 531 of file RunManagerMTWorker.cc.

References edm::Event::getByToken(), edm::HandleBase::isValid(), m_theLHCTlinkToken, m_tls, edm::Handle< T >::product(), and RunManagerMTWorker::TLSData::trackManager.

Referenced by generateEvent().

532 {
534  inpevt.getByToken( m_theLHCTlinkToken, theLHCTlink );
535  if ( theLHCTlink.isValid() ) {
536  m_tls->trackManager->setLHCTransportLink( theLHCTlink.product() );
537  }
538 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
std::unique_ptr< SimTrackManager > trackManager
static thread_local TLSData * m_tls
bool isValid() const
Definition: HandleBase.h:74
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< edm::LHCTransportLinkContainer > m_theLHCTlinkToken
std::vector< SensitiveCaloDetector * > & RunManagerMTWorker::sensCaloDetectors ( )

Definition at line 373 of file RunManagerMTWorker.cc.

References initializeTLS(), m_tls, and RunManagerMTWorker::TLSData::sensCaloDets.

373  {
374  initializeTLS();
375  return m_tls->sensCaloDets;
376 }
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > sensCaloDets
std::vector< SensitiveTkDetector * > & RunManagerMTWorker::sensTkDetectors ( )

Definition at line 369 of file RunManagerMTWorker.cc.

References initializeTLS(), m_tls, and RunManagerMTWorker::TLSData::sensTkDets.

369  {
370  initializeTLS();
371  return m_tls->sensTkDets;
372 }
std::vector< SensitiveTkDetector * > sensTkDets
static thread_local TLSData * m_tls
G4SimEvent* RunManagerMTWorker::simEvent ( )
inline

Definition at line 51 of file RunManagerMTWorker.h.

References particleFlowRecHitECAL_cfi::producers.

Referenced by SimRunInterface::simEvent().

51 { return m_simEvent.get(); }
std::unique_ptr< G4SimEvent > m_simEvent
void RunManagerMTWorker::terminateRun ( )
private

Definition at line 388 of file RunManagerMTWorker.cc.

References RunManagerMTWorker::TLSData::currentEvent, RunManagerMTWorker::TLSData::currentRun, RunManagerMTWorker::TLSData::kernel, m_simEvent, m_tls, RunManagerMTWorker::TLSData::runTerminated, and RunManagerMTWorker::TLSData::userRunAction.

Referenced by abortRun(), endRun(), RunManagerMT::physicsListForWorker(), produce(), and ~RunManagerMTWorker().

388  {
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 }
std::unique_ptr< G4Event > currentEvent
std::unique_ptr< G4SimEvent > m_simEvent
static thread_local TLSData * m_tls
std::unique_ptr< RunAction > userRunAction
std::unique_ptr< G4Run > currentRun

Member Data Documentation

int RunManagerMTWorker::m_EvtMgrVerbosity
private

Definition at line 82 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

Generator RunManagerMTWorker::m_generator
private

Definition at line 75 of file RunManagerMTWorker.h.

Referenced by generateEvent(), and produce().

bool RunManagerMTWorker::m_hasWatchers
private

Definition at line 81 of file RunManagerMTWorker.h.

Referenced by initializeTLS(), initializeUserActions(), and RunManagerMTWorker().

edm::EDGetTokenT<edm::HepMCProduct> RunManagerMTWorker::m_InToken
private

Definition at line 76 of file RunManagerMTWorker.h.

Referenced by generateEvent().

bool RunManagerMTWorker::m_nonBeam
private

Definition at line 79 of file RunManagerMTWorker.h.

Referenced by generateEvent().

edm::ParameterSet RunManagerMTWorker::m_p
private

Definition at line 91 of file RunManagerMTWorker.h.

Referenced by initializeThread(), and initializeTLS().

edm::ParameterSet RunManagerMTWorker::m_pCustomUIsession
private

Definition at line 90 of file RunManagerMTWorker.h.

Referenced by initializeThread().

edm::ParameterSet RunManagerMTWorker::m_pEventAction
private

Definition at line 86 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pField
private

Definition at line 84 of file RunManagerMTWorker.h.

Referenced by initializeThread().

edm::ParameterSet RunManagerMTWorker::m_pRunAction
private

Definition at line 85 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pStackingAction
private

Definition at line 87 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pSteppingAction
private

Definition at line 89 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pTrackingAction
private

Definition at line 88 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

bool RunManagerMTWorker::m_pUseMagneticField
private

Definition at line 80 of file RunManagerMTWorker.h.

Referenced by initializeThread().

std::unique_ptr<G4SimEvent> RunManagerMTWorker::m_simEvent
private

Definition at line 96 of file RunManagerMTWorker.h.

Referenced by generateEvent(), produce(), RunManagerMTWorker(), and terminateRun().

std::unique_ptr<CMSSteppingVerbose> RunManagerMTWorker::m_sVerbose
private
edm::EDGetTokenT<edm::LHCTransportLinkContainer> RunManagerMTWorker::m_theLHCTlinkToken
private

Definition at line 77 of file RunManagerMTWorker.h.

Referenced by resetGenParticleId().

thread_local RunManagerMTWorker::TLSData * RunManagerMTWorker::m_tls = 0
staticprivate