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 = [§orModuleNumbers] (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