Geant4  10.01.p03
DMXParticleSourceMessenger.cc
Go to the documentation of this file.
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 // --------------------------------------------------------------
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.
46 
47 #include <fstream>
48 #include <iomanip>
49 
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"
60 #include "G4UIcmdWithAString.hh"
62 #include "G4UIcmdWith3Vector.hh"
64 #include "G4UIcmdWithAnInteger.hh"
65 #include "G4UIcmdWithADouble.hh"
66 #include "G4UIcmdWithABool.hh"
67 #include "G4ios.hh"
68 #include "G4Tokenizer.hh"
69 
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 
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 
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.isNull()) {
291  fIonCharge = fAtomicNumber;
292  } else {
293  fIonCharge = StoI(sQ);
294  sQ = next();
295  if (sQ.isNull()) {
296  fIonExciteEnergy = 0.0;
297  } else {
298  fIonExciteEnergy = StoD(sQ) * keV;
299  }
300  }
301 
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 
G4UIcmdWith3VectorAndUnit * positionCmd
G4UIcmdWithADoubleAndUnit * halfzCmd
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:463
void SetDefaultValue(const char *theDefaultValue)
G4UIcmdWithADoubleAndUnit * radiusCmd
int G4int
Definition: G4Types.hh:78
G4UIcmdWith3VectorAndUnit * centreCmd
void SetNewValue(G4UIcommand *command, G4String newValues)
DMXParticleSourceMessenger(DMXParticleSource *fPtclGun)
G4GLOB_DLL std::ostream G4cout
G4UIcmdWithADoubleAndUnit * energyCmd
G4UIcmdWithoutParameter * listCmd
static G4IonTable * GetIonTable()
Definition: G4IonTable.hh:78
static G4ParticleTable * GetParticleTable()
#define G4endl
Definition: G4ios.hh:61
static const double keV
Definition: G4SIunits.hh:195
static const double eplus
Definition: G4SIunits.hh:178
G4bool isNull() const