Xmipp  v3.23.11-Nereus
Functions
volume_subtraction.cpp File Reference
#include "volume_subtraction.h"
#include "core/transformations.h"
#include <core/histogram.h>
#include <core/xmipp_fftw.h>
#include <core/xmipp_program.h>
#include <data/fourier_filter.h>
Include dependency graph for volume_subtraction.cpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void POCSmask (const MultidimArray< double > &mask, MultidimArray< double > &I)
 
void POCSnonnegative (MultidimArray< double > &I)
 
void POCSFourierAmplitude (const MultidimArray< double > &V1FourierMag, MultidimArray< std::complex< double >> &V2Fourier, double l)
 
void POCSFourierAmplitudeRadAvg (MultidimArray< std::complex< double >> &V, double l, const MultidimArray< double > &rQ, int V1size_x, int V1size_y, int V1size_z)
 
void POCSMinMax (MultidimArray< double > &V, double v1m, double v1M)
 
void POCSFourierPhase (const MultidimArray< std::complex< double >> &phase, MultidimArray< std::complex< double >> &FI)
 
void radialAverage (const MultidimArray< double > &VolFourierMag, const MultidimArray< double > &V, MultidimArray< double > &radial_mean)
 
MultidimArray< double > computeRadQuotient (const MultidimArray< double > &v1Mag, const MultidimArray< double > &vMag, const MultidimArray< double > &V1, const MultidimArray< double > &V)
 
void createFilter (FourierFilter &filter2, double cutFreq)
 
Image< double > subtraction (Image< double > V1, Image< double > &V, const MultidimArray< double > &mask, const FileName &fnVol1F, const FileName &fnVol2A, FourierFilter &filter2, double cutFreq)
 
MultidimArray< double > computeMagnitude (MultidimArray< double > &volume)
 

Function Documentation

◆ computeMagnitude()

MultidimArray<double> computeMagnitude ( MultidimArray< double > &  volume)

Definition at line 308 of file volume_subtraction.cpp.

308  {
309  FourierTransformer transformer;
311  MultidimArray<double> magnitude;
312  transformer.FourierTransform(volume, fourier, false);
313  FFT_magnitude(fourier, magnitude);
314  return magnitude;
315 }
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
Definition: xmipp_fftw.cpp:393

◆ computeRadQuotient()

MultidimArray<double> computeRadQuotient ( const MultidimArray< double > &  v1Mag,
const MultidimArray< double > &  vMag,
const MultidimArray< double > &  V1,
const MultidimArray< double > &  V 
)

Definition at line 259 of file volume_subtraction.cpp.

261  {
262  // Compute the quotient of the radial mean of the volumes to use it in POCS amplitude
263  MultidimArray<double> radial_meanV1;
264  radialAverage(v1Mag, V1, radial_meanV1);
265  MultidimArray<double> radial_meanV;
266  radialAverage(vMag, V, radial_meanV);
267  MultidimArray<double> radQuotient = radial_meanV1 / radial_meanV;
268  FOR_ALL_ELEMENTS_IN_ARRAY1D(radQuotient)
269  {
270  radQuotient(i) = std::min(radQuotient(i), 1.0);
271  if (radQuotient(i) != radQuotient(i)) // Check if it is NaN and change it by 0
272  radQuotient(i) = 0;
273  }
274  return radQuotient;
275 }
void min(Image< double > &op1, const Image< double > &op2)
#define i
void radialAverage(const MultidimArray< double > &VolFourierMag, const MultidimArray< double > &V, MultidimArray< double > &radial_mean)
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)

◆ createFilter()

void createFilter ( FourierFilter filter2,
double  cutFreq 
)

Definition at line 277 of file volume_subtraction.cpp.

277  {
278  filter2.FilterBand = LOWPASS;
279  filter2.FilterShape = RAISED_COSINE;
280  filter2.raised_w = 0.02;
281  filter2.w1 = cutFreq;
282 }
#define RAISED_COSINE
#define LOWPASS

◆ POCSFourierAmplitude()

