From 4150c55df7c576f13fd21a054ce0df14066d84a6 Mon Sep 17 00:00:00 2001 From: Chao Peng <cpeng@anl.gov> Date: Mon, 14 Jun 2021 19:54:19 -0500 Subject: [PATCH] add the geometry for endcap ecal --- compact/ce_ecal.xml | 109 +++++++++++++++++++++++++++++ compact/ce_ecal_outer_glass.xml | 33 +++++++++ compact/ecal.xml | 81 ++------------------- src/HomogeneousCalorimeter_geo.cpp | 14 ++-- 4 files changed, 153 insertions(+), 84 deletions(-) create mode 100644 compact/ce_ecal.xml create mode 100644 compact/ce_ecal_outer_glass.xml diff --git a/compact/ce_ecal.xml b/compact/ce_ecal.xml new file mode 100644 index 00000000..e55739bf --- /dev/null +++ b/compact/ce_ecal.xml @@ -0,0 +1,109 @@ +<lccdd> + + <define> + <constant name="CrystalEndcap_rmin" value="VertexTrackerBarrel_rmin"/> + <constant name="CrystalEndcap_rmax" value="EcalEndcapN_rmin"/> + <constant name="CrystalBox_x_length" value="20.0*mm"/> + <constant name="CrystalBox_y_length" value="20.0*mm"/> + <constant name="CrystalBox_z_length" value="200.0*mm"/> + <constant name="CrystalBox_offset" value="0.000001*mm"/> + <constant name="CrystalEndcap_x_pos" value="0.0*m"/> + <constant name="CrystalEndcap_y_pos" value="0.0*m"/> + <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/> + </define> + + + <limits> + </limits> + + <regions> + </regions> + + <!-- Common Generic visualization attributes --> + <comment>Common Generic visualization attributes</comment> + <display> + </display> + + <detectors> + <comment> + ------------------------------- + Backwards Endcap EM Calorimeter + ------------------------------- + A layered EM calorimeter with tungsten and silicon (or scintillator) strips + </comment> + <detector id="ECalEndcapN_ID" + name="EcalEndcapN" + type="refdet_PolyhedraEndcapCalorimeter2" + reflect="true" + readout="EcalEndcapHits" + vis="EcalEndcapVis" + calorimeterType="EM_ENDCAP"> + <position x="0" y="0" z="0"/> + <dimensions + numsides="CaloSides" + zmin="EcalEndcapN_zmin" + rmin="EcalEndcapN_rmin" + rmax="EcalBarrel_rmin " /> + <layer repeat="EcalEndcapNLayer1_NRepeat"> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapNLayer2_NRepeat"> + <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapNLayer3_NRepeat"> + <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + </detector> + + <comment> + ------------------- + Crystal Calorimeter + ------------------- + Backward (negative pseudorapidity) angle electron detector + </comment> + <detector + id="CrystalEndcap_ID" + name="ElectronECAL" + type="CrystalCalorimeterEndcap" + readout="CrystalEcalHits" + vis="GreenVis"> + <position x="CrystalEndcap_x_pos" y="CrystalEndcap_y_pos" z="CrystalEndcap_z_pos" /> + <dimensions rmin="CrystalEndcap_rmin" rmax="CrystalEndcap_rmax" x="CrystalBox_x_length" y="CrystalBox_y_length" z="CrystalBox_z_length" delta="CrystalBox_offset"/> + </detector> + </detectors> + + <!-- Definition of the readout segmentation/definition --> + <readouts> + <!-- + <readout name="PlaneTrackerHits"> + <segmentation type="CartesianGridXY" grid_size_x="20.0*mm" grid_size_y="20.0*mm" /> + <id>system:5,module:4,x:32:-16,y:-16</id> + </readout> + --> + <readout name="CrystalEcalHits"> + <segmentation type="CartesianGridXY" grid_size_x="CrystalBox_x_length" grid_size_y="CrystalBox_y_length" /> + <id>system:8,sector:4,module:20,x:48:-8,y:-8</id> + </readout> + <readout name="EcalEndcapHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/> + <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> + </readout> + </readouts> + + <plugins> + </plugins> + +</lccdd> diff --git a/compact/ce_ecal_outer_glass.xml b/compact/ce_ecal_outer_glass.xml new file mode 100644 index 00000000..7ce994ae --- /dev/null +++ b/compact/ce_ecal_outer_glass.xml @@ -0,0 +1,33 @@ +<lccdd> + <define> + </define> + + <detectors> + <detector id="ECalEndcapN_ID" + name="EcalEndcapN" + type="HomogeneousCalorimeter" + readout="EcalEndcapNHits" + vis="InvisibleWithDaughters"> + <dimensions shape="disk" rmax="EcalBarrel_rmin" rmin="VertexTrackerBarrel_rmin" length="40*cm + 1*mm"/> + <position x="0" y="0" z="-EcalEndcapN_zmin"/> + <rotation x="0" y="0" z="0"/> + <placements> + <disk rmax="EcalEndcapN_rmin" rmin="VertexTrackerBarrel_rmin" sector="1"> + <position z="0"/> + <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" material="PbWO4" vis="AnlTeal"/> + </disk> + <disk rmax="EcalBarrel_rmin" rmin="EcalEndcapN_rmin" sector="2"> + <position z="0"/> + <module sizex="4*cm" sizey="4*cm" sizez="40*cm" material="PbGlass" vis="AnlBlue"/> + </disk> + </placements> + </detector> + </detectors> + + <readouts> + <readout name="EcalEndcapNHits"> + <id>system:8, sector:4, module:20</id> + </readout> + </readouts> +</lccdd> + diff --git a/compact/ecal.xml b/compact/ecal.xml index 93573377..ef511fff 100644 --- a/compact/ecal.xml +++ b/compact/ecal.xml @@ -1,18 +1,6 @@ <lccdd> <define> - <constant name="CrystalEndcap_rmin" value="VertexTrackerBarrel_rmin"/> - <constant name="CrystalEndcap_rmax" value="EcalEndcapN_rmin"/> - <constant name="CrystalBox_x_length" value="20.0*mm"/> - <constant name="CrystalBox_y_length" value="20.0*mm"/> - <constant name="CrystalBox_z_length" value="200.0*mm"/> - <constant name="CrystalBox_offset" value="0.000001*mm"/> - <constant name="CrystalEndcap_x_pos" value="0.0*m"/> - <constant name="CrystalEndcap_y_pos" value="0.0*m"/> - <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/> - - - <constant name="EcalEndcapP_rmax" value="Solenoid_rmax "/> </define> @@ -29,6 +17,8 @@ </display> <include ref="ecal_barrel.xml"/> + <!--<include ref="ce_ecal.xml"/>--> + <include ref="ce_ecal_outer_glass.xml"/> <detectors> <comment> @@ -41,7 +31,7 @@ name="EcalEndcapP" reflect="false" type="refdet_PolyhedraEndcapCalorimeter2" - readout="EcalEndcapHits" + readout="EcalEndcapPHits" vis="EcalEndcapVis" calorimeterType="EM_ENDCAP" > <position x="0" y="0" z="-0"/> @@ -73,65 +63,6 @@ <slice material="Air" thickness="EcalAir1Thickness"/> </layer> </detector> - - <comment> - ------------------------------- - Backwards Endcap EM Calorimeter - ------------------------------- - A layered EM calorimeter with tungsten and silicon (or scintillator) strips - </comment> - <detector id="ECalEndcapN_ID" - name="EcalEndcapN" - type="refdet_PolyhedraEndcapCalorimeter2" - reflect="true" - readout="EcalEndcapHits" - vis="EcalEndcapVis" - calorimeterType="EM_ENDCAP"> - <position x="0" y="0" z="0"/> - <dimensions - numsides="CaloSides" - zmin="EcalEndcapN_zmin" - rmin="EcalEndcapN_rmin" - rmax="EcalBarrel_rmin " /> - <layer repeat="EcalEndcapNLayer1_NRepeat"> - <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> - <slice material="Copper" thickness="EcalCopperThickness"/> - <slice material="Kapton" thickness="EcalKaptonThickness"/> - <slice material="Air" thickness="EcalAir1Thickness"/> - </layer> - <layer repeat="EcalEndcapNLayer2_NRepeat"> - <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> - <slice material="Air" thickness="EcalAir2Thickness"/> - <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> - <slice material="Copper" thickness="EcalCopperThickness"/> - <slice material="Kapton" thickness="EcalKaptonThickness"/> - <slice material="Air" thickness="EcalAir1Thickness"/> - </layer> - <layer repeat="EcalEndcapNLayer3_NRepeat"> - <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> - <slice material="Air" thickness="EcalAir2Thickness"/> - <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> - <slice material="Copper" thickness="EcalCopperThickness"/> - <slice material="Kapton" thickness="EcalKaptonThickness"/> - <slice material="Air" thickness="EcalAir1Thickness"/> - </layer> - </detector> - - <comment> - ------------------- - Crystal Calorimeter - ------------------- - Backward (negative pseudorapidity) angle electron detector - </comment> - <detector - id="CrystalEndcap_ID" - name="ElectronECAL" - type="CrystalCalorimeterEndcap" - readout="CrystalEcalHits" - vis="GreenVis"> - <position x="CrystalEndcap_x_pos" y="CrystalEndcap_y_pos" z="CrystalEndcap_z_pos" /> - <dimensions rmin="CrystalEndcap_rmin" rmax="CrystalEndcap_rmax" x="CrystalBox_x_length" y="CrystalBox_y_length" z="CrystalBox_z_length" delta="CrystalBox_offset"/> - </detector> </detectors> <!-- Definition of the readout segmentation/definition --> @@ -142,11 +73,7 @@ <id>system:5,module:4,x:32:-16,y:-16</id> </readout> --> - <readout name="CrystalEcalHits"> - <segmentation type="CartesianGridXY" grid_size_x="CrystalBox_x_length" grid_size_y="CrystalBox_y_length" /> - <id>system:8,sector:4,module:20,x:48:-8,y:-8</id> - </readout> - <readout name="EcalEndcapHits"> + <readout name="EcalEndcapPHits"> <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/> <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> </readout> diff --git a/src/HomogeneousCalorimeter_geo.cpp b/src/HomogeneousCalorimeter_geo.cpp index f3d74c7f..0b1fed85 100644 --- a/src/HomogeneousCalorimeter_geo.cpp +++ b/src/HomogeneousCalorimeter_geo.cpp @@ -73,10 +73,10 @@ using namespace dd4hep::detail; * <blocks sector="1"/> * <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" vis="GreenVis" material="PbWO4"/> * <wrapper thickness="0.015*cm" material="Epoxy" vis="WhiteVis"/> - * <placement x="1*cm" y="1*cm" z="0"/> - * <placement x="-1*cm" y="1*cm" z="0"/> - * <placement x="1*cm" y="-1*cm" z="0"/> - * <placement x="-1*cm" y="-1*cm" z="0"/> + * <placement x="1*cm" y="1*cm" z="0" id="1"/> + * <placement x="-1*cm" y="1*cm" z="0" id="2"/> + * <placement x="1*cm" y="-1*cm" z="0" id="3"/> + * <placement x="-1*cm" y="-1*cm" z="0" id="4"/> * </blocks> * </placements> * </detector> @@ -260,21 +260,21 @@ static void add_array(Detector& desc, Volume &env, xml::Collection_t &plm, Sensi } } -// place modules +// place modules, id must be provided static void add_blocks(Detector& desc, Volume &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid) { Position modSize; auto modVol = build_module(desc, plm, sens, modSize); int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid); - int mid = 1; - for (xml::Collection_t pl(plm, _Unicode(placement)); pl; ++pl, ++mid) { + for (xml::Collection_t pl(plm, _Unicode(placement)); pl; ++pl) { Position pos(dd4hep::getAttrOrDefault<double>(pl, _Unicode(x), 0.), dd4hep::getAttrOrDefault<double>(pl, _Unicode(y), 0.), dd4hep::getAttrOrDefault<double>(pl, _Unicode(z), 0.)); Position rot(dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotx), 0.), dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 0.), dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotz), 0.)); + auto mid = pl.attr<int>(_Unicode(id)); Transform3D tr = Translation3D(pos.x(), pos.y(), pos.z()) * RotationZYX(rot.z(), rot.y(), rot.x()); auto modPV = env.placeVolume(modVol, tr); -- GitLab