47 #ifndef INCLUDE_ALLO_VOXELS_HPP
48 #define INCLUDE_ALLO_VOXELS_HPP
56 #include "al/core/types/al_Conversion.hpp"
57 #include "al/util/al_Array.hpp"
77 MRC_IMAGE_FLOAT32 = 2,
78 MRC_TRANSFORM_INT16 = 3,
79 MRC_TRANSFORM_FLOAT32 = 4,
143 char machinestamp[4];
156 Voxels() : Array() { init(1, 1, 1, VOX_METERS); }
160 Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz,
float sizex,
161 float sizey,
float sizez, UnitsTy units)
162 : Array(1, ty, dimx, dimy, dimz) {
163 init(sizex, sizey, sizez, units);
168 Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz,
float sizex,
169 float sizey,
float sizez)
170 : Array(1, ty, dimx, dimy, dimz) {
171 init(sizex, sizey, sizez, VOX_METERS);
176 Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz,
177 float voxelsize, UnitsTy units)
178 : Array(1, ty, dimx, dimy, dimz) {
179 init(voxelsize, voxelsize, voxelsize, units);
183 Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz)
184 : Array(1, ty, dimx, dimy, dimz) {
185 init(1, 1, 1, VOX_METERS);
188 void init(
float voxWidthX,
float voxWidthY,
float voxWidthZ, UnitsTy units) {
189 m_voxWidth[0] = voxWidthX;
190 m_voxWidth[1] = voxWidthY;
191 m_voxWidth[2] = voxWidthZ;
195 float getVoxWidth(
unsigned int axis)
const {
return m_voxWidth[axis]; }
196 void setVoxWidth(
unsigned int axis,
float voxWidth) {
197 m_voxWidth[axis] = voxWidth;
200 std::string printVoxWidth(
unsigned int axis) {
201 std::ostringstream ss;
202 ss << m_voxWidth[axis] <<
" " << printUnits(m_units);
207 UnitsTy getUnits()
const {
return m_units; }
208 void setUnits(UnitsTy units) { m_units = units; }
210 std::string printUnits() {
return printUnits(m_units); }
212 const std::string printUnits(UnitsTy t) {
213 if (t == VOX_ANGSTROMS) {
215 }
else if (t == VOX_NANOMETERS) {
217 }
else if (t == VOX_MICROMETERS) {
219 }
else if (t == VOX_MILLIMETERS) {
221 }
else if (t == VOX_CENTIMETERS) {
224 std::ostringstream ss;
225 ss <<
"(m*10^" << t <<
")";
231 MRCHeader &parseMRC(
const char *data);
233 bool loadFromMRC(std::string filename,
bool update =
false);
235 bool loadFromMRC(std::string filename, UnitsTy ty,
float voxWidth);
237 bool loadFromMRC(std::string filename, UnitsTy ty,
float voxWidthX,
238 float voxWidthY,
float voxWidthZ);
241 bool getdir(std::string dir, std::vector<std::string> &files);
243 bool parseInfo(std::string dir, std::vector<std::string> &data);
245 bool loadFromDirectory(std::string dir);
248 bool linePlaneIntersection(
const Vec3f &P0,
const Vec3f &P1,
249 const Vec3f &planeCenter,
const Vec3f &planeNormal,
250 Vec3f *intersection);
252 std::vector<Vec3f> linspace(
Vec3f a,
Vec3f b,
int n);
257 std::vector<Vec3f> &list, std::vector<Vec3f> &list2,
258 float aDirection,
float oDirection,
259 std::vector<Vec3f> &points);
261 Array slice(
Vec3f planeCenter,
Vec3f planeNormal,
262 std::vector<Vec3f> &finalPointList);
265 bool writeToMRC(std::string filename, MRCHeader &header);
268 bool writeToFile(std::string filename);
270 bool loadFromFile(std::string filename);
272 void print(FILE *fp = stdout);
274 float min()
const {
return m_min; }
276 float max()
const {
return m_max; }
278 float mean()
const {
return m_mean; }
280 float rms()
const {
return m_rms; }
287 float m_min, m_max, m_mean, m_rms;
Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz, float sizex, float sizey, float sizez)
Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz)
Construct dimx x dimy x dimz voxel grid with every voxel 1m x 1m x 1m.
Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz, float voxelsize, UnitsTy units)
Voxels(AlloTy ty, uint32_t dimx, uint32_t dimy, uint32_t dimz, float sizex, float sizey, float sizez, UnitsTy units)
Vec< 3, float > Vec3f
float 3-vector