Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // G4RunMessenger implementation << 27 // 23 // 28 // Original author: M.Asai, 1997 << 24 // $Id: G4RunMessenger.cc,v 1.10 2001/11/23 16:20:30 maire Exp $ 29 // ------------------------------------------- << 25 // GEANT4 tag $Name: geant4-04-00 $ >> 26 // 30 27 31 #include "G4RunMessenger.hh" 28 #include "G4RunMessenger.hh" 32 << 33 #include "G4MTRunManager.hh" << 34 #include "G4SubEvtRunManager.hh" << 35 #include "G4ProductionCutsTable.hh" << 36 #include "G4RunManager.hh" 29 #include "G4RunManager.hh" 37 #include "G4Tokenizer.hh" << 30 #include "G4UIdirectory.hh" 38 #include "G4UIcmdWithABool.hh" << 31 #include "G4UIcmdWithoutParameter.hh" 39 #include "G4UIcmdWithAString.hh" 32 #include "G4UIcmdWithAString.hh" 40 #include "G4UIcmdWithAnInteger.hh" 33 #include "G4UIcmdWithAnInteger.hh" 41 #include "G4UIcmdWithoutParameter.hh" << 34 #include "G4UIcmdWithABool.hh" 42 #include "G4UIcommand.hh" 35 #include "G4UIcommand.hh" 43 #include "G4UIdirectory.hh" << 44 #include "G4UImanager.hh" << 45 #include "G4UIparameter.hh" 36 #include "G4UIparameter.hh" >> 37 #include "G4UImanager.hh" 46 #include "G4ios.hh" 38 #include "G4ios.hh" 47 #include "Randomize.hh" << 39 #include "g4std/strstream" 48 << 49 #include <sstream> << 50 40 51 G4RunMessenger::G4RunMessenger(G4RunManager* r << 41 G4RunMessenger::G4RunMessenger(G4RunManager * runMgr) >> 42 :runManager(runMgr) 52 { 43 { 53 runDirectory = new G4UIdirectory("/run/"); 44 runDirectory = new G4UIdirectory("/run/"); 54 runDirectory->SetGuidance("Run control comma 45 runDirectory->SetGuidance("Run control commands."); 55 46 56 initCmd = new G4UIcmdWithoutParameter("/run/ << 47 initCmd = new G4UIcmdWithoutParameter("/run/initialize",this); 57 initCmd->SetGuidance("Initialize G4 kernel." 48 initCmd->SetGuidance("Initialize G4 kernel."); 58 initCmd->AvailableForStates(G4State_PreInit, << 49 initCmd->AvailableForStates(PreInit,Idle), 59 50 60 beamOnCmd = new G4UIcommand("/run/beamOn", << 51 beamOnCmd = new G4UIcommand("/run/beamOn",this); 61 beamOnCmd->SetGuidance("Start a Run."); 52 beamOnCmd->SetGuidance("Start a Run."); 62 beamOnCmd->SetGuidance("If G4 kernel is not 53 beamOnCmd->SetGuidance("If G4 kernel is not initialized, it will be initialized."); 63 beamOnCmd->SetGuidance("Default number of ev 54 beamOnCmd->SetGuidance("Default number of events to be processed is 1."); 64 beamOnCmd->SetGuidance("The second and third 55 beamOnCmd->SetGuidance("The second and third arguments can be used for"); 65 beamOnCmd->SetGuidance("executing a macro fi 56 beamOnCmd->SetGuidance("executing a macro file at the end of each event."); 66 beamOnCmd->SetGuidance("If the second argume 57 beamOnCmd->SetGuidance("If the second argument, i.e. name of the macro"); 67 beamOnCmd->SetGuidance("file, is given but t 58 beamOnCmd->SetGuidance("file, is given but the third argument is not,"); 68 beamOnCmd->SetGuidance("the macro file will 59 beamOnCmd->SetGuidance("the macro file will be executed for all of the"); 69 beamOnCmd->SetGuidance("event."); 60 beamOnCmd->SetGuidance("event."); 70 beamOnCmd->SetGuidance("If the third argumen 61 beamOnCmd->SetGuidance("If the third argument (nSelect) is given, the"); 71 beamOnCmd->SetGuidance("macro file will be e 62 beamOnCmd->SetGuidance("macro file will be executed only for the first"); 72 beamOnCmd->SetGuidance("nSelect events."); 63 beamOnCmd->SetGuidance("nSelect events."); 73 beamOnCmd->AvailableForStates(G4State_PreIni << 64 beamOnCmd->AvailableForStates(PreInit,Idle); 74 beamOnCmd->SetToBeBroadcasted(false); << 65 G4UIparameter* p1 = new G4UIparameter("numberOfEvent",'i',true); 75 auto p1 = new G4UIparameter("numberOfEvent", << 76 p1->SetDefaultValue(1); 66 p1->SetDefaultValue(1); 77 p1->SetParameterRange("numberOfEvent >= 0"); << 67 p1->SetParameterRange("numberOfEvent > 0"); 78 beamOnCmd->SetParameter(p1); 68 beamOnCmd->SetParameter(p1); 79 auto p2 = new G4UIparameter("macroFile", 's' << 69 G4UIparameter* p2 = new G4UIparameter("macroFile",'s',true); 80 p2->SetDefaultValue("***NULL***"); 70 p2->SetDefaultValue("***NULL***"); 81 beamOnCmd->SetParameter(p2); 71 beamOnCmd->SetParameter(p2); 82 auto p3 = new G4UIparameter("nSelect", 'i', << 72 G4UIparameter* p3 = new G4UIparameter("nSelect",'i',true); 83 p3->SetDefaultValue(-1); 73 p3->SetDefaultValue(-1); 84 p3->SetParameterRange("nSelect>=-1"); 74 p3->SetParameterRange("nSelect>=-1"); 85 beamOnCmd->SetParameter(p3); 75 beamOnCmd->SetParameter(p3); 86 // beamOnCmd->SetToBeBroadcasted(false); << 87 76 88 verboseCmd = new G4UIcmdWithAnInteger("/run/ << 77 verboseCmd = new G4UIcmdWithAnInteger("/run/verbose",this); 89 verboseCmd->SetGuidance("Set the Verbose lev 78 verboseCmd->SetGuidance("Set the Verbose level of G4RunManager."); 90 verboseCmd->SetGuidance(" 0 : Silent (defaul 79 verboseCmd->SetGuidance(" 0 : Silent (default)"); 91 verboseCmd->SetGuidance(" 1 : Display main t 80 verboseCmd->SetGuidance(" 1 : Display main topics"); 92 verboseCmd->SetGuidance(" 2 : Display main t 81 verboseCmd->SetGuidance(" 2 : Display main topics and run summary"); 93 verboseCmd->SetGuidance(" 3 : Display some a << 82 verboseCmd->SetParameterName("level",true); 94 verboseCmd->SetGuidance(" 4 : Display detail << 95 verboseCmd->SetGuidance(" N.B. 3 or 4 may ca << 96 verboseCmd->SetParameterName("level", true); << 97 verboseCmd->SetDefaultValue(0); 83 verboseCmd->SetDefaultValue(0); 98 verboseCmd->SetRange("level >=0 && level <=4 << 84 verboseCmd->SetRange("level >=0 && level <=2"); 99 85 100 printProgCmd = new G4UIcmdWithAnInteger("/ru << 86 optCmd = new G4UIcmdWithABool("/run/optimizeGeometry",this); 101 printProgCmd->SetGuidance("Display begin_of_ << 102 printProgCmd->SetGuidance("If it is set to z << 103 printProgCmd->SetGuidance("If it is set to - << 104 printProgCmd->SetParameterName("mod", true); << 105 printProgCmd->SetDefaultValue(-1); << 106 printProgCmd->SetRange("mod>=-1"); << 107 << 108 nThreadsCmd = new G4UIcmdWithAnInteger("/run << 109 nThreadsCmd->SetGuidance("Set the number of << 110 nThreadsCmd->SetGuidance("This command works << 111 nThreadsCmd->SetGuidance("This command is va << 112 nThreadsCmd->SetGuidance("The command is ign << 113 nThreadsCmd->SetParameterName("nThreads", tr << 114 nThreadsCmd->SetDefaultValue(2); << 115 nThreadsCmd->SetRange("nThreads >0"); << 116 nThreadsCmd->SetToBeBroadcasted(false); << 117 nThreadsCmd->AvailableForStates(G4State_PreI << 118 << 119 maxThreadsCmd = new G4UIcmdWithoutParameter( << 120 maxThreadsCmd->SetGuidance( << 121 "Set the number of threads to be the numbe << 122 maxThreadsCmd->SetGuidance("This command wor << 123 maxThreadsCmd->SetGuidance("This command is << 124 maxThreadsCmd->SetGuidance("The command is i << 125 maxThreadsCmd->SetToBeBroadcasted(false); << 126 maxThreadsCmd->AvailableForStates(G4State_Pr << 127 << 128 pinAffinityCmd = new G4UIcmdWithAnInteger("/ << 129 pinAffinityCmd->SetGuidance( << 130 "Locks each thread to a specific logical c << 131 "are locked in round robin to logical core << 132 pinAffinityCmd->SetGuidance("This command is << 133 pinAffinityCmd->SetGuidance("This command wo << 134 pinAffinityCmd->SetGuidance("This command is << 135 pinAffinityCmd->SetGuidance( << 136 "If a value n>0 is provided it starts sett << 137 "from the n-th CPU (note: counting from 1) << 138 pinAffinityCmd->SetGuidance( << 139 "E.g. /run/pinAffinity 3 locks first threa << 140 "third logical CPU (number 2)."); << 141 pinAffinityCmd->SetGuidance("If a value n<0 << 142 pinAffinityCmd->SetParameterName("pinAffinit << 143 pinAffinityCmd->SetDefaultValue(1); << 144 pinAffinityCmd->SetToBeBroadcasted(false); << 145 pinAffinityCmd->SetRange("pinAffinity > 0 || << 146 pinAffinityCmd->AvailableForStates(G4State_P << 147 << 148 evModCmd = new G4UIcommand("/run/eventModulo << 149 evModCmd->SetGuidance("Set the event modulo << 150 evModCmd->SetGuidance("i.e. each worker thre << 151 evModCmd->SetGuidance("comes back to G4MTRun << 152 evModCmd->SetGuidance("If it is set to zero << 153 evModCmd->SetGuidance(" N = int( sqrt( num << 154 evModCmd->SetGuidance("The value N may affec << 155 evModCmd->SetGuidance("if N is too small com << 156 evModCmd->SetGuidance("The second parameter << 157 evModCmd->SetGuidance("thread is seeded by t << 158 evModCmd->SetGuidance("by the master G4MTRun << 159 evModCmd->SetGuidance(" - If seedOnce is set << 160 evModCmd->SetGuidance(" by G4MTRunManager << 161 evModCmd->SetGuidance(" This option guaran << 162 evModCmd->SetGuidance(" of threads."); << 163 evModCmd->SetGuidance(" - If seedOnce is set << 164 evModCmd->SetGuidance(" event of each run << 165 evModCmd->SetGuidance(" guaranteed only if << 166 evModCmd->SetGuidance(" On the other hand, << 167 evModCmd->SetGuidance(" in particular for << 168 evModCmd->SetGuidance(" particle energy an << 169 evModCmd->SetGuidance(" - If seedOnce is set << 170 evModCmd->SetGuidance(" group of N events. << 171 evModCmd->SetGuidance(" Geant4 allows numb << 172 evModCmd->SetGuidance(" event loop."); << 173 evModCmd->SetGuidance("This command is valid << 174 evModCmd->SetGuidance("This command is ignor << 175 evModCmd->SetGuidance("sub-event parallel mo << 176 auto emp1 = new G4UIparameter("N", 'i', true << 177 emp1->SetDefaultValue(0); << 178 emp1->SetParameterRange("N >= 0"); << 179 evModCmd->SetParameter(emp1); << 180 auto emp2 = new G4UIparameter("seedOnce", 'i << 181 emp2->SetDefaultValue(0); << 182 emp2->SetParameterRange("seedOnce >= 0 && se << 183 evModCmd->SetParameter(emp2); << 184 evModCmd->SetToBeBroadcasted(false); << 185 evModCmd->AvailableForStates(G4State_PreInit << 186 << 187 dumpRegCmd = new G4UIcmdWithAString("/run/du << 188 dumpRegCmd->SetGuidance("Dump region informa << 189 dumpRegCmd->SetGuidance("In case name of a r << 190 dumpRegCmd->SetParameterName("regionName", t << 191 dumpRegCmd->SetDefaultValue("**ALL**"); << 192 dumpRegCmd->AvailableForStates(G4State_Idle) << 193 << 194 dumpCoupleCmd = new G4UIcmdWithoutParameter( << 195 dumpCoupleCmd->SetGuidance("Dump material-cu << 196 dumpCoupleCmd->SetGuidance("Note that materi << 197 dumpCoupleCmd->SetGuidance("after BeamOn has << 198 dumpCoupleCmd->AvailableForStates(G4State_Id << 199 << 200 optCmd = new G4UIcmdWithABool("/run/optimize << 201 optCmd->SetGuidance("Set the optimization fl 87 optCmd->SetGuidance("Set the optimization flag for geometry."); 202 optCmd->SetGuidance("If it is set to TRUE, G 88 optCmd->SetGuidance("If it is set to TRUE, G4GeometryManager will optimize"); 203 optCmd->SetGuidance("the geometry definition 89 optCmd->SetGuidance("the geometry definitions."); 204 optCmd->SetGuidance("GEANT4 is initialized w 90 optCmd->SetGuidance("GEANT4 is initialized with this flag as TRUE."); 205 optCmd->SetParameterName("optimizeFlag", tru << 91 optCmd->SetParameterName("optimizeFlag",true); 206 optCmd->SetDefaultValue(true); 92 optCmd->SetDefaultValue(true); 207 optCmd->AvailableForStates(G4State_PreInit, << 93 optCmd->AvailableForStates(PreInit,Idle); 208 94 209 brkBoECmd = new G4UIcmdWithABool("/run/break << 95 brkBoECmd = new G4UIcmdWithABool("/run/breakAtBeginOfEvent",this); 210 brkBoECmd->SetGuidance("Set a break point at << 96 brkBoECmd->SetGuidance("Set a break point at the begining of every event."); 211 brkBoECmd->SetParameterName("flag", true); << 97 brkBoECmd->SetParameterName("flag",true); 212 brkBoECmd->SetDefaultValue(true); 98 brkBoECmd->SetDefaultValue(true); 213 << 99 214 brkEoECmd = new G4UIcmdWithABool("/run/break << 100 brkEoECmd = new G4UIcmdWithABool("/run/breakAtEndOfEvent",this); 215 brkEoECmd->SetGuidance("Set a break point at 101 brkEoECmd->SetGuidance("Set a break point at the end of every event."); 216 brkEoECmd->SetParameterName("flag", true); << 102 brkEoECmd->SetParameterName("flag",true); 217 brkEoECmd->SetDefaultValue(true); 103 brkEoECmd->SetDefaultValue(true); 218 << 104 219 abortCmd = new G4UIcmdWithABool("/run/abort" << 105 abortCmd = new G4UIcmdWithoutParameter("/run/abort",this); 220 abortCmd->SetGuidance("Abort current run pro 106 abortCmd->SetGuidance("Abort current run processing."); 221 abortCmd->SetGuidance( << 107 abortCmd->AvailableForStates(GeomClosed,EventProc); 222 "If softAbort is false (default), currentl << 223 "will be immediately aborted,"); << 224 abortCmd->SetGuidance( << 225 "while softAbort is true, abortion occurs << 226 "processing the current event."); << 227 abortCmd->AvailableForStates(G4State_GeomClo << 228 abortCmd->SetParameterName("softAbort", true << 229 abortCmd->SetDefaultValue(false); << 230 << 231 abortEventCmd = new G4UIcmdWithoutParameter( << 232 abortEventCmd->SetGuidance("Abort currently << 233 abortEventCmd->AvailableForStates(G4State_Ev << 234 << 235 geomCmd = new G4UIcmdWithoutParameter("/run/ << 236 geomCmd->SetGuidance("Force geometry to be c << 237 geomCmd->SetGuidance("This command must be a << 238 geomCmd->SetGuidance(" after the first initi << 239 geomCmd->AvailableForStates(G4State_PreInit, << 240 << 241 geomRebCmd = new G4UIcmdWithABool("/run/rein << 242 geomRebCmd->SetGuidance("Force geometry to b << 243 geomRebCmd->SetGuidance("This command must b << 244 geomRebCmd->SetGuidance(" detector construct << 245 geomRebCmd->SetGuidance("/run/geometryModifi << 246 geomRebCmd->SetParameterName("destroyFirst", << 247 geomRebCmd->SetDefaultValue(false); << 248 geomRebCmd->AvailableForStates(G4State_PreIn << 249 << 250 physCmd = new G4UIcmdWithoutParameter("/run/ << 251 physCmd->SetGuidance("Force all physics tabl << 252 physCmd->SetGuidance("This command must be a << 253 physCmd->SetGuidance(" if physics process ha << 254 physCmd->SetGuidance(" first initialization << 255 physCmd->AvailableForStates(G4State_PreInit, << 256 << 257 constScoreCmd = new G4UIcmdWithoutParameter( << 258 constScoreCmd->SetGuidance("Construct scorin << 259 constScoreCmd->SetGuidance( << 260 "This command is not mandatory, but automa << 261 "called when a run starts."); << 262 constScoreCmd->SetGuidance( << 263 "But the user may use this to visualize th << 264 "world(s) before a run to start."); << 265 constScoreCmd->AvailableForStates(G4State_Id << 266 108 >> 109 geomCmd = new G4UIcmdWithoutParameter("/run/geometryModified",this); >> 110 geomCmd->SetGuidance("Force geometry to be closed again."); >> 111 geomCmd->SetGuidance("This command must be applied"); >> 112 geomCmd->SetGuidance(" if geometry has been modified after the"); >> 113 geomCmd->SetGuidance(" first initialization (or BeamOn)."); >> 114 geomCmd->AvailableForStates(PreInit,Idle), >> 115 >> 116 cutCmd = new G4UIcmdWithoutParameter("/run/cutoffModified",this); >> 117 cutCmd->SetGuidance("Force closssection tables to be calculated again."); >> 118 cutCmd->SetGuidance("This command must be applied"); >> 119 cutCmd->SetGuidance(" if cutoff value(s) have been modified after the"); >> 120 cutCmd->SetGuidance(" first initialization (or BeamOn)."); >> 121 cutCmd->AvailableForStates(PreInit,Idle); >> 122 267 randomDirectory = new G4UIdirectory("/random 123 randomDirectory = new G4UIdirectory("/random/"); 268 randomDirectory->SetGuidance("Random number 124 randomDirectory->SetGuidance("Random number status control commands."); 269 << 125 270 seedCmd = new G4UIcmdWithAString("/random/se << 126 randDirCmd = new G4UIcmdWithAString("/random/setDirectoryName",this); 271 seedCmd->SetGuidance("Initialize the random << 272 seedCmd->SetGuidance("Number of integers sho << 273 seedCmd->SetGuidance( << 274 "Actual number of integers to be used depe << 275 "random number engine."); << 276 #ifdef G4MULTITHREADED << 277 seedCmd->SetGuidance("This command sets the << 278 #endif << 279 seedCmd->SetParameterName("IntArray", false) << 280 seedCmd->AvailableForStates(G4State_PreInit, << 281 seedCmd->SetToBeBroadcasted(false); << 282 << 283 randDirCmd = new G4UIcmdWithAString("/random << 284 randDirCmd->SetGuidance("Define the director 127 randDirCmd->SetGuidance("Define the directory name of the rndm status files."); 285 randDirCmd->SetGuidance("Directory will be c << 128 randDirCmd->SetGuidance("Directory must be creates before storing the files."); 286 randDirCmd->SetParameterName("fileName", tru << 129 randDirCmd->SetParameterName("fileName",true); 287 randDirCmd->SetDefaultValue("./"); 130 randDirCmd->SetDefaultValue("./"); 288 randDirCmd->AvailableForStates(G4State_PreIn << 131 randDirCmd->AvailableForStates(PreInit,Idle,GeomClosed); 289 << 132 290 savingFlagCmd = new G4UIcmdWithABool("/rando << 133 savingFlagCmd = new G4UIcmdWithABool("/random/setSavingFlag",this); 291 savingFlagCmd->SetGuidance("The randomNumber 134 savingFlagCmd->SetGuidance("The randomNumberStatus will be saved at :"); 292 savingFlagCmd->SetGuidance( << 135 savingFlagCmd->SetGuidance("begining of run (currentRun.rndm) and " 293 "beginning of run (currentRun.rndm) and " << 136 "begining of event (currentEvent.rndm) "); 294 "beginning of event (currentEvent.rndm) ") << 137 savingFlagCmd->SetParameterName("flag",true); 295 savingFlagCmd->SetParameterName("flag", true << 296 savingFlagCmd->SetDefaultValue(true); 138 savingFlagCmd->SetDefaultValue(true); 297 << 139 298 saveThisRunCmd = new G4UIcmdWithoutParameter << 140 saveThisRunCmd = new G4UIcmdWithoutParameter("/random/saveThisRun",this); 299 saveThisRunCmd->SetGuidance("copy currentRun 141 saveThisRunCmd->SetGuidance("copy currentRun.rndm to runXXX.rndm"); 300 saveThisRunCmd->AvailableForStates(G4State_I << 142 saveThisRunCmd->AvailableForStates(Idle,GeomClosed,EventProc); 301 << 143 302 saveThisEventCmd = new G4UIcmdWithoutParamet << 144 saveThisEventCmd = new G4UIcmdWithoutParameter("/random/saveThisEvent",this); 303 saveThisEventCmd->SetGuidance("copy currentE 145 saveThisEventCmd->SetGuidance("copy currentEvent.rndm to runXXXevtYYY.rndm"); 304 saveThisEventCmd->AvailableForStates(G4State << 146 saveThisEventCmd->AvailableForStates(EventProc); 305 << 147 306 restoreRandCmd = new G4UIcmdWithAString("/ra << 148 restoreRandCmd = new G4UIcmdWithAString("/random/resetEngineFrom",this); 307 restoreRandCmd->SetGuidance("Reset the statu 149 restoreRandCmd->SetGuidance("Reset the status of the rndm engine from a file."); 308 restoreRandCmd->SetGuidance("See CLHEP manua 150 restoreRandCmd->SetGuidance("See CLHEP manual for detail."); 309 restoreRandCmd->SetGuidance("The engine stat 151 restoreRandCmd->SetGuidance("The engine status must be stored beforehand."); 310 restoreRandCmd->SetGuidance( << 152 restoreRandCmd->SetGuidance("Directory of the status file should be set by" 311 "Directory of the status file should be se << 153 " /random/setDirectoryName."); 312 " /random/setDirectoryName."); << 154 restoreRandCmd->SetParameterName("fileName",true); 313 restoreRandCmd->SetParameterName("fileName", << 314 restoreRandCmd->SetDefaultValue("currentRun. 155 restoreRandCmd->SetDefaultValue("currentRun.rndm"); 315 restoreRandCmd->AvailableForStates(G4State_P << 156 restoreRandCmd->AvailableForStates(PreInit,Idle,GeomClosed); 316 restoreRandCmd->SetToBeBroadcasted(false); << 157 >> 158 //old commands for the rndm engine status handling >> 159 // >> 160 randDirOld = new G4UIcmdWithAString("/run/randomNumberStatusDirectory",this); >> 161 randDirOld->SetGuidance("Define the directory name of the rndm status files."); >> 162 randDirOld->SetGuidance("Directory must be creates before storing the files."); >> 163 randDirOld->SetParameterName("fileName",true); >> 164 randDirOld->SetDefaultValue("./"); >> 165 randDirOld->AvailableForStates(PreInit,Idle,GeomClosed); >> 166 >> 167 storeRandOld = new G4UIcmdWithAnInteger("/run/storeRandomNumberStatus",this); >> 168 storeRandOld->SetGuidance("The randomNumberStatus will be saved at :"); >> 169 storeRandOld->SetGuidance("begining of run (currentRun.rndm) and " >> 170 "begining of event (currentEvent.rndm) "); >> 171 storeRandOld->SetParameterName("flag",true); >> 172 storeRandOld->SetDefaultValue(1); >> 173 >> 174 restoreRandOld = new G4UIcmdWithAString("/run/restoreRandomNumberStatus",this); >> 175 restoreRandOld->SetGuidance("Reset the status of the rndm engine from a file."); >> 176 restoreRandOld->SetGuidance("See CLHEP manual for detail."); >> 177 restoreRandOld->SetGuidance("The engine status must be stored beforehand."); >> 178 restoreRandOld->SetGuidance("Directory of the status file should be set by" >> 179 " /random/setDirectoryName."); >> 180 restoreRandOld->SetParameterName("fileName",true); >> 181 restoreRandOld->SetDefaultValue("currentRun.rndm"); >> 182 restoreRandOld->AvailableForStates(PreInit,Idle,GeomClosed); 317 183 318 restoreRandCmdMT = new G4UIcmdWithABool("/ra << 319 restoreRandCmdMT->SetGuidance("Reset the sta << 320 restoreRandCmdMT->SetGuidance("Note that the << 321 restoreRandCmdMT->SetGuidance( << 322 "run{#1}evt{#2}.rndm ; where #1 is the run << 323 "number and #2 is the event number."); << 324 restoreRandCmdMT->SetGuidance( << 325 "For example to re-seed the first event of << 326 "run the file should be called run0evt0.rn << 327 restoreRandCmdMT->SetGuidance( << 328 "If for a specific run/event the file is n << 329 "the standard re-seeding strategy is used. << 330 restoreRandCmdMT->SetGuidance( << 331 "This command has meaning only in MT mode << 332 "strong reproducibility studies."); << 333 restoreRandCmdMT->SetGuidance( << 334 "Directory of the status file should be se << 335 " /random/setDirectoryName."); << 336 restoreRandCmdMT->SetDefaultValue(false); << 337 restoreRandCmdMT->AvailableForStates(G4State << 338 << 339 saveEachEventCmd = new G4UIcmdWithABool("/ra << 340 saveEachEventCmd->SetGuidance("Save random n << 341 saveEachEventCmd->SetGuidance("File name con << 342 saveEachEventCmd->SetParameterName("flag", t << 343 saveEachEventCmd->SetDefaultValue(true); << 344 << 345 randEvtCmd = new G4UIcmdWithAnInteger("/run/ << 346 randEvtCmd->SetGuidance("Flag to store rndm << 347 randEvtCmd->SetGuidance(" flag = 0 : not sto << 348 randEvtCmd->SetGuidance(" flag = 1 : status << 349 randEvtCmd->SetGuidance( << 350 " flag = 2 : status before event processin << 351 "particle generation) is stored"); << 352 randEvtCmd->SetGuidance(" flag = 3 : both ar << 353 randEvtCmd->SetGuidance( << 354 "Note: Some performance overhead may be se << 355 "status, in particular"); << 356 randEvtCmd->SetGuidance( << 357 "for the case of simplest geometry and sma << 358 randEvtCmd->SetParameterName("flag", true); << 359 randEvtCmd->SetDefaultValue(0); << 360 randEvtCmd->SetRange("flag>=0 && flag<=3"); << 361 randEvtCmd->AvailableForStates(G4State_PreIn << 362 << 363 procUICmds = new G4UIcmdWithoutParameter("/r << 364 procUICmds->SetToBeBroadcasted(false); << 365 procUICmds->SetGuidance("Force workers to pr << 366 procUICmds->SetGuidance("This commands is me << 367 procUICmds->AvailableForStates(G4State_PreIn << 368 << 369 trajMergeCmd = new G4UIcmdWithABool("/run/tr << 370 trajMergeCmd->SetGuidance("Merge trajectorie << 371 trajMergeCmd->SetGuidance("In sub-event para << 372 trajMergeCmd->SetGuidance("threads are not m << 373 trajMergeCmd->SetGuidance("due to the perfor << 374 trajMergeCmd->SetGuidance("This command enab << 375 trajMergeCmd->SetGuidance("/tracking/storeTr << 376 trajMergeCmd->SetGuidance("This command is v << 377 trajMergeCmd->AvailableForStates(G4State_Pre << 378 trajMergeCmd->SetParameterName("flag", true) << 379 trajMergeCmd->SetDefaultValue(true); << 380 trajMergeCmd->SetToBeBroadcasted(false); << 381 } 184 } 382 185 383 // ------------------------------------------- << 384 G4RunMessenger::~G4RunMessenger() 186 G4RunMessenger::~G4RunMessenger() 385 { 187 { 386 delete beamOnCmd; 188 delete beamOnCmd; 387 delete verboseCmd; 189 delete verboseCmd; 388 delete printProgCmd; << 389 delete nThreadsCmd; << 390 delete maxThreadsCmd; << 391 delete pinAffinityCmd; << 392 delete evModCmd; << 393 delete optCmd; 190 delete optCmd; 394 delete dumpRegCmd; << 395 delete dumpCoupleCmd; << 396 delete brkBoECmd; 191 delete brkBoECmd; 397 delete brkEoECmd; 192 delete brkEoECmd; 398 delete abortCmd; 193 delete abortCmd; 399 delete abortEventCmd; << 400 delete initCmd; 194 delete initCmd; 401 delete geomCmd; 195 delete geomCmd; 402 delete geomRebCmd; << 196 delete cutCmd; 403 delete physCmd; << 197 delete randDirOld; delete storeRandOld; delete restoreRandOld; 404 delete randEvtCmd; << 198 delete runDirectory; 405 delete constScoreCmd; << 199 406 delete procUICmds; << 200 delete randDirCmd; 407 delete trajMergeCmd; << 408 << 409 delete seedCmd; << 410 delete savingFlagCmd; 201 delete savingFlagCmd; 411 delete saveThisRunCmd; 202 delete saveThisRunCmd; 412 delete saveThisEventCmd; 203 delete saveThisEventCmd; 413 delete restoreRandCmd; 204 delete restoreRandCmd; 414 delete randomDirectory; 205 delete randomDirectory; 415 delete saveEachEventCmd; << 416 << 417 delete randDirCmd; << 418 delete runDirectory; << 419 << 420 delete restoreRandCmdMT; << 421 } 206 } 422 207 423 // ------------------------------------------- << 208 void G4RunMessenger::SetNewValue(G4UIcommand * command,G4String newValue) 424 void G4RunMessenger::SetNewValue(G4UIcommand* << 425 { 209 { 426 if (command == beamOnCmd) { << 210 if( command==beamOnCmd ) >> 211 { 427 G4int nev; 212 G4int nev; 428 G4int nst; << 213 G4int ns; 429 const auto nv = (const char*)newValue; << 214 const char* nv = (const char*)newValue; 430 std::istringstream is(nv); << 215 G4std::istrstream is((char*)nv); 431 is >> nev >> macroFileName >> nst; << 216 is >> nev >> macroFileName >> ns; 432 if (macroFileName == "***NULL***") { << 217 if(macroFileName=="***NULL***") 433 runManager->BeamOn(nev); << 218 { runManager->BeamOn(nev); } 434 } << 219 else 435 else { << 220 { runManager->BeamOn(nev,macroFileName,ns); } 436 runManager->BeamOn(nev, macroFileName, n << 221 } 437 } << 222 else if( command==verboseCmd ) 438 } << 223 { runManager->SetVerboseLevel(verboseCmd->GetNewIntValue(newValue)); } 439 else if (command == verboseCmd) { << 224 else if( command==optCmd ) 440 runManager->SetVerboseLevel(verboseCmd->Ge << 225 { runManager->SetGeometryToBeOptimized(optCmd->GetNewBoolValue(newValue)); } 441 } << 226 else if( command==brkBoECmd ) 442 else if (command == printProgCmd) { << 227 { G4UImanager::GetUIpointer()->SetPauseAtBeginOfEvent(brkBoECmd->GetNewBoolValue(newValue)); } 443 runManager->SetPrintProgress(printProgCmd- << 228 else if( command==brkEoECmd ) 444 } << 229 { G4UImanager::GetUIpointer()->SetPauseAtEndOfEvent(brkEoECmd->GetNewBoolValue(newValue)); } 445 else if (command == nThreadsCmd) { << 230 else if( command==abortCmd ) 446 G4RunManager::RMType rmType = runManager-> << 231 { runManager->AbortRun(); } 447 if (rmType == G4RunManager::masterRM) { << 232 else if( command==initCmd ) 448 static_cast<G4MTRunManager*>(runManager) << 233 { runManager->Initialize(); } 449 ->SetNumberOfThreads(nThreadsCmd->GetN << 234 else if( command==geomCmd ) 450 } << 235 { runManager->GeometryHasBeenModified(); } 451 else if (rmType == G4RunManager::sequentia << 236 else if( command==cutCmd ) 452 G4cout << "*** /run/numberOfThreads comm << 237 { runManager->CutOffHasBeenModified(); } 453 << "\nCommand is ignored." << G4e << 238 454 } << 239 else if( command==randDirCmd ) 455 else { << 240 { runManager->SetRandomNumberStoreDir(newValue); } 456 G4Exception("G4RunMessenger::ApplyNewCom << 241 else if( command==savingFlagCmd ) 457 "/run/numberOfThreads comman << 242 { runManager->SetRandomNumberStore(savingFlagCmd->GetNewBoolValue(newValue)); } 458 } << 243 else if( command==saveThisRunCmd ) 459 } << 244 { runManager->rndmSaveThisRun(); } 460 else if (command == maxThreadsCmd) { << 245 else if( command==saveThisEventCmd ) 461 G4RunManager::RMType rmType = runManager-> << 246 { runManager->rndmSaveThisEvent(); } 462 if (rmType == G4RunManager::masterRM) { << 247 else if( command==restoreRandCmd ) 463 static_cast<G4MTRunManager*>(runManager) << 248 { runManager->RestoreRandomNumberStatus(newValue); } 464 ->SetNumberOfThreads(G4Threading::G4Ge << 249 465 } << 250 else if( command==randDirOld ) 466 else if (rmType == G4RunManager::sequentia << 251 {G4cout << "warning: deprecated command. Use /random/setDirectoryName" 467 G4cout << "*** /run/useMaximumLogicalCor << 252 << G4endl; 468 "sequential mode." << 253 runManager->SetRandomNumberStoreDir(newValue); } 469 << "\nCommand is ignored." << G4e << 254 else if( command==storeRandOld ) 470 } << 255 {G4cout << "warning: deprecated command. Use /random/setSavingFlag" 471 else { << 256 << G4endl; 472 G4Exception("G4RunMessenger::ApplyNewCom << 257 G4int frequency = storeRandOld->GetNewIntValue(newValue); 473 "/run/useMaximumLogicalCores << 258 G4bool flag = false; 474 } << 259 if(frequency != 0) flag = true; 475 } << 260 runManager->SetRandomNumberStore(flag); } 476 else if (command == pinAffinityCmd) { << 261 else if( command==restoreRandOld ) 477 G4RunManager::RMType rmType = runManager-> << 262 {G4cout << "warning: deprecated command. Use /random/resetEngineFrom" 478 if (rmType == G4RunManager::masterRM) { << 263 << G4endl; 479 static_cast<G4MTRunManager*>(runManager) << 264 runManager->RestoreRandomNumberStatus(newValue); } 480 ->SetPinAffinity(pinAffinityCmd->GetNe << 481 } << 482 else if (rmType == G4RunManager::sequentia << 483 G4cout << "*** /run/pinAffinity command << 484 << "\nCommand is ignored." << G4e << 485 } << 486 else { << 487 G4Exception("G4RunMessenger::ApplyNewCom << 488 "/run/pinAffinity command is << 489 } << 490 } << 491 else if (command == evModCmd) { << 492 G4RunManager::RMType rmType = runManager-> << 493 if (rmType == G4RunManager::masterRM) { << 494 G4int nevMod = 0; << 495 G4int sOnce = 0; << 496 const auto nv = (const char*)newValue; << 497 std::istringstream is(nv); << 498 is >> nevMod >> sOnce; << 499 static_cast<G4MTRunManager*>(runManager) << 500 G4MTRunManager::SetSeedOncePerCommunicat << 501 } << 502 else if (rmType == G4RunManager::sequentia << 503 G4cout << "*** /run/eventModulo command << 504 << "\nCommand is ignored." << G4e << 505 } << 506 else if (rmType == G4RunManager::subEventM << 507 G4cout << "*** /run/eventModulo command << 508 << "\nCommand is ignored." << G4e << 509 } << 510 else { << 511 G4Exception("G4RunMessenger::ApplyNewCom << 512 "/run/eventModulo command is << 513 } << 514 } << 515 else if (command == dumpRegCmd) { << 516 if (newValue == "**ALL**") { << 517 runManager->DumpRegion(); << 518 } << 519 else { << 520 runManager->DumpRegion(newValue); << 521 } << 522 } << 523 else if (command == dumpCoupleCmd) { << 524 G4ProductionCutsTable::GetProductionCutsTa << 525 } << 526 else if (command == optCmd) { << 527 runManager->SetGeometryToBeOptimized(optCm << 528 } << 529 else if (command == brkBoECmd) { << 530 G4UImanager::GetUIpointer()->SetPauseAtBeg << 531 } << 532 else if (command == brkEoECmd) { << 533 G4UImanager::GetUIpointer()->SetPauseAtEnd << 534 } << 535 else if (command == abortCmd) { << 536 runManager->AbortRun(abortCmd->GetNewBoolV << 537 } << 538 else if (command == abortEventCmd) { << 539 runManager->AbortEvent(); << 540 } << 541 else if (command == initCmd) { << 542 runManager->Initialize(); << 543 } << 544 else if (command == geomCmd) { << 545 runManager->GeometryHasBeenModified(false) << 546 } << 547 else if (command == geomRebCmd) { << 548 runManager->ReinitializeGeometry(geomRebCm << 549 } << 550 else if (command == physCmd) { << 551 runManager->PhysicsHasBeenModified(); << 552 } << 553 else if (command == seedCmd) { << 554 G4Tokenizer next(newValue); << 555 G4int idx = 0; << 556 G4long seeds[100]; << 557 G4String vl; << 558 while (!(vl = next()).empty()) { << 559 seeds[idx] = StoL(vl); << 560 ++idx; << 561 } << 562 if (idx < 2) { << 563 G4cerr << "/random/setSeeds should have << 564 "Command ignored." << 565 << G4endl; << 566 } << 567 else { << 568 seeds[idx] = 0; << 569 G4Random::setTheSeeds(seeds); << 570 } << 571 } << 572 else if (command == randDirCmd) { << 573 runManager->SetRandomNumberStoreDir(newVal << 574 } << 575 else if (command == savingFlagCmd) { << 576 runManager->SetRandomNumberStore(savingFla << 577 } << 578 else if (command == saveThisRunCmd) { << 579 runManager->rndmSaveThisRun(); << 580 } << 581 else if (command == saveThisEventCmd) { << 582 runManager->rndmSaveThisEvent(); << 583 } << 584 else if (command == restoreRandCmd) { << 585 runManager->RestoreRandomNumberStatus(newV << 586 } << 587 else if (command == randEvtCmd) { << 588 runManager->StoreRandomNumberStatusToG4Eve << 589 } << 590 else if (command == saveEachEventCmd) { << 591 runManager->SetRandomNumberStorePerEvent(s << 592 } << 593 else if (command == constScoreCmd) { << 594 runManager->ConstructScoringWorlds(); << 595 } << 596 else if (command == restoreRandCmdMT) { << 597 runManager->RestoreRndmEachEvent(restoreRa << 598 } << 599 else if (command == procUICmds) { << 600 G4RunManager::RMType rmType = runManager-> << 601 if (rmType == G4RunManager::masterRM) { << 602 auto rm = dynamic_cast<G4MTRunManager*>( << 603 if (rm != nullptr) { << 604 rm->RequestWorkersProcessCommandsStack << 605 } << 606 else { << 607 G4Exception("G4RunManager::ApplyNewCom << 608 "/run/workersProcessCmds c << 609 "non-G4MTRunManager class << 610 } << 611 } << 612 else if (rmType == G4RunManager::sequentia << 613 G4cout << "*** /run/workersProcessCmds c << 614 << "\nCommand is ignored." << G4e << 615 } << 616 else { << 617 G4Exception("G4RunMessenger::ApplyNewCom << 618 "/run/workersProcessCmds com << 619 } << 620 } << 621 else if (command == trajMergeCmd) { << 622 G4RunManager::RMType rmType = runManager-> << 623 if (rmType == G4RunManager::subEventMaster << 624 auto rm = dynamic_cast<G4SubEvtRunManage << 625 if (rm != nullptr) { << 626 rm->TrajectoriesToBeMerged(trajMergeCm << 627 } << 628 else { << 629 G4ExceptionDescription ed; << 630 ed << "/run/trajectoriesToBeMerged com << 631 << "instance that is not G4SubEvtRu << 632 G4Exception("G4RunManager::ApplyNewCom << 633 } << 634 } << 635 else { << 636 G4cout << "*** /run/trajectoriesToBeMerg << 637 << "class instance that is not G4 << 638 << "\nCommand is ignored." << G4e << 639 } << 640 } << 641 } 265 } 642 266 643 // ------------------------------------------- << 267 G4String G4RunMessenger::GetCurrentValue(G4UIcommand * command) 644 G4String G4RunMessenger::GetCurrentValue(G4UIc << 645 { 268 { 646 G4String cv; 269 G4String cv; 647 << 270 648 if (command == verboseCmd) { << 271 if( command==verboseCmd ) 649 cv = verboseCmd->ConvertToString(runManage << 272 { cv = verboseCmd->ConvertToString(runManager->GetVerboseLevel()); } 650 } << 273 else if( command==randDirCmd ) 651 else if (command == printProgCmd) { << 274 { cv = runManager->GetRandomNumberStoreDir(); } 652 cv = printProgCmd->ConvertToString(runMana << 275 653 } << 654 else if (command == randDirCmd) { << 655 cv = runManager->GetRandomNumberStoreDir() << 656 } << 657 else if (command == randEvtCmd) { << 658 cv = randEvtCmd->ConvertToString(runManage << 659 } << 660 else if (command == nThreadsCmd) { << 661 G4RunManager::RMType rmType = runManager-> << 662 if (rmType == G4RunManager::masterRM) { << 663 cv = nThreadsCmd->ConvertToString( << 664 static_cast<G4MTRunManager*>(runManage << 665 } << 666 else if (rmType == G4RunManager::sequentia << 667 cv = "0"; << 668 } << 669 } << 670 else if (command == evModCmd) { << 671 G4RunManager::RMType rmType = runManager-> << 672 if (rmType == G4RunManager::masterRM) { << 673 cv = evModCmd->ConvertToString(static_ca << 674 + " " + evModCmd->ConvertToString(G << 675 } << 676 else if (rmType == G4RunManager::sequentia << 677 G4cout << "*** /run/eventModulo command << 678 } << 679 } << 680 << 681 return cv; 276 return cv; 682 } 277 } >> 278 683 279