From 030fe1d8d1a4e619069d9a115b302fa6ed13886e Mon Sep 17 00:00:00 2001 From: Unknown <unknown> Date: Wed, 2 Oct 2013 10:00:25 +0000 Subject: [PATCH] --- .../DetectorConfiguration/Riken_65mm.detector | 31 +- Inputs/EventGenerator/10He.reaction | 15 +- NPAnalysis/10He_Riken/Analysis | Bin 66916 -> 66708 bytes NPAnalysis/10He_Riken/src/Analysis.cc | 15 +- NPLib/MUST2/Must2Array.cxx | 20 +- NPSimulation/Simulation.cc | 1 - .../include/EventGeneratorTransfert.hh | 12 +- .../EventGeneratorTransfertToResonance.hh | 229 +++--- NPSimulation/src/EventGeneratorTransfert.cc | 7 - .../src/EventGeneratorTransfertToResonance.cc | 744 +++++++++--------- NPSimulation/vis.mac | 2 +- 11 files changed, 527 insertions(+), 549 deletions(-) diff --git a/Inputs/DetectorConfiguration/Riken_65mm.detector b/Inputs/DetectorConfiguration/Riken_65mm.detector index efc969276..0c25c3e98 100644 --- a/Inputs/DetectorConfiguration/Riken_65mm.detector +++ b/Inputs/DetectorConfiguration/Riken_65mm.detector @@ -84,16 +84,25 @@ SILI= 0 CSI= 1 VIS= all %%%%%%% Telescope 6 %%%%%%% -M2Telescope -X1_Y1= 155.77 50.23 8.18 -X1_Y128= 155.77 -50.23 8.18 -X128_Y1= 133.17 50.23 -89.7 -X128_Y128= 133.17 -50.23 -89.7 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all - +%M2Telescope +%X1_Y1= 155.77 50.23 8.18 +%X1_Y128= 155.77 -50.23 8.18 +%X128_Y1= 133.17 50.23 -89.7 +%X128_Y128= 133.17 -50.23 -89.7 +%SI= 1 +%SILI= 1 +%CSI= 0 +%VIS= all +%% Alternate Telescope 6 %% +M2Telescope + THETA= -130 + PHI= 0 + R= 150 + BETA= 0 0 0 + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%% Telescope 7 %%%%%%% M2Telescope X1_Y1= 27.07 50.23 -154.49 @@ -104,7 +113,7 @@ SI= 1 SILI= 1 CSI= 0 VIS= all - + %%%%%%%%%%%%%%%%%%%% AddThinSi %%%%%%%%% Det 1 %%%%%%%% diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction index 8e2f05efa..b84050210 100644 --- a/Inputs/EventGenerator/10He.reaction +++ b/Inputs/EventGenerator/10He.reaction @@ -2,7 +2,7 @@ %%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%Beam energy given in MeV ; Excitation in MeV -Transfert +TransfertToResonance Beam= 11Li Target= 2H Light= 3He @@ -10,13 +10,16 @@ Transfert ExcitationEnergy= 1.0 BeamEnergy= 550 BeamEnergySpread= 0 - BeamFWHMX= 6.232 - BeamFWHMY= 9.069 - BeamEmmitanceTheta= 0.01208 - BeamEmmitancePhi= 0.01681 + SigmaThetaX= 0.6921330164 + SigmaPhiY= 0.963142053 + SigmaX= 6.232 + SigmaY= 9.069 + ResonanceDecayZ= 2 + ResonanceDecayA= 8 CrossSectionPath= 11Li(d,3He)10He.txt - ShootLight= 1 + ShootLight= 0 ShootHeavy= 1 + ShootDecayProduct= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %0.69u diff --git a/NPAnalysis/10He_Riken/Analysis b/NPAnalysis/10He_Riken/Analysis index 6c0904b1217ac65c52f5f7efcf964871d826d228..7a15c0ec1ee2c7c99032279403bdbfc030232674 100755 GIT binary patch delta 24595 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 delta 24507 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 diff --git a/NPAnalysis/10He_Riken/src/Analysis.cc b/NPAnalysis/10He_Riken/src/Analysis.cc index a09db085a..b51e713f1 100644 --- a/NPAnalysis/10He_Riken/src/Analysis.cc +++ b/NPAnalysis/10He_Riken/src/Analysis.cc @@ -68,16 +68,17 @@ int main(int argc,char** argv) myDetector -> BuildPhysicalEvent() ; E = M2 -> GetEnergyDeposit(); - - XTarget = RandomEngine.Gaus(Init->GetICPositionX(0),1); - YTarget = RandomEngine.Gaus(Init->GetICPositionY(0),1); + XTarget = Init->GetICPositionX(0); + YTarget = Init->GetICPositionY(0); +// XTarget = RandomEngine.Gaus(Init->GetICPositionX(0),1); +// YTarget = RandomEngine.Gaus(Init->GetICPositionY(0),1); TVector3 HitDirection = M2 -> GetPositionOfInteraction() - TVector3(XTarget,YTarget,0); - BeamTheta = RandomEngine.Gaus( Init->GetICIncidentAngleTheta(0)*deg , 2*deg ) ; - BeamPhi = RandomEngine.Gaus( Init->GetICIncidentAnglePhi(0)*deg , 2*deg ) ; +// BeamTheta = RandomEngine.Gaus( Init->GetICIncidentAngleTheta(0)*deg , 2*deg ) ; +// BeamPhi = RandomEngine.Gaus( Init->GetICIncidentAnglePhi(0)*deg , 2*deg ) ; -// BeamTheta = Init->GetICIncidentAngleTheta(0)*deg ; BeamPhi = Init->GetICIncidentAnglePhi(0)*deg ; + BeamTheta = Init->GetICIncidentAngleTheta(0)*deg ; BeamPhi = Init->GetICIncidentAnglePhi(0)*deg ; TVector3 BeamDirection = TVector3(cos(BeamPhi)*sin(BeamTheta) , sin(BeamPhi)*sin(BeamTheta) , cos(BeamTheta)) ; // Angle between beam and particle @@ -98,7 +99,7 @@ int main(int argc,char** argv) 20*micrometer , // Target Thickness at 0 degree ThetaMM2Surface ); - // E = E + ThinSi ; +// E = E + ThinSi ; E= He3StripAl.EvaluateInitialEnergy( E , // Energy of the detected particle 0.4*micrometer , // Target Thickness at 0 degree diff --git a/NPLib/MUST2/Must2Array.cxx b/NPLib/MUST2/Must2Array.cxx index b627d4524..0c740c710 100644 --- a/NPLib/MUST2/Must2Array.cxx +++ b/NPLib/MUST2/Must2Array.cxx @@ -239,9 +239,9 @@ void MUST2Array::ReadConfiguration(string Path) //with angle method else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddTelescope( R , - Theta , + AddTelescope( Theta , Phi , + R , beta_u , beta_v , beta_w ); @@ -504,14 +504,14 @@ void MUST2Array::AddTelescope( double theta , for( int j = 0 ; j < 128 ; j++ ) { - X = C.X() + StripPitch * ( U.X()*i + V.X()*j ) ; - Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ) ; - Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ) ; - - lineX.push_back(X) ; - lineY.push_back(Y) ; - lineZ.push_back(Z) ; - + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ) ; + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ) ; + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ) ; + + lineX.push_back(X) ; + lineY.push_back(Y) ; + lineZ.push_back(Z) ; + } OneTelescopeStripPositionX.push_back(lineX) ; diff --git a/NPSimulation/Simulation.cc b/NPSimulation/Simulation.cc index 0d7bb48ef..1c4d652cb 100644 --- a/NPSimulation/Simulation.cc +++ b/NPSimulation/Simulation.cc @@ -23,7 +23,6 @@ // STL #include <vector> - int main(int argc, char** argv) { diff --git a/NPSimulation/include/EventGeneratorTransfert.hh b/NPSimulation/include/EventGeneratorTransfert.hh index f66562a6f..09c3229bc 100644 --- a/NPSimulation/include/EventGeneratorTransfert.hh +++ b/NPSimulation/include/EventGeneratorTransfert.hh @@ -26,8 +26,10 @@ // C++ headers #include <string> -// NPTool headers +// NPSimulation #include "VEventGenerator.hh" + +// NPLib #include "TInitialConditions.h" // NPLib header @@ -52,8 +54,8 @@ class EventGeneratorTransfert : public VEventGenerator double BeamEnergy , // Beam Energy double ExcitationEnergy , // Excitation of Heavy Nuclei double BeamEnergySpread , - double BeamFWHMX , - double BeamFWHMY , + double SigmaX , + double SigmaY , double SigmaThetaX , double SigmaPhiY , bool ShootLight , @@ -118,8 +120,8 @@ class EventGeneratorTransfert : public VEventGenerator double BeamEnergy , // Beam Energy double ExcitationEnergy , // Excitation of Heavy Nuclei double BeamEnergySpread , - double BeamFWHMX , - double BeamFWHMY , + double SigmaX , + double SigmaY , double SigmaThetaX , double SigmaPhiY , bool ShootLight , diff --git a/NPSimulation/include/EventGeneratorTransfertToResonance.hh b/NPSimulation/include/EventGeneratorTransfertToResonance.hh index 312a3239c..348ee5ed1 100644 --- a/NPSimulation/include/EventGeneratorTransfertToResonance.hh +++ b/NPSimulation/include/EventGeneratorTransfertToResonance.hh @@ -16,17 +16,22 @@ * Decription: * * This event Generator is used to simulated two body TransfertReaction. * * A Phase Space calculation is then performed to decay the Heavy product. * + * The TGenPhaseSpace from ROOT is used to calculate a phase space decay * + * with flat distribution * *---------------------------------------------------------------------------* * Comment: * - * This class is not yet operationnal. * + * * * * *****************************************************************************/ // C++ header #include <string> -// NPTool header +// NPSimulation #include "VEventGenerator.hh" +// NPLib +#include "TInitialConditions.h" + // NPLib header #include "NPReaction.h" @@ -37,118 +42,114 @@ using namespace NPL ; class EventGeneratorTransfertToResonance : public VEventGenerator { -public: // Constructors and Destructors - - // Default constructor used to allocate memory - EventGeneratorTransfertToResonance(); - - // This is the constructor to be used - EventGeneratorTransfertToResonance(string name1 , //Beam nuclei - string name2 , //Target nuclei - string name3 , //Product of reaction - string name4 , //Product of reaction - double BeamEnergy , //Beam Energy - double ExcitationEnergy , //Excitation of Heavy Nuclei - double BeamEnergySpread , - double BeamFWHMX , - double BeamFWHMY , - double BeamEmmitanceTheta , - double BeamEmmitancePhi, - int ResonanceDecayZ , - int ResonanceDecayA , - bool ShootLight , - bool ShootHeavy , - bool ShootDecayProduct , - string Path); //Path of the differentiel Cross Section - - // Default Destructor - virtual ~EventGeneratorTransfertToResonance(); - -public: // Inherit from VEventGenerator class - void ReadConfiguration(string) ; - void GenerateEvent(G4Event*, G4ParticleGun*) ; - - void SetTargetCoordinate(G4double X, G4double Y, G4double Z) { - m_TargetX = X; - m_TargetY = Y; - m_TargetZ = Z; - } - - void SetTargetThickness(double TargetThickness) { - m_TargetThickness = TargetThickness ; - } - - void SetTargetRadius(double TargetRadius) { - m_TargetRadius = TargetRadius ; - } - -private: // Particle Shoot Option - bool m_ShootLight ; - bool m_ShootHeavy ; - bool m_ShootDecayProduct ; - -private: // TTree to store initial value of beam and reaction - double m_InitialLightEnergy ; - double m_InitialLightTheta ; - double m_InitialBeamEnergy ; - double m_InitialBeamTheta ; - double m_InitialBeamX ; - double m_InitialBeamY ; - double m_InitialThetaCM ; - -private: // Beam Parameter - double m_BeamEnergySpread ; - double m_BeamFWHMX ; - double m_BeamFWHMY ; - double m_BeamEmmitanceTheta ; - double m_BeamEmmitancePhi ; - -private: // Target Parameter - double m_TargetThickness ; - double m_TargetRadius ; - double m_TargetX ; - double m_TargetY ; - double m_TargetZ ; - -private: // Reaction - Reaction* m_Reaction ; - -private: // Resonance decay channel - int m_ResonanceDecayZ ; - int m_ResonanceDecayA ; - - //Other - void Print() const ; - void InitializeRootOutput() ; - void ResonanceDecay(G4int parentZ , - G4int parentA , - G4double EnergyHeavy , - G4double ThetaHeavy , - G4double PhiHeavy , - G4double x0 , - G4double y0 , - G4double z0 , - G4Event* anEvent , - G4ParticleGun* particleGun); - - - void SetEverything(string name1 , //Beam nuclei - string name2 , //Target nuclei - string name3 , //Product of reaction - string name4 , //Product of reaction - double BeamEnergy , //Beam Energy - double ExcitationEnergy , //Excitation of Heavy Nuclei - double BeamEnergySpread , - double BeamFWHMX , - double BeamFWHMY , - double BeamEmmitanceTheta , - double BeamEmmitancePhi , - int ResonanceDecayZ , - int ResonanceDecayA , - bool ShootLight , - bool ShootHeavy , - bool ShootDecayProduct , - string Path); //Path of the differentiel Cross Section + public: // Constructors and Destructors + + // Default constructor used to allocate memory + EventGeneratorTransfertToResonance(); + + // This is the constructor to be used + EventGeneratorTransfertToResonance(string name1 , //Beam nuclei + string name2 , //Target nuclei + string name3 , //Product of reaction + string name4 , //Product of reaction + double BeamEnergy , //Beam Energy + double ExcitationEnergy , //Excitation of Heavy Nuclei + double BeamEnergySpread , + double SigmaX , + double SigmaY , + double SigmaThetaX , + double SigmaPhiY, + int ResonanceDecayZ , + int ResonanceDecayA , + bool ShootLight , + bool ShootHeavy , + bool ShootDecayProduct , + string Path); //Path of the differentiel Cross Section + + // Default Destructor + virtual ~EventGeneratorTransfertToResonance(); + + public: // Inherit from VEventGenerator class + void ReadConfiguration(string) ; + void GenerateEvent(G4Event*, G4ParticleGun*) ; + + void SetTargetCoordinate(G4double X, G4double Y, G4double Z) { + m_TargetX = X; + m_TargetY = Y; + m_TargetZ = Z; + } + + void SetTargetThickness(double TargetThickness) { + m_TargetThickness = TargetThickness ; + } + + void SetTargetRadius(double TargetRadius) { + m_TargetRadius = TargetRadius ; + } + + private: // Particle Shoot Option + bool m_ShootLight ; + bool m_ShootHeavy ; + bool m_ShootDecayProduct ; + + private: // TTree to store initial value of beam and reaction + TInitialConditions* m_InitConditions; + + private: // Beam Parameter + double m_BeamEnergy ; + double m_BeamEnergySpread ; + double m_SigmaX ; + double m_SigmaY ; + double m_SigmaThetaX ; + double m_SigmaPhiY ; + + private: // Target Parameter + double m_TargetThickness ; + double m_TargetRadius ; + double m_TargetX ; + double m_TargetY ; + double m_TargetZ ; + + private: // Reaction + Reaction* m_Reaction ; + + private: // Resonance decay channel + int m_ResonanceDecayZ ; + int m_ResonanceDecayA ; + + //Other + void Print() const ; + void InitializeRootOutput() ; + void ResonanceDecay( G4double EnergyHeavy , + G4double ThetaHeavy , + G4double PhiHeavy , + G4double x0 , + G4double y0 , + G4double z0 , + G4Event* anEvent , + G4ParticleGun* particleGun); + + // This method return a random Vector of dimension N and magnitude R + // The return distribution populate uniformely the surface of the N-Sphere of radius R + vector<double> PhaseSpaceUniformGenerator( int N , double R); + + void SetEverything(string name1 , //Beam nuclei + string name2 , //Target nuclei + string name3 , //Product of reaction + string name4 , //Product of reaction + double BeamEnergy , //Beam Energy + double ExcitationEnergy , //Excitation of Heavy Nuclei + double BeamEnergySpread , + double SigmaX , + double SigmaY , + double SigmaThetaX , + double SigmaPhiY , + int ResonanceDecayZ , + int ResonanceDecayA , + bool ShootLight , + bool ShootHeavy , + bool ShootDecayProduct , + string Path); //Path of the differentiel Cross Section }; #endif diff --git a/NPSimulation/src/EventGeneratorTransfert.cc b/NPSimulation/src/EventGeneratorTransfert.cc index 12a9205e5..569c489fc 100644 --- a/NPSimulation/src/EventGeneratorTransfert.cc +++ b/NPSimulation/src/EventGeneratorTransfert.cc @@ -464,9 +464,6 @@ void EventGeneratorTransfert::GenerateEvent(G4Event* anEvent , G4ParticleGun* pa particleGun->GeneratePrimaryVertex(anEvent); } if (m_ShootHeavy) { // Case of recoil particle - // - // The case of recoil particle has not been tested with the new version of the event generator - // // Particle type particleGun->SetParticleDefinition(HeavyName); // Particle energy @@ -484,10 +481,6 @@ void EventGeneratorTransfert::GenerateEvent(G4Event* anEvent , G4ParticleGun* pa // write angles in ROOT file m_InitConditions->SetICEmittedAngleThetaLabWorldFrame(theta_world / deg); m_InitConditions->SetICEmittedAnglePhiWorldFrame(phi_world / deg); - // tests -// G4cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" << G4endl; -// G4cout << "cinematique dans ref world : " << G4endl; -// G4cout << "\t" << momentum_kine_world << G4endl; //Set the gun to shoot particleGun->SetParticleMomentumDirection(momentum_kine_world); //Shoot the light particle diff --git a/NPSimulation/src/EventGeneratorTransfertToResonance.cc b/NPSimulation/src/EventGeneratorTransfertToResonance.cc index 0a1fb9e26..df57cbdde 100644 --- a/NPSimulation/src/EventGeneratorTransfertToResonance.cc +++ b/NPSimulation/src/EventGeneratorTransfertToResonance.cc @@ -14,9 +14,11 @@ * Decription: * * This event Generator is used to simulated two body TransfertReaction. * * A Phase Space calculation is then performed to decay the Heavy product. * + * The TGenPhaseSpace from ROOT is used to calculate a phase space decay * + * with flat distribution * *---------------------------------------------------------------------------* * Comment: * - * This class is not yet operationnal. * + * * * * *****************************************************************************/ @@ -30,6 +32,7 @@ // G4 headers #include "G4ParticleTable.hh" #include "G4ParticleGun.hh" +#include "G4RotationMatrix.hh" // G4 headers including CLHEP headers // for generating random numbers @@ -39,6 +42,9 @@ #include "EventGeneratorTransfertToResonance.hh" #include "RootOutput.h" +//Root Headers +#include "TGenPhaseSpace.h" + using namespace std; using namespace CLHEP; @@ -48,21 +54,21 @@ using namespace CLHEP; EventGeneratorTransfertToResonance::EventGeneratorTransfertToResonance() { //------------- Default Constructor ------------- - + m_InitConditions = new TInitialConditions() ; m_Reaction = new Reaction() ; - m_BeamFWHMX = 0 ; - m_BeamFWHMY = 0 ; - m_BeamEmmitanceTheta = 0 ; - m_BeamEmmitancePhi = 0 ; - m_ResonanceDecayZ = 0 ; - m_ResonanceDecayA = 0 ; + m_SigmaX = 0 ; + m_SigmaY = 0 ; + m_SigmaThetaX = 0 ; + m_SigmaPhiY = 0 ; + m_ResonanceDecayZ = 0 ; + m_ResonanceDecayA = 0 ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... EventGeneratorTransfertToResonance::~EventGeneratorTransfertToResonance() { //------------- Default Destructor ------------ - + delete m_InitConditions; delete m_Reaction ; } @@ -74,10 +80,10 @@ EventGeneratorTransfertToResonance::EventGeneratorTransfertToResonance( string double BeamEnergy , double ExcitationEnergy , double BeamEnergySpread , - double BeamFWHMX , - double BeamFWHMY , - double BeamEmmitanceTheta , - double BeamEmmitancePhi , + double SigmaX , + double SigmaY , + double SigmaThetaX , + double SigmaPhiY , int ResonanceDecayZ , int ResonanceDecayA , bool ShootLight , @@ -94,10 +100,10 @@ EventGeneratorTransfertToResonance::EventGeneratorTransfertToResonance( string BeamEnergy , //Beam Energy ExcitationEnergy , //Excitation of Heavy Nuclei BeamEnergySpread , - BeamFWHMX , - BeamFWHMY , - BeamEmmitanceTheta , - BeamEmmitancePhi , + SigmaX , + SigmaY , + SigmaThetaX , + SigmaPhiY , ResonanceDecayZ , ResonanceDecayA , ShootLight , @@ -113,13 +119,7 @@ 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"); + pTree->Branch("InitialConditions", "TInitialConditions", &m_InitConditions); } @@ -140,7 +140,7 @@ void EventGeneratorTransfertToResonance::ReadConfiguration(string Path) ////////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 ; + G4double BeamEnergy = 0 , ExcitationEnergy = 0 , BeamEnergySpread = 0 , SigmaX = 0 , SigmaY = 0 , SigmaThetaX = 0 , SigmaPhiY=0, ResonanceDecayZ = 0 , ResonanceDecayA = 0 ; bool ShootLight = false ; bool ShootHeavy = false ; bool ShootDecayProduct = false ; @@ -237,32 +237,32 @@ while(ReadingStatus){ G4cout << "Beam Energy Spread " << BeamEnergySpread / MeV << " MeV" << G4endl; } - else if (DataBuffer.compare(0, 11, "BeamFWHMX=") == 0) { + else if (DataBuffer.compare(0, 7, "SigmaX=") == 0) { check_FWHMX = true ; ReactionFile >> DataBuffer; - BeamFWHMX = atof(DataBuffer.c_str()) * mm; - G4cout << "Beam FWHM X " << BeamFWHMX << " mm" << G4endl; + SigmaX = atof(DataBuffer.c_str()) * mm; + G4cout << "Beam FWHM X " << SigmaX << " mm" << G4endl; } - else if (DataBuffer.compare(0, 11, "BeamFWHMY=") == 0) { + else if (DataBuffer.compare(0, 7, "SigmaY=") == 0) { check_FWHMY = true ; ReactionFile >> DataBuffer; - BeamFWHMY = atof(DataBuffer.c_str()) * mm; - G4cout << "Beam FWHM Y " << BeamFWHMX << " mm" << G4endl; + SigmaY = atof(DataBuffer.c_str()) * mm; + G4cout << "Beam FWHM Y " << SigmaX << " mm" << G4endl; } - else if (DataBuffer.compare(0, 19, "BeamEmmitanceTheta=") == 0) { + else if (DataBuffer.compare(0, 19, "SigmaThetaX=") == 0) { check_EmmitanceTheta = true ; ReactionFile >> DataBuffer; - BeamEmmitanceTheta = atof(DataBuffer.c_str()) * rad; - G4cout << "Beam Emmitance Theta " << BeamEmmitanceTheta / deg << " deg" << G4endl; + SigmaThetaX = atof(DataBuffer.c_str()) * rad; + G4cout << "Beam Emmitance Theta " << SigmaThetaX / deg << " deg" << G4endl; } - else if (DataBuffer.compare(0, 17, "BeamEmmitancePhi=") == 0) { + else if (DataBuffer.compare(0, 17, "SigmaPhiY=") == 0) { check_EmmitancePhi = true ; ReactionFile >> DataBuffer; - BeamEmmitancePhi = atof(DataBuffer.c_str()) * rad; - G4cout << "Beam Emmitance Phi " << BeamEmmitancePhi / deg << " deg" << G4endl; + SigmaPhiY = atof(DataBuffer.c_str()) * rad; + G4cout << "Beam Emmitance Phi " << SigmaPhiY / deg << " deg" << G4endl; } else if (DataBuffer.compare(0, 17, "ResonanceDecayZ=") == 0) { @@ -335,10 +335,10 @@ while(ReadingStatus){ BeamEnergy , ExcitationEnergy , BeamEnergySpread , - BeamFWHMX , - BeamFWHMY , - BeamEmmitanceTheta , - BeamEmmitancePhi , + SigmaX , + SigmaY , + SigmaThetaX , + SigmaPhiY , ResonanceDecayZ , ResonanceDecayA , ShootLight , @@ -353,10 +353,12 @@ while(ReadingStatus){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void EventGeneratorTransfertToResonance::GenerateEvent(G4Event* anEvent , G4ParticleGun* particleGun) { + // Clear contents of Precedent event (now stored in ROOTOutput) + m_InitConditions->Clear(); + ////////////////////////////////////////////////// //////Define the kind of particle to shoot//////// ////////////////////////////////////////////////// - G4int LightZ = m_Reaction->GetNucleus3()->GetZ() ; G4int LightA = m_Reaction->GetNucleus3()->GetA() ; @@ -366,380 +368,346 @@ void EventGeneratorTransfertToResonance::GenerateEvent(G4Event* anEvent , G4Part 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. + G4ParticleDefinition* HeavyName + = G4ParticleTable::GetParticleTable()->GetIon(HeavyZ, HeavyA, m_Reaction->GetExcitation()*MeV); + // Vertex position and beam angle inte world frame + G4double x0 = 1000 * cm ; + G4double y0 = 1000 * cm ; + G4double Beam_thetaX = 0 ; + G4double Beam_phiY = 0 ; + + //shoot inside the target with correlated angle 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) ; + RandomGaussian2D(0, 0, m_SigmaX, m_SigmaThetaX, x0, Beam_thetaX); + RandomGaussian2D(0, 0, m_SigmaY, m_SigmaPhiY , y0, Beam_phiY ); } } - else { - x0 = 0 ; - y0 = 0 ; + RandomGaussian2D(0,0,0,m_SigmaThetaX,x0,Beam_thetaX); + RandomGaussian2D(0,0,0,m_SigmaPhiY ,y0,Beam_phiY ); } - - // 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 ; + // write emittance angles to ROOT file + m_InitConditions->SetICIncidentEmittanceTheta(Beam_thetaX / deg); + m_InitConditions->SetICIncidentEmittancePhi(Beam_phiY / deg); - // Store initial value - m_InitialBeamX = x0 ; - m_InitialBeamY = y0 ; - m_InitialBeamTheta = Beam_theta ; + // Calculate Angle in spherical coordinate, passing by the direction vector dir + G4double Xdir = cos(pi/2. - Beam_thetaX); + G4double Ydir = cos(pi/2. - Beam_phiY ); + G4double Zdir = sin(pi/2. - Beam_thetaX) + sin(pi/2. - Beam_phiY); + + G4double Beam_theta = acos(Zdir / sqrt(Xdir*Xdir + Ydir*Ydir + Zdir*Zdir)) * rad; + G4double Beam_phi = atan2(Ydir, Xdir) * rad; + if (Beam_phi < 0) Beam_phi += 2*pi; + + // write angles to ROOT file + m_InitConditions->SetICIncidentAngleTheta(Beam_theta / deg); + m_InitConditions->SetICIncidentAnglePhi(Beam_phi / deg); + + ////////////////////////////////////////////////////////// + ///// Build rotation matrix to go from the incident ////// + ///// beam frame to the "world" frame ////// + ////////////////////////////////////////////////////////// + G4ThreeVector col1(cos(Beam_theta) * cos(Beam_phi), + cos(Beam_theta) * sin(Beam_phi), + -sin(Beam_theta)); + G4ThreeVector col2(-sin(Beam_phi), + cos(Beam_phi), + 0); + G4ThreeVector col3(sin(Beam_theta) * cos(Beam_phi), + sin(Beam_theta) * sin(Beam_phi), + cos(Beam_theta)); + G4RotationMatrix BeamToWorld(col1, col2, col3); + + ///////////////////////////////////////////////////////////////// + ///// Angles for emitted particles following Cross Section ////// + ///// Angles are in the beam frame ////// + ///////////////////////////////////////////////////////////////// + // Beam incident energy + G4double NominalBeamEnergy = m_BeamEnergy; + G4double IncidentBeamEnergy = RandGauss::shoot(NominalBeamEnergy, m_BeamEnergySpread / 2.35); + m_Reaction->SetBeamEnergy(IncidentBeamEnergy); + m_InitConditions->SetICIncidentEnergy(IncidentBeamEnergy / MeV); + // Angles + RandGeneral CrossSectionShoot(m_Reaction->GetCrossSection(), m_Reaction->GetCrossSectionSize()); + G4double ThetaCM = CrossSectionShoot.shoot() * (180*deg); + G4double phi = RandFlat::shoot() * 2*pi; + // write angles to ROOT file + m_InitConditions->SetICEmittedAngleThetaCM(ThetaCM / deg); + m_InitConditions->SetICEmittedAnglePhiIncidentFrame(phi / deg); ////////////////////////////////////////////////// - /////Now define everything for light particle///// + ///// Momentum and angles from kinematics ///// + ///// Angles are in the beam frame ///// ////////////////////////////////////////////////// - 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) ; + // Variable where to store results + G4double ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy; + // Set the Theta angle of reaction + m_Reaction->SetThetaCM(ThetaCM); + // Compute Kinematic using previously defined ThetaCM + m_Reaction->KineRelativistic(ThetaLight, EnergyLight, ThetaHeavy, EnergyHeavy); + // Momentum in beam frame for light particle + G4ThreeVector momentum_kineLight_beam(sin(ThetaLight) * cos(phi), + sin(ThetaLight) * sin(phi), + cos(ThetaLight)); + // Momentum in beam frame for heavy particle + G4ThreeVector momentum_kineHeavy_beam(sin(ThetaHeavy) * cos(phi), + sin(ThetaHeavy) * sin(phi), + cos(ThetaHeavy)); + + // write angles/energy to ROOT file + m_InitConditions->SetICEmittedAngleThetaLabIncidentFrame(ThetaLight / deg); + m_InitConditions->SetICEmittedEnergy(EnergyLight/MeV); + //must shoot inside the target. + G4double z0 = (-m_TargetThickness / 2 + RandFlat::shoot() * m_TargetThickness); - //Set the gun to shoot - particleGun->SetParticleMomentumDirection(G4ThreeVector(momentum_x, momentum_y, momentum_z)) ; - particleGun->SetParticleEnergy(particle_energy) ; - particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ; + // Move to the target + x0 += m_TargetX ; + y0 += m_TargetY ; + z0 += m_TargetZ ; - //Shoot the light particle - if (m_ShootLight) particleGun->GeneratePrimaryVertex(anEvent) ; + // write vertex position to ROOT file + m_InitConditions->SetICPositionX(x0); + m_InitConditions->SetICPositionY(y0); + m_InitConditions->SetICPositionZ(z0); ////////////////////////////////////////////////// - /////Now define everything for heavy particle///// + ///////// Set up everything for shooting ///////// ////////////////////////////////////////////////// - - theta = ThetaHeavy + Beam_theta ; - particle_energy = EnergyHeavy ; - - if (m_ShootHeavy) ResonanceDecay( HeavyZ , - HeavyA , - EnergyHeavy , - theta , - phi , - x0 , - y0 , - z0 , - anEvent , - particleGun ); + if (m_ShootLight) { // Case of light particle + // Particle type + particleGun->SetParticleDefinition(LightName); + // Particle energy + particleGun->SetParticleEnergy(EnergyLight); + // Particle vertex position + particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)); + // Particle direction + // Kinematical angles in the beam frame are transformed + // to the "world" frame + G4ThreeVector momentum_kine_world = BeamToWorld * momentum_kineLight_beam; + // get theta and phi in the world frame + G4double theta_world = momentum_kine_world.theta(); + G4double phi_world = momentum_kine_world.phi(); + if (phi_world < 1e-6) phi_world += 2*pi; + // write angles in ROOT file + m_InitConditions->SetICEmittedAngleThetaLabWorldFrame(theta_world / deg); + m_InitConditions->SetICEmittedAnglePhiWorldFrame(phi_world / deg); + //Set the gun to shoot + particleGun->SetParticleMomentumDirection(momentum_kine_world); + //Shoot the light particle + particleGun->GeneratePrimaryVertex(anEvent); + } + + if (m_ShootHeavy) { // Case of recoil particle + // Particle type + particleGun->SetParticleDefinition(HeavyName); + // Particle energy + particleGun->SetParticleEnergy(EnergyHeavy); + // Particle vertex position + particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)); + // Particle direction + // Kinematical angles in the beam frame are transformed + // to the "world" frame + G4ThreeVector momentum_kine_world = BeamToWorld * momentum_kineHeavy_beam; + // get theta and phi in the world frame + G4double theta_world = momentum_kine_world.theta(); + G4double phi_world = momentum_kine_world.phi(); + if (phi_world < 1e-6) phi_world += 2*pi; + + EventGeneratorTransfertToResonance::ResonanceDecay( EnergyHeavy , + theta_world , + phi_world , + 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) +void EventGeneratorTransfertToResonance::ResonanceDecay( G4double EnergyHeavy , + G4double ThetaHeavy , + G4double PhiHeavy , + G4double x0 , + G4double y0 , + G4double z0 , + G4Event* anEvent , + G4ParticleGun* particleGun ) { - //FIXME + G4double parentZ = m_Reaction->GetNucleus4()->GetZ() ; + G4double parentA = m_Reaction->GetNucleus4()->GetA() ; + 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) ; - } - } - } + //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() ; + + G4double Q = M - md - mn * NumberOfNeutrons - mp * NumberOfProtons ; + + vector<G4double> DecayProductsMomentumCM ; + vector<G4double> DecayProductsMomentumXCM ; + vector<G4double> DecayProductsMomentumYCM ; + vector<G4double> DecayProductsMomentumZCM ; + vector<G4double> DecayProductsThetaCM ; + vector<G4double> DecayProductsPhiCM ; + + // Initial Lab Momentum + G4double InitialE = sqrt(EnergyHeavy * EnergyHeavy + M * M) ; + G4double InitialMomentumX = EnergyHeavy * sin(ThetaHeavy) * cos(PhiHeavy) ; + G4double InitialMomentumY = EnergyHeavy * sin(ThetaHeavy) * sin(PhiHeavy) ; + G4double InitialMomentumZ = EnergyHeavy * cos(ThetaHeavy) ; + + TLorentzVector Initial = TLorentzVector(InitialMomentumX/GeV, InitialMomentumY/GeV, InitialMomentumZ/GeV,InitialE/GeV); + + // Array of masses express in GeV/c2 + double* masses = new double[NumberOfDecayProducts+1]; + + // Filling Array + masses[0] = md/GeV ; + + int ll = 1 ; + for(int i = 0 ; i < NumberOfNeutrons ; i++) + {masses[ll] = mn/GeV ; ll++;} + + for(int i = 0 ; i < NumberOfProtons ; i++) + {masses[ll] = mp/GeV ; ll++;} + + // Instentiate a Phase Space Generator, with flat distrution + + + TGenPhaseSpace TPhaseSpace ; + + if( !TPhaseSpace.SetDecay(Initial, NumberOfDecayProducts+1, masses,"Fermi") ) cout << "Warning: Phase Space Decay forbiden by kinematic"; + TPhaseSpace.Generate() ; + + TLorentzVector* daugterLV = TPhaseSpace.GetDecay(0); + G4ThreeVector Momentum = G4ThreeVector( daugterLV->X()*GeV , + daugterLV->Y()*GeV , + daugterLV->Z()*GeV ); + double Energy = Momentum.mag() ; + Momentum.unit() ; + //Set the gun to shoot + particleGun->SetParticleDefinition(daughter) ; + particleGun->SetParticleMomentumDirection(Momentum) ; + particleGun->SetParticleEnergy(Energy) ; + particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ; + // Shoot the Daugter + particleGun->GeneratePrimaryVertex(anEvent) ; + + if (m_ShootDecayProduct) + { + G4int jj = 1 ; + for ( int u = 0; u < NumberOfNeutrons ; u++) + { + TLorentzVector* neutronLV = TPhaseSpace.GetDecay(jj); + + Momentum = G4ThreeVector( daugterLV->X()*GeV , + daugterLV->Y()*GeV , + daugterLV->Z()*GeV ); + Energy = Momentum.mag() ; + Momentum.unit() ; + //Set the gun to shoot + particleGun->SetParticleDefinition(neutron) ; + particleGun->SetParticleMomentumDirection(Momentum) ; + particleGun->SetParticleEnergy(Energy) ; + particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ; + // Shoot the Daugter + particleGun->GeneratePrimaryVertex(anEvent) ; + jj++; + } + + for ( int u = 0; u < NumberOfProtons ; u++) + { + TLorentzVector* protonLV = TPhaseSpace.GetDecay(jj); + + Momentum = G4ThreeVector( daugterLV->X()*GeV , + daugterLV->Y()*GeV , + daugterLV->Z()*GeV ); + Energy = Momentum.mag() ; + Momentum.unit() ; + //Set the gun to shoot + particleGun->SetParticleDefinition(proton) ; + particleGun->SetParticleMomentumDirection(Momentum) ; + particleGun->SetParticleEnergy(Energy) ; + particleGun->SetParticlePosition(G4ThreeVector(x0, y0, z0)) ; + // Shoot the Daugter + particleGun->GeneratePrimaryVertex(anEvent) ; + jj++; + } + + delete masses ; + } + } } //....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) +vector<double> EventGeneratorTransfertToResonance::PhaseSpaceUniformGenerator( int N , double R) + { + vector<double> V ; + V.reserve(N) ; + double Norme ; + double Buffer ; + + for(int i = 0 ; i< N ; i++) + { + V.push_back( Buffer = CLHEP::RandFlat::shoot() ); + Norme += Buffer*Buffer ; + } + + Norme = sqrt(Norme) ; + + for(int i = 0 ; i< N ; i++) + V[i] = V[i] / Norme ; + + return V; + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void EventGeneratorTransfertToResonance::SetEverything( string name1 , + string name2 , + string name3 , + string name4 , + double BeamEnergy , + double Excitation , + double BeamEnergySpread , + double SigmaX , + double SigmaY , + double SigmaThetaX , + double SigmaPhiY , + int ResonanceDecayZ , + int ResonanceDecayA , + bool ShootLight , + bool ShootHeavy , + bool ShootDecayProduct , + string Path ) { //------------- Constructor with nuclei names and beam energy ------------ @@ -750,12 +718,12 @@ void EventGeneratorTransfertToResonance::SetEverything(string name1 BeamEnergy, Excitation, Path) ; - + m_BeamEnergy = BeamEnergy; m_BeamEnergySpread = BeamEnergySpread ; - m_BeamFWHMX = BeamFWHMX ; - m_BeamFWHMY = BeamFWHMY ; - m_BeamEmmitanceTheta = BeamEmmitanceTheta ; - m_BeamEmmitancePhi = BeamEmmitancePhi ; + m_SigmaX = SigmaX ; + m_SigmaY = SigmaY ; + m_SigmaThetaX = SigmaThetaX ; + m_SigmaPhiY = SigmaPhiY ; m_ResonanceDecayZ = ResonanceDecayZ ; m_ResonanceDecayA = ResonanceDecayA ; m_ShootLight = ShootLight ; @@ -764,3 +732,5 @@ void EventGeneratorTransfertToResonance::SetEverything(string name1 } + + diff --git a/NPSimulation/vis.mac b/NPSimulation/vis.mac index 7130261ec..e8345fb35 100644 --- a/NPSimulation/vis.mac +++ b/NPSimulation/vis.mac @@ -9,7 +9,7 @@ # choose a graphic system #/vis/open OGLIX #/vis/open OGLSX -#/vis/open VRML2FILE +/vis/open VRML2FILE /vis/scene/create /vis/drawVolume /vis/viewer/set/viewpointThetaPhi 0 0 deg -- GitLab