Xmipp  v3.23.11-Nereus
Macros | Functions | Variables
projection.cpp File Reference
#include "projection.h"
#include "core/geometry.h"
#include "core/metadata_vec.h"
#include "core/matrix2d.h"
#include "core/xmipp_image.h"
#include "core/xmipp_macros.h"
#include "core/xmipp_program.h"
#include "core/transformations.h"
#include "data/fourier_projection.h"
#include "data/basis.h"
Include dependency graph for projection.cpp:

Go to the source code of this file.

Macros

#define x0   STARTINGX(IMGMATRIX(proj))
 
#define xF   FINISHINGX(IMGMATRIX(proj))
 
#define y0   STARTINGY(IMGMATRIX(proj))
 
#define yF   FINISHINGY(IMGMATRIX(proj))
 
#define xDim   XSIZE(IMGMATRIX(proj))
 
#define yDim   YSIZE(IMGMATRIX(proj))
 
#define wrap_as_Crystal(x, y, xw, yw)
 
#define xc   XX(rc)
 
#define yc   YY(rc)
 
#define x   XX(r)
 
#define y   YY(r)
 

Functions

void projectVolume (MultidimArray< double > &V, Projection &P, int Ydim, int Xdim, double rot, double tilt, double psi, const Matrix1D< double > *roffset)
 
void projectVolumeOffCentered (MultidimArray< double > &V, Projection &P, int Ydim, int Xdim)
 
void singleWBP (MultidimArray< double > &V, Projection &P)
 
void project_Crystal_SimpleGrid (Image< double > &vol, const SimpleGrid &grid, const Basis &basis, Projection &proj, Projection &norm_proj, const Matrix1D< double > &shift, const Matrix1D< double > &aint, const Matrix1D< double > &bint, const Matrix2D< double > &D, const Matrix2D< double > &Dinv, const MultidimArray< int > &mask, int FORW, int eq_mode)
 
void project_Crystal_Volume (GridVolume &vol, const Basis &basis, Projection &proj, Projection &norm_proj, int Ydim, int Xdim, double rot, double tilt, double psi, const Matrix1D< double > &shift, const Matrix1D< double > &aint, const Matrix1D< double > &bint, const Matrix2D< double > &D, const Matrix2D< double > &Dinv, const MultidimArray< int > &mask, int FORW, int eq_mode)
 
void count_eqs_in_projection (GridVolumeT< int > &GVNeq, const Basis &basis, Projection &read_proj)
 
template<class T >
void * project_SimpleGridThread (void *params)
 
template<class T >
void project_SimpleGrid (Image< T > *vol, const SimpleGrid *grid, const Basis *basis, Projection *proj, Projection *norm_proj, int FORW, int eq_mode, const Image< int > *VNeq, Matrix2D< double > *M, const MultidimArray< int > *mask, double ray_length, int thread_id, int numthreads)
 
template<class T >
void project_GridVolume (GridVolumeT< T > &vol, const Basis &basis, Projection &proj, Projection &norm_proj, int Ydim, int Xdim, double rot, double tilt, double psi, int FORW, int eq_mode, GridVolumeT< int > *GVNeq, Matrix2D< double > *M, const MultidimArray< int > *mask, double ray_length, int threads)
 
template void * project_SimpleGridThread< double > (void *)
 
template void project_GridVolume< double > (GridVolumeT< double > &, Basis const &, Projection &, Projection &, int, int, double, double, double, int, int, GridVolumeT< int > *, Matrix2D< double > *, MultidimArray< int > const *, double, int)
 

Variables

barrier_t project_barrier
 
pthread_mutex_t project_mutex = PTHREAD_MUTEX_INITIALIZER
 
project_thread_paramsproject_threads
 

Macro Definition Documentation

◆ wrap_as_Crystal

#define wrap_as_Crystal (   x,
  y,
  xw,
  yw 
)
Value:
xw=(int) intWRAP(x,x0,xF); \
yw=(int) intWRAP(y,y0,yF);
#define x
#define xF
Definition: projection.cpp:38
#define yF
Definition: projection.cpp:40
#define x0
Definition: projection.cpp:37
#define y
#define intWRAP(x, x0, xF)
Definition: xmipp_macros.h:272
#define y0
Definition: projection.cpp:39

Definition at line 769 of file projection.cpp.

◆ x

double * x   XX(r)

Definition at line 2473 of file numerical_recipes.cpp.

◆ x0

