From 9cf35d08060ceeb27537db7a4ca8528d706a522b Mon Sep 17 00:00:00 2001 From: "jihee.kim" Date: Wed, 8 Apr 2020 18:41:00 +0000 Subject: [PATCH 1/5] Added tile type sampling calorimter for HCAL --- src/GenericDetectors/CMakeLists.txt | 3 +- .../ScintillatingTileEndcapHCAL_example.xml | 108 ++++++++++++++++++ .../src/ScintillatingTileEndcapHCAL_geo.cpp | 68 +++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml create mode 100644 src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp diff --git a/src/GenericDetectors/CMakeLists.txt b/src/GenericDetectors/CMakeLists.txt index 9995ab9..3266122 100644 --- a/src/GenericDetectors/CMakeLists.txt +++ b/src/GenericDetectors/CMakeLists.txt @@ -37,7 +37,8 @@ dd4hep_add_plugin(GenDetectors calorimeters/src/HexagonalShashlykSamplingECAL_geo.cpp calorimeters/src/EndcapECAL_geo.cpp calorimeters/src/CrystalEndcapECAL_geo.cpp - beamline/src/Beampipe_geo.cpp + calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp + beamline/src/Beampipe_geo.cpp beamline/src/B0pF_geo.cpp # WIP pid/src/GenericRICH_geo.cpp pid/src/HexagonalScintPreShower_geo.cpp diff --git a/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml new file mode 100644 index 0000000..45a9661 --- /dev/null +++ b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml @@ -0,0 +1,108 @@ + + + + + Electron Endcap EMCAL detector + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Common Generic visualization attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system:8,sector:4,module:14,sensor:2,side:32:-2,strip:24 + + + + + + + + + + + + diff --git a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp new file mode 100644 index 0000000..e6c041b --- /dev/null +++ b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp @@ -0,0 +1,68 @@ +//========================================================================== +// Scintillating Tile Endcap H Calorimeter Detector implementation +//-------------------------------------------------------------------------- +// J.KIM 2020-04-07 +// Created tile-shaped Pb/Sci +//========================================================================== +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" +#include +#include "TMath.h" +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" + +using namespace std; +using namespace dd4hep; +using namespace dd4hep::rec; +using namespace dd4hep::detail; + +static Ref_t createDetector(Detector& description, xml_h e, SensitiveDetector sens) { + xml_det_t x_det = e; + int det_id = x_det.id(); + string det_name = x_det.nameStr(); + + Assembly assembly( det_name+"_assembly" ); + int nlayers = 10; + + double layer0_thickness = 0.5*mm; //Pb_slice + double layer1_thickness = 1.5*mm; //Scint_slice + double total_layer_thickness = layer0_thickness + layer1_thickness; + + double width_x = 1*cm; + double width_y = 1*cm; + + auto gray_vis = description.visAttributes("GrayVis"); + auto red_vis = description.visAttributes("RedVis"); + + Assembly module_assembly( "module_assembly" ); + //Pb tile + Box lead_layer_shape(width_x/2.0, width_y/2.0,layer0_thickness/2.0); + Volume lead_layer_Vol("lead_layer_Vol", lead_layer_shape, description.material("Lead")); + lead_layer_Vol.setVisAttributes(gray_vis); + //Sci tile + Box scint_layer_shape(width_x/2.0, width_y/2.0,layer1_thickness/2.0); + Volume scint_layer_Vol("tile_scint_vol", scint_layer_shape, description.material("PlasticScint")); + scint_layer_Vol.setVisAttributes(red_vis); + + for(int ilayer = 0; ilayer < nlayers; ilayer++) { + double z_layer = ilayer * total_layer_thickness + layer0_thickness / 2.0; + auto lead_PV = module_assembly.placeVolume(lead_layer_Vol, Position(0.0, 0.0, z_layer)); + lead_PV.addPhysVolID("layer", ilayer).addPhysVolID("slice", 1); + double dz_scint = layer0_thickness / 2.0 + layer1_thickness / 2.0; + auto scint_PV = module_assembly.placeVolume(scint_layer_Vol, Position(0.0, 0.0, z_layer + dz_scint)); + scint_PV.addPhysVolID("layer", ilayer).addPhysVolID("slice", 2); + } + + PlacedVolume module_PV = assembly.placeVolume(module_assembly, Position(0.0,0.0, 0.0)); + module_PV.addPhysVolID("module", 0); + + DetElement det(det_name, det_id); + Volume motherVol = description.pickMotherVolume(det); + PlacedVolume envPV = motherVol.placeVolume(assembly, Position(0, 0, 0)); + envPV.addPhysVolID("system", det_id); + det.setPlacement(envPV); + return det; +} + +// clang-format off +DECLARE_DETELEMENT(ScintillatingTileEndcapHCAL, createDetector) -- GitLab From 15b858c602c979e7117d467ca95d56054d54ac49 Mon Sep 17 00:00:00 2001 From: "jihee.kim" Date: Wed, 8 Apr 2020 22:31:43 +0000 Subject: [PATCH 2/5] Added sensitive detector type and duplicated geant4 macro files --- .../calorimeters/compact/macro/gps3.mac | 26 +++++++++++++++++++ .../calorimeters/compact/macro/vis3.mac | 18 +++++++++++++ .../calorimeters/compact/scripts/run_example3 | 7 +++++ .../src/ScintillatingTileEndcapHCAL_geo.cpp | 4 ++- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/GenericDetectors/calorimeters/compact/macro/gps3.mac create mode 100644 src/GenericDetectors/calorimeters/compact/macro/vis3.mac create mode 100755 src/GenericDetectors/calorimeters/compact/scripts/run_example3 diff --git a/src/GenericDetectors/calorimeters/compact/macro/gps3.mac b/src/GenericDetectors/calorimeters/compact/macro/gps3.mac new file mode 100644 index 0000000..ebb8d2f --- /dev/null +++ b/src/GenericDetectors/calorimeters/compact/macro/gps3.mac @@ -0,0 +1,26 @@ +/run/beamOn 1 +/control/verbose 2 +/run/initialize + +/gps/verbose 2 +/gps/particle pi- +/gps/number 1 + +/gps/ene/type Gauss +/gps/ene/mono 2.5 GeV +/gps/ene/sigma 2.0 GeV + +/gps/pos/type Volume +/gps/pos/shape Cylinder +/gps/pos/centre 0.0 0.0 0.0 cm +/gps/pos/radius 0.01 cm +/gps/pos/halfz 0.01 cm +/gps/position 0 0 -0.02 m + +/gps/direction 0 0.07 1.0 +#/gps/ang/type iso + + +/control/execute macro/vis3.mac + +/run/beamOn 1 diff --git a/src/GenericDetectors/calorimeters/compact/macro/vis3.mac b/src/GenericDetectors/calorimeters/compact/macro/vis3.mac new file mode 100644 index 0000000..6c7656c --- /dev/null +++ b/src/GenericDetectors/calorimeters/compact/macro/vis3.mac @@ -0,0 +1,18 @@ +/vis/open OGL 800x800-0+0 + +/vis/drawVolume +/vis/viewer/set/viewpointThetaPhi 90. 0. +#/vis/viewer/zoom 30. +#/vis/viewer/set/style wireframe +#/vis/scene/add/axes 0 0 0 1 m +/vis/scene/add/trajectories rich smooth +/vis/modeling/trajectories/create/drawByCharge +/vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true +/vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 2 +/vis/scene/add/hits +/vis/scene/endOfEventAction accumulate 10 + +/vis/viewer/flush + + + diff --git a/src/GenericDetectors/calorimeters/compact/scripts/run_example3 b/src/GenericDetectors/calorimeters/compact/scripts/run_example3 new file mode 100755 index 0000000..6d6f60f --- /dev/null +++ b/src/GenericDetectors/calorimeters/compact/scripts/run_example3 @@ -0,0 +1,7 @@ +#!/bin/bash + +ddsim --runType vis --enableG4GPS \ + --macroFile macro/gps3.mac \ + --compactFile $1 \ + --outputFile test_calorimeter_sampling.root || exit + #--outputFile test_tracker_disc.root || exit diff --git a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp index e6c041b..565e8d9 100644 --- a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp +++ b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp @@ -51,7 +51,9 @@ static Ref_t createDetector(Detector& description, xml_h e, SensitiveDetector se double dz_scint = layer0_thickness / 2.0 + layer1_thickness / 2.0; auto scint_PV = module_assembly.placeVolume(scint_layer_Vol, Position(0.0, 0.0, z_layer + dz_scint)); scint_PV.addPhysVolID("layer", ilayer).addPhysVolID("slice", 2); - } + sens.setType("calorimeter"); + vol.setSensitiveDetector(sens); + } PlacedVolume module_PV = assembly.placeVolume(module_assembly, Position(0.0,0.0, 0.0)); module_PV.addPhysVolID("module", 0); -- GitLab From d94562871c6365b635da7b8336702d21fda9df0b Mon Sep 17 00:00:00 2001 From: "jihee.kim" Date: Wed, 8 Apr 2020 22:56:20 +0000 Subject: [PATCH 3/5] Fixed senSensitiveDetector. --- .../calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp index 565e8d9..977c4a8 100644 --- a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp +++ b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp @@ -48,11 +48,13 @@ static Ref_t createDetector(Detector& description, xml_h e, SensitiveDetector se double z_layer = ilayer * total_layer_thickness + layer0_thickness / 2.0; auto lead_PV = module_assembly.placeVolume(lead_layer_Vol, Position(0.0, 0.0, z_layer)); lead_PV.addPhysVolID("layer", ilayer).addPhysVolID("slice", 1); + sens.setType("calorimeter"); + lead_layer_Vol.setSensitiveDetector(sens); double dz_scint = layer0_thickness / 2.0 + layer1_thickness / 2.0; auto scint_PV = module_assembly.placeVolume(scint_layer_Vol, Position(0.0, 0.0, z_layer + dz_scint)); scint_PV.addPhysVolID("layer", ilayer).addPhysVolID("slice", 2); sens.setType("calorimeter"); - vol.setSensitiveDetector(sens); + scint_layer_Vol.setSensitiveDetector(sens); } PlacedVolume module_PV = assembly.placeVolume(module_assembly, Position(0.0,0.0, 0.0)); -- GitLab From f2f5c71b0759239d175b86539ec5577618bbbdb9 Mon Sep 17 00:00:00 2001 From: "jihee.kim" Date: Wed, 8 Apr 2020 23:53:16 +0000 Subject: [PATCH 4/5] Fixed readout and added segmentation. --- .../compact/ScintillatingTileEndcapHCAL_example.xml | 5 +++-- src/GenericDetectors/calorimeters/compact/macro/gps3.mac | 4 ++-- src/GenericDetectors/calorimeters/compact/macro/vis3.mac | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml index 45a9661..f2bbcef 100644 --- a/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml +++ b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml @@ -79,8 +79,9 @@ - - system:8,sector:4,module:14,sensor:2,side:32:-2,strip:24 + + + system:8,module:14,layer:10,slice:2,x:48:-8,y:-8 diff --git a/src/GenericDetectors/calorimeters/compact/macro/gps3.mac b/src/GenericDetectors/calorimeters/compact/macro/gps3.mac index ebb8d2f..da41b0d 100644 --- a/src/GenericDetectors/calorimeters/compact/macro/gps3.mac +++ b/src/GenericDetectors/calorimeters/compact/macro/gps3.mac @@ -7,7 +7,7 @@ /gps/number 1 /gps/ene/type Gauss -/gps/ene/mono 2.5 GeV +/gps/ene/mono 5.5 GeV /gps/ene/sigma 2.0 GeV /gps/pos/type Volume @@ -15,7 +15,7 @@ /gps/pos/centre 0.0 0.0 0.0 cm /gps/pos/radius 0.01 cm /gps/pos/halfz 0.01 cm -/gps/position 0 0 -0.02 m +/gps/position 0 0 0.02 cm /gps/direction 0 0.07 1.0 #/gps/ang/type iso diff --git a/src/GenericDetectors/calorimeters/compact/macro/vis3.mac b/src/GenericDetectors/calorimeters/compact/macro/vis3.mac index 6c7656c..d08726b 100644 --- a/src/GenericDetectors/calorimeters/compact/macro/vis3.mac +++ b/src/GenericDetectors/calorimeters/compact/macro/vis3.mac @@ -10,7 +10,7 @@ /vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true /vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 2 /vis/scene/add/hits -/vis/scene/endOfEventAction accumulate 10 +/vis/scene/endOfEventAction accumulate 200 /vis/viewer/flush -- GitLab From 6670da9a52d85451391df334ca2a088406512465 Mon Sep 17 00:00:00 2001 From: "jihee.kim" Date: Tue, 28 Apr 2020 23:43:00 +0000 Subject: [PATCH 5/5] Modified Pb/Sc sampling calorimeter --- .../ScintillatingTileEndcapHCAL_example.xml | 7 +- .../src/ScintillatingTileEndcapHCAL_geo.cpp | 127 ++++++++++++++++-- 2 files changed, 122 insertions(+), 12 deletions(-) diff --git a/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml index f2bbcef..80f7c6f 100644 --- a/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml +++ b/src/GenericDetectors/calorimeters/compact/ScintillatingTileEndcapHCAL_example.xml @@ -79,9 +79,10 @@ - - - system:8,module:14,layer:10,slice:2,x:48:-8,y:-8 + + system:5,module:14,sensor:2,side:32:-2,strip:24 + + diff --git a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp index 977c4a8..ab09178 100644 --- a/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp +++ b/src/GenericDetectors/calorimeters/src/ScintillatingTileEndcapHCAL_geo.cpp @@ -20,30 +20,38 @@ static Ref_t createDetector(Detector& description, xml_h e, SensitiveDetector se xml_det_t x_det = e; int det_id = x_det.id(); string det_name = x_det.nameStr(); + // Size of Endcap + double rmin = 2.0*cm; + double rmax = 10.0*cm; Assembly assembly( det_name+"_assembly" ); - int nlayers = 10; - + // Number of layers of each tile + int nlayers = 30; + // Thickness of plates double layer0_thickness = 0.5*mm; //Pb_slice double layer1_thickness = 1.5*mm; //Scint_slice double total_layer_thickness = layer0_thickness + layer1_thickness; - + // Size of tile double width_x = 1*cm; double width_y = 1*cm; - + // Visualization Setting auto gray_vis = description.visAttributes("GrayVis"); auto red_vis = description.visAttributes("RedVis"); + DetElement det(det_name, det_id); + Assembly module_assembly( "module_assembly" ); + PlacedVolume module_PV; + //Pb tile Box lead_layer_shape(width_x/2.0, width_y/2.0,layer0_thickness/2.0); Volume lead_layer_Vol("lead_layer_Vol", lead_layer_shape, description.material("Lead")); lead_layer_Vol.setVisAttributes(gray_vis); //Sci tile Box scint_layer_shape(width_x/2.0, width_y/2.0,layer1_thickness/2.0); - Volume scint_layer_Vol("tile_scint_vol", scint_layer_shape, description.material("PlasticScint")); + Volume scint_layer_Vol("scint_layer_Vol", scint_layer_shape, description.material("PlasticScint")); scint_layer_Vol.setVisAttributes(red_vis); - + // A Stack of Pb and Scintillator tiles for(int ilayer = 0; ilayer < nlayers; ilayer++) { double z_layer = ilayer * total_layer_thickness + layer0_thickness / 2.0; auto lead_PV = module_assembly.placeVolume(lead_layer_Vol, Position(0.0, 0.0, z_layer)); @@ -57,10 +65,111 @@ static Ref_t createDetector(Detector& description, xml_h e, SensitiveDetector se scint_layer_Vol.setSensitiveDetector(sens); } - PlacedVolume module_PV = assembly.placeVolume(module_assembly, Position(0.0,0.0, 0.0)); - module_PV.addPhysVolID("module", 0); + // How many + int nx = 10; + int ny = 10; + // Offset between X and Y + double offset_x = 0.1*mm; + double offset_y = 0.1*mm; + // Position of each stack of Pb/Sc + double pos_x = 0.0*cm; + double pos_y = 0.0*cm; + // Starting Position of each stack of Pb/Sc + double x_start = (width_x + offset_x)/2.0; + double y_start = (width_y + offset_x)/2.0; + // Spacing between stacks and Diagonal length + double x_spacing = width_x + offset_x; + double y_spacing = width_y + offset_y; + double diagonal = width_x*sqrt(2); + // Limit based on Endcap size + double limit_inner = rmin + diagonal/2.0; + double limit_outer = rmax - diagonal/2.0; + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Start placing stacks of Pb/Sc + // Divide 4 sections; X+Y+, X-Y+, X+Y-, X-Y- + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // X+Y+ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int imod = 0; + for(int ix = 0; ix limit_inner && sqrt((pos_x*pos_x) + (pos_y*pos_y)) < limit_outer) + { + module_PV = assembly.placeVolume(module_assembly, Position(pos_x,pos_y,0.0)); + imod++; + module_PV.addPhysVolID("module", imod); + } + else + continue; + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // X-Y+ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for(int ix = 0; ix limit_inner && sqrt((pos_x*pos_x) + (pos_y*pos_y)) < limit_outer) + { + module_PV = assembly.placeVolume(module_assembly, Position(pos_x,pos_y, 0.0)); + imod++; + module_PV.addPhysVolID("module", imod); + } + else + continue; + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // X+Y- + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for(int ix = 0; ix limit_inner && sqrt((pos_x*pos_x) + (pos_y*pos_y)) < limit_outer) + { + module_PV = assembly.placeVolume(module_assembly, Position(pos_x,pos_y, 0.0)); + imod++; + module_PV.addPhysVolID("module", imod); + } + else + continue; + } + } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // X-Y- + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for(int ix = 0; ix limit_inner && sqrt((pos_x*pos_x) + (pos_y*pos_y)) < limit_outer) + { + module_PV = assembly.placeVolume(module_assembly, Position(pos_x,pos_y, 0.0)); + imod++; + module_PV.addPhysVolID("module", imod); + } + else + continue; + } + } - DetElement det(det_name, det_id); Volume motherVol = description.pickMotherVolume(det); PlacedVolume envPV = motherVol.placeVolume(assembly, Position(0, 0, 0)); envPV.addPhysVolID("system", det_id); -- GitLab