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 // 26 // 27 /// \file field/field04/src/F04PhysicsListMess << 28 /// \brief Implementation of the F04PhysicsLis << 29 // 27 // 30 28 31 #include "F04PhysicsListMessenger.hh" << 29 #include "globals.hh" 32 30 >> 31 #include "F04PhysicsListMessenger.hh" 33 #include "F04PhysicsList.hh" 32 #include "F04PhysicsList.hh" 34 33 35 #include "G4DecayTable.hh" << 34 #include <G4UIdirectory.hh> 36 #include "G4ParticleDefinition.hh" << 37 #include "G4ParticleTable.hh" << 38 #include "G4PhaseSpaceDecayChannel.hh" << 39 #include "G4PionRadiativeDecayChannel.hh" << 40 #include "G4VDecayChannel.hh" << 41 #include "globals.hh" << 42 << 43 #include <G4UIcmdWithADoubleAndUnit.hh> << 44 #include <G4UIcmdWithAString.hh> 35 #include <G4UIcmdWithAString.hh> 45 #include <G4UIcmdWithoutParameter.hh> 36 #include <G4UIcmdWithoutParameter.hh> 46 #include <G4UIdirectory.hh> << 37 #include <G4UIcmdWithADoubleAndUnit.hh> 47 38 48 //....oooOO0OOooo........oooOO0OOooo........oo << 39 #include "G4PhaseSpaceDecayChannel.hh" >> 40 #include "G4PionRadiativeDecayChannel.hh" 49 41 50 F04PhysicsListMessenger::F04PhysicsListMesseng << 42 F04PhysicsListMessenger::F04PhysicsListMessenger(F04PhysicsList* pPhys) >> 43 : fPhysicsList(pPhys) 51 { 44 { 52 fDirectory = new G4UIdirectory("/exp/phys/") << 45 fDirectory = new G4UIdirectory("/exp/phys/"); 53 fDirectory->SetGuidance("Control the physics << 46 fDirectory->SetGuidance("Control the physics lists"); 54 47 55 fStepMaxCMD = new G4UIcmdWithADoubleAndUnit( << 48 fGammaCutCMD = new G4UIcmdWithADoubleAndUnit("/exp/phys/gammaCut",this); 56 fStepMaxCMD->SetGuidance("Set max. step leng << 49 fGammaCutCMD->SetGuidance("Set gamma cut"); 57 fStepMaxCMD->SetParameterName("mxStep", fals << 50 fGammaCutCMD->SetParameterName("Gcut",false); 58 fStepMaxCMD->SetUnitCategory("Length"); << 51 fGammaCutCMD->SetUnitCategory("Length"); 59 fStepMaxCMD->SetRange("mxStep>0.0"); << 52 fGammaCutCMD->SetRange("Gcut>0.0"); 60 fStepMaxCMD->SetDefaultUnit("mm"); << 53 fGammaCutCMD->SetDefaultUnit("mm"); 61 fStepMaxCMD->AvailableForStates(G4State_PreI << 54 fGammaCutCMD->AvailableForStates(G4State_PreInit,G4State_Idle); 62 /* << 55 63 fClearPhysicsCMD = new G4UIcmdWithoutPar << 56 fElectCutCMD = new G4UIcmdWithADoubleAndUnit("/exp/phys/electronCut", 64 << 57 this); 65 fClearPhysicsCMD->SetGuidance("Clear the << 58 fElectCutCMD->SetGuidance("Set electron cut"); 66 fClearPhysicsCMD->AvailableForStates(G4S << 59 fElectCutCMD->SetParameterName("Ecut",false); 67 << 60 fElectCutCMD->SetUnitCategory("Length"); 68 fRemovePhysicsCMD = new G4UIcmdWithAStri << 61 fElectCutCMD->SetRange("Ecut>0.0"); 69 fRemovePhysicsCMD-> << 62 fElectCutCMD->SetDefaultUnit("mm"); 70 SetGuidance("Remove a p << 63 fElectCutCMD->AvailableForStates(G4State_PreInit,G4State_Idle); 71 fRemovePhysicsCMD->SetParameterName("PLi << 64 72 fRemovePhysicsCMD->AvailableForStates(G4 << 65 fPosCutCMD = new G4UIcmdWithADoubleAndUnit("/exp/phys/positronCut", 73 */ << 66 this); 74 fDecayDirectory = new G4UIdirectory("/decay/ << 67 fPosCutCMD->SetGuidance("Set positron cut"); 75 fDecayDirectory->SetGuidance("Decay chain co << 68 fPosCutCMD->SetParameterName("Pcut",false); >> 69 fPosCutCMD->SetUnitCategory("Length"); >> 70 fPosCutCMD->SetRange("Pcut>0.0"); >> 71 fPosCutCMD->SetDefaultUnit("mm"); >> 72 fPosCutCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 73 >> 74 fAllCutCMD = new G4UIcmdWithADoubleAndUnit("/exp/phys/allCuts",this); >> 75 fAllCutCMD->SetGuidance("Set cut for all"); >> 76 fAllCutCMD->SetParameterName("cut",false); >> 77 fAllCutCMD->SetUnitCategory("Length"); >> 78 fAllCutCMD->SetRange("cut>0.0"); >> 79 fAllCutCMD->SetDefaultUnit("mm"); >> 80 fAllCutCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 81 >> 82 fStepMaxCMD = new G4UIcmdWithADoubleAndUnit("/exp/phys/stepMax",this); >> 83 fStepMaxCMD->SetGuidance("Set max. step length in the detector"); >> 84 fStepMaxCMD->SetParameterName("mxStep",false); >> 85 fStepMaxCMD->SetUnitCategory("Length"); >> 86 fStepMaxCMD->SetRange("mxStep>0.0"); >> 87 fStepMaxCMD->SetDefaultUnit("mm"); >> 88 fStepMaxCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 89 >> 90 fAddPhysicsCMD = new G4UIcmdWithAString("/exp/phys/addPhysics",this); >> 91 fAddPhysicsCMD->SetGuidance("Add to modular physics list"); >> 92 fAddPhysicsCMD->SetParameterName("PList",false); >> 93 fAddPhysicsCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 94 >> 95 fClearEMPhysicsCMD = new G4UIcmdWithoutParameter("/exp/phys/clearEMPhysics",this); >> 96 fClearEMPhysicsCMD->SetGuidance("Clear the EM physics list"); >> 97 fClearEMPhysicsCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 98 >> 99 fClearHadronPhysicsCMD = new G4UIcmdWithoutParameter("/exp/phys/clearHadronPhysics",this); >> 100 fClearHadronPhysicsCMD->SetGuidance("Clear the Hadron physics list"); >> 101 fClearHadronPhysicsCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 102 >> 103 fRemoveEMPhysicsCMD = new G4UIcmdWithAString("/exp/phys/removeEMPhysics",this); >> 104 fRemoveEMPhysicsCMD->SetGuidance("Remove a physics process from EM Physics List"); >> 105 fRemoveEMPhysicsCMD->SetParameterName("PList",false); >> 106 fRemoveEMPhysicsCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 107 >> 108 fRemoveHadronPhysicsCMD = new G4UIcmdWithAString("/exp/phys/removeHadronPhysics",this); >> 109 fRemoveHadronPhysicsCMD->SetGuidance("Remove a physics process from Hadron Physics List"); >> 110 fRemoveHadronPhysicsCMD->SetParameterName("PList",false); >> 111 fRemoveHadronPhysicsCMD->AvailableForStates(G4State_PreInit,G4State_Idle); >> 112 >> 113 fListCMD = new G4UIcmdWithoutParameter("/exp/phys/list",this); >> 114 fListCMD->SetGuidance("Available Physics Lists"); >> 115 fListCMD->AvailableForStates(G4State_PreInit,G4State_Idle); 76 116 77 fPienuCMD = new G4UIcmdWithoutParameter("/de << 117 fDecayDirectory = new G4UIdirectory("/decay/"); 78 fPienuCMD->SetGuidance("Sets the pi+ to deca << 118 fDecayDirectory->SetGuidance("Decay chain control commands."); 79 119 80 fPimunuCMD = new G4UIcmdWithoutParameter("/d << 120 fPienuCMD = new G4UIcmdWithoutParameter("/decay/pienu", this); 81 fPimunuCMD->SetGuidance("Sets the pi+ to dec << 121 fPienuCMD->SetGuidance("Sets the pi+ to decay into e+, nu"); 82 } << 83 122 84 //....oooOO0OOooo........oooOO0OOooo........oo << 123 fPimunuCMD = new G4UIcmdWithoutParameter("/decay/pimunu", this); >> 124 fPimunuCMD->SetGuidance("Sets the pi+ to decay into mu+, nu"); >> 125 >> 126 } 85 127 86 F04PhysicsListMessenger::~F04PhysicsListMessen 128 F04PhysicsListMessenger::~F04PhysicsListMessenger() 87 { 129 { 88 /* << 130 delete fGammaCutCMD; 89 delete fClearPhysicsCMD; << 131 delete fElectCutCMD; 90 delete fRemovePhysicsCMD; << 132 delete fPosCutCMD; 91 */ << 133 delete fAllCutCMD; 92 delete fPienuCMD; << 134 93 delete fPimunuCMD; << 135 delete fAddPhysicsCMD; 94 } << 136 delete fClearEMPhysicsCMD; >> 137 delete fClearHadronPhysicsCMD; >> 138 delete fRemoveEMPhysicsCMD; >> 139 delete fRemoveHadronPhysicsCMD; 95 140 96 //....oooOO0OOooo........oooOO0OOooo........oo << 141 delete fListCMD; >> 142 >> 143 delete fPienuCMD; >> 144 delete fPimunuCMD; >> 145 } 97 146 98 void F04PhysicsListMessenger::SetNewValue(G4UI << 147 void F04PhysicsListMessenger::SetNewValue(G4UIcommand* command, >> 148 G4String newValue) 99 { 149 { 100 G4ParticleTable* fParticleTable = G4Particle << 101 150 102 if (command == fPienuCMD) { << 151 if (command == fPienuCMD) { 103 G4ParticleDefinition* fParticleDef = fPart << 152 particleTable = G4ParticleTable::GetParticleTable(); 104 G4VDecayChannel* fMode = new G4PhaseSpaceD << 153 particleDef = particleTable->FindParticle("pi+"); 105 auto fTable = new G4DecayTable(); << 154 mode = new G4PhaseSpaceDecayChannel("pi+",0.999983,2,"e+","nu_e"); 106 fTable->Insert(fMode); << 155 table=new G4DecayTable(); 107 fMode = new G4PionRadiativeDecayChannel("p << 156 table->Insert(mode); 108 fTable->Insert(fMode); << 157 mode = new G4PionRadiativeDecayChannel("pi+",0.000017); 109 fParticleDef->SetDecayTable(fTable); << 158 table->Insert(mode); 110 } << 159 particleDef->SetDecayTable(table); 111 << 160 } 112 if (command == fPimunuCMD) { << 161 113 G4ParticleDefinition* fParticleDef = fPart << 162 if (command == fPimunuCMD) { 114 G4VDecayChannel* fMode = new G4PhaseSpaceD << 163 particleTable = G4ParticleTable::GetParticleTable(); 115 auto fTable = new G4DecayTable(); << 164 particleDef = particleTable->FindParticle("pi+"); 116 fTable->Insert(fMode); << 165 mode = new G4PhaseSpaceDecayChannel("pi+",1.000,2,"mu+","nu_mu"); 117 fParticleDef->SetDecayTable(fTable); << 166 table=new G4DecayTable(); 118 } << 167 table->Insert(mode); 119 << 168 particleDef->SetDecayTable(table); 120 else if (command == fStepMaxCMD) { << 169 } 121 fPhysicsList->SetStepMax(fStepMaxCMD->GetN << 170 122 } << 171 if (command == fGammaCutCMD) { 123 /* else if (command == fClearPhysicsCMD) { << 172 fPhysicsList->SetCutForGamma(fGammaCutCMD 124 fPhysicsList->ClearPhysics(); << 173 ->GetNewDoubleValue(newValue)); 125 } << 174 } 126 else if (command == fRemovePhysicsCMD) { << 175 else if (command == fElectCutCMD) { 127 G4String name = newValue; << 176 fPhysicsList->SetCutForElectron(fElectCutCMD 128 fPhysicsList->RemoveFromPhysicsList( << 177 ->GetNewDoubleValue(newValue)); 129 } << 178 } 130 */ << 179 else if (command == fPosCutCMD) { >> 180 fPhysicsList->SetCutForPositron(fPosCutCMD >> 181 ->GetNewDoubleValue(newValue)); >> 182 } >> 183 else if (command == fAllCutCMD) { >> 184 G4double cut = fAllCutCMD->GetNewDoubleValue(newValue); >> 185 fPhysicsList->SetCutForGamma(cut); >> 186 fPhysicsList->SetCutForElectron(cut); >> 187 fPhysicsList->SetCutForPositron(cut); >> 188 } >> 189 else if (command == fStepMaxCMD) { >> 190 fPhysicsList->SetStepMax(fStepMaxCMD >> 191 ->GetNewDoubleValue(newValue)); >> 192 } >> 193 else if (command == fAddPhysicsCMD) { >> 194 G4String name = newValue; >> 195 if (name == "PHYSLIST") { >> 196 char* path = getenv(name); >> 197 if (path) name = G4String(path); >> 198 else { >> 199 G4cout << "### F04PhysicsListMessenger WARNING: " >> 200 << " environment variable PHYSLIST is not defined" >> 201 << G4endl; >> 202 return; >> 203 } >> 204 } >> 205 fPhysicsList->AddPhysicsList(name); >> 206 } >> 207 else if (command == fClearEMPhysicsCMD) { >> 208 fPhysicsList->ClearEMPhysics(); >> 209 } >> 210 else if (command == fClearHadronPhysicsCMD) { >> 211 fPhysicsList->ClearHadronPhysics(); >> 212 } >> 213 else if (command == fRemoveEMPhysicsCMD) { >> 214 G4String name = newValue; >> 215 fPhysicsList->RemoveFromEMPhysicsList(name); >> 216 } >> 217 else if (command == fRemoveHadronPhysicsCMD) { >> 218 G4String name = newValue; >> 219 fPhysicsList->RemoveFromHadronPhysicsList(name); >> 220 } >> 221 else if (command == fListCMD) { >> 222 fPhysicsList->List(); >> 223 } 131 } 224 } 132 225