9 #include "GeoModelKernel/GeoElement.h"
10 #include "GeoModelKernel/GeoMaterial.h"
11 #include "GeoModelKernel/GeoFullPhysVol.h"
12 #include "GeoModelKernel/GeoVFullPhysVol.h"
13 #include "GeoModelKernel/GeoPhysVol.h"
14 #include "GeoModelKernel/GeoVPhysVol.h"
15 #include "GeoModelKernel/GeoLogVol.h"
16 #include "GeoModelKernel/GeoBox.h"
17 #include "GeoModelKernel/GeoTubs.h"
18 #include "GeoModelKernel/GeoTube.h"
19 #include "GeoModelKernel/GeoNameTag.h"
20 #include "GeoModelKernel/GeoTransform.h"
21 #include "GeoModelKernel/GeoSerialDenominator.h"
22 #include "GeoModelKernel/GeoSerialIdentifier.h"
23 #include "GeoModelKernel/GeoSerialTransformer.h"
24 #include "GeoModelKernel/GeoAlignableTransform.h"
25 #include "GeoModelKernel/GeoIdentifierTag.h"
26 #include "GeoModelKernel/GeoDefinitions.h"
27 #include "GeoModelKernel/Units.h"
29 #include "GeoModelKernel/GeoShapeUnion.h"
30 #include "GeoModelKernel/GeoShapeShift.h"
31 #include "GeoGenericFunctions/Variable.h"
41 #include "GaudiKernel/MsgStream.h"
42 #include "GaudiKernel/Bootstrap.h"
43 #include "GaudiKernel/SystemOfUnits.h"
50 :m_BPCPhysical(nullptr),
65 if (m_BPCPhysical)
return m_BPCPhysical;
68 ISvcLocator *svcLocator = Gaudi::svcLocator();
73 m_msg =
new MsgStream(
msgSvc,
"BPCConstruction");
75 throw std::runtime_error(
"BPCConstruction: cannot initialze message service");
78 (*m_msg) << MSG::INFO <<
"BPCConstruction - creating an BPC oldType: " << m_oldType <<
" ! " <<
endmsg;
83 if (svcLocator->service(
"DetectorStore",
detStore,
false )==StatusCode::FAILURE) {
84 throw std::runtime_error(
"Error in BPCConstruction, cannot access DetectorStore");
89 if (geoModelSvc.retrieve().isFailure()) {
90 throw std::runtime_error (
"Cannot locate m_geoModelSvc!!");
99 if (StatusCode::SUCCESS !=
detStore->retrieve(materialManager, std::string(
"MATERIALS")))
return nullptr;
103 const GeoElement*
W=materialManager->
getElement(
"Wolfram");
109 const GeoElement* Ar=materialManager->
getElement(
"Argon");
110 const GeoElement* C=materialManager->
getElement(
"Carbon");
111 const GeoElement* O=materialManager->
getElement(
"Oxygen");
112 const GeoElement*
H=materialManager->
getElement(
"Hydrogen");
113 const GeoElement* Al=materialManager->
getElement(
"Aluminium");
119 ArCO2_1->add(Ar,0.8);
120 ArCO2_1->add(CO2,0.2);
123 ArCO2_2->add(Ar,0.9);
124 ArCO2_2->add(CO2,0.1);
129 AlMylar->add(C,0.487980);
130 AlMylar->add(O,0.260014);
131 AlMylar->add(
H,0.032761);
132 AlMylar->add(Al,0.219245);
135 const GeoMaterial *Air = materialManager->
getMaterial(
"std::Air");
136 if (!Air)
throw std::runtime_error(
"Error in BPCConstruction, std::Air is not found.");
138 const GeoMaterial *Aluminium = materialManager->
getMaterial(
"std::Aluminium");
139 if (!Aluminium)
throw std::runtime_error(
"Error in BPCConstruction, std::Aluminium is not found.");
141 const GeoMaterial *Mylar = materialManager->
getMaterial(
"std::Mylar");
142 if (!Mylar)
throw std::runtime_error(
"Error in BPCConstruction, std::Mylar is not found.");
150 std::string LArVersion = geoModelSvc->LAr_VersionOverride();
152 std::string detectorKey = LArVersion.empty() ?
AtlasVersion : LArVersion;
153 std::string detectorNode = LArVersion.empty() ?
"ATLAS" :
"LAr";
197 (*m_msg) << MSG::INFO <<
" Create BPC " <<
endmsg;
200 if(m_oldType) BPCName =
"LAr::TB::BPCOLD";
else BPCName =
"LAr::TB::BPC";
204 if(m_oldType) shape_bpc =
new GeoBox(bpc_old_x, bpc_old_y, bpc_old_z);
205 else shape_bpc =
new GeoBox(bpc_x, bpc_y, bpc_z);
207 if(m_oldType) log_bpc =
new GeoLogVol(BPCName, shape_bpc, ArCO2_2);
208 else log_bpc =
new GeoLogVol(BPCName, shape_bpc, ArCO2_1);
209 m_BPCPhysical =
new GeoPhysVol(log_bpc);
212 GeoBox* shape_bpc_almylar;
213 if(m_oldType) shape_bpc_almylar =
new GeoBox(bpc_old_x, bpc_old_y, bpc_old_alml);
214 else shape_bpc_almylar =
new GeoBox(bpc_x, bpc_y, bpc_alml);
215 GeoLogVol* log_bpc_almylar =
new GeoLogVol(BPCName +
"::bpcalmylar",shape_bpc_almylar, AlMylar);
216 GeoIntrusivePtr<GeoPhysVol> phys_bpc_almylar =
new GeoPhysVol(log_bpc_almylar);
217 for(
int i = 0;
i < 2;
i ++){
218 double mylar_pos = 0;
220 if(
i == 0) mylar_pos = bpc_old_z - bpc_old_alml;
221 if(
i == 1) mylar_pos = bpc_old_alml - bpc_old_z;
223 if(
i == 0) mylar_pos = bpc_z - bpc_alml;
224 if(
i == 1) mylar_pos = bpc_alml - bpc_z;
226 m_BPCPhysical->add(
new GeoIdentifierTag(
i ) );
227 m_BPCPhysical->add(
new GeoTransform( GeoTrf::Translate3D(0., 0., mylar_pos) ) );
228 m_BPCPhysical->add( phys_bpc_almylar );
232 GeoBox* shape_bpc_mylar;
233 if(m_oldType) shape_bpc_mylar =
new GeoBox(bpc_old_x, bpc_old_y, bpc_old_ml);
234 else shape_bpc_mylar =
new GeoBox(bpc_x, bpc_y, bpc_ml);
235 GeoLogVol* log_bpc_mylar =
new GeoLogVol(BPCName +
"::bpc_mylar", shape_bpc_mylar, Mylar);
236 GeoIntrusivePtr<GeoPhysVol> phys_bpc_mylar =
new GeoPhysVol(log_bpc_mylar);
237 for(
int i = 0;
i < 2; ++
i){
238 double mylar_pos = 0;
242 if(
i == 0) mylar_pos = bpc_old_z - bpc_old_frame - bpc_old_alframe - bpc_old_ml + bpc_old_space;
243 if(
i == 1) mylar_pos = - bpc_old_z + bpc_old_ml + bpc_old_frame + bpc_old_alframe1 - bpc_old_space;
245 if(
i == 0) mylar_pos = bpc_z - bpc_frame - bpc_alframe - bpc_alml;
246 if(
i == 1) mylar_pos = bpc_alml - bpc_z + bpc_frame + bpc_alframe;
248 m_BPCPhysical->add(
new GeoIdentifierTag(
i ) );
249 m_BPCPhysical->add(
new GeoTransform( GeoTrf::Translate3D(0., 0., mylar_pos) ) );
250 m_BPCPhysical->add( phys_bpc_mylar );
255 GeoBox* shape_bpc_xplane;
256 if(m_oldType) shape_bpc_xplane =
new GeoBox(bpc_old_x, bpc_old_y, bpc_old_send);
257 else shape_bpc_xplane =
new GeoBox(bpc_x, bpc_y, bpc_send);
258 GeoLogVol* log_bpc_xplane;
259 if(m_oldType) log_bpc_xplane =
new GeoLogVol(BPCName +
"::bpco_plane", shape_bpc_xplane, ArCO2_2);
260 else log_bpc_xplane =
new GeoLogVol(BPCName +
"::bpc_xplane", shape_bpc_xplane, ArCO2_1);
261 GeoIntrusivePtr<GeoPhysVol> phys_bpc_xplane =
new GeoPhysVol(log_bpc_xplane);
262 m_BPCPhysical->add(
new GeoIdentifierTag( 0 ) );
263 if(m_oldType) m_BPCPhysical->add(
new GeoTransform( GeoTrf::Translate3D(0., 0., bpc_old_sen) ) );
264 else m_BPCPhysical->add(
new GeoTransform( GeoTrf::Translate3D(0., 0., -bpc_sen-bpc_send) ) );
265 m_BPCPhysical->add(phys_bpc_xplane);
269 if(m_oldType) Ndiv =
int(2.0*bpc_old_x/bpc_old_step);
270 else Ndiv =
int(2.0*bpc_x/bpc_step);
271 GeoBox* shape_bpc_xdiv;
272 if(m_oldType) shape_bpc_xdiv =
new GeoBox(bpc_old_step/2., bpc_old_y, bpc_old_div);
273 else shape_bpc_xdiv =
new GeoBox(bpc_step/2., bpc_y, bpc_div);
274 GeoLogVol* log_bpc_xdiv;
275 if(m_oldType) log_bpc_xdiv =
new GeoLogVol(BPCName +
"::bpco_div", shape_bpc_xdiv, ArCO2_2);
276 else log_bpc_xdiv =
new GeoLogVol(BPCName +
"::bpc_xdiv", shape_bpc_xdiv, ArCO2_1);
277 GeoIntrusivePtr<GeoPhysVol> phys_bpc_xdiv =
new GeoPhysVol(log_bpc_xdiv);
278 GeoGenfun::Variable
Index;
279 GeoXF::TRANSFUNCTION TXO = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_old_x+(2*
Index+1)*bpc_old_step/2.);
280 GeoXF::TRANSFUNCTION TX = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_x+(2*
Index+1)*bpc_step/2.);
281 phys_bpc_xplane->add(
new GeoSerialIdentifier(0) );
282 if(m_oldType) phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_xdiv, &TXO, Ndiv ) );
283 else phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_xdiv, &TX, Ndiv ) );
286 GeoIntrusivePtr<GeoPhysVol> phys_bpc_yplane =
nullptr;
287 GeoIntrusivePtr<GeoPhysVol> phys_bpc_ydiv =
nullptr;
289 GeoBox* shape_bpc_yplane =
new GeoBox(bpc_x, bpc_y, bpc_send);
290 GeoLogVol* log_bpc_yplane =
new GeoLogVol(BPCName +
"::bpc_yplane",shape_bpc_yplane, ArCO2_1);
291 phys_bpc_yplane =
new GeoPhysVol(log_bpc_yplane);
292 m_BPCPhysical->add(
new GeoIdentifierTag( 0 ) );
293 m_BPCPhysical->add(
new GeoTransform( GeoTrf::Translate3D(0., 0., bpc_sen+bpc_send) ) );
294 m_BPCPhysical->add( phys_bpc_yplane );
297 GeoBox* shape_bpc_ydiv =
new GeoBox(bpc_x, bpc_step/2.,bpc_div);
298 GeoLogVol* log_bpc_ydiv =
new GeoLogVol(BPCName +
"::bpc_ydiv", shape_bpc_ydiv, ArCO2_1);
299 phys_bpc_ydiv =
new GeoPhysVol(log_bpc_ydiv);
300 GeoXF::TRANSFUNCTION TY = GeoXF::Pow(GeoTrf::TranslateY3D(1.0), -bpc_y+(2*
Index+1)*bpc_step/2);
301 phys_bpc_yplane->add(
new GeoSerialIdentifier(0) );
302 phys_bpc_yplane->add(
new GeoSerialTransformer(phys_bpc_ydiv, &TY, Ndiv ) );
306 GeoTubs* shape_bpc_wire;
309 GeoLogVol* log_bpc_wire;
310 if(m_oldType) log_bpc_wire =
new GeoLogVol(BPCName +
"::bpco_wire", shape_bpc_wire, Tungsten);
311 else log_bpc_wire =
new GeoLogVol(BPCName +
"::bpc_wire", shape_bpc_wire, Tungsten);
312 GeoIntrusivePtr<GeoPhysVol> phys_bpc_wire =
new GeoPhysVol(log_bpc_wire);
313 phys_bpc_xdiv->add(
new GeoIdentifierTag( 1 ) );
314 phys_bpc_xdiv->add(
new GeoTransform( GeoTrf::RotateX3D( 90.*
Gaudi::Units::deg ) ) );
315 phys_bpc_xdiv->add(phys_bpc_wire);
317 phys_bpc_ydiv->add(
new GeoIdentifierTag( 1 ) );
318 phys_bpc_ydiv->add(
new GeoTransform( GeoTrf::RotateY3D( 90.*
Gaudi::Units::deg ) ) );
319 phys_bpc_ydiv->add(phys_bpc_wire);
323 if(m_oldType) Ndiv =
int(2.0*bpc_old_x/bpc_cstep);
324 else Ndiv =
int(2.0*bpc_x/bpc_cstep);
325 GeoTubs* shape_bpc_cwire;
328 GeoLogVol* log_bpc_cwire;
329 if(m_oldType) log_bpc_cwire =
new GeoLogVol(BPCName +
"::bpco_cwire",shape_bpc_cwire, Tungsten);
330 else log_bpc_cwire =
new GeoLogVol(BPCName +
"::bpc_cwire",shape_bpc_cwire, Tungsten);
331 GeoIntrusivePtr<GeoPhysVol> phys_bpc_cwire =
new GeoPhysVol(log_bpc_cwire);
334 GeoXF::TRANSFUNCTION TXXMO = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_old_x+(2*
Index+1)*bpc_old_cstep/2.) * GeoTrf::TranslateZ3D(-bpc_old_send-2.*bpc_cwd+bpc_old_space) * GeoTrf::RotateX3D( 90.*
Gaudi::Units::deg );
335 GeoXF::TRANSFUNCTION TXXPO = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_old_x+(2*
Index+1)*bpc_old_cstep/2.) * GeoTrf::TranslateZ3D(bpc_old_send-bpc_old_space+2.*bpc_cwd) * GeoTrf::RotateX3D( 90.*
Gaudi::Units::deg );
338 GeoXF::TRANSFUNCTION TXXM = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_x+(2*
Index+1)*bpc_cstep/2.) * GeoTrf::TranslateZ3D(-bpc_div-bpc_cwd) * GeoTrf::RotateX3D( 90.*
Gaudi::Units::deg );
339 GeoXF::TRANSFUNCTION TXXP = GeoXF::Pow(GeoTrf::TranslateX3D(1.0), -bpc_x+(2*
Index+1)*bpc_cstep/2.) * GeoTrf::TranslateZ3D(bpc_div+bpc_cwd) * GeoTrf::RotateX3D( 90.*
Gaudi::Units::deg );
340 phys_bpc_xplane->add(
new GeoSerialIdentifier(0) );
341 if(m_oldType) phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TXXMO, Ndiv) );
342 else phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TXXM, Ndiv) );
343 phys_bpc_xplane->add(
new GeoSerialIdentifier(Ndiv) );
344 if(m_oldType) phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TXXPO, Ndiv) );
345 else phys_bpc_xplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TXXP, Ndiv) );
349 GeoXF::TRANSFUNCTION TYYM = GeoXF::Pow(GeoTrf::TranslateY3D(1.0), -bpc_y+(2*
Index+1)*bpc_cstep/2.) * GeoTrf::TranslateZ3D(-bpc_div-bpc_cwd) * GeoTrf::RotateY3D( 90.*
Gaudi::Units::deg );
350 GeoXF::TRANSFUNCTION TYYP = GeoXF::Pow(GeoTrf::TranslateY3D(1.0), -bpc_y+(2*
Index+1)*bpc_cstep/2.) * GeoTrf::TranslateZ3D(bpc_div+bpc_cwd) * GeoTrf::RotateY3D( 90.*
Gaudi::Units::deg );
351 phys_bpc_yplane->add(
new GeoSerialIdentifier(0) );
352 phys_bpc_yplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TYYM, Ndiv) );
353 phys_bpc_yplane->add(
new GeoSerialIdentifier(Ndiv) );
354 phys_bpc_yplane->add(
new GeoSerialTransformer(phys_bpc_cwire, &TYYP, Ndiv) );
357 return m_BPCPhysical;