Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4ProcessManagerMessenger class implementat 26 // G4ProcessManagerMessenger class implementation 27 // 27 // 28 // Description: 28 // Description: 29 // This is a messenger class to interface t 29 // This is a messenger class to interface to exchange information 30 // between ProcessManagerand UI. 30 // between ProcessManagerand UI. 31 // 31 // 32 // Author: H.Kurashige, 13 June 1997 32 // Author: H.Kurashige, 13 June 1997 33 //-------------------------------------------- 33 //--------------------------------------------------------------------- 34 34 35 #include "G4UImanager.hh" 35 #include "G4UImanager.hh" 36 #include "G4UIdirectory.hh" 36 #include "G4UIdirectory.hh" 37 #include "G4UIcmdWithoutParameter.hh" 37 #include "G4UIcmdWithoutParameter.hh" 38 #include "G4UIcmdWithAnInteger.hh" 38 #include "G4UIcmdWithAnInteger.hh" 39 39 40 #include "G4VProcess.hh" 40 #include "G4VProcess.hh" 41 #include "G4ProcessManager.hh" 41 #include "G4ProcessManager.hh" 42 #include "G4ParticleTable.hh" 42 #include "G4ParticleTable.hh" 43 43 44 #include "G4ProcessManagerMessenger.hh" 44 #include "G4ProcessManagerMessenger.hh" 45 #include "G4ios.hh" // Include 45 #include "G4ios.hh" // Include from 'system' 46 #include <iomanip> // Include 46 #include <iomanip> // Include from 'system' 47 #include <sstream> 47 #include <sstream> 48 48 49 //-------------------------------------------- 49 //--------------------------------------------------------------------- 50 G4ProcessManagerMessenger::G4ProcessManagerMes 50 G4ProcessManagerMessenger::G4ProcessManagerMessenger(G4ParticleTable* pTable) 51 : theParticleTable(pTable) 51 : theParticleTable(pTable) 52 { 52 { 53 if ( theParticleTable == nullptr) 53 if ( theParticleTable == nullptr) 54 theParticleTable = G4ParticleTable::GetPar 54 theParticleTable = G4ParticleTable::GetParticleTable(); 55 55 56 // Command /particle/process 56 // Command /particle/process 57 thisDirectory = new G4UIdirectory("/particle 57 thisDirectory = new G4UIdirectory("/particle/process/"); 58 thisDirectory->SetGuidance("Process Manager 58 thisDirectory->SetGuidance("Process Manager control commands."); 59 59 60 // Command /particle/process/dump 60 // Command /particle/process/dump 61 dumpCmd = new G4UIcmdWithAnInteger("/particl 61 dumpCmd = new G4UIcmdWithAnInteger("/particle/process/dump",this); 62 dumpCmd->SetGuidance("dump process manager o 62 dumpCmd->SetGuidance("dump process manager or process information"); 63 dumpCmd->SetGuidance(" dump [process index] 63 dumpCmd->SetGuidance(" dump [process index]"); 64 dumpCmd->SetGuidance(" process index: -1 f 64 dumpCmd->SetGuidance(" process index: -1 for process manager"); 65 dumpCmd->SetParameterName("index", true); 65 dumpCmd->SetParameterName("index", true); 66 dumpCmd->SetDefaultValue(-1); 66 dumpCmd->SetDefaultValue(-1); 67 67 68 // Command /particle/process/verbose 68 // Command /particle/process/verbose 69 verboseCmd = new G4UIcommand("/particle/proc 69 verboseCmd = new G4UIcommand("/particle/process/verbose",this); 70 verboseCmd->SetGuidance("Set Verbose Level f 70 verboseCmd->SetGuidance("Set Verbose Level for Process or Process Manager"); 71 verboseCmd->SetGuidance(" Verbose [Verbose] 71 verboseCmd->SetGuidance(" Verbose [Verbose] [process index]"); 72 verboseCmd->SetGuidance(" process index: - 72 verboseCmd->SetGuidance(" process index: -1 for process manager"); 73 G4UIparameter* param = new G4UIparameter("Ve 73 G4UIparameter* param = new G4UIparameter("Verbose",'i',true); 74 param->SetDefaultValue(1); 74 param->SetDefaultValue(1); 75 verboseCmd->SetParameter(param); 75 verboseCmd->SetParameter(param); 76 param = new G4UIparameter("index",'i',true); 76 param = new G4UIparameter("index",'i',true); 77 param->SetDefaultValue(-1); 77 param->SetDefaultValue(-1); 78 verboseCmd->SetParameter(param); 78 verboseCmd->SetParameter(param); 79 verboseCmd->AvailableForStates(G4State_PreIn 79 verboseCmd->AvailableForStates(G4State_PreInit,G4State_Init,G4State_Idle,G4State_GeomClosed,G4State_EventProc); 80 80 81 // Command /particle/process/activate 81 // Command /particle/process/activate 82 activateCmd = new G4UIcmdWithAnInteger("/par 82 activateCmd = new G4UIcmdWithAnInteger("/particle/process/activate",this); 83 activateCmd->SetGuidance("Activate process 83 activateCmd->SetGuidance("Activate process "); 84 activateCmd->SetGuidance(" Activate [process 84 activateCmd->SetGuidance(" Activate [process index]"); 85 activateCmd->SetParameterName("index", false 85 activateCmd->SetParameterName("index", false); 86 activateCmd->SetDefaultValue(0); 86 activateCmd->SetDefaultValue(0); 87 activateCmd->SetRange("index >=0"); 87 activateCmd->SetRange("index >=0"); 88 activateCmd->AvailableForStates(G4State_Idle 88 activateCmd->AvailableForStates(G4State_Idle); 89 89 90 // Command /particle/process/inactivate 90 // Command /particle/process/inactivate 91 inactivateCmd = new G4UIcmdWithAnInteger("/p 91 inactivateCmd = new G4UIcmdWithAnInteger("/particle/process/inactivate",this); 92 inactivateCmd->SetGuidance("Inactivate proce 92 inactivateCmd->SetGuidance("Inactivate process "); 93 inactivateCmd->SetGuidance(" inactivate [pro 93 inactivateCmd->SetGuidance(" inactivate [process index]"); 94 inactivateCmd->SetParameterName("index", fal 94 inactivateCmd->SetParameterName("index", false); 95 inactivateCmd->SetDefaultValue(0); 95 inactivateCmd->SetDefaultValue(0); 96 inactivateCmd->SetRange("index >=0"); 96 inactivateCmd->SetRange("index >=0"); 97 inactivateCmd->AvailableForStates(G4State_Id 97 inactivateCmd->AvailableForStates(G4State_Idle); 98 } 98 } 99 99 100 //-------------------------------------------- 100 //--------------------------------------------------------------------- 101 G4ProcessManagerMessenger::~G4ProcessManagerMe 101 G4ProcessManagerMessenger::~G4ProcessManagerMessenger() 102 { 102 { 103 delete activateCmd; 103 delete activateCmd; 104 delete inactivateCmd; 104 delete inactivateCmd; 105 delete verboseCmd; 105 delete verboseCmd; 106 delete dumpCmd; 106 delete dumpCmd; 107 delete thisDirectory; 107 delete thisDirectory; 108 } 108 } 109 109 110 //-------------------------------------------- 110 //--------------------------------------------------------------------- 111 const G4ParticleDefinition* G4ProcessManagerMe 111 const G4ParticleDefinition* G4ProcessManagerMessenger::SetCurrentParticle() 112 { 112 { 113 // access to selected particle in the G4Part 113 // access to selected particle in the G4ParticleTable 114 currentParticle = theParticleTable->GetSelec 114 currentParticle = theParticleTable->GetSelectedParticle(); 115 if (currentParticle == nullptr) 115 if (currentParticle == nullptr) 116 { 116 { 117 theManager = nullptr; 117 theManager = nullptr; 118 G4cout << "G4ProcessManagerMessenger::SetC 118 G4cout << "G4ProcessManagerMessenger::SetCurrentParticle() - not selected"; 119 } 119 } 120 else 120 else 121 { 121 { 122 theManager = currentParticle->GetProcessMa 122 theManager = currentParticle->GetProcessManager(); 123 theProcessList = theManager->GetProcessLis 123 theProcessList = theManager->GetProcessList(); 124 } 124 } 125 return currentParticle; 125 return currentParticle; 126 } 126 } 127 127 128 //-------------------------------------------- 128 //--------------------------------------------------------------------- 129 void G4ProcessManagerMessenger::SetNewValue(G4 129 void G4ProcessManagerMessenger::SetNewValue(G4UIcommand* command, G4String newValue) 130 { 130 { 131 G4ExceptionDescription ed; 131 G4ExceptionDescription ed; 132 if (SetCurrentParticle() == nullptr) 132 if (SetCurrentParticle() == nullptr) 133 { 133 { 134 ed << "Particle is not selected yet !! C 134 ed << "Particle is not selected yet !! Command ignored."; 135 command->CommandFailed(ed); 135 command->CommandFailed(ed); 136 return; 136 return; 137 } 137 } 138 if( command == dumpCmd ) 138 if( command == dumpCmd ) 139 { 139 { 140 // Command /particle/process/dump 140 // Command /particle/process/dump 141 G4int index = dumpCmd->GetNewIntValue(newV 141 G4int index = dumpCmd->GetNewIntValue(newValue); 142 if (index <0) 142 if (index <0) 143 { 143 { 144 theManager->DumpInfo(); 144 theManager->DumpInfo(); 145 } 145 } 146 else if ( index < theManager->GetProcessLi 146 else if ( index < theManager->GetProcessListLength()) 147 { 147 { 148 currentProcess = (*theProcessList)(inde 148 currentProcess = (*theProcessList)(index); 149 if (currentProcess == nullptr) 149 if (currentProcess == nullptr) 150 { 150 { 151 ed << " no process at index of " << index 151 ed << " no process at index of " << index 152 << " in the Process Vector"; 152 << " in the Process Vector"; 153 command->CommandFailed(ed); 153 command->CommandFailed(ed); 154 } 154 } 155 else 155 else 156 { 156 { 157 currentProcess->DumpInfo(); 157 currentProcess->DumpInfo(); 158 } 158 } 159 } 159 } 160 else 160 else 161 { 161 { 162 ed << " illegal index !!! "; 162 ed << " illegal index !!! "; 163 command->CommandFailed(ed); 163 command->CommandFailed(ed); 164 currentProcess = nullptr; 164 currentProcess = nullptr; 165 } 165 } 166 166 167 } 167 } 168 else if( command==activateCmd ) 168 else if( command==activateCmd ) 169 { 169 { 170 // Command /particle/process/activate 170 // Command /particle/process/activate 171 theManager->SetProcessActivation(activateC 171 theManager->SetProcessActivation(activateCmd->GetNewIntValue(newValue), true); 172 G4UImanager::GetUIpointer()->ApplyCommand( 172 G4UImanager::GetUIpointer()->ApplyCommand("/run/physicsModified"); 173 173 174 } 174 } 175 else if( command==inactivateCmd ) 175 else if( command==inactivateCmd ) 176 { 176 { 177 // Command /particle/process/inactivate 177 // Command /particle/process/inactivate 178 theManager->SetProcessActivation(inactivat 178 theManager->SetProcessActivation(inactivateCmd->GetNewIntValue(newValue), false); 179 G4UImanager::GetUIpointer()->ApplyCommand( 179 G4UImanager::GetUIpointer()->ApplyCommand("/run/physicsModified"); 180 180 181 } 181 } 182 else if( command==verboseCmd ) 182 else if( command==verboseCmd ) 183 { 183 { 184 // Command /particle/process/Verbose 184 // Command /particle/process/Verbose 185 // inputstream for newValues 185 // inputstream for newValues 186 const char* temp = (const char*)(newValue) 186 const char* temp = (const char*)(newValue); 187 std::istringstream is((char*)temp); 187 std::istringstream is((char*)temp); 188 G4int Verbose, index; 188 G4int Verbose, index; 189 is >>Verbose >>index; 189 is >>Verbose >>index; 190 if (index <0) 190 if (index <0) 191 { 191 { 192 theManager->SetVerboseLevel(Verbose); 192 theManager->SetVerboseLevel(Verbose); 193 193 194 } 194 } 195 else if ( index < theManager->GetProcessLi 195 else if ( index < theManager->GetProcessListLength()) 196 { 196 { 197 currentProcess = (*theProcessList)(inde 197 currentProcess = (*theProcessList)(index); 198 if (currentProcess == nullptr) 198 if (currentProcess == nullptr) 199 { 199 { 200 ed << " no process at index of " << index 200 ed << " no process at index of " << index 201 << " in the Process Vector"; 201 << " in the Process Vector"; 202 command->CommandFailed(ed); 202 command->CommandFailed(ed); 203 } 203 } 204 else 204 else 205 { 205 { 206 currentProcess->SetVerboseLevel(Verbose); 206 currentProcess->SetVerboseLevel(Verbose); 207 } 207 } 208 } 208 } 209 else 209 else 210 { 210 { 211 ed << " illegal index !!! "; 211 ed << " illegal index !!! "; 212 command->CommandFailed(ed); 212 command->CommandFailed(ed); 213 currentProcess = nullptr; 213 currentProcess = nullptr; 214 } 214 } 215 } 215 } 216 } 216 } 217 217 218 //-------------------------------------------- 218 //--------------------------------------------------------------------- 219 G4String G4ProcessManagerMessenger::GetCurrent 219 G4String G4ProcessManagerMessenger::GetCurrentValue(G4UIcommand* command) 220 { 220 { 221 if(SetCurrentParticle() == nullptr) return " 221 if(SetCurrentParticle() == nullptr) return ""; 222 222 223 if( command==verboseCmd ) 223 if( command==verboseCmd ) 224 { 224 { 225 // Command /particle/process/Verbose 225 // Command /particle/process/Verbose 226 return verboseCmd->ConvertToString(theMana 226 return verboseCmd->ConvertToString(theManager->GetVerboseLevel()); 227 } 227 } 228 else 228 else 229 { 229 { 230 return ""; 230 return ""; 231 } 231 } 232 } 232 } 233 233