FEDRA emulsion software from the OPERA Collaboration
EdbFilter2D Class Reference

#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
 

Constructor & Destructor Documentation

◆ EdbFilter2D()

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

◆ ~EdbFilter2D()

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

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 }
int nx
Definition: emthickness.cpp:60
int ny
Definition: emthickness.cpp:62
EdbSegP * s
Definition: tlg2pattern.C:32

◆ 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: