CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Member Functions | Static 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 ()
 
std::unique_ptr< G4SimEventproduce (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

void DumpMagneticField (const G4Field *, const std::string &) const
 
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 ()
 

Static Private Member Functions

static void resetTLS ()
 

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
 
G4SimEventm_simEvent
 
std::unique_ptr< CMSSteppingVerbosem_sVerbose
 
edm::EDGetTokenT< edm::LHCTransportLinkContainerm_theLHCTlinkToken
 

Static Private Attributes

static thread_local bool dumpMF = false
 
static thread_local TLSDatam_tls { 0 }
 

Detailed Description

Definition at line 41 of file RunManagerMTWorker.h.

Constructor & Destructor Documentation

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

Definition at line 146 of file RunManagerMTWorker.cc.

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

147  : m_generator(iConfig.getParameter<edm::ParameterSet>("Generator")),
148  m_InToken(iC.consumes<edm::HepMCProduct>(
149  iConfig.getParameter<edm::ParameterSet>("Generator").getParameter<edm::InputTag>("HepMCProductLabel"))),
151  iC.consumes<edm::LHCTransportLinkContainer>(iConfig.getParameter<edm::InputTag>("theLHCTlinkTag"))),
152  m_nonBeam(iConfig.getParameter<bool>("NonBeamEvent")),
153  m_pUseMagneticField(iConfig.getParameter<bool>("UseMagneticField")),
154  m_EvtMgrVerbosity(iConfig.getUntrackedParameter<int>("G4EventManagerVerbosity", 0)),
155  m_pField(iConfig.getParameter<edm::ParameterSet>("MagneticField")),
156  m_pRunAction(iConfig.getParameter<edm::ParameterSet>("RunAction")),
157  m_pEventAction(iConfig.getParameter<edm::ParameterSet>("EventAction")),
158  m_pStackingAction(iConfig.getParameter<edm::ParameterSet>("StackingAction")),
159  m_pTrackingAction(iConfig.getParameter<edm::ParameterSet>("TrackingAction")),
160  m_pSteppingAction(iConfig.getParameter<edm::ParameterSet>("SteppingAction")),
161  m_pCustomUIsession(iConfig.getUntrackedParameter<edm::ParameterSet>("CustomUIsession")),
162  m_p(iConfig),
163  m_simEvent(nullptr),
164  m_sVerbose(nullptr) {
165  std::vector<edm::ParameterSet> watchers = iConfig.getParameter<std::vector<edm::ParameterSet> >("Watchers");
166  m_hasWatchers = (watchers.empty()) ? false : true;
167  initializeTLS();
168 }
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
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 170 of file RunManagerMTWorker.cc.

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

170  {
171  if (m_tls && !m_tls->runTerminated) {
172  terminateRun();
173  }
174 
175  ++n_tls_shutdown_task;
176  resetTLS();
177 
178  {
179  //make sure all tasks are done before continuing
180  timespec s;
181  s.tv_sec = 0;
182  s.tv_nsec = 10000;
183  while (n_tls_shutdown_task != 0) {
184  nanosleep(&s, nullptr);
185  }
186  }
187 }
static thread_local TLSData * m_tls

Member Function Documentation

void RunManagerMTWorker::abortEvent ( )

Definition at line 532 of file RunManagerMTWorker.cc.

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

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

532  {
533  if (m_tls->runTerminated) {
534  return;
535  }
536  G4Track* t = m_tls->kernel->GetEventManager()->GetTrackingManager()->GetTrack();
537  t->SetTrackStatus(fStopAndKill);
538 
539  // CMS-specific act
540  //
541  TrackingAction* uta = static_cast<TrackingAction*>(m_tls->kernel->GetEventManager()->GetUserTrackingAction());
542  uta->PostUserTrackingAction(t);
543 
544  m_tls->currentEvent->SetEventAborted();
545  m_tls->kernel->GetEventManager()->GetStackManager()->clear();
546  m_tls->kernel->GetEventManager()->GetTrackingManager()->EventAborted();
547 }
std::unique_ptr< G4Event > currentEvent
std::unique_ptr< G4RunManagerKernel > kernel
static thread_local TLSData * m_tls
void PostUserTrackingAction(const G4Track *aTrack) override
void RunManagerMTWorker::abortRun ( bool  softAbort = false)

