diff --git a/compact/definitions.xml b/compact/definitions.xml index 77909ff0f4060ea93d32ab942e6762e897f62156..2b70bbe77401932f5b5f22ed19d6fa14f23b5c54 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -373,15 +373,15 @@ </comment> <constant name="VertexTrackerBarrel_rmin" value="Beampipe_rmax+5.0*mm"/> <constant name="VertexTrackerBarrel_rmax" value="150.0*mm"/> - <constant name="VertexTrackerBarrel_length" value="400.0*mm"/> + <constant name="VertexTrackerBarrel_length" value="300.0*mm"/> <constant name="VertexTrackerBarrel_zmax" value="VertexTrackerBarrel_length/2.0"/> <constant name="VertexTrackerEndcapP_rmax" value="VertexTrackerBarrel_rmax"/> <constant name="VertexTrackerEndcapN_rmax" value="VertexTrackerBarrel_rmax"/> <constant name="VertexTrackerEndcapP_rmin" value="VertexTrackerBarrel_rmin"/> <constant name="VertexTrackerEndcapN_rmin" value="VertexTrackerBarrel_rmin"/> - <constant name="VertexTrackerEndcapP_zmax" value="600.0*mm"/> - <constant name="VertexTrackerEndcapN_zmax" value="600.0*mm"/> + <constant name="VertexTrackerEndcapP_zmax" value="500.0*mm/2.0"/> + <constant name="VertexTrackerEndcapN_zmax" value="500.0*mm/2.0"/> <comment> Vertex Tracking Region diff --git a/compact/vertex_tracker.xml b/compact/vertex_tracker.xml index 5258b5a4aa86a7e81af30d891a752d77309eaed6..e068d2e8d235765429b3cdf2bc7abb2332ab1a02 100644 --- a/compact/vertex_tracker.xml +++ b/compact/vertex_tracker.xml @@ -2,16 +2,16 @@ <lccdd> <define> - <constant name="ITS3Thickness" value="0.03*mm"/> - <constant name="VertexBarrel_rmin1" value="3.3*cm"/> - <constant name="VertexBarrel_rmin2" value="5.7*cm"/> + <constant name="ITS3Thickness" value="0.03*mm"/> + <constant name="VertexBarrel_rmin1" value="3.3*cm"/> + <constant name="VertexBarrel_rmin2" value="5.7*cm"/> <constant name="VertexBarrelModule_maxThickness" value="VertexBarrel_rmin2 - VertexBarrel_rmin1"/> - <constant name="VertexBarrel_length" value="30*cm"/> - <constant name="VertexBarrel_thickness" value="0.05/100*9.37*cm"/> - <constant name="VertexBarrelService_thickness" value="VertexBarrel_thickness-ITS3Thickness"/> - <constant name="VertexBarrel_rmin" value="VertexBarrel_rmin1"/> - <constant name="VertexBarrel_rmax" value="VertexBarrel_rmin2+VertexBarrelModule_maxThickness"/> - <constant name="VertexBarrelLayer_rOffset" value="4.0*mm"/> + <constant name="VertexBarrel_length" value="VertexTrackerBarrel_length"/> + <constant name="VertexBarrel_thickness" value="0.05/100*9.37*cm"/> + <constant name="VertexBarrelService_thickness" value="VertexBarrel_thickness-ITS3Thickness"/> + <constant name="VertexBarrel_rmin" value="VertexBarrel_rmin1"/> + <constant name="VertexBarrel_rmax" value="VertexBarrel_rmin2+VertexBarrelModule_maxThickness"/> + <constant name="VertexBarrelLayer_rOffset" value="4.0*mm"/> <comment> TODO: These should be computed </comment> <constant name="VertexBarrel_NModules1" value="14"/> @@ -30,7 +30,7 @@ <constant name="VertexTrackerEndcapN_zmin" value="VertexTrackerBarrel_zmax"/> <constant name="VertexTrackerEndcapP_zmin" value="VertexTrackerBarrel_zmax"/> - <constant name="VertexEndcap_NLayers" value="5"/> + <constant name="VertexEndcap_NLayers" value="2"/> <constant name="VertexTrackerEndcap_delta" value="(VertexTrackerEndcapP_zmax - VertexTrackerEndcapP_zmin)/VertexEndcap_NLayers"/> @@ -47,8 +47,8 @@ name="VertexSubAssembly" type="DD4hep_SubdetectorAssembly" vis="TrackerSubAssemblyVis"> - <composite name="VertexTrackerEndcapN"/> - <composite name="VertexTrackerEndcapP"/> + <composite name="VertexEndcapN"/> + <composite name="VertexEndcapP"/> <composite name="VertexBarrel"/> </detector> @@ -59,17 +59,19 @@ type="athena_VertexBarrel" readout="VertexBarrelHits" insideTrackingVolume="true"> - <dimensions rmin="VertexBarrel_rmin-VertexBarrelLayer_rOffset" rmax="VertexBarrel_rmax-VertexBarrelLayer_rOffset" length="VertexBarrel_length"/> - + <dimensions + rmin="VertexBarrel_rmin-VertexBarrelLayer_rOffset" + rmax="VertexBarrel_rmax-VertexBarrelLayer_rOffset" + length="VertexBarrel_length"/> <comment> Define available modules </comment> <module name="Module1" vis="PurpleVis"> - <frame width="15*mm" height="10.0*mm" length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" /> + <frame width="15*mm" height="10.0*mm" + length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" /> <module_component name="silicon" width="14.0*mm" length="VertexBarrel_length-0.1*mm" thickness="0.05*mm" material="Silicon" sensitive="true"> <position z="-0.025*mm" y="0*mm"/> </module_component> </module> - <module name="Module2"> <frame width="15*mm" height="10.0*mm" length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" /> <module_component name="silicon" @@ -77,7 +79,6 @@ <position z="-0.025*mm" y="0*mm"/> </module_component> </module> - <comment> Layers composed of many arrayed modules </comment> <layer module="Module1" id="1" vis="VertexVis"> <barrel_envelope @@ -95,12 +96,13 @@ <rphi_layout phi_tilt="10.0*degree" nphi="VertexBarrel_NModules2" phi0="0.0" rc="VertexBarrel_rmin2" dr="0.0 * mm"/> <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> </layer> - </detector> - <!-- - <detector id="VertexEndcapP_ID" name="VertexTrackerEndcapP" type="ref_DiskTracker" - insideTrackingVolume="true" reflect="false" vis="AnlRed"> + <detector id="VertexEndcapP_ID" + name="VertexEndcapP" + type="athena_SimpleDiskTracker" + insideTrackingVolume="true" + reflect="false" vis="AnlRed"> <position x="0" y="0" z="0"/> <layer id="1" vis="AnlOrange" inner_z="VertexTrackerEndcapP_zmin + 0*VertexTrackerEndcap_delta" @@ -114,27 +116,11 @@ outer_r="VertexTrackerEndcapP_rmax"> <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> </layer> - <layer id="3" vis="AnlOrange" - inner_z="VertexTrackerEndcapP_zmin + 2*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapP_rmin" - outer_r="VertexTrackerEndcapP_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> - <layer id="4" vis="AnlOrange" - inner_z="VertexTrackerEndcapP_zmin + 3*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapP_rmin" - outer_r="VertexTrackerEndcapP_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> - <layer id="5" vis="AnlOrange" - inner_z="VertexTrackerEndcapP_zmin + 4*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapP_rmin" - outer_r="VertexTrackerEndcapP_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> </detector> - <detector id="VertexEndcapN_ID" name="VertexTrackerEndcapN" type="ref_DiskTracker" + <detector id="VertexEndcapN_ID" + name="VertexEndcapN" + type="ref_DiskTracker" insideTrackingVolume="true" reflect="true" vis="AnlRed"> <position x="0" y="0" z="0"/> <layer id="1" vis="AnlOrange" @@ -149,26 +135,7 @@ outer_r="VertexTrackerEndcapN_rmax"> <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> </layer> - <layer id="3" vis="AnlOrange" - inner_z="VertexTrackerEndcapN_zmin + 2*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapN_rmin" - outer_r="VertexTrackerEndcapN_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> - <layer id="4" vis="AnlOrange" - inner_z="VertexTrackerEndcapN_zmin + 3*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapN_rmin" - outer_r="VertexTrackerEndcapN_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> - <layer id="5" vis="AnlOrange" - inner_z="VertexTrackerEndcapN_zmin + 4*VertexTrackerEndcap_delta" - inner_r="VertexTrackerEndcapN_rmin" - outer_r="VertexTrackerEndcapN_rmax"> - <slice material="Air" thickness="1.0*mm" vis="AnlOrange" /> - </layer> </detector> - --> </detectors> diff --git a/src/SimpleDiskTracker_geo.cpp b/src/SimpleDiskTracker_geo.cpp index 4431e881bc80625719582b7ce5cc8acd4a60c23b..54a9ea93d190250ee01d62a5b76941c4cd132369 100644 --- a/src/SimpleDiskTracker_geo.cpp +++ b/src/SimpleDiskTracker_geo.cpp @@ -15,6 +15,8 @@ // //========================================================================== #include "DD4hep/DetFactoryHelper.h" +#include "Acts/Plugins/DD4hep/ActsExtension.hpp" +#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp" using namespace std; using namespace dd4hep; @@ -32,6 +34,10 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s int l_num = 0; xml::Component pos = x_det.position(); + Acts::ActsExtension* detWorldExt = new Acts::ActsExtension(); + detWorldExt->addType("endcap", "detector"); + sdet.addExtension<Acts::ActsExtension>(detWorldExt); + for (xml_coll_t i(x_det, _U(layer)); i; ++i, ++l_num) { xml_comp_t x_layer = i; string l_nam = det_name + _toString(l_num, "_layer%d"); @@ -49,37 +55,52 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s Tube l_tub(rmin, rmax, layerWidth/2.0, 2 * M_PI); Volume l_vol(l_nam, l_tub, air); l_vol.setVisAttributes(description, x_layer.visStr()); + DetElement layer; + if (!reflect) { + layer = DetElement(sdet, l_nam + "_pos", l_num); + pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.)); + pv.addPhysVolID("layer", l_num); + pv.addPhysVolID("barrel", 3); + layer.setPlacement(pv); + } else { + layer = DetElement(sdet, l_nam + "_neg", l_num); + (sdet, l_nam + "_pos", l_num); + pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2))); + pv.addPhysVolID("layer", l_num); + pv.addPhysVolID("barrel", 2); + layer.setPlacement(pv); + // DetElement layerR = layer.clone(l_nam+"_neg"); + // sdet.add(layerR.setPlacement(pv)); + } + Acts::ActsExtension* layerExtension = new Acts::ActsExtension(); + layerExtension->addType("layer", "layer"); + //layerExtension->addType("axes", "definitions", "XZY"); + layer.addExtension<Acts::ActsExtension>(layerExtension); + for (xml_coll_t j(x_layer, _U(slice)); j; ++j, ++s_num) { xml_comp_t x_slice = j; double thick = x_slice.thickness(); Material mat = description.material(x_slice.materialStr()); string s_nam = l_nam + _toString(s_num, "_slice%d"); Volume s_vol(s_nam, Tube(rmin, rmax, thick/2.0), mat); - + if(!reflect){ + s_nam += "_pos"; + } else { + s_nam += "_neg"; + } + DetElement slice_de(layer, s_nam , s_num); if (x_slice.isSensitive()) { sens.setType("tracker"); s_vol.setSensitiveDetector(sens); + Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY"); + slice_de.addExtension<Acts::ActsExtension>(moduleExtension); } s_vol.setAttributes(description, x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr()); pv = l_vol.placeVolume(s_vol, Position(0, 0, z - zmin - layerWidth / 2 + thick / 2)); pv.addPhysVolID("slice", s_num); + slice_de.setPlacement(pv); } - if (!reflect) { - DetElement layer(sdet, l_nam + "_pos", l_num); - pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.)); - pv.addPhysVolID("layer", l_num); - pv.addPhysVolID("barrel", 1); - layer.setPlacement(pv); - } else { - DetElement layer(sdet, l_nam + "_neg", l_num); - pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2))); - pv.addPhysVolID("layer", l_num); - pv.addPhysVolID("barrel", 1); - layer.setPlacement(pv); - // DetElement layerR = layer.clone(l_nam+"_neg"); - // sdet.add(layerR.setPlacement(pv)); - } } if (x_det.hasAttr(_U(combineHits))) { sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens); @@ -90,5 +111,6 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s return sdet; } +DECLARE_DETELEMENT(athena_SimpleDiskTracker, create_detector) DECLARE_DETELEMENT(ref_DiskTracker, create_detector) DECLARE_DETELEMENT(ref_SolenoidEndcap, create_detector) diff --git a/src/TrapEndcapTracker_geo.cpp b/src/TrapEndcapTracker_geo.cpp index 30251db0fba60c0b87b6d004185269027b129be9..16f2e7138605743b4eefd98750dbc6baa3966f6a 100644 --- a/src/TrapEndcapTracker_geo.cpp +++ b/src/TrapEndcapTracker_geo.cpp @@ -16,127 +16,170 @@ //========================================================================== #include <map> #include "DD4hep/DetFactoryHelper.h" +#include "Acts/Plugins/DD4hep/ActsExtension.hpp" +#include "Acts/Definitions/Units.hpp" using namespace std; 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; - - 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(); - - 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); - - 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; +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; + + Acts::ActsExtension* detWorldExt = new Acts::ActsExtension(); + detWorldExt->addType("endcap", "detector"); + sdet.addExtension<Acts::ActsExtension>(detWorldExt); + + 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(); + + 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); + + 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; + } + + 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; + + //xml_comp_t l_env = x_layer.child(_U(envelope)); + string layer_name = det_name + std::string("_layer") + std::to_string(l_id); + + //std::string layer_vis = l_env.attr<std::string>(_Unicode(vis)); + //double layer_rmin = l_env.attr<double>(_Unicode(rmin)); + //double layer_rmax = l_env.attr<double>(_Unicode(rmax)); + //double layer_length = l_env.attr<double>(_Unicode(length)); + //double layer_zstart = l_env.attr<double>(_Unicode(zstart)); + //printout(INFO,"ROOTGDMLParse","+++ Read geometry from GDML file file:%s",input.c_str()); + //std::cout << "SiTracker Endcap layer " << l_id << " zstart = " << layer_zstart/dd4hep::mm << "mm ( " << layer_length/dd4hep::mm << " mm thick )\n"; + + Assembly layer_assembly(layer_name); + //assembly.placeVolume(layer_assembly); + //Tube layer_tub(layer_rmin, layer_rmax, layer_length / 2); + //Volume layer_vol(layer_name, layer_tub, air); // Create the layer envelope volume. + //layer_assembly.setVisAttributes(description.visAttributes(layer_vis)); + + PlacedVolume layer_pv; + if (reflect) { + layer_pv = assembly.placeVolume(layer_assembly, Position(0,0,-1.0e-9));//-layer_zstart-layer_length/2)); + layer_pv.addPhysVolID("barrel", 3).addPhysVolID("layer", l_id); + layer_name += "_N"; + } else { + layer_pv = assembly.placeVolume(layer_assembly);//, Position(0, 0, +layer_zstart + layer_length / 2)); + layer_pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id); + layer_name += "_P"; + } + DetElement layer_element(sdet, layer_name, l_id); + layer_element.setPlacement(layer_pv); + Acts::ActsExtension* layerExtension = new Acts::ActsExtension(); + layerExtension->addType("layer", "layer"); + //layerExtension->addType("axes", "definitions", "XZY"); + layer_element.addExtension<Acts::ActsExtension>(layerExtension); + + 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 (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); - } - - 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); + Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY"); + comp_elt.addExtension<Acts::ActsExtension>(moduleExtension); + } } + 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