From ca444cc8b9ea8d19d83afb764592c8b3072169ff Mon Sep 17 00:00:00 2001
From: Li Zhihao <lizhihao@ihep.ac.cn>
Date: Fri, 28 Feb 2025 07:45:07 +0000
Subject: [PATCH] Fix bug of OTK
---
Detector/DetCRD/CMakeLists.txt | 2 +
.../compact/CRD_common_v01/OTKBarrel_v02.xml | 24 +-
.../compact/CRD_common_v01/OTKEndcap_v02.xml | 22 +-
.../Tracker/SiTracker_otkbarrel_v02_geo.cpp | 688 +++++++++---------
.../Tracker/SiTracker_otkendcap_v02_geo.cpp | 315 ++++----
5 files changed, 531 insertions(+), 520 deletions(-)
diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt
index 177a4672..4b824655 100644
--- a/Detector/DetCRD/CMakeLists.txt
+++ b/Detector/DetCRD/CMakeLists.txt
@@ -30,6 +30,8 @@ gaudi_add_module(DetCRD
src/Tracker/SiTracker_itkbarrel_v01_geo.cpp
src/Tracker/SiTracker_itkbarrel_v02_geo.cpp
src/Tracker/SiTracker_otkbarrel_v01_geo.cpp
+ src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
+ src/Tracker/SiTracker_otkendcap_v02_geo.cpp
src/Tracker/SiTracker_otkendcap_v01_geo.cpp
src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
src/Tracker/SiTracker_otkendcap_v02_geo.cpp
diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
index f6e80fdf..5ae78d9b 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
@@ -40,19 +40,23 @@
<module name="OTKBarrel_module" thickness="OTKBarrel_module_thickness" repeat="4"
width="OTKBarrel_module_width" length_inner="OTKBarrel_module_length_inner"
length_outer="OTKBarrel_module_length_outer" vis="SeeThrough">
+ <layer name="glue" width="100.40*mm" thickness="300*um" material="Air" vis="BlackVis"/>
<layer name="carbon_fiber_plane_inner" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/>
- <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="2.4*mm" material="CarbonFiber" vis="BlackVis">
- <tube name="titanium_cooling_pipe" inner_diameter="1.6*mm" outer_diameter="2.0*mm"
- material="CarbonFiber"/>
- </layer>
+ <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="6000*um" material="CarbonFiber" vis="BlackVis"/>
+ <layer name="cooling_fluid" width="100.40*mm" thickness="35.76*0.105*100*um" material="G4_WATER" vis="BlackVis"/>
+ <layer name="cooling_tube_wall" width="100.40*mm" thickness="3.560*0.169*100*um" material="G4_Ti" vis="BlackVis"/>
<layer name="carbon_fiber_plane_outer" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/>
- <layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="CarbonFiber" vis="FTDSensitiveVis"/>
- <data_aggregation name="first_data_aggregation" width="OTKBarrel_module_width" thickness="7.5*mm" length="7.0*mm" vis="SeeThrough">
- <layer name="PCB" thickness="0.5*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/>
- <DC name="DC-DC" thickness="7.0*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/>
+ <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
+ <layer name="glue_2" width="100.40*mm" thickness="100*um" material="Air" vis="BlackVis"/>
+ <layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/>
+ <layer name="pcb_insulating_layers" width="100.40*mm" thickness="28.41*0.07*100*um" material="Polyimide" vis="BlackVis"/>
+ <layer name="pcb_metal_layers" width="100.40*mm" thickness="1.436*0.2*100*um" material="G4_Cu" vis="BlackVis"/>
+ <data_aggregation name="first_data_aggregation" width="104*mm" thickness="0*mm" length="7.0*mm" vis="SeeThrough">
+ <layer name="PCB" thickness="0*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/>
+ <DC name="DC-DC" thickness="0*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/>
</data_aggregation>
</module>
- <data_aggregation name="second_data_aggregation" thickness="7.0*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/>
+ <data_aggregation name="second_data_aggregation" thickness="0*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/>
</ladder>
</stave>
</detector>
@@ -60,7 +64,7 @@
<readouts>
<readout name="OTKBarrelCollection">
- <id>system:5,side:-2,layer:9,module:8,sensor:8,active:8</id>
+ <id>system:5,side:-2,layer:4,module:8,iladder:3,oladder:-4,mmodule:-6</id>
</readout>
</readouts>
</lccdd>
\ No newline at end of file
diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
index 77807d8d..6990e85f 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
@@ -16,6 +16,7 @@
</define>
<detectors>
+ <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/>
<detector id="DetID_OTKEndcap" name="OTKEndcap" type="SiTracker_otkendcap_v02" vis="OTKEndcapVis"
readout="OTKEndcapCollection" insideTrackingVolume="true">
<type_flags type="DetType_TRACKER + DetType_ENDCAP "/>
@@ -43,25 +44,24 @@
<ring name="D4" inner_radius="1668*mm" outer_radius="(1816-0.2)*mm" repeat="16*14" aggregation="2" vis="SeeThrough"/>
</rings>
<layers thickness="11.4*mm">
- <first_data_aggregation name="first_data_aggregation" thickness="7.5*mm" height="7*mm">
- <DC name="DC-DC" thickness="7.0*mm"/>
- <layer name="PCB" thickness="0.5*mm"/>
- </first_data_aggregation>
- <second_data_aggregation name="second_data_aggregation" thickness="7.5*mm">
- <DC name="DC-DC" thickness="7.0*mm"/>
- <layer name="PCB" thickness="0.5*mm"/>
- </second_data_aggregation>
- <layer name="sensor" sensitive="True" thickness="0.3*mm" material="CarbonFiber" vis="FTDSensitiveVis"/>
+ <layer name="PCB_metal_layers" thickness="1.436*0.2*100*um" material="G4_Cu" vis="FTDSupportVis"/>
+ <layer name="PCB_insulating_layers" thickness="28.41*0.07*100*um" material="Polyimide" vis="FTDSupportVis"/>
+ <layer name="sensor" sensitive="True" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/>
+ <layer name="glue_1" thickness="100*um" material="Air" vis="FTDSupportVis"/>
+ <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
<layer name="carbon_fiber_plane" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/>
- <layer name="titanium_cooling_plate" thickness="3*mm" material="CarbonFiber" vis="FTDSupportVis"/>
+ <layer name="cooling_tube_wall" thickness="3.560*0.169*100*um" material="G4_Ti" vis="FTDSupportVis"/>
+ <layer name="cooling_fluid" thickness="35.76*0.105*100*um" material="G4_WATER" vis="FTDSupportVis"/>
+ <layer name="graphite_foam_Honeycom" thickness="6000*um" material="Air" vis="FTDSupportVis"/>
<layer name="carbon_fiber_back_plate" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/>
+ <layer name="glue_2" thickness="200*um" material="Air" vis="FTDSupportVis"/>
</layers>
</detector>
</detectors>
<readouts>
<readout name="OTKEndcapCollection">
- <id>system:5,side:-2,layer:9,module:8,sensor:8,active:8</id>
+ <id>system:5,side:-2,layer:4,module:8,sensor:13</id>
</readout>
</readouts>
</lccdd>
\ No newline at end of file
diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
index 0783a83c..b0aebb60 100644
--- a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
+++ b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
@@ -7,372 +7,354 @@
using namespace dd4hep;
+void check_det_element(DetElement det);
+
static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector sens)
{
- xml_det_t x_det = e;
- Material air = theDetector.air();
- int det_id = x_det.id();
- const std::string name = x_det.nameStr();
- DetElement otk_barrel(name, det_id);
-
- const xml::Component envelop_xml_element = x_det.child("envelope");
- Volume envelope = createPlacedEnvelope(theDetector, e, otk_barrel);
- envelope = envelope.setVisAttributes(theDetector, envelop_xml_element.attr<std::string>("vis"));
- setDetectorTypeFlag(e, otk_barrel);
- if (theDetector.buildType() == BUILD_ENVELOPE) return otk_barrel;
-
- if (x_det.hasAttr(_U(sensitive)))
+ xml_det_t x_det = e;
+ Material air = theDetector.air();
+ int det_id = x_det.id();
+ const std::string name = x_det.nameStr();
+ DetElement otk_barrel(name, det_id);
+
+ const xml::Component envelop_xml_element = x_det.child("envelope");
+ Volume envelope = createPlacedEnvelope(theDetector, e, otk_barrel);
+ envelope = envelope.setVisAttributes(theDetector, envelop_xml_element.attr<std::string>("vis"));
+ setDetectorTypeFlag(e, otk_barrel);
+ if (theDetector.buildType() == BUILD_ENVELOPE)
+ return otk_barrel;
+
+ if (x_det.hasAttr(_U(sensitive)))
+ {
+ const xml_dim_t sd_typ = x_det.child(_U(sensitive));
+ sens.setType(sd_typ.typeStr());
+ }
+ else
+ {
+ sens.setType("tracker");
+ }
+
+ const auto detector_name = x_det.attr<std::string>(_U(name));
+ const auto detector_type = x_det.attr<std::string>(_U(type));
+ std::cout << "Processing Detector: " << detector_name
+ << ", Type: " << detector_type << std::endl;
+
+ /* ================ read parameter from xml file ===================== */
+
+ // read parameter of stave
+ const xml::Component stave = x_det.child("stave");
+ auto stave_name = stave.attr<std::string>("name");
+ int stave_repeat = stave.attr<int>("repeat");
+ double angle_step = 2 * M_PI / stave_repeat;
+ auto stave_length = stave.attr<double>("length");
+ auto stave_thickness = stave.attr<double>("thickness");
+ auto stave_width = stave.attr<double>("width");
+
+ DetElement stave_det(stave_name, det_id);
+
+ // read parameter of ladders in stave
+ const xml::Component ladder = stave.child(_U(ladder));
+ auto ladder_name = ladder.attr<std::string>("name");
+ int ladder_repeat_inner = ladder.attr<int>("repeat_inner");
+ int ladder_repeat_outer = ladder.attr<int>("repeat_outer");
+ double ladder_width = (ladder.attr<double>("width"));
+ double ladder_thickness = (ladder.attr<double>("thickness"));
+ double ladder_length_inner = (ladder.attr<double>("length_inner"));
+ double ladder_length_outer = (ladder.attr<double>("length_outer"));
+ DetElement inner_ladder_det("inner_" + ladder_name, det_id);
+ DetElement outer_ladder_det("outer_" + ladder_name, det_id);
+
+
+ Box inner_ladder_shape(ladder_thickness / 2.0, ladder_width / 2.0, ladder_length_inner / 2.0);
+ Volume inner_ladder_vol("inner_" + ladder_name, inner_ladder_shape, air);
+ inner_ladder_vol = inner_ladder_vol.setVisAttributes(theDetector, ladder.attr<std::string>("vis_inner"));
+ Box outer_ladder_shape(ladder_thickness / 2.0, ladder_width / 2.0, ladder_length_outer / 2.0);
+ Volume outer_ladder_vol("outer_" + ladder_name, outer_ladder_shape, air);
+ outer_ladder_vol = outer_ladder_vol.setVisAttributes(theDetector, ladder.attr<std::string>("vis_outer"));
+
+ // read parameter of second data-aggregation in module
+ const xml::Component second_data_aggregation = ladder.child("data_aggregation");
+ auto second_data_aggregation_name = second_data_aggregation.attr<std::string>("name");
+ auto second_data_aggregation_thickness = second_data_aggregation.attr<double>("thickness");
+ auto second_data_aggregation_width = second_data_aggregation.attr<double>("width");
+ auto second_data_aggregation_length = second_data_aggregation.attr<double>("length");
+
+ Box second_data_aggregation_shape(second_data_aggregation_thickness / 2.0, second_data_aggregation_width / 2.0,
+ second_data_aggregation_length / 2.0);
+ Volume second_data_aggregation_vol(second_data_aggregation_name, second_data_aggregation_shape,
+ air);
+ second_data_aggregation_vol = second_data_aggregation_vol.setVisAttributes(
+ theDetector, second_data_aggregation.attr<std::string>("vis"));
+
+ // read parameter of module in ladder
+ const xml::Component module = ladder.child("module");
+ auto module_name = module.attr<std::string>("name");
+ double module_thickness = (module.attr<double>("thickness"));
+ int module_repeat = module.attr<int>("repeat");
+ double module_width = (module.attr<double>("width"));
+ double module_length_inner = (module.attr<double>("length_inner"));
+ double module_length_outer = (module.attr<double>("length_outer"));
+ DetElement inner_module_det("inner_" + module_name, det_id);
+ DetElement outer_module_det("outer_" + module_name, det_id);
+
+ // read parameter of first data-aggregation in module
+ xml::Component first_data_aggregation = module.child("data_aggregation");
+ auto first_data_aggregation_name = first_data_aggregation.attr<std::string>("name");
+ auto first_data_aggregation_thickness = first_data_aggregation.attr<double>("thickness");
+ double first_data_aggregation_width = (
+ first_data_aggregation.attr<double>("width"));
+ auto first_data_aggregation_length = first_data_aggregation.attr<double>("length");
+ Box first_data_aggregation_shape(first_data_aggregation_thickness / 2.0, first_data_aggregation_width / 2.0,
+ first_data_aggregation_length / 2.0);
+ Volume first_data_aggregation_vol(first_data_aggregation_name, first_data_aggregation_shape,
+ air);
+ first_data_aggregation_vol = first_data_aggregation_vol.setVisAttributes(
+ theDetector, first_data_aggregation.attr<std::string>("vis"));
+
+ // FIXME: Overlap: first_data_aggregation extruded by: first_data_aggregation/PCB_0 ovlp=0.02
+ // {
+ // xml::Component pcb = first_data_aggregation.child("layer");
+ // auto pcb_name = pcb.attr<std::string>("name");
+ // auto pcb_thickness = pcb.attr<double>("thickness");
+ // auto pcb_width = pcb.attr<double>("width");
+ // auto pcb_length = pcb.attr<double>("length");
+ // Box pcb_shape(pcb_thickness / 2.0, pcb_width / 2.0, pcb_length / 2.0);
+ // Volume pcb_vol(pcb_name, pcb_shape, air);
+ // pcb_vol = pcb_vol.setVisAttributes(theDetector, pcb.attr<std::string>("vis"));
+ // first_data_aggregation_vol.placeVolume(
+ // pcb_vol, Position((-first_data_aggregation_thickness + pcb_thickness) / 2.0, 0, 0));
+ //
+ // xml::Component dc = first_data_aggregation.child("DC");
+ // auto dc_name = dc.attr<std::string>("name");
+ // auto dc_thickness = dc.attr<double>("thickness");
+ // auto dc_width = dc.attr<double>("width");
+ // auto dc_length = dc.attr<double>("length");
+ // Box dc_shape(dc_thickness / 2.0, dc_width / 2.0, dc_length / 2.0);
+ // Volume dc_vol(dc_name, dc_shape, air);
+ // dc_vol = dc_vol.setVisAttributes(theDetector, dc.attr<std::string>("vis"));
+ // first_data_aggregation_vol.placeVolume(
+ // dc_vol, Position((first_data_aggregation_thickness - dc_thickness) / 2.0, 0, 0));
+ // }
+
+
+ Box stave_shape(stave_thickness / 2.0, stave_width / 2.0, stave_length / 2.0);
+ double stave_sub_shape_width = (stave_width - first_data_aggregation_width) / 2.0;
+ Box stave_sub_shape(first_data_aggregation_thickness / 2.0, stave_sub_shape_width / 2.0, stave_length / 2.0);
+ SubtractionSolid stave_subtracted_shape(stave_shape, stave_sub_shape, Position(
+ (stave_thickness - first_data_aggregation_thickness) / 2.0,
+ -stave_width / 2.0 + stave_sub_shape_width / 2.0, 0));
+ Volume stave_vol(stave_name, stave_subtracted_shape, air);
+ stave_vol = stave_vol.setVisAttributes(theDetector, stave.attr<std::string>("vis"));
+
+ double module_envelope_shape_base_thickness = module_thickness - first_data_aggregation_thickness;
+ Position translation(module_thickness / 2.0, 0, 0);
+
+ Box inner_module_envelope_shape_base(module_envelope_shape_base_thickness / 2.0, module_width / 2.0,
+ module_length_inner / 2.0);
+ UnionSolid inner_module_envelope_shape(inner_module_envelope_shape_base, first_data_aggregation_shape, translation);
+ Volume inner_module_envelope_vol(module_name + "_inner",
+ inner_module_envelope_shape, air);
+ inner_module_envelope_vol = inner_module_envelope_vol.
+ setVisAttributes(theDetector, module.attr<std::string>("vis"));
+
+ Box outer_module_envelope_shape_base(module_envelope_shape_base_thickness / 2.0, module_width / 2.0,
+ module_length_outer / 2.0);
+ UnionSolid outer_module_envelope_shape(outer_module_envelope_shape_base, first_data_aggregation_shape, translation);
+ Volume outer_module_envelope_vol(module_name + "_outer",
+ outer_module_envelope_shape, air);
+ outer_module_envelope_vol = outer_module_envelope_vol.
+ setVisAttributes(theDetector, module.attr<std::string>("vis"));
+
+
+ // Process layers in module
+ double x_offset = -module_envelope_shape_base_thickness / 2.0;
+ double thickness_sensitive = 0 * mm;
+ double thickness_support = 0 * mm;
+ for (xml_coll_t layers(module, "layer"); layers; ++layers)
+ {
+ xml::Component layer = xml::Handle_t(layers);
+ auto layer_name = layer.attr<std::string>("name");
+ auto layer_thickness = layer.attr<double>("thickness");
+ auto layer_width = layer.attr<double>("width");
+ DetElement inner_layer_det(layer_name + "_inner", det_id);
+ DetElement outer_layer_det(layer_name + "_outer", det_id);
+
+ const Material material = theDetector.material(layer.attr<std::string>("material"));
+ auto vis = layer.attr<std::string>("vis");
+ auto is_sensitive = layer.hasAttr(_U(sensitive));
+
+ const Box inner_layer_shape(layer_thickness / 2.0, layer_width / 2.0, module_length_inner / 2.0);
+ Volume inner_layer_vol(module_name + layer_name + "_inner", inner_layer_shape, material);
+ inner_layer_vol = inner_layer_vol.setVisAttributes(theDetector, vis);
+
+ const Box outer_layer_box(layer_thickness / 2.0, layer_width / 2.0, module_length_outer / 2.0);
+ Volume outer_layer_vol(module_name + layer_name + "_outer", outer_layer_box, material);
+ outer_layer_vol = outer_layer_vol.setVisAttributes(theDetector, vis);
+
+ rec::SurfaceType surf_type;
+
+ if (is_sensitive)
{
- const xml_dim_t sd_typ = x_det.child(_U(sensitive));
- sens.setType(sd_typ.typeStr());
+ inner_layer_vol = inner_layer_vol.setSensitiveDetector(sens);
+ outer_layer_vol = outer_layer_vol.setSensitiveDetector(sens);
+ thickness_sensitive += layer_thickness;
+ surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive, rec::SurfaceType::Plane, rec::SurfaceType::ParallelToZ);
}
else
{
- sens.setType("tracker");
+ thickness_support += layer_thickness;
+ surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane, rec::SurfaceType::ParallelToZ);
}
- const std::string detector_name = x_det.attr<std::string>(_U(name));
- const std::string detector_type = x_det.attr<std::string>(_U(type));
- std::cout << "Processing Detector: " << detector_name
- << ", Type: " << detector_type << std::endl;
-
- /* ================ read parameter from xml file ===================== */
-
- // read parameter of stave
- const xml::Component stave = x_det.child("stave");
- auto stave_name = stave.attr<std::string>("name");
- int stave_repeat = stave.attr<int>("repeat");
- double angle_step = 2 * M_PI / stave_repeat;
- double stave_length = theDetector.constant<double>(stave.attr<std::string>("length"));
- double stave_thickness = theDetector.constant<double>(stave.attr<std::string>("thickness"));
- double stave_width = theDetector.constant<double>(stave.attr<std::string>("width"));
-
- DetElement stave_det(stave_name, det_id);
-
- // read parameter of ladders in stave
- const xml::Component ladder = stave.child(_U(ladder));
- auto ladder_name = ladder.attr<std::string>("name");
- int ladder_repeat_inner = ladder.attr<int>("repeat_inner");
- int ladder_repeat_outer = ladder.attr<int>("repeat_outer");
- double ladder_width = theDetector.constant<double>(ladder.attr<std::string>("width"));
- double ladder_thickness = theDetector.constant<double>(ladder.attr<std::string>("thickness"));
- double ladder_length_inner = theDetector.constant<double>(ladder.attr<std::string>("length_inner"));
- double ladder_length_outer = theDetector.constant<double>(ladder.attr<std::string>("length_outer"));
- DetElement inner_ladder_det("inner_" + ladder_name, det_id);
- DetElement outer_ladder_det("outer_" + ladder_name, det_id);
-
-
- Box inner_ladder_shape(ladder_thickness / 2.0, ladder_width / 2.0, ladder_length_inner / 2.0);
- Volume inner_ladder_vol("inner_" + ladder_name, inner_ladder_shape, air);
- inner_ladder_vol = inner_ladder_vol.setVisAttributes(theDetector, ladder.attr<std::string>("vis_inner"));
- Box outer_ladder_shape(ladder_thickness / 2.0, ladder_width / 2.0, ladder_length_outer / 2.0);
- Volume outer_ladder_vol("outer_" + ladder_name, outer_ladder_shape, air);
- outer_ladder_vol = outer_ladder_vol.setVisAttributes(theDetector, ladder.attr<std::string>("vis_outer"));
-
- // read parameter of second data-aggregation in module
- const xml::Component second_data_aggregation = ladder.child("data_aggregation");
- auto second_data_aggregation_name = second_data_aggregation.attr<std::string>("name");
- double second_data_aggregation_thickness = second_data_aggregation.attr<double>("thickness");
- double second_data_aggregation_width = second_data_aggregation.attr<double>("width");
- double second_data_aggregation_length = second_data_aggregation.attr<double>("length");
-
- Box second_data_aggregation_shape(second_data_aggregation_thickness / 2.0, second_data_aggregation_width / 2.0,
- second_data_aggregation_length / 2.0);
- Volume second_data_aggregation_vol(second_data_aggregation_name, second_data_aggregation_shape,
- air);
- second_data_aggregation_vol = second_data_aggregation_vol.setVisAttributes(
- theDetector, second_data_aggregation.attr<std::string>("vis"));
-
- // read parameter of module in ladder
- const xml::Component module = ladder.child("module");
- auto module_name = module.attr<std::string>("name");
- double module_thickness = theDetector.constant<double>(module.attr<std::string>("thickness"));
- int module_repeat = module.attr<int>("repeat");
- double module_width = theDetector.constant<double>(module.attr<std::string>("width"));
- double module_length_inner = theDetector.constant<double>(module.attr<std::string>("length_inner"));
- double module_length_outer = theDetector.constant<double>(module.attr<std::string>("length_outer"));
- DetElement inner_module_det("inner_" + module_name, det_id);
- DetElement outer_module_det("outer_" + module_name, det_id);
-
- // read parameter of first data-aggregation in module
- xml::Component first_data_aggregation = module.child("data_aggregation");
- auto first_data_aggregation_name = first_data_aggregation.attr<std::string>("name");
- double first_data_aggregation_thickness = first_data_aggregation.attr<double>("thickness");
- double first_data_aggregation_width = theDetector.constant<double>(
- first_data_aggregation.attr<std::string>("width"));
- double first_data_aggregation_length = first_data_aggregation.attr<double>("length");
- Box first_data_aggregation_shape(first_data_aggregation_thickness / 2.0, first_data_aggregation_width / 2.0,
- first_data_aggregation_length / 2.0);
- Volume first_data_aggregation_vol(first_data_aggregation_name, first_data_aggregation_shape,
- air);
- first_data_aggregation_vol = first_data_aggregation_vol.setVisAttributes(
- theDetector, first_data_aggregation.attr<std::string>("vis"));
- {
- xml::Component pcb = first_data_aggregation.child("layer");
- auto pcb_name = pcb.attr<std::string>("name");
- double pcb_thickness = pcb.attr<double>("thickness");
- double pcb_width = theDetector.constant<double>(pcb.attr<std::string>("width"));
- double pcb_length = pcb.attr<double>("length");
- Box pcb_shape(pcb_thickness / 2.0, pcb_width / 2.0, pcb_length / 2.0);
- Volume pcb_vol(pcb_name, pcb_shape, air);
- pcb_vol = pcb_vol.setVisAttributes(theDetector, pcb.attr<std::string>("vis"));
- first_data_aggregation_vol.placeVolume(
- pcb_vol, Position((-first_data_aggregation_thickness + pcb_thickness) / 2.0, 0, 0));
-
- xml::Component dc = first_data_aggregation.child("DC");
- auto dc_name = dc.attr<std::string>("name");
- double dc_thickness = dc.attr<double>("thickness");
- double dc_width = dc.attr<double>("width");
- double dc_length = dc.attr<double>("length");
- Box dc_shape(dc_thickness / 2.0, dc_width / 2.0, dc_length / 2.0);
- Volume dc_vol(dc_name, dc_shape, air);
- dc_vol = dc_vol.setVisAttributes(theDetector,dc.attr<std::string>("vis"));
- first_data_aggregation_vol.placeVolume(
- dc_vol, Position((first_data_aggregation_thickness - dc_thickness) / 2.0, 0, 0));
- }
+ //TODO: add tube
+ // if (layer.hasChild(_U(tube)))
+ // {
+ // xml::Component tube = layer.child(_U(tube));
+ // auto tube_name = tube.attr<std::string>("name");
+ // double inner_diameter = tube.attr<double>("inner_diameter");
+ // double outer_diameter = tube.attr<double>("outer_diameter");
+ // }
- Box stave_shape(stave_thickness / 2.0, stave_width / 2.0, stave_length / 2.0);
- double stave_sub_shape_width = (stave_width - first_data_aggregation_width) / 2.0;
- Box stave_sub_shape(first_data_aggregation_thickness / 2.0, stave_sub_shape_width / 2.0, stave_length / 2.0);
- SubtractionSolid stave_subtracted_shape(stave_shape, stave_sub_shape, Position(
- (stave_thickness - first_data_aggregation_thickness) / 2.0,
- -stave_width / 2.0 + stave_sub_shape_width / 2.0, 0));
- Volume stave_vol(stave_name, stave_subtracted_shape, air);
- stave_vol = stave_vol.setVisAttributes(theDetector, stave.attr<std::string>("vis"));
-
- double module_envelope_shape_base_thickness = module_thickness - first_data_aggregation_thickness;
- Position translation(module_thickness / 2.0, 0, 0);
-
- Box inner_module_envelope_shape_base(module_envelope_shape_base_thickness / 2.0, module_width / 2.0,
- module_length_inner / 2.0);
- UnionSolid inner_module_envelope_shape(inner_module_envelope_shape_base, first_data_aggregation_shape, translation);
- Volume inner_module_envelope_vol(module_name + "_inner",
- inner_module_envelope_shape, air);
- inner_module_envelope_vol = inner_module_envelope_vol.
- setVisAttributes(theDetector, module.attr<std::string>("vis"));
-
- Box outer_module_envelope_shape_base(module_envelope_shape_base_thickness / 2.0, module_width / 2.0,
- module_length_outer / 2.0);
- UnionSolid outer_module_envelope_shape(outer_module_envelope_shape_base, first_data_aggregation_shape, translation);
- Volume outer_module_envelope_vol(module_name + "_outer",
- outer_module_envelope_shape, air);
- outer_module_envelope_vol = outer_module_envelope_vol.
- setVisAttributes(theDetector, module.attr<std::string>("vis"));
-
-
- // Process layers in module
- double x_offset = -module_envelope_shape_base_thickness / 2.0;
- double thickness_sensitive = 0 * mm;
- double thickness_support = 0 * mm;
- for (xml_coll_t layers(module, "layer"); layers; ++layers)
- {
- xml::Component layer = xml::Handle_t(layers);
- auto layer_name = layer.attr<std::string>("name");
- double layer_thickness = layer.attr<double>("thickness");
- double layer_width = layer.attr<double>("width");
- DetElement inner_layer_det(layer_name, det_id);
- DetElement outer_layer_det(layer_name, det_id);
-
- const Material material = theDetector.material(layer.attr<std::string>("material"));
- auto vis = layer.attr<std::string>("vis");
- auto is_sensitive = layer.hasAttr(_U(sensitive));
-
- const Box inner_layer_shape(layer_thickness / 2.0, layer_width / 2.0, module_length_inner / 2.0);
- Volume inner_layer_vol(module_name + layer_name, inner_layer_shape, material);
- inner_layer_vol = inner_layer_vol.setVisAttributes(theDetector, vis);
-
- const Box outer_layer_box(layer_thickness / 2.0, layer_width / 2.0, module_length_outer / 2.0);
- Volume outer_layer_vol(module_name + layer_name, outer_layer_box, material);
- outer_layer_vol = outer_layer_vol.setVisAttributes(theDetector, vis);
-
- rec::SurfaceType surf_type;
-
- if (is_sensitive)
- {
- double sub_half_x = layer_thickness / 2.0;
- double sub_half_y = layer_width / 4.0;
- double sub_half_z_inner = module_length_inner / 4.0;
- double sub_half_z_outer = module_length_outer / 4.0;
-
- Box sub_box_shape_inner(sub_half_x, sub_half_y, sub_half_z_inner);
- Box sub_box_shape_outer(sub_half_x, sub_half_y, sub_half_z_outer);
-
- std::vector<std::pair<Position, Position>> sub_box_positions = {
- {{0, sub_half_y, sub_half_z_inner}, {0, sub_half_y, sub_half_z_outer}},
- {{0, sub_half_y, -sub_half_z_inner}, {0, sub_half_y, -sub_half_z_outer}},
- {{0, -sub_half_y, -sub_half_z_inner}, {0, -sub_half_y, -sub_half_z_outer}},
- {{0, -sub_half_y, sub_half_z_inner}, {0, -sub_half_y, sub_half_z_outer}}
- };
-
-
- for (size_t i = 0; i < 4; ++i)
- {
- Volume sub_box_vol_inner(module_name + layer_name + std::to_string(i), sub_box_shape_inner, material);
- Volume sub_box_vol_outer(module_name + layer_name + std::to_string(i), sub_box_shape_outer, material);
- sub_box_vol_inner = sub_box_vol_inner.setVisAttributes(theDetector, "SeeThrough");
- sub_box_vol_outer = sub_box_vol_outer.setVisAttributes(theDetector, "SeeThrough");
- sub_box_vol_outer = sub_box_vol_outer.setSensitiveDetector(sens);
- sub_box_vol_inner = sub_box_vol_inner.setSensitiveDetector(sens);
- inner_layer_vol.placeVolume(sub_box_vol_inner, sub_box_positions[i].first).addPhysVolID("sensor", i);
- outer_layer_vol.placeVolume(sub_box_vol_outer, sub_box_positions[i].second).addPhysVolID("sensor", i);
- }
- thickness_sensitive += layer_thickness;
- surf_type = rec::SurfaceType::Sensitive;
- }
- else
- {
- thickness_support += layer_thickness;
- surf_type = rec::SurfaceType::Plane;
- }
-
- rec::Vector3D u(0., 0., 1.);
- rec::Vector3D v(0., 1., 0.);
- rec::Vector3D n(1., 0., 0.);
- rec::VolPlane inner_surf(inner_layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
- rec::VolPlane outer_surf(outer_layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
- rec::volSurfaceList(inner_layer_det)->push_back(inner_surf);
- rec::volSurfaceList(outer_layer_det)->push_back(outer_surf);
-
- //TODO: add tube
- // if (layer.hasChild(_U(tube)))
- // {
- // xml::Component tube = layer.child(_U(tube));
- // auto tube_name = tube.attr<std::string>("name");
- // double inner_diameter = tube.attr<double>("inner_diameter");
- // double outer_diameter = tube.attr<double>("outer_diameter");
- // }
-
- // construct module
- Position layer_pos(x_offset + layer_thickness / 2.0, 0, 0);
- inner_layer_det.setPlacement(inner_module_envelope_vol.placeVolume(inner_layer_vol, layer_pos));
- outer_layer_det.setPlacement(outer_module_envelope_vol.placeVolume(outer_layer_vol, layer_pos));
- inner_module_det.add(inner_layer_det);
- outer_module_det.add(outer_layer_det);
- x_offset += layer_thickness;
- }
+ rec::Vector3D u(0., 1., 0.);
+ rec::Vector3D v(0., 0., 1.);
+ rec::Vector3D n(1., 0., 0.);
+ rec::VolPlane inner_surf(inner_layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
+ rec::VolPlane outer_surf(outer_layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
+ rec::volSurfaceList(inner_layer_det)->push_back(inner_surf);
+ rec::volSurfaceList(outer_layer_det)->push_back(outer_surf);
// construct module
- DetElement first_data_aggregation_det_inner(first_data_aggregation_name, det_id);
- DetElement first_data_aggregation_det_outer(first_data_aggregation_name, det_id);
- Position first_data_aggregation_pos(x_offset + first_data_aggregation_thickness / 2.0, 0, 0);
- first_data_aggregation_det_inner.setPlacement(
- inner_module_envelope_vol.placeVolume(first_data_aggregation_vol, first_data_aggregation_pos));
- first_data_aggregation_det_outer.setPlacement(
- outer_module_envelope_vol.placeVolume(first_data_aggregation_vol, first_data_aggregation_pos));
- inner_module_det.add(first_data_aggregation_det_inner);
- outer_module_det.add(first_data_aggregation_det_outer);
-
- // construct ladder
- for (int i = 0; i < module_repeat; ++i)
- {
- double z_position = -(module_repeat / 2.0) * module_length_inner + module_length_inner / 2.0 + i *
- module_length_inner;
- Position pos((module_envelope_shape_base_thickness - ladder_thickness) / 2.0, 0, z_position);
- auto cloned_inner_module_det = inner_module_det.clone("inner_" + module_name + std::to_string(i), det_id);
- cloned_inner_module_det.setPlacement(
- inner_ladder_vol.placeVolume(inner_module_envelope_vol, pos).addPhysVolID("active", i));
- inner_ladder_det.add(cloned_inner_module_det);
-
- double z_position_outer = -(module_repeat / 2.0) * module_length_outer + module_length_outer / 2.0 + i *
- module_length_outer;
- Position pos_outer((module_envelope_shape_base_thickness - ladder_thickness) / 2.0, 0, z_position_outer);
- auto cloned_outer_module_det = outer_module_det.clone("outer_" + module_name + std::to_string(i), det_id);
- cloned_outer_module_det.setPlacement(
- outer_ladder_vol.placeVolume(outer_module_envelope_vol, pos_outer).addPhysVolID("active", i));
- outer_ladder_det.add(cloned_outer_module_det);
- }
-
- DetElement second_data_aggregation_det_inner(second_data_aggregation_name, det_id);
- DetElement second_data_aggregation_det_outer(second_data_aggregation_name, det_id);
- Position second_data_aggregation_pos((ladder_thickness - second_data_aggregation_thickness) / 2.0,
- (module_width - second_data_aggregation_width) / 2.0, 0);
- second_data_aggregation_det_inner.setPlacement(
- inner_ladder_vol.placeVolume(second_data_aggregation_vol, second_data_aggregation_pos));
- second_data_aggregation_det_outer.setPlacement(
- outer_ladder_vol.placeVolume(second_data_aggregation_vol, second_data_aggregation_pos));
- inner_ladder_det.add(second_data_aggregation_det_inner);
- outer_ladder_det.add(second_data_aggregation_det_outer);
-
- // inner ladder
- for (int i = 0; i < ladder_repeat_inner; ++i)
- {
- double z_position = -(ladder_repeat_inner / 2.0) * ladder_length_inner + (i + 0.5) * ladder_length_inner;
- Position pos(0, 0, z_position);
- auto cloned_inner_ladder_det = inner_ladder_det.clone("inner_" + ladder_name + std::to_string(i), det_id);
- cloned_inner_ladder_det.setPlacement(
- stave_vol.placeVolume(inner_ladder_vol, pos).addPhysVolID("module", ladder_repeat_outer / 2 + i));
- stave_det.add(cloned_inner_ladder_det);
- }
-
- // outer ladder (positive x)
- for (int i = 0; i < ladder_repeat_outer / 2; ++i)
- {
- double z_position = ladder_length_inner * (ladder_repeat_inner / 2.0) + (i + 0.5) * ladder_length_outer;
- Position pos(0, 0, z_position);
- auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(i + 1), det_id);
- cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID(
- "module", ladder_repeat_outer / 2 + ladder_repeat_inner + i));
- stave_det.add(cloned_outer_ladder_det);
- }
-
- // outer ladder (neg x)
- for (int i = 0; i < ladder_repeat_outer / 2; ++i)
- {
- double z_position = -ladder_length_inner * (ladder_repeat_inner / 2.0) - (i + 0.5) * ladder_length_outer;
- Position pos(0, 0, z_position);
- auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(-i - 1), det_id);
- cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("module", i));
- stave_det.add(cloned_outer_ladder_det);
- }
-
- // place rotated stave into envelope
- double otk_inner_radius = theDetector.constant<double>("OTKBarrel_inner_radius");
- double stave_x_offset = otk_inner_radius + stave_thickness / 2.0;
- double stave_y_offset = stave_width / 2.0;
- auto z_planar_data = new rec::ZPlanarData;
- for (int i = 0; i < stave_repeat; ++i)
- {
- double angle = i * angle_step;
- // calculate rotated pos
- double rotated_x = stave_x_offset * cos(angle) - stave_y_offset * sin(angle);
- double rotated_y = stave_x_offset * sin(angle) + stave_y_offset * cos(angle);
- auto cloned_stave_det = stave_det.clone("stave_" + std::to_string(i), det_id);
- cloned_stave_det.setPlacement(
- envelope.placeVolume(stave_vol, Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0.0))).
- addPhysVolID("layer", i).addPhysVolID("side", 0));
- otk_barrel.add(cloned_stave_det);
-
- rec::ZPlanarData::LayerLayout otk_barrel_layer;
- otk_barrel_layer.phi0 = angle;
- otk_barrel_layer.ladderNumber = ladder_repeat_outer + ladder_repeat_inner;
- otk_barrel_layer.thicknessSensitive = thickness_sensitive;
- otk_barrel_layer.thicknessSupport = thickness_support;
- otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support;
- otk_barrel_layer.distanceSupport = otk_inner_radius;
- otk_barrel_layer.offsetSensitive = stave_y_offset;
- otk_barrel_layer.offsetSupport = stave_y_offset;
- otk_barrel_layer.widthSensitive = module_width;
- otk_barrel_layer.widthSupport = module_width;
- otk_barrel_layer.sensorsPerLadder = module_repeat * 4;
- double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer /
- 2.0;
- otk_barrel_layer.zHalfSensitive = z_half;
- otk_barrel_layer.zHalfSupport = z_half;
- z_planar_data->layers.push_back(otk_barrel_layer);
- }
-#ifdef DET_ELEMENT_DEBUG
- check_det_element(otk_barrel);
-#endif
-
- otk_barrel.addExtension<rec::ZPlanarData>(z_planar_data);
- if (x_det.hasAttr(_U(combineHits)))
- {
- otk_barrel.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
- }
- return otk_barrel;
+ Position layer_pos(x_offset + layer_thickness / 2.0, 0, 0);
+ inner_layer_det.setPlacement(
+ inner_module_envelope_vol.placeVolume(inner_layer_vol, layer_pos));
+ outer_layer_det.setPlacement(
+ outer_module_envelope_vol.placeVolume(outer_layer_vol, layer_pos));
+ inner_module_det.add(inner_layer_det);
+ outer_module_det.add(outer_layer_det);
+ x_offset += layer_thickness;
+
+ }
+
+ // construct module
+ DetElement first_data_aggregation_det_inner(first_data_aggregation_name + "_inner", det_id);
+ DetElement first_data_aggregation_det_outer(first_data_aggregation_name + "_outer", det_id);
+ Position first_data_aggregation_pos(x_offset + first_data_aggregation_thickness / 2.0, 0, 0);
+ first_data_aggregation_det_inner.setPlacement(
+ inner_module_envelope_vol.placeVolume(first_data_aggregation_vol, first_data_aggregation_pos));
+ first_data_aggregation_det_outer.setPlacement(
+ outer_module_envelope_vol.placeVolume(first_data_aggregation_vol, first_data_aggregation_pos));
+ inner_module_det.add(first_data_aggregation_det_inner);
+ outer_module_det.add(first_data_aggregation_det_outer);
+
+ // construct ladder
+ for (int i = 0; i < module_repeat; ++i)
+ {
+ double z_position = -(module_repeat / 2.0) * module_length_inner + module_length_inner / 2.0 + i *
+ module_length_inner;
+ Position pos((module_envelope_shape_base_thickness - ladder_thickness) / 2.0, 0, z_position);
+ auto cloned_inner_module_det = inner_module_det.clone("inner_" + module_name + std::to_string(i));
+ cloned_inner_module_det.setPlacement(
+ inner_ladder_vol.placeVolume(inner_module_envelope_vol, pos).addPhysVolID("mmodule", i + 1));
+ inner_ladder_det.add(cloned_inner_module_det);
+
+ double z_position_outer = -(module_repeat / 2.0) * module_length_outer + module_length_outer / 2.0 + i *
+ module_length_outer;
+ Position pos_outer((module_envelope_shape_base_thickness - ladder_thickness) / 2.0, 0, z_position_outer);
+ auto cloned_outer_module_det = outer_module_det.clone("outer_" + module_name + std::to_string(i));
+ cloned_outer_module_det.setPlacement(
+ outer_ladder_vol.placeVolume(outer_module_envelope_vol, pos_outer).addPhysVolID("mmodule", -(i + 1)));
+ outer_ladder_det.add(cloned_outer_module_det);
+ }
+
+ DetElement second_data_aggregation_det_inner(second_data_aggregation_name + "_inner", det_id);
+ DetElement second_data_aggregation_det_outer(second_data_aggregation_name + "_outer", det_id);
+ Position second_data_aggregation_pos((ladder_thickness - second_data_aggregation_thickness) / 2.0,
+ (module_width - second_data_aggregation_width) / 2.0, 0);
+ second_data_aggregation_det_inner.setPlacement(
+ inner_ladder_vol.placeVolume(second_data_aggregation_vol, second_data_aggregation_pos));
+ second_data_aggregation_det_outer.setPlacement(
+ outer_ladder_vol.placeVolume(second_data_aggregation_vol, second_data_aggregation_pos));
+ inner_ladder_det.add(second_data_aggregation_det_inner);
+ outer_ladder_det.add(second_data_aggregation_det_outer);
+
+ // inner ladder
+ for (int i = 0; i < ladder_repeat_inner; ++i)
+ {
+ double z_position = -(ladder_repeat_inner / 2.0) * ladder_length_inner + (i + 0.5) * ladder_length_inner;
+ Position pos(0, 0, z_position);
+ auto cloned_inner_ladder_det = inner_ladder_det.clone("inner_" + ladder_name + std::to_string(i));
+ cloned_inner_ladder_det.setPlacement(
+ stave_vol.placeVolume(inner_ladder_vol, pos).addPhysVolID("iladder", i));
+ stave_det.add(cloned_inner_ladder_det);
+ }
+
+ // outer ladder (positive x)
+ for (int i = 0; i < ladder_repeat_outer / 2; ++i)
+ {
+ double z_position = ladder_length_inner * (ladder_repeat_inner / 2.0) + (i + 0.5) * ladder_length_outer;
+ Position pos(0, 0, z_position);
+ auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(i + 1));
+ cloned_outer_ladder_det.setPlacement(
+ stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("oladder", i + 1));
+ stave_det.add(cloned_outer_ladder_det);
+ }
+
+ // outer ladder (neg x)
+ for (int i = 0; i < ladder_repeat_outer / 2; ++i)
+ {
+ double z_position = -ladder_length_inner * (ladder_repeat_inner / 2.0) - (i + 0.5) * ladder_length_outer;
+ Position pos(0, 0, z_position);
+ auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(-i - 1));
+ cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("module", i));
+ stave_det.add(cloned_outer_ladder_det);
+ }
+
+ // place rotated stave into envelope
+ double otk_inner_radius = theDetector.constant<double>("OTKBarrel_inner_radius");
+ double stave_x_offset = otk_inner_radius + stave_thickness / 2.0;
+ double stave_y_offset = stave_width / 2.0;
+ auto z_planar_data = new rec::ZPlanarData;
+ for (int i = 0; i < stave_repeat; ++i)
+ {
+ double angle = i * angle_step;
+ // calculate rotated pos
+ double rotated_x = stave_x_offset * cos(angle) - stave_y_offset * sin(angle);
+ double rotated_y = stave_x_offset * sin(angle) + stave_y_offset * cos(angle);
+ auto cloned_stave_det = stave_det.clone("stave_" + std::to_string(i));
+ cloned_stave_det.setPlacement(
+ envelope.placeVolume(stave_vol, Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0.0))).
+ addPhysVolID("module", i));
+ otk_barrel.add(cloned_stave_det);
+
+ rec::ZPlanarData::LayerLayout otk_barrel_layer;
+ otk_barrel_layer.phi0 = angle;
+ otk_barrel_layer.ladderNumber = ladder_repeat_outer + ladder_repeat_inner;
+ otk_barrel_layer.thicknessSensitive = thickness_sensitive;
+ otk_barrel_layer.thicknessSupport = thickness_support;
+ otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support;
+ otk_barrel_layer.distanceSupport = otk_inner_radius;
+ otk_barrel_layer.offsetSensitive = stave_y_offset;
+ otk_barrel_layer.offsetSupport = stave_y_offset;
+ otk_barrel_layer.widthSensitive = module_width;
+ otk_barrel_layer.widthSupport = module_width;
+ otk_barrel_layer.sensorsPerLadder = module_repeat * 4;
+ double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer /
+ 2.0;
+ otk_barrel_layer.zHalfSensitive = z_half;
+ otk_barrel_layer.zHalfSupport = z_half;
+ z_planar_data->layers.push_back(otk_barrel_layer);
+ }
+
+ // check_det_element(otk_barrel);
+
+ otk_barrel.addExtension<rec::ZPlanarData>(z_planar_data);
+ if (x_det.hasAttr(_U(combineHits)))
+ {
+ otk_barrel.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
+ }
+ return otk_barrel;
}
DECLARE_DETELEMENT(SiTracker_otkbarrel_v02, create_element)
-
diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
index 18bdbd9b..12c866ac 100644
--- a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
+++ b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
@@ -9,171 +9,194 @@ using namespace dd4hep;
inline double calculate_polygon_side_length(const double radius, const int sides)
{
- return 2 * radius * tan(M_PI / sides);
+ return 2 * radius * tan(M_PI / sides);
}
-// #define DET_ELEMENT_DEBUG
+#define DET_ELEMENT_DEBUG
#ifdef DET_ELEMENT_DEBUG
void check_det_element(const DetElement det)
{
- std::cout << "Checking DetElement: " << det.name() << std::endl;
- if (det.children().size() == 0)
+ std::cout << "====Start Checking DetElement: ====" << det.name() << std::endl;
+ std::cout << "path: " << det.path() << " id: " << det.id() << std::endl;
+
+ for (const auto& [name, id] : det.placement().volIDs())
+ {
+ std::cout << "volID: " << name << " " << id << std::endl;
+ }
+
+ std::cout << det.volumeID() << std::endl;
+ if (const auto list = det.extension<rec::VolSurfaceList>(false))
+ {
+ for (const auto& surf : *list)
{
- std::cout << "name: " << det.name() << std::endl;
- std::cout << "path: " << det.path() << std::endl;
- std::cout << "No Children: " << det.name() << std::endl;
- const auto list = det.extension<rec::VolSurfaceList>(false);
- if (!list) return;
- for (auto surf : *list)
- {
- std::cout << "!!!Surface: " << surf.volume().name() << std::endl;
- }
- return;
- }
- for (auto [fst, snd] : det.children())
- {
- check_det_element(snd);
+ std::cout << "!!!Surface: " << surf.volume().name() << std::endl;
+ std::cout << "!!!Surface ID: " << surf.id() << std::endl;
+ std::cout << "!!!Surface Type : " << surf.type() << std::endl;
}
+ }
+ std::cout << "====End Checking DetElement: ====" << det.name() << std::endl;
+
+ for (const auto& [fst, snd] : det.children())
+ {
+ check_det_element(snd);
+ }
+
}
#endif
static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector sens)
{
- xml_det_t x_det = e;
- Material air = theDetector.air();
- int det_id = x_det.id();
- const std::string name = x_det.nameStr();
- DetElement otk_endcaps(name, det_id);
-
- const xml::Component envelop_xml_element = x_det.child("envelope");
- Volume envelope = createPlacedEnvelope(theDetector, e, otk_endcaps);
- envelope = envelope.setVisAttributes(theDetector, envelop_xml_element.attr<std::string>("vis"));
- setDetectorTypeFlag(e, otk_endcaps);
- if (theDetector.buildType() == BUILD_ENVELOPE) return otk_endcaps;
-
- if (x_det.hasAttr(_U(sensitive)))
- {
- const xml_dim_t sd_typ = x_det.child(_U(sensitive));
- sens.setType(sd_typ.typeStr());
- }
- else
+ xml_det_t x_det = e;
+ Material air = theDetector.air();
+ int det_id = x_det.id();
+ const std::string name = x_det.nameStr();
+ DetElement otk_endcaps(name, det_id);
+ auto zDiskPetalsData = new rec::ZDiskPetalsData;
+
+ const xml::Component envelop_xml_element = x_det.child("envelope");
+ Volume envelope = createPlacedEnvelope(theDetector, e, otk_endcaps);
+ envelope = envelope.setVisAttributes(theDetector, envelop_xml_element.attr<std::string>("vis"));
+ setDetectorTypeFlag(e, otk_endcaps);
+ if (theDetector.buildType() == BUILD_ENVELOPE)
+ return otk_endcaps;
+
+ if (x_det.hasAttr(_U(sensitive)))
+ {
+ const xml_dim_t sd_typ = x_det.child(_U(sensitive));
+ sens.setType(sd_typ.typeStr());
+ }
+ else
+ {
+ sens.setType("tracker");
+ }
+
+ const auto detector_name = x_det.attr<std::string>(_U(name));
+ const auto detector_type = x_det.attr<std::string>(_U(type));
+ std::cout << "Processing Detector: " << detector_name
+ << ", Type: " << detector_type << std::endl;
+
+ // start construction
+ const xml::Component rings_xml = x_det.child("rings");
+ const xml::Component layers_xml = x_det.child("layers");
+
+ auto zmax = rings_xml.attr<double>("zmax");
+
+ int ring_num = 0;
+ for (xml_coll_t rings(rings_xml, "ring"); rings; ++rings, ++ring_num)
+ {
+ xml::Component ring = xml::Handle_t(rings);
+ const auto ring_name = ring.attr<std::string>("name");
+ const auto ring_inner_radius = ring.attr<double>("inner_radius");
+ const auto ring_outer_radius = ring.attr<double>("outer_radius");
+ const int repeat = ring.attr<int>("repeat");
+ double angle_step = 2 * M_PI / repeat;
+ DetElement ring_piece_det(ring_name, det_id);
+
+ const double trapezoid_height = ring_outer_radius - ring_inner_radius;
+ const double trapezoid_inner_length = calculate_polygon_side_length(ring_inner_radius, repeat);
+ const double trapezoid_outer_length = calculate_polygon_side_length(ring_outer_radius, repeat);
+ const auto layers_thickness = layers_xml.attr<double>("thickness");
+ const double layers_base_thickness = layers_thickness;
+
+ Trapezoid layer_base_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0,
+ layers_base_thickness / 2.0, layers_base_thickness / 2.0, trapezoid_height / 2.0);
+ Volume layer_base_vol(ring_name, layer_base_shape, air);
+ layer_base_vol = layer_base_vol.setVisAttributes(theDetector, ring.attr<std::string>("vis"));
+
+ double y_offset = -layers_base_thickness / 2.0;
+ for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers)
{
- sens.setType("tracker");
+ const xml::Component layer = xml::Handle_t(layers);
+ const auto layer_name = layer.attr<std::string>("name");
+ const auto layer_thickness = layer.attr<double>("thickness");
+ const Material material = theDetector.material(layer.attr<std::string>("material"));
+ const auto vis = layer.attr<std::string>("vis");
+ auto is_sensitive = layer.hasAttr(_U(sensitive));
+ DetElement layer_base_det(layer_name, det_id);
+ rec::SurfaceType surf_type;
+
+ Trapezoid layer_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0, layer_thickness / 2.0,
+ layer_thickness / 2.0, trapezoid_height / 2.0);
+ Volume layer_vol(layer_name, layer_shape, material);
+ layer_vol = layer_vol.setVisAttributes(theDetector, vis);
+ if (is_sensitive)
+ {
+ layer_vol = layer_vol.setSensitiveDetector(sens);
+ surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive, rec::SurfaceType::Plane);
+ }
+ else
+ {
+ surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane);
+ }
+ rec::Vector3D u(1., 0., 0.);
+ rec::Vector3D v(0., 0., 1.);
+ rec::Vector3D n(0., 1., 0.);
+ rec::VolPlane surf(layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
+ rec::volSurfaceList(layer_base_det)->push_back(surf);
+
+ layer_base_det.setPlacement(
+ layer_base_vol.placeVolume(layer_vol, Position(0, y_offset + layer_thickness / 2.0, 0)));
+ ring_piece_det.add(layer_base_det);
+ y_offset += layer_thickness;
}
- const std::string detector_name = x_det.attr<std::string>(_U(name));
- const std::string detector_type = x_det.attr<std::string>(_U(type));
- std::cout << "Processing Detector: " << detector_name
- << ", Type: " << detector_type << std::endl;
+ auto rotationX = RotationX(90.0 * deg);
+ auto rotationZ = RotationZ(90.0 * deg);
+ auto neg_rotationX = RotationX(-90.0 * deg);
+ auto neg_rotationZ = RotationZ(-90.0 * deg);
- // start construction
- const xml::Component rings_xml = x_det.child("rings");
- const xml::Component layers_xml = x_det.child("layers");
-
- double zmax = theDetector.constant<double>(rings_xml.attr<std::string>("zmax"));
-
- const xml::Component first_data_aggregation = layers_xml.child("first_data_aggregation");
- const double first_data_aggregation_thickness = first_data_aggregation.attr<double>("thickness");
-
- int ring_num = 0;
- for (xml_coll_t rings(rings_xml, "ring"); rings; ++rings, ++ring_num)
+ for (int i = 0; i < repeat; ++i)
{
- xml::Component ring = xml::Handle_t(rings);
- const auto ring_name = ring.attr<std::string>("name");
- const double ring_inner_radius = ring.attr<double>("inner_radius");
- const double ring_outer_radius = ring.attr<double>("outer_radius");
- const int repeat = ring.attr<int>("repeat");
- double angle_step = 2 * M_PI / repeat;
- DetElement ring_piece_det(ring_name, det_id);
-
- const double trapezoid_height = ring_outer_radius - ring_inner_radius;
- const double trapezoid_inner_length = calculate_polygon_side_length(ring_inner_radius, repeat);
- const double trapezoid_outer_length = calculate_polygon_side_length(ring_outer_radius, repeat);
- const double layers_thickness = layers_xml.attr<double>("thickness");
- const double layers_base_thickness = layers_thickness - first_data_aggregation_thickness;
-
- Trapezoid layer_base_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0,
- layers_base_thickness / 2.0, layers_base_thickness / 2.0, trapezoid_height / 2.0);
- Volume layer_base_vol(ring_name, layer_base_shape, air);
- layer_base_vol = layer_base_vol.setVisAttributes(theDetector, ring.attr<std::string>("vis"));
-
- double y_offset = -layers_base_thickness / 2.0;
- {
- }
- for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers)
- {
- const xml::Component layer = xml::Handle_t(layers);
- const auto layer_name = layer.attr<std::string>("name");
- const double layer_thickness = layer.attr<double>("thickness");
- const Material material = theDetector.material(layer.attr<std::string>("material"));
- const auto vis = layer.attr<std::string>("vis");
- auto is_sensitive = layer.hasAttr(_U(sensitive));
- DetElement layer_base_det(layer_name, det_id);
- rec::SurfaceType surf_type;
-
- Trapezoid layer_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0, layer_thickness / 2.0,
- layer_thickness / 2.0, trapezoid_height / 2.0);
- Volume layer_vol(layer_name, layer_shape, material);
- layer_vol = layer_vol.setVisAttributes(theDetector, vis);
- if (is_sensitive)
- {
- layer_vol = layer_vol.setSensitiveDetector(sens);
- surf_type = rec::SurfaceType::Sensitive;
- }
- else
- {
- surf_type = rec::SurfaceType::Plane;
- }
- rec::Vector3D u(0., 0., 1.);
- rec::Vector3D v(0., 1., 0.);
- rec::Vector3D n(1., 0., 0.);
- rec::VolPlane surf(layer_vol, surf_type, layer_thickness / 2.0, layer_thickness / 2.0, u, v, n);
- rec::volSurfaceList(layer_base_det)->push_back(surf);
-
- layer_base_det.setPlacement(
- layer_base_vol.placeVolume(layer_vol, Position(0, y_offset + layer_thickness / 2.0, 0)));
- ring_piece_det.add(layer_base_det);
- y_offset += layer_thickness;
- }
-
- auto rotationX = RotationX(90.0 * deg);
- auto rotationZ = RotationZ(90.0 * deg);
- auto neg_rotationX = RotationX(-90.0 * deg);
- auto neg_rotationZ = RotationZ(-90.0 * deg);
-
- for (int i = 0; i < repeat; ++i)
- {
- double angle = i * angle_step;
- double r_offset = ring_inner_radius + trapezoid_height / 2.0;
- double rotated_x = r_offset * cos(angle);
- double rotated_y = r_offset * sin(angle);
- auto transform = Transform3D(
- RotationZ(angle) * rotationZ * rotationX,
- Position(rotated_x, rotated_y,
- zmax - layers_base_thickness / 2.0));
- auto neg_transform = Transform3D(
- RotationZ(angle) * neg_rotationZ * neg_rotationX,
- Position(rotated_x, rotated_y,
- -(zmax - layers_base_thickness / 2.0)));
- auto cloned_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(i + 1));
- auto cloned_neg_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(-(i + 1)));
- auto pv = envelope.placeVolume(layer_base_vol, transform).addPhysVolID("side", -1).addPhysVolID("module", i)
- .addPhysVolID("layer", ring_num);
- auto neg_pv = envelope.placeVolume(layer_base_vol, neg_transform).addPhysVolID("side", 1).
- addPhysVolID("module", i).addPhysVolID("layer", ring_num);
- cloned_ring_piece_det.setPlacement(pv);
- cloned_neg_ring_piece_det.setPlacement(neg_pv);
- otk_endcaps.add(cloned_ring_piece_det);
- otk_endcaps.add(cloned_neg_ring_piece_det);
- }
+ double angle = i * angle_step;
+ double r_offset = ring_inner_radius + trapezoid_height / 2.0;
+ double rotated_x = r_offset * cos(angle);
+ double rotated_y = r_offset * sin(angle);
+ auto transform = Transform3D(
+ RotationZ(angle) * rotationZ * rotationX,
+ Position(rotated_x, rotated_y,
+ zmax - layers_base_thickness / 2.0));
+ auto neg_transform = Transform3D(
+ RotationZ(angle) * neg_rotationZ * neg_rotationX,
+ Position(rotated_x, rotated_y,
+ -(zmax - layers_base_thickness / 2.0)));
+ auto cloned_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(i + 1));
+ auto cloned_neg_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(-(i + 1)));
+ auto pv = envelope.placeVolume(layer_base_vol, transform).addPhysVolID("side", 1).addPhysVolID("module", i)
+ .addPhysVolID("sensor", ring_num);
+ auto neg_pv = envelope.placeVolume(layer_base_vol, neg_transform).addPhysVolID("side", -1).
+ addPhysVolID("module", i).addPhysVolID("sensor", ring_num);
+ cloned_ring_piece_det.setPlacement(pv);
+ cloned_neg_ring_piece_det.setPlacement(neg_pv);
+ otk_endcaps.add(cloned_ring_piece_det);
+ otk_endcaps.add(cloned_neg_ring_piece_det);
}
-#ifdef DET_ELEMENT_DEBUG
- check_det_element(otk_endcaps);
-#endif
-
- return otk_endcaps;
+ }
+
+ rec::ZDiskPetalsData::LayerLayout otk_endcap_layer;
+ otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::DoubleSided] = false;
+ otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::Pixel] = true;
+ otk_endcap_layer.phi0 = 0;
+ otk_endcap_layer.distanceSupport = 406 * mm;
+ otk_endcap_layer.distanceSensitive = 406 * mm;
+ otk_endcap_layer.lengthSupport = 1410 * mm;
+ otk_endcap_layer.lengthSensitive = 1410 * mm;
+ otk_endcap_layer.thicknessSensitive = 0.3 * mm;
+ otk_endcap_layer.thicknessSupport = 3.6 * mm;
+ otk_endcap_layer.zPosition = zmax - 3.6 * mm;
+ otk_endcap_layer.sensorsPerPetal = 127;
+ otk_endcap_layer.petalNumber = 16;
+ zDiskPetalsData->layers.push_back(otk_endcap_layer);
+ otk_endcaps.addExtension<rec::ZDiskPetalsData>(zDiskPetalsData);
+
+ // #ifdef DET_ELEMENT_DEBUG
+ // check_det_element(otk_endcaps);
+ // #endif
+ if (x_det.hasAttr(_U(combineHits)))
+ {
+ otk_endcaps.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
+ }
+ return otk_endcaps;
}
DECLARE_DETELEMENT(SiTracker_otkendcap_v02, create_element)
-
--
GitLab