13 #include "GeoModelKernel/GeoBox.h"
14 #include "GeoModelKernel/GeoTube.h"
15 #include "GeoModelKernel/GeoSimplePolygonBrep.h"
16 #include "GeoModelKernel/GeoLogVol.h"
17 #include "GeoModelKernel/GeoPhysVol.h"
18 #include "GeoModelKernel/GeoMaterial.h"
19 #include "GeoModelKernel/GeoNameTag.h"
21 #include "GeoModelKernel/GeoTransform.h"
22 #include "GaudiKernel/SystemOfUnits.h"
29 GeoModelIO::ReadGeoModel* sqliteReader,
30 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
31 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX,
36 , m_staveSupport(staveSupport)
37 , m_supportPhysA(nullptr)
38 , m_supportPhysC(nullptr)
39 , m_supportMidRing(nullptr)
40 , m_xformSupportA(nullptr)
41 , m_xformSupportC(nullptr)
42 , m_xformSupportMidRing(nullptr)
78 double dogLegStaveLength=17.87;
79 double halfSupportLength=endblockLength*0.5+dogLegStaveLength*0.5;
82 if((!endblockA) || (!endblockC) || (!endblockFlex) || (!serviceCoolPipe))
84 m_gmt_mgr->
msg(MSG::ERROR) <<
"dynamic_cast failure in "<<__FILE__<<
":"<< __LINE__<<
endmsg;
90 std::ostringstream lnameA;
91 lnameA <<
"Brl0A_StaveRing";
93 GeoNameTag *tagA =
new GeoNameTag(lnameA.str());
96 std::ostringstream lnameC;
97 lnameC <<
"Brl0C_StaveRing";
99 GeoNameTag *tagC =
new GeoNameTag(lnameC.str());
104 double zmin = serviceZpos-(endblockLength*0.5+dogLegStaveLength*0.5);
105 double zmax = serviceZpos+(endblockLength*0.5+dogLegStaveLength*0.5);
110 m_gmt_mgr->
msg(
MSG::DEBUG)<<
"Support assembly : "<<innerRadius<<
" "<<outerRadius<<
" ladderThickP "<<ladderHalfThickP<<
" "<<ladderHalfThickN<<
114 const GeoTube* supportShape =
new GeoTube(innerRadius,outerRadius,endblockLength*0.5+dogLegStaveLength*0.5);
116 GeoLogVol* supportLogVol_A =
new GeoLogVol(
"StaveRingAndEndblocks_A",supportShape,ether);
117 GeoLogVol* supportLogVol_C =
new GeoLogVol(
"StaveRingAndEndblocks_C",supportShape,ether);
126 m_gmt_mgr->
msg(MSG::ERROR)<<
"No phi sectors defined"<<std::endl;
131 GeoTrf::Transform3D transRadiusAndTilt = GeoTrf::TranslateX3D(layerRadius)*GeoTrf::RotateZ3D(ladderTilt);
140 GeoTrf::Transform3D staveTrf = GeoTrf::RotateZ3D(ladderTilt)*GeoTrf::Translate3D(-centerCoolingPipe.x(),-centerCoolingPipe.y(),-centerCoolingPipe.z());
143 transRadiusAndTilt = GeoTrf::TranslateX3D(staveRadius)*staveTrf;
146 for(
int ii = 0; ii < nSectors; ii++) {
149 double phiOfSector = phiOfModuleZero + ii*
angle;
152 GeoTrf::Transform3D ladderTransform = GeoTrf::RotateZ3D(phiOfSector) * transRadiusAndTilt ;
157 std::ostringstream nameTag;
158 nameTag <<
"Endblock" << ii;
159 GeoNameTag *
tag =
new GeoNameTag(nameTag.str());
160 GeoTransform* xformA =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateZ3D(endblockZpos-serviceZpos-dogLegStaveLength*0.5));
165 GeoTransform* xformC =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateZ3D(-endblockZpos+serviceZpos+dogLegStaveLength*0.5));
173 std::ostringstream nameTagFlex;
174 nameTagFlex <<
"EndblockFlex" << ii;
175 GeoNameTag * tagFlex =
new GeoNameTag(nameTagFlex.str());
176 GeoTransform* xformFlexA =
new GeoTransform(ladderTransform*ladderLocalTrf*(endblockFlexTrf->getTransform())*GeoTrf::TranslateZ3D(-dogLegStaveLength*0.5));
177 GeoTransform* xformFlexB =
new GeoTransform(ladderTransform*ladderLocalTrf*(endblockFlexTrf->getTransform())*GeoTrf::TranslateZ3D(dogLegStaveLength*0.5));
191 std::ostringstream nameTagPipe;
192 nameTagPipe <<
"ServicePipe" << ii;
193 GeoNameTag * tagPipe =
new GeoNameTag(nameTagPipe.str());
194 GeoTransform* xformPipeA =
new GeoTransform(ladderTransform*ladderLocalTrf*(serviceCoolPipeTrfA->getTransform())) ;
199 GeoTransform* xformPipeC =
new GeoTransform(ladderTransform*ladderLocalTrf*(serviceCoolPipeTrfC->getTransform()));
216 double eoStave=halfSupportLength-dogLegStaveLength;
226 double dimX=dimX_lin/
cos(alpha1)-.15;
231 double trX=-dimX_lin*
tan(alpha1)*0.5;
232 double trZ=eoStave+dimX_lin*0.5;
234 std::vector<double> xShape, yShape;
235 xShape.push_back(dimX*0.5); yShape.push_back(dimY*0.5);
236 xShape.push_back(-dimX*0.5); yShape.push_back(dimY*0.5+delta);
237 xShape.push_back(-dimX*0.5); yShape.push_back(-dimY*0.5+delta);
238 xShape.push_back(dimX*0.5); yShape.push_back(-dimY*0.5);
239 GeoSimplePolygonBrep* tmp_shape =
new GeoSimplePolygonBrep(dimZ*0.5);
240 for(
unsigned int iPt=0; iPt<xShape.size(); iPt++) tmp_shape->addVertex(xShape[iPt],yShape[iPt]);
246 GeoLogVol* tmp_logVol =
new GeoLogVol(
"FlexDogLeg1",tmp_shape,tmp_material);
247 GeoPhysVol * tmp_logVolPV =
new GeoPhysVol(tmp_logVol);
248 GeoNameTag* tmp_tag =
new GeoNameTag(
"FlexDogLeg1");
249 GeoTrf::Transform3D trfGblA=ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX)*GeoTrf::TranslateZ3D(trZ)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(
angle);
250 GeoTransform* tmp_xformA =
new GeoTransform(trfGblA);
256 trX=-dimX_lin*
tan(alpha1)*0.5;
257 trZ=-(eoStave+dimX_lin*0.5);
258 GeoTrf::Transform3D trfGblC=ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX)*GeoTrf::TranslateZ3D(trZ)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(-
angle);
259 GeoTransform* tmp_xformC =
new GeoTransform(trfGblC);
269 double dimX2=dimX2_lin/
cos(alpha2)-.15;
271 double trX2=trX*2.-dimX2_lin*
tan(alpha2)*0.5;
272 double trZ2=eoStave+dimX_lin+dimX2_lin*0.5;
273 xShape.clear(); yShape.clear();
275 xShape.push_back(dimX2*0.5); yShape.push_back(dimY2*0.5);
276 xShape.push_back(-dimX2*0.5); yShape.push_back(dimY2*0.5);
277 xShape.push_back(-dimX2*0.5); yShape.push_back(-dimY2*0.5);
278 xShape.push_back(dimX2*0.5); yShape.push_back(-dimY2*0.5);
279 GeoSimplePolygonBrep* tmp2_shape =
new GeoSimplePolygonBrep(dimZ*0.5);
280 for(
unsigned int iPt=0; iPt<xShape.size(); iPt++) tmp2_shape->addVertex(xShape[iPt],yShape[iPt]);
283 GeoLogVol* tmp2_logVol =
new GeoLogVol(
"FlexDogLeg2",tmp2_shape,tmp2_material);
284 GeoPhysVol * tmp2_logVolPV =
new GeoPhysVol(tmp2_logVol);
285 GeoNameTag* tmp2_tag =
new GeoNameTag(
"FlexDogLeg2");
287 GeoTransform* tmp2_xformA =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX2)*GeoTrf::TranslateZ3D(trZ2)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(
angle)*GeoTrf::TranslateY3D(delta*.75));
292 trZ2=-(eoStave+dimX_lin+dimX2_lin*0.5);
293 GeoTransform* tmp2_xformC =
new GeoTransform(ladderTransform*ladderLocalTrf*GeoTrf::TranslateX3D(trX2)*GeoTrf::TranslateZ3D(trZ2)*(endblockFlexTrf->getTransform())*GeoTrf::RotateY3D(-
angle)*GeoTrf::TranslateY3D(delta*.75));
304 GeoTrf::Translate3D ring_posA(0.0,0.0,staveRing.
GetPositionAlongZAxis()-serviceZpos-dogLegStaveLength*0.5+layerZshift);
305 GeoTransform* xformA =
new GeoTransform(ring_posA);
310 GeoTrf::Translate3D ring_posC(0.0,0.0,-staveRing.
GetPositionAlongZAxis()+serviceZpos+dogLegStaveLength*0.5-layerZshift);
311 GeoTransform* xformC =
new GeoTransform(ring_posC);
317 GeoTrf::Transform3D supportTrfA = GeoTrf::TranslateZ3D(serviceZpos+dogLegStaveLength*0.5+layerZshift);
320 GeoTrf::Transform3D supportTrfC = GeoTrf::TranslateZ3D(-serviceZpos-dogLegStaveLength*0.5+layerZshift);
323 std::ostringstream lnameM;
324 lnameM <<
"Brl0M_StaveRing";
326 GeoTrf::Translate3D ring_posM(0.0,0.0,0.0+layerZshift);