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

#include <recons_misc.h>

Collaboration diagram for POCSClass:
Collaboration graph
[legend]

Public Types

enum  t_POCS_status {
  POCS_measuring, POCS_use, POCS_lowering, POCS_N_measure,
  POCS_N_use
}
 

Public Member Functions

 POCSClass (BasicARTParameters *_prm, int _Zoutput_volume_size, int _Youtput_volume_size, int _Xoutput_volume_size)
 Constructor. More...
 
void newIteration ()
 Start New ART iteration. More...
 
void newProjection ()
 Start new Projection. More...
 
void apply (GridVolume &vol_basis, int it, int images)
 Apply. More...
 

Public Attributes

t_POCS_status POCS_state
 
double POCS_avg
 
double POCS_stddev
 
double POCS_min
 
double POCS_max
 
double POCS_mean_error
 
double POCS_max_error
 
double POCS_global_mean_error
 
int POCS_freq
 
int POCS_i
 
int POCS_vec_i
 
int POCS_used
 
int POCS_N
 
int Zoutput_volume_size
 
int Youtput_volume_size
 
int Xoutput_volume_size
 
bool apply_POCS
 
MultidimArray< double > POCS_errors
 
BasicARTParametersprm
 

Detailed Description

POCS structure

Definition at line 111 of file recons_misc.h.

Member Enumeration Documentation

◆ t_POCS_status

Enumerator
POCS_measuring 
POCS_use 
POCS_lowering 
POCS_N_measure 
POCS_N_use 

Definition at line 114 of file recons_misc.h.

Constructor & Destructor Documentation

◆ POCSClass()

POCSClass::POCSClass ( BasicARTParameters _prm,
int  _Zoutput_volume_size,
int  _Youtput_volume_size,
int  _Xoutput_volume_size 
)

Constructor.

Definition at line 699 of file recons_misc.cpp.

702 {
703  prm = _prm;
706  POCS_i = 0;
707  POCS_vec_i = 0;
708  POCS_used = 0;
709  POCS_N = 0;
711  Zoutput_volume_size = _Zoutput_volume_size;
712  Youtput_volume_size = _Youtput_volume_size;
713  Xoutput_volume_size = _Xoutput_volume_size;
714  apply_POCS = (prm->surface_mask != nullptr ||
715  prm->positivity || (prm->force_sym != 0 && !prm->is_crystal) ||
716  prm->known_volume != -1);
717 }
bool is_crystal
Is this a crystal 0 means NO 1 YES.
Definition: basic_art.h:252
bool positivity
Apply positivity constraint.
Definition: basic_art.h:246
bool apply_POCS
Definition: recons_misc.h:132
int POCS_vec_i
Definition: recons_misc.h:126
int Youtput_volume_size
Definition: recons_misc.h:130
double known_volume
Known volume. If -1, not applied.
Definition: basic_art.h:226
int Xoutput_volume_size
Definition: recons_misc.h:131
int force_sym
Force the reconstruction to be symmetric this number of times.
Definition: basic_art.h:196
Image< double > * surface_mask
Definition: basic_art.h:371
int POCS_freq
Definition: recons_misc.h:124
int POCS_used
Definition: recons_misc.h:127
int Zoutput_volume_size
Definition: recons_misc.h:129
void initZeros(const MultidimArray< T1 > &op)
MultidimArray< double > POCS_errors
Definition: recons_misc.h:133
t_POCS_status POCS_state
Definition: recons_misc.h:116
BasicARTParameters * prm
Definition: recons_misc.h:134

Member Function Documentation

◆ apply()

void POCSClass::apply ( GridVolume vol_basis,
int  it,
int  images 
)

Apply.

Definition at line 730 of file recons_misc.cpp.

731 {
732  Image<double> vol_POCS, theo_POCS_vol, corr_POCS_vol, vol_voxels;
733 
734  if (apply_POCS && POCS_i % POCS_freq == 0)
735  {
736  Image<double> vol_aux;
737  Image<double> *desired_volume = nullptr;
738 
739  // Compute the corresponding voxel volume
740  prm->basis.changeToVoxels(vol_basis, &(vol_voxels()),
743  {
744  vol_voxels.write("PPPvolPOCS0.vol");
745  std::cout << "Stats PPPvolPOCS0.vol: ";
746  vol_voxels().printStats();
747  std::cout << std::endl;
748  }
749  // Apply surface restriction
750  if (prm->surface_mask != nullptr)
751  {
752  vol_POCS() = (*(prm->surface_mask))();
753  }
754  else
755  {
756  vol_POCS().resize(vol_voxels());
757  vol_POCS().initZeros();
758  }
760  {
761  vol_POCS.write("PPPvolPOCS1.vol");
762  std::cout << "Stats PPPvolPOCS1.vol: ";
763  vol_POCS().printStats();
764  std::cout << std::endl;
765  }
766  // Force symmetry
767  if (prm->force_sym != 0)
768  {
769  symmetrizeVolume(prm->SL, vol_voxels(), vol_aux());
770  desired_volume = &vol_aux;
772  {
773  vol_aux.write("PPPvolPOCS2.vol");
774  std::cout << "Stats PPPvolPOCS2.vol: ";
775  vol_aux().printStats();
776  std::cout << std::endl;
777  }
778  }
779  // Apply volume constraint
780  if (prm->known_volume != -1)
781  {
782  Histogram1D hist;
783  MultidimArray<int> aux_mask;
784  aux_mask.resize(vol_POCS());
786  aux_mask(k, i, j) = 1 - (int)vol_POCS(k, i, j);
787  long mask_voxels = vol_POCS().countThreshold("below", 0.5, 0);
789  aux_mask, vol_voxels(), hist, 300);
790  double known_percentage;
791  known_percentage = XMIPP_MIN(100, 100 * prm->known_volume / mask_voxels);
792  double threshold;
793  threshold = hist.percentil(100 - known_percentage);
794  FOR_ALL_ELEMENTS_IN_ARRAY3D(vol_voxels())
795  if (vol_voxels(k, i, j) < threshold)
796  vol_POCS(k, i, j) = 1;
797  }
799  {
800  vol_POCS.write("PPPvolPOCS3.vol");
801  std::cout << "Stats PPPvolPOCS3.vol: ";
802  vol_POCS().printStats();
803  std::cout << std::endl;
804  }
805 
806  // Do not allow positivity outside interest region
807  // and do not allow negativity inside the interest region
808  // if positivity restrictions are to be applied
809  // int bg = (int) vol_POCS().sum();
810  // int fg = MULTIDIM_SIZE(vol_POCS()) - bg;
811  int relax = 0, posi = 0;
812  const MultidimArray<double> &mVolVoxels=vol_voxels();
813  const MultidimArray<double> &mVolPOCS=vol_POCS();
815  if (DIRECT_A3D_ELEM(mVolPOCS,k, i, j) == 1 && DIRECT_A3D_ELEM(mVolVoxels,k, i, j) < 0)
816  {
817  DIRECT_A3D_ELEM(mVolPOCS,k, i, j) = 0;
818  relax++;
819  }
820  else if (DIRECT_A3D_ELEM(mVolPOCS,k, i, j) == 0 && DIRECT_A3D_ELEM(mVolVoxels,k, i, j) < 0 && prm->positivity)
821  {
822  DIRECT_A3D_ELEM(mVolPOCS,k, i, j) = 1;
823  posi++;
824  }
825  // Debugging messages
826  //std::cout << "Relaxation/Positivity " << (double)relax/(double)bg << " "
827  // << (double)posi/(double)fg << " " << std::endl;
828 
829  // Solve volumetric equations
830  switch (prm->basis.type)
831  {
832  case Basis::blobs:
833  if (desired_volume == nullptr)
834  ART_voxels2blobs_single_step(vol_basis, &vol_basis,
835  prm->basis.blob, prm->D, prm->lambda(it),
836  &(theo_POCS_vol()), nullptr,
837  &(corr_POCS_vol()),
838  &(vol_POCS()),
840  else
841  {
842  FOR_ALL_ELEMENTS_IN_ARRAY3D(vol_POCS())
843  if (vol_POCS(k, i, j) == 1)
844  (*desired_volume)(k, i, j) = 0;
845  for (int i = 0; i < prm->force_sym; i++)
846  {
847  ART_voxels2blobs_single_step(vol_basis, &vol_basis,
848  prm->basis.blob, prm->D, prm->lambda(it),
849  &(theo_POCS_vol()), &((*desired_volume)()),
850  &(corr_POCS_vol()),
851  nullptr,
853  if (prm->tell&TELL_SAVE_AT_EACH_STEP)
854  std::cout << " POCS Iteration " << i
855  << " POCS Error=" << POCS_mean_error << std::endl;
856  }
857  }
858  break;
859  case Basis::voxels:
860  if (desired_volume == nullptr)
861  {
862  FOR_ALL_ELEMENTS_IN_ARRAY3D(vol_POCS())
863  if (vol_POCS(k, i, j))
864  vol_basis(0)(k, i, j) = 0;
865  }
866  else
867  {
868  vol_basis(0)().initZeros();
869  FOR_ALL_ELEMENTS_IN_ARRAY3D((*desired_volume)())
870  vol_basis(0)(k, i, j) = (*desired_volume)(k, i, j);
871  }
872  POCS_mean_error = -1;
873  break;
874  default:
875  REPORT_ERROR(ERR_ARG_INCORRECT,"This function cannot work with this basis");
876  }
877  POCS_i = 1;
879  POCS_N++;
880 
881  // Now some control logic
882  if (prm->numIMG - images < 100 || images % 100 == 0 ||
883  desired_volume != nullptr)
884  {
885  POCS_freq = 1;
887  POCS_vec_i = 0;
888  }
889  else
890  {
891  double dummy;
892  switch (POCS_state)
893  {
894  case POCS_measuring:
895 #ifdef DEBUG_POCS
896 
897  std::cout << "M:" << POCS_vec_i << " " << POCS_mean_error << std::endl;
898 #endif
899 
901  if (POCS_vec_i == POCS_N_measure)
902  {
903  POCS_vec_i = 0;
904  // Change to use state
905  POCS_used = 0;
906  POCS_freq++;
908 #ifdef DEBUG_POCS
909 
910  std::cout << "1: Changing to " << POCS_freq << std::endl;
911 #endif
912 
913  }
914  break;
915  case POCS_use:
916  POCS_used++;
918  POCS_stddev, dummy, POCS_min);
919 #ifdef DEBUG_POCS
920 
921  std::cout << "Reference errors: " << POCS_errors.transpose() << std::endl;
922  std::cout << "Checking " << ABS(POCS_mean_error - POCS_avg) << " " << 1.2*1.96*POCS_stddev << std::endl;
923 #endif
924 
925  if (ABS(POCS_mean_error - POCS_avg) < 1.2*1.96*POCS_stddev)
926  {
928  {
929  double max_error = POCS_errors(0);
930  POCS_vec_i = 0;
931  for (int i = 1; i < POCS_N_measure; i++)
932  if (POCS_errors(i) > max_error)
933  {
934  max_error = POCS_errors(i);
935  POCS_vec_i = i;
936  }
938  }
939  if (POCS_used < POCS_N_use)
940  { // While not enough uses
941  }
942  else if (POCS_freq < 3)
943  { // increase frequency
944  POCS_freq++;
945 #ifdef DEBUG_POCS
946 
947  std::cout << "2: Changing to " << POCS_freq << std::endl;
948 #endif
949 
950  POCS_used = 0;
951  }
952  }
953  else
954  {
955  // It is behaving worse
956  if (POCS_freq > prm->POCS_freq + 1)
957  {
958  POCS_freq = prm->POCS_freq + 1;
959  POCS_used = 0;
960 #ifdef DEBUG_POCS
961 
962  std::cout << "3: Changing to " << POCS_freq << std::endl;
963 #endif
964 
965  }
966  else if (POCS_used > 2)
967  {
969  // Change status
970  POCS_used = 0;
972 #ifdef DEBUG_POCS
973 
974  std::cout << "Lowering\n";
975 #endif
976 
977  }
978  }
979  break;
980  case POCS_lowering:
981  // Lower the POCS error before measuring again
983  POCS_stddev, POCS_max, dummy);
984  POCS_used++;
985  if (POCS_mean_error < POCS_max || POCS_used > 2*POCS_N_measure)
986  {
987  // Change status
988  POCS_vec_i = 0;
990  }
991  break;
992  default:
993  REPORT_ERROR(ERR_ARG_INCORRECT,"Unknown equation mode");
994  }
995  }
996  }
997  else
998  {
999  POCS_i++;
1000  POCS_mean_error = -1;
1001  }
1002 }
bool positivity
Apply positivity constraint.
Definition: basic_art.h:246
double POCS_avg
Definition: recons_misc.h:117
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
bool apply_POCS
Definition: recons_misc.h:132
double POCS_max_error
Definition: recons_misc.h:122
Basis basis
Basis function. By default, blobs.
Definition: basic_art.h:97
double POCS_min
Definition: recons_misc.h:119
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
double POCS_global_mean_error
Definition: recons_misc.h:123
double POCS_mean_error
Definition: recons_misc.h:121
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)
Definition: symmetrize.cpp:117
Matrix2D< double > * D
Definition: basic_art.h:365
void computeStats(double &avg, double &stddev, T &minval, T &maxval) const
int POCS_vec_i
Definition: recons_misc.h:126
void ART_voxels2blobs_single_step(GridVolume &vol_in, GridVolume *vol_out, const struct blobtype &blob, const Matrix2D< double > *D, double lambda, MultidimArray< double > *theo_vol, const MultidimArray< double > *read_vol, MultidimArray< double > *corr_vol, const MultidimArray< double > *mask_vol, double &mean_error, double &max_error, int eq_mode, int threads)
Definition: blobs.cpp:1094
constexpr int VARTK
Definition: blobs.h:378
int Youtput_volume_size
Definition: recons_misc.h:130
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)
struct blobtype blob
Blob parameters.
Definition: basis.h:61
double percentil(double percent_mass)
Definition: histogram.cpp:160
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
tBasisFunction type
Basis function to use.
Definition: basis.h:52
void changeToVoxels(GridVolume &vol_basis, MultidimArray< double > *vol_voxels, int Zdim, int Ydim, int Xdim, int threads=1) const
Definition: basis.cpp:261
#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
void threshold(double *phi, unsigned long nvox, double limit)
Definition: lib_vwk.cpp:524
double known_volume
Known volume. If -1, not applied.
Definition: basic_art.h:226
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
Incorrect argument received.
Definition: xmipp_error.h:113
int Xoutput_volume_size
Definition: recons_misc.h:131
#define ABS(x)
Definition: xmipp_macros.h:142
double dummy
for(j=1;j<=i__1;++j)
#define DIRECT_A3D_ELEM(v, k, i, j)
#define XMIPP_MIN(x, y)
Definition: xmipp_macros.h:181
#define j
int force_sym
Force the reconstruction to be symmetric this number of times.
Definition: basic_art.h:196
double POCS_max
Definition: recons_misc.h:120
#define TELL_SAVE_AT_EACH_STEP
Definition: basic_art.h:274
Image< double > * surface_mask
Definition: basic_art.h:371
double POCS_stddev
Definition: recons_misc.h:118
int POCS_freq
Definition: recons_misc.h:124
int POCS_used
Definition: recons_misc.h:127
int Zoutput_volume_size
Definition: recons_misc.h:129
double lambda(int n)
Definition: basic_art.h:438
MultidimArray< double > POCS_errors
Definition: recons_misc.h:133
void compute_hist_within_binary_mask(const MultidimArray< int > &mask, MultidimArray< T > &v, Histogram1D &hist, int no_steps)
Definition: mask.h:906
t_POCS_status POCS_state
Definition: recons_misc.h:116
BasicARTParameters * prm
Definition: recons_misc.h:134
SymList SL
A list with the symmetry matrices.
Definition: basic_art.h:330

