16 #include "GaudiKernel/ITHistSvc.h"
30 m_checkOverflows(true)
37 const std::string delim(
"/");
38 std::vector<std::string>
words;
39 std::string::size_type sPos, sEnd, sLen;
40 sPos = fullHistoName.find_first_not_of(delim);
41 while ( sPos != std::string::npos ) {
42 sEnd = fullHistoName.find_first_of(delim, sPos);
43 if(sEnd==std::string::npos) sEnd = fullHistoName.length();
45 words.emplace_back(fullHistoName.substr(sPos,sLen));
46 sPos = fullHistoName.find_first_not_of(delim, sEnd);
48 std::string
base =
"";
55 auto h = std::make_unique<TH1F>(this->
baseName(histoName).c_str(),histoTitle.c_str(),
bins,minx,maxx);
58 std::cout <<
"Cannot book histo " << histoName <<
" with Title " << histoTitle <<std::endl;
65 auto h = std::make_unique<TH1F>(this->
baseName(histoName).c_str(),histoTitle.c_str(),
bins,edge);
67 std::cout <<
"Cannot book histo " << histoName <<
" with Title " << histoTitle <<std::endl;
72 void HistoHelperRoot::bookHisto(
const std::string& histoName,
const std::string& histoTitle,
unsigned int binsx,
double minx,
double maxx,
unsigned int binsy,
double miny,
double maxy)
74 auto h = std::make_unique<TH2F>(this->
baseName(histoName).c_str(),histoTitle.c_str(),binsx,minx,maxx,binsy,miny,maxy);
76 std::cout <<
"Cannot book histo " << histoName <<
" with Title " << histoTitle <<std::endl;
81 void HistoHelperRoot::bookHisto(
const std::string& histoName,
const std::string& histoTitle,
unsigned int binsx,
double* edgex,
unsigned int binsy,
double* edgey)
83 auto h = std::make_unique<TH2F>(this->
baseName(histoName).c_str(),histoTitle.c_str(),binsx,edgex,binsy,edgey);
85 std::cout <<
"Cannot book histo " << histoName <<
" with Title " << histoTitle <<std::endl;
90 void HistoHelperRoot::bookHisto(
const std::string& histoName,
const std::string& histoTitle,
unsigned int binsx,
double minx,
double maxx,
unsigned int binsy,
double miny,
double maxy,
unsigned int binsz,
double minz,
double maxz)
92 auto h = std::make_unique<TH3F>(this->
baseName(histoName).c_str(),histoTitle.c_str(),binsx,minx,maxx,binsy,miny,maxy,binsz,minz,maxz);
94 std::cout <<
"Cannot book histo " << histoName <<
" with Title " << histoTitle <<std::endl;
112 locked_handle->Fill(
value);
135 if ( valuex <
l.xmin ) valuex =
l.xmin+0.0001;
136 else if ( valuex >
l.xmax ) valuex =
l.xmax-0.0001;
137 if ( valuey <
l.ymin ) valuey =
l.ymin+0.0001;
138 else if ( valuey >
l.ymax ) valuey =
l.ymax-0.0001;
142 locked_handle->Fill(valuex,valuey);
151 if ( valuex <
l.xmin ) valuex =
l.xmin+0.0001;
152 else if ( valuex >
l.xmax ) valuex =
l.xmax-0.0001;
153 if ( valuey <
l.ymin ) valuey =
l.ymin+0.0001;
154 else if ( valuey >
l.ymax ) valuey =
l.ymax-0.0001;
155 if ( valuez <
l.zmin ) valuez =
l.zmin+0.0001;
156 else if ( valuez >
l.zmax ) valuez =
l.zmax-0.0001;
160 locked_handle->Fill(valuex,valuey,valuez);
163 TH1* HistoHelperRoot::getHisto1D(
const std::string& histoName)
167 TH2* HistoHelperRoot::getHisto2D(
const std::string& histoName)
171 TH3* HistoHelperRoot::getHisto3D(
const std::string& histoName)
178 std::cout <<
"The name of the 1D Histo " <<
name << std::endl;
181 std::cout <<
"The name of the 2D Histo " <<
name << std::endl;
184 std::cout <<
"The name of the 3D Histo " <<
name << std::endl;
190 std::cout <<
"Smoothing a two dimensional histogram "<< input2D->GetName()
191 <<
" " <<
m1 <<
" " <<
m2 << std::endl;
192 std::cout <<
"First (1-3, 1-3) 3x3 bins before smoothing: " << std::endl;
193 for(
int i=1;
i<4;
i++) {
194 for(
int j=1;j<4;j++) {
195 std::cout<<
i<<
" "<<j<<
" : "<<input2D->GetBinContent(
i,j)<<
" / " ;
198 std::cout << std::endl;
199 int ioffset = input2D->GetNbinsX() / 2 ;
200 int joffset = input2D->GetNbinsY() / 2 ;
201 std::cout <<
"Middle (" << ioffset+1 <<
"-" << ioffset+4 <<
", ("
202 << joffset+1 <<
"-" << joffset+4 <<
") 3x3 bins before smoothing: " << std::endl;
203 for(
int i=1;
i<4;
i++) {
204 for(
int j=1;j<4;j++) {
205 std::cout<<
i<<
" "<<j<<
" : "<<input2D->GetBinContent(
i+ioffset,j+joffset)<<
" / " ;
208 std::cout << std::endl;
212 if (
m1 > lsup ||
m2 > lsup) {
213 std::cout <<
"HistoHelperRoot::smoothASH2D: m1 or m2 too big !"<<std::endl;
216 int nx = input2D->GetNbinsX()+1;
217 int ny = input2D->GetNbinsY()+1;
219 h =
new float*[nx-1];
220 res =
new float*[nx-1];
221 for (
int i = 0;
i < nx-1;
i++) {
222 h[
i] =
new float[ny-1];
223 res[
i] =
new float[ny-1];
225 for (
int iy = 1;iy<ny;iy++) {
226 for (
int ix = 1;ix<nx;ix++) {
227 h[ix-1][iy-1] = (
float) input2D->GetBinContent(ix,iy);
232 float wk1[41],wk2[41];
234 std::vector<std::vector<float>> wgt(100, std::vector<float>(100));
235 std::vector<std::vector<float>> wk(41, std::vector<float>(41));
238 const float am12 = am1*am1, am22 = am2*am2;
239 const float inv_am1_am2 = 1. / (am1 * am2);
240 const float inv_am12 = 1. / am12;
241 const float inv_am22 = 1. / am22;
243 for (
k = 0;
k<nx-1;
k++) {
244 for (
l = 0;
l<ny-1;
l++) {
245 res[
k][
l] = 0.; wgt[
k][
l] = 0.;
249 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
251 wk1[
i] = 15./16.*(1.-ai*inv_am12)*(1.-ai*inv_am12);
255 std::cout <<
"HistoHelperRoot::smoothASH2D: wks is zero! "<<std::endl;
256 for (
int i = 0;
i < nx-1; ++
i) {
265 const double fac1 = am1 / wks;
266 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
267 wk1[
i] = wk1[
i]*fac1;
270 for (
i = lsup+1-
m2;
i<lsup+
m2;
i++) {
272 wk2[
i] = 15./16.*(1.-ai*inv_am22)*(1.-ai*inv_am22);
276 std::cout <<
"HistoHelperRoot::smoothASH2D: wks is zero! "<<std::endl;
277 for (
int i = 0;
i < nx-1; ++
i) {
286 const double fac2 = am2 / wks;
287 for (
i = lsup+1-
m2;
i<lsup+
m2;
i++) {
288 wk2[
i] = wk2[
i]*fac2;
290 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
291 for (j = lsup+1-
m2;j<lsup+
m2;j++) {
292 wk[
i][j] = wk1[
i]*wk2[j];
296 for (
k = 0;
k<nx-1;
k++) {
297 for (
l = 0;
l<ny-1;
l++) {
301 wgt[
i][j] = wgt[
i][j] + wk[lsup+
i-
k][lsup+j-
l];
306 for (
k = 0;
k<nx-1;
k++) {
307 for (
l = 0;
l<ny-1;
l++) {
314 for (
int iy = 1;iy<ny;iy++) {
315 for (
int ix = 1;ix<nx;ix++) {
316 input2D->SetBinContent(ix,iy,
res[ix-1][iy-1]);
319 for (
i = 0;
i < nx-1;
i++){
327 std::cout <<
"First (1-3, 1-3) 3x3 bins after smoothing: " << std::endl;
328 for(
int i=1;
i<4;
i++) {
329 for(
int j=1;j<4;j++) {
330 std::cout<<
i<<
" "<<j<<
" : "<<input2D->GetBinContent(
i,j)<<
" / " ;
333 std::cout << std::endl;
334 int ioffset = input2D->GetNbinsX() / 2 ;
335 int joffset = input2D->GetNbinsY() / 2 ;
336 std::cout <<
"Middle (" << ioffset+1 <<
"-" << ioffset+4 <<
", ("
337 << joffset+1 <<
"-" << joffset+4 <<
") 3x3 bins after smoothing: " << std::endl;
338 for(
int i=1;
i<4;
i++) {
339 for(
int j=1;j<4;j++) {
340 std::cout<<
i<<
" "<<j<<
" : "<<input2D->GetBinContent(
i+ioffset,j+joffset)<<
" / " ;
343 std::cout << std::endl;
349 std::cout <<
"Smoothing a three dimensional histogram "<< input3D->GetName()
350 <<
" " <<
m1 <<
" " <<
m2 <<
" " <<
m3 << std::endl;
351 std::cout <<
"First 2x2x2 bins before smoothing: " << std::endl;
352 for(
int i=1;
i<3;
i++) {
353 for(
int j=1;j<3;j++) {
354 for(
int k=1;
k<3;
k++) {
355 std::cout<<
i<<
" "<<j<<
" "<<
k<<
" : "<<input3D->GetBinContent(
i,j,
k)<<
" / " ;
359 std::cout << std::endl;
360 int ioffset = input3D->GetNbinsX() / 2 ;
361 int joffset = input3D->GetNbinsY() / 2 ;
362 int koffset = input3D->GetNbinsZ() / 2 ;
363 std::cout <<
"Middle (" << ioffset+1 <<
"-" << ioffset+3 <<
", "
364 << joffset+1 <<
"-" << joffset+3 <<
", "
365 << koffset+1 <<
"-" << koffset+3 <<
") 2x2 bins before smoothing: " << std::endl;
366 for(
int i=1;
i<3;
i++) {
367 for(
int j=1;j<3;j++) {
368 for(
int k=1;
k<3;
k++) {
369 std::cout<<
i<<
" "<<j<<
" "<<
k<<
" : "<<input3D->GetBinContent(
i+ioffset,j+joffset,
k+koffset)<<
" / " ;
373 std::cout << std::endl;
377 if (
m1 > lsup ||
m2 > lsup ||
m3 > lsup) {
378 std::cout <<
"HistoHelperRoot::smoothASH3D: m1, m2 or m3 too big !"<<std::endl;
381 int nx = input3D->GetNbinsX()+1;
382 int ny = input3D->GetNbinsY()+1;
383 int nz = input3D->GetNbinsZ()+1;
385 h =
new float**[nx-1];
386 res =
new float**[nx-1];
387 for (
int i = 0;
i < nx-1;
i++) {
388 h[
i] =
new float*[ny-1];
389 res[
i] =
new float*[ny-1];
390 for (
int j = 0; j < ny-1; j++) {
391 h[
i][j] =
new float[nz-1];
392 res[
i][j] =
new float[nz-1];
395 for (
int iz = 1;iz<nz;iz++) {
396 for (
int iy = 1;iy<ny;iy++) {
397 for (
int ix = 1;ix<nx;ix++) {
398 h[ix-1][iy-1][iz-1] = (
float) input3D->GetBinContent(ix,iy,iz);
404 float wk1[41],wk2[41],wk3[41];
407 auto wk = std::vector(41,std::vector(41,std::vector<float>(41)));
410 const float am12 = am1*am1, am22 = am2*am2, am32 = am3*am3;
411 const float inv_am1_am2 = 1. / (am1*am2);
412 const float inv_am12 = 1. / am12;
413 const float inv_am22 = 1. / am22;
414 const float inv_am32 = 1. / am32;
417 for (
k = 0;
k<nx-1;
k++) {
418 for (
l = 0;
l<ny-1;
l++) {
419 for (
m = 0;
m<nz-1;
m++) {
429 int dimension = 100;
int x,
y,
z = 0;
430 wgt =
new float**[dimension];
432 std::cout <<
"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
435 for(
x = 0;
x < dimension;
x++) {
436 wgt[
x] =
new float*[dimension];
438 std::cout <<
"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
441 for(
y = 0;
y < dimension;
y++) {
442 wgt[
x][
y] =
new float[dimension];
444 std::cout <<
"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
447 for(
z = 0;
z < dimension;
z++)
452 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
454 wk1[
i] = 15./16.*(1.-ai*inv_am12)*(1.-ai*inv_am12);
457 const double fac1 = am1 / wks;
458 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
459 wk1[
i] = wk1[
i]*fac1;
462 for (
i = lsup+1-
m2;
i<lsup+
m2;
i++) {
464 wk2[
i] = 15./16.*(1.-ai*inv_am22)*(1.-ai*inv_am22);
468 std::cout <<
"HistoHelperRoot::smoothASH3D: wks is zero! "<<std::endl;
471 const double fac2 = am2 / wks;
472 for (
i = lsup+1-
m2;
i<lsup+
m2;
i++) {
473 wk2[
i] = wk2[
i]*fac2;
476 for (
i = lsup+1-
m3;
i<lsup+
m3;
i++) {
478 wk3[
i] = 15./16.*(1.-ai*inv_am32)*(1.-ai*inv_am32);
482 std::cout <<
"HistoHelperRoot::smoothASH3D: wks is zero! "<<std::endl;
485 const double fac3 = am3 / wks;
486 for (
i = lsup+1-
m3;
i<lsup+
m3;
i++) {
487 wk3[
i] = wk3[
i]*fac3;
490 for (
i = lsup+1-
m1;
i<lsup+
m1;
i++) {
491 for (j = lsup+1-
m2;j<lsup+
m2;j++) {
492 for (
k = lsup+1-
m3;
k<lsup+
m3;
k++) {
493 wk[
i][j][
k] = wk1[
i]*wk2[j]*wk3[
k];
498 for (
k = 0;
k<nx-1;
k++) {
499 for (
l = 0;
l<ny-1;
l++) {
500 for (
m = 0;
m<nz-1;
m++) {
505 wgt[
i][j][
n] = wgt[
i][j][
n] + wk[lsup+
i-
k][lsup+j-
l][lsup+
n-
m];
512 for (
k = 0;
k<nx-1;
k++) {
513 for (
l = 0;
l<ny-1;
l++) {
514 for (
m = 0;
m<nz-1;
m++) {
522 for (
int iz = 1;iz<nz;iz++) {
523 for (
int iy = 1;iy<ny;iy++) {
524 for (
int ix = 1;ix<nx;ix++) {
525 input3D->SetBinContent(ix,iy,iz,
res[ix-1][iy-1][iz-1]);
529 for (
i = 0;
i < nx-1;
i++){
530 for (j = 0; j < ny-1; j++) {
540 for (
i = 0;
i < dimension;
i++){
541 for (j = 0; j < dimension; j++)
548 std::cout <<
"First 2x2x2 bins after smoothing: " << std::endl;
549 for(
int i=1;
i<3;
i++) {
550 for(
int j=1;j<3;j++) {
551 for(
int k=1;
k<3;
k++) {
552 std::cout<<
i<<
" "<<j<<
" "<<
k<<
" : "<<input3D->GetBinContent(
i,j,
k)<<
" / " ;
556 std::cout << std::endl;
557 int ioffset = input3D->GetNbinsX() / 2 ;
558 int joffset = input3D->GetNbinsY() / 2 ;
559 int koffset = input3D->GetNbinsZ() / 2 ;
560 std::cout <<
"Middle (" << ioffset+1 <<
"-" << ioffset+3 <<
", "
561 << joffset+1 <<
"-" << joffset+3 <<
", "
562 << koffset+1 <<
"-" << koffset+3 <<
") 2x2 bins after smoothing: " << std::endl;
563 for(
int i=1;
i<3;
i++) {
564 for(
int j=1;j<3;j++) {
565 for(
int k=1;
k<3;
k++) {
566 std::cout<<
i<<
" "<<j<<
" "<<
k<<
" : "<<input3D->GetBinContent(
i+ioffset,j+joffset,
k+koffset)<<
" / " ;
570 std::cout << std::endl;
580 int bin((
h->GetXaxis())->FindBin(
x));
581 double bincenter(
h->GetBinCenter(
bin));
582 double nextbincenter(bincenter);
583 double nextbincontent(0);
586 nextbincenter =
h->GetBinCenter(
bin+1);
587 nextbincontent =
h->GetBinContent(
bin+1);
589 else if(x<bincenter && bin > 1)
591 nextbincenter =
h->GetBinCenter(
bin-1);
592 nextbincontent =
h->GetBinContent(
bin-1);
594 double tmp(
h->GetBinContent(
bin));
595 if(nextbincenter != bincenter)
tmp = ( nextbincontent*(
x-bincenter) +
tmp*(nextbincenter-
x) ) / (nextbincenter - bincenter);
604 int nx =
h->GetNbinsX(), ny =
h->GetNbinsY();
605 int ibx =
h->GetXaxis()->FindBin(
x), iby =
h->GetYaxis()->FindBin(
y);
607 double z00,z11,z01,z10,xc,yc,xc2,yc2,
u,
t,
r;
608 if (ibx > nx) ibx = nx;
609 if (iby > ny) iby = ny;
610 xc =
h->GetXaxis()->GetBinCenter(ibx);
611 yc =
h->GetYaxis()->GetBinCenter(iby);
612 z11 =
h->GetBinContent(ibx,iby);
613 if ( (ibx > 1 || (ibx == 1 &&
x > xc) ) &&
614 (ibx < nx || (ibx == nx &&
x < xc) ) ) {
615 if (
x > xc) {ibx2 = ibx + 1;}
else {ibx2 = ibx - 1;}
616 xc2 =
h->GetXaxis()->GetBinCenter(ibx2);
617 if ( (iby > 1 || (iby == 1 &&
y > yc) ) &&
618 (iby < ny || (iby == ny &&
y < yc) ) ) {
619 if (
y > yc) {iby2 = iby + 1;}
else {iby2 = iby - 1;}
620 yc2 =
h->GetYaxis()->GetBinCenter(iby2);
621 z00 =
h->GetBinContent(ibx2,iby2);
622 z10 =
h->GetBinContent(ibx,iby2);
623 z01 =
h->GetBinContent(ibx2,iby);
624 t = (
x - xc2)/(xc-xc2);
625 u = (
y - yc2)/(yc-yc2);
626 r = z11*
t*
u+z00*(1.-
t)*(1.-
u)+z01*(1.-
t)*
u+z10*
t*(1.-
u);
628 z01 =
h->GetBinContent(ibx2,iby);
629 t = (
x - xc2)/(xc-xc2);
630 r = z11*
t + z01*(1.-
t);
632 }
else if ((iby > 1 || (iby == 1 &&
y > yc) ) &&
633 (iby < ny || (iby == ny &&
y < yc) ) ) {
634 if (
y > yc) {iby2 = iby + 1;}
else {iby2 = iby - 1;}
635 z10 =
h->GetBinContent(ibx,iby2);
636 yc2 =
h->GetYaxis()->GetBinCenter(iby2);
637 u = (
y - yc2)/(yc-yc2);
638 r = z11*
u + z10*(1.-
u);
650 int nx =
h->GetNbinsX(), ny =
h->GetNbinsY(), nz =
h->GetNbinsZ();
651 int ibx =
h->GetXaxis()->FindBin(
x), iby =
h->GetYaxis()->FindBin(
y), ibz =
h->GetZaxis()->FindBin(
z);
653 double z000,z010,z110,z100,z001,z011,z111,z101,xc,yc,zc,xc2,yc2,zc2,
u,
t,
v,
r;
654 if (ibx > nx) ibx = nx;
655 if (iby > ny) iby = ny;
656 if (ibz > nz) ibz = nz;
657 xc =
h->GetXaxis()->GetBinCenter(ibx);
658 yc =
h->GetYaxis()->GetBinCenter(iby);
659 zc =
h->GetZaxis()->GetBinCenter(ibz);
661 z111 =
h->GetBinContent(ibx,iby,ibz);
662 if ( (ibx > 1 || (ibx == 1 &&
x > xc) ) &&
663 (ibx < nx || (ibx == nx &&
x < xc) ) ) {
664 if (
x > xc) {ibx2 = ibx + 1;}
else {ibx2 = ibx - 1;}
665 xc2 =
h->GetXaxis()->GetBinCenter(ibx2);
666 if ( (iby > 1 || (iby == 1 &&
y > yc) ) &&
667 (iby < ny || (iby == ny &&
y < yc) ) ) {
668 if (
y > yc) {iby2 = iby + 1;}
else {iby2 = iby - 1;}
669 yc2 =
h->GetYaxis()->GetBinCenter(iby2);
670 if ( (ibz > 1 || (ibz == 1 &&
z > zc) ) &&
671 (ibz < nz || (ibz == nz &&
z < zc) ) ) {
672 if (
z > zc) {ibz2 = ibz + 1;}
else {ibz2 = ibz - 1;}
673 zc2 =
h->GetZaxis()->GetBinCenter(ibz2);
675 z000 =
h->GetBinContent(ibx2,iby2,ibz2);
676 z100 =
h->GetBinContent(ibx,iby2,ibz2);
677 z010 =
h->GetBinContent(ibx2,iby,ibz2);
678 z110 =
h->GetBinContent(ibx,iby,ibz2);
679 z001 =
h->GetBinContent(ibx2,iby2,ibz);
680 z101 =
h->GetBinContent(ibx,iby2,ibz);
681 z011 =
h->GetBinContent(ibx2,iby,ibz);
682 t = (
x - xc2)/(xc-xc2);
683 u = (
y - yc2)/(yc-yc2);
684 v = (
z - zc2)/(zc-zc2);
685 r = z111*
t*
u*
v + z001*(1.-
t)*(1.-
u)*
v
686 + z011*(1.-
t)*
u*
v + z101*
t*(1.-
u)*
v
687 + z110*
t*
u*(1.-
v) + z000*(1.-
t)*(1.-
u)*(1.-
v)
688 + z010*(1.-
t)*
u*(1.-
v) + z100*
t*(1.-
u)*(1.-
v);
690 z011 =
h->GetBinContent(ibx2,iby,ibz);
691 z001 =
h->GetBinContent(ibx2,iby2,ibz);
692 z101 =
h->GetBinContent(ibx,iby2,ibz);
693 t = (
x - xc2)/(xc-xc2);
694 u = (
y - yc2)/(yc-yc2);
695 r = z111*
t*
u + z011*(1.-
t)*
u + z101*
t*(1.-
u) + z001*(1.-
t)*(1.-
u) ;
697 }
else if ((ibz > 1 || (ibz == 1 &&
z > zc) ) &&
698 (ibz < nz || (ibz == nz &&
z < zc) ) ) {
699 if (
z > zc) {ibz2 = ibz + 1;}
else {ibz2 = ibz - 1;}
700 z110 =
h->GetBinContent(ibx,iby,ibz2);
701 z010 =
h->GetBinContent(ibx2,iby,ibz2);
702 z011 =
h->GetBinContent(ibx2,iby,ibz);
703 zc2 =
h->GetYaxis()->GetBinCenter(ibz2);
704 t = (
x - xc2)/(xc-xc2);
705 v = (
z - zc2)/(zc-zc2);
706 r = z111*
t*
v + z011*(1.-
t)*
v + z110*
t*(1.-
v) +z010*(1.-
t)*(1.-
v);
708 z011 =
h->GetBinContent(ibx2,iby,ibz);
709 t = (
x - xc2)/(xc-xc2);
710 r = z111*
t + z011*(1.-
t);
713 if ( (iby > 1 || (iby == 1 &&
y > yc) ) &&
714 (iby < ny || (iby == ny &&
y < yc) ) ) {
715 if (
y > yc) {iby2 = iby + 1;}
else {iby2 = iby - 1;}
716 yc2 =
h->GetYaxis()->GetBinCenter(iby2);
717 if ( (ibz > 1 || (ibz == 1 &&
z > zc) ) &&
718 (ibz < nz || (ibz == nz &&
z < zc) ) ) {
719 if (
z > zc) {ibz2 = ibz + 1;}
else {ibz2 = ibz - 1;}
720 zc2 =
h->GetZaxis()->GetBinCenter(ibz2);
722 z100 =
h->GetBinContent(ibx,iby2,ibz2);
723 z110 =
h->GetBinContent(ibx,iby,ibz2);
724 z101 =
h->GetBinContent(ibx,iby2,ibz);
725 u = (
y - yc2)/(yc-yc2);
726 v = (
z - zc2)/(zc-zc2);
727 r = z111*
u*
v + z101*(1.-
u)*
v
728 + z110*
u*(1.-
v) + z100*(1.-
u)*(1.-
v);
730 z101 =
h->GetBinContent(ibx,iby2,ibz);
731 u = (
y - yc2)/(yc-yc2);
732 r = z111*
u + z101*(1.-
u);
734 }
else if ((ibz > 1 || (ibz == 1 &&
z > zc) ) &&
735 (ibz < nz || (ibz == nz &&
z < zc) ) ) {
736 if (
z > zc) {ibz2 = ibz + 1;}
else {ibz2 = ibz - 1;}
737 z110 =
h->GetBinContent(ibx,iby,ibz2);
738 zc2 =
h->GetYaxis()->GetBinCenter(ibz2);
739 v = (
z - zc2)/(zc-zc2);
740 r = z111*
v + z110*(1.-
v);