Skip to content
Snippets Groups Projects
cb_DIRC.cpp 2.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "DD4hep/DetFactoryHelper.h"
    #include "DD4hep/OpticalSurfaces.h"
    #include "DD4hep/Printout.h"
    #include "DDRec/DetectorData.h"
    #include "DDRec/Surface.h"
    #include <XML/Helper.h>
    //////////////////////////////////
    // Central Barrel DIRC
    //////////////////////////////////
    
    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();
      xml_dim_t pos   = x_det.position();
      double    RIn   = dim.rmin();
      double    ROut  = dim.rmax();
      double    SizeZ = dim.length();
    
      Material Vacuum = desc.material("Vacuum");
      Tube     cb_DIRC_Barrel_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg);
      Volume   detVol("cb_DIRC_GVol_Solid_Logic", cb_DIRC_Barrel_GVol_Solid, Vacuum);
      detVol.setVisAttributes(desc.invisible());
    
      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);
    
      //////////////////
      // DIRC Bars
      //////////////////
    
      double dR = 83.65 * cm;
    
      double cb_DIRC_bars_DZ = SizeZ;
      double cb_DIRC_bars_DY = 42. * cm;
      double cb_DIRC_bars_DX = 1.7 * cm;
      double myL             = 2 * M_PI * dR;
      int    NUM             = myL / cb_DIRC_bars_DY;
    
      double cb_DIRC_bars_deltaphi = 2 * 3.1415926 / NUM;
    
      Material cb_DIRC_bars_Material = desc.material("Quartz");
    
      Box    cb_DIRC_bars_Solid(cb_DIRC_bars_DX / 2., cb_DIRC_bars_DY / 2., cb_DIRC_bars_DZ / 2.);
      Volume cb_DIRC_bars_Logic("cb_DIRC_bars_Logix", cb_DIRC_bars_Solid, cb_DIRC_bars_Material);
      cb_DIRC_bars_Logic.setVisAttributes(desc.visAttributes(x_det.visStr()));
      sens.setType("photoncounter");
      cb_DIRC_bars_Logic.setSensitiveDetector(sens);
    
      for (int ia = 0; ia < NUM; ia++) {
        double phi = (ia * (cb_DIRC_bars_deltaphi));
        double x   = -dR * cos(phi);
        double y   = -dR * sin(phi);
    
        Transform3D  tr(RotationZ(cb_DIRC_bars_deltaphi * ia), Position(x, y, 0));
        PlacedVolume barPV = detVol.placeVolume(cb_DIRC_bars_Logic, tr);
        barPV.addPhysVolID("module", ia);
      }
      return det;
    }
    
    DECLARE_DETELEMENT(cb_DIRC, createDetector)