Xmipp  v3.23.11-Nereus
wiener2d.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: Javier Vargas (jvargas@cnb.csic.es)
4  * Authors: Jose Luis Vilas (jlvilas@cnb.csic.es)
5  *
6  * Spanish Research Council for Biotechnology, Madrid, Spain
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21  * 02111-1307 USA
22  *
23  * All comments concerning this program package may be sent to the
24  * e-mail address 'xmipp@cnb.csic.es'
25  ***************************************************************************/
26 
27 #include "wiener2d.h"
28 
29 
31 {
32  int paddimY;
33  paddimY = Ydim*pad;
34  int paddimX = Xdim*pad;
35  ctf.enable_CTF = true;
36  ctf.enable_CTFnoise = false;
37  ctf.produceSideInfo();
38 
41 
42  Mwien.resize(paddimY,paddimX);
43 
44  ctf.Tm = sampling_rate;
45 
46  if (isIsotropic)
47  {
48  double avgdef = (ctf.DeltafU + ctf.DeltafV)/2.;
49  ctf.DeltafU = avgdef;
50  ctf.DeltafV = avgdef;
51  }
52 
53  ctfIm.resize(1, 1, paddimY, paddimX,false);
54  //Esto puede estar mal. Cuidado con el sampling de la ctf!!!
55  if (correct_envelope)
56  ctf.generateCTF(paddimY, paddimX, ctfComplex);
57  else
58  ctf.generateCTFWithoutDamping(paddimY, paddimX, ctfComplex);
59 
60  if (phase_flipped)
61  {
63  dAij(ctfIm, i, j) = fabs(dAij(ctfComplex, i, j).real());
64  }
65  else
66  {
68  dAij(ctfIm, i, j) = dAij(ctfComplex, i, j).real();
69  }
70 
71  double result;
73  {
74  result = (DIRECT_N_YX_ELEM (ctfIm, 0, i, j));
75  dAij(Mwien,i,j) = (result *result);
76  }
77 
78  // Add Wiener constant
79  if (wiener_constant < 0.)
80  {
81 
82  // Use Grigorieff's default for Wiener filter constant: 10% of average over all Mwien terms
83  // Grigorieff JSB 157(1) (2006), pp 117-125
84  double valueW = 0.1*Mwien.computeAvg();
86  {
87  dAij(Mwien,i,j) += valueW;
88  dAij(Mwien,i,j) = dAij(ctfIm, i, j)/dAij(Mwien, i, j);
89  }
90  }
91  else
92  {
94  {
95  dAij(Mwien,i,j) += wiener_constant;
96  dAij(Mwien,i,j) = dAij(ctfIm, i, j)/dAij(Mwien, i, j);
97  }
98  }
99 }
100 
102 {
103  ptrImg.setXmippOrigin();
104  Ydim = YSIZE(ptrImg);
105  Xdim = XSIZE(ptrImg);
106  int paddimY = Ydim*pad;
107  int paddimX = Xdim*pad;
108 
109  wienerFilter(Mwien, ctf);
110 
111  if (paddimX >= Xdim)
112  {
113  // pad real-space image
114  int x0 = FIRST_XMIPP_INDEX(paddimX);
115  int xF = LAST_XMIPP_INDEX(paddimX);
116  int y0 = FIRST_XMIPP_INDEX(paddimY);
117  int yF = LAST_XMIPP_INDEX(paddimY);
118  ptrImg.selfWindow(y0, x0, yF, xF);
119  }
120 
122  transformer.FourierTransform(ptrImg, Faux);
124  {
125  dAij(Faux,i,j) *= dAij(Mwien,i,j);
126  }
127 
128  transformer.inverseFourierTransform(Faux, ptrImg);
129 
130 
131  if (paddimX >= Xdim)
132  {
133  // de-pad real-space image
134  int x0 = FIRST_XMIPP_INDEX(Xdim);
135  int y0 = FIRST_XMIPP_INDEX(Ydim);
136  int xF = LAST_XMIPP_INDEX(Xdim);
137  int yF = LAST_XMIPP_INDEX(Ydim);
138  ptrImg.selfWindow(y0, x0, yF, xF);
139  }
140 }
141 
142 
143 void Wiener2D::applyWienerFilter(const FileName &fnImg, const FileName &fnImgOut, const MDRow &rowIn, MDRow &rowOut)
144 {
145  rowOut = rowIn;
146 
147  img.read(fnImg);
148  ctf.readFromMdRow(rowIn);
149  ctf.phase_shift = (ctf.phase_shift*PI)/180;
150 
151  MultidimArray<double> &ptrImg =img();
152  applyWienerFilter(ptrImg, ctf);
153 
154  img.write(fnImgOut);
155  rowOut.setValue(MDL_IMAGE, fnImgOut);
156 }
void applyWienerFilter(MultidimArray< double > &ptrImg, CTFDescription &ctf)
Definition: wiener2d.cpp:101
CTFDescription ctf
Definition: wiener2d.h:64
void selfWindow(int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T init_value=0)
#define YSIZE(v)
size_t Ydim
Definition: wiener2d.h:66
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m)
#define dAij(M, i, j)
size_t Xdim
Definition: wiener2d.h:66
void wienerFilter(MultidimArray< double > &Mwien, CTFDescription &ctf)
Definition: wiener2d.cpp:30
bool isIsotropic
Definition: wiener2d.h:44
double DeltafV
Defocus in V (in Angstroms). Negative values are underfocused.
Definition: ctf.h:830
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)
double phase_shift
Definition: ctf.h:305
#define i
MultidimArray< double > Mwien
Definition: wiener2d.h:68
double DeltafU
Global gain. By default, 1.
Definition: ctf.h:828
bool enable_CTF
Enable CTF part.
Definition: ctf.h:275
MultidimArray< std::complex< double > > Faux
Definition: wiener2d.h:69
#define y0
double pad
Definition: wiener2d.h:42
#define x0
#define XSIZE(v)
double Tm
Sampling rate (A/pixel)
Definition: ctf.h:240
void readFromMdRow(const MDRow &row, bool disable_if_not_K=true)
Definition: ctf.cpp:1172
#define xF
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define j
void generateCTF(const MultidimArray< T1 > &sample_image, MultidimArray< T2 > &CTF, double Ts=-1)
Definition: ctf.h:1194
double wiener_constant
Wiener filter constant.
Definition: wiener2d.h:49
void setValue(MDLabel label, const T &d, bool addLabel=true)
#define FIRST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:439
void produceSideInfo()
Produce Side information.
Definition: ctf.cpp:1392
bool phase_flipped
Definition: wiener2d.h:39
#define DIRECT_N_YX_ELEM(v, l, i, j)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
double computeAvg() const
bool enable_CTFnoise
Enable CTFnoise part.
Definition: ctf.h:273
#define LAST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:448
#define PI
Definition: tools.h:43
double sampling_rate
Sampling rate.
Definition: wiener2d.h:52
#define yF
FourierTransformer transformer
Definition: wiener2d.h:70
bool correct_envelope
Definition: wiener2d.h:46
Name of an image (std::string)
Image< double > img
Definition: wiener2d.h:62
void generateCTFWithoutDamping(int Ydim, int Xdim, MultidimArray< T > &CTF, double Ts=-1)
Definition: ctf.h:1245