ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4UserWorkerThreadInitialization.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4UserWorkerThreadInitialization.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
27 #include "G4WorkerThread.hh"
28 #include "G4WorkerRunManager.hh"
29 #include "G4MTRunManagerKernel.hh"
31 #include "G4UImanager.hh"
32 #include "G4VUserPhysicsList.hh"
33 #include "G4AutoLock.hh"
34 #include <sstream>
35 
36 //Will need this for TPMalloc
37 //#ifdef G4MULTITHREADED
38 //#define TPMALLOCDEFINESTUB
39 //#include "tpmalloc/tpmallocstub.h"
40 //#endif
41 
42 #ifdef G4MULTITHREADED
44 {
45  //Note: this method is called by G4MTRunManager, here we are still sequential
46  //Create a new thread/worker structure
47  G4Thread* worker = new G4Thread;
49  return worker;
50 }
51 #else
53 {
54  return new G4Thread;
55 }
56 #endif
57 
58 //Avoid compilation warning in sequential
59 #ifdef G4MULTITHREADED
61 {
62  G4THREADJOIN(*aThread);
63 }
64 #else
66 {
67 }
68 #endif
69 
71 {;}
72 
74 {;}
75 
76 namespace {
77  G4Mutex rngCreateMutex = G4MUTEX_INITIALIZER;
78 }
79 
80 #include "globals.hh"
82 {
83  G4AutoLock l(&rngCreateMutex);
84  //No default available, let's create the instance of random stuff
85  //A Call to this just forces the creation to defaults
86  G4Random::getTheEngine();
87  //Poor man's solution to check which RNG Engine is used in master thread
88  CLHEP::HepRandomEngine* retRNG= 0;
89 
90  // Need to make these calls thread safe
91  if ( dynamic_cast<const CLHEP::HepJamesRandom*>(aNewRNG) ) {
92  retRNG= new CLHEP::HepJamesRandom;
93  }
94  if ( dynamic_cast<const CLHEP::MixMaxRng*>(aNewRNG) ) {
95  retRNG= new CLHEP::MixMaxRng;
96  }
97  if ( dynamic_cast<const CLHEP::RanecuEngine*>(aNewRNG) ) {
98  retRNG= new CLHEP::RanecuEngine;
99  }
100  if ( dynamic_cast<const CLHEP::Ranlux64Engine*>(aNewRNG) ) {
101  const CLHEP::Ranlux64Engine* theRNG = dynamic_cast<const CLHEP::Ranlux64Engine*>(aNewRNG);
102  retRNG= new CLHEP::Ranlux64Engine(123,theRNG->getLuxury());
103  }
104  if ( dynamic_cast<const CLHEP::MTwistEngine*>(aNewRNG) ) {
105  retRNG= new CLHEP::MTwistEngine;
106  }
107  if ( dynamic_cast<const CLHEP::DualRand*>(aNewRNG) ) {
108  retRNG= new CLHEP::DualRand;
109  }
110  if ( dynamic_cast<const CLHEP::RanluxEngine*>(aNewRNG) ) {
111  const CLHEP::RanluxEngine* theRNG = dynamic_cast<const CLHEP::RanluxEngine*>(aNewRNG);
112  retRNG= new CLHEP::RanluxEngine(123,theRNG->getLuxury());
113  }
114  if ( dynamic_cast<const CLHEP::RanshiEngine*>(aNewRNG) ) {
115  retRNG= new CLHEP::RanshiEngine;
116  }
117 
118  if( retRNG != 0 ) {
119  G4Random::setTheEngine( retRNG );
120  }
121  else
122  {
123  // Does a new method, such as aNewRng->newEngine() exist to clone it ?
125  msg<< " Unknown type of RNG Engine - " << G4endl
126  << " Can cope only with HepJamesRandom, MixMaxRng, Ranecu, Ranlux64,"
127  << " MTwistEngine, DualRand, Ranlux or Ranshi."
128  << G4endl
129  << " Cannot clone this type of RNG engine, as required for this thread" << G4endl
130  << " Aborting " << G4endl;
131  G4Exception("G4UserWorkerInitializition::SetupRNGEngine()",
132  "Run0122",FatalException,msg);
133  }
134 }
135 
137 {
138  return new G4WorkerRunManager();
139 }
140