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 // ------------------------------------------- 27 // -------------------------------------------------------------- 28 // GEANT 4 - Underground Dark Matter Detecto 28 // GEANT 4 - Underground Dark Matter Detector Advanced Example 29 // 29 // 30 // For information related to this code c 30 // For information related to this code contact: Alex Howard 31 // e-mail: alexander.howard@cern.ch 31 // e-mail: alexander.howard@cern.ch 32 // ------------------------------------------- 32 // -------------------------------------------------------------- 33 // Comments 33 // Comments 34 // 34 // 35 // Underground Advanced 35 // Underground Advanced 36 // by A. Howard and H. Araujo 36 // by A. Howard and H. Araujo 37 // (27th November 2001) 37 // (27th November 2001) 38 // 38 // 39 // ParticleSourceMessenger program 39 // ParticleSourceMessenger program 40 // ------------------------------------------- 40 // -------------------------------------------------------------- 41 ////////////////////////////////////////////// 41 ////////////////////////////////////////////////////////////////////////////// 42 // This particle source is a shortened version 42 // This particle source is a shortened version of G4GeneralParticleSource by 43 // C Ferguson, F Lei & P Truscott (University 43 // C Ferguson, F Lei & P Truscott (University of Southampton / DERA), with 44 // some minor modifications. 44 // some minor modifications. 45 ////////////////////////////////////////////// 45 ////////////////////////////////////////////////////////////////////////////// 46 46 47 #include <fstream> << 48 #include <iomanip> << 49 << 50 #include "DMXParticleSourceMessenger.hh" 47 #include "DMXParticleSourceMessenger.hh" 51 #include "DMXParticleSource.hh" 48 #include "DMXParticleSource.hh" 52 49 53 #include "G4SystemOfUnits.hh" << 54 #include "G4Geantino.hh" 50 #include "G4Geantino.hh" 55 #include "G4ThreeVector.hh" 51 #include "G4ThreeVector.hh" 56 #include "G4ParticleTable.hh" 52 #include "G4ParticleTable.hh" 57 #include "G4IonTable.hh" << 58 #include "G4UIdirectory.hh" 53 #include "G4UIdirectory.hh" 59 #include "G4UIcmdWithoutParameter.hh" 54 #include "G4UIcmdWithoutParameter.hh" 60 #include "G4UIcmdWithAString.hh" 55 #include "G4UIcmdWithAString.hh" 61 #include "G4UIcmdWithADoubleAndUnit.hh" 56 #include "G4UIcmdWithADoubleAndUnit.hh" 62 #include "G4UIcmdWith3Vector.hh" 57 #include "G4UIcmdWith3Vector.hh" 63 #include "G4UIcmdWith3VectorAndUnit.hh" 58 #include "G4UIcmdWith3VectorAndUnit.hh" 64 #include "G4UIcmdWithAnInteger.hh" 59 #include "G4UIcmdWithAnInteger.hh" 65 #include "G4UIcmdWithADouble.hh" 60 #include "G4UIcmdWithADouble.hh" 66 #include "G4UIcmdWithABool.hh" 61 #include "G4UIcmdWithABool.hh" 67 #include "G4ios.hh" 62 #include "G4ios.hh" >> 63 #include <fstream> >> 64 #include <iomanip> 68 #include "G4Tokenizer.hh" 65 #include "G4Tokenizer.hh" 69 66 70 ////////////////////////////////////////////// 67 /////////////////////////////////////////////////////////////////////////////// 71 DMXParticleSourceMessenger::DMXParticleSourceM 68 DMXParticleSourceMessenger::DMXParticleSourceMessenger 72 (DMXParticleSource *fPtclGun) : fParticleGun(f 69 (DMXParticleSource *fPtclGun) : fParticleGun(fPtclGun),fShootIon(false) { 73 70 74 particleTable = G4ParticleTable::GetParticle 71 particleTable = G4ParticleTable::GetParticleTable(); 75 72 76 // create directory 73 // create directory 77 gunDirectory = new G4UIdirectory("/dmx/gun/" 74 gunDirectory = new G4UIdirectory("/dmx/gun/"); 78 gunDirectory->SetGuidance("Particle Source c 75 gunDirectory->SetGuidance("Particle Source control commands."); 79 76 80 // list available particles 77 // list available particles 81 listCmd = new G4UIcmdWithoutParameter("/dmx/ 78 listCmd = new G4UIcmdWithoutParameter("/dmx/gun/List",this); 82 listCmd->SetGuidance("List available particl 79 listCmd->SetGuidance("List available particles."); 83 listCmd->SetGuidance(" Invoke G4ParticleTabl 80 listCmd->SetGuidance(" Invoke G4ParticleTable."); 84 81 85 // set particle 82 // set particle 86 particleCmd = new G4UIcmdWithAString("/dmx/g 83 particleCmd = new G4UIcmdWithAString("/dmx/gun/particle",this); 87 particleCmd->SetGuidance("Set particle to be 84 particleCmd->SetGuidance("Set particle to be generated."); 88 particleCmd->SetGuidance(" (geantino is defa 85 particleCmd->SetGuidance(" (geantino is default)"); 89 particleCmd->SetGuidance(" (ion can be speci 86 particleCmd->SetGuidance(" (ion can be specified for shooting ions)"); 90 particleCmd->SetParameterName("particleName" 87 particleCmd->SetParameterName("particleName",true); 91 particleCmd->SetDefaultValue("geantino"); 88 particleCmd->SetDefaultValue("geantino"); 92 G4String candidateList; 89 G4String candidateList; 93 G4int nPtcl = particleTable->entries(); 90 G4int nPtcl = particleTable->entries(); 94 for(G4int i=0;i<nPtcl;i++) 91 for(G4int i=0;i<nPtcl;i++) 95 { 92 { 96 candidateList += particleTable->GetParti 93 candidateList += particleTable->GetParticleName(i); 97 candidateList += " "; 94 candidateList += " "; 98 } 95 } 99 candidateList += "ion "; 96 candidateList += "ion "; 100 particleCmd->SetCandidates(candidateList); 97 particleCmd->SetCandidates(candidateList); 101 98 102 99 103 // particle direction 100 // particle direction 104 directionCmd = new G4UIcmdWith3Vector("/dmx/ 101 directionCmd = new G4UIcmdWith3Vector("/dmx/gun/direction",this); 105 directionCmd->SetGuidance("Set momentum dire 102 directionCmd->SetGuidance("Set momentum direction."); 106 directionCmd->SetGuidance("Direction needs n 103 directionCmd->SetGuidance("Direction needs not to be a unit vector."); 107 directionCmd->SetParameterName("Px","Py","Pz 104 directionCmd->SetParameterName("Px","Py","Pz",true,true); 108 directionCmd->SetRange("Px != 0 || Py != 0 | 105 directionCmd->SetRange("Px != 0 || Py != 0 || Pz != 0"); 109 106 110 // particle energy 107 // particle energy 111 energyCmd = new G4UIcmdWithADoubleAndUnit("/ 108 energyCmd = new G4UIcmdWithADoubleAndUnit("/dmx/gun/energy",this); 112 energyCmd->SetGuidance("Set kinetic energy." 109 energyCmd->SetGuidance("Set kinetic energy."); 113 energyCmd->SetParameterName("Energy",true,tr 110 energyCmd->SetParameterName("Energy",true,true); 114 energyCmd->SetDefaultUnit("GeV"); 111 energyCmd->SetDefaultUnit("GeV"); 115 //energyCmd->SetUnitCategory("Energy"); 112 //energyCmd->SetUnitCategory("Energy"); 116 //energyCmd->SetUnitCandidates("eV keV MeV G 113 //energyCmd->SetUnitCandidates("eV keV MeV GeV TeV"); 117 114 118 positionCmd = new G4UIcmdWith3VectorAndUnit( 115 positionCmd = new G4UIcmdWith3VectorAndUnit("/dmx/gun/position",this); 119 positionCmd->SetGuidance("Set starting posit 116 positionCmd->SetGuidance("Set starting position of the particle."); 120 positionCmd->SetParameterName("X","Y","Z",tr 117 positionCmd->SetParameterName("X","Y","Z",true,true); 121 positionCmd->SetDefaultUnit("cm"); 118 positionCmd->SetDefaultUnit("cm"); 122 //positionCmd->SetUnitCategory("Length"); 119 //positionCmd->SetUnitCategory("Length"); 123 //positionCmd->SetUnitCandidates("microm mm 120 //positionCmd->SetUnitCandidates("microm mm cm m km"); 124 121 125 122 126 // ion 123 // ion 127 ionCmd = new G4UIcommand("/dmx/gun/ion",this 124 ionCmd = new G4UIcommand("/dmx/gun/ion",this); 128 ionCmd->SetGuidance("Set properties of ion t 125 ionCmd->SetGuidance("Set properties of ion to be generated."); 129 ionCmd->SetGuidance("[usage] /gun/ion Z A Q 126 ionCmd->SetGuidance("[usage] /gun/ion Z A Q E"); 130 ionCmd->SetGuidance(" Z:(int) AtomicN 127 ionCmd->SetGuidance(" Z:(int) AtomicNumber"); 131 ionCmd->SetGuidance(" A:(int) AtomicM 128 ionCmd->SetGuidance(" A:(int) AtomicMass"); 132 ionCmd->SetGuidance(" Q:(int) Charge 129 ionCmd->SetGuidance(" Q:(int) Charge of Ion (in unit of e)"); 133 ionCmd->SetGuidance(" E:(double) Exci 130 ionCmd->SetGuidance(" E:(double) Excitation energy (in keV)"); 134 131 135 G4UIparameter* param; 132 G4UIparameter* param; 136 param = new G4UIparameter("Z",'i',false); 133 param = new G4UIparameter("Z",'i',false); 137 param->SetDefaultValue("1"); 134 param->SetDefaultValue("1"); 138 ionCmd->SetParameter(param); 135 ionCmd->SetParameter(param); 139 param = new G4UIparameter("A",'i',false); 136 param = new G4UIparameter("A",'i',false); 140 param->SetDefaultValue("1"); 137 param->SetDefaultValue("1"); 141 ionCmd->SetParameter(param); 138 ionCmd->SetParameter(param); 142 param = new G4UIparameter("Q",'i',true); 139 param = new G4UIparameter("Q",'i',true); 143 param->SetDefaultValue("0"); 140 param->SetDefaultValue("0"); 144 ionCmd->SetParameter(param); 141 ionCmd->SetParameter(param); 145 param = new G4UIparameter("E",'d',true); 142 param = new G4UIparameter("E",'d',true); 146 param->SetDefaultValue("0.0"); 143 param->SetDefaultValue("0.0"); 147 ionCmd->SetParameter(param); 144 ionCmd->SetParameter(param); 148 145 149 146 150 // source distribution type 147 // source distribution type 151 typeCmd = new G4UIcmdWithAString("/dmx/gun/t 148 typeCmd = new G4UIcmdWithAString("/dmx/gun/type",this); 152 typeCmd->SetGuidance("Sets source distributi 149 typeCmd->SetGuidance("Sets source distribution type."); 153 typeCmd->SetGuidance("Either Point or Volume 150 typeCmd->SetGuidance("Either Point or Volume"); 154 typeCmd->SetParameterName("DisType",true,tru 151 typeCmd->SetParameterName("DisType",true,true); 155 typeCmd->SetDefaultValue("Point"); 152 typeCmd->SetDefaultValue("Point"); 156 typeCmd->SetCandidates("Point Volume"); 153 typeCmd->SetCandidates("Point Volume"); 157 154 158 // source shape 155 // source shape 159 shapeCmd = new G4UIcmdWithAString("/dmx/gun/ 156 shapeCmd = new G4UIcmdWithAString("/dmx/gun/shape",this); 160 shapeCmd->SetGuidance("Sets source shape typ 157 shapeCmd->SetGuidance("Sets source shape type."); 161 shapeCmd->SetParameterName("Shape",true,true 158 shapeCmd->SetParameterName("Shape",true,true); 162 shapeCmd->SetDefaultValue("NULL"); 159 shapeCmd->SetDefaultValue("NULL"); 163 shapeCmd->SetCandidates("Sphere Cylinder"); 160 shapeCmd->SetCandidates("Sphere Cylinder"); 164 161 165 // centre coordinates 162 // centre coordinates 166 centreCmd = new G4UIcmdWith3VectorAndUnit("/ 163 centreCmd = new G4UIcmdWith3VectorAndUnit("/dmx/gun/centre",this); 167 centreCmd->SetGuidance("Set centre coordinat 164 centreCmd->SetGuidance("Set centre coordinates of source."); 168 centreCmd->SetParameterName("X","Y","Z",true 165 centreCmd->SetParameterName("X","Y","Z",true,true); 169 centreCmd->SetDefaultUnit("cm"); 166 centreCmd->SetDefaultUnit("cm"); 170 centreCmd->SetUnitCandidates("nm um mm cm m 167 centreCmd->SetUnitCandidates("nm um mm cm m km"); 171 168 172 // half height of source 169 // half height of source 173 halfzCmd = new G4UIcmdWithADoubleAndUnit("/d 170 halfzCmd = new G4UIcmdWithADoubleAndUnit("/dmx/gun/halfz",this); 174 halfzCmd->SetGuidance("Set z half length of 171 halfzCmd->SetGuidance("Set z half length of source."); 175 halfzCmd->SetParameterName("Halfz",true,true 172 halfzCmd->SetParameterName("Halfz",true,true); 176 halfzCmd->SetDefaultUnit("cm"); 173 halfzCmd->SetDefaultUnit("cm"); 177 halfzCmd->SetUnitCandidates("nm um mm cm m k 174 halfzCmd->SetUnitCandidates("nm um mm cm m km"); 178 175 179 // radius of source 176 // radius of source 180 radiusCmd = new G4UIcmdWithADoubleAndUnit("/ 177 radiusCmd = new G4UIcmdWithADoubleAndUnit("/dmx/gun/radius",this); 181 radiusCmd->SetGuidance("Set radius of source 178 radiusCmd->SetGuidance("Set radius of source."); 182 radiusCmd->SetParameterName("Radius",true,tr 179 radiusCmd->SetParameterName("Radius",true,true); 183 radiusCmd->SetDefaultUnit("cm"); 180 radiusCmd->SetDefaultUnit("cm"); 184 radiusCmd->SetUnitCandidates("nm um mm cm m 181 radiusCmd->SetUnitCandidates("nm um mm cm m km"); 185 182 186 // confine to volume 183 // confine to volume 187 confineCmd = new G4UIcmdWithAString("/dmx/gu 184 confineCmd = new G4UIcmdWithAString("/dmx/gun/confine",this); 188 confineCmd->SetGuidance("Confine source to v 185 confineCmd->SetGuidance("Confine source to volume (NULL to unset)."); 189 confineCmd->SetGuidance("usage: confine VolN 186 confineCmd->SetGuidance("usage: confine VolName"); 190 confineCmd->SetParameterName("VolName",true, 187 confineCmd->SetParameterName("VolName",true,true); 191 confineCmd->SetDefaultValue("NULL"); 188 confineCmd->SetDefaultValue("NULL"); 192 189 193 // angular distribution 190 // angular distribution 194 angtypeCmd = new G4UIcmdWithAString("/dmx/gu 191 angtypeCmd = new G4UIcmdWithAString("/dmx/gun/angtype",this); 195 angtypeCmd->SetGuidance("Sets angular source 192 angtypeCmd->SetGuidance("Sets angular source distribution type"); 196 angtypeCmd->SetGuidance("Possible variables 193 angtypeCmd->SetGuidance("Possible variables are: iso direction"); 197 angtypeCmd->SetParameterName("AngDis",true,t 194 angtypeCmd->SetParameterName("AngDis",true,true); 198 angtypeCmd->SetDefaultValue("iso"); 195 angtypeCmd->SetDefaultValue("iso"); 199 angtypeCmd->SetCandidates("iso direction"); 196 angtypeCmd->SetCandidates("iso direction"); 200 197 201 // energy distribution 198 // energy distribution 202 energytypeCmd = new G4UIcmdWithAString("/dmx 199 energytypeCmd = new G4UIcmdWithAString("/dmx/gun/energytype",this); 203 energytypeCmd->SetGuidance("Sets energy dist 200 energytypeCmd->SetGuidance("Sets energy distribution type"); 204 energytypeCmd->SetGuidance("Possible variabl 201 energytypeCmd->SetGuidance("Possible variables are: Mono"); 205 energytypeCmd->SetParameterName("EnergyDis", 202 energytypeCmd->SetParameterName("EnergyDis",true,true); 206 energytypeCmd->SetDefaultValue("Mono"); 203 energytypeCmd->SetDefaultValue("Mono"); 207 energytypeCmd->SetCandidates("Mono"); 204 energytypeCmd->SetCandidates("Mono"); 208 205 209 // verbosity 206 // verbosity 210 verbosityCmd = new G4UIcmdWithAnInteger("/dm 207 verbosityCmd = new G4UIcmdWithAnInteger("/dmx/gun/verbose",this); 211 verbosityCmd->SetGuidance("Set Verbose level 208 verbosityCmd->SetGuidance("Set Verbose level for gun"); 212 verbosityCmd->SetGuidance(" 0 : Silent"); 209 verbosityCmd->SetGuidance(" 0 : Silent"); 213 verbosityCmd->SetGuidance(" 1 : Limited info 210 verbosityCmd->SetGuidance(" 1 : Limited information"); 214 verbosityCmd->SetGuidance(" 2 : Detailed inf 211 verbosityCmd->SetGuidance(" 2 : Detailed information"); 215 verbosityCmd->SetParameterName("level",false 212 verbosityCmd->SetParameterName("level",false); 216 verbosityCmd->SetRange("level>=0 && level <= 213 verbosityCmd->SetRange("level>=0 && level <=2"); 217 214 218 } 215 } 219 216 220 217 221 DMXParticleSourceMessenger::~DMXParticleSource 218 DMXParticleSourceMessenger::~DMXParticleSourceMessenger() { 222 219 223 delete typeCmd; 220 delete typeCmd; 224 delete shapeCmd; 221 delete shapeCmd; 225 delete centreCmd; 222 delete centreCmd; 226 delete halfzCmd; 223 delete halfzCmd; 227 delete radiusCmd; 224 delete radiusCmd; 228 delete confineCmd; 225 delete confineCmd; 229 delete angtypeCmd; 226 delete angtypeCmd; 230 delete energytypeCmd; 227 delete energytypeCmd; 231 delete verbosityCmd; 228 delete verbosityCmd; 232 delete ionCmd; 229 delete ionCmd; 233 delete particleCmd; 230 delete particleCmd; 234 delete positionCmd; 231 delete positionCmd; 235 delete directionCmd; 232 delete directionCmd; 236 delete energyCmd; 233 delete energyCmd; 237 delete listCmd; 234 delete listCmd; 238 235 239 delete gunDirectory; 236 delete gunDirectory; 240 } 237 } 241 238 242 void DMXParticleSourceMessenger::SetNewValue 239 void DMXParticleSourceMessenger::SetNewValue 243 (G4UIcommand *command, G4String newValues) 240 (G4UIcommand *command, G4String newValues) { 244 241 245 if(command == typeCmd) 242 if(command == typeCmd) 246 fParticleGun->SetPosDisType(newValues); 243 fParticleGun->SetPosDisType(newValues); 247 244 248 else if(command == shapeCmd) 245 else if(command == shapeCmd) 249 fParticleGun->SetPosDisShape(newValues); 246 fParticleGun->SetPosDisShape(newValues); 250 247 251 else if(command == centreCmd) 248 else if(command == centreCmd) 252 fParticleGun->SetCentreCoords(centreCmd->G 249 fParticleGun->SetCentreCoords(centreCmd->GetNew3VectorValue(newValues)); 253 250 254 else if(command == halfzCmd) 251 else if(command == halfzCmd) 255 fParticleGun->SetHalfZ(halfzCmd->GetNewDou 252 fParticleGun->SetHalfZ(halfzCmd->GetNewDoubleValue(newValues)); 256 253 257 else if(command == radiusCmd) 254 else if(command == radiusCmd) 258 fParticleGun->SetRadius(radiusCmd->GetNewD 255 fParticleGun->SetRadius(radiusCmd->GetNewDoubleValue(newValues)); 259 256 260 else if(command == angtypeCmd) 257 else if(command == angtypeCmd) 261 fParticleGun->SetAngDistType(newValues); 258 fParticleGun->SetAngDistType(newValues); 262 259 263 else if(command == confineCmd) 260 else if(command == confineCmd) 264 fParticleGun->ConfineSourceToVolume(newVal 261 fParticleGun->ConfineSourceToVolume(newValues); 265 262 266 else if(command == energytypeCmd) 263 else if(command == energytypeCmd) 267 fParticleGun->SetEnergyDisType(newValues); 264 fParticleGun->SetEnergyDisType(newValues); 268 265 269 else if(command == verbosityCmd) 266 else if(command == verbosityCmd) 270 fParticleGun->SetVerbosity(verbosityCmd->G 267 fParticleGun->SetVerbosity(verbosityCmd->GetNewIntValue(newValues)); 271 268 272 else if( command==particleCmd ) { 269 else if( command==particleCmd ) { 273 if (newValues =="ion") { 270 if (newValues =="ion") { 274 fShootIon = true; 271 fShootIon = true; 275 } else { 272 } else { 276 fShootIon = false; 273 fShootIon = false; 277 G4ParticleDefinition* pd = particleTable 274 G4ParticleDefinition* pd = particleTable->FindParticle(newValues); 278 if(pd != NULL) 275 if(pd != NULL) 279 { fParticleGun->SetParticleDefinition( pd 276 { fParticleGun->SetParticleDefinition( pd ); } 280 } 277 } 281 } 278 } 282 279 283 else if( command==ionCmd ) { 280 else if( command==ionCmd ) { 284 if (fShootIon) { 281 if (fShootIon) { 285 G4Tokenizer next( newValues ); 282 G4Tokenizer next( newValues ); 286 // check argument 283 // check argument 287 fAtomicNumber = StoI(next()); 284 fAtomicNumber = StoI(next()); 288 fAtomicMass = StoI(next()); 285 fAtomicMass = StoI(next()); 289 G4String sQ = next(); 286 G4String sQ = next(); 290 if (sQ.empty()) { << 287 if (sQ.isNull()) { 291 fIonCharge = fAtomicNumber; 288 fIonCharge = fAtomicNumber; 292 } else { 289 } else { 293 fIonCharge = StoI(sQ); 290 fIonCharge = StoI(sQ); 294 sQ = next(); 291 sQ = next(); 295 if (sQ.empty()) { << 292 if (sQ.isNull()) { 296 fIonExciteEnergy = 0.0; 293 fIonExciteEnergy = 0.0; 297 } else { 294 } else { 298 fIonExciteEnergy = StoD(sQ) * keV; 295 fIonExciteEnergy = StoD(sQ) * keV; 299 } 296 } 300 } 297 } 301 298 302 G4ParticleDefinition* ion; 299 G4ParticleDefinition* ion; 303 ion = G4IonTable::GetIonTable()->GetIon << 300 ion = particleTable->GetIon(fAtomicNumber,fAtomicMass,fIonExciteEnergy); 304 if (ion==0) { 301 if (ion==0) { 305 G4cout << "Ion with Z=" << fAtomicNumber; 302 G4cout << "Ion with Z=" << fAtomicNumber; 306 G4cout << " A=" << fAtomicMass << "is not be 303 G4cout << " A=" << fAtomicMass << "is not be defined" << G4endl; 307 } else { 304 } else { 308 fParticleGun->SetParticleDefinition(ion); 305 fParticleGun->SetParticleDefinition(ion); 309 fParticleGun->SetParticleCharge(fIonCharge*e 306 fParticleGun->SetParticleCharge(fIonCharge*eplus); 310 } 307 } 311 } else { 308 } else { 312 G4cout<<"Set /dmx/gun/particle to ion be 309 G4cout<<"Set /dmx/gun/particle to ion before using /dmx/gun/ion command"; 313 G4cout<<G4endl; 310 G4cout<<G4endl; 314 } 311 } 315 } 312 } 316 313 317 else if( command==listCmd ) 314 else if( command==listCmd ) 318 particleTable->DumpTable(); 315 particleTable->DumpTable(); 319 316 320 else if( command==directionCmd ) { 317 else if( command==directionCmd ) { 321 fParticleGun->SetAngDistType("direction"); 318 fParticleGun->SetAngDistType("direction"); 322 fParticleGun->SetParticleMomentumDirection 319 fParticleGun->SetParticleMomentumDirection 323 (directionCmd->GetNew3VectorValue(newVal 320 (directionCmd->GetNew3VectorValue(newValues)); 324 } 321 } 325 322 326 else if( command==energyCmd ) { 323 else if( command==energyCmd ) { 327 fParticleGun->SetEnergyDisType("Mono"); 324 fParticleGun->SetEnergyDisType("Mono"); 328 fParticleGun->SetMonoEnergy(energyCmd->Get 325 fParticleGun->SetMonoEnergy(energyCmd->GetNewDoubleValue(newValues)); 329 } 326 } 330 327 331 else if( command==positionCmd ) { 328 else if( command==positionCmd ) { 332 fParticleGun->SetPosDisType("Point"); 329 fParticleGun->SetPosDisType("Point"); 333 fParticleGun->SetCentreCoords(positionCmd- 330 fParticleGun->SetCentreCoords(positionCmd->GetNew3VectorValue(newValues)); 334 } 331 } 335 else 332 else 336 G4cout << "Error entering command" << G4en 333 G4cout << "Error entering command" << G4endl; 337 } 334 } 338 335 339 336 340 337 341 338 342 339