From 0c7f52557f6bd47539cf81fa8a85a9d3ea1f2195 Mon Sep 17 00:00:00 2001
From: adrien-matta <a.matta@surrey.ac.uk>
Date: Wed, 19 Nov 2014 16:58:16 +0000
Subject: [PATCH] * Fixing issue when reloading the geometry   - A specific bug
 was present in ThinSi.cc : deletion of the material     (forbidden)   - A
 general bug was present causing the TTree to crash: The branches     address
 need to be cleared and the branches deleted before     reloading the geometry

---
 NPSimulation/AnnularS1/AnnularS1.cc          |  1 -
 NPSimulation/SSSD/ThinSi.cc                  |  7 +-
 NPSimulation/Simulation.cc                   | 18 ++---
 NPSimulation/Tiara/Tiara.cc                  |  6 +-
 NPSimulation/include/DetectorConstruction.hh |  2 +-
 NPSimulation/include/MaterialManager.hh      |  3 +
 NPSimulation/macro/gui.mac                   |  7 +-
 NPSimulation/src/DetectorConstruction.cc     | 76 +++++++++++---------
 NPSimulation/src/MaterialManager.cc          | 10 +++
 NPSimulation/src/VDetector.cc                |  7 +-
 10 files changed, 72 insertions(+), 65 deletions(-)

