From 03326f500e65596eabd024545dbdb1dcbd9f7276 Mon Sep 17 00:00:00 2001
From: Frank Gaede <frank.gaede@desy.de>
Date: Thu, 5 Sep 2013 15:18:43 +0000
Subject: [PATCH]   - cleaned up version of old example ILDExDet     - is now 
 build standalone     - needs proper setting of (DY)LD_LIBRARY_PATH

---
 examples/ILDExDet/CMakeLists.txt              |  70 ++
 examples/ILDExDet/compact/ILDEx.xml           | 271 ++++++
 examples/ILDExDet/compact/elements.xml        | 884 ++++++++++++++++++
 examples/ILDExDet/compact/materials.xml       | 149 +++
 examples/ILDExDet/include/TPCData.h           |  27 +
 examples/ILDExDet/include/VXDData.h           |  40 +
 .../src/AhcalBarrelCalorimeter_geo.cpp        | 252 +++++
 .../src/AhcalEndcapCalorimeter_geo.cpp        | 286 ++++++
 examples/ILDExDet/src/ILDExSIT_geo.cpp        |  78 ++
 examples/ILDExDet/src/ILDExTPC_geo.cpp        | 172 ++++
 examples/ILDExDet/src/ILDExVXD_geo.cpp        | 147 +++
 11 files changed, 2376 insertions(+)
 create mode 100644 examples/ILDExDet/CMakeLists.txt
 create mode 100644 examples/ILDExDet/compact/ILDEx.xml
 create mode 100644 examples/ILDExDet/compact/elements.xml
 create mode 100644 examples/ILDExDet/compact/materials.xml
 create mode 100644 examples/ILDExDet/include/TPCData.h
 create mode 100644 examples/ILDExDet/include/VXDData.h
 create mode 100644 examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp
 create mode 100644 examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp
 create mode 100644 examples/ILDExDet/src/ILDExSIT_geo.cpp
 create mode 100644 examples/ILDExDet/src/ILDExTPC_geo.cpp
 create mode 100644 examples/ILDExDet/src/ILDExVXD_geo.cpp

