39 #include "utils/half.hpp" 81 Image(
int Xdim,
int Ydim,
int Zdim,
int Ndim,
const FileName &_filename)
104 Image(
int Xdim,
int Ydim,
int Zdim = 1,
int Ndim = 1,
bool _mmapOn =
false)
175 return (
typeid(T) ==
typeid(std::complex<double>)
176 ||
typeid(T) ==
typeid(std::complex<float>));
185 std::array<int,4> &result )
187 for (
size_t i = 0;
i < result.size(); ++
i)
190 while(j < order.size() && order[
j] !=
i) ++j;
191 if (j >= order.size())
203 const std::array<int,4> &order,
204 std::array<size_t,4> &result )
206 std::array<int, 4> inverseOrder;
210 sizes[inverseOrder[0]],
211 sizes[inverseOrder[1]],
212 sizes[inverseOrder[2]],
213 sizes[inverseOrder[3]]
223 std::array<int, 4> inverseOrder;
227 const std::array<size_t,4> sizes = {
228 NSIZE(multidimArray),
229 ZSIZE(multidimArray),
230 YSIZE(multidimArray),
235 sizes[inverseOrder[0]],
236 sizes[inverseOrder[1]],
237 sizes[inverseOrder[2]],
238 sizes[inverseOrder[3]]
242 for (
size_t n = 0;
n <
NSIZE(multidimArray);
n++) {
243 for (
size_t z = 0;
z <
ZSIZE(multidimArray);
z++) {
244 for (
size_t y = 0;
y <
YSIZE(multidimArray);
y++) {
245 for (
size_t x = 0;
x <
XSIZE(multidimArray);
x++) {
247 const std::array<size_t,4> indices = {
n,
z,
y,
x};
248 const auto l = indices[inverseOrder[0]];
249 const auto k = indices[inverseOrder[1]];
250 const auto i = indices[inverseOrder[2]];
251 const auto j = indices[inverseOrder[3]];
261 multidimArray = std::move(result);
277 if (
typeid(T) ==
typeid(
unsigned char))
278 memcpy(ptrDest, page, pageSize *
sizeof(T));
281 const auto* ptr = (
unsigned char *) page;
282 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
283 ptrDest[
i] = (T) *ptr;
289 if (
typeid(T) ==
typeid(
signed char))
291 memcpy(ptrDest, page, pageSize *
sizeof(T));
295 const auto* ptr = (
signed char *) page;
296 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
297 ptrDest[
i] = (T) *ptr;
303 if (
typeid(T) ==
typeid(
unsigned short))
305 memcpy(ptrDest, page, pageSize *
sizeof(T));
309 const auto* ptr = (
unsigned short *) page;
310 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
311 ptrDest[
i] = (T) *ptr;
317 if (
typeid(T) ==
typeid(short))
319 memcpy(ptrDest, page, pageSize *
sizeof(T));
323 const auto* ptr = (
short *) page;
324 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
325 ptrDest[
i] = (T) *ptr;
331 if (
typeid(T) ==
typeid(
unsigned int))
333 memcpy(ptrDest, page, pageSize *
sizeof(T));
337 const auto* ptr = (
unsigned int *) page;
338 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
339 ptrDest[
i] = (T) *ptr;
345 if (
typeid(T) ==
typeid(int))
347 memcpy(ptrDest, page, pageSize *
sizeof(T));
351 const auto* ptr = (
int *) page;
352 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
353 ptrDest[
i] = (T) *ptr;
359 if (
typeid(T) ==
typeid(long))
361 memcpy(ptrDest, page, pageSize *
sizeof(T));
365 const auto* ptr = (
long *) page;
366 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
367 ptrDest[
i] = (T) *ptr;
373 if (
typeid(T) ==
typeid(float))
375 memcpy(ptrDest, page, pageSize *
sizeof(T));
379 const auto* ptr = (
float *) page;
380 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
381 ptrDest[
i] = (T) *ptr;
387 if (
typeid(T) ==
typeid(double))
389 memcpy(ptrDest, page, pageSize *
sizeof(T));
393 const auto* ptr = (
double *) page;
394 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
395 ptrDest[
i] = (T) *ptr;
401 if (
typeid(T) ==
typeid(half_float::half))
403 memcpy(ptrDest, page, pageSize *
sizeof(T));
407 const auto* ptr = (half_float::half *) page;
408 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
409 ptrDest[
i] = (T) *ptr;
415 std::cerr <<
"Datatype= " << datatype << std::endl;
427 size_t pageSize)
const 433 if (
typeid(T) ==
typeid(
float))
435 memcpy(page, srcPtr, pageSize *
sizeof(T));
439 auto* ptr = (
float *) page;
440 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
441 *ptr = (
float) srcPtr[
i];
447 if (
typeid(T) ==
typeid(double))
449 memcpy(page, srcPtr, pageSize *
sizeof(T));
453 auto* ptr = (
double *) page;
454 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
455 *ptr = (
double) srcPtr[
i];
461 if (
typeid(T) ==
typeid(
unsigned short))
463 memcpy(page, srcPtr, pageSize *
sizeof(T));
467 auto* ptr = (
unsigned short *) page;
468 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
469 *ptr = (
unsigned short) srcPtr[
i];
475 if (
typeid(T) ==
typeid(short))
477 memcpy(page, srcPtr, pageSize *
sizeof(T));
481 auto* ptr = (
short *) page;
482 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
483 *ptr = (
short) srcPtr[
i];
490 if (
typeid(T) ==
typeid(
unsigned char))
492 memcpy(page, srcPtr, pageSize *
sizeof(T));
496 auto* ptr = (
unsigned char *) page;
497 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
498 *ptr = (
unsigned char) srcPtr[
i];
504 if (
typeid(T) ==
typeid(char))
506 memcpy(page, srcPtr, pageSize *
sizeof(T));
510 auto* ptr = (
char *) page;
511 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
512 *ptr = (
char) srcPtr[
i];
518 if (
typeid(T) ==
typeid(half_float::half))
520 memcpy(page, srcPtr, pageSize *
sizeof(T));
524 auto* ptr = (half_float::half *) page;
525 for (
size_t i = 0;
i < pageSize; ++
i, ++ptr)
526 *ptr = (half_float::half) srcPtr[
i];
532 std::cerr <<
"outputDatatype = " << datatype << std::endl;
534 " ERROR: cannot cast T to outputDatatype");
545 size_t pageSize,
double min0,
double max0,
CastWriteMode castMode =
575 slope =
static_cast<double>(maxF - minF)
576 / static_cast<double>(max0 - min0);
580 unsigned char * ptr = (
unsigned char *) page;
582 for (n = 0; n < pageSize; n++)
583 ptr[n] = static_cast<unsigned char>(minF
584 + (slope * static_cast<double>(srcPtr[n] - min0)));
606 slope =
static_cast<double>(maxF - minF)
607 / static_cast<double>(max0 - min0);
611 char * ptr = (
char *) page;
613 for (n = 0; n < pageSize; n++)
614 ptr[n] = static_cast<char>(minF
615 + (slope * static_cast<double>(srcPtr[n] - min0)));
642 slope =
static_cast<double>(maxF - minF)
643 / static_cast<double>(max0 - min0);
648 unsigned short * ptr = (
unsigned short *) page;
650 for (n = 0; n < pageSize; n++)
651 ptr[n] = static_cast<unsigned short>(minF
652 + (slope * static_cast<double>(srcPtr[n] - min0)));
679 slope =
static_cast<double>(maxF - minF)
680 / static_cast<double>(max0 - min0);
684 short * ptr = (
short *) page;
686 for (n = 0; n < pageSize; n++)
687 ptr[n] = static_cast<short>(minF
688 + (slope * static_cast<double>(srcPtr[n] - min0)));
717 slope =
static_cast<double>(maxF - minF)
718 / static_cast<double>(max0 - min0);
722 unsigned int * ptr = (
unsigned int *) page;
724 for (n = 0; n < pageSize; n++)
725 ptr[n] = static_cast<unsigned int>(minF
726 + (slope * static_cast<double>(srcPtr[n] - min0)));
754 slope =
static_cast<double>(maxF - minF)
755 / static_cast<double>(max0 - min0);
759 int * ptr = (
int *) page;
761 for (n = 0; n < pageSize; n++)
762 ptr[n] = static_cast<int>(minF
763 + (slope * static_cast<double>(srcPtr[n] - min0)));
787 size_t pageSize,
double min0,
double max0,
CastWriteMode castMode =
791 pageSize, min0, max0, castMode);
807 return typeid(T) ==
typeid(
unsigned char);
809 return typeid(T) ==
typeid(
char);
811 return typeid(T) ==
typeid(
unsigned short);
813 return typeid(T) ==
typeid(
short);
815 return typeid(T) ==
typeid(
unsigned int);
817 return typeid(T) ==
typeid(
int);
819 return typeid(T) ==
typeid(
long);
821 return typeid(T) ==
typeid(
float);
823 return typeid(T) ==
typeid(
double);
825 return typeid(T) ==
typeid(half_float::half);
828 std::cerr <<
"Datatype= " << datatype << std::endl;
841 size_t Z, Y, X, N, Y2;
849 for (
size_t l = 0; l < N; ++l)
850 for (
size_t k = 0;
k < Z; ++
k)
851 for (
size_t i = 0;
i < Y2; ++
i)
852 for (
size_t j = 0;
j < X; ++
j)
868 size_t Z, Y, X, N, X2;
876 for (
size_t l = 0; l < N; ++l)
877 for (
size_t k = 0;
k < Z; ++
k)
878 for (
size_t i = 0;
i < Y; ++
i)
879 for (
size_t j = 0;
j < X2; ++
j)
890 bool only_apply_shifts =
false);
935 "Image::movePointerTo: Image is empty");
939 "movePointerTo: Selected slice %4d cannot be higher than Z size %4d.",
944 "movePointerTo: Selected image %4d cannot be higher than N size %4d.",
957 switch (select_slice)
967 phys_slice = select_slice - 1;
975 if (select_slice > 0 && select_img ==
ALL_IMAGES)
996 size_t datasize = datasize_n *
gettypesize(datatype);
997 char * fdata = (
char *)
askMemory(datasize);
999 fwrite(fdata, datasize, 1, fimg);
1059 return (this->data == i1.
data);
1100 const size_t n = 0);
1119 void applyGeo(
const MDRow &row,
bool only_apply_shifts =
false,
bool wrap = xmipp_transformation::WRAP)
override;
1140 static bool isValidAxisOrder(
const std::array<int, 4>& order)
1142 std::set<int> uniqueValues;
1144 for (
int value : order) {
1146 if (value < 0 || value > 3 || !uniqueValues.insert(value).second)
1160 std::cerr<<
"entering readdata"<<std::endl;
1161 std::cerr<<
" readData flag= "<<
dataMode<<std::endl;
1168 reportWarning(
"Image::readData: Invalid axis ordering. Defaulting to 0,1,2,3 ");
1175 std::array<size_t, 4> sizes;
1186 std::cout<<
"redirecting from readData to readData4bits!"<<std::endl;
1187 readData4bit(fimg, select_img, datatype, pad);
1193 size_t selectImgOffset, readsize, readsize_n, pagemax = 4194304;
1195 size_t pagesize =
ZYXSIZE(data) * datatypesize;
1196 size_t haveread_n = 0;
1205 reportWarning(
"Image::readData: File endianness is swapped and not " 1206 "compatible with mmap. Loading into memory.");
1208 reportWarning(
"Image::readData: Axis order is not standard 0,1,2,3, which makes it " 1209 "incompatible with memory mapping. Loading into memory.");
1212 "Image::readData: File datatype and image declaration not " 1213 "compatible with mmap. Loading into memory.");
1224 "Image Class::ReadData: mmap option can not be selected simultaneously\ 1225 for both Image class and its Multidimarray.");
1226 if (
NSIZE(data) > 1)
1229 "images file not compatible. Try selecting a unique image.");
1245 printf(
"DEBUG: Page size: %ld offset= %ld \n", pagesize,
offset);
1246 printf(
"DEBUG: Swap = %d Pad = %ld Offset = %ld\n",
swap, pad,
offset);
1247 printf(
"DEBUG: myoffset = %ld select_img= %ld \n", selectImgOffset, select_img);
1248 printf(
"DEBUG: NSIZE = %lu \n",
NSIZE(data));
1255 size_t slice_elements =
ZYXSIZE(data);
1257 if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1266 for (
size_t n = 0;
n <
NSIZE(data); ++
n) {
1267 if (fread(
MULTIDIM_ARRAY(data) + slice_elements *
n, pagesize, 1, fimg) != 1) {
1271 if (fseek(fimg, pad, SEEK_CUR) == -1) {
1282 if (pagesize > pagemax)
1283 page = (
char *)
askMemory(pagemax *
sizeof(
char));
1285 page = (
char *)
askMemory(pagesize *
sizeof(
char));
1287 if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1289 for (
size_t myn = 0; myn <
NSIZE(data); myn++)
1291 for (
size_t myj = 0; myj < pagesize; myj += pagemax)
1294 readsize = pagesize - myj;
1295 if (readsize > pagemax)
1297 readsize_n = readsize / datatypesize;
1300 if (fread(page, readsize, 1, fimg) != 1)
1308 haveread_n += readsize_n;
1312 if (fseek(fimg, pad, SEEK_CUR) == -1)
1314 "readData: can not seek the file pointer");
1330 printf(
"DEBUG img_read_data: Finished reading and converting data\n");
1343 readData4bit(FILE* fimg,
size_t select_img,
DataType datatype,
size_t pad)
1354 size_t selectImgOffset;
1355 size_t itemSize =
ZYXSIZE(data);
1356 size_t pagesizeF = itemSize /2;
1357 size_t pagesizeM = itemSize;
1359 size_t haveread_n = 0;
1372 if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1374 for (
size_t myn = 0; myn <
NSIZE(data); myn++)
1378 if (fread(page+pagesizeF, pagesizeF, 1, fimg) != 1)
1383 size_t start = pagesizeF;
1386 for (
size_t i = 0,
j = start;
i < pagesizeM - 1;
i += 2, ++
j)
1388 char& value = *(page+
j);
1389 page[
i] = value & mask;
1390 page[
i+1] = (value >> 4) & mask;
1395 haveread_n += pagesizeM;
1399 if (fseek(fimg, pad, SEEK_CUR) == -1)
1401 "readData4bit: can not seek the file pointer");
1408 printf(
"DEBUG readData4bit: Finished reading and converting data\n");
1427 writeData(FILE* fimg,
size_t offset,
DataType wDType,
size_t datasize_n,
1431 size_t datasize = datasize_n * dTypeSize;
1434 size_t rw_max_n = dsN2Write;
1437 double min0 = 0, max0 = 0;
1439 if (wDType == myT() && castMode ==
CW_CONVERT)
1453 fdata = (
char *)
askMemory(datasize *
sizeof(
char));
1455 for (
size_t writtenDataN = 0; writtenDataN < datasize_n; writtenDataN +=
1459 if (writtenDataN + rw_max_n > datasize_n)
1461 dsN2Write = datasize_n - writtenDataN;
1462 ds2Write = dsN2Write * dTypeSize;
1470 fdata, wDType, dsN2Write, min0, max0, castMode);
1476 fwrite(fdata, ds2Write, 1, fimg);
1508 if (
typeid(T) ==
typeid(
unsigned char))
1510 else if (
typeid(T) ==
typeid(
char))
1512 else if (
typeid(T) ==
typeid(
unsigned short))
1514 else if (
typeid(T) ==
typeid(
short))
1516 else if (
typeid(T) ==
typeid(
unsigned int))
1518 else if (
typeid(T) ==
typeid(
int))
1520 else if (
typeid(T) ==
typeid(
unsigned int))
1522 else if (
typeid(T) ==
typeid(
int))
1524 else if (
typeid(T) ==
typeid(
long))
1526 else if (
typeid(T) ==
typeid(
float))
1528 else if (
typeid(T) ==
typeid(
double))
1530 else if (
typeid(T) ==
typeid(std::complex<short>))
1532 else if (
typeid(T) ==
typeid(std::complex<int>))
1534 else if (
typeid(T) ==
typeid(std::complex<float>))
1536 else if (
typeid(T) ==
typeid(std::complex<double>))
1538 else if (
typeid(T) ==
typeid(
bool))
1540 else if (
typeid(T) ==
typeid(half_float::half))
1549 template<
typename TT>
1568 size_t pageSize,
double min0,
double max0,
CastWriteMode castMode)
const;
std::string datatype2Str(DataType datatype)
ImageFHandler * openFile(const FileName &name, int mode=WRITE_READONLY) const
void getPageFromT(size_t offset, char *page, DataType datatype, size_t pageSize)
const MultidimArray< T > & operator()() const
#define A2D_ELEM(v, i, j)
std::array< int, 4 > axisOrder
void reportWarning(const String &what)
void coreAllocate(size_t _ndim, int _zdim, int _ydim, int _xdim)
#define DIRECT_NZYX_ELEM(v, l, k, i, j)
Image(const MultidimArray< T > &im)
void printShape(std::ostream &out=std::cout) const
#define REPORT_ERROR(nerr, ErrormMsg)
T & operator()(int i, int j) const
friend class ImageCollection
void swapPage(char *page, size_t pageNrElements, DataType datatype, int swap=1)
std::vector< std::unique_ptr< MDRow > > MD
const size_t rw_max_page_size
#define MULTIDIM_ARRAY(v)
const FileName & name() const
static constexpr std::array< int, 4 > defaultAxisOrder
void castConvertPage2Datatype(T *srcPtr, char *page, DataType datatype, size_t pageSize, double min0, double max0, CastWriteMode castMode=CW_CONVERT) const
Incorrect MultidimArray size.
bool checkMmapT(DataType datatype) override
Image< T > & operator=(const Image< T > &op1)
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 _write(const FileName &name, ImageFHandler *hFile, size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST)
void getPreview(ImageBase *imgBOut, size_t Xdim, size_t Ydim=0, int select_slice=CENTRAL_SLICE, size_t select_img=FIRST_IMAGE)
#define A3D_ELEM(V, k, i, j)
void closeFile(ImageFHandler *hFile=NULL) const
void getInverseAxisOrder(const std::array< int, 4 > &order, std::array< int, 4 > &result)
int freeMemory(void *ptr, size_t memsize)
void castPage2T(char *page, T *ptrDest, DataType datatype, size_t pageSize)
void setPage2T(size_t offset, char *page, DataType datatype, size_t pageSize)
virtual void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)=0
void castPage2Datatype(T *srcPtr, char *page, DataType datatype, size_t pageSize) const
Image(int Xdim, int Ydim, int Zdim, int Ndim, const FileName &_filename)
int readPreview(const FileName &name, size_t Xdim, size_t Ydim=0, int select_slice=CENTRAL_SLICE, size_t select_img=FIRST_IMAGE)
char * askMemory(size_t memsize)
Couldn't read from file.
void alias(const MultidimArray< T > &m)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
void movePointerTo(int select_slice=ALL_SLICES, size_t select_img=ALL_IMAGES)
bool operator==(const Image< T > &i1) const
void transposeInPlace(MultidimArray< T > &multidimArray, const std::array< int, 4 > &order)
void getCastConvertPageFromT(size_t offset, char *page, DataType datatype, size_t pageSize, double min0, double max0, CastWriteMode castMode=CW_CONVERT) const
void transposeAxisSizes(const std::array< size_t, 4 > &sizes, const std::array< int, 4 > &order, std::array< size_t, 4 > &result)
DataType datatype() const
void selfApplyGeometry(int SplineDegree, bool wrap=xmipp_transformation::WRAP, bool only_apply_shifts=false)
Image(const Image< T > &im)
String formatString(const char *format,...)
void applyGeo(const MDRow &row, bool only_apply_shifts=false, bool wrap=xmipp_transformation::WRAP) override
#define IMG_INDEX(select_img)
void getTransformationMatrix(Matrix2D< double > &A, bool only_apply_shifts=false, const size_t n=0)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
Incorrect MultidimArray dimensions.
void computeDoubleMinMaxRange(double &minval, double &maxval, size_t offset, size_t size) const
void sumWithFile(const FileName &fn)
MultidimArray< T > & operator()()
void copy(const ImageBase &other)
MultidimArrayBase * mdaBase
T & operator()(int k, int i, int j) const
void writePageAsDatatype(FILE *fimg, DataType datatype, size_t datasize_n)
Image(int Xdim, int Ydim, int Zdim=1, int Ndim=1, bool _mmapOn=false)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
size_t gettypesize(DataType type)
Returns memory size of datatype.
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
Some logical error in the pipeline.