]> git.uio.no Git - u/mrichter/AliRoot.git/blob - CORRFW/AliCFUnfolding.h
- Replace the TClonesArray of AliMUONTrackParam by a TObjArray in
[u/mrichter/AliRoot.git] / CORRFW / AliCFUnfolding.h
1
2 #ifndef ALICFUNFOLDING_H
3 #define ALICFUNFOLDING_H
4
5 //--------------------------------------------------------------------//
6 //                                                                    //
7 // AliCFUnfolding Class                                               //
8 // Class to handle general unfolding procedure using bayesian method  //
9 //                                                                    //
10 // Author : renaud.vernet@cern.ch                                     //
11 //--------------------------------------------------------------------//
12
13 #include "TNamed.h"
14 #include "THnSparse.h"
15
16 class TF1;
17 class TProfile;
18 class TRandom3;
19
20 class AliCFUnfolding : public TNamed {
21
22  public :
23   AliCFUnfolding();
24   AliCFUnfolding(const Char_t* name, const Char_t* title, const Int_t nVar, 
25                  const THnSparse* response, const THnSparse* efficiency, const THnSparse* measured, const THnSparse* prior=0x0);
26   AliCFUnfolding(const AliCFUnfolding& c);
27   AliCFUnfolding& operator= (const AliCFUnfolding& c);
28   ~AliCFUnfolding();
29
30   void SetMaxNumberOfIterations(Int_t n = 10)  {fMaxNumIterations=n; fNRandomIterations=n; }
31
32   /* 
33      The following is for correct error estimation
34      thanks to Marta Verweij
35   */
36   void SetUseCorrelatedErrors  (Double_t maxConvergence = 1.e-06 , UInt_t randomSeed = 0)   {
37     fUseCorrelatedErrors = kTRUE             ;
38     fRandomSeed          = randomSeed        ;
39     SetMaxConvergencePerDOF(maxConvergence)  ;
40   }
41
42
43   void UseSmoothing(TF1* fcn=0x0, Option_t* opt="iremn") { // if fcn=0x0 then smooth using neighbouring bins 
44     fUseSmoothing=kTRUE;                                   // this function must NOT be used if fNVariables > 3
45     fSmoothFunction=fcn;                                   // the option "opt" is used if "fcn" is specified
46     fSmoothOption=opt;
47   } 
48                                                                                                 
49   void Unfold();
50
51   THnSparse* GetResponse()             const {return fResponse;}
52   THnSparse* GetInverseResponse()      const {return fInverseResponse;}
53   THnSparse* GetPrior()                const {return fPrior;}
54   THnSparse* GetOriginalPrior()        const {return fOriginalPrior;}
55   THnSparse* GetEfficiency()           const {return fEfficiency;}
56   THnSparse* GetUnfolded()             const {return fUnfolded;}
57   THnSparse* GetEstMeasured()          const {return fMeasuredEstimate;}
58   THnSparse* GetMeasured()             const {return fMeasured;}
59   THnSparse* GetConditional()          const {return fConditional;}
60   TF1*       GetSmoothFunction()       const {return fSmoothFunction;}
61   TProfile*  GetDeltaUnfoldedProfile() const {return fDeltaUnfoldedP;}
62   Int_t      GetDOF();                 // Returns number of degrees of freedom
63
64   static Short_t  SmoothUsingNeighbours(THnSparse*); // smoothes the unfolded spectrum using the neighbouring cells
65
66  private :
67   
68   // user-related settings
69   THnSparse     *fResponse;           // Response matrix : dimensions must be 2N = 2 x (number of variables)
70                                       // dimensions 0 ->  N-1 must be filled with reconstructed values
71                                       // dimensions N -> 2N-1 must be filled with generated values
72   THnSparse     *fPrior;              // This is the assumed generated distribution : dimensions must be N = number of variables
73                                       // it will be used at the first step 
74                                       // then will be updated automatically at each iteration
75   THnSparse     *fEfficiency;         // Efficiency map : dimensions must be N = number of variables
76                                       // this map must be filled only with "true" values of the variables (should not include resolution effects)
77   THnSparse     *fMeasured;           // Measured spectrum to be unfolded : dimensions must be N = number of variables (modified)
78   THnSparse     *fMeasuredOrig;       // Measured spectrum to be unfolded : dimensions must be N = number of variables (not modified)
79   Int_t          fMaxNumIterations;   // Maximum  number of iterations to be performed
80   Int_t          fNVariables;         // Number of variables used in analysis spectra (pt, y, ...)
81 /*   Double_t       fMaxChi2;            // Maximum Chi2 between unfolded and prior distributions.  */
82   Bool_t         fUseSmoothing;       // Smooth the unfolded sectrum at each iteration; default is kFALSE
83   TF1           *fSmoothFunction;     // Function used to smooth the unfolded spectrum
84   Option_t      *fSmoothOption;       // Option to use during the fit (with fSmoothFunction) ; default is "iremn"
85
86   /* correlated error calculation */
87   Double_t       fMaxConvergence;     // Convergence criterion in case of correlated error calculation
88   Bool_t         fUseCorrelatedErrors;// Calculate correlated errors for the final unfolded spectrum; default is kTRUE
89   Int_t          fNRandomIterations;  // Number of random distributed measured spectra
90
91   // internal settings
92   THnSparse     *fOriginalPrior;     // This is the original prior distribution : will not be modified
93   THnSparse     *fInverseResponse;   // Inverse response matrix
94   THnSparse     *fMeasuredEstimate;  // Estimation of the measured (M) spectrum given the a priori (T) distribution
95   THnSparse     *fConditional;       // Matrix holding the conditional probabilities P(M|T)
96   THnSparse     *fProjResponseInT;   // Projection of the response matrix on TRUE axis
97   THnSparse     *fUnfolded;          // Unfolded spectrum
98   Int_t         *fCoordinates2N;     // Coordinates in 2N (measured,true) space
99   Int_t         *fCoordinatesN_M;    // Coordinates in measured space
100   Int_t         *fCoordinatesN_T;    // Coordinates in true space
101
102
103   /* correlated error calculation */
104   THnSparse     *fRandomizedDist;    // Randomized distribution for each bin of the measured spectrum to calculate correlated errors
105   TRandom3      *fRandom3;           // Object to get random number following Poisson distribution
106   THnSparse     *fRandomUnfolded;
107   TProfile      *fDeltaUnfoldedP;    // Profile of the delta-unfolded distribution
108   Int_t          fNCalcCorrErrors;   // book keeping to prevend infinite loop
109   UInt_t         fRandomSeed;        // Random seed
110
111
112   // functions
113   void     Init();                  // initialisation of the internal settings
114   void     GetCoordinates();        // gets a cell coordinates in Measured and True space
115   void     CreateConditional();     // creates the conditional matrix from the response matrix
116   void     CreateEstMeasured();     // creates the measured spectrum estimation from the conditional matrix and the prior distribution
117   void     CreateInvResponse();     // creates the inverse response function (Bayes Theorem) from the conditional matrix and the prior distribution
118   void     CreateUnfolded();        // creates the unfolded spectrum from the inverse response matrix and the measured distribution
119   void     CreateFlatPrior();       // creates a flat a priori distribution in case the one given in the constructor is null
120   Double_t GetChi2();               // returns the chi2 between unfolded and prior spectra
121   Short_t  Smooth();                // function calling smoothing methods
122   Short_t  SmoothUsingFunction();   // smoothes the unfolded spectrum using a fit function
123
124   /* correlated error calculation */
125   Double_t GetConvergence();            // Returns convergence criterion
126   void     CalculateCorrelatedErrors(); // Calculates correlated errors for the final unfolded spectrum
127   void     InitDeltaUnfoldedProfile();  // Initializes the fDeltaUnfoldedP Profiles with spread option
128   void     CreateRandomizedDist();      // Create randomized dist from measured distribution
129   void     FillDeltaUnfoldedProfile();  // Fills the fDeltaUnfoldedP profile
130   void     SetMaxConvergencePerDOF (Double_t val);
131
132   ClassDef(AliCFUnfolding,1);
133 };
134
135 #endif