#define x0   STARTINGX(IMGMATRIX(proj))

Definition at line 37 of file projection.cpp.

◆ xc

#define xc   XX(rc)

◆ xDim

#define xDim   XSIZE(IMGMATRIX(proj))

Definition at line 41 of file projection.cpp.

◆ xF

#define xF   FINISHINGX(IMGMATRIX(proj))

Definition at line 38 of file projection.cpp.

◆ y

static void y   YY(r)

Definition at line 8508 of file numerical_recipes.cpp.

◆ y0

#define y0   STARTINGY(IMGMATRIX(proj))

Definition at line 39 of file projection.cpp.

◆ yc

#define yc   YY(rc)

◆ yDim

#define yDim   YSIZE(IMGMATRIX(proj))

Definition at line 42 of file projection.cpp.

◆ yF

#define yF   FINISHINGY(IMGMATRIX(proj))

Definition at line 40 of file projection.cpp.

Function Documentation

◆ project_Crystal_SimpleGrid()

void project_Crystal_SimpleGrid ( Image< double > &  vol,
const SimpleGrid grid,
const Basis basis,
Projection proj,
Projection norm_proj,
const Matrix1D< double > &  shift,
const Matrix1D< double > &  aint,
const Matrix1D< double > &  bint,
const Matrix2D< double > &  D,
const Matrix2D< double > &  Dinv,
const MultidimArray< int > &  mask,
int  FORW,
int  eq_mode 
)

Definition at line 773 of file projection.cpp.

