35 #include "G4RunManager.hh" 36 #include "G4UImanager.hh" 37 #include "G4UIterminal.hh" 38 #include "G4VisExecutive.hh" 39 #include "G4VModularPhysicsList.hh" 40 #include "G4PropagatorInField.hh" 41 #include "G4TransportationManager.hh" 46 #include <QApplication> 47 #include <QSplashScreen> 96 int get_pid(){
return 0;}
103 return new QCoreApplication(argc, argv);
104 return new QApplication(argc, argv);
108 int main(
int argc,
char **argv )
110 clock_t startTime = clock();
118 double use_gui = gemcOpt.
optMap[
"USE_GUI"].arg;
120 cout << endl <<
" > Initializing GEant4 MonteCarlo: " <<
GEMC_VERSION << endl << endl;
133 CLHEP::HepRandom::setTheEngine(
new CLHEP::MTwistEngine);
136 if(gemcOpt.
optMap[
"RANDOM"].args==
"TIME")
138 gemc_splash.
message(
" Initializing CLHEP Random Engine from local time " \
142 +
" and process id " \
144 seed = (G4int) ( (
double) time(NULL)- (double) clock()-getpid() );
148 seed = atoi(gemcOpt.
optMap[
"RANDOM"].args.c_str());
149 gemc_splash.
message(
" Initializing CLHEP Random Engine from user defined seed.");
152 CLHEP::HepRandom::setTheSeed(seed);
156 gemc_splash.
message(
" Instantiating Run Manager...");
157 G4RunManager *runManager =
new G4RunManager;
160 gemc_splash.
message(
" Instantiating Run Conditions...");
165 gemc_splash.
message(
" Registering Detectors Factories...");
169 map<string, detector> hallMap =
buildDetector(detectorFactoryMap, gemcOpt, runConds);
173 gemc_splash.
message(
" Initializing Material Factories..." );
176 map<string, G4Material*> mats =
buildMaterials(materialFactoriesMap, gemcOpt, runConds);
179 gemc_splash.
message(
" Initializing Mirrors Factories..." );
182 map<string, mirror*> mirs =
buildMirrors(mirrorFactoriesMap, gemcOpt, runConds);
186 gemc_splash.
message(
" Registering Parameters Factories...");
189 map<string, double> gParameters =
loadAllParameters(parameterFactoriesMap, gemcOpt, runConds);
193 gemc_splash.
message(
" Building gemc Process Hit Factory...");
194 map<string, HitProcess_Factory> hitProcessMap =
HitProcess_Map(gemcOpt.
optMap[
"HIT_PROCESS_LIST"].args);
197 gemc_splash.
message(
" Creating fields Map...");
199 map<string, gfield> fieldsMap =
loadAllFields(fieldFactoryMap, gemcOpt);
202 gemc_splash.
message(
" Building Detector Map...");
205 ExpHall->
mirs = &mirs;
206 ExpHall->
mats = &mats;
209 runManager->SetUserInitialization(ExpHall);
213 string phys_list = gemcOpt.
optMap[
"PHYSICS"].args ;
214 gemc_splash.
message(
" Initializing Physics List " + phys_list +
"...");
215 runManager->SetUserInitialization(
new PhysicsList(gemcOpt));
227 double max_step = gemcOpt.
optMap[
"MAX_FIELD_STEP"].arg;
229 G4TransportationManager::GetTransportationManager()->GetPropagatorInField()->SetLargestAcceptableStep(max_step);
233 gemc_splash.
message(
" Initializing User Actions...");
235 runManager->SetUserInitialization(gActions);
238 gemc_splash.
message(
" Initializing User Interface...");
239 G4UIsession *session = NULL;
242 G4VisManager *visManager = NULL;
248 visManager =
new G4VisExecutive(
"Quiet");
249 visManager->Initialize();
253 session =
new G4UIQt(1, argv);
259 gemc_splash.
message(
" Initializing Output Action...");
264 gemc_splash.
message(
" Initializing Run Manager...\n");
266 runManager->Initialize();
272 gemcOpt.
optMap[
"ACTIVEFIELDS"].args =
"";
275 gemcOpt.
optMap[
"ACTIVEFIELDS"].args = gemcOpt.
optMap[
"ACTIVEFIELDS"].args + *fit +
" ";
279 gemc_splash.
message(
" Writing simulation parameters in the output...");
282 map<string, string> sim_condition = gemcOpt.
getOptMap();
290 gemc_splash.
message(
" Creating gemc Banks Map...");
294 G4UImanager* UImanager = G4UImanager::GetUIpointer();
295 UImanager->SetCoutDestination(NULL);
299 if(outContainer.
outType !=
"no")
304 delete processOutputFactory;
316 map<string, sensitiveDetector*>::iterator it;
318 it->second->hitProcessMap = &hitProcessMap;
323 gemc_splash.
message(
" Executing initial directives...\n");
324 vector<string> init_commands =
init_dmesg(gemcOpt);
325 for(
unsigned int i=0; i<init_commands.size(); i++)
326 UImanager->ApplyCommand(init_commands[i].c_str());
327 string exec_macro =
"/control/execute " + gemcOpt.
optMap[
"EXEC_MACRO"].args;
329 clock_t start_events;
333 gemc_splash.
message(
"Starting GUI...");
334 qApp->processEvents();
344 gemc_splash.
splash->finish(&gemcW);
346 gemc_splash.
message(
" Executing initial visual directives...\n");
347 vector<string> init_vcommands =
init_dvmesg(gemcOpt, visManager);
348 for(
unsigned int i=0; i<init_vcommands.size(); i++)
350 gemc_splash.
message(
" Now executing: " + init_vcommands[i]);
352 UImanager->ApplyCommand(init_vcommands[i].c_str());
355 if(exec_macro !=
"/control/execute no") UImanager->ApplyCommand(exec_macro.c_str());
356 if(gemcOpt.
optMap[
"N"].arg>0)
359 sprintf(command,
"/run/beamOn %d", (
int) gemcOpt.
optMap[
"N"].arg);
360 UImanager->ApplyCommand(command);
363 start_events = clock();
368 if(session != NULL)
delete session;
373 if(exec_macro !=
"/control/execute no") UImanager->ApplyCommand(exec_macro.c_str());
374 start_events = clock();
375 if(gemcOpt.
optMap[
"N"].arg>0)
378 sprintf(command,
"/run/beamOn %d", (
int) gemcOpt.
optMap[
"N"].arg);
379 UImanager->ApplyCommand(command);
383 clock_t endTime = clock();
384 clock_t clockAllTaken = endTime - startTime;
385 clock_t clockEventTaken = endTime - start_events;
387 cout <<
" > Total gemc time: " << clockAllTaken / (double) CLOCKS_PER_SEC <<
" seconds. " 388 <<
" Events only time: " << clockEventTaken / (
double) CLOCKS_PER_SEC <<
" seconds. " << endl;
vector< string > init_dvmesg(goptions gemcOpt, G4VisManager *VM)
Initialization Routine for Visualization.
map< string, detector > buildDetector(map< string, detectorFactoryInMap > detectorFactoryMap, goptions go, runConditions rc)
map< string, parameterFactoryInMap > registerParameterFactories()
map< string, string > getOptMap()
Returns a map<string, string> with all options and values.
map< string, fieldFactoryInMap > registerFieldFactories()
map< string, string > getDetectorConditionsMap()
set< string > activeFields
map< string, gfield > loadAllFields(map< string, fieldFactoryInMap > fieldFactoryMap, goptions opts)
map< string, detector > * hallMap
vector< string > get_info(string input, string chars)
get information from strings such as "5*GeV, 2*deg, 10*deg", parses out strings in second argument ...
map< string, mirror * > buildMirrors(map< string, mirrorFactory > mirrorFactoryMap, goptions go, runConditions rc)
map< string, double > loadAllParameters(map< string, parameterFactoryInMap > parameterFactoryMap, goptions go, runConditions rc)
map< string, materialFactory > registerMaterialFactories()
map< string, mirrorFactory > registerMirrorFactories()
map< string, gfield > * fieldsMap
virtual void setGoptions()
Function to fill optMap.
double get_number(string v, int warn_no_unit)
Returns number with dimension from string, i.e. 100*cm.
int setOptMap(int argc, char **args)
Sets map from command line arguments.
map< string, G4Material * > * mats
map< string, string > getParametersMap(map< string, double > dataMap)
MPrimaryGeneratorAction * gen_action
Generator Action.
map< string, sensitiveDetector * > SeDe_Map
Sensitive detector Map.
string stringify(double x)
map< string, aopt > optMap
Options map.
map< string, gBank > * banksMap
Bank Map.
virtual void recordSimConditions(outputContainer *, map< string, string >)=0
QCoreApplication * createApplication(int &argc, char *argv[], double use_gui)
Main Program
Action initialization class.
map< string, gBank > read_banks(goptions gemcOpt, map< string, string > allSystems)
outputFactory * getOutputFactory(map< string, outputFactoryInMap > *outputFactoryMap, string outputType)
map< string, sensitiveDetector * > SeDe_Map
map< string, mirror * > * mirs
map< string, outputFactoryInMap > * outputFactoryMap
outputFactory map
map< string, HitProcess_Factory > * hitProcessMap
Hit Process Routine Factory Map.
MPrimaryGeneratorAction * genAction
void mergeMaps(map< string, string > &lhs, const map< string, string > &rhs)
map< string, HitProcess_Factory > HitProcess_Map(string experiments)
< flux hit process common to all
outputContainer * outContainer
outputContainer class - contains the output format.
const char * GEMC_VERSION
map< string, outputFactoryInMap > registerOutputFactories()
int main(int argc, char **argv)
map< string, string > get_systems()
map< string, detectorFactoryInMap > registerDetectorFactory()
map< string, G4Material * > buildMaterials(map< string, materialFactory > materialFactoryMap, goptions go, runConditions rc)
vector< string > init_dmesg(goptions gemcOpt)
General Initialization Routine.