ROOT logo
#ifndef ALIPOISSONCALCULATOR_H
#define ALIPOISSONCALCULATOR_H
#include <TNamed.h>
class TH2D;
class TH1D;
class TBrowser;
class TAxis;

/** 
 * A class to calculate the multiplicity in @f$(\eta,\varphi)@f$ bins
 * using Poisson statistics. 
 *
 * The input is assumed to be binned in @f$(\eta,\varphi)@f$ as
 * described by the 2D histogram passwd to the Reset member function.  
 *
 * The data is grouped in to regions as defined by the parameters
 * fXLumping and fYLumping.  The total number of cells and number
 * of empty cells is then calculate in each region.  The mean
 * multiplicity over the region is then determined as 
 *
 * @f[
 * \langle m\rangle = -\log\left(\frac{e}{t}\right)
 * @f]
 * where @f$ e@f$ is the number of empty cells and @f$t@f$ is the
 * total number of cells in the region.  A correction for counting
 * statistics, is then applied 
 * @f{eqnarray*}{
 *    c &=& \frac{1}{1 - \exp{-\langle m\rangle}}\\ &=& 
 *          \frac{1}{1 - \frac{e}{t}}
 * @f}
 * and the final number in each cell is then 
 * @f$h_i c \langle m\rangle@f$ 
 * where @f$h_i@f$ is the number of hits in the cell @f$i@f$ 
 * 
 */
class AliPoissonCalculator : public TNamed
{
public:
  /** 
   * Constructor 
   */
  AliPoissonCalculator(); 
  /** 
   * Constructor 
   * 
   */
  AliPoissonCalculator(const char*/*, UShort_t d, Char_t r*/);
  /**
   * Copy constructor
   * 
   * @param o Object to copy from
   */
  AliPoissonCalculator(const AliPoissonCalculator& o);

  /** 
   * Destructor 
   */
  virtual ~AliPoissonCalculator();
  /** 
   * Assignment operator
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this object
   */  
  AliPoissonCalculator& operator=(const AliPoissonCalculator& o);
  /** 
   * Set the number of eta bins to group into a region
   * 
   * @param nx Number of @f$\eta@f$ bins per region
   * @param ny Number of @f$\phi@f$ bins per region
   */  
  void SetLumping(UShort_t nx, UShort_t ny);
  /** 
   * Set the number of X bins to group into a region
   * 
   * @param nx Number of eta bins per region
   */  
  void SetXLumping(UShort_t nx) { SetLumping(nx, fYLumping); } //*MENU*
  /** 
   * Set the number of Y bins to group into a region
   * 
   * @param ny Number of eta bins per region
   */  
  void SetYLumping(UShort_t ny) { SetLumping(fYLumping, ny); } //*MENU*
  /** 
   * Intialize this object 
   * 
   * @param xLumping If larger than 0, set the eta lumping to this
   * @param yLumping If larger than 0, set the phi lumping to this
   */
  void Init(Int_t xLumping=-1, Int_t yLumping=-1);
  
  /** 
   * Initialize this object.  
   * 
   * Also book the cache histograms 
   *
   * @param xaxis The X-axis 
   * @param yaxis The Y-axis 
   */
  void Define(const TAxis& xaxis, const TAxis& yaxis);
  /** 
   * Make output stuff for the passed list
   * 
   */
  void MakeOutput();
  /** 
   * Output stuff to the passed list
   * 
   * @param d List to add output histograms to 
   */
  void Output(TList* d);
  /** 
   * Reset the cache histogram 
   * 
   * @param base Base histogram 
   */
  void Reset(const TH2D* base);
  /** 
   * Fill in an observation 
   * 
   * @param strip   X axis bin number 
   * @param sec     Y axis bin number 
   * @param hit     True if hit 
   * @param weight  Weight if this 
   */
  void Fill(UShort_t strip, UShort_t sec, Bool_t hit, Double_t weight=1);
  /** 
   * Calculate result and store in @a output
   * 
   * @param correct Whether to apply correction or not 
   *
   * @return The result histogram (fBase overwritten)
   */
  TH2D* Result(Bool_t correct=true);
  /** 
   * After calculating the results, fill the diagnostics histograms 
   * 
   */
  void FillDiagnostics();
  /** 
   * @return Always true 
   */
  Bool_t IsFolder() const { return kTRUE; }
  /** 
   * Print information 
   * 
   * @param option Not used
   */
  void Print(const Option_t* option="") const;
  /** 
   * Browse this object
   * 
   * @param b Object to browse 
   */
  void Browse(TBrowser* b);

