Xmipp  v3.23.11-Nereus
Classes | Functions
tomo_detect_missing_wedge.cpp File Reference
#include "tomo_detect_missing_wedge.h"
#include "core/geometry.h"
#include "core/matrix2d.h"
#include "core/xmipp_fftw.h"
#include "data/numerical_tools.h"
Include dependency graph for tomo_detect_missing_wedge.cpp:

Go to the source code of this file.

Classes

class  WedgeSolver
 

Functions

double evaluatePlane (double rot, double tilt, const MultidimArray< double > *V, const MultidimArray< double > *Vmag, double maxFreq, double planeWidth, int direction, MultidimArray< double > *Vdraw=nullptr, bool setPos=false, double rotPos=0, double tiltPos=0)
 
double wrapperFitnessDetectMissingWedge (double *p, void *extraArgs)
 
void lookForPlane (const MultidimArray< double > *V, const MultidimArray< double > *Vmag, double maxFreq, double planeWidth, int direction, double &rot, double &tilt, bool setPos=false, double rotPos=0, double tiltPos=0)
 
void drawWedge (double rotPos, double tiltPos, double rotNeg, double tiltNeg, const MultidimArray< double > *V, const MultidimArray< double > *Vmag, MultidimArray< double > *Vdraw)
 

Function Documentation

◆ drawWedge()

void drawWedge ( double  rotPos,
double  tiltPos,
double  rotNeg,
double  tiltNeg,
const MultidimArray< double > *  V,
const MultidimArray< double > *  Vmag,
MultidimArray< double > *  Vdraw 
)

Definition at line 245 of file tomo_detect_missing_wedge.cpp.

248 {
249  Matrix2D<double> Epos, Eneg;
250  Euler_angles2matrix(rotPos,tiltPos,0.,Epos);
251  Euler_angles2matrix(rotNeg,tiltNeg,0.,Eneg);
252 
253  Matrix1D<double> freq(3), freqPos, freqNeg;
254  Matrix1D<int> idx(3);
255  Vdraw->initZeros(*Vmag);
257  {
258  // Frequency in the coordinate system of the volume
259  VECTOR_R3(idx,j,i,k);
260  FFT_idx2digfreq(*V,idx,freq);
261 
262  // Frequency in the coordinate system of the plane
263  freqPos=Epos*freq;
264  freqNeg=Eneg*freq;
265  if (ZZ(freqPos)<0 || ZZ(freqNeg)>0)
266  (*Vdraw)(k,i,j)+=1;
267  }
268 }
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
Definition: geometry.cpp:624
void FFT_idx2digfreq(T &v, const Matrix1D< int > &idx, Matrix1D< double > &freq)
Definition: xmipp_fft.h:80
#define i
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 FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
#define j
#define VECTOR_R3(v, x, y, z)
Definition: matrix1d.h:124
void initZeros(const MultidimArray< T1 > &op)
#define ZZ(v)
Definition: matrix1d.h:101

◆ evaluatePlane()

double evaluatePlane ( double  rot,
double  tilt,
const MultidimArray< double > *  V,
const MultidimArray< double > *  Vmag,
double  maxFreq,
double  planeWidth,
int  direction,
MultidimArray< double > *  Vdraw = nullptr,
bool  setPos = false,
double  rotPos = 0,
double  tiltPos = 0 
)

Definition at line 33 of file tomo_detect_missing_wedge.cpp.

