33 static pthread_mutex_t fftw_plan_mutex = PTHREAD_MUTEX_INITIALIZER;
42 pthread_mutex_lock(&fftw_plan_mutex);
44 pthread_mutex_unlock(&fftw_plan_mutex);
52 pthread_mutex_lock(&fftw_plan_mutex);
54 pthread_mutex_unlock(&fftw_plan_mutex);
83 pthread_mutex_lock(&fftw_plan_mutex);
88 pthread_mutex_unlock(&fftw_plan_mutex);
97 pthread_mutex_lock(&fftw_plan_mutex);
114 pthread_mutex_unlock(&fftw_plan_mutex);
131 bool updatePlan=
false;
173 pthread_mutex_lock(&fftw_plan_mutex);
189 pthread_mutex_unlock(&fftw_plan_mutex);
194 bool recomputePlan=
false;
213 int *N =
new int[ndim];
230 pthread_mutex_lock(&fftw_plan_mutex);
245 pthread_mutex_unlock(&fftw_plan_mutex);
258 if (sign == FFTW_FORWARD)
264 unsigned long int size=0;
272 double isize=1.0/size;
293 else if (sign == FFTW_BACKWARD)
299 unsigned long int size=0;
303 double isize=1.0/size;
310 double isize=1.0/size;
355 for (
int i=1;
i<=yHalf;
i++)
358 std::complex<double> mean=0.5*(
366 for (
int k=0;
k<Zdim;
k++)
369 for (
int i=1;
i<=yHalf;
i++)
372 std::complex<double> mean=0.5*(
379 for (
int k=1;
k<=zHalf;
k++)
382 std::complex<double> mean=0.5*(
442 for (
size_t n = 0;
n <
ZSIZE(result);
n++)
445 transformer1.FourierTransform(imgTemp, FFTIm,
false);
450 transformer1.inverseFourierTransform();
477 d=(*(ptrFFT2+1))*dSize;
478 *ptrFFT2++ = a*c-b*
d;
479 *ptrFFT2++ = b*c+a*
d;
493 double sampling_rate,
516 std::cerr <<
"FT1" << FT1 << std::endl;
532 double rFactorNumerator=0;
533 double rFactorDenominator=0;
552 #ifdef SAVE_REAL_PART 554 std::vector<double> *realPart=
555 new std::vector<double>[
XSIZE(radial_count)];
558 int sizeZ_2 = m1sizeZ/2;
561 double isizeZ = 1.0/m1sizeZ;
562 int sizeY_2 = m1sizeY/2;
563 double iysize = 1.0/m1sizeY;
564 int sizeX_2 = m1sizeX/2;
565 double ixsize = 1.0/m1sizeX;
568 int ZdimFT1=(int)
ZSIZE(FT1);
569 int YdimFT1=(int)
YSIZE(FT1);
570 int XdimFT1=(int)
XSIZE(FT1);
572 double maxFreq_2 =0.;
573 maxFreq_2 = maxFreq * maxFreq;
574 for (
int k=0;
k<ZdimFT1;
k++)
577 double fz2=
ZZ(f)*
ZZ(f);
578 for (
int i=0;
i<YdimFT1;
i++)
581 double fz2_fy2=fz2 +
YY(f)*
YY(f);
582 for (
int j=0;
j<XdimFT1;
j++)
586 double R2 =fz2_fy2 +
XX(f)*
XX(f);
591 int idx = (int)
round(R * m1sizeX);
592 std::complex<double> &z1 =
dAkij(FT1,
k,
i,
j);
593 std::complex<double> &z2 =
dAkij(FT2,
k,
i,
j);
594 double absz1 =
abs(z1);
595 double absz2 =
abs(z2);
596 dAi(num,idx) += real(
conj(z1) * z2);
597 dAi(den1,idx) += absz1*absz1;
598 dAi(den2,idx) += absz2*absz2;
599 dAi(error_l2,idx) +=
abs(z1-z2);
601 if ( R > minFreq && R < maxFreq)
603 rFactorNumerator += fabs(absz1 - absz2);
604 rFactorDenominator += absz1;
609 double phaseDiff=atan2(z1.imag(),z1.real()) - atan2(z2.imag(),z2.real());
610 phaseDiff =
RAD2DEG(phaseDiff);
611 phaseDiff =
realWRAP(phaseDiff,-180, 180);
612 dAi(dpr,idx) += ((absz1+absz2)*phaseDiff*phaseDiff);
613 dAi(den_dpr,idx) += (absz1+absz2);
614 #ifdef SAVE_REAL_PART 616 realPart[idx].push_back(z1.real());
620 dAi(radial_count,idx)++;
629 *rFactor = rFactorNumerator / rFactorDenominator;
638 dAi(freq,
i) = (double)
i / (m1sizeX * sampling_rate);
640 dAi(frc_noise,
i) = 2 /
sqrt((
double)
dAi(radial_count,
i));
641 dAi(error_l2,
i) /=
dAi(radial_count,
i);
645 #ifdef SAVE_REAL_PART 650 for (
int j=0;
j<realPart[
i].size();
j++)
651 fhOut << realPart[
i][
j] << std::endl;
695 size_t km0=
ZSIZE(inFourier)>=
ZSIZE(outFourier)?(kpF+1):(
ZSIZE(outFourier)-(
ZSIZE(inFourier)-(zhalf+1)));
696 size_t kmF=
ZSIZE(outFourier)-1;
697 size_t im0=
YSIZE(inFourier)>=
YSIZE(outFourier)?(ipF+1):(
YSIZE(outFourier)-(
YSIZE(inFourier)-(yhalf+1)));
698 size_t imF=
YSIZE(outFourier)-1;
701 outFourier.initZeros();
703 for (
size_t k = kp0;
k<=kpF; ++
k)
705 for (
size_t i=ip0;
i<=ipF; ++
i)
707 for (
size_t i=im0;
i<=imF; ++
i) {
708 size_t ip =
i +
YSIZE(inFourier)-
YSIZE(outFourier) ;
709 memcpy(&
dAkij(outFourier,
k,
i,0),&
dAkij(inFourier,
k,ip,0),xsize);
712 for (
size_t k = km0;
k<=kmF; ++
k) {
713 size_t kp =
k +
ZSIZE(inFourier)-
ZSIZE(outFourier) ;
714 for (
size_t i=ip0;
i<=ipF; ++
i)
715 memcpy(&
dAkij(outFourier,
k,
i,0),&
dAkij(inFourier,kp,
i,0),xsize);
716 for (
size_t i=im0;
i<=imF; ++
i) {
717 size_t ip =
i +
YSIZE(inFourier)-
YSIZE(outFourier) ;
718 memcpy(&
dAkij(outFourier,
k,
i,0),&
dAkij(inFourier,kp,ip,0),xsize);
757 int xsize =
XSIZE(Min);
775 int idx =
round(R*xsize);
783 for (
int i = 0;
i < xsize;
i++)
790 bool leave_origin_intact)
793 Min.checkDimension(3);
799 dAi(div_spec,
i) = 1./
dAi(spectrum,
i);
801 dAi(div_spec,
i) = 1.;
808 bool leave_origin_intact)
810 Min.checkDimension(3);
820 if (leave_origin_intact)
830 dAkij(Faux,
k,
i,
j) *= lspectrum(idx) * dim3;
838 bool leave_origin_intact)
840 Min.checkDimension(3);
853 bool leave_origin_intact)
856 Min.checkDimension(3);
862 dAi(spectrum,
i) = (
dAi(spectrum,
i) > 0.) ?
dAi(spectrum_ref,
i)/
dAi(spectrum,
i) : 1.;
882 double mdSize=-dSize;
891 d=(*(ptrFFT2+1))*mdSize;
892 *ptrFFT2++ = a*c-b*
d;
893 *ptrFFT2++ = b*c+a*
d;
943 *ptrFFT1++ = a*c-b*
d;
944 *ptrFFT1++ = b*c+a*
d;
951 R=*transformer.
fReal;
968 double &realPart=*ptr;
969 double &imagPart=*(ptr+1);
970 realPart=dSize*(realPart*realPart+imagPart*imagPart);
Just to locate unclassified errors.
void min(Image< double > &op1, const Image< double > &op2)
void FFT_phase(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &phase)
FourierTransformer transformer1
void adaptSpectrum(MultidimArray< double > &Min, MultidimArray< double > &Mout, const MultidimArray< double > &spectrum_ref, int spectrum_type, bool leave_origin_intact)
alglib::complex conj(const alglib::complex &z)
template void scaleToSizeFourier< double >(MultidimArray< double > &mdaIn, MultidimArray< double > &mdaOut, MultidimArray< std::complex< double > > &inFourier, MultidimArray< std::complex< double > > &outFourier)
#define REPORT_ERROR(nerr, ErrormMsg)
void resizeNoCopy(const MultidimArray< T1 > &v)
void sqrt(Image< double > &op)
void correlationInFourier(const MultidimArray< std::complex< double > > &FF1, MultidimArray< std::complex< double > > &FF2, double dSize)
#define DIRECT_A2D_ELEM(v, i, j)
void correlation_matrix(const MultidimArray< double > &m1, const MultidimArray< double > &m2, MultidimArray< double > &R, CorrelationAux &aux, bool center)
#define MULTIDIM_ARRAY(v)
void abs(Image< double > &op)
void frc_dpr(MultidimArray< double > &m1, MultidimArray< double > &m2, double sampling_rate, MultidimArray< double > &freq, MultidimArray< double > &frc, MultidimArray< double > &frc_noise, MultidimArray< double > &dpr, MultidimArray< double > &error_l2, bool dodpr, bool doRfactor, double minFreq, double maxFreq, double *rFactor)
String integerToString(int I, int _width, char fill_with)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
void convolutionFFTStack(const MultidimArray< double > &img, const MultidimArray< double > &kernel, MultidimArray< double > &result)
Incorrect MultidimArray size.
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
void auto_correlation_matrix(const MultidimArray< double > &Img, MultidimArray< double > &R, CorrelationAux &aux)
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
void aliasSlice(const MultidimArray< T > &m, size_t select_slice)
void getSpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, int spectrum_type)
void CenterFFT(MultidimArray< T > &v, bool forward)
void getImage(MultidimArray< T > &M) const
#define FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
bool sameShape(const MultidimArrayBase &op) const
void multiplyBySpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact)
void setImage(MultidimArray< T > &M)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
void radialAverage(const MultidimArray< double > &VolFourierMag, const MultidimArray< double > &V, MultidimArray< double > &radial_mean)
#define dAkij(V, k, i, j)
void fast_correlation_vector(const MultidimArray< std::complex< double > > &FFT1, const MultidimArray< std::complex< double > > &FFT2, MultidimArray< double > &R, FourierTransformer &transformer)
#define DIRECT_MULTIDIM_ELEM(v, n)
void selfScaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mda, int nThreads)
void convolutionFFT(MultidimArray< double > &img, MultidimArray< double > &kernel, MultidimArray< double > &result)
void scaleToSizeFourier(int Zdim, int Ydim, int Xdim, MultidimArray< double > &mdaIn, MultidimArray< double > &mdaOut, int nThreads)
MultidimArray< std::complex< double > > FFT1
#define DIRECT_A3D_ELEM(v, k, i, j)
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
FFT Plan cannot be created.
void randomizePhases(MultidimArray< double > &Min, double wRandom)
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
void radial_magnitude(const MultidimArray< double > &v, MultidimArray< std::complex< double > > &V, MultidimArray< double > &radialMagnitude)
void whitenSpectrum(MultidimArray< double > &Min, MultidimArray< double > &Mout, int spectrum_type, bool leave_origin_intact)
#define realWRAP(x, x0, xF)
MultidimArray< std::complex< double > > FFT2
#define AMPLITUDE_SPECTRUM
void initZeros(const MultidimArray< T1 > &op)
FourierTransformer transformer2
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
void divideBySpectrum(MultidimArray< double > &Min, MultidimArray< double > &spectrum, bool leave_origin_intact)
#define intWRAP(x, x0, xF)