Xmipp  v3.23.11-Nereus
Classes | Macros | Functions
ml_tomo.h File Reference
#include <core/xmipp_fftw.h>
#include <core/xmipp_fft.h>
#include <core/args.h>
#include <core/xmipp_funcs.h>
#include <core/metadata_extension.h>
#include <core/xmipp_image.h>
#include <core/geometry.h>
#include <data/filters.h>
#include <data/mask.h>
#include <data/ctf.h>
#include <data/sampling.h>
#include <core/symmetries.h>
#include "symmetrize.h"
#include <core/xmipp_threads.h>
#include <vector>
#include <core/xmipp_program.h>
Include dependency graph for ml_tomo.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  structThreadExpectationSingleImage
 
class  ProgMLTomo
 
struct  ProgMLTomo::MissingInfo
 
struct  ProgMLTomo::AnglesInfo
 

Macros

#define SIGNIFICANT_WEIGHT_LOW   1e-8
 
#define SMALLANGLE   2.75
 
#define MLTOMO_DATALINELENGTH   10
 
#define MLTOMO_BLOCKSIZE   10
 
#define FN_ITER_VOL(iter, base, refno)   formatString("%s_it%d_%s%d.vol", fn_root.c_str(), iter, base, refno+1)
 
#define FN_ITER_MD(iter)   formatString("%s_it%d.sel", fn_root.c_str(), iter)
 

Functions

void * threadMLTomoExpectationSingleImage (void *data)
 

Macro Definition Documentation

◆ FN_ITER_MD

#define FN_ITER_MD (   iter)    formatString("%s_it%d.sel", fn_root.c_str(), iter)

Definition at line 53 of file ml_tomo.h.

◆ FN_ITER_VOL

#define FN_ITER_VOL (   iter,
  base,
  refno 
)    formatString("%s_it%d_%s%d.vol", fn_root.c_str(), iter, base, refno+1)

Definition at line 52 of file ml_tomo.h.

◆ MLTOMO_BLOCKSIZE

#define MLTOMO_BLOCKSIZE   10

Definition at line 50 of file ml_tomo.h.

◆ MLTOMO_DATALINELENGTH

#define MLTOMO_DATALINELENGTH   10

Definition at line 49 of file ml_tomo.h.

◆ SIGNIFICANT_WEIGHT_LOW

#define SIGNIFICANT_WEIGHT_LOW   1e-8

Definition at line 46 of file ml_tomo.h.

◆ SMALLANGLE

#define SMALLANGLE   2.75

Definition at line 48 of file ml_tomo.h.

Function Documentation

◆ threadMLTomoExpectationSingleImage()

void* threadMLTomoExpectationSingleImage ( void *  data)

Definition at line 2702 of file ml_tomo.cpp.

2703 {
2704  auto * thread_data =
2706 
2707  // Variables from above
2708  int thread_id = thread_data->thread_id;
2709  ProgMLTomo *prm = thread_data->prm;
2710  MetaDataVec *MDimg = thread_data->MDimg;
2711  double *wsum_sigma_noise = thread_data->wsum_sigma_noise;
2712  double *wsum_sigma_offset = thread_data->wsum_sigma_offset;
2713  double *sumfracweight = thread_data->sumfracweight;
2714  double *LL = thread_data->LL;
2715  std::vector<MultidimArray<double> > *wsumimgs = thread_data->wsumimgs;
2716  std::vector<MultidimArray<double> > *wsumweds = thread_data->wsumweds;
2717  std::vector<Image<double> > *Iref = thread_data->Iref;
2718 
2719  MultidimArray<double> *sumw = thread_data->sumw;
2720  std::vector<size_t> * imgs_id = thread_data->imgs_id;
2721  ThreadTaskDistributor * distributor = thread_data->distributor;
2722 
2723  //#define DEBUG_THREAD
2724 #ifdef DEBUG_THREAD
2725 
2726  std::cerr<<"start threadMLTomoExpectationSingleImage"<<std::endl;
2727 #endif
2728 
2729  // Local variables
2730  Image<double> img;
2731  FileName fn_img, fn_trans;
2732  std::vector<MultidimArray<double> > allref_offsets;
2733  Matrix1D<double> opt_offsets(3);
2734  float old_psi = -999.;
2735  double fracweight, trymindiff, dLL;
2736  int opt_refno, opt_angno, missno;
2737 
2738  //try
2739  {
2740  //Approximate number of images
2741  size_t myNum = MDimg->size() / prm->threads;
2742  //First and last image to process in each block
2743  size_t firstIndex, lastIndex;
2744 
2745  if (prm->verbose && thread_id == 0)
2746  init_progress_bar(myNum);
2747 
2748  // Loop over all images
2749  size_t cc = 0;
2750  MultidimArray<double> &docfiledata = prm->docfiledata;
2751 
2752  //Work while there are tasks to do
2753  while (distributor->getTasks(firstIndex, lastIndex))
2754  {
2755  for (size_t imgno = firstIndex; imgno <= lastIndex; ++imgno)
2756  {
2757  //TODO: Check if really needed the mutexes
2758  //only for read from MetaData
2759  pthread_mutex_lock(&mltomo_selfile_access_mutex);
2760 
2761  MDimg->getValue(MDL_IMAGE, fn_img, (*imgs_id)[imgno + prm->myFirstImg]);
2762 
2763  pthread_mutex_unlock(&mltomo_selfile_access_mutex);
2764 
2765  img.read(fn_img);
2766  img().setXmippOrigin();
2767 
2768  if (prm->dont_align || prm->do_only_average)
2769  {
2770  selfTranslate(xmipp_transformation::LINEAR, img(), prm->imgs_optoffsets[imgno], xmipp_transformation::DONT_WRAP);
2771  }
2772  prm->reScaleVolume(img(), true);
2773  missno = (prm->do_missing) ? prm->imgs_missno[imgno] : -1;
2774  // These three parameters speed up expectationSingleImage
2775  trymindiff = prm->imgs_trymindiff[imgno];
2776  opt_refno = prm->imgs_optrefno[imgno];
2777  opt_angno = prm->imgs_optangno[imgno];
2778  old_psi = prm->imgs_optpsi[imgno];
2779 
2780  if (prm->do_ml)
2781  {
2782  // A. Use maximum likelihood approach
2783  prm->expectationSingleImage(img(), imgno, missno, old_psi, *Iref,
2784  *wsumimgs, *wsumweds, *wsum_sigma_noise, *wsum_sigma_offset,
2785  *sumw, *LL, dLL, fracweight, *sumfracweight, trymindiff,
2786  opt_refno, opt_angno, opt_offsets);
2787  }
2788  else
2789  {
2790  // B. Use constrained correlation coefficient approach
2791  prm->maxConstrainedCorrSingleImage(img(), imgno, missno, old_psi,
2792  *Iref, *wsumimgs, *wsumweds, *sumw, fracweight, *sumfracweight,
2793  opt_refno, opt_angno, opt_offsets);
2794  }
2795  // Store for next iteration
2796  prm->imgs_trymindiff[imgno] = trymindiff;
2797  prm->imgs_optrefno[imgno] = opt_refno;
2798  prm->imgs_optangno[imgno] = opt_angno;
2799  // Output MetaData
2800  //FIXME: THIS ALSO LIKE JoseMiguel did ML2D
2801  dAij(docfiledata, imgno, 0) = (prm->all_angle_info[opt_angno]).rot; // rot
2802  dAij(docfiledata, imgno, 1) = (prm->all_angle_info[opt_angno]).tilt; // tilt
2803  dAij(docfiledata, imgno, 2) = (prm->all_angle_info[opt_angno]).psi; // psi
2804  if (prm->dont_align || prm->do_only_average)
2805  {
2806  dAij(docfiledata, imgno, 3) = prm->imgs_optoffsets[imgno](0); // Xoff
2807  dAij(docfiledata, imgno, 4) = prm->imgs_optoffsets[imgno](1); // Yoff
2808  dAij(docfiledata, imgno, 5) = prm->imgs_optoffsets[imgno](2); // zoff
2809  }
2810  else
2811  {
2812  dAij(docfiledata, imgno, 3) = opt_offsets(0) / prm->scale_factor; // Xoff
2813  dAij(docfiledata, imgno, 4) = opt_offsets(1) / prm->scale_factor; // Yoff
2814  dAij(docfiledata, imgno, 5) = opt_offsets(2) / prm->scale_factor; // Zoff
2815  }
2816  dAij(docfiledata, imgno, 6) = (double) (opt_refno + 1); // Ref
2817  dAij(docfiledata, imgno, 7) = (double) (missno + 1); // Wedge number
2818 
2819  dAij(docfiledata, imgno, 8) = fracweight; // P_max/P_tot
2820  dAij(docfiledata, imgno, 9) = dLL; // log-likelihood
2821 
2822  if (prm->verbose && thread_id == 0)
2823  progress_bar(cc);
2824  cc++;
2825  }
2826  }
2827  if (prm->verbose && thread_id == 0)
2828  progress_bar(myNum);
2829  }
2830 
2831 #ifdef DEBUG_THREAD
2832 
2833  std::cerr<<"finished threadMLTomoExpectationSingleImage"<<std::endl;
2834 #endif
2835  return nullptr;
2836 }
void init_progress_bar(long total)
bool do_missing
Internally store all missing wedges or re-compute on the fly?
Definition: ml_tomo.h:165
std::vector< int > imgs_optrefno
Definition: ml_tomo.h:142
bool dont_align
Definition: ml_tomo.h:178
#define dAij(M, i, j)
bool do_only_average
Definition: ml_tomo.h:189
bool getTasks(size_t &first, size_t &last)
void reScaleVolume(MultidimArray< double > &Min, bool down_scale=true)
Definition: ml_tomo.cpp:1750
MultidimArray< double > docfiledata
Definition: ml_tomo.h:123
void expectationSingleImage(MultidimArray< double > &Mimg, int imgno, const int missno, double old_rot, std::vector< Image< double > > &Iref, std::vector< MultidimArray< double > > &wsumimgs, std::vector< MultidimArray< double > > &wsumweds, double &wsum_sigma_noise, double &wsum_sigma_offset, MultidimArray< double > &sumw, double &LL, double &dLL, double &fracweight, double &sumfracweight, double &trymindiff, int &opt_refno, int &opt_angno, Matrix1D< double > &opt_offsets)
ML-integration over all hidden parameters.
Definition: ml_tomo.cpp:1990
ParallelTaskDistributor * distributor
std::vector< Matrix1D< double > > imgs_optoffsets
Definition: ml_tomo.h:144
std::vector< int > imgs_missno
Definition: ml_tomo.h:146
size_t size() const override
void maxConstrainedCorrSingleImage(MultidimArray< double > &Mimg, int imgno, int missno, double old_rot, std::vector< Image< double > > &Iref, std::vector< MultidimArray< double > > &wsumimgs, std::vector< MultidimArray< double > > &wsumweds, MultidimArray< double > &sumw, double &maxCC, double &sumCC, int &opt_refno, int &opt_angno, Matrix1D< double > &opt_offsets)
Maximum constrained correlation search over all hidden parameters.
Definition: ml_tomo.cpp:2424
pthread_mutex_t mltomo_selfile_access_mutex
Definition: ml_tomo.cpp:33
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
std::vector< double > imgs_optpsi
Definition: ml_tomo.h:143
void selfTranslate(int SplineDegree, MultidimArray< T > &V1, const Matrix1D< double > &v, bool wrap=xmipp_transformation::WRAP, T outside=0)
size_t myFirstImg
Definition: ml_tomo.h:121
double scale_factor
Definition: ml_tomo.h:173
void progress_bar(long rlen)
int threads
Definition: ml_tomo.h:243
int verbose
Verbosity level.
bool do_ml
Definition: ml_tomo.h:169
std::vector< double > imgs_trymindiff
Definition: ml_tomo.h:143
bool getValue(MDObject &mdValueOut, size_t id) const override
double psi(const double x)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
AnglesInfoVector all_angle_info
Definition: ml_tomo.h:222
std::vector< int > imgs_optangno
Definition: ml_tomo.h:142
ProgClassifyCL2D * prm
Name of an image (std::string)