Xmipp  v3.23.11-Nereus
Classes | Functions
symmetrize (Symmetrize a volume or image)
Collaboration diagram for symmetrize (Symmetrize a volume or image):

Classes

class  ProgSymmetrize
 Symmetrize Parameters. More...
 

Functions

void symmetrizeVolume (const SymList &SL, const MultidimArray< double > &V_in, MultidimArray< double > &V_out, int spline=xmipp_transformation::BSPLINE3, bool wrap=xmipp_transformation::WRAP, bool do_outside_avg=false, bool sum=false, bool helical=false, bool dihedral=false, bool helicalDihedral=false, double rotHelical=0.0, double rotPhaseHelical=0.0, double zHelical=0.0, double heightFraction=0.95, const MultidimArray< double > *mask=nullptr, int Cn=1)
 
void symmetrizeImage (int symorder, const MultidimArray< double > &I_in, MultidimArray< double > &I_out, int spline=xmipp_transformation::BSPLINE3, bool wrap=xmipp_transformation::WRAP, bool do_outside_avg=false, bool sum=false)
 

Detailed Description

Function Documentation

◆ symmetrizeImage()

void symmetrizeImage ( int  symorder,
const MultidimArray< double > &  I_in,
MultidimArray< double > &  I_out,
int  spline = xmipp_transformation::BSPLINE3,
bool  wrap = xmipp_transformation::WRAP,
bool  do_outside_avg = false,
bool  sum = false 
)

Symmetrize image.

◆ symmetrizeVolume()

void symmetrizeVolume ( const SymList SL,
const MultidimArray< double > &  V_in,
MultidimArray< double > &  V_out,
int  spline = xmipp_transformation::BSPLINE3,
bool  wrap = xmipp_transformation::WRAP,
bool  do_outside_avg = false,
bool  sum = false,
bool  helical = false,
bool  dihedral = false,
bool  helicalDihedral = false,
double  rotHelical = 0.0,
double  rotPhaseHelical = 0.0,
double  zHelical = 0.0,
double  heightFraction = 0.95,
const MultidimArray< double > *  mask = nullptr,
int  Cn = 1 
)

Symmetrize volume.

Definition at line 117 of file symmetrize.cpp.

122 {
123  Matrix2D<double> L(4, 4), R(4, 4); // A matrix from the list
124  MultidimArray<double> V_aux;
125  Matrix1D<double> sh(3);
126  double avg = 0.;
127 
128  if (do_outside_avg)
129  {
130  MultidimArray<int> mask1;
131  mask1.resizeNoCopy(V_in);
132  mask1.setXmippOrigin();
133  size_t rad = XMIPP_MIN(XSIZE(V_in), YSIZE(V_in));
134  rad = XMIPP_MIN(rad, ZSIZE(V_in));
135  BinaryCircularMask(mask1, rad / 2, OUTSIDE_MASK);
136  double dum;
137  computeStats_within_binary_mask(mask1, V_in, dum, dum, avg, dum);
138  }
139  V_out = V_in;
140 
141  if (!helical && !dihedral && !helicalDihedral)
142  {
143  MultidimArray<double> Bcoeffs;
144  MultidimArray<double> *BcoeffsPtr=nullptr;
145  if (spline==3)
146  {
148  BcoeffsPtr=&Bcoeffs;
149  }
150  for (int i = 0; i < SL.symsNo(); i++)
151  {
152  SL.getMatrices(i, L, R);
153  /*FIXME: I do not think this make sense since V_aux is empty. ROB
154  SL.getShift(i, sh);
155  R(3, 0) = sh(0) * XSIZE(V_aux);
156  R(3, 1) = sh(1) * YSIZE(V_aux);
157  R(3, 2) = sh(2) * ZSIZE(V_aux);
158  */
159  applyGeometry(spline, V_aux, V_in, R.transpose(), xmipp_transformation::IS_NOT_INV, wrap, avg, BcoeffsPtr);
160 
161  if ( mask==nullptr)
162  arrayByArray(V_out, V_aux, V_out, '+');
163  else // op1, op2 , result
164  selfArrayByArrayMask(V_in, V_aux, V_out, '+', mask);
165  }
166 
167  if (!sum)
168  arrayByScalar(V_out, 1.0/(SL.symsNo() + 1.0f), V_out, '*');
169  }
170  else if (helical)
171  symmetry_Helical(V_out,V_in,zHelical,rotHelical,rotPhaseHelical,nullptr,false,heightFraction,Cn);
172  else if (helicalDihedral)
173  {
174  symmetry_Helical(V_out,V_in,zHelical,rotHelical,rotPhaseHelical,nullptr,true,heightFraction,Cn);
175  MultidimArray<double> Vrotated;
176  rotate(spline,Vrotated,V_out,180.0,'X',xmipp_transformation::WRAP);
177  V_out+=Vrotated;
178  V_out*=0.5;
179  }
180  else if (dihedral)
181  {
182  auto zmax=(int)(0.1*ZSIZE(V_in));
183  symmetry_Dihedral(V_out,V_in,1,-zmax,zmax,0.5);
184  }
185 }
#define YSIZE(v)
void getMatrices(int i, Matrix2D< double > &L, Matrix2D< double > &R, bool homogeneous=true) const
Definition: symmetries.cpp:348
void resizeNoCopy(const MultidimArray< T1 > &v)
void BinaryCircularMask(MultidimArray< int > &mask, double radius, int mode, double x0, double y0, double z0)
Definition: mask.cpp:193
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)
void symmetry_Dihedral(MultidimArray< double > &Vout, const MultidimArray< double > &Vin, double rotStep, double zmin, double zmax, double zStep, MultidimArray< int > *mask)
int symsNo() const
Definition: symmetries.h:268
#define i
#define rotate(a, i, j, k, l)
void computeStats_within_binary_mask(const MultidimArray< T1 > &mask, const MultidimArray< T > &m, double &min_val, double &max_val, double &avg, double &stddev)
Definition: mask.h:799
void produceSplineCoefficients(int SplineDegree, MultidimArray< double > &coeffs, const MultidimArray< T > &V1)
#define XSIZE(v)
void symmetry_Helical(MultidimArray< double > &Vout, const MultidimArray< double > &Vin, double zHelical, double rotHelical, double rot0, MultidimArray< int > *mask, bool dihedral, double heightFraction, int Cn)
#define ZSIZE(v)
#define XMIPP_MIN(x, y)
Definition: xmipp_macros.h:181
constexpr int OUTSIDE_MASK
Definition: mask.h:48