Implementation of initial beam direction command. For now works only for +-z direction.

This commit is contained in:
salman 2011-01-03 13:41:37 +00:00
parent f6ccd6cc75
commit 651bc448f0
4 changed files with 24 additions and 3 deletions

View File

@ -65,6 +65,7 @@ class musrPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
void SetTilt(G4ThreeVector v) {xangle0=v[0]; yangle0=v[1];}
void SetSigmaTilt(G4ThreeVector v) {xangleSigma=v[0]; yangleSigma=v[1];}
void SetPitch(G4double val) {pitch=val;}
void SetBeamDirection(G4ThreeVector vIniDir);
void SetInitialMuonPolariz(G4ThreeVector vIniPol);
void SetInitialPolarizFraction(G4double val) {
if ((val>1.)||(val<-1.)) {
@ -111,6 +112,7 @@ class musrPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
G4double xangle0, yangle0, xangleSigma, yangleSigma, pitch;
G4bool UnpolarisedMuonBeam, TransversalyUnpolarisedMuonBeam;
G4double xPolarisIni, yPolarisIni, zPolarisIni;
G4double xDirection, yDirection, zDirection;
G4double polarisFraction;
G4double muonDecayTimeMin;
G4double muonDecayTimeMax;

View File

@ -65,6 +65,7 @@ class musrPrimaryGeneratorMessenger: public G4UImessenger
G4UIcmdWith3VectorAndUnit* setSigmaTiltAngleCmd;
G4UIcmdWithADoubleAndUnit* setPitchCmd;
G4UIcmdWith3Vector* setMuonPolarizCmd;
G4UIcmdWith3Vector* setDirectionCmd;
G4UIcmdWithADouble* setMuonPolarizFractionCmd;
G4UIcmdWith3VectorAndUnit* setMuonDecayTimeCmd;
G4UIcmdWithAString* setTurtleCmd;

View File

@ -271,8 +271,8 @@ void musrPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
G4double px, py, pz;
px = p*sin(xangle);
py = p*sin(yangle);
pz = std::sqrt(p*p - px*px - py*py);
// works for beam along +-z only for now
pz = zDirection * std::sqrt(p*p - px*px - py*py);
// Assign spin
G4double xpolaris=0, ypolaris=0, zpolaris=0;
@ -381,6 +381,16 @@ void musrPrimaryGeneratorAction::SetInitialMuonPolariz(G4ThreeVector vIniPol)
}
}
//===============================================================================
void musrPrimaryGeneratorAction::SetBeamDirection(G4ThreeVector vIniDir)
{
G4double magnitude=vIniDir.mag();
xDirection=vIniDir(0)/magnitude;
yDirection=vIniDir(1)/magnitude;
zDirection=vIniDir(2)/magnitude;
G4cout<< "Initial Beam Direction set to ("<<xDirection<<","<<yDirection<<","<<zDirection<<")"<<G4endl;
}
//===============================================================================
void musrPrimaryGeneratorAction::SetMuonDecayTimeLimits(G4ThreeVector decayTimeLimits) {
muonDecayTimeMin = decayTimeLimits[0];

View File

@ -126,10 +126,15 @@ musrPrimaryGeneratorMessenger::musrPrimaryGeneratorMessenger(musrPrimaryGenerato
// setMuonPolarizCmd->SetDefaultValue(0) ;
setMuonPolarizCmd = new G4UIcmdWith3Vector("/gun/muonPolarizVector",this);
setMuonPolarizCmd->SetGuidance("Set initial mu polarisation as a vector (without unit)");
setMuonPolarizCmd->SetGuidance("Set initial mu polarisation as a vector (without units)");
setMuonPolarizCmd->SetGuidance(" The vector does not have to be normalised to 1");
setMuonPolarizCmd->SetParameterName("mes_polarisX","mes_polarisY","mes_polarisZ",true,true);
setDirectionCmd = new G4UIcmdWith3Vector("/gun/direction",this);
setDirectionCmd->SetGuidance("Set initial mu beam direction as a vector (without units)");
setDirectionCmd->SetGuidance(" The vector does not have to be normalised to 1");
setDirectionCmd->SetParameterName("DirectionX","DirectionY","DirectionZ",true,true);
setMuonPolarizFractionCmd = new G4UIcmdWithADouble("/gun/muonPolarizFraction",this);
setMuonPolarizFractionCmd->SetGuidance(" Set the fraction of the muon polarisation (in the range of -1 to 1),");
setMuonPolarizFractionCmd->SetGuidance(" where fraction = (N_up_spin - N_down_spin) / (N_up_spin + N_down_spin)");
@ -196,6 +201,7 @@ musrPrimaryGeneratorMessenger::~musrPrimaryGeneratorMessenger()
delete setSigmaTiltAngleCmd;
delete setPitchCmd;
delete setMuonPolarizCmd;
delete setDirectionCmd;
delete setMuonPolarizFractionCmd;
delete setMuonDecayTimeCmd;
delete setTurtleCmd;
@ -245,6 +251,8 @@ void musrPrimaryGeneratorMessenger::SetNewValue(G4UIcommand * command,G4String n
{ musrAction->SetPitch(setPitchCmd->GetNewDoubleValue(newValue));}
if( command == setMuonPolarizCmd)
{ musrAction->SetInitialMuonPolariz(setMuonPolarizCmd->GetNew3VectorValue(newValue));}
if( command == setDirectionCmd)
{ musrAction->SetBeamDirection(setDirectionCmd->GetNew3VectorValue(newValue));}
if( command == setMuonPolarizFractionCmd)
{ musrAction->SetInitialPolarizFraction(setMuonPolarizFractionCmd->GetNewDoubleValue(newValue));}
if( command == setMuonDecayTimeCmd)