From 98d9b29eca6f00dc026d9e22b2f05cbdee18e179 Mon Sep 17 00:00:00 2001
From: Frank Gaede <frank.gaede@desy.de>
Date: Mon, 7 Apr 2014 08:35:13 +0000
Subject: [PATCH]  - create complete hierarchy of DetElements for VXD  - add
 surfaces to sensitive volumes

---
 examples/ILDExDet/src/ILDExVXD_geo.cpp | 55 +++++++++++++++++++++++---
 1 file changed, 49 insertions(+), 6 deletions(-)

diff --git a/examples/ILDExDet/src/ILDExVXD_geo.cpp b/examples/ILDExDet/src/ILDExVXD_geo.cpp
index 4f1168850..de57127e8 100644
--- a/examples/ILDExDet/src/ILDExVXD_geo.cpp
+++ b/examples/ILDExDet/src/ILDExVXD_geo.cpp
@@ -12,9 +12,13 @@
 #include "DDRec/DDGear.h"
 #include "gearimpl/ZPlanarParametersImpl.h"
 
+#include "DDRec/Surface.h"
+
 using namespace std;
 using namespace DD4hep;
 using namespace DD4hep::Geometry;
+using namespace DD4hep::DDRec ;
+using namespace DDSurfaces ;
 
 #define no_split_ladders 0
 
@@ -23,12 +27,12 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
   xml_det_t    x_det = e;
   string       name  = x_det.nameStr();
 
-  //  Assembly     assembly(name+"_assembly");
+  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());
+  //  Volume      assembly ("vxd_envelope_cyl", envelope_cylinder ,lcdd.air());
 
   PlacedVolume pv;
 
@@ -56,6 +60,18 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
     string      layername  = name+_toString(layer_id,"_layer%d");
     double      dphi       = 2.*M_PI/double(nLadders);
 
+
+    // --- create an assembly and DetElement for the layer 
+    // Assembly     layer_assembly( "layer_assembly" +_toString(layer_id,"_%d") );
+    
+    // DetElement   layerDE( vxd , _toString(layer_id,"layer_%d"), x_det.id() );
+    
+    // pv = assembly.placeVolume(  layer_assembly );
+    
+    // layerDE.setPlacement( pv ) ;
+    //--------------------------------
+
+
 #if no_split_ladders
     double      zhalf      = x_ladder.zhalf();
 #else
@@ -84,6 +100,14 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
     Box         sensbox   (sens_thick/2.,  width/2.,   zhalf);
     Volume      sensvol   (layername+"_sens",sensbox,sensmat);
 
+
+    // create a measurement plane for the tracking surface attched to the sensitive volume 
+    Vector3D u( 0. , 1. , 0. ) ;
+    Vector3D v( 0. , 0. , 1. ) ;
+    Vector3D n( 1. , 0. , 0. ) ;
+    //    Vector3D o( 0. , 0. , 0. ) ;
+    VolPlane surf( sensvol , SurfaceType(SurfaceType::Sensitive) , sens_thick/2 + supp_thick/2 , sens_thick/2 , u,v,n ) ; //,o ) ;
+
     Material    suppmat  = lcdd.material(x_support.materialStr());
     Box         suppbox   (supp_thick/2.,width/2.,zhalf);
     Volume      suppvol   (layername+"_supp",suppbox,suppmat);
@@ -138,35 +162,54 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
       
       RotationZYX rot( phi , 0, 0  ) ;
 
+      //=========
+      Assembly&  layer_assembly = assembly ;
+      //=========
+
 
 #if no_split_ladders
 
-      pv = assembly.placeVolume( laddervol,Transform3D( rot, Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
+      pv = layer_assembly.placeVolume( laddervol,Transform3D( rot, Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
 									  (radius + lthick/2.)*sin(phi)  + offset * cos( phi ) ,
 									  0. ) ));
 
       pv.addPhysVolID("layer", layer_id ).addPhysVolID( "module" , j ).addPhysVolID("sensor", 0 )   ;
 
+
+      DetElement   ladderDE( layerDE ,  laddername , x_det.id() );
+      ladderDE.setPlacement( pv ) ;
+
+      ladderDE.addExtension<SurfaceList >(  new SurfaceList ) ; 
+
 #else
 
       // put one wafer at plus z and one at minus z
       
-      pv = assembly.placeVolume( laddervol, Transform3D( rot ,  Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
+      pv = layer_assembly.placeVolume( laddervol, Transform3D( rot ,  Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
 									  (radius + lthick/2.)*sin(phi)  + offset * cos( phi ) ,
 									  zhalf ) ) );
 
       pv.addPhysVolID("layer", layer_id ).addPhysVolID( "module" , j ).addPhysVolID("sensor", 0 ).addPhysVolID("side", 1 )   ;
 
+      //      DetElement   ladderDEposZ( layerDE ,  laddername+"_posZ" , x_det.id() );
+      DetElement   ladderDEposZ( vxd ,  laddername+"_posZ" , x_det.id() );
+      ladderDEposZ.setPlacement( pv ) ;
+
+      volSurfaceList( ladderDEposZ)->push_back( surf ) ;
 
-      pv = assembly.placeVolume( laddervol, Transform3D( rot ,  Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
+      pv = layer_assembly.placeVolume( laddervol, Transform3D( rot ,  Position( (radius + lthick/2.)*cos(phi)  - offset * sin( phi ) ,
 									  (radius + lthick/2.)*sin(phi)  + offset * cos( phi ) ,
 									  -zhalf ) ) );
 
       pv.addPhysVolID("layer", layer_id ).addPhysVolID( "module" , j ).addPhysVolID("sensor", 0 ).addPhysVolID("side", -1 )   ;  ;
 
+      //      DetElement   ladderDEnegZ( layerDE ,  laddername+"_negZ" , x_det.id() );
+      DetElement   ladderDEnegZ( vxd ,  laddername+"_negZ" , x_det.id() );
+      ladderDEnegZ.setPlacement( pv ) ;
+
 #endif
 
-      //pv = assembly.placeVolume( sensvol, pos, rot ) ;
+      //pv = layer_assembly.placeVolume( sensvol, pos, rot ) ;
 
     }
     vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol);
-- 
GitLab