ROOT logo
#ifndef ALIFMDBASEDIGITIZER_H
#define ALIFMDBASEDIGITIZER_H
/* Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights
 * reserved. 
 *
 * See cxx source for full Copyright notice                               
 */
// Classses to make Hits into digits and summable digits. 
//    
//    Digits consists of
//    - Detector #
//    - Ring ID                                             
//    - Sector #     
//    - Strip #
//    - ADC count in this channel                                  
//
//    Summable digits consists of	
//    - Detector #
//    - Ring ID                                             
//    - Sector #     
//    - Strip #
//    - Total energy deposited in the strip
//    - ADC count in this channel                                  
//
/** @file    AliFMDBaseDigitizer.h
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Mon Mar 27 12:38:26 2006
    @brief   FMD Digitizers declaration
    @ingroup FMD_sim
*/
#ifndef ALIDIGITIZER_H
# include <AliDigitizer.h>
#endif
#ifndef ALIRUNDIGITIZER_H
# include <AliDigitizationInput.h>
#endif
#ifndef ALIFMDEdepMAP_H
# include "AliFMDEdepMap.h"
#endif
//====================================================================
class TClonesArray;
class AliFMD;
class AliLoader;
class AliRunLoader;
class AliFMDDigit;


//====================================================================
/** @class AliFMDBaseDigitizer AliFMDDigitizer.h <FMD/AliFMDDigitizer>
    @brief Base class for digitizers.

    This class contains the procedures simulation ADC  signal for the
    Forward Multiplicity detector  : Hits->Digits and Hits->SDigits
    
    Digits consists of
    - Detector #
    - Ring ID                                             
    - Sector #     
    - Strip #
    - ADC count in this channel                                  

    Summable digits consists of	
    - Detector #
    - Ring ID                                             
    - Sector #     
    - Strip #
    - Total energy deposited in the strip
    - ADC count in this channel                                  

    As the Digits and SDigits have so much in common, the classes
    AliFMDDigitizer and AliFMDSDigitizer are implemented via a base
    class AliFMDBaseDigitizer.
    @verbatim
                    +---------------------+
                    | AliFMDBaseDigitizer |
                    +---------------------+
                              ^
                              |
                   +----------+---------+
                   |                    |
         +-----------------+     +------------------+
         | AliFMDDigitizer |	| AliFMDSDigitizer |
         +-----------------+	+------------------+
    @endverbatim
    These classes uses parameters fetched from the AliFMDParameters
    manager. 

    The shaping function of the VA1 is generally given by 
    @f[
    f(x) = A(1 - \exp(-Bx))
    @f]
    where A is the total charge collected in the pre-amp., and B is a
    paramter that depends on the shaping time of the VA1 circut.
    
    When simulating the shaping function of the VA1 pre-amp. chip, we
    have to take into account, that the shaping function depends on
    the previous value of read from the pre-amp.  

    That results in the following algorithm:
    @code
    last = 0;
    for (i=0; i < n_pre_amp_charge; i++) {
      charge = GetCharge(i);
      if (last < charge) 
        f(t) = (charge - last) * (1 - exp(-B * t)) + last
      else
        f(t) = (last - charge) * exp(-B * t) + charge)
      for (j=0; j < sample_rate; j++) 
        adc[j] = f(i / (# samples))
      last = charge
    }
    @endcode
    Here, the first loop is over all charges collected by the VA1
    chip, and the @c sample_rate is how many times the ALTRO ADC
    samples each of the 128  charges from the pre-amp. 

    The @c charge is the total charge @f$ Q@f$ collected by the VA1
    pre-amplifier for a strip.   @f$ Q@f$ is then given by 
    @f[
    Q = \frac{E}{e}\frac{S}{r}
    @f]
    where @f$ E@f$ is the total energy deposited in a silicon strip, 
    @f$ R@f$ is the dynamic range of the VA1 pre-amp, @f$ e@f$ is the 
    energy deposited by a single MIP, and @f$ S@f$ ALTRO channel size
    in each time step.

    The energy deposited per MIP is given by 
    @f$ 
    e = M \rho w 
    @f$
    where @f$ M@f$ is the universal number 
    @f$ 1.664 \mbox{keV}\mbox{cm}^{2}\mbox{g}^{-1}@f$, @f$ \rho@f$ is
    the density of silicon, and @f$ w@f$ is the depth of the silicon
    sensor.  

    The final ADC count is given by 
    @f[
    C' = C + P
    @f]
    where @f$ P@f$ is the (randomized) pedestal.

    This class uses the class template AliFMDEdepMap to make an
    internal cache of the energy deposted of the hits.  The class
    template is instantasized as 

    The first member of the values is the summed energy deposition in a
    given strip, while the second member of the values is the number of
    hits in a given strip.  Using the second member, it's possible to
    do some checks on just how many times a strip got hit, and what
    kind of error we get in our reconstructed hits.  Note, that this
    information is currently not written to the digits tree.  I think a
    QA (Quality Assurance) digit tree is better suited for that task.
    However, the information is there to be used in the future. 
    @ingroup FMD_sim
 */
