ROOT logo
//
// Utility class to do jet-by-jet correction
// Based on templates of ptJet vs ptTrack vs r
//
// Author: M.Verweij

#include "TH2.h"
#include "TH3.h"
#include "TMath.h"
#include "TRandom3.h"
#include "TLorentzVector.h"
#include "AliEmcalJet.h"
#include "AliVParticle.h"

#include "AliEmcalJetByJetCorrection.h"

ClassImp(AliEmcalJetByJetCorrection)

//__________________________________________________________________________
AliEmcalJetByJetCorrection::AliEmcalJetByJetCorrection() :
TNamed(),
  fh3JetPtDRTrackPt(0x0),
  fBinWidthJetPt(10.),
  fJetPtMin(0.),
  fJetPtMax(150.),
  fCollTemplates(),
  fInitialized(kFALSE),
  fEfficiencyFixed(1.),
  fhEfficiency(0)
{
  // Dummy constructor.
  fCollTemplates.SetOwner(kTRUE);
}

//__________________________________________________________________________
AliEmcalJetByJetCorrection::AliEmcalJetByJetCorrection(const char* name) :
  TNamed(name, name),
  fh3JetPtDRTrackPt(0x0),
  fBinWidthJetPt(10.),
  fJetPtMin(0.),
  fJetPtMax(150.),
  fCollTemplates(),
  fInitialized(kFALSE),
  fEfficiencyFixed(1.),
  fhEfficiency(0)
{
  // Default constructor.
  fCollTemplates.SetOwner(kTRUE);
}

//__________________________________________________________________________
AliEmcalJetByJetCorrection::AliEmcalJetByJetCorrection(const AliEmcalJetByJetCorrection &other) :
  TNamed(other),
  fh3JetPtDRTrackPt(other.fh3JetPtDRTrackPt),
  fBinWidthJetPt(other.fBinWidthJetPt),
  fJetPtMin(other.fJetPtMin),
  fJetPtMax(other.fJetPtMax),
  fCollTemplates(other.fCollTemplates),
  fInitialized(other.fInitialized),
  fEfficiencyFixed(other.fEfficiencyFixed),
  fhEfficiency(other.fhEfficiency)
{
  // Copy constructor.
}

//__________________________________________________________________________
AliEmcalJetByJetCorrection& AliEmcalJetByJetCorrection::operator=(const AliEmcalJetByJetCorrection &other)
{
  // Assignment
  if (&other == this) return *this;
  TNamed::operator=(other);
  fh3JetPtDRTrackPt = other.fh3JetPtDRTrackPt;
  fBinWidthJetPt     = other.fBinWidthJetPt;
  fJetPtMin          = other.fJetPtMin;
  fJetPtMax          = other.fJetPtMax;
  fCollTemplates     = other.fCollTemplates;
  fInitialized       = other.fInitialized;
  fEfficiencyFixed   = other.fEfficiencyFixed;
  fhEfficiency       = other.fhEfficiency;

  return *this;
}

//__________________________________________________________________________
AliEmcalJet* AliEmcalJetByJetCorrection::Eval(const AliEmcalJet *jet, TClonesArray *fTracks) {

  if(!fInitialized) {
    Printf("AliEmcalJetByJetCorrection %s not initialized",GetName());
    return NULL;
  }

  Int_t bin = GetJetPtBin(jet->Pt());
  if(bin<0 || bin>fCollTemplates.GetEntriesFast()) return NULL;

  TH2D *hTemplate = static_cast<TH2D*>(fCollTemplates.At(bin));
  
  Double_t meanPt = GetMeanPtConstituents(jet,fTracks);
  Double_t eff = GetEfficiency(meanPt);

  Int_t np = TMath::FloorNint((double)jet->GetNumberOfTracks() * (1./eff -1.));

  TLorentzVector corrVec; corrVec.SetPtEtaPhiM(jet->Pt(),jet->Eta(),jet->Phi(),jet->M());

  Double_t mass = 0.13957; //pion mass

  for(Int_t i = 0; i<np; i++) {
    Double_t r;
    Double_t pt;
    hTemplate->GetRandom2(r,pt);
    Double_t t = TMath::TwoPi()*gRandom->Uniform(1.);
    Double_t deta = r*TMath::Cos(t);
    Double_t dphi = r*TMath::Sin(t);
    TLorentzVector curVec; 
    curVec.SetPtEtaPhiM(pt,deta+jet->Eta(),dphi+jet->Phi(),mass);
    corrVec+=curVec;
  }

  AliEmcalJet *jetCorr = new AliEmcalJet(corrVec.Pt(),corrVec.Eta(),corrVec.Phi(),corrVec.M());

  return jetCorr;
}

//__________________________________________________________________________
void AliEmcalJetByJetCorrection::Init() {
  //Init templates

  if(!fh3JetPtDRTrackPt) {
    Printf("%s fh3JetPtDRTrackPt not known",GetName());
    fInitialized = kFALSE;
    return;
  }

  if(fJetPtMax>fh3JetPtDRTrackPt->GetXaxis()->GetXmax())
    fJetPtMax = fh3JetPtDRTrackPt->GetXaxis()->GetXmax();

  if(fJetPtMin<fh3JetPtDRTrackPt->GetXaxis()->GetXmin())
    fJetPtMin = fh3JetPtDRTrackPt->GetXaxis()->GetXmin();

  Double_t eps = 0.00001;
  Int_t counter = 0;
  for(Double_t ptmin = fJetPtMin; ptmin<fJetPtMax; ptmin+=fBinWidthJetPt) {
    Int_t binMin = fh3JetPtDRTrackPt->GetXaxis()->FindBin(ptmin+eps);
    Int_t binMax = fh3JetPtDRTrackPt->GetXaxis()->FindBin(ptmin+fBinWidthJetPt-eps);
    //    Printf("%d bins: %d - %d -> %f - %f",counter,binMin,binMax,fh3JetPtDRTrackPt->GetXaxis()->GetBinLowEdge(binMin),fh3JetPtDRTrackPt->GetXaxis()->GetBinUpEdge(binMax));

    fh3JetPtDRTrackPt->GetXaxis()->SetRange(binMin,binMax);
    TH2D *h2 = dynamic_cast<TH2D*>(fh3JetPtDRTrackPt->Project3D("zy"));
    h2->SetName(Form("hPtR_%.0f_%.0f",fh3JetPtDRTrackPt->GetXaxis()->GetBinLowEdge(binMin),fh3JetPtDRTrackPt->GetXaxis()->GetBinUpEdge(binMax)));
    fCollTemplates.Add(h2);
    counter++;
  }
  //  Int_t nt = TMath::FloorNint((fJetPtMax-fJetPtMin)/fBinWidthJetPt);
  //  Printf("nt: %d entries fCollTemplates: %d",nt,fCollTemplates.GetEntriesFast());

  fInitialized = kTRUE;

}

//__________________________________________________________________________
Int_t AliEmcalJetByJetCorrection::GetJetPtBin(const Double_t jetpt) const {

  if(jetpt<fJetPtMin || jetpt>=fJetPtMax)
    return -1;

  Int_t bin = TMath::FloorNint((jetpt - fJetPtMin)/fBinWidthJetPt);

  return bin;
}

//________________________________________________________________________
Double_t AliEmcalJetByJetCorrection::GetEfficiency(const Double_t pt) const {
  Double_t eff = 1.;
  if(fEfficiencyFixed<1.) return fEfficiencyFixed;
  else if(fhEfficiency) {
    Int_t bin = fhEfficiency->GetXaxis()->FindBin(pt);
    eff = fhEfficiency->GetBinContent(bin);
  }
  return eff;
}

