diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx
index f047fcef09648bac3fb5550e53037eae9d5911db..db4c8db3203a44e13263b39861dbe99f430c5e74 100644
--- a/NPLib/Physics/NPReaction.cxx
+++ b/NPLib/Physics/NPReaction.cxx
@@ -27,9 +27,10 @@
  *                                                                           *
  *---------------------------------------------------------------------------*
  * Comment:                                                                  *
+ *    + Redesign using LorentzVector by Pierre Morfouace                     *
  *    + 20/01/2011: Add support for excitation energy for light ejectile     *
  *                  (N. de Sereville)                                        *
- *     Based on previous work by N.de Sereville                              *
+ *    + Based on previous work by N.de Sereville                             *
  *                                                                           *
  *****************************************************************************/
 
@@ -55,7 +56,6 @@ using namespace NPUNITS;
 // ROOT
 #include"TF1.h"
 
-
 ClassImp(Reaction)
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -89,7 +89,8 @@ Reaction::Reaction(){
   
   fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180);
   fExcitationEnergyHist = NULL;
-  
+  fDoubleDifferentialCrossSectionHist = NULL ; 
+ 
   fshoot3=true;
   fshoot4=true;
  
@@ -154,8 +155,9 @@ Reaction::Reaction(string reaction){
   
   fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180);
   fCrossSectionHist = NULL;
-
-  fshoot3=true;
+  fDoubleDifferentialCrossSectionHist = NULL ;
+  
+fshoot3=true;
   fshoot4=true;
   
   initializePrecomputeVariable();
@@ -205,7 +207,15 @@ bool Reaction::CheckKinematic(){
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 double Reaction::ShootRandomThetaCM(){
   double theta;
-  SetThetaCM( theta=fCrossSectionHist->GetRandom()*deg );
+  if(fDoubleDifferentialCrossSectionHist){
+    // Take a slice in energy
+    TAxis* Y = fDoubleDifferentialCrossSectionHist->GetYaxis();
+    TH1D* Proj = fDoubleDifferentialCrossSectionHist
+          ->ProjectionY("proj",Y->FindBin(fBeamEnergy),Y->FindBin(fBeamEnergy));
+    SetThetaCM( theta=Proj->GetRandom()*deg );
+   }
+  else
+    SetThetaCM( theta=fCrossSectionHist->GetRandom()*deg );
   return theta;
 }
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -252,7 +262,6 @@ void Reaction::KineRelativistic(double &ThetaLab3, double &KineticEnergyLab3,
 		cout << "Problem for energy conservation" << endl;
 }
 
-
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){
   // EnergyLab in MeV
@@ -268,8 +277,6 @@ double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){
 	return Eex;
 }
 
-
-
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //Return ThetaCM
 double  Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){
@@ -316,6 +323,7 @@ void Reaction::ReadConfigurationFile(string Path){
   bool check_ExcitationEnergy3 = false ;
   bool check_ExcitationEnergy4 = false ;
   bool check_ExcitationEnergyDistribution = false;
+  bool check_DoubleDifferentialCrossSectionPath = false;
   bool check_CrossSectionPath = false ;
   bool check_shoot3 = false ;
   bool check_shoot4 = false;
@@ -408,7 +416,7 @@ void Reaction::ReadConfigurationFile(string Path){
         string FileName,HistName;
         ReactionFile >> FileName >> HistName;
         if(fVerboseLevel==1) cout << "Reading Cross Section file: " << FileName << endl;
-        TH1F* CStemp = Read1DProfile(FileName, HistName );
+        TH1F* CStemp = Read1DProfile(FileName, HistName);
         
         // multiply CStemp by sin(theta)
         TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180);
@@ -417,6 +425,27 @@ void Reaction::ReadConfigurationFile(string Path){
         delete fsin;
       }
       
+      // Use for multi energy beam simulation
+      // This distribution is the differential Cross section for each Beam energy
+      // The Beam energy distribution itself should not be included originally
+      else if (DataBuffer== "DoubleDifferentialCrossSectionPath=") {
+        check_DoubleDifferentialCrossSectionPath = true ;
+        string FileName,HistName;
+        ReactionFile >> FileName >> HistName;
+        if(fVerboseLevel==1) cout << "Reading Double Differential Cross Section file: " << FileName << endl;
+        TH2F* CStemp = Read2DProfile(FileName, HistName);
+        
+        // multiply CStemp by sin(theta)
+        // X axis is theta CM
+        // Y axis is beam energy
+        // Division affect only X axis
+        TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180);
+        CStemp->Divide(fsin,1);
+
+        SetDoubleDifferentialCrossSectionHist(CStemp);
+        delete fsin;
+      }
+ 
       else if (DataBuffer.compare(0, 17, "HalfOpenAngleMin=") == 0) {
         ReactionFile >> DataBuffer;
         CSHalfOpenAngleMin = atof(DataBuffer.c_str()) * deg;
@@ -459,7 +488,9 @@ void Reaction::ReadConfigurationFile(string Path){
       ///////////////////////////////////////////////////
       //   If all Token found toggle out
       if (check_Beam && check_Target && check_Light && check_Heavy && check_ExcitationEnergy3
-          && (check_ExcitationEnergy4 || check_ExcitationEnergyDistribution ) && check_CrossSectionPath && check_shoot4 && check_shoot3)
+          && (check_ExcitationEnergy4 || check_ExcitationEnergyDistribution ) 
+          && (check_CrossSectionPath || check_DoubleDifferentialCrossSectionPath) 
+          && check_shoot4 && check_shoot3)
         ReadingStatus = false;
     }
   }
