Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4UserPhysicsListMessenger implementation 27 // 28 // Original author: H.Kurashige, 9 January 199 29 // ------------------------------------------- 30 31 #include "G4UserPhysicsListMessenger.hh" 32 33 #include "G4ParticleTable.hh" 34 #include "G4PhysicsListHelper.hh" 35 #include "G4SystemOfUnits.hh" 36 #include "G4Tokenizer.hh" 37 #include "G4UIcmdWithADoubleAndUnit.hh" 38 #include "G4UIcmdWithAString.hh" 39 #include "G4UIcmdWithAnInteger.hh" 40 #include "G4UIcmdWithoutParameter.hh" 41 #include "G4UIdirectory.hh" 42 #include "G4UIparameter.hh" 43 #include "G4VUserPhysicsList.hh" 44 #include "G4ios.hh" 45 46 #include <sstream> 47 48 G4UserPhysicsListMessenger::G4UserPhysicsListM 49 : thePhysicsList(pParticleList) 50 { 51 G4UIparameter* param = nullptr; 52 // /run/particle directory 53 theDirectory = new G4UIdirectory("/run/parti 54 theDirectory->SetGuidance("Commands for G4VU 55 56 // /run/particle/Verbose command 57 verboseCmd = new G4UIcmdWithAnInteger("/run/ 58 verboseCmd->SetGuidance("Set the Verbose lev 59 verboseCmd->SetGuidance(" 0 : Silent (defaul 60 verboseCmd->SetGuidance(" 1 : Display warnin 61 verboseCmd->SetGuidance(" 2 : Display more") 62 verboseCmd->SetParameterName("level", true); 63 verboseCmd->SetDefaultValue(0); 64 verboseCmd->SetRange("level >=0 && level <=3 65 66 // /run/setCut command 67 setCutCmd = new G4UIcmdWithADoubleAndUnit("/ 68 setCutCmd->SetGuidance("Set default cut valu 69 setCutCmd->SetParameterName("cut", false); 70 setCutCmd->SetDefaultValue(1.0); 71 setCutCmd->SetRange("cut >=0.0"); 72 setCutCmd->SetDefaultUnit("mm"); 73 setCutCmd->AvailableForStates(G4State_PreIni 74 75 // /run/setCutForAGivenParticle command 76 setCutForAGivenParticleCmd = new G4UIcommand 77 setCutForAGivenParticleCmd->SetGuidance("Set 78 setCutForAGivenParticleCmd->SetGuidance("Usa 79 param = new G4UIparameter("particleName", 's 80 param->SetParameterCandidates("e- e+ gamma p 81 setCutForAGivenParticleCmd->SetParameter(par 82 param = new G4UIparameter("cut", 'd', false) 83 param->SetDefaultValue("1."); 84 param->SetParameterRange("cut>=0.0"); 85 setCutForAGivenParticleCmd->SetParameter(par 86 param = new G4UIparameter("unit", 's', false 87 param->SetDefaultUnit("mm"); 88 setCutForAGivenParticleCmd->SetParameter(par 89 setCutForAGivenParticleCmd->AvailableForStat 90 91 // /run/getCutForAGivenParticle command 92 getCutForAGivenParticleCmd = new G4UIcmdWith 93 getCutForAGivenParticleCmd->SetGuidance("Get 94 getCutForAGivenParticleCmd->SetGuidance("Usa 95 getCutForAGivenParticleCmd->SetParameterName 96 getCutForAGivenParticleCmd->SetCandidates("e 97 getCutForAGivenParticleCmd->AvailableForStat 98 99 100 // /run/setCutForRegion command 101 setCutRCmd = new G4UIcommand("/run/setCutFor 102 setCutRCmd->SetGuidance("Set cut value for a 103 param = new G4UIparameter("Region", 's', fal 104 setCutRCmd->SetParameter(param); 105 param = new G4UIparameter("cut", 'd', false) 106 param->SetParameterRange("cut >=0.0"); 107 setCutRCmd->SetParameter(param); 108 param = new G4UIparameter("Unit", 's', true) 109 param->SetDefaultValue("mm"); 110 param->SetParameterCandidates(setCutRCmd->Un 111 setCutRCmd->SetParameter(param); 112 setCutRCmd->AvailableForStates(G4State_Idle) 113 114 // /run/particle/DumpList command 115 dumpListCmd = new G4UIcmdWithoutParameter("/ 116 dumpListCmd->SetGuidance("Dump List of parti 117 118 // /run/particle/addProcManager command 119 addProcManCmd = new G4UIcmdWithAString("/run 120 addProcManCmd->SetToBeBroadcasted(false); 121 addProcManCmd->SetGuidance("add process mana 122 addProcManCmd->SetParameterName("particleTyp 123 addProcManCmd->SetDefaultValue(""); 124 addProcManCmd->AvailableForStates(G4State_Pr 125 G4State_Ev 126 127 // /run/particle/buildPhysicsTable command 128 buildPTCmd = new G4UIcmdWithAString("/run/pa 129 buildPTCmd->SetGuidance("build physics table 130 buildPTCmd->SetParameterName("particleType", 131 buildPTCmd->SetDefaultValue(""); 132 buildPTCmd->AvailableForStates(G4State_Init, 133 134 // /run/particle/storePhysicsTable command 135 storeCmd = new G4UIcmdWithAString("/run/part 136 storeCmd->SetGuidance("Store Physics Table") 137 storeCmd->SetGuidance(" Enter directory nam 138 storeCmd->SetParameterName("dirName", true); 139 storeCmd->SetDefaultValue(""); 140 storeCmd->AvailableForStates(G4State_Idle); 141 142 // /run/particle/retrievePhysicsTable comma 143 retrieveCmd = new G4UIcmdWithAString("/run/p 144 retrieveCmd->SetGuidance("Retrieve Physics T 145 retrieveCmd->SetGuidance(" Enter directory 146 retrieveCmd->SetParameterName("dirName", tru 147 retrieveCmd->SetDefaultValue(""); 148 retrieveCmd->AvailableForStates(G4State_PreI 149 150 // /run/particle/setStoredInAscii command 151 asciiCmd = new G4UIcmdWithAnInteger("/run/pa 152 asciiCmd->SetGuidance("Switch on/off ascii m 153 asciiCmd->SetGuidance(" Enter 0(binary) or 154 asciiCmd->SetParameterName("ascii", true); 155 asciiCmd->SetDefaultValue(0); 156 asciiCmd->AvailableForStates(G4State_PreInit 157 asciiCmd->SetRange("ascii ==0 || ascii ==1") 158 159 // Commnad /run/particle/applyCuts comman 160 applyCutsCmd = new G4UIcommand("/run/particl 161 applyCutsCmd->SetGuidance("Set applyCuts fla 162 applyCutsCmd->SetGuidance(" Some EM processe 163 applyCutsCmd->SetGuidance("may generate gamm 164 applyCutsCmd->SetGuidance("below the product 165 applyCutsCmd->SetGuidance("such secondaries 166 applyCutsCmd->SetGuidance("kinetic energies 167 applyCutsCmd->SetGuidance("to the energy dep 168 applyCutsCmd->SetGuidance(" Note that 'apply 169 applyCutsCmd->SetGuidance("e- and e+. If thi 170 applyCutsCmd->SetGuidance("a warning message 171 applyCutsCmd->SetGuidance("ignored."); 172 applyCutsCmd->SetGuidance(" If particle name 173 applyCutsCmd->SetGuidance("gamma, e- and e+. 174 param = new G4UIparameter("Flag", 's', true) 175 param->SetDefaultValue("true"); 176 applyCutsCmd->SetParameter(param); 177 param = new G4UIparameter("Particle", 's', t 178 param->SetDefaultValue("all"); 179 applyCutsCmd->SetParameter(param); 180 applyCutsCmd->AvailableForStates(G4State_Pre 181 182 // /run/particle/dumpCutValues command 183 dumpCutValuesCmd = new G4UIcmdWithAString("/ 184 dumpCutValuesCmd->SetGuidance("Dump a list o 185 dumpCutValuesCmd->SetGuidance("for all regis 186 dumpCutValuesCmd->SetGuidance("Dumping a lis 187 dumpCutValuesCmd->SetGuidance("actual conver 188 dumpCutValuesCmd->SetGuidance( 189 "If you want a list 'immediately', use '/r 190 dumpCutValuesCmd->SetGuidance("list given in 191 dumpCutValuesCmd->SetGuidance( 192 "current list if you have already issued ' 193 dumpCutValuesCmd->SetParameterName("particle 194 dumpCutValuesCmd->SetDefaultValue("all"); 195 dumpCutValuesCmd->AvailableForStates(G4State 196 197 // /run/particle/dumpCutValues command 198 dumpOrdParamCmd = new G4UIcmdWithAnInteger(" 199 dumpOrdParamCmd->SetGuidance("Dump a list of 200 dumpOrdParamCmd->SetParameterName("subtype", 201 dumpOrdParamCmd->SetDefaultValue(-1); 202 dumpOrdParamCmd->AvailableForStates(G4State_ 203 } 204 205 // ------------------------------------------- 206 G4UserPhysicsListMessenger::~G4UserPhysicsList 207 { 208 delete setCutCmd; 209 delete setCutRCmd; 210 delete setCutForAGivenParticleCmd; 211 delete getCutForAGivenParticleCmd; 212 delete verboseCmd; 213 delete dumpListCmd; 214 delete addProcManCmd; 215 delete buildPTCmd; 216 delete storeCmd; 217 delete retrieveCmd; 218 delete asciiCmd; 219 delete applyCutsCmd; 220 delete dumpCutValuesCmd; 221 delete dumpOrdParamCmd; 222 delete theDirectory; 223 } 224 225 // ------------------------------------------- 226 void G4UserPhysicsListMessenger::SetNewValue(G 227 { 228 G4ExceptionDescription ed; 229 if (command == setCutCmd) { 230 G4double newCut = setCutCmd->GetNewDoubleV 231 thePhysicsList->SetDefaultCutValue(newCut) 232 thePhysicsList->SetCuts(); 233 } 234 else if (command == setCutForAGivenParticleC 235 G4String particleName, unit; 236 G4double cut; 237 std::istringstream str(newValue); 238 str >> particleName >> cut >> unit; 239 thePhysicsList->SetCutValue(cut * G4UIcomm 240 } 241 else if (command == getCutForAGivenParticleC 242 G4cout << thePhysicsList->GetCutValue(newV 243 } 244 else if (command == setCutRCmd) { 245 std::istringstream is(newValue); 246 G4String regName; 247 G4String uniName; 248 G4double cVal = -1.0; 249 is >> regName >> cVal >> uniName; 250 if (is.fail()) { 251 ed << "illegal arguments : " << newValue 252 command->CommandFailed(ed); 253 return; 254 } 255 thePhysicsList->SetCutsForRegion(cVal * (s 256 } 257 else if (command == verboseCmd) { 258 thePhysicsList->SetVerboseLevel(verboseCmd 259 } 260 else if (command == dumpListCmd) { 261 thePhysicsList->DumpList(); 262 } 263 else if (command == dumpOrdParamCmd) { 264 G4int stype = dumpOrdParamCmd->GetNewIntVa 265 G4PhysicsListHelper::GetPhysicsListHelper( 266 } 267 else if (command == addProcManCmd) { 268 G4ParticleDefinition* particle = (G4Partic 269 if (particle == nullptr) { 270 ed << " Particle is not found : " << new 271 command->CommandFailed(ed); 272 return; 273 } 274 if (particle->GetProcessManager() != nullp 275 ed << " Particle is not initialized : " 276 command->CommandFailed(ed); 277 return; 278 } 279 thePhysicsList->AddProcessManager(particle 280 } 281 else if (command == buildPTCmd) { 282 G4ParticleDefinition* particle = (G4Partic 283 if (particle == nullptr) { 284 ed << " Particle is not found : " << new 285 command->CommandFailed(ed); 286 return; 287 } 288 thePhysicsList->PreparePhysicsTable(partic 289 thePhysicsList->BuildPhysicsTable(particle 290 } 291 else if (command == storeCmd) { 292 thePhysicsList->StorePhysicsTable(newValue 293 } 294 else if (command == retrieveCmd) { 295 if ((newValue == "OFF") || (newValue == "o 296 thePhysicsList->ResetPhysicsTableRetriev 297 } 298 else { 299 thePhysicsList->SetPhysicsTableRetrieved 300 } 301 } 302 else if (command == asciiCmd) { 303 if (asciiCmd->GetNewIntValue(newValue) == 304 thePhysicsList->ResetStoredInAscii(); 305 } 306 else { 307 thePhysicsList->SetStoredInAscii(); 308 } 309 } 310 else if (command == applyCutsCmd) { 311 G4Tokenizer next(newValue); 312 313 // check 1st argument 314 G4String temp = G4String(next()); 315 G4bool flag = (temp == "true" || temp == " 316 317 // check 2nd argument 318 G4String name = G4String(next()); 319 320 thePhysicsList->SetApplyCuts(flag, name); 321 } 322 else if (command == dumpCutValuesCmd) { 323 thePhysicsList->DumpCutValuesTable(1); 324 } 325 } 326 327 // ------------------------------------------- 328 G4String G4UserPhysicsListMessenger::GetCurren 329 { 330 G4String cv; 331 G4String candidates("none"); 332 auto piter = G4ParticleTable::GetParticleTab 333 334 if (command == setCutCmd) { 335 cv = setCutCmd->ConvertToString(thePhysics 336 } 337 else if (command == verboseCmd) { 338 cv = verboseCmd->ConvertToString(thePhysic 339 } 340 else if (command == addProcManCmd) { 341 // set candidate list 342 piter->reset(); 343 while ((*piter)()) { 344 G4ParticleDefinition* particle = piter-> 345 candidates += " " + particle->GetParticl 346 } 347 addProcManCmd->SetCandidates(candidates); 348 cv = ""; 349 } 350 else if (command == buildPTCmd) { 351 // set candidate list 352 piter->reset(); 353 while ((*piter)()) { 354 G4ParticleDefinition* particle = piter-> 355 candidates += " " + particle->GetParticl 356 } 357 addProcManCmd->SetCandidates(candidates); 358 cv = ""; 359 } 360 else if (command == storeCmd) { 361 cv = thePhysicsList->GetPhysicsTableDirect 362 } 363 else if (command == retrieveCmd) { 364 if (thePhysicsList->IsPhysicsTableRetrieve 365 cv = thePhysicsList->GetPhysicsTableDire 366 } 367 else { 368 cv = "OFF"; 369 } 370 } 371 else if (command == asciiCmd) { 372 if (thePhysicsList->IsStoredInAscii()) { 373 cv = "1"; 374 } 375 else { 376 cv = "0"; 377 } 378 } 379 380 return cv; 381 } 382