#include <aligner.h>
Inheritance diagram for EMAN::FRM2DAligner:


Public Member Functions | |
| virtual EMData * | align (EMData *this_img, EMData *to_img, const string &cmp_name, const Dict &cmp_params=Dict()) const |
| To align 'this_img' with another image passed in through its parameters. | |
| virtual EMData * | align (EMData *this_img, EMData *to_img) const |
| string | get_name () const |
| Get the Aligner's name. | |
| string | get_desc () const |
| virtual TypeDict | get_param_types () const |
Static Public Member Functions | |
| Aligner * | NEW () |
Static Public Attributes | |
| const string | NAME = "frm2d" |
|
||||||||||||
|
Implements EMAN::Aligner. Definition at line 1252 of file aligner.h. References align(). 01253 {
01254 return align(this_img, to_img, "frc", Dict());
01255 }
|
|
||||||||||||||||||||
|
To align 'this_img' with another image passed in through its parameters. The alignment uses a user-given comparison method to compare the two images. If none is given, a default one is used.
Implements EMAN::Aligner. Definition at line 2446 of file aligner.cpp. References EMAN::EMData::calc_center_of_mass(), EMAN::EMData::copy(), EMAN::EMData::do_fft(), frm_2d_Align(), EMAN::EMData::get_data(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), ImageDimensionException, nx, ny, EMAN::EMData::oneDfftPolar(), EMAN::EMData::set_complex(), EMAN::EMData::set_ri(), EMAN::EMData::set_size(), sqrt(), EMAN::EMData::translate(), and EMAN::EMData::unwrap_largerR(). 02448 {
02449 if (!this_img) {
02450 return 0;
02451 }
02452 if (to && !EMUtil::is_same_size(this_img, to))
02453 throw ImageDimensionException("Images must be the same size to perform translational alignment");
02454
02455 int nx=this_img->get_xsize();
02456 int ny=this_img->get_ysize();
02457 int size =(int)floor(M_PI*ny/4.0);
02458 size =Util::calc_best_fft_size(size);//ming bestfftsize(size);
02459 int MAXR=ny/2;
02460 //int MAXR=size;
02461 EMData *this_temp=this_img->copy(); // ming change avg to to
02462 FloatPoint com_test,com_test1;
02463 com_test=this_temp->calc_center_of_mass();//ming add
02464 float com_this_x=com_test[0];
02465 float com_this_y=com_test[1];
02466 delete this_temp;
02467
02468
02469 EMData *that_temp=to->copy();
02470 com_test1=that_temp->calc_center_of_mass();
02471 float com_with_x=com_test1[0];
02472 float com_with_y=com_test1[1];
02473 delete that_temp;
02474
02475 EMData *avg_frm=to->copy();
02476 float dx,dy;
02477 //float dx=-(com_with_x-nx/2); //ming
02478 //float dy=-(com_with_y-ny/2); //ming
02479 //avg_frm->translate(dx,dy,0.0);
02480 EMData *withpcs=avg_frm->unwrap_largerR(0,MAXR,size,float(MAXR)); // ming, something wrong inside this subroutine
02481 //EMData *withpcs=avg_frm->unwrap(-1,-1,-1,0,0,1);
02482 EMData *withpcsfft=withpcs->oneDfftPolar(size, float(MAXR), float(MAXR));
02483
02484 float *sampl_fft=withpcsfft->get_data(); //
02485 delete avg_frm;
02486 delete withpcs;
02487
02488 int bw=size/2;
02489 unsigned long ind1=0, ind2=0, ind3=0, ind4=0, ind41=0;
02490 float pi2=2.0*M_PI, r2;
02491
02492 EMData *data_in=new EMData;
02493 data_in->set_complex(true);
02494 data_in->set_ri(1);
02495 data_in->set_size(2*size,1,1);
02496 float * comp_in=data_in->get_data();
02497
02498 int p_max=3;
02499 float *frm2dhhat=0;
02500
02501 if( (frm2dhhat=(float *)malloc((p_max+1)*(size+2)*bw*size*2* sizeof(float)))==NULL){
02502 cout <<"Error in allocating memory 13. \n";
02503 exit(1);
02504 }
02505 //printf("p_max=%d\n",p_max);
02506 float *sb=0, *cb=0; // sin(beta) and cos(beta) for get h_hat, 300>size
02507 if((sb=new float[size])==NULL||(cb=new float[size])==NULL) {
02508 cout <<"can't allocate more memory, terminating. \n";
02509 exit(1);
02510 }
02511 for(int i=0;i<size;++i) { // beta sampling, to calculate beta' and r'
02512 float beta=i*M_PI/bw;
02513 sb[i]=sin(beta);
02514 cb[i]=cos(beta);
02515 }
02516
02517 for(int p=0; p<=p_max; ++p){
02518 ind1=p*size*bw;
02519 float pp2=(float)(p*p);
02520 for(int n=0;n<bw;++n){ /* loop for n */
02521 ind2=ind1+n;
02522 for(int r=0;r<=MAXR;++r) {
02523 ind3=(ind2+r*bw)*size;
02524 float rr2=(float)(r*r);
02525 float rp2=(float)(r*p);
02526 for(int i=0;i<size;++i){ // beta sampling, to get beta' and r'
02527 r2=std::sqrt((float)(rr2+pp2-2.0*rp2*cb[i])); // r2->r'
02528 int r1=(int)floor(r2+0.5f); // for computing gn(r')
02529 if(r1>MAXR){
02530 comp_in[2*i]=0.0f;
02531 comp_in[2*i+1]=0.0f;
02532 }
02533 else{
02534 float gn_r=sampl_fft[2*n+r1*(size+2)]; // real part of gn(r')
02535 float gn_i=sampl_fft[2*n+1+r1*(size+2)]; // imaginary part of gn(r')
02536 float sb2, cb2, cn, sn;
02537 if(n!=0){
02538 if(r2 != 0.0){
02539 sb2=r*sb[i]/r2;
02540 cb2=(r*cb[i]-p)/r2;
02541 }
02542 else{
02543 sb2=0.0;
02544 cb2=1.0;
02545 }
02546 if(sb2>1.0) sb2= 1.0f;
02547 if(sb2<-1.0)sb2=-1.0f;
02548 if(cb2>1.0) cb2= 1.0f;
02549 if(cb2<-1.0)cb2=-1.0f;
02550 float beta2=atan2(sb2,cb2);
02551 if(beta2<0.0) beta2+=pi2;
02552 float nb2=n*beta2;
02553 cn=cos(nb2);
02554 sn=sin(nb2);
02555 }
02556 else{
02557 cn=1.0f; sn=0.0f;
02558 }
02559 comp_in[2*i]=cn*gn_r-sn*gn_i;
02560 comp_in[2*i+1]=-(cn*gn_i+sn*gn_r);
02561 }
02562 }
02563 EMData *data_out;
02564 data_out=data_in->do_fft();
02565 float * comp_out=data_out->get_data();
02566 for(int m=0;m<size;m++){ // store hat{h(n,r,p)}(m)
02567 ind4=(ind3+m)*2;
02568 ind41=ind4+1;
02569 frm2dhhat[ind4]=comp_out[2*m];
02570 frm2dhhat[ind41]=comp_out[2*m+1];
02571 }
02572 delete data_out;
02573 }
02574 }
02575 }
02576
02577 delete[] sb;
02578 delete[] cb;
02579 delete data_in;
02580 delete withpcsfft;
02581
02582 float dot_frm0=0.0f, dot_frm1=0.0f;
02583 EMData *da_nFlip=0, *da_yFlip=0, *dr_frm=0;
02584 //dr_frm=this_img->copy();
02585 for (int iFlip=0;iFlip<=1;++iFlip){
02586 if (iFlip==0){dr_frm=this_img->copy(); da_nFlip=this_img->copy();}
02587 else {dr_frm=this_img->copy(); da_yFlip=this_img->copy();}
02588 if(iFlip==1) {com_this_x=nx-com_this_x; } //ming // image mirror about Y axis, so y keeps the same
02589
02590 dx=-(com_this_x-nx/2); //ming
02591 dy=-(com_this_y-ny/2); //ming
02592 dr_frm->translate(dx,dy,0.0); // this
02593 EMData *selfpcs = dr_frm->unwrap_largerR(0,MAXR,size, (float)MAXR);
02594 //EMData *selfpcs=dr_frm->unwrap(-1,-1,-1,0,0,1);
02595 EMData *selfpcsfft = selfpcs->oneDfftPolar(size, (float)MAXR, (float)MAXR);
02596 delete selfpcs;
02597 delete dr_frm;
02598 if(iFlip==0)
02599 dot_frm0=frm_2d_Align(da_nFlip,to, frm2dhhat, selfpcsfft, p_max, size, com_this_x, com_this_y, com_with_x, com_with_y,cmp_name,cmp_params);
02600 else
02601 dot_frm1=frm_2d_Align(da_yFlip,to, frm2dhhat, selfpcsfft, p_max, size, com_this_x, com_this_y, com_with_x, com_with_y,cmp_name,cmp_params);
02602 delete selfpcsfft;
02603 }
02604
02605 delete[] frm2dhhat;
02606 if(dot_frm0 <=dot_frm1) {
02607 #ifdef DEBUG
02608 printf("best_corre=%f, no flip\n",dot_frm0);
02609 #endif
02610 delete da_yFlip;
02611 return da_nFlip;
02612 }
02613 else {
02614 #ifdef DEBUG
02615 printf("best_corre=%f, flipped\n",dot_frm1);
02616 #endif
02617 delete da_nFlip;
02618 return da_yFlip;
02619 }
02620 }
|
|
|
Implements EMAN::Aligner. Definition at line 1262 of file aligner.h. 01263 {
01264 return "FRM2D uses two rotational parameters and one translational parameter";
01265 }
|
|
|
Get the Aligner's name. Each Aligner is identified by a unique name.
Implements EMAN::Aligner. Definition at line 1257 of file aligner.h. 01258 {
01259 return NAME;
01260 }
|
|
|
Implements EMAN::Aligner. Definition at line 1271 of file aligner.h. References EMAN::TypeDict::put(). 01272 {
01273 TypeDict d;
01274 d.put("maxshift", EMObject::INT,"Maximum translation in pixels in any direction. If the solution yields a shift beyond this value in any direction, then the refinement is judged a failure and the original alignment is used as the solution.");
01275
01276 //d.put("p_max", EMObject::FLOAT,"p_max is");
01277 return d;
01278 }
|
|
|
Definition at line 1267 of file aligner.h. 01268 {
01269 return new FRM2DAligner();
01270 }
|
|
|
Definition at line 79 of file aligner.cpp. |
1.3.9.1