Definition at line 549 of file RunManagerMTWorker.cc.

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

Referenced by SimRunInterface::abortRun().

549  {
550  if (!softAbort) {
551  abortEvent();
552  }
553  m_tls->currentRun = nullptr;
554  terminateRun();
555 }
static thread_local TLSData * m_tls
void RunManagerMTWorker::Connect ( RunAction runAction)

Definition at line 392 of file RunManagerMTWorker.cc.

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

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

392  {
393  runAction->m_beginOfRunSignal.connect(m_tls->registry->beginOfRunSignal_);
394  runAction->m_endOfRunSignal.connect(m_tls->registry->endOfRunSignal_);
395 }
SimActivityRegistry::EndOfRunSignal m_endOfRunSignal
Definition: RunAction.h:24
std::unique_ptr< SimActivityRegistry > registry
static thread_local TLSData * m_tls
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:55
SimActivityRegistry::BeginOfRunSignal m_beginOfRunSignal
Definition: RunAction.h:23
void RunManagerMTWorker::Connect ( EventAction eventAction)

Definition at line 397 of file RunManagerMTWorker.cc.

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

397  {
398  eventAction->m_beginOfEventSignal.connect(m_tls->registry->beginOfEventSignal_);
399  eventAction->m_endOfEventSignal.connect(m_tls->registry->endOfEventSignal_);
400 }
SimActivityRegistry::EndOfEventSignal m_endOfEventSignal
Definition: EventAction.h:44
std::unique_ptr< SimActivityRegistry > registry
static thread_local TLSData * m_tls
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:55
SimActivityRegistry::BeginOfEventSignal m_beginOfEventSignal
Definition: EventAction.h:43
void RunManagerMTWorker::Connect ( TrackingAction trackingAction)

Definition at line 402 of file RunManagerMTWorker.cc.

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

402  {
403  trackingAction->m_beginOfTrackSignal.connect(m_tls->registry->beginOfTrackSignal_);
404  trackingAction->m_endOfTrackSignal.connect(m_tls->registry->endOfTrackSignal_);
405 }
std::unique_ptr< SimActivityRegistry > registry
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:55
SimActivityRegistry::BeginOfTrackSignal m_beginOfTrackSignal
void RunManagerMTWorker::Connect ( SteppingAction steppingAction)

Definition at line 407 of file RunManagerMTWorker.cc.

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

407  {
408  steppingAction->m_g4StepSignal.connect(m_tls->registry->g4StepSignal_);
409 }
SimActivityRegistry::G4StepSignal m_g4StepSignal
std::unique_ptr< SimActivityRegistry > registry
static thread_local TLSData * m_tls
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:55
void RunManagerMTWorker::DumpMagneticField ( const G4Field *  field,
const std::string &  file 
) const
private

Definition at line 593 of file RunManagerMTWorker.cc.

References funct::cos(), flavorHistoryFilter_cfi::dr, PVValHelper::dz, groupFilesInBlocks::fout, mps_fire::i, createfilelist::int, dqmiolumiharvest::j, EgHLTOffHistBins_cfi::nr, MillePedeFileConverter_cfg::out, phi, point, alignCSCRings::r, funct::sin(), z, HLTMuonOfflineAnalyzer_cfi::z0, and SiStripMonitorCluster_cfi::zmax.

Referenced by initializeThread().

593  {
594  std::ofstream fout(file.c_str(), std::ios::out);
595  if (fout.fail()) {
596  edm::LogWarning("SimG4CoreApplication")
597  << " RunManager WARNING : error opening file <" << file << "> for magnetic field";
598  } else {
599  // CMS magnetic field volume
600  double rmax = 9000 * mm;
601  double zmax = 24000 * mm;
602 
603  double dr = 1 * cm;
604  double dz = 5 * cm;
605 
606  int nr = (int)(rmax / dr);
607  int nz = 2 * (int)(zmax / dz);
608 
609  double r = 0.0;
610  double z0 = -zmax;
611  double z;
612 
613  double phi = 0.0;
614  double cosf = cos(phi);
615  double sinf = sin(phi);
616 
617  double point[4] = {0.0, 0.0, 0.0, 0.0};
618  double bfield[3] = {0.0, 0.0, 0.0};
619 
620  fout << std::setprecision(6);
621  for (int i = 0; i <= nr; ++i) {
622  z = z0;
623  for (int j = 0; j <= nz; ++j) {
624  point[0] = r * cosf;
625  point[1] = r * sinf;
626  point[2] = z;
627  field->GetFieldValue(point, bfield);
628  fout << "R(mm)= " << r / mm << " phi(deg)= " << phi / degree << " Z(mm)= " << z / mm
629  << " Bz(tesla)= " << bfield[2] / tesla << " Br(tesla)= " << (bfield[0] * cosf + bfield[1] * sinf) / tesla
630  << " Bphi(tesla)= " << (bfield[0] * sinf - bfield[1] * cosf) / tesla << G4endl;
631  z += dz;
632  }
633  r += dr;
634  }
635 
636  fout.close();
637  }
638 }
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
void RunManagerMTWorker::endRun ( )

