]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/AliFMDBaseDigitizer.h
Introducing event specie in QA (Yves)
[u/mrichter/AliRoot.git] / FMD / AliFMDBaseDigitizer.h
1 #ifndef ALIFMDBASEDIGITIZER_H
2 #define ALIFMDBASEDIGITIZER_H
3 /* Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * See cxx source for full Copyright notice                               
7  */
8 // Classses to make Hits into digits and summable digits. 
9 //    
10 //    Digits consists of
11 //    - Detector #
12 //    - Ring ID                                             
13 //    - Sector #     
14 //    - Strip #
15 //    - ADC count in this channel                                  
16 //
17 //    Summable digits consists of       
18 //    - Detector #
19 //    - Ring ID                                             
20 //    - Sector #     
21 //    - Strip #
22 //    - Total energy deposited in the strip
23 //    - ADC count in this channel                                  
24 //
25 /** @file    AliFMDBaseDigitizer.h
26     @author  Christian Holm Christensen <cholm@nbi.dk>
27     @date    Mon Mar 27 12:38:26 2006
28     @brief   FMD Digitizers declaration
29     @ingroup FMD_sim
30 */
31 #ifndef ALIDIGITIZER_H
32 # include <AliDigitizer.h>
33 #endif
34 #ifndef ALIRUNDIGITIZER_H
35 # include <AliRunDigitizer.h>
36 #endif
37 #ifndef ALIFMDEdepMAP_H
38 # include "AliFMDEdepMap.h"
39 #endif
40 //====================================================================
41 class TClonesArray;
42 class AliFMD;
43 class AliLoader;
44 class AliRunLoader;
45 class AliFMDDigit;
46
47
48 //====================================================================
49 /** @class AliFMDBaseDigitizer AliFMDDigitizer.h <FMD/AliFMDDigitizer>
50     @brief Base class for digitizers.
51
52     This class contains the procedures simulation ADC  signal for the
53     Forward Multiplicity detector  : Hits->Digits and Hits->SDigits
54     
55     Digits consists of
56     - Detector #
57     - Ring ID                                             
58     - Sector #     
59     - Strip #
60     - ADC count in this channel                                  
61
62     Summable digits consists of 
63     - Detector #
64     - Ring ID                                             
65     - Sector #     
66     - Strip #
67     - Total energy deposited in the strip
68     - ADC count in this channel                                  
69
70     As the Digits and SDigits have so much in common, the classes
71     AliFMDDigitizer and AliFMDSDigitizer are implemented via a base
72     class AliFMDBaseDigitizer.
73     @verbatim
74                     +---------------------+
75                     | AliFMDBaseDigitizer |
76                     +---------------------+
77                               ^
78                               |
79                    +----------+---------+
80                    |                    |
81          +-----------------+     +------------------+
82          | AliFMDDigitizer |    | AliFMDSDigitizer |
83          +-----------------+    +------------------+
84     @endverbatim
85     These classes uses parameters fetched from the AliFMDParameters
86     manager. 
87
88     The shaping function of the VA1 is generally given by 
89     @f[
90     f(x) = A(1 - \exp(-Bx))
91     @f]
92     where A is the total charge collected in the pre-amp., and B is a
93     paramter that depends on the shaping time of the VA1 circut.
94     
95     When simulating the shaping function of the VA1 pre-amp. chip, we
96     have to take into account, that the shaping function depends on
97     the previous value of read from the pre-amp.  
98
99     That results in the following algorithm:
100     @code
101     last = 0;
102     for (i=0; i < n_pre_amp_charge; i++) {
103       charge = GetCharge(i);
104       if (last < charge) 
105         f(t) = (charge - last) * (1 - exp(-B * t)) + last
106       else
107         f(t) = (last - charge) * exp(-B * t) + charge)
108       for (j=0; j < sample_rate; j++) 
109         adc[j] = f(i / (# samples))
110       last = charge
111     }
112     @endcode
113     Here, the first loop is over all charges collected by the VA1
114     chip, and the @c sample_rate is how many times the ALTRO ADC
115     samples each of the 128  charges from the pre-amp. 
116
117     The @c charge is the total charge @f$ Q@f$ collected by the VA1
118     pre-amplifier for a strip.   @f$ Q@f$ is then given by 
119     @f[
120     Q = \frac{E}{e}\frac{S}{r}
121     @f]
122     where @f$ E@f$ is the total energy deposited in a silicon strip, 
123     @f$ R@f$ is the dynamic range of the VA1 pre-amp, @f$ e@f$ is the 
124     energy deposited by a single MIP, and @f$ S@f$ ALTRO channel size
125     in each time step.
126
127     The energy deposited per MIP is given by 
128     @f$ 
129     e = M \rho w 
130     @f$
131     where @f$ M@f$ is the universal number 
132     @f$ 1.664 \mbox{keV}\mbox{cm}^{2}\mbox{g}^{-1}@f$, @f$ \rho@f$ is
133     the density of silicon, and @f$ w@f$ is the depth of the silicon
134     sensor.  
135
136     The final ADC count is given by 
137     @f[
138     C' = C + P
139     @f]
140     where @f$ P@f$ is the (randomized) pedestal.
141
142     This class uses the class template AliFMDEdepMap to make an
143     internal cache of the energy deposted of the hits.  The class
144     template is instantasized as 
145
146     The first member of the values is the summed energy deposition in a
147     given strip, while the second member of the values is the number of
148     hits in a given strip.  Using the second member, it's possible to
149     do some checks on just how many times a strip got hit, and what
150     kind of error we get in our reconstructed hits.  Note, that this
151     information is currently not written to the digits tree.  I think a
152     QA (Quality Assurance) digit tree is better suited for that task.
153     However, the information is there to be used in the future. 
154     @ingroup FMD_sim
155  */
156 class AliFMDBaseDigitizer : public AliDigitizer 
157 {
158 public:
159   /** CTOR */
160   AliFMDBaseDigitizer();
161   /** Normal CTOR 
162       @param manager Manager of digitization */
163   AliFMDBaseDigitizer(AliRunDigitizer * manager);
164   /** Normal ctor 
165       @param name Name 
166       @param title Title */
167   AliFMDBaseDigitizer(const Char_t* name, const Char_t* title);
168   /** DTOR */
169   virtual ~AliFMDBaseDigitizer();
170    
171   /** Initialize */
172   virtual Bool_t Init();
173   
174   /** The response shape of the VA1 shaping circuit is approximently
175       given by 
176       @f[
177       f(x) = A(1 - \exp(-Bx))
178       @f]
179       where @f$ A@f$ is the total charge collected by the pre-amp.,
180       and @f$ B@f$ is parameter that depends on the shaping time of
181       the @b VA1 pre-amp.  This member function sets the parameter @f$
182       B@f$ 
183       @param B */
184   void     SetShapingTime(Float_t B=10) { fShapingTime = B;  }  
185   /** @return Get the shaping time */
186   Float_t  GetShapingTime()      const { return fShapingTime; }
187 protected:
188   /** For the stored energy contributions in the cache, convert the
189       energy signal to ADC counts, and store the created digit in  
190       the digits array
191       @param fmd Pointer to detector */
192   virtual void     DigitizeHits() const;
193   /** Convert the total energy deposited to a (set of) ADC count(s).
194       See also the class description for more details. 
195       @param edep     Total energy deposited in detector
196       @param last     Last charge collected in previous VA1 channnel
197       @param detector Detector #
198       @param ring     Ring ID
199       @param sector   Sector #
200       @param strip    Strip #
201       @param counts   Array holding the counts on return */
202   virtual void     ConvertToCount(Float_t   edep, 
203                                   Float_t   last,
204                                   UShort_t  detector, 
205                                   Char_t    ring, 
206                                   UShort_t  sector, 
207                                   UShort_t  strip,
208                                   TArrayI&  counts) const;
209   /** Make a pedestal 
210       @param detector Detector #
211       @param ring     Ring ID
212       @param sector   Sector #
213       @param strip    Strip #
214       @return Pedestal value */
215   virtual UShort_t MakePedestal(UShort_t  detector, 
216                                 Char_t    ring, 
217                                 UShort_t  sector, 
218                                 UShort_t  strip) const;
219   /** Add noise to each sample */
220   virtual void     AddNoise(TArrayI&) const {}
221
222   /** Add edep contribution from (detector,ring,sector,strip) to cache */ 
223   virtual void AddContribution(UShort_t detector, 
224                                Char_t   ring, 
225                                UShort_t sector, 
226                                UShort_t strip, 
227                                Float_t  edep, 
228                                Bool_t   isPrimary);
229   /** Add a digit to output */
230   virtual void     AddDigit(UShort_t detector, 
231                             Char_t   ring,
232                             UShort_t sector, 
233                             UShort_t strip, 
234                             Float_t  edep, 
235                             UShort_t count1, 
236                             Short_t  count2, 
237                             Short_t  count3,
238                             Short_t  count4, 
239                             UShort_t ntot, 
240                             UShort_t nprim) const;
241   /** Make the output tree using the passed loader 
242       @param loader 
243       @return The generated tree. */
244   virtual TTree* MakeOutputTree(AliLoader* loader);
245   /** Store the data using the loader 
246       @param loader The loader */
247   virtual void StoreDigits(AliLoader* loader);
248
249   AliFMD*       fFMD;
250   AliRunLoader* fRunLoader;        //! Run loader
251   AliFMDEdepMap fEdep;             // Cache of Energy from hits 
252   Float_t       fShapingTime;      // Shaping profile parameter
253   
254   /** Copy CTOR 
255       @param o object to copy from  */
256   AliFMDBaseDigitizer(const AliFMDBaseDigitizer& o) 
257     : AliDigitizer(o),
258       fFMD(o.fFMD),
259       fRunLoader(0),
260       fEdep(o.fEdep),
261       fShapingTime(o.fShapingTime)
262   {}
263   /** Assignment operator
264       @return Reference to this object */
265   AliFMDBaseDigitizer& operator=(const AliFMDBaseDigitizer& o) 
266   { 
267     AliDigitizer::operator=(o);
268     fRunLoader   = o.fRunLoader;
269     fEdep        = o.fEdep;
270     fShapingTime = o.fShapingTime;
271     return *this; 
272   }
273   ClassDef(AliFMDBaseDigitizer,2) // Base class for FMD digitizers
274 };
275
276
277 #endif
278 //____________________________________________________________________
279 //
280 // Local Variables:
281 //   mode: C++
282 // End:
283 //
284 //
285 // EOF
286 //
287