#include <averager.h>
Inheritance diagram for EMAN::CtfCAutoAverager:


Public Member Functions | |
| CtfCAutoAverager () | |
| void | add_image (EMData *image) |
| To add an image to the Averager. | |
| EMData * | finish () |
| Finish up the averaging and return the result. | |
| string | get_name () const |
| Get the Averager's name. | |
| string | get_desc () const |
| void | set_params (const Dict &new_params) |
| Set the Averager parameters using a key/value dictionary. | |
Static Public Member Functions | |
| Averager * | NEW () |
Static Public Attributes | |
| const string | NAME = "ctf.auto" |
Protected Attributes | |
| EMData * | snrsum |
| int | nimg |
The Weiner filter is estimated directly from the data.
Definition at line 471 of file averager.h.
|
|
Definition at line 699 of file averager.cpp. 00700 : nimg(0) 00701 { 00702 00703 }
|
|
|
To add an image to the Averager. This image will be averaged in this function.
Implements EMAN::Averager. Definition at line 706 of file averager.cpp. References EMAN::EMData::add(), b, EMAN::Ctf::bfactor, EMAN::Ctf::compute_2d_complex(), copy(), EMAN::EMData::copy_head(), EMAN::EMData::do_fft(), EMAN::EMData::get_attr(), EMAN::EMData::get_data(), get_name(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMUtil::is_same_size(), LOGERR, nimg, EMAN::EMData::process_inplace(), snrsum, and EMAN::EMData::to_zero(). 00707 {
00708 if (!image) {
00709 return;
00710 }
00711
00712
00713
00714 EMData *fft=image->do_fft();
00715
00716 if (nimg >= 1 && !EMUtil::is_same_size(fft, result)) {
00717 LOGERR("%s Averager can only process images of the same size", get_name().c_str());
00718 return;
00719 }
00720
00721 nimg++;
00722 if (nimg == 1) {
00723 result = fft->copy_head();
00724 result->to_zero();
00725 }
00726
00727 Ctf *ctf = (Ctf *)image->get_attr("ctf");
00728 float b=ctf->bfactor;
00729 ctf->bfactor=0; // NO B-FACTOR CORRECTION !
00730
00731 EMData *snr = result -> copy();
00732 ctf->compute_2d_complex(snr,Ctf::CTF_SNR);
00733 EMData *ctfi = result-> copy();
00734 ctf->compute_2d_complex(ctfi,Ctf::CTF_AMP);
00735
00736 ctf->bfactor=b; // return to its original value
00737
00738 float *outd = result->get_data();
00739 float *ind = fft->get_data();
00740 float *snrd = snr->get_data();
00741 float *ctfd = ctfi->get_data();
00742
00743 size_t sz=snr->get_xsize()*snr->get_ysize();
00744 for (size_t i = 0; i < sz; i+=2) {
00745 if (snrd[i]<0) snrd[i]=0;
00746 ctfd[i]=fabs(ctfd[i]);
00747
00748 // This limits the maximum possible amplification in CTF correction to 10x
00749 if (ctfd[i]<.05) ctfd[i]=0.05f;
00750 // {
00751 // if (snrd[i]<=0) ctfd[i]=.05f;
00752 // else ctfd[i]=snrd[i]*10.0f;
00753 // }
00754
00755 // SNR weight and CTF correction
00756 outd[i]+=ind[i]*snrd[i]/ctfd[i];
00757 outd[i+1]+=ind[i+1]*snrd[i]/ctfd[i];
00758 }
00759
00760 if (nimg==1) {
00761 snrsum=snr->copy_head();
00762 float *ssnrd=snrsum->get_data();
00763 // we're only using the real component, for Wiener filter we put 1.0 in R, but for just SNR weight we use 0
00764 for (size_t i = 0; i < sz; i+=2) { ssnrd[i]=0.0; ssnrd[i+1]=0.0; }
00765 }
00766 snr->process_inplace("math.absvalue");
00767 snrsum->add(*snr);
00768
00769 delete ctf;
00770 delete fft;
00771 delete snr;
00772 delete ctfi;
00773 }
|
|
|
Finish up the averaging and return the result.
Implements EMAN::Averager. Definition at line 775 of file averager.cpp. References EMAN::EMData::calc_radial_dist(), EMAN::EMData::do_ift(), EMAN::EMData::get_data(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), nimg, nx, ny, EMAN::EMData::set_attr(), snrsum, and EMAN::EMData::update(). 00776 {
00777 /* EMData *tmp=result->do_ift();
00778 tmp->write_image("ctfcw.hdf",0);
00779 delete tmp;
00780
00781 tmp=snrsum->do_ift();
00782 tmp->write_image("ctfcw.hdf",1);
00783 delete tmp;*/
00784
00785 // snrsum->write_image("snrsum.hdf",-1);
00786 //size_t sz=result->get_xsize()*result->get_ysize();
00787 int nx=result->get_xsize();
00788 int ny=result->get_ysize();
00789 float *snrsd=snrsum->get_data();
00790 float *outd=result->get_data();
00791
00792 int rm=(ny-2)*(ny-2)/4;
00793 for (int j=0; j<ny; j++) {
00794 for (int i=0; i<nx; i+=2) {
00795 size_t ii=i+j*nx;
00796 if ((j<ny/2 && i*i/4+j*j>rm) ||(j>=ny/2 && i*i/4+(ny-j)*(ny-j)>rm) || snrsd[ii]==0) { outd[ii]=outd[ii+1]=0; continue; }
00797 // we aren't wiener filtering, but if the total SNR is too low, we don't want TOO much exaggeration of noise
00798 if (snrsd[ii]<.05) {
00799 outd[ii]*=20.0; // 1/0.05
00800 outd[ii+1]*=20.0;
00801 }
00802 else {
00803 outd[ii]/=snrsd[ii]; // snrsd contains total SNR
00804 outd[ii+1]/=snrsd[ii];
00805 }
00806 }
00807 }
00808 result->update();
00809 result->set_attr("ptcl_repr",nimg);
00810 result->set_attr("ctf_snr_total",snrsum->calc_radial_dist(snrsum->get_ysize()/2,0,1,false));
00811 result->set_attr("ctf_wiener_filtered",0);
00812
00813 /* snrsum->write_image("snr.hdf",-1);
00814 result->write_image("avg.hdf",-1);*/
00815
00816 delete snrsum;
00817 EMData *ret=result->do_ift();
00818 delete result;
00819 result=NULL;
00820 return ret;
00821 }
|
|
|
Implements EMAN::Averager. Definition at line 484 of file averager.h. 00485 {
00486 return "Averaging with automatic CTF correction and SNR weight. No B-factor correction (as this is best done in 3-D). Does not require a structure factor, but only works with EMAN2's CTF model";
00487 }
|
|
|
Get the Averager's name. Each Averager is identified by a unique name.
Implements EMAN::Averager. Definition at line 479 of file averager.h. Referenced by add_image(). 00480 {
00481 return NAME;
00482 }
|
|
|
Definition at line 489 of file averager.h. 00490 {
00491 return new CtfCAutoAverager();
00492 }
|
|
|
Set the Averager parameters using a key/value dictionary.
Reimplemented from EMAN::Averager. Definition at line 494 of file averager.h. 00495 {
00496 params = new_params;
00497 // outfile = params["outfile"];
00498 }
|
|
|
Definition at line 53 of file averager.cpp. |
|
|
Definition at line 504 of file averager.h. Referenced by add_image(), and finish(). |
|
|
Definition at line 503 of file averager.h. Referenced by add_image(), and finish(). |
1.3.9.1