From 948135344f8102045cfaa79756d447b061f697d1 Mon Sep 17 00:00:00 2001
From: matta <matta@npt>
Date: Wed, 30 Jan 2013 15:43:46 +0000
Subject: [PATCH] * Checking how everything work together,  - fixing couple of
 bug  - remove some warning  - enhance performance

---
 Inputs/EventGenerator/10He.reaction           |  10 +-
 .../InitialConditions/TInitialConditions.cxx  | 123 ++++++------
 NPLib/InitialConditions/TInitialConditions.h  | 186 ++++++------------
 NPLib/Physics/NPBeam.cxx                      |  22 ++-
 NPLib/Physics/NPBeam.h                        |  10 +-
 NPLib/Physics/NPFunction.cxx                  |  35 +---
 NPLib/Physics/NPReaction.cxx                  |  18 +-
 NPLib/Physics/NPReaction.h                    |   3 +-
 NPSimulation/Simulation.cc                    |   5 +-
 .../include/EventGeneratorIsotropic.hh        |   3 -
 NPSimulation/include/Particle.hh              |  55 +++---
 NPSimulation/include/ParticleStack.hh         |   7 +-
 NPSimulation/src/EventGeneratorBeam.cc        |  18 +-
 NPSimulation/src/EventGeneratorGammaDecay.cc  |   3 +-
 NPSimulation/src/EventGeneratorIsotropic.cc   |  29 +--
 .../src/EventGeneratorParticleDecay.cc        |   7 +-
 .../src/EventGeneratorTwoBodyReaction.cc      |  28 +--
 NPSimulation/src/Particle.cc                  |  65 ++++--
 NPSimulation/src/ParticleStack.cc             |  63 ++++--
 19 files changed, 323 insertions(+), 367 deletions(-)

diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction
index 280f56a4f..4e7f72f0d 100644
--- a/Inputs/EventGenerator/10He.reaction
+++ b/Inputs/EventGenerator/10He.reaction
@@ -7,8 +7,8 @@ Beam
 	SigmaEnergy= 0
 	SigmaThetaX= 0.01
 	SigmaPhiY= 0.01
-	SigmaX= 0.01
-	SigmaY= 0.01
+	SigmaX= 5
+	SigmaY= 5
   MeanThetaX= 0
   MeanPhiY= 0
   MeanX= 0
@@ -32,7 +32,7 @@ TwoBodyReaction
   
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
-ParticleDecay 10He
+%ParticleDecay 10He
   Daughter= 9He n
   ExcitationEnergy= 0.5 0
   DifferentialCrossSection= flat.txt
@@ -40,7 +40,7 @@ ParticleDecay 10He
     
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-GammaDecay 9He
+%GammaDecay 9He
   Cascade
     BranchingRatio= 30
     Energies= 0.1
@@ -51,7 +51,7 @@ GammaDecay 9He
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-ParticleDecay 9He
+%ParticleDecay 9He
   Daughter= 8He n
   DifferentialCrossSection= flat.txt
   shoot= 1 1
diff --git a/NPLib/InitialConditions/TInitialConditions.cxx b/NPLib/InitialConditions/TInitialConditions.cxx
index 6dbd3411f..f19eb1df2 100644
--- a/NPLib/InitialConditions/TInitialConditions.cxx
+++ b/NPLib/InitialConditions/TInitialConditions.cxx
@@ -30,69 +30,72 @@ using namespace std;
 
 ClassImp(TInitialConditions)
 
