From d958233f4298c9cf388803402bfe6ac60fe27b17 Mon Sep 17 00:00:00 2001
From: Sylvester Joosten <sjoosten@anl.gov>
Date: Fri, 3 Sep 2021 20:23:39 +0000
Subject: [PATCH] Acts material

---
 athena.xml                         |  2 +-
 compact/central_tracker.xml        | 12 +++++++
 compact/gem_tracker_endcap.xml     |  2 ++
 compact/vertex_tracker.xml         |  5 +++
 src/BarrelTrackerWithFrame_geo.cpp | 51 +++++++++++++++++++-----------
 src/TrapEndcapTracker_geo.cpp      | 38 ++++++++++++++++------
 6 files changed, 80 insertions(+), 30 deletions(-)

diff --git a/athena.xml b/athena.xml
index a0d887d3..7a38fe7a 100644
--- a/athena.xml
+++ b/athena.xml
@@ -172,7 +172,7 @@
   <documentation level="10">
   ### PID detectors
   </documentation>
-  <include ref="compact/pid_config_acadia.xml" />
+  <!--include ref="compact/pid_config_acadia.xml" /-->
 
   <documentation level="10">
   ## Central calorimetry
diff --git a/compact/central_tracker.xml b/compact/central_tracker.xml
index 3fe00090..461c7064 100644
--- a/compact/central_tracker.xml
+++ b/compact/central_tracker.xml
@@ -203,6 +203,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           inner_r="TrackerBarrelInner_rmin1-TrackerBarrelLayer_rOffset"
           outer_r="TrackerBarrelInner_rmin1-TrackerBarrelLayer_rOffset + TrackerBarrelInner_thickness-1.0*mm"
           z_length="TrackerBarrelInner_length1"/>
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="100*TrackerBarrelInner_NModules1" bins1="100" />
         <rphi_layout phi_tilt="TrackerBarrel_StaveTiltAngle" nphi="TrackerBarrelInner_NModules1" phi0="0.0" rc="TrackerBarrelInner_rmin1" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -211,6 +212,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           inner_r="TrackerBarrelInner_rmin2-TrackerBarrelLayer_rOffset"
           outer_r="TrackerBarrelInner_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelInner_thickness"
           z_length="TrackerBarrelInner_length2"/>
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="100*TrackerBarrelInner_NModules2" bins1="100" />
         <rphi_layout phi_tilt="TrackerBarrel_StaveTiltAngle" nphi="TrackerBarrelInner_NModules2" phi0="0.0" rc="TrackerBarrelInner_rmin2" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -249,6 +251,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapInner_rmax1"
           length="TrackerEndcapInnerLayer_thickness"
           zstart="TrackerEndcapInner_zmin" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapInner_rmin1+TrackerEndcapInnerMod1_y/2.0"
           zstart="0.0"
@@ -289,6 +292,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapInner_rmax1"
           length="TrackerEndcapInnerLayer_thickness"
           zstart="TrackerEndcapInner_zmin" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapInner_rmin1+TrackerEndcapInnerMod1_y/2.0" 
           zstart="0"
@@ -350,6 +354,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           inner_r="TrackerBarrelOuter_rmin1-TrackerBarrelLayer_rOffset"
           outer_r="TrackerBarrelOuter_rmin1-TrackerBarrelLayer_rOffset + TrackerBarrelOuter_thickness-1.0*mm"
           z_length="TrackerBarrelOuter_length1"/>
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="100*TrackerBarrelOuter_NModules1" bins1="100" />
         <rphi_layout phi_tilt="TrackerBarrel_StaveTiltAngle" nphi="TrackerBarrelOuter_NModules1" phi0="0.0" rc="TrackerBarrelOuter_rmin1" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -358,6 +363,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           inner_r="TrackerBarrelOuter_rmin2-TrackerBarrelLayer_rOffset"
           outer_r="TrackerBarrelOuter_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelOuter_thickness"
           z_length="TrackerBarrelOuter_length2"/>
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="100*TrackerBarrelOuter_NModules2" bins1="100" />
         <rphi_layout phi_tilt="TrackerBarrel_StaveTiltAngle" nphi="TrackerBarrelOuter_NModules2" phi0="0.0" rc="TrackerBarrelOuter_rmin2" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -415,6 +421,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax1"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin1" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin1+TrackerEndcapOuterMod1_y/2.0"
           zstart="0.0*mm"
@@ -426,6 +433,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax2"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin2" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin2+TrackerEndcapOuterMod2_y/2.0"
           zstart="0.0*mm"
@@ -437,6 +445,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax3"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin3" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin3+TrackerEndcapOuterMod3_y/2.0"
           zstart="0.0*mm"
@@ -498,6 +507,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax1"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin1" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin1+TrackerEndcapOuterMod1_y/2.0"
           zstart="0.0*mm"
@@ -509,6 +519,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax2"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin2" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin2+TrackerEndcapOuterMod2_y/2.0"
           zstart="0.0*mm"
@@ -520,6 +531,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
           rmax="TrackerEndcapOuter_rmax3"
           length="TrackerEndcapOuterLayer_thickness"
           zstart="TrackerEndcapOuter_zmin3" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*TrackerEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="TrackerEndcapOuter_rmin3+TrackerEndcapOuterMod3_y/2.0"
           zstart="0.0*mm"
diff --git a/compact/gem_tracker_endcap.xml b/compact/gem_tracker_endcap.xml
index 6ae6f6c5..ede46043 100644
--- a/compact/gem_tracker_endcap.xml
+++ b/compact/gem_tracker_endcap.xml
@@ -138,6 +138,7 @@
           rmax = "GEMTrackerEndcapP_rmax"
           length="GEMTrackerEndcapP_thickness"
           zstart="GEMTrackerEndcapP_zmin" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="40*12" bins1="1024"/>
         <ring vis="TrackerVis" module="GEMModule1"
           r="GEMTrackerEndcapP_rmin+GEMTrackerEndcapP_y/2.0"
           zstart="0"
@@ -201,6 +202,7 @@
           rmax = "GEMTrackerEndcapN_rmax"
           length="GEMTrackerEndcapN_thickness"
           zstart="GEMTrackerEndcapN_zmin" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="40*12" bins1="1024"/>
         <ring vis="TrackerVis" module="GEMModule1"
           r="GEMTrackerEndcapN_rmin+GEMTrackerEndcapN_y/2.0"
           zstart="0.1"
diff --git a/compact/vertex_tracker.xml b/compact/vertex_tracker.xml
index 5ae26567..f6f3a2e6 100644
--- a/compact/vertex_tracker.xml
+++ b/compact/vertex_tracker.xml
@@ -142,6 +142,7 @@ Simple carbon fiber support shell.
           inner_r="VertexBarrelLayer_rmin1"
           outer_r="VertexBarrelLayer_rmax1"
           z_length="VertexBarrelLayer_length" />
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="VertexBarrelStave_count" bins1="100" />
         <comment>
           phi0     : Starting phi of first module.
           phi_tilt : Phi tilt of a module.
@@ -160,6 +161,7 @@ Simple carbon fiber support shell.
           inner_r="VertexBarrelLayer_rmin2"
           outer_r="VertexBarrelLayer_rmax2"
           z_length="VertexBarrelLayer_length" />
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="VertexBarrelStave_count" bins1="100" />
         <rphi_layout phi_tilt="0.0*degree" nphi="VertexBarrelStave_count" phi0="0.0" rc="VertexBarrelMod2_rmin" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -168,6 +170,7 @@ Simple carbon fiber support shell.
           inner_r="VertexBarrelSupport_rmin"
           outer_r="VertexBarrelSupport_rmax"
           z_length="VertexBarrelSupport_length" />
+        <layer_material surface="outer" binning="binPhi,binZ" bins0="VertexBarrelStave_count" bins1="100" />
         <rphi_layout phi_tilt="0.0*degree" nphi="VertexBarrelStave_count" phi0="0.0" rc="VertexBarrelShell_rmin" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