diff --git a/examples/ILDExDet/CMakeLists.txt b/examples/ILDExDet/CMakeLists.txt
new file mode 100644
index 000000000..38ae53f2a
--- /dev/null
+++ b/examples/ILDExDet/CMakeLists.txt
@@ -0,0 +1,70 @@
+cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)
+
+set( PackageName ILDExDet )
+project(${PackageName})
+
+# project version
+SET( ${PackageName}_VERSION_MAJOR 0 )
+SET( ${PackageName}_VERSION_MINOR 0 )
+SET( ${PackageName}_VERSION_PATCH 1 )
+
+SET( ${PackageName}_VERSION "${${PackageName}_VERSION_MAJOR}.${${PackageName}_VERSION_MINOR}" )
+SET( ${PackageName}_SOVERSION "${${PackageName}_VERSION_MAJOR}.${${PackageName}_VERSION_MINOR}" )
+
+set(CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH}  ${CMAKE_SOURCE_DIR}/cmake ) 
+set(LIBRARY_OUTPUT_PATH    ${PROJECT_BINARY_DIR}/lib)
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+
+#------------- set the default installation directory to be the source directory
+
+IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  SET( CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR} CACHE PATH  
+    "install prefix path  - overwrite with -D CMAKE_INSTALL_PREFIX = ..." 
+    FORCE )
+  MESSAGE(STATUS "CMAKE_INSTALL_PREFIX is ${CMAKE_INSTALL_PREFIX} - overwrite with -D CMAKE_INSTALL_PREFIX" )
+ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+
+
+#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+find_package( DD4hep ) 
+
+set(CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH}  ${DD4hep_ROOT}/cmake ) 
+include( DD4hep )
+
+find_package( ROOT REQUIRED )
+#find_package( ROOT REQUIRED COMPONENTS Geom Reflex)
+
+set( ROOT_COMPONENT_LIBRARIES Geom Reflex)
+
+include_directories( ${CMAKE_SOURCE_DIR}/include
+  ${DD4hep_INCLUDE_DIRS}
+  ${ROOT_INCLUDE_DIR}
+  )
+
+file(GLOB sources src/*.cpp )
+file(GLOB headers include/*.h)
+
+include(DD4hep_XML_setup)
+
+if(DD4HEP_USE_PYROOT)
+  ROOT_GENERATE_DICTIONARY(G__ILDEx ${headers} LINKDEF include/ROOT/LinkDef.h)
+  list(APPEND sources G__ILDEx.cxx)
+endif()
+
+add_library(${PackageName} SHARED ${sources})
+
+target_link_libraries(${PackageName} ${DD4hep_LIBRARIES}  ${ROOT_LIBRARIES} ${ROOT_COMPONENT_LIBRARIES} )
+
+#---Rootmap generation--------------------------------------------------------------
+dd4hep_generate_rootmap(${PackageName} )
+
+#--- install target-------------------------------------
+
+install(TARGETS ${PackageName}
+  RUNTIME DESTINATION bin
+  LIBRARY DESTINATION lib
+  )
+# to do: add corresponding uninstall...
+#-------------------------------------------------------
\ No newline at end of file
diff --git a/examples/ILDExDet/compact/ILDEx.xml b/examples/ILDExDet/compact/ILDEx.xml
new file mode 100644
index 000000000..b11ade565
--- /dev/null
+++ b/examples/ILDExDet/compact/ILDEx.xml
@@ -0,0 +1,271 @@
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+    <info name="ILD_toy_v01"
+        title="ILD Detector Toy model"
+        author="F. Gaede"
+        url="http://ilcsoft.desy.de"
+        status="development"
+        version="$Id: ILDEx.xml 676 2013-08-06 11:12:53Z gaede $">
+        <comment>The compact format for the ILD Detector - toy model </comment>        
+    </info>
+  
+    <includes>
+        <gdmlFile  ref="elements.xml"/>
+        <gdmlFile  ref="materials.xml"/>
+        <pyBuilder ref="../drivers"/>
+    </includes>
+  
+    <define>
+        <constant name="world_side"             value="10*m"/>
+        <constant name="world_x"                value="world_side/2"/>
+        <constant name="world_y"                value="world_side/2"/>
+        <constant name="world_z"                value="world_side/2"/>        
+        <constant name="CrossingAngle"          value="0.014"/>
+        
+        <constant name="VXD_inner_radius"       value="15*mm"/>
+        <constant name="VXD_outer_radius"       value="80*mm"/>
+	<constant name="VXD_zhalf"              value="130*mm"/>
+
+        <constant name="SIT_inner_radius"       value="150*mm"/>
+        <constant name="SIT_outer_radius"       value="330*mm"/>
+	<constant name="SIT_zhalf"              value="660*mm"/>
+
+	<constant name="TPC_zhalf"              value="2500*mm"/>
+        <constant name="TPC_outer_radius"       value="1800*mm"/>
+        <constant name="TPC_inner_radius"       value="350*mm"/>
+        <constant name="TPC_inner_thickness"    value="2*mm"/>
+        <constant name="TPC_outer_thickness"    value="3*mm"/>
+        <constant name="TPC_endcap_thickness"   value="3*mm"/>
+
+        <constant name="tracking_region_radius" value="TPC_outer_radius + 1.0*m"/>
+        <constant name="tracking_region_zmax"   value="TPC_zhalf + 1.0*m"/>
+        <constant name="SolenoidCoilOuterZ"     value="TPC_zhalf + 0.3*m"/>
+
+        <constant name="HcalBarrel_rmin" value="2058.0*mm"/>
+        <constant name="Hcal_outer_radius" value="3395.46*mm"/> 
+	<!-- rmax is 2410.0*mm-->
+        <constant name="TPC_Ecal_Hcal_barrel_halfZ" value="2350*mm"/>
+        <constant name="HcalBarrel_zmax" value="TPC_Ecal_Hcal_barrel_halfZ"/>
+        <constant name="HcalBarrel_staves" value="8"/>
+        <constant name="HcalBarrel_layers" value="(int) 48"/>
+        <constant name="Hcal_chamber_thickness" value="6.5*mm"/>
+        <constant name="Hcal_radiator_thickness" value="20.0*mm"/>
+        <!--constant name="HcalBarrel_layer_thickness" value="20.0*mm + 6.5*mm"/-->
+        <constant name="HcalBarrel_layer_thickness" value="Hcal_radiator_thickness+Hcal_chamber_thickness"/>
+        <constant name="Hcal_back_plate_thickness" value="19.0*mm"/>
+        <constant name="Hcal_lateral_structure_thickness" value="15.0*mm"/>
+        <constant name="Hcal_layer_air_gap" value="2.0*mm"/>
+        <!-- Hcal Barrel roration angle M_PI/8.0 -->
+        <!-- constant name="Hcal_Barrel_rotation" value="0.392699075"/-->
+        <constant name="Hcal_Barrel_rotation" value="0."/>
+
+        <constant name="Hcal_endcap_modules" value="16"/>
+        <constant name="Hcal_endcap_layers" value="(int) 48"/>
+        <constant name="Hcal_endcap_zmin" value="2650*mm"/>
+
+        <constant name="SolenoidalFieldRadius"  value="Hcal_outer_radius+10.0*mm"/>
+    </define>
+
+    <materials>
+        <material name="Graphite">
+        	<D value="1.7" unit="g/cm3"/>
+        	<composite n="1" ref="C"/>
+        </material>      
+    </materials>
+  
+    <limits>
+        <limitset name="cal_limits">
+            <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+        </limitset>
+        <limitset name="TPC_limits">
+            <limit name="step_length_max" particles="*" value="10.0" unit="mm" />
+        </limitset>
+        <limitset name="Tracker_limits">
+            <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+        </limitset>
+    </limits>
+
+    <display>
+      <vis name="TPCVis"        alpha="1.0" r="0"   g="1.0" b="0.7"  showDaughters="true"  visible="false"/>
+      <vis name="TPCSupportVis" alpha="1.0" r="0"   g="0.4" b="0.4"  showDaughters="false" visible="true"/>
+      <vis name="TPCGasVis"     alpha="1.0" r="0.7" g="0"   b="0"    showDaughters="false" visible="false"/>
+      <vis name="VXDLayerVis"   alpha="1.0" r="0.5" g=".5"  b=".5"   showDaughters="true"  visible="true"/>
+      <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0"  showDaughters="true"  visible="true"/>
+      <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.3" b="0.7"  showDaughters="true"  visible="true"/>
+      <vis name="SITLayerVis"   alpha="1.0" r="0.0" g="0.7" b="0.3"  showDaughters="true"  visible="true"/>
+      <vis name="SupportVis"                r="0.5" g="0.1" b="0.99" showDaughters="false" visible="true"/>
+      <vis name="LumiCalVis"                                         showDaughters="false" visible="true"/>
+
+      <vis name="HcalBarrelVis"          alpha="1" r="1"    g="1"    b="0.1" showDaughters="true" visible="true"/>
+      <vis name="HcalBarrelStavesVis"    alpha="1" r="1"    g="0"    b="0.3" showDaughters="true" visible="false"/>
+      <vis name="HcalBarrelLayerVis"     alpha="1" r="1"    g="0"    b="0.5" showDaughters="true" visible="false"/>
+      <vis name="HcalBarrelSensorVis"    alpha="1" r="1"    g="1"    b="0.7" showDaughters="true" visible="false"/>
+
+      <vis name="HcalEndcapVis"          alpha="1" r="1"    g="1"    b="0.1" showDaughters="true" visible="true"/>
+      <vis name="HcalEndcapStavesVis"    alpha="1" r="1"    g="0"    b="0.3" showDaughters="true" visible="false"/>
+      <vis name="HcalEndcapLayerVis"     alpha="1" r="1"    g="0"    b="0.5" showDaughters="true" visible="false"/>
+      <vis name="HcalEndcapSensorVis"    alpha="1" r="1"    g="1"    b="0.7" showDaughters="true" visible="false"/>
+      <vis name="HcalEndcapAirVis"       alpha="1" r="1"    g="0"    b="0"   showDaughters="true" visible="false"/>
+
+    </display>
+
+    <detectors>
+        <comment>Trackers</comment>
+
+        <detector name="VXD" type="ILDExVXD" vis="VXDVis" id="1" limits="Tracker_limits" readout="VXDCollection" insideTrackingVolume="true">
+           <tubs rmin="VXD_inner_radius" rmax="VXD_outer_radius" zhalf="VXD_zhalf"/>
+          <layer id="0"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="65*mm" radius="1.595000000e+01*mm"  width="1.100000000e+01*mm" offset="-1.874869853e+00*mm" thickness="0.05*mm" material="Silicon" number="10"/>
+          </layer>
+          <layer id="1"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="65*mm" radius="18*mm"  width="1.100000000e+01*mm" offset="-1.874869853e+00*mm" thickness="0.05*mm" material="Silicon" number="10"/>
+          </layer>
+          <layer id="2"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="125*mm" radius="3.695000000e+01*mm"  width="2.200000000e+01*mm" offset="-1.837940563e+00*mm" thickness="0.05*mm" material="Silicon" number="11"/>
+          </layer>
+          <layer id="3"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="125*mm" radius="39*mm"  width="2.200000000e+01*mm" offset="-1.837940563e+00*mm" thickness="0.05*mm" material="Silicon" number="11"/>
+          </layer>
+          <layer id="4"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="125*mm" radius="5.795000000e+01*mm"  width="2.200000000e+01*mm" offset="-2.636744400e+00*mm" thickness="0.05*mm" material="Silicon" number="17"/>
+          </layer>
+          <layer id="5"  vis="VXDLayerVis" phi0="-1.570796327e+00">
+            <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/>
+            <ladder  zhalf="125*mm" radius="60*mm"  width="2.200000000e+01*mm" offset="-2.636744400e+00*mm" thickness="0.05*mm" material="Silicon" number="17"/>
+          </layer>
+        </detector>
+ 
+        <detector name="SIT" type="ILDExSIT" vis="SITVis" id="2" limits="Tracker_limits" readout="SITCollection" insideTrackingVolume="true">
+           <tubs rmin="SIT_inner_radius" rmax="SIT_outer_radius" zhalf="SIT_zhalf"/>
+           <layer id="0"  vis="SITLayerVis">
+            <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/>
+            <ladder  thickness="0.1*mm"  zhalf="370*mm" radius="155*mm" material="Silicon" number="10" />
+          </layer>
+          <layer id="1"  vis="SITLayerVis">
+            <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/>
+            <ladder  thickness="0.1*mm"  zhalf="650*mm" radius="300*mm" material="Silicon" number="19" />
+          </layer>
+        </detector>
+        
+      
+        <detector name="TPC" type="ILDExTPC" vis="TPCVis" id="3" limits="TPC_limits" readout="TPCCollection" insideTrackingVolume="true">
+           <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/>
+
+           <!-- GEAR Data-->
+           <driftlength value="TPC_zhalf*0.9"/>
+           <!-- End of GEAR Data-->
+	   <material name="Air"/>
+
+           <detector name="TPC_InnerWall" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="2">
+             <material name="Carbon"/>
+             <tubs rmin="TPC_inner_radius" rmax="TPC_inner_radius+TPC_inner_thickness" zhalf="TPC_zhalf"/>
+             <position x="0" y="0" z="0"/>
+             <rotation x="0" y="0" z="0"/>
+           </detector>
+
+           <detector name="TPC_OuterWall" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="3">
+             <material name="Carbon" />
+             <tubs rmin="TPC_outer_radius - TPC_outer_thickness" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/>
+             <position x="0" y="0" z="0"/>
+             <rotation x="0" y="0" z="0"/>
+           </detector>
+
+           <detector name="TPC_EndPlate" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="0">
+             <material name="Carbon" />
+             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/>
+             <position x="0" y="0" z="TPC_zhalf-0.5*TPC_endcap_thickness"/>
+             <rotation x="0" y="0" z="0"/>
+           </detector>
+
+        
+           <detector name="TPC_GasVolume" type="TubeSegment" reflect="true" vis="TPCGasVis" id="4">
+             <material name="Argon"/>
+             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="TPC_zhalf-TPC_endcap_thickness"/>
+	     <layer number="220" ecut="0.0"/>
+             <position x="0" y="0" z="0"/>
+             <rotation x="0" y="0" z="0"/>
+          </detector>
+        </detector>
+
+        <comment>Calorimeters</comment>
+        <detector id="7" name="HcalBarrel" type="AhcalBarrelCalorimeter" readout="HcalBarrelHits" vis="HcalBarrelVis" calorimeterType="HAD_BARREL" gap="10.*mm">
+            <comment>Hadron Calorimeter Barrel</comment>
+
+            <material name="Steel235"/>
+
+            <dimensions numsides="(int) HcalBarrel_staves" rmin="HcalBarrel_rmin" z="HcalBarrel_zmax"/>
+            <layer repeat="(int) HcalBarrel_layers">
+                <slice material = "Polystyrene" thickness = "3.0*mm" sensitive = "yes" limits="cal_limits" vis="HcalBarrelSensorVis"/>
+                <slice material = "FR4" thickness = "0.7*mm" />
+                <slice material = "Cu"  thickness = "0.1*mm" />
+                <slice material = "Air" thickness = "2.7*mm"  vis="HcalBarrelAirVis" />
+            </layer>
+        </detector>
+        <detector id="8" name="HcalEndcap" type="AhcalEndcapCalorimeter" readout="HcalEndcapHits"  calorimeterType="HAD_ENDCAP" gap="15.*mm">
+            <comment>Hadron Calorimeter Endcap</comment>
+
+            <material name="Steel235"/>
+
+            <layer repeat="(int) Hcal_endcap_layers">
+                <slice material = "Polystyrene" thickness = "3.0*mm" sensitive = "yes" limits="cal_limits" vis="HcalEndcapSensorVis"/>
+                <slice material = "FR4" thickness = "0.7*mm" />
+                <slice material = "Cu"  thickness = "0.1*mm" />
+                <slice material = "Air" thickness = "2.7*mm" vis="HcalEndcapAirVis" />
+            </layer>
+
+            <dimensions numsides="(int) Hcal_endcap_modules" rmin="362.0*mm" z="Hcal_endcap_zmin">
+              <dimensions id="1"  y_offset= "543.5" dim_x="375.0" dim_y="1287.0" dim_z="1087.0"/>
+              <dimensions id="2"  y_offset= "905.5" dim_x="375.0" dim_y="1287.0" dim_z="1811.0"/>
+              <dimensions id="3"  y_offset="1086.5" dim_x="375.0" dim_y="1287.0" dim_z="2173.0"/>
+              <dimensions id="4"  y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="5"  y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="6"  y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/>
+              <dimensions id="7"  y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/>
+              <dimensions id="8"  y_offset="1630.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="9"  y_offset="1630.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="10" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/>
+              <dimensions id="11" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/>
+              <dimensions id="12" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="13" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/>
+              <dimensions id="14" y_offset="1086.5" dim_x="375.0" dim_y="1287.0" dim_z="2173.0"/>
+              <dimensions id="15" y_offset= "905.5" dim_x="375.0" dim_y="1287.0" dim_z="1811.0"/>
+              <dimensions id="16" y_offset= "543.5" dim_x="375.0" dim_y="1287.0" dim_z="1087.0"/>
+	    </dimensions>
+        </detector>
+    </detectors>
+
+    <readouts>
+        <readout name="VXDCollection">
+            <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+        </readout>
+        <readout name="SITCollection">
+	    <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+        </readout>
+        <readout name="TPCCollection">
+            <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+        </readout>
+
+        <readout name="HcalBarrelHits">
+            <segmentation type="RegularNgonCartesianGridXY" gridSizeY="30.0*mm" gridSizeZ="30.0*mm" />
+            <id>system:6,stave:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>
+        </readout>
+        <readout name="HcalEndcapHits">
+            <segmentation type="GlobalGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" />
+            <id>system:6,stave:1,module:1,endcapID:5,layer:8,slice:5,x:32:-16,y:-16</id>
+        </readout>
+
+    </readouts>
+ <fields>
+        <field type="solenoid" name="GlobalSolenoid" inner_field="3.5*tesla"
+               outer_field="-1.5*tesla" zmax="SolenoidCoilOuterZ"
+               inner_radius="SolenoidalFieldRadius"
+               outer_radius="world_side" />
+ </fields> 
+</lccdd>
diff --git a/examples/ILDExDet/compact/elements.xml b/examples/ILDExDet/compact/elements.xml
new file mode 100644
index 000000000..e714c3a5c
--- /dev/null
+++ b/examples/ILDExDet/compact/elements.xml
@@ -0,0 +1,884 @@
+<materials>
+ <element Z="89" formula="Ac" name="Ac" >
+  <atom type="A" unit="g/mol" value="227.028" />
+ </element>
+ <material formula="Ac" name="Actinium" state="solid" >
+  <RL type="X0" unit="cm" value="0.601558" />
+  <NIL type="lambda" unit="cm" value="21.2048" />
+  <D type="density" unit="g/cm3" value="10.07" />
+  <composite n="1" ref="Ac" />
+ </material>
+ <element Z="47" formula="Ag" name="Ag" >
+  <atom type="A" unit="g/mol" value="107.868" />
+ </element>
+ <material formula="Ag" name="Silver" state="solid" >
+  <RL type="X0" unit="cm" value="0.854292" />
+  <NIL type="lambda" unit="cm" value="15.8546" />
+  <D type="density" unit="g/cm3" value="10.5" />
+  <composite n="1" ref="Ag" />
+ </material>
+ <element Z="13" formula="Al" name="Al" >
+  <atom type="A" unit="g/mol" value="26.9815" />
+ </element>
+ <material formula="Al" name="Aluminum" state="solid" >
+  <RL type="X0" unit="cm" value="8.89632" />
+  <NIL type="lambda" unit="cm" value="38.8766" />
+  <D type="density" unit="g/cm3" value="2.699" />
+  <composite n="1" ref="Al" />
+ </material>
+ <element Z="95" formula="Am" name="Am" >
+  <atom type="A" unit="g/mol" value="243.061" />
+ </element>
+ <material formula="Am" name="Americium" state="solid" >
+  <RL type="X0" unit="cm" value="0.42431" />
+  <NIL type="lambda" unit="cm" value="15.9812" />
+  <D type="density" unit="g/cm3" value="13.67" />
+  <composite n="1" ref="Am" />
+ </material>
+ <element Z="18" formula="Ar" name="Ar" >
+  <atom type="A" unit="g/mol" value="39.9477" />
+ </element>
+ <material formula="Ar" name="Argon" state="gas" >
+  <RL type="X0" unit="cm" value="11762.1" />
+  <NIL type="lambda" unit="cm" value="71926" />
+  <D type="density" unit="g/cm3" value="0.00166201" />
+  <composite n="1" ref="Ar" />
+ </material>
+ <element Z="33" formula="As" name="As" >
+  <atom type="A" unit="g/mol" value="74.9216" />
+ </element>
+ <material formula="As" name="Arsenic" state="solid" >
+  <RL type="X0" unit="cm" value="2.0838" />
+  <NIL type="lambda" unit="cm" value="25.7324" />
+  <D type="density" unit="g/cm3" value="5.73" />
+  <composite n="1" ref="As" />
+ </material>
+ <element Z="85" formula="At" name="At" >
+  <atom type="A" unit="g/mol" value="209.987" />
+ </element>
+ <material formula="At" name="Astatine" state="solid" >
+  <RL type="X0" unit="cm" value="0.650799" />
+  <NIL type="lambda" unit="cm" value="22.3202" />
+  <D type="density" unit="g/cm3" value="9.32" />
+  <composite n="1" ref="At" />
+ </material>
+ <element Z="79" formula="Au" name="Au" >
+  <atom type="A" unit="g/mol" value="196.967" />
+ </element>
+ <material formula="Au" name="Gold" state="solid" >
+  <RL type="X0" unit="cm" value="0.334436" />
+  <NIL type="lambda" unit="cm" value="10.5393" />
+  <D type="density" unit="g/cm3" value="19.32" />
+  <composite n="1" ref="Au" />
+ </material>
+ <element Z="5" formula="B" name="B" >
+  <atom type="A" unit="g/mol" value="10.811" />
+ </element>
+ <material formula="B" name="Boron" state="solid" >
+  <RL type="X0" unit="cm" value="22.2307" />
+  <NIL type="lambda" unit="cm" value="32.2793" />
+  <D type="density" unit="g/cm3" value="2.37" />
+  <composite n="1" ref="B" />
+ </material>
+ <element Z="56" formula="Ba" name="Ba" >
+  <atom type="A" unit="g/mol" value="137.327" />
+ </element>
+ <material formula="Ba" name="Barium" state="solid" >
+  <RL type="X0" unit="cm" value="2.37332" />
+  <NIL type="lambda" unit="cm" value="51.6743" />
+  <D type="density" unit="g/cm3" value="3.5" />
+  <composite n="1" ref="Ba" />
+ </material>
+ <element Z="4" formula="Be" name="Be" >
+  <atom type="A" unit="g/mol" value="9.01218" />
+ </element>
+ <material formula="Be" name="Beryllium" state="solid" >
+  <RL type="X0" unit="cm" value="35.276" />
+  <NIL type="lambda" unit="cm" value="39.4488" />
+  <D type="density" unit="g/cm3" value="1.848" />
+  <composite n="1" ref="Be" />
+ </material>
+ <element Z="83" formula="Bi" name="Bi" >
+  <atom type="A" unit="g/mol" value="208.98" />
+ </element>
+ <material formula="Bi" name="Bismuth" state="solid" >
+  <RL type="X0" unit="cm" value="0.645388" />
+  <NIL type="lambda" unit="cm" value="21.3078" />
+  <D type="density" unit="g/cm3" value="9.747" />
+  <composite n="1" ref="Bi" />
+ </material>
+ <element Z="97" formula="Bk" name="Bk" >
+  <atom type="A" unit="g/mol" value="247.07" />
+ </element>
+ <material formula="Bk" name="Berkelium" state="solid" >
+  <RL type="X0" unit="cm" value="0.406479" />
+  <NIL type="lambda" unit="cm" value="15.6902" />
+  <D type="density" unit="g/cm3" value="14" />
+  <composite n="1" ref="Bk" />
+ </material>
+ <element Z="35" formula="Br" name="Br" >
+  <atom type="A" unit="g/mol" value="79.9035" />
+ </element>
+ <material formula="Br" name="Bromine" state="gas" >
+  <RL type="X0" unit="cm" value="1615.12" />
+  <NIL type="lambda" unit="cm" value="21299" />
+  <D type="density" unit="g/cm3" value="0.0070721" />
+  <composite n="1" ref="Br" />
+ </material>
+ <element Z="6" formula="C" name="C" >
+  <atom type="A" unit="g/mol" value="12.0107" />
+ </element>
+ <material formula="C" name="Carbon" state="solid" >
+  <RL type="X0" unit="cm" value="21.3485" />
+  <NIL type="lambda" unit="cm" value="40.1008" />
+  <D type="density" unit="g/cm3" value="2" />
+  <composite n="1" ref="C" />
+ </material>
+ <element Z="20" formula="Ca" name="Ca" >
+  <atom type="A" unit="g/mol" value="40.078" />
+ </element>
+ <material formula="Ca" name="Calcium" state="solid" >
+  <RL type="X0" unit="cm" value="10.4151" />
+  <NIL type="lambda" unit="cm" value="77.3754" />
+  <D type="density" unit="g/cm3" value="1.55" />
+  <composite n="1" ref="Ca" />
+ </material>
+ <element Z="48" formula="Cd" name="Cd" >
+  <atom type="A" unit="g/mol" value="112.411" />
+ </element>
+ <material formula="Cd" name="Cadmium" state="solid" >
+  <RL type="X0" unit="cm" value="1.03994" />
+  <NIL type="lambda" unit="cm" value="19.46" />
+  <D type="density" unit="g/cm3" value="8.65" />
+  <composite n="1" ref="Cd" />
+ </material>
+ <element Z="58" formula="Ce" name="Ce" >
+  <atom type="A" unit="g/mol" value="140.115" />
+ </element>
+ <material formula="Ce" name="Cerium" state="solid" >
+  <RL type="X0" unit="cm" value="1.19506" />
+  <NIL type="lambda" unit="cm" value="27.3227" />
+  <D type="density" unit="g/cm3" value="6.657" />
+  <composite n="1" ref="Ce" />
+ </material>
+ <element Z="98" formula="Cf" name="Cf" >
+  <atom type="A" unit="g/mol" value="251.08" />
+ </element>
+ <material formula="Cf" name="Californium" state="solid" >
+  <RL type="X0" unit="cm" value="0.568328" />
+  <NIL type="lambda" unit="cm" value="22.085" />
+  <D type="density" unit="g/cm3" value="10" />
+  <composite n="1" ref="Cf" />
+ </material>
+ <element Z="17" formula="Cl" name="Cl" >
+  <atom type="A" unit="g/mol" value="35.4526" />
+ </element>
+ <material formula="Cl" name="Chlorine" state="gas" >
+  <RL type="X0" unit="cm" value="6437.34" />
+  <NIL type="lambda" unit="cm" value="38723.9" />
+  <D type="density" unit="g/cm3" value="0.00299473" />
+  <composite n="1" ref="Cl" />
+ </material>
+ <element Z="96" formula="Cm" name="Cm" >
+  <atom type="A" unit="g/mol" value="247.07" />
+ </element>
+ <material formula="Cm" name="Curium" state="solid" >
+  <RL type="X0" unit="cm" value="0.428706" />
+  <NIL type="lambda" unit="cm" value="16.2593" />
+  <D type="density" unit="g/cm3" value="13.51" />
+  <composite n="1" ref="Cm" />
+ </material>
+ <element Z="27" formula="Co" name="Co" >
+  <atom type="A" unit="g/mol" value="58.9332" />
+ </element>
+ <material formula="Co" name="Cobalt" state="solid" >
+  <RL type="X0" unit="cm" value="1.53005" />
+  <NIL type="lambda" unit="cm" value="15.2922" />
+  <D type="density" unit="g/cm3" value="8.9" />
+  <composite n="1" ref="Co" />
+ </material>
+ <element Z="24" formula="Cr" name="Cr" >
+  <atom type="A" unit="g/mol" value="51.9961" />
+ </element>
+ <material formula="Cr" name="Chromium" state="solid" >
+  <RL type="X0" unit="cm" value="2.0814" />
+  <NIL type="lambda" unit="cm" value="18.1933" />
+  <D type="density" unit="g/cm3" value="7.18" />
+  <composite n="1" ref="Cr" />
+ </material>
+ <element Z="55" formula="Cs" name="Cs" >
+  <atom type="A" unit="g/mol" value="132.905" />
+ </element>
+ <material formula="Cs" name="Cesium" state="solid" >
+  <RL type="X0" unit="cm" value="4.4342" />
+  <NIL type="lambda" unit="cm" value="95.317" />
+  <D type="density" unit="g/cm3" value="1.873" />
+  <composite n="1" ref="Cs" />
+ </material>
+ <element Z="29" formula="Cu" name="Cu" >
+  <atom type="A" unit="g/mol" value="63.5456" />
+ </element>
+ <material formula="Cu" name="Copper" state="solid" >
+  <RL type="X0" unit="cm" value="1.43558" />
+  <NIL type="lambda" unit="cm" value="15.5141" />
+  <D type="density" unit="g/cm3" value="8.96" />
+  <composite n="1" ref="Cu" />
+ </material>
+ <element Z="66" formula="Dy" name="Dy" >
+  <atom type="A" unit="g/mol" value="162.497" />
+ </element>
+ <material formula="Dy" name="Dysprosium" state="solid" >
+  <RL type="X0" unit="cm" value="0.85614" />
+  <NIL type="lambda" unit="cm" value="22.2923" />
+  <D type="density" unit="g/cm3" value="8.55" />
+  <composite n="1" ref="Dy" />
+ </material>
+ <element Z="68" formula="Er" name="Er" >
+  <atom type="A" unit="g/mol" value="167.256" />
+ </element>
+ <material formula="Er" name="Erbium" state="solid" >
+  <RL type="X0" unit="cm" value="0.788094" />
+  <NIL type="lambda" unit="cm" value="21.2923" />
+  <D type="density" unit="g/cm3" value="9.066" />
+  <composite n="1" ref="Er" />
+ </material>
+ <element Z="63" formula="Eu" name="Eu" >
+  <atom type="A" unit="g/mol" value="151.964" />
+ </element>
+ <material formula="Eu" name="Europium" state="solid" >
+  <RL type="X0" unit="cm" value="1.41868" />
+  <NIL type="lambda" unit="cm" value="35.6178" />
+  <D type="density" unit="g/cm3" value="5.243" />
+  <composite n="1" ref="Eu" />
+ </material>
+ <element Z="9" formula="F" name="F" >
+  <atom type="A" unit="g/mol" value="18.9984" />
+ </element>
+ <material formula="F" name="Fluorine" state="gas" >
+  <RL type="X0" unit="cm" value="20838.2" />
+  <NIL type="lambda" unit="cm" value="59094.3" />
+  <D type="density" unit="g/cm3" value="0.00158029" />
+  <composite n="1" ref="F" />
+ </material>
+ <element Z="26" formula="Fe" name="Fe" >
+  <atom type="A" unit="g/mol" value="55.8451" />
+ </element>
+ <material formula="Fe" name="Iron" state="solid" >
+  <RL type="X0" unit="cm" value="1.75749" />
+  <NIL type="lambda" unit="cm" value="16.959" />
+  <D type="density" unit="g/cm3" value="7.874" />
+  <composite n="1" ref="Fe" />
+ </material>
+ <element Z="87" formula="Fr" name="Fr" >
+  <atom type="A" unit="g/mol" value="223.02" />
+ </element>
+ <material formula="Fr" name="Francium" state="solid" >
+  <RL type="X0" unit="cm" value="6.18826" />
+  <NIL type="lambda" unit="cm" value="212.263" />
+  <D type="density" unit="g/cm3" value="1" />
+  <composite n="1" ref="Fr" />
+ </material>
+ <element Z="31" formula="Ga" name="Ga" >
+  <atom type="A" unit="g/mol" value="69.7231" />
+ </element>
+ <material formula="Ga" name="Gallium" state="solid" >
+  <RL type="X0" unit="cm" value="2.1128" />
+  <NIL type="lambda" unit="cm" value="24.3351" />
+  <D type="density" unit="g/cm3" value="5.904" />
+  <composite n="1" ref="Ga" />
+ </material>
+ <element Z="64" formula="Gd" name="Gd" >
+  <atom type="A" unit="g/mol" value="157.252" />
+ </element>
+ <material formula="Gd" name="Gadolinium" state="solid" >
+  <RL type="X0" unit="cm" value="0.947208" />
+  <NIL type="lambda" unit="cm" value="23.9377" />
+  <D type="density" unit="g/cm3" value="7.9004" />
+  <composite n="1" ref="Gd" />
+ </material>
+ <element Z="32" formula="Ge" name="Ge" >
+  <atom type="A" unit="g/mol" value="72.6128" />
+ </element>
+ <material formula="Ge" name="Germanium" state="solid" >
+  <RL type="X0" unit="cm" value="2.3013" />
+  <NIL type="lambda" unit="cm" value="27.3344" />
+  <D type="density" unit="g/cm3" value="5.323" />
+  <composite n="1" ref="Ge" />
+ </material>
+ <element Z="1" formula="H" name="H" >
+  <atom type="A" unit="g/mol" value="1.00794" />
+ </element>
+ <material formula="H" name="Hydrogen" state="gas" >
+  <RL type="X0" unit="cm" value="752776" />
+  <NIL type="lambda" unit="cm" value="421239" />
+  <D type="density" unit="g/cm3" value="8.3748e-05" />
+  <composite n="1" ref="H" />
+ </material>
+ <element Z="2" formula="He" name="He" >
+  <atom type="A" unit="g/mol" value="4.00264" />
+ </element>
+ <material formula="He" name="Helium" state="gas" >
+  <RL type="X0" unit="cm" value="567113" />
+  <NIL type="lambda" unit="cm" value="334266" />
+  <D type="density" unit="g/cm3" value="0.000166322" />
+  <composite n="1" ref="He" />
+ </material>
+ <element Z="72" formula="Hf" name="Hf" >
+  <atom type="A" unit="g/mol" value="178.485" />
+ </element>
+ <material formula="Hf" name="Hafnium" state="solid" >
+  <RL type="X0" unit="cm" value="0.517717" />
+  <NIL type="lambda" unit="cm" value="14.7771" />
+  <D type="density" unit="g/cm3" value="13.31" />
+  <composite n="1" ref="Hf" />
+ </material>
+ <element Z="80" formula="Hg" name="Hg" >
+  <atom type="A" unit="g/mol" value="200.599" />
+ </element>
+ <material formula="Hg" name="Mercury" state="solid" >
+  <RL type="X0" unit="cm" value="0.475241" />
+  <NIL type="lambda" unit="cm" value="15.105" />
+  <D type="density" unit="g/cm3" value="13.546" />
+  <composite n="1" ref="Hg" />
+ </material>
+ <element Z="67" formula="Ho" name="Ho" >
+  <atom type="A" unit="g/mol" value="164.93" />
+ </element>
+ <material formula="Ho" name="Holmium" state="solid" >
+  <RL type="X0" unit="cm" value="0.822447" />
+  <NIL type="lambda" unit="cm" value="21.8177" />
+  <D type="density" unit="g/cm3" value="8.795" />
+  <composite n="1" ref="Ho" />
+ </material>
+ <element Z="53" formula="I" name="I" >
+  <atom type="A" unit="g/mol" value="126.904" />
+ </element>
+ <material formula="I" name="Iodine" state="solid" >
+  <RL type="X0" unit="cm" value="1.72016" />
+  <NIL type="lambda" unit="cm" value="35.6583" />
+  <D type="density" unit="g/cm3" value="4.93" />
+  <composite n="1" ref="I" />
+ </material>
+ <element Z="49" formula="In" name="In" >
+  <atom type="A" unit="g/mol" value="114.818" />
+ </element>
+ <material formula="In" name="Indium" state="solid" >
+  <RL type="X0" unit="cm" value="1.21055" />
+  <NIL type="lambda" unit="cm" value="23.2468" />
+  <D type="density" unit="g/cm3" value="7.31" />
+  <composite n="1" ref="In" />
+ </material>
+ <element Z="77" formula="Ir" name="Ir" >
+  <atom type="A" unit="g/mol" value="192.216" />
+ </element>
+ <material formula="Ir" name="Iridium" state="solid" >
+  <RL type="X0" unit="cm" value="0.294142" />
+  <NIL type="lambda" unit="cm" value="9.01616" />
+  <D type="density" unit="g/cm3" value="22.42" />
+  <composite n="1" ref="Ir" />
+ </material>
+ <element Z="19" formula="K" name="K" >
+  <atom type="A" unit="g/mol" value="39.0983" />
+ </element>
+ <material formula="K" name="Potassium" state="solid" >
+  <RL type="X0" unit="cm" value="20.0871" />
+  <NIL type="lambda" unit="cm" value="138.041" />
+  <D type="density" unit="g/cm3" value="0.862" />
+  <composite n="1" ref="K" />
+ </material>
+ <element Z="36" formula="Kr" name="Kr" >
+  <atom type="A" unit="g/mol" value="83.7993" />
+ </element>
+ <material formula="Kr" name="Krypton" state="gas" >
+  <RL type="X0" unit="cm" value="3269.44" />
+  <NIL type="lambda" unit="cm" value="43962.9" />
+  <D type="density" unit="g/cm3" value="0.00347832" />
+  <composite n="1" ref="Kr" />
+ </material>
+ <element Z="57" formula="La" name="La" >
+  <atom type="A" unit="g/mol" value="138.905" />
+ </element>
+ <material formula="La" name="Lanthanum" state="solid" >
+  <RL type="X0" unit="cm" value="1.32238" />
+  <NIL type="lambda" unit="cm" value="29.441" />
+  <D type="density" unit="g/cm3" value="6.154" />
+  <composite n="1" ref="La" />
+ </material>
+ <element Z="3" formula="Li" name="Li" >
+  <atom type="A" unit="g/mol" value="6.94003" />
+ </element>
+ <material formula="Li" name="Lithium" state="solid" >
+  <RL type="X0" unit="cm" value="154.997" />
+  <NIL type="lambda" unit="cm" value="124.305" />
+  <D type="density" unit="g/cm3" value="0.534" />
+  <composite n="1" ref="Li" />
+ </material>
+ <element Z="71" formula="Lu" name="Lu" >
+  <atom type="A" unit="g/mol" value="174.967" />
+ </element>
+ <material formula="Lu" name="Lutetium" state="solid" >
+  <RL type="X0" unit="cm" value="0.703651" />
+  <NIL type="lambda" unit="cm" value="19.8916" />
+  <D type="density" unit="g/cm3" value="9.84" />
+  <composite n="1" ref="Lu" />
+ </material>
+ <element Z="12" formula="Mg" name="Mg" >
+  <atom type="A" unit="g/mol" value="24.305" />
+ </element>
+ <material formula="Mg" name="Magnesium" state="solid" >
+  <RL type="X0" unit="cm" value="14.3859" />
+  <NIL type="lambda" unit="cm" value="58.7589" />
+  <D type="density" unit="g/cm3" value="1.74" />
+  <composite n="1" ref="Mg" />
+ </material>
+ <element Z="25" formula="Mn" name="Mn" >
+  <atom type="A" unit="g/mol" value="54.938" />
+ </element>
+ <material formula="Mn" name="Manganese" state="solid" >
+  <RL type="X0" unit="cm" value="1.96772" />
+  <NIL type="lambda" unit="cm" value="17.8701" />
+  <D type="density" unit="g/cm3" value="7.44" />
+  <composite n="1" ref="Mn" />
+ </material>
+ <element Z="42" formula="Mo" name="Mo" >
+  <atom type="A" unit="g/mol" value="95.9313" />
+ </element>
+ <material formula="Mo" name="Molybdenum" state="solid" >
+  <RL type="X0" unit="cm" value="0.959107" />
+  <NIL type="lambda" unit="cm" value="15.6698" />
+  <D type="density" unit="g/cm3" value="10.22" />
+  <composite n="1" ref="Mo" />
+ </material>
+ <element Z="7" formula="N" name="N" >
+  <atom type="A" unit="g/mol" value="14.0068" />
+ </element>
+ <material formula="N" name="Nitrogen" state="gas" >
+  <RL type="X0" unit="cm" value="32602.2" />
+  <NIL type="lambda" unit="cm" value="72430.3" />
+  <D type="density" unit="g/cm3" value="0.0011652" />
+  <composite n="1" ref="N" />
+ </material>
+ <element Z="11" formula="Na" name="Na" >
+  <atom type="A" unit="g/mol" value="22.9898" />
+ </element>
+ <material formula="Na" name="Sodium" state="solid" >
+  <RL type="X0" unit="cm" value="28.5646" />
+  <NIL type="lambda" unit="cm" value="102.463" />
+  <D type="density" unit="g/cm3" value="0.971" />
+  <composite n="1" ref="Na" />
+ </material>
+ <element Z="41" formula="Nb" name="Nb" >
+  <atom type="A" unit="g/mol" value="92.9064" />
+ </element>
+ <material formula="Nb" name="Niobium" state="solid" >
+  <RL type="X0" unit="cm" value="1.15783" />
+  <NIL type="lambda" unit="cm" value="18.4846" />
+  <D type="density" unit="g/cm3" value="8.57" />
+  <composite n="1" ref="Nb" />
+ </material>
+ <element Z="60" formula="Nd" name="Nd" >
+  <atom type="A" unit="g/mol" value="144.236" />
+ </element>
+ <material formula="Nd" name="Neodymium" state="solid" >
+  <RL type="X0" unit="cm" value="1.11667" />
+  <NIL type="lambda" unit="cm" value="26.6308" />
+  <D type="density" unit="g/cm3" value="6.9" />
+  <composite n="1" ref="Nd" />
+ </material>
+ <element Z="10" formula="Ne" name="Ne" >
+  <atom type="A" unit="g/mol" value="20.18" />
+ </element>
+ <material formula="Ne" name="Neon" state="gas" >
+  <RL type="X0" unit="cm" value="34504.8" />
+  <NIL type="lambda" unit="cm" value="114322" />
+  <D type="density" unit="g/cm3" value="0.000838505" />
+  <composite n="1" ref="Ne" />
+ </material>
+ <element Z="28" formula="Ni" name="Ni" >
+  <atom type="A" unit="g/mol" value="58.6933" />
+ </element>
+ <material formula="Ni" name="Nickel" state="solid" >
+  <RL type="X0" unit="cm" value="1.42422" />
+  <NIL type="lambda" unit="cm" value="15.2265" />
+  <D type="density" unit="g/cm3" value="8.902" />
+  <composite n="1" ref="Ni" />
+ </material>
+ <element Z="93" formula="Np" name="Np" >
+  <atom type="A" unit="g/mol" value="237.048" />
+ </element>
+ <material formula="Np" name="Neptunium" state="solid" >
+  <RL type="X0" unit="cm" value="0.289676" />
+  <NIL type="lambda" unit="cm" value="10.6983" />
+  <D type="density" unit="g/cm3" value="20.25" />
+  <composite n="1" ref="Np" />
+ </material>
+ <element Z="8" formula="O" name="O" >
+  <atom type="A" unit="g/mol" value="15.9994" />
+ </element>
+ <material formula="O" name="Oxygen" state="gas" >
+  <RL type="X0" unit="cm" value="25713.8" />
+  <NIL type="lambda" unit="cm" value="66233.9" />
+  <D type="density" unit="g/cm3" value="0.00133151" />
+  <composite n="1" ref="O" />
+ </material>
+ <element Z="76" formula="Os" name="Os" >
+  <atom type="A" unit="g/mol" value="190.225" />
+ </element>
+ <material formula="Os" name="Osmium" state="solid" >
+  <RL type="X0" unit="cm" value="0.295861" />
+  <NIL type="lambda" unit="cm" value="8.92553" />
+  <D type="density" unit="g/cm3" value="22.57" />
+  <composite n="1" ref="Os" />
+ </material>
+ <element Z="15" formula="P" name="P" >
+  <atom type="A" unit="g/mol" value="30.9738" />
+ </element>
+ <material formula="P" name="Phosphorus" state="solid" >
+  <RL type="X0" unit="cm" value="9.63879" />
+  <NIL type="lambda" unit="cm" value="49.9343" />
+  <D type="density" unit="g/cm3" value="2.2" />
+  <composite n="1" ref="P" />
+ </material>
+ <element Z="91" formula="Pa" name="Pa" >
+  <atom type="A" unit="g/mol" value="231.036" />
+ </element>
+ <material formula="Pa" name="Protactinium" state="solid" >
+  <RL type="X0" unit="cm" value="0.38607" />
+  <NIL type="lambda" unit="cm" value="13.9744" />
+  <D type="density" unit="g/cm3" value="15.37" />
+  <composite n="1" ref="Pa" />
+ </material>
+ <element Z="82" formula="Pb" name="Pb" >
+  <atom type="A" unit="g/mol" value="207.217" />
+ </element>
+ <material formula="Pb" name="Lead" state="solid" >
+  <RL type="X0" unit="cm" value="0.561253" />
+  <NIL type="lambda" unit="cm" value="18.2607" />
+  <D type="density" unit="g/cm3" value="11.35" />
+  <composite n="1" ref="Pb" />
+ </material>
+ <element Z="46" formula="Pd" name="Pd" >
+  <atom type="A" unit="g/mol" value="106.415" />
+ </element>
+ <material formula="Pd" name="Palladium" state="solid" >
+  <RL type="X0" unit="cm" value="0.765717" />
+  <NIL type="lambda" unit="cm" value="13.7482" />
+  <D type="density" unit="g/cm3" value="12.02" />
+  <composite n="1" ref="Pd" />
+ </material>
+ <element Z="61" formula="Pm" name="Pm" >
+  <atom type="A" unit="g/mol" value="144.913" />
+ </element>
+ <material formula="Pm" name="Promethium" state="solid" >
+  <RL type="X0" unit="cm" value="1.04085" />
+  <NIL type="lambda" unit="cm" value="25.4523" />
+  <D type="density" unit="g/cm3" value="7.22" />
+  <composite n="1" ref="Pm" />
+ </material>
+ <element Z="84" formula="Po" name="Po" >
+  <atom type="A" unit="g/mol" value="208.982" />
+ </element>
+ <material formula="Po" name="Polonium" state="solid" >
+  <RL type="X0" unit="cm" value="0.661092" />
+  <NIL type="lambda" unit="cm" value="22.2842" />
+  <D type="density" unit="g/cm3" value="9.32" />
+  <composite n="1" ref="Po" />
+ </material>
+ <element Z="59" formula="Pr" name="Pr" >
+  <atom type="A" unit="g/mol" value="140.908" />
+ </element>
+ <material formula="Pr" name="Praseodymium" state="solid" >
+  <RL type="X0" unit="cm" value="1.1562" />
+  <NIL type="lambda" unit="cm" value="27.1312" />
+  <D type="density" unit="g/cm3" value="6.71" />
+  <composite n="1" ref="Pr" />
+ </material>
+ <element Z="78" formula="Pt" name="Pt" >
+  <atom type="A" unit="g/mol" value="195.078" />
+ </element>
+ <material formula="Pt" name="Platinum" state="solid" >
+  <RL type="X0" unit="cm" value="0.305053" />
+  <NIL type="lambda" unit="cm" value="9.46584" />
+  <D type="density" unit="g/cm3" value="21.45" />
+  <composite n="1" ref="Pt" />
+ </material>
+ <element Z="94" formula="Pu" name="Pu" >
+  <atom type="A" unit="g/mol" value="244.064" />
+ </element>
+ <material formula="Pu" name="Plutonium" state="solid" >
+  <RL type="X0" unit="cm" value="0.298905" />
+  <NIL type="lambda" unit="cm" value="11.0265" />
+  <D type="density" unit="g/cm3" value="19.84" />
+  <composite n="1" ref="Pu" />
+ </material>
+ <element Z="88" formula="Ra" name="Ra" >
+  <atom type="A" unit="g/mol" value="226.025" />
+ </element>
+ <material formula="Ra" name="Radium" state="solid" >
+  <RL type="X0" unit="cm" value="1.22987" />
+  <NIL type="lambda" unit="cm" value="42.6431" />
+  <D type="density" unit="g/cm3" value="5" />
+  <composite n="1" ref="Ra" />
+ </material>
+ <element Z="37" formula="Rb" name="Rb" >
+  <atom type="A" unit="g/mol" value="85.4677" />
+ </element>
+ <material formula="Rb" name="Rubidium" state="solid" >
+  <RL type="X0" unit="cm" value="7.19774" />
+  <NIL type="lambda" unit="cm" value="100.218" />
+  <D type="density" unit="g/cm3" value="1.532" />
+  <composite n="1" ref="Rb" />
+ </material>
+ <element Z="75" formula="Re" name="Re" >
+  <atom type="A" unit="g/mol" value="186.207" />
+ </element>
+ <material formula="Re" name="Rhenium" state="solid" >
+  <RL type="X0" unit="cm" value="0.318283" />
+  <NIL type="lambda" unit="cm" value="9.5153" />
+  <D type="density" unit="g/cm3" value="21.02" />
+  <composite n="1" ref="Re" />
+ </material>
+ <element Z="45" formula="Rh" name="Rh" >
+  <atom type="A" unit="g/mol" value="102.906" />
+ </element>
+ <material formula="Rh" name="Rhodium" state="solid" >
+  <RL type="X0" unit="cm" value="0.746619" />
+  <NIL type="lambda" unit="cm" value="13.2083" />
+  <D type="density" unit="g/cm3" value="12.41" />
+  <composite n="1" ref="Rh" />
+ </material>
+ <element Z="86" formula="Rn" name="Rn" >
+  <atom type="A" unit="g/mol" value="222.018" />
+ </element>
+ <material formula="Rn" name="Radon" state="gas" >
+  <RL type="X0" unit="cm" value="697.777" />
+  <NIL type="lambda" unit="cm" value="23532" />
+  <D type="density" unit="g/cm3" value="0.00900662" />
+  <composite n="1" ref="Rn" />
+ </material>
+ <element Z="44" formula="Ru" name="Ru" >
+  <atom type="A" unit="g/mol" value="101.065" />
+ </element>
+ <material formula="Ru" name="Ruthenium" state="solid" >
+  <RL type="X0" unit="cm" value="0.764067" />
+  <NIL type="lambda" unit="cm" value="13.1426" />
+  <D type="density" unit="g/cm3" value="12.41" />
+  <composite n="1" ref="Ru" />
+ </material>
+ <element Z="16" formula="S" name="S" >
+  <atom type="A" unit="g/mol" value="32.0661" />
+ </element>
+ <material formula="S" name="Sulfur" state="solid" >
+  <RL type="X0" unit="cm" value="9.74829" />
+  <NIL type="lambda" unit="cm" value="55.6738" />
+  <D type="density" unit="g/cm3" value="2" />
+  <composite n="1" ref="S" />
+ </material>
+ <element Z="51" formula="Sb" name="Sb" >
+  <atom type="A" unit="g/mol" value="121.76" />
+ </element>
+ <material formula="Sb" name="Antimony" state="solid" >
+  <RL type="X0" unit="cm" value="1.30401" />
+  <NIL type="lambda" unit="cm" value="25.8925" />
+  <D type="density" unit="g/cm3" value="6.691" />
+  <composite n="1" ref="Sb" />
+ </material>
+ <element Z="21" formula="Sc" name="Sc" >
+  <atom type="A" unit="g/mol" value="44.9559" />
+ </element>
+ <material formula="Sc" name="Scandium" state="solid" >
+  <RL type="X0" unit="cm" value="5.53545" />
+  <NIL type="lambda" unit="cm" value="41.609" />
+  <D type="density" unit="g/cm3" value="2.989" />
+  <composite n="1" ref="Sc" />
+ </material>
+ <element Z="34" formula="Se" name="Se" >
+  <atom type="A" unit="g/mol" value="78.9594" />
+ </element>
+ <material formula="Se" name="Selenium" state="solid" >
+  <RL type="X0" unit="cm" value="2.64625" />
+  <NIL type="lambda" unit="cm" value="33.356" />
+  <D type="density" unit="g/cm3" value="4.5" />
+  <composite n="1" ref="Se" />
+ </material>
+ <element Z="14" formula="Si" name="Si" >
+  <atom type="A" unit="g/mol" value="28.0854" />
+ </element>
+ <material formula="Si" name="Silicon" state="solid" >
+  <RL type="X0" unit="cm" value="9.36607" />
+  <NIL type="lambda" unit="cm" value="45.7531" />
+  <D type="density" unit="g/cm3" value="2.33" />
+  <composite n="1" ref="Si" />
+ </material>
+ <element Z="62" formula="Sm" name="Sm" >
+  <atom type="A" unit="g/mol" value="150.366" />
+ </element>
+ <material formula="Sm" name="Samarium" state="solid" >
+  <RL type="X0" unit="cm" value="1.01524" />
+  <NIL type="lambda" unit="cm" value="24.9892" />
+  <D type="density" unit="g/cm3" value="7.46" />
+  <composite n="1" ref="Sm" />
+ </material>
+ <element Z="50" formula="Sn" name="Sn" >
+  <atom type="A" unit="g/mol" value="118.71" />
+ </element>
+ <material formula="Sn" name="Tin" state="solid" >
+  <RL type="X0" unit="cm" value="1.20637" />
+  <NIL type="lambda" unit="cm" value="23.4931" />
+  <D type="density" unit="g/cm3" value="7.31" />
+  <composite n="1" ref="Sn" />
+ </material>
+ <element Z="38" formula="Sr" name="Sr" >
+  <atom type="A" unit="g/mol" value="87.6166" />
+ </element>
+ <material formula="Sr" name="Strontium" state="solid" >
+  <RL type="X0" unit="cm" value="4.237" />
+  <NIL type="lambda" unit="cm" value="61.0238" />
+  <D type="density" unit="g/cm3" value="2.54" />
+  <composite n="1" ref="Sr" />
+ </material>
+ <element Z="73" formula="Ta" name="Ta" >
+  <atom type="A" unit="g/mol" value="180.948" />
+ </element>
+ <material formula="Ta" name="Tantalum" state="solid" >
+  <RL type="X0" unit="cm" value="0.409392" />
+  <NIL type="lambda" unit="cm" value="11.8846" />
+  <D type="density" unit="g/cm3" value="16.654" />
+  <composite n="1" ref="Ta" />
+ </material>
+ <element Z="65" formula="Tb" name="Tb" >
+  <atom type="A" unit="g/mol" value="158.925" />
+ </element>
+ <material formula="Tb" name="Terbium" state="solid" >
+  <RL type="X0" unit="cm" value="0.893977" />
+  <NIL type="lambda" unit="cm" value="23.0311" />
+  <D type="density" unit="g/cm3" value="8.229" />
+  <composite n="1" ref="Tb" />
+ </material>
+ <element Z="43" formula="Tc" name="Tc" >
+  <atom type="A" unit="g/mol" value="97.9072" />
+ </element>
+ <material formula="Tc" name="Technetium" state="solid" >
+  <RL type="X0" unit="cm" value="0.833149" />
+  <NIL type="lambda" unit="cm" value="14.0185" />
+  <D type="density" unit="g/cm3" value="11.5" />
+  <composite n="1" ref="Tc" />
+ </material>
+ <element Z="52" formula="Te" name="Te" >
+  <atom type="A" unit="g/mol" value="127.603" />
+ </element>
+ <material formula="Te" name="Tellurium" state="solid" >
+  <RL type="X0" unit="cm" value="1.41457" />
+  <NIL type="lambda" unit="cm" value="28.1797" />
+  <D type="density" unit="g/cm3" value="6.24" />
+  <composite n="1" ref="Te" />
+ </material>
+ <element Z="90" formula="Th" name="Th" >
+  <atom type="A" unit="g/mol" value="232.038" />
+ </element>
+ <material formula="Th" name="Thorium" state="solid" >
+  <RL type="X0" unit="cm" value="0.51823" />
+  <NIL type="lambda" unit="cm" value="18.353" />
+  <D type="density" unit="g/cm3" value="11.72" />
+  <composite n="1" ref="Th" />
+ </material>
+ <element Z="22" formula="Ti" name="Ti" >
+  <atom type="A" unit="g/mol" value="47.8667" />
+ </element>
+ <material formula="Ti" name="Titanium" state="solid" >
+  <RL type="X0" unit="cm" value="3.5602" />
+  <NIL type="lambda" unit="cm" value="27.9395" />
+  <D type="density" unit="g/cm3" value="4.54" />
+  <composite n="1" ref="Ti" />
+ </material>
+ <element Z="81" formula="Tl" name="Tl" >
+  <atom type="A" unit="g/mol" value="204.383" />
+ </element>
+ <material formula="Tl" name="Thallium" state="solid" >
+  <RL type="X0" unit="cm" value="0.547665" />
+  <NIL type="lambda" unit="cm" value="17.6129" />
+  <D type="density" unit="g/cm3" value="11.72" />
+  <composite n="1" ref="Tl" />
+ </material>
+ <element Z="69" formula="Tm" name="Tm" >
+  <atom type="A" unit="g/mol" value="168.934" />
+ </element>
+ <material formula="Tm" name="Thulium" state="solid" >
+  <RL type="X0" unit="cm" value="0.754428" />
+  <NIL type="lambda" unit="cm" value="20.7522" />
+  <D type="density" unit="g/cm3" value="9.321" />
+  <composite n="1" ref="Tm" />
+ </material>
+ <element Z="92" formula="U" name="U" >
+  <atom type="A" unit="g/mol" value="238.029" />
+ </element>
+ <material formula="U" name="Uranium" state="solid" >
+  <RL type="X0" unit="cm" value="0.31663" />
+  <NIL type="lambda" unit="cm" value="11.4473" />
+  <D type="density" unit="g/cm3" value="18.95" />
+  <composite n="1" ref="U" />
+ </material>
+ <element Z="23" formula="V" name="V" >
+  <atom type="A" unit="g/mol" value="50.9415" />
+ </element>
+ <material formula="V" name="Vanadium" state="solid" >
+  <RL type="X0" unit="cm" value="2.59285" />
+  <NIL type="lambda" unit="cm" value="21.2187" />
+  <D type="density" unit="g/cm3" value="6.11" />
+  <composite n="1" ref="V" />
+ </material>
+ <element Z="74" formula="W" name="W" >
+  <atom type="A" unit="g/mol" value="183.842" />
+ </element>
+ <material formula="W" name="Tungsten" state="solid" >
+  <RL type="X0" unit="cm" value="0.350418" />
+  <NIL type="lambda" unit="cm" value="10.3057" />
+  <D type="density" unit="g/cm3" value="19.3" />
+  <composite n="1" ref="W" />
+ </material>
+ <element Z="54" formula="Xe" name="Xe" >
+  <atom type="A" unit="g/mol" value="131.292" />
+ </element>
+ <material formula="Xe" name="Xenon" state="gas" >
+  <RL type="X0" unit="cm" value="1546.2" />
+  <NIL type="lambda" unit="cm" value="32477.9" />
+  <D type="density" unit="g/cm3" value="0.00548536" />
+  <composite n="1" ref="Xe" />
+ </material>
+ <element Z="39" formula="Y" name="Y" >
+  <atom type="A" unit="g/mol" value="88.9058" />
+ </element>
+ <material formula="Y" name="Yttrium" state="solid" >
+  <RL type="X0" unit="cm" value="2.32943" />
+  <NIL type="lambda" unit="cm" value="34.9297" />
+  <D type="density" unit="g/cm3" value="4.469" />
+  <composite n="1" ref="Y" />
+ </material>
+ <element Z="70" formula="Yb" name="Yb" >
+  <atom type="A" unit="g/mol" value="173.038" />
+ </element>
+ <material formula="Yb" name="Ytterbium" state="solid" >
+  <RL type="X0" unit="cm" value="1.04332" />
+  <NIL type="lambda" unit="cm" value="28.9843" />
+  <D type="density" unit="g/cm3" value="6.73" />
+  <composite n="1" ref="Yb" />
+ </material>
+ <element Z="30" formula="Zn" name="Zn" >
+  <atom type="A" unit="g/mol" value="65.3955" />
+ </element>
+ <material formula="Zn" name="Zinc" state="solid" >
+  <RL type="X0" unit="cm" value="1.74286" />
+  <NIL type="lambda" unit="cm" value="19.8488" />
+  <D type="density" unit="g/cm3" value="7.133" />
+  <composite n="1" ref="Zn" />
+ </material>
+ <element Z="40" formula="Zr" name="Zr" >
+  <atom type="A" unit="g/mol" value="91.2236" />
+ </element>
+ <material formula="Zr" name="Zirconium" state="solid" >
+  <RL type="X0" unit="cm" value="1.56707" />
+  <NIL type="lambda" unit="cm" value="24.2568" />
+  <D type="density" unit="g/cm3" value="6.506" />
+  <composite n="1" ref="Zr" />
+ </material>
+</materials>
\ No newline at end of file
diff --git a/examples/ILDExDet/compact/materials.xml b/examples/ILDExDet/compact/materials.xml
new file mode 100644
index 000000000..907706d5a
--- /dev/null
+++ b/examples/ILDExDet/compact/materials.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<materials>
+
+  <!--
+       Air by weight from
+
+       http://www.engineeringtoolbox.com/air-composition-24_212.html
+  -->
+  <material name="FR4">
+    <D type="density" unit="g/cm3" value="1.7"/>
+    <fraction n="0.1808" ref="Si"/>
+    <fraction n="0.4056" ref="O"/>
+    <fraction n="0.2780" ref="C"/>
+    <fraction n="0.0684" ref="H"/>
+    <fraction n="0.0671" ref="Br"/>
+  </material>
+
+  <material name="Air">
+    <D type="density" unit="g/cm3" value="0.0012"/>
+    <fraction n="0.754" ref="N"/>
+    <fraction n="0.234" ref="O"/>
+    <fraction n="0.012" ref="Ar"/>
+  </material>
+  
+  <material name="Vacuum">
+    <D type="density" unit="g/cm3" value="0.00000001" />
+    <fraction n="1" ref="H" />
+  </material>
+
+  <material name="Epoxy">
+    <D type="density" value="1.3" unit="g/cm3"/>
+    <composite n="44" ref="H"/>
+    <composite n="15" ref="C"/>
+    <composite n="7" ref="O"/>
+  </material>
+
+  <material name="Quartz">
+    <D type="density" value="2.2" unit="g/cm3"/>
+    <composite n="1" ref="Si"/>
+    <composite n="2" ref="O"/>
+  </material>
+
+  <material name="G10">
+    <D type="density" value="1.7" unit="g/cm3"/>
+    <fraction n="0.08" ref="Cl"/>
+    <fraction n="0.773" ref="Quartz"/>
+    <fraction n="0.147" ref="Epoxy"/>
+  </material>
+
+  <material name="Polystyrene">
+    <D value="1.032" unit="g/cm3"/>
+    <composite n="19" ref="C"/>
+    <composite n="21" ref="H"/>
+  </material>
+
+  <material name="Steel235">
+    <D value="7.85" unit="g/cm3"/>
+    <fraction n="0.998" ref="Fe"/>
+    <fraction n=".002" ref="C"/>
+  </material>
+
+  <material name="SiliconOxide">
+    <D type="density" value="2.65" unit="g/cm3"/>
+    <composite n="1" ref="Si"/>
+    <composite n="2" ref="O"/>
+  </material>
+
+  <material name="BoronOxide">
+    <D type="density" value="2.46" unit="g/cm3"/>
+    <composite n="2" ref="B"/>
+    <composite n="3" ref="O"/>
+  </material>
+
+  <material name="SodiumOxide">
+    <D type="density" value="2.65" unit="g/cm3"/>
+    <composite n="2" ref="Na"/>
+    <composite n="1" ref="O"/>
+  </material>
+
+  <material name="AluminumOxide">
+    <D type="density" value="3.89" unit="g/cm3"/>
+    <composite n="2" ref="Al"/>
+    <composite n="3" ref="O"/>
+  </material>
+
+  <material name="PyrexGlass">
+    <D type="density" value="2.23" unit="g/cm3"/>
+    <fraction n="0.806" ref="SiliconOxide"/>
+    <fraction n="0.130" ref="BoronOxide"/>
+    <fraction n="0.040" ref="SodiumOxide"/>
+    <fraction n="0.023" ref="AluminumOxide"/>
+  </material>
+
+  <material name="CarbonFiber">
+    <D type="density" value="1.5" unit="g/cm3"/>
+    <fraction n="0.65" ref="C"/>
+    <fraction n="0.35" ref="Epoxy"/>
+  </material>
+  
+  <material name="CarbonFiber_50D">
+    <D type="density" value="0.75" unit="g/cm3"/>
+    <fraction n="0.65" ref="C"/>
+    <fraction n="0.35" ref="Epoxy"/>
+  </material>  
+
+  <material name="Rohacell31">
+    <D type="density" value="0.032" unit="g/cm3"/>
+    <composite n="9" ref="C"/>
+    <composite n="13" ref="H"/>
+    <composite n="2" ref="O"/>
+    <composite n="1" ref="N"/>
+  </material>
+  
+  <material name="Rohacell31_50D">
+    <D type="density" value="0.016" unit="g/cm3"/>
+    <composite n="9" ref="C"/>
+    <composite n="13" ref="H"/>
+    <composite n="2" ref="O"/>
+    <composite n="1" ref="N"/>
+  </material>  
+
+  <material name="RPCGasDefault" state="gas">
+    <D type="density" value="0.0037" unit="g/cm3"/>
+    <composite n="209" ref="C"/>
+    <composite n="239" ref="H"/>
+    <composite n="381" ref="F"/>
+  </material>
+
+  <material name="PolystyreneFoam">
+    <D type="density" value="0.0056" unit="g/cm3"/>
+    <fraction n="1.0" ref="Polystyrene"/>
+  </material>
+
+  <material name="Kapton">
+    <D value="1.43" unit="g/cm3" />
+    <composite n="22" ref="C"/>
+    <composite n="10" ref="H" />
+    <composite n="2" ref="N" />
+    <composite n="5" ref="O" />
+  </material>
+
+  <material name="PEEK">
+    <D value="1.37" unit="g/cm3" />
+    <composite n="19" ref="C"/>
+    <composite n="12" ref="H" />
+    <composite n="3" ref="O" />
+  </material>
+
+</materials>
diff --git a/examples/ILDExDet/include/TPCData.h b/examples/ILDExDet/include/TPCData.h
new file mode 100644
index 000000000..8cdad52a8
--- /dev/null
+++ b/examples/ILDExDet/include/TPCData.h
@@ -0,0 +1,27 @@
+// $Id: TPCData.h 513 2013-04-05 14:31:53Z gaede $
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+
+#include "DD4hep/Detector.h"
+#include <vector>
+
+namespace DD4hep {
+  
+  
+  struct TPCData : public Geometry::DetElement::Object {
+    typedef Geometry::Ref_t Ref_t;
+    Ref_t outerWall;
+    Ref_t innerWall;
+    Ref_t gasVolume;
+    Ref_t cathode;
+    //positive endplate
+    Ref_t endplate;
+    //negative endplate
+    Ref_t endplate2;
+  };
+}
diff --git a/examples/ILDExDet/include/VXDData.h b/examples/ILDExDet/include/VXDData.h
new file mode 100644
index 000000000..1e4b7589c
--- /dev/null
+++ b/examples/ILDExDet/include/VXDData.h
@@ -0,0 +1,40 @@
+// $Id: VXDData.h 513 2013-04-05 14:31:53Z gaede $
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+
+#include "DD4hep/Detector.h"
+#include <vector>
+
+namespace DD4hep {
+
+  /**@class VXDData
+   *
+   *   @author  M.Frank
+   *   @version 1.0
+   */
+  struct VXDData : public Geometry::DetElement::Object {
+    /// Helper class for layer properties
+    struct Layer {
+      double internalPhi0 ;
+      double Distance ;
+      double Offset ;
+      double Thickness ;
+      double Length ;
+      double Width ;
+      double RadLength ;
+      int    NLadders ;
+    };
+    typedef std::vector<Layer> LayerVec ;
+    typedef Geometry::Ref_t Ref_t;
+
+    // Ladder
+    LayerVec _lVec;
+    // Sensitive
+    LayerVec _sVec;
+  };
+}
diff --git a/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp b/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp
new file mode 100644
index 000000000..03af52f73
--- /dev/null
+++ b/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp
@@ -0,0 +1,252 @@
+//====================================================================
+//  AIDA Detector description implementation
+//  for LDC AHCAL Barrel
+//--------------------------------------------------------------------
+//
+//  Author     : S.Lu
+//
+// Basic idea:
+// 1. Create the Hcal Barrel module envelope by two shapers.
+//    Note: with default material Steel235.
+//    
+// 2. Create the Hcal Barrel Chamber(i.e. Layer)
+//    Create the Layer with slices (Polystyrene,Cu,FR4,air).
+//    Note: there is NO radiator (Steel235) in Layer/Chamber.
+//
+// 3. Place the Layer into the Hcal Barrel envelope,
+//    with the right position and rotation.
+//    And registry the IDs for slice,layer,stave,module and system.
+//
+// 4. Customer material FR4 and Steel235 defined in materials.xml
+//
+//====================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Layering.h"
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+static Ref_t create_detector(LCDD& lcdd, xml_h element, SensitiveDetector sens)  {
+  xml_det_t   x_det     = element;
+  Layering    layering(x_det);
+  xml_dim_t   dim         = x_det.dimensions();
+  string      det_name    = x_det.nameStr();
+  string      det_type    = x_det.typeStr();
+  Material    air         = lcdd.air();
+  Material    Steel235    = lcdd.material(x_det.materialStr());
+  double      gap         = xml_dim_t(x_det).gap();
+  int         numSides    = dim.numsides();
+
+  // Hcal Barrel module shapers' parameters
+  double      detZ              = dim.z();
+  double      Hcal_inner_radius = dim.rmin();
+
+  // The way to reaad constant from XML/LCDD file.
+  double      Hcal_outer_radius                = lcdd.constant<double>("Hcal_outer_radius");       // 3395.46 mm
+  double      Hcal_radiator_thickness          = lcdd.constant<double>("Hcal_radiator_thickness"); // 20.0mm
+  double      Hcal_chamber_thickness           = lcdd.constant<double>("Hcal_chamber_thickness");  // 6.5mm
+  int         HcalBarrel_layers                = lcdd.constant<int>("HcalBarrel_layers");          // 48
+  // ========  Note============================================================
+  // In the XML/LCDD file, make sure the above constant parameters 
+  // are agree with the layering/slices in the detector AhcalBarrelCalorimeter. 
+  // ==========================================================================
+
+
+  double      Hcal_lateral_structure_thickness = lcdd.constant<double>("Hcal_lateral_structure_thickness");
+  double      Hcal_layer_air_gap               = lcdd.constant<double>("Hcal_layer_air_gap");
+  double      Hcal_back_plate_thickness        = lcdd.constant<double>("Hcal_back_plate_thickness");
+
+  double      totalThickness_Hcal_Barrel       = (Hcal_radiator_thickness + Hcal_chamber_thickness) 
+                                                 * HcalBarrel_layers + Hcal_back_plate_thickness;
+  double      Hcal_module_radius               = Hcal_inner_radius + totalThickness_Hcal_Barrel;
+
+  double      Hcal_Barrel_rotation             = lcdd.constant<double>("Hcal_Barrel_rotation");
+
+  DetElement  sdet(det_name,x_det.id());
+  Volume      motherVol = lcdd.pickMotherVolume(sdet);
+
+
+  // ========= Create Hcal Barrel envelope ====================================
+  //  It will be the volume for palcing the Hcal Barrel Chamber(i.e. Layers).
+  //  Itself will be placed into the world volume.
+  // ==========================================================================
+
+  // Hcal Barrel module shapers
+  PolyhedraRegular polyhedra_shaper("polyhedra",numSides,Hcal_inner_radius,Hcal_module_radius,detZ*2.);
+  Tube             tube_shaper(0.,Hcal_outer_radius, detZ, 0., 2.*M_PI);
+  
+  // keep the envelope rotation as the same as the stave
+  // the stave number can be changed in the compact XML.
+  Rotation rot(M_PI/2. - M_PI/numSides,0,0);
+
+  // Create Hcal Barrel volume with material Steel235 
+  IntersectionSolid barrelModuleSolid(tube_shaper,polyhedra_shaper,rot);
+  
+  Volume           envelopeVol(det_name+"_envelope",barrelModuleSolid,Steel235);
+
+  // Set envelope volume attributes.
+  envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
+
+
+  // ========= Create Hcal Barrel Chmaber (i.e. Layers) =======================
+  // It will be the sub volume for placing the slices.
+  // Itself will be placed into the Hcal Barrel envelope.
+  // ==========================================================================
+
+  // create Layer (air) and place the slices (Polystyrene,Cu,FR4,air) into it. 
+  // place the Layer into the HcalBarrel envelope (Steel235).
+  double innerAngle      = 2.*M_PI/numSides;
+  double halfInnerAngle  = innerAngle/2.;
+  double tan_inner       = std::tan(halfInnerAngle) * 2.;
+  double cos_inner       = std::cos(halfInnerAngle);
+
+  double innerFaceLen    = (Hcal_inner_radius + Hcal_radiator_thickness) * tan_inner;
+
+  double layerOuterAngle = (M_PI-innerAngle)/2.;
+  double layerInnerAngle = (M_PI/2. - layerOuterAngle);
+
+  // First Hcal Barrel Chamber position, start after first radiator
+  double layer_pos_x     = Hcal_inner_radius + Hcal_radiator_thickness;                      
+  double layer_dim_y     = innerFaceLen/2. - gap/2.;
+
+  // Create Hcal Barrel Chamber without radiator
+  // Place into the Hcal Barrel envelope, after each radiator 
+  int layer_num = 0;
+  for(xml_coll_t c(x_det,_U(layer)); c; ++c)  {
+    xml_comp_t   x_layer = c;
+    int          repeat = x_layer.repeat();          // Get number of layers.
+    const Layer* lay    = layering.layer(layer_num); // Get the layer from the layering engine.
+    // Loop over repeats for this layer.
+    for (int j = 0; j < repeat; j++)    {
+      string layer_name      = det_name+_toString(layer_num,"_layer%d");
+      double layer_thickness = lay->thickness();
+      DetElement  layer(layer_name,_toString(layer_num,"layer%d"),x_det.id());
+
+      // Layer position in Z within the stave.
+      layer_pos_x += layer_thickness/2.;
+      // Active Layer box & volume
+      double active_layer_dim_x = layer_thickness/2.;
+      double active_layer_dim_y = layer_dim_y;
+      double active_layer_dim_z = (detZ-Hcal_lateral_structure_thickness)/2.;
+
+      // The same Layer will be filled with skices, 
+      // and placed into the HcalBarrel 16 times: 8 Staves * 2 modules: TODO 32 times.
+      Volume layer_vol(layer_name, Box(active_layer_dim_x,active_layer_dim_y,active_layer_dim_z), air);
+
+
+      // ========= Create sublayer slices =========================================
+      // Create and place the slices into Layer
+      // ==========================================================================
+
+      // Create the slices (sublayers) within the Hcal Barrel Chamber.
+      double slice_pos_x = -(layer_thickness/2.);
+      int slice_number = 0;
+      for(xml_coll_t k(x_layer,_U(slice)); k; ++k)  {
+	xml_comp_t x_slice = k;
+	string   slice_name      = layer_name + _toString(slice_number,"_slice%d");
+	double   slice_thickness = x_slice.thickness();
+	Material slice_material  = lcdd.material(x_slice.materialStr());
+	DetElement slice(layer,_toString(slice_number,"slice%d"),x_det.id());
+
+	slice_pos_x += slice_thickness/2.;
+
+	// Slice volume & box
+	double slice_dim_y = active_layer_dim_y - Hcal_layer_air_gap ;
+	Volume slice_vol(slice_name,Box(slice_thickness/2.,slice_dim_y,active_layer_dim_z),slice_material);
+
+	if ( x_slice.isSensitive() ) {
+	  sens.setType("calorimeter");
+	  slice_vol.setSensitiveDetector(sens);
+	}
+	// Set region, limitset, and vis.
+	slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+	// slice PlacedVolume
+	PlacedVolume slice_phv = layer_vol.placeVolume(slice_vol,Position(slice_pos_x,0.,0.));
+	slice_phv.addPhysVolID("slice",slice_number);
+
+	slice.setPlacement(slice_phv);
+	// Increment x position for next slice.
+	slice_pos_x += slice_thickness/2.;
+	// Increment slice number.
+	++slice_number;             
+      }
+      // Set region, limitset, and vis.
+      layer_vol.setAttributes(lcdd,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr());
+
+
+      // ========= Place the Layer (i.e. Chamber) =================================
+      // Place the Layer into the Hcal Barrel envelope.
+      // with the right position and rotation.
+      // Registry the IDs (layer, stave, module).
+      // ==========================================================================
+
+      // Acording to the number of staves and modules,
+      // Place the same Layer into the HcalBarrel envelope
+      // with the right position and rotation.
+      for(int stave_num = 0; stave_num < numSides; stave_num++){
+	double ds = double(stave_num);
+	double delte_phi = M_PI/2. - innerAngle*ds;
+	string stave_layer = _toString(stave_num,"stave%d_layer");
+	// Layer physical volume.
+	double layer_pos_z = active_layer_dim_z + Hcal_lateral_structure_thickness;
+	for(int module_num = 0; module_num < 2; module_num++)
+	  {
+	    layer_pos_z = (module_num==0)?layer_pos_z:-layer_pos_z;
+	    PlacedVolume layer_phv = envelopeVol.placeVolume(layer_vol,
+							     Transform3D(RotationZ(delte_phi),
+									 Translation3D(layer_pos_x*std::cos(delte_phi),
+										       layer_pos_x*std::sin(delte_phi),
+										       layer_pos_z)));
+							     
+	    // registry the ID of Layer, stave and module
+	    layer_phv.addPhysVolID("layer",layer_num);
+	    layer_phv.addPhysVolID("stave",stave_num);
+	    layer_phv.addPhysVolID("module",module_num);
+	    // then setPlacement for it.
+	    layer.setPlacement(layer_phv);
+
+	  }
+      }
+
+
+      // ===== Prepare for next layer (i.e. next Chamber) =========================
+      // Prepare the chamber placement position and the chamber dimension
+      // ==========================================================================
+
+      // Prepare for next Layer
+      // Increment the layer_pos_x, and calculate the next layer_dim_y
+      // Place Hcal Barrel Chamber after each radiator 
+      layer_pos_x += layer_thickness/2.;
+      layer_pos_x += Hcal_radiator_thickness;
+      // Increment the layer X dimension.
+      if((layer_pos_x + layer_thickness ) < (Hcal_outer_radius - Hcal_back_plate_thickness)* cos_inner)
+	layer_dim_y += (layer_thickness + Hcal_radiator_thickness) * std::tan(layerInnerAngle);
+      else
+	layer_dim_y = std::sqrt((Hcal_outer_radius-Hcal_radiator_thickness)
+				*(Hcal_outer_radius-Hcal_radiator_thickness)
+				- layer_pos_x*layer_pos_x) - gap/2.;
+      // Increment the layer number.
+      ++layer_num;         
+    }
+  }
+
+
+  // =========== Place Hcal Barrel envelope ===================================
+  // Finally place the Hcal Barrel envelope into the world volume.
+  // Registry the system ID.
+  // ==========================================================================
+
+  // Place Hcal Barrel volume into the world volume
+  PlacedVolume env_phv = motherVol.placeVolume(envelopeVol,Transform3D( RotationZ(Hcal_Barrel_rotation) ));
+
+  // registry the system id
+  env_phv.addPhysVolID("system", sdet.id());
+  sdet.setPlacement(env_phv);
+  return sdet;
+}
+
+
+
+
+DECLARE_DETELEMENT(AhcalBarrelCalorimeter, create_detector);
diff --git a/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp b/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp
new file mode 100644
index 000000000..0610f4241
--- /dev/null
+++ b/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp
@@ -0,0 +1,286 @@
+//====================================================================
+//  AIDA Detector description implementation
+//  for LDC AHCAL Endcap
+//--------------------------------------------------------------------
+//
+//  Author     : S.Lu
+//
+// Basic idea:
+// 1. Create the Hcal Endcap module envelope (16 modules).
+//    Note: with default material Steel235.
+//    
+// 2. Create the Hcal Endcap Chamber(i.e. Layer) for each module.
+//    Create the Layer with slices (Polystyrene,Cu,FR4,air).
+//    Place each slice into the chamber with the right position,
+//    And registry the IDs for slice
+//
+// 3. Place the same Layer into the endcap module envelope.
+//    It will be repeated repeat 48 times.
+//    And registry the IDs for layer, and endcapID.
+//
+// 4. Place the endcap module into the world volume,
+//    with the right position and rotation.
+//    And registry the IDs for stave,module and endcapID.
+//
+// 5. Customer material FR4 and Steel235 defined in materials.xml
+//
+//====================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Layering.h"
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+static Ref_t create_detector(LCDD& lcdd, xml_h element, SensitiveDetector sens)  {
+  xml_det_t   x_det     = element;
+  Layering    layering(x_det);
+  xml_dim_t   dim         = x_det.dimensions();
+  string      det_name    = x_det.nameStr();
+  string      det_type    = x_det.typeStr();
+  Material    air         = lcdd.air();
+  Material    Steel235    = lcdd.material(x_det.materialStr());
+  double      gap         = xml_dim_t(x_det).gap();
+  //  int         numSides    = dim.numsides();
+  double      detZ              = dim.z();    // Hcal endcap modules z start
+  double      Hcal_inner_radius = dim.rmin(); // Endcap cernter box hole half length: 362.0
+  
+  // The way to reaad constant from XML/LCDD file.
+  //double      Hcal_outer_radius                = lcdd.constant<double>("Hcal_outer_radius");       // 3395.46 mm
+  double      Hcal_radiator_thickness          = lcdd.constant<double>("Hcal_radiator_thickness"); // 20.0mm
+  //double      Hcal_chamber_thickness           = lcdd.constant<double>("Hcal_chamber_thickness");  // 6.5mm
+  //int         Hcal_endcap_layers               = lcdd.constant<int>("Hcal_endcap_layers");         // 48
+  // ========  Note============================================================
+  // In the XML/LCDD file, make sure the above constant parameters 
+  // are agree with the layering/slices in the detector Ahcal. 
+  // ==========================================================================
+  
+  
+  double      Hcal_lateral_structure_thickness = lcdd.constant<double>("Hcal_lateral_structure_thickness");
+  double      Hcal_layer_air_gap               = lcdd.constant<double>("Hcal_layer_air_gap");
+  double      Hcal_endcap_zmin                 = lcdd.constant<double>("Hcal_endcap_zmin");
+  //double      Hcal_back_plate_thickness        = lcdd.constant<double>("Hcal_back_plate_thickness");
+  
+  // ========= Create Hcal Endcap Modules envelope ============================
+  //  Read the Endcap Modules dimensions,
+  //  Which defined in the compact XML files. 
+  // ==========================================================================
+  double dim_x[16];
+  double dim_y[16];
+  double dim_z[16];
+  double pos_x[16];
+  double pos_y[16];
+  double pos_z[16];
+  
+  int endcapID =0;
+  for(xml_coll_t c(x_det.child(_U(dimensions)),_U(dimensions)); c; ++c) {
+    
+    xml_comp_t l(c);
+    
+    dim_x[endcapID] = l.attr<double>(_Unicode(dim_x));
+    dim_y[endcapID] = l.attr<double>(_Unicode(dim_y));
+    dim_z[endcapID] = l.attr<double>(_Unicode(dim_z));
+    pos_y[endcapID] = l.attr<double>(_Unicode(y_offset));
+    //std::cout<<" dim_z["<<endcapID<<"]: "<< dim_z[endcapID]/2.0<<std::endl;
+    endcapID++;
+  }
+  
+  
+  DetElement   sdet(det_name,x_det.id());
+  Volume      motherVol = lcdd.pickMotherVolume(sdet); 
+  
+  // ========= Create Hcal Endcap Modules envelope ============================
+  //  They will be the volume for palcing the Hcal Chamber(i.e. Layers).
+  //  Themself will be placed into the world volume.
+  // ==========================================================================
+  
+  // build 16 Endcap Modules
+  for(int ecID=0; ecID<endcapID; ecID++)
+    {
+      // Hcal Endcap module shape
+      double box_half_x= dim_x[ecID]/2.0; // module width, all are same
+      double box_half_y= dim_y[ecID]/2.0; // total thickness, all are same
+      double box_half_z= dim_z[ecID]/2.0; // module length, changed, 
+      
+      double x_offset = box_half_x*endcapID-box_half_x*ecID*2.0-box_half_x;
+      double y_offset = pos_y[ecID];
+      
+      Box    EndcapModule(box_half_x,box_half_y,box_half_z);
+      
+      // define the name of each endcap Module
+      string envelopeVol_name   = det_name+_toString(ecID,"_EndcapModule%d");
+      
+      Volume envelopeVol(envelopeVol_name,EndcapModule,Steel235);
+      
+      // Set envelope volume attributes.
+      envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
+      
+      
+      // ========= Create Hcal Chamber (i.e. Layers) ==============================
+      // It will be the sub volume for placing the slices.
+      // Itself will be placed into the Hcal Endcap modules envelope.
+      // ==========================================================================
+      
+      // create Layer (air) and place the slices (Polystyrene,Cu,FR4,air) into it. 
+      // place the Layer into the Hcal Endcap Modules envelope (Steel235).
+      
+      // First Hcal Chamber position, start after first radiator
+      double layer_pos_y     = - box_half_y + Hcal_radiator_thickness;                      
+      
+      // Create Hcal Endcap Chamber without radiator
+      // Place into the Hcal Encap module envelope, after each radiator 
+      int layer_num = 0;
+      for(xml_coll_t c(x_det,_U(layer)); c; ++c)  {
+	xml_comp_t   x_layer = c;
+	int          repeat = x_layer.repeat();          // Get number of layers.
+	const Layer* lay    = layering.layer(layer_num); // Get the layer from the layering engine.
+	
+	string layer_name      = envelopeVol_name+"_layer";
+	double layer_thickness = lay->thickness();
+	DetElement  layer(layer_name,layer_name,x_det.id());
+	
+	// Active Layer box & volume
+	double active_layer_dim_x = box_half_x - Hcal_lateral_structure_thickness;
+	double active_layer_dim_y = layer_thickness/2.0;
+	double active_layer_dim_z = box_half_z;
+	
+	// Build chamber including air gap
+	// The Layer will be filled with slices, 
+	Volume layer_vol(layer_name, Box((active_layer_dim_x + Hcal_layer_air_gap),
+					 active_layer_dim_y,active_layer_dim_z), air);
+	
+	
+	// ========= Create sublayer slices =========================================
+	// Create and place the slices into Layer
+	// ==========================================================================
+	
+	// Create the slices (sublayers) within the Hcal Chamber.
+	double slice_pos_y = -(layer_thickness / 2.0);
+	int slice_number = 0;
+	for(xml_coll_t k(x_layer,_U(slice)); k; ++k)  {
+	  xml_comp_t x_slice = k;
+	  string   slice_name      = layer_name + _toString(slice_number,"_slice%d");
+	  double   slice_thickness = x_slice.thickness();
+	  Material slice_material  = lcdd.material(x_slice.materialStr());
+	  DetElement slice(layer,_toString(slice_number,"slice%d"),x_det.id());
+	  
+	  slice_pos_y += slice_thickness / 2.0;
+	  
+	  // Slice volume & box
+	  Volume slice_vol(slice_name,Box(active_layer_dim_x,slice_thickness/2.0,active_layer_dim_z),slice_material);
+	  
+	  if ( x_slice.isSensitive() ) {
+	    sens.setType("calorimeter");
+	    slice_vol.setSensitiveDetector(sens);
+	  }
+	  // Set region, limitset, and vis.
+	  slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+	  // slice PlacedVolume
+	  PlacedVolume slice_phv = layer_vol.placeVolume(slice_vol,Position(0,slice_pos_y,0));
+	  slice_phv.addPhysVolID("slice",slice_number);
+	  
+	  slice.setPlacement(slice_phv);
+	  // Increment Z position for next slice.
+	  slice_pos_y += slice_thickness / 2.0;
+	  // Increment slice number.
+	  ++slice_number;             
+	}
+	// Set region, limitset, and vis.
+	layer_vol.setAttributes(lcdd,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr());
+	
+	
+	// ========= Place the Layer (i.e. Chamber) =================================
+	// Place the Layer into the Hcal Endcap module envelope.
+	// with the right position and rotation.
+	// Registry the IDs (layer, stave, module).
+	// Place the same layer 48 times into Endcap module
+	// ==========================================================================
+	
+	for (int j = 0; j < repeat; j++)    {
+	  
+	  // Layer position in y within the Endcap Modules.
+	  layer_pos_y += layer_thickness / 2.0;
+	  
+	  PlacedVolume layer_phv = envelopeVol.placeVolume(layer_vol,
+							   Position(0,layer_pos_y,0));
+	  // registry the ID of Layer, stave and module
+	  layer_phv.addPhysVolID("layer",layer_num);
+	  layer_phv.addPhysVolID("endcapID",ecID);
+	  // then setPlacement for it.
+	  layer.setPlacement(layer_phv);
+	  
+	  
+	  // ===== Prepare for next layer (i.e. next Chamber) =========================
+	  // Prepare the chamber placement position and the chamber dimension
+	  // ==========================================================================
+	  
+	  // Increment the layer_pos_y
+	  // Place Hcal Chamber after each radiator 
+	  layer_pos_y += layer_thickness / 2.0;
+	  layer_pos_y += Hcal_radiator_thickness;
+	  ++layer_num;         
+	}
+	
+	
+      }
+      
+      
+      // =========== Place Hcal Endcap envelope ===================================
+      // Finally place the Hcal Endcap envelope into the world volume.
+      // Registry the stave(up/down), module(left/right) and endcapID.
+      // ==========================================================================
+      
+      // Acording to the number of staves and modules,
+      // Place the same Hcal Endcap module volume into the world volume
+      // with the right position and rotation.
+      for(int stave_num=0;stave_num<2;stave_num++){
+	
+	double EndcapModule_pos_x;
+	double EndcapModule_pos_y;
+	double EndcapModule_pos_z = Hcal_endcap_zmin + box_half_y;
+	double rot_EM = 0;
+	
+	switch (stave_num)
+	  {
+	  case 0 : 
+	    EndcapModule_pos_x = x_offset;
+	    EndcapModule_pos_y = y_offset;
+	    break;
+	  case 1 : 
+	    EndcapModule_pos_x = -x_offset;
+	    EndcapModule_pos_y = -y_offset;
+	    break;
+	  }
+	
+	for(int module_num=0;module_num<2;module_num++) {
+	  
+	  rot_EM = (module_num==0)?(M_PI/2.0):(-M_PI/2.0);
+	  
+	  EndcapModule_pos_z = (module_num==0)?EndcapModule_pos_z:-EndcapModule_pos_z;
+
+	  PlacedVolume env_phv = motherVol.placeVolume(envelopeVol,
+						       Transform3D(RotationX(rot_EM),
+								   Translation3D(EndcapModule_pos_x,
+										 EndcapModule_pos_y,
+										 EndcapModule_pos_z)));
+	  
+	  env_phv.addPhysVolID("stave",stave_num);   // y: up /down
+	  env_phv.addPhysVolID("module",module_num); // z: +/-
+	  env_phv.addPhysVolID("system",x_det.id());
+	  sdet.setPlacement(env_phv);
+	  
+	}
+	
+      }
+      
+    }
+  
+  
+  
+  return sdet;
+}
+
+
+
+
+DECLARE_DETELEMENT(AhcalEndcapCalorimeter, create_detector);
diff --git a/examples/ILDExDet/src/ILDExSIT_geo.cpp b/examples/ILDExDet/src/ILDExSIT_geo.cpp
new file mode 100644
index 000000000..29bb045f3
--- /dev/null
+++ b/examples/ILDExDet/src/ILDExSIT_geo.cpp
@@ -0,0 +1,78 @@
+// $Id: ILDExSIT_geo.cpp 687 2013-08-09 12:56:00Z gaede $
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+
+#include "DD4hep/DetFactoryHelper.h"
+
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+  
+static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
+  xml_det_t    x_det = e;
+  string       name  = x_det.nameStr();
+  DetElement   sit(name,x_det.id());
+  Assembly assembly( name + "assembly"  ) ;
+  PlacedVolume pv;
+
+  
+  for(xml_coll_t c(e,_U(layer)); c; ++c)  {
+
+
+    xml_comp_t  x_layer   (c);
+    xml_comp_t  x_support (x_layer.child(_U(support)));
+    xml_comp_t  x_ladder  (x_layer.child(_U(ladder)));
+    int         layer_id   = x_layer.id();
+    int         nLadders   = x_ladder.number();
+    string      layername  = name+_toString(layer_id,"_layer%d");
+    double      dphi       = 2.*M_PI/double(nLadders);
+    double      zhalf      = x_ladder.zhalf();
+    double      sens_radius= x_ladder.radius();
+    double      sens_thick = x_ladder.thickness();
+    double      supp_thick = x_support.thickness();
+    double      width      = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.);
+    Box         ladderbox ((sens_thick+supp_thick)/2.,width/2.,zhalf);
+    Volume      laddervol (layername+"_ladder",ladderbox,lcdd.material(x_ladder.materialStr()));
+    Box         sensbox   (sens_thick/2.,width/2.,zhalf);
+    Volume      sensvol   (layername+"_sens",sensbox,lcdd.material(x_ladder.materialStr()));
+    Box         suppbox   (supp_thick/2.,width/2.,zhalf);
+    Volume      suppvol   (layername+"_supp",suppbox,lcdd.material(x_support.materialStr()));
+    Position    senspos   (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0);
+    Position    supppos   (-(sens_thick+supp_thick)/2.+sens_thick+supp_thick/2.,0,0);
+      
+    sens.setType("tracker");
+    sensvol.setSensitiveDetector(sens);
+    sensvol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_layer.visStr());
+
+    pv = laddervol.placeVolume(sensvol,senspos) ;
+    laddervol.placeVolume(suppvol,supppos);
+    sit.setVisAttributes(lcdd, x_det.visStr(),laddervol);
+
+    for(int j=0; j<nLadders; ++j) {
+      
+      string laddername = layername + _toString(j,"_ladder%d");
+      double radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.);
+      Position pos(radius*cos(j*dphi),radius*sin(j*dphi),0.);
+
+      pv = assembly.placeVolume(laddervol,Transform3D(RotationZ(j*dphi),pos));
+
+      // this will result int the correct cellID to be set...
+      pv.addPhysVolID("layer",layer_id).addPhysVolID("module",j).addPhysVolID("sensor",0 ) ;
+
+   }
+  }
+  pv = lcdd.pickMotherVolume(sit).placeVolume(assembly)  ;
+
+  pv.addPhysVolID("system", x_det.id()).addPhysVolID("side",0 ) ;
+
+  sit.setPlacement( pv );
+  return sit;
+}
+
+DECLARE_DETELEMENT(ILDExSIT,create_element);
diff --git a/examples/ILDExDet/src/ILDExTPC_geo.cpp b/examples/ILDExDet/src/ILDExTPC_geo.cpp
new file mode 100644
index 000000000..42ddc8560
--- /dev/null
+++ b/examples/ILDExDet/src/ILDExTPC_geo.cpp
@@ -0,0 +1,172 @@
+// $Id: ILDExTPC_geo.cpp 680 2013-08-06 15:07:53Z gaede $
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : A.Muennich
+//
+//====================================================================
+
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Detector.h"
+//#include "TPCModuleData.h"
+#include "TPCData.h"
+//#include "TPCModule.h"
+//#include "FixedPadAngleDiskLayout.h"
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
+  xml_det_t   x_det = e;
+  xml_comp_t  x_tube (x_det.child(_U(tubs)));
+  string      name  = x_det.nameStr();
+  Material    mat    (lcdd.material(x_det.materialStr()));
+  //if data is needed do this
+  TPCData* tpcData = new TPCData();
+  DetElement tpc(tpcData, name, x_det.typeStr());
+  tpcData->id = x_det.id();
+  //else do this
+  //DetElement    tpc  (name,x_det.typeStr(),x_det.id());
+  Tube        tpc_tub(x_tube.rmin(),x_tube.rmax(),x_tube.zhalf());
+  Volume      tpc_vol(name+"_envelope_volume", tpc_tub, mat);
+  Readout     readout(sens.readout());
+
+  for(xml_coll_t c(e,_U(detector)); c; ++c)  {
+
+    xml_comp_t  px_det  (c);
+    xml_comp_t  px_tube (px_det.child(_U(tubs)));
+    xml_dim_t   px_pos  (px_det.child(_U(position)));
+    xml_dim_t   px_rot  (px_det.child(_U(rotation)));
+    xml_comp_t  px_mat  (px_det.child(_U(material)));
+    string      part_nam(px_det.nameStr());
+
+    Material    part_mat(lcdd.material(px_mat.nameStr()));
+    DetElement  part_det(part_nam,px_det.typeStr(),px_det.id());
+
+    Tube        part_tub(px_tube.rmin(),px_tube.rmax(),px_tube.zhalf());
+    Volume      part_vol(part_nam,part_tub,part_mat);
+
+    Position    part_pos(px_pos.x(),px_pos.y(),px_pos.z());
+    Rotation    part_rot(px_rot.x(),px_rot.y(),px_rot.z());
+    bool        reflect   = px_det.reflect();
+    
+    sens.setType("tracker");
+
+    part_vol.setVisAttributes(lcdd,px_det.visStr());
+    //cache the important volumes in TPCData for later use without having to know their name
+    switch(part_det.id())
+      {
+      case 2:
+        tpcData->innerWall=part_det;
+	break;
+      case 3:
+        tpcData->outerWall=part_det;
+	break;
+      case 4:
+	{
+	  xml_comp_t  px_lay(px_det.child(_U(layer)));
+	  int  nTPClayer( px_lay.attr<int>(_U(number)) );
+
+	  double r0 = px_tube.rmin() +1.e-3 ;
+	  double r1 = px_tube.rmax() -1e-3  ;
+	  double zh = px_tube.zhalf() - 1e-3 ;
+	  double dR = ( r1 - r0 ) / ( 2.* nTPClayer ) ;  
+
+
+	  for(int i=0 ; i < nTPClayer ; ++i){
+
+	    Tube    gas_tubL( r0 + (2*i) * dR , r0 + (2*i+1) * dR , zh );
+	    Volume  gas_volL(  _toString( i, "tpc_row_lower_%03d") , gas_tubL, part_mat);
+	    part_vol.placeVolume( gas_volL, Rotation(0,0,0) );
+
+	    Tube    gas_tubU( r0 + (2*i+1) * dR , r0 + (2*i+2) * dR , zh );
+	    Volume  gas_volU( _toString( i, "tpc_row_upper_%03d")  , gas_tubU, part_mat);
+
+	    gas_volU.setSensitiveDetector( sens );
+	    part_vol.placeVolume( gas_volU, Rotation(0,0,0) ).addPhysVolID("layer",i) ;
+	  }
+	  
+	 
+	  tpcData->gasVolume=part_det;
+	  break;
+	}
+      case 5:
+        tpcData->cathode=part_det;
+	break;
+      }
+    //Endplate
+    if(part_det.id()== 0){
+      tpcData->endplate=part_det;
+      //modules
+      int mdcount=0;
+      for(xml_coll_t m(px_det,_U(modules)); m; ++m)  {
+        xml_comp_t  modules  (m);
+        string      m_name  = modules.nameStr();
+        for(xml_coll_t r(modules,_U(row)); r; ++r)  {
+          xml_comp_t  row(r);
+          int nmodules = row.nModules();
+          int rowID=row.RowID();
+          //shape of module
+          double pitch=row.rowPitch();
+          double rmin=px_tube.rmin()+pitch/2+rowID*row.moduleHeight()+rowID*pitch/2;
+          double rmax=rmin+row.moduleHeight();
+          double DeltaPhi=(2*M_PI-nmodules*(row.modulePitch()/(rmin+(rmax-rmin)/2)))/nmodules;
+          double zhalf=px_tube.zhalf();
+          string      mr_nam=m_name+_toString(rowID,"_Row%d");
+          Volume      mr_vol(mr_nam,Tube(rmin,rmax,zhalf,DeltaPhi),part_mat);
+          Material    mr_mat(lcdd.material(px_mat.nameStr()));
+          Readout     xml_pads(lcdd.readout(row.padType()));
+          
+          //placing modules
+          for(int md=0;md<nmodules;md++){
+            string      m_nam=m_name+_toString(rowID,"_Row%d")+_toString(md,"_M%d");
+            
+            DetElement  module(part_det,m_nam,mdcount);
+            mdcount++;
+            double rotz=md*2*M_PI/nmodules+row.modulePitch()/(rmin+(rmax-rmin))/2;
+            PlacedVolume m_phv = part_vol.placeVolume(mr_vol,Rotation(rotz,0,0));
+            m_phv.addPhysVolID("module",md);
+            module.setPlacement(m_phv);
+            // Readout and placement must be present before adding extension,
+            // since they are aquired internally for optimisation reasons. (MF)
+	    // module.addExtension<PadLayout>(new FixedPadAngleDiskLayout(module,readout));
+
+          }//modules
+        }//rows
+      }//module groups
+    }//endplate
+    
+    PlacedVolume part_phv = tpc_vol.placeVolume(part_vol,Transform3D(Rotation3D(part_rot),part_pos));
+    //part_phv.addPhysVolID(part_nam,px_det.id());
+    part_phv.addPhysVolID("side",0);
+    part_det.setPlacement(part_phv);
+    tpc.add(part_det);
+    //now reflect it
+    if(reflect){
+      Position r_pos(px_pos.x(),px_pos.y(),-px_pos.z());
+      //Attention: rotation is given in euler angles
+      Rotation r_rot(0,M_PI,M_PI);
+      // Volume      part_vol_r(lcdd,part_nam+"_negativ",part_tub,part_mat);
+      PlacedVolume part_phv2 = tpc_vol.placeVolume(part_vol,Transform3D(Rotation3D(r_rot),r_pos));
+      //part_phv2.addPhysVolID(part_nam+"_negativ",px_det.id()+1);
+      part_phv2.addPhysVolID("side",1);
+      // needs a copy function for DetElement
+      // DetElement rdet(lcdd,part_nam+"_negativ",px_det.typeStr(),px_det.id()+1);
+      DetElement rdet = part_det.clone(part_nam+"_negativ",px_det.id()+1);
+      rdet.setPlacement(part_phv2);
+      tpcData->endplate2 = rdet;
+      tpc.add(rdet);
+    }
+  }//subdetectors
+  tpc_vol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
+  
+  PlacedVolume phv = lcdd.pickMotherVolume(tpc).placeVolume(tpc_vol);
+  phv.addPhysVolID("system",x_det.id());
+  tpc.setPlacement(phv);
+  return tpc;
+}
+
+//first argument is the type from the xml file
+DECLARE_DETELEMENT(ILDExTPC,create_element)
diff --git a/examples/ILDExDet/src/ILDExVXD_geo.cpp b/examples/ILDExDet/src/ILDExVXD_geo.cpp
new file mode 100644
index 000000000..e324e351a
--- /dev/null
+++ b/examples/ILDExDet/src/ILDExVXD_geo.cpp
@@ -0,0 +1,147 @@
+// $Id: ILDExVXD_geo.cpp 673 2013-08-05 10:01:33Z gaede $
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "VXDData.h"
+
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
+  DetElement   vxd;
+  xml_det_t    x_det = e;
+  string       name  = x_det.nameStr();
+
+  //  Assembly     assembly(name+"_assembly");
+
+  // replace assembly with cylinder of air:
+  xml_comp_t  x_tube (x_det.child(_U(tubs)));
+  Tube        envelope_cylinder(x_tube.rmin(),x_tube.rmax(),x_tube.zhalf());
+  Volume      assembly ("vxd_envelope_cyl", envelope_cylinder ,lcdd.air());
+
+  PlacedVolume pv;
+
+  VXDData* vxd_data = new VXDData();
+  vxd.assign(vxd_data,name,x_det.typeStr());
+  vxd_data->id = x_det.id();
+
+
+  for(xml_coll_t c(e,_U(layer)); c; ++c)  {
+
+    xml_comp_t  x_layer  (c);
+
+    xml_comp_t  x_support (x_layer.child(_U(support)));
+    xml_comp_t  x_ladder  (x_layer.child(_U(ladder)));
+
+    int         layer_id   = x_layer.id();
+    int         nLadders   = x_ladder.number();
+    string      layername  = name+_toString(layer_id,"_layer%d");
+    double      dphi       = 2.*M_PI/double(nLadders);
+    double      zhalf      = x_ladder.zhalf();
+    double      offset     = x_ladder.offset();
+    double      sens_radius= x_ladder.radius();
+    double      sens_thick = x_ladder.thickness();
+    double      supp_thick = x_support.thickness();
+    double      radius     = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.);
+    double      phi0       =  x_layer.phi0() ;
+
+    //    double      width      = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.);
+    double      width      =  x_ladder.width();
+
+    Box         ladderbox ( (sens_thick+supp_thick)/2., width/2., zhalf );
+
+    Volume      laddervol (layername+"_ladder",ladderbox,lcdd.air());
+
+    Material    sensmat    = lcdd.material(x_ladder.materialStr());
+    Box         sensbox   (sens_thick/2.,  width/2.,   zhalf);
+    Volume      sensvol   (layername+"_sens",sensbox,sensmat);
+
+    Material    suppmat  = lcdd.material(x_support.materialStr());
+    Box         suppbox   (supp_thick/2.,width/2.,zhalf);
+    Volume      suppvol   (layername+"_supp",suppbox,suppmat);
+
+    //Position    senspos   (0,0,0);
+    //Position    supppos   (0,0,0);
+    Position    senspos   (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0);
+    Position    supppos   (-(sens_thick+supp_thick)/2.+sens_thick+supp_thick/2.,0,0);
+      
+    sens.setType("tracker");
+    sensvol.setSensitiveDetector(sens);
+    sensvol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_layer.visStr());
+
+    laddervol.placeVolume(sensvol,senspos);
+    laddervol.placeVolume(suppvol,supppos);
+
+    VXDData::Layer layer;
+    // Add ladder layer
+    layer.NLadders     = nLadders ;
+    layer.internalPhi0 = phi0 ; //M_PI/2. - dphi;   // phi0 given wrt x-axis  - internalPhi0 is wrt yaxis , negative orientation
+    layer.Distance     = 0.0; // What is this really (?) : ladderDistance;
+    layer.Offset       = offset;              // offset given in direction of positive rotation (increasing phi)
+    layer.Thickness    = supp_thick;
+    layer.Length       = suppbox.x();
+    layer.Width        = suppbox.y();
+    layer.RadLength    = suppmat->GetMaterial()->GetRadLen();
+    vxd_data->_lVec.push_back(layer);
+
+    // Now add sensitive ladder layer
+    layer.NLadders     = nLadders ;
+    layer.internalPhi0 = phi0 ;  //M_PI/2. - dphi;  // phi0 given wrt x-axis  - internalPhi0 is wrt yaxis , negative orientation
+    layer.Distance     = 0.0;    // What is this really (?) : sensitiveDistance ;
+    layer.Offset       = offset;  // offset given in direction of positive rotation (increasing phi)
+    layer.Thickness    = sens_thick;
+    layer.Length       = sensbox.x();
+    layer.Width        = sensbox.y();
+    layer.RadLength    = sensmat->GetMaterial()->GetRadLen();
+    vxd_data->_sVec.push_back(layer);
+
+
+    // Assembly layer_assembly( name + _toString( layer_id,"layer_assembly_%d" ) ) ;
+    // PlacedVolume layer_physvol = assembly.placeVolume( layer_assembly,IdentityPos() ) ;
+    // layer_physvol.addPhysVolID("layer", layer_id );
+
+    for(int j=0; j<nLadders; ++j) {
+
+      double dj = double(j);      
+      double phi = phi0 + dj*dphi  ;
+
+      string laddername = layername + _toString(j,"_ladder%d");
+
+      // Position pos(radius*cos(dj*dphi) - offset*sin(dj*dphi),
+      // 		   radius*sin(dj*dphi) - offset*cos(dj*dphi),0.);
+
+      double lthick = sens_thick + supp_thick ;
+      
+      Position pos( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
+       		    (radius + lthick/2.)*sin(phi)  + offset * cos( phi ) ,
+       		    0. ) ;
+
+      Rotation rot( 0, 0 , phi ) ;
+
+
+      pv = assembly.placeVolume( laddervol,Transform3D(RotationZ(phi),pos));
+      pv.addPhysVolID("layer", layer_id ).addPhysVolID( "module" , j ).addPhysVolID("sensor", 0 )   ;
+
+      //pv = assembly.placeVolume( sensvol, pos, rot ) ;
+
+    }
+    vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol);
+  }
+  Volume mother =  lcdd.pickMotherVolume(vxd) ;
+
+  pv = mother.placeVolume(assembly);
+
+  pv.addPhysVolID( "system", x_det.id() ).addPhysVolID("side",0 )  ;
+  
+  vxd.setPlacement(pv);
+  return vxd;
+}
+
+DECLARE_DETELEMENT(ILDExVXD,create_element);
-- 
GitLab