Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
athena
Manage
Activity
Members
Labels
Plan
Issues
38
Issue boards
Milestones
Wiki
Code
Merge requests
34
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
EIC
detectors
athena
Commits
ee95dfa7
Commit
ee95dfa7
authored
3 years ago
by
Chao Peng
Browse files
Options
Downloads
Patches
Plain Diff
adjust surface of crystals
parent
0258f588
No related branches found
No related tags found
1 merge request
!56
adjust surface of crystals
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
compact/ce_ecal_crystal_glass.xml
+55
-53
55 additions, 53 deletions
compact/ce_ecal_crystal_glass.xml
scripts/ce_ecal_placement.py
+81
-108
81 additions, 108 deletions
scripts/ce_ecal_placement.py
src/HomogeneousCalorimeter_geo.cpp
+38
-13
38 additions, 13 deletions
src/HomogeneousCalorimeter_geo.cpp
with
174 additions
and
174 deletions
compact/ce_ecal_crystal_glass.xml
+
55
−
53
View file @
ee95dfa7
...
...
@@ -4,13 +4,17 @@
<constant
name=
"CrystalModule_sy"
value=
"20.0*mm"
/>
<constant
name=
"CrystalModule_sz"
value=
"20.0*cm"
/>
<constant
name=
"CrystalModule_wrap"
value=
"0.5*mm"
/>
<constant
name=
"CrystalModule_dz"
value=
"-8*cm"
/>
<constant
name=
"GlassModule_sx"
value=
"40.0*mm"
/>
<constant
name=
"GlassModule_sy"
value=
"40.0*mm"
/>
<constant
name=
"GlassModule_sz"
value=
"40.0*cm"
/>
<constant
name=
"GlassModule_dz"
value=
"0.0*cm"
/>
<constant
name=
"GlassModule_wrap"
value=
"1.0*mm"
/>
<constant
name=
"CrystalModule_z0"
value=
"10.*cm"
/>
<constant
name=
"GlassModule_z0"
value=
"0.0*cm"
/>
<constant
name=
"EcalEndcapN_z0"
value=
"-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2."
/>
<constant
name=
"CrystalModule_dx"
value=
"CrystalModule_sx + CrystalModule_wrap"
/>
<constant
name=
"CrystalModule_dy"
value=
"CrystalModule_sy + CrystalModule_wrap"
/>
<constant
name=
"GlassModule_dx"
value=
"GlassModule_sx + GlassModule_wrap"
/>
<constant
name=
"GlassModule_dy"
value=
"GlassModule_sy + GlassModule_wrap"
/>
</define>
<detectors>
<comment>
Backwards Endcap EM Calorimeter, placements generated by script
</comment>
...
...
@@ -21,59 +25,57 @@
<lines
sector=
"1"
mirrorx=
"true"
mirrory=
"true"
>
<module
sizex=
"CrystalModule_sx"
sizey=
"CrystalModule_sy"
sizez=
"CrystalModule_sz"
material=
"PbWO4"
vis=
"AnlTeal"
/>
<wrapper
thickness=
"CrystalModule_wrap"
material=
"Epoxy"
vis=
"WhiteVis"
/>
<position
z=
"CrystalModule_dz"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*1/2."
begin=
"7"
nmods=
"17"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*3/2."
begin=
"7"
nmods=
"17"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*5/2."
begin=
"7"
nmods=
"17"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*7/2."
begin=
"6"
nmods=
"18"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*9/2."
begin=
"6"
nmods=
"18"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*11/2."
begin=
"5"
nmods=
"19"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*13/2."
begin=
"3"
nmods=
"19"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*15/2."
begin=
"0"
nmods=
"22"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*17/2."
begin=
"0"
nmods=
"22"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*19/2."
begin=
"0"
nmods=
"22"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*21/2."
begin=
"0"
nmods=
"22"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*23/2."
begin=
"0"
nmods=
"22"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*25/2."
begin=
"0"
nmods=
"20"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*27/2."
begin=
"0"
nmods=
"20"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*29/2."
begin=
"0"
nmods=
"18"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*31/2."
begin=
"0"
nmods=
"18"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*33/2."
begin=
"0"
nmods=
"16"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*35/2."
begin=
"0"
nmods=
"16"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*37/2."
begin=
"0"
nmods=
"14"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*39/2."
begin=
"0"
nmods=
"14"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*41/2."
begin=
"0"
nmods=
"12"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*43/2."
begin=
"0"
nmods=
"12"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*45/2."
begin=
"0"
nmods=
"6"
/>
<line
x=
"(CrystalModule_sx + CrystalModule_wrap)/2."
y=
"(CrystalModule_sy + CrystalModule_wrap)*47/2."
begin=
"0"
nmods=
"6"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*1/2."
z=
"CrystalModule_z0"
begin=
"7"
nmods=
"17"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*3/2."
z=
"CrystalModule_z0"
begin=
"7"
nmods=
"17"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*5/2."
z=
"CrystalModule_z0"
begin=
"7"
nmods=
"17"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*7/2."
z=
"CrystalModule_z0"
begin=
"6"
nmods=
"18"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*9/2."
z=
"CrystalModule_z0"
begin=
"6"
nmods=
"18"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*11/2."
z=
"CrystalModule_z0"
begin=
"5"
nmods=
"19"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*13/2."
z=
"CrystalModule_z0"
begin=
"3"
nmods=
"19"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*15/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"22"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*17/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"22"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*19/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"22"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*21/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"22"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*23/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"22"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*25/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"20"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*27/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"20"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*29/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"18"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*31/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"18"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*33/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"16"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*35/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"16"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*37/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"14"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*39/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"14"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*41/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"12"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*43/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"12"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*45/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"6"
/>
<line
axis=
"x"
x=
"CrystalModule_dx/2."
y=
"CrystalModule_dy*47/2."
z=
"CrystalModule_z0"
begin=
"0"
nmods=
"6"
/>
</lines>
<lines
sector=
"2"
mirrorx=
"true"
mirrory=
"true"
>
<module
sizex=
"GlassModule_sx"
sizey=
"GlassModule_sy"
sizez=
"GlassModule_sz"
material=
"PbGlass"
vis=
"AnlBlue"
/>
<wrapper
thickness=
"GlassModule_wrap"
material=
"Epoxy"
vis=
"WhiteVis"
/>
<position
z=
"GlassModule_dz"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*1/2."
begin=
"12"
nmods=
"11"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*3/2."
begin=
"12"
nmods=
"11"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*5/2."
begin=
"12"
nmods=
"11"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*7/2."
begin=
"11"
nmods=
"12"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*9/2."
begin=
"11"
nmods=
"12"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*11/2."
begin=
"11"
nmods=
"12"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*13/2."
begin=
"10"
nmods=
"12"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*15/2."
begin=
"9"
nmods=
"13"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*17/2."
begin=
"8"
nmods=
"13"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*19/2."
begin=
"7"
nmods=
"14"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*21/2."
begin=
"6"
nmods=
"14"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*23/2."
begin=
"3"
nmods=
"16"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*25/2."
begin=
"0"
nmods=
"19"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*27/2."
begin=
"0"
nmods=
"18"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*29/2."
begin=
"0"
nmods=
"18"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*31/2."
begin=
"0"
nmods=
"17"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*33/2."
begin=
"0"
nmods=
"17"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*35/2."
begin=
"0"
nmods=
"15"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*37/2."
begin=
"0"
nmods=
"13"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*39/2."
begin=
"0"
nmods=
"11"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*41/2."
begin=
"0"
nmods=
"10"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*43/2."
begin=
"0"
nmods=
"8"
/>
<line
x=
"(GlassModule_sx + GlassModule_wrap)/2."
y=
"(GlassModule_sy + GlassModule_wrap)*45/2."
begin=
"0"
nmods=
"6"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*1/2."
z=
"GlassModule_z0"
begin=
"12"
nmods=
"11"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*3/2."
z=
"GlassModule_z0"
begin=
"12"
nmods=
"11"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*5/2."
z=
"GlassModule_z0"
begin=
"12"
nmods=
"11"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*7/2."
z=
"GlassModule_z0"
begin=
"11"
nmods=
"12"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*9/2."
z=
"GlassModule_z0"
begin=
"11"
nmods=
"12"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*11/2."
z=
"GlassModule_z0"
begin=
"11"
nmods=
"12"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*13/2."
z=
"GlassModule_z0"
begin=
"10"
nmods=
"12"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*15/2."
z=
"GlassModule_z0"
begin=
"9"
nmods=
"13"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*17/2."
z=
"GlassModule_z0"
begin=
"8"
nmods=
"13"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*19/2."
z=
"GlassModule_z0"
begin=
"7"
nmods=
"14"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*21/2."
z=
"GlassModule_z0"
begin=
"6"
nmods=
"14"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*23/2."
z=
"GlassModule_z0"
begin=
"3"
nmods=
"16"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*25/2."
z=
"GlassModule_z0"
begin=
"0"
nmods=
"19"
/>
<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=
"17"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*33/2."
z=
"GlassModule_z0"
begin=
"0"
nmods=
"17"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*35/2."
z=
"GlassModule_z0"
begin=
"0"
nmods=
"15"
/>
<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=
"8"
/>
<line
axis=
"x"
x=
"GlassModule_dx/2."
y=
"GlassModule_dy*45/2."
z=
"GlassModule_z0"
begin=
"0"
nmods=
"6"
/>
</lines>
</placements>
</detector>
...
...
@@ -82,8 +84,8 @@
<comment>
Effectively no segmentation, the segmentation is used to provide cell dimension info
</comment>
<readout
name=
"EcalEndcapNHits"
>
<segmentation
type=
"MultiSegmentation"
key=
"sector"
>
<segmentation
name=
"CrystalSeg"
key_value=
"1"
type=
"CartesianGridXY"
grid_size_x=
"CrystalModule_
sx + CrystalModule_wrap
"
grid_size_y=
"CrystalModule_
sy + CrystalModule_wrap
"
/>
<segmentation
name=
"GlassSeg"
key_value=
"2"
type=
"CartesianGridXY"
grid_size_x=
"GlassModule_
sx + GlassModule_wrap
"
grid_size_y=
"GlassModule_
sy + GlassModule_wrap
"
/>
<segmentation
name=
"CrystalSeg"
key_value=
"1"
type=
"CartesianGridXY"
grid_size_x=
"CrystalModule_
dx
"
grid_size_y=
"CrystalModule_
dy
"
/>
<segmentation
name=
"GlassSeg"
key_value=
"2"
type=
"CartesianGridXY"
grid_size_x=
"GlassModule_
dx
"
grid_size_y=
"GlassModule_
dy
"
/>
</segmentation>
<id>
system:8,sector:4,module:20,x:32:-16,y:-16
</id>
</readout>
...
...
This diff is collapsed.
Click to expand it.
scripts/ce_ecal_placement.py
+
81
−
108
View file @
ee95dfa7
...
...
@@ -10,65 +10,49 @@ import argparse
from
lxml
import
etree
as
ET
# start pos, total number of blocks
# constants: name, value
CONSTANTS
=
[
(
'
CrystalModule_sx
'
,
'
20.0*mm
'
),
(
'
CrystalModule_sy
'
,
'
20.0*mm
'
),
(
'
CrystalModule_sz
'
,
'
20.0*cm
'
),
(
'
CrystalModule_wrap
'
,
'
0.5*mm
'
),
(
'
GlassModule_sx
'
,
'
40.0*mm
'
),
(
'
GlassModule_sy
'
,
'
40.0*mm
'
),
(
'
GlassModule_sz
'
,
'
40.0*cm
'
),
(
'
GlassModule_wrap
'
,
'
1.0*mm
'
),
(
'
CrystalModule_z0
'
,
'
10.*cm
'
),
(
'
GlassModule_z0
'
,
'
0.0*cm
'
),
(
'
EcalEndcapN_z0
'
,
'
-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.
'
),
(
'
CrystalModule_dx
'
,
'
CrystalModule_sx + CrystalModule_wrap
'
),
(
'
CrystalModule_dy
'
,
'
CrystalModule_sy + CrystalModule_wrap
'
),
(
'
GlassModule_dx
'
,
'
GlassModule_sx + GlassModule_wrap
'
),
(
'
GlassModule_dy
'
,
'
GlassModule_sy + GlassModule_wrap
'
),
]
# line-by-line alignment start pos, total number of blocks
CRYSTAL_ALIGNMENT
=
[
(
8
,
17
),
(
8
,
17
),
(
8
,
17
),
(
7
,
18
),
(
7
,
18
),
(
6
,
19
),
(
4
,
19
),
(
1
,
22
),
(
1
,
22
),
(
1
,
22
),
(
1
,
22
),
(
1
,
22
),
(
1
,
20
),
(
1
,
20
),
(
1
,
18
),
(
1
,
18
),
(
1
,
16
),
(
1
,
16
),
(
1
,
14
),
(
1
,
14
),
(
1
,
12
),
(
1
,
12
),
(
1
,
6
),
(
1
,
6
),
(
7
,
17
),
(
7
,
17
),
(
7
,
17
),
(
6
,
18
),
(
6
,
18
),
(
5
,
19
),
(
3
,
19
),
(
0
,
22
),
(
0
,
22
),
(
0
,
22
),
(
0
,
22
),
(
0
,
22
),
(
0
,
20
),
(
0
,
20
),
(
0
,
18
),
(
0
,
18
),
(
0
,
16
),
(
0
,
16
),
(
0
,
14
),
(
0
,
14
),
(
0
,
12
),
(
0
,
12
),
(
0
,
6
),
(
0
,
6
),
]
GLASS_ALIGNMENT
=
[
(
13
,
11
),
(
13
,
11
),
(
13
,
11
),
(
12
,
12
),
(
12
,
12
),
(
12
,
12
),
(
11
,
12
),
(
10
,
13
),
(
9
,
13
),
(
8
,
14
),
(
7
,
14
),
(
4
,
16
),
(
1
,
19
),
(
1
,
18
),
(
1
,
18
),
(
1
,
17
),
(
1
,
17
),
(
1
,
15
),
(
1
,
13
),
(
1
,
11
),
(
1
,
10
),
(
1
,
8
),
(
1
,
6
),
(
12
,
11
),
(
12
,
11
),
(
12
,
11
),
(
11
,
12
),
(
11
,
12
),
(
11
,
12
),
(
10
,
12
),
(
9
,
13
),
(
8
,
13
),
(
7
,
14
),
(
6
,
14
),
(
3
,
16
),
(
0
,
19
),
(
0
,
18
),
(
0
,
18
),
(
0
,
17
),
(
0
,
17
),
(
0
,
15
),
(
0
,
13
),
(
0
,
11
),
(
0
,
10
),
(
0
,
8
),
(
0
,
6
),
]
# calculate positions of modules with a quad-alignment and module size
def
individual_placement
(
alignment
,
module_x
=
20.5
,
module_y
=
20.5
):
placements
=
[]
for
row
,
(
start
,
num
)
in
enumerate
(
alignment
):
for
col
in
np
.
arange
(
start
-
1
,
start
+
num
-
1
):
for
col
in
np
.
arange
(
start
,
start
+
num
):
placements
.
append
(((
col
+
0.5
)
*
module_y
,
(
row
+
0.5
)
*
module_x
))
placements
=
np
.
asarray
(
placements
)
return
np
.
vstack
((
placements
,
...
...
@@ -82,27 +66,14 @@ if __name__ == '__main__':
parser
=
argparse
.
ArgumentParser
()
parser
.
add_argument
(
'
-s
'
,
'
--save
'
,
default
=
'
compact/ce_ecal_crystal_glass.xml
'
,
help
=
'
path to save compact file.
'
)
parser
.
add_argument
(
'
--individual
'
,
dest
=
'
indiv
'
,
action
=
'
store_true
'
,
help
=
'
individual block placements instead of line placements
'
)
args
=
parser
.
parse_args
()
data
=
ET
.
Element
(
'
lccdd
'
)
defines
=
ET
.
SubElement
(
data
,
'
define
'
)
# constants: name, value
consts
=
[
(
'
CrystalModule_sx
'
,
'
20.0*mm
'
),
(
'
CrystalModule_sy
'
,
'
20.0*mm
'
),
(
'
CrystalModule_sz
'
,
'
20.0*cm
'
),
(
'
CrystalModule_wrap
'
,
'
0.5*mm
'
),
(
'
CrystalModule_dz
'
,
'
-8*cm
'
),
(
'
GlassModule_sx
'
,
'
40.0*mm
'
),
(
'
GlassModule_sy
'
,
'
40.0*mm
'
),
(
'
GlassModule_sz
'
,
'
40.0*cm
'
),
(
'
GlassModule_dz
'
,
'
0.0*cm
'
),
(
'
GlassModule_wrap
'
,
'
1.0*mm
'
),
(
'
EcalEndcapN_z0
'
,
'
-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.
'
),
]
for
name
,
value
in
consts
:
for
name
,
value
in
CONSTANTS
:
constant
=
ET
.
SubElement
(
defines
,
'
constant
'
)
constant
.
set
(
'
name
'
,
name
)
constant
.
set
(
'
value
'
,
value
)
...
...
@@ -133,10 +104,10 @@ if __name__ == '__main__':
# placements of modules
plm
=
ET
.
SubElement
(
det
,
'
placements
'
)
pltype
=
'
individuals
'
if
args
.
indiv
else
'
lines
'
# crystals
# crystal = ET.SubElement(plm, 'individuals')
crystal
=
ET
.
SubElement
(
plm
,
'
lines
'
)
# crystal
crystal
=
ET
.
SubElement
(
plm
,
pltype
)
crystal
.
set
(
'
sector
'
,
'
1
'
)
crystal_mod
=
ET
.
SubElement
(
crystal
,
'
module
'
)
crystal_mod
.
set
(
'
sizex
'
,
'
CrystalModule_sx
'
)
...
...
@@ -148,30 +119,30 @@ if __name__ == '__main__':
crystal_wrap
.
set
(
'
thickness
'
,
'
CrystalModule_wrap
'
)
crystal_wrap
.
set
(
'
material
'
,
'
Epoxy
'
)
crystal_wrap
.
set
(
'
vis
'
,
'
WhiteVis
'
)
crystal_pos
=
ET
.
SubElement
(
crystal
,
'
position
'
)
crystal_pos
.
set
(
'
z
'
,
'
CrystalModule_dz
'
)
# crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT))
:
#
module = ET.SubElement(crystal, 'placement')
#
module
.set('x', '{:.3f}*mm'.format(x)
)
#
module.set('
y
', '{:.3f}*mm'.format(
y
))
#
module.set('
z
', '
0'
)
#
module.set('
id
', '
{:d}'.format(m)
)
if
args
.
indiv
:
for
m
,
(
x
,
y
)
in
enumerate
(
individual_placement
(
CRYSTAL_ALIGNMENT
)):
module
=
ET
.
SubElement
(
crystal
,
'
placement
'
)
module
.
set
(
'
x
'
,
'
{:.3f}*mm
'
.
format
(
x
))
module
.
set
(
'
y
'
,
'
{:.3f}*mm
'
.
format
(
y
)
)
module
.
set
(
'
z
'
,
'
CrystalModule_z0
'
)
module
.
set
(
'
id
'
,
'
{:d}
'
.
format
(
m
))
# crystal placements (for lines)
crystal
.
set
(
'
mirrorx
'
,
'
true
'
)
crystal
.
set
(
'
mirrory
'
,
'
true
'
)
for
row
,
(
begin
,
nmods
)
in
enumerate
(
CRYSTAL_ALIGNMENT
):
line
=
ET
.
SubElement
(
crystal
,
'
line
'
)
line
.
set
(
'
x
'
,
'
(CrystalModule_sx + CrystalModule_wrap)/2.
'
)
line
.
set
(
'
y
'
,
'
(CrystalModule_sy + CrystalModule_wrap)*{:d}/2.
'
.
format
(
row
*
2
+
1
))
line
.
set
(
'
begin
'
,
'
{:d}
'
.
format
(
begin
-
1
))
line
.
set
(
'
nmods
'
,
'
{:d}
'
.
format
(
nmods
))
else
:
crystal
.
set
(
'
mirrorx
'
,
'
true
'
)
crystal
.
set
(
'
mirrory
'
,
'
true
'
)
for
row
,
(
begin
,
nmods
)
in
enumerate
(
CRYSTAL_ALIGNMENT
):
line
=
ET
.
SubElement
(
crystal
,
'
line
'
)
line
.
set
(
'
axis
'
,
'
x
'
)
line
.
set
(
'
x
'
,
'
CrystalModule_dx/2.
'
)
line
.
set
(
'
y
'
,
'
CrystalModule_dy*{:d}/2.
'
.
format
(
row
*
2
+
1
))
line
.
set
(
'
z
'
,
'
CrystalModule_z0
'
)
line
.
set
(
'
begin
'
,
'
{:d}
'
.
format
(
begin
))
line
.
set
(
'
nmods
'
,
'
{:d}
'
.
format
(
nmods
))
# glass
# glass = ET.SubElement(plm, 'individuals')
glass
=
ET
.
SubElement
(
plm
,
'
lines
'
)
glass
=
ET
.
SubElement
(
plm
,
pltype
)
glass
.
set
(
'
sector
'
,
'
2
'
)
glass_mod
=
ET
.
SubElement
(
glass
,
'
module
'
)
glass_mod
.
set
(
'
sizex
'
,
'
GlassModule_sx
'
)
...
...
@@ -184,25 +155,27 @@ if __name__ == '__main__':
glass_wrap
.
set
(
'
thickness
'
,
'
GlassModule_wrap
'
)
glass_wrap
.
set
(
'
material
'
,
'
Epoxy
'
)
glass_wrap
.
set
(
'
vis
'
,
'
WhiteVis
'
)
glass_pos
=
ET
.
SubElement
(
glass
,
'
position
'
)
glass_pos
.
set
(
'
z
'
,
'
GlassModule_dz
'
)
# crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0))
:
#
module = ET.SubElement(glass, 'placement')
#
module
.set('x', '{:.3f}*mm'.format(x)
)
#
module.set('
y
', '{:.3f}*mm'.format(
y
))
#
module.set('
z
', '
0'
)
#
module.set('
id
', '
{:d}'.format(m)
)
if
args
.
indiv
:
for
m
,
(
x
,
y
)
in
enumerate
(
individual_placement
(
GLASS_ALIGNMENT
,
41.0
,
41.0
)):
module
=
ET
.
SubElement
(
glass
,
'
placement
'
)
module
.
set
(
'
x
'
,
'
{:.3f}*mm
'
.
format
(
x
))
module
.
set
(
'
y
'
,
'
{:.3f}*mm
'
.
format
(
y
)
)
module
.
set
(
'
z
'
,
'
GlassModule_z0
'
)
module
.
set
(
'
id
'
,
'
{:d}
'
.
format
(
m
))
# crystal placements (for lines)
glass
.
set
(
'
mirrorx
'
,
'
true
'
)
glass
.
set
(
'
mirrory
'
,
'
true
'
)
for
row
,
(
begin
,
nmods
)
in
enumerate
(
GLASS_ALIGNMENT
):
line
=
ET
.
SubElement
(
glass
,
'
line
'
)
line
.
set
(
'
x
'
,
'
(GlassModule_sx + GlassModule_wrap)/2.
'
)
line
.
set
(
'
y
'
,
'
(GlassModule_sy + GlassModule_wrap)*{:d}/2.
'
.
format
(
row
*
2
+
1
))
line
.
set
(
'
begin
'
,
'
{:d}
'
.
format
(
begin
-
1
))
line
.
set
(
'
nmods
'
,
'
{:d}
'
.
format
(
nmods
))
else
:
glass
.
set
(
'
mirrorx
'
,
'
true
'
)
glass
.
set
(
'
mirrory
'
,
'
true
'
)
for
row
,
(
begin
,
nmods
)
in
enumerate
(
GLASS_ALIGNMENT
):
line
=
ET
.
SubElement
(
glass
,
'
line
'
)
line
.
set
(
'
axis
'
,
'
x
'
)
line
.
set
(
'
x
'
,
'
GlassModule_dx/2.
'
)
line
.
set
(
'
y
'
,
'
GlassModule_dy*{:d}/2.
'
.
format
(
row
*
2
+
1
))
line
.
set
(
'
z
'
,
'
GlassModule_z0
'
)
line
.
set
(
'
begin
'
,
'
{:d}
'
.
format
(
begin
))
line
.
set
(
'
nmods
'
,
'
{:d}
'
.
format
(
nmods
))
# readout
readouts
=
ET
.
SubElement
(
data
,
'
readouts
'
)
...
...
@@ -219,14 +192,14 @@ if __name__ == '__main__':
crystal_seg
.
set
(
'
name
'
,
'
CrystalSeg
'
)
crystal_seg
.
set
(
'
key_value
'
,
'
1
'
)
crystal_seg
.
set
(
'
type
'
,
'
CartesianGridXY
'
)
crystal_seg
.
set
(
'
grid_size_x
'
,
'
CrystalModule_
sx + CrystalModule_wrap
'
)
crystal_seg
.
set
(
'
grid_size_y
'
,
'
CrystalModule_
sy + CrystalModule_wrap
'
)
crystal_seg
.
set
(
'
grid_size_x
'
,
'
CrystalModule_
dx
'
)
crystal_seg
.
set
(
'
grid_size_y
'
,
'
CrystalModule_
dy
'
)
glass_seg
=
ET
.
SubElement
(
seg
,
'
segmentation
'
)
glass_seg
.
set
(
'
name
'
,
'
GlassSeg
'
)
glass_seg
.
set
(
'
key_value
'
,
'
2
'
)
glass_seg
.
set
(
'
type
'
,
'
CartesianGridXY
'
)
glass_seg
.
set
(
'
grid_size_x
'
,
'
GlassModule_
sx + GlassModule_wrap
'
)
glass_seg
.
set
(
'
grid_size_y
'
,
'
GlassModule_
sy + GlassModule_wrap
'
)
glass_seg
.
set
(
'
grid_size_x
'
,
'
GlassModule_
dx
'
)
glass_seg
.
set
(
'
grid_size_y
'
,
'
GlassModule_
dy
'
)
rid
=
ET
.
SubElement
(
readout
,
'
id
'
)
rid
.
text
=
'
system:8,sector:4,module:20,x:32:-16,y:-16
'
...
...
This diff is collapsed.
Click to expand it.
src/HomogeneousCalorimeter_geo.cpp
+
38
−
13
View file @
ee95dfa7
...
...
@@ -99,9 +99,9 @@ using namespace dd4hep::detail;
* <lines sector="1" mirrorx="true" mirrory="true"/>
* <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"/>
* <line x="10.25*mm" y="10.25*mm" begin="8" nmods="16"/>
* <line x="10.25*mm" y="30.75*mm" begin="8" nmods="16"/>
* <line x="10.25*mm" y="51.25*mm" begin="8" nmods="16"/>
* <line x="10.25*mm" y="10.25*mm"
axis="x"
begin="8" nmods="16"/>
* <line x="10.25*mm" y="30.75*mm"
axis="y"
begin="8" nmods="16"/>
* <line x="10.25*mm" y="51.25*mm"
axis="z"
begin="8" nmods="16"/>
* </individuals>
* </placements>
* </detector>
...
...
@@ -297,6 +297,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
int
id_begin
=
dd4hep
::
getAttrOrDefault
<
int
>
(
plm
,
_Unicode
(
id_begin
),
1
);
bool
mirrorx
=
dd4hep
::
getAttrOrDefault
<
bool
>
(
plm
,
_Unicode
(
mirrorx
),
false
);
bool
mirrory
=
dd4hep
::
getAttrOrDefault
<
bool
>
(
plm
,
_Unicode
(
mirrory
),
false
);
bool
mirrorz
=
dd4hep
::
getAttrOrDefault
<
bool
>
(
plm
,
_Unicode
(
mirrorz
),
false
);
// line placement
int
mid
=
1
;
...
...
@@ -307,26 +308,50 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
Position
rot
(
dd4hep
::
getAttrOrDefault
<
double
>
(
pl
,
_Unicode
(
rotx
),
0.
),
dd4hep
::
getAttrOrDefault
<
double
>
(
pl
,
_Unicode
(
roty
),
0.
),
dd4hep
::
getAttrOrDefault
<
double
>
(
pl
,
_Unicode
(
rotz
),
0.
));
// determine axis
std
::
string
axis
=
dd4hep
::
getAttrOrDefault
(
pl
,
_Unicode
(
axis
),
"x"
);
std
::
transform
(
axis
.
begin
(),
axis
.
end
(),
axis
.
begin
(),
[](
char
c
)
{
return
std
::
tolower
(
c
);
});
if
((
axis
!=
"x"
)
&&
(
axis
!=
"y"
)
&&
(
axis
!=
"z"
))
{
std
::
cerr
<<
"HomogeneousCalorimeter Error: cannot determine axis of line "
<<
axis
<<
", abort placement of this line."
<<
std
::
endl
;
continue
;
}
int
begin
=
dd4hep
::
getAttrOrDefault
<
int
>
(
pl
,
_Unicode
(
begin
),
0
);
int
nmods
=
pl
.
attr
<
int
>
(
_Unicode
(
nmods
));
std
::
vector
<
std
::
pair
<
double
,
double
>>
translatio
ns
;
std
::
vector
<
Position
>
tra
ns
;
for
(
int
i
=
0
;
i
<
nmods
;
++
i
)
{
translations
.
push_back
(
std
::
pair
<
double
,
double
>
{
pos
.
x
()
+
(
begin
+
i
)
*
modSize
.
x
(),
pos
.
y
()});
if
(
mirrorx
)
{
translations
.
push_back
(
std
::
pair
<
double
,
double
>
{
-
pos
.
x
()
-
(
begin
+
i
)
*
modSize
.
x
(),
pos
.
y
()});
Position
tran
{
(
axis
==
"x"
)
?
pos
.
x
()
+
(
begin
+
i
)
*
modSize
.
x
()
:
pos
.
x
(),
(
axis
==
"y"
)
?
pos
.
y
()
+
(
begin
+
i
)
*
modSize
.
y
()
:
pos
.
y
(),
(
axis
==
"z"
)
?
pos
.
z
()
+
(
begin
+
i
)
*
modSize
.
z
()
:
pos
.
z
()
};
trans
.
push_back
(
tran
);
}
// mirror placement
if
(
mirrorx
)
{
int
curr_size
=
trans
.
size
();
for
(
size_t
i
=
0
;
i
<
curr_size
;
++
i
)
{
trans
.
push_back
(
Position
{
-
trans
[
i
].
x
(),
trans
[
i
].
y
(),
trans
[
i
].
z
()});
}
if
(
mirrory
)
{
translations
.
push_back
(
std
::
pair
<
double
,
double
>
{
pos
.
x
()
+
(
begin
+
i
)
*
modSize
.
x
(),
-
pos
.
y
()});
}
if
(
mirrory
)
{
int
curr_size
=
trans
.
size
();
for
(
size_t
i
=
0
;
i
<
curr_size
;
++
i
)
{
trans
.
push_back
(
Position
{
trans
[
i
].
x
(),
-
trans
[
i
].
y
(),
trans
[
i
].
z
()});
}
if
(
mirrorx
&&
mirrory
)
{
translations
.
push_back
(
std
::
pair
<
double
,
double
>
{
-
pos
.
x
()
-
(
begin
+
i
)
*
modSize
.
x
(),
-
pos
.
y
()});
}
if
(
mirrorz
)
{
int
curr_size
=
trans
.
size
();
for
(
size_t
i
=
0
;
i
<
curr_size
;
++
i
)
{
trans
.
push_back
(
Position
{
trans
[
i
].
x
(),
trans
[
i
].
y
(),
-
trans
[
i
].
z
()});
}
}
for
(
auto
&
p
:
translations
)
{
// place volume
for
(
auto
&
p
:
trans
)
{
Transform3D
tr
=
RotationZYX
(
rot
.
z
(),
rot
.
y
(),
rot
.
x
())
*
Translation3D
(
p
.
first
,
p
.
second
,
p
os
.
z
());
*
Translation3D
(
p
.
x
(),
p
.
y
()
,
p
.
z
());
auto
modPV
=
env
.
placeVolume
(
modVol
,
tr
);
modPV
.
addPhysVolID
(
"sector"
,
sector_id
).
addPhysVolID
(
"module"
,
id_begin
+
mid
++
);
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment