From fa94a63b1a3c2d19bfa7d97d9e833cac83c10312 Mon Sep 17 00:00:00 2001
From: Chao Peng <cpeng@anl.gov>
Date: Wed, 4 Aug 2021 23:34:24 +0000
Subject: [PATCH] Update EcalEndcapN to fill the gaps, and update the DAWN view
 script for it.

---
 compact/ce_ecal_crystal_glass.xml  | 49 ++++++++++++++------------
 scripts/view20/.DAWN_1.history     |  6 ++--
 scripts/view20/generate_eps        | 36 +++++++++++--------
 src/HomogeneousCalorimeter_geo.cpp | 56 +++++++++++++++++++++---------
 4 files changed, 91 insertions(+), 56 deletions(-)

diff --git a/compact/ce_ecal_crystal_glass.xml b/compact/ce_ecal_crystal_glass.xml
index cea47efc..2634afa1 100644
--- a/compact/ce_ecal_crystal_glass.xml
+++ b/compact/ce_ecal_crystal_glass.xml
@@ -60,29 +60,32 @@
         <lines sector="2" mirrorx="true" mirrory="true">
           <module sizex="GlassModule_sx" sizey="GlassModule_sy" sizez="GlassModule_sz" material="PbGlass" vis="EcalEndcapNModuleVis"/>
           <wrapper thickness="GlassModule_wrap" material="Epoxy" vis="InvisibleWithDaughters"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*1/2." z="GlassModule_z0" begin="13" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*3/2." z="GlassModule_z0" begin="13" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*5/2." z="GlassModule_z0" begin="13" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*7/2." z="GlassModule_z0" begin="12" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*9/2." z="GlassModule_z0" begin="12" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*11/2." z="GlassModule_z0" begin="12" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*13/2." z="GlassModule_z0" begin="11" nmods="11"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*15/2." z="GlassModule_z0" begin="10" nmods="11"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*17/2." z="GlassModule_z0" begin="9" nmods="12"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*19/2." z="GlassModule_z0" begin="8" nmods="13"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*21/2." z="GlassModule_z0" begin="7" nmods="13"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*23/2." z="GlassModule_z0" begin="6" nmods="14"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*25/2." z="GlassModule_z0" begin="3" nmods="16"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*27/2." z="GlassModule_z0" begin="0" nmods="18"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*29/2." z="GlassModule_z0" begin="0" nmods="18"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*31/2." z="GlassModule_z0" begin="0" nmods="16"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*33/2." z="GlassModule_z0" begin="0" nmods="16"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*35/2." z="GlassModule_z0" begin="0" nmods="14"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*37/2." z="GlassModule_z0" begin="0" nmods="13"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*39/2." z="GlassModule_z0" begin="0" nmods="11"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*41/2." z="GlassModule_z0" begin="0" nmods="10"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*43/2." z="GlassModule_z0" begin="0" nmods="7"/>
-          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*45/2." z="GlassModule_z0" begin="0" nmods="3"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*1/2." z="GlassModule_z0" begin="13" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*3/2." z="GlassModule_z0" begin="13" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*5/2." z="GlassModule_z0" begin="13" nmods="13"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*7/2." z="GlassModule_z0" begin="12" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*9/2." z="GlassModule_z0" begin="12" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*11/2." z="GlassModule_z0" begin="12" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*13/2." z="GlassModule_z0" begin="11" nmods="15"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*15/2." z="GlassModule_z0" begin="10" nmods="15"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*17/2." z="GlassModule_z0" begin="9" nmods="15"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*19/2." z="GlassModule_z0" begin="8" nmods="16"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*21/2." z="GlassModule_z0" begin="7" nmods="16"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*23/2." z="GlassModule_z0" begin="6" nmods="17"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*25/2." z="GlassModule_z0" begin="3" nmods="19"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*27/2." z="GlassModule_z0" begin="0" nmods="22"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*29/2." z="GlassModule_z0" begin="0" nmods="21"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*31/2." z="GlassModule_z0" begin="0" nmods="20"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*33/2." z="GlassModule_z0" begin="0" nmods="20"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*35/2." z="GlassModule_z0" begin="0" nmods="19"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*37/2." z="GlassModule_z0" begin="0" nmods="19"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*39/2." z="GlassModule_z0" begin="0" nmods="17"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*41/2." z="GlassModule_z0" begin="0" nmods="15"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*43/2." z="GlassModule_z0" begin="0" nmods="14"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*45/2." z="GlassModule_z0" begin="0" nmods="12"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*47/2." z="GlassModule_z0" begin="0" nmods="10"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*49/2." z="GlassModule_z0" begin="0" nmods="8"/>
+          <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*51/2." z="GlassModule_z0" begin="0" nmods="7"/>
         </lines>
       </placements>
     </detector>
diff --git a/scripts/view20/.DAWN_1.history b/scripts/view20/.DAWN_1.history
index f4980ff8..cc3ead27 100644
--- a/scripts/view20/.DAWN_1.history
+++ b/scripts/view20/.DAWN_1.history
@@ -1,12 +1,12 @@
 1.34392e+07
