diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt index f4092924d8d53c31575634b0dcc1612e96cb5c0d..6a7038dafc81bd50d290e5cb303db8627e0873f0 100644 --- a/Detector/DetCRD/CMakeLists.txt +++ b/Detector/DetCRD/CMakeLists.txt @@ -21,6 +21,7 @@ gaudi_add_module(DetCRD src/Muon/Muon_Barrel_v01_04.cpp src/Muon/Muon_Endcap_v01_02.cpp src/Tracker/SiTrackerSkewRing_v01_geo.cpp + src/Tracker/ITK_EndCap_v01.cpp src/Tracker/SiTrackerStitching_v01_geo.cpp src/Tracker/SiTrackerStaggeredLadder_v01_geo.cpp src/Tracker/SiTrackerStaggeredLadder_v02_geo.cpp diff --git a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml new file mode 100644 index 0000000000000000000000000000000000000000..16f918abbf357e0d5f83c08f20f8117f83cffe91 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml @@ -0,0 +1,73 @@ +<lccdd> + <info name="ITKEndcap_v01" + title="CepC ITKEndcap" + author="Li Zhihao" + url="http://cepc.ihep.ac.cn" + contact="lizhihao@ihep.ac.cn" + status="developing" + version="v01"> + <comment>CepC Inner Tracker EndCap</comment> + </info> + <define> + <constant name="SiliconThickness" value="400*um"/> + <constant name="SupportThickness" value="3.5*mm"/> + <constant name="ITKModuleLengthPhi" value="40.1*mm"/> + </define> + + <detectors> + <detector id="DetID_ITKEndCap" name="ITK_EndCap" type="ITK_EndCap_v01" vis="FTDVis" readout="ITKEndcapCollection" insideTrackingVolume="true" reflect="true"> + <envelope> + <shape type="Assembly"/> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> + + <support thickness="SupportThickness"> + <slice name="Carbon_fiber_front" material="CarbonFiber" thickness="150*um" vis="GrayVis"/> + <slice name="Cooling_tube_wall" material="G4_Ti" thickness="3.560*0.013*100*um" vis="GrayVis"/> + <slice name="Cooling_fluid" material="G4_WATER" thickness="35.76*0.105*100*um" vis="GrayVis"/> + <slice name="Graphite_foam_Honeycomb" material="Air" thickness="2000*um" vis="YellowVis"/> + <slice name="Carbon_fiber_back" material="CarbonFiber" thickness="150*um" vis="GrayVis"/> + <slice name="Glue" material="Air" thickness="200*um" vis="YellowVis"/> + <slice name="Other_electronics" material="Kapton" thickness="32.6437*0.05*100*um" vis="SeeThrough"/> + </support> + + <sensor thickness="SiliconThickness"> + <slice name="Glue" material="Air" thickness="100*um" vis="SeeThrough"/> + <slice name="Sensor" material="G4_Si" thickness="150*um" sensitive="true" vis="GreenVis"/> + <slice name="FPC_Insulating_layers" material="Polyimide" thickness="100*um" vis="SeeThrough"/> + <slice name="FPC_metal_layer" material="G4_Al" thickness="50*um" vis="SeeThrough"/> + </sensor> + + <layers> + <layer id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="245*mm" vis="SeeThrough"> + <ring id="0" inner_r="81.5*mm" outer_r="(163.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="13" vis="SeeThrough" /> + <ring id="1" inner_r="163.4*mm" outer_r="245*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="20" vis="SeeThrough"/> + </layer> + <layer id="1" z="718.5*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="110.5*mm" outer_r="355*mm" vis="SeeThrough"> + <ring id="0" inner_r="110.5*mm" outer_r="(192.2-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="16" vis="SeeThrough"/> + <ring id="1" inner_r="192.2*mm" outer_r="(273.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="2" inner_r="273.4*mm" outer_r="355*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="28" vis="SeeThrough"/> + </layer> + <layer id="2" z="1000.3*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="160.5*mm" outer_r="565*mm" vis="SeeThrough"> + <ring id="0" inner_r="160.5*mm" outer_r="(282-0.1)*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="1" inner_r="282*mm" outer_r="(423.4-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> + <ring id="2" inner_r="423.4*mm" outer_r="565*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> + </layer> + <layer id="3" z="1489*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="220.3*mm" outer_r="565*mm" vis="SeeThrough"> + <ring id="0" inner_r="220.3*mm" outer_r="(301.6-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="1" inner_r="301.6*mm" outer_r="(443.1-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> + <ring id="2" inner_r="443.1*mm" outer_r="565*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> + </layer> + </layers> + + </detector> + </detectors> + + <readouts> + <readout name="ITKEndcapCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml index 0f3023e7c48370b1e37cf4c80bc801da4640e99a..0b386f6448aa179147fe0707c04707f765023af4 100644 --- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml +++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml @@ -25,11 +25,11 @@ </define> <include ref="./TDR_Dimensions_v01_01.xml"/> - <include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/> +<!-- <include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/>--> <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v01.xml"/--> - <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_05.xml"/> - <include ref="../CRD_common_v02/SIT_SimplePixel_v01_03.xml"/> - <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/--> + <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/> +<!-- <include ref="../CRD_common_v02/SIT_SimplePixel_v01_03.xml"/>--> +<!-- <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/–>--> <fields> <field name="InnerSolenoid" type="solenoid" diff --git a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1074364c98c85391e15c44e82a867779733b7e3d --- /dev/null +++ b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp @@ -0,0 +1,199 @@ +#include <DD4hep/Detector.h> +#include "DD4hep/DetFactoryHelper.h" +#include "XML/Utilities.h" +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "Math/AxisAngle.h" +#include <map> + +using namespace dd4hep; + +static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) +{ + xml_det_t x_det = e; + Material air = description.air(); + int det_id = x_det.id(); + std::string name = x_det.nameStr(); + bool reflect = x_det.reflect(false); + DetElement tracker(name, det_id); + + Volume envelope = createPlacedEnvelope(description, e, tracker); + setDetectorTypeFlag(e, tracker); + if (description.buildType() == BUILD_ENVELOPE) + return tracker; + envelope = envelope.setVisAttributes(description.visAttributes("SeeThrough")); + + if (x_det.hasChild(_U(sensitive))) + { + xml_dim_t sd_typ = x_det.child(_U(sensitive)); + sens.setType(sd_typ.typeStr()); + } + else + { + sens.setType("tracker"); + } + std::cout << " ** building ITK_EndCap_v01 ... " << sens.type() << std::endl; + + const xml::Component layers_xml = x_det.child("layers"); + for (xml_coll_t layer(layers_xml, "layer"); layer; ++layer) + { + //id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="242.5*mm" vis="SeeThrough" + const auto layer_id = layer.attr<std::string>("id"); + const auto dz = layer.attr<double>("dz"); + const auto inner_r = layer.attr<double>("inner_r"); + const auto outer_r = layer.attr<double>("outer_r"); + const auto layer_vis = layer.attr<std::string>("vis"); + const auto z = layer.attr<double>("z"); + std::string layer_name = name + "_layer_" + layer_id; + + const auto SiliconThickness = description.constant<double>("SiliconThickness"); + const auto SupportThickness = description.constant<double>("SupportThickness"); + + Tube layer_tube(inner_r, outer_r, dz / 2.0, 0.0, 2 * M_PI); + Volume layer_vol(layer_name, layer_tube, air); + DetElement layer_det(layer_name, det_id); + layer_vol = layer_vol.setVisAttributes(description.visAttributes(layer_vis)); + + // populate support + double support_z = -SupportThickness / 2.0; + const xml::Component supports = x_det.child("support"); + for (xml_coll_t support(supports, "slice"); support; ++support) + { + const auto support_name = support.attr<std::string>("name"); + const auto support_material = support.attr<std::string>("material"); + const auto support_thickness = support.attr<double>("thickness"); + const auto support_vis = support.attr<std::string>("vis"); + std::string support_vol_name = layer_name + "_" + support_name; + Tube support_tube(inner_r, outer_r, support_thickness / 2.0, 0.0, 2 * M_PI); + Volume support_vol(support_vol_name, support_tube, description.material(support_material)); + DetElement support_det(support_vol_name, det_id); + support_vol = support_vol.setVisAttributes(description.visAttributes(support_vis)); + support_det.setPlacement(layer_vol.placeVolume(support_vol, Position(0, 0, support_z + support_thickness / 2.0))); + support_z += support_thickness; + layer_det.add(support_det); + rec::Vector3D u(1., 0., 0.); + rec::Vector3D v(0., 0., 1.); + rec::Vector3D n(0., 1., 0.); + rec::VolPlane surf(support_vol, rec::SurfaceType::Plane, support_thickness / 2.0, support_thickness / 2.0, u, v, + n); + rec::volSurfaceList(layer_det)->push_back(surf); + } + + + // populate sensor + for (xml_coll_t ring(layer, "ring"); ring; ++ring) + { + const auto ring_id = ring.attr<std::string>("id"); + const auto ring_inner_r = ring.attr<double>("inner_r"); + const auto ring_outer_r = ring.attr<double>("outer_r"); + const auto module_dr = ring.attr<double>("module_dr"); + const auto module_dphi = ring.attr<double>("module_dphi"); + const auto nmodule = ring.attr<double>("nmodule"); + const auto vis = ring.attr<std::string>("vis"); + + std::string ring_vol_name = layer_name + "_ring_" + ring_id; + Tube ring_tube(ring_inner_r, ring_outer_r, SiliconThickness / 2.0, 0.0, 2 * M_PI); + Volume ring_vol(ring_vol_name, ring_tube, air); + DetElement ring_det(ring_vol_name, det_id); + ring_vol = ring_vol.setVisAttributes(description.visAttributes(vis)); + + // populate sensor + Box sensor_box(module_dr / 2.0, module_dphi / 2.0, SiliconThickness / 2.0); + std::string sensor_name = ring_vol_name + "_sensor"; + Volume sensor_vol(sensor_name, sensor_box, air); + DetElement sensor_det(sensor_name, det_id); + sensor_vol = sensor_vol.setVisAttributes(description.visAttributes("SeeThrough")); + const xml::Component sensor = x_det.child("sensor"); + double sensor_z = -SiliconThickness / 2.0; + for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer) + { + const auto sensor_layer_name = sensor_layer.attr<std::string>("name"); + const auto sensor_layer_material = sensor_layer.attr<std::string>("material"); + const auto sensor_layer_thickness = sensor_layer.attr<double>("thickness"); + const auto sensor_layer_vis = sensor_layer.attr<std::string>("vis"); + auto is_sensitive = sensor_layer.hasAttr(_U(sensitive)); + std::string sensor_layer_vol_name = sensor_name + "_" + sensor_layer_name; + Box sensor_layer_box(module_dr / 2.0, module_dphi / 2.0, sensor_layer_thickness / 2.0); + Volume sensor_layer_vol(sensor_layer_vol_name, sensor_layer_box, description.material(sensor_layer_material)); + DetElement sensor_layer_det(sensor_layer_vol_name, det_id); + sensor_layer_vol = sensor_layer_vol.setVisAttributes(description.visAttributes(sensor_layer_vis)); + rec::SurfaceType surf_type; + if (is_sensitive) + { + sensor_layer_vol = sensor_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); + } + sensor_layer_det.setPlacement( + sensor_vol.placeVolume(sensor_layer_vol, Position(0, 0, sensor_z + sensor_layer_thickness / 2.0))); + sensor_z += sensor_layer_thickness; + + sensor_det.add(sensor_layer_det); + rec::Vector3D u(1., 0., 0.); + rec::Vector3D v(0., 1., 0.); + rec::Vector3D n(0., 0., 1.); + rec::VolPlane surf(sensor_layer_vol, surf_type, sensor_layer_thickness / 2.0, + sensor_layer_thickness / 2.0, u, v, + n); + rec::volSurfaceList(sensor_det)->push_back(surf); + } + + // place all the sensors into ring + for (int i = 0; i < nmodule; ++i) + { + double angle = i * 2 * M_PI / nmodule; + double r_offset = ring_inner_r + module_dr / 2.0; + double rotated_x = r_offset * cos(angle); + double rotated_y = r_offset * sin(angle); + auto transform = Transform3D( + RotationZ(angle), + Position(rotated_x, rotated_y, 0)); + + DetElement rotated_sensor_det = sensor_det.clone(sensor_name + "_rotated_" + std::to_string(i)); + rotated_sensor_det.setPlacement( + ring_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", i)); + ring_det.add(rotated_sensor_det); + } + + // place ring into layer + ring_det.setPlacement( + layer_vol.placeVolume(ring_vol, Position(0, 0, (SupportThickness + SiliconThickness) / 2.0)).addPhysVolID("sensor", 2*std::stoi(ring_id))); + layer_det.add(ring_det); + // rotate and reflect ring + std::string reflect_ring_name = ring_vol_name + "_reflect"; + auto reflect_ring_det = ring_det.clone(reflect_ring_name); + reflect_ring_det.setPlacement(layer_vol.placeVolume( + ring_vol, Transform3D(RotationZ(M_PI / nmodule) * Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1) , + Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0))).addPhysVolID("sensor", 2*std::stoi(ring_id)+1)); + layer_det.add(reflect_ring_det); + } + + + // put layer into envelope + layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z)). + addPhysVolID("side", 1).addPhysVolID("layer", std::stoi(layer_id))); + tracker.add(layer_det); + // copy layer_vol and put reflect + if (reflect) + { + std::string reflect_layer_name = layer_name + "_reflect"; + auto reflect_layer_det = layer_det.clone(reflect_layer_name); + reflect_layer_det.setPlacement( + envelope.placeVolume(layer_vol, Transform3D(Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1), Position(0, 0, -z))).addPhysVolID("side", -1). + addPhysVolID("layer", std::stoi(layer_id))); + tracker.add(reflect_layer_det); + } + } + + if (x_det.hasAttr(_U(combineHits))) + { + tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens); + } + + return tracker; +} + +DECLARE_DETELEMENT(ITK_EndCap_v01, create_detector)