Xmipp  v3.23.11-Nereus
Functions
angular_continuous_assign2.cpp File Reference
#include "angular_continuous_assign2.h"
#include "core/transformations.h"
#include "core/xmipp_image_extension.h"
#include "core/xmipp_image_generic.h"
#include "data/mask.h"
Include dependency graph for angular_continuous_assign2.cpp:

Go to the source code of this file.

Functions

double tranformImage (ProgAngularContinuousAssign2 *prm, double rot, double tilt, double psi, double a, double b, const Matrix2D< double > &A, double deltaDefocusU, double deltaDefocusV, double deltaDefocusAngle, int degree)
 
double continuous2cost (double *x, void *_prm)
 

Function Documentation

◆ continuous2cost()

double continuous2cost ( double *  x,
void *  _prm 
)

Definition at line 348 of file angular_continuous_assign2.cpp.

349 {
350  double a=x[1];
351  double b=x[2];
352  double deltax=x[3];
353  double deltay=x[4];
354  double scalex=x[5];
355  double scaley=x[6];
356  double scaleAngle=x[7];
357  double deltaRot=x[8];
358  double deltaTilt=x[9];
359  double deltaPsi=x[10];
360  double deltaDefocusU=x[11];
361  double deltaDefocusV=x[12];
362  double deltaDefocusAngle=x[13];
363  auto *prm=(ProgAngularContinuousAssign2 *)_prm;
364  if (prm->maxShift>0 && deltax*deltax+deltay*deltay>prm->maxShift*prm->maxShift)
365  return 1e38;
366  if (fabs(scalex)>prm->maxScale || fabs(scaley)>prm->maxScale)
367  return 1e38;
368  if (fabs(deltaRot)>prm->maxAngularChange || fabs(deltaTilt)>prm->maxAngularChange || fabs(deltaPsi)>prm->maxAngularChange)
369  return 1e38;
370  if (fabs(a-prm->old_grayA)>prm->maxA)
371  return 1e38;
372  if (fabs(b)>prm->maxB*prm->Istddev)
373  return 1e38;
374  if (fabs(deltaDefocusU)>prm->maxDefocusChange || fabs(deltaDefocusV)>prm->maxDefocusChange)
375  return 1e38;
376 // MAT_ELEM(prm->A,0,0)=1+scalex;
377 // MAT_ELEM(prm->A,1,1)=1+scaley;
378 // In Matlab
379 // syms sx sy t
380 // R=[cos(t) -sin(t); sin(t) cos(t)]
381 // S=[1+sx 0; 0 1+sy]
382 // simple(transpose(R)*S*R)
383 // [ sx - sx*sin(t)^2 + sy*sin(t)^2 + 1, -sin(2*t)*(sx/2 - sy/2)]
384 // [ -sin(2*t)*(sx/2 - sy/2), sy + sx*sin(t)^2 - sy*sin(t)^2 + 1]
385  double sin2_t=sin(scaleAngle)*sin(scaleAngle);
386  double sin_2t=sin(2*scaleAngle);
387  MAT_ELEM(prm->A,0,0)=1+scalex+(scaley-scalex)*sin2_t;
388  MAT_ELEM(prm->A,0,1)=0.5*(scaley-scalex)*sin_2t;
389  MAT_ELEM(prm->A,1,0)=MAT_ELEM(prm->A,0,1);
390  MAT_ELEM(prm->A,1,1)=1+scaley-(scaley-scalex)*sin2_t;
391  MAT_ELEM(prm->A,0,2)=prm->old_shiftX+deltax;
392  MAT_ELEM(prm->A,1,2)=prm->old_shiftY+deltay;
393  return tranformImage(prm,prm->old_rot+deltaRot, prm->old_tilt+deltaTilt, prm->old_psi+deltaPsi,
394  a, b, prm->A, deltaDefocusU, deltaDefocusV, deltaDefocusAngle, xmipp_transformation::LINEAR);
395 }
double tranformImage(ProgAngularContinuousAssign2 *prm, double rot, double tilt, double psi, double a, double b, const Matrix2D< double > &A, double deltaDefocusU, double deltaDefocusV, double deltaDefocusAngle, int degree)
doublereal * x
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
doublereal * b
double maxShift
Maximum shift.
ProgClassifyCL2D * prm
doublereal * a

◆ tranformImage()

double tranformImage ( ProgAngularContinuousAssign2 prm,
double  rot,
double  tilt,
double  psi,
double  a,
double  b,
const Matrix2D< double > &  A,
double  deltaDefocusU,
double  deltaDefocusV,
double  deltaDefocusAngle,
int  degree 
)

Definition at line 251 of file angular_continuous_assign2.cpp.

253 {
254  if (prm->hasCTF)
255  {
256  double defocusU=prm->old_defocusU+deltaDefocusU;
257  double defocusV;
258  if (prm->sameDefocus){
259  defocusV=defocusU;
260  }
261  else
262  defocusV=prm->old_defocusV+deltaDefocusV;
263  double angle=prm->old_defocusAngle+deltaDefocusAngle;
264  if (defocusU!=prm->currentDefocusU || defocusV!=prm->currentDefocusV || angle!=prm->currentAngle)
265  prm->updateCTFImage(defocusU,defocusV,angle);
266  }
267  projectVolume(*(prm->projector), prm->P, (int)XSIZE(prm->I()), (int)XSIZE(prm->I()), rot, tilt, psi, (const MultidimArray<double> *)prm->ctfImage);
268  if (prm->old_flip)
269  {
270  MAT_ELEM(A,0,0)*=-1;
271  MAT_ELEM(A,0,1)*=-1;
272  MAT_ELEM(A,0,2)*=-1;
273  }
274 
275  applyGeometry(degree,prm->Ifilteredp(),prm->Ifiltered(),A,xmipp_transformation::IS_NOT_INV,xmipp_transformation::DONT_WRAP,0.);
276  const MultidimArray<double> &mP=prm->P();
277  const MultidimArray<int> &mMask2D=prm->mask2D;
278  MultidimArray<double> &mIfilteredp=prm->Ifilteredp();
279  MultidimArray<double> &mE=prm->E();
280  mE.initZeros();
281  if (prm->contCost==CONTCOST_L1)
282  {
284  {
285  if (DIRECT_MULTIDIM_ELEM(mMask2D,n))
286  {
287  DIRECT_MULTIDIM_ELEM(mIfilteredp,n)=DIRECT_MULTIDIM_ELEM(mIfilteredp,n);
288  double val=(a*DIRECT_MULTIDIM_ELEM(mP,n)+b)-DIRECT_MULTIDIM_ELEM(mIfilteredp,n);
289  DIRECT_MULTIDIM_ELEM(mE,n)=val;
290  }
291  else
292  DIRECT_MULTIDIM_ELEM(mIfilteredp,n)=0;
293  }
294  }
295  else
296  {
298  {
299  if (DIRECT_MULTIDIM_ELEM(mMask2D,n))
300  {
301  double val=DIRECT_MULTIDIM_ELEM(mP,n)-DIRECT_MULTIDIM_ELEM(mIfilteredp,n);
302  DIRECT_MULTIDIM_ELEM(mE,n)=val;
303  }
304  else
305  DIRECT_MULTIDIM_ELEM(mIfilteredp,n)=0;
306  }
307  }
308 
309  double cost=0.0;
310  if (prm->contCost==CONTCOST_L1)
311  {
313  cost+=fabs(DIRECT_A2D_ELEM(mE,i,j));
314  cost*=prm->iMask2Dsum;
315  }
316  else
317  cost=-correlationIndex(mIfilteredp,mP,&mMask2D);
318 
319  //covarianceMatrix(mE, prm->C);
320  //double div=computeCovarianceMatrixDivergence(prm->C0,prm->C)/MAT_XSIZE(prm->C);
321 #ifdef DEBUG
322  std::cout << "A=" << A << std::endl;
323  Image<double> save;
324  save()=a*prm->P()+b;
325  save.write("PPPtheo.xmp");
326  save()=prm->Ifilteredp();
327  save.write("PPPfilteredp.xmp");
328  save()=prm->Ifiltered();
329  save.write("PPPfiltered.xmp");
330  save()=prm->E();
331  save.write("PPPe.xmp");
332  //save()=prm->C;
333  //save.write("PPPc.xmp");
334  //save()=prm->C0;
335  //save.write("PPPc0.xmp");
336  //std::cout << "Cost=" << cost << " Div=" << div << " avg=" << avg << std::endl;
337  std::cout << "Cost=" << cost << std::endl;
338  std::cout << "Press any key" << std::endl;
339  char c; std::cin >> c;
340 #endif
341  //return div+prm->penalization*fabs(avg);
342  //return cost+prm->penalization*fabs(avg);
343  //return div;
344  return cost;
345 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m)
doublereal * c
void applyGeometry(int SplineDegree, MultidimArray< std::complex< double > > &V2, const MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside, MultidimArray< double > *BcoeffsPtr)
#define DIRECT_A2D_ELEM(v, i, j)
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)
double correlationIndex(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=NULL, MultidimArray< double > *Contributions=NULL)
constexpr int CONTCOST_L1
#define i
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
doublereal * b
#define XSIZE(v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void projectVolume(FourierProjector &projector, Projection &P, int Ydim, int Xdim, double rot, double tilt, double psi, const MultidimArray< double > *ctf)
#define j
double psi(const double x)
void initZeros(const MultidimArray< T1 > &op)
int * n
doublereal * a
void updateCTFImage(double defocusU, double defocusV, double angle)