11 #include "GeoModelKernel/GeoTube.h"
12 #include "GeoModelKernel/GeoTubs.h"
13 #include "GeoModelKernel/GeoSimplePolygonBrep.h"
14 #include "GeoModelKernel/GeoShape.h"
15 #include "GeoModelKernel/GeoShapeUnion.h"
16 #include "GeoModelKernel/GeoShapeShift.h"
17 #include "GeoModelKernel/GeoLogVol.h"
18 #include "GeoModelKernel/GeoPhysVol.h"
19 #include "GeoModelKernel/GeoMaterial.h"
20 #include "GeoModelKernel/GeoNameTag.h"
22 #include "GeoModelKernel/GeoTransform.h"
23 #include "GaudiKernel/SystemOfUnits.h"
33 GeoModelIO::ReadGeoModel* sqliteReader,
34 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
35 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX,
38 m_supportPhysA(nullptr),
39 m_supportPhysC(nullptr),
40 m_xformSupportA(nullptr),
41 m_xformSupportC(nullptr)
59 if(nSectors==0)
return nullptr;
63 double innerRadius = 33.;
64 double outerRadius = 42.499;
65 double zMin = 834.607;
66 double zMax = 3290.795;
68 double zLength = zMax-zMin;
69 double halfLength = zLength*.5;
70 double zMiddle = (zMin+zMax)*.5;
73 std::ostringstream lnameA;
74 lnameA<<
"Brl0A_FwdSvc";
75 std::ostringstream lnameC;
76 lnameC<<
"Brl0C_FwdSvc";
79 const GeoTube* supportShapeA =
new GeoTube(innerRadius,outerRadius,halfLength);
80 const GeoTube* supportShapeC =
new GeoTube(innerRadius,outerRadius,halfLength);
83 GeoLogVol* supportLogVol_A =
new GeoLogVol(lnameA.str(),supportShapeA,ether);
84 GeoLogVol* supportLogVol_C =
new GeoLogVol(lnameC.str(),supportShapeC,ether);
91 double devTotalLength = 2460.188;
94 double rminCable = 0.;
95 double rmaxCable = 8.*.5;
96 double surfCable = rmaxCable*rmaxCable*
pi;
99 double rminCooling = 0.;
100 double rmaxCooling = 1.75*.5;
101 double surfCooling = rmaxCooling*rmaxCooling*
pi;
110 double cooling_radius = 35.1;
115 cooling_radius = 34.7 + layerRadius-33.25;
119 double cable_radius = 36.501;
124 double etaSteps[3] = {3.8, 4.3, 4.8 };
128 std::vector<double> zSteps;
129 bool bFirstLin =
true;
130 for(
int i=0;
i<nbSteps;
i++){
133 double z = fabs(cable_radius/
tmp2);
137 zSteps.push_back(zMin+0.001);
142 zSteps.push_back(zMin+0.001);
143 zSteps.push_back(zMin+10.);
151 zSteps.push_back(zMax-0.001);
153 if(bFirstLin)nbSteps++;
156 const GeoShape * gblShapeCableA =
nullptr;
157 const GeoShape * gblShapeCoolingA =
nullptr;
158 const GeoShape * gblShapeCableC =
nullptr;
159 const GeoShape * gblShapeCoolingC =
nullptr;
165 double deltaMiddle_all = 18.;
172 for(
int iStep=0; iStep<nbSteps-1; iStep++)
174 double zInit = zSteps[iStep];
175 double zFinal = zSteps[iStep+1];
176 double zMid = (zInit+zFinal)*.5;
177 double zHalfLength = zMid-zInit;
178 double zLength = zFinal-zInit;
187 double deltaPhiLoc = fabs(
atan(deltaMiddle_all/zLength));
188 double cableHalfLength = (zLength /
cos(deltaPhiLoc))*.5;
189 double deltaMiddleLoc = deltaMiddle_all*.5;
193 if((iStep==0&&bFirstLin)||iStep==nbSteps-2) {
198 const GeoTube* cableShape =
new GeoTube(rminCable, rmaxCable, zHalfLength);
201 gblShapeCableA =
addShape(gblShapeCableA, cableShape, trfA1 );
203 gblShapeCableC =
addShape(gblShapeCableC, cableShape, trfC1 );
206 const GeoTube* coolingShape =
new GeoTube(rminCooling, rmaxCooling, zHalfLength);
207 gblShapeCoolingA =
addShape(gblShapeCoolingA, coolingShape, trfA1 );
208 gblShapeCoolingC =
addShape(gblShapeCoolingC, coolingShape, trfC1 );
218 const GeoTube* cableShape =
new GeoTube(rminCable, rmaxCable, cableHalfLength);
220 GeoTrf::Transform3D trfA1 = GeoTrf::RotateZ3D(
angle)*GeoTrf::TranslateY3D(deltaMiddleLoc)* GeoTrf::TranslateZ3D(zpos-zMiddle)*GeoTrf::RotateX3D(-angleSign*deltaPhiLoc);
221 gblShapeCableA =
addShape(gblShapeCableA, cableShape, trfA1 );
222 GeoTrf::Transform3D trfC1 = GeoTrf::RotateZ3D(
angle)*GeoTrf::TranslateY3D(deltaMiddleLoc)* GeoTrf::TranslateZ3D(zMax-(zpos-zMin)-zMiddle)*GeoTrf::RotateX3D(angleSign*deltaPhiLoc);
223 gblShapeCableC =
addShape(gblShapeCableC, cableShape, trfC1 );
226 const GeoTube* coolingShape =
new GeoTube(rminCooling, rmaxCooling, cableHalfLength);
227 gblShapeCoolingA =
addShape(gblShapeCoolingA, coolingShape, trfA1 );
228 gblShapeCoolingC =
addShape(gblShapeCoolingC, coolingShape, trfC1 );
244 GeoLogVol * cable_logA =
new GeoLogVol(
"IBL_Fwd02_Cable_A",gblShapeCableA,cableMat);
245 GeoLogVol * cable_logC =
new GeoLogVol(
"IBL_Fwd02_Cable_C",gblShapeCableC,cableMat);
249 GeoLogVol * cooling_logA =
new GeoLogVol(
"IBL_Fwd02_Cooling_A",gblShapeCoolingA,coolingMat);
250 GeoLogVol * cooling_logC =
new GeoLogVol(
"IBL_Fwd02_Cooling_C",gblShapeCoolingC,coolingMat);
257 GeoPhysVol* cablePhysVolA =
new GeoPhysVol(cable_logA);
258 GeoPhysVol* cablePhysVolC =
new GeoPhysVol(cable_logC);
259 GeoPhysVol* coolingPhysVolA =
new GeoPhysVol(cooling_logA);
260 GeoPhysVol* coolingPhysVolC =
new GeoPhysVol(cooling_logC);
267 for(
int ii=0; ii<nSectors; ii++)
272 double phiOfCooling = phiOfModuleZero+ cooling_angle + ii*
angle;
274 std::ostringstream tmp1;
275 tmp1 <<
"IBL_Fwd02_Cooling_AC" << ii;
276 GeoNameTag *
tag1 =
new GeoNameTag(tmp1.str());
277 GeoTransform* xformA1 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCooling)*GeoTrf::TranslateX3D(cooling_radius));
282 GeoTransform* xformC1 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCooling)*GeoTrf::TranslateX3D(cooling_radius));
287 double phiOfCable = phiOfCooling +
angle*.5;
289 std::ostringstream
tmp2;
290 tmp2 <<
"IBL_Fwd02_Cable_AC" << ii;
291 GeoNameTag *
tag2 =
new GeoNameTag(
tmp2.str());
292 GeoTransform* xformA2 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCable)*GeoTrf::TranslateX3D(cable_radius)*GeoTrf::RotateZ3D(breakAngle));
297 GeoTransform* xformC2 =
new GeoTransform(GeoTrf::RotateZ3D(phiOfCable)*GeoTrf::TranslateX3D(cable_radius)*GeoTrf::RotateZ3D(breakAngle));
304 double middleA = zMiddle+layerZshift;
305 double middleC = -zMiddle+layerZshift;
319 const GeoShape * shiftedShape = &(*nextShape << trans);
321 lastShape = &(lastShape->add(*shiftedShape));
323 lastShape = shiftedShape;