37 #define SYMMETRIZE_PROJECTIONS 47 addUsageLine(
"Reconstruct with Alternative Direction Method of Multipliers");
48 addParamsLine(
" -i <metadata>: Input metadata with images and angles");
49 addParamsLine(
" [--oroot <root=reconstruct_admm>]: Rootname for output files");
50 addParamsLine(
" [--Htb <volume=\"\">]: Filename of the Htb volume");
51 addParamsLine(
" [--HtKH <volume=\"\">]: Filename of the HtKH volume");
52 addParamsLine(
" [--firstVolume <volume=\"\">]: Filename of the first initial guess");
53 addParamsLine(
" [--kernel <shape=KaiserBessel>]: Kernel shape");
55 addParamsLine(
" KaiserBessel: Kaiser-Bessel function as kernel");
56 addParamsLine(
" [--downsamplingV <Ti=1>]: Downsampling factor for volume");
57 addParamsLine(
" [--downsamplingI <Tp=1>]: Downsampling factor for projections");
58 addParamsLine(
" [--dontUseWeights]: Do not use weights if available in the input metadata");
59 addParamsLine(
" [--dontUseCTF]: Do not use CTF if available in the input metadata");
60 addParamsLine(
" : If the CTF information is used, the algorithm assumes that the input images are phase flipped");
61 addParamsLine(
" [--sampling <Ts=1>]: The sampling rate is only used to correct for the CTF");
62 addParamsLine(
" [--mu <mu=1e-4>]: Augmented Lagrange penalty");
63 addParamsLine(
" [--lambda <lambda=1e-5>]: Total variation parameter");
64 addParamsLine(
" [--lambda1 <lambda1=1e-7>]: Tikhonov parameter");
65 addParamsLine(
" [--cgiter <N=3>]: Conjugate Gradient iterations");
69 addParamsLine(
" [--saveIntermediate]: Save Htb and HtKH volumes for posterior calls");
112 #ifdef SYMMETRIZE_PROJECTIONS 115 double rot, tilt,
psi, newrot, newtilt, newpsi;
116 for (
auto& row :
mdIn)
121 mdSym.
addRow(dynamic_cast<MDRowVec&>(row));
122 for (
int isym = 0; isym <
SL.
symsNo(); isym++)
129 mdSym.
addRow(dynamic_cast<MDRowVec&>(row));
151 CHtb().setXmippOrigin();
167 Ck().setXmippOrigin();
181 kernelV().setXmippOrigin();
227 std::cout <<
"Running ADMM iterations ..." << std::endl;
245 size_t xdim, ydim, zdim, ndim;
247 CHtb().initZeros(xdim,xdim,xdim);
248 CHtb().setXmippOrigin();
251 double rot, tilt,
psi;
255 std::cerr <<
"Performing Htb ...\n";
261 geoParams.
wrap=xmipp_transformation::DONT_WRAP;
262 for (
size_t objId :
mdIn.
ids())
267 I().setXmippOrigin();
274 project(rot,tilt,psi,I(),
true,weight);
277 if (i%100==0 &&
rank==0)
284 #ifndef SYMMETRIZE_PROJECTIONS 322 double sx0=rzn1+ryn1;
323 double sy0=rzn2+ryn2;
330 double sx =
Ti*(sx0+rxn1);
331 double sy =
Ti*(sy0+rxn2);
347 for (
int ii=symin; ii<=symax; ii++) {
349 for (
int jj=sxmin; jj<=sxmax; jj++) {
355 for (
int ii=symin; ii<=symax; ii++) {
357 for (
int jj=sxmin; jj<=sxmax; jj++) {
374 std::cerr <<
"Calculating H'KH ...\n";
378 double rot, tilt,
psi, weight=1;
387 for (
size_t objId :
mdIn.
ids())
412 double r1_z=
k*
ZZ(
r1);
413 double r2_z=
k*
ZZ(r2);
414 for (
auto i=(kernelV.
yinit); i<=(kernelV.
yinit + kernelV.
ydim - 1); ++i)
416 double r1_yz=i*
YY(
r1)+r1_z;
417 double r2_yz=i*
YY(r2)+r2_z;
420 double r1_xyz=
j*
XX(
r1)+r1_yz;
421 double r2_xyz=
j*
XX(r2)+r2_yz;
429 if (i%100==0 &&
rank==0)
435 #ifndef SYMMETRIZE_PROJECTIONS 451 auto xdim_2=(double)(
XSIZE(L)/2);
452 double Kargument=2*
PI*xdim_2/
XSIZE(L);
457 double argument=Kargument*(
k+
i+
j);
590 double newd=r.
sum2();
613 Ck().threshold(
"below",0.,0.);
618 smallKernel3D/=
sqrt(smallKernel3D.
sum2());
631 if (k<k0 || k>kF || i<i0 || i>iF || j<j0 || j>jF)
637 for (
int kk=-
a; kk<=
a; ++kk)
638 for (
int ii=-
a; ii<=
a; ++ii)
639 for (
int jj=-
a; jj<=
a; ++jj)
643 for (
int kk=-
a; kk<=
a; ++kk)
644 for (
int ii=-
a; ii<=
a; ++ii)
645 for (
int jj=-
a; jj<=
a; ++jj)
690 projectionStep=_projectionStep;
693 size_t length=ceil(a/projectionStep)+1;
694 projectionProfile.initZeros(length);
699 double s=
i*projectionStep;
701 tmp=
sqrt(1.0 - tmp*tmp);
711 double r =
sqrt(u*u+v*v);
715 r = r/projectionStep ;
719 return p *
VEC_ELEM(projectionProfile,rmin) + (1-p) *
VEC_ELEM(projectionProfile,rmax);
725 autocorrStep=_autocorrStep;
726 size_t length=ceil(2.5*supp/autocorrStep)+1;
727 projectionAutocorrWithCTF.initZeros(2*length+1,2*length+1);
728 projectionAutocorrWithCTF.setXmippOrigin();
729 double isupp=1.0/supp;
733 double s=
sqrt(
i*
i+
j*
j)*autocorrStep;
737 tmp=
sqrt(1.0 - tmp*tmp);
742 transformer.FourierTransform(projectionAutocorrWithCTF,FourierProjectionAutocorr);
743 K=
MULTIDIM_SIZE(projectionAutocorrWithCTF)*autocorrStep*autocorrStep;
758 transformer.fFourier=FourierProjectionAutocorr;
759 transformer.inverseFourierTransform();
760 autocorrelation=projectionAutocorrWithCTF;
766 double dig2cont=1.0/
Ts;
768 auto xdim=(int)
XSIZE(projectionAutocorrWithCTF);
770 double ixdim=1.0/xdim;
771 double maxFreq=2*autocorrStep;
772 double maxFreq2=maxFreq*maxFreq;
774 memset(&
A2D_ELEM(transformer.fFourier,0,0),0,
MULTIDIM_SIZE(transformer.fFourier)*
sizeof(std::complex<double>));
775 for (
int i=((transformer.fFourier).yinit);
i<=((transformer.fFourier).yinit + (
int)(transformer.fFourier).ydim - 1); ++
i)
778 if (fabs(wy)>maxFreq)
782 for (
int j=((transformer.fFourier).xinit);
j<=((transformer.fFourier).xinit + (
int)(transformer.fFourier).xdim - 1); ++
j)
785 if (fabs(wx)>maxFreq)
788 if (wy2+wx2>maxFreq2)
796 transformer.inverseFourierTransform();
797 autocorrelationWithCTF=projectionAutocorrWithCTF;
798 CenterFFT(autocorrelationWithCTF,
false);
810 double supp2=supp*supp;
813 for (
int k=-supp;
k<=supp; ++
k)
816 for (
int i=-supp;
i<=supp; ++
i)
819 for (
int j=-supp;
j<=supp; ++
j)
826 double value=K*z*
bessi1(z);
829 case 'x': value*=
j;
break;
830 case 'y': value*=
i;
break;
831 case 'z': value*=
k;
break;
843 double supp2=supp*supp;
846 for (
int k=-supp;
k<=supp; ++
k)
849 for (
int i=-supp;
i<=supp; ++
i)
852 for (
int j=-supp;
j<=supp; ++
j)
859 double value=K*z*z*
bessi2(z);
void addGradientTerm(double mu, AdmmKernel &kernel, MultidimArray< double > &L, FourierTransformer &transformer, MultidimArray< std::complex< double > > &fourierKernelV, char direction)
void init_progress_bar(long total)
MultidimArray< std::complex< double > > fourierLx
MultidimArray< double > dx
#define A2D_ELEM(v, i, j)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
__device__ float bessi1(float x)
double getDoubleParam(const char *param, int arg=0)
void threshold(const String &type, T a, T b=0, MultidimArray< int > *mask=NULL)
MultidimArray< double > dz
__host__ __device__ float2 floor(const float2 v)
void getMatrices(int i, Matrix2D< double > &L, Matrix2D< double > &R, bool homogeneous=true) const
MultidimArray< double > uz
void addRegularizationTerms()
void Euler_angles2matrix(T alpha, T beta, T gamma, Matrix2D< T > &A, bool homogeneous)
void symmetrizeVolume(const SymList &SL, const MultidimArray< double > &V_in, MultidimArray< double > &V_out, int spline, bool wrap, bool do_outside_avg, bool sum, bool helical, bool dihedral, bool helicalDihedral, double rotHelical, double rotPhaseHelical, double zHelical, double heightFraction, const MultidimArray< double > *mask, int Cn)
double beta(const double a, const double b)
void sqrt(Image< double > &op)
double dotProduct(const MultidimArray< T > &op1)
double projectionValueAt(double u, double v)
int readSymmetryFile(FileName fn_sym, double accuracy=SYM_ACCURACY)
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 convolveKernelWithItself(double _autocorrStep)
MultidimArray< std::complex< double > > fourierLz
MultidimArray< double > ux
void Euler_apply_transf(const Matrix2D< double > &L, const Matrix2D< double > &R, double rot, double tilt, double psi, double &newrot, double &newtilt, double &newpsi)
int readApplyGeo(const FileName &name, const MDRow &row, const ApplyGeoParams ¶ms=DefaultApplyGeoParams)
void computeGradient(MultidimArray< double > &gradient, char direction, bool adjoint=false)
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
#define FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
static void defineParams(XmippProgram *program, int allowed_data_types=ALL_KINDS, const char *prefix=nullptr, const char *comment=nullptr, bool moreOptions=false)
T interpolatedElement2D(double x, double y, T outside_value=(T) 0) const
void CenterFFT(MultidimArray< T > &v, bool forward)
void threshold(double *phi, unsigned long nvox, double limit)
#define A3D_ELEM(V, k, i, j)
#define FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
#define FOR_ALL_ELEMENTS_IN_MATRIX1D(v)
void apply_mask(const MultidimArray< T > &I, MultidimArray< T > &result, T subs_val=0, bool apply_geo=false)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
const char * getParam(const char *param, int arg=0)
double getValueAt(bool show=false) const
Compute CTF at (U,V). Continuous frequencies.
void readFromMetadataRow(const MetaData &MD, size_t id, bool disable_if_not_K=true)
void applyCTFToKernelAutocorrelation(CTFDescription &ctf, double Ts, MultidimArray< double > &autocorrelationWithCTF)
MultidimArray< std::complex< double > > fourierLy
MultidimArray< double > ud
void progress_bar(long rlen)
MultidimArray< double > uy
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
FourierTransformer transformerL
__device__ float bessi2(float x)
#define DIRECT_MULTIDIM_ELEM(v, n)
void getKernelAutocorrelation(MultidimArray< double > &autocorrelation)
__host__ __device__ float length(float2 v)
MultidimArray< double > paddedx
void initializeKernel(double alpha, double a, double _projectionStep)
void convolutionFFT(MultidimArray< double > &img, MultidimArray< double > &kernel, MultidimArray< double > &result)
void readParams(XmippProgram *program)
void direction(const MultidimArray< double > &orMap, MultidimArray< double > &qualityMap, double lambda, int size, MultidimArray< double > &dirMap, int x, int y)
void precomputeValues(double X, double Y)
Precompute values for a given frequency.
MultidimArray< std::complex< double > > fourierKernelV
void project(double rot, double tilt, double psi, MultidimArray< double > &P, bool adjoint=false, double weight=1.)
MultidimArray< double > dy
double bessi2_5(double x)
void generate_mask(bool apply_geo=false)
void produceSideInfo()
Produce Side information.
double psi(const double x)
void applyLtFilter(MultidimArray< std::complex< double > > &fourierL, MultidimArray< double > &u, MultidimArray< double > &d)
bool checkParam(const char *param)
void applyConjugateGradient()
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void computeHtKH(MultidimArray< double > &kernelV)
void applyKernel3D(MultidimArray< double > &x, MultidimArray< double > &AtAx)
void addUsageLine(const char *line, bool verbatim=false)
void initZeros(const MultidimArray< T1 > &op)
FourierTransformer transformerPaddedx
virtual void shareVolume(MultidimArray< double > &V)
int getIntParam(const char *param, int arg=0)
void getRow(size_t i, Matrix1D< T > &v) const
void applyLFilter(MultidimArray< std::complex< double > > &fourierL, bool adjoint=false)
void addParamsLine(const String &line)
void computeKernel3D(MultidimArray< double > &kernel)
virtual void synchronize()
__host__ __device__ float dot(float2 a, float2 b)