]>
Commit | Line | Data |
---|---|---|
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 | // |