-90
+0
 180
 0
 0
 0
 0
-1
-1
+5
+3
 0.001
 0
 1
diff --git a/scripts/view20/generate_eps b/scripts/view20/generate_eps
index 5d85b9d2..87001448 100755
--- a/scripts/view20/generate_eps
+++ b/scripts/view20/generate_eps
@@ -44,20 +44,6 @@ done
 set -- "${POSITIONAL[@]}" # restore positional parameters
 
 
-#npdet_info print EcalEndcapN_z0 --value-only athena.xml
-#180.5 cm
-
-# Top view with a thin slice down the middle
-dawncut 0 0  1 -1800 ${INPUT_FILE} ${FILE_TAG}_endcapN_temp0.prim   
-dawncut 0 0 -1 1805 ${FILE_TAG}_endcapN_temp0.prim  ${FILE_TAG}_endcapN.prim
-../../bin/dawn_tweak --mag 5 --draw 1 --theta 180 --phi 0 --draw 3
-dawn -d ${FILE_TAG}_endcapN.prim 
-ps2pdf ${FILE_TAG}_endcapN.eps ${FILE_TAG}_endcapN_full.pdf
-gs -o ${FILE_TAG}_endcapN.pdf -sDEVICE=pdfwrite \
-  -c "[/CropBox [51 250 550 590] /PAGES pdfmark" \
-  -f ${FILE_TAG}_endcapN_full.pdf
-pdftoppm ${FILE_TAG}_endcapN.pdf ${FILE_TAG}_endcapN -png -singlefile -cropbox -thinlinemode solid -aaVector yes
-
 # Top view with a thin slice down the middle
 dawncut 0 1 0 1 ${INPUT_FILE} ${FILE_TAG}_top_temp0.prim   
 dawncut 0 -1 0 1 ${FILE_TAG}_top_temp0.prim  ${FILE_TAG}_top.prim
@@ -79,3 +65,25 @@ gs -o ${FILE_TAG}.pdf -sDEVICE=pdfwrite \
   -c "[/CropBox [51 250 550 590] /PAGES pdfmark" \
   -f ${FILE_TAG}_full.pdf
 pdftoppm ${FILE_TAG}.pdf ${FILE_TAG} -png -singlefile -cropbox -thinlinemode solid -aaVector yes
+
+#npdet_info print EcalEndcapN_z0 --value-only ../../athena.xml
+#180.5 cm
+NMOD1=`npdet_info print EcalEndcapN_NModules_Sector1 ${DETECTOR_PATH}/calorimeters.xml | tail -1`
+NMOD2=`npdet_info print EcalEndcapN_NModules_Sector2 ${DETECTOR_PATH}/calorimeters.xml | tail -1`
+
+# Top view with a thin slice down the middle
+dawncut 0 0  1 -1800 ${INPUT_FILE} ${FILE_TAG}_endcapN_temp0.prim   
+dawncut 0 0 -1 1805 ${FILE_TAG}_endcapN_temp0.prim  ${FILE_TAG}_endcapN.prim
+../../bin/dawn_tweak --mag 5 --draw 1 --theta 180 --phi 0 --draw 3
+dawn -d ${FILE_TAG}_endcapN.prim 
+ps2pdf ${FILE_TAG}_endcapN.eps ${FILE_TAG}_endcapN_full.pdf
+gs -o ${FILE_TAG}_endcapN.pdf -sDEVICE=pdfwrite \
+  -c "[/CropBox [50 170 550 670] /PAGES pdfmark" \
+  -f ${FILE_TAG}_endcapN_full.pdf
+pdftoppm ${FILE_TAG}_endcapN.pdf ${FILE_TAG}_endcapN -png -singlefile -cropbox -thinlinemode solid \
+         -aaVector yes -r 1200
+convert -pointsize 180 -fill black -draw "text 200,200 \"$NMOD1 Crystals\"" \
+        ${FILE_TAG}_endcapN.png ${FILE_TAG}_endcapN.png
+convert -pointsize 180 -fill black -draw "text 200,400 \"$NMOD2 Glasses\"" \
+        ${FILE_TAG}_endcapN.png ${FILE_TAG}_endcapN.png
+
diff --git a/src/HomogeneousCalorimeter_geo.cpp b/src/HomogeneousCalorimeter_geo.cpp
index ec0b3a62..27b9f585 100644
--- a/src/HomogeneousCalorimeter_geo.cpp
+++ b/src/HomogeneousCalorimeter_geo.cpp
@@ -111,10 +111,10 @@ using namespace dd4hep;
  */
 
 // headers
