70 int staveLayout =
m_gmt_mgr->PixelStaveLayout();
75 bool isBLayer =
false;
76 if(
m_gmt_mgr->GetLD() == 0) isBLayer =
true;
78 std::unique_ptr<GeoPixelStaveSupport> staveSupport;
79 if (staveLayout ==0 || staveLayout==1) {
82 if (staveLayout == 3) {
85 else if (staveLayout >3 && staveLayout <7)
90 if (staveLayout >3 && staveLayout <7)
92 m_gmt_mgr->SetIBLPlanarModuleNumber(staveSupport->PixelNPlanarModule());
93 m_gmt_mgr->SetIBL3DModuleNumber(staveSupport->PixelN3DModule());
98 m_gmt_mgr->msg(MSG::ERROR)<<
"No stave support corresponding to the staveLayout "<<staveLayout<<
" could be defined "<<
endmsg;
102 m_gmt_mgr->msg(MSG::INFO)<<
"*** LAYER "<<
m_gmt_mgr->GetLD()<<
" planar/3D modules : "<< staveSupport->PixelNPlanarModule()<<
" "<<staveSupport->PixelN3DModule()<<
endmsg;
110 double layerRadius =
m_gmt_mgr->PixelLayerRadius();
111 double ladderTilt =
m_gmt_mgr->PixelLadderTilt();
112 int nSectors =
m_gmt_mgr->NPixelSectors();
115 m_DDmgr->numerology().setNumPhiModulesForLayer(
m_gmt_mgr->GetLD(),nSectors);
120 for(
int ii = 0; ii < nSectors; ii++) {
124 if(bAddIBLStaveRings) {
127 staveRingService.
Build();
136 double ladderHalfThickN = pixelLadder.
thicknessN();
137 double ladderHalfThickP = pixelLadder.
thicknessP();
138 double ladderHalfWidth = pixelLadder.
width()/2;
144 double grad = -1/tan(std::abs(ladderTilt));
146 double y1 = -ladderHalfThickN*sin(std::abs(ladderTilt));
147 double x1 = -ladderHalfThickN*cos(std::abs(ladderTilt))+layerRadius;
149 double y2 = (y1 - grad*x1)/(1+grad*grad);
150 double x2 = -grad*y2;
153 double distToClosestPoint = sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
155 double radClosest = (y1 - grad*x1)/(sqrt(1+grad*grad));
161 GeoTrf::Vector3D ladderLowerCorner(-ladderHalfThickN, ladderHalfWidth, 0);
162 GeoTrf::Vector3D ladderUpperCorner(ladderHalfThickP, -ladderHalfWidth, 0);
163 ladderLowerCorner = GeoTrf::TranslateX3D(layerRadius) * GeoTrf::RotateZ3D(std::abs(ladderTilt)) * ladderLowerCorner;
164 ladderUpperCorner = GeoTrf::TranslateX3D(layerRadius) * GeoTrf::RotateZ3D(std::abs(ladderTilt)) * ladderUpperCorner;
166 double layerThicknessN = layerRadius - ladderLowerCorner.perp();
167 double layerThicknessP = ladderUpperCorner.perp() - layerRadius;
175 if (distToClosestPoint < ladderHalfWidth) {
176 layerThicknessN = layerRadius - radClosest;
187 std::vector<GeoVPhysVol *> ladderServicesArray;
188 GeoTrf::Transform3D ladderServicesTransform(GeoTrf::Transform3D::Identity());
189 GeoVPhysVol* pigtailPhysVol =
nullptr;
190 GeoTrf::Transform3D transPigtail(GeoTrf::Transform3D::Identity());
193 if (staveLayout == 0) {
204 for(
int iPhi = 0; iPhi < nSectors; iPhi++) {
207 maxLadType = std::max(ladderType, maxLadType);
212 ladderServicesArray.resize(2*(maxLadType+1));
214 for(
int iPhi = 0; iPhi < nSectors; iPhi++) {
219 if (ladderType < 0) std::cout <<
"ERROR: Unexpected value of ladderType: " << ladderType << std::endl;
220 if (!ladderServicesArray[biStave*(maxLadType+1) + ladderType]) {
223 ladderServicesArray[biStave*(maxLadType+1) + ladderType] = ladderServices->
Build();
224 if (!firstLadderServices) {
226 firstLadderServices = ladderServices;
229 delete ladderServices;
245 if(firstLadderServices){
257 double xLadderServicesOffset =
m_gmt_mgr->PixelLadderServicesX();
258 double yLadderServicesOffset =
m_gmt_mgr->PixelLadderServicesY();
260 xCenter = (firstLadderServices->
referenceX() + xLadderServicesOffset);
261 yCenter = (firstLadderServices->
referenceY() + yLadderServicesOffset);
262 GeoTrf::Transform3D ladderSvcToglobal = GeoTrf::TranslateX3D(layerRadius)
263 * GeoTrf::RotateZ3D(ladderTilt)
264 * GeoTrf::Translate3D(xCenter, yCenter, 0);
265 GeoTrf::Vector3D corner1global = ladderSvcToglobal * corner1;
266 GeoTrf::Vector3D corner2global = ladderSvcToglobal * corner2;
267 GeoTrf::Vector3D corner3global = ladderSvcToglobal * corner3;
268 GeoTrf::Vector3D corner4global = ladderSvcToglobal * corner4;
270 double rMaxTmp = std::max(corner1global.perp(),
271 std::max(corner2global.perp(),
272 std::max(corner3global.perp(), corner4global.perp())));
274 layerThicknessP = std::max(layerThicknessP, rMaxTmp -
m_gmt_mgr->PixelLayerRadius());
280 delete firstLadderServices;
293 ladderServicesTransform = GeoTrf::Translate3D(xCenter, yCenter, 0);
299 pigtailPhysVol = pigtail.
Build();
300 transPigtail = GeoTrf::Translate3D(
m_gmt_mgr->PixelPigtailBendX() +
m_gmt_mgr->PixelLadderCableOffsetX(),
310 double safety = 0.01 * Gaudi::Units::mm;
311 double rmin =
m_gmt_mgr->PixelLayerRadius()-layerThicknessN - safety;
312 double rmax =
m_gmt_mgr->PixelLayerRadius()+layerThicknessP + safety;
317 bool bAddIBLStaveRings=
false;
320 bAddIBLStaveRings=
true;
321 double safety = 0.001 * Gaudi::Units::mm;
322 double outerRadius =
m_gmt_mgr->IBLSupportMidRingInnerRadius();
323 rmax=outerRadius-safety;
326 double outerRadius =
m_gmt_mgr->IBLSupportMidRingOuterRadius();
327 rmax=outerRadius+safety;
329 m_gmt_mgr->msg(MSG::INFO)<<
"Layer IBL / stave ring : outer radius max "<<rmax<<
endmsg;
347 GeoFullPhysVol* layerPhys =
nullptr;
352 double angle=(nSectors>0)?(360./(
double)nSectors)*Gaudi::Units::deg:(360.*Gaudi::Units::deg);
353 GeoTrf::Transform3D transRadiusAndTilt = GeoTrf::TranslateX3D(layerRadius)*GeoTrf::RotateZ3D(ladderTilt);
354 double phiOfModuleZero =
m_gmt_mgr->PhiOfModuleZero();
361 GeoTrf::Vector3D centerCoolingPipe =
m_gmt_mgr->IBLStaveRotationAxis() ;
364 GeoTrf::Transform3D staveTrf = GeoTrf::RotateZ3D(ladderTilt)*GeoTrf::Translate3D(-centerCoolingPipe.x(),-centerCoolingPipe.y(),-centerCoolingPipe.z());
365 double staveRadius =
m_gmt_mgr->IBLStaveRadius() ;
367 transRadiusAndTilt = GeoTrf::TranslateX3D(staveRadius)*staveTrf;
373 for(
int ii = 0; ii < nSectors; ii++) {
377 GeoVPhysVol *ladderPhys=pixelLadder.
Build();
380 if(bAddIBLStaveRings)
382 const GeoSimplePolygonBrep* bRep =
dynamic_cast<const GeoSimplePolygonBrep*
> (ladderPhys->getLogVol()->getShape());
390 const GeoMaterial* air =
m_mat_mgr->getMaterial(
"std::Air");
391 std::ostringstream lname;
393 const GeoTube* layerTube =
new GeoTube(rmin,rmax,0.5*
length);
394 const GeoLogVol* layerLog =
new GeoLogVol(lname.str(),layerTube,air);
395 layerPhys =
new GeoFullPhysVol(layerLog);
398 double phiOfSector = phiOfModuleZero + ii*
angle;
401 GeoTrf::Transform3D ladderTransform = GeoTrf::RotateZ3D(phiOfSector) * transRadiusAndTilt;
406 std::ostringstream nameTag;
407 nameTag <<
"Ladder" << ii;
408 GeoNameTag * tag =
new GeoNameTag(nameTag.str());
409 GeoTransform* xform =
new GeoTransform(ladderTransform);
411 layerPhys->add(
new GeoIdentifierTag(ii) );
412 layerPhys->add(xform);
413 layerPhys->add(ladderPhys);
415 if(
m_gmt_mgr->DoServicesOnLadder() && staveLayout == 0) {
434 xform =
new GeoTransform(ladderTransform * ladderServicesTransform);
435 layerPhys->add(xform);
436 layerPhys->add(ladderServicesArray[biStave*(maxLadType+1) + ladderType]);
440 xform =
new GeoTransform(ladderTransform*transPigtail);
441 layerPhys->add(xform);
442 layerPhys->add(pigtailPhysVol);
448 if(layerPhys==
nullptr)
450 m_gmt_mgr->msg(MSG::ERROR)<<
"layerPhys = 0 in GeoPixelLayer in "<<__FILE__<<
endmsg;
458 xMat.
add(layerPhys,
"PixelLayer");
459 std::ostringstream ostr; ostr <<
m_gmt_mgr->GetLD();
460 xMat.
add(layerPhys,
"PixelLayer"+ostr.str());
466 if(bAddIBLStaveRings)
471 staveRingService.
Build();
482 GeoNameTag *tagM =
new GeoNameTag(
"Brl0M_StaveRing");
483 GeoTransform *xformSupportMidRing =
new GeoTransform(GeoTrf::Transform3D::Identity());
485 layerPhys->add(tagM);
486 layerPhys->add(xformSupportMidRing);
487 layerPhys->add(supportPhysMidRing);