Xmipp  v3.23.11-Nereus
Classes | Functions
Collaboration diagram for Imagic File format:

Classes

struct  IMAGIChead
 

Functions

int readIMAGIC (size_t img_select)
 
int writeIMAGIC (size_t img_select=ALL_IMAGES, int mode=WRITE_OVERWRITE, const String &bitDepth="", CastWriteMode castMode=CW_CAST)
 
int ImageBase::readIMAGIC (size_t img_select)
 
int ImageBase::writeIMAGIC (size_t img_select=ALL_IMAGES, int mode=WRITE_OVERWRITE, const String &bitDepth="", CastWriteMode castMode=CW_CAST)
 

Detailed Description

Function Documentation

◆ readIMAGIC() [1/2]

int readIMAGIC ( size_t  img_select)

Imagic reader

◆ readIMAGIC() [2/2]

int ImageBase::readIMAGIC ( size_t  select_img)
protected

Imagic reader

Definition at line 127 of file rwIMAGIC.cpp.

128 {
129 #undef DEBUG
130  //#define DEBUG
131 #ifdef DEBUG
132  printf("DEBUG readIMAGIC: Reading Imagic file\n");
133 #endif
134 
135  IMAGIChead* header = new IMAGIChead;
136 
137  if ( fread( header, IMAGICSIZE, 1, fhed ) < 1 )
138  REPORT_ERROR(ERR_IO_NOREAD,(String)"readIMAGIC: header file of " + filename + " cannot be read");
139 
140  // Determine byte order and swap bytes if from little-endian machine
141  if ( (swap = (( abs(header->nyear) > SWAPTRIG ) || ( header->ixlp > SWAPTRIG ))) )
142  swapPage((char *) header, IMAGICSIZE - 916, DT_Float); // IMAGICSIZE - 916 is to exclude labels from swapping
143 
145 
146  if ( strstr(header->type,"PACK") )
147  datatype = DT_UChar;
148  else if ( strstr(header->type,"INTG") )
149  datatype = DT_Short;
150  else if ( strstr(header->type,"REAL") )
151  datatype = DT_Float;
152  else if ( strstr(header->type,"RECO") )
153  {
154  datatype = DT_CFloat; // Complex data
156  }
157  else if ( strstr(header->type,"COMP") )
158  {
159  datatype = DT_CFloat; // Complex transform data
161  }
162 
163  // Set min-max values and other statistical values
164  if ( header->sigma == 0 && header->varian != 0 )
165  header->sigma = std::sqrt(header->varian);
166  if ( header->densmax == 0 && header->densmin == 0 && header->sigma != 0 )
167  {
168  header->densmin = header->avdens - header->sigma;
169  header->densmax = header->avdens + header->sigma;
170  }
171 
172  offset = 0; // separate header file
173 
174  MDMainHeader.setValue(MDL_MIN,(double)header->densmin);
175  MDMainHeader.setValue(MDL_MAX,(double)header->densmax);
176  MDMainHeader.setValue(MDL_AVG,(double)header->avdens);
177  MDMainHeader.setValue(MDL_STDDEV,(double)header->sigma);
181  MDMainHeader.setValue(MDL_DATATYPE,(int)datatype);
182 
183  int _xDim,_yDim,_zDim;
184  size_t _nDim;
185  _xDim = (int) header->iylp;
186  _yDim = (int) header->ixlp;
187  _zDim = (int) 1;
188  _nDim = (size_t) header->ifn + 1 ;
189 
190  if ( select_img > _nDim )
191  REPORT_ERROR(ERR_INDEX_OUTOFBOUNDS, formatString("readImagic: Image number %lu exceeds stack size %lu", select_img, _nDim));
192 
193  if( select_img != ALL_IMAGES )
194  _nDim = 1;
195 
196  replaceNsize = _nDim;
197  setDimensions(_xDim, _yDim, _zDim, _nDim );
198 
199  if (dataMode == HEADER || (dataMode == _HEADER_ALL && _nDim > 1)) // Stop reading if not necessary
200  {
201  delete header;
202  return 0;
203  }
204 
205  // Get the header information
206  fseek( fhed, IMG_INDEX(select_img) * IMAGICSIZE, SEEK_SET );
207 
208  MD.clear();
209  for (size_t i = 0; i < _nDim; i++)
210  MD.push_back(std::unique_ptr<MDRowVec>(new MDRowVec(MDL::emptyHeaderVec())));
211 
212  double daux=1.;
213  for ( size_t i = 0; i < _nDim; ++i )
214  {
215  if ( fread( header, IMAGICSIZE, 1, fhed ) < 1 )
216  return(-2);
217  {
218  if ( swap )
219  swapPage((char *) header, IMAGICSIZE - 916, DT_Float);
220 
221  if (dataMode == _HEADER_ALL || dataMode == _DATA_ALL)
222  {
223  MD[i]->setValue(MDL_SHIFT_X, (double)-1. * header->ixold);
224  MD[i]->setValue(MDL_SHIFT_Y, (double)-1. * header->iyold);
225  MD[i]->setValue(MDL_SHIFT_Z, 0.);
226  MD[i]->setValue(MDL_ANGLE_ROT, (double)-1. * header->euler_alpha);
227  MD[i]->setValue(MDL_ANGLE_TILT,(double)-1. * header->euler_beta);
228  MD[i]->setValue(MDL_ANGLE_PSI, (double)-1. * header->euler_gamma);
229  MD[i]->setValue(MDL_WEIGHT, 1.);
230  MD[i]->setValue(MDL_SCALE, daux);
231  }
232  }
233  }
234  delete header;
235 
236  if (dataMode < DATA) // Don't read the individual header and the data if not necessary
237  return 0;
238 
239  size_t pad = 0;
240  readData(fimg, select_img, datatype, pad );
241 
242  return(0);
243 }
Index out of bounds.
Definition: xmipp_error.h:132
tsne coefficients in 2D
Rotation angle of an image (double,degrees)
float avdens
Definition: rwIMAGIC.cpp:77
#define SWAPTRIG
sampling rate in A/pixel (double)
sampling rate in A/pixel (double)
DataMode dataMode
sampling rate in A/pixel (double)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
float sigma
Definition: rwIMAGIC.cpp:78
virtual void readData(FILE *fimg, size_t select_img, DataType datatype, size_t pad)=0
void sqrt(Image< double > &op)
Maximum value (double)
Tilting angle of an image (double,degrees)
void setValue(const MDObject &object) override
Shift for the image in the X axis (double)
void swapPage(char *page, size_t pageNrElements, DataType datatype, int swap=1)
std::vector< std::unique_ptr< MDRow > > MD
Special label to be used when gathering MDs in MpiMetadataPrograms.
void abs(Image< double > &op)
if read from file original image datatype, this is an struct defined in image
TransformType transform
char type[4]
Definition: rwIMAGIC.cpp:74
float densmin
Definition: rwIMAGIC.cpp:82
#define i
Minimum value (double)
float euler_alpha
Definition: rwIMAGIC.cpp:93
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
virtual void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)=0
float varian
Definition: rwIMAGIC.cpp:79
float euler_gamma
Definition: rwIMAGIC.cpp:95
Couldn&#39;t read from file.
Definition: xmipp_error.h:139
static MDRowVec emptyHeaderVec()
DataType
scaling factor for an image or volume (double)
MDRowVec MDMainHeader
DataType datatype() const
std::string String
Definition: xmipp_strings.h:34
float euler_beta
Definition: rwIMAGIC.cpp:94
#define ALL_IMAGES
String formatString(const char *format,...)
Shift for the image in the Z axis (double)
#define IMAGICSIZE
Definition: rwIMAGIC.cpp:46
#define IMG_INDEX(select_img)
average value (double)
FileName filename
Shift for the image in the Y axis (double)
float densmax
Definition: rwIMAGIC.cpp:81
size_t replaceNsize
< Score 4 for volumes

