13 double Interpolate2D(
const TH1* histo,
const double x,
const double y,
const int xAxis,
const int yAxis,
const int otherDimBin)
19 const TAxis* fXaxis = xAxis == 1 ?
histo->GetXaxis() : xAxis == 2 ?
histo->GetYaxis() : xAxis == 3 ?
histo->GetZaxis() :
nullptr;
20 const TAxis* fYaxis = yAxis == 1 ?
histo->GetXaxis() : yAxis == 2 ?
histo->GetYaxis() : yAxis == 3 ?
histo->GetZaxis() :
nullptr;
22 if (!fXaxis || !fYaxis)
24 histo->Error(
"Interpolate2D",
"Failed to parse axes from inputs");
34 Int_t bin_x = fXaxis->FindFixBin(
x);
35 Int_t bin_y = fYaxis->FindFixBin(
y);
36 if(bin_x<1 || bin_x>fXaxis->GetNbins() || bin_y<1 || bin_y>fYaxis->GetNbins()) {
37 histo->Error(
"Interpolate",
"Cannot interpolate outside histogram domain. (x: %f vs [%f,%f], y: %f vs [%f,%f])",
x,fXaxis->GetBinLowEdge(1),fXaxis->GetBinLowEdge(fXaxis->GetNbins()+1),
y,fYaxis->GetBinLowEdge(1),fYaxis->GetBinLowEdge(fYaxis->GetNbins()+1));
42 dx = fXaxis->GetBinUpEdge(bin_x)-
x;
43 dy = fYaxis->GetBinUpEdge(bin_y)-
y;
44 if (dx<=fXaxis->GetBinWidth(bin_x)/2 && dy<=fYaxis->GetBinWidth(bin_y)/2)
46 if (dx>fXaxis->GetBinWidth(bin_x)/2 && dy<=fYaxis->GetBinWidth(bin_y)/2)
48 if (dx>fXaxis->GetBinWidth(bin_x)/2 && dy>fYaxis->GetBinWidth(bin_y)/2)
50 if (dx<=fXaxis->GetBinWidth(bin_x)/2 && dy>fYaxis->GetBinWidth(bin_y)/2)
54 x1 = fXaxis->GetBinCenter(bin_x);
55 y1 = fYaxis->GetBinCenter(bin_y);
56 x2 = fXaxis->GetBinCenter(bin_x+1);
57 y2 = fYaxis->GetBinCenter(bin_y+1);
60 x1 = fXaxis->GetBinCenter(bin_x-1);
61 y1 = fYaxis->GetBinCenter(bin_y);
62 x2 = fXaxis->GetBinCenter(bin_x);
63 y2 = fYaxis->GetBinCenter(bin_y+1);
66 x1 = fXaxis->GetBinCenter(bin_x-1);
67 y1 = fYaxis->GetBinCenter(bin_y-1);
68 x2 = fXaxis->GetBinCenter(bin_x);
69 y2 = fYaxis->GetBinCenter(bin_y);
72 x1 = fXaxis->GetBinCenter(bin_x);
73 y1 = fYaxis->GetBinCenter(bin_y-1);
74 x2 = fXaxis->GetBinCenter(bin_x+1);
75 y2 = fYaxis->GetBinCenter(bin_y);
78 Int_t bin_x1 = fXaxis->FindFixBin(x1);
79 if(bin_x1<1) bin_x1=1;
80 Int_t bin_x2 = fXaxis->FindFixBin(x2);
81 if(bin_x2>fXaxis->GetNbins()) bin_x2=fXaxis->GetNbins();
82 Int_t bin_y1 = fYaxis->FindFixBin(y1);
83 if(bin_y1<1) bin_y1=1;
84 Int_t bin_y2 = fYaxis->FindFixBin(y2);
85 if(bin_y2>fYaxis->GetNbins()) bin_y2=fYaxis->GetNbins();
98 if (xAxis == 1 && yAxis == 2){
99 q11 =
histo->GetBinContent(
histo->GetBin(bin_x1,bin_y1,otherDimBin));
100 q12 =
histo->GetBinContent(
histo->GetBin(bin_x1,bin_y2,otherDimBin));
101 q21 =
histo->GetBinContent(
histo->GetBin(bin_x2,bin_y1,otherDimBin));
102 q22 =
histo->GetBinContent(
histo->GetBin(bin_x2,bin_y2,otherDimBin));
105 else if (xAxis == 1 && yAxis == 3){
106 q11 =
histo->GetBinContent(
histo->GetBin(bin_x1,otherDimBin,bin_y1));
107 q12 =
histo->GetBinContent(
histo->GetBin(bin_x1,otherDimBin,bin_y2));
108 q21 =
histo->GetBinContent(
histo->GetBin(bin_x2,otherDimBin,bin_y1));
109 q22 =
histo->GetBinContent(
histo->GetBin(bin_x2,otherDimBin,bin_y2));
112 else if (xAxis == 2 && yAxis == 3){
113 q11 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_x1,bin_y1));
114 q12 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_x1,bin_y2));
115 q21 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_x2,bin_y1));
116 q22 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_x2,bin_y2));
119 else if (xAxis == 2 && yAxis == 1){
120 q11 =
histo->GetBinContent(
histo->GetBin(bin_y1,bin_x1,otherDimBin));
121 q12 =
histo->GetBinContent(
histo->GetBin(bin_y1,bin_x2,otherDimBin));
122 q21 =
histo->GetBinContent(
histo->GetBin(bin_y2,bin_x1,otherDimBin));
123 q22 =
histo->GetBinContent(
histo->GetBin(bin_y2,bin_x2,otherDimBin));
126 else if (xAxis == 3 && yAxis == 1){
127 q11 =
histo->GetBinContent(
histo->GetBin(bin_y1,otherDimBin,bin_x1));
128 q12 =
histo->GetBinContent(
histo->GetBin(bin_y1,otherDimBin,bin_x2));
129 q21 =
histo->GetBinContent(
histo->GetBin(bin_y2,otherDimBin,bin_x1));
130 q22 =
histo->GetBinContent(
histo->GetBin(bin_y2,otherDimBin,bin_x2));
133 else if (xAxis == 3 && yAxis == 2){
134 q11 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_y1,bin_x1));
135 q12 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_y1,bin_x2));
136 q21 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_y2,bin_x1));
137 q22 =
histo->GetBinContent(
histo->GetBin(otherDimBin,bin_y2,bin_x2));
140 histo->Error(
"Interpolate2D",
"Unsupported axis combination: (x,y)=(%d,%d) with one bin fixed",xAxis,yAxis);
144 Double_t
d = 1.0*(
x2-
x1)*(y2-y1);
149 double Interpolate(
const TH1* histo,
const double x,
const double y,
const double z)
165 const TAxis* fXaxis =
histo->GetXaxis();
166 const TAxis* fYaxis =
histo->GetYaxis();
167 const TAxis* fZaxis =
histo->GetZaxis();
170 Int_t ubx = fXaxis->FindFixBin(
x);
171 Int_t uby = fYaxis->FindFixBin(
y);
172 Int_t ubz = fZaxis->FindFixBin(
z);
175 if ( ubx < 1 || ubx >
histo->GetNbinsX() || uby < 1 || uby >
histo->GetNbinsY() || ubz < 1 || ubz >
histo->GetNbinsZ() )
177 histo->Error(
"Interpolate",
"Cannot interpolate outside histogram domain. (x: %f vs [%f,%f], y: %f vs [%f,%f], z: %f vs [%f,%f])",
x,fXaxis->GetBinLowEdge(1),fXaxis->GetBinLowEdge(
histo->GetNbinsX()+1),
y,fYaxis->GetBinLowEdge(1),fYaxis->GetBinLowEdge(
histo->GetNbinsY()+1),
z,fZaxis->GetBinLowEdge(1),fZaxis->GetBinLowEdge(
histo->GetNbinsZ()+1));
182 if( (ubx == 1 &&
x < fXaxis->GetBinCenter(ubx)) || (ubx == fXaxis->GetNbins() &&
x > fXaxis->GetBinCenter(ubx)))
184 else if( (uby == 1 &&
y < fYaxis->GetBinCenter(uby)) || (uby == fYaxis->GetNbins() &&
y > fYaxis->GetBinCenter(uby)))
186 else if( (ubz == 1 &&
z < fZaxis->GetBinCenter(ubz)) || (ubz == fZaxis->GetNbins() &&
z > fZaxis->GetBinCenter(ubz)))
double Interpolate(const TH1 *histo, const double x)
double Interpolate2D(const TH1 *histo, const double x, const double y, const int xAxis, const int yAxis, const int otherDimBin)
Helper function for edge cases in 3D interpolation by interpolating in 2D and keeping the third axis ...