class AliFMDBaseDigitizer : public AliDigitizer 
{
public:
  /** CTOR */
  AliFMDBaseDigitizer();
  /** Normal CTOR 
      @param manager Manager of digitization */
  AliFMDBaseDigitizer(AliDigitizationInput * digInp);
  /** Normal ctor 
      @param name Name 
      @param title Title */
  AliFMDBaseDigitizer(const Char_t* name, const Char_t* title);
  /** DTOR */
  virtual ~AliFMDBaseDigitizer();
   
  /** Initialize */
  virtual Bool_t Init();
  
  /** The response shape of the VA1 shaping circuit is approximently
      given by 
      @f[
      f(x) = A(1 - \exp(-Bx))
      @f]
      where @f$ A@f$ is the total charge collected by the pre-amp.,
      and @f$ B@f$ is parameter that depends on the shaping time of
      the @b VA1 pre-amp.  This member function sets the parameter @f$
      B@f$ 
      @param B */
  void     SetShapingTime(Float_t B=10) { fShapingTime = B;  }  
  /** @return Get the shaping time */
  Float_t  GetShapingTime()      const { return fShapingTime; }
  
  void SetStoreTrackRefs(Bool_t store=kTRUE) { fStoreTrackRefs = store; }
  Bool_t IsStoreTrackRefs() const { return fStoreTrackRefs; }
    
protected:
  /** For the stored energy contributions in the cache, convert the
      energy signal to ADC counts, and store the created digit in  
      the digits array
      @param fmd Pointer to detector */
  virtual void     DigitizeHits() const;
  /** Convert the total energy deposited to a (set of) ADC count(s).
      See also the class description for more details. 
      @param edep     Total energy deposited in detector
      @param last     Last charge collected in previous VA1 channnel
      @param detector Detector #
      @param ring     Ring ID
      @param sector   Sector #
      @param strip    Strip #
      @param counts   Array holding the counts on return */
  virtual void     ConvertToCount(Float_t   edep, 
				  Float_t   last,
				  UShort_t  detector, 
				  Char_t    ring, 
				  UShort_t  sector, 
				  UShort_t  strip,
				  TArrayI&  counts) const;
  /** Make a pedestal 
      @param detector Detector #
      @param ring     Ring ID
      @param sector   Sector #
      @param strip    Strip #
      @return Pedestal value */
  virtual UShort_t MakePedestal(UShort_t  detector, 
				Char_t    ring, 
				UShort_t  sector, 
				UShort_t  strip) const;
  /** Add noise to each sample */
  virtual void     AddNoise(TArrayI&) const {}

  /** Add edep contribution from (detector,ring,sector,strip) to cache */ 
  virtual void AddContribution(UShort_t detector, 
			       Char_t   ring, 
			       UShort_t sector, 
			       UShort_t strip, 
			       Float_t  edep, 
			       Bool_t   isPrimary,
			       Int_t    nTrackno,
			       Int_t*   tracknos);
  /** Add a digit to output */
  virtual void     AddDigit(UShort_t       detector, 
			    Char_t         ring,
			    UShort_t       sector, 
			    UShort_t       strip, 
			    Float_t        edep, 
			    UShort_t       count1, 
			    Short_t        count2, 
			    Short_t        count3,
			    Short_t        count4, 
			    UShort_t       ntot, 
			    UShort_t       nprim,
			    const TArrayI& refs) const;
  /** Make the output tree using the passed loader 
      @param loader 
      @return The generated tree. */
  virtual TTree* MakeOutputTree(AliLoader* loader);
  /** Store the data using the loader 
      @param loader The loader */
  virtual void StoreDigits(const AliLoader* loader);

  AliFMD*         fFMD;              // Detector object 
  AliRunLoader*   fRunLoader;	     //! Run loader
  AliFMDEdepMap   fEdep;             // Cache of Energy from hits 
  Float_t         fShapingTime;      // Shaping profile parameter
  Bool_t          fStoreTrackRefs;   // Wether to store track references
  mutable Int_t   fIgnoredLabels;    //! Number of labels not assigned 
  
  /** Copy CTOR 
      @param o object to copy from  */
  AliFMDBaseDigitizer(const AliFMDBaseDigitizer& o) 
    : AliDigitizer(o),
      fFMD(o.fFMD),
      fRunLoader(0),
      fEdep(o.fEdep),
      fShapingTime(o.fShapingTime),
      fStoreTrackRefs(o.fStoreTrackRefs), 
      fIgnoredLabels(o.fIgnoredLabels)
  {}
  /** 
   * Assignment operator
   * 
   * @return Reference to this object 
   */
  AliFMDBaseDigitizer& operator=(const AliFMDBaseDigitizer& o);

  ClassDef(AliFMDBaseDigitizer,5) // Base class for FMD digitizers
};


