From 81bc380bda3c24fb5bdc38c6e414eb45a35ebf2b Mon Sep 17 00:00:00 2001
From: Chengdong Fu <fucd@ihep.ac.cn>
Date: Thu, 12 Nov 2020 20:24:40 +0800
Subject: [PATCH] change global volume to envelope

---
 Detector/DetDriftChamber/compact/det.xml      |  8 ++++++++
 .../src/driftchamber/DriftChamber.cpp         | 19 ++++++++++++-------
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml
index f6d0a84d..f588fd48 100644
--- a/Detector/DetDriftChamber/compact/det.xml
+++ b/Detector/DetDriftChamber/compact/det.xml
@@ -52,6 +52,14 @@
 
   <detectors>
     <detector id="1" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true">
+      <envelope vis="SeeThrough">
+        <shape type="BooleanShape" operation="Union" material="Air">
+          <shape type="Tube" rmin="SDT_inner_chamber_radius_min" rmax="SDT_inner_chamber_radius_max" dz="SDT_half_length" />
+          <shape type="Tube" rmin="SDT_outer_chamber_radius_min" rmax="SDT_outer_chamber_radius_max" dz="SDT_half_length" />
+        </shape>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/>
       <!-- Use cm as unit if you want to use Pandora for reconstruction -->
      <sensitive type="SimpleDriftChamber"/>
      </detector>
diff --git a/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp b/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
index 144dd7dd..79df65c4 100644
--- a/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
+++ b/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
@@ -68,13 +68,17 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
 
     dd4hep::DetElement sdet(det_name, x_det.id());
 
-    dd4hep::Volume motherVol = theDetector.pickMotherVolume(sdet);
+    Volume envelope = dd4hep::xml::createPlacedEnvelope( theDetector,  e , sdet ) ;
+
+    dd4hep::xml::setDetectorTypeFlag( e, sdet ) ;
+
+    if( theDetector.buildType() == BUILD_ENVELOPE ) return sdet ;
+
 
     dd4hep::Material det_mat(theDetector.material("Air"));
 
     // - global
-    dd4hep::Tube det_solid(chamber_radius_min, chamber_radius_max, chamber_length*0.5);
-    dd4hep::Volume det_vol(det_name+"_vol", det_solid, det_mat);
+    Assembly det_vol( det_name+"_assembly" ) ;
 
     // - inner
     dd4hep::Tube det_inner_chamber_solid(inner_chamber_radius_min, inner_chamber_radius_max, inner_chamber_length*0.5);
@@ -141,6 +145,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
             dd4hep::Position(0,0,0));
      dd4hep::PlacedVolume det_inner_chamber_phy = det_vol.placeVolume(det_inner_chamber_vol,
             transform_inner_chamber);
+     
      det_inner_chamber_phy.addPhysVolID("chamber", 0);
 
     // outer
@@ -148,19 +153,19 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
             dd4hep::Position(0,0,0));
     dd4hep::PlacedVolume det_outer_chamber_phy = det_vol.placeVolume(det_outer_chamber_vol,
             transform_inner_chamber);
+    
     det_outer_chamber_phy.addPhysVolID("chamber", 1);
 
     // - place in world
     dd4hep::Transform3D transform(dd4hep::Rotation3D(),
             dd4hep::Position(0,0,0));
-    dd4hep::PlacedVolume phv = motherVol.placeVolume(det_vol,transform);
-
+    dd4hep::PlacedVolume phv = envelope.placeVolume(det_vol,transform); 
 
     if ( x_det.hasAttr(_U(id)) )  {
         phv.addPhysVolID("system",x_det.id());
     }
-
-    sdet.setPlacement(phv);
+    DetElement assDE( sdet , det_name+"_assembly" , x_det.id() )  ;
+    assDE.setPlacement(phv);
 
     MYDEBUG("Build Detector Drift Chamber successfully.");
     return sdet;
-- 
GitLab