136{
137 GeoFullPhysVol * forward=nullptr;
139 {
141
142 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
143
144 SCT_FwdWheel * wheel =
m_wheels[iWheel].get();
146 forward->add(new GeoNameTag(std::format("Wheel#{}",iWheel)));
147 forward->add(new GeoIdentifierTag(iWheel));
148 GeoAlignableTransform *
transform =
new GeoAlignableTransform(GeoTrf::TranslateZ3D(zpos));
149 forward->add(transform);
150 id.setLayerDisk(iWheel);
151 GeoVPhysVol * wheelPV = wheel->
build(
id);
152 forward->add(wheelPV);
153
154
155 m_detectorManager->addAlignableTransform(2,
id.getWaferId(), transform, wheelPV);
156 }
157
158
159
160
162 double supportFrameZPos = supportFrame.zPosition() -
zCenter();
163 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(supportFrameZPos)));
164 forward->add(supportFrame.getVolume());
165
166
167
169
170
171 SCT_FwdCylinderServices cylinderServices("CylinderServices",
172 supportFrame.outerRadius(),
174 supportFrame.length(),
176 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(supportFrameZPos)));
177 forward->add(cylinderServices.getVolume());
178
179 } else {
180
181
182
183
184
185 {
186
188
189
190
191
193
194
195 double rStart = innerRadiusCooling;
196
197 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
198
199 double startPos =
m_wheels[iWheel]->zPosition();
200
201
202 int numPipes = 8 *
m_wheels[iWheel]->numRings();
203
204
205 SCT_FwdCoolingPipe coolingPipe(std::format("OffDiskCoolingPipeW{}",iWheel),
206 numPipes, rStart, startPos, endPos,
208
209
210 double coolingPipeZPos = coolingPipe.zPosition() -
zCenter();
211 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(coolingPipeZPos)));
212 forward->add(coolingPipe.getVolume());
213
214
215 rStart = coolingPipe.outerRadius();
216
217 }
218 }
219
220
221
222
223 {
224
225
227
228
229
230
231 double innerRadiusPowerTapes = 0.5*(supportFrame.outerRadius() +
m_outerRadius) - 1*Gaudi::Units::mm;
232
233
234 double rStart = innerRadiusPowerTapes;
235
236 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
237
238
239 double startPos =
m_wheels[iWheel]->zPosition();
240
241
242 int numModules =
m_wheels[iWheel]->totalModules();
243
244
245 SCT_FwdPowerTape powerTape(std::format("OffDiskPowerTapeW{}",iWheel),
246 numModules, rStart, startPos, endPos,
248
249
250 double powerTapeZPos = powerTape.zPosition() -
zCenter();
251 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(powerTapeZPos)));
252 forward->add(powerTape.getVolume());
253
254
255 rStart = powerTape.outerRadius();
256 }
257 }
258 }
259
260
261
262
264 SCT_FwdThermalShieldElement thermalShieldElement(std::format("FwdThermalShieldElement{}",iElement),
266 double elementZPos = thermalShieldElement.zPosition() -
zCenter();
267 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(elementZPos)));
268 forward->add(thermalShieldElement.getVolume());
269 }
270
271
273 xMat.add(forward,
"SCTEndcap",
zCenter());
275 xMat.add(forward,
"SCTEndcapA",
zCenter());
276 } else {
277 xMat.add(forward,
"SCTEndcapC",
zCenter());
278 }
279
280 }
281 else {
282 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
283 SCT_FwdWheel * wheel =
m_wheels[iWheel].get();
284 id.setLayerDisk(iWheel);
286
287
288 std::string
key = std::format(
"Wheel#{}_{}",iWheel,
id.getBarrelEC());
290 }
292 forward= (*m_mapFPV)["SCTEndcapA"];
293 } else {
294 forward= (*m_mapFPV)["SCTEndcapC"];
295 }
296
297 }
298 return forward;
299}
InDetDD::SCT_DetectorManager * m_detectorManager
SCT_GeometryManager * m_geometryManager
SCT_MaterialManager * m_materials
std::vector< std::unique_ptr< SCT_FwdWheel > > m_wheels
bool m_cylinderServicesPresent
int m_numThermalShieldElements
double m_outerRadiusCylinderServices
double m_coolingPipeRadius
virtual GeoVPhysVol * build(SCT_Identifier id)
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.