Xmipp  v3.23.11-Nereus
mlf_align2d.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 MLFALIGN2D_H
27 #define MLFALIGN2D_H
28 
29 #include "ml2d.h"
30 #include <numeric>
31 
35 
36 #define FOR_ALL_MODELS() for (int refno=0;refno<model.n_ref; refno++)
37 #define FOR_ALL_ROTATIONS() for (size_t ipsi=0; ipsi<nr_psi; ipsi++ )
38 #define FOR_ALL_FLIPS() for (size_t iflip=0; iflip<nr_flip; iflip++)
39 #define FOR_ALL_LIMITED_TRANSLATIONS() for (size_t itrans=0; itrans<nr_trans; itrans++)
40 #define FOR_ALL_DEFOCUS_GROUPS() for (size_t ifocus=0; ifocus<nr_focus; ifocus++)
41 #define FOR_ALL_DIGITAL_FREQS() for (size_t irr = 0; irr < hdim; irr++)
42 #define FOR_ALL_POINTS() for (size_t ipoint = 0; ipoint < nr_points_2d; ++ipoint)
43 
44 //Helper macros to define the elements of vectors:
45 //Vsig, Vctf and Vsnr indexed by ifocus and irr
46 #define VSNR_ITEM dAi(Vsnr[ifocus], irr)
47 #define VCTF_ITEM dAi(Vctf[ifocus], irr)
48 #define VDEC_ITEM dAi(Vdec[ifocus], irr)
49 #define VSIG_ITEM dAi(Vsig[ifocus], irr)
50 
51 #define SIGNIFICANT_WEIGHT_LOW 1e-8
52 constexpr double SMALLVALUE = 1e-4;
53 constexpr float HISTMIN = -6.;
54 constexpr float HISTMAX = 6.;
55 constexpr int HISTSTEPS = 120;
56 
58 #define FN_EXTRA(file) formatString("%sextra/%s", fn_root.c_str(), file)
59 #define FN_NOISE_IMG_MD FN_EXTRA("noise_images.xmd")
60 #define FN_NOISE_IMG FN_EXTRA("noise_images.stk")
61 #define FN_CREF_IMG FN_EXTRA("cref_classes.stk")
62 #define FN_CREF_IMG_MD FN_EXTRA("cref_classes.xmd")
63 
64 #define FN_ITER_BASE(iter) getIterExtraPath(fn_root, iter)
65 #define FN_REF(base, refno) formatString("%06d@%sclasses.stk", (refno), (base).c_str())
66 #define FN_VSIG(base, ifocus, ext) ((nr_focus > 1) ? formatString("ctf%06d@%s%s", ((ifocus) + 1), (base).c_str(), (ext)) : ((base) + "_ctf" + (ext)))
67 
68 
71 {
72 public:
73 
75  double sigma_offset;
77  std::vector<double> alpha_k;
79  std::vector<double> mirror_fraction;
81  size_t max_nr_psi;
85  std::vector< Image<double> > Ictf;
89  size_t nr_trans;
91  size_t zero_trans;
96 
98  //CTFDat ctfdat;
102  double sampling;
104  std::vector<int> count_defocus;
110  std::vector<MultidimArray<double> > Vsig, Vctf, Vdec;
112  double reduce_snr;
114  size_t nr_focus;
124  double fix_high;
126  std::vector<int> pointer_2d, pointer_i, pointer_j;
130 
132 
134 
138 
140 
141  bool do_kstest;
146  std::vector<Histogram1D > resolhist;
147 
148  std::vector<double> refs_avgscale;
149 
150  int rank, size, nr_vols; //mpi rank, size and 3d number of vols
151 
154  std::vector<MultidimArray<double> > wsum_Mref, wsum_ctfMref;
155  std::vector< std::vector<double> > Mwsum_sigma2;
156  std::vector<double> sumw, sumw2, sumwsc, sumwsc2, sumw_mirror, sumw_defocus;
157  std::vector<double> Fref, Fwsum_imgs, Fwsum_ctfimgs;
158 
159 
164  ProgMLF2D(int nr_vols = 0, int rank = 0, int size = 1);
165 
167  void defineParams();
168 
170  void readParams();
171 
172 
173 public:
175  void show(bool ML3D = false);
176 
178  virtual void produceSideInfo();
179 
182  virtual void produceSideInfo2();
183 
185  virtual void defineBasicParams(XmippProgram * prog);
186  virtual void defineAdditionalParams(XmippProgram * prog, const char * sectionLine);
187 
191 
195  std::vector<double> &sumw_defocus, int iter);
196 
198  void setCurrentSamplingRates(double current_probres_limit);
199 
202 
203 
205  void calculatePdfInplane();
206 
207  // Append a FourierTransform (in half format!) to a vector
208  void appendFTtoVector(const MultidimArray<std::complex<double> > &Fin,
209  std::vector<double> &out);
210 
211  // get a FourierTransform (in half format!) from a vector
212  void getFTfromVector(const std::vector<double> &in,
213  const int start_point,
214  MultidimArray<std::complex<double> > &out,
215  bool only_real = false);
216 
218  void rotateReference(std::vector<double> &out);
219 
221  void reverseRotateReference(const std::vector<double> &in,
222  std::vector<MultidimArray<double > > &out);
223 
226  void preselectDirections(float &phi, float &theta,
227  std::vector<double> &pdf_directions);
228 
231  void preselect_significant_model_phi(MultidimArray<double> &Mimg, std::vector<double> &offsets,
232  std::vector <std::vector< MultidimArray<double > > > &Mref,
233  MultidimArray<int> &Msignificant,
234  std::vector<double > &pdf_directions);
235 
236  // Calculate the FT of a translated matrix using a phase shift in
237  // Fourier space
238  void fourierTranslate2D(const std::vector<double> &in,
239  MultidimArray<double> &trans,
240  std::vector<double> &out,
241  int point_start = 0);
242 
243  // If not determined yet: search optimal offsets using maxCC
244  // Then for all optimal translations, calculate all translated FTs
245  // for each of the flipped variants
247  const std::vector<double > &offsets,
248  std::vector<double> &out,
249  MultidimArray<int> &Moffsets,
250  MultidimArray<int> &Moffsets_mirror);
251 
253  void processOneImage(const MultidimArray<double> &Mimg,
254  size_t focus, bool apply_ctf,
255  double &fracweight, double &maxweight2, double &sum_refw2,
256  double &opt_scale, size_t &opt_refno, double &opt_psi,
257  size_t &opt_ipsi, size_t &opt_iflip,
258  MultidimArray<double> &opt_offsets,
259  std::vector<double> &opt_offsets_ref,
260  std::vector<double > &pdf_directions,
261  bool do_kstest, bool write_histograms,
262  FileName fn_img, double &KSprob);
263 
265  double performKSTest(MultidimArray<double> &Mimg, const int focus, bool apply_ctf,
266  FileName &fn_img, bool write_histogram,
267  std::vector <std::vector< MultidimArray<std::complex<double> > > > &Fref,
268  double &opt_scale, int &opt_refno, int &opt_ipsi, int &opt_iflip,
269  MultidimArray<double> &opt_offsets);
270 
272  void iteration();
274  void expectation();
276  void maximization();
278  void endIteration();
279 
281  virtual void writeOutputFiles(const ModelML2D &model, OutputType outputType);
282 
284  void writeNoiseFile(const FileName &fn_base, int ifocus);
285 
286  virtual void addPartialDocfileData(const MultidimArray<double> &data, size_t first, size_t last);
287 
288 };
290 
291 #endif
bool do_student
IN DEVELOPMENT.
Definition: mlf_align2d.h:135
std::vector< double > Fwsum_imgs
Definition: mlf_align2d.h:157
virtual void addPartialDocfileData(const MultidimArray< double > &data, size_t first, size_t last)
Add docfiledata to docfile.
double lowres_limit
Definition: mlf_align2d.h:116
double wsum_sigma_offset
Definition: mlf_align2d.h:153
void generateInitialReferences()
Generate initial references from random subset averages.
double fix_high
Definition: mlf_align2d.h:124
std::vector< MultidimArray< double > > Vctf
Definition: mlf_align2d.h:110
double highres_limit
Definition: mlf_align2d.h:116
virtual void show() const
void maximization()
Update all model parameters (maximization step)
ModelML2D model
Definition: ml2d.h:224
bool do_variable_psi
Definition: mlf_align2d.h:83
MultidimArray< size_t > Mresol_int
Definition: mlf_align2d.h:108
double LL
Definition: mlf_align2d.h:153
int search_shift
Definition: mlf_align2d.h:93
void rotateReference(std::vector< double > &out)
Fill vector of matrices with all rotations of reference.
void defineParams()
Params definition.
Definition: mlf_align2d.cpp:71
bool limit_trans
Definition: mlf_align2d.h:87
virtual void defineAdditionalParams(XmippProgram *prog, const char *sectionLine)
Definition: mlf_align2d.cpp:55
size_t nr_trans
Definition: mlf_align2d.h:89
FileName fn_img
Definition: ml2d.h:132
std::vector< double > sumw_defocus
Definition: mlf_align2d.h:156
void preselectDirections(float &phi, float &theta, std::vector< double > &pdf_directions)
OutputType
Definition: ml2d.h:76
std::vector< int > pointer_2d
Definition: mlf_align2d.h:126
void expectation()
Integrate over all experimental images.
bool first_iter_noctf
Definition: mlf_align2d.h:118
void iteration()
One iteration of the process.
int iter_write_histograms
Definition: mlf_align2d.h:143
size_t nr_focus
Definition: mlf_align2d.h:114
size_t current_highres_limit
Definition: mlf_align2d.h:129
double reduce_snr
Definition: mlf_align2d.h:112
void estimateInitialNoiseSpectra()
std::vector< double > sumwsc2
Definition: mlf_align2d.h:156
std::vector< int > pointer_j
Definition: mlf_align2d.h:126
double theta
double performKSTest(MultidimArray< double > &Mimg, const int focus, bool apply_ctf, FileName &fn_img, bool write_histogram, std::vector< std::vector< MultidimArray< std::complex< double > > > > &Fref, double &opt_scale, int &opt_refno, int &opt_ipsi, int &opt_iflip, MultidimArray< double > &opt_offsets)
Perform Kolmogorov-Smirnov test.
ProgTransformDimRed * prog
bool do_variable_trans
Definition: mlf_align2d.h:83
glob_log first
constexpr float HISTMAX
Definition: mlf_align2d.h:54
std::vector< double > refs_avgscale
Definition: mlf_align2d.h:148
MultidimArray< double > spectral_signal
Definition: ml2d.h:253
bool do_kstest
Statistical analysis of the noise distributions.
Definition: mlf_align2d.h:141
std::vector< Image< double > > Ictf
Definition: mlf_align2d.h:85
size_t dnr_points_2d
Definition: mlf_align2d.h:127
int in
constexpr float HISTMIN
Definition: mlf_align2d.h:53
std::vector< MultidimArray< double > > wsum_Mref
Definition: mlf_align2d.h:154
void endIteration()
Redefine endIteration to update Wiener filters.
bool phase_flipped
Definition: mlf_align2d.h:106
void reverseRotateReference(const std::vector< double > &in, std::vector< MultidimArray< double > > &out)
Apply reverse rotations to all matrices in vector and fill new matrix with their sum.
bool do_student_sigma_trick
Definition: mlf_align2d.h:137
virtual void produceSideInfo2()
double sigma_offset
Definition: mlf_align2d.h:75
bool do_include_allfreqs
Definition: mlf_align2d.h:122
std::vector< double > alpha_k
Definition: mlf_align2d.h:77
void readParams()
Read arguments from command line.
Definition: mlf_align2d.cpp:90
bool do_ctf_correction
Definition: mlf_align2d.h:100
void calculateFourierOffsets(const MultidimArray< double > &Mimg, const std::vector< double > &offsets, std::vector< double > &out, MultidimArray< int > &Moffsets, MultidimArray< int > &Moffsets_mirror)
std::vector< Histogram1D > resolhist
Definition: mlf_align2d.h:146
std::vector< MultidimArray< double > > Vdec
Definition: mlf_align2d.h:110
void writeNoiseFile(const FileName &fn_base, int ifocus)
Write noise estimation per resolution.
std::vector< double > mirror_fraction
Definition: mlf_align2d.h:79
bool do_divide_ctf
Definition: mlf_align2d.h:120
std::vector< double > sumwsc
Definition: mlf_align2d.h:156
void setCurrentSamplingRates(double current_probres_limit)
Vary in-plane and translational sampling rates with resolution.
int offsets_keepdir
Definition: mlf_align2d.h:95
constexpr int HISTSTEPS
Definition: mlf_align2d.h:55
std::vector< double > sumw
Definition: mlf_align2d.h:156
std::vector< double > Fref
Definition: mlf_align2d.h:157
void preselect_significant_model_phi(MultidimArray< double > &Mimg, std::vector< double > &offsets, std::vector< std::vector< MultidimArray< double > > > &Mref, MultidimArray< int > &Msignificant, std::vector< double > &pdf_directions)
double sumw_allrefs
Definition: mlf_align2d.h:153
virtual void defineBasicParams(XmippProgram *prog)
Some redefinitions of the basic and additional params.
Definition: mlf_align2d.cpp:46
std::vector< double > sumw_mirror
Definition: mlf_align2d.h:156
void getFTfromVector(const std::vector< double > &in, const int start_point, MultidimArray< std::complex< double > > &out, bool only_real=false)
std::vector< double > sumw2
Definition: mlf_align2d.h:156
void fourierTranslate2D(const std::vector< double > &in, MultidimArray< double > &trans, std::vector< double > &out, int point_start=0)
std::vector< double > Fwsum_ctfimgs
Definition: mlf_align2d.h:157
size_t max_nr_psi
Definition: mlf_align2d.h:81
std::vector< std::vector< double > > Mwsum_sigma2
Definition: mlf_align2d.h:155
Definition: ml2d.h:79
double sampling
Definition: mlf_align2d.h:102
void processOneImage(const MultidimArray< double > &Mimg, size_t focus, bool apply_ctf, double &fracweight, double &maxweight2, double &sum_refw2, double &opt_scale, size_t &opt_refno, double &opt_psi, size_t &opt_ipsi, size_t &opt_iflip, MultidimArray< double > &opt_offsets, std::vector< double > &opt_offsets_ref, std::vector< double > &pdf_directions, bool do_kstest, bool write_histograms, FileName fn_img, double &KSprob)
Perform expectation step for a single image.
void calculatePdfInplane()
Calculate probability density distribution for in-plane transformations.
std::vector< int > pointer_i
Definition: mlf_align2d.h:126
size_t zero_trans
Definition: mlf_align2d.h:91
std::vector< int > count_defocus
Definition: mlf_align2d.h:104
Histogram1D sumhist
Definition: mlf_align2d.h:145
void updateWienerFilters(const MultidimArray< double > &spectral_signal, std::vector< double > &sumw_defocus, int iter)
size_t nr_points_prob
Definition: mlf_align2d.h:127
virtual void writeOutputFiles(const ModelML2D &model, OutputType outputType)
Write out reference images, selfile and logfile.
double sumcorr
Definition: mlf_align2d.h:153
ProgMLF2D(int nr_vols=0, int rank=0, int size=1)
Definition: mlf_align2d.cpp:30
void appendFTtoVector(const MultidimArray< std::complex< double > > &Fin, std::vector< double > &out)
double ini_highres_limit
Definition: mlf_align2d.h:116
virtual void produceSideInfo()
Setup lots of stuff.
constexpr double SMALLVALUE
Definition: mlf_align2d.h:52
std::vector< MultidimArray< double > > wsum_ctfMref
Definition: mlf_align2d.h:154
size_t nr_points_2d
Definition: mlf_align2d.h:127
std::vector< MultidimArray< double > > Vsig
Definition: mlf_align2d.h:110