Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:28:29

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022-2025 Simon Gardner
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 // Low Q2 tagger trackers
0012 //////////////////////////////////////////////////
0013 
0014 using namespace std;
0015 using namespace dd4hep;
0016 using namespace dd4hep::rec;
0017 
0018 // Helper function to make the tagger tracker detectors
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   // Create an Assembly to hold all modules
0033   Assembly taggerAssembly("BackwardsTaggerAssembly");
0034 
0035   // Add Tagger stations (modules) to the Assembly
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     // Size of the actual tagger box, replicated in BackwardsTagger
0041     xml_dim_t pos = mod.child(_U(position));
0042     xml_dim_t rot = mod.child(_U(rotation));
0043 
0044     // Create a DetElement for the module
0045     DetElement moddet(det, moduleName, moduleID);
0046 
0047     // Create an Assembly for the module contents
0048     Assembly moduleAssembly(moduleName + "_assembly");
0049 
0050     // Fill the module assembly with tagger layers
0051     Make_Tagger(desc, mod, moduleAssembly, moddet, sens);
0052 
0053     // Place the module assembly into the taggerAssembly at the specified position/rotation
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   // Place the taggerAssembly into the mother volume
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   // Add Hodoscope layers
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)