Definition at line 215 of file RunManagerMTWorker.cc.

References terminateRun().

G4Event * RunManagerMTWorker::generateEvent ( const edm::Event inpevt)
private

Definition at line 557 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().

557  {
558  m_tls->currentEvent.reset();
559  m_simEvent = nullptr;
560 
561  // 64 bits event ID in CMSSW converted into Geant4 event ID
562  G4int evtid = (G4int)inpevt.id().event();
563  G4Event* evt = new G4Event(evtid);
564 
566 
567  inpevt.getByToken(m_InToken, HepMCEvt);
568 
569  m_generator.setGenEvent(HepMCEvt->GetEvent());
570 
571  // required to reset the GenParticle Id for particles transported
572  // along the beam pipe
573  // to their original value for SimTrack creation
574  resetGenParticleId(inpevt);
575 
576  if (!m_nonBeam) {
577  m_generator.HepMC2G4(HepMCEvt->GetEvent(), evt);
578  } else {
579  m_generator.nonBeamEvent2G4(HepMCEvt->GetEvent(), evt);
580  }
581 
582  return evt;
583 }
EventNumber_t event() const
Definition: EventID.h:40
std::unique_ptr< G4Event > currentEvent
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void HepMC2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:101
edm::EDGetTokenT< edm::HepMCProduct > m_InToken
static thread_local TLSData * m_tls
void resetGenParticleId(const edm::Event &inpevt)
void setGenEvent(const HepMC::GenEvent *inpevt)
Definition: Generator.h:24
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:34
void nonBeamEvent2G4(const HepMC::GenEvent *g, G4Event *e)
Definition: Generator.cc:527
edm::EventID id() const
Definition: EventBase.h:59
SimTrackManager * RunManagerMTWorker::GetSimTrackManager ( )

Definition at line 411 of file RunManagerMTWorker.cc.

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

Referenced by SimRunInterface::SimRunInterface().

411  {
412  initializeTLS();
413  return m_tls->trackManager.get();
414 }
std::unique_ptr< SimTrackManager > trackManager
static thread_local TLSData * m_tls
void RunManagerMTWorker::initializeRun ( )
private

Definition at line 428 of file RunManagerMTWorker.cc.

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

Referenced by produce().

428  {
429  m_tls->currentRun = new G4Run();
430  G4StateManager::GetStateManager()->SetNewState(G4State_GeomClosed);
431  if (m_tls->userRunAction) {
432  m_tls->userRunAction->BeginOfRunAction(m_tls->currentRun);
433  }
434 }
static thread_local TLSData * m_tls
std::unique_ptr< RunAction > userRunAction
void RunManagerMTWorker::initializeThread ( RunManagerMT runManagerMaster,
const edm::EventSetup es 
)
private

Definition at line 242 of file RunManagerMTWorker.cc.

References applyOnce, RunManagerMT::catalog(), mps_check::command, edm::errors::Configuration, AttachSD::create(), g4SimHits_cfi::CustomUIsession, DumpMagneticField(), dumpMF, Exception, g, RunManagerMT::G4Commands(), ecalTB2006H4_GenSimDigiReco_cfg::G4cout, edm::EventSetup::get(), edm::ParameterSet::getUntrackedParameter(), DDDWorld::GetWorldVolume(), 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, pfDeepBoostedJetPreprocessParams_cfi::sv, RunManagerMTWorker::TLSData::trackManager, RunManagerMTWorker::TLSData::UIsession, and RunManagerMT::world().

Referenced by produce().

