From 231fcbb83f049c059d493f228c88722839a46c82 Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Thu, 9 Feb 2017 18:15:03 +0100
Subject: [PATCH] Add static accessor for volumeManager and replace calling of
 DD4hepVolumeManager with it

---
 DDCore/include/DD4hep/VolumeManager.h | 3 +++
 DDCore/src/VolumeManager.cpp          | 7 +++++++
 DDG4/scripts/dumpDDG4.C               | 2 +-
 DDRec/src/IDDecoder.cpp               | 7 +------
 DDRec/src/SurfaceHelper.cpp           | 9 +--------
 5 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/DDCore/include/DD4hep/VolumeManager.h b/DDCore/include/DD4hep/VolumeManager.h
index 25be5c340..d2d39c8e7 100644
--- a/DDCore/include/DD4hep/VolumeManager.h
+++ b/DDCore/include/DD4hep/VolumeManager.h
@@ -123,6 +123,9 @@ namespace DD4hep {
       /// Initializing constructor for subdetector volume managers.
       VolumeManager(DetElement subdetector, Readout ro);
 
+      /// static accessor calling DD4hepVolumeManagerPlugin if necessary
+      static VolumeManager getVolumeManager(LCDD& lcdd);
+
       /// Assignment operator
       VolumeManager& operator=(const VolumeManager& m)  {
         if ( this != &m ) m_element = m.m_element;
diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp
index c2dcb5da3..36c70d1cf 100644
--- a/DDCore/src/VolumeManager.cpp
+++ b/DDCore/src/VolumeManager.cpp
@@ -470,6 +470,13 @@ VolumeManager::VolumeManager(DetElement sub_detector, Readout ro)  {
   assign(obj_ptr, sub_detector.name(), "VolumeManager");
 }
 
+VolumeManager VolumeManager::getVolumeManager(LCDD& lcdd) {
+  if( not lcdd.volumeManager().isValid() ) {
+    lcdd.apply("DD4hepVolumeManager", 0, 0);
+  }
+  return lcdd.volumeManager();
+}
+
 /// Add a new Volume manager section according to a new subdetector
 VolumeManager VolumeManager::addSubdetector(DetElement det, Readout ro) {
   if (isValid()) {
diff --git a/DDG4/scripts/dumpDDG4.C b/DDG4/scripts/dumpDDG4.C
index b76e3e103..f681542a6 100644
--- a/DDG4/scripts/dumpDDG4.C
+++ b/DDG4/scripts/dumpDDG4.C
@@ -216,7 +216,7 @@ int dumpddg4_load_geometry(const char* fname)   {
     gSystem->Load("libDDG4Plugins");
     LCDD& lcdd = LCDD::getInstance();
     lcdd.fromXML(fname);
-    lcdd.apply("DD4hepVolumeManager",0,(char**)0);
+    VolumeManager::getVolumeManager();
   }
   return 1;
 }
diff --git a/DDRec/src/IDDecoder.cpp b/DDRec/src/IDDecoder.cpp
index 07165a4b3..93c07fd5e 100644
--- a/DDRec/src/IDDecoder.cpp
+++ b/DDRec/src/IDDecoder.cpp
@@ -32,12 +32,7 @@ IDDecoder& IDDecoder::getInstance() {
 /// Default constructor
 IDDecoder::IDDecoder() {
 	LCDD& lcdd = LCDD::getInstance();
-	_volumeManager = lcdd.volumeManager();
-	if (not _volumeManager.isValid()) {
-		lcdd.apply("DD4hepVolumeManager",0,0);
-		_volumeManager = lcdd.volumeManager();
-	}
-	_tgeoMgr = lcdd.world().volume()->GetGeoManager();
+	_volumeManager = VolumeManager::getVolumeManager(lcdd);
 }
 
 /**
diff --git a/DDRec/src/SurfaceHelper.cpp b/DDRec/src/SurfaceHelper.cpp
index e172813d6..a838003de 100644
--- a/DDRec/src/SurfaceHelper.cpp
+++ b/DDRec/src/SurfaceHelper.cpp
@@ -27,15 +27,8 @@ namespace DD4hep {
       // have to populate the volume manager once in order to have 
       // the volumeIDs attached to the DetElements
       LCDD& lcdd = LCDD::getInstance();
-      VolumeManager volMgr = lcdd.volumeManager();
-      if(not volMgr.isValid()) {
-	// VolumeManager initialised by DD4hepVolumeManager plugin
-	lcdd.apply("DD4hepVolumeManager",0,0);
-	volMgr = lcdd.volumeManager();
-      }
-
+      VolumeManager volMgr = VolumeManager::getVolumeManager(lcdd);
 
- 
       //------------------ breadth first tree traversal ---------
       std::list< DetElement > dets ;
       std::list< DetElement > daugs ; 
-- 
GitLab