◆ newIteration()

void POCSClass::newIteration ( )

Start New ART iteration.

Definition at line 719 of file recons_misc.cpp.

720 {
722 }
double POCS_global_mean_error
Definition: recons_misc.h:123

◆ newProjection()

void POCSClass::newProjection ( )

Start new Projection.

Definition at line 724 of file recons_misc.cpp.

725 {
726  POCS_N = 0;
727 }

Member Data Documentation

◆ apply_POCS

bool POCSClass::apply_POCS

Definition at line 132 of file recons_misc.h.

◆ POCS_avg

double POCSClass::POCS_avg

Definition at line 117 of file recons_misc.h.

◆ POCS_errors

MultidimArray<double> POCSClass::POCS_errors

Definition at line 133 of file recons_misc.h.

◆ POCS_freq

int POCSClass::POCS_freq

Definition at line 124 of file recons_misc.h.

◆ POCS_global_mean_error

double POCSClass::POCS_global_mean_error

Definition at line 123 of file recons_misc.h.

◆ POCS_i

int POCSClass::POCS_i

Definition at line 125 of file recons_misc.h.

◆ POCS_max

double POCSClass::POCS_max

Definition at line 120 of file recons_misc.h.

◆ POCS_max_error

double POCSClass::POCS_max_error

Definition at line 122 of file recons_misc.h.

◆ POCS_mean_error

double POCSClass::POCS_mean_error

Definition at line 121 of file recons_misc.h.

◆ POCS_min

double POCSClass::POCS_min

Definition at line 119 of file recons_misc.h.

◆ POCS_N

int POCSClass::POCS_N

Definition at line 128 of file recons_misc.h.

◆ POCS_state

t_POCS_status POCSClass::POCS_state

Definition at line 116 of file recons_misc.h.

◆ POCS_stddev

double POCSClass::POCS_stddev

Definition at line 118 of file recons_misc.h.

◆ POCS_used

int POCSClass::POCS_used

Definition at line 127 of file recons_misc.h.

◆ POCS_vec_i

int POCSClass::POCS_vec_i

Definition at line 126 of file recons_misc.h.

◆ prm

BasicARTParameters* POCSClass::prm

Definition at line 134 of file recons_misc.h.

◆ Xoutput_volume_size

int POCSClass::Xoutput_volume_size

Definition at line 131 of file recons_misc.h.

◆ Youtput_volume_size

int POCSClass::Youtput_volume_size

Definition at line 130 of file recons_misc.h.

◆ Zoutput_volume_size

int POCSClass::Zoutput_volume_size

Definition at line 129 of file recons_misc.h.


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