242  {
243  // I guess everything initialized here should be in thread_local storage
244  initializeTLS();
245 
246  int thisID = getThreadIndex();
247 
248  edm::LogVerbatim("SimG4CoreApplication") << "RunManagerMTWorker::initializeThread " << thisID;
249 
250  // Initialize per-thread output
251  G4Threading::G4SetThreadId(thisID);
252  G4UImanager::GetUIpointer()->SetUpForAThread(thisID);
253  const std::string& uitype = m_pCustomUIsession.getUntrackedParameter<std::string>("Type", "MessageLogger");
254  if (uitype == "MessageLogger") {
255  m_tls->UIsession.reset(new CustomUIsession());
256  } else if (uitype == "MessageLoggerThreadPrefix") {
258  m_pCustomUIsession.getUntrackedParameter<std::string>("ThreadPrefix", ""), thisID));
259  } else if (uitype == "FilePerThread") {
260  m_tls->UIsession.reset(
262  } else {
264  << "Invalid value of CustomUIsession.Type '" << uitype
265  << "', valid are MessageLogger, MessageLoggerThreadPrefix, FilePerThread";
266  }
267 
268  // Initialize worker part of shared resources (geometry, physics)
269  G4WorkerThread::BuildGeometryAndPhysicsVector();
270 
271  // Create worker run manager
272  m_tls->kernel.reset(G4WorkerRunManagerKernel::GetRunManagerKernel());
273  if (!m_tls->kernel) {
274  m_tls->kernel.reset(new G4WorkerRunManagerKernel());
275  }
276 
277  // Define G4 exception handler
278  G4StateManager::GetStateManager()->SetExceptionHandler(new ExceptionHandler());
279 
280  // Set the geometry for the worker, share from master
281  auto worldPV = runManagerMaster.world().GetWorldVolume();
282  m_tls->kernel->WorkerDefineWorldVolume(worldPV);
283  G4TransportationManager* tM = G4TransportationManager::GetTransportationManager();
284  tM->SetWorldForTracking(worldPV);
285 
286  // we need the track manager now
287  m_tls->trackManager.reset(new SimTrackManager());
288 
289  // setup the magnetic field
290  if (m_pUseMagneticField) {
291  const GlobalPoint g(0., 0., 0.);
292 
294  es.get<IdealMagneticFieldRecord>().get(pMF);
295 
296  sim::FieldBuilder fieldBuilder(pMF.product(), m_pField);
297  CMSFieldManager* fieldManager = new CMSFieldManager();
298  tM->SetFieldManager(fieldManager);
299  fieldBuilder.build(fieldManager, tM->GetPropagatorInField());
300 
301  std::string fieldFile = m_p.getUntrackedParameter<std::string>("FileNameField", "");
302  if (!fieldFile.empty()) {
303  std::call_once(applyOnce, []() { dumpMF = true; });
304  if (dumpMF) {
305  edm::LogVerbatim("SimG4CoreApplication") << " RunManagerMTWorker: Dump magnetic field to file " << fieldFile;
306  DumpMagneticField(tM->GetFieldManager()->GetDetectorField(), fieldFile);
307  }
308  }
309  }
310 
311  // attach sensitive detector
312  AttachSD attach;
313  auto sensDets =
314  attach.create(es, runManagerMaster.catalog(), m_p, m_tls->trackManager.get(), *(m_tls->registry.get()));
315 
316  m_tls->sensTkDets.swap(sensDets.first);
317  m_tls->sensCaloDets.swap(sensDets.second);
318 
319  edm::LogVerbatim("SimG4CoreApplication")
320  << " RunManagerMTWorker: Sensitive Detector building finished; found " << m_tls->sensTkDets.size()
321  << " Tk type Producers, and " << m_tls->sensCaloDets.size() << " Calo type producers ";
322 
323  // Set the physics list for the worker, share from master
324  PhysicsList* physicsList = runManagerMaster.physicsListForWorker();
325 
326  edm::LogVerbatim("SimG4CoreApplication") << "RunManagerMTWorker: start initialisation of PhysicsList for the thread";
327 
328  // Geant4 UI commands in PreInit state
329  if (!runManagerMaster.G4Commands().empty()) {
330  G4cout << "RunManagerMTWorker: Requested UI commands: " << G4endl;
331  for (const std::string& command : runManagerMaster.G4Commands()) {
332  G4cout << " " << command << G4endl;
333  G4UImanager::GetUIpointer()->ApplyCommand(command);
334  }
335  }
336  G4StateManager::GetStateManager()->SetNewState(G4State_Init);
337 
338  physicsList->InitializeWorker();
339  m_tls->kernel->SetPhysics(physicsList);
340  m_tls->kernel->InitializePhysics();
341 
342  const bool kernelInit = m_tls->kernel->RunInitialization();
343  if (!kernelInit) {
344  throw edm::Exception(edm::errors::Configuration) << "RunManagerMTWorker: Geant4 kernel initialization failed";
345  }
346  //tell all interesting parties that we are beginning the job
347  BeginOfJob aBeginOfJob(&es);
348  m_tls->registry->beginOfJobSignal_(&aBeginOfJob);
349 
350  G4int sv = m_p.getUntrackedParameter<int>("SteppingVerbosity", 0);
351  G4double elim = m_p.getUntrackedParameter<double>("StepVerboseThreshold", 0.1) * CLHEP::GeV;
352  std::vector<int> ve = m_p.getUntrackedParameter<std::vector<int> >("VerboseEvents");
353  std::vector<int> vn = m_p.getUntrackedParameter<std::vector<int> >("VertexNumber");
354  std::vector<int> vt = m_p.getUntrackedParameter<std::vector<int> >("VerboseTracks");
355 
356  if (sv > 0) {
357  m_sVerbose.reset(new CMSSteppingVerbose(sv, elim, ve, vn, vt));
358  }
360 
361  edm::LogVerbatim("SimG4CoreApplication") << "RunManagerMTWorker::initializeThread done for the thread " << thisID;
362 
363  G4StateManager::GetStateManager()->SetNewState(G4State_Idle);
364 }
const SensitiveDetectorCatalog & catalog() const
Definition: RunManagerMT.h:77
T getUntrackedParameter(std::string const &, T const &) const
const double GeV
Definition: MathUtil.h:16
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
std::unique_ptr< G4RunManagerKernel > kernel
std::unique_ptr< SimActivityRegistry > registry
const DDDWorld & world() const
Definition: RunManagerMT.h:75
std::pair< std::vector< SensitiveTkDetector * >, std::vector< SensitiveCaloDetector * > > create(const edm::EventSetup &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *, SimActivityRegistry &reg) const
Definition: AttachSD.cc:15
std::unique_ptr< SimTrackManager > trackManager
std::unique_ptr< CustomUIsession > UIsession
static thread_local bool dumpMF
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > sensCaloDets
G4VPhysicalVolume * GetWorldVolume() const
Definition: DDDWorld.h:24
static std::once_flag applyOnce
PhysicsList * physicsListForWorker() const
Definition: RunManagerMT.h:84
edm::ParameterSet m_pField
list command
Definition: mps_check.py:25
const std::vector< std::string > & G4Commands() const
Definition: RunManagerMT.h:79
edm::ParameterSet m_pCustomUIsession
T get() const
Definition: EventSetup.h:73
edm::ParameterSet m_p
T const * product() const
Definition: ESHandle.h:86
void DumpMagneticField(const G4Field *, const std::string &) const
void RunManagerMTWorker::initializeTLS ( )
private

Definition at line 217 of file RunManagerMTWorker.cc.

References edm::errors::Configuration, 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().

217  {
218  if (m_tls) {
219  return;
220  }
221 
222  m_tls = new TLSData();
223  m_tls->registry.reset(new SimActivityRegistry());
224 
225  edm::Service<SimActivityRegistry> otherRegistry;
226  //Look for an outside SimActivityRegistry
227  // this is used by the visualization code
228  int thisID = getThreadIndex();
229  if (otherRegistry) {
230  m_tls->registry->connect(*otherRegistry);
231  if (thisID > 0) {
233  << "SimActivityRegistry service (i.e. visualization) is not supported for more than 1 thread. "
234  << " \n If this use case is needed, RunManagerMTWorker has to be updated.";
235  }
236  }
237  if (m_hasWatchers) {
239  }
240 }
std::vector< std::shared_ptr< SimWatcher > > watchers
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:88
std::unique_ptr< SimActivityRegistry > registry
static thread_local TLSData * m_tls
std::vector< std::shared_ptr< SimProducer > > producers
edm::ParameterSet m_p
void RunManagerMTWorker::initializeUserActions ( )
private

Definition at line 366 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().

366  {
367  m_tls->runInterface.reset(new SimRunInterface(this, false));
368  m_tls->userRunAction.reset(new RunAction(m_pRunAction, m_tls->runInterface.get(), false));
369  m_tls->userRunAction->SetMaster(false);
370  Connect(m_tls->userRunAction.get());
371 
372  G4EventManager* eventManager = m_tls->kernel->GetEventManager();
373  eventManager->SetVerboseLevel(m_EvtMgrVerbosity);
374 
375  EventAction* userEventAction =
377  Connect(userEventAction);
378  eventManager->SetUserAction(userEventAction);
379 
380  TrackingAction* userTrackingAction = new TrackingAction(userEventAction, m_pTrackingAction, m_sVerbose.get());
381  Connect(userTrackingAction);
382  eventManager->SetUserAction(userTrackingAction);
383 
384  SteppingAction* userSteppingAction =
385  new SteppingAction(userEventAction, m_pSteppingAction, m_sVerbose.get(), m_hasWatchers);
386  Connect(userSteppingAction);
387  eventManager->SetUserAction(userSteppingAction);
388 
389  eventManager->SetUserAction(new StackingAction(userTrackingAction, m_pStackingAction, m_sVerbose.get()));
390 }
edm::ParameterSet m_pSteppingAction
std::unique_ptr< SimRunInterface > runInterface
std::unique_ptr< CMSSteppingVerbose > m_sVerbose
std::unique_ptr< G4RunManagerKernel > kernel
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 *)
std::unique_ptr< G4SimEvent > RunManagerMTWorker::produce ( const edm::Event inpevt,
const edm::EventSetup es,
RunManagerMT runManagerMaster 
)

