Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(luxegeo)

# install(DIRECTORY compact DESTINATION share/luxegeo/)
# SET( CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install" )
SET( CMAKE_INSTALL_LIBDIR "lib" )

# project version
SET( ${PROJECT_NAME}_VERSION_MAJOR 0 )
SET( ${PROJECT_NAME}_VERSION_MINOR 0 )
Expand All @@ -15,6 +19,7 @@ find_package(DD4hep REQUIRED COMPONENTS DDG4)
set(sources
./src/SimpleTracker_geo.cpp
./src/LUXETracker_geo.cpp
./src/LUXEEcal_geo.cpp
)

add_dd4hep_plugin(${PROJECT_NAME} SHARED ${sources}) # link it with DDCore, or whatever you need
Expand Down
101 changes: 101 additions & 0 deletions compact/ECAL_commondefs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>

<!--


TB2022-06 - CERN
"||" = W layer (2.1mm)

Conf 1: 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 |||| 13 |||| 14 |||| 19.6 X0
-->

<!--
Plastic plate (polyethylene) thickness: 2 mm
Distance to groove 61.8 mm
Dist between grooves: 15 mm
Carbon thickness


ECAL slab structure (from upstream beam direction)

Tungsten From 0 mm, to 5.6 mm (New in TB2022-06)
Carbon 1.50 mm (A Gallas)
Kapton 0.10 mm
Glue 0.10 mm
Silicon Sensor 0.32 mm or 0.5 mm or 0.65 mm
Glue 0.10 mm
Copper layer: 0.10 mm
PCB 1.70 mm (TODO To be checked with Jerome)
Chip 1.20 mm
Air
==================================
total slab thickness = 10.72, 10.9 or 11.05 mm (counting 5.6 mm Tungsten "box")


-->


<define>
<constant name="env_safety" value="0.001"/>

<!--constant name="Ecal_NcellsX" value="32" />
<constant name="Ecal_NcellsY" value="32" />
<constant name="Ecal_CellSizeX" value="5.5" />
<constant name="Ecal_CellSizeY" value="5.5" /-->

<constant name="Ecal_dim_x" value="360*mm"/>
<constant name="Ecal_dim_y" value="180*mm"/>
<constant name="Ecal_dim_z" value="285*mm"/> <!-- 15*15 layers + 26 (rear space) + 30 (upfront space) + 4 (plastic plates) -->
<constant name="Ecal_dim_z_10mmgap" value="210*mm"/> <!-- 15*10 layers + 26 (rear space) + 30 (upfront space) + 4 (plastic plates) -->
<!--TODO: check!! , more on the order of 220*mm (used to be 500*mm), but still fine if we put the first layer in the border of the box (?)-->
<constant name="EcalP_dim_x" value="555*mm"/>
<constant name="EcalP_dim_y" value="100*mm"/>
<constant name="EcalP_dim_z" value="93.5*mm"/> <!-- 0 (front space) + 4.5*20 layers + 3.5 (rear tungsten) -->

<constant name="Ecal_LayerDistance" value="15.0*mm"/>
<constant name="Ecal_LayerDistance_10" value="10.0*mm"/>
<constant name="Ecal_slab_thickness320" value="10.72*mm"/>
<constant name="Ecal_slab_thickness500" value="10.9*mm"/>
<constant name="Ecal_slab_thickness650" value="11.05*mm"/>
<constant name="EcalP_LayerDistance" value="4.5*mm"/>

<!-- TB2022-06: Aluminum plate can be removed for LUXE-->
<constant name="Ecal_AlThickness" value="2*mm"/>
<constant name="Ecal_AlThickness_back" value="2*mm"/>

<constant name="Ecal_WThickness" value="2.1*mm"/>
<constant name="EcalP_WThickness" value="3.55*mm"/>
<constant name="Ecal_PlasticThickness" value="2*mm"/>
<constant name="Ecal_CFThickness" value="1.5*mm"/>
<constant name="Ecal_CFThickness250" value="0.25*mm"/>
<constant name="Ecal_KaptonThickness" value="0.1*mm"/>
<constant name="Ecal_GlueThickness_kap" value="0.1*mm"/>
<constant name="Ecal_WaferThickness320" value="0.320*mm"/>
<constant name="Ecal_WaferThickness500" value="0.500*mm"/>
<constant name="Ecal_WaferThickness650" value="0.650*mm"/>
<!-- TODO: Used to have GlueThickness_pcb and GlueThickness_kap, now (2021) only one-->
<!-- <constant name="Ecal_GlueThickness_pcb" value="0.08*mm"/>-->
<constant name="Ecal_GlueThickness_pcb" value="0.1*mm"/>
<!-- TODO: Used to have GlueThickness_pcb and GlueThickness_kap, now (2021) only one-->
<!-- <constant name="Ecal_GlueThickness_kap" value="0.08*mm"/> -->
<!-- TODO: Vincent suggested (I think) that we had wafer - glue - Cu (??) - PCB - Chip -->
<!-- TODO: check, PCBTHickness used to be 1.61 -->
<constant name="Ecal_PcbThickness" value="1.7*mm"/>
<!-- TODO: missing chip!! -->
<constant name="Ecal_ChipThickness" value="1.2*mm"/>