@@ -207,6 +210,7 @@ Simple carbon fiber support shell.
           rmax="VertexTrackerEndcapP_rmax"
           length="VertexEndcapLayer_thickness"
           zstart="VertexTrackerEndcapP_zmin + VertexEndcapLayer_dz/2.0" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*VertexEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="VertexTrackerEndcapP_rmin+VertexEndcapMod1_y/2.0"
           zstart="0.0"
@@ -248,6 +252,7 @@ Simple carbon fiber support shell.
           rmax="VertexTrackerEndcapN_rmax"
           length="VertexEndcapLayer_thickness"
           zstart="VertexTrackerEndcapN_zmin + VertexEndcapLayer_dz/2.0" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*VertexEndcap_NModules" bins1="256"/>
         <ring vis="TrackerVis"
           r="VertexTrackerEndcapN_rmin+VertexEndcapMod1_y/2.0"
           zstart="0.0"
diff --git a/src/BarrelTrackerWithFrame_geo.cpp b/src/BarrelTrackerWithFrame_geo.cpp
index bc82b124..04c09374 100644
--- a/src/BarrelTrackerWithFrame_geo.cpp
+++ b/src/BarrelTrackerWithFrame_geo.cpp
@@ -13,11 +13,9 @@
 #include "DDRec/DetectorData.h"
 #include "XML/Layering.h"
 #include "XML/Utilities.h"
+
 #include "Acts/Plugins/DD4hep/ActsExtension.hpp"
-#include "Acts/Surfaces/PlanarBounds.hpp"
-#include "Acts/Surfaces/RectangleBounds.hpp"
-#include "Acts/Surfaces/TrapezoidBounds.hpp"
-#include "Acts/Definitions/Units.hpp"
+#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp"
 
 
 using namespace std;
