Xmipp  v3.23.11-Nereus
Classes | Functions
ctf_estimate_from_micrograph (CTF estimation from a micrograph)
Collaboration diagram for ctf_estimate_from_micrograph (CTF estimation from a micrograph):

Classes

class  ProgCTFEstimateFromMicrograph
 

Functions

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

Detailed Description

This program assign different CTFs to the particles in a micrograph

Function Documentation

◆ fastEstimateEnhancedPSD()

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

Fast estimate enhanced PSD. Set downsampling to 2 for halving the image size.

Definition at line 924 of file ctf_estimate_from_micrograph.cpp.

926 {
927  size_t Xdim, Ydim, Zdim, Ndim;
928  getImageSizeFromFilename(fnMicrograph, Xdim, Ydim, Zdim, Ndim);
929  int minSize = 2 * (std::max(Xdim, Ydim) / 10);
930  minSize = (int)std::min((double) std::min(Xdim, Ydim), NEXT_POWER_OF_2(minSize));
931  minSize = std::min(1024, minSize);
932 
933  /*
934  ProgCTFEstimateFromMicrograph prog1;
935  prog1.fn_micrograph=fnMicrograph;
936  prog1.fn_root=fnMicrograph.withoutExtension()+"_tmp";
937  prog1.pieceDim=(int)(minSize*downsampling);
938  prog1.PSDEstimator_mode=ProgCTFEstimateFromMicrograph::Periodogram;
939  prog1.Nsubpiece=1;
940  prog1.psd_mode=ProgCTFEstimateFromMicrograph::OnePerMicrograph;
941  prog1.estimate_ctf=false;
942  prog1.bootstrapN=-1;
943  prog1.verbose=1;
944  prog1.overlap=0;
945  prog1.run();
946  */
947  // Prepare auxiliary variables
948  ImageGeneric I;
949  I.read(fnMicrograph);
950 
952  PSD.initZeros(minSize, minSize);
953 
954  MultidimArray<int> pieceMask;
955  pieceMask.resizeNoCopy(PSD);
956  pieceMask.initConstant(1);
957 
958  MultidimArray<double> pieceSmoother;
960 
961  // Prepare thread arguments
962  Mutex mutex;
964  args.I = &I;
965  args.PSD = &PSD;
966  args.pieceMask = &pieceMask;
967  args.pieceSmoother = &pieceSmoother;
968  args.Nprocessed = 0;
969  args.mutex = &mutex;
970  auto thMgr = std::unique_ptr<ThreadManager>(std::make_unique<ThreadManager>(numberOfThreads, &args));
972  if (args.Nprocessed != 0)
973  *(args.PSD) /= args.Nprocessed;
974 
975  ProgCTFEnhancePSD prog2;
976  prog2.filter_w1 = 0.02;
977  prog2.filter_w2 = 0.2;
978  prog2.decay_width = 0.02;
979  prog2.mask_w1 = 0.005;
980  prog2.mask_w2 = 0.5;
981 
982  prog2.applyFilter(*(args.PSD));
983  enhancedPSD = *(args.PSD);
984 
985  auto downXdim = (int) ((double)XSIZE(enhancedPSD) / downsampling);
986  int firstIndex = FIRST_XMIPP_INDEX(downXdim);
987  int lastIndex = LAST_XMIPP_INDEX(downXdim);
988  enhancedPSD.setXmippOrigin();
989  enhancedPSD.selfWindow(firstIndex, firstIndex, lastIndex, lastIndex);
990 }
void run(ThreadFunction function, void *data=NULL)
Mutex mutex
void selfWindow(int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T init_value=0)
void getImageSizeFromFilename(const FileName &filename, size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim, MDLabel image_label)
void min(Image< double > &op1, const Image< double > &op2)
ThreadManager * thMgr
void resizeNoCopy(const MultidimArray< T1 > &v)
void threadFastEstimateEnhancedPSD(ThreadArgument &thArg)
static void constructPieceSmoother(const MultidimArray< T > &piece, MultidimArray< T > &pieceSmoother)
void initConstant(T val)
#define XSIZE(v)
void max(Image< double > &op1, const Image< double > &op2)
#define NEXT_POWER_OF_2(x)
Definition: xmipp_macros.h:374
double filter_w1
Bandpass filter low frequency (in Fourier space, max 0.5)
#define FIRST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:439
void initZeros(const MultidimArray< T1 > &op)
#define LAST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:448
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false)