musrsim/geant4/TaoLEMuSR/src/LEMuSRPgaMessenger.cc
2008-03-20 09:23:20 +00:00

255 lines
9.0 KiB
C++

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
//
// ID : LEMuSRPgaMessenger.cc , v 1.1
// AUTHOR: Taofiq PARAISO
// DATE : 2004-06-30 09:12
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
//
// & &&&&&&&&&& &&&&&&& &&&&&&&&
// & & && && & &&
// & & & & & & &&
// & &&&&&&& & & &&&&&& &&&&&&&&
// & & & && & & &&
// & & && & & && && & &
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
// &
// &
// &
// &
// PRIMARY GENERATOR ACTION MEESENGER
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
#include "LEMuSRPgaMessenger.hh"
#include "LEMuSRPrimaryGeneratorAction.hh"
#include "G4UIdirectory.hh"
#include "G4UIcmdWithAString.hh"
#include "G4UIcmdWithoutParameter.hh"
#include "G4UIcmdWithADoubleAndUnit.hh"
#include "G4UIcmdWithADouble.hh"
#include "G4UIcmdWith3Vector.hh"
#include "G4UIcmdWith3VectorAndUnit.hh"
#include "G4UIcmdWithAnInteger.hh"
#include "G4ios.hh"
#include "G4UnitsTable.hh"
#include "G4ParticleTable.hh"
/*!
* The commands are instanciated and a new pointer is created for each of them.
* A directory and name for the commands is also defined, as well as some guidance to the user about how to use the command.
* Finally if possible some default values are defined.
*/
LEMuSRPgaMessenger::LEMuSRPgaMessenger(LEMuSRPrimaryGeneratorAction *thePGA)
:lemuPGA(thePGA)
{
pgaDirectory = new G4UIdirectory("/lemuGun/");
pgaDirectory->SetGuidance("LEMuSR particle shooting control commands.");
// commands
posCmd = new G4UIcmdWith3Vector("/lemuGun/gunPosition",this);
posCmd->SetGuidance("Set Gun Position >> IN CENTIMETERS.");
posCmd->SetParameterName("X [cm]","Y [cm]","Z [cm]",true,true);
posCmd->SetDefaultValue(Hep3Vector(0., 0., -114));
momCmd = new G4UIcmdWith3Vector("/lemuGun/MomentumDirection",this);
momCmd->SetGuidance("Set momentum direction >> sum must equal one.");
momCmd->SetParameterName("momX ","momY ","momZ ",true,true);
momCmd->SetDefaultValue(Hep3Vector(0., 0., 1.));
scaCmd = new G4UIcmdWith3Vector("/lemuGun/scan/square",this);
scaCmd->SetGuidance("Gun scan: xrange yrange nbins \n Shoot right number of particles to fill. \n xrange and yrange are divided in nbins.\n");
scaCmd->SetParameterName("X range [cm]","Y range [cm]","Number of bins",true,true);
scaCmd->SetDefaultValue(Hep3Vector(2., 2., 400));
scbCmd = new G4UIcmdWith3Vector("/lemuGun/scan/circular",this);
scbCmd->SetGuidance("Gun scan: radius Rsteps ThetaSteps \n Shoot Rsteps*Thetasteps particles to fill.");
scbCmd->SetParameterName("Radius [cm]","Number of step along radius","Number of steps along angle",true,true);
scbCmd->SetDefaultValue(Hep3Vector(1., 36 , 360 ));
scgCmd = new G4UIcmdWith3Vector("/lemuGun/scan/gauss",this);
scgCmd->SetGuidance("Gun gauss scan:.");
scgCmd->SetParameterName("Radius [cm]","Number of step along radius","Number of steps along angle",true,true);
scgCmd->SetDefaultValue(Hep3Vector(1., 36 , 360 ));
reset = new G4UIcmdWithoutParameter("/lemuGun/scan/reset",this);
reset->SetGuidance("\n Reset the counters for scanning");
setEnergy = new G4UIcmdWithADouble("/lemuGun/energy/defined",this);
setEnergy->SetGuidance("\n Energy Value >> IN keV \n ");
setEnergy->SetParameterName("Energy in [keV]",false);
setEnergy->SetDefaultValue(20);
setEnergy->AvailableForStates(G4State_PreInit,G4State_Idle);
setKEoffset = new G4UIcmdWithADouble("/lemuGun/energy/offset",this); // not implemented yet
setKEoffset->SetGuidance("\n KEoffset Value >> IN keV \n ");
setKEoffset->SetParameterName("KEoffset in [keV]; default value 3.73",false);
setKEoffset->SetDefaultValue(0);
setKEoffset->AvailableForStates(G4State_PreInit,G4State_Idle);
setRndEnergy = new G4UIcmdWithAString("/lemuGun/energy/random",this);
setRndEnergy->SetGuidance("Gaussian energy distribution with default mean 20 kev and 0.5 kev deviation");
setRndEnergy->SetParameterName("Random Energy: on/off",true);
setRndEnergy->SetDefaultValue("on");
setMuonium = new G4UIcmdWithAString("/lemuGun/particle",this);
setMuonium->SetGuidance("Particles to be shot");
setMuonium->SetParameterName("Particle types: mu+/Mu or other.",true);
setMuonium->SetDefaultValue("mu+");
setEGauss = new G4UIcmdWith3Vector("/lemuGun/energy/gauss",this);
setEGauss->SetGuidance("Gaussian energy distribution with specified mean and standard deviation\n ENTER VALUES >> IN keV ");
setEGauss->SetParameterName("Mean Energy","Standard Deviation","",true,true);
setEGauss->SetDefaultValue(Hep3Vector(20., 0.5, 0.0));
}
/*!
* Kills the implemented pointers.
*/
LEMuSRPgaMessenger::~LEMuSRPgaMessenger()
{
delete posCmd;
delete momCmd;
delete scaCmd;
delete scgCmd;
delete scbCmd;
delete reset;
delete setEnergy;
delete setRndEnergy;
delete setMuonium;
delete setKEoffset;
delete setEGauss;
delete pgaDirectory;
}
/*!
* This method registers all the operation to take when a command is
* entered in the terminal. Typically, the command is read and according to its name, is identified to a command defined in the constructor.
* Then the user value is read by the GetNewValue type methods. It can be a string, a double, a vector etc.
*
* What to do with this new value(s) is then implemented.
*/
void LEMuSRPgaMessenger::SetNewValue(G4UIcommand * command,G4String newValues)
{
if( command==posCmd )
{
lemuPGA->scan=0;
lemuPGA->X=posCmd->GetNew3VectorValue(newValues).x();
lemuPGA->Y=posCmd->GetNew3VectorValue(newValues).y();
lemuPGA->Z=posCmd->GetNew3VectorValue(newValues).z();
}
else if( command==momCmd )
{
// lemuPGA->scan=0;
lemuPGA->momX=momCmd->GetNew3VectorValue(newValues).x();
lemuPGA->momY=momCmd->GetNew3VectorValue(newValues).y();
lemuPGA->momZ=momCmd->GetNew3VectorValue(newValues).z();
}
else if( command==scaCmd)
{
lemuPGA->scan=1;
G4int xb, yb;
lemuPGA->m_xrange=scaCmd->GetNew3VectorValue(newValues).x();
lemuPGA->m_yrange=scaCmd->GetNew3VectorValue(newValues).y();
xb=(G4int)(scaCmd->GetNew3VectorValue(newValues).z()/(2*scaCmd->GetNew3VectorValue(newValues).x()));
yb=(G4int)(scaCmd->GetNew3VectorValue(newValues).z()/(2*scaCmd->GetNew3VectorValue(newValues).y()));
// xb=(G4int)(scaCmd->GetNew3VectorValue(newValues).z());
// yb=(G4int)(scaCmd->GetNew3VectorValue(newValues).z());
lemuPGA->m_nbxsteps=xb;
lemuPGA->m_nbysteps=yb;
lemuPGA->m_counterx = 0;
lemuPGA->m_countery = 0;
G4cout<<"Scan will make " << lemuPGA->m_nbxsteps << " steps along x and " <<lemuPGA->m_nbysteps <<" steps along y.\n sHooT :: " << xb*yb <<" particles to fill.\n ";
}
else if( command==scbCmd)
{
lemuPGA->scan=2;
lemuPGA->m_xrange=scbCmd->GetNew3VectorValue(newValues).x();
lemuPGA->m_nbxsteps=(G4int)scbCmd->GetNew3VectorValue(newValues).y();
lemuPGA->m_nbysteps=(G4int)scbCmd->GetNew3VectorValue(newValues).z();
lemuPGA->m_counterx = 0;
lemuPGA->m_countery = 0;
}
else if( command==scgCmd)
{
lemuPGA->scan=3;
lemuPGA->m_xrange=scgCmd->GetNew3VectorValue(newValues).x();
lemuPGA->sc_mean =scgCmd->GetNew3VectorValue(newValues).y();
lemuPGA->sc_stddev=scgCmd->GetNew3VectorValue(newValues).z();
lemuPGA->m_counterx = 0;
lemuPGA->m_countery = 0;
G4cout<<"Scan will make 40 steps along radius and 180 steps along angle.\n sHooT :: 3600 particles to fill.\n ";
}
else if( command==reset)
{
lemuPGA->m_counterx = 0;
lemuPGA->m_countery = 0;
}
else if( command==setMuonium)
{
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
if(particleTable->FindParticle(newValues))
{
lemuPGA->pname=newValues;
}
else
{
lemuPGA->pname="mu+";
G4cout<<"Particle " << newValues<<" not found ==>> will shoot mu+. "<<G4endl;
};
}
else if( command==setKEoffset)
{
lemuPGA->ke_offset=setKEoffset->GetNewDoubleValue(newValues)*keV;
}
else if(command == setEnergy)
{
lemuPGA->rnd=false;
G4double k=setEnergy->GetNewDoubleValue(newValues);
lemuPGA->energy=k*keV;
}
else if(command == setRndEnergy)
{
lemuPGA->rnd=true;
}
else if( command==setEGauss )
{
lemuPGA->gauss=1;
lemuPGA->mean = setEGauss->GetNew3VectorValue(newValues).x();
lemuPGA->stddev= setEGauss->GetNew3VectorValue(newValues).y();
}
}