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