From bc0423f0fc2611b54dc41aa5e8e81ec421f73e78 Mon Sep 17 00:00:00 2001
From: adrien-matta <a.matta@surrey.ac.uk>
Date: Tue, 16 Feb 2016 10:03:36 +0000
Subject: [PATCH] * Fixing seg fault when quitin cint after using NPL::Reaction
         * Issue was in NPeam deleting histo before root tries         * also
 pass a couple of variable to the heap instead of the stack

---
 .../MUGAST_Agata_Cryo.detector                |  4 +-
 NPLib/Physics/NPBeam.cxx                      |  3 -
 NPLib/Physics/NPNucleus.cxx                   | 22 ++---
 NPLib/Physics/NPNucleus.h                     | 16 ++--
 NPLib/Physics/NPReaction.cxx                  | 88 +++++++------------
 NPLib/Physics/NPReaction.h                    | 16 ++--
 .../Core/EventGeneratorTwoBodyReaction.cc     |  8 +-
 7 files changed, 63 insertions(+), 94 deletions(-)

diff --git a/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector b/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector
index 2d689f942..733c58498 100644
--- a/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector
+++ b/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector
@@ -75,7 +75,7 @@ GPDSquare
    X1_Y128=   -132.251 58.314   -3.13
    X128_Y128=  -61.823 128.742  -3.13
    FIRSTSTAGE= 1
-   SECONDSTAGE= 0 
+   SECONDSTAGE= 1 
    THIRDSTAGE= 0
    VIS= all
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2
@@ -85,7 +85,7 @@ GPDSquare
    X1_Y128=   -135.00  -51.01 -3.13
    X128_Y128= -135.00   43.99 -3.13
    FIRSTSTAGE= 1
-   SECONDSTAGE= 0
+   SECONDSTAGE= 1
    THIRDSTAGE= 0
    VIS= all
 