diff --git a/NPSimulation/AnnularS1/AnnularS1.cc b/NPSimulation/AnnularS1/AnnularS1.cc
index 638858822..47ede5eee 100644
--- a/NPSimulation/AnnularS1/AnnularS1.cc
+++ b/NPSimulation/AnnularS1/AnnularS1.cc
@@ -65,7 +65,6 @@ AnnularS1::AnnularS1(){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 AnnularS1::~AnnularS1(){
-  delete m_Event;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
diff --git a/NPSimulation/SSSD/ThinSi.cc b/NPSimulation/SSSD/ThinSi.cc
index 33ae2498f..a068f0924 100644
--- a/NPSimulation/SSSD/ThinSi.cc
+++ b/NPSimulation/SSSD/ThinSi.cc
@@ -66,10 +66,6 @@ ThinSi::ThinSi(){
 }
 
 ThinSi::~ThinSi(){
-  delete m_MaterialSilicon;
-  delete m_MaterialAl;
-  delete m_MaterialVacuum;
-
 }
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void ThinSi::AddTelescope( G4ThreeVector TL,
@@ -220,8 +216,7 @@ void ThinSi::VolumeMaker(  G4int             DetNumber ,
   G4LogicalVolume* logicSi  =
     new G4LogicalVolume(solidSi, m_MaterialSilicon, "logicSi", 0, 0, 0);
 
-  G4VisAttributes* VisAtt2 = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3));
-  logicAlu->SetVisAttributes(VisAtt2);  
+  logicAlu->SetVisAttributes(G4VisAttributes::Invisible);  
 
   new G4PVPlacement(0, posSi, logicSi, Name + "_Si", logicThinSi, true, 0);
 
diff --git a/NPSimulation/Simulation.cc b/NPSimulation/Simulation.cc
index 3007e3a62..124e87d36 100644
--- a/NPSimulation/Simulation.cc
+++ b/NPSimulation/Simulation.cc
@@ -43,7 +43,12 @@ int main(int argc, char** argv){
   G4String DetectorFileName       = OptionManager->GetDetectorFile();
   // my Verbose output class
   G4VSteppingVerbose::SetInstance(new SteppingVerbose);
-  
+ 
+ ///////////////////////////////////////////////////////////////
+  ///////////////// Initializing the Root Output ////////////////
+  ///////////////////////////////////////////////////////////////
+  RootOutput::getInstance("Simulation/" + OptionManager->GetOutputFile());
+   
   // Construct the default run manager
   G4RunManager* runManager = new G4RunManager;
   
@@ -79,16 +84,7 @@ int main(int argc, char** argv){
   G4UIExecutive* ui = new G4UIExecutive(argc, argv);
 #endif 
 
-  ///////////////////////////////////////////////////////////////
-  ///////////////// Initializing the Root Output ////////////////
-  ///////////////////////////////////////////////////////////////
-  RootOutput::getInstance("Simulation/" + OptionManager->GetOutputFile());
-  
-  ///////////////////////////////////////////////////////////////
-  ////////////// Reading Detector Configuration /////////////////
-  ///////////////////////////////////////////////////////////////
-  detector->ReadConfigurationFile(DetectorFileName);
-  
+ 
   ///////////////////////////////////////////////////////////////
   ////////////////////// Reading Reaction ///////////////////////
   ///////////////////////////////////////////////////////////////
diff --git a/NPSimulation/Tiara/Tiara.cc b/NPSimulation/Tiara/Tiara.cc
index b42c5c97d..a409b1a96 100644
--- a/NPSimulation/Tiara/Tiara.cc
+++ b/NPSimulation/Tiara/Tiara.cc
@@ -329,8 +329,7 @@ void Tiara::InitializeScorers(){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Tiara::InitializeRootOutput(){
-  RootOutput *pAnalysis = RootOutput::getInstance(); 
-  TTree *pTree = pAnalysis->GetTree();   
+  TTree *pTree = RootOutput::getInstance()->GetTree();   
   pTree->Branch("TiaraBarrel", "TTiaraBarrelData", &m_EventBarrel) ;
   pTree->Branch("TiaraHyball", "TTiaraHyballData", &m_EventHyball) ;
 
@@ -338,11 +337,8 @@ void Tiara::InitializeRootOutput(){
   // a redifinition of the geometry in the simulation
   pTree->SetBranchAddress("TiaraBarrel", &m_EventBarrel) ;
   pTree->SetBranchAddress("TiaraHyball", &m_EventHyball) ;
-
-
 }
 
-
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Tiara::ConstructInnerBarrel(G4LogicalVolume* world){
   // Tiara Barrel
diff --git a/NPSimulation/include/DetectorConstruction.hh b/NPSimulation/include/DetectorConstruction.hh
index 480176218..f0fb9c103 100644
--- a/NPSimulation/include/DetectorConstruction.hh
+++ b/NPSimulation/include/DetectorConstruction.hh
@@ -56,7 +56,7 @@ public:
    void RedefineGeometry(string file="");
  
 public:
-   void ReadConfigurationFile(string);
+   G4VPhysicalVolume* ReadConfigurationFile();
    void AddDetector(VDetector*);
    void ReadAllSensitive(const G4Event*);
 
diff --git a/NPSimulation/include/MaterialManager.hh b/NPSimulation/include/MaterialManager.hh
index a145b8559..b0f801764 100644
--- a/NPSimulation/include/MaterialManager.hh
+++ b/NPSimulation/include/MaterialManager.hh
@@ -61,6 +61,9 @@ private:
   map<string,G4Material*> m_Material; 
  
 public:
+  // clear all exising material from the library
+  void ClearMaterialLibrary();
+
   // Look for a known material named Name.
   // If the Material is known but not instantiate it is created and return
   // If the Material is instantiate it return it
diff --git a/NPSimulation/macro/gui.mac b/NPSimulation/macro/gui.mac
index 443e26189..5e7afec71 100644
--- a/NPSimulation/macro/gui.mac
+++ b/NPSimulation/macro/gui.mac
@@ -20,16 +20,17 @@
 #/gui/addButton custom "Add Hits" "/vis/scene/add/hits"
 
 # NPS tool bar
-/gui/addIcon "nptool" user_icon "/gui/system {gui_nptool}" icons/NPToolLogo.png
+/gui/addIcon "Follow us on GitHub" user_icon "/gui/system {gui_nptool}" icons/NPToolLogo.png
 /gui/addIcon "Exit" user_icon "{gui_exit}" icons/power.png
+/gui/addIcon "the star gaze" user_icon "{gui_empty}" icons/empty.png 
 /gui/addIcon "Update geometry" user_icon "{gui_update}" icons/recycle.png
 /gui/addIcon "Update generator" user_icon "/gen/update" icons/bolt.png
 /gui/addIcon "Open generator" user_icon "/gen/open" icons/folder.png
-/gui/addIcon "There is nothing here" user_icon "{gui_empty}" icons/empty.png 
+/gui/addIcon "the moon beyond the clouds" user_icon "{gui_empty}" icons/empty.png 
 /gui/addIcon "Run beam on" user_icon "/run/beamOn" icons/rocket.png
 /gui/addIcon "One event" user_icon "{gui_beamon}" icons/play.png
 /gui/addIcon "Activate tracking verbose" user_icon "{gui_tracking}" icons/shoeprints.png
-/gui/addIcon "Only borring emptiness" user_icon "{gui_empty}" icons/empty.png 
+/gui/addIcon "fill the empty dark" user_icon "{gui_empty}" icons/empty.png 
 /gui/addIcon "View Browser" user_icon "{gui_browser}" icons/browser.png
 /gui/addIcon "Take a screen shot" user_icon "/vis/ogl/printEPS" icons/camera.png
 /gui/addIcon "Home" user_icon     "{gui_home}" icons/eye.png
diff --git a/NPSimulation/src/DetectorConstruction.cc b/NPSimulation/src/DetectorConstruction.cc
index 6bbaa5b35..6c86ace87 100644
--- a/NPSimulation/src/DetectorConstruction.cc
+++ b/NPSimulation/src/DetectorConstruction.cc
@@ -129,6 +129,7 @@
 #include<fstream>
 
 // NPL
+#include "RootOutput.h"
 #include "NPOptionManager.h"
 #include "MaterialManager.hh"
 #include "DetectorMessenger.hh"
@@ -145,27 +146,7 @@ DetectorConstruction::~DetectorConstruction(){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 G4VPhysicalVolume* DetectorConstruction::Construct(){
-  G4Material* Vacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum");
-
-  //------------------------------world volume
-  G4double world_x = 10.0 * m;
-  G4double world_y = 10.0 * m;
-  G4double world_z = 10.0 * m;
-
-  G4Box* world_box
-    = new G4Box("world_box", world_x, world_y, world_z);
-
-  world_log = new G4LogicalVolume(world_box, Vacuum, "world_log", 0, 0, 0);
-  world_phys = new G4PVPlacement(0, G4ThreeVector(), world_log, "world", 0, false, 0);
-
-  G4VisAttributes* VisAtt = new G4VisAttributes(G4VisAttributes::Invisible);
-  world_log->SetVisAttributes(VisAtt);
-
-  //------------------------------------------------------------------
-
-  //------------------------------------------------------------------
-
-  return world_phys;
+  return ReadConfigurationFile();
 }
 
 
@@ -188,7 +169,30 @@ void DetectorConstruction::AddDetector(VDetector* NewDetector){
 
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-void DetectorConstruction::ReadConfigurationFile(string Path){
+G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){
+  // Construct the World volume
+  G4Material* Vacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum");
+
+  //------------------------------world volume
+  G4double world_x = 10.0 * m;
+  G4double world_y = 10.0 * m;
+  G4double world_z = 10.0 * m;
+
+  G4Box* world_box
+    = new G4Box("world_box", world_x, world_y, world_z);
+
+  world_log = new G4LogicalVolume(world_box, Vacuum, "world_log", 0, 0, 0);
+  world_phys = new G4PVPlacement(0, G4ThreeVector(), world_log, "world", 0, false, 0);
+
+  G4VisAttributes* VisAtt = new G4VisAttributes(G4VisAttributes::Invisible);
+  world_log->SetVisAttributes(VisAtt);
+
+  //------------------------------------------------------------------
+
+  //------------------------------------------------------------------
+
+  string Path = NPOptionManager::getInstance()->GetDetectorFile();
+
   ////////General Reading needs////////
   string LineBuffer;
   string DataBuffer;
@@ -462,7 +466,6 @@ void DetectorConstruction::ReadConfigurationFile(string Path){
       ConfigFile.close()                                 ;
       myDetector->ReadConfiguration(Path)                   ;
       ConfigFile.open(Path.c_str())                      ;
-
       // Add array to the VDetector Vector
       AddDetector(myDetector)                            ;
 #endif
@@ -730,7 +733,7 @@ void DetectorConstruction::ReadConfigurationFile(string Path){
   // Create the Material sample for DEDX tables
   MaterialManager::getInstance()->CreateSampleVolumes(world_log);
 
-  return;
+  return world_phys;
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -743,7 +746,8 @@ void DetectorConstruction::ReadAllSensitive(const G4Event* event){
   if(m_Detectors.size()>0)
     m_Detectors[0]->GetInterCoordPointer()->Clear();
 
-  for (unsigned short i = 0 ; i < m_Detectors.size() ; i++) {
+  unsigned int mysize =  m_Detectors.size();
+  for (unsigned short i = 0 ; i < mysize ; i++) {
     m_Detectors[i]->ReadSensitive(event);
   }
 }
@@ -755,13 +759,8 @@ G4LogicalVolume* DetectorConstruction::GetWorldLogic(){
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void DetectorConstruction::ClearGeometry(){
-  G4GeometryManager::GetInstance()->OpenGeometry();
-  G4PhysicalVolumeStore::GetInstance()->Clean();
-  G4LogicalVolumeStore::GetInstance()->Clean();
-  G4SolidStore::GetInstance()->Clean();
-  G4RunManager::GetRunManager()->DefineWorldVolume(Construct());
-
   unsigned int mySize = m_Detectors.size();
+
   for (unsigned short i = 0 ; i < mySize ; i++) {
     delete m_Detectors[i];
   }
@@ -769,15 +768,26 @@ void DetectorConstruction::ClearGeometry(){
   m_Detectors.clear();
   m_Target = 0;
   m_Chamber = 0 ;
+  world_log=0;
+  world_phys=0;
+
+  G4GeometryManager::GetInstance()->OpenGeometry();
+  G4PhysicalVolumeStore::GetInstance()->Clean();
+  G4LogicalVolumeStore::GetInstance()->Clean();
+  G4SolidStore::GetInstance()->Clean();
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void DetectorConstruction::RedefineGeometry(string file){
   ClearGeometry() ;
 
+  RootOutput::getInstance()->GetTree()->ResetBranchAddresses(); 
+  RootOutput::getInstance()->GetTree()->GetListOfBranches()->Clear(); 
+
   if(file!="")
     NPOptionManager::getInstance()->SetDetectorFile(file);
 
-  ReadConfigurationFile(NPOptionManager::getInstance()->GetDetectorFile());
-
+  G4RunManager::GetRunManager()->DefineWorldVolume(Construct());
+  G4RunManager::GetRunManager()->GeometryHasBeenModified();
+  G4RunManager::GetRunManager()->Initialize();
 }
diff --git a/NPSimulation/src/MaterialManager.cc b/NPSimulation/src/MaterialManager.cc
index 7f6100fc0..f00b124fb 100644
--- a/NPSimulation/src/MaterialManager.cc
+++ b/NPSimulation/src/MaterialManager.cc
@@ -57,6 +57,16 @@ MaterialManager::MaterialManager(){
 void MaterialManager::Destroy(){
 
 }
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
+void MaterialManager::ClearMaterialLibrary(){
+  map<string,G4Material*>::iterator it;
+  for(it = m_Material.begin() ; it != m_Material.end() ; it++){
+    delete it->second;
+  }
+
+  m_Material.clear();
+}
+
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
 G4Material* MaterialManager::GetMaterialFromLibrary(string Name){
diff --git a/NPSimulation/src/VDetector.cc b/NPSimulation/src/VDetector.cc
index 7e613a2dd..a1320f9c3 100644
--- a/NPSimulation/src/VDetector.cc
+++ b/NPSimulation/src/VDetector.cc
@@ -26,7 +26,7 @@
 #include "RootOutput.h"
 #include "G4SDManager.hh"
 
-TInteractionCoordinates *VDetector::ms_InterCoord = 0;
+TInteractionCoordinates* VDetector::ms_InterCoord = 0;
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 // Constructor
@@ -44,11 +44,8 @@ VDetector::~VDetector(){
 void VDetector::InitializeRootOutput(){
    RootOutput *pAnalysis = RootOutput::getInstance();
    TTree *pTree = pAnalysis->GetTree();
-   // if the branch does not exist yet, create it
-   if (!pTree->GetBranch("InteractionCoordinates"))
       pTree->Branch("InteractionCoordinates", "TInteractionCoordinates", &ms_InterCoord);
-
-  pTree->SetBranchAddress("InteractionCoordinates", &ms_InterCoord);
+      pTree->SetBranchAddress("InteractionCoordinates", &ms_InterCoord);
 
 }
 
-- 
GitLab