ROOT logo
#ifndef __AliAnaChargedJetResponseMaker_h__
#define __AliAnaChargedJetResponseMaker_h__
#include "Rtypes.h"
#include "TH1.h"
#include "TCanvas.h"
#include "TMath.h"
#include "TH2.h"
#include "TProfile.h"
#include "THnSparse.h"

class TGraph;
class TGraphErrors;

//
// Measured spectrum defines minimum and maximum pT on the reconstructed axis of the response matrix. To be set with SetMeasuredSpectrum(TH1D *hPtMeasured);
//

class AliAnaChargedJetResponseMaker {
 public:
  AliAnaChargedJetResponseMaker();
  AliAnaChargedJetResponseMaker(const AliAnaChargedJetResponseMaker& obj); // copy constructor
  AliAnaChargedJetResponseMaker& operator=(const AliAnaChargedJetResponseMaker& other); // assignment
  virtual ~AliAnaChargedJetResponseMaker() {;}

  // kParam        = use parametrization of response 
  // kResiduals    = use response as measured, w/o  statistical error propagation
  // kResidualsErr = use response as measured, with statistical error propagation
  enum ResolutionType {kParam,kResiduals,kResidualsErr}; 

  //Setters
  virtual void SetDebugMode(Bool_t b) {fDebug=b;}

  virtual void SetResolutionType(ResolutionType r) {fResolutionType=r;}

  virtual void SetDeltaPtJetsFunc(TF1 *f1)  {fDeltaPt=f1;}
  virtual void SetDeltaPtJetsHist(TH1D *h1) {fhDeltaPt=h1;}
  virtual void SetNDimensions(Int_t dim)    {fDimensions = dim;}
  virtual void SetMeasuredSpectrum(TH1D *hPtMeasured);
  virtual void SetMeasuredSpectrumTruncated(TH1D *h1) {fh1MeasuredTruncated=h1;}

  virtual void SetDetectorResponse(TH2 *h2) {fh2DetectorResponse=(TH2D*)h2;}
  virtual void SetDetectorEfficiency(TH1D *h1) {fhEfficiencyDet=h1;}

  virtual void SetFlatEfficiency(Double_t eff);
  virtual void SetEfficiency(TGraphErrors *grEff);

  virtual void SetPtMinUnfolded(Double_t ptmin)      {fPtMinUnfolded = ptmin;}
  virtual void SetPtMaxUnfolded(Double_t ptmax)      {fPtMaxUnfolded = ptmax;}
  virtual void SetPtMaxUnfoldedHigh(Double_t ptmaxh) {fPtMaxUnfoldedHigh = ptmaxh;}
  virtual void SetBinWidthFactorUnfolded(Int_t fac)  {fBinWidthFactorUnfolded = fac;}
  virtual void SetSkipBinsUnfolded(Int_t skip)       {fSkipBinsUnfolded=skip;}
  virtual void SetExtraBinsUnfolded(Int_t extra)     {fExtraBinsUnfolded=extra;}
  virtual void SetVariableBinning(Bool_t b, double ptmax) {
    fbVariableBinning=b;
    fPtMaxUnfVarBinning=ptmax;
  }
  virtual void SetCalcErrors(Bool_t b) {fbCalcErrors=b;}

  //Setters for merging fine to normal response matrix
  virtual void SetFineFrac(Int_t i = 10)         {fFineFrac = i;}
  virtual void SetRMMergeWeightFunction(TF1 *f1) {f1MergeFunction = f1;}

  //Getters
  virtual TF1       *GetDeltaPtJetsFunc() {return fDeltaPt;}
  virtual TH1D      *GetDeltaPtJetsHist() {return fhDeltaPt;}
  virtual THnSparse *GetMeasuredSpectrum() {return fPtMeasured;}
  virtual THnSparse *GetEfficiency() {return fEfficiency;}
  virtual THnSparse *GetEfficiencyFine() {return fEfficiencyFine;}
  virtual THnSparse *GetResponseMatrix() {return fResponseMatrix;}
  virtual THnSparse *GetResponseMatrixFine() {return fResponseMatrixFine;}

  virtual TH2D      *GetDetectorResponseRebin() {return fh2DetectorResponseRebin;}

  virtual Bool_t CheckInputForCombinedResponse();

  virtual TH2D      *GetResponseCombinedFineFull() {return fh2ResponseMatrixCombinedFineFull;}
  virtual TH2D      *GetResponseCombinedFull() {return fh2ResponseMatrixCombinedFull;}

  virtual TH2D      *GetResponseCombined() {return fh2ResponseMatrixCombined;}
  virtual TH1D      *GetEfficiencyCombined() {return fhEfficiencyCombined;}