diff --git a/NPLib/Physics/NPBeam.cxx b/NPLib/Physics/NPBeam.cxx
index 93c90f27f..ec26534b1 100644
--- a/NPLib/Physics/NPBeam.cxx
+++ b/NPLib/Physics/NPBeam.cxx
@@ -114,9 +114,6 @@ Beam::Beam(string isotope){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 Beam::~Beam(){
-  delete fEnergyHist  ;
-  delete fXThetaXHist ;
-  delete fYPhiYHist   ;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
diff --git a/NPLib/Physics/NPNucleus.cxx b/NPLib/Physics/NPNucleus.cxx
index 57e59fbf0..e9c1a26c9 100644
--- a/NPLib/Physics/NPNucleus.cxx
+++ b/NPLib/Physics/NPNucleus.cxx
@@ -48,8 +48,7 @@ using namespace std;
 
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
-Nucleus::Nucleus()
-{
+Nucleus::Nucleus(){
   //----------- Default Constructor ----------
   fName= "XX DEFAULT XX";
   fCharge= 0;
@@ -149,27 +148,24 @@ Nucleus::~Nucleus()
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
-void Nucleus::Extract(const char* line)
-{
-  string ligne = line;
-
+void Nucleus::Extract(string line){
   // name of the isotope
-  string s_name = ligne.substr(11,7);
+  string s_name = line.substr(11,7);
   fName = s_name.data();
 
   // charge and mass
-  string s_mass   = ligne.substr(0,3);
-  string s_charge = ligne.substr(4,4);
+  string s_mass   = line.substr(0,3);
+  string s_charge = line.substr(4,4);
   fAtomicWeight = atoi(s_mass.data());
   fCharge       = atoi(s_charge.data()); fCharge /= 10;
 
   // mass excess
-  string s_excess = ligne.substr(18,10);
+  string s_excess = line.substr(18,10);
   fMassExcess = atof(s_excess.data());
 
   // life time
-  string s_lt_units = ligne.substr(69,3); 
-  string s_LifeTime = ligne.substr(57,12);
+  string s_lt_units = line.substr(69,3); 
+  string s_LifeTime = line.substr(57,12);
   // Remove space
   s_LifeTime.erase( std::remove_if( s_LifeTime.begin(), s_LifeTime.end(), ::isspace ), s_LifeTime.end() );
   s_lt_units.erase( std::remove_if( s_lt_units.begin(), s_lt_units.end(), ::isspace ), s_lt_units.end() );
@@ -213,7 +209,7 @@ void Nucleus::Extract(const char* line)
     fLifeTime*=3600*24*365.25*1e12;
   
   // spin and parity
-  string s_spinparity = ligne.substr(79,14);
+  string s_spinparity = line.substr(79,14);
   fSpinParity = s_spinparity.data();
   size_t found_p = s_spinparity.find("+");
   size_t found_m = s_spinparity.find("-");
diff --git a/NPLib/Physics/NPNucleus.h b/NPLib/Physics/NPNucleus.h
index e70800e2f..7cc5aed5e 100644
--- a/NPLib/Physics/NPNucleus.h
+++ b/NPLib/Physics/NPNucleus.h
@@ -50,14 +50,14 @@ namespace NPL {
     
   private :
     //intrinsic properties
-    const char* fName;         // Nucleus name
+    string      fName;         // Nucleus name
     string	    fNucleusName;
     int         fCharge;      // Nucleus charge
     int         fAtomicWeight;   // Nucleus atomic weight
     double      fMassExcess;   // Nucleus mass excess in keV
-    const char* fSpinParity;   // Nucleus spin and parity
+    string      fSpinParity;   // Nucleus spin and parity
     double      fSpin;         // Nucleus spin
-    const char* fParity;      // Nucleus parity
+    string      fParity;      // Nucleus parity
     double      fLifeTime; // life time
 
     //kinematic properties
@@ -84,17 +84,17 @@ namespace NPL {
     
     
   protected :
-    void Extract(const char* line);
+    void Extract(string line);
     
     public :
     void				GetNucleusName();
     string			GetName()			const				{return fNucleusName;}
-    int				GetZ()				const				{return fCharge;}
-    int				GetA()				const				{return fAtomicWeight;}
+    int			  	GetZ()				const				{return fCharge;}
+    int			  	GetA()				const				{return fAtomicWeight;}
     double			GetMassExcess()		const				{return fMassExcess;}
-    const char*		GetSpinParity()		const				{return fSpinParity;}
+    string   		GetSpinParity()		const				{return fSpinParity;}
     double			GetSpin()			const				{return fSpin;}
-    const char*		GetParity()			const				{return fParity;}
+    string   		GetParity()			const				{return fParity;}
     double      GetLifeTime() const {return fLifeTime;}
     double			GetEnergy()			const				{return fKineticEnergy;}
     double			GetBrho()			const				{return fBrho;}
diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx
index 710692eba..271a3c8fd 100644
--- a/NPLib/Physics/NPReaction.cxx
+++ b/NPLib/Physics/NPReaction.cxx
@@ -70,10 +70,6 @@ Reaction::Reaction(){
 	fAngleLine = 0;
   
   //
-  fNuclei1              = new Beam();
-  fNuclei2              = new Nucleus();
-  fNuclei3              = new Nucleus();
-  fNuclei4              = new Nucleus();
   fBeamEnergy           = 0;
   fThetaCM              = 0;
   fExcitation3          = 0;
@@ -82,12 +78,7 @@ Reaction::Reaction(){
   fVerboseLevel         = NPOptionManager::getInstance()->GetVerboseLevel();
   initializePrecomputeVariable();
   
-  // 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);
+  fCrossSectionHist = NULL;
   fExcitationEnergyHist = NULL;
   fDoubleDifferentialCrossSectionHist = NULL ; 
  
@@ -136,10 +127,10 @@ Reaction::Reaction(string reaction){
 	fLineBrho3 = 0;
 	fTheta3VsTheta4 = 0;
 	fAngleLine = 0;
-  fNuclei1 = new Beam(A);
-  fNuclei2 = new Nucleus(b);
-  fNuclei3 = new Nucleus(c);
-  fNuclei4 = new Nucleus(D);
+  fNuclei1 = Beam(A);
+  fNuclei2 = Nucleus(b);
+  fNuclei3 = Nucleus(c);
+  fNuclei4 = Nucleus(D);
   fBeamEnergy = atof(E.c_str());
   fThetaCM              = 0;
   fExcitation3          = 0;
@@ -154,7 +145,6 @@ Reaction::Reaction(string reaction){
     ++offset;
   
   fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180);
-  fCrossSectionHist = NULL;
   fDoubleDifferentialCrossSectionHist = NULL ;
   
 fshoot3=true;
@@ -164,20 +154,6 @@ fshoot3=true;
 }
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 Reaction::~Reaction(){
-  //------------- Default Destructor ------------
-
-  if(fNuclei1)
-    delete fNuclei1;
-  
-  if(fNuclei2)
-    delete fNuclei2;
-  
-  if(fNuclei3)
-    delete fNuclei3;
-  
-  if(fNuclei4)
-    delete fNuclei4;
-  
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -285,7 +261,7 @@ double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){
   fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3;
 
 
-	double Eex = fEnergyImpulsionLab_4.Mag() - fNuclei4->Mass();
+	double Eex = fEnergyImpulsionLab_4.Mag() - fNuclei4.Mass();
   
 	return Eex;
 }
@@ -309,8 +285,8 @@ double  Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){
 void Reaction::Print() const{
   // Print informations concerning the reaction
   
-  cout << "Reaction : " << fNuclei2->GetName() << "(" << fNuclei1->GetName()
-  << "," << fNuclei3->GetName() << ")" << fNuclei4->GetName() << "  @  "
+  cout << "Reaction : " << fNuclei2.GetName() << "(" << fNuclei1.GetName()
+  << "," << fNuclei3.GetName() << ")" << fNuclei4.GetName() << "  @  "
   << fBeamEnergy << " MeV"
   << endl   ;
   
@@ -380,31 +356,31 @@ void Reaction::ReadConfigurationFile(string Path){
         check_Beam = true ;
         ReactionFile >> DataBuffer;
         // Pick up the beam energy from the Beam event generator
-        fNuclei1->SetVerboseLevel(0);
-        fNuclei1->ReadConfigurationFile(Path);
-        fBeamEnergy= fNuclei1->GetEnergy();
-        if(fVerboseLevel==1) cout << "\033[1;35mBeam " << fNuclei1->GetName() << " @ " << fBeamEnergy << " MeV" << endl;
+        fNuclei1.SetVerboseLevel(0);
+        fNuclei1.ReadConfigurationFile(Path);
+        fBeamEnergy= fNuclei1.GetEnergy();
+        if(fVerboseLevel==1) cout << "\033[1;35mBeam " << fNuclei1.GetName() << " @ " << fBeamEnergy << " MeV" << endl;
       }
       
       else if (DataBuffer=="Target=") {
         check_Target = true ;
         ReactionFile >> DataBuffer;
-        fNuclei2         = new Nucleus(DataBuffer);
-        if(fVerboseLevel==1) cout << "Target " << fNuclei2->GetName() << endl;
+        fNuclei2 = Nucleus(DataBuffer);
+        if(fVerboseLevel==1) cout << "Target " << fNuclei2.GetName() << endl;
       }
       
       else if (DataBuffer=="Light=" || DataBuffer=="Nuclei3=") {
         check_Light = true ;
         ReactionFile >> DataBuffer;
-        fNuclei3 = new Nucleus(DataBuffer);
-        if(fVerboseLevel==1) cout << "Light " << fNuclei3->GetName() << endl;
+        fNuclei3 = Nucleus(DataBuffer);
+        if(fVerboseLevel==1) cout << "Light " << fNuclei3.GetName() << endl;
       }
       
       else if  (DataBuffer== "Heavy="|| DataBuffer=="Nuclei4=") {
         check_Heavy = true ;
         ReactionFile >> DataBuffer;
-        fNuclei4 = new Nucleus(DataBuffer);
-        if(fVerboseLevel==1) cout << "Heavy " << fNuclei4->GetName() << endl;
+        fNuclei4 = Nucleus(DataBuffer);
+        if(fVerboseLevel==1) cout << "Heavy " << fNuclei4.GetName() << endl;
       }
       
       else if  (DataBuffer=="ExcitationEnergy3=" || DataBuffer=="ExcitationEnergyLight=") {
@@ -526,10 +502,10 @@ void Reaction::initializePrecomputeVariable(){
   if(fBeamEnergy < 0)
     fBeamEnergy = 0 ;
 
-  m1 = fNuclei1->Mass();
-  m2 = fNuclei2->Mass();
-  m3 = fNuclei3->Mass() + fExcitation3;
-  m4 = fNuclei4->Mass() + fExcitation4;
+  m1 = fNuclei1.Mass();
+  m2 = fNuclei2.Mass();
+  m3 = fNuclei3.Mass() + fExcitation3;
+  m4 = fNuclei4.Mass() + fExcitation4;
   fQValue =m1+m2-m3-m4;
 
   s = m1*m1 + m2*m2 + 2*m2*(fBeamEnergy + m1);
@@ -569,8 +545,8 @@ void Reaction::SetNuclei3(double EnergyLab, double ThetaLab){
 	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);
+	fNuclei3.SetEnergyImpulsion(fEnergyImpulsionLab_3);
+	fNuclei4.SetEnergyImpulsion(fEnergyImpulsionLab_4);
 	
 	fThetaCM = EnergyLabToThetaCM(EnergyLab, ThetaLab);
 	fExcitation4 = ReconstructRelativistic(EnergyLab, ThetaLab);
@@ -586,7 +562,7 @@ TGraph* Reaction::GetKinematicLine3(double AngleStep_CM){
 	for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){
 		SetThetaCM(angle*deg);
 		KineRelativistic(theta3, E3, theta4, E4);
-		fNuclei3->SetKineticEnergy(E3);
+		fNuclei3.SetKineticEnergy(E3);
 	
     if(E3>0){
 		  vx.push_back(theta3/deg);
@@ -608,7 +584,7 @@ TGraph* Reaction::GetKinematicLine4(double AngleStep_CM){
 	for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){
     SetThetaCM(angle*deg);
 		KineRelativistic(theta3, E3, theta4, E4);
-		fNuclei4->SetKineticEnergy(E4);
+		fNuclei4.SetKineticEnergy(E4);
 		if(E4>0){
 		  vx.push_back(theta4/deg);
 		  vy.push_back(E4);
@@ -649,8 +625,8 @@ TGraph* Reaction::GetBrhoLine3(double AngleStep_CM){
 	for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){
 		SetThetaCM(angle*deg);
 		KineRelativistic(theta3, E3, theta4, E4);
-		fNuclei3->SetKineticEnergy(E3);
-		Brho = fNuclei3->GetBrho();
+		fNuclei3.SetKineticEnergy(E3);
+		Brho = fNuclei3.GetBrho();
 		
 		vx.push_back(theta3/deg);
 		vy.push_back(Brho);
@@ -720,11 +696,11 @@ void Reaction::PrintKinematic(){
 		SetThetaCM(((double)i)/2*deg);
 		KineRelativistic(theta3, E3, theta4, E4);
 		
-		fNuclei3->SetKineticEnergy(E3);
-		Brho3 = fNuclei3->GetBrho();
+		fNuclei3.SetKineticEnergy(E3);
+		Brho3 = fNuclei3.GetBrho();
 		
-		fNuclei4->SetKineticEnergy(E4);
-		Brho4 = fNuclei4->GetBrho();
+		fNuclei4.SetKineticEnergy(E4);
+		Brho4 = fNuclei4.GetBrho();
 		
 		cout << (double)i/2 << "	" << theta3/deg << "	" << E3 << "	" << Brho3 << "		" << E4 << "	" << Brho4 << endl;
   }
diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h
index 7f93db296..0869dae2d 100644
--- a/NPLib/Physics/NPReaction.h
+++ b/NPLib/Physics/NPReaction.h
@@ -80,10 +80,10 @@ namespace NPL{
       TGraph* fLineBrho3;
       TGraph* fAngleLine;
     private:
-      Beam*    fNuclei1;                 // Beam
-      Nucleus* fNuclei2;                 // Target
-      Nucleus* fNuclei3;                 // Light ejectile
-      Nucleus* fNuclei4;                 // Heavy ejectile
+      Beam     fNuclei1;                 // Beam
+      Nucleus  fNuclei2;                 // Target
+      Nucleus  fNuclei3;                 // Light ejectile
+      Nucleus  fNuclei4;                 // Heavy ejectile
       double   fQValue;                  // Q-value in MeV
       double   fBeamEnergy;              // Beam energy in MeV
       double   fThetaCM;                 // Center-of-mass angle in radian
@@ -112,10 +112,10 @@ namespace NPL{
       double   GetExcitation3() const           {return fExcitation3;}
       double   GetExcitation4() const           {return fExcitation4;}
       double   GetQValue() const                {return fQValue;}
-      Nucleus* GetNucleus1() const              {return fNuclei1;}
-      Nucleus* GetNucleus2() const              {return fNuclei2;}
-      Nucleus* GetNucleus3() const              {return fNuclei3;}
-      Nucleus* GetNucleus4() const              {return fNuclei4;}
+      Nucleus  GetNucleus1() const              {return fNuclei1;}
+      Nucleus  GetNucleus2() const              {return fNuclei2;}
+      Nucleus  GetNucleus3() const              {return fNuclei3;}
+      Nucleus  GetNucleus4() const              {return fNuclei4;}
       TH1F*    GetCrossSectionHist() const      {return fCrossSectionHist;}
       int      GetVerboseLevel()         const  {return fVerboseLevel;}
       bool     GetShoot3()         const        {return fshoot3;}
diff --git a/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc b/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc
index 59e4bcd23..835a99195 100644
--- a/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc
+++ b/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc
@@ -104,15 +104,15 @@ void EventGeneratorTwoBodyReaction::GenerateEvent(G4Event*){
   //////Define the kind of particle to shoot////////
   //////////////////////////////////////////////////
   // Nucleus 3
-  G4int LightZ = m_Reaction->GetNucleus3()->GetZ() ;
-  G4int LightA = m_Reaction->GetNucleus3()->GetA() ;
+  G4int LightZ = m_Reaction->GetNucleus3().GetZ() ;
+  G4int LightA = m_Reaction->GetNucleus3().GetA() ;
   
   G4ParticleDefinition* LightName
   = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(LightZ, LightA, m_Reaction->GetExcitation3()*MeV);
   
   // Nucleus 4
-  G4int HeavyZ = m_Reaction->GetNucleus4()->GetZ() ;
-  G4int HeavyA = m_Reaction->GetNucleus4()->GetA() ;
+  G4int HeavyZ = m_Reaction->GetNucleus4().GetZ() ;
+  G4int HeavyA = m_Reaction->GetNucleus4().GetA() ;
   
   // Generate the excitation energy if a distribution is given
   m_Reaction->ShootRandomExcitationEnergy();
-- 
GitLab