void initialise() { // Get the MDs for both untilted and tilted particles MDu.read(fn_unt); MDt.read(fn_til); if (MDu.numberOfObjects() != MDt.numberOfObjects()) REPORT_ERROR("Tiltpair plot ERROR: untilted and tilted STAR files have unequal number of entries."); // Get the symmetry point group int pgGroup, pgOrder; SL.isSymmetryGroup(fn_sym, pgGroup, pgOrder); SL.read_sym_file(fn_sym); // Make postscript header fh_eps.open(fn_eps.c_str(), std::ios::out); if (!fh_eps) REPORT_ERROR("Tiltpair plot ERROR: Cannot open " + fn_eps + " for output"); fh_eps << "%%!PS-Adobe-2.0\n"; fh_eps << "%% Creator: Tilt pair analysis \n"; fh_eps << "%% Pages: 1\n"; fh_eps << "0 setgray\n"; fh_eps << "0.1 setlinewidth\n"; // Draw circles on postscript: 250pixels=plot_max_tilt fh_eps << "300 400 83 0 360 arc closepath stroke\n"; fh_eps << "300 400 167 0 360 arc closepath stroke\n"; fh_eps << "300 400 250 0 360 arc closepath stroke\n"; fh_eps << "300 150 newpath moveto 300 650 lineto stroke\n"; fh_eps << "50 400 newpath moveto 550 400 lineto stroke\n"; }
void run() { EMDLabel label1, label2, label3; MD1.read(fn1); MD2.read(fn2); label1 = EMDL::str2Label(fn_label1); label2 = (fn_label2 == "") ? EMDL_UNDEFINED : EMDL::str2Label(fn_label2); label3 = (fn_label3 == "") ? EMDL_UNDEFINED : EMDL::str2Label(fn_label3); compareMetaDataTable(MD1, MD2, MDboth, MDonly1, MDonly2, label1, eps, label2, label3); std::cout << MDboth.numberOfObjects() << " entries occur in both input STAR files." << std::endl; std::cout << MDonly1.numberOfObjects() << " entries occur only in the 1st input STAR file." << std::endl; std::cout << MDonly2.numberOfObjects() << " entries occur only in the 2nd input STAR file." << std::endl; if (fn_both != "") MDboth.write(fn_both); if (fn_only1 != "") MDonly1.write(fn_only1); if (fn_only2 != "") MDonly2.write(fn_only2); }
void correctMapForMTF(MultidimArray<Complex >& FT, int ori_size, FileName& fn_mtf) { MetaDataTable MDmtf; if (!fn_mtf.isStarFile()) { REPORT_ERROR("correctMapForMTF ERROR: input MTF file is not a STAR file."); } MDmtf.read(fn_mtf); MultidimArray<double> mtf_resol, mtf_value; mtf_resol.resize(MDmtf.numberOfObjects()); mtf_value.resize(mtf_resol); int i = 0; FOR_ALL_OBJECTS_IN_METADATA_TABLE(MDmtf) { MDmtf.getValue(EMDL_RESOLUTION_INVPIXEL, DIRECT_A1D_ELEM(mtf_resol, i)); // resolution needs to be given in 1/pix MDmtf.getValue(EMDL_POSTPROCESS_MTF_VALUE, DIRECT_A1D_ELEM(mtf_value, i)); if (DIRECT_A1D_ELEM(mtf_value, i) < 1e-10) { std::cerr << " i= " << i << " mtf_value[i]= " << DIRECT_A1D_ELEM(mtf_value, i) << std::endl; REPORT_ERROR("Postprocessing::sharpenMap ERROR: zero or negative values encountered in MTF curve!"); } i++; } double xsize = (double)ori_size; FOR_ALL_ELEMENTS_IN_FFTW_TRANSFORM(FT) { int r2 = kp * kp + ip * ip + jp * jp; double res = sqrt((double)r2) / xsize; // get resolution in 1/pixel if (res < 0.5) { // Find the suitable MTF value int i_0 = 0; for (int ii = 0; ii < XSIZE(mtf_resol); ii++) { if (DIRECT_A1D_ELEM(mtf_resol, ii) > res) { break; } i_0 = ii; } // linear interpolation: y = y_0 + (y_1 - y_0)*(x-x_0)/(x1_x0) double mtf; double x_0 = DIRECT_A1D_ELEM(mtf_resol, i_0); if (i_0 == MULTIDIM_SIZE(mtf_resol) - 1 || i_0 == 0) // check boundaries of the array { mtf = DIRECT_A1D_ELEM(mtf_value, i_0); } else { double x_1 = DIRECT_A1D_ELEM(mtf_resol, i_0 + 1); double y_0 = DIRECT_A1D_ELEM(mtf_value, i_0); double y_1 = DIRECT_A1D_ELEM(mtf_value, i_0 + 1); mtf = y_0 + (y_1 - y_0) * (res - x_0) / (x_1 - x_0); } // Divide Fourier component by the MTF DIRECT_A3D_ELEM(FT, k, i, j) /= mtf; } } }
void Postprocessing::divideByMtf(MultidimArray<Complex > &FT) { if (fn_mtf != "") { if (verb > 0) { std::cout << "== Dividing map by the MTF of the detector ..." << std::endl; std::cout.width(35); std::cout << std::left <<" + mtf STAR-file: "; std::cout << fn_mtf << std::endl; } MetaDataTable MDmtf; if (!fn_mtf.isStarFile()) REPORT_ERROR("Postprocessing::divideByMtf ERROR: input MTF file is not a STAR file."); MDmtf.read(fn_mtf); MultidimArray<DOUBLE> mtf_resol, mtf_value; mtf_resol.resize(MDmtf.numberOfObjects()); mtf_value.resize(mtf_resol); int i =0; FOR_ALL_OBJECTS_IN_METADATA_TABLE(MDmtf) { MDmtf.getValue(EMDL_RESOLUTION_INVPIXEL, DIRECT_A1D_ELEM(mtf_resol, i) ); // resolution needs to be given in 1/pix MDmtf.getValue(EMDL_POSTPROCESS_MTF_VALUE, DIRECT_A1D_ELEM(mtf_value, i) ); if (DIRECT_A1D_ELEM(mtf_value, i) < 1e-10) { std::cerr << " i= " << i << " mtf_value[i]= " << DIRECT_A1D_ELEM(mtf_value, i) << std::endl; REPORT_ERROR("Postprocessing::sharpenMap ERROR: zero or negative values encountered in MTF curve!"); } i++; } DOUBLE xsize = (DOUBLE)XSIZE(I1()); FOR_ALL_ELEMENTS_IN_FFTW_TRANSFORM(FT) { int r2 = kp * kp + ip * ip + jp * jp; DOUBLE res = sqrt((DOUBLE)r2)/xsize; // get resolution in 1/pixel if (res < 0.5 ) { // Find the suitable MTF value int i_0 = 0; for (int ii = 0; ii < XSIZE(mtf_resol); ii++) { if (DIRECT_A1D_ELEM(mtf_resol, ii) > res) break; i_0 = ii; } // linear interpolation: y = y_0 + (y_1 - y_0)*(x-x_0)/(x1_x0) DOUBLE mtf; DOUBLE x_0 = DIRECT_A1D_ELEM(mtf_resol, i_0); if (i_0 == MULTIDIM_SIZE(mtf_resol) - 1 || i_0 == 0) // check boundaries of the array mtf = DIRECT_A1D_ELEM(mtf_value, i_0); else { DOUBLE x_1 = DIRECT_A1D_ELEM(mtf_resol, i_0 + 1); DOUBLE y_0 = DIRECT_A1D_ELEM(mtf_value, i_0); DOUBLE y_1 = DIRECT_A1D_ELEM(mtf_value, i_0 + 1); mtf = y_0 + (y_1 - y_0)*(res - x_0)/(x_1 - x_0); } // Divide Fourier component by the MTF DIRECT_A3D_ELEM(FT, k, i, j) /= mtf; } } } }