-TInitialConditions::TInitialConditions()
-{
-   // Default constructor
-
-   Clear();
+TInitialConditions::TInitialConditions(){
+  // Default constructor
+  Clear();
 }
 
-TInitialConditions::~TInitialConditions()
-{}
-
-void TInitialConditions::Clear()
-{
-   // Incident particle properties (before interactions in the target)
-   // Vertex of interaction
-   fIC_Position_X.clear();
-   fIC_Position_Y.clear();
-   fIC_Position_Z.clear();
-   // Theta and Phi angles for the emittance
-   fIC_Incident_Emittance_Theta.clear();
-   fIC_Incident_Emittance_Phi.clear();
-   // Incident particle angles
-   fIC_Incident_Angle_Theta.clear();
-   fIC_Incident_Angle_Phi.clear();
-   // Incident particle energy
-   fIC_Incident_Energy.clear();
-
-   // Emitted particle angles
-   fIC_Emitted_Angle_ThetaCM.clear();
-   fIC_Emitted_Angle_ThetaLab_IncidentFrame.clear();
-   fIC_Emitted_Angle_Phi_IncidentFrame.clear();
-   fIC_Emitted_Angle_ThetaLab_WorldFrame.clear();
-   fIC_Emitted_Angle_Phi_WorldFrame.clear();
-   // Emitted particle energy
-   fIC_Emitted_Energy.clear();
+TInitialConditions::~TInitialConditions(){
 }
 
+void TInitialConditions::Clear(){
+  // Incident beam parameter
+  fIC_Incident_Particle_Name="";
+  fIC_Incident_Emittance_Phi=-1;
+  fIC_Incident_Emittance_Theta=-1;
+  fIC_Incident_Kinetic_Energy=-1;
+  
+  // Beam status at the initial interaction point
+  fIC_Interaction_Kinetic_Energy=-1;
+  fIC_Interaction_Position_X=-1;
+  fIC_Interaction_Position_Y=-1;
+  fIC_Interaction_Position_Z=-1;
+  
+  // emmitted particle
+  fIC_Particle_Name.clear();
+  fIC_Process_Name.clear();
+  fIC_ThetaCM.clear();
+  fIC_Kinetic_Energy.clear();
+  fIC_Momentum_Direction_X.clear();
+  fIC_Momentum_Direction_Y.clear();
+  fIC_Momentum_Direction_Z.clear();
+}
 
-
-void TInitialConditions::Dump() const
-{
-   cout << "XXXXXXXXXXXXX Initial conditions XXXXXXXXXXXXXXXX" << endl;
-
-   cout << "Vertex position : " << endl;
-   cout << "\tX : " << fIC_Position_X[0] << endl;  
-   cout << "\tY : " << fIC_Position_Y[0] << endl;  
-   cout << "\tZ : " << fIC_Position_Z[0] << endl;  
-   cout << "Theta and Phi angles for the emittance : " << endl;
-   cout << "\tTheta : " << fIC_Incident_Emittance_Theta[0] << endl;
-   cout << "\tPhi   : " << fIC_Incident_Emittance_Phi[0] << endl;
-   cout << "Incident particle angles : " << endl;
-   cout << "\tTheta : " << fIC_Incident_Angle_Theta[0] << endl;
-   cout << "\tPhi   : " << fIC_Incident_Angle_Phi[0] << endl;
-   cout << "Incident energy : " << endl;
-   cout << "\tEnergy : " << fIC_Incident_Energy[0] << endl;
-   cout << endl;
-   cout << "Emitted particle angles : " << endl;
-   cout << "\tTheta CM  : " << fIC_Emitted_Angle_ThetaCM[0] << endl;
-   cout << "  Incident frame :" << endl;
-   cout << "\tTheta Lab : " << fIC_Emitted_Angle_ThetaLab_IncidentFrame[0] << endl;
-   cout << "\tPhi       : " << fIC_Emitted_Angle_Phi_IncidentFrame[0] << endl;
-   cout << "  World frame :" << endl;
-   cout << "\tTheta Lab : " << fIC_Emitted_Angle_ThetaLab_WorldFrame[0] << endl;
-   cout << "\tPhi       : " << fIC_Emitted_Angle_Phi_WorldFrame[0] << endl;
-   cout << "Emitted energy : " << endl;
-   cout << "\tEnergy : " << fIC_Emitted_Energy[0] << endl;
+void TInitialConditions::Dump() const{
+  cout << "--------- Initial Condition Dump ---------" << endl ;
+  
+  // Incident beam parameter
+  cout << "\t ---- Incident Beam ---- " << endl;
+  cout << "\t Particle Name:  " << fIC_Incident_Particle_Name << endl;
+  cout << "\t Energy: " << fIC_Incident_Kinetic_Energy << endl;
+  cout << "\t Theta_X: " << fIC_Incident_Emittance_Theta << endl;
+  cout << "\t Phi_Y: " << fIC_Incident_Emittance_Phi << endl;
+  
+  
+  
+  // Beam status at the initial interaction point
+  cout << "\t ---- Interaction Point ---- " << endl;
+  cout << "\t Energy: " << fIC_Interaction_Kinetic_Energy << endl;
+  cout << "\t Position: ( "
+  << fIC_Interaction_Position_X << " ; "
+  << fIC_Interaction_Position_Y << " ; "
+  << fIC_Interaction_Position_Z << ")" << endl;
+  
+  
+  // emmitted particle
+  unsigned int size = fIC_Particle_Name.size();
+  for(unsigned int i = 0 ; i < size; i ++){
+    cout << "\t ---- Particle " << i << " ---- " << endl;
+    cout << "\t Particle Name" <<   fIC_Particle_Name[i] << endl;
+    //  cout << "\t Process Name" <<   fIC_Process_Name[i] << endl;
+    cout << "\t Theta CM" <<   fIC_ThetaCM[i] << endl;
+    cout << "\t Energy" <<   fIC_Kinetic_Energy[i] << endl;
+    cout << "\t Momentum Direction: ( "
+    << fIC_Momentum_Direction_X[i] << " ; "
+    << fIC_Momentum_Direction_Y[i] << " ; "
+    << fIC_Momentum_Direction_Z[i] << ")" << endl;
+    
+  }
+  
+  
 }
diff --git a/NPLib/InitialConditions/TInitialConditions.h b/NPLib/InitialConditions/TInitialConditions.h
index 699a3a4e9..4d8674cda 100644
--- a/NPLib/InitialConditions/TInitialConditions.h
+++ b/NPLib/InitialConditions/TInitialConditions.h
@@ -26,22 +26,26 @@
 #ifndef __INITIALCONDITIONS__
 #define __INITIALCONDITIONS__
 
+// STL Header
 #include <vector>
-#include "TObject.h"
+#include <string>
+
 using namespace std ;
 
+// Root Header
+#include "TObject.h"
 
-class TInitialConditions : public TObject
-{
+class TInitialConditions : public TObject{
 private:
-  /*
-  // Incident beam parament
+  
+  // Incident beam parameter
+  string fIC_Incident_Particle_Name;
   double fIC_Incident_Emittance_Phi;
   double fIC_Incident_Emittance_Theta;
-  double fIC_Incident_Initial_Energy;
+  double fIC_Incident_Kinetic_Energy;
   
   // Beam status at the initial interaction point
-  double fIC_Interaction_Energy;
+  double fIC_Interaction_Kinetic_Energy;
   double fIC_Interaction_Position_X;
   double fIC_Interaction_Position_Y;
   double fIC_Interaction_Position_Z;
@@ -55,122 +59,60 @@ private:
   vector<double> fIC_Momentum_Direction_Y;
   vector<double> fIC_Momentum_Direction_Z;
   
-  */
-  
-   /*
-    // Beam
-    TLorentzVector fIC_Beam_LV;
-    double fIC_Beam_ThetaX;
-    double fIC_Beam_PhiY;    
-   
-    // Particle
-    // Emitted particle properties (after interactions in the target)
-    vector<Double_t>   fIC_Emitted_Angle_ThetaCM;
-    // Emitted particle angles in the incident frame
-    vector<Double_t>   fIC_Emitted_Angle_Theta_LocalFrame;
-    vector<Double_t>   fIC_Emitted_Angle_Phi_LocalFrame;
-    // Emitted particle angles in the world frame
-    vector<Double_t>   fIC_Emitted_Angle_Theta_LabFrame;
-    vector<Double_t>   fIC_Emitted_Angle_Phi_LabFrame;
-    // Emittedparticle energy
-    vector<Double_t>   fIC_Emitted_Energy;
-    vector<int>        fIC_Process;
-    vector<string>     fIC_Name;
-   */
-    
-    
-    
-    
-   // Incident particle properties (before interactions in the target)
-   // Vertex of interaction
-   vector<Double_t>   fIC_Position_X;
-   vector<Double_t>   fIC_Position_Y;
-   vector<Double_t>   fIC_Position_Z;
-   // Theta and Phi angles for the emittance
-   vector<Double_t>   fIC_Incident_Emittance_Theta;
-   vector<Double_t>   fIC_Incident_Emittance_Phi;
-   // Incident particle angles
-   vector<Double_t>   fIC_Incident_Angle_Theta;
-   vector<Double_t>   fIC_Incident_Angle_Phi;
-   // Incident particle energy
-   vector<Double_t>   fIC_Incident_Energy;
-
-   // Emitted particle properties (after interactions in the target)
-   vector<Double_t>   fIC_Emitted_Angle_ThetaCM;
-   // Emitted particle angles in the incident frame
-   vector<Double_t>   fIC_Emitted_Angle_ThetaLab_IncidentFrame;
-   vector<Double_t>   fIC_Emitted_Angle_Phi_IncidentFrame;
-   // Emitted particle angles in the world frame
-   vector<Double_t>   fIC_Emitted_Angle_ThetaLab_WorldFrame;
-   vector<Double_t>   fIC_Emitted_Angle_Phi_WorldFrame;
-   // Emittedparticle energy
-   vector<Double_t>   fIC_Emitted_Energy;
-
-
 public:
-   TInitialConditions();
-   virtual ~TInitialConditions();
-
-   void  Clear();
-   void  Clear(const Option_t*) {};
-   void  Dump() const;
-
-   /////////////////////           SETTERS           ////////////////////////
-   // Incident particle properties (before interactions in the target)
-   // Vertex of interaction
-   void SetICPositionX(Double_t PositionX)      {fIC_Position_X.push_back(PositionX);}
-   void SetICPositionY(Double_t PositionY)      {fIC_Position_Y.push_back(PositionY);}
-   void SetICPositionZ(Double_t PositionZ)      {fIC_Position_Z.push_back(PositionZ);}
-   // Theta and Phi angles for the emittance
-   void SetICIncidentEmittanceTheta(Double_t Theta)   {fIC_Incident_Emittance_Theta.push_back(Theta);}
-   void SetICIncidentEmittancePhi(Double_t Phi)       {fIC_Incident_Emittance_Phi.push_back(Phi);}
-   // Incident particle angles
-   void SetICIncidentAngleTheta(Double_t AngleTheta) {fIC_Incident_Angle_Theta.push_back(AngleTheta);}
-   void SetICIncidentAnglePhi(Double_t AnglePhi)     {fIC_Incident_Angle_Phi.push_back(AnglePhi);}
-   // Incident particle energy
-   void SetICIncidentEnergy(Double_t Energy)         {fIC_Incident_Energy.push_back(Energy);}
-   
-   // Emitted particle angles
-   // Center of mass
-   void SetICEmittedAngleThetaCM(Double_t AngleTheta) {fIC_Emitted_Angle_ThetaCM.push_back(AngleTheta);}
-   // Angles in the incident frame
-   void SetICEmittedAngleThetaLabIncidentFrame(Double_t AngleTheta)   {fIC_Emitted_Angle_ThetaLab_IncidentFrame.push_back(AngleTheta);}
-   void SetICEmittedAnglePhiIncidentFrame(Double_t AnglePhi)          {fIC_Emitted_Angle_Phi_IncidentFrame.push_back(AnglePhi);}
-   // Angles in the world frame
-   void SetICEmittedAngleThetaLabWorldFrame(Double_t AngleTheta)   {fIC_Emitted_Angle_ThetaLab_WorldFrame.push_back(AngleTheta);}
-   void SetICEmittedAnglePhiWorldFrame(Double_t AnglePhi)          {fIC_Emitted_Angle_Phi_WorldFrame.push_back(AnglePhi);}
-   // Emitted particle energy
-   void SetICEmittedEnergy(Double_t Energy) {fIC_Emitted_Energy.push_back(Energy);}
-
-
-   /////////////////////           GETTERS           ////////////////////////
-   // Incident particle properties (before interactions in the target)
-   // Vertex of interaction
-   Double_t GetICPositionX(Int_t i) {return fIC_Position_X.at(i);}
-   Double_t GetICPositionY(Int_t i) {return fIC_Position_Y.at(i);}
-   Double_t GetICPositionZ(Int_t i) {return fIC_Position_Z.at(i);}
-   // Theta and Phi angles for the emittance
-   Double_t GetICIncidentEmittanceTheta(Int_t i) {return fIC_Incident_Emittance_Theta.at(i);}
-   Double_t GetICIncidentEmittancePhi(Int_t i)   {return fIC_Incident_Emittance_Phi.at(i);}
-   // Incident particle angles
-   Double_t GetICIncidentAngleTheta(Int_t i)   {return fIC_Incident_Angle_Theta.at(i);}
-   Double_t GetICIncidentAnglePhi(Int_t i)     {return fIC_Incident_Angle_Phi.at(i);}
-   // Incident particle energy
-   Double_t GetICIncidentEnergy(Int_t i)   {return fIC_Incident_Energy.at(i);}
-   
-   // Emitted particle angles
-   // Center of Mass
-   Double_t GetICEmittedAngleThetaCM(Int_t i) {return fIC_Emitted_Angle_ThetaCM.at(i);}
-   // Angles in the incident frame
-   Double_t GetICEmittedAngleThetaLabIncidentFrame(Int_t i) {return fIC_Emitted_Angle_ThetaLab_IncidentFrame.at(i);}
-   Double_t GetICEmittedAnglePhiIncidentFrame(Int_t i)      {return fIC_Emitted_Angle_Phi_IncidentFrame.at(i);}
-   // Angles in the world frame
-   Double_t GetICEmittedAngleThetaLabWorldFrame(Int_t i) {return fIC_Emitted_Angle_ThetaLab_WorldFrame.at(i);}
-   Double_t GetICEmittedAnglePhiWorldFrame(Int_t i)      {return fIC_Emitted_Angle_Phi_WorldFrame.at(i);}
-   // Emitted particle energy
-   Double_t GetICEmittedEnergy(Int_t i) {return fIC_Emitted_Energy.at(i);}
-
-   ClassDef(TInitialConditions, 1) // InitialConditions structure
+  TInitialConditions();
+  virtual ~TInitialConditions();
+  
+  void  Clear();
+  void  Clear(const Option_t*) {};
+  void  Dump() const;
+  
+  /////////////////////           GetTERS           ////////////////////////
+  // Incident beam parameter
+  void SetIncidentParticleName   (string Incident_Particle_Name)   {fIC_Incident_Particle_Name   = Incident_Particle_Name;}
+  void SetIncidentKineticEnergy  (double Incident_Kinetic_Energy)  {fIC_Incident_Kinetic_Energy  = Incident_Kinetic_Energy;}
+  void SetIncidentEmittanceTheta (double Incident_Emittance_Theta) {fIC_Incident_Emittance_Theta = Incident_Emittance_Theta;}
+  void SetIncidentEmittancePhi   (double Incident_Emittance_Phi)   {fIC_Incident_Emittance_Phi   = Incident_Emittance_Phi;}
+  
+  // Beam status at the initial interaction point
+  void SetInteractionKineticEnergy (double Interaction_Kinetic_Energy)  {fIC_Interaction_Kinetic_Energy = Interaction_Kinetic_Energy;}
+  void SetInteractionPositionX     (double Interaction_Position_X)      {fIC_Interaction_Position_X     = Interaction_Position_X;}
+  void SetInteractionPositionY     (double Interaction_Position_Y)      {fIC_Interaction_Position_Y     = Interaction_Position_Y;}
+  void SetInteractionPositionZ     (double Interaction_Position_Z)      {fIC_Interaction_Position_Z     = Interaction_Position_Z;}
+  
+  // emmitted particle
+  void SetParticleName       (string Particle_Name)         {fIC_Particle_Name.push_back(Particle_Name);}
+  void SetProcessName        (string Process_Name)          {fIC_Process_Name.push_back(Process_Name);}
+  void SetThetaCM            (double ThetaCM)               {fIC_ThetaCM.push_back(ThetaCM);}
+  void SetKineticEnergy      (double Kinetic_Energy)        {fIC_Kinetic_Energy.push_back(Kinetic_Energy);}
+  void SetMomentumDirectionX (double Momentum_Direction_X)  {fIC_Momentum_Direction_X.push_back(Momentum_Direction_X);}
+  void SetMomentumDirectionY (double Momentum_Direction_Y)  {fIC_Momentum_Direction_Y.push_back(Momentum_Direction_Y);}
+  void SetMomentumDirectionZ (double Momentum_Direction_Z)  {fIC_Momentum_Direction_Z.push_back(Momentum_Direction_Z);}
+  /////////////////////           GETTERS           ////////////////////////
+  // Incident beam parameter
+  string GetIncidentParticleName   () const  {return fIC_Incident_Particle_Name   ;}
+  double GetIncidentKineticEnergy  () const  {return fIC_Incident_Kinetic_Energy  ;}
+  double GetIncidentEmittanceTheta () const  {return fIC_Incident_Emittance_Theta ;}
+  double GetIncidentEmittancePhi   () const  {return fIC_Incident_Emittance_Phi   ;}
+  
+  // Beam status at the initial interaction point
+  double GetInteractionKineticEnergy () const {return fIC_Interaction_Kinetic_Energy ;}
+  double GetInteractionPositionX     () const {return fIC_Interaction_Position_X     ;}
+  double GetInteractionPositionY     () const {return fIC_Interaction_Position_Y     ;}
+  double GetInteractionPositionZ     () const {return fIC_Interaction_Position_Z     ;}
+  
+  // emmitted particle
+  string GetParticleName        (int i) const {return fIC_Particle_Name[i];}
+  string GetProcessName         (int i) const {return fIC_Process_Name[i];}
+  double GetThetaCM             (int i) const {return fIC_ThetaCM[i];}
+  double GetKineticEnergy       (int i) const {return fIC_Kinetic_Energy[i];}
+  double GetMomentumDirectionX  (int i) const {return fIC_Momentum_Direction_X[i];}
+  double GetMomentumDirectionY  (int i) const {return fIC_Momentum_Direction_Y[i];}
+  double GetMomentumDirectionZ  (int i) const {return fIC_Momentum_Direction_Z[i];}
+  
+  unsigned int GetMult() const {return fIC_Particle_Name.size();}
+  
+  ClassDef(TInitialConditions, 1) // InitialConditions structure
 };
 
 #endif
diff --git a/NPLib/Physics/NPBeam.cxx b/NPLib/Physics/NPBeam.cxx
index 56b62ced1..b4d8380f3 100644
--- a/NPLib/Physics/NPBeam.cxx
+++ b/NPLib/Physics/NPBeam.cxx
@@ -35,6 +35,9 @@
 #include "NPFunction.h"
 #include "NPOptionManager.h"
 
+// ROOT Header
+#include "TDirectory.h"
+
 // Use CLHEP System of unit and Physical Constant
 #include "CLHEP/Units/GlobalSystemOfUnits.h"
 #include "CLHEP/Units/PhysicalConstants.h"
@@ -61,11 +64,16 @@ Beam::Beam(){
   fTargetAngle = 0 ;
   fTargetZ = 0 ;
   fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel();
+  
   // case of user given distribution
-  Global_BeamHistOffset++;
-  fEnergyHist  = new TH1F(Form("EnergyHist%i",Global_BeamHistOffset),"EnergyHist",1,0,1);
-  fXThetaXHist = new TH2F(Form("XThetaXHis%i",Global_BeamHistOffset),"XThetaXHis",1,0,1,1,0,1);
-  fYPhiYHist   = new TH2F(Form("YPhiYHist%i",Global_BeamHistOffset),"YPhiYHist",1,0,1,1,0,1);
+  // do that to avoid warning from multiple Hist with same name...
+  int offset = 0;
+  while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0)
+    ++offset;
+  
+  fEnergyHist  = new TH1F(Form("EnergyHist_%i",offset),"EnergyHist",1,0,1);
+  fXThetaXHist = new TH2F(Form("XThetaXHis_%i",offset),"XThetaXHis",1,0,1,1,0,1);
+  fYPhiYHist   = new TH2F(Form("YPhiYHist_%i",offset),"YPhiYHist",1,0,1,1,0,1);
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -209,7 +217,7 @@ void Beam::ReadConfigurationFile(string Path){
         string FileName,HistName;
         ReactionFile >> FileName >> HistName;
         if(fVerboseLevel==1) cout << "Reading Energy profile file: " << FileName << endl;
-        fEnergyHist = Read1DProfile(FileName, HistName );
+        SetEnergyHist( Read1DProfile(FileName, HistName ));
       }
       
       else if (DataBuffer == "XThetaXProfilePath=") {
@@ -217,7 +225,7 @@ void Beam::ReadConfigurationFile(string Path){
         string FileName,HistName;
         ReactionFile >> FileName >> HistName;
         if(fVerboseLevel==1) cout << "Reading X-ThetaX profile file: " << FileName << endl;
-        fXThetaXHist = Read2DProfile(FileName, HistName );
+        SetXThetaXHist(Read2DProfile(FileName, HistName ) );
       }
       
       else if (DataBuffer == "YPhiYProfilePath=") {
@@ -225,7 +233,7 @@ void Beam::ReadConfigurationFile(string Path){
         string FileName,HistName;
         ReactionFile >> FileName >> HistName;
         if(fVerboseLevel==1) cout << "Reading Y-ThetaY profile file: " << FileName << endl;
-        fYPhiYHist = Read2DProfile(FileName, HistName );
+        SetYPhiYHist( Read2DProfile(FileName, HistName ));
       }
       
       
diff --git a/NPLib/Physics/NPBeam.h b/NPLib/Physics/NPBeam.h
index 0e09f2cc1..63f4c4f4f 100755
--- a/NPLib/Physics/NPBeam.h
+++ b/NPLib/Physics/NPBeam.h
@@ -40,8 +40,6 @@ using namespace std;
 using namespace NPL;
 
 namespace NPL{
-  // Needed to avoid warnig from multiple Th1 with same name
-  static int Global_BeamHistOffset=0;
   
   class Beam{
     
@@ -87,10 +85,10 @@ namespace NPL{
     void SetMeanPhiY    (double MeanPhiY)       {fMeanPhiY=MeanPhiY;}
     void SetSigmaThetaX (double SigmaThetaX)    {fSigmaThetaX=SigmaThetaX;}
     void SetSigmaPhiY   (double SigmaPhiY)      {fSigmaPhiY=SigmaPhiY;}
-    void SetEnergyHist  (TH1F*  EnergyHist)     {delete fEnergyHist; fEnergyHist   = new TH1F(*EnergyHist);}
-    void SetXThetaXHist (TH2F*  XThetaXHist)    {delete fXThetaXHist; fXThetaXHist = new TH2F(*XThetaXHist);}
-    void SetYPhiYHist   (TH2F*  YPhiYHist)      {delete fYPhiYHist; fYPhiYHist     = new TH2F(*YPhiYHist);}
-    void SetVerboseLevel(int verbose)     {fVerboseLevel = verbose;}
+    void SetEnergyHist  (TH1F*  EnergyHist)     {delete fEnergyHist; fEnergyHist   = EnergyHist;}
+    void SetXThetaXHist (TH2F*  XThetaXHist)    {delete fXThetaXHist; fXThetaXHist = XThetaXHist;}
+    void SetYPhiYHist   (TH2F*  YPhiYHist)      {delete fYPhiYHist; fYPhiYHist     = YPhiYHist;}
+    void SetVerboseLevel(int verbose)           {fVerboseLevel = verbose;}
 
     // Get
     Nucleus*  GetNucleus     () const {return fBeamNucleus;}
diff --git a/NPLib/Physics/NPFunction.cxx b/NPLib/Physics/NPFunction.cxx
index 9e3fc528a..fa29dde0c 100644
--- a/NPLib/Physics/NPFunction.cxx
+++ b/NPLib/Physics/NPFunction.cxx
@@ -58,28 +58,21 @@ TH1F* Read1DProfile(string filename,string HistName){
     }
 
     // Look for the step size, min and max of the distribution
-    double min = 0 ;
-    double max = 0 ;
-    double previous = 0 ;
-    int step =0;
+    double min ;
+    double max ;
     unsigned int size = x.size();
     
     if(size > 0){
       min = x[0] ;
       max = x[0] ;
-      previous = x[0] ;
     }
 
     for(unsigned int i = 0 ; i < size ; i++){
       if(x[i] > max) max = x[i] ;
       if(x[i] < min) min = x[i] ;
-      
-      step= fabs(previous - x[i]) ;
-      previous = x[i] ;
     }
     
-    h = new TH1F(HistName.c_str(),HistName.c_str(),step,min,max);
-
+    h = new TH1F(HistName.c_str(),HistName.c_str(),size,min,max);
     for(unsigned int i = 0 ; i < size ; i++){
       h->Fill(x[i],w[i]);
     }
@@ -133,47 +126,35 @@ TH2F* Read2DProfile(string filename,string HistName){
     }
     
     // Look for the step size, min and max of the distribution
-    double xmin = 0 ;
-    double xmax = 0 ;
-    double xprevious = 0 ;
-    int xstep =0;
+    double xmin ;
+    double xmax ;
     unsigned int xsize = x.size();
     
-    double ymin = 0 ;
-    double ymax = 0 ;
-    double yprevious = 0 ;
-    int ystep =0;
+    double ymin ;
+    double ymax ;
     unsigned int ysize = y.size();
     
     if(xsize > 0){
       xmin = x[0] ;
       xmax = x[0] ;
-      xprevious = x[0] ;
     }
     
     if(ysize > 0){
       ymin = y[0] ;
       ymax = y[0] ;
-      yprevious = y[0] ;
     }
     
     for(unsigned int i = 0 ; i < xsize ; i++){
       if(x[i] > xmax) xmax = x[i] ;
       if(x[i] < xmin) xmin = x[i] ;
-      
-      xstep= fabs(xprevious - x[i]) ;
-      xprevious = x[i] ;
     }
     
     for(unsigned int i = 0 ; i < ysize ; i++){
       if(y[i] > ymax) ymax = y[i] ;
       if(y[i] < ymin) ymin = y[i] ;
-      
-      ystep= fabs(yprevious - y[i]) ;
-      yprevious = y[i] ;
     }
     
-    h = new TH2F(HistName.c_str(),HistName.c_str(),xstep,xmin,xmax,ystep,ymin,ymax);
+    h = new TH2F(HistName.c_str(),HistName.c_str(),xsize,xmin,xmax,ysize,ymin,ymax);
     
     for(unsigned int i = 0 ; i < xsize ; i++){
       h->Fill(x[i],y[i],w[i]);
diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx
index fc7ba5379..e7bcce344 100644
--- a/NPLib/Physics/NPReaction.cxx
+++ b/NPLib/Physics/NPReaction.cxx
@@ -69,9 +69,13 @@ Reaction::Reaction(){
   fQValue               = 0;
   fVerboseLevel         = NPOptionManager::getInstance()->GetVerboseLevel();
   initializePrecomputeVariable();
-  // Needed to avoid warning at compilation, not very clean...
-  Global_BeamHistOffset=Global_BeamHistOffset;
-  fCrossSectionHist = new TH1F(Form("Reaction_CS%i",Global_ReactionHistOffset++),"Reaction_CS",180,0,180);
+  
+  // do that to avoid warning from multiple Hist with same name...  int offset = 0;
+  int offset = 0;
+  while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0)
+    ++offset;
+  
+  fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180);
   fshoot3=true;
   fshoot4=true;
 }
@@ -84,6 +88,7 @@ Reaction::~Reaction(){
   delete fNuclei2;
   delete fNuclei3;
   delete fNuclei4;
+  delete fCrossSectionHist;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -181,7 +186,7 @@ double  Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){
   fEnergyImpulsionCM_3 = fEnergyImpulsionLab_3;
   fEnergyImpulsionCM_3.Boost(0,0,-BetaCM);
   
-  double ThetaCM = CLHEP::pi - fEnergyImpulsionCM_1.Angle(fEnergyImpulsionCM_3.Vect());
+  double ThetaCM = M_PI - fEnergyImpulsionCM_1.Angle(fEnergyImpulsionCM_3.Vect());
   
   return(ThetaCM);
 }
@@ -300,7 +305,8 @@ void Reaction::ReadConfigurationFile(string Path){
         string FileName,HistName;
         ReactionFile >> FileName >> HistName;
         if(fVerboseLevel==1) cout << "Reading Cross Section file: " << FileName << endl;
-        fCrossSectionHist = Read1DProfile(FileName, HistName );
+        SetCrossSectionHist( Read1DProfile(FileName, HistName ));
+        cout << "cccc "  << fCrossSectionHist->GetNbinsX() << endl;
       }
       
       else if (DataBuffer.compare(0, 17, "HalfOpenAngleMin=") == 0) {
@@ -352,7 +358,7 @@ void Reaction::ReadConfigurationFile(string Path){
   
   // Pick up the beam energy from the Beam event generator
   NPL::Beam* localBeam= new NPL::Beam();
-  //  localBeam->SetVerboseLevel(0);
+  localBeam->SetVerboseLevel(0);
   localBeam->ReadConfigurationFile(Path);
   
   // Modifiy the CS to shoot only within ]HalfOpenAngleMin,HalfOpenAngleMax[ 
diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h
index 343c7d5e1..ee58d18b7 100644
--- a/NPLib/Physics/NPReaction.h
+++ b/NPLib/Physics/NPReaction.h
@@ -50,8 +50,6 @@
 using namespace std;
 
 namespace NPL{
-  // Needed to avoid warnig from multiple Th1 with same name
-  static int Global_ReactionHistOffset=0; 
   
   class Reaction{
     
@@ -91,6 +89,7 @@ namespace NPL{
     void     SetExcitationLight(double exci)  {fExcitation3 = exci; initializePrecomputeVariable();}
     void     SetExcitationHeavy(double exci)  {fExcitation4 = exci; initializePrecomputeVariable();}
     void     SetVerboseLevel(int verbose)     {fVerboseLevel = verbose;}
+    void     SetCrossSectionHist  (TH1F*  CrossSectionHist)     {delete fCrossSectionHist; fCrossSectionHist   = CrossSectionHist;}
     
     double   GetBeamEnergy() const            {return fBeamEnergy;}
     double   GetThetaCM() const               {return fThetaCM;}
diff --git a/NPSimulation/Simulation.cc b/NPSimulation/Simulation.cc
index 6306d9fe9..830f2c6de 100644
--- a/NPSimulation/Simulation.cc
+++ b/NPSimulation/Simulation.cc
@@ -131,9 +131,10 @@ int main(int argc, char** argv)
    ///////////////////////////////////////////////////////////////
    ////////////////////// Job termination ////////////////////////
    ///////////////////////////////////////////////////////////////
-   RootOutput::getInstance()->Destroy();
-   NPOptionManager::getInstance()->Destroy();
+   // delete primary; delete detector;
 
    delete runManager;
+   NPOptionManager::getInstance()->Destroy();
+   RootOutput::getInstance()->Destroy();
    return 0;
 }
diff --git a/NPSimulation/include/EventGeneratorIsotropic.hh b/NPSimulation/include/EventGeneratorIsotropic.hh
index f6653d17a..f370a3ec4 100644
--- a/NPSimulation/include/EventGeneratorIsotropic.hh
+++ b/NPSimulation/include/EventGeneratorIsotropic.hh
@@ -55,8 +55,5 @@ private:    // Source parameter from input file
    G4double               m_y0               ;  // Vertex Position Y
    G4double               m_z0               ;  // Vertex Position Z
    G4ParticleDefinition*  m_particle         ;  // Kind of particle to shoot isotropically
-
-  private:    // Output ROOT class storing characteristics of source
-   TInitialConditions* m_InitConditions;
 };
 #endif
diff --git a/NPSimulation/include/Particle.hh b/NPSimulation/include/Particle.hh
index 7be0c5bf9..d3eef1924 100644
--- a/NPSimulation/include/Particle.hh
+++ b/NPSimulation/include/Particle.hh
@@ -28,33 +28,36 @@
 #include"G4ThreeVector.hh"
 
 class Particle{
-    
+  
 public: // Constructor and Destructor
-    //  Empty constructor (return geantino at zero degree)
-    Particle();
-    ~Particle();
-    //  Constructor to be used
-    Particle(G4ParticleDefinition* particle,double T,G4ThreeVector Direction, G4ThreeVector Position,bool ShootStatus=true);
-    
-private: // Private Member 
-    G4ParticleDefinition* m_ParticleDefinition;
-    double m_T ;
-    G4ThreeVector m_Direction;
-    G4ThreeVector m_Position;
-    bool m_ShootStatus;
-    
+        //  Empty constructor (return geantino at zero degree)
+  Particle();
+  ~Particle();
+  //  Constructor to be used
+  Particle(G4ParticleDefinition* particle,double ThetaCM,double T,G4ThreeVector Direction, G4ThreeVector Position,bool ShootStatus=true);
+  
+private: // Private Member
+  G4ParticleDefinition* m_ParticleDefinition;
+  double m_ThetaCM;
+  double m_T ;
+  G4ThreeVector m_Direction;
+  G4ThreeVector m_Position;
+  bool m_ShootStatus;
+  
 public: // Setter and Getter
-    // Getter
-    G4ParticleDefinition*   GetParticleDefinition();
-    double                  GetParticleKineticEnergy();
-    G4ThreeVector           GetParticleMomentumDirection();
-    G4ThreeVector           GetParticlePosition();
-    bool                    GetShootStatus();
-    // Setter
-    void SetParticleDefinition(G4ParticleDefinition*);
-    void SetParticleKineticEnergy(double);
-    void SetParticlePosition(G4ThreeVector);
-    void SetParticleMomentumDirection(G4ThreeVector);
-    void SetShootStatus(bool);
+  // Getter
+  G4ParticleDefinition*   GetParticleDefinition();
+  double                  GetParticleThetaCM();
+  double                  GetParticleKineticEnergy();
+  G4ThreeVector           GetParticleMomentumDirection();
+  G4ThreeVector           GetParticlePosition();
+  bool                    GetShootStatus();
+  // Setter
+  void SetParticleDefinition(G4ParticleDefinition*);
+  void SetParticleThetaCM(double);
+  void SetParticleKineticEnergy(double);
+  void SetParticlePosition(G4ThreeVector);
+  void SetParticleMomentumDirection(G4ThreeVector);
+  void SetShootStatus(bool);
 };
 #endif
\ No newline at end of file
diff --git a/NPSimulation/include/ParticleStack.hh b/NPSimulation/include/ParticleStack.hh
index 5dabb7492..b76cdba5b 100644
--- a/NPSimulation/include/ParticleStack.hh
+++ b/NPSimulation/include/ParticleStack.hh
@@ -79,8 +79,11 @@ public: // Getter and Setter
 
 public: // Particle management and shooting method
     // EventGenerator use this method to add particle in the stack
-    void AddParticleToStack(Particle);
-    
+    void AddParticleToStack(Particle&);
+  
+    // Add the Particle to the stack and fill Initial Condition Beam field 
+  void AddBeamParticleToStack(Particle&);
+  
     // Search for a specific particle in the stack
     Particle SearchAndRemoveParticle(string);
     
diff --git a/NPSimulation/src/EventGeneratorBeam.cc b/NPSimulation/src/EventGeneratorBeam.cc
index ffc9c4991..4a8b3f36d 100644
--- a/NPSimulation/src/EventGeneratorBeam.cc
+++ b/NPSimulation/src/EventGeneratorBeam.cc
@@ -52,6 +52,7 @@ EventGeneratorBeam::EventGeneratorBeam(){
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 EventGeneratorBeam::~EventGeneratorBeam(){
   delete m_InitConditions;
+  delete m_Beam;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -99,21 +100,22 @@ void EventGeneratorBeam::GenerateEvent(G4Event* anEvent){
   G4double Xdir = sin(Beam_thetaX);
   G4double Ydir = sin(Beam_phiY);
   G4double Zdir = cos(Beam_thetaX) + cos(Beam_phiY);
-  G4ThreeVector BeamDir = G4ThreeVector(Xdir,Ydir,Zdir)   ;
-  
+  G4ThreeVector BeamDir(Xdir,Ydir,Zdir);
+  G4ThreeVector BeamPos(x0,y0,z0);
   Beam_theta = BeamDir.theta()    ;
   Beam_phi   = BeamDir.phi()      ;
   FinalBeamEnergy = m_Target->SlowDownBeam(m_particle, InitialBeamEnergy,z0,Beam_theta);
   ///////////////////////////////////////////////////////
   ///// Add the Beam particle to the particle Stack /////
   ///////////////////////////////////////////////////////
-  
   Particle BeamParticle( m_particle,
-                         FinalBeamEnergy,
-                         BeamDir.unit(),
-                         G4ThreeVector(x0,y0,z0),
-                         1);
-  m_ParticleStack->AddParticleToStack(BeamParticle);
+                        InitialBeamEnergy,
+                        FinalBeamEnergy,
+                        BeamDir.unit(),
+                        BeamPos,
+                        1);
+  
+  m_ParticleStack->AddBeamParticleToStack(BeamParticle);
 
   }
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
diff --git a/NPSimulation/src/EventGeneratorGammaDecay.cc b/NPSimulation/src/EventGeneratorGammaDecay.cc
index bb34fe49a..d36b73476 100644
--- a/NPSimulation/src/EventGeneratorGammaDecay.cc
+++ b/NPSimulation/src/EventGeneratorGammaDecay.cc
@@ -236,6 +236,7 @@ void EventGeneratorGammaDecay::GenerateEvent(G4Event*){
     = G4ParticleTable::GetParticleTable()->GetIon(decayingParticle.GetParticleDefinition()->GetAtomicNumber(), decayingParticle.GetParticleDefinition()->GetAtomicMass(), FinalExcitationEnergy*MeV);
     
     Particle FinalParticle = Particle(  FinalParticleDefition,
+                                        decayingParticle.GetParticleThetaCM(),
                                         decayingParticle.GetParticleKineticEnergy(),
                                         decayingParticle.GetParticleMomentumDirection(),
                                         decayingParticle.GetParticlePosition(),
@@ -294,7 +295,7 @@ void EventGeneratorGammaDecay::GenerateEvent(G4Event*){
                                         GammaLV.Py(),
                                         GammaLV.Pz());
         // Add the gamma to the stack
-        Particle gammaParticle(gammaDefinition,GammaLV.E(),gammaDirection, decayingParticle.GetParticlePosition());
+        Particle gammaParticle(gammaDefinition,theta,GammaLV.E(),gammaDirection, decayingParticle.GetParticlePosition());
         m_ParticleStack->AddParticleToStack(gammaParticle);
     }
 
diff --git a/NPSimulation/src/EventGeneratorIsotropic.cc b/NPSimulation/src/EventGeneratorIsotropic.cc
index 3771fb438..a1f1d714a 100644
--- a/NPSimulation/src/EventGeneratorIsotropic.cc
+++ b/NPSimulation/src/EventGeneratorIsotropic.cc
@@ -40,7 +40,6 @@ using namespace CLHEP;
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 EventGeneratorIsotropic::EventGeneratorIsotropic()
 {
-   m_InitConditions = new TInitialConditions();
 
    m_EnergyLow    =  0  ;
    m_EnergyHigh   =  0  ;
@@ -55,7 +54,6 @@ EventGeneratorIsotropic::EventGeneratorIsotropic()
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 EventGeneratorIsotropic::~EventGeneratorIsotropic()
 {
-   delete m_InitConditions;
 }
 
 
@@ -187,7 +185,6 @@ void EventGeneratorIsotropic::ReadConfiguration(string Path)
 void EventGeneratorIsotropic::GenerateEvent(G4Event* anEvent, G4ParticleGun* particleGun)
 {
    // Clear TInitialConditions
-   m_InitConditions->Clear();
 
    particleGun->SetParticleDefinition(m_particle);
 
@@ -209,28 +206,6 @@ void EventGeneratorIsotropic::GenerateEvent(G4Event* anEvent, G4ParticleGun* par
    particleGun->SetParticleEnergy(particle_energy)                                                ;
    particleGun->SetParticlePosition(G4ThreeVector(m_x0, m_y0, m_z0))                              ;
 
-   // Fill TInitialConditions class
-   // Interaction vertex
-   m_InitConditions->SetICPositionX(m_x0 / mm);
-   m_InitConditions->SetICPositionY(m_y0 / mm);
-   m_InitConditions->SetICPositionZ(m_z0 / mm);
-   // Incident "particles"
-   // Everything is zero for a source
-   m_InitConditions->SetICIncidentEmittanceTheta(0);
-   m_InitConditions->SetICIncidentEmittancePhi(0);
-   m_InitConditions->SetICIncidentAngleTheta(0);
-   m_InitConditions->SetICIncidentAnglePhi(0);
-   m_InitConditions->SetICIncidentEnergy(0);
-   // Emitted particle angles
-   m_InitConditions->SetICEmittedAngleThetaCM(theta / deg);
-   m_InitConditions->SetICEmittedAngleThetaLabIncidentFrame(theta / deg);
-   m_InitConditions->SetICEmittedAnglePhiIncidentFrame(phi / deg);
-   m_InitConditions->SetICEmittedAngleThetaLabWorldFrame(theta / deg);
-   m_InitConditions->SetICEmittedAnglePhiWorldFrame(phi / deg);
-   // Emitted particle energy
-   m_InitConditions->SetICEmittedEnergy(particle_energy / MeV);
-
-
    //Shoot particle
    particleGun->GeneratePrimaryVertex(anEvent)                                                    ;
 }
@@ -240,7 +215,5 @@ void EventGeneratorIsotropic::GenerateEvent(G4Event* anEvent, G4ParticleGun* par
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void EventGeneratorIsotropic::InitializeRootOutput()
 {
-   RootOutput *pAnalysis = RootOutput::getInstance();
-   TTree *pTree = pAnalysis->GetTree();
-   pTree->Branch("InitialConditions", "TInitialConditions", &m_InitConditions);
+
 }
diff --git a/NPSimulation/src/EventGeneratorParticleDecay.cc b/NPSimulation/src/EventGeneratorParticleDecay.cc
index 336058d2e..0ae6f688d 100644
--- a/NPSimulation/src/EventGeneratorParticleDecay.cc
+++ b/NPSimulation/src/EventGeneratorParticleDecay.cc
@@ -247,6 +247,7 @@ void EventGeneratorParticleDecay::GenerateEvent(G4Event* anEvent){
                                                       FirstDaughterLV.Z()   );
       
       Particle FirstDaughterParticle( m_DaughterNuclei[0],
+                                     ThetaCM,
                                      FirstDaughterLV.E()-m_DaughterNuclei[0]->GetPDGMass(),
                                      DaughterDirection.unit(),
                                      decayingParticle.GetParticlePosition(),
@@ -257,6 +258,7 @@ void EventGeneratorParticleDecay::GenerateEvent(G4Event* anEvent){
                                         SecondDaughterLV.Z()   );
       
       Particle SecondDaughterParticle( m_DaughterNuclei[1],
+                                      ThetaCM+M_PI,
                                       SecondDaughterLV.E()-m_DaughterNuclei[1]->GetPDGMass(),
                                       DaughterDirection.unit(),
                                       decayingParticle.GetParticlePosition(),
@@ -288,12 +290,13 @@ void EventGeneratorParticleDecay::GenerateEvent(G4Event* anEvent){
         
         daughterLV = m_TPhaseSpace.GetDecay(i);
         G4ThreeVector daughterDirection = G4ThreeVector( daughterLV->X()   ,
-                                                        daughterLV->Y()   ,
-                                                        daughterLV->Z()   );
+                                                         daughterLV->Y()   ,
+                                                         daughterLV->Z()   );
         
         KineticEnergy   = daughterLV->E()-m_Masses[i] ;
         
         Particle daughterParticle( m_DaughterNuclei[i],
+                                  -1,
                                   KineticEnergy*GeV,
                                   daughterDirection.unit(),
                                   decayingParticle.GetParticlePosition(),
diff --git a/NPSimulation/src/EventGeneratorTwoBodyReaction.cc b/NPSimulation/src/EventGeneratorTwoBodyReaction.cc
index c71dd4907..2136cc88f 100644
--- a/NPSimulation/src/EventGeneratorTwoBodyReaction.cc
+++ b/NPSimulation/src/EventGeneratorTwoBodyReaction.cc
@@ -186,44 +186,20 @@ void EventGeneratorTwoBodyReaction::GenerateEvent(G4Event* anEvent){
   ///////// Set up everything for shooting /////////
   //////////////////////////////////////////////////
   // Case of light particle
-  // Instantiate a new particle
-  Particle LightParticle;
-  
-  // Particle type
-  LightParticle.SetParticleDefinition(LightName);
-  // Particle energy
-  LightParticle.SetParticleKineticEnergy(EnergyLight);
-  // Particle vertex position
-  LightParticle.SetParticlePosition(BeamParticle.GetParticlePosition());
   // Particle direction
   // Kinematical angles in the beam frame are transformed
   // to the "world" frame
   G4ThreeVector momentum_kine_world = BeamToWorld * momentum_kineLight_beam;
-  //Set the Momentum Direction
-  LightParticle.SetParticleMomentumDirection(momentum_kine_world);
-  // Set the shoot status
-  LightParticle.SetShootStatus(m_ShootLight) ;
   //Add the particle to the particle stack
+  Particle LightParticle(LightName, ThetaCM , EnergyLight,momentum_kine_world, BeamParticle.GetParticlePosition(), m_ShootLight);
   m_ParticleStack->AddParticleToStack(LightParticle);
   
   // Case of heavy particle
-  // Instantiate a new particle
-  Particle HeavyParticle;
-  
-  // Particle type
-  HeavyParticle.SetParticleDefinition(HeavyName);
-  // Particle energy
-  HeavyParticle.SetParticleKineticEnergy(EnergyHeavy);
-  // Particle vertex position
-  HeavyParticle.SetParticlePosition(BeamParticle.GetParticlePosition());
   // Particle direction
   // Kinematical angles in the beam frame are transformed
   // to the "world" frame
   momentum_kine_world = BeamToWorld * momentum_kineHeavy_beam;
-  //Set the Momentum Direction
-  HeavyParticle.SetParticleMomentumDirection(momentum_kine_world);
-  // Set the shoot status
-  HeavyParticle.SetShootStatus(m_ShootHeavy) ;
+  Particle HeavyParticle(HeavyName, ThetaCM + M_PI, EnergyHeavy,momentum_kine_world, BeamParticle.GetParticlePosition(), m_ShootHeavy);
   //Add the particle to the particle stack
   m_ParticleStack->AddParticleToStack(HeavyParticle);
 }
diff --git a/NPSimulation/src/Particle.cc b/NPSimulation/src/Particle.cc
index 4cdb27810..4feffe6ef 100644
--- a/NPSimulation/src/Particle.cc
+++ b/NPSimulation/src/Particle.cc
@@ -23,60 +23,83 @@
 
 #include "Particle.hh"
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 Particle::Particle(){
-    m_ParticleDefinition = NULL; 
-    m_T = 1*GeV;
-    m_Direction = G4ThreeVector(0,0,1);
+  m_ParticleDefinition = NULL;
+  m_T = 1*GeV;
+  m_Direction = G4ThreeVector(0,0,1);
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 Particle::~Particle(){
 }
 
-Particle::Particle(G4ParticleDefinition* particle,double T,G4ThreeVector Direction, G4ThreeVector Position,bool ShootStatus){
-    m_ParticleDefinition = particle;
-    m_T = T;
-    m_Direction = Direction;
-    m_Position = Position;
-    m_ShootStatus = ShootStatus;
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+Particle::Particle(G4ParticleDefinition* particle,double ThetaCM,double T,G4ThreeVector Direction, G4ThreeVector Position,bool ShootStatus){
+  m_ParticleDefinition = particle;
+  m_ThetaCM = ThetaCM;
+  m_T = T;
+  m_Direction = Direction;
+  m_Position = Position;
+  m_ShootStatus = ShootStatus;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 G4ParticleDefinition* Particle::GetParticleDefinition(){
-    return m_ParticleDefinition;
+  return m_ParticleDefinition;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+double Particle::GetParticleThetaCM(){
+  return m_ThetaCM;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 double Particle::GetParticleKineticEnergy(){
-    return m_T;
+  return m_T;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 G4ThreeVector Particle::GetParticleMomentumDirection(){
-    return m_Direction;
+  return m_Direction;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 G4ThreeVector Particle::GetParticlePosition(){
-    return m_Position;
+  return m_Position;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 bool Particle::GetShootStatus(){
-    return m_ShootStatus;
+  return m_ShootStatus;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Particle::SetParticleDefinition(G4ParticleDefinition* particle){
-    m_ParticleDefinition = particle;
+  m_ParticleDefinition = particle;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void Particle::SetParticleThetaCM(double ThetaCM){
+  m_ThetaCM = ThetaCM ;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Particle::SetParticleKineticEnergy(double T){
-    m_T = T ;
+  m_T = T ;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Particle::SetParticleMomentumDirection(G4ThreeVector Direction){
-    m_Direction = Direction;
+  m_Direction = Direction;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Particle::SetParticlePosition(G4ThreeVector Position){
-    m_Position = Position;
+  m_Position = Position;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Particle::SetShootStatus(bool ShootStatus){
-    m_ShootStatus = ShootStatus;
-}
-
+  m_ShootStatus = ShootStatus;
+}
\ No newline at end of file
diff --git a/NPSimulation/src/ParticleStack.cc b/NPSimulation/src/ParticleStack.cc
index 9c72a59d1..67d3363a5 100644
--- a/NPSimulation/src/ParticleStack.cc
+++ b/NPSimulation/src/ParticleStack.cc
@@ -29,14 +29,17 @@
 // NPL
 #include "RootOutput.h"
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 ParticleStack* ParticleStack::instance = 0 ;
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 ParticleStack* ParticleStack::getInstance()
 {
   if (instance == 0) instance = new ParticleStack();
   return instance ;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 ParticleStack::ParticleStack(){
   
   m_particleGun  = new G4ParticleGun(1);
@@ -56,37 +59,61 @@ ParticleStack::~ParticleStack(){
   
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 vector<Particle> ParticleStack::GetParticleStack(){
   return m_ParticleStack;
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void ParticleStack::SetParticleStack(vector<Particle> particle_stack){
   m_ParticleStack = particle_stack;
 }
 
-void ParticleStack::AddParticleToStack(Particle particle){
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void ParticleStack::AddParticleToStack(Particle& particle){
   m_ParticleStack.push_back(particle);
-  m_InitialConditions->SetICPositionX(particle.GetParticlePosition().x());
-  m_InitialConditions->SetICPositionY(particle.GetParticlePosition().y());
-  m_InitialConditions->SetICPositionZ(particle.GetParticlePosition().z());
-  m_InitialConditions->SetICEmittedAngleThetaLabWorldFrame(particle.GetParticleMomentumDirection().theta());
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void ParticleStack::AddBeamParticleToStack(Particle& particle){
+  m_InitialConditions->Clear();
+  m_ParticleStack.push_back(particle);
+  
+  // Incident beam parameter
+  m_InitialConditions-> SetIncidentParticleName   (particle.GetParticleDefinition()->GetParticleName());
+  m_InitialConditions-> SetIncidentKineticEnergy  (particle. GetParticleThetaCM());
+  
+  G4ThreeVector U(1,0,0);
+  G4ThreeVector V(0,1,0);
+  
+  m_InitialConditions-> SetIncidentEmittanceTheta (particle.GetParticleMomentumDirection().angle(U)/deg);
+  m_InitialConditions-> SetIncidentEmittancePhi   (particle.GetParticleMomentumDirection().angle(V)/deg);
+  
+  // Beam status at the initial interaction point
+  m_InitialConditions-> SetInteractionKineticEnergy (particle. GetParticleKineticEnergy());
+  m_InitialConditions-> SetInteractionPositionX     (particle. GetParticlePosition().x());
+  m_InitialConditions-> SetInteractionPositionY     (particle. GetParticlePosition().y());
+  m_InitialConditions-> SetInteractionPositionZ     (particle. GetParticlePosition().x());
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 Particle ParticleStack::SearchAndRemoveParticle(string name){
   
-  for(unsigned int i = 0 ; i < m_ParticleStack.size() ; i++){
+  unsigned int size = m_ParticleStack.size();
+  
+  for(unsigned int i = 0 ; i < size ; i++){
     string ParticleName = m_ParticleStack[i].GetParticleDefinition()->GetParticleName();
-    if(ParticleName.compare(0, name.length(), name) == 0)
-        {
+    if(ParticleName.compare(0, name.length(), name) == 0){
       Particle my_Particule = m_ParticleStack[i];
       m_ParticleStack.erase(m_ParticleStack.begin()+i);
       return my_Particule;
-        }
+    }
   }
   
   return Particle();
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 string ParticleStack::ChangeNameToG4Standard(string OriginalName){
   string NumberOfMass ;
   string Nucleid;
@@ -94,7 +121,7 @@ string ParticleStack::ChangeNameToG4Standard(string OriginalName){
   for (unsigned int i = 0; i < OriginalName.length(); i++) {
     ostringstream character;
     character << OriginalName[i];
-    if (character.str()=="0") NumberOfMass+="0";
+    if      (character.str()=="0") NumberOfMass+="0";
     else if (character.str()=="1") NumberOfMass+="1";
     else if (character.str()=="2") NumberOfMass+="2";
     else if (character.str()=="3") NumberOfMass+="3";
@@ -162,7 +189,7 @@ string ParticleStack::ChangeNameToG4Standard(string OriginalName){
   
   // Special case for light particles
   string FinalName=Nucleid+NumberOfMass;
-  if (FinalName=="H1")       FinalName="proton";
+  if      (FinalName=="H1")       FinalName="proton";
   else if (FinalName=="H2")       FinalName="deuteron";
   else if (FinalName=="H3")       FinalName="triton";
   else if (FinalName=="He4")      FinalName="alpha";
@@ -179,8 +206,11 @@ string ParticleStack::ChangeNameToG4Standard(string OriginalName){
   return(FinalName);
 }
 
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void ParticleStack::ShootAllParticle(G4Event* anEvent){
-  for(unsigned int i = 0 ; i < m_ParticleStack.size() ; i++){
+  unsigned int size = m_ParticleStack.size();
+  
+  for(unsigned int i = 0 ; i < size ; i++){
     
     if(m_ParticleStack[i].GetShootStatus()){
       m_particleGun->SetParticleDefinition(m_ParticleStack[i].GetParticleDefinition());
@@ -188,8 +218,15 @@ void ParticleStack::ShootAllParticle(G4Event* anEvent){
       m_particleGun->SetParticleMomentumDirection(m_ParticleStack[i].GetParticleMomentumDirection());
       m_particleGun->SetParticlePosition(m_ParticleStack[i].GetParticlePosition());
       m_particleGun->GeneratePrimaryVertex(anEvent);
+      
+      //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+      m_InitialConditions-> SetParticleName       ( m_ParticleStack[i].GetParticleDefinition()->GetParticleName()) ;
+      m_InitialConditions-> SetThetaCM            ( m_ParticleStack[i].GetParticleThetaCM()/deg);
+      m_InitialConditions-> SetKineticEnergy      ( m_ParticleStack[i].GetParticleKineticEnergy());
+      m_InitialConditions-> SetMomentumDirectionX ( m_ParticleStack[i].GetParticleMomentumDirection().x());
+      m_InitialConditions-> SetMomentumDirectionY ( m_ParticleStack[i].GetParticleMomentumDirection().y());
+      m_InitialConditions-> SetMomentumDirectionZ ( m_ParticleStack[i].GetParticleMomentumDirection().z());
     }
   }
   m_ParticleStack.clear();
-  m_InitialConditions->Clear();
 }
\ No newline at end of file
-- 
GitLab