38 {
39  if (rot<0 || rot>360 || tilt<-90 || tilt>90)
40  return 0;
41 
42  Matrix2D<double> E, Einv;
43  Euler_angles2matrix(rot,tilt,0.,E);
44  Einv=E.transpose();
45 
46  if (setPos)
47  {
48  Matrix2D<double> Epos;
49  Euler_angles2matrix(rotPos,tiltPos,0.,Epos);
50  double angle=acos(E(2,0)*Epos(2,0)+E(2,1)*Epos(2,1)+E(2,2)*Epos(2,2));
51  angle=RAD2DEG(angle);
52  if (fabs(angle)<20 || fabs(180-angle)<20)
53  return 0;
54  }
55 
56  size_t N=XMIPP_MAX(XSIZE(*Vmag),YSIZE(*Vmag)/2);
57  N=XMIPP_MAX(N,ZSIZE(*Vmag)/2);
58  double df=0.5/N;
59  Matrix1D<double> freq(3), freqp(3);
60  Matrix1D<int> idx(3);
61  double sumNeg=0, sumPos=0;
62  int Nneg=0, Npos=0;
63  double maxFreq2=maxFreq*maxFreq;
64  auto iPlaneWidth=(int)ceil(planeWidth);
65  for (int ix=0; ix<=N; ix++)
66  {
67  XX(freq)=ix*df;
68  double fx2=XX(freq)*XX(freq);
69  if (fx2>maxFreq2)
70  continue;
71  for (int iy=-(int)N; iy<=N; iy++)
72  {
73  YY(freq)=iy*df;
74  double fx2fy2=fx2+YY(freq)*YY(freq);
75  if (fx2fy2>maxFreq2)
76  continue;
77  for (int iz=-iPlaneWidth; iz<=iPlaneWidth; iz++)
78  {
79  if (iz==0 || ix==0 || iy==0)
80  continue;
81 
82  // Frequency in the coordinate system of the plane
83  ZZ(freq)=iz*df;
84 
85  // Frequency in the coordinate system of the volume
87  M3x3_BY_V3x1(freqp,Einv,freq);
88  bool inverted=false;
89  if (XX(freqp)<0)
90  {
91  XX(freqp)=-XX(freqp);
92  YY(freqp)=-YY(freqp);
93  ZZ(freqp)=-ZZ(freqp);
94  inverted=true;
95  }
96 
97  // Get the corresponding index
98  DIGFREQ2FFT_IDX(ZZ(freqp), ZSIZE(*V), ZZ(idx));
99  DIGFREQ2FFT_IDX(YY(freqp), YSIZE(*V), YY(idx));
100  DIGFREQ2FFT_IDX(XX(freqp), XSIZE(*V), XX(idx));
101  if (XX(idx) < STARTINGX(*Vmag) || XX(idx) > FINISHINGX(*Vmag) ||
102  YY(idx) < STARTINGY(*Vmag) || YY(idx) > FINISHINGY(*Vmag) ||
103  ZZ(idx) < STARTINGZ(*Vmag) || ZZ(idx) > FINISHINGZ(*Vmag))
104  continue;
105 
106  // Make the corresponding sums
107  bool negativeSum;
108  if (direction==1)
109  negativeSum=iz<0;
110  else
111  negativeSum=iz>0;
112  double val=A3D_ELEM(*Vmag,ZZ(idx),YY(idx),XX(idx));
113  if ((negativeSum && !inverted) || (!negativeSum && inverted)) // XOR
114  {
115  sumNeg+=val;
116  Nneg++;
117  if (Vdraw!=nullptr)
118  (*Vdraw)(idx)=2*direction*val;
119  }
120  else
121  {
122  sumPos+=val;
123  Npos++;
124  if (Vdraw!=nullptr)
125  (*Vdraw)(idx)=1.0/2.0*direction*val;
126  }
127  }
128  }
129  }
130  if (fabs(Nneg-Npos)/(0.5*(Nneg+Npos))>0.5)
131  // If there is a difference of more than 50%
132  return 1e38;
133  if (Nneg!=0)
134  sumNeg/=Nneg;
135  else
136  return 1e38;
137  if (Npos!=0)
138  sumPos/=Npos;
139  else
140  return 1e38;
141 
142  return -(sumPos-sumNeg);
143 }
#define YSIZE(v)
#define XMIPP_MAX(x, y)
Definition: xmipp_macros.h:193
#define FINISHINGX(v)
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
Definition: geometry.cpp:624
Matrix2D< T > transpose() const
Definition: matrix2d.cpp:1314
#define FINISHINGZ(v)
#define DIGFREQ2FFT_IDX(freq, size, idx)
Definition: xmipp_fft.h:61
#define STARTINGX(v)
#define STARTINGY(v)
#define A3D_ELEM(V, k, i, j)
#define XX(v)
Definition: matrix1d.h:85
#define XSIZE(v)
#define ZSIZE(v)
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
#define M3x3_BY_V3x1(a, M, b)
Definition: matrix2d.h:170
#define YY(v)
Definition: matrix1d.h:93
#define FINISHINGY(v)
#define RAD2DEG(r)
Definition: xmipp_macros.h:320
#define STARTINGZ(v)
#define ZZ(v)
Definition: matrix1d.h:101
#define SPEED_UP_temps012
Definition: xmipp_macros.h:403

◆ lookForPlane()

void lookForPlane ( const MultidimArray< double > *  V,
const MultidimArray< double > *  Vmag,
double  maxFreq,
double  planeWidth,
int  direction,
double &  rot,
double &  tilt,
bool  setPos = false,
double  rotPos = 0,
double  tiltPos = 0 
)

Definition at line 202 of file tomo_detect_missing_wedge.cpp.

206 {
207  // Optimize with DE
208  int length=2;
209  int Npop=50;
210 
211  double min_allowed[] = {0,-90};
212  double max_allowed[] = {360,90};
213 
214  auto * solver = new WedgeSolver(length,length*Npop,V,Vmag,maxFreq,planeWidth,direction);
215  solver->Setup( min_allowed, max_allowed, stBest2Bin, 0.5, 0.8);
216 
217  if (setPos)
218  {
219  solver->setPos=true;
220  solver->rotPos=rotPos;
221  solver->tiltPos=tiltPos;
222  }
223 
224  solver->Solve(50);
225 
226  double * bestSolution = solver->Solution();
227 
228  // Refine with Powell
229  Matrix1D<double> x(2), steps(2);
230  double fitness;
231  int iter;
232  steps.initConstant(1);
233  x(0)=bestSolution[0];
234  x(1)=bestSolution[1];
235  powellOptimizer(x,1,2,&wrapperFitnessDetectMissingWedge,solver,0.01,fitness,iter,steps,true);
236  rot=x(0);
237  tilt=x(1);
238 
239  delete solver;
240 
241  solver = nullptr;
242 }
void powellOptimizer(Matrix1D< double > &p, int i0, int n, double(*f)(double *x, void *), void *prm, double ftol, double &fret, int &iter, const Matrix1D< double > &steps, bool show)
glob_prnt iter
doublereal * x
constexpr int stBest2Bin
__host__ __device__ float length(float2 v)
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
double wrapperFitnessDetectMissingWedge(double *p, void *extraArgs)
double steps
double fitness(double *p)

◆ wrapperFitnessDetectMissingWedge()

double wrapperFitnessDetectMissingWedge ( double *  p,
void *  extraArgs 
)

Definition at line 195 of file tomo_detect_missing_wedge.cpp.

196 {
197  bool dummy;
198  auto *wegde_solver=(WedgeSolver *) extraArgs;
199  return wegde_solver->EnergyFunction(p+1,dummy);
200 }
double dummy