Project
Loading...
Searching...
No Matches
HeatExchanger.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13
15#include "MFTBase/Constants.h"
16#include "MFTBase/Geometry.h"
18#include "TGeoBBox.h"
19#include "TGeoBoolNode.h"
20#include "TGeoCompositeShape.h"
21#include "TGeoCone.h"
22#include "TGeoManager.h"
23#include "TGeoTorus.h"
24#include "TGeoTube.h"
25#include "TGeoVolume.h"
26#include "TMath.h"
27#include <fairlogger/Logger.h>
28
29using namespace o2::mft;
30
32
33//_____________________________________________________________________________
35 : mHalfDisk(nullptr), mHalfDiskRotation(nullptr), mHalfDiskTransformation(nullptr), mRWater(0.), mDRPipe(0.), mHeatExchangerThickness(0.), mCarbonThickness(0.), mHalfDiskGap(0.), mRohacellThickness(0.), mNPart(), mRMin(), mZPlan(), mSupportXDimensions(), mSupportYDimensions(), mLWater0(), mXPosition0(), mAngle0(), mRadius0(), mLpartial0(), mLWater1(), mXPosition1(), mAngle1(), mRadius1(), mLpartial1(), mLWater2(), mXPosition2(), mAngle2(), mRadius2(), mLpartial2(), mLWater3(), mXPosition3(), mAngle3(), mRadius3(), mLpartial3(), mRadius3fourth(), mAngle3fourth(), mBeta3fourth(), mLWater4(), mXPosition4(), mAngle4(), mRadius4(), mLpartial4(), mAngle4fifth(), mRadius4fifth()
36{
37 auto& mftBaseParam = MFTBaseParam::Instance();
38
39 mRWater = 0.1 / 2.; // water pipe diameter 1 mm
40 mDRPipe = 0.0025; // water pipe thickness 25 microns
41
42 // for the chips aligment --> decrease of the HE thickness then increase of
43 // the rohacell density
44 Double_t decreaseHE = 0.0;
45 if (mftBaseParam.buildAlignment) {
46 decreaseHE = 0.4;
47 }
48 mHeatExchangerThickness = 1.398 - decreaseHE;
49 mCarbonThickness = (0.0290) / 2.; // half thickness of the carbon plate
50 initParameters();
51}
52
53//_____________________________________________________________________________
54HeatExchanger::HeatExchanger(Double_t rWater, Double_t dRPipe,
55 Double_t heatExchangerThickness,
56 Double_t carbonThickness)
57 : mHalfDisk(nullptr), mHalfDiskRotation(nullptr), mHalfDiskTransformation(nullptr), mRWater(rWater), mDRPipe(dRPipe), mHeatExchangerThickness(heatExchangerThickness), mCarbonThickness(carbonThickness), mHalfDiskGap(0.), mRohacellThickness(0.), mNPart(), mRMin(), mZPlan(), mSupportXDimensions(), mSupportYDimensions(), mXPosition0(), mAngle0(), mRadius0(), mLpartial0(), mLWater1(), mXPosition1(), mAngle1(), mRadius1(), mLpartial1(), mLWater2(), mXPosition2(), mAngle2(), mRadius2(), mLpartial2(), mLWater3(), mXPosition3(), mAngle3(), mRadius3(), mLpartial3(), mRadius3fourth(), mAngle3fourth(), mBeta3fourth(), mLWater4(), mXPosition4(), mAngle4(), mRadius4(), mLpartial4(), mAngle4fifth(), mRadius4fifth()
58{
59 initParameters();
60}
61
62//_____________________________________________________________________________
63TGeoVolumeAssembly* HeatExchanger::create(Int_t half, Int_t disk)
64{
65
66 Info("Create", Form("Creating HeatExchanger_%d_%d", disk, half), 0, 0);
67
68 mHalfDisk = new TGeoVolumeAssembly(Form("HeatExchanger_%d_%d", disk, half));
69 switch (disk) {
70 case 0:
71 createHalfDisk0(half);
72 break;
73 case 1:
74 createHalfDisk1(half);
75 break;
76 case 2:
77 createHalfDisk2(half);
78 break;
79 case 3:
80 createHalfDisk3(half);
81 break;
82 case 4:
83 createHalfDisk4(half);
84 break;
85 }
86
87 Info("Create", Form("... done HeatExchanger_%d_%d", disk, half), 0, 0);
88
89 return mHalfDisk;
90}
91
92//_____________________________________________________________________________
94{
95
97 // Manifold1
99
100 Double_t cornerRadiusTop[5];
101 cornerRadiusTop[0] = 0.2;
102 cornerRadiusTop[1] = 0.2;
103 cornerRadiusTop[2] = 0.2;
104 cornerRadiusTop[3] = 0.2;
105 cornerRadiusTop[4] = 0.2;
106
107 Double_t thicknessTop[5];
108 thicknessTop[0] = 0.2;
109 thicknessTop[1] = 0.2;
110 thicknessTop[2] = 0.2;
111 thicknessTop[3] = 0.2;
112 thicknessTop[4] = 0.2;
113
114 Double_t thicknessMiddle[5];
115 thicknessMiddle[0] = 0.2;
116 thicknessMiddle[1] = 0.2;
117 thicknessMiddle[2] = 0.2;
118 thicknessMiddle[3] = 0.2;
119 thicknessMiddle[4] = 0.2;
120
121 Double_t thicknessBottom[5];
122 thicknessBottom[0] = 0.6;
123 thicknessBottom[1] = 0.6;
124 thicknessBottom[2] = 0.6;
125 thicknessBottom[3] = 0.6;
126 thicknessBottom[4] = 0.6;
127
128 Double_t widthTop1[5];
129 widthTop1[0] = 1.8;
130 widthTop1[1] = 1.8;
131 widthTop1[2] = 1.8;
132 widthTop1[3] = 1.8;
133 widthTop1[4] = 1.8;
134
135 Double_t widthTop2;
136 widthTop2 = widthTop1[disk] - 2 * cornerRadiusTop[disk];
137
138 Double_t widthMiddle1[5];
139 widthMiddle1[0] = 2.2;
140 widthMiddle1[1] = 2.2;
141 widthMiddle1[2] = 2.2;
142 widthMiddle1[3] = 2.2;
143 widthMiddle1[4] = 2.2;
144
145 Double_t widthBottom1[5];
146 widthBottom1[0] = 1.32;
147 widthBottom1[1] = 1.32;
148 widthBottom1[2] = 1.32;
149 widthBottom1[3] = 1.32;
150 widthBottom1[4] = 1.32;
151
152 Double_t lengthTop1[5];
153 lengthTop1[0] = 5.91;
154 lengthTop1[1] = 5.91;
155 lengthTop1[2] = 5.91;
156 // lengthTop1[3] = 8.40;
157 // lengthTop1[4] = 8.40;
158 lengthTop1[3] = 5.91;
159 lengthTop1[4] = 5.91;
160
161 Double_t lengthTop2;
162 lengthTop2 = cornerRadiusTop[disk];
163
164 Double_t lengthMiddle1[5];
165 lengthMiddle1[0] = mSupportYDimensions[0][0];
166 lengthMiddle1[1] = mSupportYDimensions[1][0];
167 lengthMiddle1[2] = mSupportYDimensions[2][0];
168
169 lengthMiddle1[3] = mSupportYDimensions[3][0];
170 lengthMiddle1[4] = mSupportYDimensions[4][0];
171
172 Double_t lengthBottom1;
173 lengthBottom1 = lengthMiddle1[disk];
174
175 auto* Top1 = new TGeoBBox(Form("Top1MF%d", disk), lengthTop1[disk] / 2,
176 widthTop1[disk] / 2, thicknessTop[disk] / 2);
177 auto* Top2 = new TGeoBBox(Form("Top2MF%d", disk), lengthTop2 / 2,
178 widthTop2 / 2, thicknessTop[disk] / 2);
179 auto* Top3 = new TGeoTube(Form("Top3MF%d", disk), 0, cornerRadiusTop[disk],
180 thicknessTop[disk] / 2);
181 auto* Middle1 =
182 new TGeoBBox(Form("Middle1MF%d", disk), lengthMiddle1[disk] / 2,
183 widthMiddle1[disk] / 2, thicknessMiddle[disk] / 2);
184 auto* Bottom1 =
185 new TGeoBBox(Form("Bottom1MF%d", disk), lengthBottom1 / 2,
186 widthBottom1[disk] / 2, thicknessBottom[disk] / 2);
187
188 TGeoTranslation* tTop[7];
189 tTop[0] =
190 new TGeoTranslation(Form("tTop1MF%d", disk), 0., 0.,
191 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
192 tTop[1] = new TGeoTranslation(
193 Form("tTop2MF%d", disk), lengthTop1[disk] / 2 + lengthTop2 / 2, 0.,
194 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
195 tTop[2] =
196 new TGeoTranslation(Form("tTop3MF%d", disk), lengthTop1[disk] / 2,
197 widthTop1[disk] / 2 - cornerRadiusTop[disk],
198 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
199 tTop[3] =
200 new TGeoTranslation(Form("tTop4MF%d", disk), lengthTop1[disk] / 2,
201 -(widthTop1[disk] / 2 - cornerRadiusTop[disk]),
202 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
203 tTop[4] = new TGeoTranslation(
204 Form("tTop5MF%d", disk), -(lengthTop1[disk] / 2 + lengthTop2 / 2), 0.,
205 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
206 tTop[5] =
207 new TGeoTranslation(Form("tTop6MF%d", disk), -lengthTop1[disk] / 2,
208 widthTop1[disk] / 2 - cornerRadiusTop[disk],
209 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
210 tTop[6] =
211 new TGeoTranslation(Form("tTop7MF%d", disk), -lengthTop1[disk] / 2,
212 -(widthTop1[disk] / 2 - cornerRadiusTop[disk]),
213 thicknessMiddle[disk] / 2 + thicknessTop[disk] / 2);
214
215 for (Int_t i = 0; i < 7; ++i) {
216 tTop[i]->RegisterYourself();
217 }
218
219 TGeoTranslation* tMiddle1 =
220 new TGeoTranslation(Form("tMiddle1MF%d", disk), 0, 0, 0);
221 TGeoTranslation* tBottom1 = new TGeoTranslation(
222 Form("tBottom1MF%d", disk), 0, 0,
223 -(thicknessMiddle[disk] / 2 + thicknessBottom[disk] / 2));
224 tMiddle1->RegisterYourself();
225 tBottom1->RegisterYourself();
226
227 Double_t radiusPipeHole1[5];
228 radiusPipeHole1[0] = 0.192 / 2;
229 radiusPipeHole1[1] = 0.192 / 2;
230 radiusPipeHole1[2] = 0.192 / 2;
231 radiusPipeHole1[3] = 0.192 / 2;
232 radiusPipeHole1[4] = 0.192 / 2;
233
234 Double_t radiusPipeHole2[5];
235 radiusPipeHole2[0] = 0.300 / 2;
236 radiusPipeHole2[1] = 0.300 / 2;
237 radiusPipeHole2[2] = 0.300 / 2;
238 radiusPipeHole2[3] = 0.300 / 2;
239 radiusPipeHole2[4] = 0.300 / 2;
240
241 Double_t lengthPipeHole1[5];
242 lengthPipeHole1[0] = 0.95;
243 lengthPipeHole1[1] = 0.95;
244 lengthPipeHole1[2] = 0.95;
245 lengthPipeHole1[3] = 0.95;
246 lengthPipeHole1[4] = 0.95;
247
248 Double_t lengthPipeHole2 =
249 (thicknessTop[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) -
250 lengthPipeHole1[disk];
251
252 TGeoTube* Pipe1 =
253 new TGeoTube("Pipe1", 0, radiusPipeHole1[disk],
254 lengthPipeHole1[disk] / 2 + Geometry::sEpsilon);
255 TGeoCone* Pipe2 =
256 new TGeoCone("Pipe2", lengthPipeHole2 / 2 + Geometry::sEpsilon, 0,
257 radiusPipeHole1[disk], 0, radiusPipeHole2[disk]);
258
259 TGeoTranslation* tPipePart1 =
260 new TGeoTranslation(Form("tPipePart1MF%d", disk), 0, 0, 0);
261 TGeoTranslation* tPipePart2 =
262 new TGeoTranslation(Form("tPipePart2MF%d", disk), 0, 0,
263 lengthPipeHole1[disk] / 2 + lengthPipeHole2 / 2);
264 tPipePart1->RegisterYourself();
265 tPipePart2->RegisterYourself();
266
267 TGeoCompositeShape* shapePipe = new TGeoCompositeShape(
268 Form("shapePipeMF%d", disk),
269 Form("Pipe1:tPipePart1MF%d + Pipe2:tPipePart2MF%d", disk, disk));
270
271 Int_t nPipeRow[5];
272 nPipeRow[0] = 3;
273 nPipeRow[1] = 3;
274 nPipeRow[2] = 3;
275 nPipeRow[3] = 4;
276 nPipeRow[4] = 5;
277
278 TGeoTranslation* tPipe;
279
280 // The lengthBulge is a parameter for manifold2. This is required to tune the
281 // water pipe position.
282 Double_t lengthBulge[5];
283 lengthBulge[0] = 0.395;
284 lengthBulge[1] = 0.395;
285 lengthBulge[2] = 0.395;
286 lengthBulge[3] = 0.395;
287 lengthBulge[4] = 0.395;
288
289 Double_t offsetPipeRow[5][5] = {};
290 offsetPipeRow[0][0] = mXPosition0[0] - lengthBulge[0] / 2;
291 offsetPipeRow[0][1] = mXPosition0[1] - lengthBulge[0] / 2;
292 offsetPipeRow[0][2] = mXPosition0[2] - lengthBulge[0] / 2;
293
294 offsetPipeRow[1][0] = mXPosition1[0] - lengthBulge[1] / 2;
295 offsetPipeRow[1][1] = mXPosition1[1] - lengthBulge[1] / 2;
296 offsetPipeRow[1][2] = mXPosition1[2] - lengthBulge[1] / 2;
297
298 offsetPipeRow[2][0] = mXPosition2[0] - lengthBulge[2] / 2;
299 offsetPipeRow[2][1] = mXPosition2[1] - lengthBulge[2] / 2;
300 offsetPipeRow[2][2] = mXPosition2[2] - lengthBulge[2] / 2;
301
302 offsetPipeRow[3][0] = mXPosition3[0] - lengthBulge[3] / 2;
303 offsetPipeRow[3][1] = mXPosition3[1] - lengthBulge[3] / 2;
304 offsetPipeRow[3][2] = mXPosition3[2] - lengthBulge[3] / 2;
305 offsetPipeRow[3][3] = mXPosition3[3] - lengthBulge[3] / 2;
306
307 offsetPipeRow[4][0] = mXPosition4[0] - lengthBulge[4] / 2;
308 offsetPipeRow[4][1] = mXPosition4[1] - lengthBulge[4] / 2;
309 offsetPipeRow[4][2] = mXPosition4[2] - lengthBulge[4] / 2;
310 offsetPipeRow[4][3] = mXPosition4[3] - lengthBulge[4] / 2;
311 offsetPipeRow[4][4] = mXPosition4[4] - lengthBulge[4] / 2;
312
313 Double_t deltaz = mHeatExchangerThickness -
315 2 * mCarbonThickness;
316
317 Double_t lengthTwoPipeCol[5];
318 lengthTwoPipeCol[0] = mZPlan[disk] + deltaz / 2. - mCarbonThickness -
319 mRWater - mDRPipe -
322 lengthTwoPipeCol[1] = mZPlan[disk] + deltaz / 2. - mCarbonThickness -
323 mRWater - mDRPipe -
326 lengthTwoPipeCol[2] = mZPlan[disk] + deltaz / 2. - mCarbonThickness -
327 mRWater - mDRPipe -
330 lengthTwoPipeCol[3] = mZPlan[disk] + deltaz / 2. - mCarbonThickness -
331 mRWater - mDRPipe -
334 lengthTwoPipeCol[4] = mZPlan[disk] + deltaz / 2. - mCarbonThickness -
335 mRWater - mDRPipe -
338
339 TString namePipe = "";
340
341 for (Int_t iPipeRow = 0; iPipeRow < nPipeRow[disk]; iPipeRow++) {
342 tPipe = new TGeoTranslation(
343 Form("tPipe%dMF%d", iPipeRow + 1, disk),
344 lengthMiddle1[disk] / 2 - offsetPipeRow[disk][iPipeRow], 0, 0);
345 tPipe->RegisterYourself();
346
347 if (iPipeRow == nPipeRow[disk] - 1) {
348 namePipe += Form("shapePipeMF%d:tPipe%dMF%d", disk, iPipeRow + 1, disk);
349 } else {
350 namePipe += Form("shapePipeMF%d:tPipe%dMF%d +", disk, iPipeRow + 1, disk);
351 }
352 }
353
354 TGeoCompositeShape* posiPipeOneCol =
355 new TGeoCompositeShape(Form("posiPipeOneColMF%d", disk), namePipe);
356
357 tPipe = new TGeoTranslation(Form("tPipeLeftMF%d", disk), 0,
358 -lengthTwoPipeCol[disk], 0);
359 tPipe->RegisterYourself();
360 tPipe = new TGeoTranslation(Form("tPipeRightMF%d", disk), 0,
361 lengthTwoPipeCol[disk], 0);
362 tPipe->RegisterYourself();
363
364 TGeoCompositeShape* shapePipes = new TGeoCompositeShape(
365 Form("shapePipesMF%d", disk), Form("posiPipeOneColMF%d:tPipeLeftMF%d + "
366 "posiPipeOneColMF%d:tPipeRightMF%d",
367 disk, disk, disk, disk));
368 TGeoCompositeShape* shapeBase = new TGeoCompositeShape(
369 Form("shapeBaseMF%d", disk),
370 Form("Top1MF%d:tTop1MF%d + Top2MF%d:tTop2MF%d + Top3MF%d:tTop3MF%d + "
371 "Top3MF%d:tTop4MF%d + Top2MF%d:tTop5MF%d + Top3MF%d:tTop6MF%d + "
372 "Top3MF%d:tTop7MF%d + Middle1MF%d:tMiddle1MF%d + "
373 "Bottom1MF%d:tBottom1MF%d",
374 disk, disk, disk, disk, disk, disk, disk, disk, disk, disk, disk,
375 disk, disk, disk, disk, disk, disk, disk));
376
377 TGeoTranslation* tBase = new TGeoTranslation(
378 Form("tBaseMF%d", disk), 0, 0,
379 -((thicknessTop[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) /
380 2 -
381 (thicknessBottom[disk] + thicknessMiddle[disk] / 2)));
382 tBase->RegisterYourself();
383 TGeoTranslation* tPipes =
384 new TGeoTranslation(Form("tPiesMF%d", disk), 0, 0,
385 -((lengthPipeHole1[disk] + lengthPipeHole2) / 2 -
386 lengthPipeHole1[disk] / 2));
387 tPipes->RegisterYourself();
388
389 TGeoCompositeShape* shapeManifold1 = new TGeoCompositeShape(
390 Form("shapeManifold1MF%d", disk),
391 Form("shapeBaseMF%d:tBaseMF%d - shapePipesMF%d:tPiesMF%d", disk, disk,
392 disk, disk));
393
395 // Manifold2
397
398 Double_t lengthBody;
399 lengthBody = lengthMiddle1[disk];
400 Double_t widthBody;
401 widthBody = widthMiddle1[disk];
402 Double_t thicknessBody[5];
403 thicknessBody[0] = 0.8;
404 thicknessBody[1] = 0.8;
405 thicknessBody[2] = 0.8;
406 thicknessBody[3] = 0.8;
407 thicknessBody[4] = 0.8;
408
409 Double_t cornerRadiusBodyBathtub1[5];
410 cornerRadiusBodyBathtub1[0] = cornerRadiusTop[disk];
411 cornerRadiusBodyBathtub1[1] = cornerRadiusTop[disk];
412 cornerRadiusBodyBathtub1[2] = cornerRadiusTop[disk];
413 cornerRadiusBodyBathtub1[3] = cornerRadiusTop[disk];
414 cornerRadiusBodyBathtub1[4] = cornerRadiusTop[disk];
415
416 Double_t lengthBodyBathtub1;
417 lengthBodyBathtub1 = lengthTop1[disk];
418 Double_t widthBodyBathtub1;
419 widthBodyBathtub1 = widthTop1[disk];
420 Double_t thicknessBodyBathtub1[5];
421 thicknessBodyBathtub1[0] = 0.4;
422 thicknessBodyBathtub1[1] = 0.4;
423 thicknessBodyBathtub1[2] = 0.4;
424 thicknessBodyBathtub1[3] = 0.4;
425 thicknessBodyBathtub1[4] = 0.4;
426
427 Double_t lengthBodyBathtub2;
428 lengthBodyBathtub2 = cornerRadiusBodyBathtub1[disk];
429 Double_t widthBodyBathtub2;
430 widthBodyBathtub2 = widthTop1[disk] - 2 * cornerRadiusBodyBathtub1[disk];
431 Double_t thicknessBodyBathtub2[5];
432 thicknessBodyBathtub2[0] = 0.4;
433 thicknessBodyBathtub2[1] = 0.4;
434 thicknessBodyBathtub2[2] = 0.4;
435 thicknessBodyBathtub2[3] = 0.4;
436 thicknessBodyBathtub2[4] = 0.4;
437
438 auto* coverBody1 = new TGeoBBox(Form("coverBody1MF%d", disk), lengthBody / 2,
439 widthBody / 2, thicknessBody[disk] / 2);
440
441 auto* coverBodyBathtub1 =
442 new TGeoBBox(Form("coverBodyBathtub1MF%d", disk),
443 lengthBodyBathtub1 / 2 + Geometry::sEpsilon,
444 widthBodyBathtub1 / 2 + Geometry::sEpsilon,
445 thicknessBodyBathtub1[disk] / 2 + Geometry::sEpsilon);
446 auto* coverBodyBathtub2 =
447 new TGeoBBox(Form("coverBodyBathtub2MF%d", disk),
448 lengthBodyBathtub2 / 2 + Geometry::sEpsilon,
449 widthBodyBathtub2 / 2 + Geometry::sEpsilon,
450 thicknessBodyBathtub2[disk] / 2 + Geometry::sEpsilon);
451 auto* coverBodyBathtub3 =
452 new TGeoTube(Form("coverBodyBathtub3MF%d", disk), 0,
453 cornerRadiusBodyBathtub1[disk] + Geometry::sEpsilon,
454 thicknessBodyBathtub2[disk] / 2 + Geometry::sEpsilon);
455
456 TGeoTranslation* tcoverBodyBathtub[7];
457 tcoverBodyBathtub[0] =
458 new TGeoTranslation(Form("tcoverBodyBathtub1MF%d", disk), 0., 0., 0);
459
460 tcoverBodyBathtub[1] = new TGeoTranslation(
461 Form("tcoverBodyBathtub2MF%d", disk),
462 lengthBodyBathtub1 / 2 + lengthBodyBathtub2 / 2, 0., 0.);
463 tcoverBodyBathtub[2] = new TGeoTranslation(
464 Form("tcoverBodyBathtub3MF%d", disk), lengthBodyBathtub1 / 2,
465 widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk], 0.);
466 tcoverBodyBathtub[3] = new TGeoTranslation(
467 Form("tcoverBodyBathtub4MF%d", disk), lengthBodyBathtub1 / 2,
468 -(widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk]), 0.);
469
470 tcoverBodyBathtub[4] = new TGeoTranslation(
471 Form("tcoverBodyBathtub5MF%d", disk),
472 -(lengthBodyBathtub1 / 2 + lengthBodyBathtub2 / 2), 0., 0.);
473 tcoverBodyBathtub[5] = new TGeoTranslation(
474 Form("tcoverBodyBathtub6MF%d", disk), -(lengthBodyBathtub1 / 2),
475 widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk], 0.);
476 tcoverBodyBathtub[6] = new TGeoTranslation(
477 Form("tcoverBodyBathtub7MF%d", disk), -(lengthBodyBathtub1 / 2),
478 -(widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk]), 0.);
479
480 for (Int_t i = 0; i < 7; ++i) {
481 tcoverBodyBathtub[i]->RegisterYourself();
482 }
483
484 TGeoCompositeShape* shapeCoverBathtub = new TGeoCompositeShape(
485 Form("shapeCoverBathtubMF%d", disk),
486 Form("coverBodyBathtub1MF%d + "
487 "coverBodyBathtub2MF%d:tcoverBodyBathtub2MF%d + "
488 "coverBodyBathtub3MF%d:tcoverBodyBathtub3MF%d + "
489 "coverBodyBathtub3MF%d:tcoverBodyBathtub4MF%d + "
490 "coverBodyBathtub2MF%d:tcoverBodyBathtub5MF%d + "
491 "coverBodyBathtub3MF%d:tcoverBodyBathtub6MF%d + "
492 "coverBodyBathtub3MF%d:tcoverBodyBathtub7MF%d",
493 disk, disk, disk, disk, disk, disk, disk, disk, disk, disk, disk,
494 disk, disk));
495
496 TGeoTranslation* tcoverBathtub = new TGeoTranslation(
497 Form("tcoverBathtubMF%d", disk), 0, 0,
498 thicknessBody[disk] / 2 - thicknessBodyBathtub1[disk] / 2);
499 tcoverBathtub->RegisterYourself();
500
501 Double_t cornerRadiusStep1[5];
502 cornerRadiusStep1[0] = 0.2;
503 cornerRadiusStep1[1] = 0.2;
504 cornerRadiusStep1[2] = 0.2;
505 cornerRadiusStep1[3] = 0.2;
506 cornerRadiusStep1[4] = 0.2;
507
508 Double_t lengthStep1[5];
509 lengthStep1[0] = 5.61;
510 lengthStep1[1] = 5.61;
511 lengthStep1[2] = 5.61;
512 lengthStep1[3] = 5.61;
513 lengthStep1[4] = 5.61;
514 Double_t widthStep1[5];
515 widthStep1[0] = 1.40;
516 widthStep1[1] = 1.40;
517 widthStep1[2] = 1.40;
518 widthStep1[3] = 1.40;
519 widthStep1[4] = 1.40;
520 Double_t thicknessStep1[5];
521 thicknessStep1[0] = 0.2;
522 thicknessStep1[1] = 0.2;
523 thicknessStep1[2] = 0.2;
524 thicknessStep1[3] = 0.2;
525 thicknessStep1[4] = 0.2;
526
527 Double_t lengthStep2;
528 lengthStep2 = cornerRadiusStep1[disk];
529 Double_t widthStep2;
530 widthStep2 = widthStep1[disk] - cornerRadiusStep1[disk];
531 Double_t thicknessStep2;
532 thicknessStep2 = thicknessStep1[disk];
533
534 Double_t angleStep3 = 45. / 180. * TMath::Pi();
535 Double_t lengthStep3[5];
536 lengthStep3[0] = 0.3 / TMath::Cos(angleStep3);
537 lengthStep3[1] = 0.3 / TMath::Cos(angleStep3);
538 lengthStep3[2] = 0.3 / TMath::Cos(angleStep3);
539 lengthStep3[3] = 0.3 / TMath::Cos(angleStep3);
540 lengthStep3[4] = 0.3 / TMath::Cos(angleStep3);
541 Double_t widthStep3;
542 widthStep3 = 0.3 / TMath::Cos(angleStep3);
543 Double_t thicknessStep3;
544 thicknessStep3 = thicknessStep1[disk];
545
546 auto* coverBodyStep1 = new TGeoBBox(
547 Form("coverBodyStep1MF%d", disk),
548 (lengthStep1[disk] - cornerRadiusStep1[disk]) / 2 + Geometry::sEpsilon,
549 widthStep1[disk] / 2 + Geometry::sEpsilon,
550 thicknessStep1[disk] / 2 + Geometry::sEpsilon);
551 auto* coverBodyStep2 = new TGeoBBox(Form("coverBodyStep2MF%d", disk),
552 lengthStep2 / 2 + Geometry::sEpsilon,
553 widthStep2 / 2 + Geometry::sEpsilon,
554 thicknessStep2 / 2 + Geometry::sEpsilon);
555 auto* coverBodyStep3 =
556 new TGeoTube(Form("coverBodyStep3MF%d", disk), 0,
557 cornerRadiusStep1[disk] + Geometry::sEpsilon,
558 thicknessStep1[disk] / 2 + Geometry::sEpsilon);
559 auto* coverBodyStep4 =
560 new TGeoBBox(Form("coverBodyStep4MF%d", disk),
561 lengthStep3[disk] / 2 + Geometry::sEpsilon,
562 widthStep3 / 2 + Geometry::sEpsilon,
563 thicknessStep3 / 2 + Geometry::sEpsilon);
564
565 TGeoTranslation* tcoverBodyStep[4];
566 tcoverBodyStep[0] =
567 new TGeoTranslation(Form("tcoverBodyStep1MF%d", disk), 0., 0., 0);
568 tcoverBodyStep[1] = new TGeoTranslation(
569 Form("tcoverBodyStep2MF%d", disk),
570 (lengthStep1[disk] - cornerRadiusStep1[disk]) / 2 + lengthStep2 / 2,
571 cornerRadiusStep1[disk] / 2, 0.);
572 tcoverBodyStep[2] = new TGeoTranslation(
573 Form("tcoverBodyStep3MF%d", disk),
574 (lengthStep1[disk] - cornerRadiusStep1[disk]) / 2,
575 -(widthStep1[disk] / 2 - cornerRadiusStep1[disk]), 0.);
576 tcoverBodyStep[3] = new TGeoTranslation(
577 Form("tcoverBodyStep4MF%d", disk), -(lengthStep1[disk] - lengthStep2) / 2,
578 -widthStep1[disk] / 2, 0.);
579
580 TGeoRotation* rcoverBodyStep =
581 new TGeoRotation(Form("rcoverBodyStep4MF%d", disk), 45, 0, 0);
582 rcoverBodyStep->RegisterYourself();
583
584 TGeoCombiTrans* combtcoverBodyStep[4];
585 combtcoverBodyStep[3] =
586 new TGeoCombiTrans(Form("combtcoverBodyStep4MF%d", disk),
587 -(lengthStep1[disk] - lengthStep2) / 2,
588 -widthStep1[disk] / 2, 0., rcoverBodyStep);
589 combtcoverBodyStep[3]->RegisterYourself();
590
591 for (Int_t i = 0; i < 4; ++i) {
592 tcoverBodyStep[i]->RegisterYourself();
593 }
594
595 TGeoCompositeShape* shapeStep = new TGeoCompositeShape(
596 Form("shapeStepMF%d", disk),
597 Form("coverBodyStep1MF%d:tcoverBodyStep1MF%d + "
598 "coverBodyStep2MF%d:tcoverBodyStep2MF%d + "
599 "coverBodyStep3MF%d:tcoverBodyStep3MF%d + "
600 "coverBodyStep4MF%d:combtcoverBodyStep4MF%d",
601 disk, disk, disk, disk, disk, disk, disk, disk));
602
603 TGeoTranslation* tcoverStep = new TGeoTranslation(
604 Form("tcoverStepMF%d", disk),
605 -(lengthMiddle1[disk] / 2 - (lengthStep1[disk] / 2 - lengthStep2 / 2)),
606 (widthBody / 2 - widthStep1[disk] / 2),
607 -(thicknessBody[disk] / 2 - thicknessStep1[disk] / 2));
608 tcoverStep->RegisterYourself();
609
610 Double_t widthBulge[5];
611 widthBulge[0] = 0.50;
612 widthBulge[1] = 0.50;
613 widthBulge[2] = 0.50;
614 widthBulge[3] = 0.50;
615 widthBulge[4] = 0.50;
616 Double_t thicknessBulge;
617 thicknessBulge = thicknessBody[disk];
618 Double_t lengthBulgeSub[5];
619 lengthBulgeSub[0] = 0.2;
620 lengthBulgeSub[1] = 0.2;
621 lengthBulgeSub[2] = 0.2;
622 lengthBulgeSub[3] = 0.2;
623 lengthBulgeSub[4] = 0.2;
624 Double_t widthBulgeSub;
625 widthBulgeSub = lengthBulgeSub[disk];
626 Double_t thicknessBulgeSub[5];
627 thicknessBulgeSub[0] = 0.5;
628 thicknessBulgeSub[1] = 0.5;
629 thicknessBulgeSub[2] = 0.5;
630 thicknessBulgeSub[3] = 0.5;
631 thicknessBulgeSub[4] = 0.5;
632
633 auto* coverBodyBulge =
634 new TGeoBBox(Form("coverBodyBulgeMF%d", disk), lengthBulge[disk] / 2,
635 widthBulge[disk] / 2, thicknessBulge / 2);
636 auto* coverBodyBulgeSub = new TGeoBBox(
637 Form("coverBodyBulgeSubMF%d", disk), lengthBulgeSub[disk] / 2,
638 widthBulgeSub / 2, thicknessBulgeSub[disk] / 2 + Geometry::sEpsilon);
639
640 TGeoRotation* rcoverBodyBulgeSub =
641 new TGeoRotation(Form("rcoverBodyBulgeSubMF%d", disk), 0, 90, 45);
642 rcoverBodyBulgeSub->RegisterYourself();
643
644 TGeoTranslation* tcoverBodyBulgeSub = new TGeoTranslation(
645 Form("tcoverBodyBulgeSubMF%d", disk), -lengthBulge[disk] / 2, 0, 0);
646 tcoverBodyBulgeSub->RegisterYourself();
647
648 TGeoCombiTrans* combtcoverBodyBulgeSub =
649 new TGeoCombiTrans(Form("combtcoverBodyBulgeSubMF%d", disk),
650 -lengthBulge[disk] / 2, 0, 0, rcoverBodyBulgeSub);
651 combtcoverBodyBulgeSub->RegisterYourself();
652
653 TGeoCompositeShape* shapeBulge = new TGeoCompositeShape(
654 Form("shapeBulgeMF%d", disk),
655 Form("coverBodyBulgeMF%d - "
656 "coverBodyBulgeSubMF%d:combtcoverBodyBulgeSubMF%d",
657 disk, disk, disk));
658
659 TGeoTranslation* tcoverBulge =
660 new TGeoTranslation(Form("tcoverBulgeMF%d", disk),
661 -(lengthMiddle1[disk] / 2 + lengthBulge[disk] / 2),
662 -(widthBody / 2 - widthBulge[disk] / 2), 0);
663 tcoverBulge->RegisterYourself();
664
665 Double_t holeRadius[5];
666 holeRadius[0] = 0.25; // 0.207; overlap issue, fm
667 holeRadius[1] = 0.25; // 0.207;
668 holeRadius[2] = 0.25; // 0.207;
669 holeRadius[3] = 0.25; // 0.207;
670 holeRadius[4] = 0.25; // 0.207;
671 Double_t holeOffset[5];
672 holeOffset[0] = 0.65;
673 holeOffset[1] = 0.65;
674 holeOffset[2] = 0.65;
675 holeOffset[3] = 0.65;
676 holeOffset[4] = 0.65;
677
678 auto* coverBodyHole =
679 new TGeoTube(Form("coverBodyHoleMF%d", disk), 0, holeRadius[disk],
680 thicknessBody[disk] / 2 + Geometry::sEpsilon);
681 TGeoTranslation* tcoverBodyHole =
682 new TGeoTranslation(Form("tcoverBodyHoleMF%d", disk),
683 lengthBody / 2 - holeOffset[disk], 0, 0);
684 tcoverBodyHole->RegisterYourself();
685
686 TGeoCompositeShape* shapeManifold2 = new TGeoCompositeShape(
687 Form("shapeManifold2MF%d", disk),
688 Form("coverBody1MF%d - coverBodyHoleMF%d:tcoverBodyHoleMF%d - "
689 "shapeCoverBathtubMF%d:tcoverBathtubMF%d - "
690 "shapeStepMF%d:tcoverStepMF%d + shapeBulgeMF%d:tcoverBulgeMF%d",
691 disk, disk, disk, disk, disk, disk, disk, disk, disk));
692
693 TGeoRotation* rshapeManifold2 =
694 new TGeoRotation(Form("rshapeManifold2MF%d", disk), 0, 180, 0);
695 rshapeManifold2->RegisterYourself();
696
697 TGeoTranslation* tshapeManifold1 = new TGeoTranslation(
698 Form("tshapeManifold1MF%d", disk), 0, 0,
699 -((thicknessBody[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) /
700 2 -
701 (thicknessTop[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) /
702 2));
703 tshapeManifold1->RegisterYourself();
704
705 TGeoTranslation* tshapeManifold2 = new TGeoTranslation(
706 Form("tshapeManifold2MF%d", disk), 0, 0,
707 (thicknessBody[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) /
708 2 -
709 thicknessBody[disk] / 2);
710 tshapeManifold2->RegisterYourself();
711
712 TGeoCombiTrans* combtshapeManifold2 = new TGeoCombiTrans(
713 Form("combtshapeManifold2MF%d", disk), 0, 0,
714 (thicknessBody[disk] + thicknessMiddle[disk] + thicknessBottom[disk]) /
715 2 -
716 thicknessBody[disk] / 2,
717 rshapeManifold2);
718 combtshapeManifold2->RegisterYourself();
719
720 TGeoCompositeShape* shapeManifold = new TGeoCompositeShape(
721 "shapeManifold", Form("shapeManifold1MF%d:tshapeManifold1MF%d + "
722 "shapeManifold2MF%d:combtshapeManifold2MF%d",
723 disk, disk, disk, disk));
724
726 // Manifold3
728
729 Double_t innerRadiusPlug1 = 0.4 / 2.; // fm 0.600 / 2; //0.5
730 Double_t outerRadiusPlug1 = 0.6 / 2.; // fm 0.99 / 2; //0.8
731 Double_t thicknessPlug1 = 0.105;
732
733 auto* plug1 = new TGeoTube(Form("plug1MF%d", disk), innerRadiusPlug1,
734 outerRadiusPlug1, thicknessPlug1 / 2);
735
736 Double_t innerRadiusPlug2 = innerRadiusPlug1;
737 Double_t outerMinRadiusPlug2 = 0.6 / 2.; // fm 0.94 / 2; // 0.85
738 Double_t outerMaxRadiusPlug2 = outerRadiusPlug1;
739 Double_t thicknessPlug2 = 0.025;
740
741 auto* plug2 = new TGeoCone(Form("plug2MF%d", disk), thicknessPlug2 / 2,
742 innerRadiusPlug2, outerMaxRadiusPlug2,
743 innerRadiusPlug2, outerMinRadiusPlug2);
744
745 Double_t innerRadiusPlug3 = innerRadiusPlug1;
746 Double_t outerRadiusPlug3 = 0.5 / 2; // fm 0.720 / 2;
747 Double_t thicknessPlug3 = 0.086;
748
749 auto* plug3 = new TGeoTube(Form("plug3MF%d", disk), innerRadiusPlug3,
750 outerRadiusPlug3, thicknessPlug3 / 2);
751
752 Double_t innerRadiusPlug4 = innerRadiusPlug1;
753 Double_t outerRadiusPlug4 = 0.7 / 2.; // fm 1.100 / 2; // 0.7
754 Double_t thicknessPlug4 = 0.1; // fm 0.534; // 0.05
755
756 auto* plug4 = new TGeoTube(Form("plug4MF%d", disk), innerRadiusPlug4,
757 outerRadiusPlug4, thicknessPlug4 / 2);
758
759 Double_t innerRadiusPlug5 = innerRadiusPlug1;
760 Double_t outerRadiusPlug5 = 0.9 / 2.; // fm 1.270 / 2; // 0.9
761 Double_t thicknessPlug5 = 0.700;
762
763 auto* plug5main = new TGeoTube(Form("plug5mainMF%d", disk), innerRadiusPlug5,
764 outerRadiusPlug5, thicknessPlug5 / 2);
765
766 const Int_t nSidePlug5 = 6;
767 Double_t anglesubPlug5 = 360. / nSidePlug5 / 2. * TMath::Pi() / 180.;
768 Double_t lengthPlug5sub = outerRadiusPlug5 * TMath::Cos(anglesubPlug5) * 2;
769 Double_t widthPlug5sub = outerRadiusPlug5 * (1 - TMath::Cos(anglesubPlug5));
770 Double_t thicknessPlug5sub = thicknessPlug5 + Geometry::sEpsilon;
771
772 auto* plug5sub = new TGeoBBox(Form("plug5subMF%d", disk), lengthPlug5sub / 2,
773 widthPlug5sub / 2, thicknessPlug5sub / 2);
774
775 TGeoTranslation* tPlug5sub = new TGeoTranslation(
776 Form("tPlug5subMF%d", disk), 0,
777 outerRadiusPlug5 * TMath::Cos(anglesubPlug5) +
778 outerRadiusPlug5 * (1 - TMath::Cos(anglesubPlug5)) / 2,
779 0.);
780 tPlug5sub->RegisterYourself();
781
782 TGeoRotation* rPlug5sub[nSidePlug5];
783
784 TString namePlug5 = Form("plug5mainMF%d", disk);
785
786 for (Int_t index = 0; index < nSidePlug5; ++index) {
787 rPlug5sub[index] = new TGeoRotation(Form("rPlug5sub%dMF%d", index, disk),
788 index * 60, 0, 0);
789 rPlug5sub[index]->RegisterYourself();
790 TGeoCombiTrans* combtPlug5sub = new TGeoCombiTrans(
791 Form("combtPlug5subMF%d", disk), 0,
792 outerRadiusPlug5 * TMath::Cos(anglesubPlug5) +
793 outerRadiusPlug5 * (1 - TMath::Cos(anglesubPlug5)) / 2,
794 0., rPlug5sub[index]);
795 combtPlug5sub->RegisterYourself();
796 namePlug5 += Form(" - plug5subMF%d:combtPlug5subMF%d", disk, disk);
797 }
798
799 TGeoCompositeShape* plug5 =
800 new TGeoCompositeShape(Form("plug5MF%d", disk), namePlug5);
801
802 Double_t innerRadiusPlug6 = 0;
803 Double_t outerRadiusPlug6 = 0.780 / 2;
804 Double_t thicknessPlug6 = 0.150;
805
806 auto* plug6 = new TGeoTube(Form("plug6MF%d", disk), innerRadiusPlug6,
807 outerRadiusPlug6, thicknessPlug6 / 2);
808
809 Double_t innerRadiusPlug7 = innerRadiusPlug6;
810 Double_t outerMinRadiusPlug7 = 0.520 / 2;
811 Double_t outerMaxRadiusPlug7 = 0.638 / 2;
812 Double_t thicknessPlug7 = 0.050;
813
814 auto* plug7 = new TGeoCone(Form("plug7MF%d", disk), thicknessPlug7 / 2,
815 innerRadiusPlug7, outerMaxRadiusPlug7,
816 innerRadiusPlug7, outerMinRadiusPlug7);
817
818 Double_t innerRadiusPlug8 = innerRadiusPlug6;
819 Double_t outerRadiusPlug8 = 0.413 / 2;
820 Double_t thicknessPlug8 = 0.042;
821
822 auto* plug8 = new TGeoTube(Form("plug8MF%d", disk), innerRadiusPlug8,
823 outerRadiusPlug8, thicknessPlug8 / 2);
824
825 Double_t innerRadiusPlug9 = innerRadiusPlug6;
826 Double_t outerMinRadiusPlug9 = outerRadiusPlug8;
827 Double_t outerMaxRadiusPlug9 = 0.500 / 2;
828 Double_t thicknessPlug9 = 0.040;
829
830 auto* plug9 = new TGeoCone(Form("plug9MF%d", disk), thicknessPlug9 / 2,
831 innerRadiusPlug9, outerMinRadiusPlug9,
832 innerRadiusPlug9, outerMaxRadiusPlug9);
833
834 Double_t innerRadiusPlug10 = innerRadiusPlug6;
835 Double_t outerRadiusPlug10 = outerMaxRadiusPlug9;
836 Double_t thicknessPlug10 = 0.125;
837
838 auto* plug10 = new TGeoTube(Form("plug10MF%d", disk), innerRadiusPlug10,
839 outerRadiusPlug10, thicknessPlug10 / 2);
840
841 Double_t innerRadiusPlug11 = innerRadiusPlug6;
842 Double_t outerMinRadiusPlug11 = outerRadiusPlug8;
843 Double_t outerMaxRadiusPlug11 = 0.500 / 2;
844 Double_t thicknessPlug11 = 0.043;
845
846 auto* plug11 = new TGeoCone(Form("plug11MF%d", disk), thicknessPlug11 / 2,
847 innerRadiusPlug11, outerMaxRadiusPlug11,
848 innerRadiusPlug11, outerMinRadiusPlug11);
849
850 Double_t innerRadiusPlug12 = 0;
851 Double_t outerRadiusPlug12 = 0.289 / 2;
852 Double_t thicknessPlug12 = thicknessPlug6 + thicknessPlug7 + thicknessPlug8 +
853 thicknessPlug9 + thicknessPlug10 + thicknessPlug11;
854
855 auto* plug12main =
856 new TGeoTube(Form("plug12mainMF%d", disk), innerRadiusPlug12,
857 outerRadiusPlug12, thicknessPlug12 / 2 + Geometry::sEpsilon);
858
859 const Int_t nSidePlug12 = 6;
860 Double_t anglesubPlug12 = 360. / nSidePlug12 / 2. * TMath::Pi() / 180.;
861 Double_t lengthPlug12sub = outerRadiusPlug12 * TMath::Cos(anglesubPlug12) * 2;
862 Double_t widthPlug12sub =
863 outerRadiusPlug12 * (1 - TMath::Cos(anglesubPlug12));
864 Double_t thicknessPlug12sub = thicknessPlug12;
865
866 auto* plug12sub = new TGeoBBox(Form("plug12subMF%d", disk),
867 lengthPlug12sub / 2, widthPlug12sub / 2,
868 thicknessPlug12sub / 2 + Geometry::sEpsilon);
869
870 TGeoTranslation* tPlug12sub = new TGeoTranslation(
871 Form("tPlug12subMF%d", disk), 0,
872 outerRadiusPlug12 * TMath::Cos(anglesubPlug12) +
873 outerRadiusPlug12 * (1 - TMath::Cos(anglesubPlug12)) / 2,
874 0.);
875 tPlug12sub->RegisterYourself();
876
877 TGeoRotation* rPlug12sub[nSidePlug12];
878
879 TString namePlug12 = Form("plug12mainMF%d", disk);
880
881 for (Int_t index = 0; index < nSidePlug12; ++index) {
882 rPlug12sub[index] = new TGeoRotation(Form("rPlug12sub%dMF%d", index, disk),
883 index * 60, 0, 0);
884 rPlug12sub[index]->RegisterYourself();
885 TGeoCombiTrans* combtPlug12sub = new TGeoCombiTrans(
886 Form("combtPlug12subMF%d", disk), 0,
887 outerRadiusPlug12 * TMath::Cos(anglesubPlug12) +
888 outerRadiusPlug12 * (1 - TMath::Cos(anglesubPlug12)) / 2,
889 0., rPlug12sub[index]);
890 combtPlug12sub->RegisterYourself();
891 namePlug12 += Form(" - plug12subMF%d:combtPlug12subMF%d", disk, disk);
892 }
893
894 TGeoCompositeShape* plug12 =
895 new TGeoCompositeShape(Form("plug12MF%d", disk), namePlug12);
896
897 Double_t refposPlug =
898 (thicknessPlug1 + thicknessPlug2 + thicknessPlug3 + thicknessPlug4 +
899 thicknessPlug5 + thicknessPlug6 + thicknessPlug7 + thicknessPlug8 +
900 thicknessPlug9 + thicknessPlug10 + thicknessPlug11) /
901 2;
902
903 TGeoTranslation* tPlug[12];
904 tPlug[0] = new TGeoTranslation(Form("tPlug1MF%d", disk), 0, 0,
905 -refposPlug + thicknessPlug1 / 2);
906 tPlug[1] =
907 new TGeoTranslation(Form("tPlug2MF%d", disk), 0, 0,
908 -refposPlug + thicknessPlug1 + thicknessPlug2 / 2);
909 tPlug[2] = new TGeoTranslation(Form("tPlug3MF%d", disk), 0, 0,
910 -refposPlug + thicknessPlug1 + thicknessPlug2 +
911 thicknessPlug3 / 2);
912 tPlug[3] = new TGeoTranslation(Form("tPlug4MF%d", disk), 0, 0,
913 -refposPlug + thicknessPlug1 + thicknessPlug2 +
914 thicknessPlug3 + thicknessPlug4 / 2);
915 tPlug[4] = new TGeoTranslation(Form("tPlug5MF%d", disk), 0, 0,
916 -refposPlug + thicknessPlug1 + thicknessPlug2 +
917 thicknessPlug3 + thicknessPlug4 +
918 thicknessPlug5 / 2);
919 tPlug[5] = new TGeoTranslation(Form("tPlug6MF%d", disk), 0, 0,
920 -refposPlug + thicknessPlug1 + thicknessPlug2 +
921 thicknessPlug3 + thicknessPlug4 +
922 thicknessPlug5 + thicknessPlug6 / 2);
923 tPlug[6] =
924 new TGeoTranslation(Form("tPlug7MF%d", disk), 0, 0,
925 -refposPlug + thicknessPlug1 + thicknessPlug2 +
926 thicknessPlug3 + thicknessPlug4 + thicknessPlug5 +
927 thicknessPlug6 + thicknessPlug7 / 2);
928 tPlug[7] = new TGeoTranslation(Form("tPlug8MF%d", disk), 0, 0,
929 -refposPlug + thicknessPlug1 + thicknessPlug2 +
930 thicknessPlug3 + thicknessPlug4 +
931 thicknessPlug5 + thicknessPlug6 +
932 thicknessPlug7 + thicknessPlug8 / 2);
933 tPlug[8] = new TGeoTranslation(
934 Form("tPlug9MF%d", disk), 0, 0,
935 -refposPlug + thicknessPlug1 + thicknessPlug2 + thicknessPlug3 +
936 thicknessPlug4 + thicknessPlug5 + thicknessPlug6 + thicknessPlug7 +
937 thicknessPlug8 + thicknessPlug9 / 2);
938 tPlug[9] = new TGeoTranslation(
939 Form("tPlug10MF%d", disk), 0, 0,
940 -refposPlug + thicknessPlug1 + thicknessPlug2 + thicknessPlug3 +
941 thicknessPlug4 + thicknessPlug5 + thicknessPlug6 + thicknessPlug7 +
942 thicknessPlug8 + thicknessPlug9 + thicknessPlug10 / 2);
943 tPlug[10] = new TGeoTranslation(
944 Form("tPlug11MF%d", disk), 0, 0,
945 -refposPlug + thicknessPlug1 + thicknessPlug2 + thicknessPlug3 +
946 thicknessPlug4 + thicknessPlug5 + thicknessPlug6 + thicknessPlug7 +
947 thicknessPlug8 + thicknessPlug9 + thicknessPlug10 +
948 thicknessPlug11 / 2);
949 tPlug[11] = new TGeoTranslation(
950 Form("tPlug12MF%d", disk), 0, 0,
951 -refposPlug + thicknessPlug1 + thicknessPlug2 + thicknessPlug3 +
952 thicknessPlug4 + thicknessPlug5 + thicknessPlug12 / 2);
953
954 TString namePlug = "";
955 for (Int_t ipart = 0; ipart < 12; ++ipart) {
956 tPlug[ipart]->RegisterYourself();
957 if (ipart == 0) {
958 namePlug += Form("plug1MF%d:tPlug1MF%d", disk, disk);
959 } else if (ipart == 11) {
960 namePlug +=
961 Form(" - plug%dMF%d:tPlug%dMF%d", ipart + 1, disk, ipart + 1, disk);
962 } else {
963 namePlug +=
964 Form(" + plug%dMF%d:tPlug%dMF%d", ipart + 1, disk, ipart + 1, disk);
965 }
966 }
967
968 TGeoCompositeShape* shapePlug =
969 new TGeoCompositeShape(Form("shapePlugMF%d", disk), namePlug);
970
972 // Water
974
975 Double_t watherThickness[5];
976 watherThickness[0] = thicknessBodyBathtub2[0] - thicknessTop[0];
977 watherThickness[1] = thicknessBodyBathtub2[1] - thicknessTop[1];
978 watherThickness[2] = thicknessBodyBathtub2[2] - thicknessTop[2];
979 watherThickness[3] = thicknessBodyBathtub2[3] - thicknessTop[3];
980 watherThickness[4] = thicknessBodyBathtub2[4] - thicknessTop[4];
981
982 auto* water1 = new TGeoBBox(Form("water1MF%d", disk), lengthBodyBathtub1 / 2,
983 widthBodyBathtub1 / 2, watherThickness[disk] / 2);
984 auto* water2 = new TGeoBBox(Form("water2MF%d", disk), lengthBodyBathtub2 / 2,
985 widthBodyBathtub2 / 2, watherThickness[disk] / 2);
986 auto* water3 =
987 new TGeoTube(Form("water3MF%d", disk), 0, cornerRadiusBodyBathtub1[disk],
988 watherThickness[disk] / 2);
989
990 TGeoTranslation* twater[7];
991 twater[0] = new TGeoTranslation(Form("twater1MF%d", disk), 0., 0., 0);
992
993 twater[1] = new TGeoTranslation(
994 Form("twater2MF%d", disk),
995 lengthBodyBathtub1 / 2 + lengthBodyBathtub2 / 2, 0., 0.);
996 twater[2] = new TGeoTranslation(
997 Form("twater3MF%d", disk), lengthBodyBathtub1 / 2,
998 widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk], 0.);
999 twater[3] = new TGeoTranslation(
1000 Form("twater4MF%d", disk), lengthBodyBathtub1 / 2,
1001 -(widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk]), 0.);
1002
1003 twater[4] = new TGeoTranslation(
1004 Form("twater5MF%d", disk),
1005 -(lengthBodyBathtub1 / 2 + lengthBodyBathtub2 / 2), 0., 0.);
1006 twater[5] = new TGeoTranslation(
1007 Form("twater6MF%d", disk), -(lengthBodyBathtub1 / 2),
1008 widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk], 0.);
1009 twater[6] = new TGeoTranslation(
1010 Form("twater7MF%d", disk), -(lengthBodyBathtub1 / 2),
1011 -(widthBodyBathtub1 / 2 - cornerRadiusBodyBathtub1[disk]), 0.);
1012
1013 for (Int_t i = 0; i < 7; ++i) {
1014 twater[i]->RegisterYourself();
1015 }
1016
1017 TGeoCompositeShape* shapeWater = new TGeoCompositeShape(
1018 Form("shapeCoverBathtubMF%d", disk),
1019 Form("water1MF%d + water2MF%d:twater2MF%d + water3MF%d:twater3MF%d + "
1020 "water3MF%d:twater4MF%d + water2MF%d:twater5MF%d +"
1021 "water3MF%d:twater6MF%d + water3MF%d:twater7MF%d",
1022 disk, disk, disk, disk, disk, disk, disk, disk, disk, disk, disk,
1023 disk, disk));
1024
1025 TGeoCombiTrans* transformation1 = nullptr;
1026 TGeoCombiTrans* transformation2 = nullptr;
1027 TGeoCombiTrans* transformationplug1 = nullptr;
1028 TGeoCombiTrans* transformationplug2 = nullptr;
1029 TGeoCombiTrans* transformationwater1 = nullptr;
1030 TGeoCombiTrans* transformationwater2 = nullptr;
1031 TGeoRotation* rotation = nullptr;
1032
1033 TGeoMedium* kMedPeek = gGeoManager->GetMedium("MFT_PEEK$");
1034 TGeoMedium* kMed_plug = gGeoManager->GetMedium("MFT_Alu$");
1035 TGeoMedium* kMed_Water = gGeoManager->GetMedium("MFT_Water$");
1036
1037 Double_t thicknessTotMF =
1038 (thicknessBody[disk] + thicknessMiddle[disk] + thicknessBottom[disk]);
1039
1040 Double_t deltay = 0.2; // shift respect to the median plan of the MFT
1041 Double_t mfX = 2.2; // width
1042 Double_t mfY =
1043 6.8 -
1044 0.1; // height, decrease to avoid overlap with support, to be solved, fm
1045 Double_t mfZ = 1.7 - 0.85; // thickness, decrease to avoid overlap with
1046 // support, to be solved, fm
1047 Double_t fShift = 0;
1048 if (disk == 3 || disk == 4) {
1049 fShift = 0.015; // to avoid overlap with the 2 curved water pipes on the 2
1050 // upstream chambers
1051 }
1052
1053 auto* MF01 = new TGeoVolume(Form("MF%d1", disk), shapeManifold, kMedPeek);
1054 auto* MFplug01 =
1055 new TGeoVolume(Form("MFplug%d1", disk), shapePlug, kMed_plug);
1056 auto* MFwater01 =
1057 new TGeoVolume(Form("MFwater%d1", disk), shapeWater, kMed_Water);
1058 TGeoRotation* rotation1 =
1059 new TGeoRotation(Form("rotation1MF%d", disk), 90, 90., 180.);
1060
1061 transformation1 =
1062 // new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2 + mfZ / 2 + fShift,
1063 // mfY / 2 + deltay, mZPlan[disk], rotation1);
1064 new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2 + 0.1 +
1065 thicknessTotMF / 2,
1066 mHalfDiskGap + mSupportYDimensions[disk][0] / 2,
1067 mZPlan[disk], rotation1);
1068 mHalfDisk->AddNode(MF01, 1, transformation1);
1069
1070 TGeoRotation* rotationplug1 =
1071 new TGeoRotation(Form("rotationplug1MF%d", disk), -90, 90., 90.);
1072 transformationplug1 =
1073 // new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2 + mfZ / 2 + fShift
1074 // + thicknessTotMF/2 + refposPlug - (thicknessPlug8 + thicknessPlug9 +
1075 // thicknessPlug10 + thicknessPlug11),mfY / 2 + deltay - ((lengthBody)/2 -
1076 // holeOffset[3]), mZPlan[disk], rotationplug1);
1077 new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2 + 0.1 +
1078 thicknessTotMF / 2 + thicknessTotMF / 2 +
1079 refposPlug -
1080 (thicknessPlug8 + thicknessPlug9 +
1081 thicknessPlug10 + thicknessPlug11),
1082 mHalfDiskGap + mSupportYDimensions[disk][0] / 2 -
1083 ((lengthBody) / 2 - holeOffset[3]),
1084 mZPlan[disk], rotationplug1);
1085 mHalfDisk->AddNode(MFplug01, 1, transformationplug1);
1086
1087 transformationwater1 = new TGeoCombiTrans(
1088 mSupportXDimensions[disk][0] / 2 + 0.1 + thicknessTotMF / 2 +
1089 (thicknessTotMF / 2 - watherThickness[disk] / 2) -
1090 (thicknessBody[disk] - thicknessTop[disk] - watherThickness[disk]),
1091 mHalfDiskGap + mSupportYDimensions[disk][0] / 2, mZPlan[disk], rotation1);
1092 mHalfDisk->AddNode(MFwater01, 1, transformationwater1);
1093
1094 auto* MF02 = new TGeoVolume(Form("MF%d2", disk), shapeManifold, kMedPeek);
1095 auto* MFplug02 =
1096 new TGeoVolume(Form("MFplug%d2", disk), shapePlug, kMed_plug);
1097 auto* MFwater02 =
1098 new TGeoVolume(Form("MFwater%d2", disk), shapeWater, kMed_Water);
1099 TGeoRotation* rotation2 =
1100 new TGeoRotation(Form("rotation2MF%d", disk), 90, 90., 0.);
1101
1102 transformation2 = new TGeoCombiTrans(
1103 mSupportXDimensions[disk][0] / 2 + 0.1 + thicknessTotMF / 2,
1104 -mHalfDiskGap - mSupportYDimensions[disk][0] / 2, mZPlan[disk],
1105 rotation2);
1106 mHalfDisk->AddNode(MF02, 1, transformation2);
1107
1108 TGeoRotation* rotationplug2 =
1109 new TGeoRotation(Form("rotationplug1MF%d", disk), -90, 90., 90.);
1110 transformationplug2 = new TGeoCombiTrans(
1111 mSupportXDimensions[disk][0] / 2 + 0.1 + thicknessTotMF / 2 +
1112 thicknessTotMF / 2 + refposPlug -
1113 (thicknessPlug8 + thicknessPlug9 + thicknessPlug10 + thicknessPlug11),
1114 -mHalfDiskGap - mSupportYDimensions[disk][0] / 2 +
1115 ((lengthBody) / 2 - holeOffset[3]),
1116 mZPlan[disk], rotationplug2);
1117 mHalfDisk->AddNode(MFplug02, 1, transformationplug2);
1118
1119 transformationwater2 = new TGeoCombiTrans(
1120 mSupportXDimensions[disk][0] / 2 + 0.1 + thicknessTotMF / 2 +
1121 ((thicknessTotMF / 2 - watherThickness[disk] / 2) -
1122 (thicknessBody[disk] - thicknessTop[disk] - watherThickness[disk])),
1123 -mHalfDiskGap - mSupportYDimensions[disk][0] / 2, mZPlan[disk],
1124 rotation2);
1125 mHalfDisk->AddNode(MFwater02, 1, transformationwater2);
1126}
1127
1128//_____________________________________________________________________________
1130{
1131
1132 Int_t disk = 0;
1133
1134 if (half == Top) {
1135 printf("Creating MFT heat exchanger for disk0 top\n");
1136 } else if (half == Bottom) {
1137 printf("Creating MFT heat exchanger for disk0 bottom\n");
1138 } else {
1139 printf("No valid option for MFT heat exchanger on disk0\n");
1140 }
1141
1142 mCarbon = gGeoManager->GetMedium("MFT_CarbonFiber$");
1143 mWater = gGeoManager->GetMedium("MFT_Water$");
1144 mRohacell = gGeoManager->GetMedium("MFT_Rohacell$");
1145 mPipe = gGeoManager->GetMedium("MFT_Polyimide$");
1146 mPeek = gGeoManager->GetMedium("MFT_PEEK$");
1147
1148 auto* cooling = new TGeoVolumeAssembly(Form("cooling_D0_H%d", half));
1149
1150 TGeoTranslation* translation = nullptr;
1151 TGeoRotation* rotation = nullptr;
1152 TGeoCombiTrans* transformation = nullptr;
1153
1154 // **************************************** Water part
1155 // ****************************************
1156 // ********************** Four parameters mLwater0, mRadius0, mAngle0,
1157 // mLpartial0 *************
1158 Double_t ivolume = 0; // offset chamber 0
1159 Double_t mRadiusCentralTore[4];
1160 Double_t xPos0[4];
1161 Double_t yPos0[4];
1162
1163 for (Int_t itube = 0; itube < 3; itube++) {
1164 TGeoVolume* waterTube1 =
1165 gGeoManager->MakeTube(Form("waterTube1%d_D0_H%d", itube, half), mWater,
1166 0., mRWater, mLWater0[itube] / 2.);
1167 translation = new TGeoTranslation(mXPosition0[itube] - mHalfDiskGap, 0.,
1168 mSupportXDimensions[0][0] / 2. +
1169 mMoreLength01 - mLWater0[itube] / 2.);
1170 cooling->AddNode(waterTube1, ivolume++, translation);
1171
1172 TGeoVolume* waterTorus1 = gGeoManager->MakeTorus(
1173 Form("waterTorus1%d_D0_H%d", itube, half), mWater, mRadius0[itube], 0.,
1174 mRWater, 0., mAngle0[itube]);
1175 rotation = new TGeoRotation("rotation", 180., -90., 0.);
1176 transformation = new TGeoCombiTrans(
1177 mRadius0[itube] + mXPosition0[itube] - mHalfDiskGap, 0.,
1178 mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[itube],
1179 rotation);
1180 cooling->AddNode(waterTorus1, ivolume++, transformation);
1181
1182 TGeoVolume* waterTube2 =
1183 gGeoManager->MakeTube(Form("waterTube2%d_D0_H%d", itube, half), mWater,
1184 0., mRWater, mLpartial0[itube] / 2.);
1185 rotation = new TGeoRotation("rotation", 90., 180 - mAngle0[itube], 0.);
1186 xPos0[itube] =
1187 mLWater0[itube] +
1188 mRadius0[itube] * TMath::Sin(mAngle0[itube] * TMath::DegToRad()) +
1189 mLpartial0[itube] / 2 * TMath::Cos(mAngle0[itube] * TMath::DegToRad());
1190 yPos0[itube] =
1191 mXPosition0[itube] - mHalfDiskGap +
1192 mRadius0[itube] * (1 - TMath::Cos(mAngle0[itube] * TMath::DegToRad())) +
1193 mLpartial0[itube] / 2 * TMath::Sin(mAngle0[itube] * TMath::DegToRad());
1194 transformation = new TGeoCombiTrans(yPos0[itube], 0.,
1195 mSupportXDimensions[0][0] / 2. +
1196 mMoreLength01 - xPos0[itube],
1197 rotation);
1198 cooling->AddNode(waterTube2, ivolume++, transformation);
1199
1200 mRadiusCentralTore[itube] =
1201 (mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[itube] -
1202 mLpartial0[itube] / 2 *
1203 TMath::Cos(mAngle0[itube] * TMath::DegToRad())) /
1204 TMath::Sin(mAngle0[itube] * TMath::DegToRad());
1205 TGeoVolume* waterTorusCentral =
1206 gGeoManager->MakeTorus(Form("waterTorusCentral%d_D0_H%d", itube, half),
1207 mWater, mRadiusCentralTore[itube], 0., mRWater,
1208 -mAngle0[itube], 2. * mAngle0[itube]);
1209 rotation = new TGeoRotation("rotation", 0., 90., 0.);
1210 transformation = new TGeoCombiTrans(
1211 yPos0[itube] +
1212 mLpartial0[itube] / 2 *
1213 TMath::Sin(mAngle0[itube] * TMath::DegToRad()) -
1214 mRadiusCentralTore[itube] *
1215 TMath::Cos(mAngle0[itube] * TMath::DegToRad()),
1216 0., 0., rotation);
1217 cooling->AddNode(waterTorusCentral, ivolume++, transformation);
1218
1219 TGeoVolume* waterTube3 =
1220 gGeoManager->MakeTube(Form("waterTube3%d_D0_H%d", 2, half), mWater, 0.,
1221 mRWater, mLpartial0[itube] / 2.);
1222 rotation = new TGeoRotation("rotation", -90., 0 - mAngle0[itube], 0.);
1223 transformation = new TGeoCombiTrans(
1224 yPos0[itube], 0.,
1225 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[itube]),
1226 rotation);
1227 cooling->AddNode(waterTube3, ivolume++, transformation);
1228
1229 TGeoVolume* waterTorus2 = gGeoManager->MakeTorus(
1230 Form("waterTorus2%d_D0_H%d", itube, half), mWater, mRadius0[itube], 0.,
1231 mRWater, 0., mAngle0[itube]);
1232 rotation = new TGeoRotation("rotation", 180., 90., 0.);
1233 transformation = new TGeoCombiTrans(
1234 mRadius0[itube] + mXPosition0[itube] - mHalfDiskGap, 0.,
1235 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[itube]),
1236 rotation);
1237 cooling->AddNode(waterTorus2, ivolume++, transformation);
1238
1239 TGeoVolume* waterTube4 =
1240 gGeoManager->MakeTube(Form("waterTube4%d_D0_H%d", itube, half), mWater,
1241 0., mRWater, mLWater0[itube] / 2.);
1242 translation = new TGeoTranslation(mXPosition0[itube] - mHalfDiskGap, 0.,
1243 -(mSupportXDimensions[0][0] / 2. +
1244 mMoreLength01 - mLWater0[itube] / 2.));
1245 cooling->AddNode(waterTube4, ivolume++, translation);
1246 }
1247
1248 // **************************************************** Tube part
1249 // ************************************************
1250 // ****************************** Four parameters mLwater0, mRadius0, mAngle0,
1251 // mLpartial0 ************************
1252 for (Int_t itube = 0; itube < 3; itube++) {
1253 TGeoVolume* pipeTube1 =
1254 gGeoManager->MakeTube(Form("pipeTube1%d_D0_H%d", itube, half), mPipe, mRWater, mRWater + mDRPipe, mLWater0[itube] / 2.);
1255 translation = new TGeoTranslation(mXPosition0[itube] - mHalfDiskGap, 0., mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[itube] / 2.);
1256 cooling->AddNode(pipeTube1, ivolume++, translation);
1257
1258 TGeoVolume* pipeTorus1 = gGeoManager->MakeTorus(
1259 Form("pipeTorus1%d_D0_H%d", itube, half), mPipe, mRadius0[itube],
1260 mRWater, mRWater + mDRPipe, 0., mAngle0[itube]);
1261 rotation = new TGeoRotation("rotation", 180., -90., 0.);
1262 transformation = new TGeoCombiTrans(
1263 mRadius0[itube] + mXPosition0[itube] - mHalfDiskGap, 0.,
1264 mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[itube],
1265 rotation);
1266 cooling->AddNode(pipeTorus1, ivolume++, transformation);
1267
1268 TGeoVolume* pipeTube2 = gGeoManager->MakeTube(
1269 Form("pipeTube2%d_D0_H%d", itube, half), mPipe, mRWater,
1270 mRWater + mDRPipe, mLpartial0[itube] / 2.);
1271 rotation = new TGeoRotation("rotation", 90., 180 - mAngle0[itube], 0.);
1272 xPos0[itube] =
1273 mLWater0[itube] +
1274 mRadius0[itube] * TMath::Sin(mAngle0[itube] * TMath::DegToRad()) +
1275 mLpartial0[itube] / 2 * TMath::Cos(mAngle0[itube] * TMath::DegToRad());
1276 yPos0[itube] =
1277 mXPosition0[itube] - mHalfDiskGap +
1278 mRadius0[itube] * (1 - TMath::Cos(mAngle0[itube] * TMath::DegToRad())) +
1279 mLpartial0[itube] / 2 * TMath::Sin(mAngle0[itube] * TMath::DegToRad());
1280 transformation = new TGeoCombiTrans(yPos0[itube], 0.,
1281 mSupportXDimensions[0][0] / 2. +
1282 mMoreLength01 - xPos0[itube],
1283 rotation);
1284 cooling->AddNode(pipeTube2, ivolume++, transformation);
1285
1286 mRadiusCentralTore[itube] =
1287 (mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[itube] -
1288 mLpartial0[itube] / 2 *
1289 TMath::Cos(mAngle0[itube] * TMath::DegToRad())) /
1290 TMath::Sin(mAngle0[itube] * TMath::DegToRad());
1291 TGeoVolume* pipeTorusCentral = gGeoManager->MakeTorus(
1292 Form("pipeTorusCentral%d_D0_H%d", itube, half), mPipe,
1293 mRadiusCentralTore[itube], mRWater, mRWater + mDRPipe, -mAngle0[itube],
1294 2. * mAngle0[itube]);
1295 rotation = new TGeoRotation("rotation", 0., 90., 0.);
1296 transformation = new TGeoCombiTrans(
1297 yPos0[itube] +
1298 mLpartial0[itube] / 2 *
1299 TMath::Sin(mAngle0[itube] * TMath::DegToRad()) -
1300 mRadiusCentralTore[itube] *
1301 TMath::Cos(mAngle0[itube] * TMath::DegToRad()),
1302 0., 0., rotation);
1303 cooling->AddNode(pipeTorusCentral, ivolume++, transformation);
1304
1305 TGeoVolume* pipeTube3 = gGeoManager->MakeTube(
1306 Form("pipeTube3%d_D0_H%d", 2, half), mPipe, mRWater, mRWater + mDRPipe,
1307 mLpartial0[itube] / 2.);
1308 rotation = new TGeoRotation("rotation", -90., 0 - mAngle0[itube], 0.);
1309 transformation = new TGeoCombiTrans(
1310 yPos0[itube], 0.,
1311 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[itube]),
1312 rotation);
1313 cooling->AddNode(pipeTube3, ivolume++, transformation);
1314
1315 TGeoVolume* pipeTorus2 = gGeoManager->MakeTorus(
1316 Form("pipeTorus2%d_D0_H%d", itube, half), mPipe, mRadius0[itube],
1317 mRWater, mRWater + mDRPipe, 0., mAngle0[itube]);
1318 rotation = new TGeoRotation("rotation", 180., 90., 0.);
1319 transformation = new TGeoCombiTrans(
1320 mRadius0[itube] + mXPosition0[itube] - mHalfDiskGap, 0.,
1321 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[itube]),
1322 rotation);
1323 cooling->AddNode(pipeTorus2, ivolume++, transformation);
1324
1325 TGeoVolume* pipeTube4 =
1326 gGeoManager->MakeTube(Form("pipeTube4%d_D0_H%d", itube, half), mPipe,
1327 mRWater, mRWater + mDRPipe, mLWater0[itube] / 2.);
1328 translation = new TGeoTranslation(mXPosition0[itube] - mHalfDiskGap, 0.,
1329 -(mSupportXDimensions[0][0] / 2. +
1330 mMoreLength01 - mLWater0[itube] / 2.));
1331 cooling->AddNode(pipeTube4, ivolume++, translation);
1332 }
1333 // ***********************************************************************************************
1334
1335 Double_t deltaz = mHeatExchangerThickness -
1337 Geometry::sKaptonGlueThickness * 4 - 2 * mCarbonThickness;
1338
1339 rotation = new TGeoRotation("rotation", -90., 90., 0.);
1340 transformation = new TGeoCombiTrans(
1341 0., 0.,
1342 mZPlan[disk] + deltaz / 2. - mCarbonThickness - mRWater - mDRPipe -
1344 rotation);
1345 mHalfDisk->AddNode(cooling, 3, transformation);
1346 transformation = new TGeoCombiTrans(
1347 0., 0.,
1348 mZPlan[disk] - deltaz / 2. + mCarbonThickness + mRWater + mDRPipe +
1350 rotation);
1351 mHalfDisk->AddNode(cooling, 4, transformation);
1352
1353 // **************************************** Carbon Plates
1354 // ****************************************
1355 auto* carbonPlate = new TGeoVolumeAssembly(Form("carbonPlate_D0_H%d", half));
1356
1357 auto& mftBaseParam = MFTBaseParam::Instance();
1358 Double_t mReducedX = 0.;
1359 if (mftBaseParam.buildAlignment) {
1360 mReducedX = 0.6;
1361 }
1362
1363 auto* carbonBase0 = new TGeoBBox(
1364 Form("carbonBase0_D0_H%d", half),
1365 (mSupportXDimensions[disk][0] / 2. + mMoreLength01 - mReducedX),
1366 (mSupportYDimensions[disk][0]) / 2., mCarbonThickness);
1367 auto* t01 = new TGeoTranslation(
1368 "t01", 0., (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
1369 t01->RegisterYourself();
1370
1371 auto* holeCarbon0 =
1372 new TGeoTubeSeg(Form("holeCarbon0_D0_H%d", half), 0., mRMin[disk],
1373 mCarbonThickness + 0.000001, 0, 180.);
1374 auto* t02 = new TGeoTranslation("t02", 0., -mHalfDiskGap, 0.);
1375 t02->RegisterYourself();
1376
1377 auto* carbonhole0 = new TGeoSubtraction(carbonBase0, holeCarbon0, t01, t02);
1378 auto* ch0 = new TGeoCompositeShape(Form("Carbon0_D0_H%d", half), carbonhole0);
1379 auto* carbonBaseWithHole0 =
1380 new TGeoVolume(Form("carbonBaseWithHole_D0_H%d", half), ch0, mCarbon);
1381
1382 carbonBaseWithHole0->SetLineColor(kGray + 3);
1383 rotation = new TGeoRotation("rotation", 0., 0., 0.);
1384 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1385 carbonPlate->AddNode(carbonBaseWithHole0, 0,
1386 new TGeoTranslation(0., 0., mZPlan[disk]));
1387
1388 Double_t ty = mSupportYDimensions[disk][0];
1389
1390 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
1391 ty += mSupportYDimensions[disk][ipart] / 2.;
1392 TGeoVolume* partCarbon = gGeoManager->MakeBox(
1393 Form("partCarbon_D0_H%d_%d", half, ipart), mCarbon,
1394 mSupportXDimensions[disk][ipart] / 2.,
1395 mSupportYDimensions[disk][ipart] / 2., mCarbonThickness);
1396 partCarbon->SetLineColor(kGray + 3);
1397 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
1398 carbonPlate->AddNode(partCarbon, ipart, t);
1399 ty += mSupportYDimensions[disk][ipart] / 2.;
1400 }
1401
1402 rotation = new TGeoRotation("rotation", 180., 0., 0.);
1403 transformation = new TGeoCombiTrans(0., 0., deltaz / 2., rotation);
1404 mHalfDisk->AddNode(carbonPlate, 3, transformation);
1405 transformation = new TGeoCombiTrans(0., 0., -deltaz / 2., rotation);
1406 mHalfDisk->AddNode(carbonPlate, 4, transformation);
1407
1408 // **************************************** Glue Bwtween Carbon Plate and
1409 // Rohacell Plate ****************************************
1410 TGeoMedium* mGlueRohacellCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
1411 auto* glueRohacellCarbon =
1412 new TGeoVolumeAssembly(Form("glueRohacellCarbon_D0_H%d", half));
1413 auto* glueRohacellCarbonBase0 =
1414 new TGeoBBox(Form("glueRohacellCarbonBase0_D0_H%d", half),
1415 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
1416 (mSupportYDimensions[disk][0]) / 2.,
1418
1419 auto* translation_gluRC01 = new TGeoTranslation(
1420 "translation_gluRC01", 0.,
1421 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
1422 translation_gluRC01->RegisterYourself();
1423 auto* translation_gluRC02 =
1424 new TGeoTranslation("translation_gluRC02", 0., -mHalfDiskGap, 0.);
1425 translation_gluRC02->RegisterYourself();
1426
1427 auto* holeglueRohacellCarbon0 = new TGeoTubeSeg(
1428 Form("holeglueRohacellCarbon0_D0_H%d", half), 0., mRMin[disk],
1429 Geometry::sGlueRohacellCarbonThickness + 0.000001, 0, 180.);
1430
1431 auto* glueRohacellCarbonhole0 =
1432 new TGeoSubtraction(glueRohacellCarbonBase0, holeglueRohacellCarbon0,
1433 translation_gluRC01, translation_gluRC02);
1434 auto* gRC0 = new TGeoCompositeShape(Form("glueRohacellCarbon0_D0_H%d", half),
1435 glueRohacellCarbonhole0);
1436 auto* glueRohacellCarbonBaseWithHole0 =
1437 new TGeoVolume(Form("glueRohacellCarbonWithHole_D0_H%d", half), gRC0,
1438 mGlueRohacellCarbon);
1439
1440 glueRohacellCarbonBaseWithHole0->SetLineColor(kGreen);
1441 rotation = new TGeoRotation("rotation", 0., 0., 0.);
1442 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1443 glueRohacellCarbon->AddNode(glueRohacellCarbonBaseWithHole0, 0,
1444 new TGeoTranslation(0., 0., mZPlan[disk]));
1445
1446 Double_t tyGRC = mSupportYDimensions[disk][0];
1447
1448 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
1449 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
1450 TGeoVolume* partGlueRohacellCarbon = gGeoManager->MakeBox(
1451 Form("partGlueRohacellCarbon_D0_H%d_%d", half, ipart),
1452 mGlueRohacellCarbon, mSupportXDimensions[disk][ipart] / 2.,
1453 mSupportYDimensions[disk][ipart] / 2.,
1455 partGlueRohacellCarbon->SetLineColor(kGreen);
1456 auto* t = new TGeoTranslation("t", 0, tyGRC + mHalfDiskGap, mZPlan[disk]);
1457 glueRohacellCarbon->AddNode(partGlueRohacellCarbon, ipart, t);
1458 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
1459 }
1460
1461 rotation = new TGeoRotation("rotation", 180., 0., 0.);
1462 transformation = new TGeoCombiTrans(
1463 0., 0.,
1464 deltaz / 2. - mCarbonThickness - Geometry::sGlueRohacellCarbonThickness,
1465 rotation);
1466 mHalfDisk->AddNode(glueRohacellCarbon, 3, transformation);
1467 transformation = new TGeoCombiTrans(0., 0.,
1468 -(deltaz / 2. - mCarbonThickness -
1470 rotation);
1471 mHalfDisk->AddNode(glueRohacellCarbon, 4, transformation);
1472
1473 // **************************************** Kapton on Carbon Plate
1474 // ****************************************
1475 TGeoMedium* mKaptonOnCarbon = gGeoManager->GetMedium("MFT_Kapton$");
1476 auto* kaptonOnCarbon =
1477 new TGeoVolumeAssembly(Form("kaptonOnCarbon_D0_H%d", half));
1478 auto* kaptonOnCarbonBase0 = new TGeoBBox(
1479 Form("kaptonOnCarbonBase0_D0_H%d", half),
1480 (mSupportXDimensions[disk][0] / 2. + mMoreLength01 - mReducedX),
1481 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonOnCarbonThickness);
1482
1483 auto* translation_KC01 = new TGeoTranslation(
1484 "translation_KC01", 0.,
1485 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
1486 translation_KC01->RegisterYourself();
1487 auto* translation_KC02 =
1488 new TGeoTranslation("translation_KC02", 0., -mHalfDiskGap, 0.);
1489 translation_KC02->RegisterYourself();
1490
1491 auto* holekaptonOnCarbon0 =
1492 new TGeoTubeSeg(Form("holekaptonOnCarbon0_D0_H%d", half), 0., mRMin[disk],
1493 Geometry::sKaptonOnCarbonThickness + 0.000001, 0, 180.);
1494
1495 auto* kaptonOnCarbonhole0 =
1496 new TGeoSubtraction(kaptonOnCarbonBase0, holekaptonOnCarbon0,
1497 translation_KC01, translation_KC02);
1498 auto* KC0 = new TGeoCompositeShape(Form("kaptonOnCarbon_D0_H%d", half),
1499 kaptonOnCarbonhole0);
1500 auto* kaptonOnCarbonBaseWithHole0 = new TGeoVolume(
1501 Form("kaptonOnCarbonWithHole_D0_H%d", half), KC0, mKaptonOnCarbon);
1502
1503 kaptonOnCarbonBaseWithHole0->SetLineColor(kMagenta);
1504 rotation = new TGeoRotation("rotation", 0., 0., 0.);
1505 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1506 kaptonOnCarbon->AddNode(kaptonOnCarbonBaseWithHole0, 0,
1507 new TGeoTranslation(0., 0., mZPlan[disk]));
1508
1509 Double_t tyKC = mSupportYDimensions[disk][0];
1510
1511 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
1512 tyKC += mSupportYDimensions[disk][ipart] / 2.;
1513 TGeoVolume* partkaptonOnCarbonBase = gGeoManager->MakeBox(
1514 Form("partkaptonOnCarbon_D0_H%d_%d", half, ipart), mKaptonOnCarbon,
1515 mSupportXDimensions[disk][ipart] / 2.,
1516 mSupportYDimensions[disk][ipart] / 2.,
1518 partkaptonOnCarbonBase->SetLineColor(kMagenta);
1519 auto* t = new TGeoTranslation("t", 0, tyKC + mHalfDiskGap, mZPlan[disk]);
1520 kaptonOnCarbon->AddNode(partkaptonOnCarbonBase, ipart, t);
1521 tyKC += mSupportYDimensions[disk][ipart] / 2.;
1522 }
1523
1524 rotation = new TGeoRotation("rotation", 180., 0., 0.);
1525 transformation = new TGeoCombiTrans(
1526 0., 0.,
1527 deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
1529 rotation);
1530 mHalfDisk->AddNode(kaptonOnCarbon, 3, transformation);
1531 transformation = new TGeoCombiTrans(
1532 0., 0.,
1533 -(deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
1535 rotation);
1536 mHalfDisk->AddNode(kaptonOnCarbon, 4, transformation);
1537
1538 // **************************************** Kapton glue on the carbon plate
1539 // ****************************************
1540 TGeoMedium* mGlueKaptonCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
1541 auto* glueKaptonCarbon =
1542 new TGeoVolumeAssembly(Form("glueKaptonCarbon_D0_H%d", half));
1543 auto* glueKaptonCarbonBase0 = new TGeoBBox(
1544 Form("glueKaptonCarbonBase0_D0_H%d", half),
1545 (mSupportXDimensions[disk][0] / 2. + mMoreLength01 - mReducedX),
1546 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonGlueThickness);
1547
1548 auto* translation_gluKC01 = new TGeoTranslation(
1549 "translation_gluKC01", 0.,
1550 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
1551 translation_gluKC01->RegisterYourself();
1552 auto* translation_gluKC02 =
1553 new TGeoTranslation("translation_gluKC02", 0., -mHalfDiskGap, 0.);
1554 translation_gluKC02->RegisterYourself();
1555
1556 auto* holeglueKaptonCarbon0 = new TGeoTubeSeg(
1557 Form("holeglueKaptonCarbon0_D0_H%d", half), 0., mRMin[disk],
1558 Geometry::sKaptonGlueThickness + 0.000001, 0, 180.);
1559
1560 auto* glueKaptonCarbonhole0 =
1561 new TGeoSubtraction(glueKaptonCarbonBase0, holeglueKaptonCarbon0,
1562 translation_gluKC01, translation_gluKC02);
1563 auto* gKC0 = new TGeoCompositeShape(Form("glueKaptonCarbon0_D0_H%d", half),
1564 glueKaptonCarbonhole0);
1565 auto* glueKaptonCarbonBaseWithHole0 = new TGeoVolume(
1566 Form("glueKaptonCarbonWithHole_D0_H%d", half), gKC0, mGlueKaptonCarbon);
1567
1568 glueKaptonCarbonBaseWithHole0->SetLineColor(kGreen);
1569 rotation = new TGeoRotation("rotation", 0., 0., 0.);
1570 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1571 glueKaptonCarbon->AddNode(glueKaptonCarbonBaseWithHole0, 0,
1572 new TGeoTranslation(0., 0., mZPlan[disk]));
1573
1574 Double_t tyGKC = mSupportYDimensions[disk][0];
1575
1576 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
1577 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
1578 TGeoVolume* partGlueKaptonCarbon = gGeoManager->MakeBox(
1579 Form("partGlueKaptonCarbon_D0_H%d_%d", half, ipart), mGlueKaptonCarbon,
1580 mSupportXDimensions[disk][ipart] / 2.,
1581 mSupportYDimensions[disk][ipart] / 2., Geometry::sKaptonGlueThickness);
1582 partGlueKaptonCarbon->SetLineColor(kGreen);
1583 auto* t = new TGeoTranslation("t", 0, tyGKC + mHalfDiskGap, mZPlan[disk]);
1584 glueKaptonCarbon->AddNode(partGlueKaptonCarbon, ipart, t);
1585 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
1586 }
1587
1588 rotation = new TGeoRotation("rotation", 180., 0., 0.);
1589 transformation = new TGeoCombiTrans(0., 0., deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness, rotation);
1590 mHalfDisk->AddNode(glueKaptonCarbon, 3, transformation);
1591 transformation = new TGeoCombiTrans(0., 0., -(deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness), rotation);
1592 mHalfDisk->AddNode(glueKaptonCarbon, 4, transformation);
1593
1594 // **************************************** Rohacell Plate
1595 // ****************************************
1596 auto* rohacellPlate = new TGeoVolumeAssembly(Form("rohacellPlate_D0_H%d", half));
1597 auto* rohacellBase0 = new TGeoBBox(Form("rohacellBase0_D0_H%d", half), (mSupportXDimensions[disk][0]) / 2., (mSupportYDimensions[disk][0]) / 2., mRohacellThickness);
1598 auto* holeRohacell0 = new TGeoTubeSeg(Form("holeRohacell0_D0_H%d", half), 0., mRMin[disk], mRohacellThickness + 0.000001, 0, 180.);
1599
1600 // **************************************** GROOVES
1601 // ************************************************* Creating grooves or not
1602 // according to sGrooves
1603 Double_t diameter = 0.21; // groove diameter
1604 Double_t epsilon = 0.06; // outside shift of the goove
1605 Int_t iCount = 0;
1606 Double_t mPosition[4];
1607 TGeoCombiTrans* transfo[7][3];
1608 TGeoTube* grooveTube[7][3];
1609 TGeoTorus* grooveTorus[7][3];
1610 TGeoSubtraction* rohacellBaseGroove[300];
1611 TGeoCompositeShape* rohacellGroove[300];
1612
1613 for (Int_t igroove = 0; igroove < 3; igroove++) {
1614 grooveTube[0][igroove] = new TGeoTube("linear", 0., diameter, mLWater0[igroove] / 2.);
1615 grooveTorus[1][igroove] = new TGeoTorus("SideTorus", mRadius0[igroove], 0., diameter, 0., mAngle0[igroove]);
1616 grooveTube[2][igroove] = new TGeoTube("tiltedLinear", 0., diameter, mLpartial0[igroove] / 2.);
1617 grooveTorus[3][igroove] = new TGeoTorus("centralTorus", mRadiusCentralTore[igroove], 0., diameter, -mAngle0[igroove], 2. * mAngle0[igroove]);
1618 grooveTube[4][igroove] = new TGeoTube("tiltedLinear", 0., diameter, mLpartial0[igroove] / 2.);
1619 grooveTorus[5][igroove] = new TGeoTorus("SideTorus", mRadius0[igroove], 0., diameter, 0., mAngle0[igroove]);
1620 grooveTube[6][igroove] = new TGeoTube("linear", 0., diameter, mLWater0[igroove] / 2.);
1621 }
1622
1623 // Rotation matrix
1624 TGeoRotation* rotationLinear = new TGeoRotation("rotation", -90., 90., 0.);
1625 TGeoRotation* rotationSideTorusL = new TGeoRotation("rotationSideTorusLeft", -90., 0., 0.);
1626 TGeoRotation* rotationSideTorusR = new TGeoRotation("rotationSideTorusRight", 90., 180., 180.);
1627 TGeoRotation* rotationCentralTorus = new TGeoRotation("rotationCentralTorus", 90., 0., 0.);
1628 TGeoRotation* rotationTiltedLinearR;
1629 TGeoRotation* rotationTiltedLinearL;
1630
1631 // Creating grooves
1632 if (Geometry::sGrooves == 1) {
1633 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
1634 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
1635 mPosition[igroove] = mXPosition0[igroove] - mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.;
1636 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
1637
1638 switch (ip) {
1639 case 0: // Linear
1640 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
1641 mLWater0[igroove] / 2.,
1642 mPosition[igroove], iface * (mRohacellThickness + epsilon), rotationLinear);
1643 if (igroove == 0 && iface == 1) {
1644 rohacellBaseGroove[0] = new TGeoSubtraction(rohacellBase0, grooveTube[ip][igroove], nullptr, transfo[ip][igroove]);
1645 rohacellGroove[0] = new TGeoCompositeShape(Form("rohacell0Groove%d_G%d_F%d_H%d", ip, igroove, iface, half),
1646 rohacellBaseGroove[0]);
1647 };
1648 break;
1649 case 1: // side torus
1650 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2. + mMoreLength01 - mLWater0[igroove],
1651 mRadius0[igroove] + mXPosition0[igroove] -
1652 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.,
1653 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
1654 break;
1655 case 2: // Linear tilted
1656 rotationTiltedLinearR = new TGeoRotation("rotationTiltedLinearRight", 90. - mAngle0[igroove], 90., 0.);
1657 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2. + mMoreLength01 - xPos0[igroove],
1658 yPos0[igroove] - mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
1659 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
1660 break;
1661 case 3: // Central Torus
1662 transfo[ip][igroove] = new TGeoCombiTrans(0., yPos0[igroove] + mLpartial0[igroove] / 2 * TMath::Sin(mAngle0[igroove] * TMath::DegToRad()) - mRadiusCentralTore[igroove] * TMath::Cos(mAngle0[igroove] * TMath::DegToRad()) - mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
1663 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
1664 break;
1665 case 4: // Linear tilted
1666 rotationTiltedLinearL = new TGeoRotation(
1667 "rotationTiltedLinearLeft", 90. + mAngle0[igroove], 90., 0.);
1668 transfo[ip][igroove] = new TGeoCombiTrans(-(mSupportXDimensions[disk][0] / 2. + mMoreLength01 - xPos0[igroove]),
1669 yPos0[igroove] - mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
1670 iface * (mRohacellThickness + epsilon), rotationTiltedLinearL);
1671 break;
1672 case 5: // side torus
1673 transfo[ip][igroove] = new TGeoCombiTrans(-(mSupportXDimensions[disk][0] / 2. + mMoreLength01 - mLWater0[igroove]),
1674 mRadius0[igroove] + mPosition[igroove],
1675 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
1676 break;
1677 case 6: // Linear
1678 transfo[ip][igroove] = new TGeoCombiTrans(
1679 -(mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
1680 mLWater0[igroove] / 2.),
1681 mPosition[igroove], iface * (mRohacellThickness + epsilon),
1682 rotationLinear);
1683 break;
1684 }
1685
1686 if (!(ip == 0 && igroove == 0 && iface == 1)) {
1687 if (ip & 1) {
1688 rohacellBaseGroove[iCount] = new TGeoSubtraction(
1689 rohacellGroove[iCount - 1], grooveTorus[ip][igroove], nullptr,
1690 transfo[ip][igroove]);
1691 } else {
1692 rohacellBaseGroove[iCount] = new TGeoSubtraction(
1693 rohacellGroove[iCount - 1], grooveTube[ip][igroove], nullptr,
1694 transfo[ip][igroove]);
1695 }
1696 rohacellGroove[iCount] =
1697 new TGeoCompositeShape(Form("rohacell0Groove%d_G%d_F%d_H%d",
1698 iCount, igroove, iface, half),
1699 rohacellBaseGroove[iCount]);
1700 }
1701 iCount++;
1702 }
1703 }
1704 }
1705 }
1706 // **************************************************************************************************
1707
1708 // Passage du beam pipe
1709 TGeoBoolNode* rohacellBase;
1710
1711 if (Geometry::sGrooves == 0) {
1712 rohacellBase = new TGeoSubtraction(rohacellBase0, holeRohacell0, t01, t02);
1713 }
1714 if (Geometry::sGrooves == 1) {
1715 rohacellBase = new TGeoSubtraction(rohacellGroove[iCount - 1], holeRohacell0, t01, t02);
1716 }
1717
1718 auto* rh0 = new TGeoCompositeShape(Form("rohacellTore%d_D0_H%d", 0, half),
1719 rohacellBase);
1720 auto* rohacellBaseWithHole =
1721 new TGeoVolume(Form("rohacellBaseWithHole_D0_H%d", half), rh0, mRohacell);
1722
1723 TGeoVolume* partRohacell;
1724 rohacellBaseWithHole->SetLineColor(kGray);
1725 rotation = new TGeoRotation("rotation", 0., 0., 0.);
1726 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1727 rohacellPlate->AddNode(rohacellBaseWithHole, 0,
1728 new TGeoTranslation(0., 0., mZPlan[disk]));
1729
1730 ty = mSupportYDimensions[disk][0];
1731
1732 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
1733 ty += mSupportYDimensions[disk][ipart] / 2.;
1734 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
1735 auto* partRohacell0 = new TGeoBBox(Form("rohacellBase0_D0_H%d_%d", half, ipart),
1736 mSupportXDimensions[disk][ipart] / 2.,
1737 mSupportYDimensions[disk][ipart] / 2., mRohacellThickness);
1738
1739 if (Geometry::sGrooves == 1) {
1740 // ************************ Creating grooves for the other parts of the
1741 // rohacell plate **********************
1742 Double_t mShift;
1743 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
1744 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
1745 if (ipart == 1) {
1746 mPosition[ipart] = mXPosition0[igroove] - mSupportYDimensions[disk][ipart] / 2. - mHalfDiskGap - mSupportYDimensions[disk][ipart - 1];
1747 mShift = -mSupportYDimensions[disk][ipart - 1];
1748 };
1749 if (ipart == 2) {
1750 mPosition[ipart] = mXPosition0[igroove] - mSupportYDimensions[disk][ipart] / 2. -
1751 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] - mSupportYDimensions[disk][ipart - 2];
1752 mShift = -mSupportYDimensions[disk][ipart - 1] - mSupportYDimensions[disk][ipart - 2];
1753 };
1754 if (ipart == 3) {
1755 mPosition[ipart] = mXPosition0[igroove] - mSupportYDimensions[disk][ipart] / 2. -
1756 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] - mSupportYDimensions[disk][ipart - 2] -
1757 mSupportYDimensions[disk][ipart - 3];
1758 mShift = -mSupportYDimensions[disk][ipart - 1] - mSupportYDimensions[disk][ipart - 2] -
1759 mSupportYDimensions[disk][ipart - 3];
1760 };
1761
1762 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
1763
1764 switch (ip) {
1765 case 0: // Linear
1766 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[0][0] / 2. - mLWater0[igroove] / 2.,
1767 mPosition[ipart], iface * (mRohacellThickness + epsilon),
1768 rotationLinear);
1769 if (igroove == 0 && iface == 1) {
1770 rohacellBaseGroove[iCount] = new TGeoSubtraction(partRohacell0, grooveTube[ip][igroove],
1771 nullptr, transfo[ip][igroove]);
1772 rohacellGroove[iCount] = new TGeoCompositeShape(Form("rohacell0Groove%d_G%d_F%d_H%d", ip, igroove, iface, half),
1773 rohacellBaseGroove[iCount]);
1774 };
1775 break;
1776 case 1: // side torus
1777 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[0][0] / 2. + mMoreLength01 -
1778 mLWater0[igroove],
1779 mPosition[ipart] + mRadius0[igroove] - diameter / 2.,
1780 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
1781 break;
1782 case 2: // Linear tilted
1783 rotationTiltedLinearR = new TGeoRotation("rotationTiltedLinearRight", 90. - mAngle0[igroove], 90., 0.);
1784 transfo[ip][igroove] = new TGeoCombiTrans(mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[igroove],
1785 yPos0[igroove] + mShift - mHalfDiskGap -
1786 mSupportYDimensions[disk][ipart] / 2.,
1787 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
1788 break;
1789 case 3: // Central Torus
1790 transfo[ip][igroove] = new TGeoCombiTrans(0., mPosition[ipart] + yPos0[igroove] + mLpartial0[igroove] / 2 * TMath::Sin(mAngle0[igroove] * TMath::DegToRad()) - mRadiusCentralTore[igroove] * TMath::Cos(mAngle0[igroove] * TMath::DegToRad()) - mXPosition0[igroove],
1791 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
1792 break;
1793 case 4: // Linear tilted
1794 rotationTiltedLinearL = new TGeoRotation(
1795 "rotationTiltedLinearLeft", 90. + mAngle0[igroove], 90., 0.);
1796 transfo[ip][igroove] = new TGeoCombiTrans(-(mSupportXDimensions[0][0] / 2. + mMoreLength01 - xPos0[igroove]),
1797 yPos0[igroove] + mPosition[ipart] - mXPosition0[igroove],
1798 iface * (mRohacellThickness + epsilon),
1799 rotationTiltedLinearL);
1800 break;
1801 case 5: // side torus
1802 transfo[ip][igroove] = new TGeoCombiTrans(
1803 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[igroove]),
1804 mRadius0[igroove] + mPosition[ipart] - diameter / 2.,
1805 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
1806 break;
1807 case 6: // Linear
1808 transfo[ip][igroove] = new TGeoCombiTrans(
1809 -(mSupportXDimensions[0][0] / 2. + mMoreLength01 - mLWater0[igroove] / 2.),
1810 mPosition[ipart], iface * (mRohacellThickness + epsilon),
1811 rotationLinear);
1812 break;
1813 }
1814 if (!(ip == 0 && igroove == 0 && iface == 1)) {
1815 if (ip & 1) {
1816 rohacellBaseGroove[iCount] = new TGeoSubtraction(rohacellGroove[iCount - 1], grooveTorus[ip][igroove],
1817 nullptr, transfo[ip][igroove]);
1818 } else {
1819 rohacellBaseGroove[iCount] = new TGeoSubtraction(rohacellGroove[iCount - 1], grooveTube[ip][igroove],
1820 nullptr, transfo[ip][igroove]);
1821 }
1822
1823 rohacellGroove[iCount] = new TGeoCompositeShape(Form("rohacell0Groove%d_G%d_F%d_H%d", iCount, igroove, iface, half),
1824 rohacellBaseGroove[iCount]);
1825 }
1826 iCount++;
1827 }
1828 }
1829 }
1830 }
1831
1832 //============= notch of the rohacell plate, fm ===============
1833 TGeoVolume* partRohacellNotch;
1834 TGeoSubtraction* partRohacellini;
1835 TGeoBBox* notchRohacell0;
1836 TGeoTranslation* tnotch0;
1837 if (ipart == (mNPart[disk] - 1)) {
1838 notchRohacell0 = new TGeoBBox(Form("notchRohacell0_D0_H%d", half), 1.1,
1839 0.4, mRohacellThickness + 0.000001);
1840 tnotch0 = new TGeoTranslation("tnotch0", 0., mSupportYDimensions[disk][ipart] / 2., 0.);
1841 tnotch0->RegisterYourself();
1842 }
1843 //=============================================================
1844
1845 if (Geometry::sGrooves == 0) {
1846 if (ipart == (mNPart[disk] - 1)) {
1847 partRohacellini = new TGeoSubtraction(partRohacell0, notchRohacell0,
1848 nullptr, tnotch0);
1849 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D0_H%d", 0, half), partRohacellini);
1850 partRohacell = new TGeoVolume(Form("partRohacelli_D0_H%d_%d", half, ipart), rhinit, mRohacell);
1851 }
1852 if (ipart < (mNPart[disk] - 1)) {
1853 partRohacell = new TGeoVolume(Form("partRohacelli_D0_H%d_%d", half, ipart),
1854 partRohacell0, mRohacell);
1855 }
1856 }
1857
1858 if (Geometry::sGrooves == 1) {
1859 if (ipart == (mNPart[disk] - 1)) {
1860 partRohacellini = new TGeoSubtraction(rohacellGroove[iCount - 1],
1861 notchRohacell0, nullptr, tnotch0);
1862 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D0_H%d", 0, half), partRohacellini);
1863 partRohacell = new TGeoVolume(Form("partRohacelli_D0_H%d_%d", half, ipart), rhinit, mRohacell);
1864 }
1865 if (ipart < (mNPart[disk] - 1)) {
1866 partRohacell = new TGeoVolume(Form("partRohacelli_D0_H%d_%d", half, ipart), rohacellGroove[iCount - 1], mRohacell);
1867 }
1868 }
1869 //===========================================================================================================
1870 //===========================================================================================================
1871 partRohacell->SetLineColor(kGray);
1872 rohacellPlate->AddNode(partRohacell, ipart, t);
1873 ty += mSupportYDimensions[disk][ipart] / 2.;
1874
1875 //========== insert to locate the rohacell plate compare to the disk support
1876 //=============
1877 if (ipart == (mNPart[disk] - 1)) {
1878 TGeoTranslation* tinsert0;
1879 TGeoVolume* insert0 = gGeoManager->MakeBox(Form("insert0_H%d_%d", half, ipart), mPeek, 1.0,
1880 0.35 / 2., mRohacellThickness);
1881 Double_t ylocation = mSupportYDimensions[disk][0] + mHalfDiskGap - 0.35 / 2.;
1882 for (Int_t ip = 1; ip < mNPart[disk]; ip++) {
1883 ylocation = ylocation + mSupportYDimensions[disk][ip];
1884 }
1885 tinsert0 = new TGeoTranslation("tinsert0", 0., -ylocation, 0.);
1886 tinsert0->RegisterYourself();
1887 mHalfDisk->AddNode(insert0, 0., tinsert0);
1888 }
1889 //========================================================================================
1890 }
1891
1892 rotation = new TGeoRotation("rotation", 180., 0., 0.);
1893 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
1894 mHalfDisk->AddNode(rohacellPlate, 1, transformation);
1895
1896 createManifold(disk);
1897 createCoolingPipes(half, disk);
1898}
1899
1900//_____________________________________________________________________________
1902{
1903
1904 Int_t disk = 1;
1905
1906 if (half == Top) {
1907 printf("Creating MFT heat exchanger for disk1 top\n");
1908 } else if (half == Bottom) {
1909 printf("Creating MFT heat exchanger for disk1 bottom\n");
1910 } else {
1911 printf("No valid option for MFT heat exchanger on disk1\n");
1912 }
1913
1914 mCarbon = gGeoManager->GetMedium("MFT_CarbonFiber$");
1915 mWater = gGeoManager->GetMedium("MFT_Water$");
1916 mRohacell = gGeoManager->GetMedium("MFT_Rohacell$");
1917 mPipe = gGeoManager->GetMedium("MFT_Polyimide$");
1918 mPeek = gGeoManager->GetMedium("MFT_PEEK$");
1919
1920 auto* cooling = new TGeoVolumeAssembly(Form("cooling_D1_H%d", half));
1921
1922 TGeoTranslation* translation = nullptr;
1923 TGeoRotation* rotation = nullptr;
1924 TGeoCombiTrans* transformation = nullptr;
1925
1926 // **************************************** Water part
1927 // ****************************************
1928 // ********************** Four parameters mLwater1, mRadius1, mAngle1,
1929 // mLpartial1 *************
1930 Double_t ivolume = 100; // offset chamber 1
1931 Double_t mRadiusCentralTore[4];
1932 Double_t xPos1[4];
1933 Double_t yPos1[4];
1934
1935 for (Int_t itube = 0; itube < 3; itube++) {
1936 TGeoVolume* waterTube1 =
1937 gGeoManager->MakeTube(Form("waterTube1%d_D1_H%d", itube, half), mWater,
1938 0., mRWater, mLWater1[itube] / 2.);
1939 translation = new TGeoTranslation(mXPosition1[itube] - mHalfDiskGap, 0.,
1940 mSupportXDimensions[1][0] / 2. +
1941 mMoreLength01 - mLWater1[itube] / 2.);
1942 cooling->AddNode(waterTube1, ivolume++, translation);
1943
1944 TGeoVolume* waterTorus1 = gGeoManager->MakeTorus(
1945 Form("waterTorus1%d_D1_H%d", itube, half), mWater, mRadius1[itube], 0.,
1946 mRWater, 0., mAngle1[itube]);
1947 rotation = new TGeoRotation("rotation", 180., -90., 0.);
1948 transformation = new TGeoCombiTrans(
1949 mRadius1[itube] + mXPosition1[itube] - mHalfDiskGap, 0.,
1950 mSupportXDimensions[1][0] / 2. + mMoreLength01 - mLWater1[itube],
1951 rotation);
1952 cooling->AddNode(waterTorus1, ivolume++, transformation);
1953
1954 TGeoVolume* waterTube2 =
1955 gGeoManager->MakeTube(Form("waterTube2%d_D1_H%d", itube, half), mWater,
1956 0., mRWater, mLpartial1[itube] / 2.);
1957 rotation = new TGeoRotation("rotation", 90., 180 - mAngle1[itube], 0.);
1958 xPos1[itube] =
1959 mLWater1[itube] +
1960 mRadius1[itube] * TMath::Sin(mAngle1[itube] * TMath::DegToRad()) +
1961 mLpartial1[itube] / 2 * TMath::Cos(mAngle1[itube] * TMath::DegToRad());
1962 yPos1[itube] =
1963 mXPosition1[itube] - mHalfDiskGap +
1964 mRadius1[itube] * (1 - TMath::Cos(mAngle1[itube] * TMath::DegToRad())) +
1965 mLpartial1[itube] / 2 * TMath::Sin(mAngle1[itube] * TMath::DegToRad());
1966 transformation = new TGeoCombiTrans(yPos1[itube], 0.,
1967 mSupportXDimensions[1][0] / 2. +
1968 mMoreLength01 - xPos1[itube],
1969 rotation);
1970 cooling->AddNode(waterTube2, ivolume++, transformation);
1971
1972 mRadiusCentralTore[itube] =
1973 (mSupportXDimensions[1][0] / 2. + mMoreLength01 - xPos1[itube] -
1974 mLpartial1[itube] / 2 *
1975 TMath::Cos(mAngle1[itube] * TMath::DegToRad())) /
1976 TMath::Sin(mAngle1[itube] * TMath::DegToRad());
1977 TGeoVolume* waterTorusCentral =
1978 gGeoManager->MakeTorus(Form("waterTorusCentral%d_D1_H%d", itube, half),
1979 mWater, mRadiusCentralTore[itube], 0., mRWater,
1980 -mAngle1[itube], 2. * mAngle1[itube]);
1981 rotation = new TGeoRotation("rotation", 0., 90., 0.);
1982 transformation = new TGeoCombiTrans(
1983 yPos1[itube] +
1984 mLpartial1[itube] / 2 *
1985 TMath::Sin(mAngle1[itube] * TMath::DegToRad()) -
1986 mRadiusCentralTore[itube] *
1987 TMath::Cos(mAngle1[itube] * TMath::DegToRad()),
1988 0., 0., rotation);
1989 cooling->AddNode(waterTorusCentral, ivolume++, transformation);
1990
1991 TGeoVolume* waterTube3 =
1992 gGeoManager->MakeTube(Form("waterTube3%d_D1_H%d", 2, half), mWater, 0.,
1993 mRWater, mLpartial1[itube] / 2.);
1994 rotation = new TGeoRotation("rotation", -90., 0 - mAngle1[itube], 0.);
1995 transformation = new TGeoCombiTrans(
1996 yPos1[itube], 0.,
1997 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 - xPos1[itube]),
1998 rotation);
1999 cooling->AddNode(waterTube3, ivolume++, transformation);
2000
2001 TGeoVolume* waterTorus2 = gGeoManager->MakeTorus(
2002 Form("waterTorus2%d_D1_H%d", itube, half), mWater, mRadius1[itube], 0.,
2003 mRWater, 0., mAngle1[itube]);
2004 rotation = new TGeoRotation("rotation", 180., 90., 0.);
2005 transformation = new TGeoCombiTrans(
2006 mRadius1[itube] + mXPosition1[itube] - mHalfDiskGap, 0.,
2007 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 - mLWater1[itube]),
2008 rotation);
2009 cooling->AddNode(waterTorus2, ivolume++, transformation);
2010
2011 TGeoVolume* waterTube4 =
2012 gGeoManager->MakeTube(Form("waterTube4%d_D1_H%d", itube, half), mWater,
2013 0., mRWater, mLWater1[itube] / 2.);
2014 translation = new TGeoTranslation(mXPosition1[itube] - mHalfDiskGap, 0.,
2015 -(mSupportXDimensions[1][0] / 2. +
2016 mMoreLength01 - mLWater1[itube] / 2.));
2017 cooling->AddNode(waterTube4, ivolume++, translation);
2018 }
2019
2020 // **************************************************** Tube part
2021 // ************************************************
2022 // ****************************** Four parameters mLwater1, mRadius1, mAngle1,
2023 // mLpartial1 ************************
2024 for (Int_t itube = 0; itube < 3; itube++) {
2025 TGeoVolume* pipeTube1 =
2026 gGeoManager->MakeTube(Form("pipeTube1%d_D1_H%d", itube, half), mPipe,
2027 mRWater, mRWater + mDRPipe, mLWater1[itube] / 2.);
2028 translation = new TGeoTranslation(mXPosition1[itube] - mHalfDiskGap, 0.,
2029 mSupportXDimensions[1][0] / 2. +
2030 mMoreLength01 - mLWater1[itube] / 2.);
2031 cooling->AddNode(pipeTube1, ivolume++, translation);
2032
2033 TGeoVolume* pipeTorus1 = gGeoManager->MakeTorus(
2034 Form("pipeTorus1%d_D1_H%d", itube, half), mPipe, mRadius1[itube],
2035 mRWater, mRWater + mDRPipe, 0., mAngle1[itube]);
2036 rotation = new TGeoRotation("rotation", 180., -90., 0.);
2037 transformation = new TGeoCombiTrans(
2038 mRadius1[itube] + mXPosition1[itube] - mHalfDiskGap, 0.,
2039 mSupportXDimensions[1][0] / 2. + mMoreLength01 - mLWater1[itube],
2040 rotation);
2041 cooling->AddNode(pipeTorus1, ivolume++, transformation);
2042
2043 TGeoVolume* pipeTube2 = gGeoManager->MakeTube(
2044 Form("pipeTube2%d_D1_H%d", itube, half), mPipe, mRWater,
2045 mRWater + mDRPipe, mLpartial1[itube] / 2.);
2046 rotation = new TGeoRotation("rotation", 90., 180 - mAngle1[itube], 0.);
2047 xPos1[itube] =
2048 mLWater1[itube] +
2049 mRadius1[itube] * TMath::Sin(mAngle1[itube] * TMath::DegToRad()) +
2050 mLpartial1[itube] / 2 * TMath::Cos(mAngle1[itube] * TMath::DegToRad());
2051 yPos1[itube] =
2052 mXPosition1[itube] - mHalfDiskGap +
2053 mRadius1[itube] * (1 - TMath::Cos(mAngle1[itube] * TMath::DegToRad())) +
2054 mLpartial1[itube] / 2 * TMath::Sin(mAngle1[itube] * TMath::DegToRad());
2055 transformation = new TGeoCombiTrans(yPos1[itube], 0.,
2056 mSupportXDimensions[1][0] / 2. +
2057 mMoreLength01 - xPos1[itube],
2058 rotation);
2059 cooling->AddNode(pipeTube2, ivolume++, transformation);
2060
2061 mRadiusCentralTore[itube] =
2062 (mSupportXDimensions[1][0] / 2. + mMoreLength01 - xPos1[itube] -
2063 mLpartial1[itube] / 2 *
2064 TMath::Cos(mAngle1[itube] * TMath::DegToRad())) /
2065 TMath::Sin(mAngle1[itube] * TMath::DegToRad());
2066 TGeoVolume* pipeTorusCentral = gGeoManager->MakeTorus(
2067 Form("pipeTorusCentral%d_D1_H%d", itube, half), mPipe,
2068 mRadiusCentralTore[itube], mRWater, mRWater + mDRPipe, -mAngle1[itube],
2069 2. * mAngle1[itube]);
2070 rotation = new TGeoRotation("rotation", 0., 90., 0.);
2071 transformation = new TGeoCombiTrans(
2072 yPos1[itube] +
2073 mLpartial1[itube] / 2 *
2074 TMath::Sin(mAngle1[itube] * TMath::DegToRad()) -
2075 mRadiusCentralTore[itube] *
2076 TMath::Cos(mAngle1[itube] * TMath::DegToRad()),
2077 0., 0., rotation);
2078 cooling->AddNode(pipeTorusCentral, ivolume++, transformation);
2079
2080 TGeoVolume* pipeTube3 = gGeoManager->MakeTube(
2081 Form("pipeTube3%d_D1_H%d", 2, half), mPipe, mRWater, mRWater + mDRPipe,
2082 mLpartial1[itube] / 2.);
2083 rotation = new TGeoRotation("rotation", -90., 0 - mAngle1[itube], 0.);
2084 transformation = new TGeoCombiTrans(
2085 yPos1[itube], 0.,
2086 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 - xPos1[itube]),
2087 rotation);
2088 cooling->AddNode(pipeTube3, ivolume++, transformation);
2089
2090 TGeoVolume* pipeTorus2 = gGeoManager->MakeTorus(
2091 Form("pipeTorus2%d_D1_H%d", itube, half), mPipe, mRadius1[itube],
2092 mRWater, mRWater + mDRPipe, 0., mAngle1[itube]);
2093 rotation = new TGeoRotation("rotation", 180., 90., 0.);
2094 transformation = new TGeoCombiTrans(
2095 mRadius1[itube] + mXPosition1[itube] - mHalfDiskGap, 0.,
2096 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 - mLWater1[itube]),
2097 rotation);
2098 cooling->AddNode(pipeTorus2, ivolume++, transformation);
2099
2100 TGeoVolume* pipeTube4 =
2101 gGeoManager->MakeTube(Form("pipeTube4%d_D1_H%d", itube, half), mPipe,
2102 mRWater, mRWater + mDRPipe, mLWater1[itube] / 2.);
2103 translation = new TGeoTranslation(mXPosition1[itube] - mHalfDiskGap, 0.,
2104 -(mSupportXDimensions[1][0] / 2. +
2105 mMoreLength01 - mLWater1[itube] / 2.));
2106 cooling->AddNode(pipeTube4, ivolume++, translation);
2107 }
2108 // ***********************************************************************************************
2109
2110 Double_t deltaz = mHeatExchangerThickness -
2112 Geometry::sKaptonGlueThickness * 4 - 2 * mCarbonThickness;
2113
2114 rotation = new TGeoRotation("rotation", -90., 90., 0.);
2115 transformation = new TGeoCombiTrans(
2116 0., 0.,
2117 mZPlan[disk] + deltaz / 2. - mCarbonThickness - mRWater - mDRPipe -
2119 rotation);
2120 mHalfDisk->AddNode(cooling, 0, transformation);
2121 transformation = new TGeoCombiTrans(
2122 0., 0.,
2123 mZPlan[disk] - deltaz / 2. + mCarbonThickness + mRWater + mDRPipe +
2125 rotation);
2126 mHalfDisk->AddNode(cooling, 1, transformation);
2127
2128 // **************************************** Carbon Plates
2129 // ****************************************
2130 auto* carbonPlate = new TGeoVolumeAssembly(Form("carbonPlate_D1_H%d", half));
2131
2132 auto& mftBaseParam = MFTBaseParam::Instance();
2133 Double_t mReducedX = 0.;
2134 if (mftBaseParam.buildAlignment) {
2135 mReducedX = 0.6;
2136 }
2137
2138 auto* carbonBase1 = new TGeoBBox(
2139 Form("carbonBase1_D1_H%d", half),
2140 (mSupportXDimensions[disk][0]) / 2. + mMoreLength01 - mReducedX,
2141 (mSupportYDimensions[disk][0]) / 2., mCarbonThickness);
2142 auto* t11 = new TGeoTranslation(
2143 "t11", 0., (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
2144 t11->RegisterYourself();
2145
2146 auto* holeCarbon1 =
2147 new TGeoTubeSeg(Form("holeCarbon1_D1_H%d", half), 0., mRMin[disk],
2148 mCarbonThickness + 0.000001, 0, 180.);
2149 auto* t12 = new TGeoTranslation("t12", 0., -mHalfDiskGap, 0.);
2150 t12->RegisterYourself();
2151
2152 auto* carbonhole1 = new TGeoSubtraction(carbonBase1, holeCarbon1, t11, t12);
2153 auto* ch1 = new TGeoCompositeShape(Form("Carbon1_D1_H%d", half), carbonhole1);
2154 auto* carbonBaseWithHole1 =
2155 new TGeoVolume(Form("carbonBaseWithHole_D1_H%d", half), ch1, mCarbon);
2156
2157 carbonBaseWithHole1->SetLineColor(kGray + 3);
2158 rotation = new TGeoRotation("rotation", 0., 0., 0.);
2159 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2160 carbonPlate->AddNode(carbonBaseWithHole1, 0,
2161 new TGeoTranslation(0., 0., mZPlan[disk]));
2162
2163 Double_t ty = mSupportYDimensions[disk][0];
2164
2165 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
2166 ty += mSupportYDimensions[disk][ipart] / 2.;
2167 TGeoVolume* partCarbon = gGeoManager->MakeBox(
2168 Form("partCarbon_D1_H%d_%d", half, ipart), mCarbon,
2169 mSupportXDimensions[disk][ipart] / 2.,
2170 mSupportYDimensions[disk][ipart] / 2., mCarbonThickness);
2171 partCarbon->SetLineColor(kGray + 3);
2172 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
2173 carbonPlate->AddNode(partCarbon, ipart, t);
2174 ty += mSupportYDimensions[disk][ipart] / 2.;
2175 }
2176
2177 rotation = new TGeoRotation("rotation", 180., 0., 0.);
2178 transformation = new TGeoCombiTrans(0., 0., deltaz / 2., rotation);
2179 mHalfDisk->AddNode(carbonPlate, 0, transformation);
2180 transformation = new TGeoCombiTrans(0., 0., -deltaz / 2., rotation);
2181 mHalfDisk->AddNode(carbonPlate, 1, transformation);
2182
2183 // **************************************** Glue Bwtween Carbon Plate and
2184 // Rohacell Plate ****************************************
2185
2186 TGeoMedium* mGlueRohacellCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
2187
2188 auto* glueRohacellCarbon =
2189 new TGeoVolumeAssembly(Form("glueRohacellCarbon_D0_H%d", half));
2190
2191 auto* glueRohacellCarbonBase0 =
2192 new TGeoBBox(Form("glueRohacellCarbonBase0_D0_H%d", half),
2193 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
2194 (mSupportYDimensions[disk][0]) / 2.,
2196
2197 auto* translation_gluRC01 = new TGeoTranslation(
2198 "translation_gluRC01", 0.,
2199 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
2200 translation_gluRC01->RegisterYourself();
2201 auto* translation_gluRC02 =
2202 new TGeoTranslation("translation_gluRC02", 0., -mHalfDiskGap, 0.);
2203 translation_gluRC02->RegisterYourself();
2204
2205 auto* holeglueRohacellCarbon0 = new TGeoTubeSeg(
2206 Form("holeglueRohacellCarbon0_D0_H%d", half), 0., mRMin[disk],
2207 Geometry::sGlueRohacellCarbonThickness + 0.000001, 0, 180.);
2208
2209 auto* glueRohacellCarbonhole0 =
2210 new TGeoSubtraction(glueRohacellCarbonBase0, holeglueRohacellCarbon0,
2211 translation_gluRC01, translation_gluRC02);
2212 auto* gRC0 = new TGeoCompositeShape(Form("glueRohacellCarbon0_D0_H%d", half),
2213 glueRohacellCarbonhole0);
2214 auto* glueRohacellCarbonBaseWithHole0 =
2215 new TGeoVolume(Form("glueRohacellCarbonWithHole_D0_H%d", half), gRC0,
2216 mGlueRohacellCarbon);
2217
2218 glueRohacellCarbonBaseWithHole0->SetLineColor(kGreen);
2219 rotation = new TGeoRotation("rotation", 0., 0., 0.);
2220 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2221 glueRohacellCarbon->AddNode(glueRohacellCarbonBaseWithHole0, 0,
2222 new TGeoTranslation(0., 0., mZPlan[disk]));
2223
2224 Double_t tyGRC = mSupportYDimensions[disk][0];
2225
2226 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
2227 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
2228 TGeoVolume* partGlueRohacellCarbon = gGeoManager->MakeBox(
2229 Form("partGlueRohacellCarbon_D0_H%d_%d", half, ipart),
2230 mGlueRohacellCarbon, mSupportXDimensions[disk][ipart] / 2.,
2231 mSupportYDimensions[disk][ipart] / 2.,
2233 partGlueRohacellCarbon->SetLineColor(kGreen);
2234 auto* t = new TGeoTranslation("t", 0, tyGRC + mHalfDiskGap, mZPlan[disk]);
2235 glueRohacellCarbon->AddNode(partGlueRohacellCarbon, ipart, t);
2236 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
2237 }
2238
2239 rotation = new TGeoRotation("rotation", 180., 0., 0.);
2240 transformation = new TGeoCombiTrans(
2241 0., 0.,
2242 deltaz / 2. - mCarbonThickness - Geometry::sGlueRohacellCarbonThickness,
2243 rotation);
2244 mHalfDisk->AddNode(glueRohacellCarbon, 3, transformation);
2245 transformation = new TGeoCombiTrans(0., 0.,
2246 -(deltaz / 2. - mCarbonThickness -
2248 rotation);
2249 mHalfDisk->AddNode(glueRohacellCarbon, 4, transformation);
2250
2251 // **************************************** Kapton on Carbon Plate
2252 // ****************************************
2253 TGeoMedium* mKaptonOnCarbon = gGeoManager->GetMedium("MFT_Kapton$");
2254 auto* kaptonOnCarbon =
2255 new TGeoVolumeAssembly(Form("kaptonOnCarbon_D0_H%d", half));
2256 auto* kaptonOnCarbonBase0 = new TGeoBBox(
2257 Form("kaptonOnCarbonBase0_D0_H%d", half),
2258 (mSupportXDimensions[disk][0]) / 2. + mMoreLength01 - mReducedX,
2259 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonOnCarbonThickness);
2260
2261 auto* translation_KC01 = new TGeoTranslation(
2262 "translation_KC01", 0.,
2263 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
2264 translation_KC01->RegisterYourself();
2265 auto* translation_KC02 =
2266 new TGeoTranslation("translation_KC02", 0., -mHalfDiskGap, 0.);
2267 translation_KC02->RegisterYourself();
2268
2269 auto* holekaptonOnCarbon0 =
2270 new TGeoTubeSeg(Form("holekaptonOnCarbon0_D0_H%d", half), 0., mRMin[disk],
2271 Geometry::sKaptonOnCarbonThickness + 0.000001, 0, 180.);
2272
2273 auto* kaptonOnCarbonhole0 =
2274 new TGeoSubtraction(kaptonOnCarbonBase0, holekaptonOnCarbon0,
2275 translation_KC01, translation_KC02);
2276 auto* KC0 = new TGeoCompositeShape(Form("kaptonOnCarbon_D0_H%d", half),
2277 kaptonOnCarbonhole0);
2278 auto* kaptonOnCarbonBaseWithHole0 = new TGeoVolume(
2279 Form("kaptonOnCarbonWithHole_D0_H%d", half), KC0, mKaptonOnCarbon);
2280
2281 kaptonOnCarbonBaseWithHole0->SetLineColor(kMagenta);
2282 rotation = new TGeoRotation("rotation", 0., 0., 0.);
2283 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2284 kaptonOnCarbon->AddNode(kaptonOnCarbonBaseWithHole0, 0,
2285 new TGeoTranslation(0., 0., mZPlan[disk]));
2286
2287 Double_t tyKC = mSupportYDimensions[disk][0];
2288
2289 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
2290 tyKC += mSupportYDimensions[disk][ipart] / 2.;
2291 TGeoVolume* partkaptonOnCarbonBase = gGeoManager->MakeBox(
2292 Form("partkaptonOnCarbon_D0_H%d_%d", half, ipart), mKaptonOnCarbon,
2293 mSupportXDimensions[disk][ipart] / 2.,
2294 mSupportYDimensions[disk][ipart] / 2.,
2296 partkaptonOnCarbonBase->SetLineColor(kMagenta);
2297 auto* t = new TGeoTranslation("t", 0, tyKC + mHalfDiskGap, mZPlan[disk]);
2298 kaptonOnCarbon->AddNode(partkaptonOnCarbonBase, ipart, t);
2299 tyKC += mSupportYDimensions[disk][ipart] / 2.;
2300 }
2301
2302 rotation = new TGeoRotation("rotation", 180., 0., 0.);
2303 transformation = new TGeoCombiTrans(
2304 0., 0.,
2305 deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
2307 rotation);
2308 mHalfDisk->AddNode(kaptonOnCarbon, 3, transformation);
2309 transformation = new TGeoCombiTrans(
2310 0., 0.,
2311 -(deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
2313 rotation);
2314 mHalfDisk->AddNode(kaptonOnCarbon, 4, transformation);
2315
2316 // **************************************** Kapton glue on the carbon plate
2317 // ****************************************
2318 TGeoMedium* mGlueKaptonCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
2319 auto* glueKaptonCarbon =
2320 new TGeoVolumeAssembly(Form("glueKaptonCarbon_D0_H%d", half));
2321 auto* glueKaptonCarbonBase0 = new TGeoBBox(
2322 Form("glueKaptonCarbonBase0_D0_H%d", half),
2323 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
2324 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonGlueThickness);
2325
2326 auto* translation_gluKC01 = new TGeoTranslation(
2327 "translation_gluKC01", 0.,
2328 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
2329 translation_gluKC01->RegisterYourself();
2330 auto* translation_gluKC02 =
2331 new TGeoTranslation("translation_gluKC02", 0., -mHalfDiskGap, 0.);
2332 translation_gluKC02->RegisterYourself();
2333
2334 auto* holeglueKaptonCarbon0 = new TGeoTubeSeg(
2335 Form("holeglueKaptonCarbon0_D0_H%d", half), 0., mRMin[disk],
2336 Geometry::sKaptonGlueThickness + 0.000001, 0, 180.);
2337
2338 auto* glueKaptonCarbonhole0 =
2339 new TGeoSubtraction(glueKaptonCarbonBase0, holeglueKaptonCarbon0,
2340 translation_gluKC01, translation_gluKC02);
2341 auto* gKC0 = new TGeoCompositeShape(Form("glueKaptonCarbon0_D0_H%d", half),
2342 glueKaptonCarbonhole0);
2343 auto* glueKaptonCarbonBaseWithHole0 = new TGeoVolume(
2344 Form("glueKaptonCarbonWithHole_D0_H%d", half), gKC0, mGlueKaptonCarbon);
2345
2346 glueKaptonCarbonBaseWithHole0->SetLineColor(kGreen);
2347 rotation = new TGeoRotation("rotation", 0., 0., 0.);
2348 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2349 glueKaptonCarbon->AddNode(glueKaptonCarbonBaseWithHole0, 0,
2350 new TGeoTranslation(0., 0., mZPlan[disk]));
2351
2352 Double_t tyGKC = mSupportYDimensions[disk][0];
2353
2354 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
2355 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
2356 TGeoVolume* partGlueKaptonCarbon = gGeoManager->MakeBox(
2357 Form("partGlueKaptonCarbon_D0_H%d_%d", half, ipart), mGlueKaptonCarbon,
2358 mSupportXDimensions[disk][ipart] / 2.,
2359 mSupportYDimensions[disk][ipart] / 2., Geometry::sKaptonGlueThickness);
2360 partGlueKaptonCarbon->SetLineColor(kGreen);
2361 auto* t = new TGeoTranslation("t", 0, tyGKC + mHalfDiskGap, mZPlan[disk]);
2362 glueKaptonCarbon->AddNode(partGlueKaptonCarbon, ipart, t);
2363 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
2364 }
2365
2366 rotation = new TGeoRotation("rotation", 180., 0., 0.);
2367 transformation = new TGeoCombiTrans(
2368 0., 0., deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness,
2369 rotation);
2370 mHalfDisk->AddNode(glueKaptonCarbon, 3, transformation);
2371 transformation = new TGeoCombiTrans(
2372 0., 0.,
2373 -(deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness),
2374 rotation);
2375 mHalfDisk->AddNode(glueKaptonCarbon, 4, transformation);
2376
2377 // **************************************** Rohacell Plate
2378 // ****************************************
2379 auto* rohacellPlate =
2380 new TGeoVolumeAssembly(Form("rohacellPlate_D1_H%d", half));
2381 auto* rohacellBase1 =
2382 new TGeoBBox("rohacellBase1", (mSupportXDimensions[disk][0]) / 2.,
2383 (mSupportYDimensions[disk][0]) / 2., mRohacellThickness);
2384 auto* holeRohacell1 = new TGeoTubeSeg("holeRohacell1", 0., mRMin[disk],
2385 mRohacellThickness + 0.000001, 0, 180.);
2386
2387 // **************************************** GROOVES
2388 // *************************************************
2389 Double_t diameter = 0.21; // groove diameter
2390 Double_t epsilon = 0.06; // outside shift of the goove
2391 Int_t iCount = 0;
2392 Double_t mPosition[4];
2393 TGeoCombiTrans* transfo[7][3];
2394 TGeoTube* grooveTube[7][3];
2395 TGeoTorus* grooveTorus[7][3];
2396 TGeoSubtraction* rohacellBaseGroove[300];
2397 TGeoCompositeShape* rohacellGroove[300];
2398
2399 for (Int_t igroove = 0; igroove < 3; igroove++) {
2400 grooveTube[0][igroove] =
2401 new TGeoTube("linear", 0., diameter, mLWater1[igroove] / 2.);
2402 grooveTorus[1][igroove] = new TGeoTorus("SideTorus", mRadius1[igroove], 0.,
2403 diameter, 0., mAngle1[igroove]);
2404 grooveTube[2][igroove] =
2405 new TGeoTube("tiltedLinear", 0., diameter, mLpartial1[igroove] / 2.);
2406 grooveTorus[3][igroove] =
2407 new TGeoTorus("centralTorus", mRadiusCentralTore[igroove], 0., diameter,
2408 -mAngle1[igroove], 2. * mAngle1[igroove]);
2409 grooveTube[4][igroove] =
2410 new TGeoTube("tiltedLinear", 0., diameter, mLpartial1[igroove] / 2.);
2411 grooveTorus[5][igroove] = new TGeoTorus("SideTorus", mRadius1[igroove], 0.,
2412 diameter, 0., mAngle1[igroove]);
2413 grooveTube[6][igroove] =
2414 new TGeoTube("linear", 0., diameter, mLWater1[igroove] / 2.);
2415 }
2416
2417 // Rotation matrix
2418 TGeoRotation* rotationLinear = new TGeoRotation("rotation", -90., 90., 0.);
2419 TGeoRotation* rotationSideTorusL =
2420 new TGeoRotation("rotationSideTorusLeft", -90., 0., 0.);
2421 TGeoRotation* rotationSideTorusR =
2422 new TGeoRotation("rotationSideTorusRight", 90., 180., 180.);
2423 TGeoRotation* rotationCentralTorus =
2424 new TGeoRotation("rotationCentralTorus", 90., 0., 0.);
2425 TGeoRotation* rotationTiltedLinearR;
2426 TGeoRotation* rotationTiltedLinearL;
2427
2428 // Creating grooves
2429 if (Geometry::sGrooves == 1) {
2430 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
2431 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
2432 mPosition[igroove] = mXPosition1[igroove] - mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.;
2433 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
2434
2435 switch (ip) {
2436 case 0: // Linear
2437 transfo[ip][igroove] = new TGeoCombiTrans(
2438 mSupportXDimensions[1][0] / 2. + mMoreLength01 -
2439 mLWater1[igroove] / 2.,
2440 mPosition[igroove], iface * (mRohacellThickness + epsilon),
2441 rotationLinear);
2442 if (igroove == 0 && iface == 1) {
2443 rohacellBaseGroove[0] =
2444 new TGeoSubtraction(rohacellBase1, grooveTube[ip][igroove],
2445 nullptr, transfo[ip][igroove]);
2446 rohacellGroove[0] =
2447 new TGeoCompositeShape(Form("rohacell1Groove%d_G%d_F%d_H%d",
2448 ip, igroove, iface, half),
2449 rohacellBaseGroove[0]);
2450 };
2451 break;
2452 case 1: // side torus
2453 transfo[ip][igroove] = new TGeoCombiTrans(
2454 mSupportXDimensions[1][0] / 2. + mMoreLength01 -
2455 mLWater1[igroove],
2456 mRadius1[igroove] + mXPosition1[igroove] -
2457 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.,
2458 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
2459 break;
2460 case 2: // Linear tilted
2461 rotationTiltedLinearR = new TGeoRotation(
2462 "rotationTiltedLinearRight", 90. - mAngle1[igroove], 90., 0.);
2463 transfo[ip][igroove] = new TGeoCombiTrans(
2464 mSupportXDimensions[1][0] / 2. + mMoreLength01 - xPos1[igroove],
2465 yPos1[igroove] - mSupportYDimensions[disk][0] / 2. -
2466 mHalfDiskGap,
2467 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
2468 break;
2469 case 3: // Central Torus
2470 transfo[ip][igroove] = new TGeoCombiTrans(
2471 0.,
2472 yPos1[igroove] +
2473 mLpartial1[igroove] / 2 *
2474 TMath::Sin(mAngle1[igroove] * TMath::DegToRad()) -
2475 mRadiusCentralTore[igroove] *
2476 TMath::Cos(mAngle1[igroove] * TMath::DegToRad()) -
2477 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
2478 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
2479 break;
2480 case 4: // Linear tilted
2481 rotationTiltedLinearL = new TGeoRotation(
2482 "rotationTiltedLinearLeft", 90. + mAngle1[igroove], 90., 0.);
2483 transfo[ip][igroove] = new TGeoCombiTrans(
2484 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 -
2485 xPos1[igroove]),
2486 yPos1[igroove] - mSupportYDimensions[disk][0] / 2. -
2487 mHalfDiskGap,
2488 iface * (mRohacellThickness + epsilon), rotationTiltedLinearL);
2489 break;
2490 case 5: // side torus
2491 transfo[ip][igroove] = new TGeoCombiTrans(
2492 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 -
2493 mLWater1[igroove]),
2494 mRadius1[igroove] + mPosition[igroove],
2495 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
2496 break;
2497 case 6: // Linear
2498 transfo[ip][igroove] = new TGeoCombiTrans(
2499 -(mSupportXDimensions[1][0] / 2. + mMoreLength01 -
2500 mLWater1[igroove] / 2.),
2501 mPosition[igroove], iface * (mRohacellThickness + epsilon),
2502 rotationLinear);
2503 break;
2504 }
2505
2506 if (!(ip == 0 && igroove == 0 && iface == 1)) {
2507 if (ip & 1) {
2508 rohacellBaseGroove[iCount] = new TGeoSubtraction(
2509 rohacellGroove[iCount - 1], grooveTorus[ip][igroove], nullptr,
2510 transfo[ip][igroove]);
2511 } else {
2512 rohacellBaseGroove[iCount] = new TGeoSubtraction(
2513 rohacellGroove[iCount - 1], grooveTube[ip][igroove], nullptr,
2514 transfo[ip][igroove]);
2515 }
2516 rohacellGroove[iCount] =
2517 new TGeoCompositeShape(Form("rohacell1Groove%d_G%d_F%d_H%d",
2518 iCount, igroove, iface, half),
2519 rohacellBaseGroove[iCount]);
2520 }
2521 iCount++;
2522 }
2523 }
2524 }
2525 }
2526 // **************************************************************************************************
2527
2528 // Passage du beam pipe
2529 TGeoBoolNode* rohacellBase;
2530 if (Geometry::sGrooves == 0) {
2531 rohacellBase = new TGeoSubtraction(rohacellBase1, holeRohacell1, t11, t12);
2532 }
2533 if (Geometry::sGrooves == 1) {
2534 rohacellBase = new TGeoSubtraction(rohacellGroove[iCount - 1],
2535 holeRohacell1, t11, t12);
2536 }
2537 auto* rh1 =
2538 new TGeoCompositeShape(Form("rohacellBase1_D1_H%d", half), rohacellBase);
2539 auto* rohacellBaseWithHole =
2540 new TGeoVolume(Form("rohacellBaseWithHole_D1_H%d", half), rh1, mRohacell);
2541
2542 TGeoVolume* partRohacell;
2543 rohacellBaseWithHole->SetLineColor(kGray);
2544 rotation = new TGeoRotation("rotation", 0., 0., 0.);
2545 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2546 rohacellPlate->AddNode(rohacellBaseWithHole, 0,
2547 new TGeoTranslation(0., 0., mZPlan[disk]));
2548
2549 ty = mSupportYDimensions[disk][0];
2550
2551 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
2552 ty += mSupportYDimensions[disk][ipart] / 2.;
2553 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
2554
2555 //===========================================================================================================
2556 //===========================================================================================================
2557 auto* partRohacell0 =
2558 new TGeoBBox(Form("rohacellBase0_D1_H%d_%d", half, ipart),
2559 mSupportXDimensions[disk][ipart] / 2.,
2560 mSupportYDimensions[disk][ipart] / 2., mRohacellThickness);
2561
2562 if (Geometry::sGrooves == 1) {
2563 // ***************** Creating grooves for the other parts of the rohacell
2564 // plate **********************
2565 Double_t mShift;
2566 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
2567 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
2568 if (ipart == 1) {
2569 mPosition[ipart] =
2570 mXPosition1[igroove] - mSupportYDimensions[disk][ipart] / 2. -
2571 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1];
2572 mShift = -mSupportYDimensions[disk][ipart - 1];
2573 };
2574 if (ipart == 2) {
2575 mPosition[ipart] =
2576 mXPosition1[igroove] - mSupportYDimensions[disk][ipart] / 2. -
2577 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
2578 mSupportYDimensions[disk][ipart - 2];
2579 mShift = -mSupportYDimensions[disk][ipart - 1] -
2580 mSupportYDimensions[disk][ipart - 2];
2581 };
2582 if (ipart == 3) {
2583 mPosition[ipart] =
2584 mXPosition1[igroove] - mSupportYDimensions[disk][ipart] / 2. -
2585 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
2586 mSupportYDimensions[disk][ipart - 2] -
2587 mSupportYDimensions[disk][ipart - 3];
2588 mShift = -mSupportYDimensions[disk][ipart - 1] -
2589 mSupportYDimensions[disk][ipart - 2] -
2590 mSupportYDimensions[disk][ipart - 3];
2591 };
2592
2593 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
2594
2595 switch (ip) {
2596 case 0: // Linear
2597 transfo[ip][igroove] = new TGeoCombiTrans(
2598 mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
2599 mLWater1[igroove] / 2.,
2600 mPosition[ipart], iface * (mRohacellThickness + epsilon),
2601 rotationLinear);
2602 if (igroove == 0 && iface == 1) {
2603 rohacellBaseGroove[iCount] =
2604 new TGeoSubtraction(partRohacell0, grooveTube[ip][igroove],
2605 nullptr, transfo[ip][igroove]);
2606 rohacellGroove[iCount] =
2607 new TGeoCompositeShape(Form("rohacell1Groove%d_G%d_F%d_H%d",
2608 ip, igroove, iface, half),
2609 rohacellBaseGroove[iCount]);
2610 };
2611 break;
2612 case 1: // side torus
2613 transfo[ip][igroove] = new TGeoCombiTrans(
2614 mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
2615 mLWater1[igroove],
2616 mPosition[ipart] + mRadius1[igroove] - diameter / 2.,
2617 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
2618 break;
2619 case 2: // Linear tilted
2620 rotationTiltedLinearR = new TGeoRotation(
2621 "rotationTiltedLinearRight", 90. - mAngle1[igroove], 90., 0.);
2622 transfo[ip][igroove] =
2623 new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2. +
2624 mMoreLength01 - xPos1[igroove],
2625 yPos1[igroove] + mShift - mHalfDiskGap -
2626 mSupportYDimensions[disk][ipart] / 2.,
2627 iface * (mRohacellThickness + epsilon),
2628 rotationTiltedLinearR);
2629 break;
2630 case 3: // Central Torus
2631 transfo[ip][igroove] = new TGeoCombiTrans(
2632 0.,
2633 mPosition[ipart] + yPos1[igroove] +
2634 mLpartial1[igroove] / 2 *
2635 TMath::Sin(mAngle1[igroove] * TMath::DegToRad()) -
2636 mRadiusCentralTore[igroove] *
2637 TMath::Cos(mAngle1[igroove] * TMath::DegToRad()) -
2638 mXPosition1[igroove],
2639 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
2640 break;
2641 case 4: // Linear tilted
2642 rotationTiltedLinearL = new TGeoRotation(
2643 "rotationTiltedLinearLeft", 90. + mAngle1[igroove], 90., 0.);
2644 transfo[ip][igroove] = new TGeoCombiTrans(
2645 -(mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
2646 xPos1[igroove]),
2647 yPos1[igroove] + mPosition[ipart] - mXPosition1[igroove],
2648 iface * (mRohacellThickness + epsilon),
2649 rotationTiltedLinearL);
2650 break;
2651 case 5: // side torus
2652 transfo[ip][igroove] = new TGeoCombiTrans(
2653 -(mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
2654 mLWater1[igroove]),
2655 mRadius1[igroove] + mPosition[ipart] - diameter / 2.,
2656 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
2657 break;
2658 case 6: // Linear
2659 transfo[ip][igroove] = new TGeoCombiTrans(
2660 -(mSupportXDimensions[disk][0] / 2. + mMoreLength01 -
2661 mLWater1[igroove] / 2.),
2662 mPosition[ipart], iface * (mRohacellThickness + epsilon),
2663 rotationLinear);
2664 break;
2665 }
2666 if (!(ip == 0 && igroove == 0 && iface == 1)) {
2667 if (ip & 1) {
2668 rohacellBaseGroove[iCount] = new TGeoSubtraction(
2669 rohacellGroove[iCount - 1], grooveTorus[ip][igroove],
2670 nullptr, transfo[ip][igroove]);
2671 } else {
2672 rohacellBaseGroove[iCount] = new TGeoSubtraction(
2673 rohacellGroove[iCount - 1], grooveTube[ip][igroove],
2674 nullptr, transfo[ip][igroove]);
2675 }
2676
2677 rohacellGroove[iCount] =
2678 new TGeoCompositeShape(Form("rohacell1Groove%d_G%d_F%d_H%d",
2679 iCount, igroove, iface, half),
2680 rohacellBaseGroove[iCount]);
2681 }
2682 iCount++;
2683 }
2684 }
2685 }
2686 }
2687 //============= notch of the rohacell plate, fm ===============
2688 TGeoVolume* partRohacellNotch;
2689 TGeoSubtraction* partRohacellini;
2690 TGeoBBox* notchRohacell1;
2691 TGeoTranslation* tnotch1;
2692 if (ipart == (mNPart[disk] - 1)) {
2693 notchRohacell1 = new TGeoBBox(Form("notchRohacell1_D1_H%d", half), 1.1,
2694 0.4, mRohacellThickness + 0.000001);
2695 tnotch1 = new TGeoTranslation("tnotch1", 0.,
2696 mSupportYDimensions[disk][ipart] / 2., 0.);
2697 tnotch1->RegisterYourself();
2698 }
2699 //=============================================================
2700
2701 if (Geometry::sGrooves == 0) {
2702 if (ipart == (mNPart[disk] - 1)) {
2703 partRohacellini = new TGeoSubtraction(partRohacell0, notchRohacell1,
2704 nullptr, tnotch1);
2705 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D1_H%d", 0, half),
2706 partRohacellini);
2707 partRohacell = new TGeoVolume(
2708 Form("partRohacelli_D1_H%d_%d", half, ipart), rhinit, mRohacell);
2709 }
2710 if (ipart < (mNPart[disk] - 1)) {
2711 partRohacell =
2712 new TGeoVolume(Form("partRohacelli_D1_H%d_%d", half, ipart),
2713 partRohacell0, mRohacell);
2714 }
2715 }
2716 if (Geometry::sGrooves == 1) {
2717 if (ipart == (mNPart[disk] - 1)) {
2718 partRohacellini = new TGeoSubtraction(rohacellGroove[iCount - 1],
2719 notchRohacell1, nullptr, tnotch1);
2720 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D1_H%d", 0, half),
2721 partRohacellini);
2722 partRohacell = new TGeoVolume(
2723 Form("partRohacelli_D1_H%d_%d", half, ipart), rhinit, mRohacell);
2724 }
2725 if (ipart < (mNPart[disk] - 1)) {
2726 partRohacell =
2727 new TGeoVolume(Form("partRohacelli_D1_H%d_%d", half, ipart),
2728 rohacellGroove[iCount - 1], mRohacell);
2729 }
2730 }
2731
2732 //===========================================================================================================
2733 //===========================================================================================================
2734 partRohacell->SetLineColor(kGray);
2735 rohacellPlate->AddNode(partRohacell, ipart, t);
2736 ty += mSupportYDimensions[disk][ipart] / 2.;
2737
2738 //========== insert to locate the rohacell plate compare to the disk support
2739 //=============
2740 if (ipart == (mNPart[disk] - 1)) {
2741 TGeoTranslation* tinsert1;
2742 TGeoVolume* insert1 =
2743 gGeoManager->MakeBox(Form("insert1_H%d_%d", half, ipart), mPeek, 1.0,
2744 0.35 / 2., mRohacellThickness);
2745 Double_t ylocation =
2746 mSupportYDimensions[disk][0] + mHalfDiskGap - 0.35 / 2.;
2747 for (Int_t ip = 1; ip < mNPart[disk]; ip++) {
2748 ylocation = ylocation + mSupportYDimensions[disk][ip];
2749 }
2750 tinsert1 = new TGeoTranslation("tinsert1", 0., -ylocation, 0.);
2751 tinsert1->RegisterYourself();
2752 mHalfDisk->AddNode(insert1, 0., tinsert1);
2753 }
2754 //========================================================================================
2755 }
2756
2757 rotation = new TGeoRotation("rotation", 180., 0., 0.);
2758 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
2759 mHalfDisk->AddNode(rohacellPlate, 2, transformation);
2760
2761 createManifold(disk);
2762 createCoolingPipes(half, disk);
2763}
2764
2765//_____________________________________________________________________________
2767{
2768
2769 Int_t disk = 2;
2770
2771 if (half == Top) {
2772 printf("Creating MFT heat exchanger for disk2 top\n");
2773 } else if (half == Bottom) {
2774 printf("Creating MFT heat exchanger for disk2 bottom\n");
2775 } else {
2776 printf("No valid option for MFT heat exchanger on disk2\n");
2777 }
2778
2779 mCarbon = gGeoManager->GetMedium("MFT_CarbonFiber$");
2780 mWater = gGeoManager->GetMedium("MFT_Water$");
2781 mRohacell = gGeoManager->GetMedium("MFT_Rohacell$");
2782 mPipe = gGeoManager->GetMedium("MFT_Polyimide$");
2783 mPeek = gGeoManager->GetMedium("MFT_PEEK$");
2784
2785 auto* cooling = new TGeoVolumeAssembly(Form("cooling_D2_H%d", half));
2786
2787 TGeoTranslation* translation = nullptr;
2788 TGeoRotation* rotation = nullptr;
2789 TGeoCombiTrans* transformation = nullptr;
2790
2791 // **************************************** Water part
2792 // ****************************************
2793 // ********************** Four parameters mLwater2, mRadius2, mAngle2,
2794 // mLpartial2 *************
2795 Double_t ivolume = 200; // offset chamber 2
2796 Double_t mRadiusCentralTore[4];
2797 Double_t xPos2[4];
2798 Double_t yPos2[4];
2799
2800 for (Int_t itube = 0; itube < 3; itube++) {
2801 TGeoVolume* waterTube1 =
2802 gGeoManager->MakeTube(Form("waterTube1%d_D2_H%d", itube, half), mWater,
2803 0., mRWater, mLWater2[itube] / 2.);
2804 translation = new TGeoTranslation(mXPosition2[itube] - mHalfDiskGap, 0.,
2805 mSupportXDimensions[2][0] / 2. +
2806 mMoreLength - mLWater2[itube] / 2.);
2807 cooling->AddNode(waterTube1, ivolume++, translation);
2808
2809 TGeoVolume* waterTorus1 = gGeoManager->MakeTorus(
2810 Form("waterTorus1%d_D2_H%d", itube, half), mWater, mRadius2[itube], 0.,
2811 mRWater, 0., mAngle2[itube]);
2812 rotation = new TGeoRotation("rotation", 180., -90., 0.);
2813 transformation = new TGeoCombiTrans(
2814 mRadius2[itube] + mXPosition2[itube] - mHalfDiskGap, 0.,
2815 mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube],
2816 rotation);
2817 cooling->AddNode(waterTorus1, ivolume++, transformation);
2818
2819 TGeoVolume* waterTube2 =
2820 gGeoManager->MakeTube(Form("waterTube2%d_D2_H%d", itube, half), mWater,
2821 0., mRWater, mLpartial2[itube] / 2.);
2822 rotation = new TGeoRotation("rotation", 90., 180 - mAngle2[itube], 0.);
2823 xPos2[itube] =
2824 mLWater2[itube] +
2825 mRadius2[itube] * TMath::Sin(mAngle2[itube] * TMath::DegToRad()) +
2826 mLpartial2[itube] / 2 * TMath::Cos(mAngle2[itube] * TMath::DegToRad());
2827 yPos2[itube] =
2828 mXPosition2[itube] - mHalfDiskGap +
2829 mRadius2[itube] * (1 - TMath::Cos(mAngle2[itube] * TMath::DegToRad())) +
2830 mLpartial2[itube] / 2 * TMath::Sin(mAngle2[itube] * TMath::DegToRad());
2831 transformation = new TGeoCombiTrans(
2832 yPos2[itube], 0.,
2833 mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube], rotation);
2834 cooling->AddNode(waterTube2, ivolume++, transformation);
2835
2836 mRadiusCentralTore[itube] =
2837 (mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube] -
2838 mLpartial2[itube] / 2 *
2839 TMath::Cos(mAngle2[itube] * TMath::DegToRad())) /
2840 TMath::Sin(mAngle2[itube] * TMath::DegToRad());
2841 TGeoVolume* waterTorusCentral =
2842 gGeoManager->MakeTorus(Form("waterTorusCentral%d_D2_H%d", itube, half),
2843 mWater, mRadiusCentralTore[itube], 0., mRWater,
2844 -mAngle2[itube], 2. * mAngle2[itube]);
2845 rotation = new TGeoRotation("rotation", 0., 90., 0.);
2846 transformation = new TGeoCombiTrans(
2847 yPos2[itube] +
2848 mLpartial2[itube] / 2 *
2849 TMath::Sin(mAngle2[itube] * TMath::DegToRad()) -
2850 mRadiusCentralTore[itube] *
2851 TMath::Cos(mAngle2[itube] * TMath::DegToRad()),
2852 0., 0., rotation);
2853 cooling->AddNode(waterTorusCentral, ivolume++, transformation);
2854
2855 TGeoVolume* waterTube3 =
2856 gGeoManager->MakeTube(Form("waterTube3%d_D2_H%d", 2, half), mWater, 0.,
2857 mRWater, mLpartial2[itube] / 2.);
2858 rotation = new TGeoRotation("rotation", -90., 0 - mAngle2[itube], 0.);
2859 transformation = new TGeoCombiTrans(
2860 yPos2[itube], 0.,
2861 -(mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube]),
2862 rotation);
2863 cooling->AddNode(waterTube3, ivolume++, transformation);
2864
2865 TGeoVolume* waterTorus2 = gGeoManager->MakeTorus(
2866 Form("waterTorus2%d_D2_H%d", itube, half), mWater, mRadius2[itube], 0.,
2867 mRWater, 0., mAngle2[itube]);
2868 rotation = new TGeoRotation("rotation", 180., 90., 0.);
2869 transformation = new TGeoCombiTrans(
2870 mRadius2[itube] + mXPosition2[itube] - mHalfDiskGap, 0.,
2871 -(mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube]),
2872 rotation);
2873 cooling->AddNode(waterTorus2, ivolume++, transformation);
2874
2875 TGeoVolume* waterTube4 =
2876 gGeoManager->MakeTube(Form("waterTube4%d_D2_H%d", itube, half), mWater,
2877 0., mRWater, mLWater2[itube] / 2.);
2878 translation = new TGeoTranslation(
2879 mXPosition2[itube] - mHalfDiskGap, 0.,
2880 -(mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube] / 2.));
2881 cooling->AddNode(waterTube4, ivolume++, translation);
2882 }
2883
2884 // **************************************************** Tube part
2885 // ************************************************
2886 // ****************************** Four parameters mLwater2, mRadius2, mAngle2,
2887 // mLpartial2 ************************
2888 for (Int_t itube = 0; itube < 3; itube++) {
2889 TGeoVolume* pipeTube1 =
2890 gGeoManager->MakeTube(Form("pipeTube1%d_D2_H%d", itube, half), mPipe,
2891 mRWater, mRWater + mDRPipe, mLWater2[itube] / 2.);
2892 translation = new TGeoTranslation(mXPosition2[itube] - mHalfDiskGap, 0.,
2893 mSupportXDimensions[2][0] / 2. +
2894 mMoreLength - mLWater2[itube] / 2.);
2895 cooling->AddNode(pipeTube1, ivolume++, translation);
2896
2897 TGeoVolume* pipeTorus1 = gGeoManager->MakeTorus(
2898 Form("pipeTorus1%d_D2_H%d", itube, half), mPipe, mRadius2[itube],
2899 mRWater, mRWater + mDRPipe, 0., mAngle2[itube]);
2900 rotation = new TGeoRotation("rotation", 180., -90., 0.);
2901 transformation = new TGeoCombiTrans(
2902 mRadius2[itube] + mXPosition2[itube] - mHalfDiskGap, 0.,
2903 mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube],
2904 rotation);
2905 cooling->AddNode(pipeTorus1, ivolume++, transformation);
2906
2907 TGeoVolume* pipeTube2 = gGeoManager->MakeTube(
2908 Form("pipeTube2%d_D2_H%d", itube, half), mPipe, mRWater,
2909 mRWater + mDRPipe, mLpartial2[itube] / 2.);
2910 rotation = new TGeoRotation("rotation", 90., 180 - mAngle2[itube], 0.);
2911 xPos2[itube] =
2912 mLWater2[itube] +
2913 mRadius2[itube] * TMath::Sin(mAngle2[itube] * TMath::DegToRad()) +
2914 mLpartial2[itube] / 2 * TMath::Cos(mAngle2[itube] * TMath::DegToRad());
2915 yPos2[itube] =
2916 mXPosition2[itube] - mHalfDiskGap +
2917 mRadius2[itube] * (1 - TMath::Cos(mAngle2[itube] * TMath::DegToRad())) +
2918 mLpartial2[itube] / 2 * TMath::Sin(mAngle2[itube] * TMath::DegToRad());
2919 transformation = new TGeoCombiTrans(
2920 yPos2[itube], 0.,
2921 mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube], rotation);
2922 cooling->AddNode(pipeTube2, ivolume++, transformation);
2923
2924 mRadiusCentralTore[itube] =
2925 (mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube] -
2926 mLpartial2[itube] / 2 *
2927 TMath::Cos(mAngle2[itube] * TMath::DegToRad())) /
2928 TMath::Sin(mAngle2[itube] * TMath::DegToRad());
2929 TGeoVolume* pipeTorusCentral = gGeoManager->MakeTorus(
2930 Form("pipeTorusCentral%d_D2_H%d", itube, half), mPipe,
2931 mRadiusCentralTore[itube], mRWater, mRWater + mDRPipe, -mAngle2[itube],
2932 2. * mAngle2[itube]);
2933 rotation = new TGeoRotation("rotation", 0., 90., 0.);
2934 transformation = new TGeoCombiTrans(
2935 yPos2[itube] +
2936 mLpartial2[itube] / 2 *
2937 TMath::Sin(mAngle2[itube] * TMath::DegToRad()) -
2938 mRadiusCentralTore[itube] *
2939 TMath::Cos(mAngle2[itube] * TMath::DegToRad()),
2940 0., 0., rotation);
2941 cooling->AddNode(pipeTorusCentral, ivolume++, transformation);
2942
2943 TGeoVolume* pipeTube3 = gGeoManager->MakeTube(
2944 Form("pipeTube3%d_D2_H%d", 2, half), mPipe, mRWater, mRWater + mDRPipe,
2945 mLpartial2[itube] / 2.);
2946 rotation = new TGeoRotation("rotation", -90., 0 - mAngle2[itube], 0.);
2947 transformation = new TGeoCombiTrans(
2948 yPos2[itube], 0.,
2949 -(mSupportXDimensions[2][0] / 2. + mMoreLength - xPos2[itube]),
2950 rotation);
2951 cooling->AddNode(pipeTube3, ivolume++, transformation);
2952
2953 TGeoVolume* pipeTorus2 = gGeoManager->MakeTorus(
2954 Form("pipeTorus2%d_D2_H%d", itube, half), mPipe, mRadius2[itube],
2955 mRWater, mRWater + mDRPipe, 0., mAngle2[itube]);
2956 rotation = new TGeoRotation("rotation", 180., 90., 0.);
2957 transformation = new TGeoCombiTrans(
2958 mRadius2[itube] + mXPosition2[itube] - mHalfDiskGap, 0.,
2959 -(mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube]),
2960 rotation);
2961 cooling->AddNode(pipeTorus2, ivolume++, transformation);
2962
2963 TGeoVolume* pipeTube4 =
2964 gGeoManager->MakeTube(Form("pipeTube4%d_D2_H%d", itube, half), mPipe,
2965 mRWater, mRWater + mDRPipe, mLWater2[itube] / 2.);
2966 translation = new TGeoTranslation(
2967 mXPosition2[itube] - mHalfDiskGap, 0.,
2968 -(mSupportXDimensions[2][0] / 2. + mMoreLength - mLWater2[itube] / 2.));
2969 cooling->AddNode(pipeTube4, ivolume++, translation);
2970 }
2971 // ***********************************************************************************************
2972
2973 Double_t deltaz = mHeatExchangerThickness -
2975 Geometry::sKaptonGlueThickness * 4 - 2 * mCarbonThickness;
2976
2977 rotation = new TGeoRotation("rotation", -90., 90., 0.);
2978 transformation = new TGeoCombiTrans(
2979 0., 0.,
2980 mZPlan[disk] + deltaz / 2. - mCarbonThickness - mRWater - mDRPipe -
2982 rotation);
2983 mHalfDisk->AddNode(cooling, 3, transformation);
2984 transformation = new TGeoCombiTrans(
2985 0., 0.,
2986 mZPlan[disk] - deltaz / 2. + mCarbonThickness + mRWater + mDRPipe +
2988 rotation);
2989 mHalfDisk->AddNode(cooling, 4, transformation);
2990
2991 // **************************************** Carbon Plates
2992 // ****************************************
2993 auto* carbonPlate = new TGeoVolumeAssembly(Form("carbonPlate_D2_H%d", half));
2994
2995 auto& mftBaseParam = MFTBaseParam::Instance();
2996 Double_t mReducedX = 0.;
2997 if (mftBaseParam.buildAlignment) {
2998 mReducedX = 0.6;
2999 }
3000
3001 auto* carbonBase2 = new TGeoBBox(
3002 Form("carbonBase2_D2_H%d", half),
3003 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
3004 (mSupportYDimensions[disk][0]) / 2., mCarbonThickness);
3005 auto* t21 = new TGeoTranslation(
3006 "t21", 0., (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
3007 t21->RegisterYourself();
3008
3009 auto* holeCarbon2 =
3010 new TGeoTubeSeg(Form("holeCarbon2_D2_H%d", half), 0., mRMin[disk],
3011 mCarbonThickness + 0.000001, 0, 180.);
3012 auto* t22 = new TGeoTranslation("t22", 0., -mHalfDiskGap, 0.);
3013 t22->RegisterYourself();
3014
3015 auto* carbonhole2 = new TGeoSubtraction(carbonBase2, holeCarbon2, t21, t22);
3016 auto* cs2 = new TGeoCompositeShape(Form("Carbon2_D2_H%d", half), carbonhole2);
3017 auto* carbonBaseWithHole2 =
3018 new TGeoVolume(Form("carbonBaseWithHole_D2_H%d", half), cs2, mCarbon);
3019
3020 carbonBaseWithHole2->SetLineColor(kGray + 3);
3021 rotation = new TGeoRotation("rotation", 0., 0., 0.);
3022 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3023 carbonPlate->AddNode(carbonBaseWithHole2, 0,
3024 new TGeoTranslation(0., 0., mZPlan[disk]));
3025
3026 Double_t ty = mSupportYDimensions[disk][0];
3027
3028 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
3029 ty += mSupportYDimensions[disk][ipart] / 2.;
3030
3031 auto* partCarbon0 =
3032 new TGeoBBox(Form("partCarbon0_D2_H%d_%d", half, ipart),
3033 mSupportXDimensions[disk][ipart] / 2.,
3034 mSupportYDimensions[disk][ipart] / 2., mCarbonThickness);
3035
3036 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
3037
3038 //======== notch of the carbon plate, fm ===
3039 TGeoVolume* partCarbonNotch;
3040 TGeoSubtraction* partCarbonini;
3041 TGeoBBox* notchCarbon2;
3042 TGeoTranslation* tnotch2;
3043 if (ipart == (mNPart[disk] - 1)) {
3044 notchCarbon2 = new TGeoBBox(Form("notchCarbon2_D2_H%d", half), 2.3, 0.6,
3045 mCarbonThickness + 0.000001);
3046 tnotch2 = new TGeoTranslation("tnotch2", 0.,
3047 mSupportYDimensions[disk][ipart] / 2., 0.);
3048 tnotch2->RegisterYourself();
3049
3050 partCarbonini =
3051 new TGeoSubtraction(partCarbon0, notchCarbon2, nullptr, tnotch2);
3052 auto* carbinit = new TGeoCompositeShape(
3053 Form("carbinit%d_D2_H%d", 0, half), partCarbonini);
3054 partCarbonNotch = new TGeoVolume(
3055 Form("partCarbonNotch_D2_H%d_%d", half, ipart), carbinit, mCarbon);
3056 partCarbonNotch->SetLineColor(kGray + 3);
3057 carbonPlate->AddNode(partCarbonNotch, ipart, t);
3058 }
3059 if (ipart < (mNPart[disk] - 1)) {
3060 auto* partCarbon = new TGeoVolume(
3061 Form("partCarbonNotch_D2_H%d_%d", half, ipart), partCarbon0, mCarbon);
3062 partCarbon->SetLineColor(kGray + 3);
3063 carbonPlate->AddNode(partCarbon, ipart, t);
3064 }
3065 //===========================================
3066 ty += mSupportYDimensions[disk][ipart] / 2.;
3067 }
3068
3069 rotation = new TGeoRotation("rotation", 180., 0., 0.);
3070 transformation = new TGeoCombiTrans(0., 0., deltaz / 2., rotation);
3071 mHalfDisk->AddNode(carbonPlate, 3, transformation);
3072 transformation = new TGeoCombiTrans(0., 0., -deltaz / 2., rotation);
3073 mHalfDisk->AddNode(carbonPlate, 4, transformation);
3074
3075 // **************************************** Glue Bwtween Carbon Plate and
3076 // Rohacell Plate ****************************************
3077 TGeoMedium* mGlueRohacellCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
3078 auto* glueRohacellCarbon =
3079 new TGeoVolumeAssembly(Form("glueRohacellCarbon_D0_H%d", half));
3080 auto* glueRohacellCarbonBase0 =
3081 new TGeoBBox(Form("glueRohacellCarbonBase0_D0_H%d", half),
3082 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
3083 (mSupportYDimensions[disk][0]) / 2.,
3085
3086 auto* translation_gluRC01 = new TGeoTranslation(
3087 "translation_gluRC01", 0.,
3088 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
3089 translation_gluRC01->RegisterYourself();
3090 auto* translation_gluRC02 =
3091 new TGeoTranslation("translation_gluRC02", 0., -mHalfDiskGap, 0.);
3092 translation_gluRC02->RegisterYourself();
3093
3094 auto* holeglueRohacellCarbon0 = new TGeoTubeSeg(
3095 Form("holeglueRohacellCarbon0_D0_H%d", half), 0., mRMin[disk],
3096 Geometry::sGlueRohacellCarbonThickness + 0.000001, 0, 180.);
3097
3098 auto* glueRohacellCarbonhole0 =
3099 new TGeoSubtraction(glueRohacellCarbonBase0, holeglueRohacellCarbon0,
3100 translation_gluRC01, translation_gluRC02);
3101 auto* gRC0 = new TGeoCompositeShape(Form("glueRohacellCarbon0_D0_H%d", half),
3102 glueRohacellCarbonhole0);
3103
3104 auto* glueRohacellCarbonBaseWithHole0 =
3105 new TGeoVolume(Form("glueRohacellCarbonWithHole_D0_H%d", half), gRC0,
3106 mGlueRohacellCarbon);
3107
3108 glueRohacellCarbonBaseWithHole0->SetLineColor(kGreen);
3109 rotation = new TGeoRotation("rotation", 0., 0., 0.);
3110 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3111 glueRohacellCarbon->AddNode(glueRohacellCarbonBaseWithHole0, 0,
3112 new TGeoTranslation(0., 0., mZPlan[disk]));
3113
3114 Double_t tyGRC = mSupportYDimensions[disk][0];
3115
3116 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
3117 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
3118 auto* partGlueRohacellCarbon =
3119 new TGeoBBox(Form("partGlueRohacellCarbon_D0_H%d_%d", half, ipart),
3120 mSupportXDimensions[disk][ipart] / 2.,
3121 mSupportYDimensions[disk][ipart] / 2.,
3123
3124 //======== notch of the glue, fm ===
3125 TGeoVolume* partGlueCarbonNotch;
3126 TGeoSubtraction* partGlueCarbonini;
3127 TGeoBBox* notchGlueCarbon2;
3128 TGeoTranslation* tnotch2;
3129 if (ipart == (mNPart[disk] - 1)) {
3130 notchGlueCarbon2 =
3131 new TGeoBBox(Form("notchGlueCarbon2_D2_H%d", half), 2.3, 0.6,
3133 tnotch2 = new TGeoTranslation("tnotch2", 0.,
3134 mSupportYDimensions[disk][ipart] / 2., 0.);
3135 tnotch2->RegisterYourself();
3136
3137 partGlueCarbonini = new TGeoSubtraction(
3138 partGlueRohacellCarbon, notchGlueCarbon2, nullptr, tnotch2);
3139 auto* gluecarbinit = new TGeoCompositeShape(
3140 Form("gluecarbinit%d_D2_H%d", 0, half), partGlueCarbonini);
3141 partGlueCarbonNotch =
3142 new TGeoVolume(Form("partGlueCarbonNotch_D2_H%d_%d", half, ipart),
3143 gluecarbinit, mGlueRohacellCarbon);
3144 partGlueCarbonNotch->SetLineColor(kGray + 3);
3145 }
3146
3147 auto* t = new TGeoTranslation("t", 0, tyGRC + mHalfDiskGap, mZPlan[disk]);
3148 if (ipart == (mNPart[disk] - 1)) {
3149 partGlueCarbonNotch->SetLineColor(kGreen);
3150 glueRohacellCarbon->AddNode(partGlueCarbonNotch, ipart, t);
3151 }
3152 if (ipart < (mNPart[disk] - 1)) {
3153 auto* partGlueCarbon =
3154 new TGeoVolume(Form("partGlueCarbon_D2_H%d_%d", half, ipart),
3155 partGlueRohacellCarbon, mGlueRohacellCarbon);
3156 partGlueCarbon->SetLineColor(kGreen);
3157 glueRohacellCarbon->AddNode(partGlueCarbon, ipart, t);
3158 }
3159
3160 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
3161 }
3162
3163 rotation = new TGeoRotation("rotation", 180., 0., 0.);
3164 transformation = new TGeoCombiTrans(
3165 0., 0.,
3166 deltaz / 2. - mCarbonThickness - Geometry::sGlueRohacellCarbonThickness,
3167 rotation);
3168 mHalfDisk->AddNode(glueRohacellCarbon, 3, transformation);
3169 transformation = new TGeoCombiTrans(0., 0.,
3170 -(deltaz / 2. - mCarbonThickness -
3172 rotation);
3173 mHalfDisk->AddNode(glueRohacellCarbon, 4, transformation);
3174
3175 // **************************************** Kapton on Carbon Plate
3176 // ****************************************
3177 TGeoMedium* mKaptonOnCarbon = gGeoManager->GetMedium("MFT_Kapton$");
3178
3179 auto* kaptonOnCarbon =
3180 new TGeoVolumeAssembly(Form("kaptonOnCarbon_D0_H%d", half));
3181 auto* kaptonOnCarbonBase0 = new TGeoBBox(
3182 Form("kaptonOnCarbonBase0_D0_H%d", half),
3183 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
3184 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonOnCarbonThickness);
3185
3186 auto* translation_KC01 = new TGeoTranslation(
3187 "translation_KC01", 0.,
3188 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
3189 translation_KC01->RegisterYourself();
3190 auto* translation_KC02 =
3191 new TGeoTranslation("translation_KC02", 0., -mHalfDiskGap, 0.);
3192 translation_KC02->RegisterYourself();
3193
3194 auto* holekaptonOnCarbon0 =
3195 new TGeoTubeSeg(Form("holekaptonOnCarbon0_D0_H%d", half), 0., mRMin[disk],
3196 Geometry::sKaptonOnCarbonThickness + 0.000001, 0, 180.);
3197
3198 auto* kaptonOnCarbonhole0 =
3199 new TGeoSubtraction(kaptonOnCarbonBase0, holekaptonOnCarbon0,
3200 translation_KC01, translation_KC02);
3201 auto* KC0 = new TGeoCompositeShape(Form("kaptonOnCarbon_D0_H%d", half),
3202 kaptonOnCarbonhole0);
3203 auto* kaptonOnCarbonBaseWithHole0 = new TGeoVolume(
3204 Form("kaptonOnCarbonWithHole_D0_H%d", half), KC0, mKaptonOnCarbon);
3205
3206 kaptonOnCarbonBaseWithHole0->SetLineColor(kMagenta);
3207 rotation = new TGeoRotation("rotation", 0., 0., 0.);
3208 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3209 kaptonOnCarbon->AddNode(kaptonOnCarbonBaseWithHole0, 0,
3210 new TGeoTranslation(0., 0., mZPlan[disk]));
3211
3212 Double_t tyKC = mSupportYDimensions[disk][0];
3213
3214 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
3215 tyKC += mSupportYDimensions[disk][ipart] / 2.;
3216
3217 auto* partKaptonOnCarbonBase =
3218 new TGeoBBox(Form("partKaptonOnCarbon_D0_H%d_%d", half, ipart),
3219 mSupportXDimensions[disk][ipart] / 2.,
3220 mSupportYDimensions[disk][ipart] / 2.,
3222
3223 //======== notch of the kapton, fm ===
3224 TGeoVolume* partKaptonNotch;
3225 TGeoSubtraction* partKaptonini;
3226 TGeoBBox* notchKapton2;
3227 TGeoTranslation* tnotch2;
3228 if (ipart == (mNPart[disk] - 1)) {
3229 notchKapton2 =
3230 new TGeoBBox(Form("notchKapton2_D2_H%d", half), 2.3, 0.6,
3232 tnotch2 = new TGeoTranslation("tnotch2", 0.,
3233 mSupportYDimensions[disk][ipart] / 2., 0.);
3234 tnotch2->RegisterYourself();
3235
3236 partKaptonini = new TGeoSubtraction(partKaptonOnCarbonBase, notchKapton2,
3237 nullptr, tnotch2);
3238 auto* kaptinit = new TGeoCompositeShape(
3239 Form("kaptinit%d_D2_H%d", 0, half), partKaptonini);
3240 partKaptonNotch =
3241 new TGeoVolume(Form("partKaptonNotch_D2_H%d_%d", half, ipart),
3242 kaptinit, mKaptonOnCarbon);
3243 }
3244
3245 auto* t = new TGeoTranslation("t", 0, tyKC + mHalfDiskGap, mZPlan[disk]);
3246 if (ipart == (mNPart[disk] - 1)) {
3247 partKaptonNotch->SetLineColor(kMagenta);
3248 kaptonOnCarbon->AddNode(partKaptonNotch, ipart, t);
3249 }
3250 if (ipart < (mNPart[disk] - 1)) {
3251 auto* partKapton =
3252 new TGeoVolume(Form("partKapton_D2_H%d_%d", half, ipart),
3253 partKaptonOnCarbonBase, mKaptonOnCarbon);
3254 partKapton->SetLineColor(kMagenta);
3255 kaptonOnCarbon->AddNode(partKapton, ipart, t);
3256 }
3257
3258 tyKC += mSupportYDimensions[disk][ipart] / 2.;
3259 }
3260
3261 rotation = new TGeoRotation("rotation", 180., 0., 0.);
3262 transformation = new TGeoCombiTrans(
3263 0., 0.,
3264 deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
3266 rotation);
3267 mHalfDisk->AddNode(kaptonOnCarbon, 3, transformation);
3268 transformation = new TGeoCombiTrans(
3269 0., 0.,
3270 -(deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
3272 rotation);
3273 mHalfDisk->AddNode(kaptonOnCarbon, 4, transformation);
3274
3275 // **************************************** Kapton glue on the carbon plate
3276 // ****************************************
3277 TGeoMedium* mGlueKaptonCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
3278 auto* glueKaptonCarbon =
3279 new TGeoVolumeAssembly(Form("glueKaptonCarbon_D0_H%d", half));
3280 auto* glueKaptonCarbonBase0 = new TGeoBBox(
3281 Form("glueKaptonCarbonBase0_D0_H%d", half),
3282 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
3283 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonGlueThickness);
3284
3285 auto* translation_gluKC01 = new TGeoTranslation(
3286 "translation_gluKC01", 0.,
3287 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
3288 translation_gluKC01->RegisterYourself();
3289 auto* translation_gluKC02 =
3290 new TGeoTranslation("translation_gluKC02", 0., -mHalfDiskGap, 0.);
3291 translation_gluKC02->RegisterYourself();
3292
3293 auto* holeglueKaptonCarbon0 = new TGeoTubeSeg(
3294 Form("holeglueKaptonCarbon0_D0_H%d", half), 0., mRMin[disk],
3295 Geometry::sKaptonGlueThickness + 0.000001, 0, 180.);
3296
3297 auto* glueKaptonCarbonhole0 =
3298 new TGeoSubtraction(glueKaptonCarbonBase0, holeglueKaptonCarbon0,
3299 translation_gluKC01, translation_gluKC02);
3300 auto* gKC0 = new TGeoCompositeShape(Form("glueKaptonCarbon0_D0_H%d", half),
3301 glueKaptonCarbonhole0);
3302 auto* glueKaptonCarbonBaseWithHole0 = new TGeoVolume(
3303 Form("glueKaptonCarbonWithHole_D0_H%d", half), gKC0, mGlueKaptonCarbon);
3304
3305 glueKaptonCarbonBaseWithHole0->SetLineColor(kGreen);
3306 rotation = new TGeoRotation("rotation", 0., 0., 0.);
3307 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3308 glueKaptonCarbon->AddNode(glueKaptonCarbonBaseWithHole0, 0,
3309 new TGeoTranslation(0., 0., mZPlan[disk]));
3310
3311 Double_t tyGKC = mSupportYDimensions[disk][0];
3312
3313 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
3314 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
3315
3316 auto* partGlueKaptonCarbon = new TGeoBBox(
3317 Form("partGlueKaptonCarbon_D0_H%d_%d", half, ipart),
3318 mSupportXDimensions[disk][ipart] / 2.,
3319 mSupportYDimensions[disk][ipart] / 2., Geometry::sKaptonGlueThickness);
3320
3321 //======== notch of the glue, fm ===
3322 TGeoVolume* partGlueKaptonNotch;
3323 TGeoSubtraction* partGlueKaptonini;
3324 TGeoBBox* notchGlueKapton2;
3325 TGeoTranslation* tnotch2;
3326 if (ipart == (mNPart[disk] - 1)) {
3327 notchGlueKapton2 =
3328 new TGeoBBox(Form("notchGlueKapton2_D2_H%d", half), 2.3, 0.6,
3330 tnotch2 = new TGeoTranslation("tnotch2", 0.,
3331 mSupportYDimensions[disk][ipart] / 2., 0.);
3332 tnotch2->RegisterYourself();
3333
3334 partGlueKaptonini = new TGeoSubtraction(
3335 partGlueKaptonCarbon, notchGlueKapton2, nullptr, tnotch2);
3336 auto* gluekaptinit = new TGeoCompositeShape(
3337 Form("gluekaptinit%d_D2_H%d", 0, half), partGlueKaptonini);
3338 partGlueKaptonNotch =
3339 new TGeoVolume(Form("partGlueKaptonNotch_D2_H%d_%d", half, ipart),
3340 gluekaptinit, mGlueKaptonCarbon);
3341 }
3342
3343 auto* t = new TGeoTranslation("t", 0, tyGKC + mHalfDiskGap, mZPlan[disk]);
3344
3345 if (ipart == (mNPart[disk] - 1)) {
3346 partGlueKaptonNotch->SetLineColor(kGreen);
3347 glueKaptonCarbon->AddNode(partGlueKaptonNotch, ipart, t);
3348 }
3349 if (ipart < (mNPart[disk] - 1)) {
3350 auto* partGlueKapton =
3351 new TGeoVolume(Form("partGlueKapton_D2_H%d_%d", half, ipart),
3352 partGlueKaptonCarbon, mGlueKaptonCarbon);
3353 partGlueKapton->SetLineColor(kGreen);
3354 glueKaptonCarbon->AddNode(partGlueKapton, ipart, t);
3355 }
3356
3357 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
3358 }
3359
3360 rotation = new TGeoRotation("rotation", 180., 0., 0.);
3361 transformation = new TGeoCombiTrans(
3362 0., 0., deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness,
3363 rotation);
3364 mHalfDisk->AddNode(glueKaptonCarbon, 3, transformation);
3365 transformation = new TGeoCombiTrans(
3366 0., 0.,
3367 -(deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness),
3368 rotation);
3369 mHalfDisk->AddNode(glueKaptonCarbon, 4, transformation);
3370
3371 // **************************************** Rohacell Plate
3372 // ****************************************
3373 auto* rohacellPlate =
3374 new TGeoVolumeAssembly(Form("rohacellPlate_D2_H%d", half));
3375 auto* rohacellBase2 = new TGeoBBox(
3376 Form("rohacellBase2_D2_H%d", half), (mSupportXDimensions[disk][0]) / 2.,
3377 (mSupportYDimensions[disk][0]) / 2., mRohacellThickness);
3378 auto* holeRohacell2 =
3379 new TGeoTubeSeg(Form("holeRohacell2_D2_H%d", half), 0., mRMin[disk],
3380 mRohacellThickness + 0.000001, 0, 180.);
3381
3382 // **************************************** GROOVES
3383 // *************************************************
3384 Double_t diameter = 0.21; // groove diameter
3385 Double_t epsilon = 0.06; // outside shift of the goove
3386 Int_t iCount = 0;
3387 Double_t mPosition[4];
3388 TGeoCombiTrans* transfo[7][3];
3389 TGeoTube* grooveTube[7][3];
3390 TGeoTorus* grooveTorus[7][3];
3391 TGeoSubtraction* rohacellBaseGroove[300];
3392 TGeoCompositeShape* rohacellGroove[300];
3393
3394 for (Int_t igroove = 0; igroove < 3; igroove++) {
3395 grooveTube[0][igroove] =
3396 new TGeoTube("linear", 0., diameter, mLWater2[igroove] / 2.);
3397 grooveTorus[1][igroove] = new TGeoTorus("SideTorus", mRadius2[igroove], 0.,
3398 diameter, 0., mAngle2[igroove]);
3399 grooveTube[2][igroove] =
3400 new TGeoTube("tiltedLinear", 0., diameter, mLpartial2[igroove] / 2.);
3401 grooveTorus[3][igroove] =
3402 new TGeoTorus("centralTorus", mRadiusCentralTore[igroove], 0., diameter,
3403 -mAngle2[igroove], 2. * mAngle2[igroove]);
3404 grooveTube[4][igroove] =
3405 new TGeoTube("tiltedLinear", 0., diameter, mLpartial2[igroove] / 2.);
3406 grooveTorus[5][igroove] = new TGeoTorus("SideTorus", mRadius2[igroove], 0.,
3407 diameter, 0., mAngle2[igroove]);
3408 grooveTube[6][igroove] =
3409 new TGeoTube("linear", 0., diameter, mLWater2[igroove] / 2.);
3410 }
3411
3412 // Rotation matrix
3413 TGeoRotation* rotationLinear = new TGeoRotation("rotation", -90., 90., 0.);
3414 TGeoRotation* rotationSideTorusL =
3415 new TGeoRotation("rotationSideTorusLeft", -90., 0., 0.);
3416 TGeoRotation* rotationSideTorusR =
3417 new TGeoRotation("rotationSideTorusRight", 90., 180., 180.);
3418 TGeoRotation* rotationCentralTorus =
3419 new TGeoRotation("rotationCentralTorus", 90., 0., 0.);
3420 TGeoRotation* rotationTiltedLinearR;
3421 TGeoRotation* rotationTiltedLinearL;
3422
3423 // Creating grooves
3424 if (Geometry::sGrooves == 1) {
3425 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
3426 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
3427 mPosition[igroove] = mXPosition2[igroove] -
3428 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.;
3429 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
3430
3431 switch (ip) {
3432 case 0: // Linear
3433 transfo[ip][igroove] = new TGeoCombiTrans(
3434 mSupportXDimensions[disk][0] / 2. + mMoreLength -
3435 mLWater2[igroove] / 2.,
3436 mPosition[igroove], iface * (mRohacellThickness + epsilon),
3437 rotationLinear);
3438 if (igroove == 0 && iface == 1) {
3439 rohacellBaseGroove[0] =
3440 new TGeoSubtraction(rohacellBase2, grooveTube[ip][igroove],
3441 nullptr, transfo[ip][igroove]);
3442 rohacellGroove[0] =
3443 new TGeoCompositeShape(Form("rohacell2Groove%d_G%d_F%d_H%d",
3444 ip, igroove, iface, half),
3445 rohacellBaseGroove[0]);
3446 };
3447 break;
3448 case 1: // side torus
3449 transfo[ip][igroove] = new TGeoCombiTrans(
3450 mSupportXDimensions[disk][0] / 2. + mMoreLength -
3451 mLWater2[igroove],
3452 mRadius2[igroove] + mXPosition2[igroove] -
3453 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.,
3454 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
3455 break;
3456 case 2: // Linear tilted
3457 rotationTiltedLinearR = new TGeoRotation(
3458 "rotationTiltedLinearRight", 90. - mAngle2[igroove], 90., 0.);
3459 transfo[ip][igroove] = new TGeoCombiTrans(
3460 mSupportXDimensions[disk][0] / 2. + mMoreLength -
3461 xPos2[igroove],
3462 yPos2[igroove] - mSupportYDimensions[disk][0] / 2. -
3463 mHalfDiskGap,
3464 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
3465 break;
3466 case 3: // Central Torus
3467 transfo[ip][igroove] = new TGeoCombiTrans(
3468 0.,
3469 yPos2[igroove] +
3470 mLpartial2[igroove] / 2 *
3471 TMath::Sin(mAngle2[igroove] * TMath::DegToRad()) -
3472 mRadiusCentralTore[igroove] *
3473 TMath::Cos(mAngle2[igroove] * TMath::DegToRad()) -
3474 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
3475 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
3476 break;
3477 case 4: // Linear tilted
3478 rotationTiltedLinearL = new TGeoRotation(
3479 "rotationTiltedLinearLeft", 90. + mAngle2[igroove], 90., 0.);
3480 transfo[ip][igroove] = new TGeoCombiTrans(
3481 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3482 xPos2[igroove]),
3483 yPos2[igroove] - mSupportYDimensions[disk][0] / 2. -
3484 mHalfDiskGap,
3485 iface * (mRohacellThickness + epsilon), rotationTiltedLinearL);
3486 break;
3487 case 5: // side torus
3488 transfo[ip][igroove] = new TGeoCombiTrans(
3489 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3490 mLWater2[igroove]),
3491 mRadius2[igroove] + mPosition[igroove],
3492 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
3493 break;
3494 case 6: // Linear
3495 transfo[ip][igroove] = new TGeoCombiTrans(
3496 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3497 mLWater2[igroove] / 2.),
3498 mPosition[igroove], iface * (mRohacellThickness + epsilon),
3499 rotationLinear);
3500 break;
3501 }
3502
3503 if (!(ip == 0 && igroove == 0 && iface == 1)) {
3504 if (ip & 1) {
3505 rohacellBaseGroove[iCount] = new TGeoSubtraction(
3506 rohacellGroove[iCount - 1], grooveTorus[ip][igroove], nullptr,
3507 transfo[ip][igroove]);
3508 } else {
3509 rohacellBaseGroove[iCount] = new TGeoSubtraction(
3510 rohacellGroove[iCount - 1], grooveTube[ip][igroove], nullptr,
3511 transfo[ip][igroove]);
3512 }
3513 rohacellGroove[iCount] =
3514 new TGeoCompositeShape(Form("rohacell2Groove%d_G%d_F%d_H%d",
3515 iCount, igroove, iface, half),
3516 rohacellBaseGroove[iCount]);
3517 }
3518 iCount++;
3519 }
3520 }
3521 }
3522 }
3523 // **************************************************************************************************
3524
3525 // Passage du beam pipe
3526 TGeoBoolNode* rohacellBase;
3527 if (Geometry::sGrooves == 0) {
3528 rohacellBase = new TGeoSubtraction(rohacellBase2, holeRohacell2, t21, t22);
3529 }
3530 if (Geometry::sGrooves == 1) {
3531 rohacellBase = new TGeoSubtraction(rohacellGroove[iCount - 1],
3532 holeRohacell2, t21, t22);
3533 }
3534 auto* rh2 = new TGeoCompositeShape(Form("rohacellTore%d_D2_H%d", 0, half),
3535 rohacellBase);
3536 auto* rohacellBaseWithHole =
3537 new TGeoVolume(Form("rohacellBaseWithHole_D2_H%d", half), rh2, mRohacell);
3538
3539 TGeoVolume* partRohacell;
3540 rohacellBaseWithHole->SetLineColor(kGray);
3541 rotation = new TGeoRotation("rotation", 0., 0., 0.);
3542 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3543 rohacellPlate->AddNode(rohacellBaseWithHole, 0,
3544 new TGeoTranslation(0., 0., mZPlan[disk]));
3545
3546 ty = mSupportYDimensions[disk][0];
3547
3548 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
3549 ty += mSupportYDimensions[disk][ipart] / 2.;
3550 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
3551
3552 //===========================================================================================================
3553 //===========================================================================================================
3554 auto* partRohacell0 =
3555 new TGeoBBox(Form("rohacellBase0_D2_H%d_%d", half, ipart),
3556 mSupportXDimensions[disk][ipart] / 2.,
3557 mSupportYDimensions[disk][ipart] / 2., mRohacellThickness);
3558
3559 if (Geometry::sGrooves == 1) {
3560 // ***************** Creating grooves for the other parts of the rohacell
3561 // plate **********************
3562 Double_t mShift;
3563 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
3564 for (Int_t igroove = 0; igroove < 3; igroove++) { // 3 grooves
3565 if (ipart == 1) {
3566 mPosition[ipart] =
3567 mXPosition2[igroove] - mSupportYDimensions[disk][ipart] / 2. -
3568 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1];
3569 mShift = -mSupportYDimensions[disk][ipart - 1];
3570 };
3571 if (ipart == 2) {
3572 mPosition[ipart] =
3573 mXPosition2[igroove] - mSupportYDimensions[disk][ipart] / 2. -
3574 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
3575 mSupportYDimensions[disk][ipart - 2];
3576 mShift = -mSupportYDimensions[disk][ipart - 1] -
3577 mSupportYDimensions[disk][ipart - 2];
3578 };
3579 if (ipart == 3) {
3580 mPosition[ipart] =
3581 mXPosition2[igroove] - mSupportYDimensions[disk][ipart] / 2. -
3582 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
3583 mSupportYDimensions[disk][ipart - 2] -
3584 mSupportYDimensions[disk][ipart - 3];
3585 mShift = -mSupportYDimensions[disk][ipart - 1] -
3586 mSupportYDimensions[disk][ipart - 2] -
3587 mSupportYDimensions[disk][ipart - 3];
3588 };
3589
3590 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
3591
3592 switch (ip) {
3593 case 0: // Linear
3594 transfo[ip][igroove] = new TGeoCombiTrans(
3595 mSupportXDimensions[disk][0] / 2. + mMoreLength -
3596 mLWater2[igroove] / 2.,
3597 mPosition[ipart], iface * (mRohacellThickness + epsilon),
3598 rotationLinear);
3599 if (igroove == 0 && iface == 1) {
3600 rohacellBaseGroove[iCount] =
3601 new TGeoSubtraction(partRohacell0, grooveTube[ip][igroove],
3602 nullptr, transfo[ip][igroove]);
3603 rohacellGroove[iCount] =
3604 new TGeoCompositeShape(Form("rohacell2Groove%d_G%d_F%d_H%d",
3605 ip, igroove, iface, half),
3606 rohacellBaseGroove[iCount]);
3607 };
3608 break;
3609 case 1: // side torus
3610 transfo[ip][igroove] = new TGeoCombiTrans(
3611 mSupportXDimensions[2][0] / 2. + mMoreLength -
3612 mLWater2[igroove],
3613 mPosition[ipart] + mRadius2[igroove] - diameter / 2.,
3614 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
3615 break;
3616 case 2: // Linear tilted
3617 rotationTiltedLinearR = new TGeoRotation(
3618 "rotationTiltedLinearRight", 90. - mAngle2[igroove], 90., 0.);
3619 transfo[ip][igroove] =
3620 new TGeoCombiTrans(mSupportXDimensions[disk][0] / 2. +
3621 mMoreLength - xPos2[igroove],
3622 yPos2[igroove] + mShift - mHalfDiskGap -
3623 mSupportYDimensions[disk][ipart] / 2.,
3624 iface * (mRohacellThickness + epsilon),
3625 rotationTiltedLinearR);
3626 break;
3627 case 3: // Central Torus
3628 transfo[ip][igroove] = new TGeoCombiTrans(
3629 0.,
3630 mPosition[ipart] + yPos2[igroove] +
3631 mLpartial2[igroove] / 2 *
3632 TMath::Sin(mAngle2[igroove] * TMath::DegToRad()) -
3633 mRadiusCentralTore[igroove] *
3634 TMath::Cos(mAngle2[igroove] * TMath::DegToRad()) -
3635 mXPosition2[igroove],
3636 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
3637 break;
3638 case 4: // Linear tilted
3639 rotationTiltedLinearL = new TGeoRotation(
3640 "rotationTiltedLinearLeft", 90. + mAngle2[igroove], 90., 0.);
3641 transfo[ip][igroove] = new TGeoCombiTrans(
3642 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3643 xPos2[igroove]),
3644 yPos2[igroove] + mPosition[ipart] - mXPosition2[igroove],
3645 iface * (mRohacellThickness + epsilon),
3646 rotationTiltedLinearL);
3647 break;
3648 case 5: // side torus
3649 transfo[ip][igroove] = new TGeoCombiTrans(
3650 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3651 mLWater2[igroove]),
3652 mRadius2[igroove] + mPosition[ipart] - diameter / 2.,
3653 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
3654 break;
3655 case 6: // Linear
3656 transfo[ip][igroove] = new TGeoCombiTrans(
3657 -(mSupportXDimensions[disk][0] / 2. + mMoreLength -
3658 mLWater2[igroove] / 2.),
3659 mPosition[ipart], iface * (mRohacellThickness + epsilon),
3660 rotationLinear);
3661 break;
3662 }
3663 if (!(ip == 0 && igroove == 0 && iface == 1)) {
3664 if (ip & 1) {
3665 rohacellBaseGroove[iCount] = new TGeoSubtraction(
3666 rohacellGroove[iCount - 1], grooveTorus[ip][igroove],
3667 nullptr, transfo[ip][igroove]);
3668 } else {
3669 rohacellBaseGroove[iCount] = new TGeoSubtraction(
3670 rohacellGroove[iCount - 1], grooveTube[ip][igroove],
3671 nullptr, transfo[ip][igroove]);
3672 }
3673
3674 rohacellGroove[iCount] =
3675 new TGeoCompositeShape(Form("rohacell2Groove%d_G%d_F%d_H%d",
3676 iCount, igroove, iface, half),
3677 rohacellBaseGroove[iCount]);
3678 }
3679 iCount++;
3680 }
3681 }
3682 }
3683 }
3684 // **************************************************************************************************
3685
3686 //============= notches of the rohacell plate, fm ===============
3687 TGeoVolume* partRohacellNotch;
3688 TGeoSubtraction* partRohacellini1;
3689 TGeoSubtraction* partRohacellini2;
3690 TGeoBBox* notchRohacell21;
3691 TGeoTranslation* tnotch21;
3692 TGeoBBox* notchRohacell22;
3693 TGeoTranslation* tnotch22;
3694 if (ipart == (mNPart[disk] - 1)) {
3695 notchRohacell21 = new TGeoBBox(Form("notchRohacell21_D2_H%d", half), 2.3,
3696 0.6, mRohacellThickness + 0.000001);
3697 tnotch21 = new TGeoTranslation("tnotch21", 0.,
3698 mSupportYDimensions[disk][ipart] / 2., 0.);
3699 tnotch21->RegisterYourself();
3700 notchRohacell22 = new TGeoBBox(Form("notchRohacell22_D2_H%d", half), 1.1,
3701 0.6, mRohacellThickness + 0.000001);
3702 tnotch22 = new TGeoTranslation(
3703 "tnotch22", 0., mSupportYDimensions[disk][ipart] / 2. - 0.4, 0.);
3704 tnotch22->RegisterYourself();
3705 }
3706 //=============================================================
3707
3708 if (Geometry::sGrooves == 0) {
3709 if (ipart == (mNPart[disk] - 1)) {
3710 partRohacellini1 = new TGeoSubtraction(partRohacell0, notchRohacell21,
3711 nullptr, tnotch21);
3712 auto* rhinit1 = new TGeoCompositeShape(
3713 Form("rhinit1%d_D2_H%d", 0, half), partRohacellini1);
3714 partRohacellini2 =
3715 new TGeoSubtraction(rhinit1, notchRohacell22, nullptr, tnotch22);
3716 auto* rhinit2 = new TGeoCompositeShape(
3717 Form("rhinit2%d_D2_H%d", 0, half), partRohacellini2);
3718 partRohacell = new TGeoVolume(
3719 Form("partRohacelli_D2_H%d_%d", half, ipart), rhinit2, mRohacell);
3720 }
3721 if (ipart < (mNPart[disk] - 1)) {
3722 partRohacell =
3723 new TGeoVolume(Form("partRohacelli_D2_H%d_%d", half, ipart),
3724 partRohacell0, mRohacell);
3725 }
3726 }
3727 if (Geometry::sGrooves == 1) {
3728 if (ipart == (mNPart[disk] - 1)) {
3729 partRohacellini1 = new TGeoSubtraction(
3730 rohacellGroove[iCount - 1], notchRohacell21, nullptr, tnotch21);
3731 auto* rhinit1 = new TGeoCompositeShape(
3732 Form("rhinit1%d_D2_H%d", 0, half), partRohacellini1);
3733 partRohacellini2 =
3734 new TGeoSubtraction(rhinit1, notchRohacell22, nullptr, tnotch22);
3735 auto* rhinit2 = new TGeoCompositeShape(
3736 Form("rhinit2%d_D2_H%d", 0, half), partRohacellini2);
3737 partRohacell = new TGeoVolume(
3738 Form("partRohacelli_D2_H%d_%d", half, ipart), rhinit2, mRohacell);
3739 }
3740 if (ipart < (mNPart[disk] - 1)) {
3741 partRohacell =
3742 new TGeoVolume(Form("partRohacelli_D2_H%d_%d", half, ipart),
3743 rohacellGroove[iCount - 1], mRohacell);
3744 }
3745 }
3746
3747 //===========================================================================================================
3748 //===========================================================================================================
3749 partRohacell->SetLineColor(kGray);
3750 rohacellPlate->AddNode(partRohacell, ipart, t);
3751 ty += mSupportYDimensions[disk][ipart] / 2.;
3752
3753 //========== insert to locate the rohacell plate compare to the disk support
3754 //=============
3755 if (ipart == (mNPart[disk] - 1)) {
3756 TGeoTranslation* tinsert2;
3757 TGeoVolume* insert2 =
3758 gGeoManager->MakeBox(Form("insert2_H%d_%d", half, ipart), mPeek, 1.0,
3759 0.40 / 2., mRohacellThickness);
3760 Double_t ylocation = mSupportYDimensions[disk][0] + mHalfDiskGap - 0.80;
3761 for (Int_t ip = 1; ip < mNPart[disk]; ip++) {
3762 ylocation = ylocation + mSupportYDimensions[disk][ip];
3763 }
3764 tinsert2 = new TGeoTranslation("tinsert2", 0., -ylocation, 0.);
3765 tinsert2->RegisterYourself();
3766 mHalfDisk->AddNode(insert2, 0., tinsert2);
3767 }
3768 //========================================================================================
3769 }
3770
3771 rotation = new TGeoRotation("rotation", 180., 0., 0.);
3772 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
3773 mHalfDisk->AddNode(rohacellPlate, 2, transformation);
3774
3775 createManifold(disk);
3776 createCoolingPipes(half, disk);
3777}
3778
3779//_____________________________________________________________________________
3781{
3782
3783 Int_t disk = 3;
3784
3785 if (half == Top) {
3786 printf("Creating MFT heat exchanger for disk3 top\n");
3787 } else if (half == Bottom) {
3788 printf("Creating MFT heat exchanger for disk3 bottom\n");
3789 } else {
3790 printf("No valid option for MFT heat exchanger on disk3\n");
3791 }
3792
3793 mCarbon = gGeoManager->GetMedium("MFT_CarbonFiber$");
3794 mWater = gGeoManager->GetMedium("MFT_Water$");
3795 mRohacell = gGeoManager->GetMedium("MFT_Rohacell$");
3796 mPipe = gGeoManager->GetMedium("MFT_Polyimide$");
3797 mPeek = gGeoManager->GetMedium("MFT_PEEK$");
3798
3799 auto* cooling = new TGeoVolumeAssembly(Form("cooling_D3_H%d", half));
3800
3801 TGeoTranslation* translation = nullptr;
3802 TGeoRotation* rotation = nullptr;
3803 TGeoCombiTrans* transformation = nullptr;
3804
3805 // **************************************** Water part
3806 // ****************************************
3807 // ********************** Four parameters mLwater3, mRadius3, mAngle3,
3808 // mLpartial3 *************
3809 Double_t ivolume = 300; // offset chamber 3
3810 Double_t mRadiusCentralTore[4];
3811 Double_t xPos3[4];
3812 Double_t yPos3[4];
3813
3814 for (Int_t itube = 0; itube < 4; itube++) {
3815 TGeoVolume* waterTube1 =
3816 gGeoManager->MakeTube(Form("waterTube1%d_D3_H%d", itube, half), mWater,
3817 0., mRWater, mLWater3[itube] / 2.);
3818 translation = new TGeoTranslation(mXPosition3[itube] - mHalfDiskGap, 0.,
3819 mSupportXDimensions[3][0] / 2. +
3820 mMoreLength - mLWater3[itube] / 2.);
3821 cooling->AddNode(waterTube1, ivolume++, translation);
3822
3823 TGeoVolume* waterTorus1 = gGeoManager->MakeTorus(
3824 Form("waterTorus1%d_D3_H%d", itube, half), mWater, mRadius3[itube], 0.,
3825 mRWater, 0., mAngle3[itube]);
3826 rotation = new TGeoRotation("rotation", 180., -90., 0.);
3827 transformation = new TGeoCombiTrans(
3828 mRadius3[itube] + mXPosition3[itube] - mHalfDiskGap, 0.,
3829 mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube],
3830 rotation);
3831 cooling->AddNode(waterTorus1, ivolume++, transformation);
3832
3833 TGeoVolume* waterTube2 =
3834 gGeoManager->MakeTube(Form("waterTube2%d_D3_H%d", itube, half), mWater,
3835 0., mRWater, mLpartial3[itube] / 2.);
3836 rotation = new TGeoRotation("rotation", 90., 180 - mAngle3[itube], 0.);
3837 xPos3[itube] =
3838 mLWater3[itube] +
3839 mRadius3[itube] * TMath::Sin(mAngle3[itube] * TMath::DegToRad()) +
3840 mLpartial3[itube] / 2 * TMath::Cos(mAngle3[itube] * TMath::DegToRad());
3841 yPos3[itube] =
3842 mXPosition3[itube] - mHalfDiskGap +
3843 mRadius3[itube] * (1 - TMath::Cos(mAngle3[itube] * TMath::DegToRad())) +
3844 mLpartial3[itube] / 2 * TMath::Sin(mAngle3[itube] * TMath::DegToRad());
3845 transformation = new TGeoCombiTrans(
3846 yPos3[itube], 0.,
3847 mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube], rotation);
3848 cooling->AddNode(waterTube2, ivolume++, transformation);
3849
3850 mRadiusCentralTore[itube] =
3851 (mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube] -
3852 mLpartial3[itube] / 2 *
3853 TMath::Cos(mAngle3[itube] * TMath::DegToRad())) /
3854 TMath::Sin(mAngle3[itube] * TMath::DegToRad());
3855 TGeoVolume* waterTorusCentral =
3856 gGeoManager->MakeTorus(Form("waterTorusCentral%d_D3_H%d", itube, half),
3857 mWater, mRadiusCentralTore[itube], 0., mRWater,
3858 -mAngle3[itube], 2. * mAngle3[itube]);
3859 rotation = new TGeoRotation("rotation", 0., 90., 0.);
3860 transformation = new TGeoCombiTrans(
3861 yPos3[itube] +
3862 mLpartial3[itube] / 2 *
3863 TMath::Sin(mAngle3[itube] * TMath::DegToRad()) -
3864 mRadiusCentralTore[itube] *
3865 TMath::Cos(mAngle3[itube] * TMath::DegToRad()),
3866 0., 0., rotation);
3867 cooling->AddNode(waterTorusCentral, ivolume++, transformation);
3868
3869 TGeoVolume* waterTube3 =
3870 gGeoManager->MakeTube(Form("waterTube3%d_D3_H%d", 2, half), mWater, 0.,
3871 mRWater, mLpartial3[itube] / 2.);
3872 rotation = new TGeoRotation("rotation", -90., 0 - mAngle3[itube], 0.);
3873 transformation = new TGeoCombiTrans(
3874 yPos3[itube], 0.,
3875 -(mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube]),
3876 rotation);
3877 cooling->AddNode(waterTube3, ivolume++, transformation);
3878
3879 TGeoVolume* waterTorus2 = gGeoManager->MakeTorus(
3880 Form("waterTorus2%d_D3_H%d", itube, half), mWater, mRadius3[itube], 0.,
3881 mRWater, 0., mAngle3[itube]);
3882 rotation = new TGeoRotation("rotation", 180., 90., 0.);
3883 transformation = new TGeoCombiTrans(
3884 mRadius3[itube] + mXPosition3[itube] - mHalfDiskGap, 0.,
3885 -(mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube]),
3886 rotation);
3887 cooling->AddNode(waterTorus2, ivolume++, transformation);
3888
3889 TGeoVolume* waterTube4 =
3890 gGeoManager->MakeTube(Form("waterTube4%d_D3_H%d", itube, half), mWater,
3891 0., mRWater, mLWater3[itube] / 2.);
3892 translation = new TGeoTranslation(
3893 mXPosition3[itube] - mHalfDiskGap, 0.,
3894 -(mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube] / 2.));
3895 cooling->AddNode(waterTube4, ivolume++, translation);
3896 }
3897
3898 // **************************************************** Tube part
3899 // ************************************************
3900 // ****************************** Four parameters mLwater3, mRadius3, mAngle3,
3901 // mLpartial3 ************************
3902 for (Int_t itube = 0; itube < 4; itube++) {
3903 TGeoVolume* pipeTube1 =
3904 gGeoManager->MakeTube(Form("pipeTube1%d_D3_H%d", itube, half), mPipe,
3905 mRWater, mRWater + mDRPipe, mLWater3[itube] / 2.);
3906 translation = new TGeoTranslation(mXPosition3[itube] - mHalfDiskGap, 0.,
3907 mSupportXDimensions[3][0] / 2. +
3908 mMoreLength - mLWater3[itube] / 2.);
3909 cooling->AddNode(pipeTube1, ivolume++, translation);
3910
3911 TGeoVolume* pipeTorus1 = gGeoManager->MakeTorus(
3912 Form("pipeTorus1%d_D3_H%d", itube, half), mPipe, mRadius3[itube],
3913 mRWater, mRWater + mDRPipe, 0., mAngle3[itube]);
3914 rotation = new TGeoRotation("rotation", 180., -90., 0.);
3915 transformation = new TGeoCombiTrans(
3916 mRadius3[itube] + mXPosition3[itube] - mHalfDiskGap, 0.,
3917 mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube],
3918 rotation);
3919 cooling->AddNode(pipeTorus1, ivolume++, transformation);
3920
3921 TGeoVolume* pipeTube2 = gGeoManager->MakeTube(
3922 Form("pipeTube2%d_D3_H%d", itube, half), mPipe, mRWater,
3923 mRWater + mDRPipe, mLpartial3[itube] / 2.);
3924 rotation = new TGeoRotation("rotation", 90., 180 - mAngle3[itube], 0.);
3925 xPos3[itube] =
3926 mLWater3[itube] +
3927 mRadius3[itube] * TMath::Sin(mAngle3[itube] * TMath::DegToRad()) +
3928 mLpartial3[itube] / 2 * TMath::Cos(mAngle3[itube] * TMath::DegToRad());
3929 yPos3[itube] =
3930 mXPosition3[itube] - mHalfDiskGap +
3931 mRadius3[itube] * (1 - TMath::Cos(mAngle3[itube] * TMath::DegToRad())) +
3932 mLpartial3[itube] / 2 * TMath::Sin(mAngle3[itube] * TMath::DegToRad());
3933 transformation = new TGeoCombiTrans(
3934 yPos3[itube], 0.,
3935 mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube], rotation);
3936 cooling->AddNode(pipeTube2, ivolume++, transformation);
3937
3938 mRadiusCentralTore[itube] =
3939 (mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube] -
3940 mLpartial3[itube] / 2 *
3941 TMath::Cos(mAngle3[itube] * TMath::DegToRad())) /
3942 TMath::Sin(mAngle3[itube] * TMath::DegToRad());
3943 TGeoVolume* pipeTorusCentral = gGeoManager->MakeTorus(
3944 Form("pipeTorusCentral%d_D3_H%d", itube, half), mPipe,
3945 mRadiusCentralTore[itube], mRWater, mRWater + mDRPipe, -mAngle3[itube],
3946 2. * mAngle3[itube]);
3947 rotation = new TGeoRotation("rotation", 0., 90., 0.);
3948 transformation = new TGeoCombiTrans(
3949 yPos3[itube] +
3950 mLpartial3[itube] / 2 *
3951 TMath::Sin(mAngle3[itube] * TMath::DegToRad()) -
3952 mRadiusCentralTore[itube] *
3953 TMath::Cos(mAngle3[itube] * TMath::DegToRad()),
3954 0., 0., rotation);
3955 cooling->AddNode(pipeTorusCentral, ivolume++, transformation);
3956
3957 TGeoVolume* pipeTube3 = gGeoManager->MakeTube(
3958 Form("pipeTube3%d_D3_H%d", 2, half), mPipe, mRWater, mRWater + mDRPipe,
3959 mLpartial3[itube] / 2.);
3960 rotation = new TGeoRotation("rotation", -90., 0 - mAngle3[itube], 0.);
3961 transformation = new TGeoCombiTrans(
3962 yPos3[itube], 0.,
3963 -(mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[itube]),
3964 rotation);
3965 cooling->AddNode(pipeTube3, ivolume++, transformation);
3966
3967 TGeoVolume* pipeTorus2 = gGeoManager->MakeTorus(
3968 Form("pipeTorus2%d_D3_H%d", itube, half), mPipe, mRadius3[itube],
3969 mRWater, mRWater + mDRPipe, 0., mAngle3[itube]);
3970 rotation = new TGeoRotation("rotation", 180., 90., 0.);
3971 transformation = new TGeoCombiTrans(
3972 mRadius3[itube] + mXPosition3[itube] - mHalfDiskGap, 0.,
3973 -(mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube]),
3974 rotation);
3975 cooling->AddNode(pipeTorus2, ivolume++, transformation);
3976
3977 TGeoVolume* pipeTube4 =
3978 gGeoManager->MakeTube(Form("pipeTube4%d_D3_H%d", itube, half), mPipe,
3979 mRWater, mRWater + mDRPipe, mLWater3[itube] / 2.);
3980 translation = new TGeoTranslation(
3981 mXPosition3[itube] - mHalfDiskGap, 0.,
3982 -(mSupportXDimensions[3][0] / 2. + mMoreLength - mLWater3[itube] / 2.));
3983 cooling->AddNode(pipeTube4, ivolume++, translation);
3984 }
3985 // ***********************************************************************************************
3986
3987 Double_t deltaz = mHeatExchangerThickness -
3989 Geometry::sKaptonGlueThickness * 4 - 2 * mCarbonThickness;
3990
3991 rotation = new TGeoRotation("rotation", -90., 90., 0.);
3992 transformation = new TGeoCombiTrans(
3993 0., 0.,
3994 mZPlan[disk] + deltaz / 2. - mCarbonThickness - mRWater - mDRPipe -
3996 rotation);
3997 mHalfDisk->AddNode(cooling, 3, transformation);
3998 transformation = new TGeoCombiTrans(
3999 0., 0.,
4000 mZPlan[disk] - deltaz / 2. + mCarbonThickness + mRWater + mDRPipe +
4002 rotation);
4003 mHalfDisk->AddNode(cooling, 4, transformation);
4004
4005 // **************************************** Carbon Plates
4006 // ****************************************
4007 auto* carbonPlate = new TGeoVolumeAssembly(Form("carbonPlate_D3_H%d", half));
4008
4009 auto& mftBaseParam = MFTBaseParam::Instance();
4010 Double_t mReducedX = 0.;
4011 if (mftBaseParam.buildAlignment) {
4012 mReducedX = 0.6;
4013 }
4014
4015 auto* carbonBase3 = new TGeoBBox(
4016 Form("carbonBase3_D3_H%d", half),
4017 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
4018 (mSupportYDimensions[disk][0]) / 2., mCarbonThickness);
4019 auto* t31 = new TGeoTranslation(
4020 "t31", 0., (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4021 t31->RegisterYourself();
4022
4023 auto* holeCarbon3 =
4024 new TGeoTubeSeg(Form("holeCarbon3_D3_H%d", half), 0., mRMin[disk],
4025 mCarbonThickness + 0.000001, 0, 180.);
4026 auto* t32 = new TGeoTranslation("t32", 0., -mHalfDiskGap, 0.);
4027 t32->RegisterYourself();
4028
4029 auto* carbonhole3 = new TGeoSubtraction(carbonBase3, holeCarbon3, t31, t32);
4030 auto* cs3 = new TGeoCompositeShape(Form("Carbon3_D3_H%d", half), carbonhole3);
4031 auto* carbonBaseWithHole3 =
4032 new TGeoVolume(Form("carbonBaseWithHole_D3_H%d", half), cs3, mCarbon);
4033
4034 carbonBaseWithHole3->SetLineColor(kGray + 3);
4035 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4036 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4037 carbonPlate->AddNode(carbonBaseWithHole3, 0,
4038 new TGeoTranslation(0., 0., mZPlan[disk]));
4039
4040 Double_t ty = mSupportYDimensions[disk][0];
4041
4042 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4043 ty += mSupportYDimensions[disk][ipart] / 2.;
4044 TGeoVolume* partCarbon = gGeoManager->MakeBox(
4045 Form("partCarbon_D3_H%d_%d", half, ipart), mCarbon,
4046 mSupportXDimensions[disk][ipart] / 2.,
4047 mSupportYDimensions[disk][ipart] / 2., mCarbonThickness);
4048 partCarbon->SetLineColor(kGray + 3);
4049 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
4050 carbonPlate->AddNode(partCarbon, ipart, t);
4051 ty += mSupportYDimensions[disk][ipart] / 2.;
4052 }
4053
4054 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4055 transformation = new TGeoCombiTrans(0., 0., deltaz / 2., rotation);
4056 mHalfDisk->AddNode(carbonPlate, 3, transformation);
4057 transformation = new TGeoCombiTrans(0., 0., -deltaz / 2., rotation);
4058 mHalfDisk->AddNode(carbonPlate, 4, transformation);
4059
4060 // **************************************** Glue Bwtween Carbon Plate and
4061 // Rohacell Plate ****************************************
4062 TGeoMedium* mGlueRohacellCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
4063 auto* glueRohacellCarbon =
4064 new TGeoVolumeAssembly(Form("glueRohacellCarbon_D0_H%d", half));
4065 auto* glueRohacellCarbonBase0 =
4066 new TGeoBBox(Form("glueRohacellCarbonBase0_D0_H%d", half),
4067 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
4068 (mSupportYDimensions[disk][0]) / 2.,
4070
4071 auto* translation_gluRC01 = new TGeoTranslation(
4072 "translation_gluRC01", 0.,
4073 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4074 translation_gluRC01->RegisterYourself();
4075 auto* translation_gluRC02 =
4076 new TGeoTranslation("translation_gluRC02", 0., -mHalfDiskGap, 0.);
4077 translation_gluRC02->RegisterYourself();
4078
4079 auto* holeglueRohacellCarbon0 = new TGeoTubeSeg(
4080 Form("holeglueRohacellCarbon0_D0_H%d", half), 0., mRMin[disk],
4081 Geometry::sGlueRohacellCarbonThickness + 0.000001, 0, 180.);
4082
4083 auto* glueRohacellCarbonhole0 =
4084 new TGeoSubtraction(glueRohacellCarbonBase0, holeglueRohacellCarbon0,
4085 translation_gluRC01, translation_gluRC02);
4086 auto* gRC0 = new TGeoCompositeShape(Form("glueRohacellCarbon0_D0_H%d", half),
4087 glueRohacellCarbonhole0);
4088 auto* glueRohacellCarbonBaseWithHole0 =
4089 new TGeoVolume(Form("glueRohacellCarbonWithHole_D0_H%d", half), gRC0,
4090 mGlueRohacellCarbon);
4091
4092 glueRohacellCarbonBaseWithHole0->SetLineColor(kGreen);
4093 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4094 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4095 glueRohacellCarbon->AddNode(glueRohacellCarbonBaseWithHole0, 0,
4096 new TGeoTranslation(0., 0., mZPlan[disk]));
4097
4098 Double_t tyGRC = mSupportYDimensions[disk][0];
4099
4100 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4101 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
4102 TGeoVolume* partGlueRohacellCarbon = gGeoManager->MakeBox(
4103 Form("partGlueRohacellCarbon_D0_H%d_%d", half, ipart),
4104 mGlueRohacellCarbon, mSupportXDimensions[disk][ipart] / 2.,
4105 mSupportYDimensions[disk][ipart] / 2.,
4107 partGlueRohacellCarbon->SetLineColor(kGreen);
4108 auto* t = new TGeoTranslation("t", 0, tyGRC + mHalfDiskGap, mZPlan[disk]);
4109 glueRohacellCarbon->AddNode(partGlueRohacellCarbon, ipart, t);
4110 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
4111 }
4112
4113 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4114 transformation = new TGeoCombiTrans(
4115 0., 0.,
4116 deltaz / 2. - mCarbonThickness - Geometry::sGlueRohacellCarbonThickness,
4117 rotation);
4118 mHalfDisk->AddNode(glueRohacellCarbon, 3, transformation);
4119 transformation = new TGeoCombiTrans(0., 0.,
4120 -(deltaz / 2. - mCarbonThickness -
4122 rotation);
4123 mHalfDisk->AddNode(glueRohacellCarbon, 4, transformation);
4124
4125 // **************************************** Kapton on Carbon Plate
4126 // ****************************************
4127 TGeoMedium* mKaptonOnCarbon = gGeoManager->GetMedium("MFT_Kapton$");
4128 auto* kaptonOnCarbon =
4129 new TGeoVolumeAssembly(Form("kaptonOnCarbon_D0_H%d", half));
4130 auto* kaptonOnCarbonBase0 = new TGeoBBox(
4131 Form("kaptonOnCarbonBase0_D0_H%d", half),
4132 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
4133 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonOnCarbonThickness);
4134
4135 auto* translation_KC01 = new TGeoTranslation(
4136 "translation_KC01", 0.,
4137 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4138 translation_KC01->RegisterYourself();
4139 auto* translation_KC02 =
4140 new TGeoTranslation("translation_KC02", 0., -mHalfDiskGap, 0.);
4141 translation_KC02->RegisterYourself();
4142
4143 auto* holekaptonOnCarbon0 =
4144 new TGeoTubeSeg(Form("holekaptonOnCarbon0_D0_H%d", half), 0., mRMin[disk],
4145 Geometry::sKaptonOnCarbonThickness + 0.000001, 0, 180.);
4146
4147 auto* kaptonOnCarbonhole0 =
4148 new TGeoSubtraction(kaptonOnCarbonBase0, holekaptonOnCarbon0,
4149 translation_KC01, translation_KC02);
4150 auto* KC0 = new TGeoCompositeShape(Form("kaptonOnCarbon_D0_H%d", half),
4151 kaptonOnCarbonhole0);
4152 auto* kaptonOnCarbonBaseWithHole0 = new TGeoVolume(
4153 Form("kaptonOnCarbonWithHole_D0_H%d", half), KC0, mKaptonOnCarbon);
4154
4155 kaptonOnCarbonBaseWithHole0->SetLineColor(kMagenta);
4156 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4157 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4158 kaptonOnCarbon->AddNode(kaptonOnCarbonBaseWithHole0, 0,
4159 new TGeoTranslation(0., 0., mZPlan[disk]));
4160
4161 Double_t tyKC = mSupportYDimensions[disk][0];
4162
4163 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4164 tyKC += mSupportYDimensions[disk][ipart] / 2.;
4165 TGeoVolume* partkaptonOnCarbonBase = gGeoManager->MakeBox(
4166 Form("partkaptonOnCarbon_D0_H%d_%d", half, ipart), mKaptonOnCarbon,
4167 mSupportXDimensions[disk][ipart] / 2.,
4168 mSupportYDimensions[disk][ipart] / 2.,
4170 partkaptonOnCarbonBase->SetLineColor(kMagenta);
4171 auto* t = new TGeoTranslation("t", 0, tyKC + mHalfDiskGap, mZPlan[disk]);
4172 kaptonOnCarbon->AddNode(partkaptonOnCarbonBase, ipart, t);
4173 tyKC += mSupportYDimensions[disk][ipart] / 2.;
4174 }
4175
4176 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4177 transformation = new TGeoCombiTrans(
4178 0., 0.,
4179 deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
4181 rotation);
4182 mHalfDisk->AddNode(kaptonOnCarbon, 3, transformation);
4183 transformation = new TGeoCombiTrans(
4184 0., 0.,
4185 -(deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
4187 rotation);
4188 mHalfDisk->AddNode(kaptonOnCarbon, 4, transformation);
4189
4190 // **************************************** Kapton glue on the carbon plate
4191 // ****************************************
4192 TGeoMedium* mGlueKaptonCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
4193 auto* glueKaptonCarbon =
4194 new TGeoVolumeAssembly(Form("glueKaptonCarbon_D0_H%d", half));
4195 auto* glueKaptonCarbonBase0 = new TGeoBBox(
4196 Form("glueKaptonCarbonBase0_D0_H%d", half),
4197 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
4198 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonGlueThickness);
4199
4200 auto* translation_gluKC01 = new TGeoTranslation(
4201 "translation_gluKC01", 0.,
4202 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4203 translation_gluKC01->RegisterYourself();
4204 auto* translation_gluKC02 =
4205 new TGeoTranslation("translation_gluKC02", 0., -mHalfDiskGap, 0.);
4206 translation_gluKC02->RegisterYourself();
4207
4208 auto* holeglueKaptonCarbon0 = new TGeoTubeSeg(
4209 Form("holeglueKaptonCarbon0_D0_H%d", half), 0., mRMin[disk],
4210 Geometry::sKaptonGlueThickness + 0.000001, 0, 180.);
4211
4212 auto* glueKaptonCarbonhole0 =
4213 new TGeoSubtraction(glueKaptonCarbonBase0, holeglueKaptonCarbon0,
4214 translation_gluKC01, translation_gluKC02);
4215 auto* gKC0 = new TGeoCompositeShape(Form("glueKaptonCarbon0_D0_H%d", half),
4216 glueKaptonCarbonhole0);
4217 auto* glueKaptonCarbonBaseWithHole0 = new TGeoVolume(
4218 Form("glueKaptonCarbonWithHole_D0_H%d", half), gKC0, mGlueKaptonCarbon);
4219
4220 glueKaptonCarbonBaseWithHole0->SetLineColor(kGreen);
4221 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4222 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4223 glueKaptonCarbon->AddNode(glueKaptonCarbonBaseWithHole0, 0,
4224 new TGeoTranslation(0., 0., mZPlan[disk]));
4225
4226 Double_t tyGKC = mSupportYDimensions[disk][0];
4227
4228 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4229 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
4230 TGeoVolume* partGlueKaptonCarbon = gGeoManager->MakeBox(
4231 Form("partGlueKaptonCarbon_D0_H%d_%d", half, ipart), mGlueKaptonCarbon,
4232 mSupportXDimensions[disk][ipart] / 2.,
4233 mSupportYDimensions[disk][ipart] / 2., Geometry::sKaptonGlueThickness);
4234 partGlueKaptonCarbon->SetLineColor(kGreen);
4235 auto* t = new TGeoTranslation("t", 0, tyGKC + mHalfDiskGap, mZPlan[disk]);
4236 glueKaptonCarbon->AddNode(partGlueKaptonCarbon, ipart, t);
4237 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
4238 }
4239
4240 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4241 transformation = new TGeoCombiTrans(
4242 0., 0., deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness,
4243 rotation);
4244 mHalfDisk->AddNode(glueKaptonCarbon, 3, transformation);
4245 transformation = new TGeoCombiTrans(
4246 0., 0.,
4247 -(deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness),
4248 rotation);
4249 mHalfDisk->AddNode(glueKaptonCarbon, 4, transformation);
4250
4251 // **************************************** Rohacell Plate
4252 // ****************************************
4253 auto* rohacellPlate =
4254 new TGeoVolumeAssembly(Form("rohacellPlate_D3_H%d", half));
4255 auto* rohacellBase3 = new TGeoBBox(
4256 Form("rohacellBase3_D3_H%d", half), (mSupportXDimensions[disk][0]) / 2.,
4257 (mSupportYDimensions[disk][0]) / 2., mRohacellThickness);
4258
4259 auto* holeRohacell3 =
4260 new TGeoTubeSeg(Form("holeRohacell3_D3_H%d", half), 0., mRMin[disk],
4261 mRohacellThickness + 0.000001, 0, 180.);
4262
4263 // **************************************** GROOVES
4264 // ************************************************* Creating grooves or not
4265 // according to sGrooves
4266 Double_t diameter = 0.21; // groove diameter
4267 Double_t epsilon = 0.06; // outside shift of the goove
4268 Int_t iCount = 0;
4269 Double_t mPosition[4];
4270 TGeoCombiTrans* transfo[7][4];
4271 TGeoTube* grooveTube[7][4];
4272 TGeoTorus* grooveTorus[7][4];
4273 TGeoSubtraction* rohacellBaseGroove[300];
4274 TGeoCompositeShape* rohacellGroove[300];
4275
4276 for (Int_t igroove = 0; igroove < 4; igroove++) {
4277 grooveTube[0][igroove] =
4278 new TGeoTube("linear", 0., diameter, mLWater3[igroove] / 2.);
4279 grooveTorus[1][igroove] = new TGeoTorus("SideTorus", mRadius3[igroove], 0.,
4280 diameter, 0., mAngle3[igroove]);
4281 grooveTube[2][igroove] =
4282 new TGeoTube("tiltedLinear", 0., diameter, mLpartial3[igroove] / 2.);
4283 grooveTorus[3][igroove] =
4284 new TGeoTorus("centralTorus", mRadiusCentralTore[igroove], 0., diameter,
4285 -mAngle3[igroove], 2. * mAngle3[igroove]);
4286 grooveTube[4][igroove] =
4287 new TGeoTube("tiltedLinear", 0., diameter, mLpartial3[igroove] / 2.);
4288 grooveTorus[5][igroove] = new TGeoTorus("SideTorus", mRadius3[igroove], 0.,
4289 diameter, 0., mAngle3[igroove]);
4290 grooveTube[6][igroove] =
4291 new TGeoTube("linear", 0., diameter, mLWater3[igroove] / 2.);
4292 }
4293
4294 // Rotation matrix
4295 TGeoRotation* rotationLinear = new TGeoRotation("rotation", -90., 90., 0.);
4296 TGeoRotation* rotationSideTorusL =
4297 new TGeoRotation("rotationSideTorusLeft", -90., 0., 0.);
4298 TGeoRotation* rotationSideTorusR =
4299 new TGeoRotation("rotationSideTorusRight", 90., 180., 180.);
4300 TGeoRotation* rotationCentralTorus =
4301 new TGeoRotation("rotationCentralTorus", 90., 0., 0.);
4302 TGeoRotation* rotationTiltedLinearR;
4303 TGeoRotation* rotationTiltedLinearL;
4304
4305 // Creating grooves
4306 if (Geometry::sGrooves == 1) {
4307 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
4308 for (Int_t igroove = 0; igroove < 4; igroove++) { // 4 grooves
4309 mPosition[igroove] = mXPosition3[igroove] -
4310 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.;
4311 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
4312
4313 switch (ip) {
4314 case 0: // Linear
4315 transfo[ip][igroove] = new TGeoCombiTrans(
4316 mSupportXDimensions[3][0] / 2. + mMoreLength -
4317 mLWater3[igroove] / 2.,
4318 mPosition[igroove], iface * (mRohacellThickness + epsilon),
4319 rotationLinear);
4320 if (igroove == 0 && iface == 1) {
4321 rohacellBaseGroove[0] =
4322 new TGeoSubtraction(rohacellBase3, grooveTube[ip][igroove],
4323 nullptr, transfo[ip][igroove]);
4324 rohacellGroove[0] =
4325 new TGeoCompositeShape(Form("rohacell3Groove%d_G%d_F%d_H%d",
4326 ip, igroove, iface, half),
4327 rohacellBaseGroove[0]);
4328 };
4329 break;
4330 case 1: // side torus
4331 transfo[ip][igroove] = new TGeoCombiTrans(
4332 mSupportXDimensions[3][0] / 2. + mMoreLength -
4333 mLWater3[igroove],
4334 mRadius3[igroove] + mXPosition3[igroove] -
4335 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.,
4336 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
4337 break;
4338 case 2: // Linear tilted
4339 rotationTiltedLinearR = new TGeoRotation(
4340 "rotationTiltedLinearRight", 90. - mAngle3[igroove], 90., 0.);
4341 transfo[ip][igroove] = new TGeoCombiTrans(
4342 mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[igroove],
4343 yPos3[igroove] - mSupportYDimensions[disk][0] / 2. -
4344 mHalfDiskGap,
4345 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
4346 break;
4347 case 3: // Central Torus
4348 transfo[ip][igroove] = new TGeoCombiTrans(
4349 0.,
4350 yPos3[igroove] +
4351 mLpartial3[igroove] / 2 *
4352 TMath::Sin(mAngle3[igroove] * TMath::DegToRad()) -
4353 mRadiusCentralTore[igroove] *
4354 TMath::Cos(mAngle3[igroove] * TMath::DegToRad()) -
4355 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
4356 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
4357 break;
4358 case 4: // Linear tilted
4359 rotationTiltedLinearL = new TGeoRotation(
4360 "rotationTiltedLinearLeft", 90. + mAngle3[igroove], 90., 0.);
4361 transfo[ip][igroove] = new TGeoCombiTrans(
4362 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4363 xPos3[igroove]),
4364 yPos3[igroove] - mSupportYDimensions[disk][0] / 2. -
4365 mHalfDiskGap,
4366 iface * (mRohacellThickness + epsilon), rotationTiltedLinearL);
4367 break;
4368 case 5: // side torus
4369 transfo[ip][igroove] = new TGeoCombiTrans(
4370 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4371 mLWater3[igroove]),
4372 mRadius3[igroove] + mPosition[igroove],
4373 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
4374 break;
4375 case 6: // Linear
4376 transfo[ip][igroove] = new TGeoCombiTrans(
4377 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4378 mLWater3[igroove] / 2.),
4379 mPosition[igroove], iface * (mRohacellThickness + epsilon),
4380 rotationLinear);
4381 break;
4382 }
4383
4384 if (!(ip == 0 && igroove == 0 && iface == 1)) {
4385 if (ip & 1) {
4386 rohacellBaseGroove[iCount] = new TGeoSubtraction(
4387 rohacellGroove[iCount - 1], grooveTorus[ip][igroove], nullptr,
4388 transfo[ip][igroove]);
4389 } else {
4390 rohacellBaseGroove[iCount] = new TGeoSubtraction(
4391 rohacellGroove[iCount - 1], grooveTube[ip][igroove], nullptr,
4392 transfo[ip][igroove]);
4393 }
4394 rohacellGroove[iCount] =
4395 new TGeoCompositeShape(Form("rohacell3Groove%d_G%d_F%d_H%d",
4396 iCount, igroove, iface, half),
4397 rohacellBaseGroove[iCount]);
4398 }
4399 iCount++;
4400 }
4401 }
4402 }
4403 }
4404 // **********************************************************************************************************
4405 // Passage du beam pipe
4406 TGeoBoolNode* rohacellBase;
4407 if (Geometry::sGrooves == 0) {
4408 rohacellBase = new TGeoSubtraction(rohacellBase3, holeRohacell3, t31, t32);
4409 }
4410 if (Geometry::sGrooves == 1) {
4411 rohacellBase = new TGeoSubtraction(rohacellGroove[iCount - 1],
4412 holeRohacell3, t31, t32);
4413 }
4414 auto* rh3 = new TGeoCompositeShape(Form("rohacellTore%d_D0_H%d", 0, half),
4415 rohacellBase);
4416 auto* rohacellBaseWithHole =
4417 new TGeoVolume(Form("rohacellBaseWithHole_D3_H%d", half), rh3, mRohacell);
4418
4419 rohacellBaseWithHole->SetLineColor(kGray);
4420 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4421 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4422 rohacellPlate->AddNode(rohacellBaseWithHole, 0,
4423 new TGeoTranslation(0., 0., mZPlan[disk]));
4424
4425 ty = mSupportYDimensions[disk][0];
4426
4427 TGeoVolume* partRohacell;
4428 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4429 ty += mSupportYDimensions[disk][ipart] / 2.;
4430 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
4431
4432 //===========================================================================================================
4433 //===========================================================================================================
4434 auto* partRohacell0 =
4435 new TGeoBBox(Form("rohacellBase0_D3_H%d_%d", half, ipart),
4436 mSupportXDimensions[disk][ipart] / 2.,
4437 mSupportYDimensions[disk][ipart] / 2., mRohacellThickness);
4438 Double_t mShift;
4439
4440 if (Geometry::sGrooves == 1) {
4441 // **************** Creating grooves for the other parts of the rohacell
4442 // plate **********************
4443 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
4444 for (Int_t igroove = 0; igroove < 4; igroove++) { // 4 grooves
4445 if (ipart == 1) {
4446 mPosition[ipart] =
4447 mXPosition3[igroove] - mSupportYDimensions[disk][ipart] / 2. -
4448 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1];
4449 mShift = -mSupportYDimensions[disk][ipart - 1];
4450 };
4451 if (ipart == 2) {
4452 mPosition[ipart] =
4453 mXPosition3[igroove] - mSupportYDimensions[disk][ipart] / 2. -
4454 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
4455 mSupportYDimensions[disk][ipart - 2];
4456 mShift = -mSupportYDimensions[disk][ipart - 1] -
4457 mSupportYDimensions[disk][ipart - 2];
4458 };
4459 if (ipart == 3) {
4460 mPosition[ipart] =
4461 mXPosition3[igroove] - mSupportYDimensions[disk][ipart] / 2. -
4462 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
4463 mSupportYDimensions[disk][ipart - 2] -
4464 mSupportYDimensions[disk][ipart - 3];
4465 mShift = -mSupportYDimensions[disk][ipart - 1] -
4466 mSupportYDimensions[disk][ipart - 2] -
4467 mSupportYDimensions[disk][ipart - 3];
4468 };
4469
4470 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
4471
4472 switch (ip) {
4473 case 0: // Linear
4474 transfo[ip][igroove] = new TGeoCombiTrans(
4475 mSupportXDimensions[3][0] / 2. + mMoreLength -
4476 mLWater3[igroove] / 2.,
4477 mPosition[ipart], iface * (mRohacellThickness + epsilon),
4478 rotationLinear);
4479 if (igroove == 0 && iface == 1) {
4480 rohacellBaseGroove[iCount] =
4481 new TGeoSubtraction(partRohacell0, grooveTube[ip][igroove],
4482 nullptr, transfo[ip][igroove]);
4483 rohacellGroove[iCount] =
4484 new TGeoCompositeShape(Form("rohacell3Groove%d_G%d_F%d_H%d",
4485 ip, igroove, iface, half),
4486 rohacellBaseGroove[iCount]);
4487 };
4488 break;
4489 case 1: // side torus
4490 transfo[ip][igroove] = new TGeoCombiTrans(
4491 mSupportXDimensions[3][0] / 2. + mMoreLength -
4492 mLWater3[igroove],
4493 mPosition[ipart] + mRadius3[igroove] - diameter / 2.,
4494 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
4495 break;
4496 case 2: // Linear tilted
4497 rotationTiltedLinearR = new TGeoRotation(
4498 "rotationTiltedLinearRight", 90. - mAngle3[igroove], 90., 0.);
4499 transfo[ip][igroove] = new TGeoCombiTrans(
4500 mSupportXDimensions[3][0] / 2. + mMoreLength - xPos3[igroove],
4501 yPos3[igroove] + mShift - mHalfDiskGap -
4502 mSupportYDimensions[disk][ipart] / 2.,
4503 iface * (mRohacellThickness + epsilon),
4504 rotationTiltedLinearR);
4505 break;
4506 case 3: // Central Torus
4507 transfo[ip][igroove] = new TGeoCombiTrans(
4508 0.,
4509 mPosition[ipart] + yPos3[igroove] +
4510 mLpartial3[igroove] / 2 *
4511 TMath::Sin(mAngle3[igroove] * TMath::DegToRad()) -
4512 mRadiusCentralTore[igroove] *
4513 TMath::Cos(mAngle3[igroove] * TMath::DegToRad()) -
4514 mXPosition3[igroove],
4515 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
4516 break;
4517 case 4: // Linear tilted
4518 rotationTiltedLinearL = new TGeoRotation(
4519 "rotationTiltedLinearLeft", 90. + mAngle3[igroove], 90., 0.);
4520 transfo[ip][igroove] = new TGeoCombiTrans(
4521 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4522 xPos3[igroove]),
4523 yPos3[igroove] + mPosition[ipart] - mXPosition3[igroove],
4524 iface * (mRohacellThickness + epsilon),
4525 rotationTiltedLinearL);
4526 break;
4527 case 5: // side torus
4528 transfo[ip][igroove] = new TGeoCombiTrans(
4529 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4530 mLWater3[igroove]),
4531 mRadius3[igroove] + mPosition[ipart] - diameter / 2.,
4532 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
4533 break;
4534 case 6: // Linear
4535 transfo[ip][igroove] = new TGeoCombiTrans(
4536 -(mSupportXDimensions[3][0] / 2. + mMoreLength -
4537 mLWater3[igroove] / 2.),
4538 mPosition[ipart], iface * (mRohacellThickness + epsilon),
4539 rotationLinear);
4540 break;
4541 }
4542 if (!(ip == 0 && igroove == 0 && iface == 1)) {
4543 if (ip & 1) {
4544 rohacellBaseGroove[iCount] = new TGeoSubtraction(
4545 rohacellGroove[iCount - 1], grooveTorus[ip][igroove],
4546 nullptr, transfo[ip][igroove]);
4547 } else {
4548 rohacellBaseGroove[iCount] = new TGeoSubtraction(
4549 rohacellGroove[iCount - 1], grooveTube[ip][igroove],
4550 nullptr, transfo[ip][igroove]);
4551 }
4552
4553 rohacellGroove[iCount] =
4554 new TGeoCompositeShape(Form("rohacell3Groove%d_G%d_F%d_H%d",
4555 iCount, igroove, iface, half),
4556 rohacellBaseGroove[iCount]);
4557 }
4558 iCount++;
4559 }
4560 }
4561 }
4562 }
4563
4564 //============= notch of the rohacell plate, fm ===============
4565 TGeoVolume* partRohacellNotch;
4566 TGeoSubtraction* partRohacellini;
4567 TGeoBBox* notchRohacell0;
4568 TGeoTranslation* tnotch0;
4569 Double_t xnotch, ynotch;
4570 xnotch = 2.05; // half width
4571 ynotch = 0.4; // full height
4572 if (ipart == (mNPart[disk] - 1)) {
4573 notchRohacell0 = new TGeoBBox(Form("notchRohacell0_D3_H%d", half), xnotch,
4574 ynotch, mRohacellThickness + 0.000001);
4575 tnotch0 = new TGeoTranslation("tnotch0", 0.,
4576 mSupportYDimensions[disk][ipart] / 2., 0.);
4577 tnotch0->RegisterYourself();
4578 }
4579 //=============================================================
4580
4581 if (Geometry::sGrooves == 0) {
4582 if (ipart == (mNPart[disk] - 1)) {
4583 partRohacellini = new TGeoSubtraction(partRohacell0, notchRohacell0,
4584 nullptr, tnotch0);
4585 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D3_H%d", 0, half),
4586 partRohacellini);
4587 partRohacell = new TGeoVolume(
4588 Form("partRohacelli_D3_H%d_%d", half, ipart), rhinit, mRohacell);
4589 }
4590 if (ipart < (mNPart[disk] - 1)) {
4591 partRohacell =
4592 new TGeoVolume(Form("partRohacelli_D3_H%d_%d", half, ipart),
4593 partRohacell0, mRohacell);
4594 }
4595 }
4596 if (Geometry::sGrooves == 1) {
4597 if (ipart == (mNPart[disk] - 1)) {
4598 partRohacellini = new TGeoSubtraction(rohacellGroove[iCount - 1],
4599 notchRohacell0, nullptr, tnotch0);
4600 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D3_H%d", 0, half),
4601 partRohacellini);
4602 partRohacell = new TGeoVolume(
4603 Form("partRohacelli_D3_H%d_%d", half, ipart), rhinit, mRohacell);
4604 }
4605 if (ipart < (mNPart[disk] - 1)) {
4606 partRohacell =
4607 new TGeoVolume(Form("partRohacelli_D3_H%d_%d", half, ipart),
4608 rohacellGroove[iCount - 1], mRohacell);
4609 }
4610 }
4611
4612 //===========================================================================================================
4613 //===========================================================================================================
4614 partRohacell->SetLineColor(kGray);
4615 rohacellPlate->AddNode(partRohacell, ipart, t);
4616
4617 //========== insert to locate the rohacell plate compare to the disk support
4618 //=============
4619 if (ipart == (mNPart[disk] - 1)) {
4620 TGeoTranslation* tinsert3;
4621 TGeoVolume* insert3 =
4622 gGeoManager->MakeBox(Form("insert3_H%d_%d", half, ipart), mPeek,
4623 4.0 / 2., 0.44 / 2., mRohacellThickness);
4624 Double_t ylocation =
4625 mSupportYDimensions[disk][0] + mHalfDiskGap + 0.44 / 2. - ynotch;
4626 for (Int_t ip = 1; ip < mNPart[disk]; ip++) {
4627 ylocation = ylocation + mSupportYDimensions[disk][ip];
4628 }
4629 tinsert3 = new TGeoTranslation("tinsert3", 0., -ylocation, 0.);
4630 tinsert3->RegisterYourself();
4631 mHalfDisk->AddNode(insert3, 0., tinsert3);
4632 }
4633 //========================================================================================
4634 ty += mSupportYDimensions[disk][ipart] / 2.;
4635 }
4636
4637 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4638 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4639 mHalfDisk->AddNode(rohacellPlate, 2, transformation);
4640
4641 createManifold(disk);
4642 createCoolingPipes(half, disk);
4643}
4644
4645//_____________________________________________________________________________
4647{
4648
4649 Int_t disk = 4;
4650
4651 if (half == Top) {
4652 printf("Creating MFT heat exchanger for disk4 top\n");
4653 } else if (half == Bottom) {
4654 printf("Creating MFT heat exchanger for disk4 bottom\n");
4655 } else {
4656 printf("No valid option for MFT heat exchanger on disk4\n");
4657 }
4658
4659 mCarbon = gGeoManager->GetMedium("MFT_CarbonFiber$");
4660 mWater = gGeoManager->GetMedium("MFT_Water$");
4661 mRohacell = gGeoManager->GetMedium("MFT_Rohacell$");
4662 mPipe = gGeoManager->GetMedium("MFT_Polyimide$");
4663 mPeek = gGeoManager->GetMedium("MFT_PEEK$");
4664
4665 auto* cooling = new TGeoVolumeAssembly(Form("cooling_D4_H%d", half));
4666
4667 TGeoTranslation* translation = nullptr;
4668 TGeoRotation* rotation = nullptr;
4669 TGeoCombiTrans* transformation = nullptr;
4670
4671 // **************************************** Water part
4672 // ******************************************
4673 // ********************* Four parameters mLwater4, mRadius4, mAngle4,
4674 // mLpartial4 ****************
4675 Double_t ivolume = 400; // offset chamber 4
4676 Double_t mRadiusCentralTore[4];
4677 Double_t xPos4[4];
4678 Double_t yPos4[4];
4679
4680 for (Int_t itube = 0; itube < 4; itube++) {
4681 TGeoVolume* waterTube1 =
4682 gGeoManager->MakeTube(Form("waterTube1%d_D4_H%d", itube, half), mWater,
4683 0., mRWater, mLWater4[itube] / 2.);
4684 translation = new TGeoTranslation(mXPosition4[itube] - mHalfDiskGap, 0.,
4685 mSupportXDimensions[4][0] / 2. +
4686 mMoreLength - mLWater4[itube] / 2.);
4687 cooling->AddNode(waterTube1, ivolume++, translation);
4688
4689 TGeoVolume* waterTorus1 = gGeoManager->MakeTorus(
4690 Form("waterTorus1%d_D4_H%d", itube, half), mWater, mRadius4[itube], 0.,
4691 mRWater, 0., mAngle4[itube]);
4692 rotation = new TGeoRotation("rotation", 180., -90., 0.);
4693 transformation = new TGeoCombiTrans(
4694 mRadius4[itube] + mXPosition4[itube] - mHalfDiskGap, 0.,
4695 mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube],
4696 rotation);
4697 // cooling->AddNode(waterTorus1, ivolume++, transformation);
4698
4699 TGeoVolume* waterTube2 =
4700 gGeoManager->MakeTube(Form("waterTube2%d_D4_H%d", itube, half), mWater,
4701 0., mRWater, mLpartial4[itube] / 2.);
4702 rotation = new TGeoRotation("rotation", 90., 180 - mAngle4[itube], 0.);
4703 xPos4[itube] =
4704 mLWater4[itube] +
4705 mRadius4[itube] * TMath::Sin(mAngle4[itube] * TMath::DegToRad()) +
4706 mLpartial4[itube] / 2 * TMath::Cos(mAngle4[itube] * TMath::DegToRad());
4707 yPos4[itube] =
4708 mXPosition4[itube] - mHalfDiskGap +
4709 mRadius4[itube] * (1 - TMath::Cos(mAngle4[itube] * TMath::DegToRad())) +
4710 mLpartial4[itube] / 2 * TMath::Sin(mAngle4[itube] * TMath::DegToRad());
4711 transformation = new TGeoCombiTrans(
4712 yPos4[itube], 0.,
4713 mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube], rotation);
4714 cooling->AddNode(waterTube2, ivolume++, transformation);
4715
4716 mRadiusCentralTore[itube] =
4717 (mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube] -
4718 mLpartial4[itube] / 2 *
4719 TMath::Cos(mAngle4[itube] * TMath::DegToRad())) /
4720 TMath::Sin(mAngle4[itube] * TMath::DegToRad());
4721 TGeoVolume* waterTorusCentral =
4722 gGeoManager->MakeTorus(Form("waterTorusCentral%d_D4_H%d", itube, half),
4723 mWater, mRadiusCentralTore[itube], 0., mRWater,
4724 -mAngle4[itube], 2. * mAngle4[itube]);
4725 rotation = new TGeoRotation("rotation", 0., 90., 0.);
4726 transformation = new TGeoCombiTrans(
4727 yPos4[itube] +
4728 mLpartial4[itube] / 2 *
4729 TMath::Sin(mAngle4[itube] * TMath::DegToRad()) -
4730 mRadiusCentralTore[itube] *
4731 TMath::Cos(mAngle4[itube] * TMath::DegToRad()),
4732 0., 0., rotation);
4733 cooling->AddNode(waterTorusCentral, ivolume++, transformation);
4734
4735 TGeoVolume* waterTube3 =
4736 gGeoManager->MakeTube(Form("waterTube3%d_D4_H%d", 2, half), mWater, 0.,
4737 mRWater, mLpartial4[itube] / 2.);
4738 rotation = new TGeoRotation("rotation", -90., 0 - mAngle4[itube], 0.);
4739 transformation = new TGeoCombiTrans(
4740 yPos4[itube], 0.,
4741 -(mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube]),
4742 rotation);
4743 cooling->AddNode(waterTube3, ivolume++, transformation);
4744
4745 TGeoVolume* waterTorus2 = gGeoManager->MakeTorus(
4746 Form("waterTorus2%d_D4_H%d", itube, half), mWater, mRadius4[itube], 0.,
4747 mRWater, 0., mAngle4[itube]);
4748 rotation = new TGeoRotation("rotation", 180., 90., 0.);
4749 transformation = new TGeoCombiTrans(
4750 mRadius4[itube] + mXPosition4[itube] - mHalfDiskGap, 0.,
4751 -(mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube]),
4752 rotation);
4753 cooling->AddNode(waterTorus2, ivolume++, transformation);
4754
4755 TGeoVolume* waterTube4 =
4756 gGeoManager->MakeTube(Form("waterTube4%d_D4_H%d", itube, half), mWater,
4757 0., mRWater, mLWater4[itube] / 2.);
4758 translation = new TGeoTranslation(
4759 mXPosition4[itube] - mHalfDiskGap, 0.,
4760 -(mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube] / 2.));
4761 cooling->AddNode(waterTube4, ivolume++, translation);
4762 }
4763
4764 // **************************************** Tube part
4765 // *******************************************
4766 // ********************* Four parameters mLwater4, mRadius4, mAngle4,
4767 // mLpartial4 ****************
4768 for (Int_t itube = 0; itube < 4; itube++) {
4769 TGeoVolume* pipeTube1 =
4770 gGeoManager->MakeTube(Form("pipeTube1%d_D4_H%d", itube, half), mPipe,
4771 mRWater, mRWater + mDRPipe, mLWater4[itube] / 2.);
4772 translation = new TGeoTranslation(mXPosition4[itube] - mHalfDiskGap, 0.,
4773 mSupportXDimensions[4][0] / 2. +
4774 mMoreLength - mLWater4[itube] / 2.);
4775 cooling->AddNode(pipeTube1, ivolume++, translation);
4776
4777 TGeoVolume* pipeTorus1 = gGeoManager->MakeTorus(
4778 Form("pipeTorus1%d_D4_H%d", itube, half), mPipe, mRadius4[itube],
4779 mRWater, mRWater + mDRPipe, 0., mAngle4[itube]);
4780 rotation = new TGeoRotation("rotation", 180., -90., 0.);
4781 transformation = new TGeoCombiTrans(
4782 mRadius4[itube] + mXPosition4[itube] - mHalfDiskGap, 0.,
4783 mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube],
4784 rotation);
4785 cooling->AddNode(pipeTorus1, ivolume++, transformation);
4786
4787 TGeoVolume* pipeTube2 = gGeoManager->MakeTube(
4788 Form("pipeTube2%d_D4_H%d", itube, half), mPipe, mRWater,
4789 mRWater + mDRPipe, mLpartial4[itube] / 2.);
4790 rotation = new TGeoRotation("rotation", 90., 180 - mAngle4[itube], 0.);
4791 xPos4[itube] =
4792 mLWater4[itube] +
4793 mRadius4[itube] * TMath::Sin(mAngle4[itube] * TMath::DegToRad()) +
4794 mLpartial4[itube] / 2 * TMath::Cos(mAngle4[itube] * TMath::DegToRad());
4795 yPos4[itube] =
4796 mXPosition4[itube] - mHalfDiskGap +
4797 mRadius4[itube] * (1 - TMath::Cos(mAngle4[itube] * TMath::DegToRad())) +
4798 mLpartial4[itube] / 2 * TMath::Sin(mAngle4[itube] * TMath::DegToRad());
4799 transformation = new TGeoCombiTrans(
4800 yPos4[itube], 0.,
4801 mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube], rotation);
4802 cooling->AddNode(pipeTube2, ivolume++, transformation);
4803
4804 mRadiusCentralTore[itube] =
4805 (mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube] -
4806 mLpartial4[itube] / 2 *
4807 TMath::Cos(mAngle4[itube] * TMath::DegToRad())) /
4808 TMath::Sin(mAngle4[itube] * TMath::DegToRad());
4809 TGeoVolume* pipeTorusCentral = gGeoManager->MakeTorus(
4810 Form("pipeTorusCentral%d_D4_H%d", itube, half), mPipe,
4811 mRadiusCentralTore[itube], mRWater, mRWater + mDRPipe, -mAngle4[itube],
4812 2. * mAngle4[itube]);
4813 rotation = new TGeoRotation("rotation", 0., 90., 0.);
4814 transformation = new TGeoCombiTrans(
4815 yPos4[itube] +
4816 mLpartial4[itube] / 2 *
4817 TMath::Sin(mAngle4[itube] * TMath::DegToRad()) -
4818 mRadiusCentralTore[itube] *
4819 TMath::Cos(mAngle4[itube] * TMath::DegToRad()),
4820 0., 0., rotation);
4821 cooling->AddNode(pipeTorusCentral, ivolume++, transformation);
4822
4823 TGeoVolume* pipeTube3 = gGeoManager->MakeTube(
4824 Form("pipeTube3%d_D4_H%d", 2, half), mPipe, mRWater, mRWater + mDRPipe,
4825 mLpartial4[itube] / 2.);
4826 rotation = new TGeoRotation("rotation", -90., 0 - mAngle4[itube], 0.);
4827 transformation = new TGeoCombiTrans(
4828 yPos4[itube], 0.,
4829 -(mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[itube]),
4830 rotation);
4831 cooling->AddNode(pipeTube3, ivolume++, transformation);
4832
4833 TGeoVolume* pipeTorus2 = gGeoManager->MakeTorus(
4834 Form("pipeTorus2%d_D4_H%d", itube, half), mPipe, mRadius4[itube],
4835 mRWater, mRWater + mDRPipe, 0., mAngle4[itube]);
4836 rotation = new TGeoRotation("rotation", 180., 90., 0.);
4837 transformation = new TGeoCombiTrans(
4838 mRadius4[itube] + mXPosition4[itube] - mHalfDiskGap, 0.,
4839 -(mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube]),
4840 rotation);
4841 cooling->AddNode(pipeTorus2, ivolume++, transformation);
4842
4843 TGeoVolume* pipeTube4 =
4844 gGeoManager->MakeTube(Form("pipeTube4%d_D4_H%d", itube, half), mPipe,
4845 mRWater, mRWater + mDRPipe, mLWater4[itube] / 2.);
4846 translation = new TGeoTranslation(
4847 mXPosition4[itube] - mHalfDiskGap, 0.,
4848 -(mSupportXDimensions[4][0] / 2. + mMoreLength - mLWater4[itube] / 2.));
4849 cooling->AddNode(pipeTube4, ivolume++, translation);
4850 }
4851 // ***********************************************************************************************
4852
4853 Double_t deltaz = mHeatExchangerThickness -
4855 Geometry::sKaptonGlueThickness * 4 - 2 * mCarbonThickness;
4856
4857 rotation = new TGeoRotation("rotation", -90., 90., 0.);
4858 transformation = new TGeoCombiTrans(
4859 0., 0.,
4860 mZPlan[disk] + deltaz / 2. - mCarbonThickness - mRWater - mDRPipe -
4862 rotation);
4863 mHalfDisk->AddNode(cooling, 3, transformation);
4864 transformation = new TGeoCombiTrans(
4865 0., 0.,
4866 mZPlan[disk] - deltaz / 2. + mCarbonThickness + mRWater + mDRPipe +
4868 rotation);
4869 mHalfDisk->AddNode(cooling, 4, transformation);
4870
4871 // **************************************** Carbon Plates
4872 // ****************************************
4873 auto* carbonPlate = new TGeoVolumeAssembly(Form("carbonPlate_D4_H%d", half));
4874
4875 auto& mftBaseParam = MFTBaseParam::Instance();
4876 Double_t mReducedX = 0.;
4877 if (mftBaseParam.buildAlignment) {
4878 mReducedX = 0.6;
4879 }
4880
4881 auto* carbonBase4 = new TGeoBBox(
4882 Form("carbonBase4_D4_H%d", half),
4883 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
4884 (mSupportYDimensions[disk][0]) / 2., mCarbonThickness);
4885 auto* t41 = new TGeoTranslation(
4886 "t41", 0., (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4887 t41->RegisterYourself();
4888
4889 auto* holeCarbon4 =
4890 new TGeoTubeSeg(Form("holeCarbon4_D4_H%d", half), 0., mRMin[disk],
4891 mCarbonThickness + 0.000001, 0, 180.);
4892 auto* t42 = new TGeoTranslation("t42", 0., -mHalfDiskGap, 0.);
4893 t42->RegisterYourself();
4894
4895 auto* carbonhole4 = new TGeoSubtraction(carbonBase4, holeCarbon4, t41, t42);
4896 auto* cs4 = new TGeoCompositeShape(Form("Carbon4_D4_H%d", half), carbonhole4);
4897 auto* carbonBaseWithHole4 =
4898 new TGeoVolume(Form("carbonBaseWithHole_D4_H%d", half), cs4, mCarbon);
4899
4900 carbonBaseWithHole4->SetLineColor(kGray + 3);
4901 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4902 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4903 carbonPlate->AddNode(carbonBaseWithHole4, 0,
4904 new TGeoTranslation(0., 0., mZPlan[disk]));
4905
4906 Double_t ty = mSupportYDimensions[disk][0];
4907
4908 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4909 ty += mSupportYDimensions[disk][ipart] / 2.;
4910 TGeoVolume* partCarbon = gGeoManager->MakeBox(
4911 Form("partCarbon_D4_H%d_%d", half, ipart), mCarbon,
4912 mSupportXDimensions[disk][ipart] / 2.,
4913 mSupportYDimensions[disk][ipart] / 2., mCarbonThickness);
4914 partCarbon->SetLineColor(kGray + 3);
4915 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
4916 carbonPlate->AddNode(partCarbon, ipart, t);
4917 ty += mSupportYDimensions[disk][ipart] / 2.;
4918 }
4919
4920 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4921 transformation = new TGeoCombiTrans(0., 0., deltaz / 2., rotation);
4922 mHalfDisk->AddNode(carbonPlate, 3, transformation);
4923 transformation = new TGeoCombiTrans(0., 0., -deltaz / 2., rotation);
4924 mHalfDisk->AddNode(carbonPlate, 4, transformation);
4925
4926 // **************************************** Glue Bwtween Carbon Plate and
4927 // Rohacell Plate ****************************************
4928 TGeoMedium* mGlueRohacellCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
4929 auto* glueRohacellCarbon =
4930 new TGeoVolumeAssembly(Form("glueRohacellCarbon_D0_H%d", half));
4931 auto* glueRohacellCarbonBase0 =
4932 new TGeoBBox(Form("glueRohacellCarbonBase0_D0_H%d", half),
4933 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
4934 (mSupportYDimensions[disk][0]) / 2.,
4936
4937 auto* translation_gluRC01 = new TGeoTranslation(
4938 "translation_gluRC01", 0.,
4939 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
4940 translation_gluRC01->RegisterYourself();
4941 auto* translation_gluRC02 =
4942 new TGeoTranslation("translation_gluRC02", 0., -mHalfDiskGap, 0.);
4943 translation_gluRC02->RegisterYourself();
4944
4945 auto* holeglueRohacellCarbon0 = new TGeoTubeSeg(
4946 Form("holeglueRohacellCarbon0_D0_H%d", half), 0., mRMin[disk],
4947 Geometry::sGlueRohacellCarbonThickness + 0.000001, 0, 180.);
4948
4949 auto* glueRohacellCarbonhole0 =
4950 new TGeoSubtraction(glueRohacellCarbonBase0, holeglueRohacellCarbon0,
4951 translation_gluRC01, translation_gluRC02);
4952 auto* gRC0 = new TGeoCompositeShape(Form("glueRohacellCarbon0_D0_H%d", half),
4953 glueRohacellCarbonhole0);
4954 auto* glueRohacellCarbonBaseWithHole0 =
4955 new TGeoVolume(Form("glueRohacellCarbonWithHole_D0_H%d", half), gRC0,
4956 mGlueRohacellCarbon);
4957
4958 glueRohacellCarbonBaseWithHole0->SetLineColor(kGreen);
4959 rotation = new TGeoRotation("rotation", 0., 0., 0.);
4960 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
4961 glueRohacellCarbon->AddNode(glueRohacellCarbonBaseWithHole0, 0,
4962 new TGeoTranslation(0., 0., mZPlan[disk]));
4963
4964 Double_t tyGRC = mSupportYDimensions[disk][0];
4965
4966 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
4967 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
4968 TGeoVolume* partGlueRohacellCarbon = gGeoManager->MakeBox(
4969 Form("partGlueRohacellCarbon_D0_H%d_%d", half, ipart),
4970 mGlueRohacellCarbon, mSupportXDimensions[disk][ipart] / 2.,
4971 mSupportYDimensions[disk][ipart] / 2.,
4973 partGlueRohacellCarbon->SetLineColor(kGreen);
4974 auto* t = new TGeoTranslation("t", 0, tyGRC + mHalfDiskGap, mZPlan[disk]);
4975 glueRohacellCarbon->AddNode(partGlueRohacellCarbon, ipart, t);
4976 tyGRC += mSupportYDimensions[disk][ipart] / 2.;
4977 }
4978
4979 rotation = new TGeoRotation("rotation", 180., 0., 0.);
4980 transformation = new TGeoCombiTrans(
4981 0., 0.,
4982 deltaz / 2. - mCarbonThickness - Geometry::sGlueRohacellCarbonThickness,
4983 rotation);
4984 mHalfDisk->AddNode(glueRohacellCarbon, 3, transformation);
4985 transformation = new TGeoCombiTrans(0., 0.,
4986 -(deltaz / 2. - mCarbonThickness -
4988 rotation);
4989 mHalfDisk->AddNode(glueRohacellCarbon, 4, transformation);
4990
4991 // **************************************** Kapton on Carbon Plate
4992 // ****************************************
4993 TGeoMedium* mKaptonOnCarbon = gGeoManager->GetMedium("MFT_Kapton$");
4994 auto* kaptonOnCarbon =
4995 new TGeoVolumeAssembly(Form("kaptonOnCarbon_D0_H%d", half));
4996 auto* kaptonOnCarbonBase0 = new TGeoBBox(
4997 Form("kaptonOnCarbonBase0_D0_H%d", half),
4998 (mSupportXDimensions[disk][0]) / 2. + mMoreLength - mReducedX,
4999 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonOnCarbonThickness);
5000
5001 auto* translation_KC01 = new TGeoTranslation(
5002 "translation_KC01", 0.,
5003 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
5004 translation_KC01->RegisterYourself();
5005 auto* translation_KC02 =
5006 new TGeoTranslation("translation_KC02", 0., -mHalfDiskGap, 0.);
5007 translation_KC02->RegisterYourself();
5008
5009 auto* holekaptonOnCarbon0 =
5010 new TGeoTubeSeg(Form("holekaptonOnCarbon0_D0_H%d", half), 0., mRMin[disk],
5011 Geometry::sKaptonOnCarbonThickness + 0.000001, 0, 180.);
5012
5013 auto* kaptonOnCarbonhole0 =
5014 new TGeoSubtraction(kaptonOnCarbonBase0, holekaptonOnCarbon0,
5015 translation_KC01, translation_KC02);
5016 auto* KC0 = new TGeoCompositeShape(Form("kaptonOnCarbon_D0_H%d", half),
5017 kaptonOnCarbonhole0);
5018 auto* kaptonOnCarbonBaseWithHole0 = new TGeoVolume(
5019 Form("kaptonOnCarbonWithHole_D0_H%d", half), KC0, mKaptonOnCarbon);
5020
5021 kaptonOnCarbonBaseWithHole0->SetLineColor(kMagenta);
5022 rotation = new TGeoRotation("rotation", 0., 0., 0.);
5023 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
5024 kaptonOnCarbon->AddNode(kaptonOnCarbonBaseWithHole0, 0,
5025 new TGeoTranslation(0., 0., mZPlan[disk]));
5026
5027 Double_t tyKC = mSupportYDimensions[disk][0];
5028
5029 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
5030 tyKC += mSupportYDimensions[disk][ipart] / 2.;
5031 TGeoVolume* partkaptonOnCarbonBase = gGeoManager->MakeBox(
5032 Form("partkaptonOnCarbon_D0_H%d_%d", half, ipart), mKaptonOnCarbon,
5033 mSupportXDimensions[disk][ipart] / 2.,
5034 mSupportYDimensions[disk][ipart] / 2.,
5036 partkaptonOnCarbonBase->SetLineColor(kMagenta);
5037 auto* t = new TGeoTranslation("t", 0, tyKC + mHalfDiskGap, mZPlan[disk]);
5038 kaptonOnCarbon->AddNode(partkaptonOnCarbonBase, ipart, t);
5039 tyKC += mSupportYDimensions[disk][ipart] / 2.;
5040 }
5041
5042 rotation = new TGeoRotation("rotation", 180., 0., 0.);
5043 transformation = new TGeoCombiTrans(
5044 0., 0.,
5045 deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
5047 rotation);
5048 mHalfDisk->AddNode(kaptonOnCarbon, 3, transformation);
5049 transformation = new TGeoCombiTrans(
5050 0., 0.,
5051 -(deltaz / 2 + Geometry::sKaptonOnCarbonThickness + mCarbonThickness +
5053 rotation);
5054 mHalfDisk->AddNode(kaptonOnCarbon, 4, transformation);
5055
5056 // **************************************** Kapton glue on the carbon plate
5057 // ****************************************
5058 TGeoMedium* mGlueKaptonCarbon = gGeoManager->GetMedium("MFT_Epoxy$");
5059 auto* glueKaptonCarbon =
5060 new TGeoVolumeAssembly(Form("glueKaptonCarbon_D0_H%d", half));
5061 auto* glueKaptonCarbonBase0 = new TGeoBBox(
5062 Form("glueKaptonCarbonBase0_D0_H%d", half),
5063 (mSupportXDimensions[disk][0]) / 2. - mReducedX,
5064 (mSupportYDimensions[disk][0]) / 2., Geometry::sKaptonGlueThickness);
5065
5066 auto* translation_gluKC01 = new TGeoTranslation(
5067 "translation_gluKC01", 0.,
5068 (mSupportYDimensions[disk][0]) / 2. + mHalfDiskGap, 0.);
5069 translation_gluKC01->RegisterYourself();
5070 auto* translation_gluKC02 =
5071 new TGeoTranslation("translation_gluKC02", 0., -mHalfDiskGap, 0.);
5072 translation_gluKC02->RegisterYourself();
5073
5074 auto* holeglueKaptonCarbon0 = new TGeoTubeSeg(
5075 Form("holeglueKaptonCarbon0_D0_H%d", half), 0., mRMin[disk],
5076 Geometry::sKaptonGlueThickness + 0.000001, 0, 180.);
5077
5078 auto* glueKaptonCarbonhole0 =
5079 new TGeoSubtraction(glueKaptonCarbonBase0, holeglueKaptonCarbon0,
5080 translation_gluKC01, translation_gluKC02);
5081 auto* gKC0 = new TGeoCompositeShape(Form("glueKaptonCarbon0_D0_H%d", half),
5082 glueKaptonCarbonhole0);
5083 auto* glueKaptonCarbonBaseWithHole0 = new TGeoVolume(
5084 Form("glueKaptonCarbonWithHole_D0_H%d", half), gKC0, mGlueKaptonCarbon);
5085
5086 glueKaptonCarbonBaseWithHole0->SetLineColor(kGreen);
5087 rotation = new TGeoRotation("rotation", 0., 0., 0.);
5088 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
5089 glueKaptonCarbon->AddNode(glueKaptonCarbonBaseWithHole0, 0,
5090 new TGeoTranslation(0., 0., mZPlan[disk]));
5091
5092 Double_t tyGKC = mSupportYDimensions[disk][0];
5093
5094 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
5095 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
5096 TGeoVolume* partGlueKaptonCarbon = gGeoManager->MakeBox(
5097 Form("partGlueKaptonCarbon_D0_H%d_%d", half, ipart), mGlueKaptonCarbon,
5098 mSupportXDimensions[disk][ipart] / 2.,
5099 mSupportYDimensions[disk][ipart] / 2., Geometry::sKaptonGlueThickness);
5100 partGlueKaptonCarbon->SetLineColor(kGreen);
5101 auto* t = new TGeoTranslation("t", 0, tyGKC + mHalfDiskGap, mZPlan[disk]);
5102 glueKaptonCarbon->AddNode(partGlueKaptonCarbon, ipart, t);
5103 tyGKC += mSupportYDimensions[disk][ipart] / 2.;
5104 }
5105
5106 rotation = new TGeoRotation("rotation", 180., 0., 0.);
5107 transformation = new TGeoCombiTrans(
5108 0., 0., deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness,
5109 rotation);
5110 mHalfDisk->AddNode(glueKaptonCarbon, 3, transformation);
5111 transformation = new TGeoCombiTrans(
5112 0., 0.,
5113 -(deltaz / 2. + mCarbonThickness + Geometry::sKaptonGlueThickness),
5114 rotation);
5115 mHalfDisk->AddNode(glueKaptonCarbon, 4, transformation);
5116
5117 // **************************************** Rohacell Plate
5118 // ****************************************
5119 auto* rohacellPlate =
5120 new TGeoVolumeAssembly(Form("rohacellPlate_D4_H%d", half));
5121 auto* rohacellBase4 = new TGeoBBox(
5122 Form("rohacellBase4_D4_H%d", half), (mSupportXDimensions[disk][0]) / 2.,
5123 (mSupportYDimensions[disk][0]) / 2., mRohacellThickness);
5124 auto* holeRohacell4 =
5125 new TGeoTubeSeg(Form("holeRohacell4_D4_H%d", half), 0., mRMin[disk],
5126 mRohacellThickness + 0.000001, 0, 180.);
5127
5128 // *************************************** Grooves
5129 // *************************************************
5130 Double_t diameter = 0.21; // groove diameter
5131 Double_t epsilon = 0.06; // outside shift of the goove
5132 Int_t iCount = 0;
5133 Double_t mPosition[5];
5134 TGeoCombiTrans* transfo[7][4];
5135 TGeoTube* grooveTube[8][4];
5136 TGeoTorus* grooveTorus[8][4];
5137 TGeoSubtraction* rohacellBaseGroove[300];
5138 TGeoCompositeShape* rohacellGroove[300];
5139 TGeoRotation* rotationTorus5[8];
5140
5141 for (Int_t igroove = 0; igroove < 4; igroove++) {
5142 grooveTube[0][igroove] =
5143 new TGeoTube("linear", 0., diameter, mLWater4[igroove] / 2.);
5144 grooveTorus[1][igroove] = new TGeoTorus("SideTorus", mRadius4[igroove], 0.,
5145 diameter, 0., mAngle4[igroove]);
5146 grooveTube[2][igroove] =
5147 new TGeoTube("tiltedLinear", 0., diameter, mLpartial4[igroove] / 2.);
5148 grooveTorus[3][igroove] =
5149 new TGeoTorus("centralTorus", mRadiusCentralTore[igroove], 0., diameter,
5150 -mAngle4[igroove], 2. * mAngle4[igroove]);
5151 grooveTube[4][igroove] =
5152 new TGeoTube("tiltedLinear", 0., diameter, mLpartial4[igroove] / 2.);
5153 grooveTorus[5][igroove] = new TGeoTorus("SideTorus", mRadius4[igroove], 0.,
5154 diameter, 0., mAngle4[igroove]);
5155 grooveTube[6][igroove] =
5156 new TGeoTube("linear", 0., diameter, mLWater4[igroove] / 2.);
5157 }
5158
5159 // Rotation matrix
5160 TGeoRotation* rotationLinear = new TGeoRotation("rotation", 90., 90., 0.);
5161 TGeoRotation* rotationSideTorusL =
5162 new TGeoRotation("rotationSideTorusLeft", -90., 0., 0.);
5163 TGeoRotation* rotationSideTorusR =
5164 new TGeoRotation("rotationSideTorusRight", 90., 180., 180.);
5165 TGeoRotation* rotationCentralTorus =
5166 new TGeoRotation("rotationCentralTorus", 90., 0., 0.);
5167 TGeoRotation* rotationTiltedLinearR;
5168 TGeoRotation* rotationTiltedLinearL;
5169
5170 // Creating grooves
5171 if (Geometry::sGrooves == 1) {
5172 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
5173 for (Int_t igroove = 0; igroove < 4; igroove++) { // 4 grooves
5174 mPosition[igroove] = mXPosition4[igroove] -
5175 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.;
5176 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
5177
5178 switch (ip) {
5179 case 0: // Linear
5180 transfo[ip][igroove] = new TGeoCombiTrans(
5181 mSupportXDimensions[4][0] / 2. + mMoreLength -
5182 mLWater4[igroove] / 2.,
5183 mPosition[igroove], iface * (mRohacellThickness + epsilon),
5184 rotationLinear);
5185 if (igroove == 0 && iface == 1) {
5186 rohacellBaseGroove[0] =
5187 new TGeoSubtraction(rohacellBase4, grooveTube[ip][igroove],
5188 nullptr, transfo[ip][igroove]);
5189 rohacellGroove[0] =
5190 new TGeoCompositeShape(Form("rohacell4Groove%d_G%d_F%d_H%d",
5191 ip, igroove, iface, half),
5192 rohacellBaseGroove[0]);
5193 };
5194 break;
5195 case 1: // side torus
5196 transfo[ip][igroove] = new TGeoCombiTrans(
5197 mSupportXDimensions[4][0] / 2. + mMoreLength -
5198 mLWater4[igroove],
5199 mRadius4[igroove] + mXPosition4[igroove] -
5200 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap - diameter / 2.,
5201 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
5202 break;
5203 case 2: // Linear tilted
5204 rotationTiltedLinearR = new TGeoRotation(
5205 "rotationTiltedLinearRight", 90. - mAngle4[igroove], 90., 0.);
5206 transfo[ip][igroove] = new TGeoCombiTrans(
5207 mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[igroove],
5208 yPos4[igroove] - mSupportYDimensions[disk][0] / 2. -
5209 mHalfDiskGap,
5210 iface * (mRohacellThickness + epsilon), rotationTiltedLinearR);
5211 break;
5212 case 3: // Central Torus
5213 transfo[ip][igroove] = new TGeoCombiTrans(
5214 0.,
5215 yPos4[igroove] +
5216 mLpartial4[igroove] / 2 *
5217 TMath::Sin(mAngle4[igroove] * TMath::DegToRad()) -
5218 mRadiusCentralTore[igroove] *
5219 TMath::Cos(mAngle4[igroove] * TMath::DegToRad()) -
5220 mSupportYDimensions[disk][0] / 2. - mHalfDiskGap,
5221 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
5222 break;
5223 case 4: // Linear tilted
5224 rotationTiltedLinearL = new TGeoRotation(
5225 "rotationTiltedLinearLeft", 90. + mAngle4[igroove], 90., 0.);
5226 transfo[ip][igroove] = new TGeoCombiTrans(
5227 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5228 xPos4[igroove]),
5229 yPos4[igroove] - mSupportYDimensions[disk][0] / 2. -
5230 mHalfDiskGap,
5231 iface * (mRohacellThickness + epsilon), rotationTiltedLinearL);
5232 break;
5233 case 5: // side torus
5234 transfo[ip][igroove] = new TGeoCombiTrans(
5235 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5236 mLWater4[igroove]),
5237 mRadius4[igroove] + mPosition[igroove],
5238 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
5239 break;
5240 case 6: // Linear
5241 transfo[ip][igroove] = new TGeoCombiTrans(
5242 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5243 mLWater4[igroove] / 2.),
5244 mPosition[igroove], iface * (mRohacellThickness + epsilon),
5245 rotationLinear);
5246 break;
5247 }
5248
5249 if (!(ip == 0 && igroove == 0 && iface == 1)) {
5250 if (ip & 1) {
5251 rohacellBaseGroove[iCount] = new TGeoSubtraction(
5252 rohacellGroove[iCount - 1], grooveTorus[ip][igroove], nullptr,
5253 transfo[ip][igroove]);
5254 } else {
5255 rohacellBaseGroove[iCount] = new TGeoSubtraction(
5256 rohacellGroove[iCount - 1], grooveTube[ip][igroove], nullptr,
5257 transfo[ip][igroove]);
5258 }
5259 rohacellGroove[iCount] =
5260 new TGeoCompositeShape(Form("rohacell4Groove%d_G%d_F%d_H%d",
5261 iCount, igroove, iface, half),
5262 rohacellBaseGroove[iCount]);
5263 }
5264 iCount++;
5265 }
5266 }
5267 }
5268 }
5269 // **********************************************************************************************************
5270
5271 // Passage du beam pipe
5272 TGeoBoolNode* rohacellBase;
5273 if (Geometry::sGrooves == 0) {
5274 rohacellBase = new TGeoSubtraction(rohacellBase4, holeRohacell4, t41, t42);
5275 }
5276 if (Geometry::sGrooves == 1) {
5277 rohacellBase = new TGeoSubtraction(rohacellGroove[iCount - 1],
5278 holeRohacell4, t41, t42);
5279 }
5280 auto* rh4 = new TGeoCompositeShape(Form("rohacellTore%d_D4_H%d", 0, half),
5281 rohacellBase);
5282 auto* rohacellBaseWithHole =
5283 new TGeoVolume(Form("rohacellBaseWithHole_D4_H%d", half), rh4, mRohacell);
5284
5285 TGeoVolume* partRohacell;
5286 rohacellBaseWithHole->SetLineColor(kGray);
5287 rotation = new TGeoRotation("rotation", 0., 0., 0.);
5288 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
5289 rohacellPlate->AddNode(rohacellBaseWithHole, 0,
5290 new TGeoTranslation(0., 0., mZPlan[disk]));
5291
5292 ty = mSupportYDimensions[disk][0];
5293
5294 for (Int_t ipart = 1; ipart < mNPart[disk]; ipart++) {
5295 ty += mSupportYDimensions[disk][ipart] / 2.;
5296 auto* t = new TGeoTranslation("t", 0, ty + mHalfDiskGap, mZPlan[disk]);
5297
5298 //===========================================================================================================
5299 //===========================================================================================================
5300 auto* partRohacell0 =
5301 new TGeoBBox(Form("rohacellBase0_D4_H%d_%d", half, ipart),
5302 mSupportXDimensions[disk][ipart] / 2.,
5303 mSupportYDimensions[disk][ipart] / 2., mRohacellThickness);
5304 Double_t mShift;
5305
5306 if (Geometry::sGrooves == 1) {
5307 // **************** Creating grooves for the other parts of the rohacell
5308 // plate **********************
5309 for (Int_t iface = 1; iface > -2; iface -= 2) { // front and rear
5310 for (Int_t igroove = 0; igroove < 4; igroove++) { // 4 grooves
5311 if (ipart == 1) {
5312 mPosition[ipart] =
5313 mXPosition4[igroove] - mSupportYDimensions[disk][ipart] / 2. -
5314 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1];
5315 mShift = -mSupportYDimensions[disk][ipart - 1];
5316 };
5317 if (ipart == 2) {
5318 mPosition[ipart] =
5319 mXPosition4[igroove] - mSupportYDimensions[disk][ipart] / 2. -
5320 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
5321 mSupportYDimensions[disk][ipart - 2];
5322 mShift = -mSupportYDimensions[disk][ipart - 1] -
5323 mSupportYDimensions[disk][ipart - 2];
5324 };
5325 if (ipart == 3) {
5326 mPosition[ipart] =
5327 mXPosition4[igroove] - mSupportYDimensions[disk][ipart] / 2. -
5328 mHalfDiskGap - mSupportYDimensions[disk][ipart - 1] -
5329 mSupportYDimensions[disk][ipart - 2] -
5330 mSupportYDimensions[disk][ipart - 3];
5331 mShift = -mSupportYDimensions[disk][ipart - 1] -
5332 mSupportYDimensions[disk][ipart - 2] -
5333 mSupportYDimensions[disk][ipart - 3];
5334 };
5335
5336 for (Int_t ip = 0; ip < 7; ip++) { // each groove is made of 7 parts
5337
5338 switch (ip) {
5339 case 0: // Linear
5340 transfo[ip][igroove] = new TGeoCombiTrans(
5341 mSupportXDimensions[4][0] / 2. + mMoreLength -
5342 mLWater4[igroove] / 2.,
5343 mPosition[ipart], iface * (mRohacellThickness + epsilon),
5344 rotationLinear);
5345 if (igroove == 0 && iface == 1) {
5346 rohacellBaseGroove[iCount] =
5347 new TGeoSubtraction(partRohacell0, grooveTube[ip][igroove],
5348 nullptr, transfo[ip][igroove]);
5349 rohacellGroove[iCount] =
5350 new TGeoCompositeShape(Form("rohacell4Groove%d_G%d_F%d_H%d",
5351 ip, igroove, iface, half),
5352 rohacellBaseGroove[iCount]);
5353 };
5354 break;
5355 case 1: // side torus
5356 transfo[ip][igroove] = new TGeoCombiTrans(
5357 mSupportXDimensions[4][0] / 2. + mMoreLength -
5358 mLWater4[igroove],
5359 mPosition[ipart] + mRadius4[igroove] - diameter / 2.,
5360 iface * (mRohacellThickness + epsilon), rotationSideTorusR);
5361 break;
5362 case 2: // Linear tilted
5363 rotationTiltedLinearR = new TGeoRotation(
5364 "rotationTiltedLinearRight", 90. - mAngle4[igroove], 90., 0.);
5365 transfo[ip][igroove] = new TGeoCombiTrans(
5366 mSupportXDimensions[4][0] / 2. + mMoreLength - xPos4[igroove],
5367 yPos4[igroove] + mShift - mHalfDiskGap -
5368 mSupportYDimensions[disk][ipart] / 2.,
5369 iface * (mRohacellThickness + epsilon),
5370 rotationTiltedLinearR);
5371 break;
5372 case 3: // Central Torus
5373 transfo[ip][igroove] = new TGeoCombiTrans(
5374 0.,
5375 mPosition[ipart] + yPos4[igroove] +
5376 mLpartial4[igroove] / 2 *
5377 TMath::Sin(mAngle4[igroove] * TMath::DegToRad()) -
5378 mRadiusCentralTore[igroove] *
5379 TMath::Cos(mAngle4[igroove] * TMath::DegToRad()) -
5380 mXPosition4[igroove],
5381 iface * (mRohacellThickness + epsilon), rotationCentralTorus);
5382 break;
5383 case 4: // Linear tilted
5384 rotationTiltedLinearL = new TGeoRotation(
5385 "rotationTiltedLinearLeft", 90. + mAngle4[igroove], 90., 0.);
5386 transfo[ip][igroove] = new TGeoCombiTrans(
5387 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5388 xPos4[igroove]),
5389 yPos4[igroove] + mPosition[ipart] - mXPosition4[igroove],
5390 iface * (mRohacellThickness + epsilon),
5391 rotationTiltedLinearL);
5392 break;
5393 case 5: // side torus
5394 transfo[ip][igroove] = new TGeoCombiTrans(
5395 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5396 mLWater4[igroove]),
5397 mRadius4[igroove] + mPosition[ipart] - diameter / 2.,
5398 iface * (mRohacellThickness + epsilon), rotationSideTorusL);
5399 break;
5400 case 6: // Linear
5401 transfo[ip][igroove] = new TGeoCombiTrans(
5402 -(mSupportXDimensions[4][0] / 2. + mMoreLength -
5403 mLWater4[igroove] / 2.),
5404 mPosition[ipart], iface * (mRohacellThickness + epsilon),
5405 rotationLinear);
5406 break;
5407 }
5408 if (!(ip == 0 && igroove == 0 && iface == 1)) {
5409 if (ip & 1) {
5410 rohacellBaseGroove[iCount] = new TGeoSubtraction(
5411 rohacellGroove[iCount - 1], grooveTorus[ip][igroove],
5412 nullptr, transfo[ip][igroove]);
5413 } else {
5414 rohacellBaseGroove[iCount] = new TGeoSubtraction(
5415 rohacellGroove[iCount - 1], grooveTube[ip][igroove],
5416 nullptr, transfo[ip][igroove]);
5417 }
5418
5419 rohacellGroove[iCount] =
5420 new TGeoCompositeShape(Form("rohacell4Groove%d_G%d_F%d_H%d",
5421 iCount, igroove, iface, half),
5422 rohacellBaseGroove[iCount]);
5423 }
5424 iCount++;
5425 }
5426 }
5427 }
5428 }
5429
5430 //============= notch of the rohacell plate, fm ===============
5431 TGeoVolume* partRohacellNotch;
5432 TGeoSubtraction* partRohacellini;
5433 TGeoBBox* notchRohacell0;
5434 TGeoTranslation* tnotch0;
5435 Double_t xnotch, ynotch;
5436 xnotch = 2.1; // half width
5437 ynotch = 0.4; // full height
5438 if (ipart == (mNPart[disk] - 1)) {
5439 notchRohacell0 = new TGeoBBox(Form("notchRohacell0_D4_H%d", half), xnotch,
5440 ynotch, mRohacellThickness + 0.000001);
5441 tnotch0 = new TGeoTranslation("tnotch0", 0.,
5442 mSupportYDimensions[disk][ipart] / 2., 0.);
5443 tnotch0->RegisterYourself();
5444 }
5445 //=============================================================
5446
5447 if (Geometry::sGrooves == 0) {
5448 if (ipart == (mNPart[disk] - 1)) {
5449 partRohacellini = new TGeoSubtraction(partRohacell0, notchRohacell0,
5450 nullptr, tnotch0);
5451 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D4_H%d", 0, half),
5452 partRohacellini);
5453 partRohacell = new TGeoVolume(
5454 Form("partRohacelli_D4_H%d_%d", half, ipart), rhinit, mRohacell);
5455 }
5456 if (ipart < (mNPart[disk] - 1)) {
5457 partRohacell =
5458 new TGeoVolume(Form("partRohacelli_D4_H%d_%d", half, ipart),
5459 partRohacell0, mRohacell);
5460 }
5461 }
5462 if (Geometry::sGrooves == 1) {
5463 if (ipart == (mNPart[disk] - 1)) {
5464 partRohacellini = new TGeoSubtraction(rohacellGroove[iCount - 1],
5465 notchRohacell0, nullptr, tnotch0);
5466 auto* rhinit = new TGeoCompositeShape(Form("rhinit%d_D4_H%d", 0, half),
5467 partRohacellini);
5468 partRohacell = new TGeoVolume(
5469 Form("partRohacelli_D4_H%d_%d", half, ipart), rhinit, mRohacell);
5470 }
5471 if (ipart < (mNPart[disk] - 1)) {
5472 partRohacell =
5473 new TGeoVolume(Form("partRohacelli_D4_H%d_%d", half, ipart),
5474 rohacellGroove[iCount - 1], mRohacell);
5475 }
5476 }
5477 //===========================================================================================================
5478 //===========================================================================================================
5479 partRohacell->SetLineColor(kGray);
5480 rohacellPlate->AddNode(partRohacell, ipart, t);
5481
5482 //========== insert to locate the rohacell plate compare to the disk support
5483 //=============
5484 if (ipart == (mNPart[disk] - 1)) {
5485 TGeoTranslation* tinsert4;
5486 TGeoVolume* insert4 =
5487 gGeoManager->MakeBox(Form("insert4_H%d_%d", half, ipart), mPeek,
5488 4.0 / 2., 0.44 / 2., mRohacellThickness);
5489 Double_t ylocation =
5490 mSupportYDimensions[disk][0] + mHalfDiskGap + 0.44 / 2. - ynotch;
5491 for (Int_t ip = 1; ip < mNPart[disk]; ip++) {
5492 ylocation = ylocation + mSupportYDimensions[disk][ip];
5493 }
5494 tinsert4 = new TGeoTranslation("tinsert4", 0., -ylocation, 0.);
5495 tinsert4->RegisterYourself();
5496 mHalfDisk->AddNode(insert4, 0., tinsert4);
5497 }
5498 //========================================================================================
5499 ty += mSupportYDimensions[disk][ipart] / 2.;
5500 }
5501
5502 rotation = new TGeoRotation("rotation", 180., 0., 0.);
5503 transformation = new TGeoCombiTrans(0., 0., 0., rotation);
5504 mHalfDisk->AddNode(rohacellPlate, 2, transformation);
5505
5506 createManifold(disk);
5507 createCoolingPipes(half, disk);
5508}
5509
5510//_____________________________________________________________________________
5511void HeatExchanger::createCoolingPipes(Int_t half, Int_t disk)
5512{
5513 mPipe = gGeoManager->GetMedium("MFT_Polyurethane$");
5514 mWater = gGeoManager->GetMedium("MFT_Water$");
5515 Float_t length1;
5516 Float_t length2;
5517 Float_t rin = 0.25 / 2;
5518 Float_t rout = 0.4 / 2;
5519 TGeoVolume* Tube1 = nullptr;
5520 TGeoVolume* Torus1 = nullptr;
5521 TGeoVolume* TubeW1 = nullptr;
5522 TGeoVolume* TorusW1 = nullptr;
5523 TGeoRotation* rTorus1 = nullptr;
5524 TGeoCombiTrans* transfoTorus1 = nullptr;
5525 Float_t radius1;
5526 //-----------------------------------------------------------------
5527 if (disk == 0 || disk == 1 || disk == 2) {
5528 auto* mCoolingPipe1 =
5529 new TGeoVolumeAssembly(Form("cooling_pipe1_H%d", half));
5530 auto* mCoolingPipeRear1 =
5531 new TGeoVolumeAssembly(Form("cooling_pipeRear1_H%d", half));
5532 auto* mCoolingPipeRear2 =
5533 new TGeoVolumeAssembly(Form("cooling_pipeRear2_H%d", half));
5534 if (disk == 0) {
5535 length1 = 1.5;
5536 }
5537 if (disk == 1) {
5538 length1 = 1.0;
5539 }
5540 if (disk == 2) {
5541 length1 = 0.5;
5542 }
5543 Tube1 = gGeoManager->MakeTube(Form("Tube1_H%d_D%d", half, disk), mPipe, rin,
5544 rout, length1 / 2);
5545 TubeW1 = gGeoManager->MakeTube(Form("TubeW1_H%d_D%d", half, disk), mWater,
5546 0., rin, length1 / 2);
5547 TGeoTranslation* tTube1 = new TGeoTranslation(0.0, 0.0, 0.0);
5548 tTube1->RegisterYourself();
5549
5550 radius1 = 0.4;
5551 Torus1 = gGeoManager->MakeTorus(Form("Torus1_H%d_D%d", half, disk), mPipe,
5552 radius1, rin, rout, 0., 90.);
5553 TorusW1 = gGeoManager->MakeTorus(Form("TorusW1_H%d_D%d", half, disk),
5554 mWater, radius1, 0., rin, 0., 90.);
5555 rTorus1 = new TGeoRotation("rotationTorus1", 0.0, 90.0, 0.0);
5556 rTorus1->RegisterYourself();
5557 transfoTorus1 = new TGeoCombiTrans(-radius1, 0., length1 / 2, rTorus1);
5558 transfoTorus1->RegisterYourself();
5559
5560 if (disk == 0) {
5561 length2 = 8.0;
5562 }
5563 if (disk == 1) {
5564 length2 = 4.3;
5565 }
5566 if (disk == 2) {
5567 length2 = 0.55;
5568 }
5569 TGeoVolume* Tube2 = gGeoManager->MakeTube(Form("Tube2_H%d_D%d", half, disk),
5570 mPipe, rin, rout, length2 / 2);
5571 TGeoVolume* TubeW2 = gGeoManager->MakeTube(
5572 Form("TubeW2_H%d_D%d", half, disk), mWater, 0., rin, length2 / 2);
5573 TGeoRotation* rTube2 = new TGeoRotation("rotationTube2", 90.0, 90.0, 0.0);
5574 rTube2->RegisterYourself();
5575 TGeoCombiTrans* transfoTube2 = new TGeoCombiTrans(
5576 -length2 / 2 - radius1, 0., length1 / 2 + radius1, rTube2);
5577 transfoTube2->RegisterYourself();
5578
5579 Float_t radius2 = 4.;
5580 if (disk == 2) {
5581 radius2 = 3.5;
5582 }
5583 TGeoVolume* Torus2 =
5584 gGeoManager->MakeTorus(Form("Torus2_H%d_D%d", half, disk), mPipe,
5585 radius2, rin, rout, 0., -90.);
5586 TGeoVolume* TorusW2 =
5587 gGeoManager->MakeTorus(Form("TorusW2_H%d_D%d", half, disk), mWater,
5588 radius2, 0., rin, 0., -90.);
5589 TGeoRotation* rTorus2 = new TGeoRotation("rotationTorus2", 180.0, 0.0, 0.0);
5590 rTorus2->RegisterYourself();
5591 TGeoCombiTrans* transfoTorus2 = new TGeoCombiTrans(
5592 -length2 - radius1, -radius2, length1 / 2 + radius1, rTorus2);
5593 transfoTorus2->RegisterYourself();
5594
5595 Float_t length3;
5596 if (disk == 0) {
5597 length3 = 3.9;
5598 }
5599 if (disk == 1) {
5600 length3 = 3.8;
5601 }
5602 if (disk == 2) {
5603 length3 = 4.2;
5604 }
5605 TGeoVolume* Tube3 = gGeoManager->MakeTube(Form("Tube3_H%d_D%d", half, disk),
5606 mPipe, rin, rout, length3 / 2);
5607 TGeoVolume* TubeW3 = gGeoManager->MakeTube(
5608 Form("TubeW3_H%d_D%d", half, disk), mWater, 0., rin, length3 / 2);
5609 TGeoRotation* rTube3 = new TGeoRotation("rotationTube3", 0.0, -90.0, 0.0);
5610 rTube3->RegisterYourself();
5611 TGeoCombiTrans* transfoTube3 =
5612 new TGeoCombiTrans(-length2 - radius2 - radius1, -radius2 - length3 / 2,
5613 length1 / 2 + radius1, rTube3);
5614 transfoTube3->RegisterYourself();
5615
5616 Float_t length4 = 16.0; // one single pipe instead of 3 pipes coming from
5617 // the 3 first disks
5618 Float_t rin4 = 0.216;
5619 Float_t rout4 = 0.346;
5620 TGeoVolume* Tube4 = gGeoManager->MakeTube(Form("Tube4_H%d_D%d", half, disk),
5621 mPipe, rin4, rout4, length4 / 2);
5622 TGeoVolume* TubeW4 = gGeoManager->MakeTube(
5623 Form("TubeW4_H%d_D%d", half, disk), mWater, 0., rin4, length4 / 2);
5624 Float_t theta4 = 10.5; // horizontal plane angle
5625 Float_t phi4 = 35; // vertical plane angle
5626 TGeoRotation* rTube4 =
5627 new TGeoRotation("rotationTube4", 90.0 + theta4, 90.0 + phi4, 0.0);
5628 rTube4->RegisterYourself();
5629 // next line, the x and z axis are reversed in the location...
5630 Float_t dx = 2.0;
5631 Float_t xTube4 = length1 / 2. + radius1 +
5632 TMath::Cos(theta4 * TMath::DegToRad()) *
5633 TMath::Sin(phi4 * TMath::DegToRad()) * length4 / 2 *
5634 0.8;
5635 Float_t yTube4 = -radius2 - length3 -
5636 TMath::Sin(theta4 * TMath::DegToRad()) * length4 / 2 * 0.8;
5637 Float_t zTube4 = -radius1 - length2 - radius2 -
5638 TMath::Cos(theta4 * TMath::DegToRad()) *
5639 TMath::Cos(phi4 * TMath::DegToRad()) * length4 / 2 *
5640 0.8 -
5641 0.2;
5642 TGeoCombiTrans* transfoTube4 =
5643 new TGeoCombiTrans(zTube4, yTube4 - 0.2, xTube4 - 0.1, rTube4);
5644 transfoTube4->RegisterYourself();
5645
5646 Float_t length5 = 13.0; // one single pipe instead of 5 pipes
5647 Double_t theta = 180. * TMath::Pi() / 180.;
5648 Double_t phi = 0. * TMath::Pi() / 180.;
5649 Double_t nlow[3];
5650 nlow[0] = TMath::Sin(theta) * TMath::Cos(phi);
5651 nlow[1] = TMath::Sin(theta) * TMath::Sin(phi);
5652 nlow[2] = TMath::Cos(theta);
5653 theta = 15. * TMath::Pi() / 180.;
5654 phi = -90. * TMath::Pi() / 180.;
5655 Double_t nhi[3];
5656 nhi[0] = TMath::Sin(theta) * TMath::Cos(phi);
5657 nhi[1] = TMath::Sin(theta) * TMath::Sin(phi);
5658 nhi[2] = TMath::Cos(theta);
5659 Float_t rin5 = 0.278;
5660 Float_t rout5 = 0.447;
5661 TGeoVolume* Tube5 = gGeoManager->MakeCtub(
5662 Form("Tube5_H%d_D%d", half, disk), mPipe, rin5, rout5, length5 / 2, 0.,
5663 360., nlow[0], nlow[1], nlow[2], nhi[0], nhi[1], nhi[2]);
5664 TGeoVolume* TubeW5 = gGeoManager->MakeCtub(
5665 Form("TubeW5_H%d_D%d", half, disk), mWater, 0., rin5, length5 / 2, 0.,
5666 360., nlow[0], nlow[1], nlow[2], nhi[0], nhi[1], nhi[2]);
5667 Float_t theta5 = 11.5; // angle from the "horizontal" plane x,z
5668 Float_t phi5 = 16.7; // "azimutal" angle
5669 TGeoRotation* rTube5 =
5670 new TGeoRotation("rotationTube5", 90.0 + theta5, 90.0 + phi5, 0.0);
5671 rTube5->RegisterYourself();
5672 Float_t xTube5 = xTube4 +
5673 TMath::Cos(theta4 * TMath::DegToRad()) *
5674 TMath::Sin(phi4 * TMath::DegToRad()) * length4 / 2 +
5675 TMath::Cos(theta5 * TMath::DegToRad()) *
5676 TMath::Sin(phi5 * TMath::DegToRad()) * length5 / 2 *
5677 1.03;
5678 Float_t yTube5 =
5679 yTube4 - TMath::Sin(theta4 * TMath::DegToRad()) * length4 / 2 -
5680 TMath::Sin(theta5 * TMath::DegToRad()) * length5 / 2 * 1.03 + 0.2;
5681 Float_t zTube5 = zTube4 -
5682 TMath::Cos(theta4 * TMath::DegToRad()) *
5683 TMath::Cos(phi4 * TMath::DegToRad()) * length4 / 2 -
5684 TMath::Cos(theta5 * TMath::DegToRad()) *
5685 TMath::Cos(phi5 * TMath::DegToRad()) * length5 / 2 *
5686 1.03;
5687 TGeoCombiTrans* transfoTube5 =
5688 new TGeoCombiTrans(zTube5, yTube5, xTube5, rTube5);
5689 transfoTube5->RegisterYourself();
5690
5691 Tube1->SetLineColor(kGray);
5692 Torus1->SetLineColor(kGray);
5693 Tube2->SetLineColor(kGray);
5694 Torus2->SetLineColor(kGray);
5695 Tube3->SetLineColor(kGray);
5696 Tube4->SetLineColor(kGray);
5697 Tube5->SetLineColor(kGray);
5698 TubeW3->SetLineColor(kBlue);
5699 TubeW4->SetLineColor(kBlue);
5700 TubeW5->SetLineColor(kBlue);
5701
5702 mCoolingPipe1->AddNode(Tube1, 1, tTube1);
5703 mCoolingPipe1->AddNode(Torus1, 1, transfoTorus1);
5704 mCoolingPipe1->AddNode(Tube2, 1, transfoTube2);
5705 mCoolingPipe1->AddNode(Torus2, 1, transfoTorus2);
5706 mCoolingPipe1->AddNode(Tube3, 1, transfoTube3);
5707 mCoolingPipe1->AddNode(TubeW1, 1, tTube1);
5708 mCoolingPipe1->AddNode(TorusW1, 1, transfoTorus1);
5709 mCoolingPipe1->AddNode(TubeW2, 1, transfoTube2);
5710 mCoolingPipe1->AddNode(TorusW2, 1, transfoTorus2);
5711 mCoolingPipe1->AddNode(TubeW3, 1, transfoTube3);
5712
5713 if (disk == 0) { // to create only one time Tube4 and Tube5
5714 mCoolingPipeRear1->AddNode(Tube4, 1, transfoTube4);
5715 mCoolingPipeRear1->AddNode(Tube5, 1, transfoTube5);
5716 mCoolingPipeRear1->AddNode(TubeW4, 1, transfoTube4);
5717 mCoolingPipeRear1->AddNode(TubeW5, 1, transfoTube5);
5718 }
5719
5720 //-----------------------------------------------------------------
5721 auto* mCoolingPipe2 =
5722 new TGeoVolumeAssembly(Form("cooling_pipe2_H%d_D%d", half, disk));
5723 TGeoVolume* Tube1p = gGeoManager->MakeTube(
5724 Form("Tube1p_H%d_D%d", half, disk), mPipe, rin, rout, length1 / 2);
5725 TGeoVolume* TubeW1p = gGeoManager->MakeTube(
5726 Form("TubeW1p_H%d_D%d", half, disk), mWater, 0., rin, length1 / 2);
5727
5728 TGeoVolume* Torus1p =
5729 gGeoManager->MakeTorus(Form("Torus1p_H%d_D%d", half, disk), mPipe,
5730 radius1, rin, rout, 0., 90.);
5731 TGeoVolume* TorusW1p =
5732 gGeoManager->MakeTorus(Form("TorusW1p_H%d_D%d", half, disk), mWater,
5733 radius1, 0., rin, 0., 90.);
5734
5735 TGeoVolume* Tube2p = gGeoManager->MakeTube(
5736 Form("Tube2p_H%d_D%d", half, disk), mPipe, rin, rout, length2 / 2);
5737 TGeoVolume* TubeW2p = gGeoManager->MakeTube(
5738 Form("TubeW2p_H%d_D%d", half, disk), mWater, 0., rin, length2 / 2);
5739
5740 TGeoVolume* Torus2p =
5741 gGeoManager->MakeTorus(Form("Torus2p_H%d_D%d", half, disk), mPipe,
5742 radius2, rin, rout, 0., 90.);
5743 TGeoVolume* TorusW2p =
5744 gGeoManager->MakeTorus(Form("TorusW2p_H%d_D%d", half, disk), mWater,
5745 radius2, 0., rin, 0., 90.);
5746
5747 TGeoVolume* Tube3p = gGeoManager->MakeTube(
5748 Form("Tube3p_H%d_D%d", half, disk), mPipe, rin, rout, length3 / 2);
5749 TGeoVolume* TubeW3p = gGeoManager->MakeTube(
5750 Form("TubeW3p_H%d_D%d", half, disk), mWater, 0., rin, length3 / 2);
5751
5752 TGeoRotation* rTorus2p =
5753 new TGeoRotation("rotationTorus2p", 180.0, 0.0, 0.0);
5754 rTorus2p->RegisterYourself();
5755 TGeoCombiTrans* transfoTorus2p = new TGeoCombiTrans(
5756 -length2 - radius1, radius2, length1 / 2 + radius1, rTorus2p);
5757 transfoTorus2p->RegisterYourself();
5758 TGeoCombiTrans* transfoTube3p =
5759 new TGeoCombiTrans(-length2 - radius2 - radius1, radius2 + length3 / 2,
5760 length1 / 2 + radius1, rTube3);
5761 transfoTube3p->RegisterYourself();
5762 TGeoRotation* rTube4p =
5763 new TGeoRotation(Form("rotationTube4p_H%d_D%d", half, disk),
5764 90.0 - theta4, phi4 - 90.0, 0.0);
5765 rTube4p->RegisterYourself();
5766
5767 TGeoCombiTrans* transfoTube4p =
5768 new TGeoCombiTrans(zTube4, -yTube4 + 0.2, xTube4 - 0.1, rTube4p);
5769 transfoTube4p->RegisterYourself();
5770
5771 Tube1p->SetLineColor(kGray);
5772 Torus1p->SetLineColor(kGray);
5773 Tube2p->SetLineColor(kGray);
5774 Torus2p->SetLineColor(kGray);
5775 Tube3p->SetLineColor(kGray);
5776 TubeW3p->SetLineColor(kBlue);
5777
5778 mCoolingPipe2->AddNode(Tube1p, 1, tTube1);
5779 mCoolingPipe2->AddNode(Torus1p, 1, transfoTorus1);
5780 mCoolingPipe2->AddNode(Tube2p, 1, transfoTube2);
5781 mCoolingPipe2->AddNode(Torus2p, 1, transfoTorus2p);
5782 mCoolingPipe2->AddNode(Tube3p, 1, transfoTube3p);
5783 mCoolingPipe2->AddNode(TubeW1p, 1, tTube1);
5784 mCoolingPipe2->AddNode(TorusW1p, 1, transfoTorus1);
5785 mCoolingPipe2->AddNode(TubeW2p, 1, transfoTube2);
5786 mCoolingPipe2->AddNode(TorusW2p, 1, transfoTorus2p);
5787 mCoolingPipe2->AddNode(TubeW3p, 1, transfoTube3p);
5788
5789 if (disk == 0) {
5790
5791 TGeoVolume* Tube4p = gGeoManager->MakeTube(
5792 Form("Tube4p_H%d_D%d", half, disk), mPipe, rin4, rout4, length4 / 2);
5793 TGeoVolume* TubeW4p = gGeoManager->MakeTube(
5794 Form("TubeW4p_H%d_D%d", half, disk), mWater, 0., rin4, length4 / 2);
5795 Tube4p->SetLineColor(kGray);
5796 TubeW4p->SetLineColor(kBlue);
5797
5798 mCoolingPipeRear2->AddNode(Tube4p, 1, transfoTube4p);
5799 mCoolingPipeRear2->AddNode(TubeW4p, 1, transfoTube4p);
5800 theta = 180. * TMath::Pi() / 180.;
5801 phi = 0. * TMath::Pi() / 180.;
5802 nlow[0] = TMath::Sin(theta) * TMath::Cos(phi);
5803 nlow[1] = TMath::Sin(theta) * TMath::Sin(phi);
5804 nlow[2] = TMath::Cos(theta);
5805 theta = -15. * TMath::Pi() / 180.;
5806 phi = 270. * TMath::Pi() / 180.;
5807 nhi[0] = TMath::Sin(theta) * TMath::Cos(phi);
5808 nhi[1] = TMath::Sin(theta) * TMath::Sin(phi);
5809 nhi[2] = TMath::Cos(theta);
5810 TGeoVolume* Tube5p = gGeoManager->MakeCtub(
5811 Form("Tube5p_H%d_D%d", half, disk), mPipe, rin5, rout5, length5 / 2,
5812 0., 360., nlow[0], nlow[1], nlow[2], nhi[0], nhi[1], nhi[2]);
5813 TGeoVolume* TubeW5p = gGeoManager->MakeCtub(
5814 Form("TubeW5p_H%d_D%d", half, disk), mWater, 0., rin5, length5 / 2,
5815 0., 360., nlow[0], nlow[1], nlow[2], nhi[0], nhi[1], nhi[2]);
5816 TGeoRotation* rTube5p = new TGeoRotation("rotationTube5p", -90.0 - theta5,
5817 -(90.0 + phi5), 0.0);
5818 rTube5p->RegisterYourself();
5819 TGeoCombiTrans* transfoTube5p;
5820 transfoTube5p = new TGeoCombiTrans(zTube5, -yTube5, xTube5, rTube5p);
5821 transfoTube5p->RegisterYourself();
5822 Tube5p->SetLineColor(kGray);
5823 TubeW5p->SetLineColor(kBlue);
5824 mCoolingPipeRear2->AddNode(Tube5p, 1, transfoTube5p);
5825 mCoolingPipeRear2->AddNode(TubeW5p, 1, transfoTube5p);
5826 }
5827 TGeoCombiTrans* transfoCoolingPipe1 = nullptr;
5828 TGeoCombiTrans* transfoCoolingPipe2 = nullptr;
5829 TGeoCombiTrans* transfoCoolingPipeRear1 = nullptr;
5830 TGeoCombiTrans* transfoCoolingPipeRear2 = nullptr;
5831
5832 TGeoRotation* rotation1 = new TGeoRotation("rotation1", 90., 90., 90.);
5833 rotation1->RegisterYourself();
5834 // 0.75 = Y location from manifold line 836
5835 transfoCoolingPipe1 =
5836 new TGeoCombiTrans(13.8 + length1 / 2, 0.75, 0.0, rotation1);
5837 transfoCoolingPipe1->RegisterYourself();
5838 transfoCoolingPipeRear1 =
5839 new TGeoCombiTrans(13.8 + length1 / 2, 0.75, 0.0, rotation1);
5840 transfoCoolingPipeRear1->RegisterYourself();
5841 TGeoRotation* rotation2 = new TGeoRotation("rotation2", 90., 90., 90.);
5842 rotation2->RegisterYourself();
5843 transfoCoolingPipe2 =
5844 new TGeoCombiTrans(13.8 + length1 / 2, -0.75, 0.0, rotation2);
5845 transfoCoolingPipe2->RegisterYourself();
5846 transfoCoolingPipeRear2 =
5847 new TGeoCombiTrans(13.8 + length1 / 2, -0.75, 0.0, rotation2);
5848 transfoCoolingPipeRear2->RegisterYourself();
5849 mHalfDisk->AddNode(mCoolingPipe1, 1, transfoCoolingPipe1);
5850 mHalfDisk->AddNode(mCoolingPipeRear1, 1, transfoCoolingPipeRear1);
5851 mHalfDisk->AddNode(mCoolingPipe2, 1, transfoCoolingPipe2);
5852 mHalfDisk->AddNode(mCoolingPipeRear2, 1, transfoCoolingPipeRear2);
5853 }
5854
5855 //=================================================================
5856 //=================================================================
5857 if (disk == 3) {
5858 // One diagonal side
5859 auto* mCoolingPipe3 =
5860 new TGeoVolumeAssembly(Form("cooling_pipe3_H%d_D%d", half, disk));
5861 Float_t length1_3 = 4.0;
5862 TGeoVolume* Tube1_3 = gGeoManager->MakeTube(
5863 Form("Tube1_3_H%d_D%d", half, disk), mPipe, rin, rout, length1_3 / 2);
5864 TGeoVolume* TubeW1_3 = gGeoManager->MakeTube(
5865 Form("TubeW1_3_H%d_D%d", half, disk), mWater, 0., rin, length1_3 / 2);
5866 TGeoTranslation* tTube1_3 = new TGeoTranslation(0.0, 0.0, 0.0);
5867 tTube1_3->RegisterYourself();
5868 Float_t radius1_3 = 0.4;
5869 TGeoVolume* Torus1_3 =
5870 gGeoManager->MakeTorus(Form("Torus1_3_H%d_D%d", half, disk), mPipe,
5871 radius1_3, rin, rout, 0., 90.);
5872 TGeoVolume* TorusW1_3 =
5873 gGeoManager->MakeTorus(Form("TorusW1_3_H%d_D%d", half, disk), mWater,
5874 radius1_3, 0., rin, 0., 90.);
5875 TGeoRotation* rTorus1_3 =
5876 new TGeoRotation("rotationTorus1_3", 90.0, 90.0, 0.0);
5877 rTorus1_3->RegisterYourself();
5878 TGeoCombiTrans* transfoTorus1_3 =
5879 new TGeoCombiTrans(0.0, -radius1_3, length1_3 / 2, rTorus1_3);
5880 transfoTorus1_3->RegisterYourself();
5881
5882 Float_t length2_3;
5883 if (disk == 3) {
5884 length2_3 = 10.4;
5885 }
5886 TGeoVolume* Tube2_3 = gGeoManager->MakeTube(
5887 Form("Tube2_3_H%d_D%d", half, disk), mPipe, rin, rout, length2_3 / 2);
5888 TGeoVolume* TubeW2_3 = gGeoManager->MakeTube(
5889 Form("TubeW2_3_H%d_D%d", half, disk), mWater, 0., rin, length2_3 / 2);
5890 TGeoRotation* rTube2_3 =
5891 new TGeoRotation("rotationTube2_3", 180.0, 90.0, 90.0);
5892 rTube2_3->RegisterYourself();
5893 TGeoCombiTrans* transfoTube2_3 = new TGeoCombiTrans(
5894 0., -length2_3 / 2 - radius1_3, length1_3 / 2 + radius1_3, rTube2_3);
5895 transfoTube2_3->RegisterYourself();
5896 TGeoVolume* Torus2_3 =
5897 gGeoManager->MakeTorus(Form("Torus2_3_H%d_D%d", half, disk), mPipe,
5898 radius1_3, rin, rout, 0., 90.);
5899 TGeoVolume* TorusW2_3 =
5900 gGeoManager->MakeTorus(Form("TorusW2_3_H%d_D%d", half, disk), mWater,
5901 radius1_3, 0., rin, 0., 90.);
5902 TGeoRotation* rTorus2_3 =
5903 new TGeoRotation("rotationTorus2_3", 90.0, 90.0, 180.0);
5904 rTorus2_3->RegisterYourself();
5905 TGeoCombiTrans* transfoTorus2_3 =
5906 new TGeoCombiTrans(0.0, -length2_3 - radius1_3,
5907 length1_3 / 2 + radius1_3 + radius1_3, rTorus2_3);
5908 transfoTorus2_3->RegisterYourself();
5909
5910 Float_t length3_3;
5911 if (disk == 3) {
5912 length3_3 = 1.5;
5913 }
5914 TGeoVolume* Tube3_3 = gGeoManager->MakeTube(
5915 Form("Tube3_3_H%d_D%d", half, disk), mPipe, rin, rout, length3_3 / 2);
5916 TGeoVolume* TubeW3_3 = gGeoManager->MakeTube(
5917 Form("TubeW3_3_H%d_D%d", half, disk), mWater, 0., rin, length3_3 / 2);
5918 TGeoRotation* rTube3_3 = new TGeoRotation("rotationTube3_3", 0.0, 0.0, 0.0);
5919 rTube3_3->RegisterYourself();
5920 TGeoCombiTrans* transfoTube3_3 = new TGeoCombiTrans(
5921 0., -length2_3 - radius1_3 - radius1_3,
5922 length1_3 / 2 + radius1_3 + radius1_3 + length3_3 / 2, rTube3_3);
5923 transfoTube3_3->RegisterYourself();
5924
5925 Tube1_3->SetLineColor(kGray);
5926 Torus1_3->SetLineColor(kGray);
5927 Tube2_3->SetLineColor(kGray);
5928 Torus2_3->SetLineColor(kGray);
5929 Tube3_3->SetLineColor(kGray);
5930 TubeW3_3->SetLineColor(kBlue);
5931
5932 mCoolingPipe3->AddNode(Tube1_3, 1, tTube1_3);
5933 mCoolingPipe3->AddNode(Torus1_3, 1, transfoTorus1_3);
5934 mCoolingPipe3->AddNode(Tube2_3, 1, transfoTube2_3);
5935 mCoolingPipe3->AddNode(Torus2_3, 1, transfoTorus2_3);
5936 mCoolingPipe3->AddNode(Tube3_3, 1, transfoTube3_3);
5937 mCoolingPipe3->AddNode(TubeW1_3, 1, tTube1_3);
5938 mCoolingPipe3->AddNode(TorusW1_3, 1, transfoTorus1_3);
5939 mCoolingPipe3->AddNode(TubeW2_3, 1, transfoTube2_3);
5940 mCoolingPipe3->AddNode(TorusW2_3, 1, transfoTorus2_3);
5941 mCoolingPipe3->AddNode(TubeW3_3, 1, transfoTube3_3);
5942
5943 TGeoCombiTrans* transfoCoolingPipe3_3 = nullptr;
5944 TGeoRotation* rotation3_3 = new TGeoRotation("rotation3_3", 90., 90., 76.);
5945 rotation3_3->RegisterYourself();
5946 transfoCoolingPipe3_3 =
5947 new TGeoCombiTrans(17. + length1_3 / 2, 0.75, 0.0, rotation3_3);
5948
5949 // ------------------Other diagonal side
5950 auto* mCoolingPipe4 =
5951 new TGeoVolumeAssembly(Form("cooling_pipe4_H%d_D%d", half, disk));
5952
5953 TGeoVolume* Tube1p_3 = gGeoManager->MakeTube(
5954 Form("Tube1p_3_H%d_D%d", half, disk), mPipe, rin, rout, length1_3 / 2);
5955 TGeoVolume* Torus1p_3 =
5956 gGeoManager->MakeTorus(Form("Torus1p_3_H%d_D%d", half, disk), mPipe,
5957 radius1_3, rin, rout, 0., 90.);
5958 TGeoVolume* Tube2p_3 = gGeoManager->MakeTube(
5959 Form("Tube2p_3_H%d_D%d", half, disk), mPipe, rin, rout, length2_3 / 2);
5960 TGeoVolume* Torus2p_3 =
5961 gGeoManager->MakeTorus(Form("Torus2p_3_H%d_D%d", half, disk), mPipe,
5962 radius1_3, rin, rout, 0., 90.);
5963 TGeoVolume* Tube3p_3 = gGeoManager->MakeTube(
5964 Form("Tube3p_3_H%d_D%d", half, disk), mPipe, rin, rout, length3_3 / 2);
5965 TGeoVolume* TubeW1p_3 = gGeoManager->MakeTube(
5966 Form("TubeW1p_3_H%d_D%d", half, disk), mWater, 0, rin, length1_3 / 2);
5967 TGeoVolume* TorusW1p_3 =
5968 gGeoManager->MakeTorus(Form("TorusW1p_3_H%d_D%d", half, disk), mWater,
5969 radius1_3, 0., rin, 0., 90.);
5970 TGeoVolume* TubeW2p_3 = gGeoManager->MakeTube(
5971 Form("TubeW2p_3_H%d_D%d", half, disk), mWater, 0., rin, length2_3 / 2);
5972 TGeoVolume* TorusW2p_3 =
5973 gGeoManager->MakeTorus(Form("TorusW2p_3_H%d_D%d", half, disk), mWater,
5974 radius1_3, 0., rin, 0., 90.);
5975 TGeoVolume* TubeW3p_3 = gGeoManager->MakeTube(
5976 Form("TubeW3p_3_H%d_D%d", half, disk), mWater, 0., rin, length3_3 / 2);
5977
5978 Tube1p_3->SetLineColor(kGray);
5979 Torus1p_3->SetLineColor(kGray);
5980 Tube2p_3->SetLineColor(kGray);
5981 Torus2p_3->SetLineColor(kGray);
5982 Tube3p_3->SetLineColor(kGray);
5983 TubeW3p_3->SetLineColor(kBlue);
5984
5985 mCoolingPipe4->AddNode(Tube1p_3, 1, tTube1_3);
5986 mCoolingPipe4->AddNode(Torus1p_3, 1, transfoTorus1_3);
5987 mCoolingPipe4->AddNode(Tube2p_3, 1, transfoTube2_3);
5988 mCoolingPipe4->AddNode(Torus2p_3, 1, transfoTorus2_3);
5989 mCoolingPipe4->AddNode(Tube3p_3, 1, transfoTube3_3);
5990 mCoolingPipe4->AddNode(TubeW1p_3, 1, tTube1_3);
5991 mCoolingPipe4->AddNode(TorusW1p_3, 1, transfoTorus1_3);
5992 mCoolingPipe4->AddNode(TubeW2p_3, 1, transfoTube2_3);
5993 mCoolingPipe4->AddNode(TorusW2p_3, 1, transfoTorus2_3);
5994 mCoolingPipe4->AddNode(TubeW3p_3, 1, transfoTube3_3);
5995
5996 TGeoCombiTrans* transfoCoolingPipe4_3 = nullptr;
5997 TGeoRotation* rotation4_3 = new TGeoRotation("rotation4_3", 90., 90., -76.);
5998 rotation4_3->RegisterYourself();
5999 transfoCoolingPipe4_3 =
6000 new TGeoCombiTrans(17. + length1_3 / 2, -0.75, 0.0, rotation4_3);
6001 transfoCoolingPipe4_3->RegisterYourself();
6002
6003 mHalfDisk->AddNode(mCoolingPipe3, 1, transfoCoolingPipe3_3);
6004 mHalfDisk->AddNode(mCoolingPipe4, 1, transfoCoolingPipe4_3);
6005 }
6006
6007 //=================================================================
6008 if (disk == 4) {
6009 // One diagonal side
6010 auto* mCoolingPipe3 =
6011 new TGeoVolumeAssembly(Form("cooling_pipe3_H%d_D%d", half, disk));
6012 Float_t length1_4 = 3.0;
6013 TGeoVolume* Tube1_4 = gGeoManager->MakeTube(
6014 Form("Tube1_4_H%d_D%d", half, disk), mPipe, rin, rout, length1_4 / 2);
6015 TGeoVolume* TubeW1_4 = gGeoManager->MakeTube(
6016 Form("TubeW1_4_H%d_D%d", half, disk), mWater, 0., rin, length1_4 / 2);
6017 TGeoTranslation* tTube1_4 = new TGeoTranslation(0.0, 0.0, 0.0);
6018 tTube1_4->RegisterYourself();
6019
6020 Float_t radius1_4 = 0.4;
6021 TGeoVolume* Torus1_4 =
6022 gGeoManager->MakeTorus(Form("Torus1_4_H%d_D%d", half, disk), mPipe,
6023 radius1_4, rin, rout, 0., 90.);
6024 TGeoVolume* TorusW1_4 =
6025 gGeoManager->MakeTorus(Form("TorusW1_4_H%d_D%d", half, disk), mWater,
6026 radius1_4, 0., rin, 0., 90.);
6027 TGeoRotation* rTorus1_4 =
6028 new TGeoRotation("rotationTorus1_4", 90.0, 90.0, 0.0);
6029 rTorus1_4->RegisterYourself();
6030 TGeoCombiTrans* transfoTorus1_4 =
6031 new TGeoCombiTrans(0.0, -radius1_4, length1_4 / 2, rTorus1_4);
6032 transfoTorus1_4->RegisterYourself();
6033
6034 Float_t length2_4;
6035 if (disk == 4) {
6036 length2_4 = 10.8;
6037 }
6038 TGeoVolume* Tube2_4 =
6039 gGeoManager->MakeTube("Tube2_4", mPipe, rin, rout, length2_4 / 2);
6040 TGeoVolume* TubeW2_4 =
6041 gGeoManager->MakeTube("TubeW2_4", mWater, 0., rin, length2_4 / 2);
6042 TGeoRotation* rTube2_4 =
6043 new TGeoRotation("rotationTube2_4", 180.0, 90.0, 90.0);
6044 rTube2_4->RegisterYourself();
6045 TGeoCombiTrans* transfoTube2_4 = new TGeoCombiTrans(
6046 0., -length2_4 / 2 - radius1_4, length1_4 / 2 + radius1_4, rTube2_4);
6047 transfoTube2_4->RegisterYourself();
6048
6049 TGeoVolume* Torus2_4 =
6050 gGeoManager->MakeTorus(Form("Torus2_4_H%d_D%d", half, disk), mPipe,
6051 radius1_4, rin, rout, 0., 90.);
6052 TGeoVolume* TorusW2_4 =
6053 gGeoManager->MakeTorus(Form("TorusW2_4_H%d_D%d", half, disk), mWater,
6054 radius1_4, 0., rin, 0., 90.);
6055 TGeoRotation* rTorus2_4 =
6056 new TGeoRotation("rotationTorus2_4", 90.0, 90.0, 180.0);
6057 rTorus2_4->RegisterYourself();
6058 TGeoCombiTrans* transfoTorus2_4 =
6059 new TGeoCombiTrans(0.0, -length2_4 - radius1_4,
6060 length1_4 / 2 + radius1_4 + radius1_4, rTorus2_4);
6061 transfoTorus2_4->RegisterYourself();
6062
6063 Float_t length3_4;
6064 if (disk == 4) {
6065 length3_4 = 3.8;
6066 }
6067 TGeoVolume* Tube3_4 = gGeoManager->MakeTube(
6068 Form("Tube3_4_H%d_D%d", half, disk), mPipe, rin, rout, length3_4 / 2);
6069 TGeoVolume* TubeW3_4 = gGeoManager->MakeTube(
6070 Form("TubeW3_4_H%d_D%d", half, disk), mWater, 0., rin, length3_4 / 2);
6071 TGeoRotation* rTube3_4 = new TGeoRotation("rotationTube3_4", 0.0, 0.0, 0.0);
6072 rTube3_4->RegisterYourself();
6073 TGeoCombiTrans* transfoTube3_4 = new TGeoCombiTrans(
6074 0., -length2_4 - radius1_4 - radius1_4,
6075 length1_4 / 2 + radius1_4 + radius1_4 + length3_4 / 2, rTube3_4);
6076 transfoTube3_4->RegisterYourself();
6077
6078 Tube1_4->SetLineColor(kGray);
6079 Torus1_4->SetLineColor(kGray);
6080 Tube2_4->SetLineColor(kGray);
6081 Torus2_4->SetLineColor(kGray);
6082 Tube3_4->SetLineColor(kGray);
6083 TubeW3_4->SetLineColor(kBlue);
6084
6085 mCoolingPipe3->AddNode(Tube1_4, 1, tTube1_4);
6086 mCoolingPipe3->AddNode(Torus1_4, 1, transfoTorus1_4);
6087 mCoolingPipe3->AddNode(Tube2_4, 1, transfoTube2_4);
6088 mCoolingPipe3->AddNode(Torus2_4, 1, transfoTorus2_4);
6089 mCoolingPipe3->AddNode(Tube3_4, 1, transfoTube3_4);
6090 mCoolingPipe3->AddNode(TubeW1_4, 1, tTube1_4);
6091 mCoolingPipe3->AddNode(TorusW1_4, 1, transfoTorus1_4);
6092 mCoolingPipe3->AddNode(TubeW2_4, 1, transfoTube2_4);
6093 mCoolingPipe3->AddNode(TorusW2_4, 1, transfoTorus2_4);
6094 mCoolingPipe3->AddNode(TubeW3_4, 1, transfoTube3_4);
6095
6096 TGeoCombiTrans* transfoCoolingPipe3_4 = nullptr;
6097 TGeoRotation* rotation3_4 = new TGeoRotation("rotation3_4", 90., 90., 100.);
6098 rotation3_4->RegisterYourself();
6099 transfoCoolingPipe3_4 =
6100 new TGeoCombiTrans(17. + length1_4 / 2, 0.75, 0.0, rotation3_4);
6101 transfoCoolingPipe3_4->RegisterYourself();
6102 // ------------------Other diagonal side
6103 auto* mCoolingPipe4 =
6104 new TGeoVolumeAssembly(Form("cooling_pipe4_H%d_D%d", half, disk));
6105 TGeoVolume* Tube1p_4 = gGeoManager->MakeTube(
6106 Form("Tube1p_4_H%d_D%d", half, disk), mPipe, rin, rout, length1_4 / 2);
6107 TGeoVolume* Torus1p_4 =
6108 gGeoManager->MakeTorus(Form("Torus1p_4_H%d_D%d", half, disk), mPipe,
6109 radius1_4, rin, rout, 0., 90.);
6110 TGeoVolume* Tube2p_4 = gGeoManager->MakeTube(
6111 Form("Tube2p_4_H%d_D%d", half, disk), mPipe, rin, rout, length2_4 / 2);
6112 TGeoVolume* Torus2p_4 =
6113 gGeoManager->MakeTorus(Form("Torus2p_4_H%d_D%d", half, disk), mPipe,
6114 radius1_4, rin, rout, 0., 90.);
6115 TGeoVolume* Tube3p_4 = gGeoManager->MakeTube(
6116 Form("Tube3p_4_H%d_D%d", half, disk), mPipe, rin, rout, length3_4 / 2);
6117 TGeoVolume* TubeW1p_4 = gGeoManager->MakeTube(
6118 Form("TubeW1p_4_H%d_D%d", half, disk), mWater, 0., rin, length1_4 / 2);
6119 TGeoVolume* TorusW1p_4 =
6120 gGeoManager->MakeTorus(Form("TorusW1p_4_H%d_D%d", half, disk), mWater,
6121 radius1_4, 0., rin, 0., 90.);
6122 TGeoVolume* TubeW2p_4 = gGeoManager->MakeTube(
6123 Form("TubeW2p_4_H%d_D%d", half, disk), mWater, 0., rin, length2_4 / 2);
6124 TGeoVolume* TorusW2p_4 =
6125 gGeoManager->MakeTorus(Form("TorusW2p_4_H%d_D%d", half, disk), mWater,
6126 radius1_4, 0., rin, 0., 90.);
6127 TGeoVolume* TubeW3p_4 = gGeoManager->MakeTube(
6128 Form("TubeW3p_4_H%d_D%d", half, disk), mWater, 0., rin, length3_4 / 2);
6129
6130 Tube1p_4->SetLineColor(kGray);
6131 Torus1p_4->SetLineColor(kGray);
6132 Tube2p_4->SetLineColor(kGray);
6133 Torus2p_4->SetLineColor(kGray);
6134 Tube3p_4->SetLineColor(kGray);
6135 TubeW3p_4->SetLineColor(kBlue);
6136
6137 mCoolingPipe4->AddNode(Tube1p_4, 1, tTube1_4);
6138 mCoolingPipe4->AddNode(Torus1p_4, 1, transfoTorus1_4);
6139 mCoolingPipe4->AddNode(Tube2p_4, 1, transfoTube2_4);
6140 mCoolingPipe4->AddNode(Torus2p_4, 1, transfoTorus2_4);
6141 mCoolingPipe4->AddNode(Tube3p_4, 1, transfoTube3_4);
6142 mCoolingPipe4->AddNode(TubeW1p_4, 1, tTube1_4);
6143 mCoolingPipe4->AddNode(TorusW1p_4, 1, transfoTorus1_4);
6144 mCoolingPipe4->AddNode(TubeW2p_4, 1, transfoTube2_4);
6145 mCoolingPipe4->AddNode(TorusW2p_4, 1, transfoTorus2_4);
6146 mCoolingPipe4->AddNode(TubeW3p_4, 1, transfoTube3_4);
6147
6148 TGeoCombiTrans* transfoCoolingPipe4_4 = nullptr;
6149 TGeoRotation* rotation4_4 =
6150 new TGeoRotation("rotation4_4", 90., 90., -100.);
6151 rotation4_4->RegisterYourself();
6152 transfoCoolingPipe4_4 =
6153 new TGeoCombiTrans(17. + length1_4 / 2, -0.75, 0.0, rotation4_4);
6154 transfoCoolingPipe4_4->RegisterYourself();
6155
6156 mHalfDisk->AddNode(mCoolingPipe3, 1, transfoCoolingPipe3_4);
6157 mHalfDisk->AddNode(mCoolingPipe4, 1, transfoCoolingPipe4_4);
6158 }
6159 //=================================================================
6160}
6161
6162//_____________________________________________________________________________
6163void HeatExchanger::initParameters()
6164{
6165
6166 mHalfDiskRotation = new TGeoRotation**[constants::DisksNumber];
6167 mHalfDiskTransformation = new TGeoCombiTrans**[constants::DisksNumber];
6168 for (Int_t idisk = 0; idisk < constants::DisksNumber; idisk++) {
6169 mHalfDiskRotation[idisk] = new TGeoRotation*[constants::HalvesNumber];
6170 mHalfDiskTransformation[idisk] =
6171 new TGeoCombiTrans*[constants::HalvesNumber];
6172 for (Int_t ihalf = 0; ihalf < constants::HalvesNumber; ihalf++) {
6173 mHalfDiskRotation[idisk][ihalf] =
6174 new TGeoRotation(Form("rotation%d%d", idisk, ihalf), 0., 0., 0.);
6175 mHalfDiskTransformation[idisk][ihalf] =
6176 new TGeoCombiTrans(Form("transformation%d%d", idisk, ihalf), 0., 0.,
6177 0., mHalfDiskRotation[idisk][ihalf]);
6178 }
6179 }
6180
6181 if (Geometry::sGrooves == 0) {
6182 mRohacellThickness =
6183 mHeatExchangerThickness / 2. - 2. * mCarbonThickness -
6187 2 * (mRWater + mDRPipe); // smaller rohacell thickness, no grooves
6188 }
6189 if (Geometry::sGrooves == 1) {
6190 mRohacellThickness = mHeatExchangerThickness / 2. - 2. * mCarbonThickness -
6193 2 * Geometry::sKaptonGlueThickness; // with grooves
6194 }
6195
6196 mHalfDiskGap = 0.1;
6197
6198 mNPart[0] = 3;
6199 mNPart[1] = 3;
6200 mNPart[2] = 3;
6201 mNPart[3] = 4;
6202 mNPart[4] = 4;
6203
6204 mRMin[0] = 2.35;
6205 mRMin[1] = 2.35;
6206 mRMin[2] = 2.35;
6207 mRMin[3] = 3.35;
6208 mRMin[4] = 3.75;
6209
6210 mZPlan[0] = 0;
6211 mZPlan[1] = 0;
6212 mZPlan[2] = 0;
6213 mZPlan[3] = 0;
6214 mZPlan[4] = 0;
6215
6216 mSupportXDimensions = new Double_t*[constants::DisksNumber];
6217 mSupportYDimensions = new Double_t*[constants::DisksNumber];
6218
6219 for (Int_t i = 0; i < constants::DisksNumber; i++) {
6220 mSupportXDimensions[i] = new double[mNPart[i]];
6221 mSupportYDimensions[i] = new double[mNPart[i]];
6222 }
6223
6224 mMoreLength01 = 0.6; // additional length of carbon plates compare to the
6225 // rohacell plate, disk 0 and 1
6226 mMoreLength =
6227 0.6; // additional length of carbon plates compare to the rohacell plate
6228
6229 // disk width
6230 // disks 0, 1
6231 mSupportXDimensions[0][0] = mSupportXDimensions[1][0] = 21.8;
6232 mSupportXDimensions[0][1] = mSupportXDimensions[1][1] = 15.7;
6233 mSupportXDimensions[0][2] = mSupportXDimensions[1][2] = 5.6;
6234
6235 // disk 2
6236 mSupportXDimensions[2][0] = 22.6;
6237 mSupportXDimensions[2][1] = 19.2;
6238 mSupportXDimensions[2][2] = 12.4;
6239
6240 // disk 3
6241 mSupportXDimensions[3][0] = 28.4;
6242 mSupportXDimensions[3][1] = 19.2;
6243 mSupportXDimensions[3][2] = 9.0;
6244 mSupportXDimensions[3][3] = 5.6;
6245
6246 // disk 4
6247 mSupportXDimensions[4][0] = 29.40;
6248 mSupportXDimensions[4][1] = 22.60;
6249 mSupportXDimensions[4][2] = 15.80;
6250 mSupportXDimensions[4][3] = 5.60;
6251
6252 // disk height
6253 // disks 0, 1
6254 mSupportYDimensions[0][0] = mSupportYDimensions[1][0] = 6.7;
6255 mSupportYDimensions[0][1] = mSupportYDimensions[1][1] = 2.5;
6256 mSupportYDimensions[0][2] = mSupportYDimensions[1][2] = 2.4;
6257
6258 // disk 2
6259 mSupportYDimensions[2][0] = 6.7;
6260 mSupportYDimensions[2][1] = 2.5;
6261 mSupportYDimensions[2][2] = 3.0;
6262
6263 // disk 3
6264 mSupportYDimensions[3][0] = 9.2;
6265 mSupportYDimensions[3][1] = 3.0;
6266 mSupportYDimensions[3][2] = 2.3;
6267 mSupportYDimensions[3][3] = 1.2;
6268
6269 // disk 4
6270 mSupportYDimensions[4][0] = 9.20;
6271 mSupportYDimensions[4][1] = 3.00;
6272 mSupportYDimensions[4][2] = 3.00;
6273 mSupportYDimensions[4][3] = 0.90;
6274
6275 // Parameters for disks 0, 1
6276 mLWater0[0] = mLWater1[0] = 5.98 + mMoreLength;
6277 mLWater0[1] = mLWater1[1] = 5.91 + mMoreLength;
6278 mLWater0[2] = mLWater1[2] = 2.93 + mMoreLength;
6279
6280 mXPosition0[0] = mXPosition1[0] = 1.7;
6281 mXPosition0[1] = mXPosition1[1] = 4.61;
6282 mXPosition0[2] = mXPosition1[2] = 6.31;
6283
6284 mAngle0[0] = mAngle1[0] = 31.;
6285 mAngle0[1] = mAngle1[1] = 29.;
6286 mAngle0[2] = mAngle1[2] = 28.5;
6287
6288 mRadius0[0] = mRadius1[0] = 4.0;
6289 mRadius0[1] = mRadius1[1] = 4.0;
6290 mRadius0[2] = mRadius1[2] = 4.0;
6291
6292 mLpartial0[0] = mLpartial1[0] = 0.916;
6293 mLpartial0[1] = mLpartial1[1] = 0.73;
6294 mLpartial0[2] = mLpartial1[2] = 4.85;
6295
6296 // Parameters for disk 2
6297 mLWater2[0] = 5.29 + mMoreLength;
6298 mLWater2[1] = 5.29 + mMoreLength;
6299 mLWater2[2] = 1.31 + mMoreLength;
6300
6301 mXPosition2[0] = 1.7;
6302 mXPosition2[1] = 4.61;
6303 mXPosition2[2] = 6.41;
6304
6305 mAngle2[0] = 28.;
6306 mAngle2[1] = 29.;
6307 mAngle2[2] = 27.;
6308
6309 mRadius2[0] = 4.0;
6310 mRadius2[1] = 4.0;
6311 mRadius2[2] = 4.0;
6312
6313 mLpartial2[0] = 2.60;
6314 mLpartial2[1] = 2.38;
6315 mLpartial2[2] = 7.16;
6316
6317 // Parameters for disk 3
6318 mLWater3[0] = 6.35 + mMoreLength;
6319 mLWater3[1] = 5.6 + mMoreLength;
6320 mLWater3[2] = 2.88 + mMoreLength;
6321 mLWater3[3] = 2.4 + mMoreLength;
6322
6323 mXPosition3[0] = 1.4;
6324 mXPosition3[1] = 3.9;
6325 mXPosition3[2] = 5.9;
6326 mXPosition3[3] = 7.9;
6327
6328 mAngle3[0] = 34.;
6329 mAngle3[1] = 30.;
6330 mAngle3[2] = 28.;
6331 mAngle3[3] = 32.;
6332
6333 mRadius3[0] = 4.;
6334 mRadius3[1] = 4.;
6335 mRadius3[2] = 4.;
6336 mRadius3[3] = 4.;
6337
6338 mAngleThirdPipe3 = 15.;
6339 mLpartial3[0] = 4.0;
6340 mLpartial3[1] = 5.26;
6341 mLpartial3[2] = 8.53;
6342 mLpartial3[3] = 8.90;
6343
6344 mRadius3fourth[0] = 9.6;
6345 mRadius3fourth[1] = 2.9;
6346 mRadius3fourth[2] = 2.9;
6347 mRadius3fourth[3] = 0.;
6348
6349 mAngle3fourth[0] = 40.8;
6350 mAngle3fourth[1] = 50.;
6351 mAngle3fourth[2] = 60.;
6352 mAngle3fourth[3] = 8 + mAngle3fourth[0] - mAngle3fourth[1] + mAngle3fourth[2];
6353
6354 // Parameters for disk 4
6355
6356 mLWater4[0] = 6.20 + mMoreLength;
6357 mLWater4[1] = 4.67 + mMoreLength;
6358 mLWater4[2] = 2.70 + mMoreLength;
6359 mLWater4[3] = 1.20 + mMoreLength;
6360
6361 mXPosition4[0] = 1.4;
6362 mXPosition4[1] = 3.9;
6363 mXPosition4[2] = 5.9;
6364 mXPosition4[3] = 7.9;
6365 mXPosition4[4] = 5.8;
6366
6367 mAngle4[0] = 31.;
6368 mAngle4[1] = 28.;
6369 mAngle4[2] = 28.;
6370 mAngle4[3] = 29.;
6371 mAngle4[4] = 40.;
6372 mAngle4[5] = (mAngle4[3] - mAngle4[4]);
6373
6374 mRadius4[0] = 4.0;
6375 mRadius4[1] = 4.0;
6376 mRadius4[2] = 4.0;
6377 mRadius4[3] = 4.0;
6378 mRadius4[4] = 4.0;
6379
6380 mLpartial4[0] = 5.095;
6381 mLpartial4[1] = 7.026;
6382 mLpartial4[2] = 9.327;
6383 mLpartial4[3] = 11.006;
6384
6385 mAngle4fifth[0] = 64.;
6386 mAngle4fifth[1] = 30.;
6387 mAngle4fifth[2] = 27.;
6388 mAngle4fifth[3] = mAngle4fifth[0] - mAngle4fifth[1] + mAngle4fifth[2];
6389
6390 mRadius4fifth[0] = 2.7;
6391 mRadius4fifth[1] = 5.0;
6392 mRadius4fifth[2] = 5.1;
6393 mRadius4fifth[3] = 4.3;
6394}
Constants for the MFT; distance unit is cm.
int32_t i
ClassImp(o2::mft::HeatExchanger)
MFT heat exchanger builder.
Class handling both virtual segmentation and real volumes.
static const Double_t sEpsilon
Definition Geometry.h:75
static const Double_t sGlueRohacellCarbonThickness
Definition Geometry.h:80
static const Double_t sKaptonGlueThickness
Definition Geometry.h:82
static const Int_t sGrooves
Definition Geometry.h:83
static const Double_t sKaptonOnCarbonThickness
Definition Geometry.h:81
void createHalfDisk3(Int_t half)
void createHalfDisk2(Int_t half)
void createHalfDisk0(Int_t half)
void createHalfDisk1(Int_t half)
void createCoolingPipes(Int_t half, Int_t disk)
TGeoVolumeAssembly * create(Int_t kHalf, Int_t disk)
void createHalfDisk4(Int_t half)
void createManifold(Int_t disk)
GLuint index
Definition glcorearb.h:781
constexpr Int_t HalvesNumber
Definition Constants.h:29
constexpr Int_t DisksNumber
Definition Constants.h:27
auto transformation