EventGeneratorTransfertToResonance.cc 31.21 KiB
// C++ headers
#include <iostream>
#include <fstream>
// G4 header defining G4 types
#include "globals.hh"
// G4 headers
#include "G4ParticleTable.hh"
#include "G4ParticleGun.hh"
// G4 headers including CLHEP headers
// for generating random numbers
#include "Randomize.hh"
// NPTool headers
#include "EventGeneratorTransfertToResonance.hh"
#include "RootOutput.h"
using namespace std;
using namespace CLHEP;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
EventGeneratorTransfertToResonance::EventGeneratorTransfertToResonance()
{
//------------- Default Constructor -------------
m_Reaction = new Reaction() ;
m_BeamFWHMX = 0 ;
m_BeamFWHMY = 0 ;
m_BeamEmmitanceTheta = 0 ;
m_BeamEmmitancePhi = 0 ;
m_ResonanceDecayZ = 0 ;
m_ResonanceDecayA = 0 ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
EventGeneratorTransfertToResonance::~EventGeneratorTransfertToResonance()
{
//------------- Default Destructor ------------
delete m_Reaction ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
EventGeneratorTransfertToResonance::EventGeneratorTransfertToResonance( string name1 ,
string name2 ,
string name3 ,
string name4 ,
double BeamEnergy ,
double ExcitationEnergy ,
double BeamEnergySpread ,
double BeamFWHMX ,
double BeamFWHMY ,
double BeamEmmitanceTheta ,
double BeamEmmitancePhi ,
int ResonanceDecayZ ,
int ResonanceDecayA ,
bool ShootLight ,
bool ShootHeavy ,
bool ShootDecayProduct ,
string Path )
{
//------------- Constructor with nuclei names and beam energy ------------
SetEverything( name1 , //Beam nuclei
name2 , //Target nuclei
name3 , //Product of reaction
name4 , //Product of reaction
BeamEnergy , //Beam Energy
ExcitationEnergy , //Excitation of Heavy Nuclei
BeamEnergySpread ,
BeamFWHMX ,
BeamFWHMY ,
BeamEmmitanceTheta ,
BeamEmmitancePhi ,
ResonanceDecayZ ,
ResonanceDecayA ,
ShootLight ,
ShootHeavy ,
ShootDecayProduct ,
Path );
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void EventGeneratorTransfertToResonance::InitializeRootOutput()
{
RootOutput *pAnalysis = RootOutput::getInstance();
TTree *pTree = pAnalysis->GetTree();
pTree->Branch("ThetaCM" , &m_InitialThetaCM , "ThetaCM/D");
pTree->Branch("InitialLightEnergy", &m_InitialLightEnergy , "InitialLightEnergy/D");
pTree->Branch("InitialLightTheta" , &m_InitialLightTheta , "InitialLightTheta/D");
pTree->Branch("InitialBeamEnergy" , &m_InitialBeamEnergy , "InitialBeamEnergy/D");
pTree->Branch("InitialBeamTheta" , &m_InitialBeamTheta , "InitialBeamTheta/D");
pTree->Branch("InitialBeamX" , &m_InitialBeamX , "InitialBeamX/D");
pTree->Branch("InitialBeamY" , &m_InitialBeamY , "InitialBeamY/D");
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void EventGeneratorTransfertToResonance::Print() const
{
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Inherit from VEventGenerator
void EventGeneratorTransfertToResonance::ReadConfiguration(string Path)
{
////////General Reading needs////////
string LineBuffer;
string DataBuffer;
////////Reaction Setting needs///////
string Beam, Target, Heavy, Light, CrossSectionPath ;
G4double BeamEnergy = 0 , ExcitationEnergy = 0 , BeamEnergySpread = 0 , BeamFWHMX = 0 , BeamFWHMY = 0 , BeamEmmitanceTheta = 0 , BeamEmmitancePhi=0, ResonanceDecayZ = 0 , ResonanceDecayA = 0 ;
bool ShootLight = false ;
bool ShootHeavy = false ;
bool ShootDecayProduct = false ;
bool ReadingStatus = false ;
bool check_Beam = false ;
bool check_Target = false ;
bool check_Light = false ;
bool check_Heavy = false ;
bool check_ExcitationEnergy = false ;
bool check_BeamEnergy = false ;
bool check_BeamEnergySpread = false ;
bool check_FWHMX = false ;
bool check_FWHMY = false ;
bool check_EmmitanceTheta = false ;
bool check_EmmitancePhi = false ;
bool check_CrossSectionPath = false ;
bool check_ShootLight = false ;
bool check_ShootHeavy = false ;
bool check_ResonanceDecayZ = false ;
bool check_ResonanceDecayA = false ;
bool check_ShootDecayProduct = false ;
//////////////////////////////////////////////////////////////////////////////////////////
ifstream ReactionFile;
ReactionFile.open(Path.c_str());
if (ReactionFile.is_open()) {} else {
return;
}
while (!ReactionFile.eof()) {
//Pick-up next line
getline(ReactionFile, LineBuffer);
if (LineBuffer.compare(0, 9, "Transfert") == 0) { ReadingStatus = true ;}
while(ReadingStatus){
ReactionFile >> DataBuffer;
//Search for comment Symbol %
if (DataBuffer.compare(0, 1, "%") == 0) {/* Do Nothing */;}
else if (DataBuffer.compare(0, 5, "Beam=") == 0) {
check_Beam = true ;
ReactionFile >> DataBuffer;
Beam = DataBuffer;
G4cout << "Beam " << Beam << G4endl;
}
else if (DataBuffer.compare(0, 7, "Target=") == 0) {
check_Target = true ;
ReactionFile >> DataBuffer;
Target = DataBuffer;
G4cout << "Target " << Target << G4endl;
}
else if (DataBuffer.compare(0, 6, "Light=") == 0) {
check_Light = true ;
ReactionFile >> DataBuffer;
Light = DataBuffer;
G4cout << "Light " << Light << G4endl;
}
else if (DataBuffer.compare(0, 6, "Heavy=") == 0) {
check_Heavy = true ;
ReactionFile >> DataBuffer;
Heavy = DataBuffer;
G4cout << "Heavy " << Heavy << G4endl;
}
else if (DataBuffer.compare(0, 17, "ExcitationEnergy=") == 0) {
check_ExcitationEnergy = true ;
ReactionFile >> DataBuffer;
ExcitationEnergy = atof(DataBuffer.c_str()) * MeV;
G4cout << "Excitation Energy " << ExcitationEnergy / MeV << " MeV" << G4endl;
}
else if (DataBuffer.compare(0, 11, "BeamEnergy=") == 0) {
check_BeamEnergy = true ;
ReactionFile >> DataBuffer;
BeamEnergy = atof(DataBuffer.c_str()) * MeV;
G4cout << "Beam Energy " << BeamEnergy / MeV << " MeV" << G4endl;
}
else if (DataBuffer.compare(0, 17, "BeamEnergySpread=") == 0) {
check_BeamEnergySpread = true ;
ReactionFile >> DataBuffer;
BeamEnergySpread = atof(DataBuffer.c_str()) * MeV;
G4cout << "Beam Energy Spread " << BeamEnergySpread / MeV << " MeV" << G4endl;
}
else if (DataBuffer.compare(0, 11, "BeamFWHMX=") == 0) {
check_FWHMX = true ;
ReactionFile >> DataBuffer;
BeamFWHMX = atof(DataBuffer.c_str()) * mm;
G4cout << "Beam FWHM X " << BeamFWHMX << " mm" << G4endl;
}
else if (DataBuffer.compare(0, 11, "BeamFWHMY=") == 0) {
check_FWHMY = true ;
ReactionFile >> DataBuffer;
BeamFWHMY = atof(DataBuffer.c_str()) * mm;
G4cout << "Beam FWHM Y " << BeamFWHMX << " mm" << G4endl;
}
else if (DataBuffer.compare(0, 19, "BeamEmmitanceTheta=") == 0) {
check_EmmitanceTheta = true ;
ReactionFile >> DataBuffer;
BeamEmmitanceTheta = atof(DataBuffer.c_str()) * rad;
G4cout << "Beam Emmitance Theta " << BeamEmmitanceTheta / deg << " deg" << G4endl;
}
else if (DataBuffer.compare(0, 17, "BeamEmmitancePhi=") == 0) {
check_EmmitancePhi = true ;
ReactionFile >> DataBuffer;
BeamEmmitancePhi = atof(DataBuffer.c_str()) * rad;
G4cout << "Beam Emmitance Phi " << BeamEmmitancePhi / deg << " deg" << G4endl;
}
else if (DataBuffer.compare(0, 17, "ResonanceDecayZ=") == 0) {
check_ResonanceDecayZ = true ;
ReactionFile >> DataBuffer;
ResonanceDecayZ = atof(DataBuffer.c_str());
G4cout << "ResonanceDecayZ " << ResonanceDecayZ << G4endl;
}
else if (DataBuffer.compare(0, 17, "ResonanceDecayA=") == 0) {
check_ResonanceDecayA = true ;
ReactionFile >> DataBuffer;
ResonanceDecayA = atof(DataBuffer.c_str());
G4cout << "ResonanceDecayA " << ResonanceDecayA << G4endl;
}
else if (DataBuffer.compare(0, 17, "CrossSectionPath=") == 0) {
check_CrossSectionPath = true ;
ReactionFile >> CrossSectionPath;
G4cout << "Cross Section File: " << CrossSectionPath << G4endl ;
}
else if (DataBuffer.compare(0, 11, "ShootLight=") == 0) {
check_ShootLight = true ;
ReactionFile >> DataBuffer;
if (atof(DataBuffer.c_str()) == 1) ShootLight = true ;
if (ShootLight) G4cout << "Shoot Light particle : yes" << G4endl;
else G4cout << "Shoot Light particle : no" << G4endl;
}
else if (DataBuffer.compare(0, 11, "ShootHeavy=") == 0) {
check_ShootHeavy = true ;
ReactionFile >> DataBuffer;
if (atof(DataBuffer.c_str()) == 1) ShootHeavy = true ;
if (ShootHeavy) G4cout << "Shoot Heavy particle : yes" << G4endl;
else G4cout << "Shoot Heavy particle : no" << G4endl;
}
else if (DataBuffer.compare(0, 18, "ShootDecayProduct=") == 0) {
check_ShootDecayProduct = true ;
ReactionFile >> DataBuffer;
if (atof(DataBuffer.c_str()) == 1) ShootDecayProduct = true ;
if (ShootDecayProduct) G4cout << "Shoot DecayProducts from decay : yes" << G4endl;
else G4cout << "Shoot DecayProducts from decay : no" << G4endl;
}
///////////////////////////////////////////////////
// If no Transfert Token and no comment, toggle out
else
{ReadingStatus = false; G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ;}
///////////////////////////////////////////////////
// If all Token found toggle out
if( check_Beam && check_Target && check_Light && check_Heavy && check_ExcitationEnergy
&& check_BeamEnergy && check_BeamEnergySpread && check_FWHMX && check_FWHMY && check_EmmitanceTheta
&& check_EmmitancePhi && check_CrossSectionPath && check_ShootLight && check_ShootHeavy
&& check_ResonanceDecayZ && check_ResonanceDecayA && check_ShootDecayProduct)
ReadingStatus = false ;
}
}
SetEverything( Beam ,
Target ,
Light ,
Heavy ,
BeamEnergy ,
ExcitationEnergy ,
BeamEnergySpread ,
BeamFWHMX ,
BeamFWHMY ,
BeamEmmitanceTheta ,
BeamEmmitancePhi ,
ResonanceDecayZ ,
ResonanceDecayA ,
ShootLight ,
ShootHeavy ,
ShootDecayProduct ,
CrossSectionPath );
ReactionFile.close();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void EventGeneratorTransfertToResonance::GenerateEvent(G4Event* anEvent , G4ParticleGun* particleGun)
{
//////////////////////////////////////////////////
//////Define the kind of particle to shoot////////
//////////////////////////////////////////////////
G4int LightZ = m_Reaction->GetNucleus3()->GetZ() ;
G4int LightA = m_Reaction->GetNucleus3()->GetA() ;
G4ParticleDefinition* LightName
= G4ParticleTable::GetParticleTable()->GetIon(LightZ, LightA, 0.);
G4int HeavyZ = m_Reaction->GetNucleus4()->GetZ() ;
G4int HeavyA = m_Reaction->GetNucleus4()->GetA() ;
//////////////////////////////////////////////////
/////Choose ThetaCM following Cross Section //////
//////////////////////////////////////////////////
//Calling RandGeneral fonction, which taking a double array as argument
CLHEP::RandGeneral CrossSectionShoot(m_Reaction->GetCrossSection(), m_Reaction->GetCrossSectionSize() ) ;
G4double ThetaCM = CrossSectionShoot.shoot() * (180 * deg) ;
//G4double ThetaCM = 0;
//Set the Theta angle of reaction
m_InitialThetaCM = ThetaCM;
//////////////////////////////////////////////////
////Momentum and direction set with kinematics////
//////////////////////////////////////////////////
//Variable where to store results.
G4double ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy;
//Compute Kinematic using previously defined ThetaCM
m_Reaction->KineRelativistic(ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy);
//to write thetaCM in the root file
m_InitialLightTheta = ThetaLight / deg ;
m_InitialLightEnergy = EnergyLight / MeV ;
// Vertex position and beam angle
// 11Li Beam@Riken
G4double x0 = 1000 * cm ;
G4double y0 = 1000 * cm ;
//shoot inside the target.
if (m_TargetRadius != 0) {
while (sqrt(x0*x0 + y0*y0) > m_TargetRadius) {
x0 = RandGauss::shoot(0, m_BeamFWHMX / 2.35) ;
y0 = RandGauss::shoot(0, m_BeamFWHMY / 2.35) ;
}
}
else {
x0 = 0 ;
y0 = 0 ;
}
// FIXME a changer pour prendre en compte correctement l'emmitance
G4double Beam_theta = RandGauss::shoot(0, m_BeamEmmitanceTheta) ;
// must shoot inside the target.
G4double z0 = (-m_TargetThickness / 2 + CLHEP::RandFlat::shoot() * m_TargetThickness) ;
// Move to the target
x0 += m_TargetX ;
y0 += m_TargetY ;
z0 += m_TargetZ ;
// Store initial value
m_InitialBeamX = x0 ;
m_InitialBeamY = y0 ;
m_InitialBeamTheta = Beam_theta ;
//////////////////////////////////////////////////
/////Now define everything for light particle/////
//////////////////////////////////////////////////
particleGun->SetParticleDefinition(LightName);
G4double theta = ThetaLight + Beam_theta ;
G4double phi = CLHEP::RandFlat::shoot() * 2 * pi ;
G4double particle_energy = EnergyLight ;
// Direction of particle, energy and laboratory angle
G4double momentum_x = sin(theta) * cos(phi) ;
G4double momentum_y = sin(theta) * sin(phi) ;
G4double momentum_z = cos(theta) ;
//Set the gun to shoot
particleGun->SetParticleMomentumDirection(G4ThreeVector(momentum_x, momentum_y, momentum_z)) ;
particleGun->SetParticleEnergy(particle_energy) ;
particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ;
//Shoot the light particle
if (m_ShootLight) particleGun->GeneratePrimaryVertex(anEvent) ;
//////////////////////////////////////////////////
/////Now define everything for heavy particle/////
//////////////////////////////////////////////////
theta = ThetaHeavy + Beam_theta ;
particle_energy = EnergyHeavy ;
if (m_ShootHeavy) ResonanceDecay( HeavyZ ,
HeavyA ,
EnergyHeavy ,
theta ,
phi ,
x0 ,
y0 ,
z0 ,
anEvent ,
particleGun );
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void EventGeneratorTransfertToResonance::ResonanceDecay(G4int parentZ ,
G4int parentA ,
G4double EnergyHeavy ,
G4double ThetaHeavy ,
G4double PhiHeavy ,
G4double x0 ,
G4double y0 ,
G4double z0 ,
G4Event* anEvent ,
G4ParticleGun* particleGun)
{
//FIXME
G4int NumberOfNeutrons = (parentA - parentZ) - (m_ResonanceDecayA - m_ResonanceDecayZ) ;
G4int NumberOfProtons = parentZ - m_ResonanceDecayZ ;
G4int NumberOfDecayProducts = NumberOfNeutrons + NumberOfProtons ;
/*G4int NumberOfNeutrons = 1 ;
G4int NumberOfProtons = 0 ;
G4int NumberOfDecayProducts = NumberOfNeutrons + NumberOfProtons ;*/
if (NumberOfNeutrons < 0 || NumberOfProtons < 0) {
G4cout << "Error input for Resonance decay" << G4endl;
return;
}
else {
//Obtain Mass of daughter Nuclei
G4ParticleDefinition* parent
= G4ParticleTable::GetParticleTable()->GetIon(parentZ, parentA, m_Reaction->GetExcitation()) ;
G4ParticleDefinition* daughter
= G4ParticleTable::GetParticleTable()->GetIon(m_ResonanceDecayZ, m_ResonanceDecayA, 0.) ;
G4ParticleDefinition* neutron
= G4ParticleTable::GetParticleTable()->FindParticle("neutron");
G4ParticleDefinition* proton
= G4ParticleTable::GetParticleTable()->FindParticle("proton");
G4double M = parent -> GetPDGMass() ;
G4double md = daughter -> GetPDGMass() ;
G4double mn = neutron -> GetPDGMass() ;
G4double mp = proton -> GetPDGMass() ;
// FIXME Hexaneutron
/* mn = 6*(neutron-> GetPDGMass())-100*keV ;
G4double E = (M*M - mn*mn + md*md) / (2*M) ;
G4double p = sqrt(( M*M - (md + mn)*(md + mn) ) * ( M*M - (md - mn)*(md - mn) )) / (2*M) ;*/
// G4double cosThetaCM = CLHEP::RandFlat::shoot()*2-1 ;
// G4double ThetaCM = acos(cosThetaCM) ;
// G4double PhiCM = CLHEP::RandFlat::shoot() * 2 * pi ;
// FIXME Hexaneutron
/*
G4double DaughterMomentumX = sin(ThetaCM)*cos(PhiCM) ;
G4double DaughterMomentumY = sin(ThetaCM)*sin(PhiCM) ;
G4double DaughterMomentumZ = cos(ThetaCM) ;*/
G4double Q = m_Reaction->GetExcitation() + M - md - mn * NumberOfNeutrons - mp * NumberOfProtons ;
vector<G4double> DecayProductsMomentumCM ;
vector<G4double> DecayProductsMomentumXCM ;
vector<G4double> DecayProductsMomentumYCM ;
vector<G4double> DecayProductsMomentumZCM ;
vector<G4double> DecayProductsThetaCM ;
vector<G4double> DecayProductsPhiCM ;
G4double AvaibleEnergy = Q ;
//Calculate Energy of Heavy
G4double MomentumCMHeavy = CLHEP::RandFlat::shoot() * AvaibleEnergy ;
AvaibleEnergy = AvaibleEnergy - MomentumCMHeavy ;
G4double MomentumCM = 0 ;
// Calculate DecayProducts Properties
for (G4int i = 0 ; i < NumberOfDecayProducts ; i++) {
if (i != NumberOfDecayProducts - 1) MomentumCM = CLHEP::RandFlat::shoot() * AvaibleEnergy ;
else MomentumCM = AvaibleEnergy ;
AvaibleEnergy = AvaibleEnergy - MomentumCM ;
DecayProductsMomentumCM.push_back(MomentumCM) ;
G4double cosThetaCM = CLHEP::RandFlat::shoot() * 2 - 1 ;
G4double ThetaCM = acos(cosThetaCM) ;
DecayProductsThetaCM.push_back(ThetaCM) ;
G4double PhiCM = CLHEP::RandFlat::shoot() * 2 * pi ;
DecayProductsPhiCM.push_back(PhiCM) ;
DecayProductsMomentumXCM.push_back(sin(ThetaCM)*cos(PhiCM)) ;
DecayProductsMomentumYCM.push_back(sin(ThetaCM)*sin(PhiCM)) ;
DecayProductsMomentumZCM.push_back(cos(ThetaCM)) ;
}
// Applied conservation of Momentum to daughter nuclei
G4double DaughterMomentumX = 0 ;
G4double DaughterMomentumY = 0 ;
G4double DaughterMomentumZ = 0 ;
for (G4int i = 0 ; i < NumberOfDecayProducts ; i++) {
DaughterMomentumX = (DaughterMomentumX - DecayProductsMomentumCM[i] * DecayProductsMomentumXCM[i]) ;
DaughterMomentumY = (DaughterMomentumY - DecayProductsMomentumCM[i] * DecayProductsMomentumYCM[i]) ;
DaughterMomentumZ = (DaughterMomentumZ - DecayProductsMomentumCM[i] * DecayProductsMomentumZCM[i]) ;
}
// Daughter MomentumCM
G4double p =
sqrt(DaughterMomentumX * DaughterMomentumX + DaughterMomentumY * DaughterMomentumY + DaughterMomentumZ * DaughterMomentumZ) ;
// Daughter EnergyCm
G4double E = sqrt(p * p + md * md) ;
DaughterMomentumX = DaughterMomentumX / p ;
DaughterMomentumY = DaughterMomentumY / p ;
DaughterMomentumZ = DaughterMomentumZ / p ;
// CM to Lab //
// Initial Lab to CM Momentum
G4double InitialE = sqrt(EnergyHeavy * EnergyHeavy + M * M) ;
G4double InitialMomentum = EnergyHeavy ;
G4double InitialMomentumX = sin(ThetaHeavy) * cos(PhiHeavy) ;
G4double InitialMomentumY = sin(ThetaHeavy) * sin(PhiHeavy) ;
G4double InitialMomentumZ = cos(ThetaHeavy) ;
// Beta and Gamma CM to Lab
/* G4double betaX = (DaughterMomentumX*p - InitialMomentumX*InitialMomentum)/E ;
G4double betaY = (DaughterMomentumY*p - InitialMomentumY*InitialMomentum)/E ;
G4double betaZ = (DaughterMomentumZ*p - InitialMomentumZ*InitialMomentum)/E ;
G4double beta = sqrt (betaX*betaX + betaY*betaY + betaZ*betaZ ) ;
G4double beta2 = beta*beta ;
G4double gamma = 1 / ( sqrt(1 - beta2 ) ) ;*/
G4double betaX = -(InitialMomentumX * InitialMomentum) / InitialE ;
G4double betaY = -(InitialMomentumY * InitialMomentum) / InitialE ;
G4double betaZ = -(InitialMomentumZ * InitialMomentum) / InitialE ;
G4double beta = sqrt(betaX * betaX + betaY * betaY + betaZ * betaZ) ;
G4double beta2 = beta * beta ;
G4double gamma = 1 / (sqrt(1 - beta2)) ;
// Calculate everything for heavy particule
/* G4double NewEnergy =
gamma*E
- betaX*gamma*DaughterMomentumX*p
- betaY*gamma*DaughterMomentumY*p
- betaZ*gamma*DaughterMomentumZ*p;*/
G4double NewMomentumX =
- betaX * gamma * E
+ DaughterMomentumX * p + (gamma - 1) * (betaX * betaX) / (beta2) * DaughterMomentumX * p
+ (gamma - 1) * (betaX * betaY) / (beta2) * DaughterMomentumY * p
+ (gamma - 1) * (betaX * betaZ) / (beta2) * DaughterMomentumZ * p ;
G4double NewMomentumY =
- betaY * gamma * E
+ (gamma - 1) * (betaY * betaX) / (beta2) * DaughterMomentumX * p
+ DaughterMomentumY * p + (gamma - 1) * (betaY * betaY) / (beta2) * DaughterMomentumY * p
+ (gamma - 1) * (betaY * betaZ) / (beta2) * DaughterMomentumZ * p ;
G4double NewMomentumZ =
- betaZ * gamma * E
+ (gamma - 1) * (betaZ * betaX) / (beta2) * DaughterMomentumX * p
+ (gamma - 1) * (betaZ * betaY) / (beta2) * DaughterMomentumY * p
+ DaughterMomentumZ * p + (gamma - 1) * (betaZ * betaZ) / (beta2) * DaughterMomentumZ * p ;
G4double
NewEnergy = sqrt(NewMomentumX * NewMomentumX + NewMomentumY * NewMomentumY + NewMomentumZ * NewMomentumZ) ;
NewMomentumX = NewMomentumX / NewEnergy ;
NewMomentumY = NewMomentumY / NewEnergy ;
NewMomentumZ = NewMomentumZ / NewEnergy ;
//Set the gun to shoot
particleGun->SetParticleDefinition(daughter) ;
particleGun->SetParticleMomentumDirection(G4ThreeVector(NewMomentumX, NewMomentumY, NewMomentumZ)) ;
particleGun->SetParticleEnergy(NewEnergy) ;
particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ;
// Shoot the Daugter
particleGun->GeneratePrimaryVertex(anEvent) ;
if (m_ShootDecayProduct) {
G4int jj = 0 ;
for (; jj < NumberOfNeutrons ; jj++) {
p = sqrt(DecayProductsMomentumXCM[jj] * DecayProductsMomentumXCM[jj]
+ DecayProductsMomentumYCM[jj] * DecayProductsMomentumYCM[jj]
+ DecayProductsMomentumZCM[jj] * DecayProductsMomentumZCM[jj]) ;
E = sqrt(p * p + mn * mn) ;
NewMomentumX =
- betaX * gamma * E
+ DecayProductsMomentumXCM[jj] * p + (gamma - 1) * (betaX * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ (gamma - 1) * (betaX * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ (gamma - 1) * (betaX * betaZ) / (beta2) * DecayProductsMomentumZCM[jj] * p ;
NewMomentumY =
- betaY * gamma * E
+ (gamma - 1) * (betaY * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ DecayProductsMomentumYCM[jj] * p + (gamma - 1) * (betaY * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ (gamma - 1) * (betaY * betaZ) / (beta2) * DecayProductsMomentumYCM[jj] * p ;
NewMomentumZ =
- betaZ * gamma * E
+ (gamma - 1) * (betaZ * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ (gamma - 1) * (betaZ * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ DecayProductsMomentumZCM[jj] * p + (gamma - 1) * (betaZ * betaZ) / (beta2) * DecayProductsMomentumZCM[jj] * p ;
NewEnergy = sqrt(NewMomentumX * NewMomentumX + NewMomentumY * NewMomentumY + NewMomentumZ * NewMomentumZ) ;
NewMomentumX = NewMomentumX / NewEnergy ;
NewMomentumY = NewMomentumY / NewEnergy ;
NewMomentumZ = NewMomentumZ / NewEnergy ;
//Set the gun to shoot
particleGun->SetParticleDefinition(neutron) ;
particleGun->SetParticleMomentumDirection(G4ThreeVector(NewMomentumX, NewMomentumY, NewMomentumZ)) ;
particleGun->SetParticleEnergy(NewEnergy) ;
particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ;
particleGun->GeneratePrimaryVertex(anEvent) ;
}
for (; jj < NumberOfProtons ; jj++) {
p = sqrt(DecayProductsMomentumXCM[jj] * DecayProductsMomentumXCM[jj]
+ DecayProductsMomentumYCM[jj] * DecayProductsMomentumYCM[jj]
+ DecayProductsMomentumZCM[jj] * DecayProductsMomentumZCM[jj]) ;
E = sqrt(p * p + mp * mp) ;
NewMomentumX =
- betaX * gamma * E
+ DecayProductsMomentumXCM[jj] * p + (gamma - 1) * (betaX * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ (gamma - 1) * (betaX * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ (gamma - 1) * (betaX * betaZ) / (beta2) * DecayProductsMomentumZCM[jj] * p ;
NewMomentumY =
- betaY * gamma * E
+ (gamma - 1) * (betaY * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ DecayProductsMomentumYCM[jj] * p + (gamma - 1) * (betaY * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ (gamma - 1) * (betaY * betaZ) / (beta2) * DecayProductsMomentumYCM[jj] * p ;
NewMomentumZ =
- betaZ * gamma * E
+ (gamma - 1) * (betaZ * betaX) / (beta2) * DecayProductsMomentumXCM[jj] * p
+ (gamma - 1) * (betaZ * betaY) / (beta2) * DecayProductsMomentumYCM[jj] * p
+ DecayProductsMomentumZCM[jj] * p + (gamma - 1) * (betaZ * betaZ) / (beta2) * DecayProductsMomentumZCM[jj] * p ;
NewEnergy = sqrt(NewMomentumX * NewMomentumX + NewMomentumY * NewMomentumY + NewMomentumZ * NewMomentumZ) ;
NewMomentumX = NewMomentumX / NewEnergy ;
NewMomentumY = NewMomentumY / NewEnergy ;
NewMomentumZ = NewMomentumZ / NewEnergy ;
//Set the gun to shoot
particleGun->SetParticleDefinition(neutron) ;
particleGun->SetParticleMomentumDirection(G4ThreeVector(NewMomentumX, NewMomentumY, NewMomentumZ)) ;
particleGun->SetParticleEnergy(NewEnergy) ;
particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ;
particleGun->GeneratePrimaryVertex(anEvent) ;
}
}
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void EventGeneratorTransfertToResonance::SetEverything(string name1 ,
string name2 ,
string name3 ,
string name4 ,
double BeamEnergy ,
double Excitation ,
double BeamEnergySpread ,
double BeamFWHMX ,
double BeamFWHMY ,
double BeamEmmitanceTheta ,
double BeamEmmitancePhi ,
int ResonanceDecayZ ,
int ResonanceDecayA ,
bool ShootLight ,
bool ShootHeavy ,
bool ShootDecayProduct ,
string Path)
{
//------------- Constructor with nuclei names and beam energy ------------
m_Reaction = new Reaction ( name1 ,
name2 ,
name3 ,
name4 ,
BeamEnergy,
Excitation,
Path) ;
m_BeamEnergySpread = BeamEnergySpread ;
m_BeamFWHMX = BeamFWHMX ;
m_BeamFWHMY = BeamFWHMY ;
m_BeamEmmitanceTheta = BeamEmmitanceTheta ;
m_BeamEmmitancePhi = BeamEmmitancePhi ;
m_ResonanceDecayZ = ResonanceDecayZ ;
m_ResonanceDecayA = ResonanceDecayA ;
m_ShootLight = ShootLight ;
m_ShootHeavy = ShootHeavy ;
m_ShootDecayProduct = ShootDecayProduct ;
}