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


Public Member Functions | |
| CtfCWautoAverager () | |
| 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 = "ctfw.auto" |
Protected Attributes | |
| EMData * | snrsum |
| int | nimg |
The Weiner filter is estimated directly from the data.
Definition at line 510 of file averager.h.
|
|
Definition at line 580 of file averager.cpp. 00581 : nimg(0) 00582 { 00583 00584 }
|
|
|
To add an image to the Averager. This image will be averaged in this function.
Implements EMAN::Averager. Definition at line 587 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(). 00588 {
00589 if (!image) {
00590 return;
00591 }
00592
00593
00594
00595 EMData *fft=image->do_fft();
00596
00597 if (nimg >= 1 && !EMUtil::is_same_size(fft, result)) {
00598 LOGERR("%s Averager can only process images of the same size", get_name().c_str());
00599 return;
00600 }
00601
00602 nimg++;
00603 if (nimg == 1) {
00604 result = fft->copy_head();
00605 result->to_zero();
00606 }
00607
00608 Ctf *ctf = (Ctf *)image->get_attr("ctf");
00609 //string cc=ctf->to_string();
00610 //FILE *out=fopen("ctf.txt","a");
00611 //fprintf(out,"%s\n",cc.c_str());
00612 //fclose(out);
00613 float b=ctf->bfactor;
00614 ctf->bfactor=100.0; // FIXME - this is a temporary fixed B-factor which does a (very) little sharpening
00615
00616 // if (nimg==1) unlink("snr.hdf");
00617
00618 EMData *snr = result -> copy();
00619 ctf->compute_2d_complex(snr,Ctf::CTF_SNR);
00620 // snr->write_image("snr.hdf",-1);
00621 EMData *ctfi = result-> copy();
00622 ctf->compute_2d_complex(ctfi,Ctf::CTF_AMP);
00623
00624 ctf->bfactor=b; // return to its original value
00625
00626 float *outd = result->get_data();
00627 float *ind = fft->get_data();
00628 float *snrd = snr->get_data();
00629 float *ctfd = ctfi->get_data();
00630
00631 size_t sz=snr->get_xsize()*snr->get_ysize();
00632 for (size_t i = 0; i < sz; i+=2) {
00633 if (snrd[i]<0) snrd[i]=0;
00634 ctfd[i]=fabs(ctfd[i]);
00635 if (ctfd[i]<.05) ctfd[i]=0.05f;
00636 // {
00637 // if (snrd[i]<=0) ctfd[i]=.05f;
00638 // else ctfd[i]=snrd[i]*10.0f;
00639 // }
00640 outd[i]+=ind[i]*snrd[i]/ctfd[i];
00641 outd[i+1]+=ind[i+1]*snrd[i]/ctfd[i];
00642 }
00643
00644 if (nimg==1) {
00645 snrsum=snr->copy_head();
00646 float *ssnrd=snrsum->get_data();
00647 // we're only using the real component, and we need to start with 1.0
00648 for (size_t i = 0; i < sz; i+=2) { ssnrd[i]=1.0; ssnrd[i+1]=0.0; }
00649 }
00650 // snr->write_image("snr.hdf",-1);
00651 snr->process_inplace("math.absvalue");
00652 snrsum->add(*snr);
00653
00654 delete ctf;
00655 delete fft;
00656 delete snr;
00657 delete ctfi;
00658 }
|
|
|
Finish up the averaging and return the result.
Implements EMAN::Averager. Definition at line 660 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(). 00661 {
00662 /* EMData *tmp=result->do_ift();
00663 tmp->write_image("ctfcw.hdf",0);
00664 delete tmp;
00665
00666 tmp=snrsum->do_ift();
00667 tmp->write_image("ctfcw.hdf",1);
00668 delete tmp;*/
00669
00670 //snrsum->write_image("snrsum.hdf",-1);
00671 //size_t sz=result->get_xsize()*result->get_ysize();
00672 int nx=result->get_xsize();
00673 int ny=result->get_ysize();
00674 float *snrsd=snrsum->get_data();
00675 float *outd=result->get_data();
00676
00677 int rm=(ny-2)*(ny-2)/4;
00678 for (int j=0; j<ny; j++) {
00679 for (int i=0; i<nx; i+=2) {
00680 size_t ii=i+j*nx;
00681 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; }
00682 outd[ii]/=snrsd[ii]; // snrsd contains total SNR
00683 outd[ii+1]/=snrsd[ii];
00684 }
00685 }
00686
00687 result->update();
00688 result->set_attr("ptcl_repr",nimg);
00689 result->set_attr("ctf_snr_total",snrsum->calc_radial_dist(snrsum->get_ysize()/2,0,1,false));
00690 result->set_attr("ctf_wiener_filtered",1);
00691
00692 delete snrsum;
00693 EMData *ret=result->do_ift();
00694 delete result;
00695 result=NULL;
00696 return ret;
00697 }
|
|
|
Implements EMAN::Averager. Definition at line 523 of file averager.h. 00524 {
00525 return "Averaging with autmatic CTF correction. Does not require a structure factor, but only works with EMAN2's CTF model";
00526 }
|
|
|
Get the Averager's name. Each Averager is identified by a unique name.
Implements EMAN::Averager. Definition at line 518 of file averager.h. Referenced by add_image(). 00519 {
00520 return NAME;
00521 }
|
|
|
Definition at line 528 of file averager.h. 00529 {
00530 return new CtfCWautoAverager();
00531 }
|
|
|
Set the Averager parameters using a key/value dictionary.
Reimplemented from EMAN::Averager. Definition at line 533 of file averager.h. 00534 {
00535 params = new_params;
00536 // outfile = params["outfile"];
00537 }
|
|
|
Definition at line 52 of file averager.cpp. |
|
|
Definition at line 543 of file averager.h. Referenced by add_image(), and finish(). |
|
|
Definition at line 542 of file averager.h. Referenced by add_image(), and finish(). |
1.3.9.1