Xmipp  v3.23.11-Nereus
Classes | Public Member Functions | Public Attributes | List of all members
ProgSubtomoSubtraction Class Reference

#include <subtomo_subtraction.h>

Inheritance diagram for ProgSubtomoSubtraction:
Inheritance graph
[legend]
Collaboration diagram for ProgSubtomoSubtraction:
Collaboration graph
[legend]

Classes

struct  Angles
 

Public Member Functions

void POCSmask (const MultidimArray< double > &, MultidimArray< double > &)
 Processing methods. More...
 
void POCSnonnegative (MultidimArray< double > &)
 
void POCSFourierAmplitude (const MultidimArray< double > &, MultidimArray< std::complex< double >> &, double)
 
void POCSFourierAmplitudeRadAvg (MultidimArray< std::complex< double >> &, double, const MultidimArray< double > &, int, int, int)
 
void POCSMinMax (MultidimArray< double > &, double, double)
 
void POCSFourierPhase (const MultidimArray< std::complex< double >> &, MultidimArray< std::complex< double >> &)
 
void extractPhase (MultidimArray< std::complex< double >> &) const
 
void computeEnergy (MultidimArray< double > &, const MultidimArray< double > &) const
 
void centerFFTMagnitude (MultidimArray< double > &, MultidimArray< std::complex< double >> &, MultidimArray< double > &) const
 
void radialAverage (const MultidimArray< double > &, const MultidimArray< double > &, MultidimArray< double > &)
 
MultidimArray< double > computeRadQuotient (const MultidimArray< double > &, const MultidimArray< double > &, const MultidimArray< double > &, const MultidimArray< double > &)
 
void createFilter (FourierFilter &, double)
 
Image< double > subtraction (Image< double >, Image< double > &, const MultidimArray< double > &, const FileName &, const FileName &, FourierFilter &, double)
 
MultidimArray< double > computeMagnitude (MultidimArray< double > &)
 
MultidimArray< double > createMask (const Image< double > &, const FileName &, const FileName &)
 
void filterMask (MultidimArray< double > &) const
 
MultidimArray< std::complex< double > > computePhase (MultidimArray< double > &)
 
MultidimArray< double > getSubtractionMask (const FileName &, MultidimArray< double >)
 
 ProgSubtomoSubtraction ()
 Empty constructor. More...
 
void readParams () override
 Read argument from command line. More...
 
void show () const override
 Show. More...
 
void defineParams () override
 Define parameters. More...
 
void readParticle (const MDRow &rowIn)
 Read and write methods. More...
 
void writeParticle (MDRow &rowOut, FileName, Image< double > &)
 
void preProcess () override
 MPI methods. More...
 
void processImage (const FileName &fnImg, const FileName &fnImgOut, const MDRow &rowIn, MDRow &rowOut) override
 
void postProcess () override
 
- Public Member Functions inherited from XmippMetadataProgram
MetaDatagetInputMd ()
 
MetaDataVecgetOutputMd ()
 
 XmippMetadataProgram ()
 Empty constructor. More...
 
virtual int tryRead (int argc, const char **argv, bool reportErrors=true)
 
virtual void init ()
 
virtual void setup (MetaData *md, const FileName &o="", const FileName &oroot="", bool applyGeo=false, MDLabel label=MDL_IMAGE)
 
virtual ~XmippMetadataProgram ()
 
void setMode (WriteModeMetaData _mode)
 
void setupRowOut (const FileName &fnImgIn, const MDRow &rowIn, const FileName &fnImgOut, MDRow &rowOut) const
 Prepare rowout. More...
 
virtual void wait ()
 Wait for the distributor to finish. More...
 
virtual void checkPoint ()
 For very long programs, it may be needed to write checkpoints. More...
 
virtual void run ()
 Run over all images. More...
 
- Public Member Functions inherited from XmippProgram
const char * getParam (const char *param, int arg=0)
 
const char * getParam (const char *param, const char *subparam, int arg=0)
 
int getIntParam (const char *param, int arg=0)
 
int getIntParam (const char *param, const char *subparam, int arg=0)
 
double getDoubleParam (const char *param, int arg=0)
 
double getDoubleParam (const char *param, const char *subparam, int arg=0)
 
float getFloatParam (const char *param, int arg=0)
 
float getFloatParam (const char *param, const char *subparam, int arg=0)
 
void getListParam (const char *param, StringVector &list)
 
int getCountParam (const char *param)
 
bool checkParam (const char *param)
 
bool existsParam (const char *param)
 
void addParamsLine (const String &line)
 
void addParamsLine (const char *line)
 
ParamDefgetParamDef (const char *param) const
 
virtual void quit (int exit_code=0) const
 
virtual int tryRun ()
 
void initProgress (size_t total, size_t stepBin=60)
 
void setProgress (size_t value=0)
 
void endProgress ()
 
void processDefaultComment (const char *param, const char *left)
 
void setDefaultComment (const char *param, const char *comment)
 
void setProgramName (const char *name)
 
void addUsageLine (const char *line, bool verbatim=false)
 
void clearUsage ()
 
void addExampleLine (const char *example, bool verbatim=true)
 
void addSeeAlsoLine (const char *seeAlso)
 
void addKeywords (const char *keywords)
 
const char * name () const
 
virtual void usage (int verb=0) const
 
virtual void usage (const String &param, int verb=2)
 
int version () const
 
virtual void read (int argc, const char **argv, bool reportErrors=true)
 
virtual void read (int argc, char **argv, bool reportErrors=true)
 
void read (const String &argumentsLine)
 
 XmippProgram ()
 
 XmippProgram (int argc, const char **argv)
 