#endif
//____________________________________________________________________
//
// Local Variables:
//   mode: C++
// End:
//
//
// EOF
//

 AliFMDBaseDigitizer.h:1
 AliFMDBaseDigitizer.h:2
 AliFMDBaseDigitizer.h:3
 AliFMDBaseDigitizer.h:4
 AliFMDBaseDigitizer.h:5
 AliFMDBaseDigitizer.h:6
 AliFMDBaseDigitizer.h:7
 AliFMDBaseDigitizer.h:8
 AliFMDBaseDigitizer.h:9
 AliFMDBaseDigitizer.h:10
 AliFMDBaseDigitizer.h:11
 AliFMDBaseDigitizer.h:12
 AliFMDBaseDigitizer.h:13
 AliFMDBaseDigitizer.h:14
 AliFMDBaseDigitizer.h:15
 AliFMDBaseDigitizer.h:16
 AliFMDBaseDigitizer.h:17
 AliFMDBaseDigitizer.h:18
 AliFMDBaseDigitizer.h:19
 AliFMDBaseDigitizer.h:20
 AliFMDBaseDigitizer.h:21
 AliFMDBaseDigitizer.h:22
 AliFMDBaseDigitizer.h:23
 AliFMDBaseDigitizer.h:24
 AliFMDBaseDigitizer.h:25
 AliFMDBaseDigitizer.h:26
 AliFMDBaseDigitizer.h:27
 AliFMDBaseDigitizer.h:28
 AliFMDBaseDigitizer.h:29
 AliFMDBaseDigitizer.h:30
 AliFMDBaseDigitizer.h:31
 AliFMDBaseDigitizer.h:32
 AliFMDBaseDigitizer.h:33
 AliFMDBaseDigitizer.h:34
 AliFMDBaseDigitizer.h:35
 AliFMDBaseDigitizer.h:36
 AliFMDBaseDigitizer.h:37
 AliFMDBaseDigitizer.h:38
 AliFMDBaseDigitizer.h:39
 AliFMDBaseDigitizer.h:40
 AliFMDBaseDigitizer.h:41
 AliFMDBaseDigitizer.h:42
 AliFMDBaseDigitizer.h:43
 AliFMDBaseDigitizer.h:44
 AliFMDBaseDigitizer.h:45
 AliFMDBaseDigitizer.h:46
 AliFMDBaseDigitizer.h:47
 AliFMDBaseDigitizer.h:48
 AliFMDBaseDigitizer.h:49
 AliFMDBaseDigitizer.h:50
 AliFMDBaseDigitizer.h:51
 AliFMDBaseDigitizer.h:52
 AliFMDBaseDigitizer.h:53
 AliFMDBaseDigitizer.h:54
 AliFMDBaseDigitizer.h:55
 AliFMDBaseDigitizer.h:56
 AliFMDBaseDigitizer.h:57
 AliFMDBaseDigitizer.h:58
 AliFMDBaseDigitizer.h:59
 AliFMDBaseDigitizer.h:60
 AliFMDBaseDigitizer.h:61
 AliFMDBaseDigitizer.h:62
 AliFMDBaseDigitizer.h:63
 AliFMDBaseDigitizer.h:64
 AliFMDBaseDigitizer.h:65
 AliFMDBaseDigitizer.h:66
 AliFMDBaseDigitizer.h:67
 AliFMDBaseDigitizer.h:68
 AliFMDBaseDigitizer.h:69
 AliFMDBaseDigitizer.h:70
 AliFMDBaseDigitizer.h:71
 AliFMDBaseDigitizer.h:72
 AliFMDBaseDigitizer.h:73
 AliFMDBaseDigitizer.h:74
 AliFMDBaseDigitizer.h:75
 AliFMDBaseDigitizer.h:76
 AliFMDBaseDigitizer.h:77
 AliFMDBaseDigitizer.h:78
 AliFMDBaseDigitizer.h:79
 AliFMDBaseDigitizer.h:80
 AliFMDBaseDigitizer.h:81
 AliFMDBaseDigitizer.h:82
 AliFMDBaseDigitizer.h:83
 AliFMDBaseDigitizer.h:84
 AliFMDBaseDigitizer.h:85
 AliFMDBaseDigitizer.h:86
 AliFMDBaseDigitizer.h:87
 AliFMDBaseDigitizer.h:88
 AliFMDBaseDigitizer.h:89
 AliFMDBaseDigitizer.h:90
 AliFMDBaseDigitizer.h:91
 AliFMDBaseDigitizer.h:92
 AliFMDBaseDigitizer.h:93
 AliFMDBaseDigitizer.h:94
 AliFMDBaseDigitizer.h:95
 AliFMDBaseDigitizer.h:96
 AliFMDBaseDigitizer.h:97
 AliFMDBaseDigitizer.h:98
 AliFMDBaseDigitizer.h:99
 AliFMDBaseDigitizer.h:100
 AliFMDBaseDigitizer.h:101
 AliFMDBaseDigitizer.h:102
 AliFMDBaseDigitizer.h:103
 AliFMDBaseDigitizer.h:104
 AliFMDBaseDigitizer.h:105
 AliFMDBaseDigitizer.h:106
 AliFMDBaseDigitizer.h:107
 AliFMDBaseDigitizer.h:108
 AliFMDBaseDigitizer.h:109
 AliFMDBaseDigitizer.h:110
 AliFMDBaseDigitizer.h:111
 AliFMDBaseDigitizer.h:112
 AliFMDBaseDigitizer.h:113
 AliFMDBaseDigitizer.h:114
 AliFMDBaseDigitizer.h:115
 AliFMDBaseDigitizer.h:116
 AliFMDBaseDigitizer.h:117
 AliFMDBaseDigitizer.h:118
 AliFMDBaseDigitizer.h:119
 AliFMDBaseDigitizer.h:120
 AliFMDBaseDigitizer.h:121
 AliFMDBaseDigitizer.h:122
 AliFMDBaseDigitizer.h:123
 AliFMDBaseDigitizer.h:124
 AliFMDBaseDigitizer.h:125
 AliFMDBaseDigitizer.h:126
 AliFMDBaseDigitizer.h:127
 AliFMDBaseDigitizer.h:128
 AliFMDBaseDigitizer.h:129
 AliFMDBaseDigitizer.h:130
 AliFMDBaseDigitizer.h:131
 AliFMDBaseDigitizer.h:132
 AliFMDBaseDigitizer.h:133
 AliFMDBaseDigitizer.h:134
 AliFMDBaseDigitizer.h:135
 AliFMDBaseDigitizer.h:136
 AliFMDBaseDigitizer.h:137
 AliFMDBaseDigitizer.h:138
 AliFMDBaseDigitizer.h:139
 AliFMDBaseDigitizer.h:140
 AliFMDBaseDigitizer.h:141
 AliFMDBaseDigitizer.h:142
 AliFMDBaseDigitizer.h:143
 AliFMDBaseDigitizer.h:144
 AliFMDBaseDigitizer.h:145
 AliFMDBaseDigitizer.h:146
 AliFMDBaseDigitizer.h:147
 AliFMDBaseDigitizer.h:148
 AliFMDBaseDigitizer.h:149
 AliFMDBaseDigitizer.h:150
 AliFMDBaseDigitizer.h:151
 AliFMDBaseDigitizer.h:152
 AliFMDBaseDigitizer.h:153
 AliFMDBaseDigitizer.h:154
 AliFMDBaseDigitizer.h:155
 AliFMDBaseDigitizer.h:156
 AliFMDBaseDigitizer.h:157
 AliFMDBaseDigitizer.h:158
 AliFMDBaseDigitizer.h:159
 AliFMDBaseDigitizer.h:160
 AliFMDBaseDigitizer.h:161
 AliFMDBaseDigitizer.h:162
 AliFMDBaseDigitizer.h:163
 AliFMDBaseDigitizer.h:164
 AliFMDBaseDigitizer.h:165
 AliFMDBaseDigitizer.h:166
 AliFMDBaseDigitizer.h:167
 AliFMDBaseDigitizer.h:168
 AliFMDBaseDigitizer.h:169
 AliFMDBaseDigitizer.h:170
 AliFMDBaseDigitizer.h:171
 AliFMDBaseDigitizer.h:172
 AliFMDBaseDigitizer.h:173
 AliFMDBaseDigitizer.h:174
 AliFMDBaseDigitizer.h:175
 AliFMDBaseDigitizer.h:176
 AliFMDBaseDigitizer.h:177
 AliFMDBaseDigitizer.h:178
 AliFMDBaseDigitizer.h:179
 AliFMDBaseDigitizer.h:180
 AliFMDBaseDigitizer.h:181
 AliFMDBaseDigitizer.h:182
 AliFMDBaseDigitizer.h:183
 AliFMDBaseDigitizer.h:184
 AliFMDBaseDigitizer.h:185
 AliFMDBaseDigitizer.h:186
 AliFMDBaseDigitizer.h:187
 AliFMDBaseDigitizer.h:188
 AliFMDBaseDigitizer.h:189
 AliFMDBaseDigitizer.h:190
 AliFMDBaseDigitizer.h:191
 AliFMDBaseDigitizer.h:192
 AliFMDBaseDigitizer.h:193
 AliFMDBaseDigitizer.h:194
 AliFMDBaseDigitizer.h:195
 AliFMDBaseDigitizer.h:196
 AliFMDBaseDigitizer.h:197
 AliFMDBaseDigitizer.h:198
 AliFMDBaseDigitizer.h:199
 AliFMDBaseDigitizer.h:200
 AliFMDBaseDigitizer.h:201
 AliFMDBaseDigitizer.h:202
 AliFMDBaseDigitizer.h:203
 AliFMDBaseDigitizer.h:204
 AliFMDBaseDigitizer.h:205
 AliFMDBaseDigitizer.h:206
 AliFMDBaseDigitizer.h:207
 AliFMDBaseDigitizer.h:208
 AliFMDBaseDigitizer.h:209
 AliFMDBaseDigitizer.h:210
 AliFMDBaseDigitizer.h:211
 AliFMDBaseDigitizer.h:212
 AliFMDBaseDigitizer.h:213
 AliFMDBaseDigitizer.h:214
 AliFMDBaseDigitizer.h:215
 AliFMDBaseDigitizer.h:216
 AliFMDBaseDigitizer.h:217
 AliFMDBaseDigitizer.h:218
 AliFMDBaseDigitizer.h:219
 AliFMDBaseDigitizer.h:220
 AliFMDBaseDigitizer.h:221
 AliFMDBaseDigitizer.h:222
 AliFMDBaseDigitizer.h:223
 AliFMDBaseDigitizer.h:224
 AliFMDBaseDigitizer.h:225
 AliFMDBaseDigitizer.h:226
 AliFMDBaseDigitizer.h:227
 AliFMDBaseDigitizer.h:228
 AliFMDBaseDigitizer.h:229
 AliFMDBaseDigitizer.h:230
 AliFMDBaseDigitizer.h:231
 AliFMDBaseDigitizer.h:232
 AliFMDBaseDigitizer.h:233
 AliFMDBaseDigitizer.h:234
 AliFMDBaseDigitizer.h:235
 AliFMDBaseDigitizer.h:236
 AliFMDBaseDigitizer.h:237
 AliFMDBaseDigitizer.h:238
 AliFMDBaseDigitizer.h:239
 AliFMDBaseDigitizer.h:240
 AliFMDBaseDigitizer.h:241
 AliFMDBaseDigitizer.h:242
 AliFMDBaseDigitizer.h:243
 AliFMDBaseDigitizer.h:244
 AliFMDBaseDigitizer.h:245
 AliFMDBaseDigitizer.h:246
 AliFMDBaseDigitizer.h:247
 AliFMDBaseDigitizer.h:248
 AliFMDBaseDigitizer.h:249
 AliFMDBaseDigitizer.h:250
 AliFMDBaseDigitizer.h:251
 AliFMDBaseDigitizer.h:252
 AliFMDBaseDigitizer.h:253
 AliFMDBaseDigitizer.h:254
 AliFMDBaseDigitizer.h:255
 AliFMDBaseDigitizer.h:256
 AliFMDBaseDigitizer.h:257
 AliFMDBaseDigitizer.h:258
 AliFMDBaseDigitizer.h:259
 AliFMDBaseDigitizer.h:260
 AliFMDBaseDigitizer.h:261
 AliFMDBaseDigitizer.h:262
 AliFMDBaseDigitizer.h:263
 AliFMDBaseDigitizer.h:264
 AliFMDBaseDigitizer.h:265
 AliFMDBaseDigitizer.h:266
 AliFMDBaseDigitizer.h:267
 AliFMDBaseDigitizer.h:268
 AliFMDBaseDigitizer.h:269
 AliFMDBaseDigitizer.h:270
 AliFMDBaseDigitizer.h:271
 AliFMDBaseDigitizer.h:272
 AliFMDBaseDigitizer.h:273
 AliFMDBaseDigitizer.h:274
 AliFMDBaseDigitizer.h:275
 AliFMDBaseDigitizer.h:276
 AliFMDBaseDigitizer.h:277
 AliFMDBaseDigitizer.h:278
 AliFMDBaseDigitizer.h:279
 AliFMDBaseDigitizer.h:280
 AliFMDBaseDigitizer.h:281
 AliFMDBaseDigitizer.h:282
 AliFMDBaseDigitizer.h:283
 AliFMDBaseDigitizer.h:284
 AliFMDBaseDigitizer.h:285
 AliFMDBaseDigitizer.h:286
 AliFMDBaseDigitizer.h:287
 AliFMDBaseDigitizer.h:288
 AliFMDBaseDigitizer.h:289
 AliFMDBaseDigitizer.h:290
 AliFMDBaseDigitizer.h:291
 AliFMDBaseDigitizer.h:292
 AliFMDBaseDigitizer.h:293
 AliFMDBaseDigitizer.h:294
 AliFMDBaseDigitizer.h:295