ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_FwdWheel.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "SCT_FwdWheel.h"
6
8
12
13#include "SCT_FwdModule.h"
14#include "SCT_FwdRing.h"
15#include "SCT_FwdDiscSupport.h"
16#include "SCT_FwdPatchPanel.h"
17#include "SCT_FwdPPConnector.h"
18#include "SCT_FwdPPCooling.h"
19#include "SCT_FwdFSI.h"
21#include "SCT_FwdRingCooling.h"
22#include "SCT_FwdOptoHarness.h"
23#include "SCT_FwdDiscFixation.h"
24
25#include "SCT_FSIHelper.h"
26
29
30#include "GeoModelRead/ReadGeoModel.h"
31#include "GeoModelKernel/GeoTube.h"
32#include "GeoModelKernel/GeoLogVol.h"
33#include "GeoModelKernel/GeoPhysVol.h"
34#include "GeoModelKernel/GeoFullPhysVol.h"
35#include "GeoModelKernel/GeoNameTag.h"
36#include "GeoModelKernel/GeoIdentifierTag.h"
37#include "GeoModelKernel/GeoTransform.h"
38#include "GeoModelKernel/GeoAlignableTransform.h"
39#include "GeoModelKernel/GeoMaterial.h"
40#include "GeoModelKernel/GeoShapeShift.h"
41#include "GeoModelKernel/GeoDefinitions.h"
42#include "GaudiKernel/SystemOfUnits.h"
43
44#include <sstream>
45#include <cmath>
46
47#include <iostream>
48#include <utility>
49
50inline double sqr(double x) {return x*x;}
51
52SCT_FwdWheel::SCT_FwdWheel(const std::string & name,
53 int iWheel,
54 const std::vector<SCT_FwdModule *> & modules,
55 int ec,
56 InDetDD::SCT_DetectorManager* detectorManager,
57 SCT_GeometryManager* geometryManager,
58 SCT_MaterialManager* materials,
59 GeoModelIO::ReadGeoModel* sqliteReader,
60 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
61 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
62 : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials, sqliteReader, std::move(mapFPV), std::move(mapAX)),
63 m_iWheel(iWheel),
64 m_endcap(ec),
65 m_modules(modules)
66{
69}
70
72
73void
75{
76 const SCT_ForwardParameters * parameters = m_geometryManager->forwardParameters();
77
78 m_zPosition = parameters->fwdWheelZPosition(m_iWheel);
79 m_numRings = parameters->fwdWheelNumRings(m_iWheel);
80 for (int iRing = 0; iRing < m_numRings; iRing++) {
81 m_ringType.push_back(parameters->fwdWheelModuleType(m_iWheel,iRing, m_endcap));
82 }
83
84 if(!m_sqliteReader){
85
86 m_numPatchPanelLocs = parameters->fwdNumPatchPanelLocs();
87 m_numPatchPanelTypes = parameters->fwdNumPatchPanelTypes();
88
89 for (int iPPLoc = 0; iPPLoc < m_numPatchPanelLocs; iPPLoc++) {
90 m_patchPanelType.push_back(parameters->fwdPatchPanelType(iPPLoc));
91 m_patchPanelLocAngle.push_back(parameters->fwdPatchPanelLocAngle(iPPLoc));
92 m_patchPanelRepeatQuadrant.push_back(parameters->fwdPatchPanelRepeatQuadrant(iPPLoc));
93 }
94
95 // FIXME: Check and put these in DB or calculate them
96 // We have a maximum width of 80.2. Make it 75 for some clearance.
97 //m_innerRadius = 267 * Gaudi::Units::mm;
98 //m_outerRadius = 590 * Gaudi::Units::mm;
99 //m_thickness = 100 * Gaudi::Units::mm;
100 // These get swapped later if the wheel is rotated.
101 m_thicknessFront = 30 * Gaudi::Units::mm;
102 m_thicknessBack = 45 * Gaudi::Units::mm;
103
104 m_numFSITypes = parameters->fwdFSINumGeomTypes();
105 m_fsiVector = &(parameters->fsiVector(m_iWheel));
106
107 m_numWheels = parameters->fwdNumWheels();
108
109 m_optoHarnessPresent = parameters->fwdOptoHarnessPresent();
110 m_pPConnectorPresent = parameters->fwdPPConnectorPresent();
111 m_pPCoolingPresent = parameters->fwdPPCoolingPresent();
112
113 m_discFixationPresent = parameters->fwdDiscFixationPresent();
115 for (int iLoc = 0; iLoc < parameters->fwdNumCylinderServiceLocs(); iLoc++) {
116 // Disc fixations are at same locations at as N2 pipes
117 if(parameters->fwdCylinderServiceLocName(iLoc) == "NPipe") {
118 m_discFixationLocAngle.push_back(parameters->fwdCylinderServiceLocAngle(iLoc));
119 }
120 }
121 }
122
123 m_safety = m_geometryManager->generalParameters()->safety();
124 }
125
126 // Set numerology
127 m_detectorManager->numerology().setNumRingsForDisk(m_iWheel,m_numRings);
128
129}
130
131const GeoLogVol *
133{
134 // The rings
135 for (int iRing = 0; iRing < m_numRings; iRing++){
136 std::string ringName = std::format("Ring{}For{}",iRing,getName());
137 int ringType = m_ringType[iRing];
138 m_rings.push_back(std::make_unique<SCT_FwdRing>(ringName, m_modules[ringType], m_iWheel, iRing, m_endcap,m_detectorManager, m_geometryManager, m_materials, m_sqliteReader, m_mapFPV,m_mapAX));
139 }
140
141 if(m_sqliteReader) return nullptr;
142
143 // Calculate total number of modules
144 m_totalModules = 0;
145 for (int iRing = 0; iRing < m_numRings; iRing++){
146 m_totalModules += m_rings[iRing]->numModules();
147 }
148
149 // Create disc support.
150 m_discSupport = std::make_unique<SCT_FwdDiscSupport>(std::format("DiscSupport{}",m_iWheel), m_iWheel,
152
153 // Create Patch Panel
154 for (int iPPType = 0; iPPType < m_numPatchPanelTypes; iPPType++) {
155 m_patchPanel.push_back(std::make_unique<SCT_FwdPatchPanel>(std::format("PatchPanel{}",iPPType), iPPType,
157 }
158
159 // Create Patch Pannel Connector and Cooling, and disc Fixations
161 m_pPConnector = std::make_unique<SCT_FwdPPConnector>("PPConnector",
163 }
164 if (m_pPCoolingPresent) {
165 m_pPCooling = std::make_unique<SCT_FwdPPCooling>("PPCooling",
167 }
169 m_discFixation = std::make_unique<SCT_FwdDiscFixation>("DiscFixation",
171 }
172
173 // Create the FSI types
174 m_fsiType.resize(m_numFSITypes);
175 for (unsigned int iFSI = 0; iFSI < m_fsiVector->size(); iFSI++) {
176 int type = (*m_fsiVector)[iFSI]->simType();
177 if (!m_fsiType[type]) {
178 m_fsiType[type] = std::make_unique<SCT_FwdFSI>(std::format("FSI{}",type), type,
180 }
181 }
182
183 // Calculate the extent of the envelope
184 // Use support disc as starting values.
185 double maxOuterRadius = m_discSupport->outerRadius();
186 double minInnerRadius = m_discSupport->innerRadius();
187 double maxModuleThickness = 0.5 * m_discSupport->thickness();
188
189 // Extend min max accounting for rings
190 for (int iRing = 0; iRing < m_numRings; iRing++){
191 maxOuterRadius = std::max(m_rings[iRing]->outerRadius(), maxOuterRadius);
192 minInnerRadius = std::min(m_rings[iRing]->innerRadius(), minInnerRadius);
193 maxModuleThickness = std::max(maxModuleThickness, m_rings[iRing]->thicknessOuter() + m_rings[iRing]->ringOffset());
194 }
195 m_ringMaxRadius = maxOuterRadius;
196
197 // If first or last wheel there is nothing protruding beyond the rings so we reduce the
198 // envelope size. Comes to about 20 mm. Note the front becomes the back later for the last wheel.
199 if ((m_iWheel == 0) || (m_iWheel == m_numWheels - 1)) {
200 m_thicknessFront = maxModuleThickness + 1*Gaudi::Units::mm; // We give plenty of safety as we have the room.
201 // But now modified by disc fixations
204 }
205 }
206
207 // The outer radius is now defined by the patch panel cooling if present
209 double ppCoolingOuterRadius = sqrt(sqr(m_patchPanel[2]->outerRadius() + m_pPCooling->deltaR()) + sqr(m_pPCooling->rphi())) + m_safety;
210 maxOuterRadius = std::max(ppCoolingOuterRadius, maxOuterRadius);
211 }
212
213 // Or maybe by the disc fixations...
215 double discFixationOuterRadius = sqrt(sqr(m_ringMaxRadius + m_discFixation->thickness() + m_safety) + sqr(m_discFixation->radius())) + m_safety;
216 maxOuterRadius = std::max(discFixationOuterRadius, maxOuterRadius);
217 }
218
219 m_rotateWheel = +1; // +1 normal, -1 rotate (ie last wheel)
220 if (m_numRings > 0) { // Should always be true
221 m_rotateWheel = (m_rings[0]->discRotated()) ? -1 : +1 ;
222 }
223
224 // swap thickness front/back (this only happens for the last wheel).
225 if (m_rotateWheel < 0) {
226 double tmp = m_thicknessFront;
228 m_thicknessBack = tmp;
229 }
230
232
233 m_innerRadius = minInnerRadius - m_safety;
234 m_outerRadius = maxOuterRadius + m_safety;
235
236 // TODO. Have to account for FSI and patch panels
237 //m_thickness = 2. * maxRingOffset + maxThickness;
238 // m_thickness = 100 * Gaudi::Units::mm;
239
240 // Make envelope for the wheel
241 double envelopeShift = 0.5*(m_thicknessBack - m_thicknessFront);
242 const GeoTube * tmpShape = new GeoTube(m_innerRadius, m_outerRadius, 0.5 * m_thickness);
243 const GeoShape & fwdWheelEnvelopeShape = *tmpShape << GeoTrf::Translate3D(0, 0, envelopeShift);
244
245 const GeoLogVol * fwdWheelLog =
246 new GeoLogVol(getName(), &fwdWheelEnvelopeShape, m_materials->gasMaterial());
247
248 return fwdWheelLog;
249}
250
251GeoVPhysVol *
253{
254
255 if(m_sqliteReader) {
256
257 for (int iRing = 0; iRing < m_numRings; iRing++){
258
259 SCT_FwdRing * ring = m_rings[iRing].get();
260 id.setEtaModule(ring->identifier());
261 ring->build(id);
262
263 }
264 return nullptr;
265
266 }
267
268 GeoFullPhysVol * wheel= new GeoFullPhysVol(m_logVolume);
269
270
271 // Add discsupport. Its centered so no need for a transform
272 wheel->add(m_discSupport->getVolume());
273
274 //
275 // Loop over rings and put in rings, cooling and power tapes.
276 //
277 double powerTapeZPlusMax = 0.5 * m_discSupport->thickness();
278 double powerTapeZMinusMax = -0.5 * m_discSupport->thickness();
279
280 double maxZOfRingsFront = 0;
281
282 for (int iRing = 0; iRing < m_numRings; iRing++){
283
284 SCT_FwdRing * ring = m_rings[iRing].get();
285
286 // Position ring
287 double ringZpos = ring->ringSide() * ring->ringOffset();
288 double ringOuterZ = ring->ringOffset() + ring->thicknessOuter();
289 maxZOfRingsFront = std::max(maxZOfRingsFront, ringOuterZ);
290
291 std::string ringNameTag = std::format("Ring#{}",ring->identifier());
292 wheel->add(new GeoNameTag(ringNameTag));
293 wheel->add(new GeoIdentifierTag(ring->identifier()));
294 wheel->add(new GeoTransform(GeoTrf::Translate3D(0, 0, ringZpos)));
295 id.setEtaModule(ring->identifier());
296 wheel->add(ring->build(id));
297
298 // Position cooling
299 // Get a pointer to the cooling ring.
300 SCT_FwdRingCooling cooling(std::format("RingCoolingW{}R{}",m_iWheel,iRing),
302 double coolingZpos = ring->ringSide() * (0.5*(m_discSupport->thickness() + cooling.thickness()));
303 wheel->add(new GeoTransform(GeoTrf::TranslateZ3D(coolingZpos)));
304 wheel->add(cooling.getVolume());
305
306 // Power Tapes
307 // Get a pointer to the power tape
308 SCT_FwdDiscPowerTape powerTape(std::format("PowerTapeW{}R{}",m_iWheel,iRing), iRing,
310
311 double powerTapeZpos = ring->ringSide() * (0.5*(m_discSupport->thickness() + powerTape.thickness()) +
312 cooling.thickness());
313 // Make sure we don't overlap with powertape from outer rings
314 // We store max extent of power tape for each side (Plus, Minus)
315 // This is really only ever an issue for ring2 but we keep it general.
316 if (ring->ringSide() > 0) {
317 double powerTapeZstart = powerTapeZpos - 0.5 * powerTape.thickness();
318 if (powerTapeZstart < powerTapeZPlusMax) {
319 powerTapeZpos = powerTapeZPlusMax + 0.5 * powerTape.thickness();
320 }
321 powerTapeZPlusMax = powerTapeZpos + 0.5 * powerTape.thickness();
322 } else {
323 double powerTapeZstart = powerTapeZpos + 0.5 * powerTape.thickness();
324 if (powerTapeZstart > powerTapeZMinusMax) {
325 powerTapeZpos = powerTapeZMinusMax - 0.5 * powerTape.thickness();
326 }
327 powerTapeZMinusMax = powerTapeZpos - 0.5 * powerTape.thickness();
328 }
329 if ((std::abs(powerTapeZpos)+0.5*powerTape.thickness()) > (std::abs(ringZpos) - 0.5*ring->thicknessInner())) {
330 std::cout << "ERROR: Power tapes clash with modules!!!" << std::endl;
331 }
332 wheel->add(new GeoTransform(GeoTrf::TranslateZ3D(powerTapeZpos)));
333 wheel->add(powerTape.getVolume());
334
335
336 } // End Ring loop
337
338
339 //
340 // Put in the patch Panel
341 //
342 // Put it on opposide side of outer ring (ring 0).
343 int patchPanelSide = m_rotateWheel;
344
345
346 // Get outer position of power tape on that side.
347 // In case there are no rings on that side (and hence no powertapes) this will be 1/2 disc support thickness
348 double powerTapeZMax = 0;
349 if (patchPanelSide > 0) {
350 powerTapeZMax = powerTapeZPlusMax;
351 } else {
352 powerTapeZMax = -powerTapeZMinusMax;
353 }
354
355
356
357 // Loop over patch panel locations
358 for (int iPPLoc = 0; iPPLoc < m_numPatchPanelLocs ; iPPLoc++) {
359
360 // The patchpanels generally repeat in the four quadrants.
361 int numRepeat = 1;
362 if (m_patchPanelRepeatQuadrant[iPPLoc]) numRepeat = 4;
363 int ppType = m_patchPanelType[iPPLoc];
364 if (ppType >= m_numPatchPanelTypes) std::cout << "ERROR: Patch Panel type number out of range!" << std::endl;
365 for (int iRepeat = 0; iRepeat < numRepeat; iRepeat++) {
366
367 // Calculate the location.
368 double patchPanelAngle = m_patchPanelLocAngle[iPPLoc] + iRepeat * 90*Gaudi::Units::degree;
369 double patchPanelZpos = patchPanelSide * (powerTapeZMax + 0.5*m_patchPanel[ppType]->thickness() + m_safety);
370 double patchPanelR = m_patchPanel[ppType]->midRadius();
371
372 // Check for overlap with middle ring.
373 if (m_numRings >= 2 && (m_patchPanel[ppType]->innerRadius() <= m_rings[1]->outerRadius())) {
374 std::cout << "ERROR: Patch Panel clashes with middle ring" << std::endl;
375 std::cout << " PatchPanel inner radius: " << m_patchPanel[ppType]->innerRadius() << std::endl;
376 std::cout << " Ring outer radius: " << m_rings[1]->outerRadius() << std::endl;
377 }
378
379 // Add it to the wheel
380 wheel->add(new GeoTransform(GeoTrf::RotateZ3D(patchPanelAngle)*GeoTrf::TranslateX3D(patchPanelR)*GeoTrf::TranslateZ3D(patchPanelZpos)));
381 wheel->add(m_patchPanel[ppType]->getVolume());
382
383 // Make and add the connector for PPF0e (type 0)
384 // Positioned immediately outside PatchPanel at same angle
385 if(ppType == 0 && m_pPConnectorPresent) {
386 double ppConnectorZpos = patchPanelSide * (powerTapeZMax + 0.5*m_pPConnector->thickness() + m_safety);
387 double ppConnectorR = m_patchPanel[ppType]->outerRadius() + 0.5*m_pPConnector->deltaR() + m_safety;
388 // Check is within wheel
389 if (ppConnectorR + 0.5*m_pPConnector->deltaR() >= m_outerRadius) {
390 std::cout << "ERROR: Patch Panel Connector clashes outside wheel" << std::endl;
391 std::cout << " PatchPanel Connector outer radius: " << ppConnectorR + 0.5*m_pPConnector->deltaR() << std::endl;
392 std::cout << " Wheel outer radius: " << m_outerRadius << std::endl;
393 }
394 // Add it to the wheel
395 wheel->add(new GeoTransform(GeoTrf::RotateZ3D(patchPanelAngle)*GeoTrf::TranslateX3D(ppConnectorR)*GeoTrf::TranslateZ3D(ppConnectorZpos)));
396 wheel->add(m_pPConnector->getVolume());
397 }
398
399 // Make and add the cooling for PPF0c (type 2)
400 // Positioned immediately outside PatchPanel at same angle
401 if(ppType == 2 && m_pPCoolingPresent) {
402 double ppCoolingZpos = patchPanelSide * (powerTapeZMax + 0.5*m_pPCooling->thickness() + m_safety);
403 double ppCoolingR = m_patchPanel[ppType]->outerRadius() + 0.5*m_pPCooling->deltaR() + m_safety;
404 // Check is within wheel
405 if (ppCoolingR + 0.5*m_pPCooling->deltaR() >= m_outerRadius) {
406 std::cout << "ERROR: Patch Panel Cooling clashes outside wheel" << std::endl;
407 std::cout << " PatchPanel Cooling outer radius: " << ppCoolingR + 0.5*m_pPCooling->deltaR() << std::endl;
408 std::cout << " Wheel outer radius: " << m_outerRadius << std::endl;
409 }
410 // Add it to the wheel
411 wheel->add(new GeoTransform(GeoTrf::RotateZ3D(patchPanelAngle)*GeoTrf::TranslateX3D(ppCoolingR)*GeoTrf::TranslateZ3D(ppCoolingZpos)));
412 wheel->add(m_pPCooling->getVolume());
413 }
414 }
415
416 } // end loop over patch panel locations
417
418
419 // Add the optoharness - type depends on number of rings
420 // The optoharness is always on the back side (except if the wheel is rotates)
421 double optoHarnessZMax = 0.5 * m_discSupport->thickness();
423 std::string optoharnessName = "OptoHarnessO";
424 if(m_numRings > 1) {optoharnessName+="M";}
425 if(m_numRings > 2) {optoharnessName+="I";}
426 SCT_FwdOptoHarness optoharness(std::format("{}W{}",optoharnessName,m_iWheel), m_numRings,
428 double optoHarnessZpos = 0.5*m_rotateWheel*(m_discSupport->thickness() + optoharness.thickness());
429 wheel->add(new GeoTransform(GeoTrf::TranslateZ3D(optoHarnessZpos)));
430 wheel->add(optoharness.getVolume());
431 optoHarnessZMax = optoHarnessZpos + 0.5*optoharness.thickness();
432 }
433
434 // Loop over FSI locations.
435 for (unsigned int iFSI = 0; iFSI < m_fsiVector->size(); iFSI++) {
436 int type = (*m_fsiVector)[iFSI]->simType();
437 double fsiRadius = (*m_fsiVector)[iFSI]->location().radius();
438 double fsiPhi = (*m_fsiVector)[iFSI]->location().phi();
439 int fsiUsualSide = (*m_fsiVector)[iFSI]->location().side();
440 int fsiSide = fsiUsualSide * m_rotateWheel;
441 double fsiZpos = fsiSide * m_fsiType[type]->zOffset();
442
443 // Check for clashes on front side
444 if (fsiUsualSide < 0) {
445 double zMin = std::abs(fsiZpos) - 0.5*m_fsiType[type]->thickness();
446 if (maxZOfRingsFront > zMin) {
447 std::cout << "WARNING: FSI probably clashes with ring" << std::endl;
448 std::cout << " maxZOfRingsFront = " << maxZOfRingsFront << std::endl;
449 std::cout << " fsiZMin = " << zMin << std::endl;
450 }
451 } else { // ... and backside
452 // Check radius of fsi.
453 // If outer radii check for overlap with powertape
454 // If inner radii check for overlap with optoharness (disksupport if no optoharness)
455 double diskMidRadius = 0.5*(m_outerRadius + m_innerRadius);
456 double servicesZMax = (fsiRadius > diskMidRadius) ? powerTapeZMax : optoHarnessZMax;
457 double zMin = std::abs(fsiZpos) - 0.5*m_fsiType[type]->thickness();
458 if (servicesZMax > zMin) {
459 std::cout << "WARNING: FSI probably clashes with disc services" << std::endl;
460 std::cout << " servicesZMax = " << servicesZMax << std::endl;
461 std::cout << " fsiZMin = " << zMin << std::endl;
462 std::cout << " fsiRadius = " << fsiRadius << std::endl;
463 }
464 }
465
466 wheel->add(new GeoTransform(GeoTrf::RotateZ3D(fsiPhi)*GeoTrf::TranslateX3D(fsiRadius)*GeoTrf::TranslateZ3D(fsiZpos)));
467 wheel->add(m_fsiType[type]->getVolume());
468
469
470 } // end loop over FSI.
471
472 // Loop over disc fixation locations
474 for (unsigned int iLoc = 0; iLoc < m_discFixationLocAngle.size() ; iLoc++) {
475 // The disc fixations repeat in the four quadrants.
476 for (int iRepeat = 0; iRepeat < 4; iRepeat++) {
477 // Calculate the location.
478 double discFixationAngle = m_discFixationLocAngle[iLoc] + iRepeat * 90*Gaudi::Units::degree;
479 double discFixationR = m_ringMaxRadius + 0.5*m_discFixation->thickness() + m_safety;
480 // Check is within wheel
481 if (discFixationR + 0.5*m_discFixation->thickness() >= m_outerRadius) {
482 std::cout << "ERROR: Disc Fixation outside wheel" << std::endl;
483 std::cout << "Disc fixation outer radius: " << discFixationR + 0.5*m_discFixation->thickness() << std::endl;
484 std::cout << " Wheel outer radius: " << m_outerRadius << std::endl;
485 }
486 // Add it to the wheel
487 wheel->add(new GeoTransform(GeoTrf::RotateY3D(90.*Gaudi::Units::degree)*GeoTrf::RotateX3D(discFixationAngle)*GeoTrf::TranslateZ3D(discFixationR)));
488 wheel->add(m_discFixation->getVolume());
489 }
490 }
491 }
492
493 // Extra Material
494 InDetDD::ExtraMaterial xMat(m_geometryManager->distortedMatManager());
495 xMat.add(wheel, "SCTDisc");
496 xMat.add(wheel, std::format("SCTDisc{}",m_iWheel));
497 if (m_endcap > 0) {
498 xMat.add(wheel, "SCTDiscA");
499 xMat.add(wheel, std::format("SCTDiscA{}",m_iWheel));
500 }
501 else {
502 xMat.add(wheel, "SCTDiscC");
503 xMat.add(wheel, std::format("SCTDiscC{}",m_iWheel));
504 }
505
506 return wheel;
507}
508
#define sqr(t)
#define x
void add(GeoPhysVol *parent, const std::string &parentName, double zPos=0)
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
const std::string & getName() const
InDetDD::SCT_DetectorManager * m_detectorManager
SCT_GeometryManager * m_geometryManager
SCT_MaterialManager * m_materials
double thickness() const
double thickness() const
std::vector< std::unique_ptr< SCT_FwdRing > > m_rings
void getParameters()
std::vector< std::unique_ptr< SCT_FwdPatchPanel > > m_patchPanel
std::unique_ptr< SCT_FwdPPCooling > m_pPCooling
bool m_pPCoolingPresent
double m_ringMaxRadius
virtual GeoVPhysVol * build(SCT_Identifier id)
int ringType(int i) const
SCT_FwdWheel(const std::string &name, int iWheel, const std::vector< SCT_FwdModule * > &modules, int ec, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)
std::unique_ptr< SCT_FwdPPConnector > m_pPConnector
const std::vector< SCT_FwdModule * > & m_modules
double innerRadius() const
bool m_optoHarnessPresent
std::vector< int > m_patchPanelType
double m_outerRadius
std::vector< bool > m_patchPanelRepeatQuadrant
std::vector< std::unique_ptr< SCT_FwdFSI > > m_fsiType
bool m_pPConnectorPresent
int m_numPatchPanelTypes
std::unique_ptr< SCT_FwdDiscSupport > m_discSupport
virtual const GeoLogVol * preBuild()
double m_thicknessBack
double m_innerRadius
double m_safety
std::vector< int > m_ringType
std::unique_ptr< SCT_FwdDiscFixation > m_discFixation
int m_numPatchPanelLocs
double m_thickness
double m_zPosition
const SCT_FwdRing * ring(int i)
std::vector< double > m_discFixationLocAngle
std::vector< double > m_patchPanelLocAngle
const std::vector< const FSIDetails * > * m_fsiVector
bool m_discFixationPresent
double outerRadius() const
double m_thicknessFront
SCT_UniqueComponentFactory(const std::string &name, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials=nullptr, GeoModelIO::ReadGeoModel *sqliteReader=nullptr, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV=nullptr, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX=nullptr)
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
STL namespace.