diff --git a/compact/definitions.xml b/compact/definitions.xml index d52994d6e32cc2daa293963423dcb78ac4215263..80e58e2824fb5882f63a4aa1cd70c22f313eb1de 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -205,6 +205,7 @@ <constant name="ForwardRICH_ID" value="121"/> <constant name="ci_GEM_id" value="122"/> <constant name="ForwardTRD_ID" value="123"/> + <constant name="GEMTrackerEndcap_ID" value="124"/> <comment> ===================================== diff --git a/compact/gem_tracker_endcap.xml b/compact/gem_tracker_endcap.xml new file mode 100644 index 0000000000000000000000000000000000000000..516405f371769bc34e7a28abcfcc12d36b66d68a --- /dev/null +++ b/compact/gem_tracker_endcap.xml @@ -0,0 +1,69 @@ +<lccdd> + + <comment> Central Barrel Tracker Silicon </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"/> + <constant name="GEMTrackerEndcapFoilX2" value="2*GEMTrackerEndcapFoilY*tan(GEMTrackerEndcapFoilOpeningAngle/2.0) + GEMTrackerEndcapFoilX1"/> + <constant name="GEMTrackerEndcapFoil_rmin" value="GEMTrackerEndcapFoilX1/(tan(GEMTrackerEndcapFoilOpeningAngle/2.0)*2.0)"/> + <constant name="GEMTrackerEndcapFoil_rmax" value="(GEMTrackerEndcapFoilY+GEMTrackerEndcapFoil_rmin)/(cos(GEMTrackerEndcapFoilOpeningAngle/2.0))"/> + </define> + + <limits> + </limits> + + <regions> + </regions> + + <display> + </display> + + <detectors> + <detector + id="GEMTrackerEndcap_ID" + name="GEMTrackerEndcap" + type="refdet_GEMTrackerEndcap" + readout="GEMTrackerEndcapHits" + vis="Argonne_Red" + reflect="false"> + <module name="GEMModule1" vis="Argonne_Process_Blue"> + <trd x1="GEMTrackerEndcapFoilX1/2.0" x2="GEMTrackerEndcapFoilX2/2.0" z="GEMTrackerEndcapFoilY/2"/> + <comment> Going from HV side to readout side</comment> + <module_component thickness="1.127 * mm" material="Mylar"/> + <module_component thickness="3*mm" material="Ar10CO2"/> + <module_component thickness="0.127 * mm" material="Mylar"/> + <module_component thickness="2*mm" material="Ar10CO2"/> + <module_component thickness="0.127 * mm" material="Mylar"/> + <module_component thickness="2*mm" material="Ar10CO2"/> + <module_component thickness="0.127 * mm" material="Mylar"/> + <module_component thickness="2*mm" material="Ar10CO2"/> + <module_component thickness="0.175 * mm" material="Epoxy" sensitive="true" vis="Argonne_Process_Blue"/> + </module> + <layer id="1" > + <envelope vis="Argonne_Red" + rmin="GEMTrackerEndcapFoil_rmin" rmax="GEMTrackerEndcapFoil_rmax" + zstart="SiliconTrackerOuterBarrelLength/2+15*mm" length="30.0*mm" /> + <ring r="GEMTrackerEndcapFoil_rmin+GEMTrackerEndcapFoilY/2.0" + zstart="SiliconTrackerOuterBarrelLength/2+20*mm" + nmodules="12" dz="10 * mm" module="GEMModule1" /> + </layer> + </detector> + + </detectors> + + <readouts> + <readout name="GEMTrackerEndcapHits"> + <segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" /> + <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id> + </readout> + </readouts> + + <plugins> + </plugins> + + <fields> + </fields> +</lccdd> diff --git a/compact/materials.xml b/compact/materials.xml index d8955f0bc9a4010381ca72f136c8eb2ee5950794..26ee6989605c1de6cc831d77186db58486cb01cb 100644 --- a/compact/materials.xml +++ b/compact/materials.xml @@ -192,5 +192,11 @@ <composite n="0.036" ref="C"/> <composite n="0.073" ref="O"/> </material> + <material name="Mylar"> + <D type="density" value="1.39" unit="g/cm3" /> + <fraction n="0.62502108" ref="C"/> + <fraction n="0.041960452" ref="H"/> + <fraction n="0.33301847" ref="O"/> + </material> </materials> diff --git a/reference_detector.xml b/reference_detector.xml index 6a31c0a191c1ed05a85efb2dfec820d74a1e3201..99b3e96684b1297108ef828e0ed951c96060fae1 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -121,14 +121,15 @@ <include ref="compact/cb_CTD_Si.xml"/> <include ref="compact/ce_mrich.xml"/> <include ref="compact/ce_GEM.xml"/> - <include ref="compact/ci_GEM.xml"/> <include ref="compact/hcal.xml"/> <include ref="compact/forward_trd.xml"/> <include ref="compact/B0_tracker.xml"/> <include ref="compact/forward_romanpot.xml"/> <include ref="compact/forward_offM_tracker.xml"/> <include ref="compact/vertex_tracker.xml"/> + <include ref="compact/gem_tracker_endcap.xml"/> <!-- + <include ref="compact/ci_GEM.xml"/> <include ref="compact/cb_VTX_Barrel.xml"/> <include ref="compact/ci_HCAL.xml"/> <include ref="compact/forward_rich.xml"/> diff --git a/src/TrapEndcapTracker_geo.cpp b/src/TrapEndcapTracker_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ea0c961ceffb7afc2bc913199c922306c724841d --- /dev/null +++ b/src/TrapEndcapTracker_geo.cpp @@ -0,0 +1,140 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== +// +// Specialized generic detector constructor +// +//========================================================================== +#include <map> +#include "DD4hep/DetFactoryHelper.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 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(); + Material c_mat = description.material(c.materialStr()); + string c_name = _toString(c_id, "component%d"); + Volume c_vol(c_name, Trapezoid(x1, x2, c_thick / 2e0, c_thick / 2e0, z), 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; + 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; + } + } + } + pv = motherVol.placeVolume(assembly); + pv.addPhysVolID("system", det_id); + sdet.setPlacement(pv); + return sdet; +} + +// clang-format off +DECLARE_DETELEMENT(refdet_TrapEndcapTracker, create_detector) +DECLARE_DETELEMENT(refdet_GEMTrackerEndcap, create_detector)