Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-06-18 07:05:22

0001 //==========================================================================
0002 //  AIDA Detector description implementation
0003 //--------------------------------------------------------------------------
0004 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
0005 // All rights reserved.
0006 //
0007 // For the licensing terms see $DD4hepINSTALL/LICENSE.
0008 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
0009 //
0010 // Author     : M.Frank
0011 //
0012 //==========================================================================
0013 //
0014 // Specialized generic detector constructor
0015 //
0016 //==========================================================================
0017 #include "DD4hep/DetFactoryHelper.h"
0018 
0019 #if defined(USE_ACTSDD4HEP)
0020 #include "ActsDD4hep/ActsExtension.hpp"
0021 #include "ActsDD4hep/ConvertMaterial.hpp"
0022 #else
0023 #include "Acts/Plugins/DD4hep/ActsExtension.hpp"
0024 #include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp"
0025 #endif
0026 
0027 using namespace std;
0028 using namespace dd4hep;
0029 using namespace dd4hep::detail;
0030 
0031 static Ref_t SimpleDiskDetector_create_detector(Detector& description, xml_h e, SensitiveDetector sens)
0032 {
0033   xml_det_t      x_det    = e;
0034   Material       air      = description.air();
0035   string         det_name = x_det.nameStr();
0036   bool           reflect  = x_det.reflect();
0037   DetElement     sdet(det_name, x_det.id());
0038   Assembly       assembly(det_name);
0039   PlacedVolume   pv;
0040   int            l_num = 0;
0041   xml::Component pos   = x_det.position();
0042 
0043   Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
0044   detWorldExt->addType("endcap", "detector");
0045   sdet.addExtension<Acts::ActsExtension>(detWorldExt);
0046 
0047   for (xml_coll_t i(x_det, _U(layer)); i; ++i, ++l_num) {
0048     xml_comp_t x_layer    = i;
0049     string     l_nam      = det_name + _toString(l_num, "_layer%d");
0050     double     zmin       = x_layer.inner_z();
0051     double     rmin       = x_layer.inner_r();
0052     double     rmax       = x_layer.outer_r();
0053     double     z          = zmin;
0054     double     layerWidth = 0.;
0055     int        s_num      = 0;
0056 
0057     for (xml_coll_t j(x_layer, _U(slice)); j; ++j) {
0058       double thickness = xml_comp_t(j).thickness();
0059       layerWidth += thickness;
0060     }
0061     Tube   l_tub(rmin, rmax, layerWidth/2.0, 2 * M_PI);
0062     Volume l_vol(l_nam, l_tub, air);
0063     l_vol.setVisAttributes(description, x_layer.visStr());
0064     DetElement layer;
0065     PlacedVolume layer_pv;
0066     if (!reflect) {
0067       layer = DetElement(sdet, l_nam + "_pos", l_num);
0068       layer_pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.));
0069       layer_pv.addPhysVolID("barrel", 3).addPhysVolID("layer", l_num);
0070       layer.setPlacement(layer_pv);
0071       Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
0072       layerExtension->addType("sensitive disk", "layer");
0073       //layerExtension->addType("axes", "definitions", "XzY");
0074       // need all four of these or else it is ignored.
0075       //layerExtension->addValue(0, "r_min", "envelope");
0076       //layerExtension->addValue(0, "r_max", "envelope");
0077       //layerExtension->addValue(0, "z_min", "envelope");
0078       //layerExtension->addValue(0, "z_max", "envelope");
0079       // layerExtension->addType("axes", "definitions", "XZY");
0080 
0081       layer.addExtension<Acts::ActsExtension>(layerExtension);
0082     } else {
0083       layer = DetElement(sdet, l_nam + "_neg", l_num);
0084       layer_pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2)));
0085       layer_pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_num);
0086       layer.setPlacement(layer_pv);
0087       // DetElement layerR = layer.clone(l_nam+"_neg");
0088       // sdet.add(layerR.setPlacement(pv));
0089       Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
0090       layerExtension->addType("sensitive disk", "layer");
0091       //layerExtension->addValue(0, "r_min", "envelope");
0092       //layerExtension->addValue(0, "r_max", "envelope");
0093       //layerExtension->addValue(0, "z_min", "envelope");
0094       //layerExtension->addValue(0, "z_max", "envelope");
0095       layer.addExtension<Acts::ActsExtension>(layerExtension);
0096     }
0097 
0098     double tot_thickness = -layerWidth / 2.0;
0099     for (xml_coll_t j(x_layer, _U(slice)); j; ++j, ++s_num) {
0100       xml_comp_t x_slice = j;
0101       double     thick   = x_slice.thickness();
0102       Material   mat     = description.material(x_slice.materialStr());
0103       string     s_nam   = l_nam + _toString(s_num, "_slice%d");
0104       Volume     s_vol(s_nam, Tube(rmin, rmax, thick/2.0), mat);
0105       if(!reflect){
0106         s_nam += "_pos";
0107       } else {
0108         s_nam += "_neg";
0109       }
0110       DetElement slice_de(layer, s_nam , s_num);
0111       if (x_slice.isSensitive()) {
0112         sens.setType("tracker");
0113         s_vol.setSensitiveDetector(sens);
0114         Acts::ActsExtension* sensorExtension = new Acts::ActsExtension();
0115         //sensorExtension->addType("sensor", "detector");
0116         slice_de.addExtension<Acts::ActsExtension>(sensorExtension);
0117       }
0118       s_vol.setAttributes(description, x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr());
0119       pv = l_vol.placeVolume(s_vol, Position(0, 0, tot_thickness + thick / 2));
0120       pv.addPhysVolID("slice", s_num);
0121       slice_de.setPlacement(pv);
0122       tot_thickness = tot_thickness + thick;
0123     }
0124 
0125   }
0126   if (x_det.hasAttr(_U(combineHits))) {
0127     sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
0128   }
0129   pv = description.pickMotherVolume(sdet).placeVolume(assembly, Position(pos.x(), pos.y(), pos.z()));
0130   pv.addPhysVolID("system", x_det.id()); // Set the subdetector system ID.
0131   sdet.setPlacement(pv);
0132   return sdet;
0133 }
0134 
0135 DECLARE_DETELEMENT(ref_SolenoidEndcap, SimpleDiskDetector_create_detector)
0136 DECLARE_DETELEMENT(athena_SolenoidEndcap, SimpleDiskDetector_create_detector)