//________________________________________________________________________
Double_t AliEmcalJetByJetCorrection::GetMeanPtConstituents(const AliEmcalJet *jet, TClonesArray *fTracks) const {

  if(!jet || !fTracks) return -1.;
  if(jet->GetNumberOfTracks()<1) return -1;

  AliVParticle *vp;
  Double_t sumPtCh = 0.;
  for(Int_t icc=0; icc<jet->GetNumberOfTracks(); icc++) {
    vp = static_cast<AliVParticle*>(jet->TrackAt(icc, fTracks));
    if(!vp) continue;
    sumPtCh+=vp->Pt();
  }
  Double_t meanpt = sumPtCh/(double)(jet->GetNumberOfTracks());
  return meanpt;
}
 AliEmcalJetByJetCorrection.cxx:1
 AliEmcalJetByJetCorrection.cxx:2
 AliEmcalJetByJetCorrection.cxx:3
 AliEmcalJetByJetCorrection.cxx:4
 AliEmcalJetByJetCorrection.cxx:5
 AliEmcalJetByJetCorrection.cxx:6
 AliEmcalJetByJetCorrection.cxx:7
 AliEmcalJetByJetCorrection.cxx:8
 AliEmcalJetByJetCorrection.cxx:9
 AliEmcalJetByJetCorrection.cxx:10
 AliEmcalJetByJetCorrection.cxx:11
 AliEmcalJetByJetCorrection.cxx:12
 AliEmcalJetByJetCorrection.cxx:13
 AliEmcalJetByJetCorrection.cxx:14
 AliEmcalJetByJetCorrection.cxx:15
 AliEmcalJetByJetCorrection.cxx:16
 AliEmcalJetByJetCorrection.cxx:17
 AliEmcalJetByJetCorrection.cxx:18
 AliEmcalJetByJetCorrection.cxx:19
 AliEmcalJetByJetCorrection.cxx:20
 AliEmcalJetByJetCorrection.cxx:21
 AliEmcalJetByJetCorrection.cxx:22
 AliEmcalJetByJetCorrection.cxx:23
 AliEmcalJetByJetCorrection.cxx:24
 AliEmcalJetByJetCorrection.cxx:25
 AliEmcalJetByJetCorrection.cxx:26
 AliEmcalJetByJetCorrection.cxx:27
 AliEmcalJetByJetCorrection.cxx:28
 AliEmcalJetByJetCorrection.cxx:29
 AliEmcalJetByJetCorrection.cxx:30
 AliEmcalJetByJetCorrection.cxx:31
 AliEmcalJetByJetCorrection.cxx:32
 AliEmcalJetByJetCorrection.cxx:33
 AliEmcalJetByJetCorrection.cxx:34
 AliEmcalJetByJetCorrection.cxx:35
 AliEmcalJetByJetCorrection.cxx:36
 AliEmcalJetByJetCorrection.cxx:37
 AliEmcalJetByJetCorrection.cxx:38
 AliEmcalJetByJetCorrection.cxx:39
 AliEmcalJetByJetCorrection.cxx:40
 AliEmcalJetByJetCorrection.cxx:41
 AliEmcalJetByJetCorrection.cxx:42
 AliEmcalJetByJetCorrection.cxx:43
 AliEmcalJetByJetCorrection.cxx:44
 AliEmcalJetByJetCorrection.cxx:45
 AliEmcalJetByJetCorrection.cxx:46
 AliEmcalJetByJetCorrection.cxx:47
 AliEmcalJetByJetCorrection.cxx:48
 AliEmcalJetByJetCorrection.cxx:49
 AliEmcalJetByJetCorrection.cxx:50
 AliEmcalJetByJetCorrection.cxx:51
 AliEmcalJetByJetCorrection.cxx:52
 AliEmcalJetByJetCorrection.cxx:53
 AliEmcalJetByJetCorrection.cxx:54
 AliEmcalJetByJetCorrection.cxx:55
 AliEmcalJetByJetCorrection.cxx:56
 AliEmcalJetByJetCorrection.cxx:57
 AliEmcalJetByJetCorrection.cxx:58
 AliEmcalJetByJetCorrection.cxx:59
 AliEmcalJetByJetCorrection.cxx:60
 AliEmcalJetByJetCorrection.cxx:61
 AliEmcalJetByJetCorrection.cxx:62
 AliEmcalJetByJetCorrection.cxx:63
 AliEmcalJetByJetCorrection.cxx:64
 AliEmcalJetByJetCorrection.cxx:65
 AliEmcalJetByJetCorrection.cxx:66
 AliEmcalJetByJetCorrection.cxx:67
 AliEmcalJetByJetCorrection.cxx:68
 AliEmcalJetByJetCorrection.cxx:69
 AliEmcalJetByJetCorrection.cxx:70
 AliEmcalJetByJetCorrection.cxx:71
 AliEmcalJetByJetCorrection.cxx:72
 AliEmcalJetByJetCorrection.cxx:73
 AliEmcalJetByJetCorrection.cxx:74
 AliEmcalJetByJetCorrection.cxx:75
 AliEmcalJetByJetCorrection.cxx:76
 AliEmcalJetByJetCorrection.cxx:77
 AliEmcalJetByJetCorrection.cxx:78
 AliEmcalJetByJetCorrection.cxx:79
 AliEmcalJetByJetCorrection.cxx:80
 AliEmcalJetByJetCorrection.cxx:81
 AliEmcalJetByJetCorrection.cxx:82
 AliEmcalJetByJetCorrection.cxx:83
 AliEmcalJetByJetCorrection.cxx:84
 AliEmcalJetByJetCorrection.cxx:85
 AliEmcalJetByJetCorrection.cxx:86
 AliEmcalJetByJetCorrection.cxx:87
 AliEmcalJetByJetCorrection.cxx:88
 AliEmcalJetByJetCorrection.cxx:89
 AliEmcalJetByJetCorrection.cxx:90
 AliEmcalJetByJetCorrection.cxx:91
 AliEmcalJetByJetCorrection.cxx:92
 AliEmcalJetByJetCorrection.cxx:93
 AliEmcalJetByJetCorrection.cxx:94
 AliEmcalJetByJetCorrection.cxx:95
 AliEmcalJetByJetCorrection.cxx:96
 AliEmcalJetByJetCorrection.cxx:97
 AliEmcalJetByJetCorrection.cxx:98
 AliEmcalJetByJetCorrection.cxx:99
 AliEmcalJetByJetCorrection.cxx:100
 AliEmcalJetByJetCorrection.cxx:101
 AliEmcalJetByJetCorrection.cxx:102
 AliEmcalJetByJetCorrection.cxx:103
 AliEmcalJetByJetCorrection.cxx:104
 AliEmcalJetByJetCorrection.cxx:105
 AliEmcalJetByJetCorrection.cxx:106
 AliEmcalJetByJetCorrection.cxx:107
 AliEmcalJetByJetCorrection.cxx:108
 AliEmcalJetByJetCorrection.cxx:109
 AliEmcalJetByJetCorrection.cxx:110
 AliEmcalJetByJetCorrection.cxx:111
 AliEmcalJetByJetCorrection.cxx:112
 AliEmcalJetByJetCorrection.cxx:113
 AliEmcalJetByJetCorrection.cxx:114
 AliEmcalJetByJetCorrection.cxx:115
 AliEmcalJetByJetCorrection.cxx:116
 AliEmcalJetByJetCorrection.cxx:117
 AliEmcalJetByJetCorrection.cxx:118
 AliEmcalJetByJetCorrection.cxx:119
 AliEmcalJetByJetCorrection.cxx:120
 AliEmcalJetByJetCorrection.cxx:121
 AliEmcalJetByJetCorrection.cxx:122
 AliEmcalJetByJetCorrection.cxx:123
 AliEmcalJetByJetCorrection.cxx:124
 AliEmcalJetByJetCorrection.cxx:125
 AliEmcalJetByJetCorrection.cxx:126
 AliEmcalJetByJetCorrection.cxx:127
 AliEmcalJetByJetCorrection.cxx:128
 AliEmcalJetByJetCorrection.cxx:129
 AliEmcalJetByJetCorrection.cxx:130
 AliEmcalJetByJetCorrection.cxx:131
 AliEmcalJetByJetCorrection.cxx:132
 AliEmcalJetByJetCorrection.cxx:133
 AliEmcalJetByJetCorrection.cxx:134
 AliEmcalJetByJetCorrection.cxx:135
 AliEmcalJetByJetCorrection.cxx:136
 AliEmcalJetByJetCorrection.cxx:137
 AliEmcalJetByJetCorrection.cxx:138
 AliEmcalJetByJetCorrection.cxx:139
 AliEmcalJetByJetCorrection.cxx:140
 AliEmcalJetByJetCorrection.cxx:141
 AliEmcalJetByJetCorrection.cxx:142
 AliEmcalJetByJetCorrection.cxx:143
 AliEmcalJetByJetCorrection.cxx:144
 AliEmcalJetByJetCorrection.cxx:145
 AliEmcalJetByJetCorrection.cxx:146
 AliEmcalJetByJetCorrection.cxx:147
 AliEmcalJetByJetCorrection.cxx:148
 AliEmcalJetByJetCorrection.cxx:149
 AliEmcalJetByJetCorrection.cxx:150
 AliEmcalJetByJetCorrection.cxx:151
 AliEmcalJetByJetCorrection.cxx:152
 AliEmcalJetByJetCorrection.cxx:153
 AliEmcalJetByJetCorrection.cxx:154
 AliEmcalJetByJetCorrection.cxx:155
 AliEmcalJetByJetCorrection.cxx:156
 AliEmcalJetByJetCorrection.cxx:157
 AliEmcalJetByJetCorrection.cxx:158
 AliEmcalJetByJetCorrection.cxx:159
 AliEmcalJetByJetCorrection.cxx:160
 AliEmcalJetByJetCorrection.cxx:161
 AliEmcalJetByJetCorrection.cxx:162
 AliEmcalJetByJetCorrection.cxx:163
 AliEmcalJetByJetCorrection.cxx:164
 AliEmcalJetByJetCorrection.cxx:165
 AliEmcalJetByJetCorrection.cxx:166
 AliEmcalJetByJetCorrection.cxx:167
 AliEmcalJetByJetCorrection.cxx:168
 AliEmcalJetByJetCorrection.cxx:169
 AliEmcalJetByJetCorrection.cxx:170
 AliEmcalJetByJetCorrection.cxx:171
 AliEmcalJetByJetCorrection.cxx:172
 AliEmcalJetByJetCorrection.cxx:173
 AliEmcalJetByJetCorrection.cxx:174
 AliEmcalJetByJetCorrection.cxx:175
 AliEmcalJetByJetCorrection.cxx:176
 AliEmcalJetByJetCorrection.cxx:177
 AliEmcalJetByJetCorrection.cxx:178
 AliEmcalJetByJetCorrection.cxx:179
 AliEmcalJetByJetCorrection.cxx:180
 AliEmcalJetByJetCorrection.cxx:181
 AliEmcalJetByJetCorrection.cxx:182
 AliEmcalJetByJetCorrection.cxx:183
 AliEmcalJetByJetCorrection.cxx:184
 AliEmcalJetByJetCorrection.cxx:185
 AliEmcalJetByJetCorrection.cxx:186
 AliEmcalJetByJetCorrection.cxx:187
 AliEmcalJetByJetCorrection.cxx:188
 AliEmcalJetByJetCorrection.cxx:189
 AliEmcalJetByJetCorrection.cxx:190
 AliEmcalJetByJetCorrection.cxx:191
 AliEmcalJetByJetCorrection.cxx:192
 AliEmcalJetByJetCorrection.cxx:193
 AliEmcalJetByJetCorrection.cxx:194
 AliEmcalJetByJetCorrection.cxx:195
 AliEmcalJetByJetCorrection.cxx:196