virtual ~XmippProgram ()
 

Public Attributes

FileName fnVolMd
 
FileName fnVolRef
 
FileName fnVol2
 
FileName fnOut
 
FileName fnMask1
 
FileName fnMask2
 
FileName fnMaskSub
 
FileName fnVol1F
 
FileName fnVol2A
 
bool computeE
 
size_t iter
 
double v1min
 
double v1max
 
bool performSubtraction
 
int sigma
 
double cutFreq
 
double lambda
 
bool radavg
 
bool subtomos
 
MetaDataVec mdParticles
 
MDRowVec row
 
Matrix1D< double > roffset
 
struct Angles part_angles
 
Image< double > V
 
Image< double > V1
 
Image< double > padv
 
double pad
 
double std1
 
size_t n
 
FourierTransformer transformer2
 
MultidimArray< std::complex< double > > V2Fourier
 
MultidimArray< double > V1FourierMag
 
MultidimArray< double > mask
 
Image< double > Vdiff
 
FourierFilter filter2
 
int rank
 
- Public Attributes inherited from XmippMetadataProgram
FileName fn_in
 Filenames of input and output Metadata. More...
 
FileName fn_out
 
FileName baseName
 
FileName pathBaseName
 
FileName oextBaseName
 
bool apply_geo
 Apply geo. More...
 
size_t ndimOut
 Output dimensions. More...
 
size_t zdimOut
 
size_t ydimOut
 
size_t xdimOut
 
DataType datatypeOut
 
size_t mdInSize
 Number of input elements. More...
 
- Public Attributes inherited from XmippProgram
bool doRun
 
bool runWithoutArgs
 
int verbose
 Verbosity level. More...
 
int debug
 

Additional Inherited Members

- Protected Member Functions inherited from XmippMetadataProgram
virtual void initComments ()
 
virtual bool getImageToProcess (size_t &objId, size_t &objIndex)
 
void show () const override
 
virtual void startProcessing ()
 
virtual void finishProcessing ()
 
virtual void writeOutput ()
 
virtual void showProgress ()
 
virtual void defineLabelParam ()
 
- Protected Member Functions inherited from XmippProgram
void defineCommons ()
 
- Protected Attributes inherited from XmippMetadataProgram
WriteModeMetaData mode
 Metadata writing mode: OVERWRITE, APPEND. More...
 
FileName oext
 Output extension and root. More...
 
FileName oroot
 
MDLabel image_label
 MDLabel to be used to read/write images, usually will be MDL_IMAGE. More...
 
bool produces_an_output
 Indicate that a unique final output is produced. More...
 
bool produces_a_metadata
 Indicate that the unique final output file is a Metadata. More...
 
bool each_image_produces_an_output
 Indicate that an output is produced for each image in the input. More...
 
bool allow_apply_geo
 
bool decompose_stacks
 Input Metadata will treat a stack file as a set of images instead of a unique file. More...
 
bool delete_output_stack
 Delete previous output stack file prior to process images. More...
 
bool get_image_info
 Get the input image file dimensions to further operations. More...
 
bool save_metadata_stack
 Save the associated output metadata when output file is a stack. More...
 
bool track_origin
 Include the original input image filename in the output stack. More...
 
bool keep_input_columns
 Keep input metadata columns. More...
 
bool remove_disabled
 Remove disabled images from the input selfile. More...
 
bool allow_time_bar
 Show process time bar. More...
 
bool input_is_metadata
 Input is a metadata. More...
 
bool single_image
 Input is a single image. More...
 
bool input_is_stack
 Input is a stack. More...
 
bool output_is_stack
 Output is a stack. More...
 
bool create_empty_stackfile
 
bool delete_mdIn
 
size_t time_bar_step
 Some time bar related counters. More...
 
size_t time_bar_size
 
size_t time_bar_done
 
- Protected Attributes inherited from XmippProgram
int errorCode
 
ProgramDefprogDef
 Program definition and arguments parser. More...
 
std::map< String, CommentListdefaultComments
 
int argc
 Original command line arguments. More...
 
const char ** argv
 

Detailed Description

Subtomogram subtraction

Definition at line 42 of file subtomo_subtraction.h.

Constructor & Destructor Documentation

◆ ProgSubtomoSubtraction()

ProgSubtomoSubtraction::ProgSubtomoSubtraction ( )

Empty constructor.

Definition at line 37 of file subtomo_subtraction.cpp.

38 {
39  produces_a_metadata = true;
41  keep_input_columns = true;
42  save_metadata_stack = true;
43  remove_disabled = false;
44  rank = 0;
45 }
bool remove_disabled
Remove disabled images from the input selfile.
bool save_metadata_stack
Save the associated output metadata when output file is a stack.
bool keep_input_columns
Keep input metadata columns.
bool each_image_produces_an_output
Indicate that an output is produced for each image in the input.
bool produces_a_metadata
Indicate that the unique final output file is a Metadata.

Member Function Documentation

◆ centerFFTMagnitude()

void ProgSubtomoSubtraction::centerFFTMagnitude ( MultidimArray< double > &  VolRad,
MultidimArray< std::complex< double >> &  VolFourierRad,
MultidimArray< double > &  VolFourierMagRad 
) const

Definition at line 217 of file subtomo_subtraction.cpp.

219  {
220  FourierTransformer transformerRad;
221  transformerRad.completeFourierTransform(VolRad, VolFourierRad);
222  CenterFFT(VolFourierRad, true);
223  FFT_magnitude(VolFourierRad, VolFourierMagRad);
224  VolFourierMagRad.setXmippOrigin();
225 }
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
void completeFourierTransform(T &v, T1 &V)
Definition: xmipp_fftw.h:315
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
Definition: xmipp_fftw.cpp:393

◆ computeEnergy()

void ProgSubtomoSubtraction::computeEnergy ( MultidimArray< double > &  Vdif,
const MultidimArray< double > &  Vact 
) const

Definition at line 209 of file subtomo_subtraction.cpp.

209  {
210  Vdif = Vdif - Vact;
211  double energy = 0;
213  energy += DIRECT_MULTIDIM_ELEM(Vdif, n) * DIRECT_MULTIDIM_ELEM(Vdif, n);
214  energy = sqrt(energy / MULTIDIM_SIZE(Vdif));
215 }
#define MULTIDIM_SIZE(v)
void sqrt(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ computeMagnitude()

MultidimArray< double > ProgSubtomoSubtraction::computeMagnitude ( MultidimArray< double > &  volume)

Definition at line 312 of file subtomo_subtraction.cpp.

312  {
313  FourierTransformer transformer;
315  MultidimArray<double> magnitude;
316  transformer.FourierTransform(volume, fourier, false);
317  FFT_magnitude(fourier, magnitude);
318  return magnitude;
319 }
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
void FFT_magnitude(const MultidimArray< std::complex< double > > &v, MultidimArray< double > &mag)
Definition: xmipp_fftw.cpp:393

◆ computePhase()

MultidimArray< std::complex< double > > ProgSubtomoSubtraction::computePhase ( MultidimArray< double > &  volume)

Definition at line 344 of file subtomo_subtraction.cpp.

344  {
346  transformer2.FourierTransform(volume, phase, true);
347  extractPhase(phase);
348  return phase;
349 }
void extractPhase(MultidimArray< std::complex< double >> &) const
FourierTransformer transformer2
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166

◆ computeRadQuotient()

MultidimArray< double > ProgSubtomoSubtraction::computeRadQuotient ( const MultidimArray< double > &  v1Mag,
const MultidimArray< double > &  vMag,
const MultidimArray< double > &  V1,
const MultidimArray< double > &  V 
)

Definition at line 263 of file subtomo_subtraction.cpp.

265  {
266  // Compute the quotient of the radial mean of the volumes to use it in POCS amplitude
267  MultidimArray<double> radial_meanV1;
268  radialAverage(v1Mag, V1, radial_meanV1);
269  MultidimArray<double> radial_meanV;
270  radialAverage(vMag, V, radial_meanV);
271  MultidimArray<double> radQuotient = radial_meanV1 / radial_meanV;
272  FOR_ALL_ELEMENTS_IN_ARRAY1D(radQuotient)
273  {
274  radQuotient(i) = std::min(radQuotient(i), 1.0);
275  if (radQuotient(i) != radQuotient(i)) // Check if it is NaN and change it by 0
276  radQuotient(i) = 0;
277  }
278  return radQuotient;
279 }
void min(Image< double > &op1, const Image< double > &op2)
void radialAverage(const MultidimArray< double > &, const MultidimArray< double > &, MultidimArray< double > &)
#define i
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)

◆ createFilter()

void ProgSubtomoSubtraction::createFilter ( FourierFilter filter2,
double  cutFreq 
)

Definition at line 281 of file subtomo_subtraction.cpp.

281  {
282  filter2.FilterBand = LOWPASS;
283  filter2.FilterShape = RAISED_COSINE;
284  filter2.raised_w = 0.02;
285  filter2.w1 = cutFreq;
286 }
#define RAISED_COSINE
#define LOWPASS

◆ createMask()

MultidimArray< double > ProgSubtomoSubtraction::createMask ( const Image< double > &  volume,
const FileName fnM1,
const FileName fnM2 
)

Definition at line 321 of file subtomo_subtraction.cpp.

321  {
323  if (fnM1 != "" && fnM2 != "") {
324  Image<double> mask1;
325  Image<double> mask2;
326  mask1.read(fnM1);
327  mask2.read(fnM2);
328  mask = mask1() * mask2();
329  } else {
330  mask.resizeNoCopy(volume());
331  mask.initConstant(1.0);
332  }
333  return mask;
334 }
void resizeNoCopy(const MultidimArray< T1 > &v)
void initConstant(T val)
MultidimArray< double > mask
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)

◆ defineParams()

void ProgSubtomoSubtraction::defineParams ( )
overridevirtual

Define parameters.

Reimplemented from XmippMetadataProgram.

Definition at line 48 of file subtomo_subtraction.cpp.

49 {
50  // Usage
51  addUsageLine("This program modifies a volume as much as possible in order to assimilate it to another one,");
52  addUsageLine("without loosing the important information in it process. Then, the subtraction of the two volumes");
53  addUsageLine("can be optionally calculated. Sharpening: reference volume must be an atomic structure previously");
54  addUsageLine("converted into a density map of the same specimen than in input volume 2.");
55  // Parameters
57  addParamsLine("--ref <volume>\t: Reference volume");
58  addParamsLine("[--sub]\t: Perform the subtraction of the volumes. Output will be the difference");
59  addParamsLine("[--sigma <s=3>]\t: Decay of the filter (sigma) to smooth the mask transition");
60  addParamsLine("[--iter <n=5>]\t: Number of iterations for the adjustment process");
61  addParamsLine("[--mask1 <mask=\"\">]\t: Mask for volume 1");
62  addParamsLine("[--mask2 <mask=\"\">]\t: Mask for volume 2");
63  addParamsLine("[--maskSub <mask=\"\">]\t: Mask for subtraction region");
64  addParamsLine("[--cutFreq <f=0>]\t: Filter both volumes with a filter which specified cutoff frequency "
65  "(i.e. resolution inverse, <0.5)");
66  addParamsLine("[--lambda <l=1>]\t: Relaxation factor for Fourier Amplitude POCS, i.e. 'how much modification "
67  "of volume Fourier amplitudes', between 1 (full modification, recommended) and 0 (no modification)");
68  addParamsLine("[--radavg]\t: Match the radially averaged Fourier amplitudes when adjusting the amplitudes instead "
69  "of taking directly them from the reference volume");
70  addParamsLine("[--computeEnergy]\t: Compute the energy difference between each step (energy difference gives "
71  "information about the convergence of the adjustment process, while it can slightly slow the performance)");
72  addParamsLine("[--saveV1 <structure=\"\"> ]\t: Save subtraction intermediate file (vol1 filtered) just when option "
73  "--sub is passed, if not passed the input reference volume is not modified");
74  addParamsLine("[--saveV2 <structure=\"\"> ]\t: Save subtraction intermediate file (vol2 adjusted) just when option "
75  "--sub is passed, if not passed the output of the program is this file");
76 }
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)

◆ extractPhase()

void ProgSubtomoSubtraction::extractPhase ( MultidimArray< std::complex< double >> &  FI) const

Definition at line 201 of file subtomo_subtraction.cpp.

201  {
203  auto *ptr = (double *)&DIRECT_MULTIDIM_ELEM(FI, n);
204  double phi = atan2(*(ptr + 1), *ptr);
205  DIRECT_MULTIDIM_ELEM(FI, n) = std::complex<double>(cos(phi), sin(phi));
206  }
207 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ filterMask()

void ProgSubtomoSubtraction::filterMask ( MultidimArray< double > &  mask) const

Definition at line 336 of file subtomo_subtraction.cpp.

336  {
337  FourierFilter Filter;
338  Filter.FilterShape = REALGAUSSIAN;
339  Filter.FilterBand = LOWPASS;
340  Filter.w1 = sigma;
341  Filter.applyMaskSpace(mask);
342 }
#define REALGAUSSIAN
#define LOWPASS
void applyMaskSpace(MultidimArray< double > &v)

◆ getSubtractionMask()

MultidimArray< double > ProgSubtomoSubtraction::getSubtractionMask ( const FileName fnMSub,
MultidimArray< double >  mask 
)

Definition at line 351 of file subtomo_subtraction.cpp.

351  {
352  if (fnMSub.isEmpty()){
353  filterMask(mask);
354  return mask;
355  }
356  else {
357  Image<double> masksub;
358  masksub.read(fnMSub);
359  return masksub();
360  }
361 }
MultidimArray< double > mask
void filterMask(MultidimArray< double > &) const
bool isEmpty() const
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)

◆ POCSFourierAmplitude()

void ProgSubtomoSubtraction::POCSFourierAmplitude ( const MultidimArray< double > &  V1FourierMag,
MultidimArray< std::complex< double >> &  V2Fourier,
double  l 
)

Definition at line 142 of file subtomo_subtraction.cpp.

143  {
145  double mod = std::abs(DIRECT_MULTIDIM_ELEM(V2Fourier, n));
146  if (mod > 1e-10) // Condition to avoid divide by zero, values smaller than
147  // this threshold are considered zero
148  DIRECT_MULTIDIM_ELEM(V2Fourier, n) *=
149  ((1 - l) + l * DIRECT_MULTIDIM_ELEM(V1FourierMag, n)) / mod;
150  }
151 }
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
void mod(const MultidimArray< T > &x, MultidimArray< T > &m, double y)

◆ POCSFourierAmplitudeRadAvg()

void ProgSubtomoSubtraction::POCSFourierAmplitudeRadAvg ( MultidimArray< std::complex< double >> &  V,
double  l,
const MultidimArray< double > &  rQ,
int  V1size_x,
int  V1size_y,
int  V1size_z 
)

Definition at line 153 of file subtomo_subtraction.cpp.

154  {
155  int V1size2_x = V1size_x/2;
156  double V1sizei_x = 1.0/V1size_x;
157  int V1size2_y = V1size_y/2;
158  double V1sizei_y = 1.0/V1size_y;
159  int V1size2_z = V1size_z/2;
160  double V1sizei_z = 1.0/V1size_z;
161  double wx;
162  double wy;
163  double wz;
164  for (int k=0; k<ZSIZE(V); ++k)
165  {
166  FFT_IDX2DIGFREQ_FAST(k,V1size_z,V1size2_z,V1sizei_z,wz)
167  double wz2 = wz*wz;
168  for (int i=0; i<YSIZE(V); ++i)
169  {
170  FFT_IDX2DIGFREQ_FAST(i,V1size_y,V1size2_y,V1sizei_y,wy)
171  double wy2_wz2 = wy*wy + wz2;
172  for (int j=0; j<XSIZE(V); ++j)
173  {
174  FFT_IDX2DIGFREQ_FAST(j,V1size_x,V1size2_x,V1sizei_x,wx)
175  double w = sqrt(wx*wx + wy2_wz2);
176  auto iw = std::min((int)floor(w*V1size_x), (int)XSIZE(rQ) -1);
177  DIRECT_A3D_ELEM(V,k,i,j)*=(1-l)+l*DIRECT_MULTIDIM_ELEM(rQ,iw);
178  }
179  }
180  }
181 }
#define YSIZE(v)
void min(Image< double > &op1, const Image< double > &op2)
__host__ __device__ float2 floor(const float2 v)
void sqrt(Image< double > &op)
doublereal * w
#define i
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 FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
#define DIRECT_A3D_ELEM(v, k, i, j)
#define j

◆ POCSFourierPhase()

