ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_InterLink.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "SCT_InterLink.h"
6
8
11
12#include "GeoModelKernel/GeoTube.h"
13#include "GeoModelKernel/GeoTubs.h"
14#include "GeoModelKernel/GeoLogVol.h"
15#include "GeoModelKernel/GeoPhysVol.h"
16#include "GeoModelKernel/GeoTransform.h"
17#include "GaudiKernel/SystemOfUnits.h"
18
19SCT_InterLink::SCT_InterLink(const std::string & name,
20 InDetDD::SCT_DetectorManager* detectorManager,
21 SCT_GeometryManager* geometryManager,
22 SCT_MaterialManager* materials)
23 : SCT_SharedComponentFactory(name, detectorManager, geometryManager, materials),
24 m_interLinkShape(nullptr),
25 m_interLinkLog(nullptr),
26 m_interLink(nullptr),
27 m_interLinkSegShape(nullptr),
28 m_interLinkSegLog(nullptr),
29 m_interLinkSeg(nullptr),
30 m_bearingShape(nullptr),
31 m_bearingLog(nullptr),
32 m_bearing(nullptr),
33 m_FSIFlangeShape(nullptr),
34 m_FSIFlangeLog(nullptr),
35 m_FSIFlange(nullptr)
36{
39}
40
42
43void
45{
46 const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters();
47
48 // Interlink parameters
49 m_materialName = parameters->interLinkMaterial();
50 m_length = parameters->interLinkDeltaZ();
51 m_innerRadius = parameters->interLinkInnerRadius();
52 m_outerRadius = parameters->interLinkOuterRadius();
53 m_dPhi = parameters->interLinkDeltaPhi();
54 m_phiPos = parameters->interLinkPhiPos();
55 m_nRepeat = parameters->interLinkNRepeat();
56
57 // FSIFlange parameters: only for non-uniform interlink
58 if(m_nRepeat > 1) {
59 m_includeFSIFlange = parameters->includeFSI();
60 }
61 else {
62 m_includeFSIFlange = false;
63 }
65 m_innerRadiusFSIFlange = parameters->fsiFlangeInnerRadius();
66 m_outerRadiusFSIFlange = parameters->fsiFlangeOuterRadius();
67 m_materialNameFSIFlange = parameters->fsiFlangeMaterial();
68 }
69
70 // B6 bearing parameters: only for non-uniform interlink
71 if(m_nRepeat > 1) {
72 m_materialNameBearing = parameters->bearingMaterial();
75 m_outerRadiusBearing = parameters->thermalShieldBulkheadInnerRadius();
76 m_dPhiBearing = parameters->bearingDeltaPhi();
77 m_phiPosBearing = parameters->bearingPhiPos();
78 m_nRepeatBearing = parameters->bearingNRepeat();
79 }
80
81}
82
83GeoVPhysVol *
85{
86 // Make the interlink.
87 if(m_nRepeat == 1) {
88 // For old geometry interlink is a simple tube of material
90 const GeoMaterial* material = m_materials->getMaterialForVolume(m_materialName, m_interLinkShape->volume());
91 if(!material) {material = m_materials->getMaterial(m_materialName);}
92 m_interLinkLog = new GeoLogVol(getName(), m_interLinkShape, material);
93 m_interLink = new GeoPhysVol(m_interLinkLog);
94 }
95
96 else {
97 // In updated version we make air tube containing interlink segments and B6 bearings
98 // And also include FSI flange segments if defined
99 // Air tube:
101 m_interLinkLog = new GeoLogVol(getName(), m_interLinkShape, m_materials->gasMaterial());
102 m_interLink = new GeoPhysVol(m_interLinkLog);
103
104 // Interlink segments:
105 m_interLinkSegShape = new GeoTubs(m_innerRadius, m_outerRadius, 0.5*m_length, - 0.5*m_dPhi*Gaudi::Units::radian, m_dPhi*Gaudi::Units::radian);
106 m_interLinkSegLog = new GeoLogVol("InterlinkSegment", m_interLinkSegShape, m_materials->getMaterialForVolume(m_materialName, m_interLinkSegShape->volume()));
107 m_interLinkSeg = new GeoPhysVol(m_interLinkSegLog);
108
109 for(int i=0; i<m_nRepeat; i++) {
110 double interlinkAngle = m_phiPos + (i * 360./m_nRepeat)*Gaudi::Units::deg;
111 GeoTransform* geoTransform = new GeoTransform(GeoTrf::RotateZ3D(interlinkAngle));
112 m_geoTransforms.push_back(geoTransform);
113 m_interLink->add(geoTransform);
115 }
116
117 // B6 bearings
118 m_bearingShape = new GeoTubs(m_innerRadiusBearing, m_outerRadiusBearing, 0.5*m_lengthBearing, - 0.5*m_dPhiBearing*Gaudi::Units::radian, m_dPhiBearing*Gaudi::Units::radian);
119 m_bearingLog = new GeoLogVol("Bearing", m_bearingShape, m_materials->getMaterialForVolume(m_materialNameBearing, m_bearingShape->volume()));
120 m_bearing = new GeoPhysVol(m_bearingLog);
121
122 for(int i=0; i<m_nRepeatBearing; i++) {
123 double bearingAngle = m_phiPosBearing + (i * 360./m_nRepeatBearing)*Gaudi::Units::deg;
124 GeoTransform* geoTransform = new GeoTransform(GeoTrf::RotateZ3D(bearingAngle));
125 m_geoTransforms.push_back(geoTransform);
126 m_interLink->add(geoTransform);
128 }
129
130 // FSI Flange segments:
131 // These exactly fill gaps between interlink segments, with smaller radial extent
133 double dPhiFSI = (360./m_nRepeat)*Gaudi::Units::deg - m_dPhi;
134 m_FSIFlangeShape = new GeoTubs(m_innerRadiusFSIFlange, m_outerRadiusFSIFlange, 0.5*m_length, - 0.5*dPhiFSI*Gaudi::Units::radian, dPhiFSI*Gaudi::Units::radian);
135 m_FSIFlangeLog = new GeoLogVol("FSIFlangeSegment", m_FSIFlangeShape, m_materials->getMaterialForVolume(m_materialNameFSIFlange, m_FSIFlangeShape->volume()));
136 m_FSIFlange = new GeoPhysVol(m_FSIFlangeLog);
137
138 for(int i=0; i<m_nRepeat; i++) {
139 double phiPosFSI = m_phiPos + (180./m_nRepeat)*Gaudi::Units::deg;
140 double FSIFlangeAngle = phiPosFSI + (i * 360./m_nRepeat)*Gaudi::Units::deg;
141 GeoTransform* geoTransform = new GeoTransform(GeoTrf::RotateZ3D(FSIFlangeAngle));
142 m_geoTransforms.push_back(geoTransform);
143 m_interLink->add(geoTransform);
145 }
146 }
147 }
148
149 return m_interLink;
150}
151
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
const std::string & getName() const
SCT_GeometryManager * m_geometryManager
SCT_MaterialManager * m_materials
SCT_SharedComponentFactory(const std::string &name, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials=nullptr)