Xmipp  v3.23.11-Nereus
Classes | Functions
ctf_estimate_from_micrograph.cpp File Reference
#include "ctf_estimate_from_micrograph.h"
#include "ctf_enhance_psd.h"
#include "core/xmipp_fftw.h"
#include "core/metadata_extension.h"
#include "core/transformations.h"
#include "core/xmipp_threads.h"
#include "core/xmipp_image_generic.h"
#include "data/basic_pca.h"
#include "data/normalize.h"
#include "data/numerical_tools.h"
Include dependency graph for ctf_estimate_from_micrograph.cpp:

Go to the source code of this file.

Classes

class  ThreadFastEstimateEnhancedPSDParams
 

Functions

void threadFastEstimateEnhancedPSD (ThreadArgument &thArg)
 
void fastEstimateEnhancedPSD (const FileName &fnMicrograph, double downsampling, MultidimArray< double > &enhancedPSD, int numberOfThreads)
 

Function Documentation

◆ threadFastEstimateEnhancedPSD()

void threadFastEstimateEnhancedPSD ( ThreadArgument thArg)

Definition at line 867 of file ctf_estimate_from_micrograph.cpp.

868 {
869  auto *args = (ThreadFastEstimateEnhancedPSDParams*) thArg.workClass;
870  int Nthreads = thArg.getNumberOfThreads();
871  int id = thArg.thread_id;
872  ImageGeneric &I = *(args->I);
873  const MultidimArrayGeneric& mI = I();
874  size_t IXdim, IYdim, IZdim;
875  I.getDimensions(IXdim, IYdim, IZdim);
876  MultidimArray<double> &pieceSmoother = *(args->pieceSmoother);
877  MultidimArray<int> &pieceMask = *(args->pieceMask);
878  MultidimArray<double> localPSD, piece;
880  piece.initZeros(pieceMask);
881  localPSD.initZeros(*(args->PSD));
882 
883  FourierTransformer transformer;
884  transformer.setReal(piece);
885 
886  int pieceNumber = 0;
887  int Nprocessed = 0;
888  double pieceDim2 = XSIZE(piece) * XSIZE(piece);
889  for (size_t i = 0; i < (IYdim - YSIZE(piece)); i+=YSIZE(piece))
890  for (size_t j = 0; j < (IXdim - XSIZE(piece)); j+=XSIZE(piece), pieceNumber++)
891  {
892  if ((pieceNumber + 1) % Nthreads != id)
893  continue;
894  Nprocessed++;
895 
896  // Extract micrograph piece ..........................................
897  for (size_t k = 0; k < YSIZE(piece); k++)
898  for (size_t l = 0; l < XSIZE(piece); l++)
899  DIRECT_A2D_ELEM(piece, k, l)= mI(i+k, j+l);
900  piece.statisticsAdjust(0., 1.);
901  normalize_ramp(piece, &pieceMask);
902  piece *= pieceSmoother;
903 
904  // Estimate the power spectrum .......................................
905  transformer.FourierTransform();
906  transformer.getCompleteFourier(Periodogram);
908  {
909  const auto *ptr = (double*) &DIRECT_MULTIDIM_ELEM(Periodogram, n);
910  double re=*ptr;
911  double im=*(ptr+1);
912  double magnitude2=re*re+im*im;
913  DIRECT_MULTIDIM_ELEM(localPSD,n)+=magnitude2*pieceDim2;
914  }
915  }
916 
917  // Gather results
918  args->mutex->lock();
919  args->Nprocessed += Nprocessed;
920  *(args->PSD) += localPSD;
921  args->mutex->unlock();
922 }
#define YSIZE(v)
int getNumberOfThreads()
#define DIRECT_A2D_ELEM(v, i, j)
#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
void setReal(MultidimArray< double > &img)
Definition: xmipp_fftw.cpp:129
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
void getCompleteFourier(T &V)
Definition: xmipp_fftw.h:234
void normalize_ramp(MultidimArray< double > &I, MultidimArray< int > *bg_mask)
Definition: normalize.cpp:333
#define XSIZE(v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void * workClass
The class in which threads will be working.
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define j
int thread_id
The thread id.
void initZeros(const MultidimArray< T1 > &op)
int * n
void statisticsAdjust(U avgF, U stddevF)