File indexing completed on 2025-12-16 09:28:29
0001
0002
0003
0004 #include "DD4hep/DetFactoryHelper.h"
0005 #include "DD4hep/OpticalSurfaces.h"
0006 #include "DD4hep/Printout.h"
0007 #include "DDRec/DetectorData.h"
0008 #include "DDRec/Surface.h"
0009
0010
0011
0012
0013
0014 using namespace std;
0015 using namespace dd4hep;
0016 using namespace dd4hep::rec;
0017
0018
0019 static void Make_Tagger(Detector& desc, xml_coll_t& mod, Assembly& env, DetElement modElement,
0020 SensitiveDetector& sens);
0021
0022 static Ref_t create_detector(Detector& desc, xml_h e, SensitiveDetector sens) {
0023
0024 xml_det_t x_det = e;
0025 string detName = x_det.nameStr();
0026 int detID = x_det.id();
0027
0028 DetElement det(detName, detID);
0029
0030 string vis_name = dd4hep::getAttrOrDefault<std::string>(x_det, _Unicode(vis), "BackwardsBox");
0031
0032
0033 Assembly taggerAssembly("BackwardsTaggerAssembly");
0034
0035
0036 for (xml_coll_t mod(x_det, _Unicode(module)); mod; ++mod) {
0037 int moduleID = dd4hep::getAttrOrDefault<int>(mod, _Unicode(id), 0);
0038 string moduleName = dd4hep::getAttrOrDefault<std::string>(mod, _Unicode(name), "Tagger0");
0039
0040
0041 xml_dim_t pos = mod.child(_U(position));
0042 xml_dim_t rot = mod.child(_U(rotation));
0043
0044
0045 DetElement moddet(det, moduleName, moduleID);
0046
0047
0048 Assembly moduleAssembly(moduleName + "_assembly");
0049
0050
0051 Make_Tagger(desc, mod, moduleAssembly, moddet, sens);
0052
0053
0054 PlacedVolume pv_mod = taggerAssembly.placeVolume(
0055 moduleAssembly, Transform3D(RotationY(rot.y()), Position(pos.x(), pos.y(), pos.z())));
0056 pv_mod.addPhysVolID("module", moduleID);
0057 moddet.setPlacement(pv_mod);
0058 }
0059
0060
0061 Volume motherVol = desc.pickMotherVolume(det);
0062 PlacedVolume pv_tagger = motherVol.placeVolume(taggerAssembly, Position(0, 0, 0));
0063 pv_tagger.addPhysVolID("system", detID);
0064 det.setPlacement(pv_tagger);
0065
0066 return det;
0067 }
0068
0069 static void Make_Tagger(Detector& desc, xml_coll_t& mod, Assembly& env, DetElement modElement,
0070 SensitiveDetector& sens) {
0071
0072 sens.setType("tracker");
0073
0074 Material Silicon = desc.material("Silicon");
0075
0076 xml_dim_t moddim = mod.child(_Unicode(dimensions));
0077 double tag_w = moddim.x() / 2;
0078 double tag_h = moddim.y() / 2;
0079
0080
0081 int N_layers = 0;
0082 for (xml_coll_t lay(mod, _Unicode(trackLayer)); lay; ++lay, ++N_layers) {
0083
0084 int layerID = dd4hep::getAttrOrDefault<int>(lay, _Unicode(id), 0);
0085 string layerType = dd4hep::getAttrOrDefault<std::string>(lay, _Unicode(type), "timepix");
0086 string layerVis =
0087 dd4hep::getAttrOrDefault<std::string>(lay, _Unicode(vis), "FFTrackerLayerVis");
0088 double layerRot = dd4hep::getAttrOrDefault<double>(lay, _Unicode(angle), 0);
0089 double layerZ = dd4hep::getAttrOrDefault<double>(lay, _Unicode(z), 0 * mm);
0090 double layerThickness =
0091 dd4hep::getAttrOrDefault<double>(lay, _Unicode(sensor_thickness), 200 * um);
0092
0093 RotationY rotate(layerRot);
0094
0095 Box Layer_Box(tag_w, tag_h, layerThickness / 2);
0096 Volume layVol("Tagger_tracker_layer", Layer_Box, Silicon);
0097 layVol.setSensitiveDetector(sens);
0098 layVol.setVisAttributes(desc.visAttributes(layerVis));
0099
0100 PlacedVolume pv_layer =
0101 env.placeVolume(layVol, Transform3D(rotate, Position(0, 0, layerZ - layerThickness / 2)));
0102 pv_layer.addPhysVolID("layer", layerID);
0103
0104 DetElement laydet(modElement, "layerName" + std::to_string(layerID), layerID);
0105 laydet.setPlacement(pv_layer);
0106 }
0107 }
0108
0109 DECLARE_DETELEMENT(BackwardsTagger, create_detector)