ROOT logo
/* $Id$ */

#ifndef ALIMULTIPLICITYCORRECTION_H
#define ALIMULTIPLICITYCORRECTION_H

#include "TNamed.h"

//
// class that contains the correction matrix and the functions for
// correction the multiplicity spectrum
// implements a several unfolding methods: e.g. chi2 minimization and bayesian unfolding
//

class TH1;
class TH2;
class TH1F;
class TH2F;
class TH3F;
class TF1;
class TCollection;

// defined here, because it does not seem possible to predeclare these (or i do not know how)
// -->
// $ROOTSYS/include/TVectorDfwd.h:21: conflicting types for `typedef struct TVectorT<Double_t> TVectorD'
// PWG0/dNdEta/AliMultiplicityCorrection.h:21: previous declaration as `struct TVectorD'

#include <TMatrixD.h>
#include <TVectorD.h>
#include <AliPWG0Helper.h>
#include <AliUnfolding.h>

class AliMultiplicityCorrection : public TNamed {
  public:
    enum EventType { kTrVtx = 0, kMB, kINEL, kNSD };
    enum { kESDHists = 3, kMCHists = 4, kCorrHists = 6, kQualityRegions = 3 };

    AliMultiplicityCorrection();
    AliMultiplicityCorrection(const Char_t* name, const Char_t* title);
    virtual ~AliMultiplicityCorrection();
    
    static AliMultiplicityCorrection* Open(const char* fileName, const char* folderName = "Multiplicity");

    virtual Long64_t Merge(const TCollection* list);

    void FillMeasured(Float_t vtx, Int_t measured05, Int_t measured10, Int_t measured14);
    void FillTriggeredEvent(Int_t measured05, Int_t measured10, Int_t measured14);
    void FillGenerated(Float_t vtx, Bool_t triggered, Bool_t vertex, AliPWG0Helper::MCProcessType processType, Int_t generated05, Int_t generated10, Int_t generated14, Int_t generatedAll);

    void FillCorrection(Float_t vtx, Int_t generated05, Int_t generated10, Int_t generated14, Int_t generatedAll, Int_t measured05, Int_t measured10, Int_t measured14);
    void FillNoVertexEvent(Float_t vtx, Bool_t vertexReconstructed, Int_t generated05, Int_t generated10, Int_t generated14, Int_t measured05, Int_t measured10, Int_t measured14);

    Bool_t LoadHistograms(const Char_t* dir = 0);
    void SaveHistograms(const char* dir = 0);
    void DrawHistograms();
    void Rebin2DY(TH2F*& hist, Int_t nBins, Double_t* newBins) const;
    void Rebin3DY(TH3F*& hist, Int_t nBins, Double_t* newBins) const;
    void RebinGenerated(Int_t nBins05, Double_t* newBins05, Int_t nBins10, Double_t* newBins10, Int_t nBins13, Double_t* newBins13);
    void DrawComparison(const char* name, Int_t inputRange, Bool_t fullPhaseSpace, Bool_t normalizeESD, TH1* mcHist, Bool_t simple = kFALSE, EventType eventType = kTrVtx);

    Int_t ApplyMinuitFit(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Int_t zeroBinEvents, Bool_t check = kFALSE, TH1* initialConditions = 0, Bool_t errorAsBias = kFALSE);

    void ApplyBayesianMethod(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Float_t regPar = 1, Int_t nIterations = 100, TH1* initialConditions = 0, Int_t determineError = 1);

    static TH1* CalculateStdDev(TH1** results, Int_t max);
    TH1* StatisticalUncertainty(AliUnfolding::MethodType methodType, Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType, Int_t zeroBinEvents, Bool_t randomizeMeasured, Bool_t randomizeResponse, const TH1* compareTo = 0);

    Int_t ApplyNBDFit(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType);
    void ApplyGaussianMethod(Int_t inputRange, Bool_t fullPhaseSpace);

    void ApplyLaszloMethod(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType);

    void Calculate0Bin(Int_t inputRange, EventType eventType, Int_t zeroBinEvents);
    Float_t GetFraction0Generated(Int_t inputRange);
    
    TH2F* GetMultiplicityESD(Int_t i) const { return fMultiplicityESD[i]; }
    TH1F* GetTriggeredEvents(Int_t i) const { return fTriggeredEvents[i]; }
    TH2F* GetMultiplicityVtx(Int_t i) const { return fMultiplicityVtx[i]; }
    TH2F* GetMultiplicityMB(Int_t i) const { return fMultiplicityMB[i]; }
    TH2F* GetMultiplicityINEL(Int_t i) const { return fMultiplicityINEL[i]; }
    TH2F* GetMultiplicityNSD(Int_t i) const { return fMultiplicityNSD[i]; }
    TH2F* GetMultiplicityMC(Int_t i, EventType eventType) const;
    TH3F* GetCorrelation(Int_t i) const { return fCorrelation[i]; }
    TH1F* GetNoVertexEvents(Int_t i) const { return fNoVertexEvents[i]; }
    TH1F* GetMultiplicityESDCorrected(Int_t i) const { return fMultiplicityESDCorrected[i]; }

    void SetMultiplicityESD(Int_t i, TH2F* const hist)  { fMultiplicityESD[i]  = hist; }
    void SetTriggeredEvents(Int_t i, TH1F* hist)  { fTriggeredEvents[i]  = hist; }
    void SetMultiplicityVtx(Int_t i, TH2F* const hist)  { fMultiplicityVtx[i]  = hist; }
    void SetMultiplicityMB(Int_t i, TH2F* const hist)   { fMultiplicityMB[i]   = hist; }
    void SetMultiplicityINEL(Int_t i, TH2F* const hist) { fMultiplicityINEL[i] = hist; }
    void SetMultiplicityNSD(Int_t i, TH2F* const hist) { fMultiplicityNSD[i] = hist; }
    void SetMultiplicityMC(Int_t i, EventType eventType, TH2F* const hist);
    void SetCorrelation(Int_t i, TH3F* const hist) { fCorrelation[i] = hist; }
    void SetNoVertexEvents(Int_t i, TH1F* hist) { fNoVertexEvents[i] = hist; }
    void SetMultiplicityESDCorrected(Int_t i, TH1F* const hist) { fMultiplicityESDCorrected[i] = hist; }

    void SetGenMeasFromFunc(const TF1* inputMC, Int_t id);
    TH2F* CalculateMultiplicityESD(TH1* inputMC, Int_t correlationMap);
    
    void FixTriggerEfficiencies(Int_t start);
    
    TH1* GetConvoluted(Int_t i, EventType eventType);
    TH1* GetResiduals(Int_t i, EventType eventType, Float_t& residualSum);

    void GetComparisonResults(Float_t* const mc = 0, Int_t* const mcLimit = 0, Float_t* const residuals = 0, Float_t* const ratioAverage = 0) const;

    TH1* GetEfficiency(Int_t inputRange, EventType eventType);
    TH1* GetTriggerEfficiency(Int_t inputRange, EventType eventType);

    static void SetQualityRegions(Bool_t SPDStudy);
    Float_t GetQuality(Int_t region) const { return fQuality[region]; }

    void FFT(Int_t dir, Int_t m, Double_t *x, Double_t *y) const;
    
    Float_t GetVertexBegin(Int_t i) { return fgVtxRangeBegin[i]; }
    Float_t GetVertexEnd(Int_t i) { return fgVtxRangeEnd[i]; }
    
    void SetVertexRange(Int_t begin, Int_t end) { fVtxBegin = begin; fVtxEnd = end; }

  protected:
    void SetupCurrentHists(Int_t inputRange, Bool_t fullPhaseSpace, EventType eventType);

    Float_t BayesCovarianceDerivate(Float_t matrixM[251][251], const TH2* hResponse, Int_t k, Int_t i, Int_t r, Int_t u);
    
    TH1* fCurrentESD;         //! current input esd
    TH2* fCurrentCorrelation; //! current correlation
    TH1* fCurrentEfficiency;  //! current efficiency

    TH2F* fMultiplicityESD[kESDHists]; // multiplicity histogram: vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.4 (0..2)
    TH1F* fTriggeredEvents[kESDHists]; // (raw) multiplicity distribution of triggered events; array: |eta| < 0.5, 1.0, 1.4 (0..2)
    TH1F* fNoVertexEvents[kESDHists];  // distribution of true multiplicity just of triggered events without vertex or with 0 tracklets; array: |eta| < 0.5, 1.0, 1.4 (0..2)

    TH2F* fMultiplicityVtx[kMCHists];  // multiplicity histogram of events that have a reconstructed vertex : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.4, inf (0..3)
    TH2F* fMultiplicityMB[kMCHists];   // multiplicity histogram of triggered events                        : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.4, inf (0..3)
    TH2F* fMultiplicityINEL[kMCHists]; // multiplicity histogram of all (inelastic) events                  : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.4, inf (0..3)
    TH2F* fMultiplicityNSD[kMCHists]; // multiplicity histogram of NSD events                  : vtx vs multiplicity; array: |eta| < 0.5, 1.0, 1.4, inf (0..3)

    TH3F* fCorrelation[kCorrHists];              // vtx vs. (gene multiplicity (trig+vtx)) vs. (meas multiplicity); array: |eta| < 0.5, 1, 1.4, (0..2 and 3..5), the first corrects to the eta range itself, the second to full phase space

    TH1F* fMultiplicityESDCorrected[kCorrHists]; // corrected histograms
    
    Int_t fLastBinLimit;        //! last bin limit, determined in SetupCurrentHists()
    Float_t fLastChi2MC;        //! last Chi2 between MC and unfolded ESD (calculated in DrawComparison)
    Int_t   fLastChi2MCLimit;   //! bin where the last chi2 breached a certain threshold, used to evaluate the multiplicity reach (calc. in DrawComparison)
    Float_t fLastChi2Residuals; //! last Chi2 of the ESD and the folded unfolded ESD (calculated in DrawComparison)
    Float_t fRatioAverage;      //! last average of |ratio-1| where ratio = unfolded / mc (bin 2..150)
    
    Int_t fVtxBegin;            //! vertex range for analysis
    Int_t fVtxEnd;              //! vertex range for analysis
    
    static Double_t fgVtxRangeBegin[kESDHists]; //! begin of allowed vertex range for this eta bin
    static Double_t fgVtxRangeEnd[kESDHists];   //! end of allowed vertex range for this eta bin

    static Int_t   fgQualityRegionsB[kQualityRegions]; //! begin, given in multiplicity units
    static Int_t   fgQualityRegionsE[kQualityRegions]; //! end
    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

 private:
    AliMultiplicityCorrection(const AliMultiplicityCorrection&);
    AliMultiplicityCorrection& operator=(const AliMultiplicityCorrection&);

  ClassDef(AliMultiplicityCorrection, 7);
};

