Commit of new FMD3 geometry and other geometry related issues.
[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 /** @brief Geometry description and parameters of a ring in the FMD 
32     detector. 
33     
34     As there are only 2 kinds of rings @e Inner (@c 'I') and @e
35     Outer (@c 'O') the two objects of this class is owned by the
36     Geometry::FMD singleton object.  The 3 Geometry::FMDDetector
37     objects shares these two instances as needed. 
38     @ingroup FMD_base
39 */
40 class AliFMDRing : public TNamed
41 {
42 public:
43   /** CTOR
44       @param fId Ring ID  */
45   AliFMDRing(Char_t fId);
46   /** DTOR  */
47   virtual ~AliFMDRing() {}
48   /** Initialize the ring geometry */
49   virtual void Init();
50   
51   /** @param x Value of The Id of this ring type */
52   void SetId(Char_t x) { fId = x; }
53   /** @param x Value of With of bonding pad on sensor */
54   void SetBondingWidth(Double_t x=.5) { fBondingWidth = x; }
55   /** @param x Value of Size of wafer the sensor was made from */
56   void SetWaferRadius(Double_t x=13.4/2) { fWaferRadius = x; }
57   /** @param x Value of Thickness of sensor */
58   void SetSiThickness(Double_t x=.032) { fSiThickness = x; }
59   /** @param x Value of Lower radius of ring */
60   void SetLowR(Double_t x) { fLowR = x; }
61   /** @param x Value of Upper radius of ring */
62   void SetHighR(Double_t x) { fHighR = x; }
63   /** @param x Value of Opening angle of the silicon wafers */
64   void SetTheta(Double_t x) { fTheta = x; }
65   /** @param x Value of Number of strips */
66   void SetNStrips(Int_t x) { fNStrips = x; }
67   /** @param x Value of How far the ring extends beyond the z value given. */
68   void SetRingDepth(Double_t x) { fRingDepth = x; }
69   /** @param x Value of Radius of support legs */
70   void SetLegRadius(Double_t x=.2) { fLegRadius = x; }
71   /** @param x Value of Radius of support legs */
72   void SetLegLength(Double_t x=1) { fLegLength = x; }
73   /** @param x Value of Radius of support legs */
74   void SetLegOffset(Double_t x=2) { fLegOffset = x; }
75   /** @param x Value of Staggering offset */
76   void SetModuleSpacing(Double_t x=.6) { fModuleSpacing = x; }
77   /** @param x Value of Thickness of print board */
78   void SetPrintboardThickness(Double_t x=.1) { fPrintboardThickness = x; }
79   /** @param x Value of Thickness of copper on print board */
80   void SetCopperThickness(Double_t x=.01) { fCopperThickness = x; }
81   /** @param x Value of Thickness of chip on print board */
82   void SetChipThickness(Double_t x=.01) { fChipThickness = x; }
83   /** @param x Value of spacing between si and PCB */
84   void SetSpacing(Double_t x=.05) { fSpacing = x; }
85   /** @param x Thickness of honeycomb plate */
86   void SetHoneycombThickness(Double_t x=0.65) { fHoneycombThickness = x; }
87   /** @param x Thickness of aluminium of honeycomb */
88   void SetAlThickness(Double_t x=.1) { fAlThickness = x; }
89
90   /** @return The Id of this ring type */
91   Char_t GetId() const { return fId; }
92   /** @return With of bonding pad on sensor */
93   Double_t GetBondingWidth() const { return fBondingWidth; }
94   /** @return Size of wafer the sensor was made from */
95   Double_t GetWaferRadius() const { return fWaferRadius; }
96   /** @return Thickness of sensor */
97   Double_t GetSiThickness() const { return fSiThickness; }
98   /** @return Minimum r for an active strip */
99   Double_t GetMinR() const { return fMinR; }
100   /** @return Maximum r for an active strip */
101   Double_t GetMaxR() const { return fMaxR; }
102   /** @return Lower radius of ring */
103   Double_t GetLowR() const { return fLowR; }
104   /** @return Upper radius of ring */
105   Double_t GetHighR() const { return fHighR; }
106   /** @return Opening angle of the sector (half that of silicon wafers) */
107   Double_t GetTheta() const { return fTheta; }
108   /** @return Number of strips */
109   Int_t GetNStrips() const { return fNStrips; }
110   /** @return Number of sectors */
111   Int_t GetNSectors() const { return Int_t(360. / fTheta); }
112   /** @return Number of modules (2 sectors per module) */
113   Int_t GetNModules() const { return GetNSectors() / 2; }
114   /** @return How far the ring extends beyond the z value given. */
115   Double_t GetRingDepth() const { return fRingDepth; }
116   /** @return Radius of support legs */
117   Double_t GetLegRadius() const { return fLegRadius; }
118   /** @return Radius of support legs */
119   Double_t GetLegLength() const { return fLegLength; }
120   /** @return Radius of support legs */
121   Double_t GetLegOffset() const { return fLegOffset; }
122   /** @return Staggering offset */
123   Double_t GetModuleSpacing() const { return fModuleSpacing; }
124   /** @return Thickness of print board */
125   Double_t GetPrintboardThickness() const { return fPrintboardThickness; }
126   /** @return Thickness copper of print board */
127   Double_t GetCopperThickness() const { return fCopperThickness; }
128   /** @return Thickness chip of print board */
129   Double_t GetChipThickness() const { return fChipThickness; }
130   /** @return Value of spacing between si and PCB */
131   Double_t GetSpacing() const { return fSpacing; }
132   /** @return Thickness of honeycomb plate */
133   Double_t GetHoneycombThickness() const { return fHoneycombThickness; }
134   /** @return Thickness of aluminium of honeycomb */
135   Double_t GetAlThickness() const { return fAlThickness; }
136   /** @return The strip pitch */ 
137   Double_t GetPitch() const { return (fMaxR - fMinR) / fNStrips; }
138   /** @return Radius (in cm) correspondig to strip @a strip */
139   Double_t GetStripRadius(UShort_t strip) const;
140   /** @return Full depth of this (half) ring */
141   Double_t GetFullDepth() const;
142   /** Get the inner radius of the digitizer cards */
143   Double_t GetFMDDLowR() const { return 1.2*GetLowR(); }
144   /** Get the outer radius of the digitizer cards */
145   Double_t GetFMDDHighR() const { return .95*GetHighR(); }
146   /** @return Thickness of print board */
147   Double_t GetFMDDPrintboardThickness() const { return 2*fPrintboardThickness; }
148   /** @return Thickness copper of print board */
149   Double_t GetFMDDCopperThickness() const { return 2*fCopperThickness; }
150   /** @return Thickness chip of print board */
151   Double_t GetFMDDChipThickness() const { return 2*fChipThickness; }
152
153   /** @return List of verticies */
154   const TObjArray& GetVerticies() const { return fVerticies; }
155   /** @return Number of verticies */
156   Int_t GetNVerticies() const { return fVerticies.GetEntries(); }
157   /** @param i Vertex number 
158       @return the ith vertex */
159   TVector2* GetVertex(Int_t i) const;
160      
161   /** Not used */
162   void Detector2XYZ(UShort_t sector, UShort_t strip, 
163                     Double_t& x, Double_t& y, Double_t& z) const;
164   /** Not used */
165   Bool_t XYZ2Detector(Double_t x, Double_t y, Double_t z, 
166                       UShort_t& sector, UShort_t& strip) const;
167 private: 
168   Char_t        fId;                    // The Id of this ring type
169   Double_t      fBondingWidth;          // With of bonding pad on sensor
170   Double_t      fWaferRadius;           // Size of wafer sensor was made from
171   Double_t      fSiThickness;           // Thickness of sensor
172   Double_t      fLowR;                  // Lower radius of ring
173   Double_t      fHighR;                 // Upper radius of ring
174   Double_t      fMinR;                  // Lower radius of active strips
175   Double_t      fMaxR;                  // Upper radius of active strips
176   Double_t      fTheta;                 // Opening angle of the silicon wafers
177   Int_t         fNStrips;               // Number of strips
178   Double_t      fRingDepth;             // How far the ring extends beyond z
179   Double_t      fLegRadius;             // Radius of support legs
180   Double_t      fLegLength;             // Radius of support legs
181   Double_t      fLegOffset;             // Radius of support legs
182   Double_t      fModuleSpacing;         // Staggering offset
183   Double_t      fPrintboardThickness;   // Thickness of print board
184   Double_t      fCopperThickness;       // Thickness of Cu on print board
185   Double_t      fChipThickness;         // Thickness of chip on print board
186   Double_t      fSpacing;               // Spacing between si and PCB
187   Double_t      fHoneycombThickness;    // Thickness of honeycomb plate
188   Double_t      fAlThickness;           // Thickness of aluminium of honeycomb
189   
190   TObjArray     fVerticies;             // List of verticies
191
192   ClassDef(AliFMDRing, 0);
193 };
194 #endif 
195 //____________________________________________________________________
196 //
197 // Local Variables:
198 //   mode: C++
199 // End:
200 //
201 // EOF
202 //