From e8ce105bc965458f3dda6e178321930d026b2b82 Mon Sep 17 00:00:00 2001 From: Whitney Armstrong <warmstrong@anl.gov> Date: Fri, 21 May 2021 02:05:55 -0500 Subject: [PATCH] modified: src/TrapEndcapTracker_geo.cpp --- src/TrapEndcapTracker_geo.cpp | 207 +++++++++++++++++----------------- 1 file changed, 104 insertions(+), 103 deletions(-) diff --git a/src/TrapEndcapTracker_geo.cpp b/src/TrapEndcapTracker_geo.cpp index 30251db..e7071df 100644 --- a/src/TrapEndcapTracker_geo.cpp +++ b/src/TrapEndcapTracker_geo.cpp @@ -22,121 +22,122 @@ using namespace dd4hep; using namespace dd4hep::detail; static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) { - typedef vector<PlacedVolume> Placements; - xml_det_t x_det = e; - Material vacuum = description.vacuum(); - int det_id = x_det.id(); - string det_name = x_det.nameStr(); - bool reflect = x_det.reflect(false); - DetElement sdet(det_name, det_id); - Assembly assembly(det_name); - // Volume assembly (det_name,Box(10000,10000,10000),vacuum); - Volume motherVol = description.pickMotherVolume(sdet); - int m_id = 0, c_id = 0, n_sensor = 0; - map<string, Volume> modules; - map<string, Placements> sensitives; - PlacedVolume pv; + typedef vector<PlacedVolume> Placements; + xml_det_t x_det = e; + Material vacuum = description.vacuum(); + int det_id = x_det.id(); + string det_name = x_det.nameStr(); + bool reflect = x_det.reflect(false); + DetElement sdet(det_name, det_id); + Assembly assembly(det_name); + Volume motherVol = description.pickMotherVolume(sdet); + int m_id = 0, c_id = 0, n_sensor = 0; + map<string, Volume> modules; + map<string, Placements> sensitives; + PlacedVolume pv; - assembly.setVisAttributes(description.invisible()); - sens.setType("tracker"); + assembly.setVisAttributes(description.invisible()); + sens.setType("tracker"); - for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) { - xml_comp_t x_mod = mi; - string m_nam = x_mod.nameStr(); - xml_comp_t trd = x_mod.trd(); - double posY; - double x1 = trd.x1(); - double x2 = trd.x2(); - double z = trd.z(); - double y1, y2, total_thickness = 0.; - xml_coll_t ci(x_mod, _U(module_component)); - for (ci.reset(), total_thickness = 0.0; ci; ++ci) total_thickness += xml_comp_t(ci).thickness(); + // Loop over and build modules + for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) { + xml_comp_t x_mod = mi; + string m_nam = x_mod.nameStr(); + xml_comp_t trd = x_mod.trd(); + double posY; + double x1 = trd.x1(); + double x2 = trd.x2(); + double z = trd.z(); + double y1, y2, total_thickness = 0.; + xml_coll_t ci(x_mod, _U(module_component)); + for (ci.reset(), total_thickness = 0.0; ci; ++ci) + total_thickness += xml_comp_t(ci).thickness(); - y1 = y2 = total_thickness / 2; - Volume m_volume(m_nam, Trapezoid(x1, x2, y1, y2, z), vacuum); - m_volume.setVisAttributes(description.visAttributes(x_mod.visStr())); + y1 = y2 = total_thickness / 2; + Volume m_volume(m_nam, Trapezoid(x1, x2, y1, y2, z), vacuum); + m_volume.setVisAttributes(description.visAttributes(x_mod.visStr())); - for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) { - xml_comp_t c = ci; - double c_thick = c.thickness(); - auto comp_x1 = getAttrOrDefault(c, _Unicode(x1), x1); - auto comp_x2 = getAttrOrDefault(c, _Unicode(x2), x2); - auto comp_height = getAttrOrDefault(c, _Unicode(height), z); + for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) { + xml_comp_t c = ci; + double c_thick = c.thickness(); + auto comp_x1 = getAttrOrDefault(c, _Unicode(x1), x1); + auto comp_x2 = getAttrOrDefault(c, _Unicode(x2), x2); + auto comp_height = getAttrOrDefault(c, _Unicode(height), z); - Material c_mat = description.material(c.materialStr()); - string c_name = _toString(c_id, "component%d"); - Volume c_vol(c_name, Trapezoid(comp_x1, comp_x2, c_thick / 2e0, c_thick / 2e0, comp_height), c_mat); + Material c_mat = description.material(c.materialStr()); + string c_name = _toString(c_id, "component%d"); + Volume c_vol(c_name, Trapezoid(comp_x1, comp_x2, c_thick / 2e0, c_thick / 2e0, comp_height), c_mat); - c_vol.setVisAttributes(description.visAttributes(c.visStr())); - pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0)); - if (c.isSensitive()) { - sdet.check(n_sensor > 2, - "SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!"); - pv.addPhysVolID("sensor", n_sensor); - c_vol.setSensitiveDetector(sens); - sensitives[m_nam].push_back(pv); - ++n_sensor; - } - posY += c_thick; - } - modules[m_nam] = m_volume; + c_vol.setVisAttributes(description.visAttributes(c.visStr())); + pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0)); + if (c.isSensitive()) { + sdet.check(n_sensor > 2, "SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!"); + pv.addPhysVolID("sensor", n_sensor); + c_vol.setSensitiveDetector(sens); + sensitives[m_nam].push_back(pv); + ++n_sensor; + } + posY += c_thick; } + // Modules are stored here + modules[m_nam] = m_volume; + } - for (xml_coll_t li(x_det, _U(layer)); li; ++li) { - xml_comp_t x_layer(li); - int l_id = x_layer.id(); - int mod_num = 1; - for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) { - xml_comp_t x_ring = ri; - double r = x_ring.r(); - double phi0 = x_ring.phi0(0); - double zstart = x_ring.zstart(); - double dz = x_ring.dz(0); - int nmodules = x_ring.nmodules(); - string m_nam = x_ring.moduleStr(); - Volume m_vol = modules[m_nam]; - double iphi = 2 * M_PI / nmodules; - double phi = phi0; - Placements& sensVols = sensitives[m_nam]; + // Construct each layer + for (xml_coll_t li(x_det, _U(layer)); li; ++li) { + xml_comp_t x_layer(li); + int l_id = x_layer.id(); + int mod_num = 1; + for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) { + xml_comp_t x_ring = ri; + double r = x_ring.r(); + double phi0 = x_ring.phi0(0); + double zstart = x_ring.zstart(); + double dz = x_ring.dz(0); + int nmodules = x_ring.nmodules(); + string m_nam = x_ring.moduleStr(); + Volume m_vol = modules[m_nam]; + double iphi = 2 * M_PI / nmodules; + double phi = phi0; + Placements& sensVols = sensitives[m_nam]; - for (int k = 0; k < nmodules; ++k) { - string m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d"); - double x = -r * std::cos(phi); - double y = -r * std::sin(phi); - DetElement module(sdet, m_base + "_pos", det_id); - pv = assembly.placeVolume(m_vol, Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2), - Position(x, y, zstart + dz))); - pv.addPhysVolID("barrel", 1).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num); - module.setPlacement(pv); - for (size_t ic = 0; ic < sensVols.size(); ++ic) { - PlacedVolume sens_pv = sensVols[ic]; - DetElement comp_elt(module, sens_pv.volume().name(), mod_num); - comp_elt.setPlacement(sens_pv); - } + for (int k = 0; k < nmodules; ++k) { + string m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d"); + double x = -r * std::cos(phi); + double y = -r * std::sin(phi); + DetElement module(sdet, m_base + "_pos", det_id); + pv = assembly.placeVolume(m_vol, + Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, zstart + dz))); + pv.addPhysVolID("barrel", 1).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num); + module.setPlacement(pv); + for (size_t ic = 0; ic < sensVols.size(); ++ic) { + PlacedVolume sens_pv = sensVols[ic]; + DetElement comp_elt(module, sens_pv.volume().name(), mod_num); + comp_elt.setPlacement(sens_pv); + } - if (reflect) { - pv = - assembly.placeVolume(m_vol, Transform3D(RotationZYX(M_PI, -M_PI / 2 - phi, -M_PI / 2), - Position(x, y, -zstart - dz))); - pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num); - DetElement r_module(sdet, m_base + "_neg", det_id); - r_module.setPlacement(pv); - for (size_t ic = 0; ic < sensVols.size(); ++ic) { - PlacedVolume sens_pv = sensVols[ic]; - DetElement comp_elt(r_module, sens_pv.volume().name(), mod_num); - comp_elt.setPlacement(sens_pv); - } - } - dz = -dz; - phi += iphi; - ++mod_num; - } + if (reflect) { + pv = assembly.placeVolume( + m_vol, Transform3D(RotationZYX(M_PI, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, -zstart - dz))); + pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num); + DetElement r_module(sdet, m_base + "_neg", det_id); + r_module.setPlacement(pv); + for (size_t ic = 0; ic < sensVols.size(); ++ic) { + PlacedVolume sens_pv = sensVols[ic]; + DetElement comp_elt(r_module, sens_pv.volume().name(), mod_num); + comp_elt.setPlacement(sens_pv); + } } + dz = -dz; + phi += iphi; + ++mod_num; + } } - pv = motherVol.placeVolume(assembly); - pv.addPhysVolID("system", det_id); - sdet.setPlacement(pv); - return sdet; + } + pv = motherVol.placeVolume(assembly); + pv.addPhysVolID("system", det_id); + sdet.setPlacement(pv); + return sdet; } // clang-format off -- GitLab