void ProgSubtomoSubtraction::POCSFourierPhase ( const MultidimArray< std::complex< double >> &  phase,
MultidimArray< std::complex< double >> &  FI 
)

Definition at line 193 of file subtomo_subtraction.cpp.

194  {
196  DIRECT_MULTIDIM_ELEM(FI, n) =
198 }
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ POCSmask()

void ProgSubtomoSubtraction::POCSmask ( const MultidimArray< double > &  mask,
MultidimArray< double > &  I 
)

Processing methods.

Definition at line 132 of file subtomo_subtraction.cpp.

132  {
135 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ POCSMinMax()

void ProgSubtomoSubtraction::POCSMinMax ( MultidimArray< double > &  V,
double  v1m,
double  v1M 
)

Definition at line 183 of file subtomo_subtraction.cpp.

183  {
185  double val = DIRECT_MULTIDIM_ELEM(V, n);
186  if (val < v1m)
187  DIRECT_MULTIDIM_ELEM(V, n) = v1m;
188  else if (val > v1M)
189  DIRECT_MULTIDIM_ELEM(V, n) = v1M;
190  }
191 }
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ POCSnonnegative()

void ProgSubtomoSubtraction::POCSnonnegative ( MultidimArray< double > &  I)

Definition at line 137 of file subtomo_subtraction.cpp.

137  {
140 }
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)

◆ postProcess()

void ProgSubtomoSubtraction::postProcess ( )
overridevirtual

Reimplemented from XmippMetadataProgram.

Definition at line 491 of file subtomo_subtraction.cpp.

492 {
494 }
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const

◆ preProcess()

void ProgSubtomoSubtraction::preProcess ( )
overridevirtual

MPI methods.

Reimplemented from XmippMetadataProgram.

Definition at line 363 of file subtomo_subtraction.cpp.

363  {
364  show();
365  }
void show() const override
Show.

◆ processImage()

void ProgSubtomoSubtraction::processImage ( const FileName fnImg,
const FileName fnImgOut,
const MDRow rowIn,
MDRow rowOut 
)
overridevirtual

Implements XmippMetadataProgram.

Definition at line 370 of file subtomo_subtraction.cpp.

