Xmipp  v3.23.11-Nereus
Public Member Functions | Public Attributes | List of all members

#include <reconstruct_ADMM.h>

Collaboration diagram for AdmmKernel:
Collaboration graph
[legend]

Public Member Functions

void initializeKernel (double alpha, double a, double _projectionStep)
 
double projectionValueAt (double u, double v)
 
void convolveKernelWithItself (double _autocorrStep)
 
void applyCTFToKernelAutocorrelation (CTFDescription &ctf, double Ts, MultidimArray< double > &autocorrelationWithCTF)
 
void getKernelAutocorrelation (MultidimArray< double > &autocorrelation)
 
void computeGradient (MultidimArray< double > &gradient, char direction, bool adjoint=false)
 
void computeKernel3D (MultidimArray< double > &kernel)
 

Public Attributes

double supp
 
double projectionStep
 
double autocorrStep
 
double alpha
 
Matrix1D< double > projectionProfile
 
MultidimArray< std::complex< double > > FourierProjectionAutocorr
 
FourierTransformer transformer
 
MultidimArray< double > projectionAutocorrWithCTF
 

Detailed Description

Definition at line 40 of file reconstruct_ADMM.h.

Member Function Documentation

◆ applyCTFToKernelAutocorrelation()

void AdmmKernel::applyCTFToKernelAutocorrelation ( CTFDescription ctf,
double  Ts,
MultidimArray< double > &  autocorrelationWithCTF 
)

Definition at line 764 of file reconstruct_ADMM.cpp.

765 {
766  double dig2cont=1.0/Ts;
767  double wx, wy;
768  auto xdim=(int)XSIZE(projectionAutocorrWithCTF);
769  int xdim_2=xdim/2;
770  double ixdim=1.0/xdim;
771  double maxFreq=2*autocorrStep;
772  double maxFreq2=maxFreq*maxFreq;
773  // Initialize Fourier transform to 0
774  memset(&A2D_ELEM(transformer.fFourier,0,0),0,MULTIDIM_SIZE(transformer.fFourier)*sizeof(std::complex<double>));
775  for (int i=((transformer.fFourier).yinit); i<=((transformer.fFourier).yinit + (int)(transformer.fFourier).ydim - 1); ++i)
776  {
777  FFT_IDX2DIGFREQ_FAST(i,xdim,xdim_2,ixdim,wy);
778  if (fabs(wy)>maxFreq)
779  continue;
780  double wy2=wy*wy;
781  wy*=dig2cont;
782  for (int j=((transformer.fFourier).xinit); j<=((transformer.fFourier).xinit + (int)(transformer.fFourier).xdim - 1); ++j)
783  {
784  FFT_IDX2DIGFREQ_FAST(j,xdim,xdim_2,ixdim,wx);
785  if (fabs(wx)>maxFreq)
786  continue;
787  double wx2=wx*wx;
788  if (wy2+wx2>maxFreq2)
789  continue;
790  wx*=dig2cont;
791  ctf.precomputeValues(wx,wy);
792  // A2D_ELEM(transformer.fFourier,i,j)=A2D_ELEM(FourierProjectionAutocorr,i,j)*fabs(ctf.getValueAt());
793  A2D_ELEM(transformer.fFourier,i,j)=fabs(ctf.getValueAt());
794  }
795  }
797  autocorrelationWithCTF=projectionAutocorrWithCTF;
798  CenterFFT(autocorrelationWithCTF, false);
799 
800 // Debugging code
801 // Image<double> save;
802 // save()=autocorrelationWithCTF;
803 // save.write("PPPautocorrelationWithCTF.xmp");
804 // std::cout << "Press any key" << std::endl;
805 // char c; std::cin>> c;
806 }
#define A2D_ELEM(v, i, j)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define MULTIDIM_SIZE(v)
MultidimArray< std::complex< double > > fFourier
Definition: xmipp_fftw.h:70
MultidimArray< double > projectionAutocorrWithCTF
#define i
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
double getValueAt(bool show=false) const
Compute CTF at (U,V). Continuous frequencies.
Definition: ctf.h:1050
#define XSIZE(v)
void precomputeValues(double X, double Y)
Precompute values for a given frequency.
Definition: ctf.h:1002
#define j
double autocorrStep
FourierTransformer transformer

◆ computeGradient()

void AdmmKernel::computeGradient ( MultidimArray< double > &  gradient,
char  direction,
bool  adjoint = false 
)

Definition at line 808 of file reconstruct_ADMM.cpp.

809 {
810  double supp2=supp*supp;
811  double K=-1/(supp2*bessi2(alpha));
812  gradient.initZeros();
813  for (int k=-supp; k<=supp; ++k)
814  {
815  int k2=k*k;
816  for (int i=-supp; i<=supp; ++i)
817  {
818  int i2=i*i;
819  for (int j=-supp; j<=supp; ++j)
820  {
821  int j2=j*j;
822  double r2=k2+i2+j2;
823  if (r2>supp2)
824  continue;
825  double z=alpha*sqrt(1.0-r2/supp2);
826  double value=K*z*bessi1(z);
827  switch (direction)
828  {
829  case 'x': value*=j; break;
830  case 'y': value*=i; break;
831  case 'z': value*=k; break;
832  }
833  if (adjoint)
834  value*=-1;
835  A3D_ELEM(gradient,k,i,j)=value;
836  }
837  }
838  }
839 }
__device__ float bessi1(float x)
void sqrt(Image< double > &op)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define A3D_ELEM(V, k, i, j)
__device__ float bessi2(float x)
double z
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
#define j
constexpr int K
float r2
void initZeros(const MultidimArray< T1 > &op)

◆ computeKernel3D()

void AdmmKernel::computeKernel3D ( MultidimArray< double > &  kernel)

Compute the kernel in 3D space

Definition at line 841 of file reconstruct_ADMM.cpp.

842 {
843  double supp2=supp*supp;
844  double K=1/(bessi2(alpha)*alpha*alpha);
845  kernel.initZeros();
846  for (int k=-supp; k<=supp; ++k)
847  {
848  int k2=k*k;
849  for (int i=-supp; i<=supp; ++i)
850  {
851  int i2=i*i;
852  for (int j=-supp; j<=supp; ++j)
853  {
854  int j2=j*j;
855  double r2=k2+i2+j2;
856  if (r2>supp2)
857  continue;
858  double z=alpha*sqrt(1.0-r2/supp2);
859  double value=K*z*z*bessi2(z);
860  A3D_ELEM(kernel,k,i,j)=value;
861  }
862  }
863  }
864 }
void sqrt(Image< double > &op)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define A3D_ELEM(V, k, i, j)
__device__ float bessi2(float x)
double z
#define j
constexpr int K
float r2
void initZeros(const MultidimArray< T1 > &op)

◆ convolveKernelWithItself()

void AdmmKernel::convolveKernelWithItself ( double  _autocorrStep)

Definition at line 723 of file reconstruct_ADMM.cpp.

724 {
725  autocorrStep=_autocorrStep;
726  size_t length=ceil(2.5*supp/autocorrStep)+1;
727  projectionAutocorrWithCTF.initZeros(2*length+1,2*length+1);
729  double isupp=1.0/supp;
730  double K=supp/bessi2(alpha)*sqrt(2.0*PI/alpha);
732  {
733  double s=sqrt(i*i+j*j)*autocorrStep;
734  double tmp=s*isupp;
735  if (tmp<1)
736  {
737  tmp=sqrt(1.0 - tmp*tmp);
738  A2D_ELEM(projectionAutocorrWithCTF,i,j)=K*pow(tmp,2.5)*bessi2_5(alpha*tmp);
739  }
740  }
741 
746 
747 // Debugging code
748 // transformer.inverseFourierTransform();
749 // Image<double> save;
750 // save()=projectionAutocorrWithCTF;
751 // save.write("PPPautocorrelationWithoutCTF.xmp");
752 // std::cout << "Press any key" << std::endl;
753 // char c; std::cin>> c;
754 }
MultidimArray< std::complex< double > > FourierProjectionAutocorr
#define A2D_ELEM(v, i, j)
#define MULTIDIM_SIZE(v)
void sqrt(Image< double > &op)
MultidimArray< double > projectionAutocorrWithCTF
#define i
#define FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
__device__ float bessi2(float x)
__host__ __device__ float length(float2 v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define j
double bessi2_5(double x)
constexpr int K
void initZeros(const MultidimArray< T1 > &op)
#define PI
Definition: tools.h:43
double autocorrStep
FourierTransformer transformer

◆ getKernelAutocorrelation()

void AdmmKernel::getKernelAutocorrelation ( MultidimArray< double > &  autocorrelation)

Definition at line 756 of file reconstruct_ADMM.cpp.

757 {
760  autocorrelation=projectionAutocorrWithCTF;
761  CenterFFT(autocorrelation, false);
762 }
MultidimArray< std::complex< double > > FourierProjectionAutocorr
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
MultidimArray< std::complex< double > > fFourier
Definition: xmipp_fftw.h:70
MultidimArray< double > projectionAutocorrWithCTF
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
FourierTransformer transformer

◆ initializeKernel()

void AdmmKernel::initializeKernel ( double  alpha,
double  a,
double  _projectionStep 
)

Definition at line 688 of file reconstruct_ADMM.cpp.

689 {
690  projectionStep=_projectionStep;
691  supp=a;
692  alpha=_alpha;
693  size_t length=ceil(a/projectionStep)+1;
695  double ia=1.0/a;
696  double K=a/bessi2(alpha)*sqrt(2.0*PI/alpha);
698  {
699  double s=i*projectionStep;
700  double tmp=s*ia;
701  tmp=sqrt(1.0 - tmp*tmp);
702  VEC_ELEM(projectionProfile,i)=K*pow(tmp,2.5)*bessi2_5(alpha*tmp);
703  // function p = KaiserBesselProjection(m, alpha, a, s)
704  // tmp = sqrt(1 - (s/a).^2);
705  // p = a ./ besseli(m, alpha) .* sqrt(2*pi/alpha) .* tmp.^(m+0.5) .* besseli(m+0.5, alpha*tmp);
706  // end
707  }
708 }
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
void sqrt(Image< double > &op)
#define i
#define FOR_ALL_ELEMENTS_IN_MATRIX1D(v)
Definition: matrix1d.h:72
__device__ float bessi2(float x)
__host__ __device__ float length(float2 v)
void initZeros()
Definition: matrix1d.h:592
double projectionStep
double bessi2_5(double x)
constexpr int K
#define PI
Definition: tools.h:43
doublereal * a
Matrix1D< double > projectionProfile

◆ projectionValueAt()

double AdmmKernel::projectionValueAt ( double  u,
double  v 
)

Definition at line 710 of file reconstruct_ADMM.cpp.

710  {
711  double r = sqrt(u*u+v*v);
712  if (r > supp) {
713  return 0.;
714  } else {
715  r = r/projectionStep ;
716  int rmin = std::floor(r);
717  int rmax = rmin+1 ;
718  double p = r-rmin;
719  return p * VEC_ELEM(projectionProfile,rmin) + (1-p) * VEC_ELEM(projectionProfile,rmax);
720  }
721 }
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
__host__ __device__ float2 floor(const float2 v)
void sqrt(Image< double > &op)
double projectionStep
doublereal * u
Matrix1D< double > projectionProfile

Member Data Documentation

◆ alpha

double AdmmKernel::alpha

Definition at line 46 of file reconstruct_ADMM.h.

◆ autocorrStep

double AdmmKernel::autocorrStep

Definition at line 45 of file reconstruct_ADMM.h.

◆ FourierProjectionAutocorr

MultidimArray< std::complex<double> > AdmmKernel::FourierProjectionAutocorr

Definition at line 48 of file reconstruct_ADMM.h.

◆ projectionAutocorrWithCTF

MultidimArray<double> AdmmKernel::projectionAutocorrWithCTF

Definition at line 50 of file reconstruct_ADMM.h.

◆ projectionProfile

Matrix1D<double> AdmmKernel::projectionProfile

Definition at line 47 of file reconstruct_ADMM.h.

◆ projectionStep

double AdmmKernel::projectionStep

Definition at line 44 of file reconstruct_ADMM.h.

◆ supp

double AdmmKernel::supp

Definition at line 43 of file reconstruct_ADMM.h.

◆ transformer

FourierTransformer AdmmKernel::transformer

Definition at line 49 of file reconstruct_ADMM.h.


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