diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx
index 93e30380c1d118b8cb038ef8806da790f2c5e4d7..5f6a24d64c73ab1d2905111c4add74570387ef40 100644
--- a/NPLib/Physics/NPReaction.cxx
+++ b/NPLib/Physics/NPReaction.cxx
@@ -80,7 +80,7 @@ ClassImp(Reaction)
 
     fCrossSectionHist = NULL;
     fExcitationEnergyHist = NULL;
-    fDoubleDifferentialCrossSectionHist = NULL ; 
+    fDoubleDifferentialCrossSectionHist = NULL ;
 
     fshoot3=true;
     fshoot4=true;
@@ -90,7 +90,7 @@ ClassImp(Reaction)
 // This constructor aim to provide a fast way to instantiate a reaction without input file
 // The string should be of the form "A(b,c)D@E" with E the ernegy of the beam in MeV
 Reaction::Reaction(string reaction){
-  // Instantiate the parameter to default  
+  // Instantiate the parameter to default
   // Analyse the reaction and extract revelant information
   string A,b,c,D,E;
   unsigned int i=0;
@@ -189,7 +189,7 @@ double Reaction::ShootRandomThetaCM(){
     int binY;
 
     // Those test are there for the tail event of the energy distribution
-    // In case the energy is outside the range of the 2D histo we take the 
+    // In case the energy is outside the range of the 2D histo we take the
     // closest available CS
     if(Y->FindBin(fBeamEnergy) > Y->GetLast())
       binY = Y->GetLast()-1;
@@ -252,33 +252,27 @@ void Reaction::KineRelativistic(double& ThetaLab3, double& KineticEnergyLab3,
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab, double PhiLab){
+double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){
   // EnergyLab in MeV
   // ThetaLab in rad
   double E3 = m3 + EnergyLab;
   double p_Lab_3 = sqrt(E3*E3 - m3*m3);
-  TVector3 p_Lab_3_vec = TVector3(0,0,1);
-  p_Lab_3_vec.SetMagThetaPhi(p_Lab_3, ThetaLab, PhiLab);
-
-  fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3_vec, E3);
+  fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3*sin(ThetaLab),0,p_Lab_3*cos(ThetaLab),E3);
   fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3;
 
+
   double Eex = fEnergyImpulsionLab_4.Mag() - fNuclei4.Mass();
-//by Shuya 171005
-//cout << m1 << " " << m2 << " " << fNuclei4.Mass() << " " << m3 << " " << EnergyLab << " " << ThetaLab << " " << ThetaLab/deg << " " << Eex << endl;
 
   return Eex;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 //Return ThetaCM
-double  Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab, double PhiLab){
+double  Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){
   double E3 = m3 + EnergyLab;
   double p_Lab_3 = sqrt(E3*E3 - m3*m3);
-  TVector3 p_Lab_3_vec = TVector3(0,0,1);
-  p_Lab_3_vec.SetMagThetaPhi(p_Lab_3, ThetaLab, PhiLab);
 
-  fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3_vec, E3);
+  fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3*sin(ThetaLab),0,p_Lab_3*cos(ThetaLab),E3);
   fEnergyImpulsionCM_3 = fEnergyImpulsionLab_3;
   fEnergyImpulsionCM_3.Boost(0,0,-BetaCM);
 
@@ -322,7 +316,7 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){
 
   vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TwoBodyReaction");
   if(blocks.size()>0 && NPOptionManager::getInstance()->GetVerboseLevel())
-    cout << endl << "\033[1;35m//// Two body reaction found " << endl; 
+    cout << endl << "\033[1;35m//// Two body reaction found " << endl;
 
   vector<string> token1 = {"Beam","Target","Light","Heavy"};
   vector<string> token2 = {"Beam","Target","Nuclei3","Nuclei4"};
@@ -349,21 +343,21 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){
       fNuclei2 = Nucleus(blocks[i]->GetString("Target"));
       fNuclei3 = Nucleus(blocks[i]->GetString("Nuclei3"));
       fNuclei4 = Nucleus(blocks[i]->GetString("Nuclei4"));
-    }    
+    }
     else{
-      cout << "ERROR: check your input file formatting \033[0m" << endl; 
+      cout << "ERROR: check your input file formatting \033[0m" << endl;
       exit(1);
     }
 
     if(blocks[i]->HasToken("ExcitationEnergyLight"))
-      fExcitation3 = blocks[i]->GetDouble("ExcitationEnergyLight","MeV"); 
+      fExcitation3 = blocks[i]->GetDouble("ExcitationEnergyLight","MeV");
     else if(blocks[i]->HasToken("ExcitationEnergy3"))
-      fExcitation3 = blocks[i]->GetDouble("ExcitationEnergy3","MeV"); 
+      fExcitation3 = blocks[i]->GetDouble("ExcitationEnergy3","MeV");
 
     if(blocks[i]->HasToken("ExcitationEnergyHeavy"))
-      fExcitation4 = blocks[i]->GetDouble("ExcitationEnergyHeavy","MeV"); 
+      fExcitation4 = blocks[i]->GetDouble("ExcitationEnergyHeavy","MeV");
     else if(blocks[i]->HasToken("ExcitationEnergy4"))
-      fExcitation4 = blocks[i]->GetDouble("ExcitationEnergy4","MeV"); 
+      fExcitation4 = blocks[i]->GetDouble("ExcitationEnergy4","MeV");
 
     if(blocks[i]->HasToken("ExcitationEnergyDistribution")){
       vector<string> file = blocks[i]->GetVectorString("ExcitationEnergyDistribution");
@@ -405,13 +399,13 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser){
     }
     if(blocks[i]->HasToken("Shoot3")){
       fshoot3 = blocks[i]->GetInt("Shoot3");
-    } 
+    }
     if(blocks[i]->HasToken("Shoot4")){
       fshoot4 = blocks[i]->GetInt("Shoot4");
-    } 
+    }
     if(blocks[i]->HasToken("ShootHeavy")){
       fshoot4 = blocks[i]->GetInt("ShootHeavy");
-    } 
+    }
     if(blocks[i]->HasToken("ShootLight")){
       fshoot3 = blocks[i]->GetInt("ShootLight");
     }
