From 2eec49828defdef3da7c0cf5d8f06db93df07e53 Mon Sep 17 00:00:00 2001
From: Markus Frank <Markus.Frank@cern.ch>
Date: Tue, 4 Sep 2018 13:58:11 +0200
Subject: [PATCH] Improve XML parsing interface

---
 DDCore/include/Parsers/detail/Dimension.h   | 34 +++++++++++++++++++++
 DDCore/include/Parsers/detail/Dimension.imp |  9 ++++++
 DDCore/include/XML/UnicodeValues.h          | 27 +++++++++++++++-
 DDCore/src/plugins/ShapePlugins.cpp         |  4 +--
 DDG4/CMakeLists.txt                         |  2 +-
 examples/DDCMS/CMakeLists.txt               | 14 ++++++---
 6 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/DDCore/include/Parsers/detail/Dimension.h b/DDCore/include/Parsers/detail/Dimension.h
index e239362b8..3c4a25881 100644
--- a/DDCore/include/Parsers/detail/Dimension.h
+++ b/DDCore/include/Parsers/detail/Dimension.h
@@ -508,6 +508,36 @@ namespace dd4hep {
       double start() const;
       /// Access attribute values: start
       double start(double default_value) const;
+      /// Access attribute values: start_x
+      double start_x() const;
+      /// Access attribute values: start_x
+      double start_x(double default_value) const;
+      /// Access attribute values: start_y
+      double start_y() const;
+      /// Access attribute values: start_y
+      double start_y(double default_value) const;
+      /// Access attribute values: start_z
+      double start_z() const;
+      /// Access attribute values: start_z
+      double start_z(double default_value) const;
+
+      /// Access attribute values: step
+      double step() const;
+      /// Access attribute values: step
+      double step(double default_value) const;
+      /// Access attribute values: step_x
+      double step_x() const;
+      /// Access attribute values: step_x
+      double step_x(double default_value) const;
+      /// Access attribute values: step_y
+      double step_y() const;
+      /// Access attribute values: step_y
+      double step_y(double default_value) const;
+      /// Access attribute values: step_z
+      double step_z() const;
+      /// Access attribute values: step_z
+      double step_z(double default_value) const;
+
       /// Access attribute values: end
       double end() const;
       /// Access attribute values: end
@@ -522,6 +552,10 @@ namespace dd4hep {
       /// Access attribute values: show_daughters
       bool   show_daughters() const;
 
+      /// Access min/max parameters: correction
+      double correction() const;
+      /// Access min/max parameters: correction
+      double correction(double default_value) const;
       /// Access min/max parameters: cut
       double cut() const;
       /// Access min/max parameters: cut
diff --git a/DDCore/include/Parsers/detail/Dimension.imp b/DDCore/include/Parsers/detail/Dimension.imp
index 404c539a3..4d659636d 100644
--- a/DDCore/include/Parsers/detail/Dimension.imp
+++ b/DDCore/include/Parsers/detail/Dimension.imp
@@ -138,7 +138,15 @@ XML_ATTR_ACCESSOR(int, key_val)
 XML_ATTR_ACCESSOR(int, key_value)
 XML_ATTR_ACCESSOR(double, zstart)
 XML_ATTR_ACCESSOR_DOUBLE(start)
+XML_ATTR_ACCESSOR_DOUBLE(start_x)
+XML_ATTR_ACCESSOR_DOUBLE(start_y)
+XML_ATTR_ACCESSOR_DOUBLE(start_z)
 XML_ATTR_ACCESSOR_DOUBLE(end)
+XML_ATTR_ACCESSOR_DOUBLE(step)
+XML_ATTR_ACCESSOR_DOUBLE(step_x)
+XML_ATTR_ACCESSOR_DOUBLE(step_y)
+XML_ATTR_ACCESSOR_DOUBLE(step_z)
+
 XML_ATTR_ACCESSOR(double, thickness)
 XML_ATTR_ACCESSOR(double, inner_stereo)
 XML_ATTR_ACCESSOR(double, outer_stereo)
@@ -172,6 +180,7 @@ XML_ATTR_ACCESSOR(int, type)
 XML_ATTR_ACCESSOR(bool, visible)
 XML_ATTR_ACCESSOR(bool, show_daughters)
 
+XML_ATTR_ACCESSOR_DOUBLE(correction)
 XML_ATTR_ACCESSOR_DOUBLE(cut)
 XML_ATTR_ACCESSOR_DOUBLE(threshold)
 XML_ATTR_ACCESSOR_DOUBLE(lunit)
diff --git a/DDCore/include/XML/UnicodeValues.h b/DDCore/include/XML/UnicodeValues.h
index 4ab21a11e..ab34cc3f9 100644
--- a/DDCore/include/XML/UnicodeValues.h
+++ b/DDCore/include/XML/UnicodeValues.h
@@ -45,6 +45,7 @@ UNICODE (arg);
 UNICODE (argument);
 UNICODE (assembly);
 UNICODE (atom);
+UNICODE (attribute);
 UNICODE (attributes);
 UNICODE (aunit);
 UNICODE (author);
@@ -72,18 +73,21 @@ UNICODE (cm);
 UNICODE (coefficient);
 UNICODE (coefficients);
 UNICODE (color);
-UNICODE (collections);
 UNICODE (collection);
+UNICODE (collections);
 UNICODE (combine_hits);
 UNICODE (combineHits);
 UNICODE (comment);
 UNICODE (component);
+UNICODE (components);
 UNICODE (composite);
+UNICODE (composites);
 UNICODE (cone);
 UNICODE (config);
 UNICODE (connected);
 UNICODE (cons);
 UNICODE (constant);
+UNICODE (correction);
 UNICODE (create);
 UNICODE (crossing_angle);
 UNICODE (cut);
@@ -91,6 +95,7 @@ UNICODE (cut);
 UNICODE (d);
 UNICODE (D);
 UNICODE (daughter);
+UNICODE (daughters);
 UNICODE (debug);
 UNICODE (define);
 UNICODE (delta);
@@ -120,6 +125,7 @@ UNICODE (e);
 UNICODE (E);
 UNICODE (ecut);
 UNICODE (element);
+UNICODE (elements);
 UNICODE (eltube);
 UNICODE (end);
 UNICODE (end_module);
@@ -141,12 +147,15 @@ UNICODE (field);
 UNICODE (fields);
 UNICODE (field_name);
 UNICODE (file);
+UNICODE (files);
 UNICODE (first);
 UNICODE (firstposition);
 UNICODE (firstrotation);
 UNICODE (formula);
 UNICODE (fraction);
+UNICODE (fractions);
 UNICODE (frame);
+UNICODE (frames);
 UNICODE (funit);
 
 UNICODE (g);
@@ -181,6 +190,8 @@ UNICODE (height);
 UNICODE (hits_collections);
 UNICODE (hits_collection);
 UNICODE (hype);
+UNICODE (hybrid);
+UNICODE (hybrids);
 
 UNICODE (i);
 UNICODE (I);
@@ -206,7 +217,9 @@ UNICODE (intersection);
 UNICODE (InvisibleNoDaughters);
 UNICODE (InvisibleWithDaughters);
 UNICODE (isotope);
+UNICODE (isotopes);
 UNICODE (item);
+UNICODE (items);
 
 UNICODE (j);
 UNICODE (J);
@@ -369,6 +382,7 @@ UNICODE (rmin2);
 UNICODE (RL);
 UNICODE (rootFile);
 UNICODE (row);
+UNICODE (rows);
 UNICODE (rpc);
 UNICODE (RowID);
 UNICODE (rowHeight);
@@ -388,12 +402,15 @@ UNICODE (second);
 UNICODE (section);
 UNICODE (segmentation);
 UNICODE (sensitive);
+UNICODE (sensitives);
 UNICODE (sensitive_detector);
 UNICODE (sensitive_detectors);
 UNICODE (sensor);
+UNICODE (sensors);
 UNICODE (sequence);
 UNICODE (setup);
 UNICODE (shape);
+UNICODE (shapes);
 UNICODE (shield);
 UNICODE (show_daughters);
 UNICODE (showDaughters);
@@ -418,6 +435,11 @@ UNICODE (starttheta);
 UNICODE (state);
 UNICODE (stave);
 UNICODE (staves);
+UNICODE (step);
+UNICODE (steps);
+UNICODE (step_x);
+UNICODE (step_y);
+UNICODE (step_z);
 UNICODE (store_secondaries);
 UNICODE (strength);
 UNICODE (structure);
@@ -446,6 +468,7 @@ UNICODE (tube);
 UNICODE (tubes);
 UNICODE (tubs);
 UNICODE (type);
+UNICODE (types);
 UNICODE (tx);
 UNICODE (ty);
 UNICODE (tz);
@@ -477,12 +500,14 @@ UNICODE (v8x);
 UNICODE (v8y);
 UNICODE (Vacuum);
 UNICODE (value);
+UNICODE (values);
 UNICODE (verbose);
 UNICODE (version);
 UNICODE (vis);
 UNICODE (visible);
 UNICODE (visref);
 UNICODE (volume);
+UNICODE (volumes);
 UNICODE (volumeref);
 
 UNICODE (w);
diff --git a/DDCore/src/plugins/ShapePlugins.cpp b/DDCore/src/plugins/ShapePlugins.cpp
index 3beb24495..2ecbf2f04 100644
--- a/DDCore/src/plugins/ShapePlugins.cpp
+++ b/DDCore/src/plugins/ShapePlugins.cpp
@@ -247,12 +247,12 @@ static Handle<TObject> create_BooleanShape(Detector&, xml_h element)   {
   if( e.hasChild( _U(position) ) ) {
     usePos = true ;
     xml_comp_t x_pos = e.position();
-    pos = Position( x_pos.x(),x_pos.y(),x_pos.z() );  
+    pos = Position( x_pos.x(0.0),x_pos.y(0.0),x_pos.z(0.0) );  
   }
   if( e.hasChild( _U(rotation) ) ) {
     useRot = true ;
     xml_comp_t  x_rot = e.rotation();
-    rot = RotationZYX( x_rot.z(),x_rot.y(),x_rot.x() ) ;
+    rot = RotationZYX( x_rot.z(0.0),x_rot.y(0.0),x_rot.x(0.0) ) ;
   }
 
   if( op == "subtraction" ) {
diff --git a/DDG4/CMakeLists.txt b/DDG4/CMakeLists.txt
index ae0053099..9109767c1 100644
--- a/DDG4/CMakeLists.txt
+++ b/DDG4/CMakeLists.txt
@@ -15,7 +15,7 @@ dd4hep_package(    DDG4
   OPTIONAL         ${CLHEP} [XercesC QUIET]
   INCLUDE_DIRS     include
   INSTALL_INCLUDES include/DDG4 )
-MESSAGE(STATUS "CLHEP_LIBRARIES ${CLHEP_LIBRARIES} ${CLHEP_LIBRARY}")
+dd4hep_print ( "|++> CLHEP_LIBRARIES ${CLHEP_LIBRARIES} ${CLHEP_LIBRARY}" )
 #---Add Library---------------------------------------------------------------------
 dd4hep_add_package_library(DDG4 SOURCES src/*.cpp )
 #---------------------------  Legacy libraries (for Frank) -------------------------
diff --git a/examples/DDCMS/CMakeLists.txt b/examples/DDCMS/CMakeLists.txt
index a71cdae31..ae9678641 100644
--- a/examples/DDCMS/CMakeLists.txt
+++ b/examples/DDCMS/CMakeLists.txt
@@ -17,15 +17,21 @@ cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
 include ( ${DD4hep_DIR}/cmake/DD4hep.cmake )
 #------------------------------------------------------------------------------
 dd4hep_configure_output ()
-
+#
+#---Trick to allow building with Geant4 internal CLHEP
+if ( DD4HEP_USE_GEANT4 AND Geant4_builtin_clhep_FOUND)
+  set(CLHEP "")
+else()
+  set(CLHEP CLHEP)
+endif()
+#
 dd4hep_package(    DDCMS
   USES             [DD4hep REQUIRED COMPONENTS DDCore]
-                   [CLHEP REQUIRED]
-		   [ROOT REQUIRED COMPONENTS Geom GenVector]
+                   [ROOT REQUIRED COMPONENTS Geom GenVector]
+  OPTIONAL         ${CLHEP}
   INCLUDE_DIRS     include
   INSTALL_INCLUDES include/DDCMS)
 #
-#
 # We only create only library for DDCMS. The whole package is a single component
 # library. A priory there is no need to seperate the implementation from the
 # plugins....
-- 
GitLab