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