780 {
781  Matrix1D<double> prjX(3); // Coordinate: Projection of the
782  Matrix1D<double> prjY(3); // 3 grid vectors
783  Matrix1D<double> prjZ(3);
784  Matrix1D<double> prjOrigin(3); // Coordinate: Where in the 2D
785  // projection plane the origin of
786  // the grid projects
787  Matrix1D<double> prjaint(3); // Coordinate: Projection of the
788  Matrix1D<double> prjbint(3); // 2 deformed lattice vectors
789  Matrix1D<double> prjDir; // Direction of projection
790  // in the deformed space
791 
792  Matrix1D<double> actprj(3); // Coord: Actual position inside
793  // the projection plane
794  Matrix1D<double> defactprj(3); // Coord: Actual position inside
795  // the deformed projection plane
796  Matrix1D<double> beginZ(3); // Coord: Plane coordinates of the
797  // projection of the 3D point
798  // (z0,YY(lowest),XX(lowest))
799  Matrix1D<double> beginY(3); // Coord: Plane coordinates of the
800  // projection of the 3D point
801  // (z0,y0,XX(lowest))
802  Matrix1D<double> footprint_size(2); // The footprint is supposed
803  // to be defined between
804  // (-vmax,+vmax) in the Y axis,
805  // and (-umax,+umax) in the X axis
806  // This footprint size is the
807  // R2 vector (umax,vmax).
808  Matrix1D<double> deffootprint_size(2); // The footprint size
809  // in the deformed space
810  int XX_corner2;
811  int XX_corner1; // Coord: Corners of the
812  int YY_corner2;
813  int YY_corner1; // footprint when it is projected
814  // onto the projection plane
815  Matrix1D<double> rc(2);
816  Matrix1D<double> r(2); // Position vector which will
817  // move from corner1 to corner2.
818  // In rc the wrapping is not
819  // considered, while it is in r
820  int foot_V;
821  int foot_U; // Img Coord: coordinate
822  // corresponding to the blobprint
823  // point which matches with this
824  // pixel position
825  double vol_corr=0.; // Correction for a volume element
826  int N_eq; // Number of equations in which
827  // a blob is involved
828  int i;
829  int j;
830  int k; // volume element indexes
831  SPEED_UP_temps01; // Auxiliary variables for
832  // fast multiplications
833 
834  // Check that it is a blob volume .......................................
835  if (basis.type != Basis::blobs)
836  REPORT_ERROR(ERR_VALUE_INCORRECT, "project_Crystal_SimpleGrid: Cannot project other than "
837  "blob volumes");
838 
839  // Compute the deformed direction of projection .........................
840  Matrix2D<double> Eulerg;
841  Eulerg = proj.euler * D;
842 
843  // Compute deformation in the projection space ..........................
844  // The following two vectors are defined in the deformed volume space
845  VECTOR_R3(actprj, XX(aint), YY(aint), 0);
846  grid.Gdir_project_to_plane(actprj, Eulerg, prjaint);
847  VECTOR_R3(actprj, XX(bint), YY(bint), 0);
848  grid.Gdir_project_to_plane(actprj, Eulerg, prjbint);
849  //#define DEBUG_LITTLE
850 #ifdef DEBUG_LITTLE
851 
852  double rot, tilt, psi;
853  Euler_matrix2angles(proj.euler, rot, tilt, psi);
854  std::cout << "rot= " << rot << " tilt= " << tilt
855  << " psi= " << psi << std::endl;
856  std::cout << "D\n" << D << std::endl;
857  std::cout << "Eulerf\n" << proj.euler << std::endl;
858  std::cout << "Eulerg\n" << Eulerg << std::endl;
859  std::cout << "aint " << aint.transpose() << std::endl;
860  std::cout << "bint " << bint.transpose() << std::endl;
861  std::cout << "prjaint " << prjaint.transpose() << std::endl;
862  std::cout << "prjbint " << prjbint.transpose() << std::endl;
863  std::cout.flush();
864 #endif
865  // Project grid axis ....................................................
866  // These vectors ((1,0,0),(0,1,0),...) are referred to the grid
867  // coord. system and the result is a 2D vector in the image plane
868  // The unit size within the image plane is 1, ie, the same as for
869  // the universal grid.
870  // Be careful that these grid vectors are defined in the deformed
871  // volume space, and the projection are defined in the deformed
872  // projections,
873  VECTOR_R3(actprj, 1, 0, 0);
874  grid.Gdir_project_to_plane(actprj, Eulerg, prjX);
875  VECTOR_R3(actprj, 0, 1, 0);
876  grid.Gdir_project_to_plane(actprj, Eulerg, prjY);
877  VECTOR_R3(actprj, 0, 0, 1);
878  grid.Gdir_project_to_plane(actprj, Eulerg, prjZ);
879 
880  // This time the origin of the grid is in the universal coord system
881  // but in the deformed space
882  Uproject_to_plane(grid.origin, Eulerg, prjOrigin);
883 
884  // This is a correction used by the crystallographic symmetries
885  prjOrigin += XX(shift) * prjaint + YY(shift) * prjbint;
886 
887 #ifdef DEBUG_LITTLE
888 
889  std::cout << "prjX " << prjX.transpose() << std::endl;
890  std::cout << "prjY " << prjY.transpose() << std::endl;
891  std::cout << "prjZ " << prjZ.transpose() << std::endl;
892  std::cout << "prjOrigin " << prjOrigin.transpose() << std::endl;
893  std::cout.flush();
894 #endif
895 
896  // Now I will impose that prja becomes (Xdim,0) and prjb, (0,Ydim)
897  // A is a matrix such that
898  // A*prjaint=(Xdim,0)'
899  // A*prjbint=(0,Ydim)'
900  Matrix2D<double> A(2, 2);
901  Matrix2D<double> Ainv(2, 2);
902  A(0, 0) = YY(prjbint) * xDim;
903  A(0, 1) = -XX(prjbint) * xDim;
904  A(1, 0) = -YY(prjaint) * yDim;
905  A(1, 1) = XX(prjaint) * yDim;
906  double nor = 1 / (XX(prjaint) * YY(prjbint) - XX(prjbint) * YY(prjaint));
907  M2x2_BY_CT(A, A, nor);
908  M2x2_INV(Ainv, A);
909 
910 #ifdef DEBUG_LITTLE
911 
912  std::cout << "A\n" << A << std::endl;
913  std::cout << "Ainv\n" << Ainv << std::endl;
914  std::cout << "Check that A*prjaint=(Xdim,0) "
915  << (A*vectorR2(XX(prjaint), YY(prjaint))).transpose() << std::endl;
916  std::cout << "Check that A*prjbint=(0,Ydim) "
917  << (A*vectorR2(XX(prjbint), YY(prjbint))).transpose() << std::endl;
918  std::cout << "Check that Ainv*(Xdim,0)=prjaint "
919  << (Ainv*vectorR2(xDim, 0)).transpose() << std::endl;
920  std::cout << "Check that Ainv*(0,Ydim)=prjbint "
921  << (Ainv*vectorR2(0, yDim)).transpose() << std::endl;
922  std::cout.flush();
923 #endif
924 
925  // Footprint size .......................................................
926  // The following vectors are integer valued vectors, but they are
927  // stored as real ones to make easier operations with other vectors.
928  // Look out that this footprint size is in the deformed projection,
929  // that is why it is not a square footprint but a parallelogram
930  // and we have to look for the smaller rectangle which surrounds it
931  XX(footprint_size) = basis.blobprint.umax();
932  YY(footprint_size) = basis.blobprint.vmax();
933  N_eq = (2 * basis.blobprint.umax() + 1) * (2 * basis.blobprint.vmax() + 1);
934  Matrix1D<double> c1(3);
935  Matrix1D<double> c2(3);
936  XX(c1) = XX(footprint_size);
937  YY(c1) = YY(footprint_size);
938  XX(c2) = -XX(c1);
939  YY(c2) = YY(c1);
940  M2x2_BY_V2x1(c1, A, c1);
941  M2x2_BY_V2x1(c2, A, c2);
942  XX(deffootprint_size) = fmax(fabs(XX(c1)), fabs(XX(c2)));
943  YY(deffootprint_size) = fmax(fabs(YY(c1)), fabs(YY(c2)));
944 
945 #ifdef DEBUG_LITTLE
946 
947  std::cout << "Footprint_size " << footprint_size.transpose() << std::endl;
948  std::cout << "c1: " << c1.transpose() << std::endl;
949  std::cout << "c2: " << c2.transpose() << std::endl;
950  std::cout << "Deformed Footprint_size " << deffootprint_size.transpose()
951  << std::endl;
952  std::cout.flush();
953 #endif
954 
955  // This type conversion gives more speed
956  auto ZZ_lowest = (int) ZZ(grid.lowest);
957  int YY_lowest = XMIPP_MAX((int) YY(grid.lowest), STARTINGY(mask));
958  int XX_lowest = XMIPP_MAX((int) XX(grid.lowest), STARTINGX(mask));
959  auto ZZ_highest = (int) ZZ(grid.highest);
960  int YY_highest = XMIPP_MIN((int) YY(grid.highest), FINISHINGY(mask));
961  int XX_highest = XMIPP_MIN((int) XX(grid.highest), FINISHINGX(mask));
962 
963  // Project the whole grid ...............................................
964  // Corner of the plane defined by Z. These coordinates try to be within
965  // the valid indexes of the projection (defined between STARTING and
966  // FINISHING values, but it could be that they may lie outside.
967  // These coordinates need not to be integer, in general, they are
968  // real vectors.
969  // The vectors returned by the projection routines are R3 but we
970  // are only interested in their first 2 components, ie, in the
971  // in-plane components
972  beginZ = (double)XX_lowest * prjX + (double)YY_lowest * prjY + (double)ZZ_lowest * prjZ + prjOrigin;
973 
974 #ifdef DEBUG_LITTLE
975 
976  std::cout << "BeginZ " << beginZ.transpose() << std::endl;
977  std::cout << "Mask ";
978  mask.printShape();
979  std::cout << std::endl;
980  std::cout << "Vol ";
981  vol().printShape();
982  std::cout << std::endl;
983  std::cout << "Proj ";
984  proj().printShape();
985  std::cout << std::endl;
986  std::cout << "Norm Proj ";
987  norm_proj().printShape();
988  std::cout << std::endl;
989  //std::cout << "Footprint ";
990  //footprint().printShape();
991  //std::cout << std::endl;
992  //std::cout << "Footprint2 ";
993  //footprint2().printShape();
994  //std::cout << std::endl;
995 #endif
996 
997  Matrix1D<double> grid_index(3);
998  for (k = ZZ_lowest; k <= ZZ_highest; k++)
999  {
1000  // Corner of the row defined by Y
1001  beginY = beginZ;
1002  for (i = YY_lowest; i <= YY_highest; i++)
1003  {
1004  // First point in the row
1005  actprj = beginY;
1006  for (j = XX_lowest; j <= XX_highest; j++)
1007  {
1008  VECTOR_R3(grid_index, j, i, k);
1009 #ifdef DEBUG
1010 
1011  std::cout << "Visiting " << i << " " << j << std::endl;
1012 #endif
1013 
1014  // Be careful that you cannot skip any blob, although its
1015  // value be 0, because it is useful for norm_proj
1016  // unless it doesn't belong to the reconstruction mask
1017  if (A2D_ELEM(mask, i, j) && grid.is_interesting(grid_index))
1018  {
1019  // Look for the position in the deformed projection
1020  M2x2_BY_V2x1(defactprj, A, actprj);
1021 
1022  // Search for integer corners for this blob
1023  XX_corner1 = CEIL(XX(defactprj) - XX(deffootprint_size));
1024  YY_corner1 = CEIL(YY(defactprj) - YY(deffootprint_size));
1025  XX_corner2 = FLOOR(XX(defactprj) + XX(deffootprint_size));
1026  YY_corner2 = FLOOR(YY(defactprj) + YY(deffootprint_size));
1027 
1028 #ifdef DEBUG
1029 
1030  std::cout << " k= " << k << " i= " << i << " j= " << j << std::endl;
1031  std::cout << " Actual position: " << actprj.transpose() << std::endl;
1032  std::cout << " Deformed position: " << defactprj.transpose() << std::endl;
1033  std::cout << " Blob corners: (" << XX_corner1 << "," << YY_corner1
1034  << ") (" << XX_corner2 << "," << YY_corner2 << ")\n";
1035  std::cout.flush();
1036 #endif
1037 
1038  // Now there is no way that both corners collapse into a line,
1039  // since the projection points are wrapped
1040 
1041  if (!FORW)
1042  vol_corr = 0;
1043 
1044  // Effectively project this blob
1045  // (xc,yc) is the position of the considered pixel
1046  // in the crystal undeformed projection
1047  // When wrapping and deformation are considered then x and
1048  // y are used
1049 #define xc XX(rc)
1050 #define yc YY(rc)
1051 #define x XX(r)
1052 #define y YY(r)
1053 
1054  for (y = YY_corner1; y <= YY_corner2; y++)
1055  for (x = XX_corner1; x <= XX_corner2; x++)
1056  {
1057  // Compute position in undeformed space and
1058  // corresponding sample in the blob footprint
1059  M2x2_BY_V2x1(rc, Ainv, r);
1060  OVER2IMG(basis.blobprint, yc - YY(actprj), xc - XX(actprj),
1061  foot_V, foot_U);
1062 
1063 #ifdef DEBUG
1064 
1065  std::cout << " Studying: " << r.transpose()
1066  << "--> " << rc.transpose()
1067  << "dist (" << xc - XX(actprj)
1068  << "," << yc - YY(actprj) << ") --> "
1069  << foot_U << " " << foot_V << std::endl;
1070  std::cout.flush();
1071 #endif
1072 
1073  if (IMGMATRIX(basis.blobprint).outside(foot_V, foot_U))
1074  continue;
1075 
1076  // Wrap positions
1077  int yw;
1078  int xw;
1079  wrap_as_Crystal(x, y, xw, yw);
1080 #ifdef DEBUG
1081 
1082  std::cout << " After wrapping " << xw << " " << yw << std::endl;
1083  std::cout << " Value added = " << VOLVOXEL(vol, k, i, j) *
1084  IMGPIXEL(basis.blobprint, foot_V, foot_U) << " Blob value = "
1085  << IMGPIXEL(basis.blobprint, foot_V, foot_U)
1086  << " Blob^2 " << IMGPIXEL(basis.blobprint2, foot_V, foot_U)
1087  << std::endl;
1088  std::cout.flush();
1089 #endif
1090 
1091  if (FORW)
1092  {
1093  IMGPIXEL(proj, yw, xw) += VOLVOXEL(vol, k, i, j) *
1094  IMGPIXEL(basis.blobprint, foot_V, foot_U);
1095  switch (eq_mode)
1096  {
1097  case CAVARTK:
1098  case ARTK:
1099  IMGPIXEL(norm_proj, yw, xw) +=
1100  IMGPIXEL(basis.blobprint2, foot_V, foot_U);
1101  break;
1102  }
1103  }
1104  else
1105  {
1106  vol_corr += IMGPIXEL(norm_proj, yw, xw) *
1107  IMGPIXEL(basis.blobprint, foot_V, foot_U);
1108  }
1109 
1110  }
1111 
1112 #ifdef DEBUG_INTERMIDIATE
1113  proj.write("inter.xmp");
1114  norm_proj.write("inter_norm.xmp");
1115  std::cout << "Press any key\n";
1116  char c;
1117  std::cin >> c;
1118 #endif
1119 
1120  if (!FORW)
1121  switch (eq_mode)
1122  {
1123  case ARTK:
1124  VOLVOXEL(vol, k, i, j) += vol_corr;
1125  break;
1126  case CAVARTK:
1127  VOLVOXEL(vol, k, i, j) += vol_corr / N_eq;
1128  break;
1129  }
1130  }
1131 
1132  // Prepare for next iteration
1133  V2_PLUS_V2(actprj, actprj, prjX);
1134  }
1135  V2_PLUS_V2(beginY, beginY, prjY);
1136  }
1137  V2_PLUS_V2(beginZ, beginZ, prjZ);
1138  }
1139  //#define DEBUG_AT_THE_END
1140 #ifdef DEBUG_AT_THE_END
1141  proj.write("inter.xmp");
1142  norm_proj.write("inter_norm.xmp");
1143  std::cout << "Press any key\n";
1144  char c;
1145  std::cin >> c;
1146 #endif
1147 
1148 #undef xc
1149 #undef yc
1150 #undef x
1151 #undef y
1152 #undef wrap_as_Crystal
1153 }
#define yc
#define A2D_ELEM(v, i, j)
#define yDim
Definition: projection.cpp:42
#define VOLVOXEL(V, k, i, j)
#define XMIPP_MAX(x, y)
Definition: xmipp_macros.h:193
Matrix1D< double > highest
Definition: grids.h:161
#define FINISHINGX(v)
void printShape(std::ostream &out=std::cout) const
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
#define xDim
Definition: projection.cpp:41
doublereal * c
Matrix2D< double > euler
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)
int umax() const
constexpr int ARTK
Definition: projection.h:177
tBasisFunction type
Basis function to use.
Definition: basis.h:52
#define x
ImageOver blobprint2
Square of the footprint.
Definition: basis.h:74
bool is_interesting(const Matrix1D< double > &uv) const
Definition: grids.h:361
#define IMGMATRIX(I)
Matrix1D< double > lowest
Definition: grids.h:158
#define V2_PLUS_V2(a, b, c)
Definition: matrix1d.h:134
#define STARTINGX(v)
#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
Matrix1D< T > transpose() const
Definition: matrix1d.cpp:644
#define STARTINGY(v)
int vmax() const
#define FLOOR(x)
Definition: xmipp_macros.h:240
#define XX(v)
Definition: matrix1d.h:85
#define M2x2_BY_V2x1(a, M, b)
Definition: matrix2d.h:225
void transpose(double *array, int size)
#define CEIL(x)
Definition: xmipp_macros.h:225
#define SPEED_UP_temps01
Definition: xmipp_macros.h:398
Matrix1D< double > vectorR2(double x, double y)
Definition: matrix1d.cpp:884
#define XMIPP_MIN(x, y)
Definition: xmipp_macros.h:181
#define M2x2_BY_CT(M2, M1, k)
Definition: matrix2d.h:237
#define j
#define YY(v)
Definition: matrix1d.h:93
#define FINISHINGY(v)
constexpr int CAVARTK
Definition: projection.h:181
#define y
Matrix1D< double > origin
Origin of the grid in the Universal coordinate system.
Definition: grids.h:165
double psi(const double x)
void Euler_matrix2angles(const Matrix2D< double > &A, double &alpha, double &beta, double &gamma, bool homogeneous)
Definition: geometry.cpp:839
#define VECTOR_R3(v, x, y, z)
Definition: matrix1d.h:124
#define OVER2IMG(IO, v, u, iv, iu)
void Gdir_project_to_plane(const Matrix1D< double > &gr, double rot, double tilt, double psi, Matrix1D< double > &result) const
Definition: grids.h:432
#define wrap_as_Crystal(x, y, xw, yw)
Definition: projection.cpp:769
#define M2x2_INV(Ainv, A)
Definition: matrix2d.h:286
Incorrect value received.
Definition: xmipp_error.h:195
void Uproject_to_plane(const Matrix1D< double > &point, const Matrix1D< double > &direction, double distance, Matrix1D< double > &result)
Definition: geometry.cpp:39
double fmax
#define ZZ(v)
Definition: matrix1d.h:101
#define IMGPIXEL(I, i, j)
ImageOver blobprint
Blob footprint.
Definition: basis.h:71
#define xc

◆ project_GridVolume< double >()

template void project_GridVolume< double > ( GridVolumeT< double > &  ,
Basis const &  ,
Projection ,
Projection ,
int  ,
int  ,
double  ,
double  ,
double  ,
int  ,
int  ,
GridVolumeT< int > *  ,
Matrix2D< double > *  ,
MultidimArray< int > const *  ,
double  ,
int   
)

◆ project_SimpleGridThread< double >()

template void* project_SimpleGridThread< double > ( void *  )