ATLAS Offline Software
Loading...
Searching...
No Matches
GeoPixelLayer Class Reference

#include <GeoPixelLayer.h>

Inheritance diagram for GeoPixelLayer:
Collaboration diagram for GeoPixelLayer:

Public Member Functions

 GeoPixelLayer (InDetDD::PixelDetectorManager *ddmgr, PixelGeometryManager *mgr, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)
virtual GeoVPhysVol * Build () override
GeoPhysVol * getSupportA ()
GeoPhysVol * getSupportC ()
GeoVPhysVol * getSupportMidRing ()
GeoTransform * getSupportTrfA ()
GeoTransform * getSupportTrfC ()
GeoTransform * getSupportTrfMidRing ()

Protected Attributes

PixelGeometryManagerm_gmt_mgr
InDetMaterialManagerm_mat_mgr
InDetDD::PixelDetectorManagerm_DDmgr
GeoModelIO::ReadGeoModel * m_sqliteReader
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
const double m_epsilon

Private Attributes

GeoNodePtr< GeoPhysVol > m_supportPhysA
GeoNodePtr< GeoPhysVol > m_supportPhysC
GeoNodePtr< GeoVPhysVol > m_supportMidRing
GeoNodePtr< GeoTransform > m_xformSupportA
GeoNodePtr< GeoTransform > m_xformSupportC
GeoNodePtr< GeoTransform > m_xformSupportMidRing

Detailed Description

Definition at line 14 of file GeoPixelLayer.h.

Constructor & Destructor Documentation

◆ GeoPixelLayer()

GeoPixelLayer::GeoPixelLayer ( InDetDD::PixelDetectorManager * ddmgr,
PixelGeometryManager * mgr,
GeoModelIO::ReadGeoModel * sqliteReader,
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV,
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX )

Definition at line 38 of file GeoPixelLayer.cxx.

43 : GeoVPixelFactory (ddmgr, mgr, sqliteReader, std::move(mapFPV), std::move(mapAX)),
44 m_supportPhysA (nullptr),
45 m_supportPhysC (nullptr),
46 m_supportMidRing (nullptr),
47 m_xformSupportA (nullptr),
48 m_xformSupportC (nullptr),
49 m_xformSupportMidRing (nullptr)
50{
51}
GeoNodePtr< GeoVPhysVol > m_supportMidRing
GeoNodePtr< GeoTransform > m_xformSupportMidRing
GeoNodePtr< GeoPhysVol > m_supportPhysA
GeoNodePtr< GeoTransform > m_xformSupportC
GeoNodePtr< GeoTransform > m_xformSupportA
GeoNodePtr< GeoPhysVol > m_supportPhysC
GeoVPixelFactory(InDetDD::PixelDetectorManager *ddmgr, PixelGeometryManager *mgr, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)

Member Function Documentation

◆ Build()

GeoVPhysVol * GeoPixelLayer::Build ( )
overridevirtual

Implements GeoVPixelFactory.

Definition at line 53 of file GeoPixelLayer.cxx.