@@ -62,9 +60,18 @@ static Ref_t create_BarrelTrackerWithFrame(Detector& description, xml_h e, Sensi
   PlacedVolume           pv;
   dd4hep::xml::Dimension dimensions(x_det.dimensions());
 
-  Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
-  detWorldExt->addType("barrel", "detector");
-  sdet.addExtension<Acts::ActsExtension>(detWorldExt);
+  // ACTS extension
+  {
+    Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
+    detWorldExt->addType("barrel", "detector");
+    // Add the volume boundary material if configured
+    for (xml_coll_t bmat(x_det, _Unicode(boundary_material)); bmat; ++bmat) {
+      xml_comp_t x_boundary_material = bmat;
+      Acts::xmlToProtoSurfaceMaterial(x_boundary_material, *detWorldExt, "boundary_material");
+    }
+    sdet.addExtension<Acts::ActsExtension>(detWorldExt);
+  }
+
   Tube topVolumeShape(dimensions.rmin(), dimensions.rmax(), dimensions.length() * 0.5);
   Volume assembly(det_name,topVolumeShape,air);
 
@@ -238,19 +245,22 @@ static Ref_t create_BarrelTrackerWithFrame(Detector& description, xml_h e, Sensi
     double      z_dr       = z_layout.dr();       // Radial displacement parameter, of every other module.
 
     Volume      module_env = volumes[m_nam];
-    DetElement  lay_elt(sdet, _toString(x_layer.id(), "layer%d"), lay_id);
+    DetElement  lay_elt(sdet, lay_nam, lay_id);
     Placements& sensVols = sensitives[m_nam];
 
     // the local coordinate systems of modules in dd4hep and acts differ
     // see http://acts.web.cern.ch/ACTS/latest/doc/group__DD4hepPlugins.html
-    Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
-    layerExtension->addType("sensitive cylinder", "layer");
-    //layerExtension->addValue(0, "r_min", "envelope");
-    //layerExtension->addValue(0, "r_max", "envelope");
-    //layerExtension->addValue(0, "z_min", "envelope");
-    //layerExtension->addValue(0, "z_max", "envelope");
-    //layerExtension->addType("axes", "definitions", "XzY");
-    lay_elt.addExtension<Acts::ActsExtension>(layerExtension);
+    {
+      Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
+      // layer is simple tube so no need to set envelope
+      layerExtension->addType("sensitive cylinder", "layer");
+      // Add the proto layer material
+      for(xml_coll_t lmat(x_layer, _Unicode(layer_material)); lmat; ++lmat) {
+        xml_comp_t x_layer_material = lmat;
+        xmlToProtoSurfaceMaterial(x_layer_material, *layerExtension, "layer_material");
+      }
+      lay_elt.addExtension<Acts::ActsExtension>(layerExtension);
+    }
 
     // Z increment for module placement along Z axis.
     // Adjust for z0 at center of module rather than
@@ -282,9 +292,12 @@ static Ref_t create_BarrelTrackerWithFrame(Detector& description, xml_h e, Sensi
           PlacedVolume sens_pv = sensVols[ic];
           DetElement comp_de(mod_elt, std::string("de_") + sens_pv.volume().name(), module);
           comp_de.setPlacement(sens_pv);
-          Acts::ActsExtension* sensorExtension = new Acts::ActsExtension();
-          //sensorExtension->addType("sensor", "detector");
-          comp_de.addExtension<Acts::ActsExtension>(sensorExtension);
+          // ACTS extension
+          {
+            Acts::ActsExtension* sensorExtension = new Acts::ActsExtension();
+            //sensorExtension->addType("sensor", "detector");
+            comp_de.addExtension<Acts::ActsExtension>(sensorExtension);
+          }
           //comp_de.setAttributes(description, sens_pv.volume(), x_layer.regionStr(), x_layer.limitsStr(),
           //                      xml_det_t(xmleles[m_nam]).visStr());
           //
diff --git a/src/TrapEndcapTracker_geo.cpp b/src/TrapEndcapTracker_geo.cpp
index f12bf94b..0175c7bd 100644
--- a/src/TrapEndcapTracker_geo.cpp
+++ b/src/TrapEndcapTracker_geo.cpp
@@ -16,7 +16,7 @@
 #include "XML/Layering.h"
 
 #include "Acts/Plugins/DD4hep/ActsExtension.hpp"
-#include "Acts/Definitions/Units.hpp"
+#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp"
 
 using namespace std;
 using namespace dd4hep;
@@ -50,9 +50,21 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
   PlacedVolume            pv;
 
 
-  Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
-  detWorldExt->addType("endcap", "detector");
-  sdet.addExtension<Acts::ActsExtension>(detWorldExt);
+  // ACTS extension
+  {
+    Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
+    detWorldExt->addType("endcap", "detector");
+    // SJJ probably need to set the envelope here, as ACTS can't figure
+    // that out for Assembly volumes. May also need binning to properly pick up
+    // on the support material @TODO
+    //
+    // Add the volume boundary material if configured
+    for (xml_coll_t bmat(x_det, _Unicode(boundary_material)); bmat; ++bmat) {
+      xml_comp_t x_boundary_material = bmat;
+      Acts::xmlToProtoSurfaceMaterial(x_boundary_material, *detWorldExt, "boundary_material");
+    }
+    sdet.addExtension<Acts::ActsExtension>(detWorldExt);
+  }
 
   assembly.setVisAttributes(description.invisible());
   sens.setType("tracker");
@@ -233,12 +245,18 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     }
     DetElement layer_element(sdet, layer_name, l_id);
     layer_element.setPlacement(layer_pv);
-    Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
-    layerExtension->addType("layer", "layer");
-    //layerExtension->addType("axes", "definitions", "XZY");
-    //layerExtension->addType("sensitive disk", "layer");
-    //layerExtension->addType("axes", "definitions", "XZY");
-    layer_element.addExtension<Acts::ActsExtension>(layerExtension);
+    // ACTS extension
+    {
+      Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
+      // layer is simple tube so no need to set envelope
+      layerExtension->addType("layer", "layer");
+      // Add the proto layer material
+      for (xml_coll_t lmat(x_layer, _Unicode(layer_material)); lmat; ++lmat) {
+        xml_comp_t x_layer_material = lmat;
+        xmlToProtoSurfaceMaterial(x_layer_material, *layerExtension, "layer_material");
+      }
+      layer_element.addExtension<Acts::ActsExtension>(layerExtension);
+    }
 
     for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) {
       xml_comp_t  x_ring   = ri;
-- 
GitLab