Skip to content
Snippets Groups Projects
ci_GEM.cpp 2.22 KiB
Newer Older
Whitney Armstrong's avatar
Whitney Armstrong committed
#include <XML/Helper.h>
///////////////////////////
// Central Ion GEM
///////////////////////////

using namespace dd4hep;

static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens)
{

  xml::DetElement detElem   = handle;
  std::string     detName   = detElem.nameStr();
  int             detID     = detElem.id();
  xml::Component  dims      = detElem.dimensions();
  xml::Component  pos       = detElem.position();
  double          SizeZ     = dims.z_length(); // Size in Z direction
  double          ROut      = dims.rmax();     // Outer radius
  double          RIn       = dims.rmin();     // Inner radius
  double          ShiftZ    = dims.z_offset();
  double          X         = dims.x();
  double          Z         = dims.z();
  int             Nlayers   = dims.number();
  double          HCAL_rmin = dims.rmax1(); // Maximum radius that the layer can be
  Material        mat       = desc.material(detElem.materialStr());
  Material        vac       = desc.material("Vacuum");

  // Outer Volume
  Tube   ci_GEM_GVol_Solid(RIn, ROut, SizeZ / 2., 0., 360 * deg);
  Volume detVol("ci_GEM_GVol_Logic", ci_GEM_GVol_Solid, vac);

  // Adding layers to placed volume
  for (xml_coll_t li(detElem, _U(layer)); li; ++li) {
    xml_comp_t  x_layer    = li;
    std::string layer_name = detName + _toString(x_layer.id(), "_layer%d");
    double      outer_r    = x_layer.outer_r();
    if (outer_r > HCAL_rmin) {
      outer_r = HCAL_rmin;
    }

    Volume layer_vol(layer_name, Tube(x_layer.inner_r(), outer_r, x_layer.dz()), mat);
    layer_vol.setVisAttributes(desc.visAttributes(detElem.visStr()));
    sens.setType("tracker");
    layer_vol.setSensitiveDetector(sens);
    Position     layer_pos(0, 0, x_layer.z());
    PlacedVolume layer_phv = detVol.placeVolume(layer_vol, layer_pos);
    layer_phv.addPhysVolID("layer", x_layer.id());
  }

  DetElement   det(detName, detID);
  Volume       motherVol = desc.pickMotherVolume(det);
  Transform3D  tr(RotationZYX(0.0, 0.0, 0.0), Position(pos.x(), pos.x(), pos.z() + SizeZ / 2.0));
  PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
  detPV.addPhysVolID("system", detID);
  det.setPlacement(detPV);

  return det;
}
// clang-format off
DECLARE_DETELEMENT(ci_GEM, createDetector)