<!-- this is the gap within a slab (electronics, etc) -->
<!-- <constant name="Ecal_GapThickness" value="Ecal_slab_thickness - Ecal_AlThickness - Ecal_PcbThickness - Ecal_WaferThickness - Ecal_KaptonThickness - Ecal_CFThickness - Ecal_GlueThickness_pcb - Ecal_GlueThickness_kap"/> -->

<constant name="Ecal_w_slab_gap320" value="Ecal_LayerDistance-Ecal_slab_thickness320"/>
<!--constant name="Ecal_w_slab_gap500" value="Ecal_LayerDistance-2*Ecal_WThickness-Ecal_slab_thickness500"/-->
<constant name="Ecal_w_slab_gap500" value="Ecal_LayerDistance-3.*Ecal_WThickness-Ecal_CFThickness-Ecal_KaptonThickness-Ecal_GlueThickness_kap-Ecal_WaferThickness500-Ecal_GlueThickness_pcb-Ecal_PcbThickness-Ecal_ChipThickness"/>
<constant name="Ecal_w_slab_gap650" value="Ecal_LayerDistance-Ecal_slab_thickness650"/>
<constant name="Ecal_w_slab_gap500_4p2mmW" value="Ecal_LayerDistance-2.*Ecal_WThickness-Ecal_CFThickness-Ecal_KaptonThickness-Ecal_GlueThickness_kap-Ecal_WaferThickness500-Ecal_GlueThickness_pcb-Ecal_PcbThickness-Ecal_ChipThickness"/>
<constant name="Ecal_w_slab_gap500_2p1mmW" value="Ecal_LayerDistance-1.*Ecal_WThickness-Ecal_CFThickness-Ecal_KaptonThickness-Ecal_GlueThickness_kap-Ecal_WaferThickness500-Ecal_GlueThickness_pcb-Ecal_PcbThickness-Ecal_ChipThickness"/>
<constant name="Ecal_w_slab_gap500_10mmgap" value="Ecal_LayerDistance_10-2.*Ecal_WThickness-Ecal_CFThickness-Ecal_KaptonThickness-Ecal_GlueThickness_kap-Ecal_WaferThickness500-Ecal_GlueThickness_pcb-Ecal_PcbThickness-Ecal_ChipThickness"/>
<constant name="EcalP_Airgap" value="EcalP_LayerDistance - EcalP_WThickness - Ecal_CFThickness250 - 0.5*Ecal_GlueThickness_kap - Ecal_KaptonThickness - 0.5*Ecal_GlueThickness_kap - Ecal_WaferThickness320 - 0.5*Ecal_GlueThickness_kap - Ecal_KaptonThickness"/>

</define>


12 changes: 12 additions & 0 deletions compact/ECAL_commondisp.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

<display>
<vis name="EcalVis" alpha="0.5" r="0.7" g="0.7" b="0.0" showDaughters="true" visible="false"/>
<vis name="TungstenVis" alpha="1.0" r="0.5" g="0.35" b="0.55" showDaughters="true" visible="true"/>
<vis name="PlasticVis" alpha="0.5" r="0.3" g="0.0" b="0.3" showDaughters="true" visible="false"/>
<vis name="AirVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="false"/>
<vis name="SiVis" alpha="1.0" r="0.9" g="0.9" b="0.9" showDaughters="true" visible="true"/>
<vis name="AlVis" alpha="1.0" r="0.7" g="0.7" b="0.7" showDaughters="true" visible="true"/>
<vis name="PCBVis" alpha="1.0" r="0.0" g="0.8" b="0.0" showDaughters="true" visible="true"/>
<vis name="CFVis" alpha="0.5" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="false"/>
<vis name="CuVis" alpha="0.5" r="1.0" g="0.5" b="0.0" showDaughters="true" visible="false"/>
</display>
132 changes: 132 additions & 0 deletions compact/ECALe_luxe/ECALe_luxe_2512.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">

<global detectorName="ECALe_luxe" />


<info name="ECALe_luxe_2512"
title="ECALe_luxe_2512"
author="J.P. Marquez, A. Irles, S. Huang"
url="none"
status="development"
version="$Id$">
<comment>The compact File for LUXE ECAL-E (updated December 2025)</comment>
</info>

<includes>
<comment>Additional design specific material definitions</comment>
<gdmlFile ref="../elements.xml"/> <!-- /afs/desy.de/project/ilcsoft/sw/x86_64_gcc82_centos7/v02-02-03/lcgeo/v00-16-07/ILD/compact/ILD_o1_v05/elements.xml-->
<gdmlFile ref="../materials.xml"/> <!-- "/afs/desy.de/project/ilcsoft/sw/x86_64_gcc82_centos7/v02-02-03/lcgeo/v00-16-07/ILD/compact/ILD_o1_v05/materials.xml -->
<gdmlFile ref="../Materials_v1.xml" />
<gdmlFile ref="../extra_materials.xml" />
</includes>

<define>
<!-- world -->
<constant name="world_side" value="10*m" />
<constant name="world_x" value="world_side" />
<constant name="world_y" value="world_side" />
<constant name="world_z" value="world_side" />

<constant name="tracker_region_rmax" value="0*mm" />
<constant name="tracker_region_zmax" value="0*mm" />

</define>


<limits>
<limitset name="cal_limits">
<limit name="step_length_max" particles="*" value="5.0" unit="mm" />
</limitset>
</limits>

<define>
<include ref="../ECAL_commondefs.xml" />
<include ref="../ECAL_commondisp.xml" />
<!--constant name="total_preshower_estimation" value="1.443"/-->
</define>

<readouts>
<readout name="SiEcalCollection">
<!--We are making a very simple segmentation: one single tile that takes the full surface of every layer "/-->
<segmentation type="TiledLayerGridXY"
grid_size_x="Ecal_dim_x*2"
grid_size_y="Ecal_dim_y*2"
offset_x="-(Ecal_dim_x)/2.0"
offset_y="-(Ecal_dim_y)/2.0" />
<id>system:8,layer:8,x:16,y:16,slice:8,module:4</id>
</readout>
<readout name="PixelSiEcalCollection">
<segmentation type="TiledLayerGridXY"
grid_size_x="5.53*mm"
grid_size_y="5.53*mm"
offset_x="-44.24*mm"
offset_y="-44.24*mm" />
<id>system:8,layer:5,slice:4,module:3,x:4,y:4</id>
</readout>
<readout name="PixelSiEcalCollectionCart">
<!-- Cartesian type not working -->
<segmentation type="CartesianGridXY"
grid_size_x="5.53*mm"
grid_size_y="5.53*mm"
offset_x="-44.24*mm"
offset_y="-44.24*mm" />
<id>system:8,layer:5,slice:4,module:3,x:4,y:4</id>
</readout>
</readouts>

<detectors>
<detector name="ECALe_luxe" type="LUXEEcal" vis="EcalVis" id="2500" readout="PixelSiEcalCollection" insideTrackingVolume="false">
<dimensions
x="Ecal_dim_x"
y="Ecal_dim_y"
z="Ecal_dim_z" />
<type_flags type="1" />
<envelope vis="EcalVis">
<shape type="Box"
dx="Ecal_dim_x/2.0 + env_safety"
dy="Ecal_dim_y/2.0 + env_safety"
dz="Ecal_dim_z/2.0 + env_safety"
material="Air" />
<rotation x="0" y="0" z="0" />
<position x="0" y="0" z="Ecal_dim_z/2.0" />
</envelope>


<layer repeat="15" vis="EcalVis">
<!-- the aluminum cover was used in the TB2022-06 but it can be removed! , so we remove it here-->
<!--slice material = "Air" thickness = "48.44*mm" vis="Invisible"/--><!-- Do we need air in front of the detector? how much? for the moment, we ignore it-->
<slice material="TungstenDens1910" thickness="2*Ecal_WThickness" vis="TungstenVis" /> <!-- 2x2.1mm of tungsten in each layer-->
<slice material="CarbonFiber" thickness="Ecal_CFThickness" vis="AirVis" sliceHasModules="false" />
<slice material="Cu" thickness="Ecal_KaptonThickness" vis="AirVis" sliceHasModules="true">
<module id="0" x_offset="-89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="CuVis" />
<module id="4" x_offset="89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="CuVis" />
</slice>
<slice material="Air" thickness="Ecal_GlueThickness_kap" vis="AirVis" />
<slice material="Si" thickness="Ecal_WaferThickness500" vis="AirVis" sliceHasModules="true" sensitive="yes">
<module id="0" x_offset="-134.55*mm" y_offset="-44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="1" x_offset="-44.85*mm" y_offset="-44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="2" x_offset="-134.55*mm" y_offset="44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="3" x_offset="-44.85*mm" y_offset="44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="4" x_offset="44.85*mm" y_offset="-44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="5" x_offset="134.55*mm" y_offset="-44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="6" x_offset="44.85*mm" y_offset="44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
<module id="7" x_offset="134.55*mm" y_offset="44.85*mm" dx="88.48*mm" dy="88.48*mm" vis="SiVis" />
</slice>
<slice material="Air" thickness="Ecal_GlueThickness_pcb" vis="AirVis" />
<!--slice material = "Cu" thickness = "Ecal_KaptonThickness" vis="CuVis" /--> <!-- this part is not existing-->
<slice material="PCB" thickness="Ecal_PcbThickness" vis="AirVis" sliceHasModules="true">
<module id="0" x_offset="-89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="PCBVis" />
<module id="4" x_offset="89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="PCBVis" />
</slice>
<slice material="PCB" thickness="Ecal_ChipThickness" vis="AirVis" sliceHasModules="true">
<module id="0" x_offset="-89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="AirVis" />
<module id="4" x_offset="89.7*mm" y_offset="0*mm" dx="2*89.7*mm" dy="2*89.7*mm" vis="AirVis" />
</slice>
<slice material="Air" thickness="Ecal_w_slab_gap500_4p2mmW" vis="AirVis" />
</layer>

</detector>
</detectors>
</lccdd>
57 changes: 57 additions & 0 deletions compact/ECALe_luxe/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
LUXE ECAL-E - DD4hep
====================

## Structure
This directory contains the definition of the detector model geometries and configurations.
The following descriptions used by all detectors are stored in `..` directory:
* chemical elements,
* materials and extra materials,
* common definitions on the geometry of ECALs, and
* common definitions on the visulisation of ECALs.

The names of compact files for LUXE ECAL-E are formatted as `ECALe_luxe_{variant}.xml` and put under directory `ECALe_luxe`.

The detector consists of multiple layers that are stacked along the longitudinal _z_ direction.
Each layer is then further divided into several slices, which includes a tungsten plate, air gaps, and several silicon and electronic modules.
A module can be moved horizontally within the boundary of a layer,
and more than one module can be placed at the same _z_ position.

Current variant `ECALe_luxe_2512.xml`, partially based on this [interim report for DRD-Calo SiW ECAL](https://indico.cern.ch/event/1551941/contributions/6683124).
- Detector type `LUXEEcal`, id `2500`.
- 15 layers/18 X0 in total.
- Layer composition:
- Pure tungsten (4.2 mm),
- Carbon fibre support (1.5 mm, to be confirmed [TBC]),
- Active sensor unit (ASU), which consists of
- High-voltage film (0.1 mm copper, TBC),
- Conductive glue (0.1 mm air, TBC),
- Si wafer (0.5 mm),
- Conductive glue (0.1 mm air, TBC),
- PCB board (1.7 mm),
- On board ASIC (1.2 mm PCB, TBC), and
- Air gap to make 15 mm longitudinal pitch.
- Per-slice module placement to implement the dead areas between ASUs and wafers.
- This variant has 2 ASUs and 8 wafers.


_**TODO**_
- The readouts in the compact files are not properly implemented.
- The historic definitions should be cleaned out.


## Visualization
To test and visualize the detector, run
```shell
geoDisplay detector_compactfile.xml # or any other geometry
```
To check materials, distances and possible overlappings, run
```shell
materialScan detector_compactfile.xml x0 y0 z0 x1 y1 z1
```
It will display a list of materials encountered by a straight line from `(x0,y0,z0)` to `(x1,y1,z1)`.


## Contribution
This subrepository is based on [Gyros (permission required)](https://gitlab.desy.de/luxe-ecal/performance/gyros/-/tree/main/generation/geometry) by the LUXE ECAL group.

For previous variants `ECALe_luxe_v{0-2}.xml`, please also check the said Gyros repository.
Loading