#endif

 AliMultiplicityCorrection.h:1
 AliMultiplicityCorrection.h:2
 AliMultiplicityCorrection.h:3
 AliMultiplicityCorrection.h:4
 AliMultiplicityCorrection.h:5
 AliMultiplicityCorrection.h:6
 AliMultiplicityCorrection.h:7
 AliMultiplicityCorrection.h:8
 AliMultiplicityCorrection.h:9
 AliMultiplicityCorrection.h:10
 AliMultiplicityCorrection.h:11
 AliMultiplicityCorrection.h:12
 AliMultiplicityCorrection.h:13
 AliMultiplicityCorrection.h:14
 AliMultiplicityCorrection.h:15
 AliMultiplicityCorrection.h:16
 AliMultiplicityCorrection.h:17
 AliMultiplicityCorrection.h:18
 AliMultiplicityCorrection.h:19
 AliMultiplicityCorrection.h:20
 AliMultiplicityCorrection.h:21
 AliMultiplicityCorrection.h:22
 AliMultiplicityCorrection.h:23
 AliMultiplicityCorrection.h:24
 AliMultiplicityCorrection.h:25
 AliMultiplicityCorrection.h:26
 AliMultiplicityCorrection.h:27
 AliMultiplicityCorrection.h:28
 AliMultiplicityCorrection.h:29
 AliMultiplicityCorrection.h:30
 AliMultiplicityCorrection.h:31
 AliMultiplicityCorrection.h:32
 AliMultiplicityCorrection.h:33
 AliMultiplicityCorrection.h:34
 AliMultiplicityCorrection.h:35
 AliMultiplicityCorrection.h:36
 AliMultiplicityCorrection.h:37
 AliMultiplicityCorrection.h:38
 AliMultiplicityCorrection.h:39
 AliMultiplicityCorrection.h:40
 AliMultiplicityCorrection.h:41
 AliMultiplicityCorrection.h:42
 AliMultiplicityCorrection.h:43
 AliMultiplicityCorrection.h:44
 AliMultiplicityCorrection.h:45
 AliMultiplicityCorrection.h:46
 AliMultiplicityCorrection.h:47
 AliMultiplicityCorrection.h:48
 AliMultiplicityCorrection.h:49
 AliMultiplicityCorrection.h:50
 AliMultiplicityCorrection.h:51
 AliMultiplicityCorrection.h:52
 AliMultiplicityCorrection.h:53
 AliMultiplicityCorrection.h:54
 AliMultiplicityCorrection.h:55
 AliMultiplicityCorrection.h:56
 AliMultiplicityCorrection.h:57
 AliMultiplicityCorrection.h:58
 AliMultiplicityCorrection.h:59
 AliMultiplicityCorrection.h:60
 AliMultiplicityCorrection.h:61
 AliMultiplicityCorrection.h:62
 AliMultiplicityCorrection.h:63
 AliMultiplicityCorrection.h:64
 AliMultiplicityCorrection.h:65
 AliMultiplicityCorrection.h:66
 AliMultiplicityCorrection.h:67
 AliMultiplicityCorrection.h:68
 AliMultiplicityCorrection.h:69
 AliMultiplicityCorrection.h:70
 AliMultiplicityCorrection.h:71
 AliMultiplicityCorrection.h:72
 AliMultiplicityCorrection.h:73
 AliMultiplicityCorrection.h:74
 AliMultiplicityCorrection.h:75
 AliMultiplicityCorrection.h:76
 AliMultiplicityCorrection.h:77
 AliMultiplicityCorrection.h:78
 AliMultiplicityCorrection.h:79
 AliMultiplicityCorrection.h:80
 AliMultiplicityCorrection.h:81
 AliMultiplicityCorrection.h:82
 AliMultiplicityCorrection.h:83
 AliMultiplicityCorrection.h:84
 AliMultiplicityCorrection.h:85
 AliMultiplicityCorrection.h:86
 AliMultiplicityCorrection.h:87
 AliMultiplicityCorrection.h:88
 AliMultiplicityCorrection.h:89
 AliMultiplicityCorrection.h:90
 AliMultiplicityCorrection.h:91
 AliMultiplicityCorrection.h:92
 AliMultiplicityCorrection.h:93
 AliMultiplicityCorrection.h:94
 AliMultiplicityCorrection.h:95
 AliMultiplicityCorrection.h:96
 AliMultiplicityCorrection.h:97
 AliMultiplicityCorrection.h:98
 AliMultiplicityCorrection.h:99
 AliMultiplicityCorrection.h:100
 AliMultiplicityCorrection.h:101
 AliMultiplicityCorrection.h:102
 AliMultiplicityCorrection.h:103
 AliMultiplicityCorrection.h:104
 AliMultiplicityCorrection.h:105
 AliMultiplicityCorrection.h:106
 AliMultiplicityCorrection.h:107
 AliMultiplicityCorrection.h:108
 AliMultiplicityCorrection.h:109
 AliMultiplicityCorrection.h:110
 AliMultiplicityCorrection.h:111
 AliMultiplicityCorrection.h:112
 AliMultiplicityCorrection.h:113
 AliMultiplicityCorrection.h:114
 AliMultiplicityCorrection.h:115
 AliMultiplicityCorrection.h:116
 AliMultiplicityCorrection.h:117
 AliMultiplicityCorrection.h:118
 AliMultiplicityCorrection.h:119
 AliMultiplicityCorrection.h:120
 AliMultiplicityCorrection.h:121
 AliMultiplicityCorrection.h:122
 AliMultiplicityCorrection.h:123
 AliMultiplicityCorrection.h:124
 AliMultiplicityCorrection.h:125
 AliMultiplicityCorrection.h:126
 AliMultiplicityCorrection.h:127
 AliMultiplicityCorrection.h:128
 AliMultiplicityCorrection.h:129
 AliMultiplicityCorrection.h:130
 AliMultiplicityCorrection.h:131
 AliMultiplicityCorrection.h:132
 AliMultiplicityCorrection.h:133
 AliMultiplicityCorrection.h:134
 AliMultiplicityCorrection.h:135
 AliMultiplicityCorrection.h:136
 AliMultiplicityCorrection.h:137
 AliMultiplicityCorrection.h:138
 AliMultiplicityCorrection.h:139
 AliMultiplicityCorrection.h:140
 AliMultiplicityCorrection.h:141
 AliMultiplicityCorrection.h:142
 AliMultiplicityCorrection.h:143
 AliMultiplicityCorrection.h:144
 AliMultiplicityCorrection.h:145
 AliMultiplicityCorrection.h:146
 AliMultiplicityCorrection.h:147
 AliMultiplicityCorrection.h:148
 AliMultiplicityCorrection.h:149
 AliMultiplicityCorrection.h:150
 AliMultiplicityCorrection.h:151
 AliMultiplicityCorrection.h:152
 AliMultiplicityCorrection.h:153
 AliMultiplicityCorrection.h:154
 AliMultiplicityCorrection.h:155
 AliMultiplicityCorrection.h:156
 AliMultiplicityCorrection.h:157
 AliMultiplicityCorrection.h:158
 AliMultiplicityCorrection.h:159
 AliMultiplicityCorrection.h:160
 AliMultiplicityCorrection.h:161
 AliMultiplicityCorrection.h:162
 AliMultiplicityCorrection.h:163
 AliMultiplicityCorrection.h:164
 AliMultiplicityCorrection.h:165
 AliMultiplicityCorrection.h:166