FEDRA emulsion software from the OPERA Collaboration
EdbFilter2D Class Reference

2D histogram filtering (i.e. smoothing) More...

#include <EdbMath.h>

Public Member Functions

 EdbFilter2D ()
 
void Print ()
 
void SetKernel (int k)
 
void Smooth (TH2D &h)
 
void Smooth0 (TH2D &h)
 
virtual ~EdbFilter2D ()
 

Private Attributes

Double_t * eKernel
 
Int_t eKX
 
Int_t eKY
 

Detailed Description

2D histogram filtering (i.e. smoothing)

Constructor & Destructor Documentation

◆ EdbFilter2D()

EdbFilter2D::EdbFilter2D ( )
inline
80{eKernel=0;eKX=0;eKY=0;}
Int_t eKX
Definition: EdbMath.h:76
Int_t eKY
Definition: EdbMath.h:76
Double_t * eKernel
Definition: EdbMath.h:77

◆ ~EdbFilter2D()

virtual EdbFilter2D::~EdbFilter2D ( )
inlinevirtual
81{}

Member Function Documentation

◆ Print()

void EdbFilter2D::Print ( )
472{
473 printf("EdbFilter2D with kernel of %dx%d\n:",eKX,eKY);
474 for(int i=0; i<eKX; i++) {
475 for(int j=0; j<eKY; j++) printf("\t%f ",eKernel[ j*eKX+i ]);
476 printf("\n");
477 }
478
479}

◆ SetKernel()

void EdbFilter2D::SetKernel ( int  k)
430{
431 Double_t k1a[1][1] = {{1}}; // identity filter
432
433 Double_t k3a[3][3] =
434 { { 0, 1, 0 }, // from root
435 { 1, 2, 1 },
436 { 0, 1, 0 } };
437
438 Double_t k3m[3][3] =
439 { { 1, 1, 1 }, // flat mean filter
440 { 1, 1, 1 },
441 { 1, 1, 1 } };
442
443 if(k==0) {
444 eKX = eKY= 1;
445 eKernel = new Double_t[eKX*eKY];
446 memcpy( eKernel, (&(k1a[0][0])), eKX*eKY*sizeof(Double_t) );
447 }
448 else if(k==1) {
449 eKX = eKY= 3;
450 eKernel = new Double_t[eKX*eKY];
451 memcpy( eKernel, (&(k3a[0][0])), eKX*eKY*sizeof(Double_t) );
452 }
453 else if(k==2) {
454 eKX = eKY= 3;
455 eKernel = new Double_t[eKX*eKY];
456 memcpy( eKernel, (&(k3m[0][0])), eKX*eKY*sizeof(Double_t) );
457 }
458
459 /*
460 // normalize kernel to 1
461 Double_t ksum=0;
462 for(int i=0; i<eKX; i++)
463 for(int j=0; j<eKY; j++) ksum += eKernel[ j*eKX+i ];
464 for(int i=0; i<eKX; i++)
465 for(int j=0; j<eKY; j++) eKernel[ j*eKX+i ] /= ksum;
466 */
467 Print();
468}
void Print()
Definition: EdbMath.cxx:471

◆ Smooth()

void EdbFilter2D::Smooth ( TH2D &  h)
483{
484 Int_t nx = h.GetNbinsX();
485 Int_t ny = h.GetNbinsY();
486 Double_t *buf = new Double_t[nx*ny]; memset(buf,'\0', nx*ny*sizeof(Double_t));
487 Double_t *nbuf = new Double_t[nx*ny]; memset(nbuf,'\0', nx*ny*sizeof(Double_t));
488
489 // Copy all the data to the temporary buffers
490 for (int i=0; i<nx; i++) {
491 for (int j=0; j<ny; j++) {
492 int ib = nx*j + i;
493 buf[ib] = h.GetBinContent(h.GetBin(i+1,j+1));
494 }
495 }
496
497 for (int i=0; i<nx; i++) {
498 for (int j=0; j<ny; j++) {
499
500 double s=0;
501 double sk=0;
502
503 for (int ik=-(eKX/2); ik<=eKX/2; ik++) {
504 for (int jk=-(eKY/2); jk<=eKY/2; jk++) {
505 double k = eKernel[ (jk+eKY/2)*eKX+(eKX/2+ik) ];
506 if( i+ik>=0 && i+ik<nx && j+jk>=0 && j+jk<ny ) {
507 int ib = nx*(j+jk) + i+ik;
508 s += buf[ib]*k;
509 sk+=k;
510 }
511 }
512 }
513 nbuf[nx*j + i] = s/sk;
514 //printf("%d %d %f %f\n", i, j, s , sk);
515 }
516 }
517
518 for (int i=0; i<nx; i++) {
519 for (int j=0; j<ny; j++) {
520 h.SetBinContent( h.GetBin(i+1,j+1), nbuf[nx*j + i] );
521 }
522 }
523
524}
s
Definition: check_shower.C:55

◆ Smooth0()

void EdbFilter2D::Smooth0 ( TH2D &  h)
528{
529 Int_t ifirst = h.GetXaxis()->GetFirst();
530 Int_t ilast = h.GetXaxis()->GetLast();
531 Int_t jfirst = h.GetYaxis()->GetFirst();
532 Int_t jlast = h.GetYaxis()->GetLast();
533
534 Int_t nxb= ilast + 2;
535 Int_t nyb= jlast + 2; // buffer with margins
536 Int_t i0=ifirst; // buffer index corresponding to h[0][0];
537 Int_t j0=jfirst;
538 Double_t *buf = new Double_t[nxb*nyb]; memset(buf ,'\0', nxb*nyb*sizeof(Double_t));
539 Double_t *nbuf = new Double_t[nxb*nyb]; memset(nbuf,'\0', nxb*nyb*sizeof(Double_t));
540
541
542 // Copy all the data to the temporary buffers
543 for (int i=ifirst; i<=ilast; i++) {
544 for (int j=jfirst; j<=jlast; j++) {
545 int ib = nxb*(j0+j) + i0+i;
546 buf[ib] = h.GetBinContent(h.GetBin(i,j));
547 }
548 }
549
550 for (int i=ifirst; i<=ilast; i++) {
551 for (int j=jfirst; j<=jlast; j++) {
552
553 double s=0;
554 double sk=0;
555
556 for (int ik=-(eKX/2); ik<=eKX/2; ik++) {
557 for (int jk=-(eKY/2); jk<=eKY/2; jk++) {
558 double k = eKernel[ (jk+eKY/2)*eKX+(eKX/2+ik) ];
559
560 if( i0+i+ik>=i0 && i0+i+ik<=nxb )
561 if( j0+j+jk>=j0 && j0+j+jk<=nyb ) {
562 int ib = nxb*(j0+j+jk) + i0+i+ik;
563 s += buf[ib]*k;
564 sk+=k;
565 }
566 }
567 }
568 nbuf[nxb*(j0+j) + i0+i] = s/sk;
569 printf("%d %d %f %f %f %f\n", i, j, s , sk, buf[nxb*(j0+j) + i0+i], nbuf[nxb*(j0+j) + i0+i]);
570 }
571 }
572
573 for (int i=ifirst; i<=ilast; i++) {
574 for (int j=jfirst; j<=jlast; j++) {
575 h.SetBinContent( i,j, nbuf[nxb*(j0+j) + i0+i] );
576 }
577 }
578
579}

Member Data Documentation

◆ eKernel

Double_t* EdbFilter2D::eKernel
private

◆ eKX

Int_t EdbFilter2D::eKX
private

◆ eKY

Int_t EdbFilter2D::eKY
private

The documentation for this class was generated from the following files: