37 double &rot,
double &tilt,
double &
psi,
double &
x,
double &
y,
double &
z,
double &score,
43 PyObject *pyMask=Py_None;
51 save.
write(
"PPPI.vol");
53 save.
write(
"PPPIref.vol");
54 std::cout <<
"Imask=" << Imask << std::endl;
55 std::cout <<
"Press any key\n";
56 char c; std::cin >>
c;
60 int bandWidthSphericalHarmonics0=4;
61 int bandWidthSphericalHarmonicsF=64;
62 auto frequencyPixels=(int)(
XSIZE(Iref)*maxFreq);
63 PyObject *arglistfrm = Py_BuildValue(
"OOOO(ii)iiO", pyI, Imask, pyIref, Py_None,
64 bandWidthSphericalHarmonics0, bandWidthSphericalHarmonicsF, frequencyPixels, maxshift, pyMask);
65 PyObject *resultfrm = PyObject_CallObject(pFunc, arglistfrm);
66 Py_DECREF(arglistfrm);
71 if (resultfrm!=
nullptr)
73 PyObject *shift=PyTuple_GetItem(resultfrm,0);
74 PyObject *euler=PyTuple_GetItem(resultfrm,1);
75 score=PyFloat_AsDouble(PyTuple_GetItem(resultfrm,2));
76 double xfrm=PyFloat_AsDouble(PyList_GetItem(shift,0))-
XSIZE(Iref)/2;
77 double yfrm=PyFloat_AsDouble(PyList_GetItem(shift,1))-
YSIZE(Iref)/2;
78 double zfrm=PyFloat_AsDouble(PyList_GetItem(shift,2))-
ZSIZE(Iref)/2;
79 double angz1=PyFloat_AsDouble(PyList_GetItem(euler,0));
80 double angz2=PyFloat_AsDouble(PyList_GetItem(euler,1));
81 double angx=PyFloat_AsDouble(PyList_GetItem(euler,2));
89 MAT_ELEM(E,0,0)=
MAT_ELEM(Efrm, 2, 2);
MAT_ELEM(E,0,1)=
MAT_ELEM(Efrm, 2, 1);
MAT_ELEM(E,0,2)=
MAT_ELEM(Efrm, 2, 0);
90 MAT_ELEM(E,1,0)=
MAT_ELEM(Efrm, 1, 2);
MAT_ELEM(E,1,1)=
MAT_ELEM(Efrm, 1, 1);
MAT_ELEM(E,1,2)=
MAT_ELEM(Efrm, 1, 0);
91 MAT_ELEM(E,2,0)=
MAT_ELEM(Efrm, 0, 2);
MAT_ELEM(E,2,1)=
MAT_ELEM(Efrm, 0, 1);
MAT_ELEM(E,2,2)=
MAT_ELEM(Efrm, 0, 0);
110 std::cout <<
"Result: " << rot <<
" " << tilt <<
" " << psi <<
" " << x <<
" " << y <<
" " << z <<
" -> " << score << std::endl;
115 x=y=z=rot=tilt=psi=score=0;
118 std::cout <<
"No result\n";
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
void inv(Matrix2D< T > &result) const
#define MAT_ELEM(m, i, j)
PyObject * convertToNumpy(const MultidimArray< T > &array)
void alignVolumesFRM(PyObject *pFunc, const MultidimArray< double > &Iref, MultidimArray< double > &I, PyObject *Imask, double &rot, double &tilt, double &psi, double &x, double &y, double &z, double &score, Matrix2D< double > &A, int maxshift, double maxFreq, const MultidimArray< int > *mask)
void Euler_anglesZXZ2matrix(double a, double b, double g, Matrix2D< double > &A, bool homogeneous)
double psi(const double x)
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous)
std::string print_traceback()