@@ -435,6 +429,7 @@ void Reaction::initializePrecomputeVariable(){
 
   s = m1*m1 + m2*m2 + 2*m2*(fBeamEnergy + m1);
   fTotalEnergyImpulsionCM = TLorentzVector(0,0,0,sqrt(s));
+  fEcm = sqrt(s) - m1 -m2;
 
   ECM_1 = (s + m1*m1 - m2*m2)/(2*sqrt(s));
   ECM_2 = (s + m2*m2 - m1*m1)/(2*sqrt(s));
@@ -464,20 +459,15 @@ void Reaction::initializePrecomputeVariable(){
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////
-void Reaction::SetNuclei3(double EnergyLab, double ThetaLab, double PhiLab){
-
-  double E3 = m3 + EnergyLab;
-  double p_Lab_3 = sqrt(E3*E3 - m3*m3);
-  TVector3 p_Lab_3_vec = TVector3(0,0,1);
-  p_Lab_3_vec.SetMagThetaPhi(p_Lab_3, ThetaLab, PhiLab);
+void Reaction::SetNuclei3(double EnergyLab, double ThetaLab){
+  double p3 = sqrt(pow(EnergyLab,2) + 2*m3*EnergyLab);
 
-  fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3_vec, E3);
+  fEnergyImpulsionLab_3 = TLorentzVector(p3*sin(ThetaLab),0,p3*cos(ThetaLab),EnergyLab+m3);
   fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3;
 
   fNuclei3.SetEnergyImpulsion(fEnergyImpulsionLab_3);
   fNuclei4.SetEnergyImpulsion(fEnergyImpulsionLab_4);
-  
-  //ThetaCM and Energy do not depend on PhiLab
+
   fThetaCM = EnergyLabToThetaCM(EnergyLab, ThetaLab);
   fExcitation4 = ReconstructRelativistic(EnergyLab, ThetaLab);
 }
@@ -525,20 +515,20 @@ TGraph* Reaction::GetKinematicLine4(double AngleStep_CM){
   return(fKineLine4);
 }
 
-////////////////////////////////////////////////////////////////////////////////////////////   
+////////////////////////////////////////////////////////////////////////////////////////////
 TGraph* Reaction::GetTheta3VsTheta4(double AngleStep_CM)
-{	
+{
 
   vector<double> vx;
   vector<double> vy;
   double theta3,E3,theta4,E4;
 
   for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){
-    SetThetaCM(angle*deg); 
+    SetThetaCM(angle*deg);
     KineRelativistic(theta3, E3, theta4, E4);
 
-    vx.push_back(theta3/deg); 
-    vy.push_back(theta4/deg); 
+    vx.push_back(theta3/deg);
+    vy.push_back(theta4/deg);
   }
   fTheta3VsTheta4= new TGraph(vx.size(),&vx[0],&vy[0]);
   return(fTheta3VsTheta4);
@@ -644,4 +634,3 @@ void Reaction::SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax){
         fCrossSectionHist->SetBinContent(i,0);
   }
 }
-
diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h
index 2d70cb1dec26a35df7dea3597b319e7361cf0e56..4ea979ac366e17fdd86cefafb4ad5ba1f4b2dd25 100644
--- a/NPLib/Physics/NPReaction.h
+++ b/NPLib/Physics/NPReaction.h
@@ -82,6 +82,7 @@ namespace NPL{
       Nucleus  fNuclei3;                 // Light ejectile
       Nucleus  fNuclei4;                 // Heavy ejectile
       double   fQValue;                  // Q-value in MeV
+      double   fEcm;                     // Ecm in MeV
       double   fBeamEnergy;              // Beam energy in MeV
       double   fThetaCM;                 // Center-of-mass angle in radian
       double   fExcitation3;             // Excitation energy in MeV
@@ -92,6 +93,7 @@ namespace NPL{
     public:
       // Getters and Setters
       void     SetBeamEnergy(double eBeam)      {fBeamEnergy = eBeam;     initializePrecomputeVariable();}
+      void     SetEcm(double Ecm)		{fEcm= Ecm; s=pow(Ecm+m1+m2,2); fBeamEnergy=(s-m1*m1-m2*m2)/(2*m2)-m1; initializePrecomputeVariable();}
       void     SetThetaCM(double angle)         {fThetaCM = angle;        initializePrecomputeVariable();}
       void     SetExcitation3(double exci)      {fExcitation3 = exci; initializePrecomputeVariable();}
       void     SetExcitation4(double exci)      {fExcitation4 = exci; initializePrecomputeVariable();}
@@ -99,16 +101,17 @@ 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)     
+      void     SetCrossSectionHist  (TH1F*  CrossSectionHist)
         {delete fCrossSectionHist; fCrossSectionHist   = CrossSectionHist;}
 
-      void     SetDoubleDifferentialCrossSectionHist(TH2F* CrossSectionHist) 
+      void     SetDoubleDifferentialCrossSectionHist(TH2F* CrossSectionHist)
         {fDoubleDifferentialCrossSectionHist = CrossSectionHist;}
       double   GetBeamEnergy() const            {return fBeamEnergy;}
       double   GetThetaCM() const               {return fThetaCM;}
       double   GetExcitation3() const           {return fExcitation3;}
       double   GetExcitation4() const           {return fExcitation4;}
       double   GetQValue() const                {return fQValue;}
+      double   GetEcm() const			{return fEcm;}
       Nucleus  GetNucleus1() const              {return fNuclei1;}
       Nucleus  GetNucleus2() const              {return fNuclei2;}
       Nucleus  GetNucleus3() const              {return fNuclei3;}
@@ -192,14 +195,14 @@ namespace NPL{
           double &ThetaLab4, double &KineticEnergyLab4);
 
       // Return Excitation Energy
-      double ReconstructRelativistic(double EnergyLab, double ThetaLab, double PhiLab=0);
+      double ReconstructRelativistic(double EnergyLab, double ThetaLab);
 
       // Return ThetaCM
       // EnergyLab: energy measured in the laboratory frame
       // ExcitationEnergy: excitation energy previously calculated.
-      double EnergyLabToThetaCM(double EnergyLab, double ThetaLab, double PhiLab=0);
+      double EnergyLabToThetaCM(double EnergyLab, double ThetaLab);
 
-      void SetNuclei3(double EnergyLab, double ThetaLab, double PhiLab=0);
+      void SetNuclei3(double EnergyLab, double ThetaLab);
 
       TGraph* GetKinematicLine3(double AngleStep_CM=1);
       TGraph* GetKinematicLine4(double AngleStep_CM=1);