Skip to content
Snippets Groups Projects
Commit 7f6d2694 authored by Whitney Armstrong's avatar Whitney Armstrong
Browse files

Added GEM Tracker Endcap

 - Uses the TrapEndcapTracker geometry construction
 - Material thicknesses needs attention.
parent 53813fb5
No related branches found
No related tags found
1 merge request!56Resolve "GEM Endcap Tracker"
Pipeline #8373 passed with stages
in 4 minutes and 1 second
......@@ -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>
=====================================
......
<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>
......@@ -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>
......@@ -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"/>
......
//==========================================================================
// 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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment