b2914d3f95959558ee172a58f5ceb23740435b10
[u/mrichter/AliRoot.git] / FMD / AliFMDRing.h
1 #ifndef ALIFMDRING_H
2 #define ALIFMDRING_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
7  *
8  * See cxx source for full Copyright notice                               
9  */
10 /** @file    AliFMDRing.h
11     @author  Christian Holm Christensen <cholm@nbi.dk>
12     @date    Mon Mar 27 12:47:43 2006
13     @brief   FMD ring geometry parameters 
14 */
15 //__________________________________________________________________
16 //
17 // Parameters of the FMD rings. 
18 // This class is responsible to make the (common) rings of the three
19 // sub-detectors. 
20 //
21 #ifndef ROOT_TNamed
22 # include <TNamed.h>
23 #endif
24 #ifndef ROOT_TObjArray
25 # include <TObjArray.h>
26 #endif
27
28 class TBrowser;
29 class TVector2;
30
31 /** 
32  * @brief Geometry description and parameters of a ring in the FMD 
33  * detector. 
34  *
35  * As there are only 2 kinds of rings @e Inner (@c 'I') and @e Outer
36  * (@c 'O') the two objects of this class is owned by the
37  * AliFMDGeometry singleton object.  The 3 AliFMDDetector objects
38  * shares these two instances as needed.
39  * @ingroup FMD_base
40 */
41 class AliFMDRing : public TNamed
42 {
43 public:
44   /** 
45    * CTOR
46    *
47    * @param fId Ring ID  
48    */
49   AliFMDRing(Char_t fId);
50   /** 
51    * DTOR  
52    */
53   virtual ~AliFMDRing() {}
54   /** 
55    * Initialize the ring geometry 
56    */
57   virtual void Init();
58   
59   /** 
60    *
61    * @param x Value of The Id of this ring type
62    */
63   void SetId(Char_t x) { fId = x; }
64   /** 
65    *
66    * @param x Value of With of bonding pad on sensor
67    */
68   void SetBondingWidth(Double_t x=.5) { fBondingWidth = x; }
69   /** 
70    *
71    * @param x Value of Size of wafer the sensor was made from
72    */
73   void SetWaferRadius(Double_t x=13.4/2) { fWaferRadius = x; }
74   /** 
75    *
76    * @param x Value of Thickness of sensor
77    */
78   void SetSiThickness(Double_t x=.032) { fSiThickness = x; }
79   /** 
80    *
81    * @param x Value of Lower radius of ring
82    */
83   void SetLowR(Double_t x) { fLowR = x; }
84   /** 
85    *
86    * @param x Value of Upper radius of ring
87    */
88   void SetHighR(Double_t x) { fHighR = x; }
89   /** 
90    *
91    * @param x Value of Opening angle of the silicon wafers
92    */
93   void SetTheta(Double_t x) { fTheta = x; }
94   /** 
95    *
96    * @param x Value of Number of strips
97    */
98   void SetNStrips(Int_t x) { fNStrips = x; }
99   /** 
100    *
101    * @param x Value of How far the ring extends beyond the z value given.
102    */
103   void SetRingDepth(Double_t x) { fRingDepth = x; }
104   /** 
105    *
106    * @param x Value of Radius of support legs
107    */
108   void SetLegRadius(Double_t x=.25) { fLegRadius = x; }
109   /** 
110    *
111    * @param x Value of Radius of support legs
112    */
113   void SetLegLength(Double_t x=.9) { fLegLength = x; }
114   /** 
115    *
116    * @param x Value of Radius of support legs
117    */
118   void SetLegOffset(Double_t x=2) { fLegOffset = x; }
119   /** 
120    *
121    * @param x Value of Staggering offset
122    */
123   void SetModuleSpacing(Double_t x=.5) { fModuleSpacing = x; }
124   /** 
125    *
126    * @param x Value of Thickness of print board
127    */
128   void SetPrintboardThickness(Double_t x=.08) { fPrintboardThickness = x; }
129   /** 
130    *
131    * @param x Value of Thickness of copper on print board
132    */
133   void SetCopperThickness(Double_t x=.01) { fCopperThickness = x; }
134   /** 
135    *
136    * @param x Value of Thickness of chip on print board
137    */
138   void SetChipThickness(Double_t x=.01) { fChipThickness = x; }
139   /** 
140    *
141    * @param x Value of spacing between si and PCB
142    */
143   void SetSpacing(Double_t x=.05) { fSpacing = x; }
144   /** 
145    *
146    * @param x Thickness of honeycomb plate
147    */
148   void SetHoneycombThickness(Double_t x=0.65) { fHoneycombThickness = x; }
149   /** 
150    *
151    * @param x Thickness of aluminium of honeycomb
152    */
153   void SetAlThickness(Double_t x=.1) { fAlThickness = x; }
154
155   /** 
156    *
157    * @return The Id of this ring type
158    */
159   Char_t GetId() const { return fId; }
160   /** 
161    *
162    * @return With of bonding pad on sensor
163    */
164   Double_t GetBondingWidth() const { return fBondingWidth; }
165   /** 
166    *
167    * @return Size of wafer the sensor was made from
168    */
169   Double_t GetWaferRadius() const { return fWaferRadius; }
170   /** 
171    *
172    * @return Thickness of sensor
173    */
174   Double_t GetSiThickness() const { return fSiThickness; }
175   /** 
176    *
177    * @return Minimum r for an active strip
178    */
179   Double_t GetMinR() const { return fMinR; }
180   /** 
181    *
182    * @return Maximum r for an active strip
183    */
184   Double_t GetMaxR() const { return fMaxR; }
185   /** 
186    *
187    * @return Lower radius of ring
188    */
189   Double_t GetLowR() const { return fLowR; }
190   /** 
191    *
192    * @return Upper radius of ring
193    */
194   Double_t GetHighR() const { return fHighR; }
195   /** 
196    *
197    * @return Opening angle of the sector (half that of silicon wafers)
198    */
199   Double_t GetTheta() const { return fTheta; }
200   /** 
201    *
202    * @return Number of strips
203    */
204   Int_t GetNStrips() const { return fNStrips; }
205   /** 
206    *
207    * @return Number of sectors
208    */
209   Int_t GetNSectors() const { return Int_t(360. / fTheta); }
210   /** 
211    *
212    * @return Number of modules (2 sectors per module)
213    */
214   Int_t GetNModules() const { return GetNSectors() / 2; }
215   /** 
216    *
217    * @return How far the ring extends beyond the z value given.
218    */
219   Double_t GetRingDepth() const { return fRingDepth; }
220   /** 
221    *
222    * @return Radius of support legs
223    */
224   Double_t GetLegRadius() const { return fLegRadius; }
225   /** 
226    *
227    * @return Radius of support legs
228    */
229   Double_t GetLegLength() const { return fLegLength; }
230   /** 
231    *
232    * @return Radius of support legs
233    */
234   Double_t GetLegOffset() const { return fLegOffset; }
235   /** 
236    *
237    * @return Staggering offset
238    */
239   Double_t GetModuleSpacing() const { return fModuleSpacing; }
240   /** 
241    *
242    * @return Thickness of print board
243    */
244   Double_t GetPrintboardThickness() const { return fPrintboardThickness; }
245   /** 
246    *
247    * @return Thickness copper of print board
248    */
249   Double_t GetCopperThickness() const { return fCopperThickness; }
250   /** 
251    *
252    * @return Thickness chip of print board
253    */
254   Double_t GetChipThickness() const { return fChipThickness; }
255   /** 
256    *
257    * @return Value of spacing between si and PCB
258    */
259   Double_t GetSpacing() const { return fSpacing; }
260   /** 
261    *
262    * @return Thickness of honeycomb plate
263    */
264   Double_t GetHoneycombThickness() const { return fHoneycombThickness; }
265   /** 
266    *
267    * @return Thickness of aluminium of honeycomb
268    */
269   Double_t GetAlThickness() const { return fAlThickness; }
270   /** 
271    *
272    * @return The strip pitch
273    */ 
274   Double_t GetPitch() const { return (fMaxR - fMinR) / fNStrips; }
275   /** 
276    *
277    * @return Radius (in cm) correspondig to strip @a strip
278    */
279   Double_t GetStripRadius(UShort_t strip) const;
280   /** 
281    *
282    * @return Full depth of (low) modules in this (half) ring
283    */
284   Double_t GetModuleDepth() const;
285   /** 
286    *
287    * @return Full depth of this (half) ring
288    */
289   Double_t GetFullDepth() const;
290   /** 
291    * Get the inner radius of the digitizer cards 
292    *
293    * @return The inner radius of the digitizer cards 
294    */
295   Double_t GetFMDDLowR() const { return 1.2*GetLowR(); }
296   /** 
297    * Get the outer radius of the digitizer cards 
298    *
299    * @return The outer radius of the digitizer cards 
300    */
301   Double_t GetFMDDHighR() const { return .95*GetHighR(); }
302   /** 
303    *
304    * @return Thickness of print board
305    */
306   Double_t GetFMDDPrintboardThickness() const { return 2*fPrintboardThickness; }
307   /** 
308    *
309    * @return Thickness copper of print board
310    */
311   Double_t GetFMDDCopperThickness() const { return 2*fCopperThickness; }
312   /** 
313    *
314    * @return Thickness chip of print board
315    */
316   Double_t GetFMDDChipThickness() const { return 2*fChipThickness; }
317
318   /** 
319    *
320    * @return List of verticies
321    */
322   const TObjArray& GetVerticies() const { return fVerticies; }
323   /** 
324    *
325    * @return Number of verticies
326    */
327   Int_t GetNVerticies() const { return fVerticies.GetEntries(); }
328   /** 
329    * @param i Vertex number 
330    *
331    * @return the ith vertex 
332    */
333   TVector2* GetVertex(Int_t i) const;
334   /** 
335    *
336    * @return List of verticies
337    */
338   const TObjArray& GetSensorVerticies() const { return fSensorVerticies; }
339   /** 
340    * @param i Vertex number 
341    *
342    * @return the ith vertex 
343    */
344   TVector2* GetSensorVertex(Int_t i) const;
345   /** 
346    *
347    * @return List of verticies
348    */
349   const TObjArray& GetHybridVerticies() const { return fHybridVerticies; }
350   /** 
351    * @param i Vertex number 
352    *
353    * @return the ith vertex 
354    */
355   TVector2* GetHybridVertex(Int_t i) const;
356
357   /** 
358    * Get a list of feet positions 
359    * 
360    * 
361    * @return List TVector2 of feet positions on hybrid card
362    */  
363   const TObjArray& GetFeetPositions() const { return fFeetPositions; }
364   /** 
365    * Get the number of feet positions 
366    * 
367    * 
368    * @return Number of feet positions 
369    */
370   Int_t GetNFeetPositions() const { return fFeetPositions.GetEntries(); }
371   /** 
372    * Get the @a i feet position
373    * 
374    * @param i Index
375    * 
376    * @return The foot position of stand-off @a i 
377    */  
378   TVector2* GetFootPosition(Int_t i) const;
379   /** 
380    * Get the real length of a strip
381    * 
382    * @param strip strip number
383    * 
384    * @return length of strip 
385    */ 
386   Float_t GetStripLength(UShort_t strip) const ;
387   /** 
388    * Get the length of a strip assuming the corners are not cut off
389    * 
390    * @param strip strip number
391    * 
392    * @return length of strip w/o corners 
393    */ 
394   Float_t GetBaseStripLength(UShort_t strip) const ;
395   /** Not used */
396   void Detector2XYZ(UShort_t sector, UShort_t strip, 
397                     Double_t& x, Double_t& y, Double_t& z) const;
398   /** Not used */
399   Bool_t XYZ2Detector(Double_t x, Double_t y, Double_t z, 
400                       UShort_t& sector, UShort_t& strip) const;
401 private: 
402   Char_t        fId;                    // The Id of this ring type
403   Double_t      fBondingWidth;          // With of bonding pad on sensor
404   Double_t      fWaferRadius;           // Size of wafer sensor was made from
405   Double_t      fSiThickness;           // Thickness of sensor
406   Double_t      fLowR;                  // Lower radius of ring
407   Double_t      fHighR;                 // Upper radius of ring
408   Double_t      fMinR;                  // Lower radius of active strips
409   Double_t      fMaxR;                  // Upper radius of active strips
410   Double_t      fTheta;                 // Opening angle of the silicon wafers
411   Int_t         fNStrips;               // Number of strips
412   Double_t      fRingDepth;             // How far the ring extends beyond z
413   Double_t      fLegRadius;             // Radius of support legs
414   Double_t      fLegLength;             // Radius of support legs
415   Double_t      fLegOffset;             // Radius of support legs
416   Double_t      fModuleSpacing;         // Staggering offset
417   Double_t      fPrintboardThickness;   // Thickness of print board
418   Double_t      fCopperThickness;       // Thickness of Cu on print board
419   Double_t      fChipThickness;         // Thickness of chip on print board
420   Double_t      fSpacing;               // Spacing between si and PCB
421   Double_t      fHoneycombThickness;    // Thickness of honeycomb plate
422   Double_t      fAlThickness;           // Thickness of aluminium of honeycomb
423   
424   TObjArray     fVerticies;             // List of active sensor verticies
425   TObjArray     fSensorVerticies;       // List of physical sensor verticies
426   TObjArray     fHybridVerticies;       // List of hybrid card verticies
427   TObjArray     fFeetPositions;         // List of feet positions
428   
429   ClassDef(AliFMDRing, 0);
430 };
431 #endif 
432 //____________________________________________________________________
433 //
434 // Local Variables:
435 //   mode: C++
436 // End:
437 //
438 // EOF
439 //