33 addUsageLine(
"Sharpen a volume by applying a negative B-factor");
34 addUsageLine(
"+The high-resolution features are enhanced, thereby correcting ");
35 addUsageLine(
"+the envelope functions of the microscope, detector etc. Three ");
38 addUsageLine(
"+1. An automated mode based on methodology developed by [[http://www.ncbi.nlm.nih.gov/pubmed/14568533][Rosenthal and Henderson]]");
40 addUsageLine(
"+2. Based on the fall-off in a reference map (possibly obtained using xmipp_volume_from_pdb)");
45 addParamsLine(
" --auto : Use automated B-factor fit in flat Wilson region");
46 addParamsLine(
" : Note: do not use the automated mode for maps with resolutions");
48 addParamsLine(
" or --ref <fn_ref> <mode=bfactorref> : Fit B-factor according to the reference ");
51 addParamsLine(
" allpoints : Adjust power spectrum to reference");
52 addParamsLine(
" or --adhoc <B> : Use a user-provided (negative) B-factor");
54 addParamsLine(
" --sampling <float> : Pixel size of the input volume (in Angstroms/pixel) ");
55 addParamsLine(
" --maxres <float> : High-resolution limit for B-factor correction (in Ang.) ");
56 addParamsLine(
" -o <filename> : Output file Name with corrected volume ");
57 addParamsLine(
" [--fit_minres+ <f=15>] : Low-resolution limit (in Ang.) for fit in --auto or --ref ");
58 addParamsLine(
" [--fit_maxres+ <f=-1>] : High-resolution limit (in Ang.) for fit in --auto or --ref,");
60 addParamsLine(
" [--fsc+ <fscFile=\"\">] : FSC file produced by xmipp_resolution_fsc");
61 addExampleLine(
"xmipp_correct_bfactor -i volume.vol -o correctedVolume.vol --auto --sampling 1.4 --maxres 10");
65 addExampleLine(
"plot \"correctedVolume.vol.guinier\" using 1:2 title \"log F\" with line, \"correctedVolume.vol.guinier\" using 1:4 title \"Corrected log F\"with line");
101 std::cout <<
"Pixel size : " <<
sampling_rate <<
" Angstrom" << std::endl;
102 std::cout <<
"Maximum resolution: " <<
apply_maxres <<
" Angstrom" << std::endl;
105 std::cerr<<
"Fit within resolutions: " <<
fit_minres <<
" - " <<
fit_maxres <<
" Angstrom" << std::endl;
109 std::cout <<
"Adjust B-factor according to reference "<<
fn_ref<<std::endl;
113 std::cout <<
"Apply ad-hoc B-factor of "<<
adhocB <<
" squared Angstroms" << std::endl;
117 std::cout <<
"Use automated B-factor fit (Rosenthal and Henderson, 2003) " << std::endl;
120 std::cout <<
"Use signal-to-noise weight based on "<<
fn_fsc <<std::endl;
127 vol().checkDimensionWithDebug(3,__FILE__,__LINE__);
147 std::vector<fit_point2D> &guinier)
158 double z2=
ZZ(f)*
ZZ(f);
162 double y2z2=z2+
YY(f)*
YY(f);
166 double R2=y2z2+
XX(f)*
XX(f);
178 for (
size_t i = 0;
i <
XSIZE(radial_count);
i++)
183 onepoint.
x = 1. / (res * res);
186 onepoint.
y =
log ( lnF(
i) / radial_count(
i) );
201 guinier.push_back(onepoint);
254 for (
size_t objId : md.
ids())
257 double mysnr =
XMIPP_MAX( (2*fsc) / (1+fsc), 0.);
258 snr.push_back(
sqrt(mysnr) );
264 std::vector<double> &snr)
292 double R = f.
module() * isampling_rate;
295 dAkij(FT1,
k,
i,
j) *= exp( -0.25* bfactor * R * R);
301 std::vector<fit_point2D> &guinier_diff)
312 size_t idx=lround(R*
xsize);
313 if (idx < guinier_diff.size() && guinier_diff[idx].w > 0.)
315 dAkij(FT1,
k,
i,
j) *= exp( -guinier_diff[idx].
y );
321 std::vector<fit_point2D> &guinierin,
322 std::vector<fit_point2D> &guinierweighted,
323 std::vector<fit_point2D> &guiniernew,
325 std::vector<fit_point2D> &guinierref)
328 fh.open(fn_guinier.c_str(), std::ios::out);
332 fh <<
"# 1/d^2 lnF weighted-lnF corrected-lnF (model)\n";
333 for (
size_t i = 0;
i < guinierin.size();
i++)
335 fh << (guinierin[
i]).
x <<
" " << (guinierin[
i]).y <<
" " << (guinierweighted[
i]).
y <<
" " <<(guiniernew[i]).y;
337 fh <<
" " << intercept;
340 fh <<
" " << (guinierref[
i]).
y + intercept;
353 double intercept = 0.;
354 std::vector<fit_point2D> guinierin, guinierweighted, guinierref, guinierdiff;
355 std::vector<double> snr;
370 guinierweighted=guinierin;
375 std::cerr<<
" Fitted slope= "<<slope<<
" intercept= "<<intercept<<std::endl;
382 ref().setXmippOrigin();
385 guinierdiff = guinierweighted;
386 for (
size_t i = 0;
i < guinierdiff.size();
i++)
388 (guinierdiff[
i]).
y -= (guinierref[
i]).y;
393 std::cerr<<
" Fitted slope= "<<slope<<
" intercept= "<<intercept<<std::endl;
401 std::cerr<<
"Adjust power spectrum to that of reference "<<std::endl;
407 std::cerr<<
"Applying B-factor of "<<
adhocB <<
" squared Angstroms"<<std::endl;
414 std::vector<fit_point2D> guiniernew;
416 write_guinierfile(fn_guinier, guinierin, guinierweighted, guiniernew, intercept, guinierref);
void bfactor_correction(MultidimArray< double > &m1, const FileName &fn_guinier)
void processImage(const FileName &fnImg, const FileName &fnImgOut, const MDRow &rowIn, MDRow &rowOut)
void write_guinierfile(const FileName &fn_guinier, std::vector< fit_point2D > &guinierin, std::vector< fit_point2D > &guinierweighted, std::vector< fit_point2D > &guiniernew, double intercept, std::vector< fit_point2D > &guinierref)
double getDoubleParam(const char *param, int arg=0)
#define REPORT_ERROR(nerr, ErrormMsg)
Just for debugging, situation that can't happens.
void sqrt(Image< double > &op)
Couldn't write to file.
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)
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
void addSeeAlsoLine(const char *seeAlso)
ProgVolumeCorrectBfactor()
void apply_allpoints(MultidimArray< std::complex< double > > &FT1, std::vector< fit_point2D > &guinier_diff)
void make_guinier_plot(MultidimArray< std::complex< double > > &m1, std::vector< fit_point2D > &guinier)
void log(Image< double > &op)
const char * getParam(const char *param, int arg=0)
void least_squares_line_fit(const std::vector< fit_point2D > &IN_points, double &line_a, double &line_b)
#define dAkij(V, k, i, j)
void addExampleLine(const char *example, bool verbatim=true)
double y
y coordinate (assumed to be a function of x)
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
void apply_snr_weights(MultidimArray< std::complex< double > > &FT1, std::vector< double > &snr)
double w
Weight of the point in the Least-Squares problem.
void get_snr_weights(std::vector< double > &snr)
void apply_bfactor(MultidimArray< std::complex< double > > &FT1, double bfactor)
bool checkParam(const char *param)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void addUsageLine(const char *line, bool verbatim=false)
void initZeros(const MultidimArray< T1 > &op)
void addParamsLine(const String &line)