Xmipp  v3.23.11-Nereus
xmipp_image.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: Sjors H.W. Scheres (scheres@cnb.csic.es)
4  * Joaquin Oton (joton@cnb.csic.es)
5  *
6  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
7  *
8  * Part of this module has been developed by Lorenzo Zampighi and Nelson Tang
9  * Dept. Physiology of the David Geffen School of Medicine
10  * Univ. of California, Los Angeles.
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25  * 02111-1307 USA
26  *
27  * All comments concerning this program package may be sent to the
28  * e-mail address 'xmipp@cnb.csic.es'
29  ***************************************************************************/
30 
31 #ifndef CORE_IMAGE_H
32 #define CORE_IMAGE_H
33 
34 #include <typeinfo>
35 #include <set>
36 #include "multidim_array.h"
37 #include "xmipp_image_base.h"
38 #include "xmipp_memory.h"
39 #include "utils/half.hpp"
40 
42 
43 
45 const size_t rw_max_page_size = 4194304; // 4Mb
46 
50 template<typename T>
51 class Image : public ImageBase
52 {
53 
54 public:
55  MultidimArray<T> data; // The image data array
56 
57 public:
67  {
68  mdaBase = (MultidimArrayBase*) &data;
69  init();
70  }
71 
81  Image(int Xdim, int Ydim, int Zdim, int Ndim, const FileName &_filename)
82  {
83  mdaBase = (MultidimArrayBase*) &data;
84  init();
85  mmapOnWrite = true;
86  data.setDimensions(Xdim, Ydim, Zdim, Ndim);
87  MD.resize(Ndim);
88  filename = _filename;
90  _write(_filename, hFile, ALL_IMAGES, false, WRITE_OVERWRITE);
91  closeFile(hFile);
92  }
93 
104  Image(int Xdim, int Ydim, int Zdim = 1, int Ndim = 1, bool _mmapOn = false)
105  {
106  mdaBase = (MultidimArrayBase*) &data;
107  init();
108  data.setMmap(_mmapOn);
109  data.coreAllocate(Ndim, Zdim, Ydim, Xdim);
110  MD.resize(Ndim);
111  }
112 
113  Image(const Image<T> &im)
114  {
115  mdaBase = (MultidimArrayBase*) &data;
116  init();
117  *this = im;
118  }
119 
126  {
127  mdaBase = (MultidimArrayBase*) &data;
128  init();
129  data.alias(im);
130  }
131 
134  virtual
136  {
137  clearData();
138  }
139 
143  void
145  {
146  clearData();
147  init();
148  }
149 
155  void
157  {
158  // If MultidimArray pointer has been moved to a slice different from zero, then reset it.
159  // This check must be done prior to mappedSize check, since mappedSlice is a trick over data pointer
160  if (virtualOffset != 0)
162  if (mmapOnRead || mmapOnWrite)
163  munmapFile();
164 
165  else
166  data.clear();
167 
168  }
169 
172  bool
173  isComplexT() const
174  {
175  return (typeid(T) == typeid(std::complex<double>)
176  || typeid(T) == typeid(std::complex<float>));
177  }
178 
179 
183  void
184  getInverseAxisOrder(const std::array<int,4> &order,
185  std::array<int,4> &result )
186  {
187  for (size_t i = 0; i < result.size(); ++i)
188  {
189  size_t j = 0;
190  while(j < order.size() && order[j] != i) ++j; // Find inverse mapping
191  if (j >= order.size())
192  REPORT_ERROR(ERR_LOGIC_ERROR, "Invalid axis mapping");
193 
194  result[i] = j;
195  }
196  }
197 
201  void
202  transposeAxisSizes(const std::array<size_t,4> &sizes,
203  const std::array<int,4> &order,
204  std::array<size_t,4> &result )
205  {
206  std::array<int, 4> inverseOrder;
207  getInverseAxisOrder(order, inverseOrder);
208 
209  result = {
210  sizes[inverseOrder[0]],
211  sizes[inverseOrder[1]],
212  sizes[inverseOrder[2]],
213  sizes[inverseOrder[3]]
214  };
215  }
216 
220  void
221  transposeInPlace(MultidimArray<T> &multidimArray, const std::array<int,4> &order)
222  {
223  std::array<int, 4> inverseOrder;
224  getInverseAxisOrder(order, inverseOrder);
225 
226  // Creating new multidim array of the same size than the original
227  const std::array<size_t,4> sizes = {
228  NSIZE(multidimArray),
229  ZSIZE(multidimArray),
230  YSIZE(multidimArray),
231  XSIZE(multidimArray)
232  };
233 
234  MultidimArray<T> result(
235  sizes[inverseOrder[0]],
236  sizes[inverseOrder[1]],
237  sizes[inverseOrder[2]],
238  sizes[inverseOrder[3]]
239  );
240 
241  // Performing transposition in a loop for every dimension
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++) {
246  // Defining array to access with the axis orders
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]];
252 
253  // Transposing element
254  DIRECT_NZYX_ELEM(result, l, k, i, j) = DIRECT_NZYX_ELEM(multidimArray, n, z, y, x);
255  }
256  }
257  }
258  }
259 
260  // Remapping pointers from original multidim array to transposed one
261  multidimArray = std::move(result);
262  }
263 
267  void
268  castPage2T(char * page, T * ptrDest, DataType datatype, size_t pageSize)
269  {
270  switch (datatype)
271  {
272  case DT_Unknown:
273  REPORT_ERROR(ERR_TYPE_INCORRECT, "ERROR: datatype is Unknown_Type");
274  case DT_UHalfByte:
275  case DT_UChar:
276  {
277  if (typeid(T) == typeid(unsigned char))
278  memcpy(ptrDest, page, pageSize * sizeof(T));
279  else
280  {
281  const auto* ptr = (unsigned char *) page;
282  for (size_t i = 0; i < pageSize; ++i, ++ptr)
283  ptrDest[i] = (T) *ptr;
284  }
285  break;
286  }
287  case DT_SChar:
288  {
289  if (typeid(T) == typeid(signed char))
290  {
291  memcpy(ptrDest, page, pageSize * sizeof(T));
292  }
293  else
294  {
295  const auto* ptr = (signed char *) page;
296  for (size_t i = 0; i < pageSize; ++i, ++ptr)
297  ptrDest[i] = (T) *ptr;
298  }
299  break;
300  }
301  case DT_UShort:
302  {
303  if (typeid(T) == typeid(unsigned short))
304  {
305  memcpy(ptrDest, page, pageSize * sizeof(T));
306  }
307  else
308  {
309  const auto* ptr = (unsigned short *) page;
310  for (size_t i = 0; i < pageSize; ++i, ++ptr)
311  ptrDest[i] = (T) *ptr;
312  }
313  break;
314  }
315  case DT_Short:
316  {
317  if (typeid(T) == typeid(short))
318  {
319  memcpy(ptrDest, page, pageSize * sizeof(T));
320  }
321  else
322  {
323  const auto* ptr = (short *) page;
324  for (size_t i = 0; i < pageSize; ++i, ++ptr)
325  ptrDest[i] = (T) *ptr;
326  }
327  break;
328  }
329  case DT_UInt:
330  {
331  if (typeid(T) == typeid(unsigned int))
332  {
333  memcpy(ptrDest, page, pageSize * sizeof(T));
334  }
335  else
336  {
337  const auto* ptr = (unsigned int *) page;
338  for (size_t i = 0; i < pageSize; ++i, ++ptr)
339  ptrDest[i] = (T) *ptr;
340  }
341  break;
342  }
343  case DT_Int:
344  {
345  if (typeid(T) == typeid(int))
346  {
347  memcpy(ptrDest, page, pageSize * sizeof(T));
348  }
349  else
350  {
351  const auto* ptr = (int *) page;
352  for (size_t i = 0; i < pageSize; ++i, ++ptr)
353  ptrDest[i] = (T) *ptr;
354  }
355  break;
356  }
357  case DT_Long:
358  {
359  if (typeid(T) == typeid(long))
360  {
361  memcpy(ptrDest, page, pageSize * sizeof(T));
362  }
363  else
364  {
365  const auto* ptr = (long *) page;
366  for (size_t i = 0; i < pageSize; ++i, ++ptr)
367  ptrDest[i] = (T) *ptr;
368  }
369  break;
370  }
371  case DT_Float:
372  {
373  if (typeid(T) == typeid(float))
374  {
375  memcpy(ptrDest, page, pageSize * sizeof(T));
376  }
377  else
378  {
379  const auto* ptr = (float *) page;
380  for (size_t i = 0; i < pageSize; ++i, ++ptr)
381  ptrDest[i] = (T) *ptr;
382  }
383  break;
384  }
385  case DT_Double:
386  {
387  if (typeid(T) == typeid(double))
388  {
389  memcpy(ptrDest, page, pageSize * sizeof(T));
390  }
391  else
392  {
393  const auto* ptr = (double *) page;
394  for (size_t i = 0; i < pageSize; ++i, ++ptr)
395  ptrDest[i] = (T) *ptr;
396  }
397  break;
398  }
399  case DT_HalfFloat:
400  {
401  if (typeid(T) == typeid(half_float::half))
402  {
403  memcpy(ptrDest, page, pageSize * sizeof(T));
404  }
405  else
406  {
407  const auto* ptr = (half_float::half *) page;
408  for (size_t i = 0; i < pageSize; ++i, ++ptr)
409  ptrDest[i] = (T) *ptr;
410  }
411  break;
412  }
413  default:
414  {
415  std::cerr << "Datatype= " << datatype << std::endl;
416  REPORT_ERROR(ERR_TYPE_INCORRECT, " ERROR: cannot cast datatype to T");
417  }
418  }
419 
420  }
421 
425  void
426  castPage2Datatype(T * srcPtr, char * page, DataType datatype,
427  size_t pageSize) const
428  {
429  switch (datatype)
430  {
431  case DT_Float:
432  {
433  if (typeid(T) == typeid(float))
434  {
435  memcpy(page, srcPtr, pageSize * sizeof(T));
436  }
437  else
438  {
439  auto* ptr = (float *) page;
440  for (size_t i = 0; i < pageSize; ++i, ++ptr)
441  *ptr = (float) srcPtr[i];
442  }
443  break;
444  }
445  case DT_Double:
446  {
447  if (typeid(T) == typeid(double))
448  {
449  memcpy(page, srcPtr, pageSize * sizeof(T));
450  }
451  else
452  {
453  auto* ptr = (double *) page;
454  for (size_t i = 0; i < pageSize; ++i, ++ptr)
455  *ptr = (double) srcPtr[i];
456  }
457  break;
458  }
459  case DT_UShort:
460  {
461  if (typeid(T) == typeid(unsigned short))
462  {
463  memcpy(page, srcPtr, pageSize * sizeof(T));
464  }
465  else
466  {
467  auto* ptr = (unsigned short *) page;
468  for (size_t i = 0; i < pageSize; ++i, ++ptr)
469  *ptr = (unsigned short) srcPtr[i];
470  }
471  break;
472  }
473  case DT_Short:
474  {
475  if (typeid(T) == typeid(short))
476  {
477  memcpy(page, srcPtr, pageSize * sizeof(T));
478  }
479  else
480  {
481  auto* ptr = (short *) page;
482  for (size_t i = 0; i < pageSize; ++i, ++ptr)
483  *ptr = (short) srcPtr[i];
484  }
485  break;
486  }
487  case DT_UHalfByte:
488  case DT_UChar:
489  {
490  if (typeid(T) == typeid(unsigned char))
491  {
492  memcpy(page, srcPtr, pageSize * sizeof(T));
493  }
494  else
495  {
496  auto* ptr = (unsigned char *) page;
497  for (size_t i = 0; i < pageSize; ++i, ++ptr)
498  *ptr = (unsigned char) srcPtr[i];
499  }
500  break;
501  }
502  case DT_SChar:
503  {
504  if (typeid(T) == typeid(char))
505  {
506  memcpy(page, srcPtr, pageSize * sizeof(T));
507  }
508  else
509  {
510  auto* ptr = (char *) page;
511  for (size_t i = 0; i < pageSize; ++i, ++ptr)
512  *ptr = (char) srcPtr[i];
513  }
514  break;
515  }
516  case DT_HalfFloat:
517  {
518  if (typeid(T) == typeid(half_float::half))
519  {
520  memcpy(page, srcPtr, pageSize * sizeof(T));
521  }
522  else
523  {
524  auto* ptr = (half_float::half *) page;
525  for (size_t i = 0; i < pageSize; ++i, ++ptr)
526  *ptr = (half_float::half) srcPtr[i];
527  }
528  break;
529  }
530  default:
531  {
532  std::cerr << "outputDatatype = " << datatype << std::endl;
534  " ERROR: cannot cast T to outputDatatype");
535  }
536  }
537  }
538 
539  /* Convert the pixels values from one datatype to another, taking into account for datatypes
540  * of same bitdepth the shift of the minimum values. In other cases, the conversion is done
541  * adjusting the input values in the range of output datatype.
542  */
543  void
544  castConvertPage2Datatype(T * srcPtr, char * page, DataType datatype,
545  size_t pageSize, double min0, double max0, CastWriteMode castMode =
546  CW_CONVERT) const
547  {
548 
549  double minF, maxF;
550  double slope;
551  size_t n;
552  DataType myTypeId = myT();
553 
554  switch (datatype)
555  {
556  case DT_UHalfByte:
557  case DT_UChar:
558  {
559  if (castMode == CW_CONVERT && myTypeId == DT_SChar)
560  {
561  slope = 1;
562  min0 -= CHAR_MIN;
563  }
564  else if (castMode == CW_CAST)
565  {
566  minF = 0;
567  min0 = 0;
568  slope = 1;
569  }
570  else
571  {
572  minF = 0;
573  maxF = UCHAR_MAX;
574  if (max0 != min0)
575  slope = static_cast<double>(maxF - minF)
576  / static_cast<double>(max0 - min0);
577  else
578  slope = 0;
579  }
580  unsigned char * ptr = (unsigned char *) page;
581 
582  for (n = 0; n < pageSize; n++)
583  ptr[n] = static_cast<unsigned char>(minF
584  + (slope * static_cast<double>(srcPtr[n] - min0)));
585 
586  break;
587  }
588  case DT_SChar:
589  {
590  if (castMode == CW_CONVERT && myTypeId == DT_UChar)
591  {
592  slope = 1;
593  min0 += CHAR_MIN;
594  }
595  else if (castMode == CW_CAST)
596  {
597  minF = 0;
598  min0 = 0;
599  slope = 1;
600  }
601  else
602  {
603  minF = CHAR_MIN;
604  maxF = CHAR_MAX;
605  if (max0 != min0)
606  slope = static_cast<double>(maxF - minF)
607  / static_cast<double>(max0 - min0);
608  else
609  slope = 0;
610  }
611  char * ptr = (char *) page;
612 
613  for (n = 0; n < pageSize; n++)
614  ptr[n] = static_cast<char>(minF
615  + (slope * static_cast<double>(srcPtr[n] - min0)));
616 
617  break;
618  }
619  case DT_UShort:
620  {
621  if (castMode == CW_CONVERT
622  && (myTypeId == DT_SChar || myTypeId == DT_Short))
623  {
624  slope = 1;
625  min0 -= SHRT_MIN;
626  }
627  else if (castMode == CW_CONVERT && (myTypeId == DT_UChar))
628  {
629  slope = 1;
630  }
631  else if (castMode == CW_CAST)
632  {
633  minF = 0;
634  min0 = 0;
635  slope = 1;
636  }
637  else
638  {
639  minF = 0;
640  maxF = USHRT_MAX;
641  if (max0 != min0)
642  slope = static_cast<double>(maxF - minF)
643  / static_cast<double>(max0 - min0);
644  else
645  slope = 0;
646  }
647 
648  unsigned short * ptr = (unsigned short *) page;
649 
650  for (n = 0; n < pageSize; n++)
651  ptr[n] = static_cast<unsigned short>(minF
652  + (slope * static_cast<double>(srcPtr[n] - min0)));
653 
654  break;
655  }
656  case DT_Short:
657  {
658  if (castMode == CW_CONVERT
659  && (myTypeId == DT_UChar || myTypeId == DT_UShort))
660  {
661  slope = 1;
662  min0 += SHRT_MIN;
663  }
664  else if (castMode == CW_CONVERT && (myTypeId == DT_SChar))
665  {
666  slope = 1;
667  }
668  else if (castMode == CW_CAST)
669  {
670  minF = 0;
671  min0 = 0;
672  slope = 1;
673  }
674  else
675  {
676  minF = SHRT_MIN;
677  maxF = SHRT_MAX;
678  if (max0 != min0)
679  slope = static_cast<double>(maxF - minF)
680  / static_cast<double>(max0 - min0);
681  else
682  slope = 0;
683  }
684  short * ptr = (short *) page;
685 
686  for (n = 0; n < pageSize; n++)
687  ptr[n] = static_cast<short>(minF
688  + (slope * static_cast<double>(srcPtr[n] - min0)));
689 
690  break;
691  }
692  case DT_UInt:
693  {
694  if (castMode == CW_CONVERT
695  && (myTypeId == DT_SChar || myTypeId == DT_Short
696  || myTypeId == DT_Int))
697  {
698  slope = 1;
699  min0 -= INT_MIN;
700  }
701  else if (castMode == CW_CONVERT
702  && (myTypeId == DT_UShort || myTypeId == DT_UChar))
703  {
704  slope = 1;
705  }
706  else if (castMode == CW_CAST)
707  {
708  minF = 0;
709  min0 = 0;
710  slope = 1;
711  }
712  else
713  {
714  minF = 0;
715  maxF = UINT_MAX;
716  if (max0 != min0)
717  slope = static_cast<double>(maxF - minF)
718  / static_cast<double>(max0 - min0);
719  else
720  slope = 0;
721  }
722  unsigned int * ptr = (unsigned int *) page;
723 
724  for (n = 0; n < pageSize; n++)
725  ptr[n] = static_cast<unsigned int>(minF
726  + (slope * static_cast<double>(srcPtr[n] - min0)));
727  break;
728  }
729  case DT_Int:
730  {
731  if (castMode == CW_CONVERT
732  && (myTypeId == DT_UChar || myTypeId == DT_UShort
733  || myTypeId == DT_UInt))
734  {
735  slope = 1;
736  min0 += INT_MIN;
737  }
738  else if (castMode == CW_CONVERT
739  && (myTypeId == DT_Short || myTypeId == DT_SChar))
740  {
741  slope = 1;
742  }
743  else if (castMode == CW_CAST)
744  {
745  minF = 0;
746  min0 = 0;
747  slope = 1;
748  }
749  else
750  {
751  minF = INT_MIN;
752  maxF = INT_MAX;
753  if (max0 != min0)
754  slope = static_cast<double>(maxF - minF)
755  / static_cast<double>(max0 - min0);
756  else
757  slope = 0;
758  }
759  int * ptr = (int *) page;
760 
761  for (n = 0; n < pageSize; n++)
762  ptr[n] = static_cast<int>(minF
763  + (slope * static_cast<double>(srcPtr[n] - min0)));
764  break;
765  }
766  default:
767  castPage2Datatype(srcPtr, page, datatype, pageSize);
768  }
769 
770  }
771 
772  void
773  setPage2T(size_t offset, char * page, DataType datatype, size_t pageSize)
774  {
775  castPage2T(page, MULTIDIM_ARRAY(data) + offset, datatype, pageSize);
776  }
777 
778  void
779  getPageFromT(size_t offset, char * page, DataType datatype, size_t pageSize)
780  {
781  castPage2Datatype(MULTIDIM_ARRAY(data) + offset, page, datatype,
782  pageSize);
783  }
784 
785  void
787  size_t pageSize, double min0, double max0, CastWriteMode castMode =
788  CW_CONVERT) const
789  {
790  castConvertPage2Datatype(MULTIDIM_ARRAY(data) + offset, page, datatype,
791  pageSize, min0, max0, castMode);
792  }
793 
796  bool
798  {
799 
800  switch (datatype)
801  {
802  case DT_Unknown:
803  REPORT_ERROR(ERR_TYPE_INCORRECT, "ERROR: datatype is Unknown_Type");
804  case DT_UHalfByte:
805  return 0;
806  case DT_UChar:
807  return typeid(T) == typeid(unsigned char);
808  case DT_SChar:
809  return typeid(T) == typeid(char);
810  case DT_UShort:
811  return typeid(T) == typeid(unsigned short);
812  case DT_Short:
813  return typeid(T) == typeid(short);
814  case DT_UInt:
815  return typeid(T) == typeid(unsigned int);
816  case DT_Int:
817  return typeid(T) == typeid(int);
818  case DT_Long:
819  return typeid(T) == typeid(long);
820  case DT_Float:
821  return typeid(T) == typeid(float);
822  case DT_Double:
823  return typeid(T) == typeid(double);
824  case DT_HalfFloat:
825  return typeid(T) == typeid(half_float::half);
826  default:
827  {
828  std::cerr << "Datatype= " << datatype << std::endl;
829  REPORT_ERROR(ERR_TYPE_INCORRECT, " ERROR: cannot cast datatype to T");
830  }
831  }
832  }
833 
837  void
838  mirrorY(void)
839  {
840  T aux(0);
841  size_t Z, Y, X, N, Y2;
842 
843  X = XSIZE(data);
844  Y = YSIZE(data);
845  Z = ZSIZE(data);
846  N = NSIZE(data);
847  Y2 = Y / 2;
848  Y--;
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)
853  {
854  aux = DIRECT_NZYX_ELEM(data, l, k, i, j);
855  DIRECT_NZYX_ELEM(data, l, k, i, j) = DIRECT_NZYX_ELEM(data, l, k,
856  Y - i, j);
857  DIRECT_NZYX_ELEM(data, l, k, Y-i, j) = aux;
858  }
859  }
860 
864  void
865  mirrorX(void)
866  {
867  T aux(0);
868  size_t Z, Y, X, N, X2;
869 
870  X = XSIZE(data);
871  Y = YSIZE(data);
872  Z = ZSIZE(data);
873  N = NSIZE(data);
874  X2 = X / 2;
875  X--;
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)
880  {
881  aux = DIRECT_NZYX_ELEM(data, l, k, i, j);
882  DIRECT_NZYX_ELEM(data, l, k, i, j) = DIRECT_NZYX_ELEM(data, l, k,
883  i, X - j);
884  DIRECT_NZYX_ELEM(data, l, k, i, X - j) = aux;
885  }
886  }
887 
888  void
889  selfApplyGeometry(int SplineDegree, bool wrap = xmipp_transformation::WRAP,
890  bool only_apply_shifts = false);
891 
892  /* Read an image with a lower resolution as a preview image.
893  * If Zdim parameter is not passed, then all slices are rescaled.
894  * If Ydim is not passed, then Ydim is rescaled same factor as Xdim.
895  */
896  int
897  readPreview(const FileName &name, size_t Xdim, size_t Ydim = 0,
898  int select_slice = CENTRAL_SLICE, size_t select_img = FIRST_IMAGE);
899 
904  void
905  getPreview(ImageBase *imgBOut, size_t Xdim, size_t Ydim = 0,
906  int select_slice = CENTRAL_SLICE, size_t select_img = FIRST_IMAGE);
907 
930  void
931  movePointerTo(int select_slice = ALL_SLICES, size_t select_img = ALL_IMAGES)
932  {
933  if (MULTIDIM_ARRAY(VOLMATRIX(*this)) == NULL)
935  "Image::movePointerTo: Image is empty");
936  if (select_slice > (int) aDimFile.zdim)
938  formatString(
939  "movePointerTo: Selected slice %4d cannot be higher than Z size %4d.",
940  select_slice, aDimFile.zdim));
941  else if (select_img > aDimFile.ndim)
943  formatString(
944  "movePointerTo: Selected image %4d cannot be higher than N size %4d.",
945  select_img, aDimFile.ndim));
946 
947  ArrayDim newDim;
948  VOLMATRIX(*this).getDimensions(newDim);
949 
950  /* Restore the real dimensions from the MDA, as it may be
951  * X-Y dimensioned different from file (readPreview). */
952  newDim.zdim = aDimFile.zdim;
953  newDim.ndim = aDimFile.ndim;
954 
955  int phys_slice;
956 
957  switch (select_slice)
958  {
959  case CENTRAL_SLICE:
960  phys_slice = aDimFile.zdim / 2;
961  newDim.zdim = 1;
962  break;
963  case ALL_SLICES:
964  phys_slice = 0;
965  break;
966  default:
967  phys_slice = select_slice - 1;
968  newDim.zdim = 1;
969  break;
970  }
971 
972  /* If we select a single slice, we are forced to chose also an image.
973  * as at this moment we cannot select the same slice from different images at a time.
974  */
975  if (select_slice > 0 && select_img == ALL_IMAGES)
976  select_img = FIRST_IMAGE;
977  if (select_img > ALL_IMAGES)
978  newDim.ndim = 1;
979 
980  VOLMATRIX(*this).setDimensions(newDim);
981 
982  size_t newVirtualOffset = YXSIZE(VOLMATRIX(*this))
983  * (aDimFile.zdim * IMG_INDEX(select_img) + phys_slice);
984  MULTIDIM_ARRAY(VOLMATRIX(*this)) += (newVirtualOffset - virtualOffset);
985  virtualOffset = newVirtualOffset;
986  }
987 
993  void
994  writePageAsDatatype(FILE * fimg, DataType datatype, size_t datasize_n)
995  {
996  size_t datasize = datasize_n * gettypesize(datatype);
997  char * fdata = (char *) askMemory(datasize);
998  castPage2Datatype(MULTIDIM_ARRAY(data), fdata, datatype, datasize_n);
999  fwrite(fdata, datasize, 1, fimg);
1000  freeMemory(fdata, datasize);
1001  }
1002 
1005  Image<T>&
1006  operator=(const Image<T> &op1)
1007  {
1008  this->copy(op1);
1009  data = op1.data;
1010  return *this;
1011  }
1012 
1026  {
1027  return data;
1028  }
1029  const MultidimArray<T>&
1030  operator()() const
1031  {
1032  return data;
1033  }
1034 
1048  T&
1049  operator()(int i, int j) const
1050  {
1051  return A2D_ELEM(data, i, j);
1052  }
1056  bool
1057  operator==(const Image<T> &i1) const
1058  {
1059  return (this->data == i1.data);
1060  }
1061 
1075  T&
1076  operator()(int k, int i, int j) const
1077  {
1078  return A3D_ELEM(data, k, i, j);
1079  }
1080 
1083  // void getDimensions(int &Xdim, int &Ydim, int &Zdim, size_t &Ndim) const
1084  // {
1085  // Xdim = XSIZE(data);
1086  // Ydim = YSIZE(data);
1087  // Zdim = ZSIZE(data);
1088  // Ndim = NSIZE(data);
1089  // }
1090  size_t
1091  getSize() const
1092  {
1093  return NZYXSIZE(data);
1094  }
1095 
1098  void
1099  getTransformationMatrix(Matrix2D<double> &A, bool only_apply_shifts = false,
1100  const size_t n = 0);
1101 
1104  void
1106  {
1107  Image<T> aux;
1108  aux.read(fn, DATA, ALL_IMAGES, true);
1109  (*this)() += aux();
1110  }
1111 
1115  //#include "rwTIFF.h"
1116 protected:
1117 
1119  void applyGeo(const MDRow &row, bool only_apply_shifts = false, bool wrap = xmipp_transformation::WRAP) override;
1120 
1121  //apply geo has not been defined for volumes
1122  //and only make sense when reading data
1123 
1126  void
1127  setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
1128  {
1129  data.setDimensions(Xdim, Ydim, Zdim, Ndim);
1130  data.getDimensions(aDimFile);
1131  }
1132 
1133 private:
1134 
1135  void setDimensions(ArrayDim &aDim) override
1136  {
1138  }
1139 
1140  static bool isValidAxisOrder(const std::array<int, 4>& order)
1141  {
1142  std::set<int> uniqueValues;
1143 
1144  for (int value : order) {
1145  // Check if the value is not in the range [0, 3] or is not unique.
1146  if (value < 0 || value > 3 || !uniqueValues.insert(value).second)
1147  return false;
1148  }
1149 
1150  return true;
1151  }
1152 
1155  void
1156  readData(FILE* fimg, size_t select_img, DataType datatype, size_t pad) override
1157  {
1158  //#define DEBUG
1159 #ifdef DEBUG
1160  std::cerr<<"entering readdata"<<std::endl;
1161  std::cerr<<" readData flag= "<<dataMode<<std::endl;
1162 #endif
1163 #undef DEBUG
1164 
1165 
1166  if(!isValidAxisOrder(axisOrder))
1167  {
1168  reportWarning("Image::readData: Invalid axis ordering. Defaulting to 0,1,2,3 ");
1170  }
1171 
1172  if (dataMode < DATA)
1173  {
1174  if (axisOrder != defaultAxisOrder) {
1175  std::array<size_t, 4> sizes;
1176  getDimensions(sizes[3], sizes[2], sizes[1], sizes[0]);
1177  transposeAxisSizes(sizes, axisOrder, sizes);
1178  setDimensions(sizes[3], sizes[2], sizes[1], sizes[0]);
1179  }
1180  return;
1181  }
1182 
1183  if (datatype == DT_UHalfByte){
1184  //REPORT_ERROR(ERR_MMAP, "Image Class::readData not supported for "
1185  // "data type " + datatype2Str(DT_UHalfByte));
1186  std::cout<<"redirecting from readData to readData4bits!"<<std::endl;
1187  readData4bit(fimg, select_img, datatype, pad);
1188  }
1189  // If only half of a transform is stored, it needs to be handled
1190  if (transform == Hermitian || transform == CentHerm)
1191  data.setXdim(XSIZE(data) / 2 + 1);
1192 
1193  size_t selectImgOffset, readsize, readsize_n, pagemax = 4194304; //4Mb
1194  size_t datatypesize = gettypesize(datatype);
1195  size_t pagesize = ZYXSIZE(data) * datatypesize;
1196  size_t haveread_n = 0;
1197 
1198  selectImgOffset = offset + IMG_INDEX(select_img) * (pagesize + pad);
1199 
1200  // Flag to know that data is not going to be mapped although mmapOn is true
1201  if (mmapOnRead && (!checkMmapT(datatype) || swap > 0 || axisOrder != defaultAxisOrder))
1202  {
1203  String warnMessage;
1204  if (swap > 0)
1205  reportWarning("Image::readData: File endianness is swapped and not "
1206  "compatible with mmap. Loading into memory.");
1207  else if (axisOrder != defaultAxisOrder)
1208  reportWarning("Image::readData: Axis order is not standard 0,1,2,3, which makes it "
1209  "incompatible with memory mapping. Loading into memory.");
1210  else
1211  reportWarning(
1212  "Image::readData: File datatype and image declaration not "
1213  "compatible with mmap. Loading into memory.");
1214 
1215  mmapOnRead = false;
1216  mFd = -1;
1217  }
1218 
1219  if (mmapOnRead)
1220  {
1221  // Image mmapOn is not compatible with Multidimarray mmapOn
1222  if (data.mmapOn)
1224  "Image Class::ReadData: mmap option can not be selected simultaneously\
1225  for both Image class and its Multidimarray.");
1226  if ( NSIZE(data) > 1)
1227  {
1228  REPORT_ERROR(ERR_MMAP, "Image Class::ReadData: mmap with multiple "
1229  "images file not compatible. Try selecting a unique image.");
1230  }
1231  mappedOffset = selectImgOffset;
1232  mappedSize = mappedOffset + pagesize;
1233  mmapFile();
1234  }
1235  else
1236  {
1237  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
1238  //if memory already allocated use it (no resize allowed)
1239  data.coreAllocateReuse();
1240  //ROB
1241 // #define DEBUG
1242 #ifdef DEBUG
1243 
1244  data.printShape();
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));
1249 #endif
1250 #undef DEBUG
1251 
1252  if (checkMmapT(datatype) && !swap && axisOrder == defaultAxisOrder) {
1253  // printf( "type is same, reading without cast\n" );
1254 
1255  size_t slice_elements = ZYXSIZE(data);
1256 
1257  if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1258  REPORT_ERROR(ERR_IO_SIZE, "readData: can not seek the file pointer");
1259 
1260  if (pad == 0) {
1261  // printf( "pad == 0, reading with one fread \n" );
1262  if (fread(MULTIDIM_ARRAY(data), pagesize * NSIZE(data), 1, fimg) != 1) {
1263  REPORT_ERROR(ERR_IO_NOREAD, "readData: cannot read the whole image slice");
1264  }
1265  } else {
1266  for (size_t n = 0; n < NSIZE(data); ++n) {
1267  if (fread(MULTIDIM_ARRAY(data) + slice_elements * n, pagesize, 1, fimg) != 1) {
1268  REPORT_ERROR(ERR_IO_NOREAD, "readData: cannot read the whole image slice");
1269  }
1270 
1271  if (fseek(fimg, pad, SEEK_CUR) == -1) {
1272  REPORT_ERROR(ERR_IO_SIZE, "readData: cannot seek the file pointer");
1273  }
1274  }
1275  }
1276 
1277 
1278  } else {
1279  // std::cout << "original read" << std::endl;
1280  char* page = NULL;
1281 
1282  if (pagesize > pagemax)
1283  page = (char *) askMemory(pagemax * sizeof(char));
1284  else
1285  page = (char *) askMemory(pagesize * sizeof(char));
1286 
1287  if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1288  REPORT_ERROR(ERR_IO_SIZE, "readData: can not seek the file pointer");
1289  for (size_t myn = 0; myn < NSIZE(data); myn++)
1290  {
1291  for (size_t myj = 0; myj < pagesize; myj += pagemax) //pagesize size of object
1292  {
1293  // Read next page. Divide pages larger than pagemax
1294  readsize = pagesize - myj;
1295  if (readsize > pagemax)
1296  readsize = pagemax;
1297  readsize_n = readsize / datatypesize;
1298 
1299  //Read page from disc
1300  if (fread(page, readsize, 1, fimg) != 1)
1301  REPORT_ERROR(ERR_IO_NOREAD, "Cannot read the whole page");
1302  //swap per page
1303  if (swap)
1304  swapPage(page, readsize, datatype, swap);
1305  // cast to T per page
1306  castPage2T(page, MULTIDIM_ARRAY(data) + haveread_n, datatype,
1307  readsize_n);
1308  haveread_n += readsize_n;
1309  }
1310  if (pad > 0)
1311  //fread( padpage, pad, 1, fimg);
1312  if (fseek(fimg, pad, SEEK_CUR) == -1)
1314  "readData: can not seek the file pointer");
1315  }
1316  // Transposing multidim array
1317  if (axisOrder != defaultAxisOrder) {
1318  transposeInPlace(data, axisOrder);
1319  data.getDimensions(aDimFile);
1320  }
1321  //if ( pad > 0 )
1322  // freeMemory(padpage, pad*sizeof(char));
1323  if (page)
1324  freeMemory(page, pagesize * sizeof(char));
1325 
1326  }
1327 
1328 #ifdef DEBUG
1329 
1330  printf("DEBUG img_read_data: Finished reading and converting data\n");
1331 #endif
1332 
1333  }
1334  return;
1335  }
1336 
1337 
1338 
1342  void
1343  readData4bit(FILE* fimg, size_t select_img, DataType datatype, size_t pad)
1344  {
1345 
1346  if (dataMode < DATA)
1347  return;
1348 
1349  if (datatype != DT_UHalfByte){
1350  REPORT_ERROR(ERR_MMAP, "Image Class::readData4bit not supported for "
1351  "data type different than " + datatype2Str(DT_UHalfByte));
1352  }
1353 
1354  size_t selectImgOffset; //4Mb
1355  size_t itemSize = ZYXSIZE(data);
1356  size_t pagesizeF = itemSize /2;
1357  size_t pagesizeM = itemSize;
1358  //size_t pagesizeHalf = pagesize/2;
1359  size_t haveread_n = 0;
1360 
1361  char* page = NULL; // Compressed
1362 
1363  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
1364  //if memory already allocated use it (no resize allowed)
1365  data.coreAllocateReuse();
1366 
1367  page = (char *) askMemory(pagesizeM);
1368 
1369  // Calculate the staring reading pointer.
1370  selectImgOffset = offset + IMG_INDEX(select_img) * (pagesizeF + pad);
1371 
1372  if (fseek(fimg, selectImgOffset, SEEK_SET) == -1)
1373  REPORT_ERROR(ERR_IO_SIZE, "readData4bit: can not seek the file pointer");
1374  for (size_t myn = 0; myn < NSIZE(data); myn++)
1375  {
1376 
1377  //Read page from disc
1378  if (fread(page+pagesizeF, pagesizeF, 1, fimg) != 1)
1379  REPORT_ERROR(ERR_IO_NOREAD, "Cannot read the whole page");
1380 
1381  // cast to T per page
1382 
1383  size_t start = pagesizeF;
1384  uint8_t mask = 15; // 00001111
1385 
1386  for (size_t i = 0, j = start; i < pagesizeM - 1; i += 2, ++j)
1387  {
1388  char& value = *(page+j);
1389  page[i] = value & mask; // take the lower 4 bits
1390  page[i+1] = (value >> 4) & mask; // take the upper 4 bits
1391  }
1392 
1393  castPage2T(page, MULTIDIM_ARRAY(data) + haveread_n, datatype,
1394  pagesizeM);
1395  haveread_n += pagesizeM;
1396 
1397  if (pad > 0)
1398  //fread( padpage, pad, 1, fimg);
1399  if (fseek(fimg, pad, SEEK_CUR) == -1)
1401  "readData4bit: can not seek the file pointer");
1402 
1403  //if ( pad > 0 )
1404  // freeMemory(padpage, pad*sizeof(char));
1405 
1406 #ifdef DEBUG
1407 
1408  printf("DEBUG readData4bit: Finished reading and converting data\n");
1409 #endif
1410  }
1411  if (page)
1412  freeMemory(page, pagesizeM * sizeof(char));
1413 
1414  return;
1415  }
1416 
1417 
1418 
1419 
1420 
1421 
1422 
1423 
1424  /* Write the raw date after a data type casting.
1425  */
1426  void
1427  writeData(FILE* fimg, size_t offset, DataType wDType, size_t datasize_n,
1428  CastWriteMode castMode = CW_CAST)
1429  {
1430  size_t dTypeSize = gettypesize(wDType);
1431  size_t datasize = datasize_n * dTypeSize;
1432  size_t ds2Write = rw_max_page_size;
1433  size_t dsN2Write = rw_max_page_size / dTypeSize;
1434  size_t rw_max_n = dsN2Write;
1435 
1436  char* fdata;
1437  double min0 = 0, max0 = 0;
1438 
1439  if (wDType == myT() && castMode == CW_CONVERT)
1440  castMode = CW_CAST;
1441 
1442  if (castMode != CW_CAST)
1443  data.computeDoubleMinMaxRange(min0, max0, offset, datasize_n);
1444 
1445  if ( checkMmapT(wDType) ) {
1446  fwrite( MULTIDIM_ARRAY(data) + offset, datasize, 1, fimg );
1447  return;
1448  }
1449 
1450  if (datasize > rw_max_page_size)
1451  fdata = (char *) askMemory(rw_max_page_size * sizeof(char));
1452  else
1453  fdata = (char *) askMemory(datasize * sizeof(char));
1454 
1455  for (size_t writtenDataN = 0; writtenDataN < datasize_n; writtenDataN +=
1456  rw_max_n)
1457  {
1458 
1459  if (writtenDataN + rw_max_n > datasize_n)
1460  {
1461  dsN2Write = datasize_n - writtenDataN;
1462  ds2Write = dsN2Write * dTypeSize;
1463  }
1464 
1465  if (castMode == CW_CAST)
1466  castPage2Datatype(MULTIDIM_ARRAY(data) + offset + writtenDataN, fdata,
1467  wDType, dsN2Write);
1468  else
1469  castConvertPage2Datatype(MULTIDIM_ARRAY(data) + offset + writtenDataN,
1470  fdata, wDType, dsN2Write, min0, max0, castMode);
1471 
1472  //swap per page
1473  if (swapWrite)
1474  swapPage(fdata, ds2Write, wDType);
1475 
1476  fwrite(fdata, ds2Write, 1, fimg);
1477  }
1478  freeMemory(fdata, rw_max_page_size);
1479  }
1480 
1481  /* Mmap the Image class to an image file.
1482  */
1483  void
1484  mmapFile();
1485 
1486  /* Munmap the image file.
1487  */
1488  void
1489  munmapFile()
1490  {
1491 #ifdef XMIPP_MMAP
1492  munmap((char*) (data.data) - mappedOffset, mappedSize);
1493  close(mFd);
1494  data.data = NULL;
1495  mappedSize = mappedOffset = 0;
1496 #else
1497 
1498  REPORT_ERROR(ERR_MMAP,"Mapping not supported in Windows");
1499 #endif
1500 
1501  }
1502 
1503  /* Return the datatype of the current image object
1504  */
1505  DataType
1506  myT() const
1507  {
1508  if (typeid(T) == typeid(unsigned char))
1509  return DT_UChar;
1510  else if (typeid(T) == typeid(char))
1511  return DT_SChar;
1512  else if (typeid(T) == typeid(unsigned short))
1513  return DT_UShort;
1514  else if (typeid(T) == typeid(short))
1515  return DT_Short;
1516  else if (typeid(T) == typeid(unsigned int))
1517  return DT_UInt;
1518  else if (typeid(T) == typeid(int))
1519  return DT_Int;
1520  else if (typeid(T) == typeid(unsigned int))
1521  return DT_UInt;
1522  else if (typeid(T) == typeid(int))
1523  return DT_Int;
1524  else if (typeid(T) == typeid(long))
1525  return DT_Long;
1526  else if (typeid(T) == typeid(float))
1527  return DT_Float;
1528  else if (typeid(T) == typeid(double))
1529  return DT_Double;
1530  else if (typeid(T) == typeid(std::complex<short>))
1531  return DT_CShort;
1532  else if (typeid(T) == typeid(std::complex<int>))
1533  return DT_CInt;
1534  else if (typeid(T) == typeid(std::complex<float>))
1535  return DT_CFloat;
1536  else if (typeid(T) == typeid(std::complex<double>))
1537  return DT_CDouble;
1538  else if (typeid(T) == typeid(bool))
1539  return DT_HalfFloat;
1540  else if (typeid(T) == typeid(half_float::half))
1541  return DT_Bool;
1542  else
1543  return DT_Unknown;
1544  }
1545 
1546  /* friend declaration for stacks handling purposes
1547  */
1548  friend class ImageCollection;
1549  template<typename TT>
1550  friend class Image;
1551 
1552 }
1553 ;
1554 
1555 // Special cases for complex numbers
1556 template<>
1557 void
1559  std::complex<double> * ptrDest, DataType datatype, size_t pageSize);
1560 template<>
1561 void
1562 Image<std::complex<double> >::castPage2Datatype(std::complex<double> * srcPtr,
1563  char * page, DataType datatype, size_t pageSize) const;
1564 template<>
1565 void
1567  std::complex<double> * srcPtr, char * page, DataType datatype,
1568  size_t pageSize, double min0, double max0, CastWriteMode castMode) const;
1569 
1571 #endif
std::string datatype2Str(DataType datatype)
ImageFHandler * openFile(const FileName &name, int mode=WRITE_READONLY) const
#define NSIZE(v)
void getPageFromT(size_t offset, char *page, DataType datatype, size_t pageSize)
Definition: xmipp_image.h:779
const MultidimArray< T > & operator()() const
Definition: xmipp_image.h:1030
#define YSIZE(v)
#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)
MultidimArray is empty.
Definition: xmipp_error.h:175
DataMode dataMode
Image(const MultidimArray< T > &im)
Definition: xmipp_image.h:125
ArrayDim aDimFile
void printShape(std::ostream &out=std::cout) const
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
Global mmap error.
Definition: xmipp_error.h:170
size_t mappedOffset
#define VOLMATRIX(V)
T & operator()(int i, int j) const
Definition: xmipp_image.h:1049
friend class ImageCollection
Definition: xmipp_image.h:1548
static double * y
#define ZYXSIZE(v)
void swapPage(char *page, size_t pageNrElements, DataType datatype, int swap=1)
std::vector< std::unique_ptr< MDRow > > MD
size_t getSize() const
Definition: xmipp_image.h:1091
ImageFHandler * hFile
const size_t rw_max_page_size
Definition: xmipp_image.h:45
#define MULTIDIM_ARRAY(v)
ArrayDim getDimensions()
const FileName & name() const
static constexpr std::array< int, 4 > defaultAxisOrder
TransformType transform
void castConvertPage2Datatype(T *srcPtr, char *page, DataType datatype, size_t pageSize, double min0, double max0, CastWriteMode castMode=CW_CONVERT) const
Definition: xmipp_image.h:544
Incorrect MultidimArray size.
Definition: xmipp_error.h:174
void mirrorX(void)
Definition: xmipp_image.h:865
size_t virtualOffset
void clearData()
Definition: xmipp_image.h:156
bool checkMmapT(DataType datatype) override
Definition: xmipp_image.h:797
bool isComplexT() const
Definition: xmipp_image.h:173
doublereal * x
Image< T > & operator=(const Image< T > &op1)
Definition: xmipp_image.h:1006
#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 _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
MultidimArray< T > data
Definition: xmipp_image.h:55
void getInverseAxisOrder(const std::array< int, 4 > &order, std::array< int, 4 > &result)
Definition: xmipp_image.h:184
size_t zdim
int freeMemory(void *ptr, size_t memsize)
void castPage2T(char *page, T *ptrDest, DataType datatype, size_t pageSize)
Definition: xmipp_image.h:268
void setMmap(bool mmap)
virtual ~Image()
Definition: xmipp_image.h:135
void setPage2T(size_t offset, char *page, DataType datatype, size_t pageSize)
Definition: xmipp_image.h:773
virtual void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)=0
#define XSIZE(v)
void castPage2Datatype(T *srcPtr, char *page, DataType datatype, size_t pageSize) const
Definition: xmipp_image.h:426
Image(int Xdim, int Ydim, int Zdim, int Ndim, const FileName &_filename)
Definition: xmipp_image.h:81
int readPreview(const FileName &name, size_t Xdim, size_t Ydim=0, int select_slice=CENTRAL_SLICE, size_t select_img=FIRST_IMAGE)
Definition: xmipp_image.cpp:38
#define ZSIZE(v)
double z
char * askMemory(size_t memsize)
Couldn&#39;t read from file.
Definition: xmipp_error.h:139
#define NZYXSIZE(v)
DataType
Image base class.
void coreAllocateReuse()
void alias(const MultidimArray< T > &m)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
#define j
#define CENTRAL_SLICE
void mirrorY(void)
Definition: xmipp_image.h:838
void movePointerTo(int select_slice=ALL_SLICES, size_t select_img=ALL_IMAGES)
Definition: xmipp_image.h:931
bool operator==(const Image< T > &i1) const
Definition: xmipp_image.h:1057
size_t ndim
size_t mappedSize
void transposeInPlace(MultidimArray< T > &multidimArray, const std::array< int, 4 > &order)
Definition: xmipp_image.h:221
void getCastConvertPageFromT(size_t offset, char *page, DataType datatype, size_t pageSize, double min0, double max0, CastWriteMode castMode=CW_CONVERT) const
Definition: xmipp_image.h:786
void transposeAxisSizes(const std::array< size_t, 4 > &sizes, const std::array< int, 4 > &order, std::array< size_t, 4 > &result)
Definition: xmipp_image.h:202
DataType datatype() const
std::string String
Definition: xmipp_strings.h:34
void selfApplyGeometry(int SplineDegree, bool wrap=xmipp_transformation::WRAP, bool only_apply_shifts=false)
#define ALL_IMAGES
Image(const Image< T > &im)
Definition: xmipp_image.h:113
String formatString(const char *format,...)
Image()
Definition: xmipp_image.h:66
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)
#define FIRST_IMAGE
Incorrect MultidimArray dimensions.
Definition: xmipp_error.h:173
FileName filename
Incorrect file size.
Definition: xmipp_error.h:145
void computeDoubleMinMaxRange(double &minval, double &maxval, size_t offset, size_t size) const
CastWriteMode
Incorrect type received.
Definition: xmipp_error.h:190
void sumWithFile(const FileName &fn)
Definition: xmipp_image.h:1105
MultidimArray< T > & operator()()
Definition: xmipp_image.h:1025
void copy(const ImageBase &other)
#define YXSIZE(v)
#define ALL_SLICES
MultidimArrayBase * mdaBase
int * n
T & operator()(int k, int i, int j) const
Definition: xmipp_image.h:1076
void clear()
Definition: xmipp_image.h:144
void writePageAsDatatype(FILE *fimg, DataType datatype, size_t datasize_n)
Definition: xmipp_image.h:994
Image(int Xdim, int Ydim, int Zdim=1, int Ndim=1, bool _mmapOn=false)
Definition: xmipp_image.h:104
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
Definition: xmipp_image.h:1127
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.
Definition: xmipp_error.h:147