Definition at line 454 of file RunManagerMTWorker.cc.

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

456  {
457  // The initialization and begin/end run is a bit convoluted due to
458  // - Geant4 deals per-thread
459  // - OscarMTProducer deals per-stream
460  // and framework/TBB is free to schedule work in streams to the
461  // threads as it likes.
462  //
463  // We have to do the per-thread initialization, and per-thread
464  // per-run initialization here by ourselves.
465 
466  if (!(m_tls && m_tls->threadInitialized)) {
467  LogDebug("SimG4CoreApplication") << "RunManagerMTWorker::produce(): stream " << inpevt.streamID() << " thread "
468  << getThreadIndex() << " initializing";
469  initializeThread(runManagerMaster, es);
470  m_tls->threadInitialized = true;
471  }
472  // Initialize run
473  if (inpevt.id().run() != m_tls->currentRunNumber) {
474  if (m_tls->currentRunNumber != 0 && !m_tls->runTerminated) {
475  // If previous run in this thread was not terminated via endRun() call, terminate it now
476  terminateRun();
477  }
478  initializeRun();
479  m_tls->currentRunNumber = inpevt.id().run();
480  }
481  m_tls->runInterface->setRunManagerMTWorker(this); // For UserActions
482 
483  m_tls->currentEvent.reset(generateEvent(inpevt));
484 
485  auto simEvent = std::make_unique<G4SimEvent>();
486  m_simEvent = simEvent.get();
487  m_simEvent->hepEvent(m_generator.genEvent());
488  m_simEvent->weight(m_generator.eventWeight());
489  if (m_generator.genVertex() != nullptr) {
490  auto genVertex = m_generator.genVertex();
491  m_simEvent->collisionPoint(math::XYZTLorentzVectorD(genVertex->x() / CLHEP::cm,
492  genVertex->y() / CLHEP::cm,
493  genVertex->z() / CLHEP::cm,
494  genVertex->t() / CLHEP::second));
495  }
496  if (m_tls->currentEvent->GetNumberOfPrimaryVertex() == 0) {
497  std::stringstream ss;
498  ss << "RunManagerMTWorker::produce(): event " << inpevt.id().event() << " with no G4PrimaryVertices \n";
499  throw SimG4Exception(ss.str());
500 
501  } else {
502  if (!m_tls->kernel) {
503  std::stringstream ss;
504  ss << " RunManagerMT::produce(): "
505  << " no G4WorkerRunManagerKernel yet for thread index" << getThreadIndex() << ", id " << std::hex
506  << std::this_thread::get_id() << " \n";
507  throw SimG4Exception(ss.str());
508  }
509 
510  edm::LogVerbatim("SimG4CoreApplication")
511  << " RunManagerMTWorker::produce: start Event " << inpevt.id().event() << " stream id " << inpevt.streamID()
512  << " thread index " << getThreadIndex() << " of weight " << m_simEvent->weight() << " with "
513  << m_simEvent->nTracks() << " tracks and " << m_simEvent->nVertices() << " vertices, generated by "
514  << m_simEvent->nGenParts() << " particles ";
515 
516  m_tls->kernel->GetEventManager()->ProcessOneEvent(m_tls->currentEvent.get());
517 
518  edm::LogVerbatim("SimG4CoreApplication") << " RunManagerMTWorker::produce: ended Event " << inpevt.id().event();
519  }
520 
521  //remove memory only needed during event processing
522  m_tls->currentEvent.reset();
523 
524  for (auto& sd : m_tls->sensCaloDets) {
525  sd->reset();
526  }
527 
528  m_simEvent = nullptr;
529  return simEvent;
530 }
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:38
EventNumber_t event() const
Definition: EventID.h:40
virtual const math::XYZTLorentzVector * genVertex() const
Definition: Generator.h:31
std::unique_ptr< G4Event > currentEvent
virtual const double eventWeight() const
Definition: Generator.h:32
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:30
std::unique_ptr< SimRunInterface > runInterface
std::unique_ptr< G4RunManagerKernel > kernel
U second(std::pair< T, U > const &p)
G4SimEvent * simEvent()
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > sensCaloDets
void initializeThread(RunManagerMT &runManagerMaster, const edm::EventSetup &es)
void hepEvent(const HepMC::GenEvent *r)
Definition: G4SimEvent.h:23
double sd
G4Event * generateEvent(const edm::Event &inpevt)
edm::EventID id() const
Definition: EventBase.h:59
StreamID streamID() const
Definition: Event.h:96
std::vector< std::shared_ptr< SimProducer > > & RunManagerMTWorker::producers ( )

