]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG0/multiplicity/AliMultiplicityCorrection.h
small mods for separate task
[u/mrichter/AliRoot.git] / PWG0 / multiplicity / AliMultiplicityCorrection.h
CommitLineData
3602328d 1/* $Id$ */
2
0a173978 3#ifndef ALIMULTIPLICITYCORRECTION_H
4#define ALIMULTIPLICITYCORRECTION_H
5
3602328d 6#include "TNamed.h"
0a173978 7
8//
9// class that contains the correction matrix and the functions for
10// correction the multiplicity spectrum
6d81c2de 11// implements a several unfolding methods: e.g. chi2 minimization and bayesian unfolding
0a173978 12//
13
14class TH1;
15class TH2;
16class TH1F;
17class TH2F;
18class TH3F;
3602328d 19class TF1;
20class TCollection;
0a173978 21
6d81c2de 22// defined here, because it does not seem possible to predeclare these (or i do not know how)
23// -->
24// $ROOTSYS/include/TVectorDfwd.h:21: conflicting types for `typedef struct TVectorT<Double_t> TVectorD'
25// PWG0/dNdEta/AliMultiplicityCorrection.h:21: previous declaration as `struct TVectorD'
26
447c325d 27#include <TMatrixD.h>
28#include <TVectorD.h>
69b09e3b 29#include <AliPWG0Helper.h>
cfc19dd5 30
0a173978 31class AliMultiplicityCorrection : public TNamed {
32 public:
69b09e3b 33 enum EventType { kTrVtx = 0, kMB, kINEL, kNSD };
0b4bfd98 34 enum RegularizationType { kNone = 0, kPol0, kPol1, kLog, kEntropy, kCurvature };
6d81c2de 35 enum MethodType { kChi2Minimization = 0, kBayesian = 1 };
0b4bfd98 36 enum { kESDHists = 4, kMCHists = 5, kCorrHists = 8, kQualityRegions = 3 };
cfc19dd5 37
0a173978 38 AliMultiplicityCorrection();
39 AliMultiplicityCorrection(const Char_t* name, const Char_t* title);
40 virtual ~AliMultiplicityCorrection();
69b09e3b 41
42 static AliMultiplicityCorrection* Open(const char* fileName, const char* folderName = "Multiplicity");
0a173978 43
44 virtual Long64_t Merge(TCollection* list);
45
46 void FillMeasured(Float_t vtx, Int_t measured05, Int_t measured10, Int_t measured15, Int_t measured20);
69b09e3b 47 void FillGenerated(Float_t vtx, Bool_t triggered, Bool_t vertex, AliPWG0Helper::MCProcessType processType, Int_t generated05, Int_t generated10, Int_t generated15, Int_t generated20, Int_t generatedAll);
0a173978 48
49 void FillCorrection(Float_t vtx, Int_t generated05, Int_t generated10, Int_t generated15, Int_t generated20, Int_t generatedAll, Int_t measured05, Int_t measured10, Int_t measured15, Int_t measured20);
50
0b4bfd98 51 Bool_t LoadHistograms(const Char_t* dir = 0);
144ff489 52 void SaveHistograms(const char* dir = 0);
0a173978 53 void DrawHistograms();
447c325d 54 void DrawComparison(const char* name, Int_t inputRange, Bool_t fullPhaseSpace, Bool_t normalizeESD, TH1* mcHist, Bool_t simple = kFALSE);
0a173978 55
6d81c2de 56 Int_t ApplyMinuitFit(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Bool_t check = kFALSE, TH1* initialConditions = 0);
44466df2 57
58 static void SetRegularizationParameters(RegularizationType type, Float_t weight, Int_t minuitParams = -1);
59 static void SetBayesianParameters(Float_t smoothing, Int_t nIterations);
60 static void SetCreateBigBin(Bool_t flag) { fgCreateBigBin = flag; }
0a173978 61
dd701109 62 void ApplyNBDFit(Int_t inputRange, Bool_t fullPhaseSpace);
63
6d81c2de 64 void ApplyBayesianMethod(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Float_t regPar = 1, Int_t nIterations = 100, TH1* initialConditions = 0, Bool_t determineError = kTRUE);
65
0f67a57c 66 static TH1* CalculateStdDev(TH1** results, Int_t max);
6d81c2de 67 TH1* StatisticalUncertainty(MethodType methodType, Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Bool_t randomizeMeasured, Bool_t randomizeResponse, TH1* compareTo = 0);
0a173978 68
9ca6be09 69 void ApplyGaussianMethod(Int_t inputRange, Bool_t fullPhaseSpace);
70
cfc19dd5 71 void ApplyLaszloMethod(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType);
72
0a173978 73 TH2F* GetMultiplicityESD(Int_t i) { return fMultiplicityESD[i]; }
cfc19dd5 74 TH2F* GetMultiplicityVtx(Int_t i) { return fMultiplicityVtx[i]; }
75 TH2F* GetMultiplicityMB(Int_t i) { return fMultiplicityMB[i]; }
76 TH2F* GetMultiplicityINEL(Int_t i) { return fMultiplicityINEL[i]; }
69b09e3b 77 TH2F* GetMultiplicityNSD(Int_t i) { return fMultiplicityNSD[i]; }
cfc19dd5 78 TH2F* GetMultiplicityMC(Int_t i, EventType eventType);
0a173978 79 TH3F* GetCorrelation(Int_t i) { return fCorrelation[i]; }
dd701109 80 TH1F* GetMultiplicityESDCorrected(Int_t i) { return fMultiplicityESDCorrected[i]; }
0a173978 81
0b4bfd98 82 void SetMultiplicityESD(Int_t i, TH2F* hist) { fMultiplicityESD[i] = hist; }
83 void SetMultiplicityVtx(Int_t i, TH2F* hist) { fMultiplicityVtx[i] = hist; }
84 void SetMultiplicityMB(Int_t i, TH2F* hist) { fMultiplicityMB[i] = hist; }
cfc19dd5 85 void SetMultiplicityINEL(Int_t i, TH2F* hist) { fMultiplicityINEL[i] = hist; }
69b09e3b 86 void SetMultiplicityNSD(Int_t i, TH2F* hist) { fMultiplicityNSD[i] = hist; }
87 void SetMultiplicityMC(Int_t i, EventType eventType, TH2F* hist);
9ca6be09 88 void SetCorrelation(Int_t i, TH3F* hist) { fCorrelation[i] = hist; }
dd701109 89 void SetMultiplicityESDCorrected(Int_t i, TH1F* hist) { fMultiplicityESDCorrected[i] = hist; }
9ca6be09 90
3602328d 91 void SetGenMeasFromFunc(TF1* inputMC, Int_t id);
447c325d 92 TH2F* CalculateMultiplicityESD(TH1* inputMC, Int_t correlationMap);
3602328d 93
6d81c2de 94 void GetComparisonResults(Float_t* mc = 0, Int_t* mcLimit = 0, Float_t* residuals = 0, Float_t* ratioAverage = 0) const;
cfc19dd5 95
0b4bfd98 96 TH1* GetEfficiency(Int_t inputRange, EventType eventType);
69b09e3b 97 TH1* GetTriggerEfficiency(Int_t inputRange);
0b4bfd98 98
99 static void SetQualityRegions(Bool_t SPDStudy);
6d81c2de 100 Float_t GetQuality(Int_t region) const { return fQuality[region]; }
0b4bfd98 101
102 void FFT(Int_t dir, Int_t m, Double_t *x, Double_t *y);
0a173978 103
0b4bfd98 104 protected:
6d81c2de 105 static const Int_t fgkMaxParams; //! bins in unfolded histogram = number of fit params
106 static const Int_t fgkMaxInput; //! bins in measured histogram
0a173978 107
447c325d 108 static Double_t RegularizationPol0(TVectorD& params);
109 static Double_t RegularizationPol1(TVectorD& params);
110 static Double_t RegularizationTotalCurvature(TVectorD& params);
111 static Double_t RegularizationEntropy(TVectorD& params);
0b4bfd98 112 static Double_t RegularizationLog(TVectorD& params);
9ca6be09 113
0a173978 114 static void MinuitFitFunction(Int_t&, Double_t*, Double_t& chi2, Double_t *params, Int_t);
dd701109 115 static void MinuitNBD(Int_t& unused1, Double_t* unused2, Double_t& chi2, Double_t *params, Int_t unused3);
0a173978 116
0f67a57c 117 static void DrawGuess(Double_t *params);
118
447c325d 119 void SetupCurrentHists(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Bool_t createBigBin);
cfc19dd5 120
0b4bfd98 121 Float_t BayesCovarianceDerivate(Float_t matrixM[251][251], TH2* hResponse, Int_t k, Int_t i, Int_t r, Int_t u);
6d81c2de 122 static Int_t UnfoldWithBayesian(TH1* correlation, TH1* aEfficiency, TH1* measured, TH1* initialConditions, TH1* aResult, Float_t regPar, Int_t nIterations);
123 static Int_t UnfoldWithMinuit(TH1* correlation, TH1* aEfficiency, TH1* measured, TH1* initialConditions, TH1* result, Bool_t check);
124
7307d52c 125 TH1* fCurrentESD; //! current input esd
126 TH1* fCurrentCorrelation; //! current correlation
127 TH1* fCurrentEfficiency; //! current efficiency
9ca6be09 128
6d81c2de 129 // static variable to be accessed by MINUIT
130 static TMatrixD* fgCorrelationMatrix; //! contains fCurrentCorrelation in matrix form
131 static TMatrixD* fgCorrelationCovarianceMatrix; //! contains the errors of fCurrentESD
132 static TVectorD* fgCurrentESDVector; //! contains fCurrentESD
133 static TVectorD* fgEntropyAPriori; //! a-priori distribution for entropy regularization
cfc19dd5 134
6d81c2de 135 static TF1* fgNBD; //! negative binomial distribution
cfc19dd5 136
44466df2 137 // configuration params follow
6d81c2de 138 static RegularizationType fgRegularizationType; //! regularization that is used during Chi2 method
139 static Float_t fgRegularizationWeight; //! factor for regularization term
44466df2 140 static Bool_t fgCreateBigBin; //! to fix fluctuations at high multiplicities, all entries above a certain limit are summarized in one bin
141 static Int_t fgNParamsMinuit; //! number of parameters minuit uses for unfolding (todo: to be merged w/ fgkMaxParams that has to be const. for the moment)
dd701109 142
6d81c2de 143 static Float_t fgBayesianSmoothing; //! smoothing parameter (0 = no smoothing)
144 static Int_t fgBayesianIterations; //! number of iterations in Bayesian method
44466df2 145 // end of configuration
0a173978 146
69b09e3b 147 TH2F* fMultiplicityESD[kESDHists]; // multiplicity histogram: vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.5, 2 (0..3)
6d81c2de 148
69b09e3b 149 TH2F* fMultiplicityVtx[kMCHists]; // multiplicity histogram of events that have a reconstructed vertex : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.5, 2, inf (0..4)
150 TH2F* fMultiplicityMB[kMCHists]; // multiplicity histogram of triggered events : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.5, 2, inf (0..4)
151 TH2F* fMultiplicityINEL[kMCHists]; // multiplicity histogram of all (inelastic) events : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.5, 2, inf (0..4)
152 TH2F* fMultiplicityNSD[kMCHists]; // multiplicity histogram of NSD events : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.5, 2, inf (0..4)
0a173978 153
cfc19dd5 154 TH3F* fCorrelation[kCorrHists]; // vtx vs. (gene multiplicity (trig+vtx)) vs. (meas multiplicity); array: |eta| < 0.5, 1, 1.5, 2 (0..3 and 4..7), the first corrects to the eta range itself, the second to full phase space
6d81c2de 155
0a173978 156 TH1F* fMultiplicityESDCorrected[kCorrHists]; // corrected histograms
157
0f67a57c 158 Int_t fLastBinLimit; //! last bin limit, determined in SetupCurrentHists()
6d81c2de 159 Float_t fLastChi2MC; //! last Chi2 between MC and unfolded ESD (calculated in DrawComparison)
160 Int_t fLastChi2MCLimit; //! bin where the last chi2 breached a certain threshold, used to evaluate the multiplicity reach (calc. in DrawComparison)
161 Float_t fLastChi2Residuals; //! last Chi2 of the ESD and the folded unfolded ESD (calculated in DrawComparison)
162 Float_t fRatioAverage; //! last average of |ratio-1| where ratio = unfolded / mc (bin 2..150)
0b4bfd98 163
6d81c2de 164 static Int_t fgQualityRegionsB[kQualityRegions]; //! begin, given in multiplicity units
165 static Int_t fgQualityRegionsE[kQualityRegions]; //! end
166 Float_t fQuality[kQualityRegions]; //! stores the quality of the last comparison (calculated in DrawComparison). Contains 3 values that are averages of (MC - unfolded) / e(MC) in 3 regions, these are defined in fQualityRegionB,E
cfc19dd5 167
0a173978 168 private:
169 AliMultiplicityCorrection(const AliMultiplicityCorrection&);
170 AliMultiplicityCorrection& operator=(const AliMultiplicityCorrection&);
171
69b09e3b 172 ClassDef(AliMultiplicityCorrection, 4);
0a173978 173};
174
175#endif
0f81f352 176