49 prog->
addParamsLine(
"[--no_ctf] : do not use any CTF correction, you should provide sampling rate");
52 prog->
addParamsLine(
" [--sampling_rate <Ts>] : If provided, this sampling rate will overwrites the one in the ctf file");
59 prog->
addParamsLine(
" [ --search_shift <int=3>] : Limited translational searches (in pixels) ");
60 prog->
addParamsLine(
" [ --reduce_snr <factor=1> ] : Use a value smaller than one to decrease the estimated SSNRs ");
61 prog->
addParamsLine(
" [ --not_phase_flipped ] : Use this if the experimental images have not been phase flipped ");
62 prog->
addParamsLine(
" [ --ctf_affected_refs ] : Use this if the references (-ref) are not CTF-deconvoluted ");
63 prog->
addParamsLine(
" [ --limit_resolution <first_high=0> <high=0> <low=999>]: Exclude frequencies from P-calculations (in Ang)");
64 prog->
addParamsLine(
" : First value is highest frequency during first iteration.");
65 prog->
addParamsLine(
" : Second is the highest in following iterations and third is lowest");
96 char ** argv2 =
nullptr;
98 double restart_offset = 0;
99 FileName restart_imgmd, restart_refmd;
100 int restart_iter = 0;
101 int restart_seed = 0;
108 char *copy =
nullptr;
125 argv2 = (
char **)
argv;
126 for (
int i = 1;
i < argc2;
i++)
189 seed = int(restart_seed);
190 istart = restart_iter + 1;
194 seed = time(
nullptr);
208 <<
" -----------------------------------------------------------------" << std::endl
209 <<
" | Read more about this program in the following publication: |" << std::endl
210 <<
" | Scheres ea. (2007) Structure, 15, 1167-1177 |" << std::endl
211 <<
" | |" << std::endl
212 <<
" | *** Please cite it if this program is of use to you! *** |" << std::endl
213 <<
" -----------------------------------------------------------------" << std::endl;
216 <<
"--> Multi-reference refinement " << std::endl
217 <<
"--> using a maximum-likelihood in Fourier-space (MLF) target " <<std::endl
218 << (
do_ctf_correction ?
"--> with CTF correction " :
"--> ignoring CTF effects ")<<std::endl
222 std::cout <<
" Reference image(s) : " <<
fn_ref << std::endl;
224 std::cout <<
" Number of references: : " <<
model.
n_ref << std::endl;
227 <<
" Output rootname : " <<
fn_root << std::endl
228 <<
" Stopping criterium : " <<
eps << std::endl
229 <<
" initial sigma offset : " <<
sigma_offset << std::endl
230 <<
" Psi sampling interval : " <<
psi_step <<
" degrees" << std::endl
231 <<
" Translational searches : " <<
search_shift <<
" pixels" << std::endl
232 <<
" Low resolution limit : " <<
lowres_limit <<
" Ang" << std::endl
233 <<
" High resolution limit : " <<
highres_limit <<
" Ang" << std::endl;
236 std::cout <<
" Multiply estimated SNR : " <<
reduce_snr << std::endl;
238 std::cerr <<
" --> WARNING!! With reduce_snr>1 you may likely overfit the noise!" << std::endl;
239 std::cout <<
" Check mirrors : " << (
do_mirror ?
"true" :
"false") << std::endl;
241 std::cout <<
" Initial model fractions : " <<
fn_frac << std::endl;
244 std::cout <<
" + Assuming images have " << (
phase_flipped ?
"" :
"not") <<
"been phase flipped " << std::endl;
252 std::cout <<
" + High resolution limit for 1st iteration set to " <<
ini_highres_limit <<
"Ang"<<std::endl;
254 std::cout <<
" + Limit orientational search to +/- " <<
search_rot <<
" degrees" << std::endl;
256 std::cout <<
" + Vary in-plane rotational sampling with resolution " << std::endl;
258 std::cout <<
" + Vary in-plane translational sampling with resolution " << std::endl;
263 std::cout <<
" + Do not update estimates of model fractions." << std::endl;
267 std::cout <<
" + Do not update sigma-estimate of origin offsets." << std::endl;
271 std::cout <<
" + Do not update estimated noise spectra." << std::endl;
275 std::cout <<
" -> Use t-student distribution with df = " <<
df<< std::endl;
278 std::cout <<
" -> Use sigma-trick for t-student distributions" << std::endl;
283 std::cout <<
" -> Developmental: refine normalization internally "<<std::endl;
287 std::cout <<
" -> Developmental: perform KS-test on noise distributions "<<std::endl;
289 std::cout <<
" -> Developmental: write noise histograms at iteration "<<
iter_write_histograms<<std::endl;
291 std::cout <<
" -----------------------------------------------------------------" << std::endl;
315 std::vector<int> tmppointp, tmppointp_nolow, tmppointi, tmppointj;
340 for (
size_t ires = 0; ires <
hdim; ires++)
356 XX(offsets) = (double)j;
357 YY(offsets) = (double)
i;
358 Vtrans.push_back(offsets);
359 if (
i == 0 && j == 0)
366 std::vector<FileName> all_fn_ctfs;
378 Vctf[0].initConstant(1.);
391 std::vector<MDLabel> groupby;
411 for (
size_t objId : mdCTF.
ids())
420 std::cerr <<
"WARNING%% CTF group " << (ifocus + 1) <<
" contains less than 50 images!" << std::endl;
427 if (astigmCTFFactor > 0.1)
431 std::cerr <<
"CTF is too astigmatic. We ill ignore it." << std::endl;
432 std::cerr <<
" defocus U: " << ctf.
DeltafU <<
" defocus V: " << ctf.
DeltafV << std::endl;
433 std::cerr <<
" astigmCTFFactor " << astigmCTFFactor << std::endl;
526 int c,
idum, refno = 0;
537 double ref_fraction = (double)1. /
model.
n_ref;
544 img().setXmippOrigin();
549 alpha_k.push_back(ref_fraction);
562 std::cerr <<
"myFirstImg= "<<
myFirstImg<<std::endl;
563 std::cerr <<
"myLastImg= "<<
myLastImg<<std::endl;
564 std::cerr <<
"size="<<
size<<
"rank="<<
rank<<std::endl;
583 for (
int refno = 0; refno <
idum; refno++)
667 radialAverage(Maux, center, rmean_signal2, radial_count,
true);
669 spectral_signal = rmean_signal2;
671 spectral_signal += rmean_signal2;
682 double inv_2_nr_vol = 1. / (double)(
nr_vols * 2);
683 spectral_signal *= inv_2_nr_vol;
689 spectral_signal *= inv_n_ref;
698 fn_tmp =
FN_VSIG(fn_base, ifocus,
"noise.xmd");
702 for (
size_t objId : md.
ids())
720 std::cerr<<
"aux= "<<aux<<
" resol= "<<(double)irr/(
sampling*dim)<<std::endl;
750 std::vector<MultidimArray<double> > Msigma2, Mave;
762 std::cout <<
"--> Estimating initial noise models from average power spectra ..." << std::endl;
773 Msigma2[ifocus].initZeros(
dim,
dim);
774 Msigma2[ifocus].setXmippOrigin();
775 Mave[ifocus].initZeros(
dim,
dim);
776 Mave[ifocus].setXmippOrigin();
791 img().setXmippOrigin();
796 Msigma2[focus] += Maux;
797 Mave[focus] += img();
816 radialAverage(Maux, center, rmean_signal, radial_count,
true);
818 Msigma2[ifocus].setXmippOrigin();
820 radialAverage(Msigma2[ifocus], center, rmean_noise, radial_count,
true);
832 fn_tmp =
FN_VSIG(fn_base, ifocus,
"noise.xmd");
836 fh.open((fn_tmp).c_str(), std::ios::out);
862 std::vector<MultidimArray<double> > Vsnr;
868 double noise, sum_sumw_defocus = 0.;
869 size_t int_lowres_limit, int_highres_limit, int_ini_highres_limit;
870 size_t current_probres_limit;
885 double & defocus_weight = sumw_defocus[ifocus];
886 sum_sumw_defocus += defocus_weight;
890 Vavgctf2 /= sum_sumw_defocus;
906 noise = 2. *
VSIG_ITEM * sumw_defocus[ifocus];
907 noise /= sumw_defocus[ifocus] - 1;
913 if (noise > 1e-20 &&
dAi(Vavgctf2, irr) > 0.)
916 dAi(spectral_signal, irr) / (
dAi(Vavgctf2, irr) * noise);
971 dAi(Vdenom, irr) += 1.;
972 dAi(Vdenom, irr) /= sum_sumw_defocus;
996 double resol_freq = 0;
997 double resol_real = 999.;
1010 noise = 2. *
VSIG_ITEM * sumw_defocus[ifocus];
1011 noise /= (sumw_defocus[ifocus] - 1);
1022 resol_freq += resol_step;
1024 fn_tmp =
FN_VSIG(fn_base, ifocus,
"ssnr.xmd");
1033 current_probres_limit =
hdim-1;
1045 current_probres_limit = maxres;
1051 current_probres_limit =
XMIPP_MIN(current_probres_limit, int_highres_limit);
1054 current_probres_limit =
XMIPP_MIN(current_probres_limit,
hdim);
1061 <<
"current_probres_limit dependencies: " << std::endl
1062 <<
" hdim: " <<
hdim <<
" dim: " <<
dim << std::endl
1064 <<
" maxres: " << maxres <<
" int_highres_limit: " << int_highres_limit << std::endl;
1066 std::cerr<<
" Current resolution limits: "<<std::endl;
1067 std::cerr<<
" + low res= "<<
lowres_limit<<
" Ang ("<<int_lowres_limit<<
" shell)"<<std::endl;
1068 std::cerr<<
" + prob. res= "<<
sampling*
dim/current_probres_limit<<
" Ang ("<<current_probres_limit<<
" shell)"<<std::endl;
1070 std::cerr<<
" + high res= "<<
highres_limit<<
" Ang ("<<int_highres_limit<<
" shell)"<<std::endl;
1087 if (ires > int_lowres_limit &&
1088 ires <= current_probres_limit &&
1103 if ( (ires <= int_lowres_limit || ires > current_probres_limit) &&
1156 double rr =
sqrt((
double)(ix * ix + iy * iy));
1161 Vtrans.push_back(offsets);
1163 if (ix == 0 && iy == 0)
1171 Vtrans.push_back(offsets);
1175 Vtrans.push_back(offsets);
1179 Vtrans.push_back(offsets);
1183 Vtrans.push_back(offsets);
1193 std::cout<<
" Current resolution= "<<current_probres_limit<<
" Ang; current psi_step = "<<
psi_step<<
" current trans_step = "<<trans_step<<std::endl;
1204 std::cout <<
" Generating initial references by averaging over random subsets" << std::endl;
1215 size_t nsub,
first, last;
1218 for (
int refno = 0; refno <
model.
n_ref; refno++)
1222 IRef().initZeros(
dim,
dim);
1223 IRef().setXmippOrigin();
1225 for (
size_t imgno = first; imgno <= last; imgno++)
1229 ITemp().setXmippOrigin();
1233 fn_tmp =
FN_REF(fn_base, refno + 1);
1257 double r2, pdfpix, sum;
1266 r2 = (double)(
j *
j +
i *
i);
1274 if (
j == 0 && i == 0)
1289 std::vector<double> &out)
1294 for (
size_t ipoint = 0; ipoint <
nr_points_2d; ipoint++)
1297 out.push_back(tmp_in[ii].real());
1298 out.push_back(tmp_in[ii].imag());
1303 const int start_point,
1313 for (
size_t ipoint = 0; ipoint <
nr_points_2d; ipoint++)
1316 std::complex<double> aux(in[start_point+ipoint], 0.);
1322 for (
size_t ipoint = 0; ipoint <
nr_points_2d; ipoint++)
1325 std::complex<double> aux(in[start_point+2*ipoint],in[start_point+2*ipoint+1]);
1338 double AA, stdAA,
psi;
1365 double sqrtVal =
sqrt(stdAA/AA);
1367 dAi(Faux,
n) *= sqrtVal;
1395 out.push_back(Maux);
1404 out[refno] += Maux2;
1411 std::vector<double> &pdf_directions)
1414 float phi_ref, theta_ref, angle, angle2;
1417 pdf_directions.clear();
1421 if (!
limit_rot || (phi == -999. && theta == -999.))
1422 pdf_directions[refno] = 1.;
1432 angle = fabs(
realWRAP(angle, -180, 180));
1434 angle2 = 180. + angle;
1435 angle2 = fabs(
realWRAP(angle2, -180, 180));
1438 pdf_directions[refno] = 0.;
1440 pdf_directions[refno] = 1.;
1447 std::vector<double> &out,
1450 double xx, yy, xxshift, yyshift, dotp;
1451 double a,
b,
c,
d, ac, bd, ab_cd;
1452 xxshift = -trans(0) / (double)
dim;
1453 yyshift = -trans(1) / (double)
dim;
1455 const double * ptrIn = &(in[point_start]);
1461 xx = (double)ptrJ[
i];
1462 yy = (double)ptrI[
i];
1463 dotp = 2 *
PI * (xx * xxshift + yyshift * yy);
1470 ab_cd = (a +
b) * (c + d);
1471 out.push_back(ac - bd);
1472 out.push_back(ab_cd - ac - bd);
1480 const std::vector<double > &offsets,
1481 std::vector<double> &out,
1486 int irefmir, ix, iy, iflip_start, iflip_stop, count;
1490 std::vector<double> Fimg_flip;
1523 for (
int imir = 0; imir < nr_mir; imir++)
1530 ix =
ROUND(offsets[2*irefmir] +
Vtrans[itrans](0));
1531 iy =
ROUND(offsets[2*irefmir+1] +
Vtrans[itrans](1));
1537 for (
int iflip = iflip_start; iflip < iflip_stop; iflip++)
1550 for (
int iflip = iflip_start; iflip < iflip_stop; iflip++)
1590 const size_t focus,
bool apply_ctf,
1591 double &fracweight,
double &maxweight2,
1592 double &sum_refw2,
double &opt_scale,
1593 size_t &opt_refno,
double &opt_psi,
1594 size_t &opt_ipsi,
size_t &opt_iflip,
1596 std::vector<double> &opt_offsets_ref,
1597 std::vector<double > &pdf_directions,
1601 std::vector<double> &Mwsum_sigma2_local =
Mwsum_sigma2[focus];
1604 std::vector<double> Fimg_trans;
1605 std::vector<MultidimArray<double> > uniq_offsets;
1610 double aux, fracpdf, weight, weight2=0.;
1611 double tmpr, tmpi, sum_refw = 0.;
1612 double diff, maxweight = -99.e99, mindiff2 = 99.e99;
1613 double logsigma2, ldim, ref_scale = 1.;
1614 double scale_denom, scale_numer, wsum_sc = 0., wsum_sc2 = 0.;
1615 int irot, irefmir, opt_irefmir=0, ix, iy;
1616 size_t point_trans=0;
1617 int opt_itrans=0, iflip_start, iflip_stop, nr_mir;
1618 int img_start, ref_start, wsum_start;
1628 df2 = - (
df + ldim ) / 2. ;
1637 const int &ifocus = focus;
1642 inv_sigma2[ipoint] = 1./ sigma2[ipoint];
1658 logsigma2 += 2 *
log(
sqrt(factor * sigma2[ipoint]));
1667 if (!
limit_rot || pdf_directions[refno] > 0.)
1675 ix = (int)
round(opt_offsets_ref[2*irefmir]);
1676 iy = (int)
round(opt_offsets_ref[2*irefmir+1]);
1677 Pmax_refmir[irefmir] = 0.;
1679 if (point_trans < 0 || point_trans >
dim2)
1681 std::cerr<<
"point_trans = "<<point_trans<<
" ix= "<<ix<<
" iy= "<<iy<<std::endl;
1691 irot = iflip * nr_psi + ipsi;
1699 tmpr = Fimg_trans[img_start + 2*ii] - ctf[ii] * ref_scale *
Fref[ref_start + 2*ii];
1700 tmpi = Fimg_trans[img_start + 2*ii+1] - ctf[ii] * ref_scale * Fref[ref_start + 2*ii+1];
1701 tmpr = (tmpr * tmpr + tmpi * tmpi) * inv_sigma2[ii];
1709 tmpr = Fimg_trans[img_start + 2*ii] - ref_scale *
Fref[ref_start + 2*ii];
1710 tmpi = Fimg_trans[img_start + 2*ii+1] - ref_scale * Fref[ref_start + 2*ii+1];
1711 diff += (tmpr * tmpr + tmpi * tmpi) * inv_sigma2[ii];
1721 std::cerr<<
"refno= "<<refno<<
" irot= "<<irot<<
" diff= "<<diff<<
" mindiff2= "<<mindiff2<<std::endl;
1723 if (diff < mindiff2)
1730 opt_irefmir = irefmir;
1737 std::cerr<<
">>>>> mindiff2= "<<mindiff2<<std::endl;
1746 if (!
limit_rot || pdf_directions[refno] > 0.)
1749 refw_mirror[refno] = 0.;
1754 ix = (int)
round(opt_offsets_ref[2*irefmir]);
1755 iy = (int)
round(opt_offsets_ref[2*irefmir+1]);
1763 irot = iflip * nr_psi + ipsi;
1770 aux = diff - mindiff2;
1775 weight = exp(-aux) * pdf;
1788 aux = (
df + diff) / (
df + mindiff2);
1789 weight = pow(aux,
df2) * pdf;
1792 weight2 = (
df + ldim ) / (
df + diff );
1795 refw2[refno] += weight * weight2;
1796 sum_refw2 += weight * weight2;
1800 refw[refno] += weight;
1802 refw_mirror[refno] += weight;
1817 scale_numer += Fimg_trans[img_start + 2*ii] * ctf[ii] *
Fref[ref_start + 2*ii];
1818 scale_numer += Fimg_trans[img_start + 2*ii+1] * ctf[ii] * Fref[ref_start + 2*ii+1];
1819 scale_denom += ctf[ii] * Fref[ref_start + 2*ii] * ctf[ii] * Fref[ref_start + 2*ii];
1820 scale_denom += ctf[ii] * Fref[ref_start + 2*ii+1] * ctf[ii] * Fref[ref_start + 2*ii+1];
1827 scale_numer += Fimg_trans[img_start + 2*ii] *
Fref[ref_start + 2*ii];
1828 scale_numer += Fimg_trans[img_start + 2*ii+1] * Fref[ref_start + 2*ii+1];
1829 scale_denom += Fref[ref_start + 2*ii] * Fref[ref_start + 2*ii];
1830 scale_denom += Fref[ref_start + 2*ii+1] * Fref[ref_start + 2*ii+1];
1836 if (weight > Pmax_refmir[irefmir])
1837 Pmax_refmir[irefmir] = weight;
1838 if (weight > maxweight)
1842 maxweight2 = weight2;
1847 opt_irefmir = irefmir;
1859 if (!
limit_rot || pdf_directions[refno] > 0.)
1870 irot = iflip * nr_psi + ipsi;
1883 ix = (int)
round(opt_offsets_ref[2*irefmir] +
Vtrans[itrans](0));
1884 iy = (int)
round(opt_offsets_ref[2*irefmir+1] +
Vtrans[itrans](1));
1888 point_trans =
A2D_ELEM(Moffsets, iy, ix);
1890 point_trans =
A2D_ELEM(Moffsets_mirror, iy, ix);
1891 if (point_trans < 0 || point_trans >
dim2)
1893 std::cerr<<
"point_trans = "<<point_trans<<
" ix= "<<ix<<
" iy= "<<iy<<std::endl;
1900 img_start = point_trans*4*dnr_points_2d + (iflip%
nr_nomirror_flips)*dnr_points_2d;
1906 tmpr = Fimg_trans[img_start + 2*ii] - ctf[ii] * ref_scale *
Fref[ref_start + 2*ii];
1907 tmpi = Fimg_trans[img_start + 2*ii+1] - ctf[ii] * ref_scale * Fref[ref_start + 2*ii+1];
1908 diff += (tmpr * tmpr + tmpi * tmpi) * inv_sigma2[ii];
1915 tmpr = Fimg_trans[img_start + 2*ii] - ref_scale *
Fref[ref_start + 2*ii];
1916 tmpi = Fimg_trans[img_start + 2*ii+1] - ref_scale * Fref[ref_start + 2*ii+1];
1917 diff += (tmpr * tmpr + tmpi * tmpi) * inv_sigma2[ii];
1923 aux = diff - mindiff2;
1930 if (aux > 100. || aux < 0)
1933 weight = exp(-aux) * pdf;
1935 dAkij(Mweight, itrans, refno, irot) = weight;
1949 aux = (
df + diff) / (
df + mindiff2);
1950 weight = pow(aux,
df2) * pdf;
1953 weight2 = (
df + ldim ) / (
df + diff);
1955 dAkij(Mweight, itrans, refno, irot) = weight * weight2;
1956 refw2[refno] += weight * weight2;
1957 sum_refw2 += weight * weight2;
1961 refw[refno] += weight;
1963 refw_mirror[refno] += weight;
1976 scale_numer += Fimg_trans[img_start + 2*ii]
1977 * ctf[ii] *
Fref[ref_start + 2*ii];
1978 scale_numer += Fimg_trans[img_start + 2*ii+1]
1979 * ctf[ii] * Fref[ref_start + 2*ii+1];
1980 scale_denom += ctf[ii] * Fref[ref_start + 2*ii]
1981 * ctf[ii] * Fref[ref_start + 2*ii];
1982 scale_denom += ctf[ii] * Fref[ref_start + 2*ii+1]
1983 * ctf[ii] * Fref[ref_start + 2*ii+1];
1990 scale_numer += Fimg_trans[img_start + 2*ii]
1991 *
Fref[ref_start + 2*ii];
1992 scale_numer += Fimg_trans[img_start + 2*ii+1]
1993 * Fref[ref_start + 2*ii+1];
1994 scale_denom += Fref[ref_start + 2*ii]
1995 * Fref[ref_start + 2*ii];
1996 scale_denom += Fref[ref_start + 2*ii+1]
1997 * Fref[ref_start + 2*ii+1];
2000 wsum_sc +=
dAkij(Mweight, itrans, refno, irot) * scale_numer;
2001 wsum_sc2 +=
dAkij(Mweight, itrans, refno, irot) * scale_denom;
2003 if (weight > maxweight)
2007 maxweight2 = weight2;
2011 opt_itrans = itrans;
2012 opt_irefmir = irefmir;
2016 dAkij(Mweight, itrans, refno, irot) = 0.;
2026 opt_offsets(0) = opt_offsets_ref[2*opt_irefmir] +
Vtrans[opt_itrans](0);
2027 opt_offsets(1) = opt_offsets_ref[2*opt_irefmir+1] +
Vtrans[opt_itrans](1);
2035 std::vector<std::vector<double> > res_diff;
2036 res_diff.resize(
hdim);
2038 point_trans =
A2D_ELEM(Moffsets, (
int)opt_offsets(1), (
int)opt_offsets(0));
2040 point_trans =
A2D_ELEM(Moffsets_mirror, (
int)opt_offsets(1), (
int)opt_offsets(0));
2048 double inv_sqrt_sigma2 = 1. /
sqrt(0.5*sigma2[ii]);
2051 dAi(diff,2*ii) = (Fimg_trans[img_start + 2*ii] -
2052 ctf[ii] * ref_scale *
Fref[ref_start + 2*ii]) * inv_sqrt_sigma2;
2053 dAi(diff,2*ii+1) = (Fimg_trans[img_start + 2*ii+1] -
2054 ctf[ii] * ref_scale *
Fref[ref_start + 2*ii+1]) * inv_sqrt_sigma2;
2058 dAi(diff,2*ii) = (Fimg_trans[img_start + 2*ii] -
2059 ref_scale *
Fref[ref_start + 2*ii])* inv_sqrt_sigma2;
2060 dAi(diff,2*ii+1) = (Fimg_trans[img_start + 2*ii+1] -
2061 ref_scale *
Fref[ref_start + 2*ii+1]) * inv_sqrt_sigma2;
2065 res_diff[ires].push_back(
dAi(diff,2*ii));
2066 res_diff[ires].push_back(
dAi(diff,2*ii+1));
2092 for (
size_t ires = 0; ires <
hdim; ires++)
2094 for (
size_t j=0;
j<res_diff[ires].size();
j++)
2095 resolhist[ires].insert_value(res_diff[ires][
j]);
2104 if (write_histograms)
2111 FileName fn_hist = fn_img +
".hist";
2112 std::ofstream fh_hist;
2113 fh_hist.open(fn_hist.c_str(), std::ios::out);
2120 fh_hist << val<<
" "<<
A1D_ELEM(hist,
i)<<
" ";
2134 opt_scale = wsum_sc / wsum_sc2;
2139 std::ostringstream msg;
2140 msg <<
"Division by zero: nr_nomirror_flips == 0";
2141 throw std::runtime_error(msg.str());
2148 if (!
limit_rot || pdf_directions[refno] > 0.)
2150 sumw[refno] += (refw[refno] + refw_mirror[refno]) / sum_refw;
2151 sumw2[refno] += refw2[refno] / sum_refw;
2154 sumwsc[refno] += refw2[refno] * opt_scale / sum_refw;
2155 sumwsc2[refno] += refw2[refno] * opt_scale * opt_scale / sum_refw;
2159 sumwsc[refno] += (refw[refno] + refw_mirror[refno]) * opt_scale / sum_refw;
2160 sumwsc2[refno] += (refw[refno] + refw_mirror[refno]) * (opt_scale * opt_scale) / sum_refw;
2162 sumw_mirror[refno] += refw_mirror[refno] / sum_refw;
2168 irot = iflip * nr_psi + ipsi;
2173 ix =
ROUND(opt_offsets_ref[2*irefmir] +
Vtrans[itrans](0));
2174 iy =
ROUND(opt_offsets_ref[2*irefmir+1] +
Vtrans[itrans](1));
2178 point_trans =
A2D_ELEM(Moffsets, iy, ix);
2180 point_trans =
A2D_ELEM(Moffsets_mirror, iy, ix);
2181 weight =
dAkij(Mweight, itrans, refno, irot);
2186 img_start = point_trans*4*dnr_points_2d + (iflip%
nr_nomirror_flips)*dnr_points_2d;
2193 * opt_scale * decctf[ii] * Fimg_trans[img_start + 2*ii];
2195 * opt_scale * decctf[ii] * Fimg_trans[img_start + 2*ii+1];
2197 * opt_scale * Fimg_trans[img_start + 2*ii];
2199 * opt_scale * Fimg_trans[img_start + 2*ii+1];
2200 tmpr = Fimg_trans[img_start + 2*ii]
2201 - ctf[ii] * opt_scale *
Fref[wsum_start + 2*ii];
2202 tmpi = Fimg_trans[img_start + 2*ii+1]
2203 - ctf[ii] * opt_scale * Fref[wsum_start + 2*ii+1];
2204 Mwsum_sigma2_local[ii] += weight * (tmpr * tmpr + tmpi * tmpi);
2212 * opt_scale * Fimg_trans[img_start + 2*ii];
2214 * opt_scale * Fimg_trans[img_start + 2*ii+1];
2215 tmpr = Fimg_trans[img_start + 2*ii]
2216 - opt_scale *
Fref[wsum_start + 2*ii];
2217 tmpi = Fimg_trans[img_start + 2*ii+1]
2218 - opt_scale * Fref[wsum_start + 2*ii+1];
2219 Mwsum_sigma2_local[ii] += weight * (tmpr * tmpr + tmpi * tmpi);
2234 if (!
limit_rot || pdf_directions[refno] > 0.)
2236 for (
int imir = 0; imir < nr_mir; imir++)
2242 for (
int iflip = iflip_start; iflip < iflip_stop; iflip++)
2246 irot = iflip * nr_psi + ipsi;
2249 weight =
dAkij(Mweight, itrans, refno, irot);
2250 if (weight > Pmax_refmir[irefmir])
2252 Pmax_refmir[irefmir] = weight;
2253 opt_itrans = itrans;
2258 opt_offsets_ref[2*irefmir] +=
Vtrans[opt_itrans](0);
2259 opt_offsets_ref[2*irefmir+1] +=
Vtrans[opt_itrans](1);
2265 fracweight = maxweight / sum_refw;
2266 sum_refw2 /= sum_refw;
2284 +
df2 *
log( 1. + ( mindiff2 /
df ))
2295 delete []inv_sigma2;
2313 std::vector<double> allref_offsets, pdf_directions(
model.
n_ref);
2317 float old_phi = -999., old_theta = -999.;
2318 double opt_psi, opt_flip, opt_scale, maxcorr, maxweight2;
2319 double w2, KSprob = 0.;
2320 size_t opt_refno, opt_ipsi, opt_iflip;
2337 sumw2.assign(n, 0.);
2349 std::vector<double> dum;
2370 std::stringstream ss;
2375 size_t id =
img_id[imgno];
2390 img().setXmippOrigin();
2414 opt_scale, opt_refno, opt_psi, opt_ipsi, opt_iflip, opt_offsets,
2415 allref_offsets, pdf_directions,
2422 std::cerr<<
"sumw_defocus[focus]= "<<
sumw_defocus[focus]<<
" w2= "<<w2<<std::endl;
2445 if (-opt_psi > 360.)
2518 Ictf[refno].setWeight(
sumw[refno]);
2546 Ictf[refno].setWeight(0.);
2548 Ictf[refno]().initZeros();
2556 std::vector<double> wsum_scale(nr_classes), sumw_scale(nr_classes);
2563 iclass =
ROUND(temp.quot);
2564 wsum_scale[iclass] +=
sumwsc[refno];
2565 sumw_scale[iclass] +=
sumw[refno];
2570 iclass =
ROUND(temp.quot);
2571 if (sumw_scale[iclass]>0.)
2573 refs_avgscale[refno] = wsum_scale[iclass]/sumw_scale[iclass];
2593 if (
sumw[refno] > 0.)
2624 radialAverage(Maux, center, rmean_sigma2, radial_count,
true);
2627 for (
size_t irr = 0; irr <= maxIrr; irr++)
2653 Maux *=
sumw[refno];
2657 radialAverage(Maux, center, rmean_signal2, radial_count,
true);
2687 double weight = img.
weight();
2688 double rot = 0., tilt = 0.,
psi = 0.;
2691 size_t count =
ROUND(weight);
2729 auto iterMDo = MDo.
begin();
2730 auto iterMDref =
MDref.
ids().begin();
2732 for (
int refno = 0; refno < model.
n_ref; ++refno, ++iterMDo, ++iterMDref)
2754 fn_tmp.
compose(refno + 1, fn_base_cref);
2758 fn_tmp =
FN_REF(fn_base, refno + 1);
2759 Itmp = model.
Iref[refno];
2792 for (
int ref = 1; ref <=
n; ++ref)
2811 std::ofstream fh_hist;
2813 fn_tmp = fn_base +
"avg.hist.log";
2814 fh_hist.open(fn_tmp.c_str(), std::ios::out);
2830 fn_tmp = fn_base +
"_resol.hist";
2831 fh_hist.open(fn_tmp.c_str(), std::ios::out);
2838 fh_hist << val<<
" ";
2843 for (
size_t ires = 0; ires <
hdim; ires++)
2885 size_t first,
size_t last)
2888 for (
size_t imgno = first; imgno <= last; imgno++)
2891 size_t id =
img_id[imgno];
2901 double psi = -
dAij(data, index, 2);
double cdf_gauss(double x)
void FourierTransformHalf(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
bool do_student
IN DEVELOPMENT.
std::vector< double > Fwsum_imgs
virtual void addPartialDocfileData(const MultidimArray< double > &data, size_t first, size_t last)
Add docfiledata to docfile.
std::vector< Matrix1D< double > > Vtrans
void init_progress_bar(long total)
std::vector< size_t > img_id
void min(Image< double > &op1, const Image< double > &op2)
#define A2D_ELEM(v, i, j)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void generateInitialReferences()
Generate initial references from random subset averages.
std::vector< MultidimArray< double > > Vctf
double getDoubleParam(const char *param, int arg=0)
__host__ __device__ float2 floor(const float2 v)
double cdf_tstudent(int k, double t)
#define SIGNIFICANT_WEIGHT_LOW
#define REPORT_ERROR(nerr, ErrormMsg)
#define FOR_ALL_LOCAL_IMAGES()
void ksone(double data[], int n, double(*func)(double), double *d, double *prob)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m)
void Euler_direction(double alpha, double beta, double gamma, Matrix1D< double > &v)
virtual void show() const
void maximization()
Update all model parameters (maximization step)
MultidimArray< double > Mr2
void sqrt(Image< double > &op)
MultidimArray< size_t > Mresol_int
double DeltafV
Defocus in V (in Angstroms). Negative values are underfocused.
void setValue(const MDObject &object) override
void groupCTFMetaData(const MetaDataDb &imgMd, MetaDataDb &ctfMd, std::vector< MDLabel > &groupbyLabels)
void rotateReference(std::vector< double > &out)
Fill vector of matrices with all rotations of reference.
void defineParams()
Params definition.
size_t divide_equally(size_t N, size_t size, size_t rank, size_t &first, size_t &last)
void initProgress(size_t total, size_t stepBin=60)
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
#define FN_REF(base, refno)
virtual void defineAdditionalParams(XmippProgram *prog, const char *sectionLine)
#define MULTIDIM_ARRAY(v)
void compose(const String &str, const size_t no, const String &ext="")
std::vector< double > sumw_defocus
void preselectDirections(float &phi, float &theta, std::vector< double > &pdf_directions)
#define FOR_ALL_DEFOCUS_GROUPS()
std::vector< int > pointer_2d
void expectation()
Integrate over all experimental images.
void iteration()
One iteration of the process.
double weight(const size_t n=0) const
int iter_write_histograms
virtual void defineAdditionalParams(XmippProgram *prog, const char *sectionLine)
#define FN_CLASSES_MD(base)
void init(double min_val, double max_val, int n_steps)
size_t current_highres_limit
#define rotate(a, i, j, k, l)
void estimateInitialNoiseSpectra()
#define FOR_ALL_DIGITAL_FREQS()
#define FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
std::vector< double > sumwsc2
std::vector< int > pointer_j
#define FOR_ALL_LIMITED_TRANSLATIONS()
double DeltafU
Global gain. By default, 1.
bool enable_CTF
Enable CTF part.
bool do_norm
Re-normalize internally.
#define MAT_ELEM(m, i, j)
void CenterFFT(MultidimArray< T > &v, bool forward)
void insert_value(double val)
void Half2Whole(const MultidimArray< std::complex< double > > &in, MultidimArray< std::complex< double > > &out, size_t oridim)
int argc
Original command line arguments.
std::vector< double > refs_avgscale
MultidimArray< double > spectral_signal
void index2val(double i, double &v) const
void log(Image< double > &op)
const char * getParameter(int argc, const char **argv, const char *param, const char *option)
const char * getParam(const char *param, int arg=0)
void compute_hist(const MultidimArrayGeneric &array, Histogram1D &hist, int no_steps)
bool do_kstest
Statistical analysis of the noise distributions.
void writeImage(Image< double > &img, const FileName &fn, MDRow &row)
double lcdf_tstudent_mlf6(double t)
std::vector< Image< double > > Ictf
std::vector< double > imgs_oldtheta
void readFromMetadataRow(const MetaData &MD, size_t id, bool disable_if_not_K=true)
void setValue(const MDObject &object) override
virtual void defineBasicParams(XmippProgram *prog)
#define FN_ITER_BASE(iter)
std::vector< Matrix2D< double > > F
std::vector< MultidimArray< double > > wsum_Mref
double lcdf_tstudent_mlf1(double t)
#define FOR_ALL_ROTATIONS()
void endIteration()
Redefine endIteration to update Wiener filters.
FileName getIterExtraPath(const FileName &fn_root, int iter, bool makePath)
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.
void progress_bar(long rlen)
void getEulerAngles(double &rot, double &tilt, double &psi, const size_t n=0) const
bool do_student_sigma_trick
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
double Tm
Sampling rate (A/pixel)
Error related to numerical calculation.
MultidimArray< double > docfiledata
virtual void produceSideInfo2()
#define FN_CLASS_IMAGES_MD(base, ref)
void radialAverage(const MultidimArray< double > &VolFourierMag, const MultidimArray< double > &V, MultidimArray< double > &radial_mean)
#define dAkij(V, k, i, j)
std::vector< std::vector< double > > imgs_offsets
#define DIRECT_MULTIDIM_ELEM(v, n)
std::vector< double > alpha_k
void readParams()
Read arguments from command line.
int verbose
Verbosity level.
double lcdf_tstudent_mlf3(double t)
std::vector< double > imgs_oldphi
void FourierTransform(const MultidimArray< double > &in, MultidimArray< std::complex< double > > &out)
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
std::vector< MultidimArray< double > > Vdec
double tstudent1D(double x, double df, double sigma, double mu)
void writeNoiseFile(const FileName &fn_base, int ifocus)
Write noise estimation per resolution.
virtual void defineHiddenParams(XmippProgram *prog)
std::vector< double > mirror_fraction
std::vector< double > sumwsc
void setCurrentSamplingRates(double current_probres_limit)
Vary in-plane and translational sampling rates with resolution.
void generateCTF(const MultidimArray< T1 > &sample_image, MultidimArray< T2 > &CTF, double Ts=-1)
double lcdf_tstudent_mlf9(double t)
double K
Global gain. By default, 1.
void setValue(MDLabel label, const T &d, bool addLabel=true)
void setProgress(size_t value=0)
std::vector< double > sumw
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
std::vector< double > Fref
virtual void defineBasicParams(XmippProgram *prog)
Some redefinitions of the basic and additional params.
#define FN_IMAGES_MD(base)
std::vector< double > sumw_mirror
std::vector< Image< double > > Iref
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
void getFTfromVector(const std::vector< double > &in, const int start_point, MultidimArray< std::complex< double > > &out, bool only_real=false)
std::vector< double > sumw2
void fourierTranslate2D(const std::vector< double > &in, MultidimArray< double > &trans, std::vector< double > &out, int point_start=0)
std::vector< double > Fwsum_ctfimgs
void produceSideInfo()
Produce Side information.
double psi(const double x)
std::vector< std::vector< double > > Mwsum_sigma2
String formatString(const char *format,...)
#define FN_VSIG(base, ifocus, ext)
#define realWRAP(x, x0, xF)
MultidimArray< double > P_phi
double lcdf_tstudent_mlf30(double t)
bool checkParam(const char *param)
double Q0
Factor for the importance of the Amplitude contrast.
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.
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
std::vector< int > pointer_i
void initZeros(const MultidimArray< T1 > &op)
std::vector< int > count_defocus
int getIntParam(const char *param, int arg=0)
void updateWienerFilters(const MultidimArray< double > &spectral_signal, std::vector< double > &sumw_defocus, int iter)
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
Incorrect value received.
std::vector< Image< double > > Iold
std::vector< double > conv
virtual void writeOutputFiles(const ModelML2D &model, OutputType outputType)
Write out reference images, selfile and logfile.
#define intWRAP(x, x0, xF)
ProgMLF2D(int nr_vols=0, int rank=0, int size=1)
virtual void endIteration()
Do some task at the end of iteration.
void addParamsLine(const String &line)
void InverseFourierTransformHalf(const MultidimArray< std::complex< double > > &in, MultidimArray< double > &out, int oridim)
void appendFTtoVector(const MultidimArray< std::complex< double > > &Fin, std::vector< double > &out)
virtual void produceSideInfo()
Setup lots of stuff.
std::vector< double > imgs_scale
void generateCommandLine(const std::string &command_line, int &argcp, char **&argvp, char *©)
std::vector< MultidimArray< double > > wsum_ctfMref
double gaussian1D(double x, double sigma, double mu)
std::vector< MultidimArray< double > > Vsig