CMS 3D CMS Logo

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