1 #ifndef ALIFMDGEOMETRY_H
2 #define ALIFMDGEOMETRY_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
6 * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
8 * See cxx source for full Copyright notice
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
15 //____________________________________________________________________
17 // Forward Multiplicity Detector based on Silicon wafers.
19 // This class is a singleton that handles the geometry parameters of
21 // The actual code is done by various separate classes.
24 # include <AliGeometry.h>
29 #ifndef ROOT_TMatrixFfwd
30 # include <TMatrixFfwd.h>
40 class AliFMDGeometryBuilder;
43 //__________________________________________________________________
44 /** @brief Singleton object of FMD geometry descriptions and parameters.
45 This class is a singleton that handles the geometry parameters of
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
55 +----------------+<>--+ |
57 +----------------+<>--+ V 1..2
58 3 | +----------------+
63 +-------------+-------------+
65 +---------+ +---------+ +---------+
66 | AliFMD1 | | AliFMD2 | | AliFMD3 |
67 +---------+ +---------+ +---------+
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.
83 class AliFMDGeometry : public AliGeometry
91 static AliFMDGeometry* Instance();
93 * Initialize the the singleton if not done so already
97 * Find all local <-> global transforms
99 virtual void InitTransformations(Bool_t force=kFALSE);
101 * @return Get inner description
103 AliFMDRing* GetInner() const { return fInner; }
105 * @return Get outer description
107 AliFMDRing* GetOuter() const { return fOuter; }
109 * @return Get FMD1 description
111 AliFMD1* GetFMD1() const { return (fUseFMD1 ? fFMD1 : 0); }
113 * @return Get FMD2 description
115 AliFMD2* GetFMD2() const { return (fUseFMD2 ? fFMD2 : 0); }
117 * @return Get FMD3 description
119 AliFMD3* GetFMD3() const { return (fUseFMD3 ? fFMD3 : 0); }
121 * Get description of a sub-detector
123 * @param i Sub-detector #
124 * @return Description of sub-detector, or 0
126 AliFMDDetector* GetDetector(Int_t i) const;
128 * Get description of a ring, i should be one of 'I' or 'O' (case
129 * insensitive). If an invalid parameter is passed, 0 (NULL) is
133 * @return Description of ring, or 0
135 AliFMDRing* GetRing(Char_t i) const;
137 * Disable the ith detector
139 * @param i IF true, disable sub-detector @a i
141 void Disable(Int_t i);
143 * Enable the ith detector
145 * @param i IF true, enable sub-detector @a i
147 void Enable(Int_t i);
149 * @return Density @f$ \rho@f$ of silicon
151 Double_t GetSiDensity() const { return 2.33; }
153 * Translate detector coordinates (detector, ring, sector, strip)
154 * to spatial coordinates (x, y, z) in the master reference frame
155 * of ALICE. The member function uses the transformations
156 * previously obtained from the TGeoManager.
158 * @param detector Detector number
159 * @param ring Ring id
160 * @param sector Sector number
161 * @param strip Strip number
162 * @param x On return, X coordinate
163 * @param y On return, Y coordinate
164 * @param z On return, Z coordinate
166 void Detector2XYZ(UShort_t detector, Char_t ring,
167 UShort_t sector, UShort_t strip,
168 Double_t& x, Double_t& y, Double_t& z) const;
170 * Translate spatial coordinates (x,y,z) in the master reference
171 * frame of ALICE to the detector coordinates (detector, ring,
172 * sector, strip). Note, that if this method is to be used in
173 * reconstruction or the like, then the input z-coordinate should
174 * be corrected for the events interactions points z-coordinate,
177 * geom->XYZ2Detector(x,y,z-ipz,d,r,s,t);
180 * @param x X coordinate
181 * @param y Y coordinate
182 * @param z Z coordinate
183 * @param detector On return, Detector number
184 * @param ring On return, Ring id
185 * @param sector On return, Sector number
186 * @param strip On return, Strip number
187 * @return @c false of (@a x, @a y, @a z) is not within this
190 Bool_t XYZ2Detector(Double_t x, Double_t y, Double_t z,
191 UShort_t& detector, Char_t& ring,
192 UShort_t& sector, UShort_t& strip) const;
194 * Make the geometry. This delegates to AliFMDGeometryBuilder
198 * @return Get detector offset in paths
200 Int_t GetDetectorOff() const { return fDetectorOff; }
202 * @return Get sensor offset in paths
204 Int_t GetModuleOff() const { return fModuleOff; }
206 * @return Get ring offset in paths
208 Int_t GetRingOff() const { return fRingOff; }
210 * @return Get ring sector in paths
212 Int_t GetSectorOff() const { return fSectorOff; }
214 * @param off Detector off-set set in geometry path
216 void SetDetectorOff(Int_t off) { fDetectorOff = off; }
218 * @param off Module off-set set in geometry path
220 void SetModuleOff(Int_t off) { fModuleOff = off; }
222 * @param off Ring off-set set in geometry path
224 void SetRingOff(Int_t off) { fRingOff = off; }
226 * @param off Sectord off-set set in geometry path
228 void SetSectorOff(Int_t off) { fSectorOff = off; }
230 * Check if volume @a vol is marked as active
232 * @param vol Volume ID
233 * @return @c true if @a vol is declared active
235 Bool_t IsActive(Int_t vol) const;
239 * @param active Active volume id array
240 * @param n elements of @a active
242 void SetActive(Int_t* active, Int_t n);
244 * Add an active volume
246 * @param id Register volume @a id to be active
248 void AddActive(Int_t id);
250 * Get Array of active volume numbers
252 * @return constant reference to active volume numbers
254 const TArrayI& ActiveIds() const { return fActive; }
256 * Set an external geometry builder
258 * @param b Geometry builder
260 void SetBuilder(AliFMDGeometryBuilder* b) { fBuilder = b; }
262 * Check the volume depth of some nodes, get the active volume
263 * numbers, and so forth.
265 * @todo Here, we should actually also get the parameters of the
266 * shapes, like the verticies of the polygon shape that makes up the
267 * silicon sensor, the strip pitch, the ring radii, the z-positions,
268 * and so on - that is, all the geometric information we need for
269 * futher processing, such as simulation, digitization,
270 * reconstruction, etc.
272 void ExtractGeomInfo();
274 * Whether we are to use a detailed geometry or not
276 * @param det if @c true, make a detailed geometry.
278 void SetDetailed(Bool_t det) { fDetailed = det; }
280 * @return @c true if geometry is detailed
282 Bool_t IsDetailed() const { return fDetailed; }
284 * @param ass Whether to use assemblies or not
286 void UseAssembly(Bool_t ass) { fUseAssembly = ass; }
288 // AliGeometry member functions
290 * Get global coordinates cooresponding to a rec point.
292 * @param p Reconstructed point.
293 * @param pos On return, the position
294 * @param mat On return, the material at @a post
296 virtual void GetGlobal(const AliRecPoint* p, TVector3& pos,
297 TMatrixF& mat) const;
299 * Get global coordinates cooresponding to a rec point.
301 * @param p Reconstructed point.
302 * @param pos On return, the position
304 virtual void GetGlobal(const AliRecPoint* p, TVector3& pos) const;
306 * Check if particle will hit an active detector element.
308 * @todo implement this function
310 * @param particle Track
311 * @return @c true if @a particle will hit this detector
313 virtual Bool_t Impact(const TParticle* particle) const;
315 * Declare alignable volumes
317 virtual void SetAlignableVolumes() const;
321 * Service function to convert Cartisean XYZ to r, eta, phi, and theta.
323 * Note, that the z input should be corrected for the vertex location
326 * @param x Cartisean X coordinate
327 * @param y Cartisean Y coordinate
328 * @param z Cartisean Z coordinate
329 * @param r On return, the radius
330 * @param eta On return, the pseudo-rapidity
331 * @param phi On return, the azimuthal angle
332 * @param theta On return, the polar angle;
334 * @return kTRUE on success, kFALSE in case of problems
336 static Bool_t XYZ2REtaPhiTheta(Double_t x, Double_t y,
338 Double_t& r, Double_t& eta,
339 Double_t& phi, Double_t& theta);
342 Bool_t fIsInitialized; // Whether singleton is initalized
343 AliFMDRing* fInner; // Inner ring geometry information
344 AliFMDRing* fOuter; // Outer ring geometry information
345 AliFMD1* fFMD1; // FMD1 geometry information
346 AliFMD2* fFMD2; // FMD2 geometry information
347 AliFMD3* fFMD3; // FMD3 geometry information
348 Bool_t fUseFMD1; // Wheter to Use FMD1 or not
349 Bool_t fUseFMD2; // Wheter to Use FMD2 or not
350 Bool_t fUseFMD3; // Wheter to Use FMD3 or not
351 Bool_t fIsInitTrans; // Transforms initialised?
352 static AliFMDGeometry* fgInstance; // Singleton instance
360 * @param name Not used
362 AliFMDGeometry(const char* name);
366 * @param other To copy from
368 AliFMDGeometry(const AliFMDGeometry& other);
370 * Assignment operator
372 * @param other To assig from
373 * @return reference to this.
375 AliFMDGeometry& operator=(const AliFMDGeometry& other);
379 virtual ~AliFMDGeometry() {}
381 AliFMDGeometryBuilder* fBuilder; // Geometry builder
382 Int_t fDetectorOff; // Detector off-set
383 Int_t fModuleOff; // Module off-set
384 Int_t fRingOff; // ring offset
385 Int_t fSectorOff; // Sector offset
386 TArrayI fActive; // Active volumes
387 Bool_t fDetailed; // Whether to make detailed geom
388 Bool_t fUseAssembly; // Whther to use assemblies
390 ClassDef(AliFMDGeometry,1); // Geometry parameters and manager
395 //____________________________________________________________________