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