  /** 
   * Get the empty versus total histogram 
   * 
   * @return Empty versus total 
   */
  TH2D* GetEmptyVsTotal() const { return fEmptyVsTotal; }
  /** 
   * Get the histogram of the means 
   * 
   * @return Means 
   */
  TH1D* GetMean() const { return fMean; }
  /** 
   * Get the occupancy histogram
   * 
   * @return Occupancy histogram 
   */
  TH1D* GetOccupancy() const { return fOcc; }
  /** 
   * Get the correction histogram
   * 
   * @return correction histogram
   */
  TH2D* GetCorrection() const { return fCorr; }

  /** 
   * Get the X bin in the reduced historgam
   * 
   * @param ix X bin in full histogram
   * 
   * @return X bin in reduced histogram 
   */
  Int_t GetReducedXBin(Int_t ix) const;
  /** 
   * Get the X bin in the reduced historgam
   * 
   * @param x X value 
   * 
   * @return X bin in reduced histogram 
   */
  Int_t GetReducedXBin(Double_t x) const;
  /** 
   * Get the Y bin in the reduced historgam
   * 
   * @param iy Y bin in full histogram
   * 
   * @return Y bin in reduced histogram 
   */
  Int_t GetReducedYBin(Int_t iy) const;
  /** 
   * Get the Y bin in the reduced historgam
   * 
   * @param y Y value 
   * 
   * @return Y bin in reduced histogram 
   */
  Int_t GetReducedYBin(Double_t y) const;

protected:
  /** 
   * check that the lumping parameter makes sense  
   * 
   * @param which   Which axis
   * @param nBins   Number of bins
   * @param lumping Lumping 
   * 
   * @return The new value of the lumping 
   */
  Int_t CheckLumping(char which, Int_t nBins, Int_t lumping) const;
  /** 
   * Clean up allocated space 
   * 
   */
  void CleanUp();
  /** 
   * Calculate the mean 
   *
   * This is based on the fact that for a Poisson
   * @f[ 
   *   P(n;\lambda) = \frac{-\lambda^n e^{-\lambda}}{n!}
   * @f]
   * we have the probability for 0 observation 
   * @f[
   *   P(0;\lambda) = e^{-\lambda} = \frac{N_{empty}}{N_{total}}
   * @f] 
   * and so we get that the mean is the defined region is 
   * @f[
   *   \lambda = -\log\left(\frac{N_{empty}}{N_{total}}\right)
   * @f]
   * 
   * Note the boundary conditions
   * - @f$N_{total}=0 \rightarrow\lambda=0@f$
   * - @f$N_{empty}<\epsilon\rightarrow N_{empty} = \epsilon@f$ 
   * 
   * @param empty Number of empty bins 
   * @param total Total number of bins 
   * 
   * @return The mean in the defined region 
   */
  Double_t CalculateMean(Double_t empty, Double_t total) const;
  /** 
   * The mean @f$\lambda@f$ calculated above is not the full story.
   * In addition it needs to be corrected using the expression 
   * @f[
   *   \frac{1}{1-e^{\lambda}} =
   *     \frac{1}{1-\frac{N_{empty}}{N_{total}}}
   * @f]
   * 
   * Note the boundary conditions
   * - @f$N_{total}=0 \rightarrow\lambda=0@f$
   * - @f$|N_{total}-N_{empty}|<\epsilon\rightarrow N_{empty} =
   * N_{total}-\epsilon@f$  
   *
   * @param empty Number of empty bins 
   * @param total Total number of bins 
   * 
   * @return The correction to the mean. 
   */
  Double_t CalculateCorrection(Double_t empty, Double_t total) const;
  UShort_t fXLumping;   // Grouping of eta bins 
  UShort_t fYLumping;   // Grouping of phi bins 
  TH2D*    fTotal;        // Total number of strips in a region
  TH2D*    fEmpty;        // Total number of strips in a region
  TH2D*    fBasic;        // Total number basic hits in a region
  TH2D*    fEmptyVsTotal; // Empty versus total cells 
  TH1D*    fMean;         // Mean calculated by poisson method 
  TH1D*    fOcc;          // Histogram of occupancies 
  TH2D*    fCorr;         // Correction as a function of mean 
  ClassDef(AliPoissonCalculator,3) // Calculate N_ch using Poisson
};

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

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