133{
134 GeoFullPhysVol * forward=nullptr;
136 {
138
139 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
140
141 SCT_FwdWheel * wheel =
m_wheels[iWheel].get();
142 std::ostringstream wheelName; wheelName << "Wheel#" << iWheel;
144 forward->add(new GeoNameTag(wheelName.str()));
145 forward->add(new GeoIdentifierTag(iWheel));
146 GeoAlignableTransform *
transform =
new GeoAlignableTransform(GeoTrf::TranslateZ3D(zpos));
147 forward->add(transform);
148 id.setLayerDisk(iWheel);
149 GeoVPhysVol * wheelPV = wheel->
build(
id);
150 forward->add(wheelPV);
151
152
153 m_detectorManager->addAlignableTransform(2,
id.getWaferId(), transform, wheelPV);
154 }
155
156
157
158
160 double supportFrameZPos = supportFrame.zPosition() -
zCenter();
161 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(supportFrameZPos)));
162 forward->add(supportFrame.getVolume());
163
164
165
167
168
169 SCT_FwdCylinderServices cylinderServices("CylinderServices",
170 supportFrame.outerRadius(),
172 supportFrame.length(),
174 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(supportFrameZPos)));
175 forward->add(cylinderServices.getVolume());
176
177 } else {
178
179
180
181
182
183 {
184
186
187
188
189
191
192
193 double rStart = innerRadiusCooling;
194
195 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
196
197 double startPos =
m_wheels[iWheel]->zPosition();
198
199
200 int numPipes = 8 *
m_wheels[iWheel]->numRings();
201
202
203 SCT_FwdCoolingPipe coolingPipe(
"OffDiskCoolingPipeW"+
intToString(iWheel),
204 numPipes, rStart, startPos, endPos,
206
207
208 double coolingPipeZPos = coolingPipe.zPosition() -
zCenter();
209 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(coolingPipeZPos)));
210 forward->add(coolingPipe.getVolume());
211
212
213 rStart = coolingPipe.outerRadius();
214
215 }
216 }
217
218
219
220
221 {
222
223
225
226
227
228
229 double innerRadiusPowerTapes = 0.5*(supportFrame.outerRadius() +
m_outerRadius) - 1*Gaudi::Units::mm;
230
231
232 double rStart = innerRadiusPowerTapes;
233
234 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
235
236
237 double startPos =
m_wheels[iWheel]->zPosition();
238
239
240 int numModules =
m_wheels[iWheel]->totalModules();
241
242
243 SCT_FwdPowerTape powerTape(
"OffDiskPowerTapeW"+
intToString(iWheel),
244 numModules, rStart, startPos, endPos,
246
247
248 double powerTapeZPos = powerTape.zPosition() -
zCenter();
249 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(powerTapeZPos)));
250 forward->add(powerTape.getVolume());
251
252
253 rStart = powerTape.outerRadius();
254 }
255 }
256 }
257
258
259
260
262 SCT_FwdThermalShieldElement thermalShieldElement(
"FwdThermalShieldElement"+
intToString(iElement),
264 double elementZPos = thermalShieldElement.zPosition() -
zCenter();
265 forward->add(new GeoTransform(GeoTrf::TranslateZ3D(elementZPos)));
266 forward->add(thermalShieldElement.getVolume());
267 }
268
269
271 xMat.add(forward,
"SCTEndcap",
zCenter());
273 xMat.add(forward,
"SCTEndcapA",
zCenter());
274 } else {
275 xMat.add(forward,
"SCTEndcapC",
zCenter());
276 }
277
278 }else
279 {
280 for (
int iWheel = 0; iWheel <
m_numWheels; iWheel++){
281
282 SCT_FwdWheel * wheel =
m_wheels[iWheel].get();
283 std::ostringstream wheelName; wheelName << "Wheel#" << iWheel;
284 id.setLayerDisk(iWheel);
286
287 std::string
key=wheelName.str()+
"_"+std::to_string(
id.getBarrelEC());
288
289
291 }
293 forward= (*m_mapFPV)["SCTEndcapA"];
294 } else {
295 forward= (*m_mapFPV)["SCTEndcapC"];
296 }
297
298 }
299 return forward;
300}
std::string intToString(int i) const
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.