53 {
54
55 //
56 // create a barrel layer
57 //
58
59 //
60 // Ladder = TMT + Modules (sometimes referred to as "active ladder" below)
61 // LadderServices = Omega, cooling tube + fluid, glue, flat part of pigtail, connectors, type 0 cables
62 //
63
64 // Currently recognized stave layouts
65 // 0 : Standard ATLAS
66 // 1 : No ladder services
67 // 2 : No ladder services or TMT
68 // 3 : Rectangular services.
69
70 int staveLayout = m_gmt_mgr->PixelStaveLayout();
71 // FIXME: Envelope needs to be checked.
72
73 // Build the sensor first to use the same for all the module in the layer
74 // Likewise the TMT and the "Ladder"
75 bool isBLayer = false;
76 if(m_gmt_mgr->GetLD() == 0) isBLayer = true;
77 GeoPixelSiCrystal theSensor(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, isBLayer);
78 std::unique_ptr<GeoPixelStaveSupport> staveSupport;
79 if (staveLayout ==0 || staveLayout==1) {
80 staveSupport = std::make_unique<GeoPixelTMT>( m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX );
81 }
82 if (staveLayout == 3) {
83 staveSupport = std::make_unique<GeoPixelSimpleStaveSupport>( m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX );
84 }
85 else if (staveLayout >3 && staveLayout <7)
86 {
87 staveSupport = std::make_unique<GeoPixelDetailedStaveSupport>( m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX);
88 }
89
90 if (staveLayout >3 && staveLayout <7)
91 {
92 m_gmt_mgr->SetIBLPlanarModuleNumber(staveSupport->PixelNPlanarModule());
93 m_gmt_mgr->SetIBL3DModuleNumber(staveSupport->PixelN3DModule());
94 }
95
96 if(!staveSupport)
97 {
98 m_gmt_mgr->msg(MSG::ERROR)<<"No stave support corresponding to the staveLayout "<<staveLayout<<" could be defined "<<endmsg;
99 return nullptr;
100 }
101
102 m_gmt_mgr->msg(MSG::INFO)<<"*** LAYER "<<m_gmt_mgr->GetLD()<<" planar/3D modules : "<< staveSupport->PixelNPlanarModule()<<" "<<staveSupport->PixelN3DModule()<<endmsg;
103
104
105 GeoPixelLadder pixelLadder(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, theSensor, staveSupport.get());
106
107 //
108 // layer radius, number of sectors and tilt used in various places
109 //
110 double layerRadius = m_gmt_mgr->PixelLayerRadius();
111 double ladderTilt = m_gmt_mgr->PixelLadderTilt();
112 int nSectors = m_gmt_mgr->NPixelSectors();
113
114 // Set numerology
115 m_DDmgr->numerology().setNumPhiModulesForLayer(m_gmt_mgr->GetLD(),nSectors);
116 m_DDmgr->numerology().setNumEtaModulesForLayer(m_gmt_mgr->GetLD(),m_gmt_mgr->PixelNModule());
117
118 if(m_sqliteReader) {
119 bool bAddIBLStaveRings=(m_gmt_mgr->GetLD()==0&&m_gmt_mgr->ibl()&&m_gmt_mgr->PixelStaveLayout()>3&&m_gmt_mgr->PixelStaveLayout()<8);
120 for(int ii = 0; ii < nSectors; ii++) {
121 m_gmt_mgr->SetPhi(ii);
122 pixelLadder.Build();
123 }
124 if(bAddIBLStaveRings) {
125 m_gmt_mgr->msg(MSG::INFO) << "IBL stave ring support"<< endmsg;
126 GeoPixelStaveRingServices staveRingService(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, pixelLadder, *staveSupport);
127 staveRingService.Build();
128 }
129 return nullptr;
130 }
131
132 //
133 // Calculate layerThicknessN: Thickness from layer radius to min radius of envelope
134 // Calculate layerThicknessP: Thickness from layer radius to max radius of envelope
135 //
136 double ladderHalfThickN = pixelLadder.thicknessN();
137 double ladderHalfThickP = pixelLadder.thicknessP();
138 double ladderHalfWidth = pixelLadder.width()/2;
139 //std::cout << "ladderHalfThickN, ladderHalfThickP, ladderHalfWidth, ladderTilt, layerRadius:"
140 // << ladderHalfThickN << " "<< ladderHalfThickP << " " << ladderHalfWidth
141 // << " " << ladderTilt << " " << layerRadius << std::endl;
142
143 // Calculate distance of closest approach to a line following the surface of the ladder.
144 double grad = -1/tan(std::abs(ladderTilt)); // Gradient of this line.
145 // x1, y1 is the point on the center of ladder surface.
146 double y1 = -ladderHalfThickN*sin(std::abs(ladderTilt));
147 double x1 = -ladderHalfThickN*cos(std::abs(ladderTilt))+layerRadius;
148 // x1, y2 is the point of closest approach.
149 double y2 = (y1 - grad*x1)/(1+grad*grad);
150 double x2 = -grad*y2;
151 // dist is the distance between these two points. If this is further than the width of the ladder we
152 // can use the corner of the ladder.
153 double distToClosestPoint = sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
154 // distance of closest approach.
155 double radClosest = (y1 - grad*x1)/(sqrt(1+grad*grad));
156
157 //std::cout << "Distance of closest approach: " << radClosest << std::endl;
158 //std::cout << "Distance along ladder surface from center to point of closest approach: " << distToClosestPoint << std::endl;
159
160 // Calculate the radius of the corners of the ladder.
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;
165
166 double layerThicknessN = layerRadius - ladderLowerCorner.perp();
167 double layerThicknessP = ladderUpperCorner.perp() - layerRadius; // Will be recalculated below in case of additional services
168 // std::cout<<"Max thickness : ladderhick "<<ladderHalfThickN<<" "<<ladderHalfThickP<<std::endl;
169 // std::cout<<"Max thickness : layerthick "<<layerThicknessN<<" "<<layerThicknessP<<std::endl;
170
171 //std::cout << "Layer Envelope (using ladder corners): "
172 // << layerRadius - layerThicknessN << " to " << layerRadius + layerThicknessP <<std::endl;
173
174 // If distance of closest approach is within the ladder width we use that instead
175 if (distToClosestPoint < ladderHalfWidth) {
176 layerThicknessN = layerRadius - radClosest;
177 }
178
179 //std::cout << "Layer Envelope (ladder only): "
180 // << layerRadius - layerThicknessN << " to " << layerRadius + layerThicknessP <<std::endl;
181
182 //
183 // Make ladder services and calculate envelope dimensions
184 //
185 // Variables that are used later
186 int maxLadType = 0;
187 std::vector<GeoVPhysVol *> ladderServicesArray;
188 GeoTrf::Transform3D ladderServicesTransform(GeoTrf::Transform3D::Identity());
189 GeoVPhysVol* pigtailPhysVol = nullptr;
190 GeoTrf::Transform3D transPigtail(GeoTrf::Transform3D::Identity());
191
192 // Only make services in non IBL geometries
193 if (staveLayout == 0) {
194 //
195 // Make LadderServices
196 //
197 // This volumes only needs to built a few times.
198 // There are up to 4*2 types although we keep it general in case
199 // more types are introduced.
200 // The *2 as there are two cable orientations.
201
202 // Get max ladder type
203 //int maxLadType = 0;
204 for(int iPhi = 0; iPhi < nSectors; iPhi++) {
205 m_gmt_mgr->SetPhi(iPhi);
206 int ladderType = m_gmt_mgr->PixelFluidOrient(m_gmt_mgr->GetLD(), iPhi);
207 maxLadType = std::max(ladderType, maxLadType);
208 }
209 // Create the GeoPixelLadderServices types that are needed.
210 // NB. vector initializes its contents to zero.
211 //std::vector<GeoVPhysVol *> ladderServicesArray(2*(maxLadType+1));
212 ladderServicesArray.resize(2*(maxLadType+1));
213 GeoPixelLadderServices *firstLadderServices = nullptr;
214 for(int iPhi = 0; iPhi < nSectors; iPhi++) {
215 m_gmt_mgr->SetPhi(iPhi);
216 int ladderType = m_gmt_mgr->PixelFluidOrient(m_gmt_mgr->GetLD(), iPhi);
217 int biStave = m_gmt_mgr->PixelBiStaveType(m_gmt_mgr->GetLD(), iPhi) % 2; // Will be 1 or 2 -> Map to 1,0
218 //int biStave = iPhi % 2; // Should only be 0 or 1
219 if (ladderType < 0) std::cout << "ERROR: Unexpected value of ladderType: " << ladderType << std::endl;
220 if (!ladderServicesArray[biStave*(maxLadType+1) + ladderType]) {
221 GeoPixelLadderServices *ladderServices = new GeoPixelLadderServices(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, ladderType);
222 // build the physical volume for each type
223 ladderServicesArray[biStave*(maxLadType+1) + ladderType] = ladderServices->Build();
224 if (!firstLadderServices) {
225 // We keep one as we use it later
226 firstLadderServices = ladderServices;
227 } else {
228 // not needed once the physical volume is bult
229 delete ladderServices;
230 }
231 }
232 }
233
234
235 //
236 // Calculate the layer envelope dimensions
237 //
238
239 //
240 // Calculate layerThicknessP: Thickness from layer radius to max radius of envelope
241 //
242
243 double xCenter = 0.;
244 double yCenter = 0.;
245 if(firstLadderServices){
246
247 // We need the dimensions of the GeoPixelLadderServices. They are all the same in this regards
248 // so any of them will do - use the first one.
249
250 GeoTrf::Vector3D corner1 = firstLadderServices->envelopeCornerC1();
251 GeoTrf::Vector3D corner2 = firstLadderServices->envelopeCornerC2();
252 GeoTrf::Vector3D corner3 = firstLadderServices->envelopeCornerA1();
253 GeoTrf::Vector3D corner4 = firstLadderServices->envelopeCornerA2();
254
255 // translate relative to sensor center (center of tilt rotation),
256 // then tilt then translate by radius of layer, then calculate r.
257 double xLadderServicesOffset = m_gmt_mgr->PixelLadderServicesX();
258 double yLadderServicesOffset = m_gmt_mgr->PixelLadderServicesY();
259 // xCenter, yCenter or coordinates of ladder services relative to active layer center (center of tilt rotation)
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;
269
270 double rMaxTmp = std::max(corner1global.perp(),
271 std::max(corner2global.perp(),
272 std::max(corner3global.perp(), corner4global.perp())));
273 // Thickness from layer radius to max radius of envelope
274 layerThicknessP = std::max(layerThicknessP, rMaxTmp - m_gmt_mgr->PixelLayerRadius());
275
276 //std::cout << rMaxTmp << std::endl;
277 //std::cout << layerThicknessP<< " "<<layerThicknessN <<std::endl;
278
279 // No longer needed
280 delete firstLadderServices;
281
282 }
283
284
285 //
286 // Determine the position of the ladders and service volume.
287 //
288 // The active ladder (tmt+modules) has its reference point at the tilt rotation point. So we do not need any extra translation
289 //
290 // The tube and cooling have there reference point
291 // In y: center of cooling tube
292 // In x: ~center of envelope (will change it to base of glue layer.)
293 ladderServicesTransform = GeoTrf::Translate3D(xCenter, yCenter, 0);
294
295 //
296 // The Pigtail
297 //
298 GeoPixelPigtail pigtail (m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX);
299 pigtailPhysVol = pigtail.Build();
300 transPigtail = GeoTrf::Translate3D(m_gmt_mgr->PixelPigtailBendX() + m_gmt_mgr->PixelLadderCableOffsetX(),
301 m_gmt_mgr->PixelPigtailBendY() + m_gmt_mgr->PixelLadderCableOffsetY(),
302 0.);
303
304
305 }
306
307 //
308 // Layer dimensions from above, etc
309 //
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;
313 double length = m_gmt_mgr->PixelLadderLength() + 4*m_epsilon; // Ladder has length m_gmt_mgr->PixelLadderLength() + 2*m_epsilon
314 //std::cout << "rmin = " << rmin << ", rmax = " << rmax << std::endl;
315
316 // In case of IBL stave detailed descriptiob
317 bool bAddIBLStaveRings=false;
318 if(m_gmt_mgr->GetLD()==0&&m_gmt_mgr->ibl()&&m_gmt_mgr->PixelStaveLayout()>3&&m_gmt_mgr->PixelStaveLayout()<8)
319 {
320 bAddIBLStaveRings=true;
321 double safety = 0.001 * Gaudi::Units::mm;
322 double outerRadius = m_gmt_mgr->IBLSupportMidRingInnerRadius();
323 rmax=outerRadius-safety;
324
325 if(m_gmt_mgr->PixelStaveAxe()==1) {
326 double outerRadius = m_gmt_mgr->IBLSupportMidRingOuterRadius();
327 rmax=outerRadius+safety;
328 }
329 m_gmt_mgr->msg(MSG::INFO)<<"Layer IBL / stave ring : outer radius max "<<rmax<<endmsg;
330
331 }
332
333//
334// Build ladder
335// GeoVPhysVol *ladderPhys=pixelLadder.Build();
336//
337// Now make the layer envelope
338//
339// const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
340// std::ostringstream lname;
341// lname << "Layer" << m_gmt_mgr->GetLD();
342// const GeoTube* layerTube = new GeoTube(rmin,rmax,0.5*length); //solid
343// const GeoLogVol* layerLog = new GeoLogVol(lname.str(),layerTube,air); //log volume
344// GeoFullPhysVol* layerPhys = new GeoFullPhysVol(layerLog); // phys vol
345
346
347 GeoFullPhysVol* layerPhys = nullptr;
348
349 //
350 // A few variables needed below
351 //
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();
355
356 // IBL rotations are defined vs the cooling pipe center...
357 if(m_gmt_mgr->GetLD()==0&&m_gmt_mgr->ibl()&&m_gmt_mgr->PixelStaveAxe()==1)
358 {
359
360 // Point that defines the center of the cooling pipe
361 GeoTrf::Vector3D centerCoolingPipe = m_gmt_mgr->IBLStaveRotationAxis() ;
362
363 // Transforms
364 GeoTrf::Transform3D staveTrf = GeoTrf::RotateZ3D(ladderTilt)*GeoTrf::Translate3D(-centerCoolingPipe.x(),-centerCoolingPipe.y(),-centerCoolingPipe.z());
365 double staveRadius = m_gmt_mgr->IBLStaveRadius() ;
366
367 transRadiusAndTilt = GeoTrf::TranslateX3D(staveRadius)*staveTrf;
368 }
369
370 //
371 // Loop over the sectors and place everything
372 //
373 for(int ii = 0; ii < nSectors; ii++) {
374 m_gmt_mgr->SetPhi(ii);
375
376 // Build ladder
377 GeoVPhysVol *ladderPhys=pixelLadder.Build();
378
379 if(ii==0){
380 if(bAddIBLStaveRings)
381 {
382 const GeoSimplePolygonBrep* bRep = dynamic_cast<const GeoSimplePolygonBrep*> (ladderPhys->getLogVol()->getShape());
383 length = 2*bRep->getDZ();
384 }
385
386 //
387 // Now make the layer envelope
388 //
389 m_gmt_mgr->msg(MSG::INFO)<<"Layer "<<m_gmt_mgr->GetLD()<<" in/out radius "<<rmin<<" "<<rmax<<endmsg;
390 const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
391 std::ostringstream lname;
392 lname << "Layer" << m_gmt_mgr->GetLD();
393 const GeoTube* layerTube = new GeoTube(rmin,rmax,0.5*length); //solid
394 const GeoLogVol* layerLog = new GeoLogVol(lname.str(),layerTube,air); //log volume
395 layerPhys = new GeoFullPhysVol(layerLog); // phys vol
396 }
397
398 double phiOfSector = phiOfModuleZero + ii*angle;
399
400 // transform equiv RotZ(phiOfSector)*TransZ(layerRadius)*RotZ(tilt)
401 GeoTrf::Transform3D ladderTransform = GeoTrf::RotateZ3D(phiOfSector) * transRadiusAndTilt;
402
403 //
404 // Place the active ladders
405 //
406 std::ostringstream nameTag;
407 nameTag << "Ladder" << ii;
408 GeoNameTag * tag = new GeoNameTag(nameTag.str());
409 GeoTransform* xform = new GeoTransform(ladderTransform);
410 layerPhys->add(tag);
411 layerPhys->add(new GeoIdentifierTag(ii) );
412 layerPhys->add(xform);
413 layerPhys->add(ladderPhys); //pixelLadder.Build());
414
415 if(m_gmt_mgr->DoServicesOnLadder() && staveLayout == 0) {
416
417 //
418 // Place the LadderServices volume (omega, tubes, connectors, cables for the layer)
419 //
420 // NB. PixelFluidOrient and PixelCableBiStave depends on phi
421 int ladderType = m_gmt_mgr->PixelFluidOrient(m_gmt_mgr->GetLD(), ii);
422 int biStave = m_gmt_mgr->PixelBiStaveType(m_gmt_mgr->GetLD(), ii) % 2; // Will be 1 or 2 -> Map to 1,0
423 //int biStave = m_gmt_mgr->PixelCableBiStave() % 2;
424 //int biStave = ii % 2;
425 //std::cout << "Layer,phiModule,fluidtype,bistavetype,index: "
426 // << m_gmt_mgr->GetLD() << ", "
427 // << ii << ", "
428 // << ladderType << ", "
429 // << m_gmt_mgr->PixelBiStaveType(m_gmt_mgr->GetLD(), ii) << ", "
430 // << biStave*(maxLadType+1) + ladderType << std::endl;
431
432
433 // transform equiv to RotZ(angle)*TransZ(layerRadius)*RotZ(tilt)*transTubeAndCables
434 xform = new GeoTransform(ladderTransform * ladderServicesTransform);
435 layerPhys->add(xform);
436 layerPhys->add(ladderServicesArray[biStave*(maxLadType+1) + ladderType]);
437
438 // Place the pigtail (the curved section)
439 // transform equiv to RotZ(angle)*TransZ(layerRadius)*RotZ(tilt)*transPigtail
440 xform = new GeoTransform(ladderTransform*transPigtail);
441 layerPhys->add(xform);
442 layerPhys->add(pigtailPhysVol);
443
444 }
445 }
446 // delete staveSupport;
447
448 if(layerPhys==nullptr)
449 {
450 m_gmt_mgr->msg(MSG::ERROR)<<"layerPhys = 0 in GeoPixelLayer in "<<__FILE__<<endmsg;
451 std::abort();
452 }
453
454 //
455 // Extra Material. I don't think there is much room but we provide the hooks anyway
456 //
457 InDetDD::ExtraMaterial xMat(m_gmt_mgr->distortedMatManager());
458 xMat.add(layerPhys,"PixelLayer");
459 std::ostringstream ostr; ostr << m_gmt_mgr->GetLD();
460 xMat.add(layerPhys,"PixelLayer"+ostr.str());
461
462
463 //
464 // IBL stave rings area : stave ring + endblock + flex (with dogleg)
465 //
466 if(bAddIBLStaveRings)
467 {
468 m_gmt_mgr->msg(MSG::INFO) << "IBL stave ring support"<< endmsg;
469
470 GeoPixelStaveRingServices staveRingService(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, pixelLadder, *staveSupport);
471 staveRingService.Build();
472
473 m_supportPhysA = staveRingService.getSupportA();
474 m_supportPhysC = staveRingService.getSupportC();
475 m_supportMidRing = staveRingService.getSupportMidRing();
476
477 m_xformSupportA = staveRingService.getSupportTrfA();
478 m_xformSupportC = staveRingService.getSupportTrfC();
479 m_xformSupportMidRing = staveRingService.getSupportTrfMidRing();
480
481 if(m_gmt_mgr->PixelStaveAxe()==1) {
482 GeoNameTag *tagM = new GeoNameTag("Brl0M_StaveRing");
483 GeoTransform *xformSupportMidRing = new GeoTransform(GeoTrf::Transform3D::Identity());
484 GeoVPhysVol *supportPhysMidRing = getSupportMidRing();
485 layerPhys->add(tagM);
486 layerPhys->add(xformSupportMidRing);
487 layerPhys->add(supportPhysMidRing);
488 }
489
490 }
491
492
493 return layerPhys;
494}
#define endmsg
double length(const pvec &v)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
const GeoTrf::Vector3D & envelopeCornerA1()
const GeoTrf::Vector3D & envelopeCornerA2()
virtual GeoVPhysVol * Build() override
const GeoTrf::Vector3D & envelopeCornerC2()
const GeoTrf::Vector3D & envelopeCornerC1()
GeoVPhysVol * getSupportMidRing()
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
const double m_epsilon
GeoModelIO::ReadGeoModel * m_sqliteReader
PixelGeometryManager * m_gmt_mgr
InDetDD::PixelDetectorManager * m_DDmgr
InDetMaterialManager * m_mat_mgr
@ iPhi
Definition ParamDefs.h:47

◆ getSupportA()

GeoPhysVol * GeoPixelLayer::getSupportA ( )
inline

Definition at line 24 of file GeoPixelLayer.h.

24{ return m_supportPhysA; }

◆ getSupportC()

GeoPhysVol * GeoPixelLayer::getSupportC ( )
inline

Definition at line 25 of file GeoPixelLayer.h.

25{ return m_supportPhysC; }

◆ getSupportMidRing()

GeoVPhysVol * GeoPixelLayer::getSupportMidRing ( )
inline

Definition at line 26 of file GeoPixelLayer.h.

26{ return m_supportMidRing; }

◆ getSupportTrfA()

GeoTransform * GeoPixelLayer::getSupportTrfA ( )
inline

Definition at line 28 of file GeoPixelLayer.h.

28{ return m_xformSupportA; }

◆ getSupportTrfC()

GeoTransform * GeoPixelLayer::getSupportTrfC ( )
inline

Definition at line 29 of file GeoPixelLayer.h.

29{ return m_xformSupportC; }

◆ getSupportTrfMidRing()

GeoTransform * GeoPixelLayer::getSupportTrfMidRing ( )
inline

Definition at line 30 of file GeoPixelLayer.h.

30{ return m_xformSupportMidRing; }

Member Data Documentation

◆ m_DDmgr

