Initialization of some data members. Copy constructor and assignment operators made...
[u/mrichter/AliRoot.git] / FMD / AliFMD.h
1 #ifndef ALIFMD_H
2 #define ALIFMD_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 /** @mainpage ALICE FMD Off-line code 
11
12     @section intro Introduction:
13
14     This file contains a short overview of the FMD code.   It is by no 
15     means authoritative  - only the code is good for that.  However,
16     I'll try to explain things a bit here. 
17
18     @section structure Structure:
19
20     There are 4 libraries build for the FMD.  These are 
21
22     - libFMDbase: This contains the basic stuff, like data classes and
23       managers.
24     - libFMDsim: This contains code used by the simulation only.  That
25       includes the detector class AliFMD and it's derivatives.  It
26       also contains the code for building the geometry, as well as the
27       digitisers and raw data writer.
28     - libFMDrec: Code needed for the reconstruction.  This include the
29       reconstruction code itself, as well as a raw data reader.
30     - libFMDutil: This is a special library that contains various
31       utility classes for the FMD expert/developer/tester.  It
32       includes code to read all data produced by the FMD, a simple
33       event display, and code to make fake calibration and alignment
34       data.  This library is @e not loaded by aliroot
35       automatically. The user has to load it herself:
36       @code 
37       gSystem->Load("libFMDutil.so");
38       @endcode
39     The content of these libraries is detailed more below. 
40
41     @subsection base libFMDbase:
42
43     This currently (18th or March 2006) contains the classes 
44
45     - AliFMDBaseDigit, AliFMDDigit, AliFMDSDigit: Base class for
46       digits, real digits, and summable digits.  The are all data
47       classes that holds the ADC value(s) for a single strip.
48     - AliFMDBoolMap: A map of booleans, one for each strip.
49     - AliFMDUShortMap: A map of unsigned short integers, one for each
50       strip.
51     - AliFMDDetector, AliFMD1, AliFMD2, AliFMD3: 3 classes that holds
52       the parameters for each of the 3 FMD sub-detectors.  These
53       derive from AliFMDDetector, and are managed by AliFMDGeometry.
54       Each of these also contains the translation from sensor
55       reference frame to global reference frame.
56     - AliFMDRing: Parameters for the FMD rings (inner and outer type).
57       These are managed by AliFMDGeometry.
58     - AliFMDGeometry: Manager of FMD geometry data. All code queries
59       this manager for geometry parameters, so that the data is always
60       consistent.  
61     - AliFMDParameters: Manager of FMD parameters, like calibration
62       parameters.  This class fetches data from CDB if necessary.
63       All code queries this manager for parameters, so that the data
64       is always consistent. 
65     - AliFMDCalibPedestal, AliFMDCalibGain, AliFMDCalibSampleRate,
66       AliFMDAltroMapping: Containers of calibration parameters.  These
67       correspond to the pedestal and its width, the gain of each
68       strip, the oversampling rate used in read-out, and the map from
69       hardware address to detector.
70     - AliFMDAltroIO, AliFMDAltroReader, AliFMDAltroWriter: Low-level
71       classes to do input/output on ALTRO formated buffers. 
72
73   
74
75     @subsection sim libFMDsim:
76
77     This currently (18th or March 2006) contains the classes 
78
79     - AliFMDEdepMap: Cache of energy deposited and total number of
80       hits for each strip.  The digitiser AliFMDDigitizer uses this to
81       store simulation data before making digits.
82     - AliFMDHit: A hit in the FMD active elements, as described by the
83       simulation back-end during transport.
84     - AliFMD, AliFMDv0, AliFMDv1: Simulation drivers for the FMD.
85       AliFMD is the base class. AliFMDv0 corresponds to a simulation
86       where no hits are created, but the material distribution is
87       right.  AliFMDv1 is like AliFMDv0, except that hits are
88       produced.
89     - AliFMDGeometryBuilder: Build the FMD geometry in terms of TGeo
90       objects.  The information for building the geometry is retrieved
91       from AliFMDGeometry.
92     - AliFMDBaseDigitizer, AliFMDDigitizer, AliFMDSDigitizer: Base
93       class for the digitisers.  AliFMDDigitizer makes `real' digits
94       (AliFMDDigit) from hits, and AliFMDSDigitizer makes summable
95       digits from hits.
96     - AliFMDRawWriter: Writes a pseudo raw data file from the digits
97       created by the digitisers.  It uses the AliFMDAltroMapping from
98       AliFMDParameters to make the mapping from detector coordinates
99       to hardware addresses.
100
101     @subsection rec libFMDrec:
102
103     This currently (18th or March 2006) contains the classes 
104
105     - AliFMDReconstructor: Reconstruct (in a naiive way) the charged
106       particle multiplicity in the FMD strips.  This also writes an
107       AliESDFMD object to the ESD files (that class is in libESD).
108
109     - AliFMDRecPoint: Reconstructed point in the FMD.  These objects
110       are made AliFMDReconstructor. 
111
112     - AliFMDRawReader: Classes to read raw data files. 
113
114     @subsection util libFMDutil:
115
116     This currently (18th or March 2006) contains the classes 
117
118     - AliFMDInput, AliFMDInputHits, AliFMDInputDigits,
119       AliFMDInputSDigits, AliFMDInputRecPoints: Base class, and
120       concrete classes to read in FMD generated data.  These provide a
121       simple and unified way of getting the data.  Hooks are defined
122       to process hits, tracks, digits, and reconstructed points, as
123       well as geometry and ESD data.   See for example the scripts
124       @c DrawHits.C, @c DrawHitsDigits.C, @c DrawHitsRecs.C, @c
125       DrawDigitsRecs.C in the @c FMD/scripts sub-directory.
126
127     - AliFMDDisplay: Simple event display for FMD data, including
128       hits, digits, reconstructed points and ESD data. 
129
130     - AliFMDCalibFaker, AliFMDAlignFaker: Classes to write fake (or
131       dummy) calibration and alignment  data.  These derive from
132       TTask.  
133
134     @section authors Authors:
135
136     - Alla Maevskaya            <Alla.Maevskaia@cern.ch>        
137     - Christian Holm Christensen        <cholm@nbi.dk>
138 */
139 /** @defgroup FMD_sim Simulation */
140
141 //____________________________________________________________________
142 //
143 //  Manager class for the FMD - Base class.
144 //  AliFMDv1, AliFMDv0, and AliFMDAlla 
145 //  provides concrete implementations. 
146 //  This class is sooooo crowded
147 //
148 #ifndef ALIDETECTOR_H  
149 # include <AliDetector.h>
150 #endif
151 #ifndef ROOT_TBranch
152 # include <TBranch.h>
153 #endif
154 class TBranch;
155 class TClonesArray;
156 class TBrowser;
157 class TMarker3DBox;
158 class AliDigitizer;
159 class AliFMDHit;
160
161 //____________________________________________________________________
162 /** @class AliFMD AliFMD.h <FMD/AliFMD.h>
163     @brief Forward Multiplicity Detector based on Silicon wafers. 
164     This class is the driver for especially simulation. 
165
166     The Forward Multiplicity Detector consists of 3 sub-detectors FMD1,
167     FMD2, and FMD3, each of which has 1 or 2 rings of silicon sensors. 
168                                                           
169     This is the base class for all FMD manager classes. 
170                        
171     The actual code is done by various separate classes.   Below is
172     diagram showing the relationship between the various FMD classes
173     that handles the simulation
174
175     @verbatim
176           +----------+   +----------+   
177           | AliFMDv1 |   | AliFMDv0 |   
178           +----------+   +----------+   
179                |              |                    +-----------------+
180           +----+--------------+                 +--| AliFMDDigitizer |
181           |                                     |  +-----------------+
182           |           +---------------------+   |
183           |        +--| AliFMDBaseDigitizer |<--+
184           V     1  |  +---------------------+   |
185      +--------+<>--+                            |  +------------------+
186      | AliFMD |                                 +--| AliFMDSDigitizer |    
187      +--------+<>--+                               +------------------+       
188                1  |  +---------------------+
189                   +--| AliFMDReconstructor |
190                      +---------------------+
191     @endverbatim
192                      
193     -  AliFMD 
194        This defines the interface for the various parts of AliROOT that
195        uses the FMD, like AliFMDSimulator, AliFMDDigitizer, 
196        AliFMDReconstructor, and so on. 
197     -  AliFMDv0
198        This is a concrete implementation of the AliFMD interface. 
199        It is the responsibility of this class to create the FMD
200        geometry.
201     -  AliFMDv1 
202        This is a concrete implementation of the AliFMD interface. 
203        It is the responsibility of this class to create the FMD
204        geometry, process hits in the FMD, and serve hits and digits to
205        the various clients. 
206     -  AliFMDSimulator
207        This is the base class for the FMD simulation tasks.   The
208        simulator tasks are responsible to implment the geoemtry, and
209        process hits. 
210     -  AliFMDReconstructor
211        This is a concrete implementation of the AliReconstructor that
212        reconstructs pseudo-inclusive-multiplicities from digits (raw or
213        from simulation)
214
215     Calibration and geometry parameters are managed by separate
216     singleton managers.  These are AliFMDGeometry and
217     AliFMDParameters.  Please refer to these classes for more
218     information on these.    
219  */
220 class AliFMD : public AliDetector 
221 {
222 public:
223   /** Default constructor.  Do not use. */
224   AliFMD();
225   /** Normal constructor 
226       @param name  Name of object.
227       @param title Title of object. */
228   AliFMD(const char *name, const char *title);
229   /** Copy constructor 
230       @param other Object to copy from */
231   AliFMD(const AliFMD& other);
232   /** Destructor */
233   virtual ~AliFMD(); 
234   /** Assignment operator 
235       @param other Object to assign from
236       @return Reference to this object  */
237   AliFMD& operator=(const AliFMD& other);
238   /** Wheter to make a detailed geometry
239       @param use If true, make detailed geometry  */
240   void UseDetailed(Bool_t use=kTRUE) { fDetailed = use; }
241   
242   /** @{*/
243   /** @name GEometry ANd Tracking (GEANT :-) */
244   /** Define the geometry.  This is done by asking the manager
245       AliFMDGeometry to construct the geometry.  This in turn calls
246       AliFMDGeometryBuilder.   */
247   virtual void   CreateGeometry();
248   /** Create the tracking mediums used by the FMD.  This associates
249       the tracking mediums defined with the FMD in the
250       TVirtualMCApplication (AliMC). 
251       
252       The defined mediums are 
253       - @c FMD @c Si$   Silicon (active medium in sensors)
254       - @c FMD @c C$    Carbon fibre (support cone for FMD3 and vacuum pipe)
255       - @c FMD @c Al$   Aluminium (honeycomb support plates)
256       - @c FMD @c PCB$  Printed Circuit Board (FEE board with VA1_3)
257       - @c FMD @c Chip$ Electronics chips (currently not used)
258       - @c FMD @c Air$  Air (Air in the FMD)
259       - @c FMD @c Plastic$ Plastic (Support legs for the hybrid cards)
260   */
261   virtual void   CreateMaterials(); 
262   /** Initialize this detector */
263   virtual void   Init();
264   /** This member function is called when ever a track deposites
265       energy (or similar) in an FMD tracking medium.  In this base
266       class this member function is pure abstract.   In concrete
267       sub-classes, the member function may make hits or other
268       stuff. */ 
269   virtual void   StepManager() = 0;
270   /** Called at the end of each simulation event.  If the debug level
271       is high enough a list of @e bad hits is printed. */
272   virtual void   FinishEvent();
273   /** @}*/
274   
275   /** @{*/
276   /** @name Graphics and event display */
277   /** Build simple ROOT TNode geometry for event display. With the new
278       geometry modeller, TGeoManager, this seems rather redundant. */
279   virtual        void   BuildGeometry();
280   /** Draw a shaded view of the Forward multiplicity detector.  This 
281       isn't really useful anymore. */
282   virtual        void   DrawDetector();
283   /** Calculate the distance from the mouse to the FMD on the screen
284       Dummy routine */
285   virtual        Int_t  DistanceToPrimitive(Int_t px, Int_t py);
286   /** Store x, y, z of all hits in memory for display. 
287       Normally, the hits are drawn using TPolyMarker3D - however, that
288       is not very useful for the FMD.  Therefor, this member function
289       is overloaded to make TMarker3D, via the class AliFMDPoints.
290       AliFMDPoints is a local class. 
291       @param track the track number to load the hits for */
292   virtual        void   LoadPoints(Int_t track);
293   /** @}*/
294   
295   /** @{ */
296   /** @name Hit and digit management */
297   /* Create Tree branches for the FMD.
298      @param opt  One of 
299      - @c H Make a branch of TClonesArray of AliFMDHit's
300      - @c D Make a branch of TClonesArray of AliFMDDigit's
301      - @c S Make a branch of TClonesArray of AliFMDSDigit's */
302   virtual void          MakeBranch(Option_t *opt=" ");
303   /** Set the TClonesArray to read hits into.
304       @param b The branch to containn the hits */
305   virtual void          SetHitsAddressBranch(TBranch *b);
306   /** Set branch address for the Hits, Digits, and SDigits Tree. */
307   virtual void          SetTreeAddress();
308   /** Get the array of summable digits
309       @return summable digits */
310   virtual TClonesArray* SDigits() { return fSDigits; }        
311   /** Reset the array of summable digits */
312   virtual void          ResetSDigits();
313   /** Add a hit to the hits tree 
314       @param  track  Track #
315       @param  ivol Volume parameters, interpreted as 
316       - ivol[0]  [UShort_t ] Detector # 
317       - ivol[1]  [Char_t   ] Ring ID 
318       - ivol[2]  [UShort_t ] Sector #
319       - ivol[3]  [UShort_t ] Strip # 
320       @param hits Hit information 
321       - hits[0]  [Float_t  ] Track's X-coordinate at hit 
322       - hits[1]  [Float_t  ] Track's Y-coordinate at hit
323       - hits[3]  [Float_t  ] Track's Z-coordinate at hit
324       - hits[4]  [Float_t  ] X-component of track's momentum             
325       - hits[5]  [Float_t  ] Y-component of track's momentum             
326       - hits[6]  [Float_t  ] Z-component of track's momentum            
327       - hits[7]  [Float_t  ] Energy deposited by track                  
328       - hits[8]  [Int_t    ] Track's particle Id # 
329       - hits[9]  [Float_t  ] Time when the track hit */
330   virtual void          AddHit(Int_t track, Int_t *vol, Float_t *hits);
331   /** Add a hit to the list
332       @param track     Track #
333       @param detector  Detector # (1, 2, or 3)                      
334       @param ring      Ring ID ('I' or 'O')
335       @param sector    Sector # (For inner/outer rings: 0-19/0-39)
336       @param strip     Strip # (For inner/outer rings: 0-511/0-255)
337       @param x         Track's X-coordinate at hit
338       @param y         Track's Y-coordinate at hit
339       @param z         Track's Z-coordinate at hit
340       @param px        X-component of track's momentum 
341       @param py        Y-component of track's momentum
342       @param pz        Z-component of track's momentum
343       @param edep      Energy deposited by track
344       @param pdg       Track's particle Id #
345       @param t         Time when the track hit 
346       @param l         Track length through the material. 
347       @param stop      Whether track was stopped or disappeared */
348   virtual AliFMDHit*    AddHitByFields(Int_t    track, 
349                                        UShort_t detector, 
350                                        Char_t   ring, 
351                                        UShort_t sector, 
352                                        UShort_t strip, 
353                                        Float_t  x=0,
354                                        Float_t  y=0, 
355                                        Float_t  z=0,
356                                        Float_t  px=0, 
357                                        Float_t  py=0, 
358                                        Float_t  pz=0,
359                                        Float_t  edep=0,
360                                        Int_t    pdg=0,
361                                        Float_t  t=0, 
362                                        Float_t  len=0, 
363                                        Bool_t   stopped=kFALSE);
364   /** Add a digit to the Digit tree 
365       @param digits
366       - digits[0]  [UShort_t] Detector #
367       - digits[1]  [Char_t]   Ring ID
368       - digits[2]  [UShort_t] Sector #
369       - digits[3]  [UShort_t] Strip #
370       - digits[4]  [UShort_t] ADC Count 
371       - digits[5]  [Short_t]  ADC Count, -1 if not used
372       - digits[6]  [Short_t]  ADC Count, -1 if not used 
373       @param notused Not used */
374   virtual        void   AddDigit(Int_t *digits, Int_t* notused=0);
375   /** add a real digit
376       @param detector  Detector # (1, 2, or 3)                      
377       @param ring         Ring ID ('I' or 'O')
378       @param sector       Sector # (For inner/outer rings: 0-19/0-39)
379       @param strip        Strip # (For inner/outer rings: 0-511/0-255)
380       @param count1    ADC count (a 10-bit word)
381       @param count2    ADC count (a 10-bit word), or -1 if not used
382       @param count3    ADC count (a 10-bit word), or -1 if not used */
383   virtual        void   AddDigitByFields(UShort_t detector=0, 
384                                          Char_t   ring='\0', 
385                                          UShort_t sector=0, 
386                                          UShort_t strip=0, 
387                                          UShort_t count1=0, 
388                                          Short_t  count2=-1, 
389                                          Short_t  count3=-1);
390   /** Add a digit to the Digit tree 
391       @param digits
392       - digits[0]  [UShort_t] Detector #
393       - digits[1]  [Char_t]   Ring ID
394       - digits[2]  [UShort_t] Sector #
395       - digits[3]  [UShort_t] Strip #
396       - digits[4]  [UShort_t] ADC Count 
397       - digits[5]  [Short_t]  ADC Count, -1 if not used
398       - digits[6]  [Short_t]  ADC Count, -1 if not used  */
399   virtual        void   AddSDigit(Int_t *digits);
400   /** add a summable digit - as coming from data
401       @param detector  Detector # (1, 2, or 3)                      
402       @param ring         Ring ID ('I' or 'O')
403       @param sector       Sector # (For inner/outer rings: 0-19/0-39)
404       @param strip        Strip # (For inner/outer rings: 0-511/0-255)
405       @param count1    ADC count (a 10-bit word)
406       @param count2    ADC count (a 10-bit word), or -1 if not used */
407   virtual        void   AddSDigitByFields(UShort_t detector=0, 
408                                           Char_t   ring='\0', 
409                                           UShort_t sector=0, 
410                                           UShort_t strip=0, 
411                                           Float_t  edep=0,
412                                           UShort_t count1=0, 
413                                           Short_t  count2=-1, 
414                                           Short_t  count3=-1);
415   /** @}*/
416
417   /** @{ */
418   /** @name Digitisation */
419   /** Create a digitizer object
420       @param manager Digitization manager
421       @return a newly allocated AliFMDDigitizer */
422   virtual AliDigitizer* CreateDigitizer(AliRunDigitizer* manager) const;
423   /** Create AliFMDDigit's from AliFMDHit's.  This is done by creating
424       an AliFMDDigitizer object, and executing it.  */
425   virtual        void   Hits2Digits();
426   /** Create AliFMDSDigit's from AliFMDHit's.  This is done by creating
427       an AliFMDSDigitizer object, and executing it.  */
428   virtual        void   Hits2SDigits();
429   /** @}*/
430
431   /** @{ */
432   /** @name Raw data */
433   /** Turn digits into raw data. This uses the class AliFMDRawWriter
434       to do the job.   Please refer to that class for more
435       information. */
436   virtual        void   Digits2Raw();
437   /** @}*/
438
439   /** @{ */
440   /** @name Utility */
441   /** Browse this object 
442       @param b Browser to show this object in */
443   void   Browse(TBrowser* b);
444   /** @}*/
445 protected:
446   /** Initialize hit array if not already done, and return pointert. 
447       @return Hit array */
448   TClonesArray*      HitsArray();
449   /** Initialize digit array if not already done, and return pointert. 
450       @return Digit array */
451   TClonesArray*      DigitsArray();
452   /** Initialize summable digit array if not already done, and return
453       pointert.  
454       @return Summable digit array */
455   TClonesArray*      SDigitsArray();
456
457   TClonesArray*      fSDigits;              // Summable digits
458   Int_t              fNsdigits;             // Number of digits  
459   Bool_t             fDetailed;             // Use detailed geometry
460   Bool_t             fUseOld;               // Use old approx geometry
461   Bool_t             fUseAssembly;          // Use divided volumes
462   
463   enum {
464     kSiId,                 // ID index of Si medium
465     kAirId,                // ID index of Air medium
466     kPlasticId,            // ID index of Plastic medium
467     kPcbId,                // ID index of PCB medium
468     kSiChipId,             // ID index of Si Chip medium
469     kAlId,                 // ID index of Al medium
470     kCarbonId,             // ID index of Carbon medium
471     kCopperId,             // ID index of Copper Medium
472     kKaptonId              // ID index of Kapton Medium
473   };  
474
475   TObjArray*         fBad;                  //! debugging - bad hits 
476   
477   ClassDef(AliFMD,11)     // Base class FMD entry point
478 };
479
480 #endif
481 //____________________________________________________________________
482 //
483 // Local Variables:
484 //   mode: C++
485 // End:
486 //
487 // EOF
488 //