Xmipp  v3.23.11-Nereus
ml_tomo.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: Sjors Scheres scheres@cnb.csic.es (2004)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #ifndef _MLTOMO_H
27 #define _MLTOMO_H
28 
29 #include <core/xmipp_fftw.h>
30 #include <core/xmipp_fft.h>
31 #include <core/args.h>
32 #include <core/xmipp_funcs.h>
34 #include <core/xmipp_image.h>
35 #include <core/geometry.h>
36 #include <data/filters.h>
37 #include <data/mask.h>
38 #include <data/ctf.h>
39 #include <data/sampling.h>
40 #include <core/symmetries.h>
41 #include "symmetrize.h"
42 #include <core/xmipp_threads.h>
43 #include <vector>
44 #include <core/xmipp_program.h>
45 
46 #define SIGNIFICANT_WEIGHT_LOW 1e-8
47 #undef SMALLANGLE
48 #define SMALLANGLE 2.75
49 #define MLTOMO_DATALINELENGTH 10
50 #define MLTOMO_BLOCKSIZE 10
51 
52 #define FN_ITER_VOL(iter, base, refno) formatString("%s_it%d_%s%d.vol", fn_root.c_str(), iter, base, refno+1)
53 #define FN_ITER_MD(iter) formatString("%s_it%d.sel", fn_root.c_str(), iter)
54 
55 class ProgMLTomo;
56 
57 // Thread declaration
58 void * threadMLTomoExpectationSingleImage( void * data );
59 
60 // This structure is needed to pass parameters to threadMLTomoExpectationSingleImage
61 typedef struct
62 {
63  int thread_id;
67  int *iter;
70  double *sumfracweight;
71  double *LL;
72  std::vector<MultidimArray<double> > *wsumimgs;
73  std::vector<MultidimArray<double> > *wsumweds;
74  std::vector<Image<double> > *Iref;
75  std::vector<MultidimArray<double> > *docfiledata;
77  std::vector<size_t> * imgs_id;
79 }
81 
86 class ProgMLTomo: public XmippProgram
87 {
88 public:
92  std::string cline;
94  double sigma_noise;
96  double sigma_offset;
106  int istart;
108  int Niter, Niter2;
110  int oridim, dim, dim3, hdim;
111  double ddim3;
113  int nr_ref;
125  std::vector<double> A2, corrA2;
127  double eps;
133  std::vector < Image<double> > Iref, Iold, Iwed;
139  std::vector <size_t> convert_refno_to_stack_position;
140 
142  std::vector<int> imgs_optrefno, imgs_optangno;
143  std::vector<double> imgs_trymindiff, imgs_optpsi;
144  std::vector<Matrix1D<double> > imgs_optoffsets;
146  std::vector<int> imgs_missno;
150  double ang_search;
154  double limit_trans;
160  bool do_sym;
161 
163 
165  bool do_missing;//, do_wedge, do_pyramid, do_cone;
167  bool do_impute;
169  bool do_ml;
176 
181 
183  bool do_mask;
190 
191  // Missing data information
193  struct MissingInfo
194  {
196  double thy0, thyF, thx0, thxF;
197  double tg0_y, tgF_y, tg0_x, tgF_x;
199  double nr_pixels;
200  };
202  int nr_miss;
204  std::vector<MissingInfo> all_missing_info;
205 
206  // Angular sampling information
207  struct AnglesInfo
208  {
209  size_t direction;
210  double rot, rot_ori;
211  double tilt, tilt_ori;
212  double psi, psi_ori;
214  };
215  typedef std::vector<AnglesInfo> AnglesInfoVector;
216 
218 
222  AnglesInfoVector all_angle_info;
224  int nr_ang;
226  double pixel_size;
227 
231 
234 
235  // sampling object
237  // For user-provided tilt range
239  // Symmetry setup
241 
243  int threads;
244 
247 
249  std::vector<size_t> imgs_id;
250 
251 public:
253  void defineParams();
254 
256  void readParams();
257 
259  void run();
260 
262  void show();
263 
265  virtual void produceSideInfo();
266 
268  virtual void generateInitialReferences();
269 
271  virtual void setNumberOfLocalImages();
272 
275  virtual void produceSideInfo2(int nr_vols = 1);
276 
278  void perturbAngularSampling();
279 
282 
287  void readMissingInfo();
288 
291  const Matrix2D<double> &A,
292  const int missno);
293 
295 
296  // Resize a volume, based on the max_resol
297  // if down_scale=true: go from oridim to dim
298  // if down_scale=false: go from dim to oridim
299  void reScaleVolume(MultidimArray<double> &Min, bool down_scale=true);
300 
301  void postProcessVolume(Image<double> &Vin, double resolution = -1.);
302 
304  void precalculateA2(std::vector< Image<double> > &Iref);
305 
307  void expectationSingleImage(MultidimArray<double> &Mimg, int imgno, const int missno, double old_rot,
308  std::vector<Image<double> > &Iref,
309  std::vector<MultidimArray<double> > &wsumimgs,
310  std::vector<MultidimArray<double> > &wsumweds,
311  double &wsum_sigma_noise, double &wsum_sigma_offset,
312  MultidimArray<double> &sumw, double &LL, double &dLL,
313  double &fracweight, double &sumfracweight, double &trymindiff,
314  int &opt_refno, int &opt_angno, Matrix1D<double> &opt_offsets);
315 
317  void maxConstrainedCorrSingleImage(MultidimArray<double> &Mimg, int imgno, int missno, double old_rot,
318  std::vector<Image<double> > &Iref,
319  std::vector<MultidimArray<double> > &wsumimgs,
320  std::vector<MultidimArray<double> > &wsumweds,
321  MultidimArray<double> &sumw, double &maxCC, double &sumCC,
322  int &opt_refno, int &opt_angno, Matrix1D<double> &opt_offsets);
323 
325  virtual void expectation(MetaDataVec &MDimg, std::vector< Image<double> > &Iref, int iter,
326  double &LL, double &sumfracweight,
327  std::vector<MultidimArray<double> > &wsumimgs,
328  std::vector<MultidimArray<double> > &wsumweds,
329  double &wsum_sigma_noise, double &wsum_sigma_offset,
330  MultidimArray<double> &sumw);
331 
333  void maximization(std::vector<MultidimArray<double> > &wsumimgs,
334  std::vector<MultidimArray<double> > &wsumweds,
335  double &wsum_sigma_noise, double &wsum_sigma_offset,
336  MultidimArray<double> &sumw, double &sumfracweight,
337  double &sumw_allrefs, std::vector<MultidimArray<double> > &fsc, int iter);
338 
343  double &resolution);
344 
346  void regularize(int iter);
347 
349  bool checkConvergence(std::vector<double> &conv);
350 
352  virtual void addPartialDocfileData(const MultidimArray<double> &data, size_t first, size_t last);
353 
355  virtual void writeOutputFiles(const int iter,
356  std::vector<MultidimArray<double> > &wsumweds,
357  double &sumw_allrefs, double &LL, double &avefracweight,
358  std::vector<double> &conv, std::vector<MultidimArray<double> > &fsc);
359 
360 };
362 #endif
int nr_ref
Definition: ml_tomo.h:113
std::vector< MultidimArray< double > > * docfiledata
Definition: ml_tomo.h:75
double eps
Definition: ml_tomo.h:127
int sym_order
Definition: ml_tomo.h:240
double limit_trans
Definition: ml_tomo.h:154
double trymindiff_factor
Definition: ml_tomo.h:148
FileName fn_sym
Definition: ml_tomo.h:90
double psi_sampling
Definition: ml_tomo.h:220
void regularize(int iter)
Apply regularization.
Definition: ml_tomo.cpp:3215
bool do_missing
Internally store all missing wedges or re-compute on the fly?
Definition: ml_tomo.h:165
size_t nr_images_global
Definition: ml_tomo.h:117
bool mdimg_contains_angles
Definition: ml_tomo.h:131
std::vector< int > imgs_optrefno
Definition: ml_tomo.h:142
std::vector< size_t > * imgs_id
Definition: ml_tomo.h:77
Matrix2D< double > A_ori
Definition: ml_tomo.h:213
bool dont_align
Definition: ml_tomo.h:178
std::vector< double > corrA2
Definition: ml_tomo.h:125
double sigma_offset
Definition: ml_tomo.h:96
void calculatePdfTranslations()
Calculate probability density distribution for in-plane transformations.
Definition: ml_tomo.cpp:1669
bool do_only_average
Definition: ml_tomo.h:189
MultidimArray< double > P_phi
Definition: ml_tomo.h:135
void show()
Show.
Definition: ml_tomo.cpp:512
std::vector< Image< double > > Iold
Definition: ml_tomo.h:133
MultidimArray< double > alpha_k
Definition: ml_tomo.h:98
MultidimArray< double > fourier_mask
Definition: ml_tomo.h:174
double regF
Definition: ml_tomo.h:229
std::string cline
Definition: ml_tomo.h:92
double maxres
Definition: ml_tomo.h:173
int nr_ang
Definition: ml_tomo.h:224
virtual void expectation(MetaDataVec &MDimg, std::vector< Image< double > > &Iref, int iter, double &LL, double &sumfracweight, std::vector< MultidimArray< double > > &wsumimgs, std::vector< MultidimArray< double > > &wsumweds, double &wsum_sigma_noise, double &wsum_sigma_offset, MultidimArray< double > &sumw)
Integrate over all experimental images.
Definition: ml_tomo.cpp:2839
std::vector< Image< double > > * Iref
Definition: ml_tomo.h:74
FileName fn_mask
Definition: ml_tomo.h:90
MultidimArray< double > Mr2
Definition: ml_tomo.h:135
int Niter2
Definition: ml_tomo.h:108
int dim3
Definition: ml_tomo.h:110
void reScaleVolume(MultidimArray< double > &Min, bool down_scale=true)
Definition: ml_tomo.cpp:1750
std::vector< MultidimArray< double > > * wsumweds
Definition: ml_tomo.h:73
std::vector< AnglesInfo > AnglesInfoVector
Definition: ml_tomo.h:215
MultidimArray< double > docfiledata
Definition: ml_tomo.h:123
double reg_current
Definition: ml_tomo.h:229
bool checkConvergence(std::vector< double > &conv)
check convergence
Definition: ml_tomo.cpp:3321
bool do_ini_filter
Definition: ml_tomo.h:158
virtual void generateInitialReferences()
Generate initial references from random subset averages.
Definition: ml_tomo.cpp:894
glob_prnt iter
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
double reg0
Definition: ml_tomo.h:229
Sampling mysampling
Definition: ml_tomo.h:236
double noimp_threshold
Definition: ml_tomo.h:171
std::vector< Matrix1D< double > > imgs_optoffsets
Definition: ml_tomo.h:144
MultidimArray< double > real_mask
Definition: ml_tomo.h:174
bool no_SMALLANGLE
Definition: ml_tomo.h:233
bool do_generate_refs
Definition: ml_tomo.h:137
FileName fn_frac
Definition: ml_tomo.h:90
int oridim
Definition: ml_tomo.h:110
std::vector< MultidimArray< double > > * wsumimgs
Definition: ml_tomo.h:72
std::vector< int > imgs_missno
Definition: ml_tomo.h:146
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
MetaDataVec MDmissing
Definition: ml_tomo.h:129
double tilt_range0
Definition: ml_tomo.h:238
bool do_sym
Definition: ml_tomo.h:160
double nr_mask_pixels
Definition: ml_tomo.h:187
FileName fn_doc
Definition: ml_tomo.h:90
MetaDataVec MDref
Definition: ml_tomo.h:129
glob_log first
virtual void writeOutputFiles(const int iter, std::vector< MultidimArray< double > > &wsumweds, double &sumw_allrefs, double &LL, double &avefracweight, std::vector< double > &conv, std::vector< MultidimArray< double > > &fsc)
Write out reference images, selfile and logfile.
Definition: ml_tomo.cpp:3387
MetaDataVec MDimg
Definition: ml_tomo.h:129
#define M2
#define M1
int istart
Definition: ml_tomo.h:106
std::vector< double > imgs_optpsi
Definition: ml_tomo.h:143
size_t myLastImg
Definition: ml_tomo.h:121
void * threadMLTomoExpectationSingleImage(void *data)
Definition: ml_tomo.cpp:2702
size_t myFirstImg
Definition: ml_tomo.h:121
bool fix_fractions
Definition: ml_tomo.h:100
std::vector< Image< double > > Iwed
Definition: ml_tomo.h:133
double scale_factor
Definition: ml_tomo.h:173
int Niter
Definition: ml_tomo.h:108
virtual void setNumberOfLocalImages()
Set the number of images, this function is useful only for MPI.
Definition: ml_tomo.cpp:1064
void calculateFsc(MultidimArray< double > &M1, MultidimArray< double > &M2, MultidimArray< double > &W1, MultidimArray< double > &W2, MultidimArray< double > &freq, MultidimArray< double > &fsc, double &resolution)
Calculate resolution by FSC.
Definition: ml_tomo.cpp:3137
bool do_filter
Definition: ml_tomo.h:158
double sigma_noise
Definition: ml_tomo.h:94
int threads
Definition: ml_tomo.h:243
int nr_miss
Definition: ml_tomo.h:202
bool do_limit_psirange
Definition: ml_tomo.h:152
virtual void addPartialDocfileData(const MultidimArray< double > &data, size_t first, size_t last)
Add info of some processed images to later write to files.
Definition: ml_tomo.cpp:3363
bool fix_sigma_noise
Definition: ml_tomo.h:104
bool do_perturb
Definition: ml_tomo.h:156
FourierTransformer transformer
Definition: ml_tomo.h:246
void perturbAngularSampling()
Calculate Angular sampling.
Definition: ml_tomo.cpp:1403
int symmetry
Definition: ml_tomo.h:240
std::vector< double > A2
Definition: ml_tomo.h:125
bool do_impute
Definition: ml_tomo.h:167
double pixel_size
Definition: ml_tomo.h:226
bool do_ml
Definition: ml_tomo.h:169
void maskSphericalAverageOutside(MultidimArray< double > &Min)
Definition: ml_tomo.cpp:1730
FileName fn_sel
Definition: ml_tomo.h:90
ThreadTaskDistributor * distributor
Definition: ml_tomo.h:78
MultidimArray< unsigned char > fourier_imask
Definition: ml_tomo.h:175
virtual void produceSideInfo()
Setup lots of stuff.
Definition: ml_tomo.cpp:644
std::vector< double > imgs_trymindiff
Definition: ml_tomo.h:143
int hdim
Definition: ml_tomo.h:110
virtual void produceSideInfo2(int nr_vols=1)
Definition: ml_tomo.cpp:1077
MultidimArray< double > real_omask
Definition: ml_tomo.h:174
void readParams()
Read arguments from command line.
Definition: ml_tomo.cpp:237
bool do_mask
Definition: ml_tomo.h:183
double angular_sampling
Missing data information.
Definition: ml_tomo.h:220
void defineParams()
Define the arguments accepted.
Definition: ml_tomo.cpp:37
void precalculateA2(std::vector< Image< double > > &Iref)
Fill vector of matrices with all rotations of reference.
Definition: ml_tomo.cpp:1875
double psi(const double x)
void run()
Main body of the program.
Definition: ml_tomo.cpp:390
MissingType type
Definition: ml_tomo.h:195
double ddim3
Definition: ml_tomo.h:111
std::vector< size_t > convert_refno_to_stack_position
Definition: ml_tomo.h:139
AnglesInfoVector all_angle_info
Definition: ml_tomo.h:222
std::vector< int > imgs_optangno
Definition: ml_tomo.h:142
void getMissingRegion(MultidimArray< unsigned char > &Mmeasured, const Matrix2D< double > &A, const int missno)
Get binary missing wedge (or pyramid)
Definition: ml_tomo.cpp:1527
void maximization(std::vector< MultidimArray< double > > &wsumimgs, std::vector< MultidimArray< double > > &wsumweds, double &wsum_sigma_noise, double &wsum_sigma_offset, MultidimArray< double > &sumw, double &sumfracweight, double &sumw_allrefs, std::vector< MultidimArray< double > > &fsc, int iter)
Update all model parameters.
Definition: ml_tomo.cpp:2936
std::vector< Image< double > > Iref
Definition: ml_tomo.h:133
FileName fn_root
Definition: ml_tomo.h:90
bool dont_rotate
Definition: ml_tomo.h:180
void readMissingInfo()
Definition: ml_tomo.cpp:1436
bool do_keep_angles
Definition: ml_tomo.h:115
int dim
Definition: ml_tomo.h:110
void postProcessVolume(Image< double > &Vin, double resolution=-1.)
Definition: ml_tomo.cpp:1791
int reg_steps
Definition: ml_tomo.h:230
FileName fn_missing
Definition: ml_tomo.h:90
std::vector< MissingInfo > all_missing_info
Definition: ml_tomo.h:204
double tilt_rangeF
Definition: ml_tomo.h:238
bool fix_sigma_offset
Definition: ml_tomo.h:102
size_t nr_images_local
Definition: ml_tomo.h:119
MultidimArray< double > * sumw
Definition: ml_tomo.h:76
Image< double > Imask
Definition: ml_tomo.h:185
FileName fn_ref
Definition: ml_tomo.h:90
double ang_search
Definition: ml_tomo.h:150
std::vector< size_t > imgs_id
Definition: ml_tomo.h:249