File indexing completed on 2024-06-18 07:05:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
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
0074
0075
0076
0077
0078
0079
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
0088
0089 Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
0090 layerExtension->addType("sensitive disk", "layer");
0091
0092
0093
0094
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
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());
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)