370  {
372  V1.read(fnVolRef);
373  V1().setXmippOrigin();
374  mask = createMask(V1, fnMask1, fnMask2);
375  POCSmask(mask, V1());
376  POCSnonnegative(V1());
377  V1().computeDoubleMinMax(v1min, v1max);
378  std1 = V1().computeStddev();
380 
381  readParticle(rowIn);
382  MultidimArray<double> &mv = V();
383  mv.setXmippOrigin();
384 
385  // Window subtomo (padding) before apply alignment
386  MultidimArray <double> &mpad = padv();
387  mpad.setXmippOrigin();
388  pad = XSIZE(mv);
389  mv.window(mpad, STARTINGZ(mv)-(int)pad/2, STARTINGY(mv)-(int)pad/2, STARTINGX(mv)-(int)pad/2, FINISHINGZ(mv)+(int)pad/2, FINISHINGZ(mv)+(int)pad/2, FINISHINGZ(mv)+(int)pad/2);
390  // Read alignment
394  roffset.initZeros(3);
395  rowIn.getValueOrDefault(MDL_SHIFT_X, roffset(0), 0);
396  rowIn.getValueOrDefault(MDL_SHIFT_Y, roffset(1), 0);
397  rowIn.getValueOrDefault(MDL_SHIFT_Z, roffset(2), 0);
398  // Apply alignment
399  Image<double> Vaux;
400  MultidimArray<double> &mvaux = Vaux();
401  mvaux.setXmippOrigin();
402  Vaux = padv;
403  mvaux.initZeros();
405  selfTranslate(xmipp_transformation::LINEAR, mvaux, roffset, xmipp_transformation::WRAP);
406  // Crop to restore original size
407  mvaux.window(mv, STARTINGZ(mv), STARTINGY(mv), STARTINGX(mv), FINISHINGZ(mv), FINISHINGY(mv), FINISHINGX(mv));
408  // Preprocessing
409  POCSmask(mask, mv);
410  POCSnonnegative(mv);
411  Vdiff = V;
412  auto V2FourierPhase = computePhase(mv);
413  auto V1FourierMag = computeMagnitude(V1());
414  auto V2FourierMag = computeMagnitude(mv);
415  auto radQuotient = computeRadQuotient(V1FourierMag, V2FourierMag, V1(), mv);
416 
417  for (n = 0; n < iter; ++n)
418  {
420  if (radavg) {
421  auto V1size_x = (int)XSIZE(V1());
422  auto V1size_y = (int)YSIZE(V1());
423  auto V1size_z = (int)ZSIZE(V1());
424  POCSFourierAmplitudeRadAvg(V2Fourier, lambda, radQuotient, V1size_x, V1size_y, V1size_z);
425  }
426  else {
428  }
430  if (computeE) {
431  computeEnergy(Vdiff(), mv);
432  Vdiff = V;
433  }
434  POCSMinMax(mv, v1min, v1max);
435  if (computeE) {
436  computeEnergy(Vdiff(), mv);
437  Vdiff = V;
438  }
439  POCSmask(mask, mv);
440  if (computeE) {
441  computeEnergy(Vdiff(), mv);
442  Vdiff = V;
443  }
445  POCSFourierPhase(V2FourierPhase, V2Fourier);
447  if (computeE) {
448  computeEnergy(Vdiff(), mv);
449  Vdiff = V;
450  }
451  POCSnonnegative(mv);
452  if (computeE) {
453  computeEnergy(Vdiff(), mv);
454  Vdiff = V;
455  }
456  double std2 = mv.computeStddev();
457  mv *= std1 / std2;
458  if (computeE) {
459  computeEnergy(Vdiff(), mv);
460  Vdiff = V;
461  }
462  if (cutFreq != 0) {
463  filter2.generateMask(mv);
466  if (computeE) {
467  computeEnergy(Vdiff(), mv);
468  Vdiff = V;
469  }
470  }
471  }
472 
473  if (performSubtraction) {
474  auto masksub = getSubtractionMask(fnMaskSub, mask);
475  V1.read(fnVolRef);
476  V = subtraction(V1, V, masksub, fnVol1F, fnVol2A, filter2, cutFreq);
477  }
478 
479  // Recover original alignment
480  Image<double> Vf;
481  MultidimArray<double> &mvf = Vf();
482  mvf.setXmippOrigin();
483  Vf = V;
485  A.initIdentity(4);
486  geo2TransformationMatrix(rowIn,A);
487  applyGeometry(xmipp_transformation::LINEAR, mvf, mv, A, xmipp_transformation::IS_INV, xmipp_transformation::DONT_WRAP);
488  writeParticle(rowOut, fnImgOut, Vf);
489 }
Rotation angle of an image (double,degrees)
#define YSIZE(v)
MultidimArray< double > computeRadQuotient(const MultidimArray< double > &, const MultidimArray< double > &, const MultidimArray< double > &, const MultidimArray< double > &)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
#define FINISHINGX(v)
void geo2TransformationMatrix(const MDRow &imageGeo, Matrix2D< double > &A, bool only_apply_shifts)
MultidimArray< double > getSubtractionMask(const FileName &, MultidimArray< double >)
Tilting angle of an image (double,degrees)
Shift for the image in the X axis (double)
void applyGeometry(int SplineDegree, MultidimArray< std::complex< double > > &V2, const MultidimArray< std::complex< double > > &V1, const Matrix2D< double > &A, bool inv, bool wrap, std::complex< double > outside, MultidimArray< double > *BcoeffsPtr)
Special label to be used when gathering MDs in MpiMetadataPrograms.
void POCSmask(const MultidimArray< double > &, MultidimArray< double > &)
Processing methods.
MultidimArray< double > mask
Matrix1D< double > roffset
#define FINISHINGZ(v)
MultidimArray< std::complex< double > > V2Fourier
Image< double > subtraction(Image< double >, Image< double > &, const MultidimArray< double > &, const FileName &, const FileName &, FourierFilter &, double)
#define STARTINGX(v)
FourierTransformer transformer2
#define STARTINGY(v)
void window(MultidimArray< T1 > &result, int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T1 init_value=0) const
void selfTranslate(int SplineDegree, MultidimArray< T > &V1, const Matrix1D< double > &v, bool wrap=xmipp_transformation::WRAP, T outside=0)
void createFilter(FourierFilter &, double)
void POCSFourierAmplitude(const MultidimArray< double > &, MultidimArray< std::complex< double >> &, double)
#define XSIZE(v)
MultidimArray< std::complex< double > > computePhase(MultidimArray< double > &)
#define ZSIZE(v)
MultidimArray< double > computeMagnitude(MultidimArray< double > &)
void Euler_rotate(const MultidimArray< double > &V, double rot, double tilt, double psi, MultidimArray< double > &result)
Definition: geometry.cpp:1061
void POCSFourierPhase(const MultidimArray< std::complex< double >> &, MultidimArray< std::complex< double >> &)
void initZeros()
Definition: matrix1d.h:592
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
MultidimArray< double > createMask(const Image< double > &, const FileName &, const FileName &)
void POCSFourierAmplitudeRadAvg(MultidimArray< std::complex< double >> &, double, const MultidimArray< double > &, int, int, int)
const T & getValueOrDefault(MDLabel label, const T &def) const
#define FINISHINGY(v)
void POCSMinMax(MultidimArray< double > &, double, double)
void POCSnonnegative(MultidimArray< double > &)
Shift for the image in the Z axis (double)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
Shift for the image in the Y axis (double)
double computeStddev() const
void initZeros(const MultidimArray< T1 > &op)
void computeEnergy(MultidimArray< double > &, const MultidimArray< double > &) const
void generateMask(MultidimArray< double > &v)
void readParticle(const MDRow &rowIn)
Read and write methods.
#define STARTINGZ(v)
void writeParticle(MDRow &rowOut, FileName, Image< double > &)
MultidimArray< double > V1FourierMag
void initIdentity()
Definition: matrix2d.h:673
void applyMaskSpace(MultidimArray< double > &v)

◆ radialAverage()

void ProgSubtomoSubtraction::radialAverage ( const MultidimArray< double > &  VolFourierMag,
const MultidimArray< double > &  V,
MultidimArray< double > &  radial_mean 
)

Definition at line 227 of file subtomo_subtraction.cpp.

