Project
Loading...
Searching...
No Matches
Flex.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
15
16#include "TGeoManager.h"
17#include "TGeoVolume.h"
18#include "TGeoTrd2.h"
19#include "TGeoMatrix.h"
20#include "TGeoBBox.h"
21#include "TGeoTube.h"
22#include "TGeoCompositeShape.h"
23#include "TGeoBoolNode.h"
24#include "TMath.h"
25
26#include <fairlogger/Logger.h>
27
30#include "MFTBase/Flex.h"
31#include "MFTBase/Ladder.h"
32#include "MFTBase/Geometry.h"
34
35using namespace o2::mft;
36using namespace o2::itsmft;
37
39
40//_____________________________________________________________________________
41Flex::Flex() : mFlexOrigin(), mLadderSeg(nullptr)
42{
43 // Constructor
44}
45
46//_____________________________________________________________________________
47Flex::~Flex() = default;
48
49//_____________________________________________________________________________
50Flex::Flex(LadderSegmentation* ladder) : mFlexOrigin(), mLadderSeg(ladder)
51{
52 // Constructor
53}
54
55//_____________________________________________________________________________
56TGeoVolumeAssembly* Flex::makeFlex(Int_t nbsensors, Double_t length)
57{
58
59 // Informations from the technical report mft_flex_proto_5chip_v08_laz50p.docx on MFT twiki and private communications
60
61 // For the naming
62 Geometry* mftGeom = Geometry::instance();
63 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
64 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
65 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
66
67 // First a global pointer for the flex
68 TGeoMedium* kMedAir = gGeoManager->GetMedium("MFT_Air$");
69 auto* flex = new TGeoVolumeAssembly(Form("flex_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder));
70
71 // Defining one single layer for the strips and the AVDD and DVDD
72 TGeoVolume* lines = makeLines(nbsensors, length - Geometry::sClearance, Geometry::sFlexHeight - Geometry::sClearance,
74
75 // AGND and DGND layers
76 TGeoVolume* agnd_dgnd = makeAGNDandDGND(length - Geometry::sClearance, Geometry::sFlexHeight - Geometry::sClearance,
78
79 // The others layers
80 TGeoVolume* kaptonlayer = makeKapton(length, Geometry::sFlexHeight, Geometry::sKaptonThickness);
81 TGeoVolume* varnishlayerIn = makeVarnish(length, Geometry::sFlexHeight, Geometry::sVarnishThickness, 0);
82 TGeoVolume* varnishlayerOut = makeVarnish(length, Geometry::sFlexHeight, Geometry::sVarnishThickness, 1);
83
84 // Final flex building
88 Double_t zkaptonlayer = -Geometry::sGlueThickness;
92
93 //-----------------------------------------------------------------------------------------
94 //-------------------------- Adding all layers of the FPC ----------------------------------
95 //-----------------------------------------------------------------------------------------
96
97 flex->AddNode(varnishlayerIn, 1, new TGeoTranslation(0., 0., zvarnishIn)); // inside, in front of the cold plate
98 flex->AddNode(agnd_dgnd, 1, new TGeoTranslation(0., 0., zgnd));
99 flex->AddNode(kaptonlayer, 1, new TGeoTranslation(0., 0., zkaptonlayer));
100 flex->AddNode(lines, 1, new TGeoTranslation(0., 0., zlines));
101 flex->AddNode(varnishlayerOut, 1, new TGeoTranslation(0., 0., zvarnishOut)); // outside
102
103 makeElectricComponents(flex, nbsensors, length, zvarnishOut);
104
105 return flex;
106}
107
108//_____________________________________________________________________________
109void Flex::makeElectricComponents(TGeoVolumeAssembly* flex, Int_t nbsensors, Double_t length, Double_t zvarnish)
110{
111
112 // Making and adding all the electric components
113 TGeoVolumeAssembly* electric[200];
114
115 // 2 components on the connector side
116 Int_t total;
117
118 auto* rotation = new TGeoRotation("rotation", 90., 0., 0.);
119 auto* rotationpi = new TGeoRotation("rotationpi", 180., 0., 0.);
120 auto* transformation0 =
121 new TGeoCombiTrans(length / 2 - 0.1, Geometry::sFlexHeight / 2 - 0.2,
122 zvarnish - Geometry::sVarnishThickness / 2 - Geometry::sCapacitorDz / 2, rotation);
123 auto* transformation1 =
124 new TGeoCombiTrans(length / 2 - 0.1, Geometry::sFlexHeight / 2 - 0.6,
125 zvarnish - Geometry::sVarnishThickness / 2 - Geometry::sCapacitorDz / 2, rotation);
126
127 for (Int_t id = 0; id < 2; id++) {
128 electric[id] = makeElectricComponent(Geometry::sCapacitorDy, Geometry::sCapacitorDx, Geometry::sCapacitorDz, id);
129 }
130 flex->AddNode(electric[0], 1, transformation0);
131 flex->AddNode(electric[1], 2, transformation1);
132 total = 2;
133
134 // 2 lines of electric components along the FPC in the middle (4 per sensor)
135 for (Int_t id = 0; id < 4 * nbsensors; id++) {
136 electric[id + total] =
137 makeElectricComponent(Geometry::sCapacitorDy, Geometry::sCapacitorDx, Geometry::sCapacitorDz, id + total);
138 }
139 for (Int_t id = 0; id < 2 * nbsensors; id++) {
140 flex->AddNode(electric[id + total], id + 1000,
141 new TGeoTranslation(-length / 2 + (id + 0.5) * SegmentationAlpide::SensorSizeCols / 2,
142 Geometry::sFlexHeight / 2 - 0.35,
144 flex->AddNode(electric[id + total + 2 * nbsensors], id + 2000,
145 new TGeoTranslation(-length / 2 + (id + 0.5) * SegmentationAlpide::SensorSizeCols / 2, 0.,
147 }
148 total = total + 4 * nbsensors;
149
150 // ------- 3 components on the FPC side --------
151 for (Int_t id = 0; id < 3; id++) {
152 electric[id + total] =
153 makeElectricComponent(Geometry::sCapacitorDy, Geometry::sCapacitorDx, Geometry::sCapacitorDz, id + total);
154 }
155 for (Int_t id = 0; id < 3; id++) {
156 flex->AddNode(electric[id + total], id + 3000,
157 new TGeoTranslation(-length / 2 + SegmentationAlpide::SensorSizeCols + (id + 1) * 0.3 - 0.6,
158 -Geometry::sFlexHeight / 2 + 0.2,
160 }
161 total = total + 3;
162
163 /*
164 // The connector of the FPC
165 for(Int_t id=0; id < 74; id++)electric[id+total] = makeElectricComponent(Geometry::sConnectorLength,
166 Geometry::sConnectorWidth,
167 Geometry::sConnectorThickness, id+total);
168 for(Int_t id=0; id < 37; id++){
169 flex->AddNode(electric[id+total], id+100, new TGeoTranslation(length/2+0.15-Geometry::sConnectorOffset,
170 id*0.04-Geometry::sFlexHeight/2 + 0.1,
171 zvarnish-Geometry::sVarnishThickness/2-Geometry::sCapacitorDz/2));
172 flex->AddNode(electric[id+total+37], id+200, new TGeoTranslation(length/2-0.15-Geometry::sConnectorOffset,
173 id*0.04-Geometry::sFlexHeight/2 + 0.1,
174 zvarnish - Geometry::sVarnishThickness/2 -
175 Geometry::sCapacitorDz/2));
176 }
177 total=total+74;
178 */
179
180 //-------------------------- New Connector ----------------------
181 TGeoMedium* kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
182 TGeoMedium* kMedPeek = gGeoManager->GetMedium("MFT_PEEK$");
183
184 auto* connect = new TGeoBBox("connect", Geometry::sConnectorLength / 2, Geometry::sConnectorWidth / 2,
186 auto* remov =
189
190 auto* t1 = new TGeoTranslation("t1", Geometry::sConnectorThickness, 0., -0.01);
191 auto* connecto = new TGeoSubtraction(connect, remov, nullptr, t1);
192 auto* connector = new TGeoCompositeShape("connector", connecto);
193 auto* connectord = new TGeoVolume("connectord", connector, kMedAlu);
194 connectord->SetVisibility(kTRUE);
195 connectord->SetLineColor(kRed);
196 connectord->SetLineWidth(1);
197 connectord->SetFillColor(connectord->GetLineColor());
198 connectord->SetFillStyle(4000); // 0% transparent
199
200 Double_t interspace = 0.1; // interspace inside the 2 ranges of connector pads
201 Double_t step = 0.04; // interspace between each pad inside the connector
202 for (Int_t id = 0; id < 37; id++) {
203 flex->AddNode(
204 connectord, id + total,
205 new TGeoTranslation(length / 2 + interspace / 2 + Geometry::sConnectorLength / 2 - Geometry::sConnectorOffset,
206 id * step - Geometry::sFlexHeight / 2 + 0.1,
208 auto* transformationpi =
209 new TGeoCombiTrans(length / 2 - interspace / 2 - Geometry::sConnectorLength / 2 - Geometry::sConnectorOffset,
210 id * step - Geometry::sFlexHeight / 2 + 0.1,
211 zvarnish - Geometry::sVarnishThickness / 2 - Geometry::sConnectorHeight / 2, rotationpi);
212 flex->AddNode(connectord, id + total + 37, transformationpi);
213 }
214
215 Double_t boxthickness = 0.05;
216 auto* boxconnect = new TGeoBBox("boxconnect", (2 * Geometry::sConnectorThickness + interspace + boxthickness) / 2,
218 auto* boxremov = new TGeoBBox("boxremov", (2 * Geometry::sConnectorThickness + interspace) / 2,
219 (Geometry::sFlexHeight - 0.1 - step) / 2, Geometry::sConnectorHeight / 2 + 0.001);
220 auto* boxconnecto = new TGeoSubtraction(boxconnect, boxremov, nullptr, nullptr);
221 auto* boxconnector = new TGeoCompositeShape("boxconnector", boxconnecto);
222 auto* boxconnectord = new TGeoVolume("boxconnectord", boxconnector, kMedPeek);
223 flex->AddNode(boxconnectord, 1,
224 new TGeoTranslation(length / 2 - Geometry::sConnectorOffset, -step / 2,
227}
228
229//_____________________________________________________________________________
230TGeoVolumeAssembly* Flex::makeElectricComponent(Double_t dx, Double_t dy, Double_t dz, Int_t id)
231{
232
233 Geometry* mftGeom = Geometry::instance();
234 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
235 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
236 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
237 //------------------------------------------------------
238 TGeoMedium* kmedX7R = gGeoManager->GetMedium("MFT_X7Rcapacitors$");
239 TGeoMedium* kmedX7Rw = gGeoManager->GetMedium("MFT_X7Rweld$");
240
241 auto* X7R0402 = new TGeoVolumeAssembly(Form("X7R_%d_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder, id));
242
243 auto* capacit = new TGeoBBox("capacitor", dx / 2, dy / 2, dz / 2);
244 auto* weld = new TGeoBBox("weld", (dx / 4) / 2, dy / 2, (dz / 2) / 2);
245 auto* capacitor =
246 new TGeoVolume(Form("capacitor_%d_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder, id), capacit, kmedX7R);
247 auto* welding0 = new TGeoVolume(Form("welding0_%d_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder, id), weld, kmedX7Rw);
248 auto* welding1 = new TGeoVolume(Form("welding1_%d_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder, id), weld, kmedX7Rw);
249 capacitor->SetVisibility(kTRUE);
250 capacitor->SetLineColor(kRed);
251 capacitor->SetLineWidth(1);
252 capacitor->SetFillColor(capacitor->GetLineColor());
253 capacitor->SetFillStyle(4000); // 0% transparent
254
255 welding0->SetVisibility(kTRUE);
256 welding0->SetLineColor(kGray);
257 welding0->SetLineWidth(1);
258 welding0->SetFillColor(welding0->GetLineColor());
259 welding0->SetFillStyle(4000); // 0% transparent
260
261 welding1->SetVisibility(kTRUE);
262 welding1->SetLineColor(kGray);
263 welding1->SetLineWidth(1);
264 welding1->SetFillColor(welding1->GetLineColor());
265 welding1->SetFillStyle(4000); // 0% transparent
266
267 X7R0402->AddNode(capacitor, 1, new TGeoTranslation(0., 0., 0.));
268 X7R0402->AddNode(welding0, 1, new TGeoTranslation(dx / 2 + (dx / 4) / 2, 0., (dz / 2) / 2));
269 X7R0402->AddNode(welding1, 1, new TGeoTranslation(-dx / 2 - (dx / 4) / 2, 0., (dz / 2) / 2));
270
271 X7R0402->SetVisibility(kTRUE);
272
273 return X7R0402;
274
275 //------------------------------------------------------
276
277 /*
278 // the medium has to be changed, see ITS capacitors...
279 TGeoMedium *kMedCopper = gGeoManager->GetMedium("MFT_Cu$");
280
281 Geometry * mftGeom = Geometry::instance();
282 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
283 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
284 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
285
286 TGeoVolume* electriccomponent = new TGeoVolume(Form("electric_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id), new
287 TGeoBBox("BOX", dy/2, dx/2, dz/2), kMedCopper);
288 electriccomponent->SetVisibility(1);
289 electriccomponent->SetLineColor(kRed);
290 return electriccomponent;
291 */
292}
293
294//_____________________________________________________________________________
295TGeoVolume* Flex::makeLines(Int_t nbsensors, Double_t length, Double_t widthflex, Double_t thickness)
296{
297
298 // One line is built by removing 3 lines of aluminium in the TGeoBBox *layer_def layer. Then one line is made by the 2
299 // remaining aluminium strips.
300
301 // the initial layer of aluminium
302 auto* layer_def = new TGeoBBox("layer_def", length / 2, widthflex / 2, thickness / 2);
303
304 // Two holes for fixing and positionning of the FPC on the cold plate
305 auto* hole1 = new TGeoTube("hole1", 0., Geometry::sRadiusHole1, thickness / 2 + Geometry::sEpsilon);
306 auto* hole2 = new TGeoTube("hole2", 0., Geometry::sRadiusHole2, thickness / 2 + Geometry::sEpsilon);
307
308 auto* t1 = new TGeoTranslation("t1", length / 2 - Geometry::sHoleShift1, 0., 0.);
309 auto* layerholesub1 = new TGeoSubtraction(layer_def, hole1, nullptr, t1);
310 auto* layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
311
312 auto* t2 = new TGeoTranslation("t2", length / 2 - Geometry::sHoleShift2, 0., 0.);
313 auto* layerholesub2 = new TGeoSubtraction(layerhole1, hole2, nullptr, t2);
314 auto* layer = new TGeoCompositeShape("layerhole2", layerholesub2);
315
316 TGeoBBox* line[25];
317 TGeoTranslation *t[6], *ts[15], *tvdd, *tl[2];
318 TGeoSubtraction* layerl[25];
319 TGeoCompositeShape* layern[25];
320 Int_t istart, istop;
321 Int_t kTotalLinesNb = 0;
322 Int_t kTotalLinesNb1, kTotalLinesNb2;
323 Double_t length_line;
324
325 // ----------- two lines along the FPC digital side --------------
326 t[0] = new TGeoTranslation("t0", SegmentationAlpide::SensorSizeCols / 2 - Geometry::sConnectorOffset / 2,
327 -widthflex / 2 + 2 * Geometry::sLineWidth, 0.);
328 line[0] = new TGeoBBox("line0", length / 2 - Geometry::sConnectorOffset / 2 - SegmentationAlpide::SensorSizeCols / 2,
329 Geometry::sLineWidth / 2, thickness / 2 + Geometry::sEpsilon);
330 layerl[0] = new TGeoSubtraction(layer, line[0], nullptr, t[0]);
331 layern[0] = new TGeoCompositeShape(Form("layer%d", 0), layerl[0]);
332
333 istart = 1;
334 istop = 6;
335 for (int iline = istart; iline < istop; iline++) {
336 t[iline] =
337 new TGeoTranslation(Form("t%d", iline), SegmentationAlpide::SensorSizeCols / 2 - Geometry::sConnectorOffset / 2,
338 -widthflex / 2 + 2 * (iline + 1) * Geometry::sLineWidth, 0.);
339 line[iline] = new TGeoBBox(Form("line%d", iline),
341 Geometry::sLineWidth / 2, thickness / 2 + Geometry::sEpsilon);
342 layerl[iline] = new TGeoSubtraction(layern[iline - 1], line[iline], nullptr, t[iline]);
343 layern[iline] = new TGeoCompositeShape(Form("layer%d", iline), layerl[iline]);
344 kTotalLinesNb++;
345 }
346
347 // --------- lines for the sensors, one line/sensor -------------
348 istart = kTotalLinesNb + 1;
349 istop = 6 + 3 * nbsensors;
350 for (int iline = istart; iline < istop; iline++) {
351 length_line = length - Geometry::sConnectorOffset -
352 TMath::Nint((iline - 6) / 3) * SegmentationAlpide::SensorSizeCols -
354 ts[iline - 6] = new TGeoTranslation(Form("t%d", iline), length / 2 - length_line / 2 - Geometry::sConnectorOffset,
355 -2 * (iline - 6) * Geometry::sLineWidth + 0.5 - widthflex / 2, 0.);
356 line[iline] = new TGeoBBox(Form("line%d", iline), length_line / 2, Geometry::sLineWidth / 2,
357 thickness / 2 + Geometry::sEpsilon);
358 layerl[iline] = new TGeoSubtraction(layern[iline - 1], line[iline], nullptr, ts[iline - 6]);
359 layern[iline] = new TGeoCompositeShape(Form("layer%d", iline), layerl[iline]);
360 kTotalLinesNb++;
361 }
362
363 // --------- an interspace to separate AVDD and DVDD -------------
364 kTotalLinesNb++;
365 tvdd = new TGeoTranslation("tvdd", 0., widthflex / 2 - Geometry::sShiftDDGNDline, 0.);
366 line[kTotalLinesNb] = new TGeoBBox(Form("line%d", kTotalLinesNb), length / 2, 2 * Geometry::sLineWidth / 2,
367 thickness / 2 + Geometry::sEpsilon);
368 layerl[kTotalLinesNb] = new TGeoSubtraction(layern[kTotalLinesNb - 1], line[kTotalLinesNb], nullptr, tvdd);
369 layern[kTotalLinesNb] = new TGeoCompositeShape(Form("layer%d", kTotalLinesNb), layerl[kTotalLinesNb]);
370 kTotalLinesNb++;
371
372 // --------- one line along the FPC analog side -------------
373 istart = kTotalLinesNb;
374 istop = kTotalLinesNb + 2;
375 for (int iline = istart; iline < istop; iline++) {
376 length_line = length - Geometry::sConnectorOffset;
377 tl[iline - istart] =
378 new TGeoTranslation(Form("tl%d", iline), length / 2 - length_line / 2 - Geometry::sConnectorOffset,
379 widthflex / 2 - Geometry::sShiftline - 2. * (iline - istart) * Geometry::sLineWidth, 0.);
380 line[iline] = new TGeoBBox(Form("line%d", iline), length_line / 2, Geometry::sLineWidth / 2,
381 thickness / 2 + Geometry::sEpsilon);
382 layerl[iline] = new TGeoSubtraction(layern[iline - 1], line[iline], nullptr, tl[iline - istart]);
383 layern[iline] = new TGeoCompositeShape(Form("layer%d", iline), layerl[iline]);
384 kTotalLinesNb++;
385 }
386
387 Geometry* mftGeom = Geometry::instance();
388 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
389 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
390 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
391
392 TGeoMedium* kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
393
394 auto* lineslayer =
395 new TGeoVolume(Form("lineslayer_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder), layern[kTotalLinesNb - 1], kMedAlu);
396 lineslayer->SetVisibility(true);
397 lineslayer->SetLineColor(kBlue);
398
399 return lineslayer;
400}
401
402//_____________________________________________________________________________
403TGeoVolume* Flex::makeAGNDandDGND(Double_t length, Double_t widthflex, Double_t thickness)
404{
405
406 // AGND and DGND layers
407 auto* layer = new TGeoBBox("layer", length / 2, widthflex / 2, thickness / 2);
408 auto* hole1 = new TGeoTube("hole1", 0., Geometry::sRadiusHole1, thickness / 2 + Geometry::sEpsilon);
409 auto* hole2 = new TGeoTube("hole2", 0., Geometry::sRadiusHole2, thickness / 2 + Geometry::sEpsilon);
410
411 auto* t1 = new TGeoTranslation("t1", length / 2 - Geometry::sHoleShift1, 0., 0.);
412 auto* layerholesub1 = new TGeoSubtraction(layer, hole1, nullptr, t1);
413 auto* layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
414
415 auto* t2 = new TGeoTranslation("t2", length / 2 - Geometry::sHoleShift2, 0., 0.);
416 auto* layerholesub2 = new TGeoSubtraction(layerhole1, hole2, nullptr, t2);
417 auto* layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
418
419 //--------------
420 TGeoBBox* line[3];
421 TGeoTranslation* t[3];
422 TGeoCompositeShape* layern[3];
423 TGeoSubtraction* layerl[3];
424 Double_t length_line;
425 length_line = length - Geometry::sConnectorOffset;
426
427 // First, the two lines along the FPC side
428 t[0] = new TGeoTranslation("t0", length / 2 - length_line / 2 - Geometry::sConnectorOffset,
429 widthflex / 2 - Geometry::sShiftline, 0.);
430 line[0] = new TGeoBBox("line0", length / 2 - Geometry::sConnectorOffset / 2, Geometry::sLineWidth / 2,
431 thickness / 2 + Geometry::sEpsilon);
432 layerl[0] = new TGeoSubtraction(layerhole2, line[0], nullptr, t[0]);
433 layern[0] = new TGeoCompositeShape(Form("layer%d", 0), layerl[0]);
434
435 t[1] = new TGeoTranslation("t1", length / 2 - length_line / 2 - Geometry::sConnectorOffset,
436 widthflex / 2 - Geometry::sShiftline - 2 * Geometry::sLineWidth, 0.);
437 line[1] = new TGeoBBox("line1", length / 2 - Geometry::sConnectorOffset / 2, Geometry::sLineWidth / 2,
438 thickness / 2 + Geometry::sEpsilon);
439 layerl[1] = new TGeoSubtraction(layern[0], line[1], nullptr, t[1]);
440 layern[1] = new TGeoCompositeShape(Form("layer%d", 1), layerl[1]);
441
442 // Now the interspace to separate the AGND et DGND --> same interspace compare the AVDD et DVDD
443 t[2] = new TGeoTranslation("t2", length / 2 - length_line / 2, widthflex / 2 - Geometry::sShiftDDGNDline, 0.);
444 line[2] = new TGeoBBox("line2", length / 2 - Geometry::sConnectorOffset / 2, Geometry::sLineWidth,
445 thickness / 2 + Geometry::sEpsilon);
446 layerl[2] = new TGeoSubtraction(layern[1], line[2], nullptr, t[2]);
447 layern[2] = new TGeoCompositeShape(Form("layer%d", 2), layerl[2]);
448
449 //--------------
450
451 Geometry* mftGeom = Geometry::instance();
452 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
453 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
454 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
455
456 TGeoMedium* kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
457 auto* alulayer = new TGeoVolume(Form("alulayer_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder), layern[2], kMedAlu);
458 alulayer->SetVisibility(true);
459 alulayer->SetLineColor(kBlue);
460
461 return alulayer;
462}
463
464//_____________________________________________________________________________
465TGeoVolume* Flex::makeKapton(Double_t length, Double_t widthflex, Double_t thickness)
466{
467
468 auto* layer = new TGeoBBox("layer", length / 2, widthflex / 2, thickness / 2);
469 // Two holes for fixing and positionning of the FPC on the cold plate
470 auto* hole1 = new TGeoTube("hole1", 0., Geometry::sRadiusHole1, thickness / 2 + Geometry::sEpsilon);
471 auto* hole2 = new TGeoTube("hole2", 0., Geometry::sRadiusHole2, thickness / 2 + Geometry::sEpsilon);
472
473 auto* t1 = new TGeoTranslation("t1", length / 2 - Geometry::sHoleShift1, 0., 0.);
474 auto* layerholesub1 = new TGeoSubtraction(layer, hole1, nullptr, t1);
475 auto* layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
476
477 auto* t2 = new TGeoTranslation("t2", length / 2 - Geometry::sHoleShift2, 0., 0.);
478 auto* layerholesub2 = new TGeoSubtraction(layerhole1, hole2, nullptr, t2);
479 auto* layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
480
481 Geometry* mftGeom = Geometry::instance();
482 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
483 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
484 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
485
486 TGeoMedium* kMedKapton = gGeoManager->GetMedium("MFT_Kapton$");
487 auto* kaptonlayer =
488 new TGeoVolume(Form("kaptonlayer_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder), layerhole2, kMedKapton);
489 kaptonlayer->SetVisibility(true);
490 kaptonlayer->SetLineColor(kYellow);
491
492 return kaptonlayer;
493}
494
495//_____________________________________________________________________________
496TGeoVolume* Flex::makeVarnish(Double_t length, Double_t widthflex, Double_t thickness, Int_t iflag)
497{
498
499 auto* layer = new TGeoBBox("layer", length / 2, widthflex / 2, thickness / 2);
500 // Two holes for fixing and positionning of the FPC on the cold plate
501 auto* hole1 = new TGeoTube("hole1", 0., Geometry::sRadiusHole1, thickness / 2 + Geometry::sEpsilon);
502 auto* hole2 = new TGeoTube("hole2", 0., Geometry::sRadiusHole2, thickness / 2 + Geometry::sEpsilon);
503
504 auto* t1 = new TGeoTranslation("t1", length / 2 - Geometry::sHoleShift1, 0., 0.);
505 auto* layerholesub1 = new TGeoSubtraction(layer, hole1, nullptr, t1);
506 auto* layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
507
508 auto* t2 = new TGeoTranslation("t2", length / 2 - Geometry::sHoleShift2, 0., 0.);
509 auto* layerholesub2 = new TGeoSubtraction(layerhole1, hole2, nullptr, t2);
510 auto* layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
511
512 Geometry* mftGeom = Geometry::instance();
513 Int_t idHalfMFT = mftGeom->getHalfID(mLadderSeg->GetUniqueID());
514 Int_t idHalfDisk = mftGeom->getDiskID(mLadderSeg->GetUniqueID());
515 Int_t idLadder = mftGeom->getLadderID(mLadderSeg->GetUniqueID());
516
517 TGeoMedium* kMedVarnish = gGeoManager->GetMedium("MFT_Epoxy$"); // we assume that varnish = epoxy ...
518 TGeoMaterial* kMatVarnish = kMedVarnish->GetMaterial();
519 // kMatVarnish->Dump();
520 auto* varnishlayer =
521 new TGeoVolume(Form("varnishlayer_%d_%d_%d_%d", idHalfMFT, idHalfDisk, idLadder, iflag), layerhole2, kMedVarnish);
522 varnishlayer->SetVisibility(true);
523 varnishlayer->SetLineColor(kGreen - 1);
524
525 return varnishlayer;
526}
Chip (sensor) segmentation description.
ClassImp(o2::mft::Flex)
Flex (Printed Cabled Board) class for ALICE MFT upgrade.
Class handling both virtual segmentation and real volumes.
Description of the virtual segmentation of a ladder.
Class building the Ladder geometry.
Definition of the SegmentationAlpide class.
static constexpr float SensorSizeCols
void makeElectricComponents(TGeoVolumeAssembly *flex, Int_t nbsensors, Double_t length, Double_t zvarnish)
Definition Flex.cxx:109
TGeoVolumeAssembly * makeFlex(Int_t nbsensors, Double_t length)
Definition Flex.cxx:56
static const Double_t sCapacitorDy
Definition Geometry.h:69
static const Double_t sHoleShift1
Definition Geometry.h:65
static const Double_t sEpsilon
Definition Geometry.h:75
static const Double_t sVarnishThickness
Definition Geometry.h:58
static const Double_t sShiftDDGNDline
Definition Geometry.h:78
Int_t getDiskID(UInt_t uniqueID) const
Returns Half-Disk ID based on Unique ID provided.
Definition Geometry.h:106
static const Double_t sLineWidth
Definition Geometry.h:57
static const Double_t sConnectorLength
Definition Geometry.h:71
Int_t getLadderID(UInt_t uniqueID) const
Returns Ladder ID based on Unique ID provided.
Definition Geometry.h:112
static const Double_t sConnectorOffset
Definition Geometry.h:67
Int_t getHalfID(UInt_t uniqueID) const
Returns Half-MFT ID based on Unique ID provided.
Definition Geometry.h:103
static const Double_t sGlueThickness
Definition Geometry.h:76
static const Double_t sKaptonThickness
Definition Geometry.h:60
static Geometry * instance()
Singleton access.
Definition Geometry.cxx:98
static const Double_t sCapacitorDz
Definition Geometry.h:68
static const Double_t sConnectorWidth
Definition Geometry.h:72
static const Double_t sClearance
Definition Geometry.h:62
static const Double_t sConnectorHeight
Definition Geometry.h:73
static const Double_t sFlexHeight
Flex Height.
Definition Geometry.h:56
static const Double_t sConnectorThickness
Definition Geometry.h:74
static const Double_t sRadiusHole1
Definition Geometry.h:63
static const Double_t sShiftline
Definition Geometry.h:79
static const Double_t sRadiusHole2
Definition Geometry.h:64
static const Double_t sHoleShift2
Definition Geometry.h:66
static const Double_t sCapacitorDx
Definition Geometry.h:70
static const Double_t sAluThickness
Definition Geometry.h:59
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLuint id
Definition glcorearb.h:650
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition glcorearb.h:5034