ATLAS Offline Software
Loading...
Searching...
No Matches
EMECAccordionConstruction.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2024-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
11
12#ifndef LARGEOENDCAP_EMECACCORDIONCONSTRUCTION_H
13#define LARGEOENDCAP_EMECACCORDIONCONSTRUCTION_H
14
15#include <string>
16#include <array>
17
18#include "GeoModelKernel/GeoDefinitions.h"
19
20
21using GeoTwoVector = GeoTrf::Vector2D;
22using GeoThreeVector = GeoTrf::Vector3D;
23
24class GeoXmlInpManager;
25class GeoMaterial;
26class GeoPhysVol;
27class GeoFullPhysVol;
28class GeoShape;
29
30namespace LArGeo {
31
36 {
37 public:
40
41 void setWheelParameters();
42 void setInnerWheel(GeoFullPhysVol* innerWheel);
43 void setOuterWheel(GeoFullPhysVol* outerWheel);
44 void setMaterial(const std::string& name, const GeoMaterial* material);
45
46 void constructInnerWheelStructure(bool makeSlices = true);
47 void constructOuterWheelStructure(bool makeSlices = true);
48
49 private:
50 struct CutPlane { // plane equation: n.dot(p) + d = 0
52 double m_d;
53 };
54
57 void getInnerAbsorberData(double& wmin, double& wmax,
58 double& llip1, double& ylip1,
59 double& llip2, double& ylip2) const;
60 void getOuterAbsorberData(double& wmin, double& wmax,
61 double& llip1, double& ylip1,
62 double& llip2, double& ylip2) const;
63 void getBladeCorners(double wmin, double wmax, double thickness,
64 double rmin, double rmax, double zdel,
65 GeoThreeVector corners[8]) const;
66 CutPlane getBottomCutPlane(double zmin, double rmin,
67 double zmax, double rmax) const;
68 CutPlane getTopCutPlane(double zmin, double rmin,
69 double zmax, double rmax,
70 const GeoThreeVector corners[8]) const;
72 const GeoThreeVector& p2,
73 const CutPlane& plane) const;
74 GeoShape* constructBlade(int icase,
75 const GeoThreeVector corners[8], double xscale,
76 double pz1, double pr1min, double pr1max,
77 double pz2, double pr2min, double pr2max) const;
78
79 // Construction of logical volumes
82 void constructInnerLips(double innerLipLength1, double innerLipPosition1,
83 double innerLipLength2, double innerLipPosition2);
84 void constructOuterLips(double outerLipLength1, double outerLipPosition1,
85 double outerLipLength2, double outerLipPosition2);
86 void constructInnerBlades(const GeoThreeVector innerCorners[8],
87 const GeoThreeVector innerElectrodeCorners[8]);
88 void constructOuterBlades(const GeoThreeVector outerCorners[8],
89 const GeoThreeVector outerElectrodeCorners[8]);
90
91 // Construction of physical volumes
94 void placeInnerSlices(bool makeSlices);
95 void placeOuterSlices(bool makeSlices);
96 void placeInnerAccordion(int innerNoSectors, bool makeSlices, bool makeSectors);
97 void placeOuterAccordion(int outerNoSectors, bool makeSlices, bool makeSectors);
98
99 private:
100 GeoFullPhysVol* m_innerWheel = nullptr;
101 GeoFullPhysVol* m_outerWheel = nullptr;
102
103 const GeoMaterial* m_materialLiquidArgon = nullptr;
104 const GeoMaterial* m_materialKapton = nullptr;
105 const GeoMaterial* m_materialLead = nullptr;
106 const GeoMaterial* m_materialSteel = nullptr;
107 const GeoMaterial* m_materialGlue = nullptr;
108
109 int m_innerNoElectrodes = 256; // Number of electrodes in Inner wheel
110 int m_innerNoAbsorbes = 256; // Number of absorbers in Inner wheel
111 int m_innerNoWaves = 6; // Number of waves in Inner wheel
112 static constexpr int s_innerNoBlades = 15; // Number of blades (11 half_waves + 2 quarter_waves + 2 lips)
113
114 int m_outerNoElectrodes = 768; // Number of electrodes in Outer wheel
115 int m_outerNoAbsorbes = 768; // Number of absorbers in Outer wheel
116 int m_outerNoWaves = 9; // Number of waves in Outer wheel
117 static constexpr int s_outerNoBlades = 21; // Number of blades (17 half_waves + 2 quarter_waves + 2 lips)
118
119 // Strings for construction of names
120 std::string m_nameInnerWheel = "";
121 std::string m_nameOuterWheel = "";
122 std::string m_nameSlice = "::Slice";
123 std::string m_nameAbsorber = "::Absorber";
124 std::string m_nameLead = "::Lead";
125 std::string m_nameGlue = "::Glue";
126 std::string m_nameElectrode = "::Electrode";
127
129 "01","02","03","04","05","06","07","08","09","10",
130 "11","12","13","14","15","16","17","18","19","20","21"
131 };
132
133 // Inner wheel accordion wave parameters
134 double m_innerWheelWidth = 0; // 514 mm
135 double m_innerLipWidth = 0; // 2 mm
136 double m_innerWaveZoneWidth = 0; // 514 - 2*2 = 510 mm
137 double m_innerWaveWidth = 0; // 510:6 = 85 mm
140
141 // Outer wheel accordion wave parameters
142 double m_outerWheelWidth = 0; // 514 mm
143 double m_outerLipWidth = 0; // 2 mm
144 double m_outerWaveZoneWidth = 0; // 514 - 2*2 = 510 mm
145 double m_outerWaveWidth = 0; // 510:9 = 56.67 mm
148
149 // Inner wheel thiknesses
155 double m_innerGlueRatio = 0; // x-scale factor for glue in absorber
156 double m_innerLeadRatio = 0; // x-scale factor for lead in absorber
157
158 // Outer wheel thiknesses
164 double m_outerGlueRatio = 0; // x-scale factor for glue in absorber
165 double m_outerLeadRatio = 0; // x-scale factor for lead in absorber
166
167 // Contraction factor
168 double m_kContraction = 0;
169
170 // Inner wheel parameters
171 std::array<double, 2> m_zWheelInner = {};
172 std::array<double, 2> m_rMinInner = {};
173 std::array<double, 2> m_rMaxInner = {};
174
175 // Outer wheel parameters
176 std::array<double, 3> m_zWheelOuter = {};
177 std::array<double, 3> m_rMinOuter = {};
178 std::array<double, 3> m_rMaxOuter = {};
179
180 // Data for Inner wheel slices
181 std::array<double, s_innerNoBlades + 1> m_innerWheelZ = {};
182 std::array<double, s_innerNoBlades + 1> m_innerWheelRmin = {};
183 std::array<double, s_innerNoBlades + 1> m_innerWheelRmax = {};
188
189 // Data for Outer wheel slices
190 std::array<double, s_outerNoBlades + 1> m_outerWheelZ = {};
191 std::array<double, s_outerNoBlades + 1> m_outerWheelRmin = {};
192 std::array<double, s_outerNoBlades + 1> m_outerWheelRmax = {};
193 std::array<double, 2> m_outerWheelRminIncrement = {};
194 std::array<double, 2> m_outerWheelRmaxIncrement = {};
197
198 // Logical volumes for Inner wheel blades
199 std::array<GeoPhysVol*, s_innerNoBlades> m_innerAbsorber {{nullptr}};
200 std::array<GeoPhysVol*, s_innerNoBlades> m_innerGlue {{nullptr}};
201 std::array<GeoPhysVol*, s_innerNoBlades> m_innerLead {{nullptr}};
202 std::array<GeoPhysVol*, s_innerNoBlades> m_innerElectrode {{nullptr}};
203 std::array<GeoThreeVector, s_innerNoBlades> m_innerAbsorberOffset = {};
204 std::array<GeoThreeVector, s_innerNoBlades> m_innerElectrodeOffset = {};
205
206 // Logical volumes for Outer wheel blades
207 std::array<GeoPhysVol*, s_outerNoBlades> m_outerAbsorber {{nullptr}};
208 std::array<GeoPhysVol*, s_outerNoBlades> m_outerGlue {{nullptr}};
209 std::array<GeoPhysVol*, s_outerNoBlades> m_outerLead {{nullptr}};
210 std::array<GeoPhysVol*, s_outerNoBlades> m_outerElectrode {{nullptr}};
211 std::array<GeoThreeVector, s_outerNoBlades> m_outerAbsorberOffset = {};
212 std::array<GeoThreeVector, s_outerNoBlades> m_outerElectrodeOffset = {};
213
214 // Logical volumes for Inner wheel slices
215 std::array<GeoPhysVol*, s_innerNoBlades> m_innerSlice {{nullptr}};
216 std::array<GeoThreeVector, s_innerNoBlades> m_innerSliceOffset = {};
217
218 // Logical volumes for Outer wheel slices
219
220 std::array<GeoPhysVol*, s_outerNoBlades> m_outerSlice {{nullptr}};
221 std::array<GeoThreeVector, s_outerNoBlades> m_outerSliceOffset = {};
222
223 // Logical volumes for Inner wheel sectors
224 std::array<GeoPhysVol*, s_innerNoBlades> m_innerSector {{nullptr}};
225
226 // Logical volumes for Outer wheel sectors
227 std::array<GeoPhysVol*, s_outerNoBlades> m_outerSector {{nullptr}};
228 };
229
230} // namespace LArGeo
231
232#endif
233
GeoTrf::Vector3D GeoThreeVector
GeoTrf::Vector2D GeoTwoVector
void constructInnerLips(double innerLipLength1, double innerLipPosition1, double innerLipLength2, double innerLipPosition2)
void constructInnerWheelStructure(bool makeSlices=true)
std::array< GeoPhysVol *, s_innerNoBlades > m_innerElectrode
GeoShape * constructBlade(int icase, const GeoThreeVector corners[8], double xscale, double pz1, double pr1min, double pr1max, double pz2, double pr2min, double pr2max) const
std::array< double, s_outerNoBlades+1 > m_outerWheelRmin
std::array< GeoPhysVol *, s_innerNoBlades > m_innerSector
std::array< GeoPhysVol *, s_outerNoBlades > m_outerGlue
void getBladeCorners(double wmin, double wmax, double thickness, double rmin, double rmax, double zdel, GeoThreeVector corners[8]) const
std::array< double, s_innerNoBlades+1 > m_innerWheelRmax
void constructOuterLips(double outerLipLength1, double outerLipPosition1, double outerLipLength2, double outerLipPosition2)
std::array< GeoThreeVector, s_outerNoBlades > m_outerAbsorberOffset
void getOuterAbsorberData(double &wmin, double &wmax, double &llip1, double &ylip1, double &llip2, double &ylip2) const
std::array< double, s_innerNoBlades+1 > m_innerWheelRmin
void placeOuterAccordion(int outerNoSectors, bool makeSlices, bool makeSectors)
std::array< GeoThreeVector, s_innerNoBlades > m_innerAbsorberOffset
GeoThreeVector IntersectionPoint(const GeoThreeVector &p1, const GeoThreeVector &p2, const CutPlane &plane) const
void constructOuterBlades(const GeoThreeVector outerCorners[8], const GeoThreeVector outerElectrodeCorners[8])
std::array< GeoPhysVol *, s_innerNoBlades > m_innerSlice
std::array< GeoPhysVol *, s_innerNoBlades > m_innerGlue
void getInnerAbsorberData(double &wmin, double &wmax, double &llip1, double &ylip1, double &llip2, double &ylip2) const
std::array< double, s_outerNoBlades+1 > m_outerWheelZ
std::array< GeoPhysVol *, s_outerNoBlades > m_outerSector
std::string m_nameSuffix[s_outerNoBlades]
std::array< GeoThreeVector, s_innerNoBlades > m_innerSliceOffset
void setInnerWheel(GeoFullPhysVol *innerWheel)
std::array< GeoThreeVector, s_innerNoBlades > m_innerElectrodeOffset
std::array< GeoPhysVol *, s_outerNoBlades > m_outerLead
void setOuterWheel(GeoFullPhysVol *outerWheel)
std::array< GeoPhysVol *, s_outerNoBlades > m_outerSlice
std::array< GeoPhysVol *, s_innerNoBlades > m_innerLead
std::array< GeoThreeVector, s_outerNoBlades > m_outerElectrodeOffset
CutPlane getTopCutPlane(double zmin, double rmin, double zmax, double rmax, const GeoThreeVector corners[8]) const
std::array< GeoPhysVol *, s_outerNoBlades > m_outerAbsorber
std::array< GeoThreeVector, s_outerNoBlades > m_outerSliceOffset
std::array< GeoPhysVol *, s_innerNoBlades > m_innerAbsorber
void placeInnerAccordion(int innerNoSectors, bool makeSlices, bool makeSectors)
std::array< GeoPhysVol *, s_outerNoBlades > m_outerElectrode
void setMaterial(const std::string &name, const GeoMaterial *material)
void constructOuterWheelStructure(bool makeSlices=true)
void constructInnerBlades(const GeoThreeVector innerCorners[8], const GeoThreeVector innerElectrodeCorners[8])
CutPlane getBottomCutPlane(double zmin, double rmin, double zmax, double rmax) const
std::array< double, s_innerNoBlades+1 > m_innerWheelZ
std::array< double, s_outerNoBlades+1 > m_outerWheelRmax