347 {
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)<<
" / " ;
356 }
357 }
358 }
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)<<
" / " ;
370 }
371 }
372 }
373 std::cout << std::endl;
374 }
375
376 const int lsup = 20;
377 if (m1 > lsup || m2 > lsup || m3 > lsup) {
378 std::cout <<"HistoHelperRoot::smoothASH3D: m1, m2 or m3 too big !"<<std::endl;
379 return;
380 } else {
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];
393 }
394 }
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);
399 }
400 }
401 }
402
404 float wk1[41],wk2[41],wk3[41];
405
406
407 auto wk = std::vector(41,std::vector(41,std::vector<float>(41)));
408 double wks = 0.;
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;
415
416
417 for (k = 0;
k<nx-1;
k++) {
418 for (l = 0;
l<ny-1;
l++) {
419 for (m = 0;
m<nz-1;
m++) {
421
422 }
423 }
424 }
425
426
427
428 float ***wgt;
429 int dimension = 100;
int x,
y,
z = 0;
430 wgt = new float**[dimension];
431 if (!wgt) {
432 std::cout <<"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
433 std::abort();
434 }
435 for(
x = 0;
x < dimension;
x++) {
436 wgt[
x] =
new float*[dimension];
437 if (!wgt) {
438 std::cout <<"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
439 std::abort();
440 }
441 for(
y = 0;
y < dimension;
y++) {
442 wgt[
x][
y] =
new float[dimension];
443 if (!wgt) {
444 std::cout <<"HistoHelperRoot::smoothASH3D: problem to allocate memory, exiting"<<std::endl;
445 std::abort();
446 }
447 for(
z = 0;
z < dimension;
z++)
449 }
450 }
451
452 for (i = lsup+1-m1;
i<lsup+
m1;
i++) {
454 wk1[
i] = 15./16.*(1.-ai*inv_am12)*(1.-ai*inv_am12);
456 }
457 const double fac1 = am1 / wks;
458 for (i = lsup+1-m1;
i<lsup+
m1;
i++) {
459 wk1[
i] = wk1[
i]*fac1;
460 }
461 wks = 0.;
462 for (i = lsup+1-m2;
i<lsup+
m2;
i++) {
464 wk2[
i] = 15./16.*(1.-ai*inv_am22)*(1.-ai*inv_am22);
466 }
467 if (wks == 0){
468 std::cout <<"HistoHelperRoot::smoothASH3D: wks is zero! "<<std::endl;
469 return;
470 }
471 const double fac2 = am2 / wks;
472 for (i = lsup+1-m2;
i<lsup+
m2;
i++) {
473 wk2[
i] = wk2[
i]*fac2;
474 }
475 wks = 0.;
476 for (i = lsup+1-m3;
i<lsup+
m3;
i++) {
478 wk3[
i] = 15./16.*(1.-ai*inv_am32)*(1.-ai*inv_am32);
480 }
481 if (wks == 0){
482 std::cout <<"HistoHelperRoot::smoothASH3D: wks is zero! "<<std::endl;
483 return;
484 }
485 const double fac3 = am3 / wks;
486 for (i = lsup+1-m3;
i<lsup+
m3;
i++) {
487 wk3[
i] = wk3[
i]*fac3;
488 }
489
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];
494 }
495 }
496 }
497
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++) {
505 wgt[
i][j][
n] = wgt[
i][j][
n] + wk[lsup+
i-
k][lsup+j-
l][lsup+
n-
m];
506 }
507 }
508 }
509 }
510 }
511 }
512 for (k = 0;
k<nx-1;
k++) {
513 for (l = 0;
l<ny-1;
l++) {
514 for (m = 0;
m<nz-1;
m++) {
517 }
518 }
519 }
520
521 input3D->Reset();
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]);
526 }
527 }
528 }
529 for (i = 0;
i < nx-1;
i++){
530 for (j = 0; j < ny-1; j++) {
533 }
536 }
539
540 for (i = 0;
i < dimension;
i++){
541 for (j = 0; j < dimension; j++)
542 delete[] wgt[i][j];
544 }
545 delete[] wgt;
546 }
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)<<
" / " ;
553 }
554 }
555 }
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)<<
" / " ;
567 }
568 }
569 }
570 std::cout << std::endl;
571 }
572}