90void 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;
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));
237 float ai,am1 = float(m1), am2 = float(m2);
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++) {
250 ai = float(i-lsup)*float(i-lsup);
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++) {
271 ai = float(i-lsup)*float(i-lsup);
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++) {
298 for (i = std::max(0,k-m1+1);i<std::min(nx-1,k+m1);i++) {
299 for (j = std::max(0,l-m2+1);j<std::min(ny-1,l+m2);j++) {
300 res[i][j] =
res[i][j] + wk[lsup+i-k][lsup+j-l]*
h[k][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++) {
308 res[k][l] =
res[k][l]*inv_am1_am2;
309 if (wgt[k][l] != 0.) {
res[k][l] =
res[k][l]/wgt[k][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)));
409 float ai,am1 = float(m1), am2 = float(m2), am3 = float(m3);
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++) {
453 ai = float(i-lsup)*float(i-lsup);
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++) {
463 ai = float(i-lsup)*float(i-lsup);
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++) {
477 ai = float(i-lsup)*float(i-lsup);
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++) {
501 for (i = std::max(0,k-m1+1);i<std::min(nx-1,k+m1);i++) {
502 for (j = std::max(0,l-m2+1);j<std::min(ny-1,l+m2);j++) {
503 for (n = std::max(0,m-m3+1);n<std::min(nz-1,m+m3);n++) {
504 res[i][j][n] =
res[i][j][n] + wk[lsup+i-k][lsup+j-l][lsup+n-m]*
h[k][l][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++) {
515 res[k][l][m] =
res[k][l][m]*inv_am1_am2;
516 if (wgt[k][l][m] != 0.) {
res[k][l][m] =
res[k][l][m]/wgt[k][l][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;
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);