Definition at line 423 of file RunManagerMTWorker.cc.

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

423  {
424  initializeTLS();
425  return m_tls->producers;
426 }
static thread_local TLSData * m_tls
std::vector< std::shared_ptr< SimProducer > > producers
void RunManagerMTWorker::resetGenParticleId ( const edm::Event inpevt)
private

Definition at line 585 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().

585  {
587  inpevt.getByToken(m_theLHCTlinkToken, theLHCTlink);
588  if (theLHCTlink.isValid()) {
589  m_tls->trackManager->setLHCTransportLink(theLHCTlink.product());
590  }
591 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
std::unique_ptr< SimTrackManager > trackManager
static thread_local TLSData * m_tls
bool isValid() const
Definition: HandleBase.h:70
T const * product() const
Definition: Handle.h:69
edm::EDGetTokenT< edm::LHCTransportLinkContainer > m_theLHCTlinkToken
void RunManagerMTWorker::resetTLS ( )
staticprivate

Definition at line 189 of file RunManagerMTWorker.cc.

References KineDebug3::count(), m_tls, edm::make_functor_task(), alignCSCRings::s, and TrackValidation_cff::task.

Referenced by ~RunManagerMTWorker().

189  {
190  delete m_tls;
191  m_tls = nullptr;
192 
193  if (active_tlsdata != 0 and not tls_shutdown_timeout) {
194  ++n_tls_shutdown_task;
195  //need to run tasks on each thread which has set the tls
196  auto task = edm::make_functor_task(tbb::task::allocate_root(), []() { resetTLS(); });
197  tbb::task::enqueue(*task);
198  timespec s;
199  s.tv_sec = 0;
200  s.tv_nsec = 10000;
201  //we do not want this thread to be used for a new task since it
202  // has already cleared its structures. In order to fill all TBB
203  // threads we wait for all TLSes to clear
204  int count = 0;
205  while (active_tlsdata.load() != 0 and ++count < 1000) {
206  nanosleep(&s, nullptr);
207  }
208  if (count >= 1000) {
209  tls_shutdown_timeout = true;
210  }
211  }
212  --n_tls_shutdown_task;
213 }
FunctorTask< F > * make_functor_task(ALLOC &&iAlloc, F f)
Definition: FunctorTask.h:47
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > & RunManagerMTWorker::sensCaloDetectors ( )

Definition at line 419 of file RunManagerMTWorker.cc.

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

419  {
420  initializeTLS();
421  return m_tls->sensCaloDets;
422 }
static thread_local TLSData * m_tls
std::vector< SensitiveCaloDetector * > sensCaloDets
std::vector< SensitiveTkDetector * > & RunManagerMTWorker::sensTkDetectors ( )

Definition at line 415 of file RunManagerMTWorker.cc.

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

415  {
416  initializeTLS();
417  return m_tls->sensTkDets;
418 }
std::vector< SensitiveTkDetector * > sensTkDets
static thread_local TLSData * m_tls
G4SimEvent* RunManagerMTWorker::simEvent ( )
inline

Definition at line 55 of file RunManagerMTWorker.h.

References HLT_2018_cff::producers, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by produce(), and SimRunInterface::simEvent().

55 { return m_simEvent; }
void RunManagerMTWorker::terminateRun ( )
private

Definition at line 436 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().

436  {
437  if (!m_tls || m_tls->runTerminated) {
438  return;
439  }
440  if (m_tls->userRunAction) {
441  m_tls->userRunAction->EndOfRunAction(m_tls->currentRun);
442  m_tls->userRunAction.reset();
443  }
444  m_tls->currentEvent.reset();
445  m_simEvent = nullptr;
446 
447  if (m_tls->kernel) {
448  m_tls->kernel->RunTermination();
449  }
450 
451  m_tls->runTerminated = true;
452 }
std::unique_ptr< G4Event > currentEvent
std::unique_ptr< G4RunManagerKernel > kernel
static thread_local TLSData * m_tls
std::unique_ptr< RunAction > userRunAction

Member Data Documentation

thread_local bool RunManagerMTWorker::dumpMF = false
staticprivate

Definition at line 102 of file RunManagerMTWorker.h.

Referenced by initializeThread().

int RunManagerMTWorker::m_EvtMgrVerbosity
private

Definition at line 89 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

Generator RunManagerMTWorker::m_generator
private

Definition at line 82 of file RunManagerMTWorker.h.

Referenced by generateEvent(), and produce().

bool RunManagerMTWorker::m_hasWatchers
private

Definition at line 88 of file RunManagerMTWorker.h.

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

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

Definition at line 83 of file RunManagerMTWorker.h.

Referenced by generateEvent().

bool RunManagerMTWorker::m_nonBeam
private

Definition at line 86 of file RunManagerMTWorker.h.

Referenced by generateEvent().

edm::ParameterSet RunManagerMTWorker::m_p
private

Definition at line 98 of file RunManagerMTWorker.h.

Referenced by initializeThread(), and initializeTLS().

edm::ParameterSet RunManagerMTWorker::m_pCustomUIsession
private

Definition at line 97 of file RunManagerMTWorker.h.

Referenced by initializeThread().

edm::ParameterSet RunManagerMTWorker::m_pEventAction
private

Definition at line 93 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pField
private

Definition at line 91 of file RunManagerMTWorker.h.

Referenced by initializeThread().

edm::ParameterSet RunManagerMTWorker::m_pRunAction
private

Definition at line 92 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pStackingAction
private

Definition at line 94 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pSteppingAction
private

Definition at line 96 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

edm::ParameterSet RunManagerMTWorker::m_pTrackingAction
private

Definition at line 95 of file RunManagerMTWorker.h.

Referenced by initializeUserActions().

bool RunManagerMTWorker::m_pUseMagneticField
private

Definition at line 87 of file RunManagerMTWorker.h.

Referenced by initializeThread().

G4SimEvent* RunManagerMTWorker::m_simEvent
private

Definition at line 104 of file RunManagerMTWorker.h.

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

std::unique_ptr<CMSSteppingVerbose> RunManagerMTWorker::m_sVerbose
private

Definition at line 105 of file RunManagerMTWorker.h.

Referenced by initializeThread(), and initializeUserActions().

edm::EDGetTokenT<edm::LHCTransportLinkContainer> RunManagerMTWorker::m_theLHCTlinkToken
private

Definition at line 84 of file RunManagerMTWorker.h.

Referenced by resetGenParticleId().

thread_local RunManagerMTWorker::TLSData * RunManagerMTWorker::m_tls { 0 }
staticprivate