AliRoot Core  da88d91 (da88d91)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliMFTFlex.cxx
Go to the documentation of this file.
1 
2 /**************************************************************************
3  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * *
5  * Author: The ALICE Off-line Project. *
6  * Contributors are mentioned in the code where appropriate. *
7  * *
8  * Permission to use, copy, modify and distribute this software and its *
9  * documentation strictly for non-commercial purposes is hereby granted *
10  * without fee, provided that the above copyright notice appears in all *
11  * copies and that both the copyright notice and this permission notice *
12  * appear in the supporting documentation. The authors make no claims *
13  * about the suitability of this software for any purpose. It is *
14  * provided "as is" without express or implied warranty. *
15  **************************************************************************/
16 
17 //-------------------------------------------------------------------------
18 // Flex class for ALICE MFT upgrade
19 // This version uses TGeo
20 // Authors:
21 // F. Manso
22 // march 2016: main implementaion of the class
23 //-------------------------------------------------------------------------
24 
25 #include "TGeoManager.h"
26 #include "TGeoVolume.h"
27 #include "TGeoTrd2.h"
28 #include "TGeoMatrix.h"
29 #include "TGeoBBox.h"
30 #include "TGeoTube.h"
31 #include "AliLog.h"
33 #include "AliMFTChipSegmentation.h"
34 #include "AliMFTFlex.h"
35 #include "AliMFTChip.h"
36 #include "AliMFTLadder.h"
37 #include "AliMFTGeometry.h"
38 #include "AliMFTPlane.h"
39 #include "TGeoCompositeShape.h"
40 #include "TGeoBoolNode.h"
41 
43 
45 TNamed(),
46 fLadderSeg(NULL)
47 {
48  // Constructor
49 }
50 
52 }
53 
55 TNamed(),
56 fLadderSeg(ladder)
57 {
58  // Constructor
59 }
60 
61 
62 TGeoVolumeAssembly* AliMFTFlex::MakeFlex(Int_t nbsensors, Double_t length)
63 {
64  // Informations from the technical report mft_flex_proto_5chip_v08_laz50p.docx on MFT twiki and private communications
65 
66  // For the naming
68  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
69  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
70  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
71 
72  // First a global pointer for the flex
73  TGeoMedium *kMedAir = gGeoManager->GetMedium("MFT_Air$");
74  TGeoVolumeAssembly* flex = new TGeoVolumeAssembly(Form("flex_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder));
75 
76  // Defining one single layer for the strips and the AVDD and DVDD
78 
79  // AGND and DGND layers
81 
82  // The others layers
84  TGeoVolume* varnishlayerIn = Make_Varnish(length, AliMFTGeometry::kFlexHeight, AliMFTGeometry::kVarnishThickness,0);
85  TGeoVolume* varnishlayerOut = Make_Varnish(length, AliMFTGeometry::kFlexHeight, AliMFTGeometry::kVarnishThickness,1);
86 
87  // Final flex building
90  Double_t zkaptonlayer = -AliMFTGeometry::kGlueThickness;
93 
94  //-----------------------------------------------------------------------------------------
95  //-------------------------- Adding all layers of the FPC ----------------------------------
96  //-----------------------------------------------------------------------------------------
97 
98  flex->AddNode(varnishlayerIn, 1, new TGeoTranslation(0., 0., zvarnishIn)); // inside, in front of the cold plate
99  flex->AddNode(agnd_dgnd, 1, new TGeoTranslation(0., 0., zgnd));
100  flex->AddNode(kaptonlayer, 1, new TGeoTranslation(0., 0., zkaptonlayer));
101  flex->AddNode(lines, 1, new TGeoTranslation(0., 0., zlines));
102  flex->AddNode(varnishlayerOut, 1, new TGeoTranslation(0., 0., zvarnishOut)); // outside
103 
104  Make_ElectricComponents(flex, nbsensors, length, zvarnishOut);
105  //-----------------------------------------------------------------------------------------
106  //-----------------------------------------------------------------------------------------
107  //-----------------------------------------------------------------------------------------
108 
109  return flex;
110 }
111 
112 
113 void AliMFTFlex::Make_ElectricComponents(TGeoVolumeAssembly* flex, Int_t nbsensors, Double_t length, Double_t zvarnish)
114 {
115  // Making and adding all the electric components
116  TGeoVolumeAssembly *electric[200];
117 
118  // 2 components on the connector side
119  Int_t total;
120 
121  TGeoRotation *rotation = new TGeoRotation ("rotation", 90., 0., 0.);
122  TGeoRotation *rotationpi = new TGeoRotation ("rotationpi", 180., 0., 0.);
123  TGeoCombiTrans *transformation0 = new TGeoCombiTrans(length/2 - 0.1, AliMFTGeometry::kFlexHeight/2-0.2,
125  TGeoCombiTrans *transformation1 = new TGeoCombiTrans(length/2 - 0.1, AliMFTGeometry::kFlexHeight/2-0.6,
127 
129  flex->AddNode(electric[0], 1, transformation0);
130  flex->AddNode(electric[1], 2, transformation1);
131  total=2;
132 
133  // 2 lines of electric components along the FPC in the middle (4 per sensor)
134  for(Int_t id=0; id < 4*nbsensors; id++)electric[id+total] = Make_ElectricComponent(AliMFTGeometry::kCapacitorDy, AliMFTGeometry::kCapacitorDx,
135  AliMFTGeometry::kCapacitorDz, id+total);
136  for(Int_t id=0; id < 2*nbsensors; id++){
137  flex->AddNode(electric[id+total], id+1000, new TGeoTranslation(-length/2 + (id+0.5)*AliMFTGeometry::kSensorLength/2, AliMFTGeometry::kFlexHeight/2 - 0.35,
139  flex->AddNode(electric[id+total+2*nbsensors], id+2000, new TGeoTranslation(-length/2 + (id+0.5)*AliMFTGeometry::kSensorLength/2, 0.,
141  }
142  total=total+4*nbsensors;
143 
144  // ------- 3 components on the FPC side --------
145  for(Int_t id=0; id < 3; id++)electric[id+total] = Make_ElectricComponent(AliMFTGeometry::kCapacitorDy, AliMFTGeometry::kCapacitorDx,
146  AliMFTGeometry::kCapacitorDz, id+total);
147  for(Int_t id=0 ; id < 3; id++){
148  flex->AddNode(electric[id+total], id+3000, new TGeoTranslation(-length/2+AliMFTGeometry::kSensorLength+(id+1)*0.3-0.6, -AliMFTGeometry::kFlexHeight/2 + 0.2,
150  }
151  total=total+3;
152 
153 
154  /*
155  // The connector of the FPC
156  for(Int_t id=0; id < 74; id++)electric[id+total] = Make_ElectricComponent(AliMFTGeometry::kConnectorLength, AliMFTGeometry::kConnectorWidth,
157  AliMFTGeometry::kConnectorThickness, id+total);
158  for(Int_t id=0; id < 37; id++){
159  flex->AddNode(electric[id+total], id+100, new TGeoTranslation(length/2+0.15-AliMFTGeometry::kConnectorOffset, id*0.04-AliMFTGeometry::kFlexHeight/2 + 0.1,
160  zvarnish-AliMFTGeometry::kVarnishThickness/2-AliMFTGeometry::kCapacitorDz/2));
161  flex->AddNode(electric[id+total+37], id+200, new TGeoTranslation(length/2-0.15-AliMFTGeometry::kConnectorOffset, id*0.04-AliMFTGeometry::kFlexHeight/2 + 0.1,
162  zvarnish - AliMFTGeometry::kVarnishThickness/2 - AliMFTGeometry::kCapacitorDz/2));
163  }
164  total=total+74;
165  */
166 
167 
168 
169  //-------------------------- New Connector ----------------------
170  TGeoMedium *kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
171  TGeoMedium *kMedPeek = gGeoManager->GetMedium("MFT_PEEK$");
172 
176 
177  TGeoTranslation *t1= new TGeoTranslation ("t1", AliMFTGeometry::kConnectorThickness, 0., -0.01);
178  TGeoSubtraction *connecto = new TGeoSubtraction(connect, remov, NULL, t1);
179  TGeoCompositeShape *connector = new TGeoCompositeShape("connector", connecto);
180  TGeoVolume *connectord = new TGeoVolume("connectord", connector, kMedAlu);
181  connectord->SetVisibility(kTRUE);
182  connectord->SetLineColor(kRed);
183  connectord->SetLineWidth(1);
184  connectord->SetFillColor(connectord->GetLineColor());
185  connectord->SetFillStyle(4000); // 0% transparent
186 
187  Double_t interspace = 0.1; // interspace inside the 2 ranges of connector pads
188  Double_t step = 0.04; // interspace between each pad inside the connector
189  for(Int_t id=0; id < 37; id++){
190  flex->AddNode(connectord,id+total,new TGeoTranslation(length/2+interspace/2+AliMFTGeometry::kConnectorLength/2-AliMFTGeometry::kConnectorOffset,
193  TGeoCombiTrans *transformationpi = new TGeoCombiTrans(length/2-interspace/2-AliMFTGeometry::kConnectorLength/2-AliMFTGeometry::kConnectorOffset,
194  id*step-AliMFTGeometry::kFlexHeight/2 + 0.1, zvarnish - AliMFTGeometry::kVarnishThickness/2 -
196  flex->AddNode(connectord,id+total+37, transformationpi);
197  }
198 
199 
200  Double_t boxthickness = 0.05;
201  TGeoBBox *boxconnect = new TGeoBBox("boxconnect", (2*AliMFTGeometry::kConnectorThickness+interspace+boxthickness)/2, AliMFTGeometry::kFlexHeight/2-0.04,
203  TGeoBBox *boxremov = new TGeoBBox("boxremov", (2*AliMFTGeometry::kConnectorThickness+interspace)/2, (AliMFTGeometry::kFlexHeight-0.1-step)/2,
205  TGeoSubtraction *boxconnecto = new TGeoSubtraction(boxconnect, boxremov, NULL, NULL);
206  TGeoCompositeShape *boxconnector = new TGeoCompositeShape("boxconnector", boxconnecto);
207  TGeoVolume *boxconnectord = new TGeoVolume("boxconnectord", boxconnector, kMedPeek);
208  flex->AddNode(boxconnectord,1,new TGeoTranslation(length/2-AliMFTGeometry::kConnectorOffset, -step/2, zvarnish-AliMFTGeometry::kVarnishThickness/2
210 
211 
212  //---------------------------------------------------------------
213 
214 }
215 
216 
217 TGeoVolumeAssembly* AliMFTFlex::Make_ElectricComponent(Double_t dx, Double_t dy, Double_t dz, Int_t id)
218 {
219 
221  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
222  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
223  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
224  //------------------------------------------------------
225  TGeoMedium *kmedX7R = gGeoManager->GetMedium("MFT_X7Rcapacitors$");
226  TGeoMedium *kmedX7Rw = gGeoManager->GetMedium("MFT_X7Rweld$");
227 
228  TGeoVolumeAssembly* X7R0402 = new TGeoVolumeAssembly(Form("X7R_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id));
229 
230  TGeoBBox *capacit = new TGeoBBox("capacitor", dx/2, dy/2, dz/2);
231  TGeoBBox *weld = new TGeoBBox("weld", (dx/4)/2, dy/2, (dz/2)/2);
232  TGeoVolume* capacitor = new TGeoVolume(Form("capacitor_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id), capacit, kmedX7R);
233  TGeoVolume* welding0 = new TGeoVolume(Form("welding0_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id), weld, kmedX7Rw);
234  TGeoVolume* welding1 = new TGeoVolume(Form("welding1_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id), weld, kmedX7Rw);
235  capacitor->SetVisibility(kTRUE);
236  capacitor->SetLineColor(kRed);
237  capacitor->SetLineWidth(1);
238  capacitor->SetFillColor(capacitor->GetLineColor());
239  capacitor->SetFillStyle(4000); // 0% transparent
240 
241  welding0->SetVisibility(kTRUE);
242  welding0->SetLineColor(kGray);
243  welding0->SetLineWidth(1);
244  welding0->SetFillColor(welding0->GetLineColor());
245  welding0->SetFillStyle(4000); // 0% transparent
246 
247  welding1->SetVisibility(kTRUE);
248  welding1->SetLineColor(kGray);
249  welding1->SetLineWidth(1);
250  welding1->SetFillColor(welding1->GetLineColor());
251  welding1->SetFillStyle(4000); // 0% transparent
252 
253 
254  X7R0402->AddNode(capacitor, 1, new TGeoTranslation(0., 0., 0.));
255  X7R0402->AddNode(welding0, 1, new TGeoTranslation( dx/2+(dx/4)/2, 0., (dz/2)/2));
256  X7R0402->AddNode(welding1, 1, new TGeoTranslation(-dx/2-(dx/4)/2, 0., (dz/2)/2));
257 
258  X7R0402->SetVisibility(kTRUE);
259 
260  return X7R0402;
261 
262 
263  //------------------------------------------------------
264 
265  /*
266  // the medium has to be changed, see ITS capacitors...
267  TGeoMedium *kMedCopper = gGeoManager->GetMedium("MFT_Cu$");
268 
269  AliMFTGeometry * mftGeom = AliMFTGeometry::Instance();
270  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
271  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
272  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
273 
274  TGeoVolume* electriccomponent = new TGeoVolume(Form("electric_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,id), new TGeoBBox("BOX", dy/2, dx/2, dz/2), kMedCopper);
275  electriccomponent->SetVisibility(1);
276  electriccomponent->SetLineColor(kRed);
277  return electriccomponent;
278  */
279 }
280 
281 
282 TGeoVolume* AliMFTFlex::Make_Lines(Int_t nbsensors, Double_t length, Double_t widthflex, Double_t thickness)
283 {
284  // One line is built by removing 3 lines of aluminium in the TGeoBBox *layer_def layer. Then one line is made by the 2 remaining aluminium strips.
285 
286  // the initial layer of aluminium
287  TGeoBBox *layer_def = new TGeoBBox("layer_def", length/2, widthflex/2, thickness/2);
288 
289  // Two holes for fixing and positionning of the FPC on the cold plate
290  TGeoTube *hole1 = new TGeoTube("hole1", 0., AliMFTGeometry::kRadiusHole1, thickness/2 + AliMFTGeometry::kEpsilon);
291  TGeoTube *hole2 = new TGeoTube("hole2", 0., AliMFTGeometry::kRadiusHole2, thickness/2 + AliMFTGeometry::kEpsilon);
292 
293  TGeoTranslation *t1= new TGeoTranslation ("t1", length/2 - AliMFTGeometry::kHoleShift1, 0., 0.);
294  TGeoSubtraction *layerholesub1 = new TGeoSubtraction(layer_def, hole1, NULL, t1);
295  TGeoCompositeShape *layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
296 
297  TGeoTranslation *t2= new TGeoTranslation ("t2", length/2 - AliMFTGeometry::kHoleShift2, 0., 0.);
298  TGeoSubtraction *layerholesub2 = new TGeoSubtraction(layerhole1, hole2, NULL, t2);
299  TGeoCompositeShape *layer = new TGeoCompositeShape("layerhole2", layerholesub2);
300 
301  TGeoBBox *line[25];
302  TGeoTranslation *t[6],*ts[15],*tvdd, *tl[2];
303  TGeoSubtraction *layerl[25];
304  TGeoCompositeShape *layern[25];
305  Int_t istart, istop;
306  Int_t kTotalLinesNb=0;
307  Int_t kTotalLinesNb1, kTotalLinesNb2;
308  Double_t length_line;
309 
310 
311  // ----------- two lines along the FPC digital side --------------
312  t[0] = new TGeoTranslation ("t0", AliMFTGeometry::kSensorLength/2-AliMFTGeometry::kConnectorOffset/2, -widthflex/2 + 2*AliMFTGeometry::kLineWidth, 0.);
313  line[0] = new TGeoBBox("line0", length/2 - AliMFTGeometry::kConnectorOffset/2 - AliMFTGeometry::kSensorLength/2, AliMFTGeometry::kLineWidth/2,
314  thickness/2 + AliMFTGeometry::kEpsilon);
315  layerl[0] = new TGeoSubtraction(layer, line[0], NULL, t[0]);
316  layern[0] = new TGeoCompositeShape(Form("layer%d",0), layerl[0]);
317 
318  istart = 1; istop = 6;
319  for (int iline = istart; iline < istop; iline++){
320  t[iline] = new TGeoTranslation (Form("t%d",iline), AliMFTGeometry::kSensorLength/2 - AliMFTGeometry::kConnectorOffset/2,
321  -widthflex/2 + 2*(iline+1)*AliMFTGeometry::kLineWidth, 0.);
322  line[iline] = new TGeoBBox(Form("line%d",iline), length/2 - AliMFTGeometry::kConnectorOffset/2 - AliMFTGeometry::kSensorLength/2, AliMFTGeometry::kLineWidth/2,
323  thickness/2 + AliMFTGeometry::kEpsilon);
324  layerl[iline] = new TGeoSubtraction(layern[iline-1], line[iline], NULL, t[iline]);
325  layern[iline] = new TGeoCompositeShape(Form("layer%d",iline), layerl[iline]);
326  kTotalLinesNb++;
327  }
328 
329  // --------- lines for the sensors, one line/sensor -------------
330  istart = kTotalLinesNb+1; istop = 6+3*nbsensors;
331  for (int iline = istart; iline < istop; iline++){
332  length_line=length - AliMFTGeometry::kConnectorOffset - TMath::Nint((iline-6)/3)*AliMFTGeometry::kSensorLength - AliMFTGeometry::kSensorLength/2;
333  ts[iline] = new TGeoTranslation (Form("t%d",iline), length/2-length_line/2-AliMFTGeometry::kConnectorOffset, -2*(iline-6)*AliMFTGeometry::kLineWidth+0.5-widthflex/2, 0.);
334  line[iline] = new TGeoBBox(Form("line%d",iline), length_line/2, AliMFTGeometry::kLineWidth/2, thickness/2 + AliMFTGeometry::kEpsilon);
335  layerl[iline] = new TGeoSubtraction(layern[iline-1], line[iline], NULL, ts[iline]);
336  layern[iline] = new TGeoCompositeShape(Form("layer%d",iline), layerl[iline]);
337  kTotalLinesNb++;
338  }
339 
340  // --------- an interspace to separate AVDD and DVDD -------------
341  kTotalLinesNb++;
342  tvdd = new TGeoTranslation ("tvdd", 0., widthflex/2-AliMFTGeometry::kShiftDDGNDline, 0.);
343  line[kTotalLinesNb] = new TGeoBBox(Form("line%d",kTotalLinesNb), length/2, 2*AliMFTGeometry::kLineWidth/2, thickness/2 + AliMFTGeometry::kEpsilon);
344  layerl[kTotalLinesNb] = new TGeoSubtraction(layern[kTotalLinesNb-1], line[kTotalLinesNb], NULL, tvdd);
345  layern[kTotalLinesNb] = new TGeoCompositeShape(Form("layer%d",kTotalLinesNb), layerl[kTotalLinesNb]);
346  kTotalLinesNb++;
347 
348  // --------- one line along the FPC analog side -------------
349  istart = kTotalLinesNb; istop = kTotalLinesNb + 2;
350  for (int iline = istart; iline < istop; iline++){
351  length_line=length - AliMFTGeometry::kConnectorOffset;
352  tl[iline-istart] = new TGeoTranslation (Form("tl%d",iline), length/2-length_line/2-AliMFTGeometry::kConnectorOffset,
353  widthflex/2-AliMFTGeometry::kShiftline-2.*(iline-istart)*AliMFTGeometry::kLineWidth, 0.);
354  line[iline] = new TGeoBBox(Form("line%d",iline), length_line/2, AliMFTGeometry::kLineWidth/2, thickness/2 + AliMFTGeometry::kEpsilon);
355  layerl[iline] = new TGeoSubtraction(layern[iline-1], line[iline], NULL, tl[iline-istart]);
356  layern[iline] = new TGeoCompositeShape(Form("layer%d",iline), layerl[iline]);
357  kTotalLinesNb++;
358  }
359 
361  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
362  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
363  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
364 
365  TGeoMedium *kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
366 
367  TGeoVolume *lineslayer = new TGeoVolume(Form("lineslayer_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder), layern[kTotalLinesNb-1], kMedAlu);
368  lineslayer->SetVisibility(1);
369  lineslayer->SetLineColor(kBlue);
370  return lineslayer;
371 }
372 
373 
374 TGeoVolume* AliMFTFlex::Make_AGND_DGND(Double_t length, Double_t widthflex, Double_t thickness)
375 {
376  // AGND and DGND layers
377  TGeoBBox *layer = new TGeoBBox("layer", length/2, widthflex/2, thickness/2);
378  TGeoTube *hole1 = new TGeoTube("hole1", 0., AliMFTGeometry::kRadiusHole1, thickness/2 + AliMFTGeometry::kEpsilon);
379  TGeoTube *hole2 = new TGeoTube("hole2", 0., AliMFTGeometry::kRadiusHole2, thickness/2 + AliMFTGeometry::kEpsilon);
380 
381  TGeoTranslation *t1= new TGeoTranslation ("t1", length/2-AliMFTGeometry::kHoleShift1, 0., 0.);
382  TGeoSubtraction *layerholesub1 = new TGeoSubtraction(layer, hole1, NULL, t1);
383  TGeoCompositeShape *layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
384 
385  TGeoTranslation *t2= new TGeoTranslation ("t2", length/2-AliMFTGeometry::kHoleShift2, 0., 0.);
386  TGeoSubtraction *layerholesub2 = new TGeoSubtraction(layerhole1, hole2, NULL, t2);
387  TGeoCompositeShape *layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
388 
389  //--------------
390  TGeoBBox *line[3];
391  TGeoTranslation *t[3];
392  TGeoCompositeShape *layern[3];
393  TGeoSubtraction *layerl[3];
394  Double_t length_line;
395  length_line=length - AliMFTGeometry::kConnectorOffset;
396 
397  // First, the two lines along the FPC side
398  t[0] = new TGeoTranslation("t0", length/2-length_line/2-AliMFTGeometry::kConnectorOffset, widthflex/2 - AliMFTGeometry::kShiftline, 0.);
399  line[0] = new TGeoBBox("line0", length/2 - AliMFTGeometry::kConnectorOffset/2, AliMFTGeometry::kLineWidth/2, thickness/2 + AliMFTGeometry::kEpsilon);
400  layerl[0] = new TGeoSubtraction(layerhole2, line[0], NULL, t[0]);
401  layern[0] = new TGeoCompositeShape(Form("layer%d",0), layerl[0]);
402 
403  t[1] = new TGeoTranslation("t1", length/2-length_line/2-AliMFTGeometry::kConnectorOffset,
405  line[1] = new TGeoBBox("line1", length/2 - AliMFTGeometry::kConnectorOffset/2, AliMFTGeometry::kLineWidth/2,
406  thickness/2 + AliMFTGeometry::kEpsilon);
407  layerl[1] = new TGeoSubtraction(layern[0], line[1], NULL, t[1]);
408  layern[1] = new TGeoCompositeShape(Form("layer%d",1), layerl[1]);
409 
410  // Now the interspace to separate the AGND et DGND --> same interspace compare the AVDD et DVDD
411  t[2] = new TGeoTranslation("t2", length/2-length_line/2, widthflex/2 - AliMFTGeometry::kShiftDDGNDline, 0.);
412  line[2] = new TGeoBBox("line2", length/2 - AliMFTGeometry::kConnectorOffset/2, AliMFTGeometry::kLineWidth,
413  thickness/2 + AliMFTGeometry::kEpsilon);
414  layerl[2] = new TGeoSubtraction(layern[1], line[2], NULL, t[2]);
415  layern[2] = new TGeoCompositeShape(Form("layer%d",2), layerl[2]);
416 
417  //--------------
418 
420  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
421  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
422  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
423 
424  TGeoMedium *kMedAlu = gGeoManager->GetMedium("MFT_Alu$");
425  TGeoVolume *alulayer = new TGeoVolume(Form("alulayer_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder), layern[2], kMedAlu);
426  alulayer->SetVisibility(1);
427  alulayer->SetLineColor(kBlue);
428  return alulayer;
429 }
430 
431 
432 TGeoVolume* AliMFTFlex::Make_Kapton(Double_t length, Double_t widthflex, Double_t thickness)
433 {
434  TGeoBBox *layer = new TGeoBBox("layer", length/2, widthflex/2, thickness/2);
435  // Two holes for fixing and positionning of the FPC on the cold plate
436  TGeoTube *hole1 = new TGeoTube("hole1", 0., AliMFTGeometry::kRadiusHole1, thickness/2+AliMFTGeometry::kEpsilon);
437  TGeoTube *hole2 = new TGeoTube("hole2", 0., AliMFTGeometry::kRadiusHole2, thickness/2+AliMFTGeometry::kEpsilon);
438 
439  TGeoTranslation *t1= new TGeoTranslation ("t1", length/2-AliMFTGeometry::kHoleShift1, 0., 0.);
440  TGeoSubtraction *layerholesub1 = new TGeoSubtraction(layer, hole1, NULL, t1);
441  TGeoCompositeShape *layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
442 
443  TGeoTranslation *t2= new TGeoTranslation ("t2", length/2-AliMFTGeometry::kHoleShift2, 0., 0.);
444  TGeoSubtraction *layerholesub2 = new TGeoSubtraction(layerhole1, hole2, NULL, t2);
445  TGeoCompositeShape *layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
446 
448  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
449  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
450  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
451 
452  TGeoMedium *kMedKapton = gGeoManager->GetMedium("MFT_Kapton$");
453  TGeoVolume *kaptonlayer = new TGeoVolume(Form("kaptonlayer_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder), layerhole2, kMedKapton);
454  kaptonlayer->SetVisibility(1);
455  kaptonlayer->SetLineColor(kYellow);
456  return kaptonlayer;
457 }
458 
459 
460 TGeoVolume* AliMFTFlex::Make_Varnish(Double_t length, Double_t widthflex, Double_t thickness, Int_t iflag)
461 {
462  TGeoBBox *layer = new TGeoBBox("layer", length/2, widthflex/2, thickness/2);
463  // Two holes for fixing and positionning of the FPC on the cold plate
464  TGeoTube *hole1 = new TGeoTube("hole1", 0., AliMFTGeometry::kRadiusHole1, thickness/2+AliMFTGeometry::kEpsilon);
465  TGeoTube *hole2 = new TGeoTube("hole2", 0., AliMFTGeometry::kRadiusHole2, thickness/2+AliMFTGeometry::kEpsilon);
466 
467  TGeoTranslation *t1= new TGeoTranslation ("t1", length/2-AliMFTGeometry::kHoleShift1, 0., 0.);
468  TGeoSubtraction *layerholesub1 = new TGeoSubtraction(layer, hole1, NULL, t1);
469  TGeoCompositeShape *layerhole1 = new TGeoCompositeShape("layerhole1", layerholesub1);
470 
471  TGeoTranslation *t2= new TGeoTranslation ("t2", length/2-AliMFTGeometry::kHoleShift2, 0., 0.);
472  TGeoSubtraction *layerholesub2 = new TGeoSubtraction(layerhole1, hole2, NULL, t2);
473  TGeoCompositeShape *layerhole2 = new TGeoCompositeShape("layerhole2", layerholesub2);
474 
476  Int_t idHalfMFT = mftGeom->GetHalfMFTID(fLadderSeg->GetUniqueID());
477  Int_t idHalfDisk = mftGeom->GetHalfDiskID(fLadderSeg->GetUniqueID());
478  Int_t idLadder = mftGeom->GetLadderID(fLadderSeg->GetUniqueID());
479 
480  TGeoMedium *kMedVarnish = gGeoManager->GetMedium("MFT_Epoxy$"); // we assume that varnish = epoxy ...
481  TGeoVolume *varnishlayer = new TGeoVolume(Form("varnishlayer_%d_%d_%d_%d",idHalfMFT,idHalfDisk,idLadder,iflag), layerhole2, kMedVarnish);
482  varnishlayer->SetVisibility(1);
483  varnishlayer->SetLineColor(kGreen-1);
484  return varnishlayer;
485 }
486 
TGeoVolume * Make_Kapton(Double_t length, Double_t width, Double_t thickness)
Definition: AliMFTFlex.cxx:432
static const Double_t kHoleShift1
static const Double_t kConnectorOffset
Int_t GetLadderID(UInt_t uniqueID) const
Returns Ladder ID based on Unique ID provided.
static const Double_t kRadiusHole2
static const Double_t kKaptonThickness
static const Double_t kShiftDDGNDline
static const Double_t kSensorLength
CMOS Sensor Length.
static const Double_t kAluThickness
static const Double_t kEpsilon
static const Double_t kRadiusHole1
static const Double_t kLineWidth
ClassImp(AliMFTFlex) AliMFTFlex
Definition: AliMFTFlex.cxx:42
TGeoVolumeAssembly * MakeFlex(Int_t nbsensors, Double_t length)
Definition: AliMFTFlex.cxx:62
Double_t t
Definition: AliFMDv1.cxx:90
TGeoVolume * Make_Lines(Int_t nbsensors, Double_t length, Double_t width, Double_t thickness)
Definition: AliMFTFlex.cxx:282
static AliMFTGeometry * Instance()
Retuns MFT Geometry singleton object.
TGeoVolume * Make_AGND_DGND(Double_t length, Double_t width, Double_t thickness)
Definition: AliMFTFlex.cxx:374
static const Double_t kConnectorThickness
TGeoVolume * Make_Varnish(Double_t length, Double_t width, Double_t thickness, Int_t iflag)
Definition: AliMFTFlex.cxx:460
static const Double_t kCapacitorDx
static const Double_t kConnectorLength
Description of the virtual segmentation of a ladder.
static const Double_t kCapacitorDz
AliMFTLadderSegmentation * fLadderSeg
Definition: AliMFTFlex.h:36
static const Double_t kCapacitorDy
static const Double_t kConnectorHeight
static const Double_t kGlueThickness
void Make_ElectricComponents(TGeoVolumeAssembly *flex, Int_t nbsensors, Double_t length, Double_t zvarnish)
Definition: AliMFTFlex.cxx:113
Int_t GetHalfMFTID(UInt_t uniqueID) const
Returns Half-MFT ID based on Unique ID provided.
virtual ~AliMFTFlex()
Definition: AliMFTFlex.cxx:51
Int_t GetHalfDiskID(UInt_t uniqueID) const
Returns Half-Disk ID based on Unique ID provided.
static const Double_t kFlexHeight
Flex Height.
static const Double_t kShiftline
TGeoVolumeAssembly * Make_ElectricComponent(Double_t dx, Double_t dy, Double_t dz, Int_t iflag)
Definition: AliMFTFlex.cxx:217
static const Double_t kConnectorWidth
static const Double_t kClearance
static const Double_t kHoleShift2
Class Handling both Virutal Segmentation and Real Volumes.
static const Double_t kVarnishThickness
return kTRUE
Definition: AliFMDv1.cxx:97