diff --git a/compact/definitions.xml b/compact/definitions.xml index 80e58e2824fb5882f63a4aa1cd70c22f313eb1de..6e066ba632419f14f769baa3220d0f08bdba560c 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -130,12 +130,23 @@ <constant name="cb_CTD_Si_ID" value="74"/> - <comment> + <comment> + =================== + (75-84) Barrel Tracker IDs + =================== + MMTrackerBarrel ID: 75 + + Unused IDs: 76-89 + + </comment> + <constant name="MMTrackerBarrel_ID" value="75"/> + + <comment> =================== - (75-99) Reserved IDs + (85-99) Reserved IDs =================== - Unused IDs: 75-89 + Unused IDs: 85-89 TBD </comment> <comment> @@ -364,8 +375,10 @@ The central tracking detectors are assumed to be symmtric about the origin. </comment> + <constant name="BarrelTracking_length" value="SiliconTrackerOuterBarrelLength"/> + <constant name="BarrelTracking_rmax" value="SiliconTrackerOuterRadius"/> <constant name="CentralTracking_rmax" value="SiliconTrackerOuterRadius"/> - <constant name="CentralTracking_length" value="SiliconTrackerOuterBarrelLength + ForwardTrackingGEMLength"/> + <constant name="CentralTracking_length" value="BarrelTracking_length + ForwardTrackingGEMLength"/> <constant name="VertexTrackingRegion_length" value="SiliconTrackerOuterBarrelLength"/> <comment> These are used by ddsim </comment> diff --git a/compact/gem_tracker_endcap.xml b/compact/gem_tracker_endcap.xml index 516405f371769bc34e7a28abcfcc12d36b66d68a..78b7f2d2c236b22e18b465ccfef313460be8c134 100644 --- a/compact/gem_tracker_endcap.xml +++ b/compact/gem_tracker_endcap.xml @@ -1,9 +1,8 @@ <lccdd> - <comment> Central Barrel Tracker Silicon </comment> + <comment> Endcap Tracker </comment> <define> - <comment> Si layer opiton </comment> <constant name="GEMTrackerEndcapFoilX1" value="43.0 * mm"/> <constant name="GEMTrackerEndcapFoilY" value="1020.0 * mm"/> <constant name="GEMTrackerEndcapFoilOpeningAngle" value="30.1*degree"/> diff --git a/compact/mm_tracker_barrel.xml b/compact/mm_tracker_barrel.xml new file mode 100644 index 0000000000000000000000000000000000000000..4029b912c91a986899614c3024b33e6705d22819 --- /dev/null +++ b/compact/mm_tracker_barrel.xml @@ -0,0 +1,76 @@ +<lccdd> + + <comment>Micromegas tracker barrel</comment> + + <define> + <constant name="MMTrackerBarrelLayer1_rmin" value="800.0 * mm"/> + <constant name="MMTrackerBarrelLayer1_length" value="500.0 * mm"/> + <constant name="MMTrackerBarrelLayer1_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrel_NZModules" value="floor(BarrelTracking_length/MMTrackerBarrelLayer1_length)"/> + + <constant name="MMTrackerBarrelModulesTotal_length" value="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length"/> + + + </define> + + <limits> + </limits> + + <regions> + </regions> + + <display> + </display> + + <detectors> + <detector id="MMTrackerBarrel_ID" name="MMTrackerBarrel" type="refdet_MMTrackerBarrel" readout="MMTrackerBarrelHits"> + <module name="Module1" vis="Argonne_Gold"> + <module_envelope + rmin="MMTrackerBarrelLayer1_rmin" + length="MMTrackerBarrelLayer1_length" + thickness="MMTrackerBarrelLayer1_thickness" phi="90*degree" /> + <module_component thickness="1.0*mm" material="PEEK" sensitive="false"> + <position x="0" /> + </module_component> + <module_component thickness="1.0*mm" material="PEEK" sensitive="false" + length="MMTrackerBarrelLayer1_length-10.0*mm" + phi="89.0*degree" > + <position x="0" /> + </module_component> + </module> + <layer module="Module1" id="1" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer1_rmin-20.0*mm" + outer_r="MMTrackerBarrelLayer1_rmin + 20.0*mm" + z_length="MMTrackerBarrelModulesTotal_length" /> + <comment> + phi0 : Starting phi of first module. + phi_tilt : Phi tilt of a module. + rc : Radius of the module center. + nphi : Number of modules in phi. + rphi_dr : The delta radius of every other module. + z0 : Z position of first module in phi. + nz : Number of modules to place in z. + dr : Radial displacement parameter, of every other module. + </comment> + <rphi_layout phi_tilt="0.0" nphi="4" phi0="0." rc="MMTrackerBarrelLayer1_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-MMTrackerBarrelModulesTotal_length/2.0 + MMTrackerBarrelLayer1_length/2.0" + nz="MMTrackerBarrel_NZModules"/> + </layer> + </detector> + + </detectors> + + <readouts> + <readout name="MMTrackerBarrelHits"> + <segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" /> + <id>system:8,sector:8,module:14,x:32:-16,y:-16</id> + </readout> + </readouts> + + <plugins> + </plugins> + + <fields> + </fields> +</lccdd> diff --git a/reference_detector.xml b/reference_detector.xml index 99b3e96684b1297108ef828e0ed951c96060fae1..2776cb5ef8a9be0f7e3cb28c16ae50dfa6659674 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -118,7 +118,6 @@ <include ref="compact/solenoid.xml"/> <include ref="compact/ecal.xml"/> <include ref="compact/far_forward_detectors.xml"/> - <include ref="compact/cb_CTD_Si.xml"/> <include ref="compact/ce_mrich.xml"/> <include ref="compact/ce_GEM.xml"/> <include ref="compact/hcal.xml"/> @@ -128,8 +127,10 @@ <include ref="compact/forward_offM_tracker.xml"/> <include ref="compact/vertex_tracker.xml"/> <include ref="compact/gem_tracker_endcap.xml"/> + <include ref="compact/mm_tracker_barrel.xml"/> <!-- <include ref="compact/ci_GEM.xml"/> + <include ref="compact/cb_CTD_Si.xml"/> <include ref="compact/cb_VTX_Barrel.xml"/> <include ref="compact/ci_HCAL.xml"/> <include ref="compact/forward_rich.xml"/> diff --git a/src/CylinderTrackerBarrel_geo.cpp b/src/CylinderTrackerBarrel_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6ad205f6567753f86ca813785ef179b86fcd5d31 --- /dev/null +++ b/src/CylinderTrackerBarrel_geo.cpp @@ -0,0 +1,193 @@ +//========================================================================== +// Specialized generic detector constructor +//========================================================================== + +#include "Acts/Plugins/DD4hep/ActsExtension.hpp" +#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp" +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" + + +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 air = description.air(); + + int det_id = x_det.id(); + string det_name = x_det.nameStr(); + DetElement sdet(det_name, det_id); + + Acts::ActsExtension* barrelExtension = new Acts::ActsExtension(); + barrelExtension->addType("barrel", "detector"); + sdet.addExtension<Acts::ActsExtension>(barrelExtension); + + Assembly assembly(det_name); + map<string, Volume> mod_volumes; + map<string, Placements> sensitives; + PlacedVolume pv; + + sens.setType("tracker"); + int n_modules = 0; + for (xml_coll_t mi(x_det, _U(module)); mi; ++mi) { + n_modules++; + xml_comp_t x_mod = mi; + xml_comp_t m_env = x_mod.child(_U(module_envelope)); + string m_nam = x_mod.nameStr(); + + Assembly module_assembly(_toString(n_modules, "mod_assembly_%d")); + auto module_rmin = m_env.rmin(); + auto module_thickness = m_env.thickness(); + auto module_length = m_env.length(); + auto module_phi = getAttrOrDefault(m_env, _Unicode(phi), 90.0); + + Volume m_vol(m_nam, Tube(module_rmin , module_rmin + module_thickness, module_length/ 2 ), air); + int ncomponents = 0, sensor_number = 1; + module_assembly.placeVolume(m_vol,Position(-module_rmin,0,0)); + mod_volumes[m_nam] = module_assembly; + m_vol.setVisAttributes(description.visAttributes(x_mod.visStr())); + + auto comp_rmin = module_rmin; + for (xml_coll_t ci(x_mod, _U(module_component)); ci; ++ci, ++ncomponents) { + xml_comp_t x_comp = ci; + xml_comp_t x_pos = x_comp.position(false); + xml_comp_t x_rot = x_comp.rotation(false); + string c_nam = _toString(ncomponents, "component%d"); + + auto comp_thickness = x_comp.thickness(); + comp_rmin = getAttrOrDefault(x_comp, _Unicode(rmin), comp_rmin); + auto comp_phi = getAttrOrDefault(x_comp, _Unicode(phi), module_phi); + auto comp_phi0 = getAttrOrDefault(x_comp, _Unicode(phi0), 0.0); + auto comp_length = getAttrOrDefault(x_comp, _Unicode(length), module_length); + + Tube c_tube(comp_rmin, comp_rmin + comp_thickness, comp_length / 2 , -comp_phi/2.0+comp_phi0,comp_phi/2.0+comp_phi0); + Volume c_vol(c_nam, c_tube, description.material(x_comp.materialStr())); + PlacedVolume c_pv; + + if (x_pos && x_rot) { + Position c_pos(x_pos.x(0), x_pos.y(0), x_pos.z(0)); + RotationZYX c_rot(x_rot.z(0), x_rot.y(0), x_rot.x(0)); + c_pv = m_vol.placeVolume(c_vol, Transform3D(c_rot, c_pos)); + } else if (x_rot) { + c_pv = m_vol.placeVolume(c_vol, RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0))); + } else if (x_pos) { + c_pv = m_vol.placeVolume(c_vol, Position(x_pos.x(0), x_pos.y(0), x_pos.z(0))); + } else { + c_pv = m_vol.placeVolume(c_vol); + } + c_vol.setRegion(description, x_comp.regionStr()); + c_vol.setLimitSet(description, x_comp.limitsStr()); + c_vol.setVisAttributes(description, x_comp.visStr()); + if (x_comp.isSensitive()) { + c_pv.addPhysVolID(_U(sensor), sensor_number++); + c_vol.setSensitiveDetector(sens); + sensitives[m_nam].push_back(c_pv); + } + comp_rmin = comp_rmin + comp_thickness; + } + } + for (xml_coll_t li(x_det, _U(layer)); li; ++li) { + xml_comp_t x_layer = li; + xml_comp_t x_barrel = x_layer.child(_U(barrel_envelope)); + xml_comp_t x_layout = x_layer.child(_U(rphi_layout)); + xml_comp_t z_layout = x_layer.child(_U(z_layout)); // Get the <z_layout> element. + int lay_id = x_layer.id(); + string m_nam = x_layer.moduleStr(); + string lay_nam = _toString(x_layer.id(), "layer%d"); + Tube lay_tub(x_barrel.inner_r(), x_barrel.outer_r(), x_barrel.z_length() / 2); + Volume lay_vol(lay_nam, lay_tub, air); // Create the layer envelope volume. + lay_vol.setVisAttributes(description.visAttributes(x_layer.visStr())); + double phi0 = x_layout.phi0(); // Starting phi of first module. + double phi_tilt = x_layout.phi_tilt(); // Phi tilt of a module. + double rc = x_layout.rc(); // Radius of the module center. + int nphi = x_layout.nphi(); // Number of modules in phi. + double rphi_dr = x_layout.dr(); // The delta radius of every other module. + double phi_incr = (M_PI * 2) / nphi; // Phi increment for one module. + double phic = phi0; // Phi of the module center. + double z0 = z_layout.z0(); // Z position of first module in phi. + double nz = z_layout.nz(); // Number of modules to place in z. + double z_dr = z_layout.dr(); // Radial displacement parameter, of every other module. + Volume m_env = mod_volumes[m_nam]; + DetElement lay_elt(sdet, _toString(x_layer.id(), "layer%d"), lay_id); + + Acts::ActsExtension* layerExtension = new Acts::ActsExtension(); + layerExtension->addType("sensitive cylinder", "layer"); + //layerExtension->addValue(10. * Acts::UnitConstants::mm, "r", "envelope"); + lay_elt.addExtension<Acts::ActsExtension>(layerExtension); + + Placements& sensVols = sensitives[m_nam]; + + // Z increment for module placement along Z axis. + // Adjust for z0 at center of module rather than + // the end of cylindrical envelope. + double z_incr = nz > 1 ? (2.0 * z0) / (nz - 1) : 0.0; + // Starting z for module placement along Z axis. + double module_z = -z0; + int module = 1; + + // Loop over the number of modules in phi. + for (int ii = 0; ii < nphi; ii++) { + double dx = z_dr * std::cos(phic + phi_tilt); // Delta x of module position. + double dy = z_dr * std::sin(phic + phi_tilt); // Delta y of module position. + double x = rc * std::cos(phic); // Basic x module position. + double y = rc * std::sin(phic); // Basic y module position. + + // Loop over the number of modules in z. + for (int j = 0; j < nz; j++) { + string module_name = _toString(module, "module%d"); + DetElement mod_elt(lay_elt, module_name, module); + // Module PhysicalVolume. + // Transform3D + // tr(RotationZYX(0,-((M_PI/2)-phic-phi_tilt),M_PI/2),Position(x,y,module_z)); + // NOTE (Nikiforos, 26/08 Rotations needed to be fixed so that component1 (silicon) is on the + // outside + Transform3D tr(RotationZYX(phic - phi_tilt,0, 0), Position(x, y, module_z)); + + pv = lay_vol.placeVolume(m_env, tr); + pv.addPhysVolID("module", module); + mod_elt.setPlacement(pv); + for (size_t ic = 0; ic < sensVols.size(); ++ic) { + PlacedVolume sens_pv = sensVols[ic]; + DetElement comp_elt(mod_elt, sens_pv.volume().name(), module); + comp_elt.setPlacement(sens_pv); + Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("YZX"); + comp_elt.addExtension<Acts::ActsExtension>(moduleExtension); + } + + /// Increase counters etc. + module++; + // Adjust the x and y coordinates of the module. + x += dx; + y += dy; + // Flip sign of x and y adjustments. + dx *= -1; + dy *= -1; + // Add z increment to get next z placement pos. + module_z += z_incr; + } + phic += phi_incr; // Increment the phi placement of module. + rc += rphi_dr; // Increment the center radius according to dr parameter. + rphi_dr *= -1; // Flip sign of dr parameter. + module_z = -z0; // Reset the Z placement parameter for module. + } + // Create the PhysicalVolume for the layer. + pv = assembly.placeVolume(lay_vol); // Place layer in mother + pv.addPhysVolID("layer", lay_id); // Set the layer ID. + lay_elt.setAttributes(description, lay_vol, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr()); + lay_elt.setPlacement(pv); + } + sdet.setAttributes(description, assembly, x_det.regionStr(), x_det.limitsStr(), x_det.visStr()); + assembly.setVisAttributes(description.invisible()); + pv = description.pickMotherVolume(sdet).placeVolume(assembly); + pv.addPhysVolID("system", det_id); // Set the subdetector system ID. + pv.addPhysVolID("barrel", 1); // Flag this as a barrel subdetector. + sdet.setPlacement(pv); + return sdet; +} + +// clang-format off +DECLARE_DETELEMENT(refdet_CylinderTrackerBarrel, create_detector) +DECLARE_DETELEMENT(refdet_MMTrackerBarrel, create_detector)