11 #include "GeoModelKernel/GeoTube.h"
12 #include "GeoModelKernel/GeoTubs.h"
14 #if defined(GEOTORUS) && GEOTORUS==1
15 #include "GeoModelKernel/GeoTorus.h"
18 #include "GeoModelKernel/GeoSimplePolygonBrep.h"
19 #include "GeoModelKernel/GeoShape.h"
20 #include "GeoModelKernel/GeoShapeUnion.h"
21 #include "GeoModelKernel/GeoShapeShift.h"
22 #include "GeoModelKernel/GeoLogVol.h"
23 #include "GeoModelKernel/GeoPhysVol.h"
24 #include "GeoModelKernel/GeoMaterial.h"
25 #include "GeoModelKernel/GeoNameTag.h"
27 #include "GeoModelKernel/GeoTransform.h"
28 #include "GaudiKernel/PhysicalConstants.h"
37 GeoModelIO::ReadGeoModel* sqliteReader,
38 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
39 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX,
42 m_supportPhysA(nullptr),
43 m_supportPhysC(nullptr),
44 m_xformSupportA(nullptr),
45 m_xformSupportC(nullptr)
52 m_gmt_mgr->
msg(MSG::INFO) <<
"Build IBL fwd services - CAD tool design - Build()"<<
endmsg;
54 #if !defined(GEOTORUS) || GEOTORUS==0
56 m_gmt_mgr->
msg(MSG::INFO) <<
"Build IBL fwd services - CAD tool design - Torus object is not defined "<<GEOTORUS<<
endmsg;
61 m_gmt_mgr->
msg(MSG::INFO) <<
"Build IBL fwd services - CAD tool design - Torus object is defined"<<
endmsg;
72 if(nSectors==0)
return nullptr;
76 double innerRadius = 33.;
77 double outerRadius = 42.499;
78 double zMin = 834.607;
79 double zMax = 3290.795;
81 double zLength = zMax-zMin;
82 double halfLength = zLength*.5;
83 double zMiddle = (zMin+zMax)*.5;
86 std::ostringstream lnameA;
87 lnameA<<
"Brl0A_FwdSvc";
88 std::ostringstream lnameC;
89 lnameC<<
"Brl0C_FwdSvc";
92 const GeoTube* supportShapeA =
new GeoTube(innerRadius,outerRadius,halfLength);
93 const GeoTube* supportShapeC =
new GeoTube(innerRadius,outerRadius,halfLength);
95 GeoLogVol* supportLogVol_A =
new GeoLogVol(lnameA.str(),supportShapeA,ether);
96 GeoLogVol* supportLogVol_C =
new GeoLogVol(lnameA.str(),supportShapeC,ether);
100 double deltaJunction = 0.;
101 double lgFwdSvc[4]={511., 561., 560., 706. };
103 double devTotalLength = 2460.188;
107 double rminCable = 0.;
108 double rmaxCable = 8.*.5;
109 double surfCable = rmaxCable*rmaxCable*
pi;
112 double rminCooling = 0.;
113 double rmaxCooling = 1.75*.5;
114 double surfCooling = rmaxCooling*rmaxCooling*
pi;
119 double hermJunction = .4;
123 const GeoShape * gblShapeCableA =
nullptr;
124 const GeoShape * gblShapeCoolingA =
nullptr;
125 const GeoShape * gblShapeCableC =
nullptr;
126 const GeoShape * gblShapeCoolingC =
nullptr;
127 for(
int i=0;
i<4;
i++)
129 double initHalfLength = lgFwdSvc[
i]*.5;
130 zpos += initHalfLength;
131 double corHalfLength = initHalfLength-deltaJunction;
132 double radius = .5*(corHalfLength*corHalfLength+delta*delta)/delta;
136 double tubeLength=deltaJunction+zpos0-zMin+hermJunction;
138 const GeoTube* tubeShape =
new GeoTube(0., rmaxCable,
tubeLength*.5);
140 gblShapeCableA =
addShape(gblShapeCableA, tubeShape, trfA );
142 gblShapeCableC =
addShape(gblShapeCableC, tubeShape, trfC );
146 const GeoTube* tubeShape_cooling =
new GeoTube(0., rmaxCooling,
tubeLength*.5);
147 gblShapeCoolingA =
addShape(gblShapeCoolingA, tubeShape_cooling, trfA );
148 gblShapeCoolingC =
addShape(gblShapeCoolingC, tubeShape_cooling, trfC );
154 const GeoTorus* torusShape =
new GeoTorus(rminCable,rmaxCable,rtor,
pi*.5-
theta,2.*
theta);
155 double angle=(
i%2==0)?breakAngle:
pi-breakAngle;
156 GeoTrf::Transform3D trfA = GeoTrf::RotateZ3D(
angle)*GeoTrf::RotateY3D(-
pi*.5)*GeoTrf::TranslateY3D(-
radius+delta)* GeoTrf::TranslateX3D(zpos0+zpos-zMiddle);
157 gblShapeCableA =
addShape(gblShapeCableA, torusShape, trfA );
159 gblShapeCableC =
addShape(gblShapeCableC, torusShape, trfC );
161 const GeoTorus* torusShape_cooling =
new GeoTorus(rminCooling,rmaxCooling,rtor,
pi*.5-
theta,2.*
theta);
162 gblShapeCoolingA =
addShape(gblShapeCoolingA, torusShape_cooling, trfA );
163 gblShapeCoolingC =
addShape(gblShapeCoolingC, torusShape_cooling, trfC );
165 zpos += initHalfLength;
168 zpos=zpos0+zpos-deltaJunction;
171 const GeoTube* tubeShape =
new GeoTube(0., rmaxCable,
tubeLength*.5);
173 gblShapeCableA =
addShape(gblShapeCableA, tubeShape, trfA );
175 gblShapeCableC =
addShape(gblShapeCableC, tubeShape, trfC );
177 const GeoTube* tubeShape_cooling =
new GeoTube(0., rmaxCooling,
tubeLength*.5);
178 gblShapeCoolingA =
addShape(gblShapeCoolingA, tubeShape_cooling, trfA );
179 gblShapeCoolingC =
addShape(gblShapeCoolingC, tubeShape_cooling, trfC );
187 GeoLogVol * cable_logA =
new GeoLogVol(
"IBL_Fwd02_Cable_A",gblShapeCableA,cableMat);
188 GeoLogVol * cable_logC =
new GeoLogVol(
"IBL_Fwd02_Cable_C",gblShapeCableC,cableMat);
191 GeoLogVol * cooling_logA =
new GeoLogVol(
"IBL_Fwd02_Cooling_A",gblShapeCoolingA,coolingMat);
192 GeoLogVol * cooling_logC =
new GeoLogVol(
"IBL_Fwd02_Cooling_C",gblShapeCoolingC,coolingMat);
199 double cooling_radius = 35.1;
204 cooling_radius = 34.7 + layerRadius-33.25;
208 double cable_radius = 36.501;
209 GeoPhysVol* cablePhysVolA =
new GeoPhysVol(cable_logA);
210 GeoPhysVol* cablePhysVolC =
new GeoPhysVol(cable_logC);
211 GeoPhysVol* coolingPhysVolA =
new GeoPhysVol(cooling_logA);
212 GeoPhysVol* coolingPhysVolC =
new GeoPhysVol(cooling_logC);
217 for(
int ii=0; ii<nSectors; ii++)
222 double phiOfCooling = phiOfModuleZero+ cooling_angle + ii*
angle;
224 std::ostringstream tmp1;
225 tmp1 <<
"IBL_Fwd02_Cooling_A" << ii;
226 GeoNameTag *
tag1 =
new GeoNameTag(tmp1.str());
227 GeoTransform* xformA1 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCooling)*GeoTrf::TranslateX3D(cooling_radius));
232 std::ostringstream tmp1C;
233 tmp1C <<
"IBL_Fwd02_Cooling_C" << ii;
234 GeoNameTag * tag1C =
new GeoNameTag(tmp1C.str());
235 GeoTransform* xformC1 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCooling)*GeoTrf::TranslateX3D(cooling_radius));
240 double phiOfCable = phiOfCooling +
angle*.5;
242 std::ostringstream
tmp2;
243 tmp2 <<
"IBL_Fwd02_Cable_A" << ii;
244 GeoNameTag *
tag2 =
new GeoNameTag(
tmp2.str());
245 GeoTransform* xformA2 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCable)*GeoTrf::TranslateX3D(cable_radius));
250 std::ostringstream tmp2C;
251 tmp2C <<
"IBL_Fwd02_Cable_C" << ii;
252 GeoNameTag * tag2C =
new GeoNameTag(tmp2C.str());
253 GeoTransform* xformC2 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCable)*GeoTrf::TranslateX3D(cable_radius));
261 double middleA = zMiddle+layerZshift;
262 double middleC = -zMiddle+layerZshift;
279 const GeoShape * shiftedShape = &(*nextShape << trans);
281 lastShape = &(lastShape->add(*shiftedShape));
283 lastShape = shiftedShape;