CMS 3D CMS Logo

RunManagerMT.cc
Go to the documentation of this file.
10 
14 
16 
23 
25 
31 
33 
35 
36 #include "HepPDT/ParticleDataTable.hh"
37 
38 #include "G4GeometryManager.hh"
39 #include "G4StateManager.hh"
40 #include "G4ApplicationState.hh"
41 #include "G4MTRunManagerKernel.hh"
42 #include "G4UImanager.hh"
43 
44 #include "G4EventManager.hh"
45 #include "G4Run.hh"
46 #include "G4Event.hh"
47 #include "G4TransportationManager.hh"
48 #include "G4ParticleTable.hh"
49 #include "G4Field.hh"
50 #include "G4FieldManager.hh"
51 #include "G4CascadeInterface.hh"
52 
53 #include "G4GDMLParser.hh"
54 #include "G4SystemOfUnits.hh"
55 
56 #include <iostream>
57 #include <sstream>
58 #include <fstream>
59 #include <memory>
60 
62 
64  m_managerInitialized(false),
65  m_runTerminated(false),
66  m_pUseMagneticField(p.getParameter<bool>("UseMagneticField")),
67  m_PhysicsTablesDir(p.getParameter<std::string>("PhysicsTablesDirectory")),
68  m_StorePhysicsTables(p.getParameter<bool>("StorePhysicsTables")),
69  m_RestorePhysicsTables(p.getParameter<bool>("RestorePhysicsTables")),
70  m_pField(p.getParameter<edm::ParameterSet>("MagneticField")),
71  m_pPhysics(p.getParameter<edm::ParameterSet>("Physics")),
72  m_pRunAction(p.getParameter<edm::ParameterSet>("RunAction")),
73  m_g4overlap(p.getParameter<edm::ParameterSet>("G4CheckOverlap")),
74  m_G4Commands(p.getParameter<std::vector<std::string> >("G4Commands")),
75  m_p(p)
76 {
77  m_currentRun = nullptr;
78  m_UIsession.reset(new CustomUIsession());
79  m_physicsList.reset(nullptr);
80  m_world.reset(nullptr);
81 
82  m_runInterface.reset(nullptr);
83  m_prodCuts.reset(nullptr);
84  m_chordFinderSetter.reset(nullptr);
85  m_userRunAction = nullptr;
86  m_currentRun = nullptr;
87 
88  m_kernel = new G4MTRunManagerKernel();
89  G4StateManager::GetStateManager()->SetExceptionHandler(new ExceptionHandler());
90 
91  m_check = p.getUntrackedParameter<bool>("CheckOverlap",false);
92  m_WriteFile = p.getUntrackedParameter<std::string>("FileNameGDML","");
93  m_FieldFile = p.getUntrackedParameter<std::string>("FileNameField","");
94  m_RegionFile = p.getUntrackedParameter<std::string>("FileNameRegions","");
95 }
96 
98 {
99  if(!m_runTerminated) { terminateRun(); }
100  G4StateManager::GetStateManager()->SetNewState(G4State_Quit);
101  G4GeometryManager::GetInstance()->OpenGeometry();
102 }
103 
104 void RunManagerMT::initG4(const DDCompactView *pDD, const MagneticField *pMF,
105  const HepPDT::ParticleDataTable *fPDGTable)
106 {
107  if (m_managerInitialized) return;
108 
109  edm::LogInfo("SimG4CoreApplication")
110  << "RunManagerMT: start initialisation of geometry";
111 
112  // DDDWorld: get the DDCV from the ES and use it to build the World
114  m_world.reset(new DDDWorld(pDD, map_, m_catalog, false));
116 
117  // setup the magnetic field
118  edm::LogInfo("SimG4CoreApplication")
119  << "RunManagerMT: start initialisation of magnetic field";
120 
121  if (m_pUseMagneticField && "" != m_FieldFile)
122  {
123  const GlobalPoint g(0.,0.,0.);
124  sim::FieldBuilder fieldBuilder(pMF, m_pField);
125  CMSFieldManager* fieldManager = new CMSFieldManager();
126  G4TransportationManager * tM =
127  G4TransportationManager::GetTransportationManager();
128  tM->SetFieldManager(fieldManager);
129  fieldBuilder.build( fieldManager, tM->GetPropagatorInField());
130  DumpMagneticField(tM->GetFieldManager()->GetDetectorField());
131  }
132 
133  // Create physics list
134  edm::LogInfo("SimG4CoreApplication")
135  << "RunManagerMT: create PhysicsList";
136 
137  std::unique_ptr<PhysicsListMakerBase>
138  physicsMaker(PhysicsListFactory::get()->create(
139  m_pPhysics.getParameter<std::string> ("type")));
140  if (physicsMaker.get()==nullptr) {
142  << "Unable to find the Physics list requested";
143  }
144  m_physicsList =
145  physicsMaker->make(map_,fPDGTable,m_chordFinderSetter.get(),m_pPhysics,m_registry);
146 
147  PhysicsList* phys = m_physicsList.get();
148  if (phys==nullptr) {
150  "Physics list construction failed!");
151  }
152 
153  // adding GFlash, Russian Roulette for eletrons and gamma,
154  // step limiters on top of any Physics Lists
155  phys->RegisterPhysics(new ParametrisedEMPhysics("EMoptions",m_pPhysics));
156 
157  m_physicsList->ResetStoredInAscii();
159  m_physicsList->SetPhysicsTableRetrieved(m_PhysicsTablesDir);
160  }
161  edm::LogInfo("SimG4CoreApplication")
162  << "RunManagerMT: start initialisation of PhysicsList for master";
163 
164  int verb = std::max(m_pPhysics.getUntrackedParameter<int>("Verbosity",0),
165  m_p.getParameter<int>("SteppingVerbosity"));
166  m_kernel->SetVerboseLevel(verb);
167 
168  m_physicsList->SetDefaultCutValue(m_pPhysics.getParameter<double>("DefaultCutValue")*CLHEP::cm);
169  m_physicsList->SetCutsWithDefault();
170 
171  if(m_pPhysics.getParameter<bool>("CutsPerRegion")) {
172  m_prodCuts.reset(new DDG4ProductionCuts(map_, verb, m_pPhysics));
173  m_prodCuts->update();
174  }
175 
176  m_kernel->SetPhysics(phys);
177  m_kernel->InitializePhysics();
178  m_kernel->SetUpDecayChannels();
179 
180  // The following line was with the following comment in
181  // G4MTRunManager::InitializePhysics() in 10.00.p01; in practice
182  // needed to initialize certain singletons during the master thread
183  // initialization in order to avoid races later...
184  //
185  //BERTINI, this is needed to create pseudo-particles, to be removed
186  G4CascadeInterface::Initialize();
187 
188  if (m_kernel->RunInitialization()) { m_managerInitialized = true; }
189  else {
191  "G4RunManagerKernel initialization failed!");
192  }
193 
194  if (m_StorePhysicsTables) {
195  std::ostringstream dir;
196  dir << m_PhysicsTablesDir << '\0';
197  std::string cmd = std::string("/control/shell mkdir -p ")+m_PhysicsTablesDir;
198  if (!std::ifstream(dir.str().c_str(), std::ios::in))
199  G4UImanager::GetUIpointer()->ApplyCommand(cmd);
200  m_physicsList->StorePhysicsTable(m_PhysicsTablesDir);
201  }
202 
204 
205  if(!m_G4Commands.empty()) {
206  G4cout << "RunManagerMT: Requested UI commands: " << G4endl;
207  for (unsigned it=0; it<m_G4Commands.size(); ++it) {
208  G4cout << " " << m_G4Commands[it] << G4endl;
209  G4UImanager::GetUIpointer()->ApplyCommand(m_G4Commands[it]);
210  }
211  }
212 
213  if(verb > 1) { m_physicsList->DumpCutValuesTable(); }
214 
215  // geometry dump
216  if("" != m_WriteFile) {
217  G4GDMLParser gdml;
218  gdml.SetRegionExport(true);
219  gdml.SetEnergyCutsExport(true);
220  gdml.Write(m_WriteFile, m_world->GetWorldVolume(), true);
221  }
222 
223  // G4Region dump
224  if("" != m_RegionFile) {
225  G4RegionReporter rrep;
227  }
228 
229  // Intersection check
231 
232  // If the Geant4 particle table is needed, decomment the lines below
233  //
234  //G4ParticleTable::GetParticleTable()->DumpTable("ALL");
235  //
236  G4StateManager::GetStateManager()->SetNewState(G4State_GeomClosed);
237  m_currentRun = new G4Run();
239 }
240 
242  m_runInterface.reset(new SimRunInterface(this, true));
245 }
246 
248 {
251 }
252 
254 {
255  G4StateManager::GetStateManager()->SetNewState(G4State_Quit);
256  if(!m_runTerminated) { terminateRun(); }
257 }
258 
260  if(m_userRunAction) {
262  delete m_userRunAction;
263  m_userRunAction = nullptr;
264  }
265  if(m_kernel && !m_runTerminated) {
266  m_kernel->RunTermination();
267  }
268  m_runTerminated = true;
269 }
270 
271 void RunManagerMT::DumpMagneticField(const G4Field* field) const
272 {
273  std::ofstream fout(m_FieldFile.c_str(), std::ios::out);
274  if(fout.fail()){
275  edm::LogWarning("SimG4CoreApplication")
276  << " RunManager WARNING : "
277  << "error opening file <" << m_FieldFile << "> for magnetic field";
278  } else {
279  double rmax = 9000*mm;
280  double zmax = 16000*mm;
281 
282  double dr = 5*cm;
283  double dz = 20*cm;
284 
285  int nr = (int)(rmax/dr);
286  int nz = 2*(int)(zmax/dz);
287 
288  double r = 0.0;
289  double z0 = -zmax;
290  double z;
291 
292  double phi = 0.0;
293  double cosf = cos(phi);
294  double sinf = sin(phi);
295 
296  double point[4] = {0.0,0.0,0.0,0.0};
297  double bfield[3] = {0.0,0.0,0.0};
298 
299  fout << std::setprecision(6);
300  for(int i=0; i<=nr; ++i) {
301  z = z0;
302  for(int j=0; j<=nz; ++j) {
303  point[0] = r*cosf;
304  point[1] = r*sinf;
305  point[2] = z;
306  field->GetFieldValue(point, bfield);
307  fout << "R(mm)= " << r/mm << " phi(deg)= " << phi/degree
308  << " Z(mm)= " << z/mm << " Bz(tesla)= " << bfield[2]/tesla
309  << " Br(tesla)= " << (bfield[0]*cosf + bfield[1]*sinf)/tesla
310  << " Bphi(tesla)= " << (bfield[0]*sinf - bfield[1]*cosf)/tesla
311  << G4endl;
312  z += dz;
313  }
314  r += dr;
315  }
316 
317  fout.close();
318  }
319 }
void Connect(RunAction *)
const std::string m_PhysicsTablesDir
Definition: RunManagerMT.h:109
bool m_managerInitialized
Definition: RunManagerMT.h:102
T getParameter(std::string const &) const
Map map_
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< DDG4ProductionCuts > m_prodCuts
Definition: RunManagerMT.h:121
void BeginOfRunAction(const G4Run *aRun) override
Definition: RunAction.cc:22
G4MTRunManagerKernel * m_kernel
Definition: RunManagerMT.h:98
SensitiveDetectorCatalog m_catalog
Definition: RunManagerMT.h:123
edm::ParameterSet m_pRunAction
Definition: RunManagerMT.h:115
def create(alignables, pedeDump, additionalData, outputFile, config)
HepPDT::ParticleDataTable ParticleDataTable
void initG4(const DDCompactView *pDD, const MagneticField *pMF, const HepPDT::ParticleDataTable *fPDGTable)
void terminateRun()
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
SimActivityRegistry::EndOfRunSignal m_endOfRunSignal
Definition: RunAction.h:26
bool m_runTerminated
Definition: RunManagerMT.h:103
BeginOfRunSignal beginOfRunSignal_
std::vector< std::string > m_G4Commands
Definition: RunManagerMT.h:117
std::unique_ptr< CustomUIsession > m_UIsession
Definition: RunManagerMT.h:100
G4Run * m_currentRun
Definition: RunManagerMT.h:106
std::string m_RegionFile
Definition: RunManagerMT.h:129
void initializeUserActions()
type of data representation of DDCompactView
Definition: DDCompactView.h:90
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::string m_WriteFile
Definition: RunManagerMT.h:128
RunManagerMT(edm::ParameterSet const &p)
Definition: RunManagerMT.cc:63
RunAction
list of unwanted particles (gluons and quarks)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
bool m_pUseMagneticField
Definition: RunManagerMT.h:104
edm::ParameterSet m_p
Definition: RunManagerMT.h:118
EndOfRunSignal endOfRunSignal_
void DumpMagneticField(const G4Field *) const
void connect(Observer< const T * > *iObs)
does not take ownership of memory
Definition: Signaler.h:59
void build(CMSFieldManager *fM, G4PropagatorInField *fP)
Definition: FieldBuilder.cc:36
bool m_StorePhysicsTables
Definition: RunManagerMT.h:110
std::unique_ptr< PhysicsList > m_physicsList
Definition: RunManagerMT.h:101
std::string m_FieldFile
Definition: RunManagerMT.h:127
edm::ParameterSet m_pField
Definition: RunManagerMT.h:113
std::unique_ptr< DDDWorld > m_world
Definition: RunManagerMT.h:120
edm::ParameterSet m_pPhysics
Definition: RunManagerMT.h:114
DDDWorldSignal dddWorldSignal_
bool m_RestorePhysicsTables
Definition: RunManagerMT.h:111
std::unique_ptr< sim::ChordFinderSetter > m_chordFinderSetter
Definition: RunManagerMT.h:125
void ReportRegions(const std::string &ss)
SimActivityRegistry::BeginOfRunSignal m_beginOfRunSignal
Definition: RunAction.h:25
HLT enums.
list cmd
Definition: mps_setup.py:236
std::unique_ptr< SimRunInterface > m_runInterface
Definition: RunManagerMT.h:107
edm::ParameterSet m_g4overlap
Definition: RunManagerMT.h:116
dbl *** dir
Definition: mlp_gen.cc:35
RunAction * m_userRunAction
Definition: RunManagerMT.h:105
def check(config)
Definition: trackerTree.py:14
T get(const Candidate &c)
Definition: component.h:55
void EndOfRunAction(const G4Run *aRun) override
Definition: RunAction.cc:40
*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
SimActivityRegistry m_registry
Definition: RunManagerMT.h:122