56 std::vector<MultidimArray<double> >
arrays;
75 std::vector<MultidimArray<T> >
rings;
138 for (
size_t i = 0;
i < rings.size();
i++)
139 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
151 for (
size_t i = 0;
i < rings.size();
i++)
152 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
164 for (
size_t i = 0;
i < rings.size();
i++)
165 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
177 for (
size_t i = 0;
i < rings.size();
i++)
178 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
188 size_t imax=rings.size();
189 for (
size_t i = 0;
i < imax;
i++)
192 for (
size_t j = 0;
j <
XSIZE(rings_i);
j++)
201 size_t imax=rings.size();
202 for (
size_t i = 0;
i < imax;
i++)
205 for (
int j = 0;
j <
XSIZE(rings_i);
j++)
214 size_t imax=rings.size();
215 for (
size_t i = 0;
i < imax;
i++)
218 for (
int j = 0;
j <
XSIZE(rings_i);
j++)
227 size_t imax=rings.size();
229 for (
size_t i = 0;
i < imax;
i++)
232 for (
size_t j = 0;
j <
XSIZE(rings_i);
j++)
241 for (
size_t i = 0;
i < rings.size();
i++)
242 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
243 (*(
this))(i,
j) -=
in(i,
j);
250 for (
size_t i = 0;
i < rings.size();
i++)
251 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
252 (*(
this))(i,
j) +=
in(i,
j);
259 for (
size_t i = 0;
i < rings.size();
i++)
260 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
261 (*(
this))(i,
j) *=
in(i,
j);
268 for (
size_t i = 0;
i < rings.size();
i++)
269 for (
size_t j = 0;
j <
XSIZE(rings[
i]);
j++)
270 (*(
this))(i,
j) /=
in(i,
j);
375 return XSIZE(rings[iring]);
388 return XSIZE(rings[rings.size()-1]);
401 return ring_radius[iring];
505 size_t imax=rings.size();
506 const double *ptrRing_radius=&ring_radius[0];
507 for (
size_t i = 0;
i < imax; ++
i, ++ptrRing_radius)
510 w = (twopi * (*ptrRing_radius)) / (
double)
XSIZE(rings[
i]);
512 for (
size_t j = 0;
j <
XSIZE(rings_i);
j++)
525 stddev=
sqrt(fabs(sum2-avg*avg));
530 stddev=
sqrt(fabs(sum2-avg*avg));
538 size_t imax=rings.size();
539 double istddev=1.0/stddev;
540 for (
size_t i = 0;
i < imax;
i++)
543 for (
size_t j = 0;
j <
XSIZE(rings_i);
j++)
560 std::vector<double> &
y,
561 std::vector<T> &data,
572 for (
int i = 0;
i < rings.size();
i++)
574 int nsam =
XSIZE(rings[
i]);
575 float dphi =
TWOPI / (float)nsam;
576 float radius = ring_radius[
i];
577 for (
int j = 0;
j < nsam;
j++)
579 float tmp =
j * dphi;
580 x.push_back(radius * sin(tmp));
581 y.push_back(radius * cos(tmp));
582 data.push_back(rings[i](
j));
589 auto first_ring = (int)
floor(ring_radius[0]);
590 auto last_ring = (int)ceil(ring_radius[rings.size()-1]);
591 int outer = last_ring + extra_shell;
592 int inner =
XMIPP_MAX(0,first_ring - extra_shell);
593 for (
int iradius = 0; iradius < outer; iradius +=1)
595 if ( (iradius >= inner && iradius < first_ring) ||
596 (iradius <= outer && iradius > last_ring) )
598 double radius=iradius;
599 int nsam = 2 * (int)( 0.5 * oversample *
TWOPI * radius );
601 float dphi =
TWOPI / (float)nsam;
602 for (
int j = 0;
j < nsam;
j++)
604 float tmp =
j * dphi;
605 x.push_back(radius * sin(tmp));
606 y.push_back(radius * cos(tmp));
626 int first_ring,
int last_ring,
int BsplineOrder=3,
627 double xoff = 0.,
double yoff = 0.,
638 auto noOfRings = getNoOfRings(first_ring, last_ring);
639 rings.resize(noOfRings);
640 ring_radius.resize(noOfRings);
643 oversample = oversample1;
663 std::lock_guard<std::mutex> lockGuard(m_mutex);
665 ensureAngleCache(first_ring, last_ring);
668 for (
int r = 0; r < noOfRings; ++r)
670 float radius = (float) r + first_ring;
671 ring_radius.at(r) = radius;
672 auto &Mring = rings.at(r);
674 int nsam = getNoOfSamples(twopi, radius);
675 Mring.resizeNoCopy(nsam);
677 auto &s = m_lastSinRadius.at(r);
678 auto &
c = m_lastCosRadius.at(r);
680 for (
int sample = 0; sample < nsam; ++sample)
691 if (xp < minxp_e || xp > maxxp_e)
692 xp =
realWRAP(xp, minxp - 0.5, maxxp + 0.5);
693 if (yp < minyp_e || yp > maxyp_e)
694 yp =
realWRAP(yp, minyp - 0.5, maxyp + 0.5);
710 (out.
arrays).resize(rings.size());
711 for (
size_t iring = 0; iring < rings.size(); iring++)
713 (out.
arrays)[iring] = rings[iring];
715 ptr_transformer->setReal((out.
arrays)[iring]);
721 void ensureAngleCache(
int firstRing,
int lastRing);
723 int getNoOfSamples(
double angle,
double radius) {
724 int result = 2 * (int)( 0.5 * oversample * angle * radius );
728 int getNoOfRings(
int firstRing,
int lastRing) {
729 return lastRing - firstRing + 1;
732 int m_lastFirstRing = 0;
733 int m_lastLastRing = 0;
735 std::vector<std::vector<float>> m_lastSinRadius;
736 std::vector<std::vector<float>> m_lastCosRadius;
761 Polar<std::complex<double> > &out,
829 const Polar<std::complex<double> > &
M2,
835 template<
bool NORMALIZE>
838 Polar<std::complex<double> > &out,
bool conjugated,
int first_ring,
841 template<
bool NORMALIZE>
843 Polar< std::complex<double> > &out,
bool flag,
858 int splineOrder=1,
int wrap=xmipp_transformation::WRAP);
866 double Rmin,
double Rmax,
double deltaR,
867 double angMin,
double angMax,
double deltaAng);
881 double Rmin,
double Rmax,
int NRSteps,
882 float angMin,
double angMax,
int NAngSteps);
890 double Rmin,
double Rmax,
double deltaR,
891 float angMin,
double angMax,
float deltaAng,
901 double deltaRot=2.*
PI/360.,
double deltaTilt=
PI/180.);
std::vector< FourierTransformer * > transformers
__host__ __device__ float2 floor(const float2 v)
Polar & operator=(const Polar &P)
void image_convertCartesianToPolar_ZoomAtCenter(const MultidimArray< double > &in, MultidimArray< double > &out, Matrix1D< double > &R, double zoomFactor, double Rmin, double Rmax, int NRSteps, float angMin, double angMax, int NAngSteps)
#define REPORT_ERROR(nerr, ErrormMsg)
void operator/=(const T val)
Polar & operator/=(const Polar< T > in)
void operator*=(const T val)
T & getPixel(int r, int f) const
void inverseFourierTransformRings(Polar< std::complex< double > > &in, Polar< double > &out, Polar_fftw_plans &plans, bool conjugated=DONT_CONJUGATE)
void sqrt(Image< double > &op)
int getSampleNoOuterRing() const
Polar & operator*(const T val)
void rotationalCorrelation(const Polar< std::complex< double > > &M1, const Polar< std::complex< double > > &M2, MultidimArray< double > &angles, RotationalCorrelationAux &aux)
void computeAverageAndStddev(double &avg, double &stddev, int mode=FULL_CIRCLES) const
void alignRotationally(MultidimArray< double > &I1, MultidimArray< double > &I2, RotationalCorrelationAux &aux, int splineOrder=1, int wrap=xmipp_transformation::WRAP)
void normalizedPolarFourierTransform(Polar< double > &polarIn, Polar< std::complex< double > > &out, bool conjugated, Polar_fftw_plans *&plans)
int getSampleNo(int iring) const
const MultidimArray< T > & getRing(int i) const
double getOversample() const
~Polar_fftw_plans()
Destructor.
const FileName & name() const
constexpr bool KEEP_TRANSFORM
void rename(const FileName &newName)
Polar & operator-=(const Polar< T > in)
constexpr int FULL_CIRCLES
Polar_fftw_plans & operator=(const Polar_fftw_plans &)=delete
#define DIRECT_A1D_ELEM(v, i)
void image_convertCartesianToPolar(MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, double angMin, double angMax, double deltaAng)
double best_rotation(const Polar< std::complex< double > > &I1, const Polar< std::complex< double > > &I2, RotationalCorrelationAux &aux)
Polar & operator-(const T val) const
void getPolarFromCartesianBSpline(const MultidimArray< T > &M1, int first_ring, int last_ring, int BsplineOrder=3, double xoff=0., double yoff=0., double oversample1=1., int mode1=FULL_CIRCLES)
MultidimArray< std::complex< double > > Fsum
void volume_convertCartesianToSpherical(const MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR=1., double deltaRot=2.*PI/360., double deltaTilt=PI/180.)
void setPixel(int r, int f, T val) const
#define XMIPP_EQUAL_ACCURACY
Polar & operator+(const T val)
std::vector< double > ring_radius
Polar & operator+=(const Polar< T > in)
void operator+=(const T val)
double getRadius(int iring) const
constexpr int HALF_CIRCLES
constexpr bool DONT_CONJUGATE
Polar_fftw_plans()
Empty constructor.
T interpolatedElementBSpline2D(double x, double y, int SplineDegree=3) const
void normalize(double average, double stddev)
void operator-=(const T val)
void fourierTransformRings(Polar< double > &in, Polar< std::complex< double > > &out, Polar_fftw_plans &plans, bool conjugated=DONT_CONJUGATE)
T & operator()(int r, int f) const
Polar & operator*=(const Polar< T > in)
constexpr bool DONT_KEEP_TRANSFORM
FourierTransformer local_transformer
void polarFourierTransform(const MultidimArray< double > &in, Polar< double > &inAux, Polar< std::complex< double > > &out, bool conjugated, int first_ring, int last_ring, Polar_fftw_plans *&plans, int BsplineOrder)
#define FIRST_XMIPP_INDEX(size)
MultidimArray< T > & getRing(int i)
#define realWRAP(x, x0, xF)
T interpolatedElement2DOutsideZero(double x, double y) const
std::vector< MultidimArray< T > > rings
void getCartesianCoordinates(std::vector< double > &x, std::vector< double > &y, std::vector< T > &data, const int extra_shell=GRIDDING_K/2)
#define LAST_XMIPP_INDEX(size)
void calculateFftwPlans(Polar_fftw_plans &out)
Incorrect value received.
std::vector< MultidimArray< double > > arrays
Polar & operator/(const T val)
void volume_convertCartesianToCylindrical(const MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, float angMin, double angMax, float deltaAng, Matrix1D< double > &axis)
void setRing(int i, MultidimArray< T > val)