Merge branch 'master_patch'
[u/mrichter/AliRoot.git] / PHOS / AliPHOSEMCAGeometry.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //_________________________________________________________________________
19 // Geometry class  for PHOS : EMCA (Electromagnetic Calorimeter)  
20 // Its data members provide geometry parametrization of EMCA
21 // which can be changed in the constructor only.
22 // Author   : Yves Schutz (SUBATECH)
23 // Modified : Yuri Kharlov (IHEP, Protvino)
24 // 13 September 2000
25 // Modified : Dmitri Peressounko (RRC "Kurchatov Institute")
26 // 6 August 2001
27
28 // --- AliRoot header files ---
29
30 #include "AliPHOSEMCAGeometry.h"
31
32 ClassImp(AliPHOSEMCAGeometry)
33
34 //____________________________________________________________________________
35 AliPHOSEMCAGeometry::AliPHOSEMCAGeometry():
36                      fAirGapLed(0.f),
37                      fStripWallWidthOut(0.f),
38                      fStripWallWidthIn(0.f),
39                      fTyvecThickness(0.f),
40                      fInnerThermoWidthX(0.f),
41                      fInnerThermoWidthY(0.f),
42                      fInnerThermoWidthZ(0.f),
43                      fAirGapWidthX(0.f),
44                      fAirGapWidthY(0.f),
45                      fAirGapWidthZ(0.f),
46                      fCoolerWidthX(0.f),
47                      fCoolerWidthY(0.f),
48                      fCoolerWidthZ(0.f),
49                      fAlCoverThickness(0.f),
50                      fOuterThermoWidthXUp(0.f),
51                      fOuterThermoWidthXLow(0.f),
52                      fOuterThermoWidthY(0.f),
53                      fOuterThermoWidthZ(0.f),
54                      fAlFrontCoverX(0.f),
55                      fAlFrontCoverZ(0.f),
56                      fFiberGlassSup2X(0.f),
57                      fFiberGlassSup1X(0.f),
58                      fFrameHeight(0.f),
59                      fFrameThickness(0.f),
60                      fAirSpaceFeeX(0.f),
61                      fAirSpaceFeeZ(0.f),
62                      fAirSpaceFeeY(0.f),
63                      fWarmUpperThickness(0.f),
64                      fWarmBottomThickness(0.f),
65                      fWarmAlCoverWidthX(0.f),
66                      fWarmAlCoverWidthY(0.f),
67                      fWarmAlCoverWidthZ(0.f),
68                      fFiberGlassSup1Y(0.f),
69                      fFiberGlassSup2Y(0.f),
70                      fTSupportDist(0.f),
71                      fTSupport1Thickness(0.f),
72                      fTSupport2Thickness(0.f),
73                      fTSupport1Width(0.f),
74                      fTSupport2Width(0.f),
75                      fIPtoOuterCoverDistance(0.f),
76                      fIPtoCrystalSurface(0.f),
77                      fSupportPlateThickness(0.f),
78                      fNCellsXInStrip(0),
79                      fNCellsZInStrip(0),
80                      fNStripX(0),
81                      fNStripZ(0),
82                      fNTSupports(0),
83                      fNPhi(0),
84                      fNZ(0)
85 {
86
87
88   // Initializes the EMC parameters
89   // Coordinate system chosen: x across beam, z along beam, y out of beam.
90   // Reference point for all volumes incide module is 
91   // center of module in x,z on the upper surface of support beam
92
93   //Distance from IP to surface of the crystals
94   fIPtoCrystalSurface     = 460.0 ;    
95
96
97   //CRYSTAL
98
99   fCrystalHalfSize[0] =  2.2 /2 ;  //Half-Sizes of crystall
100   fCrystalHalfSize[1] = 18.0 /2 ;
101   fCrystalHalfSize[2] =  2.2 /2 ;
102
103   //APD + preamplifier
104
105   //fPinDiodeSize[0] = 1.71 ;   //Values of ame PIN diode  
106   //fPinDiodeSize[1] = 0.0280 ; // OHO 0.0280 is the depth of active layer
107   //fPinDiodeSize[2] = 1.61 ;    
108  
109   fPinDiodeHalfSize[0] = 0.5000 /2 ;    // APD 5 mm side
110   fPinDiodeHalfSize[1] = 0.0100 /2 ;    // APD bulk thickness
111   fPinDiodeHalfSize[2] = 0.5000 /2 ;    // APD 5 mm side 
112
113   fPreampHalfSize[0] = 1.5 / 2 ;       // Preamplifier
114   fPreampHalfSize[1] = 0.5 / 2 ;
115   fPreampHalfSize[2] = 1.5 / 2 ;
116
117   //Strip unit (8x2 crystals)
118
119   fNCellsXInStrip =  8 ;       //Number of crystals in strip unit along x-axis
120   fNCellsZInStrip =  2 ;       //Number of crystals in strip unit along z-axis
121   fNStripX        =  8 ;       //Number of strip units across along x-axis
122   fNStripZ        = 28 ;       //Number of strips along z-axis
123
124   fStripWallWidthOut = 0.01 ;  // Side to another strip  
125   fStripWallWidthIn  = 0.02 ;  // Side betveen crystals in one strip
126
127   fTyvecThickness = 0.0175 ;     //Thickness of the tyvec
128
129   fAirGapLed = 1.5 - 2 * fPreampHalfSize[1] - 2 * fPinDiodeHalfSize[1] ; // Air gap before crystalls for LED system
130                                            // Note, that Cell in Strip 1.5 longer then crystall
131
132   //---Now calculate thechnical sizes for GEANT implementation
133
134   fWrappedHalfSize[0] = (2*fTyvecThickness + 2*fCrystalHalfSize[0])/2 ;   //This will be size of crystall
135   fWrappedHalfSize[1] = fCrystalHalfSize[1] ;                             //wrapped into tyvec
136   fWrappedHalfSize[2] = (2*fTyvecThickness + 2*fCrystalHalfSize[2])/2 ;   //
137
138   fAirCellHalfSize[0] = fWrappedHalfSize[0] + 0.01;
139   fAirCellHalfSize[1] = (fAirGapLed + 2*fPreampHalfSize[1] + 
140                        2*fPinDiodeHalfSize[1] + 2*fWrappedHalfSize[1])/2 ;  //in strip
141   fAirCellHalfSize[2] = fWrappedHalfSize[2] + 0.01;
142
143   //  fSupportPlateHalfSize[0] = ( (fNCellsXInStrip-1)*fStripWallWidthIn + 2*fStripWallWidthOut + 
144   //                           fNCellsXInStrip * (2*fTyvecThickness + 2*fCrystalHalfSize[0]) )/2 ;
145   fSupportPlateHalfSize[0] = 18.04  /2 ;
146   fSupportPlateHalfSize[1] =   6.0  /2 ;
147 //  fSupportPlateHalfSize[2] = ( (fNCellsZInStrip-1)*fStripWallWidthIn + 2*fStripWallWidthOut +
148 //                             fNCellsZInStrip * (2*fTyvecThickness + 2*fCrystalHalfSize[2]) )/2;
149   fSupportPlateHalfSize[2] =  4.51  /2 ;
150   fSupportPlateThickness = 0.3 ;  
151   fSupportPlateInHalfSize[0] = fSupportPlateHalfSize[0] ;                         //Half-sizes of the air
152   fSupportPlateInHalfSize[1] = fSupportPlateHalfSize[1]-fSupportPlateThickness ;  //box in the support plate
153   fSupportPlateInHalfSize[2] = fSupportPlateHalfSize[2]-fSupportPlateThickness/2 ;
154
155   fStripHalfSize[0]= fSupportPlateHalfSize[0] ;  
156   fStripHalfSize[1]= ( 2*fSupportPlateHalfSize[1] + 2*fAirCellHalfSize[1] )/2;      
157   fStripHalfSize[2]= fSupportPlateHalfSize[2] ;
158
159   // ------- Inner hermoinsulation ---------------
160   fInnerThermoWidthX = 2.0 ;         // Width of the innerthermoinsulation across the beam
161   fInnerThermoWidthY = 2.0 ;         // Width of the upper cover of innerthermoinsulation 
162   fInnerThermoWidthZ = 2.0 ;         // Width of the innerthermoinsulation along the beam
163
164   fInnerThermoHalfSize[0] = (2 * fStripHalfSize[0] * fNStripX + 2 * fInnerThermoWidthX ) /2 ;
165   fInnerThermoHalfSize[1] = (2 * fStripHalfSize[1] + fInnerThermoWidthY ) /2 ; 
166   fInnerThermoHalfSize[2] = (2 * fStripHalfSize[2] * fNStripZ + 2 * fInnerThermoWidthZ ) /2 ;
167
168   // ------- Air gap between inner thermoinsulation and passive coller ---------
169
170   fAirGapWidthX = 0.2 ;         // Width of the air gap across the beam
171   fAirGapWidthY = 0.2 ;         // Width of the upper air gap
172   fAirGapWidthZ = 0.2 ;         // Width of the air gap along the beam
173
174   fAirGapHalfSize[0] = (2 * fInnerThermoHalfSize[0] + 2 * fAirGapWidthX ) /2 ;
175   fAirGapHalfSize[1] = (2 * fInnerThermoHalfSize[1] +     fAirGapWidthY ) /2 ; 
176   fAirGapHalfSize[2] = (2 * fInnerThermoHalfSize[2] + 2 * fAirGapWidthZ ) /2 ;
177   
178   // ------- Passive Cooler ------------------------
179
180   fCoolerWidthX = 2.0 ;         // Width of the passive coller across the beam 
181   fCoolerWidthY = 0.3 ;         // Width of the upper cover of cooler
182   fCoolerWidthZ = 2.0 ;         // Width of the passive cooler along the beam
183
184   fCoolerHalfSize[0] = (2 * fAirGapHalfSize[0] + 2 * fCoolerWidthX ) /2 ; 
185   fCoolerHalfSize[1] = (2 * fAirGapHalfSize[1] +     fCoolerWidthY ) /2 ; 
186   fCoolerHalfSize[2] = (2 * fAirGapHalfSize[2] + 2 * fCoolerWidthZ ) /2 ; 
187
188   // ------- Outer thermoinsulation and Al cover -------------------------------
189   
190   fAlCoverThickness = 0.1 ;   //Thickness of the Al cover of the module  
191
192   fOuterThermoWidthXUp  = 156.0 - fAlCoverThickness ; 
193                                   //width of the upper surface of the PHOS module accross the beam 
194   fOuterThermoWidthY    = 6.0 ;   // with of the upper cover of outer thermoinsulation
195   fOuterThermoWidthZ    = 6.0 ;   //width of the thermoinsulation along the beam 
196
197   fAlFrontCoverX = 6.0 ;   //Width of Al strip around fiberglass window: across
198   fAlFrontCoverZ = 6.0 ;   //and along the beam
199
200
201   // Calculate distance from IP to upper cover
202   fIPtoOuterCoverDistance = fIPtoCrystalSurface - fAirGapLed - fInnerThermoWidthY - fAirGapWidthY - 
203                             fCoolerWidthY - fOuterThermoWidthY - fAlCoverThickness ; 
204
205   Float_t tanA = fOuterThermoWidthXUp / (2.*fIPtoOuterCoverDistance) ; 
206                   // tan(a) where A = angle between IP to center and IP to side across beam
207
208   fOuterThermoWidthXLow = fOuterThermoWidthXUp + 
209                           2 * (2* fCoolerHalfSize[1] + fOuterThermoWidthY) * tanA  
210                           - fAlCoverThickness ; 
211                           //width of the lower surface of the COOL section accross the beam 
212
213
214   fOuterThermoParams[0] = fOuterThermoWidthXUp / 2 ;   // half-length along x at the z surface positioned at -DZ; 
215   fOuterThermoParams[1] = fOuterThermoWidthXLow/ 2 ;   // half-length along x at the z surface positioned at +DZ; 
216   fOuterThermoParams[2] = ( 2 * fCoolerHalfSize[2] + 2 * fOuterThermoWidthZ ) / 2 ;
217                                                        // `half-length along the y-axis' in out case this is z axis 
218   fOuterThermoParams[3] = ( 2* fCoolerHalfSize[1] + fOuterThermoWidthY) /2 ;    
219                                                        // `half-length along the z-axis' in our case this is y axis 
220
221   fAlCoverParams[0] = fOuterThermoParams[0] + fAlCoverThickness ;
222   fAlCoverParams[1] = fOuterThermoParams[1] + fAlCoverThickness ;
223   fAlCoverParams[2] = fOuterThermoParams[2] + fAlCoverThickness ;
224   fAlCoverParams[3] = fOuterThermoParams[3] + fAlCoverThickness /2 ;
225
226
227   fFiberGlassHalfSize[0] = fAlCoverParams[0] - fAlFrontCoverX  ;
228   fFiberGlassHalfSize[1] = fAlCoverParams[2] - fAlFrontCoverZ  ; //Note, here other ref. system
229   fFiberGlassHalfSize[2] = fAlCoverThickness / 2 ;
230
231
232   //============Now warm section======================
233   //Al Cover 
234   fWarmAlCoverWidthX = 2 * fAlCoverParams[1] ;  //Across beam
235   fWarmAlCoverWidthY = 159.0 ;                  //along beam
236
237   //T-support
238   fTSupport1Thickness = 3.5 ; 
239   fTSupport2Thickness = 5.0 ; 
240   fTSupport1Width =  10.6 ;
241   fTSupport2Width = 3.1 ;
242   fNTSupports = fNStripX + 1 ;
243   fTSupportDist = 7.48 ;
244
245   //Air space for FEE
246   fAirSpaceFeeX = 148.6 ;   //Across beam
247   fAirSpaceFeeY = 135.0 ;   //along beam
248   fAirSpaceFeeZ =  19.0 ;   //out of beam
249
250   //thermoinsulation
251   fWarmBottomThickness = 4.0 ;
252   fWarmUpperThickness  = 4.0 ;
253
254   //Frame 
255   fFrameThickness = 5.0 ;
256   fFrameHeight    = 15.0 ;
257
258   //Fiberglass support
259   fFiberGlassSup1X = 6.0 ;
260   fFiberGlassSup1Y = 3.9 + fWarmUpperThickness ; 
261
262   fFiberGlassSup2X = 3.0 ;
263   fFiberGlassSup2Y = fFrameHeight ;
264
265   //Now calculate Half-sizes
266
267   fWarmAlCoverWidthZ = fAirSpaceFeeZ + fWarmBottomThickness + fWarmUpperThickness +  
268                        fTSupport1Thickness + fTSupport2Thickness ;
269
270
271   fWarmAlCoverHalfSize[0] = fWarmAlCoverWidthX / 2 ;
272   fWarmAlCoverHalfSize[1] = fWarmAlCoverWidthY / 2 ;
273   fWarmAlCoverHalfSize[2] = fWarmAlCoverWidthZ / 2 ;
274
275   
276   fWarmThermoHalfSize[0] = fWarmAlCoverHalfSize[0] - fAlCoverThickness ; 
277   fWarmThermoHalfSize[1] = fWarmAlCoverHalfSize[1] - fAlCoverThickness ; 
278   fWarmThermoHalfSize[2] = fWarmAlCoverHalfSize[2] - fAlCoverThickness /2 ; 
279
280
281   //T-support
282   fTSupport1HalfSize[0] =  fTSupport1Width /2 ;   //Across beam
283   fTSupport1HalfSize[1] =  (fAirSpaceFeeY + 2*fFiberGlassSup1X) /2 ;    //along beam
284   fTSupport1HalfSize[2] =  fTSupport1Thickness  /2;    //out of beam
285
286   fTSupport2HalfSize[0] = fTSupport2Width /2;               //Across beam  
287   fTSupport2HalfSize[1] = fTSupport1HalfSize[1] ; //along beam
288   fTSupport2HalfSize[2] = fTSupport2Thickness /2; //out of beam
289
290   //cables
291   fTCables1HalfSize[0] = (2*fTSupport1HalfSize[0]*fNTSupports + (fNTSupports-1)* fTSupportDist) / 2 ; //Across beam
292   fTCables1HalfSize[1] = fTSupport1HalfSize[1] ;    //along beam
293   fTCables1HalfSize[2] = fTSupport1HalfSize[2] ;    //out of beam
294
295   fTCables2HalfSize[0] = fTCables1HalfSize[0]  ; //Across beam
296   fTCables2HalfSize[1] = fTSupport2HalfSize[1] ; //along beam
297   fTCables2HalfSize[2] = fTSupport2HalfSize[2] ; //out of beam
298
299   //frame: we define two frames along beam ...Z and across beam ...X
300   fFrameXHalfSize[0] = (fAirSpaceFeeX + 2 * fFiberGlassSup2X + 2* fFrameThickness) /2 ;
301   fFrameXHalfSize[1] = fFrameThickness /2 ;
302   fFrameXHalfSize[2] = fFrameHeight    /2 ;
303
304   fFrameXPosition[0] = 0 ;
305   fFrameXPosition[1] = fAirSpaceFeeY /2 + fFiberGlassSup2X + fFrameXHalfSize[1] ;
306   fFrameXPosition[2] = fWarmThermoHalfSize[2] - fFrameHeight/ 2 - fWarmBottomThickness ;
307     
308   fFrameZHalfSize[0] = fFrameThickness /2 ;
309   fFrameZHalfSize[1] = (fAirSpaceFeeY + 2 * fFiberGlassSup2X) /2 ;
310   fFrameZHalfSize[2] = fFrameHeight    /2 ;
311
312   fFrameZPosition[0] = fAirSpaceFeeX /2 + fFiberGlassSup2X + fFrameZHalfSize[0] ;
313   fFrameZPosition[1] = 0 ;
314   fFrameZPosition[2] = fWarmThermoHalfSize[2] - fFrameHeight/ 2 - fWarmBottomThickness ;
315
316   //Fiberglass support define 4 fiber glass supports 2 along Z  and 2 along X
317   
318   fFGupXHalfSize[0] = fFrameXHalfSize[0] ;
319   fFGupXHalfSize[1] = fFiberGlassSup1X /2 ;
320   fFGupXHalfSize[2] = fFiberGlassSup1Y /2;
321
322   fFGupXPosition[0] = 0 ;
323   fFGupXPosition[1] = fAirSpaceFeeY /2 + fFGupXHalfSize[1] ;
324   fFGupXPosition[2] = fWarmThermoHalfSize[2] - fFrameHeight - fWarmBottomThickness - fFGupXHalfSize[2] ; 
325
326   fFGupZHalfSize[0] = fFiberGlassSup1X /2 ;
327   fFGupZHalfSize[1] = fAirSpaceFeeY /2 ;
328   fFGupZHalfSize[2] = fFiberGlassSup1Y /2;
329
330   fFGupZPosition[0] = fAirSpaceFeeX /2 + fFGupZHalfSize[0] ;
331   fFGupZPosition[1] = 0 ;
332   fFGupZPosition[2] = fWarmThermoHalfSize[2] - fFrameHeight - fWarmBottomThickness - fFGupXHalfSize[2] ; 
333
334   fFGlowXHalfSize[0] = fFrameXHalfSize[0] - 2*fFrameZHalfSize[0] ;
335   fFGlowXHalfSize[1] = fFiberGlassSup2X /2 ;
336   fFGlowXHalfSize[2] = fFrameXHalfSize[2] ;
337
338   fFGlowXPosition[0] = 0 ;
339   fFGlowXPosition[1] = fAirSpaceFeeY /2 + fFGlowXHalfSize[1] ;
340   fFGlowXPosition[2] = fWarmThermoHalfSize[2] - fWarmBottomThickness - fFGlowXHalfSize[2] ; 
341
342   fFGlowZHalfSize[0] = fFiberGlassSup2X /2 ;
343   fFGlowZHalfSize[1] = fAirSpaceFeeY /2 ;
344   fFGlowZHalfSize[2] = fFrameZHalfSize[2] ;
345
346   fFGlowZPosition[0] = fAirSpaceFeeX /2 + fFGlowZHalfSize[0] ;
347   fFGlowZPosition[1] = 0 ;
348   fFGlowZPosition[2] = fWarmThermoHalfSize[2] - fWarmBottomThickness - fFGlowXHalfSize[2] ; 
349
350
351   // --- Air Gap for FEE ----
352
353   fFEEAirHalfSize[0] =  fAirSpaceFeeX /2 ;
354   fFEEAirHalfSize[1] =  fAirSpaceFeeY /2;
355   fFEEAirHalfSize[2] =  fAirSpaceFeeZ /2;
356
357   fFEEAirPosition[0] = 0 ;
358   fFEEAirPosition[1] = 0 ;
359   fFEEAirPosition[2] = fWarmThermoHalfSize[2] - fWarmBottomThickness - fFEEAirHalfSize[2] ;
360
361   // --- Calculate the oveol dimentions of the EMC module
362   
363   fEMCParams[3] = fAlCoverParams[3] + fWarmAlCoverHalfSize[2] ; //Size out of beam
364   fEMCParams[0] = fAlCoverParams[0] ; //Upper size across the beam
365   fEMCParams[1] = (fAlCoverParams[1] - fAlCoverParams[0])*fEMCParams[3]/fAlCoverParams[3] 
366                  + fAlCoverParams[0]  ; //Lower size across the beam
367   fEMCParams[2] = fWarmAlCoverHalfSize[1] ;                     // Size along the beam
368
369   fNPhi = fNStripX * fNCellsXInStrip ;    //number of crystals across the beam
370   fNZ   = fNStripZ * fNCellsZInStrip ;    //number of crystals along the beam
371 }
372