]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/AliUnfolding.h
Change the task name from AliAnalysisTaskParticleCorrelation to AliAnalysisTaskCaloTr...
[u/mrichter/AliRoot.git] / ANALYSIS / AliUnfolding.h
1 /* $Id$ */
2
3 #ifndef ALIUNFOLDING_H
4 #define ALIUNFOLDING_H
5
6 //
7 // class that implements several unfolding methods
8 // I.e. chi2 minimization and bayesian unfolding
9 // The whole class is static and not thread-safe (due to the fact that MINUIT unfolding is not thread-safe)
10 //
11
12 // TMatrixD, TVectorD defined here, because it does not seem possible to predeclare these (or i do not know how)
13 // -->
14 // $ROOTSYS/include/TVectorDfwd.h:21: conflicting types for `typedef struct TVectorT<Double_t> TVectorD'
15 // PWG0/AliUnfolding.h:21: previous declaration as `struct TVectorD'
16
17 #include "TObject.h"
18 #include <TMatrixD.h>
19 #include <TVectorD.h>
20
21 class TH1;
22 class TH2;
23 class TF1;
24 class TCanvas;
25 class TVirtualPad;
26 class TAxis;
27
28 class AliUnfolding : public TObject
29 {
30   public:
31   enum RegularizationType { kNone = 0, kPol0, kPol1, kLog, kEntropy, kCurvature, kRatio, kPowerLaw, kLogLog };
32     enum MethodType { kInvalid = -1, kChi2Minimization = 0, kBayesian = 1, kFunction = 2};
33
34     virtual ~AliUnfolding() {};
35
36     static void SetUnfoldingMethod(MethodType methodType);
37     static void SetCreateOverflowBin(Float_t overflowBinLimit);
38     static void SetSkipBinsBegin(Int_t nBins);
39     static void SetNbins(Int_t nMeasured, Int_t nUnfolded);
40     static void SetChi2Regularization(RegularizationType type, Float_t weight);
41     static void SetMinuitStepSize(Float_t stepSize) { fgMinuitStepSize = stepSize; }
42     static void SetMinuitPrecision(Float_t pres) {fgMinuitPrecision = pres;}
43     static void SetMinuitMaxIterations(Int_t iter) {fgMinuitMaxIterations = iter;}
44     static void SetMinimumInitialValue(Bool_t flag, Float_t value = -1) { fgMinimumInitialValue = flag; fgMinimumInitialValueFix = value; }
45     static void SetNormalizeInput(Bool_t flag) { fgNormalizeInput = flag; }
46     static void SetNotFoundEvents(Float_t notFoundEvents) { fgNotFoundEvents = notFoundEvents; }
47     static void SetSkip0BinInChi2(Bool_t flag) { fgSkipBin0InChi2 = flag; }
48     static void SetBayesianParameters(Float_t smoothing, Int_t nIterations);
49     static void SetFunction(TF1* function);
50     static void SetDebug(Bool_t flag) { fgDebug = flag; }
51     static void SetPowern(Int_t n) {fgPowern = -1*n;}
52
53     static Int_t Unfold(TH2* correlation, TH1* efficiency, TH1* measured, TH1* initialConditions, TH1* result, Bool_t check = kFALSE);
54     static Int_t UnfoldGetBias(TH2* correlation, TH1* efficiency, TH1* measured, TH1* initialConditions, TH1* result);
55
56     static TH1* GetPenaltyPlot(Double_t* params);
57     static TH1* GetPenaltyPlot(TH1* corrected);
58
59     static TH1* GetResidualsPlot(Double_t* params);
60     static TH1* GetResidualsPlot(TH1* corrected);
61
62     static Double_t GetChi2FromFit() {return fChi2FromFit;}
63     static Double_t GetPenaltyVal()  {return fPenaltyVal;}
64     static Double_t GetAvgResidual() {return fAvgResidual;}
65
66     static void DrawResults(TH2* correlation, TH1* efficiency, TH1* measured, TH1* initialConditions, TCanvas *canvas = 0, Int_t reuseHists = kFALSE,TH1 *unfolded=0);
67     static void InteractiveUnfold(TH2* correlation, TH1* efficiency, TH1* measured, TH1* initialConditions);
68     static void RedrawInteractive();  
69
70   protected:
71     AliUnfolding() {};
72
73     static Int_t UnfoldWithMinuit(TH2* correlation, TH1* efficiency, TH1* measured, TH1* initialConditions, TH1* result, Bool_t check);
74     static Int_t UnfoldWithBayesian(TH2* correlation, TH1* aEfficiency, TH1* measured, TH1* initialConditions, TH1* aResult);
75     static Int_t UnfoldWithFunction(TH2* correlation, TH1* efficiency, TH1* measured, TH1* /* initialConditions */, TH1* aResult);
76
77     static void CreateOverflowBin(TH2* correlation, TH1* measured); 
78     static void SetStaticVariables(TH2* correlation, TH1* measured, TH1* efficiency);
79
80     static void MakePads();
81     static void DrawGuess(Double_t *params, TVirtualPad *pfolded=0, TVirtualPad *pres=0, TVirtualPad *ppen=0, Int_t reuseHists = kFALSE, TH1* unfolded=0);
82
83     static Double_t RegularizationPol0(TVectorD& params);
84     static Double_t RegularizationPol1(TVectorD& params);
85     static Double_t RegularizationTotalCurvature(TVectorD& params);
86     static Double_t RegularizationEntropy(TVectorD& params);
87     static Double_t RegularizationLog(TVectorD& params);
88     static Double_t RegularizationRatio(TVectorD& params);
89     static Double_t RegularizationPowerLaw(TVectorD& params);
90     static Double_t RegularizationLogLog(TVectorD& params);
91
92     static void Chi2Function(Int_t&, Double_t*, Double_t& chi2, Double_t *params, Int_t);
93     static void TF1Function(Int_t& unused1, Double_t* unused2, Double_t& chi2, Double_t *params, Int_t unused3);
94
95     // static variable to be accessed by MINUIT
96     static TMatrixD* fgCorrelationMatrix;            // contains fCurrentCorrelation in matrix form
97     static TMatrixD* fgCorrelationMatrixSquared;     // contains squared fCurrentCorrelation in matrix form
98     static TMatrixD* fgCorrelationCovarianceMatrix;  // contains the errors of fCurrentESD
99     static TVectorD* fgCurrentESDVector;             // contains fCurrentESD
100     static TVectorD* fgEntropyAPriori;               // a-priori distribution for entropy regularization
101     static TVectorD* fgEfficiency;                   // efficiency
102     /*
103     static TVectorD* fgBinWidths;                    // bin widths to be taken into account in regularization
104     static TVectorD* fgBinPos;                       // bin positions of unfolded
105     */
106     static TAxis *fgUnfoldedAxis;                    // bin widths and positions for unfolded
107     static TAxis *fgMeasuredAxis;                    // bin widths and positions for measured
108
109     static TF1* fgFitFunction;                       // fit function
110
111     // --- configuration params follow ---
112     static MethodType fgMethodType;                  // unfolding method to be used
113     static Int_t fgMaxParams;                        // bins in unfolded histogram = number of fit params
114     static Int_t fgMaxInput;                         // bins in measured histogram
115     static Float_t fgOverflowBinLimit;               // to fix fluctuations at high multiplicities, all entries above the limit are summarized in one bin
116
117     static RegularizationType fgRegularizationType;  // regularization that is used during Chi2 method
118     static Float_t fgRegularizationWeight;           // factor for regularization term
119     static Int_t fgSkipBinsBegin;                    // (optional) skip the given number of bins in the regularization
120     static Float_t fgMinuitStepSize;                 // (usually not needed to be changed) step size in minimization
121     static Float_t fgMinuitPrecision;                // precision used by minuit. default = 1e-6
122     static Int_t   fgMinuitMaxIterations;            // maximum number of iterations used by minuit. default = 5000
123     static Bool_t fgMinimumInitialValue;             // set all initial values at least to the smallest value among the initial values
124     static Float_t fgMinimumInitialValueFix;         // use this as the minimum initial value instead of determining it automatically
125     static Bool_t fgNormalizeInput;                  // normalize input spectrum
126     static Float_t fgNotFoundEvents;                 // constraint on the total number of not found events sum(guess * (1/eff -1))
127     static Bool_t fgSkipBin0InChi2;                  // skip bin 0 (= 0 measured) in chi2 function
128
129     static Float_t fgBayesianSmoothing;              // smoothing parameter (0 = no smoothing)
130     static Int_t   fgBayesianIterations;             // number of iterations in Bayesian method
131
132     static Bool_t fgDebug;                           // debug flag
133     // --- end of configuration ---
134     
135     static Int_t fgCallCount;                        // call count to chi2 function
136
137     static Int_t fgPowern;                           // power of power law for regularization with power law
138
139     static Double_t fChi2FromFit;                    // Chi2 from fit at current iteration
140     static Double_t fPenaltyVal;                     // Penalty value at current iteration (\beta * PU)
141     static Double_t fAvgResidual;                    // Sum residuals / nbins
142
143     static Int_t fgPrintChi2Details;                 // debug for chi2 calc
144
145     // Pointers for interactive unfolder
146     static TCanvas *fgCanvas;                        // Canvas for interactive unfolder
147     static TH1 *fghUnfolded;                         // Unfolding result for interactive unfolder
148     static TH2 *fghCorrelation;                      // Response matrix for interactive unfolder
149     static TH1 *fghEfficiency;                       // Efficiency histo for interactive unfolder
150     static TH1 *fghMeasured;                         // Measured distribution for interactive unfolder
151
152 private:
153     AliUnfolding(const AliUnfolding&);
154     AliUnfolding& operator=(const AliUnfolding&);
155
156   ClassDef(AliUnfolding, 0);
157 };
158
159 #endif
160