  static Double_t   GetBetaPerDOFValue(Int_t betaColl = 0, Int_t betaOpt= 0);

  //Utility functions
  virtual Double_t InterpolateFast(TGraph *gr, Double_t x);
  virtual Double_t InterpolateFast(TH1 *h, Double_t x);

  virtual TH1D *MultiplyResponseGenerated(TH1 *hGen=0, TH2 *hResponse=0,TH1 *hEfficiency=0,Bool_t bDrawSlices=kFALSE);
  virtual TH1D *MultiplyResponseGenerated(TF1 *fGen, TH2 *hResponse,TH1 *hEfficiency);

  virtual void MakeResponseMatrixCombined(Int_t skipBins =0, Int_t binWidthFactor = 2, Int_t extraBins = 0, Bool_t bVariableBinning = kFALSE, Double_t ptmin = 0.);

  virtual void MakeResponseMatrixJetsFineMerged(Int_t skipBins =0, Int_t binWidthFactor = 2, Int_t extraBins = 0, Bool_t bVariableBinning = kFALSE, Double_t ptmin = 0.);

  virtual void InitializeResponseMatrix();
  virtual void InitializeResponseMatrixFine();

  virtual void InitializeEfficiency();
  virtual void InitializeEfficiencyFine();

  virtual void FillResponseMatrixFineAndMerge();

  virtual TH2* MakeResponseMatrixRebin(TH2 *hRMFine = 0, TH2 *hRM = 0, Bool_t useFunctionWeight = kFALSE);

  virtual TH2* CreateTruncated2DHisto(TH2 *h2=0, Double_t xmin=-1, Double_t xmax=-1, Double_t ymin=-1, Double_t ymax=-1);
  virtual TH2* TruncateAxisRangeResponseMatrix(TH2 *hRMOrig=0,  Double_t xmin=-1, Double_t xmax=-1, Double_t ymin=-1, Double_t ymax=-1);

  virtual TH2* MultiplityResponseMatrices(TH2 *h2RMDeltaPt, TH2 *h2RMDetector);

  virtual TH2* GetTransposeResponsMatrix(TH2 *h2RM);

  virtual TH2* NormalizeResponsMatrixYaxisWithPrior(TH2 *h2RM, TH1 *hPrior);

 protected:
  Bool_t      fDebug;
  ResolutionType fResolutionType;
  TF1        *fDeltaPt;
  TH1D       *fhDeltaPt;
  TH1D       *fh1MeasuredTruncated;
  TH2D       *fh2DetectorResponse;
  TH2D       *fh2DetectorResponseRebin;
  TH1D       *fhEfficiencyDet;
  TH2D       *fh2ResponseMatrixCombinedFineFull;
  TH2D       *fh2ResponseMatrixCombinedFull;
  TH2D       *fh2ResponseMatrixCombined;
  TH1D       *fhEfficiencyCombined;
  Int_t       fDimensions; //number of dimensions to unfold (class only prepared for 1 dimension -> 2D response matrix)
  Int_t       fDimRec;
  Int_t       fDimGen;
  Double_t    fPtMin;
  Double_t    fPtMax;
  Int_t       fNbins;
  Double_t   *fBinArrayPtRec;
  THnSparse  *fPtMeasured;
  Double_t    fEffFlat;
  THnSparse  *fEfficiency;
  THnSparse  *fEfficiencyFine;
  THnSparse  *fResponseMatrix;
  THnSparse  *fResponseMatrixFine;
  Double_t    fPtMinUnfolded;          //Minimum pt for unfolded spectrum
  Double_t    fPtMaxUnfolded;          //Maximum pt for unfolded spectrum
  Double_t    fPtMaxUnfoldedHigh;      //Extend last bin of unfolded axis up to fPtMaxUnfoldedHigh
  Int_t       fBinWidthFactorUnfolded; //Unfolded bins x times wider than measured
  Int_t       fSkipBinsUnfolded;       //#unfolded bins to be skipped starting from fPtMinUnfolded
  Int_t       fExtraBinsUnfolded;      //Extra unfolded bins for pTUnf>pTMeas
  Bool_t      fbVariableBinning;       //Unfolded bins 2x narrower for pTUnf<pTMaxUnfVarBinning compared to bin width for pTUnf>pTMaxUnfVarBinning
  Double_t    fPtMaxUnfVarBinning;
  TF1        *f1MergeFunction;
  Int_t       fFineFrac;
  Bool_t      fbCalcErrors;

  ClassDef(AliAnaChargedJetResponseMaker,0);
    
};

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