254 lines
9.1 KiB
C++
254 lines
9.1 KiB
C++
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
|
|
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
|
|
//
|
|
// ID : LEMuSRParticleGunMessenger.cc , v 1.2
|
|
// AUTHOR: Taofiq PARAISO
|
|
// DATE : 2004-08-20 10:48
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
//
|
|
// & &&&&&&&&&& &&&&&&& &&&&&&&&
|
|
// & & && && & &&
|
|
// & & & & & & &&
|
|
// & &&&&&&& & & &&&&&& &&&&&&&&
|
|
// & & & && & & &&
|
|
// & & && & & && && & &
|
|
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
|
|
// &
|
|
// &
|
|
// &
|
|
// &
|
|
// PARTICLE GUN MESSENGER
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
#include "LEMuSRParticleGunMessenger.hh"
|
|
#include "LEMuSRParticleGun.hh"
|
|
#include "G4Geantino.hh"
|
|
#include "G4ThreeVector.hh"
|
|
#include "G4ParticleTable.hh"
|
|
#include "G4IonTable.hh"
|
|
#include "G4UIdirectory.hh"
|
|
#include "G4UIcmdWithoutParameter.hh"
|
|
#include "G4UIcmdWithAString.hh"
|
|
#include "G4UIcmdWithADoubleAndUnit.hh"
|
|
#include "G4UIcmdWith3Vector.hh"
|
|
#include "G4UIcmdWith3VectorAndUnit.hh"
|
|
#include "G4UIcmdWithAnInteger.hh"
|
|
#include "G4ios.hh"
|
|
#include "G4Tokenizer.hh"
|
|
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
|
|
|
|
LEMuSRParticleGunMessenger::LEMuSRParticleGunMessenger(LEMuSRParticleGun* fPtclGun)
|
|
:fParticleGun(fPtclGun),fShootIon(false)
|
|
{
|
|
particleTable = G4ParticleTable::GetParticleTable();
|
|
|
|
gunDirectory = new G4UIdirectory("/lemuGun/");
|
|
gunDirectory->SetGuidance("Particle Gun control commands.");
|
|
|
|
listCmd = new G4UIcmdWithoutParameter("/lemuGun/List",this);
|
|
listCmd->SetGuidance("List available particles.");
|
|
listCmd->SetGuidance(" Invoke G4ParticleTable.");
|
|
|
|
particleCmd = new G4UIcmdWithAString("/lemuGun/particle",this);
|
|
particleCmd->SetGuidance("Set particle to be generated.");
|
|
particleCmd->SetGuidance(" (geantino is default)");
|
|
particleCmd->SetGuidance(" (ion can be specified for shooting ions)");
|
|
particleCmd->SetParameterName("particleName",true);
|
|
particleCmd->SetDefaultValue("geantino");
|
|
G4String candidateList;
|
|
G4int nPtcl = particleTable->entries();
|
|
for(G4int i=0;i<nPtcl;i++)
|
|
{
|
|
if(!(particleTable->GetParticle(i)->IsShortLived()))
|
|
{
|
|
candidateList += particleTable->GetParticleName(i);
|
|
candidateList += " ";
|
|
}
|
|
}
|
|
candidateList += "ion ";
|
|
particleCmd->SetCandidates(candidateList);
|
|
|
|
directionCmd = new G4UIcmdWith3Vector("/lemuGun/direction",this);
|
|
directionCmd->SetGuidance("Set momentum direction.");
|
|
directionCmd->SetGuidance("Direction needs not to be a unit vector.");
|
|
directionCmd->SetParameterName("Px","Py","Pz",true,true);
|
|
directionCmd->SetRange("Px != 0 || Py != 0 || Pz != 0");
|
|
|
|
energyCmd = new G4UIcmdWithADoubleAndUnit("/lemuGun/energy",this);
|
|
energyCmd->SetGuidance("Set kinetic energy.");
|
|
energyCmd->SetParameterName("Energy",true,true);
|
|
energyCmd->SetDefaultUnit("GeV");
|
|
//energyCmd->SetUnitCategory("Energy");
|
|
//energyCmd->SetUnitCandidates("eV keV MeV GeV TeV");
|
|
|
|
positionCmd = new G4UIcmdWith3VectorAndUnit("/lemuGun/position",this);
|
|
positionCmd->SetGuidance("Set starting position of the particle.");
|
|
positionCmd->SetParameterName("X","Y","Z",true,true);
|
|
positionCmd->SetDefaultUnit("cm");
|
|
//positionCmd->SetUnitCategory("Length");
|
|
//positionCmd->SetUnitCandidates("microm mm cm m km");
|
|
|
|
timeCmd = new G4UIcmdWithADoubleAndUnit("/lemuGun/time",this);
|
|
timeCmd->SetGuidance("Set initial time of the particle.");
|
|
timeCmd->SetParameterName("t0",true,true);
|
|
timeCmd->SetDefaultUnit("ns");
|
|
//timeCmd->SetUnitCategory("Time");
|
|
//timeCmd->SetUnitCandidates("ns ms s");
|
|
|
|
polCmd = new G4UIcmdWith3Vector("/lemuGun/polarization",this);
|
|
polCmd->SetGuidance("Set polarization.");
|
|
polCmd->SetParameterName("Px","Py","Pz",true,true);
|
|
polCmd->SetRange("Px>=-1.&&Px<=1.&&Py>=-1.&&Py<=1.&&Pz>=-1.&&Pz<=1.");
|
|
|
|
numberCmd = new G4UIcmdWithAnInteger("/lemuGun/number",this);
|
|
numberCmd->SetGuidance("Set number of particles to be generated.");
|
|
numberCmd->SetParameterName("N",true,true);
|
|
numberCmd->SetRange("N>0");
|
|
|
|
ionCmd = new G4UIcommand("/lemuGun/ion",this);
|
|
ionCmd->SetGuidance("Set properties of ion to be generated.");
|
|
ionCmd->SetGuidance("[usage] /lemuGun/ion Z A Q");
|
|
ionCmd->SetGuidance(" Z:(int) AtomicNumber");
|
|
ionCmd->SetGuidance(" A:(int) AtomicMass");
|
|
ionCmd->SetGuidance(" Q:(int) Charge of Ion (in unit of e)");
|
|
ionCmd->SetGuidance(" E:(double) Excitation energy (in keV)");
|
|
|
|
G4UIparameter* param;
|
|
param = new G4UIparameter("Z",'i',false);
|
|
param->SetDefaultValue("1");
|
|
ionCmd->SetParameter(param);
|
|
param = new G4UIparameter("A",'i',false);
|
|
param->SetDefaultValue("1");
|
|
ionCmd->SetParameter(param);
|
|
param = new G4UIparameter("Q",'i',true);
|
|
param->SetDefaultValue("0");
|
|
ionCmd->SetParameter(param);
|
|
param = new G4UIparameter("E",'d',true);
|
|
param->SetDefaultValue("0.0");
|
|
ionCmd->SetParameter(param);
|
|
|
|
// set initial value to G4ParticleGun
|
|
fParticleGun->SetParticleDefinition( G4Geantino::Geantino() );
|
|
fParticleGun->SetParticleMomentumDirection( G4ThreeVector(1.0,0.0,0.0) );
|
|
fParticleGun->SetParticleEnergy( 1.0*GeV );
|
|
fParticleGun->SetParticlePosition(G4ThreeVector(0.0*cm, 0.0*cm, 0.0*cm));
|
|
fParticleGun->SetParticleTime( 0.0*ns );
|
|
}
|
|
|
|
|
|
|
|
LEMuSRParticleGunMessenger::~LEMuSRParticleGunMessenger()
|
|
{
|
|
delete listCmd;
|
|
delete particleCmd;
|
|
delete directionCmd;
|
|
delete energyCmd;
|
|
delete positionCmd;
|
|
delete timeCmd;
|
|
delete polCmd;
|
|
delete numberCmd;
|
|
delete ionCmd;
|
|
delete gunDirectory;
|
|
}
|
|
|
|
|
|
void LEMuSRParticleGunMessenger::SetNewValue(G4UIcommand * command,G4String newValues)
|
|
{
|
|
if( command==listCmd )
|
|
{ particleTable->DumpTable(); }
|
|
else if( command==particleCmd )
|
|
{
|
|
if (newValues =="ion") {
|
|
fShootIon = true;
|
|
} else {
|
|
fShootIon = false;
|
|
G4ParticleDefinition* pd = particleTable->FindParticle(newValues);
|
|
if(pd != 0)
|
|
{ fParticleGun->SetParticleDefinition( pd ); }
|
|
}
|
|
}
|
|
else if( command==directionCmd )
|
|
{ fParticleGun->SetParticleMomentumDirection(directionCmd->GetNew3VectorValue(newValues)); }
|
|
else if( command==energyCmd )
|
|
{ fParticleGun->SetParticleEnergy(energyCmd->GetNewDoubleValue(newValues)); }
|
|
else if( command==positionCmd )
|
|
{ fParticleGun->SetParticlePosition(positionCmd->GetNew3VectorValue(newValues)); }
|
|
else if( command==timeCmd )
|
|
{ fParticleGun->SetParticleTime(timeCmd->GetNewDoubleValue(newValues)); }
|
|
else if( command==polCmd )
|
|
{ fParticleGun->SetParticlePolarization(polCmd->GetNew3VectorValue(newValues)); }
|
|
else if( command==numberCmd )
|
|
{ fParticleGun->SetNumberOfParticles(numberCmd->GetNewIntValue(newValues)); }
|
|
else if( command==ionCmd )
|
|
{ IonCommand(newValues); }
|
|
}
|
|
|
|
G4String LEMuSRParticleGunMessenger::GetCurrentValue(G4UIcommand * command)
|
|
{
|
|
G4String cv;
|
|
|
|
if( command==directionCmd )
|
|
{ cv = directionCmd->ConvertToString(fParticleGun->GetParticleMomentumDirection()); }
|
|
else if( command==particleCmd )
|
|
{ cv = fParticleGun->GetParticleDefinition()->GetParticleName(); }
|
|
else if( command==energyCmd )
|
|
{ cv = energyCmd->ConvertToString(fParticleGun->GetParticleEnergy(),"GeV"); }
|
|
else if( command==positionCmd )
|
|
{ cv = positionCmd->ConvertToString(fParticleGun->GetParticlePosition(),"cm"); }
|
|
else if( command==timeCmd )
|
|
{ cv = timeCmd->ConvertToString(fParticleGun->GetParticleTime(),"ns"); }
|
|
else if( command==polCmd )
|
|
{ cv = polCmd->ConvertToString(fParticleGun->GetParticlePolarization()); }
|
|
else if( command==numberCmd )
|
|
{ cv = numberCmd->ConvertToString(fParticleGun->GetNumberOfParticles()); }
|
|
else if( command==ionCmd )
|
|
{
|
|
if (fShootIon) {
|
|
cv = ItoS(fAtomicNumber) + " " + ItoS(fAtomicMass) + " ";
|
|
cv += ItoS(fIonCharge);
|
|
} else {
|
|
cv = "";
|
|
}
|
|
}
|
|
return cv;
|
|
}
|
|
|
|
void LEMuSRParticleGunMessenger::IonCommand(G4String newValues)
|
|
{
|
|
if (fShootIon) {
|
|
G4Tokenizer next( newValues );
|
|
// check argument
|
|
fAtomicNumber = StoI(next());
|
|
fAtomicMass = StoI(next());
|
|
G4String sQ = next();
|
|
if (sQ.isNull()) {
|
|
fIonCharge = fAtomicNumber;
|
|
} else {
|
|
fIonCharge = StoI(sQ);
|
|
sQ = next();
|
|
if (sQ.isNull()) {
|
|
fIonExciteEnergy = 0.0;
|
|
} else {
|
|
fIonExciteEnergy = StoD(sQ) * keV;
|
|
}
|
|
}
|
|
|
|
G4ParticleDefinition* ion;
|
|
ion = particleTable->GetIon( fAtomicNumber, fAtomicMass, fIonExciteEnergy);
|
|
if (ion==0) {
|
|
G4cout << "Ion with Z=" << fAtomicNumber;
|
|
G4cout << " A=" << fAtomicMass << "is not be defined" << G4endl;
|
|
} else {
|
|
fParticleGun->SetParticleDefinition(ion);
|
|
fParticleGun->SetParticleCharge(fIonCharge*eplus);
|
|
}
|
|
} else {
|
|
G4cout << "Set /lemuGun/particle to ion before using /lemuGun/ion command";
|
|
G4cout << G4endl;
|
|
}
|
|
}
|
|
|