36 LOG(fatal) <<
"You did not specify a valid v2 vs pT histogram!";
40 LOG(fatal) <<
"You did not specify a valid ecc vs B histogram!";
43 LOG(info) <<
"Proceeding to creating a look-up table...";
44 const Long_t nbinsB = mhEccVsB->GetNbinsX();
45 const Long_t nbinsPt = mhv2vsPt->GetNbinsX();
47 std::vector<double> binsB(nbinsB + 1, 0);
48 std::vector<double> binsPt(nbinsPt + 1, 0);
49 std::vector<double> binsPhi(nbinsPhi + 1, 0);
51 for (
int ii = 0; ii < nbinsB + 1; ii++) {
52 binsB[ii] = mhEccVsB->GetBinLowEdge(ii + 1);
54 for (
int ii = 0; ii < nbinsPt + 1; ii++) {
55 binsPt[ii] = mhv2vsPt->GetBinLowEdge(ii + 1);
57 for (
int ii = 0; ii < nbinsPhi + 1; ii++) {
58 binsPhi[ii] =
static_cast<Double_t
>(ii) * 2 * TMath::Pi() /
static_cast<Double_t
>(nbinsPhi);
63 mhLUT = std::make_unique<TH3D>(
"mhLUT",
"", nbinsB, binsB.data(), nbinsPt, binsPt.data(), nbinsPhi, binsPhi.data());
64 mhLUT->SetDirectory(
nullptr);
67 for (
int ic = 0; ic < nbinsB; ic++) {
69 for (
int ip = 0; ip < nbinsPt; ip++) {
71 double v2target = mhv2vsPt->GetBinContent(ip + 1) * mhEccVsB->GetBinContent(ic + 1);
72 LOG(info) <<
"At b ~ " << mhEccVsB->GetBinCenter(ic + 1) <<
", pt ~ " << mhv2vsPt->GetBinCenter(ip + 1) <<
", ref v2 is " << mhv2vsPt->GetBinContent(ip + 1) <<
", scale is " << mhEccVsB->GetBinContent(ic + 1) <<
", target v2 is " << v2target <<
", inverting...";
74 for (Int_t ia = 0; ia < nbinsPhi; ia++) {
77 Double_t lY =
mhLUT->GetZaxis()->GetBinCenter(ia + 1);
79 Bool_t lConverged = kFALSE;
87 lX = lX - lDistance * lDerivativeValue * 0.25;
89 mhLUT->SetBinContent(ic + 1, ip + 1, ia + 1, lX);
97 Int_t lLowestPeriod = TMath::Floor(lPhiInput / (2 * TMath::Pi()));
98 Double_t lPhiOld = lPhiInput - 2 * lLowestPeriod * TMath::Pi();
99 Double_t lPhiNew = lPhiOld;
102 Double_t lMaxPt =
mhLUT->GetYaxis()->GetBinCenter(
mhLUT->GetYaxis()->GetNbins());
103 Double_t lMinPt =
mhLUT->GetYaxis()->GetBinCenter(1);
108 Double_t phiWidth =
mhLUT->GetZaxis()->GetBinWidth(1);
111 bool validPhi = lPhiNew > phiWidth / 2.0f && lPhiNew < 2.0 * TMath::Pi() - phiWidth / 2.0f;
114 bool validB =
b <
mhLUT->GetXaxis()->GetBinCenter(
mhLUT->GetXaxis()->GetNbins());
115 Double_t minB =
mhLUT->GetXaxis()->GetBinCenter(1);
117 if (validPhi && validB) {
119 Double_t scaleFactor = 1.0;
121 scaleFactor *= pt / lMinPt;
125 scaleFactor *=
b / minB;
128 lPhiNew =
mhLUT->Interpolate(
b, pt, lPhiOld);
130 lPhiNew = scaleFactor * lPhiNew + (1.0 - scaleFactor) * lPhiOld;
132 return lPhiNew + 2.0 * lLowestPeriod * TMath::Pi();