-static void add_individuals(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
-static void add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
-static void add_disk(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
-static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
+static std::tuple<int, int> add_individuals(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
+static std::tuple<int, int> add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
+static std::tuple<int, int> add_disk(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
+static std::tuple<int, int> add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int id);
 
 // helper function to get x, y, z if defined in a xml component
 template<class XmlComp>
@@ -133,7 +133,6 @@ Position get_xml_xyz(XmlComp &comp, dd4hep::xml::Strng_t name)
 // main
 static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDetector sens)
 {
-    static const std::string func = "HomogeneousCalorimeter";
     xml::DetElement detElem = handle;
     std::string detName = detElem.nameStr();
     int detID = detElem.id();
@@ -144,18 +143,35 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
 
     // module placement
     xml::Component plm = detElem.child(_Unicode(placements));
-    int sector = 1;
+    std::map<int, int> sectorModuleNumbers;
+    auto addModuleNumbers = [&sectorModuleNumbers] (int sector, int nmod) {
+        auto it = sectorModuleNumbers.find(sector);
+        if (it != sectorModuleNumbers.end()) {
+            it->second += nmod;
+        } else {
+            sectorModuleNumbers[sector] = nmod;
+        }
+    };
+    int sector_id = 1;
     for (xml::Collection_t mod(plm, _Unicode(individuals)); mod; ++mod) {
-        add_individuals(desc, assembly, mod, sens, sector++);
+        auto [sector, nmod] = add_individuals(desc, assembly, mod, sens, sector_id++);
+        addModuleNumbers(sector, nmod);
     }
     for (xml::Collection_t arr(plm, _Unicode(array)); arr; ++arr) {
-        add_array(desc, assembly, arr, sens, sector++);
+        auto [sector, nmod] = add_array(desc, assembly, arr, sens, sector_id++);
+        addModuleNumbers(sector, nmod);
     }
     for (xml::Collection_t disk(plm, _Unicode(disk)); disk; ++disk) {
-        add_disk(desc, assembly, disk, sens, sector++);
+        auto [sector, nmod] = add_disk(desc, assembly, disk, sens, sector_id++);
+        addModuleNumbers(sector, nmod);
     }
     for (xml::Collection_t lines(plm, _Unicode(lines)); lines; ++lines) {
-        add_lines(desc, assembly, lines, sens, sector++);
+        auto [sector, nmod] = add_lines(desc, assembly, lines, sens, sector_id++);
+        addModuleNumbers(sector, nmod);
+    }
+
+    for (auto [sector, nmods] : sectorModuleNumbers) {
+        desc.add(Constant(Form((detName + "_NModules_Sector%d").c_str(), sector), std::to_string(nmods)));
     }
 
     // detector position and rotation
@@ -202,11 +218,11 @@ std::tuple<Volume, Position> build_module(Detector &desc, xml::Collection_t &plm
 }
 
 // place modules, id must be provided
-static void add_individuals(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
+static std::tuple<int, int> add_individuals(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
 {
     auto [modVol, modSize] = build_module(desc, plm, sens);
     int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid);
-
+    int nmodules = 0;
     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.),
@@ -219,11 +235,14 @@ static void add_individuals(Detector& desc, Assembly &env, xml::Collection_t &pl
                        * RotationZYX(rot.z(), rot.y(), rot.x());
         auto modPV = env.placeVolume(modVol, tr);
         modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", mid);
+        nmodules ++;
     }
+
+    return {sector_id, nmodules};
 }
 
 // place array of modules
-static void add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
+static std::tuple<int, int> add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
 {
     auto [modVol, modSize] = build_module(desc, plm, sens);
     int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid);
@@ -244,6 +263,7 @@ static void add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
     // placement to mother
     auto pos = get_xml_xyz(plm, _Unicode(position));
     auto rot = get_xml_xyz(plm, _Unicode(rotation));
+    int nmodules = 0;
     for (int i = 0; i < nrow; ++i) {
         for (int j = 0; j < ncol; ++j) {
             if (std::find(removals.begin(), removals.end(), std::pair<int, int>(i, j)) != removals.end()) {
@@ -255,12 +275,14 @@ static void add_array(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
                            * Translation3D(pos.x() + px, pos.y() + py, pos.z());
             auto modPV = env.placeVolume(modVol, tr);
             modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", i*ncol + j + id_begin);
+            nmodules ++;
         }
     }
+    return {sector_id, nmodules};
 }
 
 // place disk of modules
-static void add_disk(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
+static std::tuple<int, int> add_disk(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
 {
     auto [modVol, modSize] = build_module(desc, plm, sens);
     int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid);
@@ -281,10 +303,11 @@ static void add_disk(Detector& desc, Assembly &env, xml::Collection_t &plm, Sens
         auto modPV = env.placeVolume(modVol, tr);
         modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", id_begin + mid++);
     }
+    return {sector_id, mid};
 }
 
 // place lines of modules (anchor point is the 0th module of this line)
-static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
+static std::tuple<int, int> add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
 {
     auto [modVol, modSize] = build_module(desc, plm, sens);
     int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid);
@@ -294,7 +317,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
     bool mirrorz = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorz), false);
 
     // line placement
-    int mid = 1;
+    int mid = 0;
     for (xml::Collection_t pl(plm, _Unicode(line)); pl; ++pl) {
         Position pos(dd4hep::getAttrOrDefault<double>(pl, _Unicode(x), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(y), 0.),
@@ -350,6 +373,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
             modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", id_begin + mid++);
         }
     }
+    return {sector_id, mid};
 }
 //@}
 DECLARE_DETELEMENT(HomogeneousCalorimeter, create_detector)
-- 
GitLab