InDetDD::PixelDetectorManager* GeoVPixelFactory::m_DDmgr
protectedinherited

Definition at line 45 of file GeoVPixelFactory.h.

◆ m_epsilon

const double GeoVPixelFactory::m_epsilon
protectedinherited

Definition at line 49 of file GeoVPixelFactory.h.

◆ m_gmt_mgr

PixelGeometryManager* GeoVPixelFactory::m_gmt_mgr
protectedinherited

Definition at line 43 of file GeoVPixelFactory.h.

◆ m_mapAX

std::shared_ptr<std::map<std::string, GeoAlignableTransform*> > GeoVPixelFactory::m_mapAX
protectedinherited

Definition at line 48 of file GeoVPixelFactory.h.

◆ m_mapFPV

std::shared_ptr<std::map<std::string, GeoFullPhysVol*> > GeoVPixelFactory::m_mapFPV
protectedinherited

Definition at line 47 of file GeoVPixelFactory.h.

◆ m_mat_mgr

InDetMaterialManager* GeoVPixelFactory::m_mat_mgr
protectedinherited

Definition at line 44 of file GeoVPixelFactory.h.

◆ m_sqliteReader

GeoModelIO::ReadGeoModel* GeoVPixelFactory::m_sqliteReader
protectedinherited

Definition at line 46 of file GeoVPixelFactory.h.

◆ m_supportMidRing

GeoNodePtr<GeoVPhysVol> GeoPixelLayer::m_supportMidRing
private

Definition at line 35 of file GeoPixelLayer.h.

◆ m_supportPhysA

GeoNodePtr<GeoPhysVol> GeoPixelLayer::m_supportPhysA
private

Definition at line 33 of file GeoPixelLayer.h.

◆ m_supportPhysC

GeoNodePtr<GeoPhysVol> GeoPixelLayer::m_supportPhysC
private

Definition at line 34 of file GeoPixelLayer.h.

◆ m_xformSupportA

GeoNodePtr<GeoTransform> GeoPixelLayer::m_xformSupportA
private

Definition at line 37 of file GeoPixelLayer.h.

◆ m_xformSupportC

GeoNodePtr<GeoTransform> GeoPixelLayer::m_xformSupportC
private

Definition at line 38 of file GeoPixelLayer.h.

◆ m_xformSupportMidRing

GeoNodePtr<GeoTransform> GeoPixelLayer::m_xformSupportMidRing
private

Definition at line 39 of file GeoPixelLayer.h.


The documentation for this class was generated from the following files: