Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/event/src/G4ParticleGunMessenger.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /event/src/G4ParticleGunMessenger.cc (Version 11.3.0) and /event/src/G4ParticleGunMessenger.cc (Version 4.1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 // G4ParticleGunMessenger class implementation << 
 27 //                                                 23 //
 28 // Author: Makoto Asai, 1997                   <<  24 // $Id: G4ParticleGunMessenger.cc,v 1.8 2002/02/26 16:34:06 gcosmo Exp $
 29 // ------------------------------------------- <<  25 // GEANT4 tag $Name: geant4-04-01 $
                                                   >>  26 //
 30                                                    27 
 31 #include "G4ParticleGunMessenger.hh"               28 #include "G4ParticleGunMessenger.hh"
 32 #include "G4SystemOfUnits.hh"                  << 
 33 #include "G4ParticleGun.hh"                        29 #include "G4ParticleGun.hh"
 34 #include "G4Geantino.hh"                           30 #include "G4Geantino.hh"
 35 #include "G4ThreeVector.hh"                        31 #include "G4ThreeVector.hh"
 36 #include "G4ParticleTable.hh"                      32 #include "G4ParticleTable.hh"
 37 #include "G4IonTable.hh"                           33 #include "G4IonTable.hh"
 38 #include "G4UIdirectory.hh"                        34 #include "G4UIdirectory.hh"
 39 #include "G4UIcmdWithoutParameter.hh"              35 #include "G4UIcmdWithoutParameter.hh"
 40 #include "G4UIcmdWithAString.hh"                   36 #include "G4UIcmdWithAString.hh"
 41 #include "G4UIcmdWithADoubleAndUnit.hh"            37 #include "G4UIcmdWithADoubleAndUnit.hh"
 42 #include "G4UIcmdWith3Vector.hh"                   38 #include "G4UIcmdWith3Vector.hh"
 43 #include "G4UIcmdWith3VectorAndUnit.hh"            39 #include "G4UIcmdWith3VectorAndUnit.hh"
 44 #include "G4UIcmdWithAnInteger.hh"                 40 #include "G4UIcmdWithAnInteger.hh"
 45 #include "G4UIcmdWithABool.hh"                 << 
 46 #include "G4ios.hh"                                41 #include "G4ios.hh"
 47 #include "G4Tokenizer.hh"                          42 #include "G4Tokenizer.hh"
 48                                                    43 
 49 G4ParticleGunMessenger::G4ParticleGunMessenger <<  44 #include "g4std/iomanip"               
 50   : fParticleGun(fPtclGun)                     <<  45 #include "g4std/strstream"
                                                   >>  46 
                                                   >>  47 G4ParticleGunMessenger::G4ParticleGunMessenger(G4ParticleGun * fPtclGun)
                                                   >>  48   :fParticleGun(fPtclGun),fShootIon(false)
 51 {                                                  49 {
 52   particleTable = G4ParticleTable::GetParticle     50   particleTable = G4ParticleTable::GetParticleTable();
 53                                                    51 
 54   gunDirectory = new G4UIdirectory("/gun/");       52   gunDirectory = new G4UIdirectory("/gun/");
 55   gunDirectory->SetGuidance("Particle Gun cont     53   gunDirectory->SetGuidance("Particle Gun control commands.");
 56                                                    54 
 57   listCmd = new G4UIcmdWithoutParameter("/gun/     55   listCmd = new G4UIcmdWithoutParameter("/gun/List",this);
 58   listCmd->SetGuidance("List available particl     56   listCmd->SetGuidance("List available particles.");
 59   listCmd->SetGuidance(" Invoke G4ParticleTabl     57   listCmd->SetGuidance(" Invoke G4ParticleTable.");
 60                                                    58 
 61   particleCmd = new G4UIcmdWithAString("/gun/p     59   particleCmd = new G4UIcmdWithAString("/gun/particle",this);
 62   particleCmd->SetGuidance("Set particle to be     60   particleCmd->SetGuidance("Set particle to be generated.");
 63   particleCmd->SetGuidance(" (geantino is defa     61   particleCmd->SetGuidance(" (geantino is default)");
 64   particleCmd->SetGuidance(" (ion can be speci     62   particleCmd->SetGuidance(" (ion can be specified for shooting ions)");
 65   particleCmd->SetParameterName("particleName"     63   particleCmd->SetParameterName("particleName",true);
 66   particleCmd->SetDefaultValue("geantino");        64   particleCmd->SetDefaultValue("geantino");
 67   G4String candidateList;                          65   G4String candidateList; 
 68   G4ParticleTable::G4PTblDicIterator* itr = pa <<  66   G4int nPtcl = particleTable->entries();
 69   itr->reset();                                <<  67   for(G4int i=0;i<nPtcl;i++)
 70   while( (*itr)() )                            << 
 71   {                                                68   {
 72     G4ParticleDefinition* pd = itr->value();   <<  69     candidateList += particleTable->GetParticleName(i);
 73     if( !(pd->IsShortLived()) || pd->GetDecayT <<  70     candidateList += " ";
 74     {                                          << 
 75       candidateList += pd->GetParticleName();  << 
 76       candidateList += " ";                    << 
 77     }                                          << 
 78   }                                                71   }
 79   candidateList += "ion ";                         72   candidateList += "ion ";
 80   particleCmd->SetCandidates(candidateList);       73   particleCmd->SetCandidates(candidateList);
 81                                                    74 
 82   directionCmd = new G4UIcmdWith3Vector("/gun/     75   directionCmd = new G4UIcmdWith3Vector("/gun/direction",this);
 83   directionCmd->SetGuidance("Set momentum dire     76   directionCmd->SetGuidance("Set momentum direction.");
 84   directionCmd->SetGuidance(" Direction needs  <<  77   directionCmd->SetGuidance("Direction needs not to be a unit vector.");
 85   directionCmd->SetParameterName("ex","ey","ez <<  78   directionCmd->SetParameterName("Px","Py","Pz",true,true); 
 86   directionCmd->SetRange("ex != 0 || ey != 0 | <<  79   directionCmd->SetRange("Px != 0 || Py != 0 || Pz != 0");
 87                                                    80   
 88   energyCmd = new G4UIcmdWithADoubleAndUnit("/     81   energyCmd = new G4UIcmdWithADoubleAndUnit("/gun/energy",this);
 89   energyCmd->SetGuidance("Set kinetic energy."     82   energyCmd->SetGuidance("Set kinetic energy.");
 90   energyCmd->SetParameterName("Energy",true,tr     83   energyCmd->SetParameterName("Energy",true,true);
 91   energyCmd->SetDefaultUnit("GeV");                84   energyCmd->SetDefaultUnit("GeV");
 92   //energyCmd->SetUnitCategory("Energy");          85   //energyCmd->SetUnitCategory("Energy");
 93   //energyCmd->SetUnitCandidates("eV keV MeV G     86   //energyCmd->SetUnitCandidates("eV keV MeV GeV TeV");
 94                                                    87 
 95   momCmd = new G4UIcmdWith3VectorAndUnit("/gun << 
 96   momCmd->SetGuidance("Set momentum. This comm << 
 97   momCmd->SetGuidance(" /gun/direction and /gu << 
 98   momCmd->SetParameterName("px","py","pz",true << 
 99   momCmd->SetRange("px != 0 || py != 0 || pz ! << 
100   momCmd->SetDefaultUnit("GeV");               << 
101                                                << 
102   momAmpCmd = new G4UIcmdWithADoubleAndUnit("/ << 
103   momAmpCmd->SetGuidance("Set absolute value o << 
104   momAmpCmd->SetGuidance(" Direction should be << 
105   momAmpCmd->SetGuidance(" This command should << 
106   momAmpCmd->SetParameterName("Momentum",true, << 
107   momAmpCmd->SetDefaultUnit("GeV");            << 
108                                                << 
109   positionCmd = new G4UIcmdWith3VectorAndUnit(     88   positionCmd = new G4UIcmdWith3VectorAndUnit("/gun/position",this);
110   positionCmd->SetGuidance("Set starting posit     89   positionCmd->SetGuidance("Set starting position of the particle.");
111   positionCmd->SetGuidance(" Position must be  << 
112   positionCmd->SetParameterName("X","Y","Z",tr     90   positionCmd->SetParameterName("X","Y","Z",true,true);
113   positionCmd->SetDefaultUnit("cm");               91   positionCmd->SetDefaultUnit("cm");
114   // positionCmd->SetUnitCategory("Length");   <<  92   //positionCmd->SetUnitCategory("Length");
115   // positionCmd->SetUnitCandidates("microm mm <<  93   //positionCmd->SetUnitCandidates("microm mm cm m km");
116                                                    94 
117   timeCmd = new G4UIcmdWithADoubleAndUnit("/gu     95   timeCmd = new G4UIcmdWithADoubleAndUnit("/gun/time",this);
118   timeCmd->SetGuidance("Set initial time of th     96   timeCmd->SetGuidance("Set initial time of the particle.");
119   timeCmd->SetParameterName("t0",true,true);       97   timeCmd->SetParameterName("t0",true,true);
120   timeCmd->SetDefaultUnit("ns");                   98   timeCmd->SetDefaultUnit("ns");
121   // timeCmd->SetUnitCategory("Time");         <<  99   //timeCmd->SetUnitCategory("Time");
122   // timeCmd->SetUnitCandidates("ns ms s");    << 100   //timeCmd->SetUnitCandidates("ns ms s");
123                                                   101   
124   polCmd = new G4UIcmdWith3Vector("/gun/polari    102   polCmd = new G4UIcmdWith3Vector("/gun/polarization",this);
125   polCmd->SetGuidance("Set polarization.");       103   polCmd->SetGuidance("Set polarization.");
126   polCmd->SetParameterName("Px","Py","Pz",true    104   polCmd->SetParameterName("Px","Py","Pz",true,true); 
127   polCmd->SetRange("Px>=-1.&&Px<=1.&&Py>=-1.&&    105   polCmd->SetRange("Px>=-1.&&Px<=1.&&Py>=-1.&&Py<=1.&&Pz>=-1.&&Pz<=1.");
128                                                   106 
129   numberCmd = new G4UIcmdWithAnInteger("/gun/n    107   numberCmd = new G4UIcmdWithAnInteger("/gun/number",this);
130   numberCmd->SetGuidance("Set number of partic    108   numberCmd->SetGuidance("Set number of particles to be generated.");
131   numberCmd->SetParameterName("N",true,true);     109   numberCmd->SetParameterName("N",true,true);
132   numberCmd->SetRange("N>0");                     110   numberCmd->SetRange("N>0");
133                                                   111 
134   ionCmd = new G4UIcommand("/gun/ion",this);      112   ionCmd = new G4UIcommand("/gun/ion",this);
135   ionCmd->SetGuidance("Set properties of ion t    113   ionCmd->SetGuidance("Set properties of ion to be generated.");
136   ionCmd->SetGuidance("[usage] /gun/ion Z A [Q << 114   ionCmd->SetGuidance("[usage] /gun/ion Z A Q");
137   ionCmd->SetGuidance("        Z:(int) AtomicN    115   ionCmd->SetGuidance("        Z:(int) AtomicNumber");
138   ionCmd->SetGuidance("        A:(int) AtomicM    116   ionCmd->SetGuidance("        A:(int) AtomicMass");
139   ionCmd->SetGuidance("        Q:(int) Charge     117   ionCmd->SetGuidance("        Q:(int) Charge of Ion (in unit of e)");
140   ionCmd->SetGuidance("        E:(double) Exci    118   ionCmd->SetGuidance("        E:(double) Excitation energy (in keV)");
141   ionCmd->SetGuidance("        flb:(char) Floa << 
142                                                   119   
143   G4UIparameter* param;                           120   G4UIparameter* param;
144   param = new G4UIparameter("Z",'i',false);       121   param = new G4UIparameter("Z",'i',false);
                                                   >> 122   param->SetDefaultValue("1");
145   ionCmd->SetParameter(param);                    123   ionCmd->SetParameter(param);
146   param = new G4UIparameter("A",'i',false);       124   param = new G4UIparameter("A",'i',false);
                                                   >> 125   param->SetDefaultValue("1");
147   ionCmd->SetParameter(param);                    126   ionCmd->SetParameter(param);
148   param = new G4UIparameter("Q",'i',true);        127   param = new G4UIparameter("Q",'i',true);
149   param->SetDefaultValue(-1);                  << 128   param->SetDefaultValue("0");
150   ionCmd->SetParameter(param);                    129   ionCmd->SetParameter(param);
151   param = new G4UIparameter("E",'d',true);        130   param = new G4UIparameter("E",'d',true);
152   param->SetDefaultValue(0.0);                 << 131   param->SetDefaultValue("0.0");
153   ionCmd->SetParameter(param);                    132   ionCmd->SetParameter(param);
154   param = new G4UIparameter("flb",'c',true);   << 133   
155   param->SetDefaultValue("noFloat");           << 134   // set initial value to G4ParticleGun
156   param->SetParameterCandidates("noFloat X Y Z << 
157   ionCmd->SetParameter(param);                 << 
158                                                << 
159   ionLvlCmd = new G4UIcommand("/gun/ionL",this << 
160   ionLvlCmd->SetGuidance("THIS COMMAND IS DEPR << 
161   ionLvlCmd->SetGuidance(" Use /gun/ion instea << 
162   ionLvlCmd->SetGuidance(" Set properties of i << 
163   ionLvlCmd->SetGuidance(" [usage] /gun/ionL Z << 
164   ionLvlCmd->SetGuidance("        Z:(int) Atom << 
165   ionLvlCmd->SetGuidance("        A:(int) Atom << 
166   ionLvlCmd->SetGuidance("        Q:(int) Char << 
167   ionLvlCmd->SetGuidance("        I:(int) Leve << 
168                                                << 
169   G4UIparameter* paraml;                       << 
170   paraml = new G4UIparameter("Z",'i',false);   << 
171   ionLvlCmd->SetParameter(paraml);             << 
172   paraml = new G4UIparameter("A",'i',false);   << 
173   ionLvlCmd->SetParameter(paraml);             << 
174   paraml = new G4UIparameter("Q",'i',true);    << 
175   paraml->SetDefaultValue(-1);                 << 
176   ionLvlCmd->SetParameter(paraml);             << 
177   paraml = new G4UIparameter("I",'i',true);    << 
178   paraml->SetDefaultValue("0");                << 
179   ionLvlCmd->SetParameter(paraml);             << 
180                                                << 
181   volChkCmd = new G4UIcmdWithABool("/gun/check << 
182   volChkCmd->SetGuidance("Switch on/off the ch << 
183   volChkCmd->SetGuidance("By default the check << 
184   volChkCmd->SetGuidance("but the user has to  << 
185   volChkCmd->SetParameterName("switch",true,tr << 
186                                                << 
187   // Set initial value to G4ParticleGun        << 
188   //                                           << 
189   fParticleGun->SetParticleDefinition( G4Geant    135   fParticleGun->SetParticleDefinition( G4Geantino::Geantino() );
190   fParticleGun->SetParticleMomentumDirection(     136   fParticleGun->SetParticleMomentumDirection( G4ThreeVector(1.0,0.0,0.0) );
191   fParticleGun->SetParticleEnergy( 1.0*GeV );     137   fParticleGun->SetParticleEnergy( 1.0*GeV );
                                                   >> 138   fParticleGun->SetParticlePosition(G4ThreeVector(0.0*cm, 0.0*cm, 0.0*cm));
192   fParticleGun->SetParticleTime( 0.0*ns );        139   fParticleGun->SetParticleTime( 0.0*ns );
193 }                                                 140 }
194                                                   141 
195 G4ParticleGunMessenger::~G4ParticleGunMessenge    142 G4ParticleGunMessenger::~G4ParticleGunMessenger()
196 {                                                 143 {
197   delete listCmd;                                 144   delete listCmd;
198   delete particleCmd;                             145   delete particleCmd;
199   delete directionCmd;                            146   delete directionCmd;
200   delete energyCmd;                               147   delete energyCmd;
201   delete momCmd;                               << 
202   delete momAmpCmd;                            << 
203   delete positionCmd;                             148   delete positionCmd;
204   delete timeCmd;                                 149   delete timeCmd;
205   delete polCmd;                                  150   delete polCmd;
206   delete numberCmd;                               151   delete numberCmd;
207   delete ionCmd;                               << 
208   delete ionLvlCmd;                            << 
209   delete volChkCmd;                            << 
210   delete gunDirectory;                            152   delete gunDirectory;
211 }                                                 153 }
212                                                   154 
213 void G4ParticleGunMessenger::                  << 155 void G4ParticleGunMessenger::SetNewValue(G4UIcommand * command,G4String newValues)
214 SetNewValue(G4UIcommand* command, G4String new << 
215 {                                                 156 {
216   G4ExceptionDescription ed;                   << 157   if( command==listCmd )
217   if (command==listCmd)                        << 158   { particleTable->DumpTable(); }
218   {                                            << 159   else if( command==particleCmd )
219     particleTable->DumpTable();                << 
220   }                                            << 
221   else if (command==particleCmd)               << 
222   {                                               160   {
223     if (newValues =="ion")                     << 161     if (newValues =="ion") {
224     {                                          << 
225       fShootIon = true;                           162       fShootIon = true;
226     }                                          << 163     } else {
227     else                                       << 
228     {                                          << 
229       fShootIon = false;                          164       fShootIon = false;
230       G4ParticleDefinition* pd = particleTable    165       G4ParticleDefinition* pd = particleTable->FindParticle(newValues);
231       if(pd != nullptr)                        << 166       if(pd != 0)
232       {                                        << 167       { fParticleGun->SetParticleDefinition( pd ); }
233         fParticleGun->SetParticleDefinition( p << 
234       }                                        << 
235       else                                     << 
236       {                                        << 
237         ed << "Particle [" << newValues << "]  << 
238         command->CommandFailed(ed);            << 
239       }                                        << 
240     }                                             168     }
241                                                << 169   }
242   } else if( command==directionCmd )           << 170   else if( command==directionCmd )
243   { fParticleGun->SetParticleMomentumDirection    171   { fParticleGun->SetParticleMomentumDirection(directionCmd->GetNew3VectorValue(newValues)); }
244   else if( command==energyCmd )                   172   else if( command==energyCmd )
245   { fParticleGun->SetParticleEnergy(energyCmd-    173   { fParticleGun->SetParticleEnergy(energyCmd->GetNewDoubleValue(newValues)); }
246   else if( command==momCmd )                   << 
247   { fParticleGun->SetParticleMomentum(momCmd-> << 
248   else if( command==momAmpCmd )                << 
249   { fParticleGun->SetParticleMomentum(momAmpCm << 
250   else if( command==positionCmd )                 174   else if( command==positionCmd )
251   { fParticleGun->SetParticlePosition(position    175   { fParticleGun->SetParticlePosition(positionCmd->GetNew3VectorValue(newValues)); }
252   else if( command==timeCmd )                     176   else if( command==timeCmd )
253   { fParticleGun->SetParticleTime(timeCmd->Get    177   { fParticleGun->SetParticleTime(timeCmd->GetNewDoubleValue(newValues)); }
254   else if( command==polCmd )                      178   else if( command==polCmd )
255   { fParticleGun->SetParticlePolarization(polC    179   { fParticleGun->SetParticlePolarization(polCmd->GetNew3VectorValue(newValues)); }
256   else if( command==numberCmd )                   180   else if( command==numberCmd )
257   { fParticleGun->SetNumberOfParticles(numberC    181   { fParticleGun->SetNumberOfParticles(numberCmd->GetNewIntValue(newValues)); }
258   else if( command==ionCmd )                   << 182   else if( command==ionCmd )
259   {                                            << 183   { IonCommand(newValues); }
260     if (fShootIon)                             << 
261     {                                          << 
262       IonCommand(newValues);                   << 
263     }                                          << 
264     else                                       << 
265     {                                          << 
266       ed << "Set /gun/particle to ion before u << 
267       command->CommandFailed(ed);              << 
268     }                                          << 
269   }                                            << 
270   else if( command==ionLvlCmd )                << 
271   {                                            << 
272     G4ExceptionDescription depWarn;            << 
273     depWarn << "\nCommand /gun/ionL is depreca << 
274             << "Use /gun/ion instead.\n";      << 
275     G4Exception("G4ParticleGunMessenger::SetNe << 
276                 JustWarning, depWarn);         << 
277                                                << 
278     if (fShootIon)                             << 
279     {                                          << 
280       IonLevelCommand(newValues);              << 
281     }                                          << 
282     else                                       << 
283     {                                          << 
284       ed << "Set /gun/particle to ion before u << 
285       command->CommandFailed(ed);              << 
286     }                                          << 
287   }                                            << 
288   else if( command==volChkCmd )                << 
289   {                                            << 
290     fParticleGun->CheckInside(volChkCmd->GetNe << 
291   }                                            << 
292 }                                                 184 }
293                                                   185 
294 G4String G4ParticleGunMessenger::GetCurrentVal << 186 G4String G4ParticleGunMessenger::GetCurrentValue(G4UIcommand * command)
295 {                                                 187 {
296   G4String cv;                                    188   G4String cv;
297                                                   189   
298   if( command==directionCmd )                     190   if( command==directionCmd )
299   { cv = directionCmd->ConvertToString(fPartic    191   { cv = directionCmd->ConvertToString(fParticleGun->GetParticleMomentumDirection()); }
300   else if( command==particleCmd )                 192   else if( command==particleCmd )
301   { cv = fParticleGun->GetParticleDefinition()    193   { cv = fParticleGun->GetParticleDefinition()->GetParticleName(); }
302   else if( command==energyCmd )                   194   else if( command==energyCmd )
303   {                                            << 195   { cv = energyCmd->ConvertToString(fParticleGun->GetParticleEnergy(),"GeV"); }
304     G4double ene = fParticleGun->GetParticleEn << 
305     if(ene == 0.)                              << 
306     { G4cerr << " G4ParticleGun:  was defined  << 
307     else                                       << 
308     { cv = energyCmd->ConvertToString(ene,"GeV << 
309   }                                            << 
310   else if( command==momCmd || command==momAmpC << 
311   {                                            << 
312     G4double mom = fParticleGun->GetParticleMo << 
313     if(mom == 0.)                              << 
314     {                                          << 
315       G4cerr << " G4ParticleGun:  was defined  << 
316              << G4endl;                        << 
317     }                                          << 
318     else                                       << 
319     {                                          << 
320       if( command==momCmd )                    << 
321       { cv = momCmd->ConvertToString(mom*(fPar << 
322       else                                     << 
323       { cv = momAmpCmd->ConvertToString(mom,"G << 
324     }                                          << 
325   }                                            << 
326   else if( command==positionCmd )                 196   else if( command==positionCmd )
327   { cv = positionCmd->ConvertToString(fParticl    197   { cv = positionCmd->ConvertToString(fParticleGun->GetParticlePosition(),"cm"); }
328   else if( command==timeCmd )                     198   else if( command==timeCmd )
329   { cv = timeCmd->ConvertToString(fParticleGun    199   { cv = timeCmd->ConvertToString(fParticleGun->GetParticleTime(),"ns"); }
330   else if( command==polCmd )                      200   else if( command==polCmd )
331   { cv = polCmd->ConvertToString(fParticleGun-    201   { cv = polCmd->ConvertToString(fParticleGun->GetParticlePolarization()); }
332   else if( command==numberCmd )                   202   else if( command==numberCmd )
333   { cv = numberCmd->ConvertToString(fParticleG    203   { cv = numberCmd->ConvertToString(fParticleGun->GetNumberOfParticles()); }
334   else if( command==ionCmd )                      204   else if( command==ionCmd )
335   {                                               205   { 
336     if (fShootIon)                             << 206     if (fShootIon) {
337     {                                          << 
338       cv = ItoS(fAtomicNumber) + " " + ItoS(fA    207       cv = ItoS(fAtomicNumber) + " " + ItoS(fAtomicMass) + " ";
339       cv += ItoS(fIonCharge);                     208       cv += ItoS(fIonCharge);
340     }                                          << 209     } else {
341     else                                       << 
342     {                                          << 
343       cv = "";                                    210       cv = "";
344     }                                             211     }  
345   }                                               212   }    
346   else if( command==volChkCmd )                << 
347   { cv = volChkCmd->ConvertToString(fParticleG << 
348   return cv;                                      213   return cv;
349 }                                                 214 }
350                                                   215 
351 void G4ParticleGunMessenger::IonLevelCommand(c << 216 void G4ParticleGunMessenger::IonCommand(G4String newValues)
352 {                                              << 
353   G4Tokenizer next( newValues );               << 
354                                                << 
355   // Check argument                            << 
356   //                                           << 
357   fAtomicNumber = StoI(next());                << 
358   fAtomicMass = StoI(next());                  << 
359   G4String sQ = next();                        << 
360   if (sQ.empty() || StoI(sQ)<0)                << 
361   {                                            << 
362     fIonCharge = fAtomicNumber;                << 
363   }                                            << 
364   else                                         << 
365   {                                            << 
366     fIonCharge = StoI(sQ);                     << 
367   }                                            << 
368   sQ = next();                                 << 
369   if (sQ.empty())                              << 
370   {                                            << 
371     fIonEnergyLevel = 0;                       << 
372   }                                            << 
373   else                                         << 
374   {                                            << 
375     fIonEnergyLevel = StoI(sQ);                << 
376   }                                            << 
377   G4ParticleDefinition* ion = G4IonTable::GetI << 
378       ->GetIon(fAtomicNumber,fAtomicMass,fIonE << 
379   if (ion == nullptr)                          << 
380   {                                            << 
381     G4ExceptionDescription ed;                 << 
382     ed << "Ion with Z = " << fAtomicNumber <<  << 
383        << ", I = " << fIonEnergyLevel << " is  << 
384     ionLvlCmd->CommandFailed(ed);              << 
385   }                                            << 
386   else                                         << 
387   {                                            << 
388     fParticleGun->SetParticleDefinition(ion);  << 
389     fParticleGun->SetParticleCharge(fIonCharge << 
390   }                                            << 
391 }                                              << 
392                                                << 
393 void G4ParticleGunMessenger::IonCommand(const  << 
394 {                                                 217 {
395   G4Tokenizer next( newValues );               << 218   if (fShootIon) {
396                                                << 219     G4Tokenizer next( newValues );
397   // Check argument                            << 220     // check argument
398   //                                           << 221     fAtomicNumber = StoI(next());
399   fAtomicNumber = StoI(next());                << 222     fAtomicMass = StoI(next());
400   fAtomicMass = StoI(next());                  << 223     G4String sQ = next();
401   fIonCharge = fAtomicNumber;                  << 224     if (sQ.isNull()) {
402   fIonExciteEnergy = 0.0;                      << 225       fIonCharge = fAtomicNumber;
403   fIonFloatingLevelBase = '\0';                << 226     } else {
404   G4String sQ = next();                        << 227   fIonCharge = StoI(sQ);
405   if (!(sQ.empty()))                           << 
406   {                                            << 
407     if (StoI(sQ)>=0)                           << 
408     fIonCharge = StoI(sQ);                     << 
409                                                << 
410     sQ = next();                               << 
411     if (!(sQ.empty()))                         << 
412     {                                          << 
413       fIonExciteEnergy = StoD(sQ) * keV;       << 
414                                                << 
415       sQ = next();                                228       sQ = next();
416       if (sQ.empty()||sQ=="noFloat")           << 229       if (sQ.isNull()) {
417       { fIonFloatingLevelBase = '\0'; }        << 230         fIonExciteEnergy = 0.0;
418       else                                     << 231       } else {
419       { fIonFloatingLevelBase = sQ[(std::size_ << 232         fIonExciteEnergy = StoD(sQ) * keV;
                                                   >> 233       }
420     }                                             234     }
421   }                                            << 235 
422   G4ParticleDefinition* ion = G4IonTable::GetI << 236     G4ParticleDefinition* ion;
423     ->GetIon(fAtomicNumber,fAtomicMass,fIonExc << 237     ion =  particleTable->GetIon( fAtomicNumber, fAtomicMass, fIonExciteEnergy);
424   if (ion==nullptr)                            << 238     if (ion==0) {
425   {                                            << 239     G4cout << "Ion with Z=" << fAtomicNumber;
426     G4ExceptionDescription ed;                 << 240     G4cout << " A=" << fAtomicMass << "is not be defined" << G4endl;    
427     ed << "Ion with Z=" << fAtomicNumber;      << 241     } else {
428     ed << " A=" << fAtomicMass << "is not defi << 242       fParticleGun->SetParticleDefinition(ion);
429     ionCmd->CommandFailed(ed);                 << 243       fParticleGun->SetParticleCharge(fIonCharge*eplus);
430   }                                            << 244     }
431   else                                         << 245   } else {
432   {                                            << 246     G4cout << "Set /gun/particle to ion before using /gun/ion command";
433     fParticleGun->SetParticleDefinition(ion);  << 247     G4cout << G4endl; 
434     fParticleGun->SetParticleCharge(fIonCharge << 
435   }                                               248   }
436 }                                                 249 }
                                                   >> 250 
437                                                   251