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