Skip to content
Snippets Groups Projects
cb_VTX_Barrel.cpp 4.13 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jihee Kim's avatar
    Jihee Kim committed
    #include <XML/Helper.h>
    #include "DDRec/Surface.h"
    #include "DDRec/DetectorData.h"
    #include "DD4hep/OpticalSurfaces.h"
    #include "DD4hep/DetFactoryHelper.h"
    #include "DD4hep/Printout.h"
    //////////////////////////////////
    // Central Barrel Vertex Detector
    //////////////////////////////////
    
    using namespace std;
    using namespace dd4hep;
    
    static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
    {
      xml_det_t  x_det      = e;
      string     detName    = x_det.nameStr();
      int        detID      = x_det.id();
    
      xml_dim_t  dim        = x_det.dimensions();
      double     RIn        = dim.rmin();
      double     ROut       = dim.rmax();
      double     SizeZ      = dim.length();
    
      xml_dim_t  pos        = x_det.position();
    
      Material   Vacuum     = desc.material("Vacuum");
    
      // Create Global Volume 
      Tube cb_VTX_Barrel_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg);
      Volume detVol("cb_VTX_Barrel_GVol_Logic", cb_VTX_Barrel_GVol_Solid, Vacuum);
      detVol.setVisAttributes(desc.visAttributes(x_det.visStr()));
    
      //////////////////
      // Barrel Ladder
      //////////////////
      xml_comp_t x_layer = x_det.child(_U(layer));
      const int repeat   = x_layer.repeat();
      
      xml_comp_t x_slice = x_layer.child(_U(slice));
      Material slice_mat = desc.material(x_slice.materialStr());
    
      double x = 0.0 * cm;
      double y = 0.0 * cm;
      double z = 0.0 * cm;
      int FDIV = 0;
      double dR = 0.0;
      double length = 0.0;
      double phi = 0.0;
      // Ladder Layer Parameters
      double lay_Dx[6];
      double lay_Dy[6];
      double lay_Dz[6];
      double lay_Rin[6];
    
      lay_Dx[0] = 0.050 * mm; lay_Dy[0] = 1.0 * cm; lay_Dz[0] = 10.0 * cm; lay_Rin[0] = 3.5 * cm;
      lay_Dx[1] = 0.050 * mm; lay_Dy[1] = 1.0 * cm; lay_Dz[1] = 11.0 * cm; lay_Rin[1] = 4.5 * cm;
      lay_Dx[2] = 0.150 * mm; lay_Dy[2] = 2.0 * cm; lay_Dz[2] = 18.0 * cm; lay_Rin[2] = 6.5 * cm;
      lay_Dx[3] = 0.150 * mm; lay_Dy[3] = 2.0 * cm; lay_Dz[3] = 24.0 * cm; lay_Rin[3] = 10.5 * cm;
      lay_Dx[4] = 0.150 * mm; lay_Dy[4] = 3.0 * cm; lay_Dz[4] = 36.0 * cm; lay_Rin[4] = 13.5 * cm;
      lay_Dx[5] = 0.150 * mm; lay_Dy[5] = 3.0 * cm; lay_Dz[5] = 48.0 * cm; lay_Rin[5] = 15.5 * cm;
    
    Jihee Kim's avatar
    Jihee Kim committed
    
      int i_layer = 0;
      int i_module = 0;
      // Loop over layers
      for(int i = 0; i < repeat; i++) {
        double cb_VTX_Barrel_ladder_DZ = lay_Dz[i];
        double cb_VTX_Barrel_ladder_DY = lay_Dy[i];
        double cb_VTX_Barrel_ladder_Thickness = lay_Dx[i];
        dR = lay_Rin[i]; 
        length = 2.0 * 3.1415 * dR;
        int laddersCount = length / cb_VTX_Barrel_ladder_DY;
    
        for (int i = 0; i < 2; i++) {
          double LN = cb_VTX_Barrel_ladder_DY * laddersCount;
          double LN1 = cb_VTX_Barrel_ladder_DY * (laddersCount + 1.0 + i);
    
          if (LN/LN1 > 0.8)
            laddersCount = laddersCount + 1;
        }
    
        double cb_VTX_Barrel_ladder_deltaphi = 2.0 * 3.1415926 / laddersCount;
    
        string ladderBoxName = detName + _toString(i, "_ladder_Solid_%d");
        string ladderName = detName + _toString(i, "_ladder_Logic_%d");
        Volume ladderVol(ladderName, Box(cb_VTX_Barrel_ladder_Thickness * 0.5, cb_VTX_Barrel_ladder_DY * 0.5, cb_VTX_Barrel_ladder_DZ * 0.5), slice_mat);
        ladderVol.setVisAttributes(desc,x_layer.visStr());
        sens.setType("tracker");
        ladderVol.setSensitiveDetector(sens);
        i_layer++;
    
        for (int ia = 0; ia < laddersCount; ia++) {
          phi = (ia * (cb_VTX_Barrel_ladder_deltaphi));
          x = - dR * cos(phi);
          y = - dR * sin(phi);
    
          RotationZYX ladder_rot = RotationZYX(cb_VTX_Barrel_ladder_deltaphi * ia, 0.0, 0.0);
          Position ladder_pos = Position(x, y, z);
          string ladderName = detName + _toString(i, "_ladder_Phys_%d") + _toString(ia, "_%d"); 
          PlacedVolume ladderPV = detVol.placeVolume(ladderVol, Transform3D(ladder_rot, ladder_pos));
          i_module++;
          ladderPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module);
        }
      }
    
      // TODO: Pixels
    
      DetElement   det(detName, detID);
      Volume       motherVol = desc.pickMotherVolume(det);
      Transform3D  tr(RotationZYX(0.0, 0.0, 0.0), Position(0.0, 0.0, pos.z()));
      PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
      detPV.addPhysVolID("system", detID);
      detPV.addPhysVolID("barrel", 1);
      det.setPlacement(detPV);
      return det;
    }
    
    DECLARE_DETELEMENT(cb_VTX_Barrel, createDetector)