70 paddingFactor = paddFactor;
71 maxFrequency = maxFreq;
78 paddingFactor = paddFactor;
79 maxFrequency = maxFreq;
87 volumeSize=
XSIZE(*volume);
95 std::complex< double >
f;
97 projectionFourier.initZeros();
98 double maxFreq2=maxFrequency*maxFrequency;
99 auto Xdim=(int)
XSIZE(VfourierRealCoefs);
100 auto Ydim=(int)
YSIZE(VfourierRealCoefs);
101 auto Zdim=(int)
ZSIZE(VfourierRealCoefs);
103 for (
size_t i=0;
i<
YSIZE(projectionFourier); ++
i)
106 double freqy2=freqy*freqy;
108 double freqYvol_X=
MAT_ELEM(E,1,0)*freqy;
109 double freqYvol_Y=
MAT_ELEM(E,1,1)*freqy;
110 double freqYvol_Z=
MAT_ELEM(E,1,2)*freqy;
111 for (
size_t j=0;
j<
XSIZE(projectionFourier); ++
j)
117 if ((freqy2+freqx*freqx)>maxFreq2)
121 double freqvol_X=freqYvol_X+
MAT_ELEM(E,0,0)*freqx;
122 double freqvol_Y=freqYvol_Y+
MAT_ELEM(E,0,1)*freqx;
123 double freqvol_Z=freqYvol_Z+
MAT_ELEM(E,0,2)*freqx;
131 auto kVolume=(int)
round(freqvol_Z*volumePaddedSize);
132 auto iVolume=(int)
round(freqvol_Y*volumePaddedSize);
133 auto jVolume=(int)
round(freqvol_X*volumePaddedSize);
134 c =
A3D_ELEM(VfourierRealCoefs,kVolume,iVolume,jVolume);
135 d =
A3D_ELEM(VfourierImagCoefs,kVolume,iVolume,jVolume);
140 double kVolume=freqvol_Z*volumePaddedSize;
141 double iVolume=freqvol_Y*volumePaddedSize;
142 double jVolume=freqvol_X*volumePaddedSize;
143 c=VfourierRealCoefs.interpolatedElement3D(jVolume,iVolume,kVolume);
144 d=VfourierImagCoefs.interpolatedElement3D(jVolume,iVolume,kVolume);
149 double kVolume=freqvol_Z*volumePaddedSize;
150 double iVolume=freqvol_Y*volumePaddedSize;
151 double jVolume=freqvol_X*volumePaddedSize;
167 auto l1 = (int)ceil(x - 2);
170 auto m1 = (int)ceil(y - 2);
173 auto n1 = (int)ceil(z - 2);
178 for (
int nn = n1;
nn <= n2;
nn++)
180 int equivalent_nn=
nn;
184 equivalent_nn=2*Zdim-
nn-1;
185 double yxsumRe = 0.0;
186 double yxsumIm = 0.0;
187 for (
int m = m1;
m <= m2;
m++)
193 equivalent_m=2*Ydim-
m-1;
196 for (
int l = l1; l <= l2; l++)
198 double xminusl = x - (double) l;
203 equivalent_l=2*Xdim-l-1;
204 auto CoeffRe = (double)
DIRECT_A3D_ELEM(VfourierRealCoefs,equivalent_nn,equivalent_m,equivalent_l);
205 auto CoeffIm = (double)
DIRECT_A3D_ELEM(VfourierImagCoefs,equivalent_nn,equivalent_m,equivalent_l);
207 xsumRe += CoeffRe * aux;
208 xsumIm += CoeffIm * aux;
211 double yminusm = y - (double) m;
213 yxsumRe += xsumRe * aux;
214 yxsumIm += xsumIm * aux;
217 double zminusn = z - (double) nn;
236 double ab_cd = (a +
b) * (c + d);
241 *(ptrI_ij+1) = ab_cd - ac - bd;
244 transformer2D.inverseFourierTransform();
251 auto paddedDim=(int)(paddingFactor*volumeSize);
264 double K=(double)(
XSIZE(Vpadded)*
XSIZE(Vpadded)*
XSIZE(Vpadded))/(
double)(volumeSize*volumeSize);
278 VfourierRealAux.
clear();
281 volumePaddedSize=
XSIZE(VfourierRealCoefs);
282 int idxMax=maxFrequency*
XSIZE(VfourierRealCoefs)+10;
285 VfourierRealCoefs.selfWindow(idxMin,idxMin,idxMin,idxMax,idxMax,idxMax);
288 VfourierImagAux.
clear();
289 VfourierImagCoefs.selfWindow(idxMin,idxMin,idxMin,idxMax,idxMax,idxMax);
293 volumePaddedSize=
XSIZE(VfourierRealCoefs);
296 produceSideInfoProjection();
302 projection().initZeros(volumeSize,volumeSize);
303 projection().setXmippOrigin();
304 transformer2D.FourierTransform(projection(),projectionFourier,
false);
307 phaseShiftImgA.initZeros(projectionFourier);
308 phaseShiftImgB.initZeros(projectionFourier);
310 double xxshift = -2 *
PI * shift / volumeSize;
311 for (
size_t i=0;
i<
YSIZE(projectionFourier); ++
i)
313 double phasey=(double)(
i) * xxshift;
314 for (
size_t j=0;
j<
XSIZE(projectionFourier); ++
j)
317 double dotp = (double)(
j) * xxshift + phasey;
328 projector.
project(rot,tilt,psi,ctf);
Matrix2D< double > eulert
void min(Image< double > &op1, const Image< double > &op2)
void reset(int Ydim, int Xdim)
double psi(const size_t n=0) const
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
void ShiftFFT(MultidimArray< std::complex< double > > &v, double xshift)
FourierProjector(double paddFactor, double maxFreq, int degree)
#define DIRECT_A2D_ELEM(v, i, j)
void updateVolume(MultidimArray< double > &V)
Matrix2D< T > transpose() const
double rot(const size_t n=0) const
double tilt(const size_t n=0) const
void produceSideInfoProjection()
Prepare projection space.
#define MAT_ELEM(m, i, j)
void CenterFFT(MultidimArray< T > &v, bool forward)
#define A3D_ELEM(V, k, i, j)
MultidimArray< double > data
void window(MultidimArray< T1 > &result, int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T1 init_value=0) const
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
void project(double rot, double tilt, double psi, const MultidimArray< double > *ctf=nullptr)
void produceSideInfo()
Prepare the Spline coefficients and projection space.
#define DIRECT_MULTIDIM_ELEM(v, n)
void projectVolume(FourierProjector &projector, Projection &P, int Ydim, int Xdim, double rot, double tilt, double psi, const MultidimArray< double > *ctf)
#define DIRECT_A3D_ELEM(v, k, i, j)
Matrix1D< double > direction
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
void setEulerAngles(double rot, double tilt, double psi, const size_t n=0)
#define FIRST_XMIPP_INDEX(size)
Image< double > projection
void applyGeo(const MDRow &row, bool only_apply_shifts=false, bool wrap=xmipp_transformation::WRAP) override
void read(const FileName &fn, const bool only_apply_shifts=false, DataMode datamode=DATA, MDRow *row=nullptr)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void setAngles(double _rot, double _tilt, double _psi)
void initZeros(const MultidimArray< T1 > &op)
#define LAST_XMIPP_INDEX(size)
void getRow(size_t i, Matrix1D< T > &v) const
void Complex2RealImag(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &real, MultidimArray< double > &imag)
void assign(const Projection &P)