29 #ifndef _CORE_GRIDS_HH 30 #define _CORE_GRIDS_HH 47 std::ostream& operator << (std::ostream &o, const GridVolumeT<T> &GV);
245 void getSize(
int &Zdim,
int &Ydim,
int &Xdim)
const 247 Zdim = (int)(
ZZ(highest) -
ZZ(lowest)) + 1;
248 Ydim = (int)(
YY(highest) -
YY(lowest)) + 1;
249 Xdim = (int)(
XX(highest) -
XX(lowest)) + 1;
279 relative_size = size;
354 V3_BY_CT(gv, gv, 1 / relative_size);
482 std::vector<SimpleGrid> LG;
546 o <<
"Complex Grid -------------------------------------\n";
654 int Zdim,
int Ydim,
int Xdim);
775 std::vector<Image<T> * > LV;
800 adapt_to_grid(_grid);
841 for (
size_t i = 0;
i < VolumesNo();
i++)
857 grid.
getSize(Zdim, Ydim, Xdim);
859 (*Vol_aux)().resize(Zdim, Ydim, Xdim);
865 LV.push_back(Vol_aux);
877 std::vector<Image<T> * > LV_aux;
893 grid.
getSize(Zdim, Ydim, Xdim);
895 (*Vol_aux)().resize(Zdim, Ydim, Xdim);
910 LV_aux.push_back(Vol_aux);
930 (*Vol_aux)().resize(GV(
n)());
931 LV.push_back(Vol_aux);
938 for (
size_t i = 0;
i < VolumesNo();
i++)
939 (*
this)(
i)().initZeros();
945 for (
size_t i = 0;
i < VolumesNo();
i++)
1008 #define GRIDVOLUME_BY_SCALAR(op) \ 1009 GridVolumeT<T> result; \ 1011 result.LV.reserve(VolumesNo()); \ 1012 for (size_t i=0; i<VolumesNo(); i++) \ 1013 array_by_scalar((*this)(i)(),f,result(i)(),op); \ 1064 #define GRIDVOL_BY_GRIDVOL(op) \ 1065 GridVolumeT<T> result; \ 1066 Image<T> * Vol_aux; \ 1068 if (VolumesNo()!=GV.VolumesNo()) \ 1069 REPORT_ERROR(ERR_GRID_SIZE,(std::string)"GridVolume::"+op+": Different number of subvolumes");\ 1072 result.LV.reserve(VolumesNo());\ 1074 for (size_t i=0; i<VolumesNo(); i++) { \ 1076 Vol_aux = new Image<T>; \ 1077 arrayByArray((*this)(i)(),GV(i)(),(*Vol_aux)(),op); \ 1078 result.LV.push_back(Vol_aux); \ 1079 } catch (XmippError XE) {\ 1080 std::cout << XE.what(); \ 1081 REPORT_ERROR(ERR_GRID_SIZE,(std::string)"GridVolume::"+op+": Different shape of volume " +\ 1082 integerToString(i)); \ 1128 #define GRIDVOL_BY_GRIDVOLASSIG(op) \ 1129 if (VolumesNo()!=GV.VolumesNo()) \ 1130 REPORT_ERROR(ERR_GRID_SIZE,(std::string)"GridVolume::"+op+"=: Different number of subvolumes");\ 1132 for (size_t i=0; i<VolumesNo(); i++) { \ 1134 arrayByArray((*this)(i)(),GV(i)(),(*this)(i)(),op); \ 1135 } catch (XmippError XE) {\ 1136 std::cout << XE.what(); \ 1137 REPORT_ERROR(ERR_GRID_SIZE,(std::string)"GridVolume::"+op+"=: Different shape of volume " +\ 1138 integerToString(i)); \ 1201 const std::type_info &typeinfoT =
typeid(T);
1203 const std::type_info &typeinfoD =
typeid(double);
1204 const std::type_info &typeinfoI =
typeid(int);
1206 floatsize = (size_t)
sizeof(
float);
1208 if (VolumesNo() == 0)
1215 for (
size_t v = 0; v < VolumesNo(); v++)
1217 const Image<T> & this_vol = (*this)(v);
1218 Zdim +=
ZSIZE(this_vol());
1225 Ydim = (int)
CEIL(25.0
f / Xdim);
1228 VOLMATRIX(V).initZeros(Zdim + VolumesNo(), Ydim, Xdim);
1231 #define PACK_DOUBLE(v) \ 1232 {jj=pos%Xdim; ii=pos/Xdim; pos++; VOLVOXEL(V,sli,ii,jj)=(T)(v);} 1233 #define PACK_INT(v) \ 1234 {jj=pos%Xdim; ii=pos/Xdim; pos++; \ 1235 temp_float = (float) (v); \ 1236 memcpy( &(VOLVOXEL(V,sli,ii,jj)) , &temp_float, floatsize); \ 1240 for (
size_t v = 0; v < VolumesNo(); v++)
1251 const Image<T> & this_vol = (*this)(v);
1256 if (typeinfoT == typeinfoD)
1258 for (i = 0; i < 3; i++)
1259 for (j = 0; j < 3; j++)
1261 for (i = 0; i < 3; i++)
1263 for (i = 0; i < 3; i++)
1266 for (i = 0; i < 3; i++)
1278 else if (typeinfoT == typeinfoI)
1282 if (
sizeof(
float) !=
sizeof(
int))
1284 "GridVolume is integer and (sizeof(float)!= sizeof(int)");
1286 for (i = 0; i < 3; i++)
1287 for (j = 0; j < 3; j++)
1289 for (i = 0; i < 3; i++)
1291 for (i = 0; i < 3; i++)
1294 for (i = 0; i < 3; i++)
1339 const std::type_info &typeinfoT =
typeid(T);
1341 const std::type_info &typeinfoD =
typeid(double);
1342 const std::type_info &typeinfoI =
typeid(int);
1344 floatsize = (size_t)
sizeof(
float);
1347 if ((
typeid(T) ==
typeid(int)) && (
sizeof(float) !=
sizeof(
int)))
1358 if (basisName==
"voxels")
1360 V().setXmippOrigin();
1368 #define UNPACK_DOUBLE(v,cast) \ 1369 {jj=pos%VOLMATRIX(V).xdim; ii=pos/VOLMATRIX(V).xdim; pos++; \ 1370 (v)=(cast)VOLVOXEL(V,sli,ii,jj);} 1371 #define UNPACK_INT(v,cast) \ 1372 {jj=pos%VOLMATRIX(V).xdim; ii=pos/VOLMATRIX(V).xdim; pos++; \ 1373 memcpy( &temp_float, &(VOLVOXEL(V,sli,ii,jj)),floatsize);\ 1374 (v)=(cast)temp_float;} 1376 while (sli <
ZSIZE(V()))
1393 if (typeinfoT == typeinfoD)
1395 for (i = 0; i < 3; i++)
1396 for (j = 0; j < 3; j++)
1398 for (i = 0; i < 3; i++)
1400 for (i = 0; i < 3; i++)
1403 for (i = 0; i < 3; i++)
1407 else if (typeinfoT == typeinfoI)
1411 if (
sizeof(
float) !=
sizeof(
int))
1413 "GridVolume is integer and (sizeof(float)!= sizeof(int)");
1415 for (i = 0; i < 3; i++)
1416 for (j = 0; j < 3; j++)
1418 for (i = 0; i < 3; i++)
1420 for (i = 0; i < 3; i++)
1423 for (i = 0; i < 3; i++)
1433 if (typeinfoT == typeinfoD)
1442 else if (typeinfoT == typeinfoI)
1454 VOLMATRIX(*sV).initZeros(Zdim, Ydim, Xdim);
1460 std::cout <<
"The read grid is \n" << sG;
1461 std::cout <<
"Volume dimensions: " << Zdim <<
" x " << Ydim <<
" x " 1462 << Xdim << std::endl;
1463 std::cout <<
"Volume init: " << Zinit <<
" x " << Yinit <<
" x " 1464 << Xinit << std::endl;
1476 std::cout <<
"Reading from file position (" << sli <<
"," << i
1477 <<
"," << j <<
") to subvolume position (" 1478 << k <<
"," << i <<
"," << j <<
")\n";
1489 #undef UNPACK_DOUBLE 1501 std::ostream& operator << (std::ostream &o, const GridVolumeT<T> &GV)
1503 o <<
"Grid Volume -----------\n";
1505 o <<
"Number of volumes= " << GV.VolumesNo() << std::endl;
1506 for (
int i = 0;
i < GV.VolumesNo();
i++)
1508 o <<
"Volume " <<
i <<
"------------" << std::endl;
const Grid & grid() const
void set_Y(const Matrix1D< double > &v)
void get_volume(size_t n, Image< T > &V)
void universe2grid(const Matrix1D< double > &uv, Matrix1D< double > &gv) const
#define VOLVOXEL(V, k, i, j)
Matrix1D< double > highest
SimpleGrid Create_grid_within_sphere(double relative_size, const Matrix1D< double > &origin, const Matrix1D< double > &X, const Matrix1D< double > &Y, const Matrix1D< double > &Z, double R2)
GridVolumeT(const Grid &_grid)
SimpleGrid & operator()(size_t n)
#define REPORT_ERROR(nerr, ErrormMsg)
void resize(const Matrix1D< double > &corner1, const Matrix1D< double > &corner2)
SimpleGrid Create_CC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2, const Matrix1D< double > &origin)
void set_relative_size(double size)
Set relative_size.
void get_SimpleGrid(size_t n, SimpleGrid &G)
void grid2universe(const Matrix1D< double > &gv, Matrix1D< double > &uv) const
void sqrt(Image< double > &op)
void Gdir_project_to_plane(const Matrix1D< double > &gr, const Matrix2D< double > &euler, Matrix1D< double > &result) const
const SimpleGrid & operator()(size_t n) const
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 V3_MINUS_V3(a, b, c)
friend std::ostream & operator<<(std::ostream &o, const SimpleGrid &grid)
void inv(Matrix2D< T > &result) const
std::vector< T > operator+(const std::vector< T > &v, const T &a)
void set_interest_radius(double _R)
Set reconstruction radius.
void set_X(const Matrix1D< double > &v)
void Gproject_to_plane(const Matrix1D< double > &gr, double rot, double tilt, double psi, Matrix1D< double > &result) const
GridVolumeT< double > GridVolume
bool is_interesting(const Matrix1D< double > &uv) const
Matrix1D< double > lowest
GridVolumeT(const GridVolumeT &_RV)
#define UNPACK_INT(v, cast)
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 DIRECT_VOLVOXEL(I, k, i, j)
Image< T > & operator()(size_t n)
void adapt_to_grid(const Grid &_grid)
#define V3_BY_CT(a, b, c)
Matrix2D< double > inv_basis
void get_Z(Matrix1D< double > &v) const
const Image< T > & operator()(size_t n) const
#define GRIDVOLUME_BY_SCALAR(op)
GridVolumeT< T > operator/(T f, const GridVolumeT< T > &GV)
double get_relative_size() const
Get relative_size.
void resize(const GridVolumeT< T1 > &GV)
void assign(const GridVolumeT &RV)
void setCol(size_t j, const Matrix1D< T > &v)
void resize(size_t Xdim, bool copy=true)
void assign(const SimpleGrid &SG)
void get_SimpleGrid(int n, SimpleGrid &G) const
void read(const FileName &fn, const std::string &basisName)
void assign(const Grid &G)
std::vector< T > & operator-=(std::vector< T > &_v1, const std::vector< T > &_v2)
void set_Z(const Matrix1D< double > &v)
void Gproject_to_plane(const Matrix1D< double > &gr, const Matrix2D< double > &euler, Matrix1D< double > &result) const
double relative_size
Measuring unit in the grid coordinate system.
#define M3x3_BY_V3x1(a, M, b)
#define UNPACK_DOUBLE(v, cast)
void getCol(size_t j, Matrix1D< T > &v) const
Grid Create_FCC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2)
Grid Create_BCC_grid(double relative_size, const Matrix1D< double > &corner1, const Matrix1D< double > &corner2)
void write(const FileName &fn) const
Matrix1D< double > origin
Origin of the grid in the Universal coordinate system.
#define GRIDVOL_BY_GRIDVOL(op)
const SimpleGrid & grid(size_t n) const
double psi(const double x)
int get_number_of_samples() const
void add_grid(const SimpleGrid &SG)
MatrixMultiplication< M > operator*(const MatrixExpression< M > &m, double v)
std::vector< T > & operator+=(std::vector< T > &_v1, const std::vector< T > &_v2)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
#define SPEED_UP_tempsInt
void Gdir_project_to_plane(const Matrix1D< double > &gr, double rot, double tilt, double psi, Matrix1D< double > &result) const
std::vector< T > & operator/=(std::vector< T > &v1, const std::vector< T > &v2)
double get_interest_radius() const
Get reconstruction radius.
#define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY3D(V1, V2)
Incorrect value received.
void Uproject_to_plane(const Matrix1D< double > &point, const Matrix1D< double > &direction, double distance, Matrix1D< double > &result)
std::vector< T > & operator*=(std::vector< T > &v1, const std::vector< T > &v2)
void resize(size_t Ydim, size_t Xdim, bool noCopy=false)
GridVolumeT< T > operator-(T f, const GridVolumeT< T > &GV)
#define GRIDVOL_BY_GRIDVOLASSIG(op)
void get_Y(Matrix1D< double > &v) const
void getSize(int &Zdim, int &Ydim, int &Xdim) const
#define V3_PLUS_V3(a, b, c)
void get_X(Matrix1D< double > &v) const
#define SPEED_UP_temps012