103{
104 const double rphiClearance = 0.5*Gaudi::Units::mm;
105 const double radialClearance = 0.5*Gaudi::Units::mm;
106
107
108
114
115
116 int tiltSign = (
m_tilt < 0) ? -1 : +1;
117
118
119
120
121
122
124
125 double yModuleOffset = 0.0;
126
127
128
129
130
131
132
133
137
138
139
140
141
143
144
146
148
149
150
151
154 m_coolingPipePos =
new GeoTransform(GeoTrf::Translate3D(xCoolingPipePos, yCoolingPipePos, 0));
155
156
157
158
160
162
163
164
165
166
167 double xModulePos = stagger_sign * xModuleOffset;
168 double yModulePos = yModuleOffset;
169 double zModulePos =
m_zPos[iModule];
170
171
172
174 GeoTrf::Translation3D
pos(xModulePos, yModulePos, zModulePos);
175 m_modulePos.push_back(GeoTrf::Transform3D(pos*rot));
176
177
178
179
180
181 double xCoolingBlockPos = xCoolingBlockOffset + xModulePos;
182 double yCoolingBlockPos = yCoolingBlockOffset + yModulePos;
183 double zCoolingBlockPos = zCoolingBlockOffset + zModulePos;
184 m_coolingBlockPos.push_back(
new GeoTransform(GeoTrf::Translate3D(xCoolingBlockPos, yCoolingBlockPos, zCoolingBlockPos)));
185
186
187
188
189
190 double xDoglegPos = xDoglegOffset + xModulePos;
191 double yDoglegPos = yDoglegOffset + yModulePos;
192 double zDoglegPos = zDoglegOffset + zModulePos;
193 m_doglegPos.push_back(
new GeoTransform(GeoTrf::Translate3D(xDoglegPos, yDoglegPos, zDoglegPos)));
194
195
196 stagger_sign = - stagger_sign;
197
198
199 }
200
201
202
203
204
205
206 GeoTrf::Vector3D
c0(0.0,
209 GeoTrf::Vector3D
c1(0.0,
212 GeoTrf::Vector3D
c2(0.0,
215 GeoTrf::Vector3D
c3(0.0,
218 GeoTrf::Vector3D c4(0.0,
221 GeoTrf::Vector3D c5(0.0,
224 GeoTrf::Vector3D c6(0.0,
227 GeoTrf::Vector3D c7(0.0,
230
231 double moduleYMax = c4.y();
232 double moduleYMin = c5.y();
241
242 moduleYMax = std::max(std::max(
c0.y(), c4.y()), std::max(c7.y(),
c3.y()));
243 moduleYMin = std::min(std::min(
c1.y(), c5.y()), std::min(c6.y(),
c2.y()));
244
245 double skiWidth = moduleYMax - moduleYMin + 2*rphiClearance;
246
247
248
249
250 double skiThickness =
m_module->thickness() + 2 * std::abs(xModuleOffset) + radialClearance;
251
252
253
254
255
256
257
258
259
260 double xmax1 = 0.5*skiThickness;
261 double xmin1 = -xModuleOffset + xDoglegOffset - 0.5*
m_dogleg->thickness();
262 double xmax2 = xmax1;
263 double xmin2 = xCoolingPipePos -
m_coolingPipe->pipeRadius();
264
265
266
267 double ymax1 = moduleYMax + rphiClearance;
268 double ymin1 = moduleYMin - rphiClearance;
269 double ymin2,ymax2;
270 if (tiltSign > 0) {
271 ymax2 = std::max(-yModuleOffset + yCoolingBlockOffset + 0.5*
m_coolingBlock->width(),
273 ymin2 = ymin1;
274 } else {
275 ymax2 = ymax1;
276 ymin2 = std::min(-yModuleOffset + yCoolingBlockOffset - 0.5*
m_coolingBlock->width(),
278 }
279
280
281
286
291
292 double xCenter = 0.5*(xmin1+xmax1);
293 double yCenter = 0.5*(ymin1+ymax1);
294 double xShift2 = 0.5*(xmin2+xmax2) - xCenter;
295 double yShift2 = 0.5*(ymin2+ymax2) - yCenter;
296
298
305
306 GeoBox * envelope1 =
new GeoBox(0.5 * (xmax1-xmin1), 0.5 * (ymax1-ymin1), 0.5 *
m_length);
307 GeoBox * envelope2 =
new GeoBox(0.5 * (xmax2-xmin2), 0.5 * (ymax2-ymin2), 0.5 *
m_length);
308
309 const GeoShape * skiEnvelopeShape = nullptr;
310
311 const GeoShape & tmpShape = (*envelope1).
312 add(*envelope2 << GeoTrf::Translate3D(xShift2, yShift2, 0));
313 skiEnvelopeShape = &tmpShape;
314
315 GeoLogVol * skiLog =
new GeoLogVol(
getName(), skiEnvelopeShape,
m_materials->gasMaterial());
316
317
319
320 std::ostringstream
name;
323 }
324
325
326
327
330
331
332
333
334
335 return skiLog;
336
337}
const std::string & getName() const
SCT_MaterialManager * m_materials
double doglegOffsetY() const
double coolingBlockOffsetY() const
double coolingBlockOffsetZ() const
double coolingBlockOffsetX() const
double coolingPipeOffsetY() const
double doglegOffsetX() const
double coolingPipeOffsetX() const
bool add(const std::string &hname, TKey *tobj)