void POCSFourierAmplitude ( const MultidimArray< double > &  V1FourierMag,
MultidimArray< std::complex< double >> &  V2Fourier,
double  l 
)

Definition at line 138 of file volume_subtraction.cpp.

139  {
141  double mod = std::abs(DIRECT_MULTIDIM_ELEM(V2Fourier, n));
142  if (mod > 1e-10) // Condition to avoid divide by zero, values smaller than
143  // this threshold are considered zero
144  DIRECT_MULTIDIM_ELEM(V2Fourier, n) *=
145  ((1 - l) + l * DIRECT_MULTIDIM_ELEM(V1FourierMag, n)) / mod;
146  }
147 }
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void mod(const MultidimArray< T > &x, MultidimArray< T > &m, double y)
int * n

◆ POCSFourierAmplitudeRadAvg()

void POCSFourierAmplitudeRadAvg ( MultidimArray< std::complex< double >> &  V,
double  l,
const MultidimArray< double > &  rQ,
int  V1size_x,
int  V1size_y,
int  V1size_z 
)

Definition at line 149 of file volume_subtraction.cpp.

150  {
151  int V1size2_x = V1size_x/2;
152  double V1sizei_x = 1.0/V1size_x;
153  int V1size2_y = V1size_y/2;
154  double V1sizei_y = 1.0/V1size_y;
155  int V1size2_z = V1size_z/2;
156  double V1sizei_z = 1.0/V1size_z;
157  double wx;
158  double wy;
159  double wz;
160  for (int k=0; k<ZSIZE(V); ++k)
161  {
162  FFT_IDX2DIGFREQ_FAST(k,V1size_z,V1size2_z,V1sizei_z,wz)
163  double wz2 = wz*wz;
164  for (int i=0; i<YSIZE(V); ++i)
165  {
166  FFT_IDX2DIGFREQ_FAST(i,V1size_y,V1size2_y,V1sizei_y,wy)
167  double wy2_wz2 = wy*wy + wz2;
168  for (int j=0; j<XSIZE(V); ++j)
169  {
170  FFT_IDX2DIGFREQ_FAST(j,V1size_x,V1size2_x,V1sizei_x,wx)
171  double w = sqrt(wx*wx + wy2_wz2);
172  auto iw = std::min((int)floor(w*V1size_x), (int)XSIZE(rQ) -1);
173  DIRECT_A3D_ELEM(V,k,i,j)*=(1-l)+l*DIRECT_MULTIDIM_ELEM(rQ,iw);
174  }
175  }
176  }
177 }
#define YSIZE(v)
void min(Image< double > &op1, const Image< double > &op2)
__host__ __device__ float2 floor(const float2 v)
void sqrt(Image< double > &op)
doublereal * w
#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 FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
#define DIRECT_A3D_ELEM(v, k, i, j)
#define j

◆ POCSFourierPhase()

void POCSFourierPhase ( const MultidimArray< std::complex< double >> &  phase,
MultidimArray< std::complex< double >> &  FI 
)

Definition at line 189 of file volume_subtraction.cpp.

190  {
192  DIRECT_MULTIDIM_ELEM(FI, n) =
194 }
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ POCSmask()

void POCSmask ( const MultidimArray< double > &  mask,
MultidimArray< double > &  I 
)

Definition at line 128 of file volume_subtraction.cpp.

128  {
131 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ POCSMinMax()

void POCSMinMax ( MultidimArray< double > &  V,
double  v1m,
double  v1M 
)

Definition at line 179 of file volume_subtraction.cpp.

179  {
181  double val = DIRECT_MULTIDIM_ELEM(V, n);
182  if (val < v1m)
183  DIRECT_MULTIDIM_ELEM(V, n) = v1m;
184  else if (val > v1M)
185  DIRECT_MULTIDIM_ELEM(V, n) = v1M;
186  }
187 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ POCSnonnegative()

void POCSnonnegative ( MultidimArray< double > &  I)

Definition at line 133 of file volume_subtraction.cpp.

133  {
136 }
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
int * n

◆ radialAverage()

void radialAverage ( const MultidimArray< double > &  VolFourierMag,
const MultidimArray< double > &  V,
MultidimArray< double > &  radial_mean 
)

Definition at line 223 of file volume_subtraction.cpp.

224  {
225  MultidimArray<double> radial_count;
226  int Vsize2_x = int(XSIZE(V))/2;
227  double Vsizei_x = 1.0/int(XSIZE(V));
228  int Vsize2_y = int(YSIZE(V))/2;
229  double Vsizei_y = 1.0/int(YSIZE(V));
230  int Vsize2_z = int(ZSIZE(V))/2;
231  double Vsizei_z = 1.0/int(ZSIZE(V));
232  double wx;
233  double wy;
234  double wz;
235  auto maxrad = int(floor(sqrt(Vsize2_x*Vsize2_x + Vsize2_y*Vsize2_y + Vsize2_z*Vsize2_z)));
236  radial_count.initZeros(maxrad);
237  radial_mean.initZeros(maxrad);
238  for (int k=0; k<Vsize2_z; ++k)
239  {
240  FFT_IDX2DIGFREQ_FAST(k,ZSIZE(V),Vsize2_z,Vsizei_z,wz)
241  double wz2 = wz*wz;
242  for (int i=0; i<Vsize2_y; ++i)
243  {
244  FFT_IDX2DIGFREQ_FAST(i,YSIZE(V),Vsize2_y,Vsizei_y,wy)
245  double wy2_wz2 = wy*wy + wz2;
246  for (int j=0; j<Vsize2_x; ++j)
247  {
248  FFT_IDX2DIGFREQ_FAST(j,XSIZE(V),Vsize2_x,Vsizei_x,wx)
249  double w = sqrt(wx*wx + wy2_wz2);
250  auto iw = (int)round(w*int(XSIZE(V)));
251  DIRECT_A1D_ELEM(radial_mean,iw)+=DIRECT_A3D_ELEM(VolFourierMag,k,i,j);
252  DIRECT_A1D_ELEM(radial_count,iw)+=1.0;
253  }
254  }
255  }
256  radial_mean/= radial_count;
257 }
#define YSIZE(v)
__host__ __device__ float2 floor(const float2 v)
void sqrt(Image< double > &op)
doublereal * w
#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 FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
#define DIRECT_A1D_ELEM(v, i)
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_A3D_ELEM(v, k, i, j)
#define j
int round(double x)
Definition: ap.cpp:7245
void initZeros(const MultidimArray< T1 > &op)

◆ subtraction()

Image<double> subtraction ( Image< double >  V1,
Image< double > &  V,
const MultidimArray< double > &  mask,
const FileName fnVol1F,
const FileName fnVol2A,
FourierFilter filter2,
double  cutFreq 
)

Definition at line 284 of file volume_subtraction.cpp.

286  {
287  Image<double> V1Filtered;
288  V1Filtered() = V1();
289  if (cutFreq != 0){
290  filter2.applyMaskSpace(V1Filtered());
291  }
292  if (!fnVol1F.isEmpty()) {
293  V1Filtered.write(fnVol1F);
294  }
295  if (!fnVol2A.isEmpty()) {
296  V.write(fnVol2A);
297  }
299  DIRECT_MULTIDIM_ELEM(V1(), n) =
300  DIRECT_MULTIDIM_ELEM(V1(), n) * (1 - DIRECT_MULTIDIM_ELEM(mask, n)) +
301  (DIRECT_MULTIDIM_ELEM(V1Filtered(), n) -
302  std::min(DIRECT_MULTIDIM_ELEM(V(), n),
303  DIRECT_MULTIDIM_ELEM(V1Filtered(), n))) *
304  DIRECT_MULTIDIM_ELEM(mask, n);
305  return V1;
306 }
void min(Image< double > &op1, const Image< double > &op2)
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)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
bool isEmpty() const
int * n
void applyMaskSpace(MultidimArray< double > &v)