@@ -470,7 +501,6 @@ void Reaction::ReadConfigurationFile(string Path){
   initializePrecomputeVariable();
 }
 
-
 ////////////////////////////////////////////////////////////////////////////////////////////
 void Reaction::initializePrecomputeVariable(){
 
@@ -524,9 +554,6 @@ void Reaction::SetNuclei3(double EnergyLab, double ThetaLab){
 	fExcitation4 = ReconstructRelativistic(EnergyLab, ThetaLab);
 }
 
-
-
-
 ////////////////////////////////////////////////////////////////////////////////////////////
 TGraph* Reaction::GetKinematicLine3(double AngleStep_CM){
 	
@@ -547,7 +574,6 @@ TGraph* Reaction::GetKinematicLine3(double AngleStep_CM){
 	return(fKineLine3);
 }
 
-
 ////////////////////////////////////////////////////////////////////////////////////////////
 TGraph* Reaction::GetKinematicLine4(double AngleStep_CM){
 
@@ -627,8 +653,6 @@ TGraph* Reaction::GetThetaLabVersusThetaCM(double AngleStep_CM){
 	return(fAngleLine);
 }
 
-
-
 ////////////////////////////////////////////////////////////////////////////////////////////
 void Reaction::PrintKinematic(){
 	int size = 360;
@@ -651,7 +675,6 @@ void Reaction::PrintKinematic(){
   }
 }
 
-
 ////////////////////////////////////////////////////////////////////////////////////////////
 void Reaction::SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax){
   
@@ -661,16 +684,3 @@ void Reaction::SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax){
   
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h
index 2c4130c5d4566b0bffb82dba8a8838416627bb1d..6aa583c7ee6a5cb3dbe8fd25b80f5a031ad3a11c 100644
--- a/NPLib/Physics/NPReaction.h
+++ b/NPLib/Physics/NPReaction.h
@@ -90,6 +90,7 @@ namespace NPL{
       double   fExcitation3;             // Excitation energy in MeV
       double   fExcitation4;             // Excitation energy in MeV
       TH1F*    fCrossSectionHist;        // Differential cross section in CM frame
+      TH2F*    fDoubleDifferentialCrossSectionHist; // Diff. CS CM frame vs Beam E
       TH1F*    fExcitationEnergyHist;    // Distribution of Excitation energy
     public:
       // Getters and Setters
@@ -101,8 +102,11 @@ 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;}
+      void     SetCrossSectionHist  (TH1F*  CrossSectionHist)     
+        {delete fCrossSectionHist; fCrossSectionHist   = CrossSectionHist;}
 
+      void     SetDoubleDifferentialCrossSectionHist(TH2F* CrossSectionHist) 
+        {fDoubleDifferentialCrossSectionHist = CrossSectionHist;}
       double   GetBeamEnergy() const            {return fBeamEnergy;}
       double   GetThetaCM() const               {return fThetaCM;}
       double   GetExcitation3() const           {return fExcitation3;}