added low and high flux parameters to the array
[u/mrichter/AliRoot.git] / FMD / AliFMDGeometry.h
1 #ifndef ALIFMDGEOMETRY_H
2 #define ALIFMDGEOMETRY_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    AliFMDGeometry.h
11     @author  Christian Holm Christensen <cholm@nbi.dk>
12     @date    Mon Mar 27 12:40:37 2006
13     @brief   Geometry mananger for the FMD
14 */
15 //____________________________________________________________________
16 //                                                                          
17 // Forward Multiplicity Detector based on Silicon wafers. 
18 //
19 // This class is a singleton that handles the geometry parameters of
20 // the FMD detectors.  
21 // The actual code is done by various separate classes.
22 //                                                       
23 #ifndef ALIGEOMETRY_H
24 # include <AliGeometry.h>
25 #endif
26 #ifndef ROOT_TArrayI
27 # include <TArrayI.h>
28 #endif
29 #ifndef ROOT_TMatrixFfwd
30 # include <TMatrixFfwd.h>
31 #endif
32 class TVector3;
33 class TParticle;
34 class AliRecPoint;
35 class AliFMDRing;
36 class AliFMDDetector;
37 class AliFMD1;
38 class AliFMD2;
39 class AliFMD3;
40 class AliFMDGeometryBuilder;
41
42
43 //__________________________________________________________________
44 /** @brief Singleton object of FMD geometry descriptions and parameters.
45     This class is a singleton that handles the geometry parameters of
46     the FMD detectors.  
47                                                           
48     The actual code is done by various separate classes.   Below is
49     diagram showing the relationship between the various FMD classes
50     that handles the geometry 
51     @verbatim
52                                   +------------+ 
53                                +- | AliFMDRing |
54                            2   |  +------------+
55          +----------------+<>--+        |                               
56          | AliFMDGeometry |             ^                               
57          +----------------+<>--+        V 1..2                          
58                            3   | +----------------+             
59                                +-| AliFMDDetector |             
60                                  +----------------+             
61                                         ^
62                                         |
63                           +-------------+-------------+
64                           |             |             |       
65                      +---------+   +---------+   +---------+
66                      | AliFMD1 |   | AliFMD2 |   | AliFMD3 |
67                      +---------+   +---------+   +---------+
68          
69     @endverbatim
70     -  AliFMDRing 
71        This class contains all stuff needed to do with a ring.  It's
72        used by the AliFMDDetector objects to instantise inner and
73        outer rings.  The AliFMDRing objects are shared by the
74        AliFMDDetector objects, and owned by the AliFMDv1 object. 
75     -  AliFMD1, AliFMD2, and AliFMD3 
76        These are specialisation of AliFMDDetector, that contains the
77        particularities of each of the sub-detector system.  It is
78        envisioned that the classes should also define the support
79        volumes and material for each of the detectors.
80
81     @ingroup FMD_base
82  */
83 class AliFMDGeometry : public AliGeometry
84 {
85 public:
86   /** @return Singleton */
87   static AliFMDGeometry* Instance();
88   /** Initialize */
89   virtual void Init();
90   /** Initialize transforms */
91   virtual void InitTransformations();
92   /** @return Get inner description */
93   AliFMDRing*     GetInner() const { return fInner; }
94   /** @return Get outer description */
95   AliFMDRing*     GetOuter() const { return fOuter; }
96   /** @return Get FMD1 description */
97   AliFMD1*        GetFMD1()  const { return (fUseFMD1 ? fFMD1 : 0); }
98   /** @return Get FMD2 description */
99   AliFMD2*        GetFMD2()  const { return (fUseFMD2 ? fFMD2 : 0); }
100   /** @return Get FMD3 description */
101   AliFMD3*        GetFMD3()  const { return (fUseFMD3 ? fFMD3 : 0); }
102   /** Get description of a sub-detector
103       @param i Sub-detector #
104       @return Description of sub-detector, or 0 */
105   AliFMDDetector* GetDetector(Int_t i) const;
106   /** Get description of a ring
107       @param i Ring id
108       @return Description of ring, or 0 */
109   AliFMDRing*     GetRing(Char_t i) const;
110   /** @param i IF true, disable sub-detector @a i */
111   void            Disable(Int_t i);
112   /** @param i IF true, enable sub-detector @a i */
113   void            Enable(Int_t i);
114   /** @return Density @f$ \rho@f$ of silicon */
115   Double_t        GetSiDensity() const { return 2.33; }
116   /** Translate detector coordinates (detector, ring, sector, strip)
117       to spatial coordinates (x, y, z) in the master reference frame
118       of ALICE.  The member function uses the transformations
119       previously obtained from the TGeoManager.
120       @param detector Detector number
121       @param ring     Ring id
122       @param sector   Sector number
123       @param strip    Strip number
124       @param x        On return, X coordinate 
125       @param y        On return, Y coordinate 
126       @param z        On return, Z coordinate  */
127   void            Detector2XYZ(UShort_t detector, Char_t ring, 
128                                UShort_t sector, UShort_t strip, 
129                                Double_t& x, Double_t& y, Double_t& z) const;
130   /** Translate spatial coordinates (x,y,z) in the master reference
131       frame of ALICE to the detector coordinates (detector, ring,
132       sector, strip).  Note, that if this method is to be used in
133       reconstruction or the like, then the input z-coordinate should
134       be corrected for the events interactions points z-coordinate,
135       like  
136       @code 
137       geom->XYZ2Detector(x,y,z-ipz,d,r,s,t);
138       @endcode
139       @param x        X coordinate
140       @param y        Y coordinate
141       @param z        Z coordinate
142       @param detector On return, Detector number
143       @param ring     On return, Ring id                   
144       @param sector   On return, Sector number     
145       @param strip    On return, Strip number      
146       @return @c  false of (@a x, @a y, @a z) is not within this
147       detector.  */
148   Bool_t          XYZ2Detector(Double_t x, Double_t y, Double_t z, 
149                                UShort_t& detector, Char_t& ring, 
150                                UShort_t& sector, UShort_t& strip) const;
151   /** Make the geometry.  This delegates to AliFMDGeometryBuilder */
152   void   Build();
153   /** @return Get detector offset in paths */
154   Int_t  GetDetectorOff() const    { return fDetectorOff; }
155   /** @return Get sensor offset in paths */
156   Int_t  GetModuleOff() const      { return fModuleOff;   }
157   /** @return Get ring offset in paths */
158   Int_t  GetRingOff() const        { return fRingOff;     }
159   /** @return Get ring sector in paths */
160   Int_t  GetSectorOff() const      { return fSectorOff;   }
161   /** @param off Detector off-set set in geometry path */
162   void   SetDetectorOff(Int_t off) { fDetectorOff = off; }
163   /** @param off Module off-set set in geometry path */
164   void   SetModuleOff(Int_t off)   { fModuleOff   = off; }
165   /** @param off Ring off-set set in geometry path */
166   void   SetRingOff(Int_t off)     { fRingOff     = off; }
167   /** @param off Sectord off-set set in geometry path */
168   void   SetSectorOff(Int_t off)   { fSectorOff   = off; }
169   /** Check if volume @a vol is marked as active 
170       @param vol Volume ID
171       @return  @c true if @a vol is declared active */
172   Bool_t IsActive(Int_t vol) const;
173   /** Set active volumes 
174       @param active Active volume id array 
175       @param n elements of @a active */
176   void   SetActive(Int_t* active, Int_t n);
177   /** @param id Register volume @a id to be active */
178   void   AddActive(Int_t id);
179   /** Get Array of active volume numbers 
180       @return constant reference to active volume numbers */ 
181   const TArrayI& ActiveIds() const { return fActive; }
182   /** Set an external geometry builder
183       @param b Geometry builder */
184   void   SetBuilder(AliFMDGeometryBuilder* b) { fBuilder = b; }
185   /** Extract informaton from TGeoManager */
186   void   ExtractGeomInfo();
187   /** Whether we are to use a detailed geometry or not
188       @param det if @c true, make a detailed geometry. */
189   void   SetDetailed(Bool_t det) { fDetailed = det; }
190   /** @return @c true if geometry is detailed */
191   Bool_t IsDetailed() const { return fDetailed; }
192   /** @param ass Whether to use assemblies or not */
193   void   UseAssembly(Bool_t ass)  { fUseAssembly = ass; }
194
195   // AliGeometry member functions 
196   /** Get global coordinates cooresponding to a rec point. 
197       @param p   Reconstructed point.
198       @param pos On return, the position
199       @param mat On return, the material at @a post */
200   virtual void GetGlobal(const AliRecPoint* p, TVector3& pos, 
201                          TMatrixF& mat) const;
202   /** Get global coordinates cooresponding to a rec point. 
203       @param p   Reconstructed point.
204       @param pos On return, the position */
205   virtual void GetGlobal(const AliRecPoint* p, TVector3& pos) const;
206   /** Check if particle will hit an active detector element.  Note
207       done yet. 
208       @param particle Track 
209       @return @c true if @a particle will hit this detector */
210   virtual Bool_t Impact(const TParticle* particle) const;
211   /** Declare alignable volumes */
212   virtual void SetAlignableVolumes() const;
213 protected:
214   Bool_t        fIsInitialized; // Whether singleton is initalized
215   AliFMDRing*   fInner;         // Inner ring geometry information
216   AliFMDRing*   fOuter;         // Outer ring geometry information
217   AliFMD1*      fFMD1;          // FMD1 geometry information
218   AliFMD2*      fFMD2;          // FMD2 geometry information
219   AliFMD3*      fFMD3;          // FMD3 geometry information
220   Bool_t        fUseFMD1;       // Wheter to Use FMD1 or not
221   Bool_t        fUseFMD2;       // Wheter to Use FMD2 or not
222   Bool_t        fUseFMD3;       // Wheter to Use FMD3 or not
223   static AliFMDGeometry* fgInstance; // Singleton instance 
224   /** CTOR */
225   AliFMDGeometry();
226   /** Copy CTOR
227       @param other To copy from  */
228   AliFMDGeometry(const AliFMDGeometry& other);
229   /** Assignment operator 
230       @param other To assig from
231       @return reference to this.  */
232   AliFMDGeometry& operator=(const AliFMDGeometry& other);
233   virtual ~AliFMDGeometry() {}
234   
235   AliFMDGeometryBuilder* fBuilder; // Geometry builder 
236   Int_t fDetectorOff;              // Detector off-set 
237   Int_t fModuleOff;                // Module off-set 
238   Int_t fRingOff;                  // ring offset
239   Int_t fSectorOff;                // Sector offset    
240   TArrayI fActive;                 // Active volumes
241   Bool_t fDetailed;                // Whether to make detailed geom
242   Bool_t fUseAssembly;             // Whther to use assemblies 
243
244   ClassDef(AliFMDGeometry,1); // Geometry parameters and manager 
245 };
246
247
248 #endif
249 //____________________________________________________________________
250 //
251 // Local Variables:
252 //   mode: C++
253 // End:
254 //
255 // EOF
256 //