#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 | |
static Aligner * | NEW () |
Static Public Attributes | |
static const string | NAME = "frm2d" |
Definition at line 1722 of file aligner.h.
virtual EMData* EMAN::FRM2DAligner::align | ( | EMData * | this_img, | |
EMData * | to_img | |||
) | const [inline, virtual] |
Implements EMAN::Aligner.
Definition at line 1728 of file aligner.h.
References align().
01729 { 01730 return align(this_img, to_img, "frc", Dict()); 01731 }
EMData * FRM2DAligner::align | ( | EMData * | this_img, | |
EMData * | to_img, | |||
const string & | cmp_name, | |||
const Dict & | cmp_params = Dict() | |||
) | const [virtual] |
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.
this_img | The image to be compared. | |
to_img | 'this_img" is aligned with 'to_img'. | |
cmp_name | The comparison method to compare the two images. | |
cmp_params | The parameter dictionary for comparison method. |
Implements EMAN::Aligner.
Definition at line 3063 of file aligner.cpp.
References EMAN::Util::calc_best_fft_size(), EMAN::EMData::calc_center_of_mass(), EMAN::EMData::copy(), EMAN::EMData::do_fft(), frm_2d_Align(), EMAN::EMData::get_data(), ImageDimensionException, EMAN::EMUtil::is_same_size(), nx, EMAN::EMData::oneDfftPolar(), EMAN::EMData::set_complex(), EMAN::EMData::set_ri(), EMAN::EMData::set_size(), sqrt(), EMAN::EMData::translate(), and EMAN::EMData::unwrap_largerR().
Referenced by align().
03065 { 03066 if (!this_img) { 03067 return 0; 03068 } 03069 if (to && !EMUtil::is_same_size(this_img, to)) 03070 throw ImageDimensionException("Images must be the same size to perform translational alignment"); 03071 03072 int nx=this_img->get_xsize(); 03073 int ny=this_img->get_ysize(); 03074 int size =(int)floor(M_PI*ny/4.0); 03075 size =Util::calc_best_fft_size(size);//ming bestfftsize(size); 03076 int MAXR=ny/2; 03077 //int MAXR=size; 03078 EMData *this_temp=this_img->copy(); // ming change avg to to 03079 FloatPoint com_test,com_test1; 03080 com_test=this_temp->calc_center_of_mass();//ming add 03081 float com_this_x=com_test[0]; 03082 float com_this_y=com_test[1]; 03083 delete this_temp; 03084 03085 03086 EMData *that_temp=to->copy(); 03087 com_test1=that_temp->calc_center_of_mass(); 03088 float com_with_x=com_test1[0]; 03089 float com_with_y=com_test1[1]; 03090 delete that_temp; 03091 03092 EMData *avg_frm=to->copy(); 03093 float dx,dy; 03094 //float dx=-(com_with_x-nx/2); //ming 03095 //float dy=-(com_with_y-ny/2); //ming 03096 //avg_frm->translate(dx,dy,0.0); 03097 EMData *withpcs=avg_frm->unwrap_largerR(0,MAXR,size,float(MAXR)); // ming, something wrong inside this subroutine 03098 //EMData *withpcs=avg_frm->unwrap(-1,-1,-1,0,0,1); 03099 EMData *withpcsfft=withpcs->oneDfftPolar(size, float(MAXR), float(MAXR)); 03100 03101 float *sampl_fft=withpcsfft->get_data(); // 03102 delete avg_frm; 03103 delete withpcs; 03104 03105 int bw=size/2; 03106 unsigned long ind1=0, ind2=0, ind3=0, ind4=0, ind41=0; 03107 float pi2=2.0*M_PI, r2; 03108 03109 EMData *data_in=new EMData; 03110 data_in->set_complex(true); 03111 data_in->set_ri(1); 03112 data_in->set_size(2*size,1,1); 03113 float * comp_in=data_in->get_data(); 03114 03115 int p_max=3; 03116 float *frm2dhhat=0; 03117 03118 if( (frm2dhhat=(float *)malloc((p_max+1)*(size+2)*bw*size*2* sizeof(float)))==NULL){ 03119 cout <<"Error in allocating memory 13. \n"; 03120 exit(1); 03121 } 03122 //printf("p_max=%d\n",p_max); 03123 float *sb=0, *cb=0; // sin(beta) and cos(beta) for get h_hat, 300>size 03124 if((sb=new float[size])==NULL||(cb=new float[size])==NULL) { 03125 cout <<"can't allocate more memory, terminating. \n"; 03126 exit(1); 03127 } 03128 for(int i=0;i<size;++i) { // beta sampling, to calculate beta' and r' 03129 float beta=i*M_PI/bw; 03130 sb[i]=sin(beta); 03131 cb[i]=cos(beta); 03132 } 03133 03134 for(int p=0; p<=p_max; ++p){ 03135 ind1=p*size*bw; 03136 float pp2=(float)(p*p); 03137 for(int n=0;n<bw;++n){ /* loop for n */ 03138 ind2=ind1+n; 03139 for(int r=0;r<=MAXR;++r) { 03140 ind3=(ind2+r*bw)*size; 03141 float rr2=(float)(r*r); 03142 float rp2=(float)(r*p); 03143 for(int i=0;i<size;++i){ // beta sampling, to get beta' and r' 03144 r2=std::sqrt((float)(rr2+pp2-2.0*rp2*cb[i])); // r2->r' 03145 int r1=(int)floor(r2+0.5f); // for computing gn(r') 03146 if(r1>MAXR){ 03147 comp_in[2*i]=0.0f; 03148 comp_in[2*i+1]=0.0f; 03149 } 03150 else{ 03151 float gn_r=sampl_fft[2*n+r1*(size+2)]; // real part of gn(r') 03152 float gn_i=sampl_fft[2*n+1+r1*(size+2)]; // imaginary part of gn(r') 03153 float sb2, cb2, cn, sn; 03154 if(n!=0){ 03155 if(r2 != 0.0){ 03156 sb2=r*sb[i]/r2; 03157 cb2=(r*cb[i]-p)/r2; 03158 } 03159 else{ 03160 sb2=0.0; 03161 cb2=1.0; 03162 } 03163 if(sb2>1.0) sb2= 1.0f; 03164 if(sb2<-1.0)sb2=-1.0f; 03165 if(cb2>1.0) cb2= 1.0f; 03166 if(cb2<-1.0)cb2=-1.0f; 03167 float beta2=atan2(sb2,cb2); 03168 if(beta2<0.0) beta2+=pi2; 03169 float nb2=n*beta2; 03170 cn=cos(nb2); 03171 sn=sin(nb2); 03172 } 03173 else{ 03174 cn=1.0f; sn=0.0f; 03175 } 03176 comp_in[2*i]=cn*gn_r-sn*gn_i; 03177 comp_in[2*i+1]=-(cn*gn_i+sn*gn_r); 03178 } 03179 } 03180 EMData *data_out; 03181 data_out=data_in->do_fft(); 03182 float * comp_out=data_out->get_data(); 03183 for(int m=0;m<size;m++){ // store hat{h(n,r,p)}(m) 03184 ind4=(ind3+m)*2; 03185 ind41=ind4+1; 03186 frm2dhhat[ind4]=comp_out[2*m]; 03187 frm2dhhat[ind41]=comp_out[2*m+1]; 03188 } 03189 delete data_out; 03190 } 03191 } 03192 } 03193 03194 delete[] sb; 03195 delete[] cb; 03196 delete data_in; 03197 delete withpcsfft; 03198 03199 float dot_frm0=0.0f, dot_frm1=0.0f; 03200 EMData *da_nFlip=0, *da_yFlip=0, *dr_frm=0; 03201 //dr_frm=this_img->copy(); 03202 for (int iFlip=0;iFlip<=1;++iFlip){ 03203 if (iFlip==0){dr_frm=this_img->copy(); da_nFlip=this_img->copy();} 03204 else {dr_frm=this_img->copy(); da_yFlip=this_img->copy();} 03205 if(iFlip==1) {com_this_x=nx-com_this_x; } //ming // image mirror about Y axis, so y keeps the same 03206 03207 dx=-(com_this_x-nx/2); //ming 03208 dy=-(com_this_y-ny/2); //ming 03209 dr_frm->translate(dx,dy,0.0); // this 03210 EMData *selfpcs = dr_frm->unwrap_largerR(0,MAXR,size, (float)MAXR); 03211 //EMData *selfpcs=dr_frm->unwrap(-1,-1,-1,0,0,1); 03212 EMData *selfpcsfft = selfpcs->oneDfftPolar(size, (float)MAXR, (float)MAXR); 03213 delete selfpcs; 03214 delete dr_frm; 03215 if(iFlip==0) 03216 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); 03217 else 03218 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); 03219 delete selfpcsfft; 03220 } 03221 03222 delete[] frm2dhhat; 03223 if(dot_frm0 <=dot_frm1) { 03224 #ifdef DEBUG 03225 printf("best_corre=%f, no flip\n",dot_frm0); 03226 #endif 03227 delete da_yFlip; 03228 return da_nFlip; 03229 } 03230 else { 03231 #ifdef DEBUG 03232 printf("best_corre=%f, flipped\n",dot_frm1); 03233 #endif 03234 delete da_nFlip; 03235 return da_yFlip; 03236 } 03237 }
string EMAN::FRM2DAligner::get_desc | ( | ) | const [inline, virtual] |
Implements EMAN::Aligner.
Definition at line 1738 of file aligner.h.
01739 { 01740 return "FRM2D uses two rotational parameters and one translational parameter"; 01741 }
string EMAN::FRM2DAligner::get_name | ( | ) | const [inline, virtual] |
virtual TypeDict EMAN::FRM2DAligner::get_param_types | ( | ) | const [inline, virtual] |
Implements EMAN::Aligner.
Definition at line 1747 of file aligner.h.
References EMAN::EMObject::INT, and EMAN::TypeDict::put().
01748 { 01749 TypeDict d; 01750 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."); 01751 01752 //d.put("p_max", EMObject::FLOAT,"p_max is"); 01753 return d; 01754 }
static Aligner* EMAN::FRM2DAligner::NEW | ( | ) | [inline, static] |
const string FRM2DAligner::NAME = "frm2d" [static] |