42 if (StatusCode::SUCCESS !=
m_detectorStore->retrieve(materialManager, std::string(
"MATERIALS"))) {
47 const GeoMaterial *air = materialManager->
getMaterial(
"std::Air");
48 const GeoMaterial *rock = materialManager->
getMaterial(
"std::Rock");
49 const GeoMaterial *conc = materialManager->
getMaterial(
"std::Concrete");
50 const GeoMaterial *shieldSteel = materialManager->
getMaterial(
"shield::ShieldSteel");
55 std::map<std::string, unsigned int> elementMap;
57 for (
unsigned int i=0;
i<cavernElements->size();
i++) {
58 std::string
key = (*cavernElements)[
i]->getString(
"ELEMENT");
62 unsigned int recordIndex;
70 recordIndex = elementMap[
"Point1"];
72 GeoNameTag *
tag =
new GeoNameTag(
"CavernInfra");
76 recordIndex = elementMap[
"SX1"];
77 double SX1Xpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
78 double SX1Ypos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
79 double SX1Zpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
80 double SX1HalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
81 double SX1HalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
82 double SX1HalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
84 recordIndex = elementMap[
"SX1Air"];
85 double SX1AirYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
86 double SX1AirHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
87 double SX1AirHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
88 double SX1AirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
90 GeoTransform *s1XYZt =
new GeoTransform(GeoTrf::Translate3D(SX1Xpos,SX1Ypos,SX1Zpos));
92 GeoBox *SX1 =
new GeoBox(SX1HalfWidth ,SX1HalfHeight, SX1HalfLength);
93 GeoLogVol *lvsx1s =
new GeoLogVol(
"SX1Steel",SX1,shieldSteel);
94 GeoPhysVol *sx1 =
new GeoPhysVol(lvsx1s);
99 GeoTransform *s1z =
new GeoTransform(GeoTrf::TranslateY3D(SX1AirYpos));
101 GeoBox *SX1Air =
new GeoBox( SX1AirHalfWidth, SX1AirHalfHeight, SX1AirHalfLength);
102 GeoLogVol *lvsx1a =
new GeoLogVol(
"SX1Air",SX1Air,air);
103 GeoPhysVol *sx1a =
new GeoPhysVol(lvsx1a);
109 recordIndex = elementMap[
"WallACConc"];
110 double WallACConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
111 double WallACConcMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
112 double WallACConcMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
113 double WallACConcSphi= (*cavernElements)[recordIndex]->getDouble(
"SPHI");
114 double WallACConcDphi= (*cavernElements)[recordIndex]->getDouble(
"DPHI");
116 recordIndex = elementMap[
"BoxConc"];
117 double BoxConcHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
118 double BoxConcHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
119 double BoxConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
121 recordIndex = elementMap[
"VaultConc"];
122 double VaultConcZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
123 double VaultConcYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
124 double VaultConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
125 double VaultConcMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
126 double VaultConcMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
127 double VaultConcSphi= (*cavernElements)[recordIndex]->getDouble(
"SPHI");
128 double VaultConcDphi= (*cavernElements)[recordIndex]->getDouble(
"DPHI");
130 recordIndex = elementMap[
"HallConc"];
131 double HallConcHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
132 double HallConcHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
133 double HallConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
135 recordIndex = elementMap[
"BoxConcW"];
136 double BoxConcWZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
137 double BoxConcWYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
139 recordIndex = elementMap[
"BoxConcVleft"];
140 double BoxConcVleftZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
141 double BoxConcVleftYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
143 recordIndex = elementMap[
"BoxConcVright"];
144 double BoxConcVrightZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
145 double BoxConcVrightYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
147 recordIndex = elementMap[
"SurfaceFloor"];
148 double SurfaceFloorXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
149 double SurfaceFloorZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
150 double SurfaceFloorHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
151 double SurfaceFloorHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
152 double SurfaceFloorHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
155 GeoTubs *WallACConcrete =
new GeoTubs(WallACConcMinR, WallACConcMaxR, WallACConcHalfHeight, WallACConcSphi, WallACConcDphi);
156 GeoBox *BoxConc =
new GeoBox(BoxConcHalfLength, BoxConcHalfWidth, BoxConcHalfHeight);
157 GeoTubs *VaultConcrete =
new GeoTubs(VaultConcMinR, VaultConcMaxR, VaultConcHalfHeight , VaultConcSphi, VaultConcDphi);
158 GeoBox *HallConcrete =
new GeoBox(HallConcHalfLength, HallConcHalfWidth, HallConcHalfHeight);
159 GeoBox *SurfaceFloor =
new GeoBox(SurfaceFloorHalfLength, SurfaceFloorHalfWidth, SurfaceFloorHalfHeight);
161 GeoTrf::Transform3D BoxCutWallConc = GeoTrf::TranslateZ3D(BoxConcWZpos)*GeoTrf::RotateY3D(BoxConcWYrotate);
162 GeoTrf::Transform3D BoxCutVaultLeftConc = GeoTrf::TranslateZ3D(BoxConcVleftZpos)*GeoTrf::RotateY3D(BoxConcVleftYrotate);
163 GeoTrf::Transform3D BoxCutVaulRightConc = GeoTrf::TranslateZ3D(BoxConcVrightZpos)*GeoTrf::RotateY3D(BoxConcVrightYrotate);
165 recordIndex = elementMap[
"HoleJN"];
166 double HoleJNrmin = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::mm;
167 double HoleJNrmax = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::mm;
168 double HoleJNdz = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::mm;
169 GeoTubs *HoleJN =
new GeoTubs(HoleJNrmin,HoleJNrmax,HoleJNdz, 0.,2.*
M_PI);
171 recordIndex = elementMap[
"WallAAir"];
172 double WallAAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
173 double WallAAirXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
175 recordIndex = elementMap[
"WallCAir"];
176 double WallCAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
177 double WallCAirXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
178 double WallCAirZrotate = (*cavernElements)[recordIndex]->getDouble(
"ZROTATE");
181 const GeoShape & CutWallConc = (*WallACConcrete).subtract((*BoxConc) <<
GeoTrf::Transform3D(BoxCutWallConc)).
182 subtract((*HoleJN) << GeoTrf::RotateY3D(
M_PI*0.5) << GeoTrf::TranslateZ3D(-0.5*WallAAirZpos)*GeoTrf::TranslateY3D(-WallCAirXpos*1.0) );
183 const GeoShape & CutVaultConc = (*VaultConcrete).subtract((*BoxConc) <<
GeoTrf::Transform3D(BoxCutVaultLeftConc)).
186 recordIndex = elementMap[
"ShaftCut"];
187 double ShaftCutZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
188 double ShaftCutYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
189 double ShaftCutHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
190 double ShaftCutMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
191 double ShaftCutMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
193 recordIndex = elementMap[
"PX14Conc"];
194 double PX14ConcXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
195 double PX14ConcYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
196 double PX14ConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
197 double PX14ConcMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
198 double PX14ConcMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
200 recordIndex = elementMap[
"PX16Conc"];
201 double PX16ConcXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
202 double PX16ConcYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
203 double PX16ConcHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
204 double PX16ConcMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
205 double PX16ConcMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
208 GeoTube *ShaftCut =
new GeoTube(ShaftCutMinR, ShaftCutMaxR, ShaftCutHalfHeight);
209 GeoTube *PX14Conc =
new GeoTube(PX14ConcMinR, PX14ConcMaxR, PX14ConcHalfHeight);
210 GeoTube *PX16Conc =
new GeoTube(PX16ConcMinR, PX16ConcMaxR, PX16ConcHalfHeight);
212 const GeoShape & ShaftsConc=
213 ((*PX14Conc) << GeoTrf::TranslateX3D(PX14ConcXpos)*GeoTrf::TranslateY3D(PX14ConcYpos)).
214 add((*PX16Conc) << GeoTrf::TranslateX3D(PX16ConcXpos)*GeoTrf::TranslateY3D(PX16ConcYpos)).
215 subtract((*ShaftCut) << GeoTrf::TranslateZ3D(ShaftCutZpos)*GeoTrf::RotateY3D(ShaftCutYrotate));
217 recordIndex = elementMap[
"WallCConc"];
218 double WallCConcZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
219 double WallCConcXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
220 double WallCConcZrotate = (*cavernElements)[recordIndex]->getDouble(
"ZROTATE");
222 recordIndex = elementMap[
"WallAConc"];
223 double WallAConcZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
224 double WallAConcXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
226 recordIndex = elementMap[
"ShaftsConc"];
227 double ShaftsConcZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
230 recordIndex =elementMap[
"BoxConcJN"];
231 double BoxConcJNDX = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::mm;
232 double BoxConcJNDY = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::mm;
233 double BoxConcJNDZ = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::mm;
234 double BoxConcJNXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::mm;
235 recordIndex =elementMap[
"BoxConcExtraJN"];
236 double BoxConcExtraJNDX = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::mm;
237 double BoxConcExtraJNDY = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::mm;
238 double BoxConcExtraJNDZ = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::mm;
239 double BoxConcExtraJNXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::mm;
240 double BoxConcExtraJNYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS");
241 recordIndex =elementMap[
"StrutConcJN"];
242 double StrutConcJNDX = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::mm;
243 double StrutConcJNDY = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::mm;
244 double StrutConcJNDZ = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::mm;
245 double StrutConcJNXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::mm;
246 double StrutConcJNYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::mm;
247 double StrutConcJNZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::mm;
249 GeoBox *BoxConcJNC =
new GeoBox(BoxConcJNDX,BoxConcJNDY,BoxConcJNDZ);
250 GeoBox *BoxConcJNA =
new GeoBox(BoxConcJNDX,BoxConcJNDY,BoxConcJNDZ);
251 GeoBox *BoxConcStupidExtraJNC =
new GeoBox(BoxConcExtraJNDX,BoxConcExtraJNDY,BoxConcExtraJNDZ);
252 GeoBox *BoxConcStupidExtraJNA =
new GeoBox(BoxConcExtraJNDX,BoxConcExtraJNDY,BoxConcExtraJNDZ);
253 const GeoBox *StrutConcJN =
new GeoBox(StrutConcJNDX,StrutConcJNDY,StrutConcJNDZ);
255 recordIndex = elementMap[
"CavernAir"];
256 double CavernAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
259 const GeoShape & Concrete= (*HallConcrete).
260 add((CutWallConc << GeoTrf::TranslateZ3D(WallCConcZpos)*GeoTrf::TranslateX3D(WallCConcXpos)*GeoTrf::RotateZ3D(WallCConcZrotate))).
261 add((ShaftsConc << GeoTrf::TranslateZ3D(ShaftsConcZpos))).
262 add((CutVaultConc << GeoTrf::TranslateZ3D(VaultConcZpos)*GeoTrf::RotateY3D(VaultConcYrotate))).
263 add((*SurfaceFloor) << GeoTrf::TranslateZ3D(SurfaceFloorZpos)*GeoTrf::TranslateX3D(SurfaceFloorXpos)).
264 add((CutWallConc << GeoTrf::TranslateZ3D(WallAConcZpos)*GeoTrf::TranslateX3D(WallAConcXpos))).
266 add((*BoxConcJNC) << GeoTrf::TranslateX3D(BoxConcJNXpos) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
267 add((*BoxConcStupidExtraJNC) << GeoTrf::TranslateX3D(BoxConcExtraJNXpos) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) * GeoTrf::TranslateY3D(-BoxConcExtraJNYpos) ).
268 add((*BoxConcJNA) << GeoTrf::TranslateX3D(-BoxConcJNXpos-15*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
269 add((*BoxConcStupidExtraJNA) << GeoTrf::TranslateX3D(-BoxConcExtraJNXpos-15*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) * GeoTrf::TranslateY3D(BoxConcExtraJNYpos) ).
271 add((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
272 add((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
273 add((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
274 add((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
275 add((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
276 add((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5+CavernAirZpos) * GeoTrf::TranslateY3D(-StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) );
285 recordIndex = elementMap[
"WallACAir"];
286 double WallACAirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
287 double WallACAirMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
288 double WallACAirMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
289 double WallACAirSphi= (*cavernElements)[recordIndex]->getDouble(
"SPHI");
290 double WallACAirDphi= (*cavernElements)[recordIndex]->getDouble(
"DPHI");
292 recordIndex = elementMap[
"BoxAir"];
293 double BoxAirHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
294 double BoxAirHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
295 double BoxAirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
297 recordIndex = elementMap[
"VaultAir"];
298 double VaultAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
299 double VaultAirYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
300 double VaultAirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
301 double VaultAirMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
302 double VaultAirMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
303 double VaultAirSphi= (*cavernElements)[recordIndex]->getDouble(
"SPHI");
304 double VaultAirDphi= (*cavernElements)[recordIndex]->getDouble(
"DPHI");
306 recordIndex = elementMap[
"HallAir"];
307 double HallAirHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
308 double HallAirHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
309 double HallAirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
311 recordIndex = elementMap[
"BaseAir"];
312 double BaseAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
313 double BaseAirHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
314 double BaseAirHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
315 double BaseAirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
317 recordIndex = elementMap[
"BoxAirW"];
318 double BoxAirWZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
319 double BoxAirWYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
321 recordIndex = elementMap[
"BoxAirVleft"];
322 double BoxAirVleftZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
323 double BoxAirVleftYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
325 recordIndex = elementMap[
"BoxAirVright"];
326 double BoxAirVrightZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
327 double BoxAirVrightYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
329 GeoTubs *WallACAir =
new GeoTubs(WallACAirMinR, WallACAirMaxR, WallACAirHalfHeight, WallACAirSphi, WallACAirDphi);
330 GeoBox *BoxAir =
new GeoBox(BoxAirHalfLength, BoxAirHalfWidth, BoxAirHalfHeight);
331 GeoTubs *VaultAir =
new GeoTubs(VaultAirMinR, VaultAirMaxR, VaultAirHalfHeight, VaultAirSphi, VaultAirDphi);
332 GeoBox *HallAir =
new GeoBox(HallAirHalfLength, HallAirHalfWidth, HallAirHalfHeight);
333 GeoBox *BaseAir =
new GeoBox(BaseAirHalfLength, BaseAirHalfWidth, BaseAirHalfHeight);
334 GeoTrf::Transform3D BoxCutWallAir = GeoTrf::TranslateZ3D(BoxAirWZpos)*GeoTrf::RotateY3D(BoxAirWYrotate);
335 GeoTrf::Transform3D BoxCutVaultLeftAir = GeoTrf::TranslateZ3D(BoxAirVleftZpos)*GeoTrf::RotateY3D(BoxAirVleftYrotate);
336 GeoTrf::Transform3D BoxCutVaulRightAir = GeoTrf::TranslateZ3D(BoxAirVrightZpos)*GeoTrf::RotateY3D(BoxAirVrightYrotate);
339 const GeoShape & CutWallAir = (*WallACAir).subtract((*BoxAir) <<
GeoTrf::Transform3D(BoxCutWallAir));
340 const GeoShape & CutVaultAir = (*VaultAir).subtract((*BoxAir) <<
GeoTrf::Transform3D(BoxCutVaultLeftAir)).
344 recordIndex = elementMap[
"PX14Air"];
345 double PX14AirXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
346 double PX14AirYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
347 double PX14AirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
348 double PX14AirMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
349 double PX14AirMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
351 recordIndex = elementMap[
"PX16Air"];
352 double PX16AirXpos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
353 double PX16AirYpos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
354 double PX16AirHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
355 double PX16AirMinR = (*cavernElements)[recordIndex]->getDouble(
"MINR")*
Gaudi::Units::m;
356 double PX16AirMaxR = (*cavernElements)[recordIndex]->getDouble(
"MAXR")*
Gaudi::Units::m;
358 GeoTube *PX14Air =
new GeoTube(PX14AirMinR, PX14AirMaxR, PX14AirHalfHeight);
359 GeoTube *PX16Air =
new GeoTube(PX16AirMinR, PX16AirMaxR, PX16AirHalfHeight);
361 recordIndex = elementMap[
"CavShaftsConc"];
362 double CavShaftsYPos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
363 double CavShaftsXrotate = (*cavernElements)[recordIndex]->getDouble(
"XROTATE");
364 double CavShaftsYrotate = (*cavernElements)[recordIndex]->getDouble(
"YROTATE");
366 const GeoShape & ShaftsAir=
367 ((*PX14Air) << GeoTrf::TranslateX3D(PX14AirXpos)*GeoTrf::TranslateY3D(PX14AirYpos)).
368 add((*PX16Air) << GeoTrf::TranslateX3D(PX16AirXpos)*GeoTrf::TranslateY3D(PX16AirYpos));
371 const GeoShape & CavernAir = (*HallAir).
373 add(CutWallAir << GeoTrf::TranslateZ3D(WallAAirZpos)*GeoTrf::TranslateX3D(WallAAirXpos)).
374 add(CutWallAir << GeoTrf::TranslateZ3D(WallCAirZpos)*GeoTrf::TranslateX3D(WallCAirXpos)*GeoTrf::RotateZ3D(WallCAirZrotate)).
375 add(CutVaultAir << GeoTrf::TranslateZ3D(VaultAirZpos)*GeoTrf::RotateY3D(VaultAirYrotate)).
376 add((*BaseAir) << GeoTrf::TranslateZ3D(BaseAirZpos)).
378 subtract((*BoxConcJNC) << GeoTrf::TranslateX3D(BoxConcJNXpos) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
379 subtract((*BoxConcStupidExtraJNC) << GeoTrf::TranslateX3D(BoxConcExtraJNXpos) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) * GeoTrf::TranslateY3D(-BoxConcExtraJNYpos) ).
380 subtract((*BoxConcJNA) << GeoTrf::TranslateX3D(-BoxConcJNXpos-15*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
381 subtract((*BoxConcStupidExtraJNA) << GeoTrf::TranslateX3D(-BoxConcExtraJNXpos-15*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) * GeoTrf::TranslateY3D(BoxConcExtraJNYpos) ).
383 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
384 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
385 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(StrutConcJNXpos) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
386 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
387 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
388 subtract((*StrutConcJN) << GeoTrf::TranslateX3D(-StrutConcJNXpos-15.*
Gaudi::Units::mm) * GeoTrf::TranslateZ3D(-StrutConcJNZpos-WallAAirZpos*0.5) * GeoTrf::TranslateY3D(-StrutConcJNYpos) * GeoTrf::TranslateY3D(-WallCAirXpos*1.0) ).
389 add((*HoleJN) << GeoTrf::RotateY3D(
M_PI*0.5) << GeoTrf::TranslateZ3D(-0.5*WallAAirZpos+CavernAirZpos)*GeoTrf::TranslateY3D(-WallCAirXpos*1.0) << GeoTrf::TranslateY3D(CavShaftsYPos)*GeoTrf::RotateY3D(CavShaftsYrotate)*GeoTrf::RotateX3D(CavShaftsXrotate) );
392 recordIndex = elementMap[
"ShaftsAir"];
393 double ShaftsAirZpos = (*cavernElements)[recordIndex]->getDouble(
"ZPOS")*
Gaudi::Units::m;
395 const GeoShape & AirHall=
396 ((CavernAir << GeoTrf::TranslateZ3D(CavernAirZpos))).
397 add((ShaftsAir << GeoTrf::TranslateZ3D(ShaftsAirZpos)));
401 recordIndex = elementMap[
"Rock"];
402 double RockHalfLength = (*cavernElements)[recordIndex]->getDouble(
"HALFLENGTH")*
Gaudi::Units::m;
403 double RockHalfWidth = (*cavernElements)[recordIndex]->getDouble(
"HALFWIDTH")*
Gaudi::Units::m;
404 double RockHalfHeight = (*cavernElements)[recordIndex]->getDouble(
"HALFHEIGHT")*
Gaudi::Units::m;
405 double RockXPos = (*cavernElements)[recordIndex]->getDouble(
"XPOS")*
Gaudi::Units::m;
406 double RockYPos = (*cavernElements)[recordIndex]->getDouble(
"YPOS")*
Gaudi::Units::m;
408 GeoBox *Rockbox =
new GeoBox( RockHalfWidth, RockHalfHeight, RockHalfLength);
409 const GeoShape & BedRock = ((*Rockbox) .
410 subtract((AirHall) <<GeoTrf::TranslateY3D(CavShaftsYPos)*GeoTrf::RotateY3D(CavShaftsYrotate)*GeoTrf::RotateX3D(CavShaftsXrotate))).
411 subtract((*HoleJN) << GeoTrf::RotateY3D(
M_PI*0.5) << GeoTrf::TranslateZ3D(-0.5*WallAAirZpos+CavernAirZpos)*GeoTrf::TranslateY3D(-WallCAirXpos*1.0) << GeoTrf::TranslateY3D(CavShaftsYPos)*GeoTrf::RotateY3D(CavShaftsYrotate)*GeoTrf::RotateX3D(CavShaftsXrotate) );
413 GeoTransform *rZt =
new GeoTransform(GeoTrf::TranslateY3D(RockYPos)*GeoTrf::TranslateX3D(RockXPos));
415 GeoLogVol *lvr =
new GeoLogVol(
"BEDROCK",&BedRock,rock);
416 GeoPhysVol *bedrock =
new GeoPhysVol(lvr);
421 const GeoShape & CavConcrete = ((Concrete).
425 GeoTransform* xfTop =
new GeoTransform(GeoTrf::TranslateY3D(CavShaftsYPos)*GeoTrf::RotateY3D(CavShaftsYrotate)*GeoTrf::RotateX3D(CavShaftsXrotate));
427 GeoLogVol *lvcsc =
new GeoLogVol(
"CAV_SHAFTS_CONC",&CavConcrete,conc);
428 GeoPhysVol *CavShaftsConc =
new GeoPhysVol(lvcsc);
429 bedrock->add(CavShaftsConc);