◆ writeIMAGIC() [1/2]

int writeIMAGIC ( size_t  img_select = ALL_IMAGES,
int  mode = WRITE_OVERWRITE,
const String bitDepth = "",
CastWriteMode  castMode = CW_CAST 
)

Imagic Writer

◆ writeIMAGIC() [2/2]

int ImageBase::writeIMAGIC ( size_t  select_img = ALL_IMAGES,
int  mode = WRITE_OVERWRITE,
const String bitDepth = "",
CastWriteMode  castMode = CW_CAST 
)
protected

Imagic Writer

Definition at line 259 of file rwIMAGIC.cpp.

260 {
261 #undef DEBUG
262  //#define DEBUG
263 #ifdef DEBUG
264  printf("DEBUG writeIMAGIC: Reading Imagic file\n");
265 #endif
266 
267  IMAGIChead header;
268 
269  // Cast T to datatype without convert data
270  DataType wDType, myTypeID = myT();
271 
272  if (bitDepth == "")
273  {
274  switch(myTypeID)
275  {
276  case DT_Double:
277  case DT_Float:
278  case DT_Int:
279  case DT_UInt:
280  wDType = DT_Float;
281  strncpy(header.type,"REAL", sizeof(header.type));
282  break;
283  case DT_UShort:
284  castMode = CW_CONVERT;
285  /* no break */
286  case DT_Short:
287  wDType = DT_Short;
288  strncpy(header.type,"INTG", sizeof(header.type));
289  break;
290  case DT_SChar:
291  castMode = CW_CONVERT;
292  /* no break */
293  case DT_UChar:
294  wDType = DT_UChar;
295  strncpy(header.type,"PACK", sizeof(header.type));
296  break;
297  case DT_CFloat:
298  case DT_CDouble:
299  wDType = DT_CFloat;
300  strncpy(header.type,"COMP", sizeof(header.type));
301  break;
302  default:
303  wDType = DT_Unknown;
304  (void)wDType; // to suppress dead assignment warning
305  REPORT_ERROR(ERR_TYPE_INCORRECT, "ERROR: Unsupported data type by IMAGIC format.");
306  }
307  }
308  else //Convert to other data type
309  {
310  // Default Value
311  wDType = (bitDepth == "default") ? DT_Float : datatypeRAW(bitDepth);
312 
313  switch (wDType)
314  {
315  case DT_UChar:
316  strncpy(header.type,"PACK", sizeof(header.type));
317  break;
318  case DT_Short:
319  strncpy(header.type,"INTG", sizeof(header.type));
320  break;
321  case DT_Float:
322  (strncpy)(header.type,"REAL", sizeof(header.type));
323  break;
324  case DT_CFloat:
325  strncpy(header.type,"COMP", sizeof(header.type));
326  break;
327  default:
328  REPORT_ERROR(ERR_TYPE_INCORRECT,"ERROR: incorrect IMAGIC bits depth value.");
329  }
330  }
331 
332  if (mmapOnWrite)
333  {
334  MDMainHeader.setValue(MDL_DATATYPE,(int) wDType);
335  if (!checkMmapT(wDType))
336  {
337  if (dataMode < DATA && castMode == CW_CAST) // This means ImageGeneric wants to know which DataType must use in mapFile2Write
338  return 0;
339  else //Mapping is an extra. When not available, go on and do not report an error.
340  {
341  /* In this case we cannot map the file because required and feasible datatypes are
342  * not compatible. Then we denote to MapFile2Write the same incoming datatype to
343  * keep using this Image object as usual, without mapping on write.
344  */
345  mmapOnWrite = false;
346  dataMode = DATA;
347  MDMainHeader.setValue(MDL_DATATYPE,(int) myTypeID);
348 
349  // In case Image size great then, at least, map the multidimarray
350  if (mdaBase->nzyxdim*gettypesize(myTypeID) > tiff_map_min_size)
351  mdaBase->setMmap(true);
352 
353  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
354  //if memory already allocated use it (no resize allowed)
356 
357  return 0;
358  }
359  }
360  else
361  dataMode = DATA;
362  }
363 
364  size_t Xdim, Ydim, Zdim, Ndim;
365  getDimensions(Xdim, Ydim, Zdim, Ndim);
366 
367  if (Zdim > 1)
368  REPORT_ERROR(ERR_MULTIDIM_DIM, "writeIMAGIC: Imagic format does not support volumes.");
369 
370  size_t datasize, datasize_n;
371  datasize_n = (size_t)Xdim*Ydim*Zdim;
372  datasize = datasize_n * gettypesize(wDType);
373 
374  // fill in the file header
375  header.nhfr = 1;
376  header.npix2 = Xdim*Ydim;
377  header.npixel = header.npix2;
378  header.iylp = Xdim;
379  header.ixlp = Ydim;
380 
381  time_t timer;
382  time ( &timer );
383  tm* t = localtime(&timer);
384 
385  header.ndate = t->tm_mday;
386  header.nmonth = t->tm_mon + 1;
387  header.nyear = t->tm_year;
388  header.nhour = t->tm_hour;
389  header.nminut = t->tm_min;
390  header.nsec = t->tm_sec;
391 
392  double aux;
393 
394  if (!MDMainHeader.empty())
395  {
396 #define SET_MAIN_HEADER_VALUE(field, label) MDMainHeader.getValueOrDefault(label, aux, 0.); header.field = (float)aux
397  SET_MAIN_HEADER_VALUE(densmin, MDL_MIN);
398  SET_MAIN_HEADER_VALUE(densmax, MDL_MAX);
401  header.varian = header.sigma*header.sigma;
402  }
403 
404  memcpy(header.lastpr, "Xmipp", 5);
405  memcpy(header.name, filename.c_str(), 80);
406 
407  size_t imgStart = IMG_INDEX(select_img);
408 
409  header.ifn = replaceNsize - 1 ;
410  header.imn = 1;
411 
412  if ( mode == WRITE_APPEND )
413  {
414  imgStart = replaceNsize;
415  header.ifn = replaceNsize + Ndim - 1 ;
416  }
417  else if( mode == WRITE_REPLACE && imgStart + Ndim > replaceNsize)
418  header.ifn = imgStart + Ndim - 1;
419  else if (Ndim > replaceNsize)
420  header.ifn = Ndim - 1;
421 
422  /*
423  * BLOCK HEADER IF NEEDED
424  */
425  FileLock flockHead, flockImg;
426  flockHead.lock(fhed);
427  flockImg.lock(fimg);
428 
429  if (replaceNsize == 0) // Header written first time
430  {
431  if ( swapWrite )
432  {
433  IMAGIChead headTemp = header;
434  swapPage((char *) &headTemp, IMAGICSIZE - 916, DT_Float);
435  fwrite( &headTemp, IMAGICSIZE, 1, fhed );
436  }
437  fwrite( &header, IMAGICSIZE, 1, fhed );
438  }
439  else if( header.ifn + 1 > (int)replaceNsize && imgStart > 0 ) // Update number of images when needed
440  {
441  fseek( fhed, sizeof(int), SEEK_SET);
442  if ( swapWrite )
443  {
444  int ifnswp = header.ifn;
445  swapPage((char *) &ifnswp, SIZEOF_INT, DT_Int);
446  fwrite(&(ifnswp),SIZEOF_INT,1,fhed);
447  }
448  else
449  fwrite(&(header.ifn),SIZEOF_INT,1,fhed);
450  }
451 
452  // Jump to the selected imgStart position
453  fseek(fimg, datasize * imgStart, SEEK_SET);
454  fseek(fhed, IMAGICSIZE * imgStart, SEEK_SET);
455 
456  auto it = MD.begin();
457 
458  for (size_t i = 0; i < Ndim; ++i, ++it)
459  {
460  header.iyold=header.ixold=0;
461  header.euler_alpha=header.euler_beta=header.euler_gamma=0.;
462 
463  // Write the individual image header
464  if (it != MD.end() && (dataMode == _HEADER_ALL || dataMode == _DATA_ALL))
465  {
466 #define SET_HEADER_VALUEInt(field, label) (*it)->getValueOrDefault((label), (aux), 0); header.field = -(int)(aux)
467 #define SET_HEADER_VALUEDouble(field, label) (*it)->getValueOrDefault((label), (aux), 0.); header.field = -(float)(aux)
468 
474  }
475  // Update index number of image
476  header.imn = imgStart + i + 1;
477 
478  if ( swapWrite )
479  swapPage((char *) &header, IMAGICSIZE - 916, DT_Float);
480  fwrite( &header, IMAGICSIZE, 1, fhed );
481 
482  if (dataMode >= DATA)
483  {
484  if (mmapOnWrite && Ndim == 1) // Can map one image at a time only
485  {
486  mappedOffset = ftell(fimg);
487  mappedSize = mappedOffset + datasize;
488  fseek(fimg, datasize-1, SEEK_CUR);
489  fputc(0, fimg);
490  }
491  else
492  writeData(fimg, i*datasize_n, wDType, datasize_n, castMode);
493  }
494  else
495  fseek(fimg, datasize, SEEK_CUR);
496  }
497 
498  //Unlock
499  flockHead.unlock();
500  flockImg.unlock();
501 
502  if (mmapOnWrite)
503  mmapFile();
504 
505  return(0);
506 }
tsne coefficients in 2D
Rotation angle of an image (double,degrees)
char name[80]
Definition: rwIMAGIC.cpp:87
DataMode dataMode
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
float sigma
Definition: rwIMAGIC.cpp:78
size_t mappedOffset
Maximum value (double)
virtual void coreAllocateReuse()=0
Tilting angle of an image (double,degrees)
void setValue(const MDObject &object) override
Shift for the image in the X axis (double)
void swapPage(char *page, size_t pageNrElements, DataType datatype, int swap=1)
std::vector< std::unique_ptr< MDRow > > MD
ArrayDim getDimensions()
Special label to be used when gathering MDs in MpiMetadataPrograms.
if read from file original image datatype, this is an struct defined in image
void unlock()
Unlock.
int nminut
Definition: rwIMAGIC.cpp:68
char type[4]
Definition: rwIMAGIC.cpp:74
#define i
Minimum value (double)
float euler_alpha
Definition: rwIMAGIC.cpp:93
const size_t tiff_map_min_size
void setMmap(bool mmap)
virtual bool checkMmapT(DataType datatype)=0
float varian
Definition: rwIMAGIC.cpp:79
float euler_gamma
Definition: rwIMAGIC.cpp:95
char lastpr[8]
Definition: rwIMAGIC.cpp:86
virtual void mmapFile()=0
DataType
void mode
#define SET_HEADER_VALUEInt(field, label)
#define SET_HEADER_VALUEDouble(field, label)
MDRowVec MDMainHeader
size_t mappedSize
void lock(int fileno=0)
Lock file.
#define SET_MAIN_HEADER_VALUE(field, label)
virtual void writeData(FILE *fimg, size_t offset, DataType wDType, size_t datasize_n, CastWriteMode castMode=CW_CAST)=0
int npixel
Definition: rwIMAGIC.cpp:71
float euler_beta
Definition: rwIMAGIC.cpp:94
#define IMAGICSIZE
Definition: rwIMAGIC.cpp:46
bool empty() const override
#define IMG_INDEX(select_img)
average value (double)
Incorrect MultidimArray dimensions.
Definition: xmipp_error.h:173
#define SIZEOF_INT
Definition: rwIMAGIC.cpp:49
FileName filename
Shift for the image in the Y axis (double)
virtual DataType myT() const =0
Incorrect type received.
Definition: xmipp_error.h:190
int nmonth
Definition: rwIMAGIC.cpp:65
size_t replaceNsize
MultidimArrayBase * mdaBase
DataType datatypeRAW(String strDT)
Definition: rwRAW.cpp:31
size_t gettypesize(DataType type)
Returns memory size of datatype.