b8e68912ba8d37a3a05eb959c7f95515f27a2ddc
[u/mrichter/AliRoot.git] / FMD / AliFMDParameters.h
1 #ifndef ALIFMDPARAMETERS_H
2 #define ALIFMDPARAMETERS_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 //____________________________________________________________________
11 //
12 //  Singleton class to handle various parameters (not geometry) of the
13 //  FMD
14 //  Should get ata fromm Conditions DB.
15 //
16 /** @file    AliFMDParameters.h
17     @author  Christian Holm Christensen <cholm@nbi.dk>
18     @date    Mon Mar 27 12:44:43 2006
19     @brief   Manager of FMD parameters
20 */
21 #ifndef ROOT_TNamed
22 # include <TNamed.h>
23 #endif
24 #ifndef ROOT_TArrayI
25 # include <TArrayI.h>
26 #endif
27 #ifndef ALIFMDUSHORTMAP_H
28 # include <AliFMDUShortMap.h>
29 #endif
30 #ifndef ALIFMDBOOLMAP_H
31 # include <AliFMDBoolMap.h>
32 #endif
33 typedef AliFMDUShortMap AliFMDCalibZeroSuppression;
34 typedef AliFMDBoolMap   AliFMDCalibDeadMap;
35 class AliFMDCalibPedestal;
36 class AliFMDCalibGain;
37 class AliFMDCalibSampleRate;
38 class AliFMDCalibStripRange;
39 class AliFMDAltroMapping;
40 //____________________________________________________________________
41 //
42 //  Singleton class to handle various parameters (not geometry) of the
43 //  FMD
44 //  Should get ata fromm Conditions DB.
45 //
46
47 /** @brief This class is a singleton that handles various parameters
48     of the FMD detectors.  
49     This class reads from the Conditions DB to get the various
50     parameters, which code can then request from here. In that way,
51     all code uses the same data, and the interface is consistent.
52      
53     Some of the parameter managed are 
54     - @c fPedestal, @c fPedestalWidth
55       Mean and width of the pedestal.  The pedestal is simulated
56       by a Guassian, but derived classes my override MakePedestal
57       to simulate it differently (or pick it up from a database).
58     - @c fVA1MipRange
59       The dymamic MIP range of the VA1_ALICE pre-amplifier chip 
60     - @c fAltroChannelSize
61       The largest number plus one that can be stored in one
62       channel in one time step in the ALTRO ADC chip. 
63     - @c fSampleRate
64       How many times the ALTRO ADC chip samples the VA1_ALICE
65       pre-amplifier signal.   The VA1_ALICE chip is read-out at
66       10MHz, while it's possible to drive the ALTRO chip at
67       25MHz.  That means, that the ALTRO chip can have time to
68       sample each VA1_ALICE signal up to 2 times.  Although it's
69       not certain this feature will be used in the production,
70       we'd like have the option, and so it should be reflected in
71       the code.
72
73     @ingroup FMD_base
74 */
75 class AliFMDParameters : public TNamed
76 {
77 public:
78   /** Enumeration of things to initialize */ 
79   enum What { 
80     /** Pulser gain */ 
81     kPulseGain = 0x1, // Pulser gain 
82     /** Pedestals and noise */ 
83     kPedestal = 0x2, // Pedestal and noise 
84     /** Dead channel map */ 
85     kDeadMap = 0x4, // Dead channel map
86     /**  Over sampling rate */ 
87     kSampleRate = 0x8, // Over sampling rate 
88     /** Zero suppression parameters */ 
89     kZeroSuppression = 0x10, // Zero suppression parameters 
90     /** ALTRO data map */ 
91     kAltroMap = 0x20 // Altro channel map
92   };
93   
94   /** Singleton access
95       @return  single to */
96   static AliFMDParameters* Instance();
97
98   /** Initialize the manager.  This tries to read the parameters from
99       CDB.  If that fails, the class uses the hard-coded parameters. 
100    */
101   void Init(Bool_t forceReInit=kFALSE, 
102             UInt_t what = (kPulseGain|kPedestal|kDeadMap|kSampleRate|
103                            kZeroSuppression|kAltroMap));
104   /** Print all parameters. 
105       @param option Option string */
106   void Print(Option_t* option="A") const;
107   /** Draw parameters. 
108       @param option What to draw. Should be one of 
109       - dead      Dead channels
110       - threshold Threshold
111       - gain      Gain
112       - pedestal  Pedestal
113       - noise     Noise (or pedestal width)
114       - zero      Zero suppression
115       - rate      Sampling rate (VA1 clock / ALTRO clock)
116       - min       Minimum strip read out
117       - max       Maximum strip read out
118       - map       hardware address
119   */
120   void Draw(Option_t* option="pedestal");
121   
122   /** @{ */
123   /** @name Set various `Fixed' parameters */
124   /** @param r How many MIP signals we can fit in the VA1
125       pre-amps. (default and design is 20) */
126   void SetVA1MipRange(UShort_t r=20)          { fVA1MipRange = r; }
127   /** @param s Maximum number of the ADC (ALTRO).  This is a 10 bit
128       ADC so, the maximum number is 1024 */
129   void SetAltroChannelSize(UShort_t s=1024)   { fAltroChannelSize = s;}
130   /** @param size The number of strips multiplexed into one ALTRO
131       channel. That is, how many strips is connected to one VA1
132       pre-amp. */
133   void SetChannelsPerAltro(UShort_t size=128) { fChannelsPerAltro = size; }
134   /** @param f Factor to use for accepting a signal. */
135   void SetPedestalFactor(Float_t f=3)         { fPedestalFactor = f; }
136   /** @} */
137
138   /** @{ */
139   /** @name Set various variable parameter defaults */
140   /** @param s Zero suppression threshold in ADC counts */
141   void SetZeroSuppression(UShort_t s=0)       { fFixedZeroSuppression = s; }
142   /** @param r How many times we oversample each strip. */
143   void SetSampleRate(UShort_t r=1)            { fFixedSampleRate = (r>2?2:r);}
144   /** @param p Pedestal value in ADC counts */
145   void SetPedestal(Float_t p=10)              { fFixedPedestal = p; }
146   /** @param w Pedestal width in ADC counts */
147   void SetPedestalWidth(Float_t w=1)          { fFixedPedestalWidth = w; }
148   /** @param t Threshold used for 1 MIP acceptance. */
149   void SetThreshold(Float_t t=0)              { fFixedThreshold = t; }
150   /** Range of strips read out 
151       @param min Minimum strip number (0-127). 
152       @param max Maximum strip number (0-127). */
153   void SetStripRange(UShort_t min=0, UShort_t max=127);
154   /** @} */
155
156   /** @{ */
157   /** @name Get `Fixed' various parameters */
158   /** @return Number of MIP signals that fit inside a VA1 channel  */
159   UShort_t GetVA1MipRange()          const { return fVA1MipRange; }
160   /** @return The maximum count in the ADC */
161   UShort_t GetAltroChannelSize()     const { return fAltroChannelSize; }
162   /** @return Number of strips muliplexed into one ADC channel */
163   UShort_t GetChannelsPerAltro()     const { return fChannelsPerAltro; }
164   /** @return The average energy deposited by one MIP */
165   Float_t  GetEdepMip()              const;
166   /** @return The factor used of signal acceptance */
167   Float_t  GetPedestalFactor()       const { return fPedestalFactor; }
168   /** @} */
169
170   /** @{ */
171   /** @name Get variable parameters */
172   /** Whether the strip is considered dead
173       @param detector Detector # (1-3)
174       @param ring     Ring ID ('I' or 'O')
175       @param sector   Sector number (0-39)
176       @param strip    Strip number (0-511)
177       @return @c true if the strip is considered dead, @c false if
178       it's OK. */
179   Bool_t   IsDead(UShort_t detector, 
180                   Char_t ring, 
181                   UShort_t sector, 
182                   UShort_t strip) const;
183   Float_t  GetThreshold() const;
184   /** Gain of pre-amp. 
185       @param detector Detector # (1-3)
186       @param ring     Ring ID ('I' or 'O')
187       @param sector   Sector number (0-39)
188       @param strip    Strip number (0-511)
189       @return Gain of pre-amp.  */
190   Float_t  GetPulseGain(UShort_t detector, 
191                         Char_t ring, 
192                         UShort_t sector, 
193                         UShort_t strip) const;
194   /** Get mean of pedestal
195       @param detector Detector # (1-3)
196       @param ring     Ring ID ('I' or 'O')
197       @param sector   Sector number (0-39)
198       @param strip    Strip number (0-511)
199       @return Mean of pedestal */
200   Float_t  GetPedestal(UShort_t detector, 
201                        Char_t ring, 
202                        UShort_t sector, 
203                        UShort_t strip) const;
204   /** Width of pedestal
205       @param detector Detector # (1-3)
206       @param ring     Ring ID ('I' or 'O')
207       @param sector   Sector number (0-39)
208       @param strip    Strip number (0-511)
209       @return Width of pedestal */
210   Float_t  GetPedestalWidth(UShort_t detector, 
211                             Char_t ring, 
212                             UShort_t sector, 
213                             UShort_t strip) const;
214   /** zero suppression threshold (in ADC counts)
215       @param detector Detector # (1-3)
216       @param ring     Ring ID ('I' or 'O')
217       @param sector   Sector number (0-39)
218       @param strip    Strip number (0-511)
219       @return zero suppression threshold (in ADC counts) */
220   UShort_t GetZeroSuppression(UShort_t detector, 
221                               Char_t ring, 
222                               UShort_t sector, 
223                               UShort_t strip) const;
224   /** Get the sampling rate
225       @param detector Detector # (1-3)
226       @param ring     Ring ID ('I' or 'O')
227       @param sector   Sector number (0-39)
228       @param strip    Strip number (0-511)
229       @return The sampling rate */
230   UShort_t GetSampleRate(UShort_t detector, 
231                          Char_t ring, 
232                          UShort_t sector, 
233                          UShort_t strip) const;
234   /** Get the minimum strip in the read-out range
235       @param detector Detector # (1-3)
236       @param ring     Ring ID ('I' or 'O')
237       @param sector   Sector number (0-39)
238       @param strip    Strip number (0-511)
239       @return Minimum strip */
240   UShort_t GetMinStrip(UShort_t detector, 
241                        Char_t ring, 
242                        UShort_t sector, 
243                        UShort_t strip) const;
244   /** Get the maximum strip in the read-out range
245       @param detector Detector # (1-3)
246       @param ring     Ring ID ('I' or 'O')
247       @param sector   Sector number (0-39)
248       @param strip    Strip number (0-511)
249       @return Maximum strip */
250   UShort_t GetMaxStrip(UShort_t detector, 
251                        Char_t ring, 
252                        UShort_t sector, 
253                        UShort_t strip) const;
254   /** Translate hardware address to detector coordinates 
255       @param ddl      DDL number 
256       @param board    Board address
257       @param chip     Chip #
258       @param channel  Channel #
259       @param det      On return, Detector # (1-3)
260       @param ring     On return, Ring ID ('I' or 'O')
261       @param sec      On return, Sector number (0-39)
262       @param str      On return, Strip number (0-511)
263       @return @c true on success. */
264   Bool_t   Hardware2Detector(UInt_t ddl,    UInt_t    board, 
265                              UInt_t chip,   UInt_t    channel, 
266                              UShort_t& det, Char_t&   ring, 
267                              UShort_t& sec, UShort_t& str) const;
268   /** Translate hardware address to detector coordinates 
269       @param ddl      DDL number 
270       @param addr     Hardware address
271       @param det      On return, Detector # (1-3)
272       @param ring     On return, Ring ID ('I' or 'O')
273       @param sec      On return, Sector number (0-39)
274       @param str      On return, Strip number (0-511)
275       @return @c true on success. */
276   Bool_t   Hardware2Detector(UInt_t ddl, UInt_t addr, UShort_t& det,
277                              Char_t& ring, UShort_t& sec, UShort_t& str) const;
278
279   /** Translate detector coordinates to hardware address 
280       @param det      Detector # (1-3)
281       @param ring     Ring ID ('I' or 'O')
282       @param sec      Sector number (0-39)
283       @param str      Strip number (0-511)
284       @param ddl      On return, DDL number 
285       @param board    On return, Board address
286       @param chip     On return, Chip #
287       @param channel  On return, Channel #
288       @return @c true on success. */
289   Bool_t   Detector2Hardware(UShort_t det, Char_t ring, 
290                              UShort_t sec, UShort_t str, 
291                              UInt_t& ddl,  UInt_t& board,
292                              UInt_t& chip, UInt_t& channel) const;
293   /** Translate detector coordinates to hardware address 
294       @param det      Detector # (1-3)
295       @param ring     Ring ID ('I' or 'O')
296       @param sec      Sector number (0-39)
297       @param str      Strip number (0-511)
298       @param ddl      On return, DDL number 
299       @param addr     On return, Hardware address
300       @return @c true on success. */
301   Bool_t   Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, 
302                              UShort_t str, UInt_t& ddl, UInt_t& addr) const;
303   /** Get the map that translates hardware to detector coordinates 
304       @return Get the map that translates hardware to detector
305       coordinates */ 
306   AliFMDAltroMapping* GetAltroMap() const;
307   /** @} */
308
309   static const char* PulseGainPath()       { return fgkPulseGain; }
310   static const char* PedestalPath()        { return fgkPedestal; }
311   static const char* DeadPath()            { return fgkDead; }
312   static const char* SampleRatePath()      { return fgkSampleRate; }
313   static const char* AltroMapPath()        { return fgkAltroMap; }
314   static const char* ZeroSuppressionPath() { return fgkZeroSuppression; }
315   static const char* StripRangePath()      { return fgkStripRange; }
316 protected:
317   /** CTOR  */
318   AliFMDParameters();
319   /** CTOR  */
320   AliFMDParameters(const AliFMDParameters& o) 
321     : TNamed(o), 
322       fIsInit(o.fIsInit),
323       fkSiDeDxMip(o.fkSiDeDxMip),
324       fVA1MipRange(o.fVA1MipRange),
325       fAltroChannelSize(o.fAltroChannelSize),
326       fChannelsPerAltro(o.fChannelsPerAltro),
327       fPedestalFactor(o.fPedestalFactor),
328       fFixedPedestal(o.fFixedPedestal),
329       fFixedPedestalWidth(o.fFixedPedestalWidth),
330       fFixedZeroSuppression(o.fFixedZeroSuppression),
331       fFixedSampleRate(o.fFixedSampleRate),
332       fFixedThreshold(o.fFixedThreshold),
333       fFixedMinStrip(o.fFixedMinStrip),
334       fFixedMaxStrip(o.fFixedMaxStrip),
335       fFixedPulseGain(o.fFixedPulseGain),
336       fEdepMip(o.fEdepMip),
337       fZeroSuppression(o.fZeroSuppression),
338       fSampleRate(o.fSampleRate),
339       fPedestal(o.fPedestal),
340       fPulseGain(o.fPulseGain),
341       fDeadMap(o.fDeadMap),
342       fAltroMap(o.fAltroMap),
343       fStripRange(o.fStripRange)
344   {}
345   /** Assignement operator 
346       @return Reference to this */
347   AliFMDParameters& operator=(const AliFMDParameters&) { return *this; }
348   /** DTOR */
349   virtual ~AliFMDParameters() {}
350   /** Singleton instance  */
351   static AliFMDParameters* fgInstance;   // Static singleton instance
352   /** Initialize gains.  Try to get them from CDB */
353   void InitPulseGain();
354   /** Initialize pedestals.  Try to get them from CDB */
355   void InitPedestal();
356   /** Initialize dead map.  Try to get it from CDB */
357   void InitDeadMap();
358   /** Initialize sample rates.  Try to get them from CDB */
359   void InitSampleRate();
360   /** Initialize zero suppression thresholds.  Try to get them from CDB */
361   void InitZeroSuppression();
362   /** Initialize hardware map.  Try to get it from CDB */
363   void InitAltroMap();
364   /** Initialize strip range.  Try to get it from CDB */
365   void InitStripRange();
366
367   Bool_t          fIsInit;               // Whether we've been initialised  
368
369   static const char* fgkPulseGain;       // Path to PulseGain calib object
370   static const char* fgkPedestal;        // Path to Pedestal calib object
371   static const char* fgkDead;            // Path to Dead calib object
372   static const char* fgkSampleRate;      // Path to SampleRate calib object
373   static const char* fgkAltroMap;        // Path to AltroMap calib object
374   static const char* fgkZeroSuppression; // Path to ZeroSuppression cal object
375   static const char* fgkStripRange;      // Path to strip range cal object
376   const Float_t   fkSiDeDxMip;           // MIP dE/dx in Silicon
377   UShort_t        fVA1MipRange;          // # MIPs the pre-amp can do    
378   UShort_t        fAltroChannelSize;     // Largest # to store in 1 ADC ch.
379   UShort_t        fChannelsPerAltro;     // Number of pre-amp. chan/adc chan.
380   Float_t         fPedestalFactor;       // Number of pedestal widths
381
382   Float_t         fFixedPedestal;        // Pedestal to subtract
383   Float_t         fFixedPedestalWidth;   // Width of pedestal
384   UShort_t        fFixedZeroSuppression; // Threshold for zero-suppression
385   UShort_t        fFixedSampleRate;      // Times the ALTRO samples pre-amp.
386   Float_t         fFixedThreshold;       // Threshold in ADC counts
387   UShort_t        fFixedMinStrip;        // Minimum strip read-out
388   UShort_t        fFixedMaxStrip;        // Maximum strip read-out 
389   mutable Float_t fFixedPulseGain;       //! Gain (cached)
390   mutable Float_t fEdepMip;              //! Cache of energy loss for a MIP
391   
392   AliFMDCalibZeroSuppression* fZeroSuppression; // Zero suppression from CDB
393   AliFMDCalibSampleRate*      fSampleRate;      // Sample rate from CDB 
394   AliFMDCalibPedestal*        fPedestal;        // Pedestals 
395   AliFMDCalibGain*            fPulseGain;       // Pulser gain
396   AliFMDCalibDeadMap*         fDeadMap;         // Pulser gain
397   AliFMDAltroMapping*         fAltroMap;        // Map of hardware
398   AliFMDCalibStripRange*      fStripRange;      // Strip range
399   
400   ClassDef(AliFMDParameters,5) // Manager of parameters
401 };
402
403 #endif
404 //____________________________________________________________________
405 //
406 // Local Variables:
407 //   mode: C++
408 // End:
409 //
410 // EOF
411 //
412