228  {
229  MultidimArray<double> radial_count;
230  int Vsize2_x = int(XSIZE(V))/2;
231  double Vsizei_x = 1.0/int(XSIZE(V));
232  int Vsize2_y = int(YSIZE(V))/2;
233  double Vsizei_y = 1.0/int(YSIZE(V));
234  int Vsize2_z = int(ZSIZE(V))/2;
235  double Vsizei_z = 1.0/int(ZSIZE(V));
236  double wx;
237  double wy;
238  double wz;
239  auto maxrad = int(floor(sqrt(Vsize2_x*Vsize2_x + Vsize2_y*Vsize2_y + Vsize2_z*Vsize2_z)));
240  radial_count.initZeros(maxrad);
241  radial_mean.initZeros(maxrad);
242  for (int k=0; k<Vsize2_z; ++k)
243  {
244  FFT_IDX2DIGFREQ_FAST(k,ZSIZE(V),Vsize2_z,Vsizei_z,wz)
245  double wz2 = wz*wz;
246  for (int i=0; i<Vsize2_y; ++i)
247  {
248  FFT_IDX2DIGFREQ_FAST(i,YSIZE(V),Vsize2_y,Vsizei_y,wy)
249  double wy2_wz2 = wy*wy + wz2;
250  for (int j=0; j<Vsize2_x; ++j)
251  {
252  FFT_IDX2DIGFREQ_FAST(j,XSIZE(V),Vsize2_x,Vsizei_x,wx)
253  double w = sqrt(wx*wx + wy2_wz2);
254  auto iw = (int)round(w*int(XSIZE(V)));
255  DIRECT_A1D_ELEM(radial_mean,iw)+=DIRECT_A3D_ELEM(VolFourierMag,k,i,j);
256  DIRECT_A1D_ELEM(radial_count,iw)+=1.0;
257  }
258  }
259  }
260  radial_mean/= radial_count;
261 }
#define YSIZE(v)
__host__ __device__ float2 floor(const float2 v)
void sqrt(Image< double > &op)
doublereal * w
#define i
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 FFT_IDX2DIGFREQ_FAST(idx, size, size_2, isize, freq)
Definition: xmipp_fft.h:54
#define DIRECT_A1D_ELEM(v, i)
#define XSIZE(v)
#define ZSIZE(v)
#define DIRECT_A3D_ELEM(v, k, i, j)
#define j
int round(double x)
Definition: ap.cpp:7245
void initZeros(const MultidimArray< T1 > &op)

◆ readParams()

void ProgSubtomoSubtraction::readParams ( )
overridevirtual

Read argument from command line.

Reimplemented from XmippMetadataProgram.

Definition at line 79 of file subtomo_subtraction.cpp.

80 {
82  fnVolRef = getParam("--ref");
83  performSubtraction = checkParam("--sub");
84  iter = getIntParam("--iter");
85  sigma = getIntParam("--sigma");
86  fnMask1 = getParam("--mask1");
87  fnMask2 = getParam("--mask2");
88  fnMaskSub = getParam("--maskSub");
89  cutFreq = getDoubleParam("--cutFreq");
90  lambda = getDoubleParam("--lambda");
91  fnVol1F = getParam("--saveV1");
92  if (fnVol1F.isEmpty())
93  fnVol1F = "volume1_filtered.mrc";
94  fnVol2A = getParam("--saveV2");
95  if (fnVol2A.isEmpty())
96  fnVol2A = "volume2_adjusted.mrc";
97  radavg = checkParam("--radavg");
98  computeE = checkParam("--computeEnergy");
99 }
double getDoubleParam(const char *param, int arg=0)
const char * getParam(const char *param, int arg=0)
bool isEmpty() const
bool checkParam(const char *param)
int getIntParam(const char *param, int arg=0)

◆ readParticle()

void ProgSubtomoSubtraction::readParticle ( const MDRow rowIn)

Read and write methods.

Definition at line 119 of file subtomo_subtraction.cpp.

119  {
120  r.getValueOrDefault(MDL_IMAGE, fnVol2, "no_filename");
121  V.read(fnVol2);
122  V().setXmippOrigin();
123  }
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
Name of an image (std::string)

◆ show()

void ProgSubtomoSubtraction::show ( ) const
overridevirtual

Show.

Reimplemented from XmippProgram.

Definition at line 102 of file subtomo_subtraction.cpp.

102  {
103  if (!verbose)
104  return;
105  std::cout
106  << "Input volume(s):\t" << fnVolMd << std::endl
107  << "Reference volume:\t" << fnVolRef << std::endl
108  << "Input mask 1:\t" << fnMask1 << std::endl
109  << "Input mask 2:\t" << fnMask2 << std::endl
110  << "Input mask subtract:\t" << fnMaskSub << std::endl
111  << "Sigma:\t" << sigma << std::endl
112  << "Iterations:\t" << iter << std::endl
113  << "Cutoff frequency:\t" << cutFreq << std::endl
114  << "Relaxation factor:\t" << lambda << std::endl
115  << "Match radial averages:\t" << radavg << std::endl
116  << "Output:\t" << fnOut << std::endl;
117 }
int verbose
Verbosity level.

◆ subtraction()

Image< double > ProgSubtomoSubtraction::subtraction ( Image< double >  V1,
Image< double > &  V,
const MultidimArray< double > &  mask,
const FileName fnVol1F,
const FileName fnVol2A,
FourierFilter filter2,
double  cutFreq 
)

Definition at line 288 of file subtomo_subtraction.cpp.

290  {
291  Image<double> V1Filtered;
292  V1Filtered() = V1();
293  if (cutFreq != 0){
294  filter2.applyMaskSpace(V1Filtered());
295  }
296  if (!fnVol1F.isEmpty()) {
297  V1Filtered.write(fnVol1F);
298  }
299  if (!fnVol2A.isEmpty()) {
300  V.write(fnVol2A);
301  }
303  DIRECT_MULTIDIM_ELEM(V1(), n) =
304  DIRECT_MULTIDIM_ELEM(V1(), n) * (1 - DIRECT_MULTIDIM_ELEM(mask, n)) +
305  (DIRECT_MULTIDIM_ELEM(V1Filtered(), n) -
306  std::min(DIRECT_MULTIDIM_ELEM(V(), n),
307  DIRECT_MULTIDIM_ELEM(V1Filtered(), n))) *
308  DIRECT_MULTIDIM_ELEM(mask, n);
309  return V1;
310 }
void min(Image< double > &op1, const Image< double > &op2)
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)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define DIRECT_MULTIDIM_ELEM(v, n)
bool isEmpty() const
void applyMaskSpace(MultidimArray< double > &v)

