39 for (
int iring = 0; iring < in.
getRingNo(); iring++) {
47 for (
size_t i = 0;
i <
XSIZE(Fring); ++
i, ptrFring_i += 2)
50 out.rings.push_back(Fring);
58 if ((m_lastFirstRing != firstRing) || (m_lastLastRing != lastRing) || (m_lastMode !=
mode)) {
60 m_lastFirstRing = firstRing;
61 m_lastLastRing = lastRing;
63 auto noOfRings = getNoOfRings(firstRing, lastRing);
64 m_lastSinRadius.resize(noOfRings);
65 m_lastCosRadius.resize(noOfRings);
68 for (
int r = 0; r < noOfRings; ++r) {
69 float radius = r + firstRing;
70 auto noOfSamples = getNoOfSamples(angle, radius);
71 auto &s = m_lastSinRadius.at(r);
72 auto &
c = m_lastCosRadius.at(r);
73 s.resize(noOfSamples);
74 c.resize(noOfSamples);
75 float dphi = angle / (float)noOfSamples;
76 for (
int i = 0;
i < noOfSamples; ++
i) {
78 s.at(
i) = sin(phi) * radius;
79 c.at(
i) = cos(phi) * radius;
90 for (
int iring = 0; iring <
in.getRingNo(); iring++) {
102 int nrings =
M1.getRingNo();
103 if (nrings !=
M2.getRingNo()) {
107 "rotationalCorrelation: polar structures have unequal number of rings:\ 108 nrings %d and M2.getRingNo %d",
109 nrings,
M2.getRingNo());
110 std::cerr << errorMsg << std::endl;
121 std::complex<double> auxC;
122 for (
int iring = 0; iring < nrings; iring++) {
123 double w = (2. *
PI *
M1.ring_radius[iring]);
124 int imax =
M1.getSampleNo(iring);
130 for (
int i = 0;
i < imax;
i++) {
135 *(ptrFsum++) += w * (a * c - b * d);
136 *(ptrFsum++) += w * (b * c + a * d);
145 double Kaux = 360. /
XSIZE(angles);
146 for (
size_t i = 0;
i <
XSIZE(angles);
i++)
152 template<
bool NORMALIZE>
155 Polar<std::complex<double> > &out,
bool conjugated,
int first_ring,
157 if (BsplineOrder == 1)
171 if (plans ==
nullptr) {
182 template<
bool NORMALIZE>
184 Polar<std::complex<double> > &out,
bool conjugated,
int first_ring,
187 polarFourierTransform<NORMALIZE>(
in, polarIn, out, conjugated, first_ring, last_ring, plans, BsplineOrder);
198 Polar<std::complex<double> > &out,
bool conjugated,
204 if (plans ==
nullptr) {
221 double* ptr =
nullptr;
243 XSIZE(I1) / 2, plans);
245 XSIZE(I2) / 2, plans);
248 rotationalCorr.
resize(2 * polarFourierI2.getSampleNoOuterRing() - 1);
250 double bestRot =
best_rotation(polarFourierI1, polarFourierI2, aux);
253 rotate(splineOrder, I2, tmp, -bestRot,
'Z', wrap);
260 float angMin,
double angMax,
float deltaAng) {
261 auto NAngSteps = (size_t)
floor((angMax - angMin) / deltaAng);
262 auto NRSteps = (size_t)
floor((Rmax - Rmin) / deltaR);
264 for (
size_t i = 0;
i < NAngSteps; ++
i) {
265 float angle = angMin +
i * deltaAng;
266 float s = sin(angle);
267 float c = cos(angle);
268 for (
size_t j = 0;
j < NRSteps; ++
j) {
269 float R = Rmin +
j * deltaR;
278 double Rmin,
double Rmax,
int NRSteps,
float angMin,
double angMax,
283 float deltaAng = (angMax - angMin + 1) / NAngSteps;
284 double deltaR = (Rmax - Rmin + 1) / NRSteps;
288 double Rrange = Rmax - Rmin;
289 for (
int j = 0;
j < NRSteps; ++
j)
291 + Rrange * pow(
j * deltaR / Rrange, zoomFactor);
293 for (
int i = 0;
i < NAngSteps; ++
i) {
294 float angle = angMin +
i * deltaAng;
295 float s = sin(angle);
296 float c = cos(angle);
297 for (
int j = 0;
j < NRSteps; ++
j) {
308 auto NAngSteps = (size_t)
floor((angMax - angMin) / deltaAng);
309 auto NRSteps = (size_t)
floor((Rmax - Rmin) / deltaR);
316 if (
XX(axis)!=0.0 ||
YY(axis)!=0.0)
324 double rotAng=acos(
ZZ(axis)/axis.
module());
333 for (
size_t i = 0;
i < NAngSteps; ++
i) {
334 float angle = angMin +
i * deltaAng;
335 float s = sin(angle);
336 float c = cos(angle);
339 for (
size_t j = 0;
j < NRSteps; ++
j) {
340 float R = Rmin +
j * deltaR;
358 double deltaRot,
double deltaTilt) {
359 auto NRotSteps = (size_t)
floor(2*
PI / deltaRot);
360 auto NTiltSteps = (size_t)
floor(
PI / deltaRot);
361 auto NRSteps = (size_t)
floor((Rmax - Rmin) / deltaR);
362 out.
initZeros(NRSteps, NRotSteps, NTiltSteps);
366 for (
size_t i = 0;
i < NRotSteps; ++
i) {
367 float rot =
i * deltaRot;
370 for (
size_t j = 0;
j < NRotSteps; ++
j) {
371 float tilt =
j * deltaTilt;
372 float stilt = sin(tilt);
373 float ctilt = cos(tilt);
374 float sc = stilt *
c;
375 float ss = stilt * s;
376 for (
size_t k = 0;
k<NRSteps; ++
k) {
377 float R = Rmin +
k * deltaR;
#define A2D_ELEM(v, i, j)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
std::vector< FourierTransformer * > transformers
__host__ __device__ float2 floor(const float2 v)
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 inverseFourierTransformRings(Polar< std::complex< double > > &in, Polar< double > &out, Polar_fftw_plans &plans, bool conjugated)
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, int wrap)
#define MULTIDIM_ARRAY(v)
void normalizedPolarFourierTransform(Polar< double > &polarIn, Polar< std::complex< double > > &out, bool conjugated, Polar_fftw_plans *&plans)
template void polarFourierTransform< false >(const MultidimArray< double > &in, Polar< std::complex< double > > &out, bool conjugated, int first_ring, int last_ring, Polar_fftw_plans *&plans, int BsplineOrder)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY_ptr(v, n, ptr)
~Polar_fftw_plans()
Destructor.
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 rotate(a, i, j, k, l)
constexpr int FULL_CIRCLES
T interpolatedElement2D(double x, double y, T outside_value=(T) 0) const
#define A3D_ELEM(V, k, i, j)
#define DIRECT_A1D_ELEM(v, i)
double best_rotation(const Polar< std::complex< double > > &I1, const Polar< std::complex< double > > &I2, RotationalCorrelationAux &aux)
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, double deltaRot, double deltaTilt)
std::vector< double > ring_radius
#define DIRECT_MULTIDIM_ELEM(v, n)
T interpolatedElement3D(double x, double y, double z, T outside_value=(T) 0) const
void FourierTransform(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
Polar_fftw_plans()
Empty constructor.
void normalize(double average, double stddev)
#define M3x3_BY_V3x1(a, M, b)
void fourierTransformRings(Polar< double > &in, Polar< std::complex< double > > &out, Polar_fftw_plans &plans, bool conjugated)
template void polarFourierTransform< true >(MultidimArray< double > const &, Polar< double > &, Polar< std::complex< double > > &, bool, int, int, Polar_fftw_plans *&, int)
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)
std::vector< MultidimArray< T > > rings
void image_convertCartesianToPolar(MultidimArray< double > &in, MultidimArray< double > &out, double Rmin, double Rmax, double deltaR, float angMin, double angMax, float deltaAng)
void initZeros(const MultidimArray< T1 > &op)
void calculateFftwPlans(Polar_fftw_plans &out)
Incorrect value received.
std::vector< MultidimArray< double > > arrays
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)
#define SPEED_UP_temps012