38 #include "utils/half.hpp" 98 const char *splineType=
"Centered Spline";
100 g, &ng, h, &nh, &IsCentered))
107 if (
XSIZE(aux) % 2 != 0 &&
YSIZE(aux) % 2 != 0)
109 else if (
YSIZE(aux) % 2 != 0)
111 else if (
XSIZE(aux) % 2 != 0)
118 else if (V1.
getDim() == 3)
122 else if (
XSIZE(aux) % 2 != 0 &&
YSIZE(aux) % 2 != 0 &&
ZSIZE(aux) % 2 == 0)
124 else if (
XSIZE(aux) % 2 != 0 &&
YSIZE(aux) % 2 == 0 &&
ZSIZE(aux) % 2 != 0)
126 else if (
XSIZE(aux) % 2 != 0 &&
YSIZE(aux) % 2 == 0 &&
ZSIZE(aux) % 2 == 0)
128 else if (
XSIZE(aux) % 2 == 0 &&
YSIZE(aux) % 2 != 0 &&
ZSIZE(aux) % 2 != 0)
130 else if (
XSIZE(aux) % 2 == 0 &&
YSIZE(aux) % 2 != 0 &&
ZSIZE(aux) % 2 == 0)
132 else if (
XSIZE(aux) % 2 == 0 &&
YSIZE(aux) % 2 == 0 &&
ZSIZE(aux) % 2 != 0)
168 else if (V1.
getDim() == 3)
179 bool only_apply_shifts)
182 double psi = 0, shiftX = 0., shiftY = 0., scale = 1.;
193 int dim = A.
Xdim() - 1;
195 if (dim < 2 || dim > 3)
201 if (only_apply_shifts)
207 double rot = 0., tilt = 0., shiftZ = 0.;
212 dMij(A, 2, dim) = shiftZ;
214 dMij(A, 0, dim) = shiftX;
215 dMij(A, 1, dim) = shiftY;
229 dMij(A, dim, dim) = 1.;
234 dMij(A, 0, 0) *= -1.;
235 dMij(A, 0, 1) *= -1.;
237 dMij(A, 0, 2) *= -1.;
245 String matrixStrCopy(matrixStr);
248 for (
size_t i = 0;
i < matrixStr.size();
i++)
251 if (c ==
'[' or c ==
']' or c ==
',')
252 matrixStrCopy[
i] =
' ';
256 std::stringstream ss(matrixStrCopy);
257 size_t d_1 = dim - 1;
259 for (
size_t i = 0;
i <
n; ++
i)
260 for (
size_t j = 0;
j <
n; ++
j)
265 ss >>
dMij(matrix,
i < dim ?
i :
i-1,
j < dim ?
j :
j-1);
267 dMij(matrix, d_1, d_1) = 1.;
277 static_assert(std::is_floating_point<T>::value,
278 "Only float and double are allowed as template parameters");
280 flip = ((
dMij(A, 0, 0) *
dMij(A, 1, 1) -
dMij(A, 0, 1) *
dMij(A, 1, 0) ) < 0);
281 int sgn = flip ? -1 : 1;
282 T cosine = sgn *
dMij(A, 0, 0);
283 T sine = sgn *
dMij(A, 0, 1);
284 T scale2 = cosine * cosine + sine * sine;
285 scale =
sqrt(scale2);
286 T invScale = 1 / scale;
287 shiftX =
dMij(A, 0, 2) * invScale;
288 shiftY =
dMij(A, 1, 2) * invScale;
289 psi =
RAD2DEG(atan2(sine, cosine));
296 double &scale,
double &shiftX,
297 double &shiftY,
double &shiftZ,
298 double &rot,
double &tilt,
double &
psi)
303 double invScale = 1./ scale;
313 flip = tmpMatrix.
det3x3() < 0;
316 dMij(eulerMatrix, 0, 0) *= -1.;
317 dMij(eulerMatrix, 0, 1) *= -1.;
318 dMij(eulerMatrix, 0, 2) *= -1.;
322 shiftX =
dMij(tmpMatrix,0,3);
323 shiftY =
dMij(tmpMatrix,1,3);
324 shiftZ =
dMij(tmpMatrix,2,3);
327 #define ADD_IF_EXIST_NONZERO(label, value) if (imageGeo.containsLabel(label) || \ 328 !XMIPP_EQUAL_ZERO(value))\ 329 imageGeo.setValue(label, value); 333 double scale = 1, shiftX = 0, shiftY = 0,
psi = 0, shiftZ = 0, rot = 0, tilt = 0;
335 int dim = A.
Xdim() - 1;
364 static_assert(std::is_floating_point<T>::value,
365 "Only float and double are allowed as template parameters");
375 result.
mdata[0] = cosine;
376 result.
mdata[1] = sine;
379 result.
mdata[3] = -sine;
380 result.
mdata[4] = cosine;
389 result.
mdata[0] = cosine;
390 result.
mdata[1] = sine;
392 result.
mdata[2] = -sine;
393 result.
mdata[3] = cosine;
415 dMij(resMatrix,0, 2) = -
XX(translation);
416 dMij(resMatrix,1, 2) = -
YY(translation);
420 dMij(resMatrix,0, 2) =
XX(translation);
421 dMij(resMatrix,1, 2) =
YY(translation);
432 dMij(result,3, 3) = 1;
445 dMij(result,0, 0) = cosine;
446 dMij(result,0, 1) = sine;
447 dMij(result,1, 0) = -sine;
448 dMij(result,1, 1) = cosine;
449 dMij(result,2, 2) = 1;
452 dMij(result,0, 0) = cosine;
453 dMij(result,0, 2) = sine;
454 dMij(result,2, 0) = -sine;
455 dMij(result,2, 2) = cosine;
456 dMij(result,1, 1) = 1;
459 dMij(result,1, 1) = cosine;
460 dMij(result,1, 2) = sine;
461 dMij(result,2, 1) = -sine;
462 dMij(result,2, 2) = cosine;
463 dMij(result,0, 0) = 1;
474 if (axis.
size() != 3)
479 dMij(result,3, 3) = 1;
487 double proj_mod =
sqrt(
YY(Axis) *
YY(Axis) +
ZZ(Axis) *
ZZ(Axis));
491 dMij(result,0, 0) = proj_mod;
492 dMij(result,0, 1) = -
XX(Axis) *
YY(Axis) / proj_mod;
493 dMij(result,0, 2) = -
XX(Axis) *
ZZ(Axis) / proj_mod;
494 dMij(result,1, 0) = 0;
495 dMij(result,1, 1) =
ZZ(Axis) / proj_mod;
496 dMij(result,1, 2) = -
YY(Axis) / proj_mod;
497 dMij(result,2, 0) =
XX(Axis);
498 dMij(result,2, 1) =
YY(Axis);
499 dMij(result,2, 2) =
ZZ(Axis);
504 dMij(result,0, 0) = 0;
505 dMij(result,0, 1) = 0;
506 dMij(result,0, 2) = (
XX(Axis) > 0)? -1 : 1;
507 dMij(result,1, 0) = 0;
508 dMij(result,1, 1) = 1;
509 dMij(result,1, 2) = 0;
510 dMij(result,2, 0) = (
XX(Axis) > 0)? 1 : -1;
511 dMij(result,2, 1) = 0;
512 dMij(result,2, 2) = 0;
547 dMij(result,0,0)=c+x2*c1;
548 dMij(result,0,1)=xy*c1-z*s;
549 dMij(result,0,2)=xz*c1+y*s;
550 dMij(result,1,0)=xy*c1+z*s;
551 dMij(result,1,1)=c+y2*c1;
552 dMij(result,1,2)=yz*c1-x*s;
553 dMij(result,2,0)=xz*c1-y*s;
554 dMij(result,2,1)=yz*c1+x*s;
555 dMij(result,2,2)=c+z2*c1;
571 dMij(resMatrix,0, 3) = -
XX(translation);
572 dMij(resMatrix,1, 3) = -
YY(translation);
573 dMij(resMatrix,2, 3) = -
ZZ(translation);
577 dMij(resMatrix,0, 3) =
XX(translation);
578 dMij(resMatrix,1, 3) =
YY(translation);
579 dMij(resMatrix,2, 3) =
ZZ(translation);
593 dMij(result,3, 3) = 1;
597 dMij(result,0, 0) =
XX(sc);
598 dMij(result,1, 1) =
YY(sc);
599 dMij(result,2, 2) =
ZZ(sc);
602 #define DELTA_THRESHOLD 10e-7 604 int loopLimit,
int &minIter,
int &maxIter)
606 bool validRange=
true;
619 minIter = (int) (fabs(min - value) /
delta);
621 maxIter = (int) (fabs(max - value) /
delta);
625 else if (value >= max)
635 minIter = (int) (fabs(value - max) / -
delta);
637 maxIter = (int) (fabs(value - min) / -
delta);
647 maxIter = (int) (fabs(max - value) /
delta);
653 maxIter = (int) (fabs(value - min) / -
delta);
672 bool wrap, std::complex<double> outside,
676 if (SplineDegree > 1)
683 outre = outside.real();
684 outim = outside.imag();
707 bool wrap, std::complex<double> outside)
717 bool wrap,
double outside)
719 #define APPLYGEO(type) applyGeometry(SplineDegree,(*(MultidimArray<type>*)(V2.im)), \ 720 (*(MultidimArray<type>*)(V1.im)), A, inv, wrap, (type) outside); 738 int Xdim,
int Ydim,
int Zdim)
740 #define SELFSCALETOSIZE(type) selfScaleToSize(SplineDegree,MULTIDIM_ARRAY_TYPE(V1,type), \ 743 #undef SELFSCALETOSIZE 748 int Xdim,
int Ydim,
int Zdim)
752 #define SCALETOSIZE(type) scaleToSize(SplineDegree,MULTIDIM_ARRAY_TYPE(V2,type), \ 753 MULTIDIM_ARRAY_TYPE(V1,type),Xdim,Ydim,Zdim); 762 int Xdim,
int Ydim,
int Zdim)
764 if (SplineDegree > 1)
777 scaleToSize(SplineDegree, re, aux, Ydim, Xdim, Zdim);
779 scaleToSize(SplineDegree, im, aux, Ydim, Xdim, Zdim);
784 scaleToSize(SplineDegree, V2, V1, Xdim, Ydim, Zdim);
791 int Xdim,
int Ydim,
int Zdim)
794 scaleToSize(SplineDegree, V1, aux, Xdim, Ydim, Zdim);
802 #define SELFPYRAMIDREDUCE(type) selfPyramidReduce(SplineDegree, \ 803 *((MultidimArray<type>*)(V1.im)), levels); 805 #undef SELFPYRAMIDREDUCE 813 #define SELFPYRAMIDEXPAND(type) selfPyramidExpand(SplineDegree, \ 814 *((MultidimArray<type>*)(V1.im)), levels); 816 #undef SELFPYRAMIDEXPAND 826 #define PYRAMIDEXPAND(type) pyramidExpand(SplineDegree,MULTIDIM_ARRAY_TYPE(V2,type),\ 827 MULTIDIM_ARRAY_TYPE(V1,type), levels); 839 #define PYRAMIDREDUCE(type) pyramidReduce(SplineDegree,MULTIDIM_ARRAY_TYPE(V2,type),\ 840 MULTIDIM_ARRAY_TYPE(V1,type), levels); 854 double x,
double y,
double z,
857 int SplineDegree_1 = SplineDegree - 1;
865 int l1 =
CEIL(x - SplineDegree_1);
866 int l2 = l1 + SplineDegree;
868 int m1 =
CEIL(y - SplineDegree_1);
869 int m2 = m1 + SplineDegree;
871 int n1 =
CEIL(z - SplineDegree_1);
872 int n2 = n1 + SplineDegree;
875 int Zdim=(int)
ZSIZE(vol);
876 int Ydim=(int)
YSIZE(vol);
877 int Xdim=(int)
XSIZE(vol);
878 for (
int n = n1;
n <= n2;
n++)
884 equivalent_n=2*Zdim-
n-1;
886 for (
int m = m1;
m <= m2;
m++)
892 equivalent_m=2*Ydim-
m-1;
894 for (
int l = l1; l <= l2; l++)
896 double xminusl = x - (double) l;
901 equivalent_l=2*Xdim-l-1;
905 switch (SplineDegree)
935 double yminusm = y - (double) m;
936 switch (SplineDegree)
966 double zminusn = z - (double) n;
967 switch (SplineDegree)
974 zyxsum += yxsum * aux;
1009 double x,
double y,
double z,
1012 int SplineDegree_1 = SplineDegree - 1;
1020 int l1 =
CEIL(x - SplineDegree_1);
1021 int l2 = l1 + SplineDegree;
1023 int m1 =
CEIL(y - SplineDegree_1);
1024 int m2 = m1 + SplineDegree;
1026 int n1 =
CEIL(z - SplineDegree_1);
1027 int n2 = n1 + SplineDegree;
1029 double zyxsum = 0.0;
1030 int Zdim=(int)
ZSIZE(vol);
1031 int Ydim=(int)
YSIZE(vol);
1032 int Xdim=(int)
XSIZE(vol);
1033 for (
int n = n1;
n <= n2;
n++)
1039 equivalent_n=2*Zdim-
n-1;
1041 for (
int m = m1;
m <= m2;
m++)
1047 equivalent_m=2*Ydim-
m-1;
1049 for (
int l = l1; l <= l2; l++)
1051 double xminusl = x - (double) l;
1056 equivalent_l=2*Xdim-l-1;
1061 switch (SplineDegree)
1068 xsum += Coeff * aux;
1091 double yminusm = y - (double) m;
1092 switch (SplineDegree)
1099 yxsum += xsum * aux;
1122 double zminusn = z - (double) n;
1123 switch (SplineDegree)
1130 zyxsum += yxsum * aux;
1165 double x,
double y,
double z,
1168 int SplineDegree_1 = SplineDegree - 1;
1176 int l1 =
CEIL(x - SplineDegree_1);
1177 int l2 = l1 + SplineDegree;
1179 int m1 =
CEIL(y - SplineDegree_1);
1180 int m2 = m1 + SplineDegree;
1182 int n1 =
CEIL(z - SplineDegree_1);
1183 int n2 = n1 + SplineDegree;
1185 double zyxsum = 0.0;
1186 int Zdim=(int)
ZSIZE(vol);
1187 int Ydim=(int)
YSIZE(vol);
1188 int Xdim=(int)
XSIZE(vol);
1189 for (
int n = n1;
n <= n2;
n++)
1195 equivalent_n=2*Zdim-
n-1;
1197 for (
int m = m1;
m <= m2;
m++)
1203 equivalent_m=2*Ydim-
m-1;
1205 for (
int l = l1; l <= l2; l++)
1207 double xminusl = x - (double) l;
1212 equivalent_l=2*Xdim-l-1;
1217 switch (SplineDegree)
1224 xsum += Coeff * aux;
1247 double yminusm = y - (double) m;
1248 switch (SplineDegree)
1255 yxsum += xsum * aux;
1278 double zminusn = z - (double) n;
1279 switch (SplineDegree)
1286 zyxsum += yxsum * aux;
1335 std::vector<char> symLabel;
1336 symLabel.push_back((
int)icoFrom[1]);
1337 symLabel.push_back((
int)icoTo[1]);
1341 for(
int i=0;
i<2;
i++)
1343 switch (symLabel[
i])
1355 xyz =
vectorR3(0.0, -31.7175, 0.0);
1374 template<
typename T>
1384 double scalex = double(
XSIZE(m)/sizemax);
1385 double scaley = double(
YSIZE(m)/sizemax);
1386 double scalez = double(
ZSIZE(m)/sizemax);
1389 if (center_of_rot.
size() < 3)
1404 distances(0) = (int)
floor(
sqrt(x0 * x0 + y0 * y0 + z0 * z0));
1405 distances(1) = (int)
floor(
sqrt(xf * xf + y0 * y0 + z0 * z0));
1406 distances(2) = (int)
floor(
sqrt(xf * xf + yf * yf + z0 * z0));
1407 distances(3) = (int)
floor(
sqrt(x0 * x0 + yf * yf + z0 * z0));
1408 distances(4) = (int)
floor(
sqrt(x0 * x0 + yf * yf + zf * zf));
1409 distances(5) = (int)
floor(
sqrt(xf * xf + yf * yf + zf * zf));
1410 distances(6) = (int)
floor(
sqrt(xf * xf + y0 * y0 + zf * zf));
1411 distances(7) = (int)
floor(
sqrt(x0 * x0 + y0 * y0 + zf * zf));
1425 ZZ(idx) = scalez * (
k -
ZZ(center_of_rot));
1426 YY(idx) = scaley * (
i -
YY(center_of_rot));
1427 XX(idx) = scalex * (
j -
XX(center_of_rot));
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
Just to locate unclassified errors.
void min(Image< double > &op1, const Image< double > &op2)
double Bspline05(double Argument)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
Case or algorithm not implemented yet.
__host__ __device__ float2 floor(const float2 v)
#define REPORT_ERROR(nerr, ErrormMsg)
Problem with matrix size.
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
void sqrt(Image< double > &op)
Matrix1D< double > vectorR3(double x, double y, double z)
#define MULTIDIM_ARRAY(v)
Matrix2D< T > transpose() const
#define BSPLINE03DIFF1(y, x)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
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 XMIPP_EQUAL_REAL(x, y)
double Bspline04(double Argument)
void resizeNoCopy(int Ydim, int Xdim)
#define A3D_ELEM(V, k, i, j)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
T & getValue(MDLabel label)
void RealImag2Complex(const MultidimArray< double > &real, const MultidimArray< double > &imag, MultidimArray< std::complex< double > > &out)
#define XMIPP_EQUAL_ACCURACY
void resize(size_t Xdim, bool copy=true)
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
double Bspline07(double Argument)
#define DIRECT_MULTIDIM_ELEM(v, n)
double Bspline08(double Argument)
#define M3x3_BY_CT(M2, M1, k)
void mod(const MultidimArray< T > &x, MultidimArray< T > &m, double y)
#define DIRECT_A3D_ELEM(v, k, i, j)
T det3x3() const
determinat of 3x3 matrix
TYPE distance(struct Point_T *p, struct Point_T *q)
void setValue(MDLabel label, const T &d, bool addLabel=true)
double Bspline02(double Argument)
virtual bool containsLabel(MDLabel label) const =0
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
double psi(const double x)
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous)
#define M4x4_BY_CT(M2, M1, k)
#define realWRAP(x, x0, xF)
double Bspline09(double Argument)
Incorrect MultidimArray dimensions.
void initZeros(const MultidimArray< T1 > &op)
double Bspline06(double Argument)
Incorrect value received.
void Complex2RealImag(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &real, MultidimArray< double > &imag)
#define SWITCHDATATYPE(datatype, OP)