◆ writeParticle()

void ProgSubtomoSubtraction::writeParticle ( MDRow rowOut,
FileName  fnImgOut,
Image< double > &  img 
)

Definition at line 125 of file subtomo_subtraction.cpp.

125  {
126  img.write(fnImgOut);
127  rowOut.setValue(MDL_IMAGE, fnImgOut);
128  }
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 setValue(MDLabel label, const T &d, bool addLabel=true)
Name of an image (std::string)

Member Data Documentation

◆ computeE

bool ProgSubtomoSubtraction::computeE

Definition at line 56 of file subtomo_subtraction.h.

◆ cutFreq

double ProgSubtomoSubtraction::cutFreq

Definition at line 62 of file subtomo_subtraction.h.

◆ filter2

FourierFilter ProgSubtomoSubtraction::filter2

Definition at line 91 of file subtomo_subtraction.h.

◆ fnMask1

FileName ProgSubtomoSubtraction::fnMask1

Definition at line 50 of file subtomo_subtraction.h.

◆ fnMask2

FileName ProgSubtomoSubtraction::fnMask2

Definition at line 51 of file subtomo_subtraction.h.

◆ fnMaskSub

FileName ProgSubtomoSubtraction::fnMaskSub

Definition at line 52 of file subtomo_subtraction.h.

◆ fnOut

FileName ProgSubtomoSubtraction::fnOut

Definition at line 49 of file subtomo_subtraction.h.

◆ fnVol1F

FileName ProgSubtomoSubtraction::fnVol1F

Definition at line 53 of file subtomo_subtraction.h.

◆ fnVol2

FileName ProgSubtomoSubtraction::fnVol2

Definition at line 48 of file subtomo_subtraction.h.

◆ fnVol2A

FileName ProgSubtomoSubtraction::fnVol2A

Definition at line 54 of file subtomo_subtraction.h.

◆ fnVolMd

FileName ProgSubtomoSubtraction::fnVolMd

Definition at line 46 of file subtomo_subtraction.h.

◆ fnVolRef

FileName ProgSubtomoSubtraction::fnVolRef

Definition at line 47 of file subtomo_subtraction.h.

◆ iter

size_t ProgSubtomoSubtraction::iter

Definition at line 57 of file subtomo_subtraction.h.

◆ lambda

double ProgSubtomoSubtraction::lambda

Definition at line 63 of file subtomo_subtraction.h.

◆ mask

MultidimArray<double> ProgSubtomoSubtraction::mask

Definition at line 89 of file subtomo_subtraction.h.

◆ mdParticles

MetaDataVec ProgSubtomoSubtraction::mdParticles

Definition at line 68 of file subtomo_subtraction.h.

◆ n

size_t ProgSubtomoSubtraction::n

Definition at line 85 of file subtomo_subtraction.h.

◆ pad

double ProgSubtomoSubtraction::pad

Definition at line 83 of file subtomo_subtraction.h.

◆ padv

Image<double> ProgSubtomoSubtraction::padv

Definition at line 82 of file subtomo_subtraction.h.

◆ part_angles

struct Angles ProgSubtomoSubtraction::part_angles

Definition at line 77 of file subtomo_subtraction.h.

◆ performSubtraction

bool ProgSubtomoSubtraction::performSubtraction

Definition at line 60 of file subtomo_subtraction.h.

◆ radavg

bool ProgSubtomoSubtraction::radavg

Definition at line 64 of file subtomo_subtraction.h.

◆ rank

int ProgSubtomoSubtraction::rank

Definition at line 92 of file subtomo_subtraction.h.

◆ roffset

Matrix1D<double> ProgSubtomoSubtraction::roffset

Definition at line 70 of file subtomo_subtraction.h.

◆ row

MDRowVec ProgSubtomoSubtraction::row

Definition at line 69 of file subtomo_subtraction.h.

◆ sigma

int ProgSubtomoSubtraction::sigma

Definition at line 61 of file subtomo_subtraction.h.

◆ std1

double ProgSubtomoSubtraction::std1

Definition at line 84 of file subtomo_subtraction.h.

◆ subtomos

bool ProgSubtomoSubtraction::subtomos

Definition at line 65 of file subtomo_subtraction.h.

◆ transformer2

FourierTransformer ProgSubtomoSubtraction::transformer2

Definition at line 86 of file subtomo_subtraction.h.

◆ V

Image<double> ProgSubtomoSubtraction::V

Definition at line 80 of file subtomo_subtraction.h.

◆ V1

Image<double> ProgSubtomoSubtraction::V1

Definition at line 81 of file subtomo_subtraction.h.

◆ V1FourierMag

MultidimArray<double> ProgSubtomoSubtraction::V1FourierMag

Definition at line 88 of file subtomo_subtraction.h.

◆ v1max

double ProgSubtomoSubtraction::v1max

Definition at line 59 of file subtomo_subtraction.h.

◆ v1min

double ProgSubtomoSubtraction::v1min

Definition at line 58 of file subtomo_subtraction.h.

◆ V2Fourier

MultidimArray<std::complex<double> > ProgSubtomoSubtraction::V2Fourier

Definition at line 87 of file subtomo_subtraction.h.

◆ Vdiff

Image<double> ProgSubtomoSubtraction::Vdiff

Definition at line 90 of file subtomo_subtraction.h.


The documentation for this class was generated from the following files: