Xmipp  v3.23.11-Nereus
rwMRC.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Authors: Joaquin Oton (joton@cnb.csic.es)
3  *
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #include "xmipp_image_base.h"
27 #include "xmipp_error.h"
28 #include "xmipp_memory.h"
29 
30 #include "metadata_static.h"
31 #include "multidim_array_base.h"
32 #include "xmipp_funcs.h"
33 
34 #include <memory>
35 /*
36  Base on rwMRC.h
37  Header file for reading and writing MRC files
38  Format: 3D crystallographic image file format for the MRC package
39  Author: Bernard Heymann
40  Created: 19990321 Modified: 20030723
41 */
42 
43 
44 #define MRCSIZE 1024 // Minimum size of the MRC header (when nsymbt = 0)
45 
48 
53 struct MRCheadold
54 { // file header for MRC data
55  int nx; // 0 0 image size
56  int ny; // 1 4
57  int nz; // 2 8
58  int mode; // 3 0=uchar,1=short,2=float
59  int nxStart; // 4 unit cell offset
60  int nyStart; // 5
61  int nzStart; // 6
62  int mx; // 7 unit cell size in voxels
63  int my; // 8
64  int mz; // 9
65  float a; // 10 40 cell dimensions in A
66  float b; // 11
67  float c; // 12
68  float alpha; // 13 cell angles in degrees
69  float beta; // 14
70  float gamma; // 15
71  int mapc; // 16 column axis
72  int mapr; // 17 row axis
73  int maps; // 18 section axis
74  float amin; // 19 minimum density value
75  float amax; // 20 80 maximum density value
76  float amean; // 21 average density value
77  int ispg; // 22 space group number
78  int nsymbt; // 23 bytes used for sym. ops. table
79  float extra[25]; // 24 user-defined info
80  float xOrigin; // 49 phase origin (pixels) or origin of subvolume (A)
81  float yOrigin; // 50
82  float zOrigin; // 51
83  char map[4]; // 52 character string 'MAP ' to identify file type
84  int machst; // 53 machine stamp encoding byte ordering of data
85  float rms; // 54 rms deviation of map from mean density
86  int nlabl; // 55 number of labels used
87  char labels[10][80]; // 56-255 10 80-character labels
88 } ;
89 
93 struct MRChead
94 { // file header for MRC data
95  int32_t nx; // 0 0 image size
96  int32_t ny; // 1 4
97  int32_t nz; // 2 8
98  int32_t mode; // 3 0=char,1=short,2=float,6=uint16
99  int32_t nxStart; // 4 unit cell offset
100  int32_t nyStart; // 5
101  int32_t nzStart; // 6
102  int32_t mx; // 7 unit cell size in voxels
103  int32_t my; // 8
104  int32_t mz; // 9 1=Image or images stack, if volume mz=nz.
105  // If ispg=401 then nz=number of volumes in stack * volume z dimension
106  // mz=volume zdim
107  float a; // 10 40 cell dimensions in A
108  float b; // 11
109  float c; // 12
110  float alpha; // 13 cell angles in degrees
111  float beta; // 14
112  float gamma; // 15
113  int32_t mapc; // 16 column axis
114  int32_t mapr; // 17 row axis
115  int32_t maps; // 18 section axis
116  float amin; // 19 minimum density value
117  float amax; // 20 80 maximum density value
118  float amean; // 21 average density value
119  int32_t ispg; // 22 space group number 0=Image/stack,1=Volume,401=volumes stack
120  int32_t nsymbt; // 23 bytes used for sym. ops. table
121  float extra[25]; // 24 user-defined info
122  float xOrigin; // 49 phase origin in pixels FIXME: is in pixels or [L] units?
123  float yOrigin; // 50
124  float zOrigin; // 51
125  char map[4]; // 52 identifier for map file ("MAP ")
126  char machst[4]; // 53 machine stamp
127  float arms; // 54 RMS deviation
128  int32_t nlabl; // 55 number of labels used
129  char labels[800]; // 56-255 10 80-character labels
130 } ;
131 
132 int ImageBase::readMRC(size_t start_img, size_t batch_size, bool isStack /* = false */)
133 {
134 
135 #undef DEBUG
136  //#define DEBUG
137 #ifdef DEBUG
138  printf("DEBUG readMRC: Reading MRC file\n");
139 #endif
140 
141  std::unique_ptr< MRChead > header( new MRChead() );
142 
143  int errCode = 0;
144 
145  if ( fread( header.get(), MRCSIZE, 1, fimg ) < 1 )
146  return(-2);
147 
148  // Determine byte order and swap bytes if from little-endian machine
149  if ( (swap = (( abs( header->mode ) > SWAPTRIG ) || ( abs(header->nz) > SWAPTRIG ))) )
150  {
151 #ifdef DEBUG
152  fprintf(stderr, "Warning: Swapping header byte order for 4-byte types\n");
153 #endif
154 
155  swapPage((char *) header.get(), MRCSIZE - 800, DT_Float); // MRCSIZE - 800 is to exclude labels from swapping
156  }
157 
158  // Convert VAX floating point types if necessary
159  // if ( header->amin > header->amax )
160  // REPORT_ERROR(ERR_IMG_NOREAD,"readMRC: amin > max: VAX floating point conversion unsupported");
161 
162  size_t _xDim,_yDim,_zDim,_nDim;
163  size_t _nDimSet;
164 
165  _xDim = header->nx;
166  _yDim = header->ny;
167  _zDim = header->nz;
168 
169  // Reading and storing axis order
170  axisOrder[0] = 0;
171  axisOrder[1] = 4 - header->maps;
172  axisOrder[2] = 4 - header->mapr;
173  axisOrder[3] = 4 - header->mapc;
174 
175  bool isVolStk = (header->ispg > 400);
176 
177  /* isStack is already true if file uses our customized "mrcs" extension. In this case
178  * we ignore the stack behavior in header. If format is forced through ":" flag suffix,
179  * then we also ignore the stack behavior in header */
180  if ( !isStack && (isVolStk || !filename.contains(":")))
181  isStack = ((header->ispg == 0 || isVolStk ) && (header->nsymbt == 0));
182 
183  // std::cout << "isStack = " << isStack << std::endl;
184 
185  if(isStack)
186  {
187  if (isVolStk)
188  {
189  _nDim = _zDim / header->mz;
190  _zDim = header->mz;
191  }
192  else
193  {
194  _nDim = _zDim;// When isStack slices in Z are supposed to be a stack of images
195  _zDim = 1;
196  }
197 
198  if (batch_size == ALL_IMAGES) {
199  _nDimSet = _nDim - start_img + 1;
200  } else {
201  _nDimSet = std::min( start_img + batch_size - 1, _nDim ) - start_img + 1;
202  }
203 
204 
205  if ( start_img > _nDim )
206  REPORT_ERROR(ERR_INDEX_OUTOFBOUNDS, formatString("readMRC: %s Image number %lu exceeds stack size %lu", this->filename.c_str(), start_img, _nDim));
207 
208  }
209  else // If the reading is not like a stack, then the select_img is not taken into account and must be selected the only image
210  {
211  start_img = 1;
212  _nDim = 1;
213  _nDimSet = 1;
214  }
215 
216  DataType datatype;
217  switch ( header->mode )
218  {
219  case 0:
220  datatype = DT_UChar;
221  break;
222  case 1:
223  datatype = DT_Short;
224  break;
225  case 2:
226  datatype = DT_Float;
227  break;
228  case 3:
229  datatype = DT_CShort;
230  break;
231  case 4:
232  datatype = DT_CFloat;
233  break;
234  case 6:
235  datatype = DT_UShort;
236  break;
237  case 12:
238  datatype = DT_HalfFloat;
239  break;
240  case 101:
241  datatype = DT_UHalfByte;
242  break;
243 
244  default:
245  datatype = DT_Unknown;
246  errCode = -1;
247  break;
248  }
249 
250  replaceNsize = _nDim;
251  setDimensions(_xDim, _yDim, _zDim, _nDimSet);
252 
253 
254  offset = MRCSIZE + header->nsymbt;
255  size_t datasize_n;
256  datasize_n = _xDim*_yDim*_zDim;
257 
258  // If mode is any of the fourier transforms (3,4)
259  if ( header->mode > 2 && header->mode < 5 )
260  {
261  transform = CentHerm;
262  fseek(fimg, 0, SEEK_END);
263  if ( ftell(fimg) > offset + 0.8*datasize_n*gettypesize(datatype) )
264  _xDim = (2 * (_xDim - 1));
265  if ( header->mx%2 == 1 )
266  _xDim += 1; // Quick fix for odd x-size maps
267  setDimensions(_xDim, _yDim, _zDim, _nDim);
268  }
269 
270  MDMainHeader.setValue(MDL_MIN,(double)header->amin);
271  MDMainHeader.setValue(MDL_MAX,(double)header->amax);
272  MDMainHeader.setValue(MDL_AVG,(double)header->amean);
273  MDMainHeader.setValue(MDL_STDDEV,(double)header->arms);
274  MDMainHeader.setValue(MDL_DATATYPE,(int)datatype);
275 
276  double sampling;
277  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_X, sampling, 1.0);
278  if ( header->mx && header->a!=0 && sampling == 1.0)//ux
279  MDMainHeader.setValue(MDL_SAMPLINGRATE_X,(double)header->a/header->mx);
280  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_Y, sampling, 1.0);
281  if ( header->my && header->b!=0 && sampling == 1.0)//yx
282  MDMainHeader.setValue(MDL_SAMPLINGRATE_Y,(double)header->b/header->my);
283  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_Z, sampling, 1.0);
284  if ( header->mz && header->c!=0 && sampling == 1.0)//zx
285  MDMainHeader.setValue(MDL_SAMPLINGRATE_Z,(double)header->c/header->mz);
286 
287  if (dataMode==HEADER || (dataMode == _HEADER_ALL && _nDim > 1)) // Stop reading if not necessary
288  {
289  readData(NULL, 0, DT_Unknown, 0); // To consider axis ordering. Will not read actual data
290  return errCode;
291  }
292 
293  const size_t imgStart = IMG_INDEX(start_img);
294  const size_t imgEnd = start_img + _nDimSet - 1;
295 
296  MD.clear();
297  for (size_t i = 0; i < imgEnd-imgStart; i++)
298  MD.push_back(std::unique_ptr<MDRowVec>(new MDRowVec(MDL::emptyHeaderVec())));
299 
300  /* As MRC does not support stacks, we use the geometry stored in the header
301  for any image when we simulate the file is a stack.*/
302  if (dataMode == _HEADER_ALL || dataMode == _DATA_ALL)
303  {
304  double aux;
305  for ( size_t i = 0; i < imgEnd - imgStart; ++i )
306  {
307  MD[i]->setValue(MDL_SHIFT_X, (double) -header->nxStart);
308  MD[i]->setValue(MDL_SHIFT_Y, (double) -header->nyStart);
309  MD[i]->setValue(MDL_SHIFT_Z, (double) -header->nzStart);
310 
311  // We include auto detection of MRC2000 or CCP4 style origin based on http://situs.biomachina.org/fmap.pdf
312  if (header->xOrigin != 0)
313  MD[i]->setValue(MDL_ORIGIN_X, (double)-header->xOrigin);
314  else if (header->nxStart != 0 && MDMainHeader.getValue(MDL_SAMPLINGRATE_X,aux))
315  MD[i]->setValue(MDL_ORIGIN_X, -header->nxStart/aux);
316 
317  if (header->yOrigin !=0)
318  MD[i]->setValue(MDL_ORIGIN_Y, (double)-header->yOrigin);
319  else if(header->nyStart !=0 && MDMainHeader.getValue(MDL_SAMPLINGRATE_Y,aux))
320  MD[i]->setValue(MDL_ORIGIN_Y, -header->nyStart/aux);
321 
322  if (header->zOrigin != 0)
323  MD[i]->setValue(MDL_ORIGIN_Z, (double)-header->zOrigin);
324  else if(header->nzStart !=0 && MDMainHeader.getValue(MDL_SAMPLINGRATE_Z,aux))
325  MD[i]->setValue(MDL_ORIGIN_Z, -header->nzStart/aux);
326  }
327  }
328 
329  if ( dataMode < DATA ) // Don't read the individual header and the data if not necessary
330  {
331  readData(NULL, 0, DT_Unknown, 0); // To consider axis ordering. Will not read actual data
332  return errCode;
333  }
334 
335  // Lets read the data
336 
337  // 4-bits mode: Here is the magic to expand the compressed images
338  if (datatype == DT_UHalfByte){
339  readData4bit(fimg, start_img, datatype, 0);
340  }
341  else{
342  readData(fimg, start_img, datatype, 0);
343  }
344 
345  return errCode;
346 }
347 
348 // I/O prototypes
352 int ImageBase::readMRC(size_t select_img, bool isStack /* = false*/)
353 {
354 #undef DEBUG
355  //#define DEBUG
356 #ifdef DEBUG
357  printf("DEBUG readMRC: Reading MRC file\n");
358 #endif
359 
360  if (select_img == ALL_IMAGES) {
361  return readMRC(1, ALL_IMAGES, isStack);
362  }
363  return readMRC(select_img, 1, isStack);
364 }
365 
369 int ImageBase::writeMRC(size_t select_img, bool isStack, int mode, const String &bitDepth, CastWriteMode castMode)
370 {
371  MRChead* header = (MRChead *) askMemory(sizeof(MRChead));
372 
373  // Cast T to datatype
374  DataType wDType,myTypeID = myT();
375 
376  if (bitDepth == "")
377  {
378  castMode = CW_CAST;
379  switch(myTypeID)
380  {
381  case DT_Double:
382  case DT_Float:
383  case DT_Int:
384  case DT_UInt:
385  wDType = DT_Float;
386  header->mode = 2;
387  break;
388  case DT_UShort:
389  wDType = DT_UShort;
390  header->mode = 6;
391  break;
392  case DT_Short:
393  wDType = DT_Short;
394  header->mode = 1;
395  break;
396  case DT_SChar:
397  castMode = CW_CONVERT;
398  /* no break */
399  case DT_UChar:
400  wDType = DT_UChar;
401  header->mode = 0;
402  break;
403  case DT_CFloat:
404  case DT_CDouble:
405  wDType = DT_CFloat;
406  header->mode = 4;
407  break;
408  case DT_HalfFloat:
409  wDType = DT_HalfFloat;
410  header->mode = 12;
411  break;
412  //case DT_UHalfByte:
413  default:
414  wDType = DT_Unknown;
415  (void)wDType; // to suppress dead assignment warning
416  REPORT_ERROR(ERR_TYPE_INCORRECT,(std::string)"ERROR: Unsupported data type by MRC format.");
417  }
418  }
419  else //Convert to other data type
420  {
421  // Default Value
422  wDType = (bitDepth == "default") ? DT_Float : datatypeRAW(bitDepth);
423 
424  switch (wDType)
425  {
426  case DT_Double:
427  case DT_Int:
428  case DT_UInt:
429  case DT_Float:
430  header->mode = 2;
431  break;
432  case DT_UChar:
433  header->mode = 0;
434  break;
435  case DT_UShort:
436  header->mode = 6;
437  break;
438  case DT_Short:
439  header->mode = 1;
440  break;
441  case DT_CFloat:
442  case DT_CDouble:
443  header->mode = 4;
444  break;
445  case DT_HalfFloat:
446  header->mode = 12;
447  break;
448  default:
449  REPORT_ERROR(ERR_TYPE_INCORRECT,"ERROR: incorrect MRC bits depth value.");
450  }
451  }
452 
453  if (mmapOnWrite)
454  {
455  MDMainHeader.setValue(MDL_DATATYPE,(int) wDType);
456  if (!checkMmapT(wDType))
457  {
458  if (dataMode < DATA && castMode == CW_CAST) // This means ImageGeneric wants to know which DataType must use in mapFile2Write
459  return 0;
460  else //Mapping is an extra. When not available, go on and do not report an error.
461  {
462  /* In this case we cannot map the file because required and feasible datatypes are
463  * not compatible. Then we denote to MapFile2Write the same incoming datatype to
464  * keep using this Image object as usual, without mapping on write.
465  */
466  mmapOnWrite = false;
467  dataMode = DATA;
468  MDMainHeader.setValue(MDL_DATATYPE,(int) myTypeID);
469 
470  // In case Image size great then, at least, map the multidimarray
471  if (mdaBase->nzyxdim*gettypesize(wDType) > tiff_map_min_size)
472  mdaBase->setMmap(true);
473 
474  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
475  //if memory already allocated use it (no resize allowed)
476  mdaBase->coreAllocateReuse();
477 
478  return 0;
479  }
480  }
481  else
482  dataMode = DATA;
483  }
484 
485 
486  /*
487  if ( transform != NoTransform )
488  img_convert_fourier(p, CentHerm);
489  */
490 
491  // Map the parameters
492  strncpy(header->map, "MAP ", 4);
493  // FIXME TO BE DONE WITH rwCCP4!!
494  //set_CCP4_machine_stamp(header->machst);
495  char* machine_stamp;
496  machine_stamp = (char *)(header->machst);
497  if(IsLittleEndian())
498  {
499  machine_stamp[0] = 68;
500  machine_stamp[1] = 65;
501  }
502  else
503  {
504  machine_stamp[0] = machine_stamp[1] = 17;
505  }
506  // case LittleVAX:
507  // machine_stamp[0] = 34;
508  // machine_stamp[1] = 65;
509  // break;
510 
511  size_t Xdim, Ydim, Zdim, Ndim;
512  getDimensions(Xdim, Ydim, Zdim, Ndim);
513 
521  header->mx = header->nx = Xdim;
522  header->my = header->ny = Ydim;
523  header->mz = header->nz = Zdim;
524 
525  // Obtaining sampling rate for each dimension and calculating cube size
526  // By default sampling rate is 1.0 if no real value was found
527  double sampling;
528  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_X, sampling, 1.0);
529  header->a = (float)(Xdim * sampling);
530  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_Y, sampling, 1.0);
531  header->b = (float)(Ydim * sampling);
532  MDMainHeader.getValueOrDefault(MDL_SAMPLINGRATE_Z, sampling, 1.0);
533  header->c = (float)(Zdim * sampling);
534 
535  if ( transform == CentHerm )
536  header->nx = Xdim/2 + 1; // If a transform, physical storage is nx/2 + 1
537 
538  header->alpha = 90.;
539  header->beta = 90.;
540  header->gamma = 90.;
541 
542  // header->mx = 0;//(int) (ua/ux + 0.5);
543  // header->my = 0;//(int) (ub/uy + 0.5);
544  // header->mz = 0;//(int) (uc/uz + 0.5);
545  header->mapc = 1;
546  header->mapr = 2;
547  header->maps = 3;
548  double aux,aux2;
549 
550  // header->a = 0.;// ua;
551  // header->b = 0.;// ub;
552  // header->c = 0.;// uc;
553 
554  if (!MDMainHeader.empty())
555  {
556 #define SET_MAIN_HEADER_VALUE(field, label) MDMainHeader.getValueOrDefault(label, aux, 0.); header->field = (float)aux
561 
562  if ((dataMode == _HEADER_ALL || dataMode == _DATA_ALL))
563  {
564 #define SET_HEADER_SHIFT(field, label) MD[0]->getValueOrDefault(label, aux, 0.); header->field = -(int) round(aux)
568 #define SET_HEADER_ORIGIN(field, label1, label2) MD[0]->getValueOrDefault(label1, aux, 0.);MDMainHeader.getValueOrDefault(label2, aux2, 0.);\
569  header->field = (float) (aux * aux2)
570 
574 
575 #define SET_HEADER_CELL_DIM(field, label1, dimSize) MDMainHeader.getValueOrDefault(label1, aux, 0.);\
576  header->field = (float) (aux * dimSize)
577 
581  }
582  else
583  {
584  header->nxStart = header->nyStart = header->nzStart = 0;
585  header->xOrigin = header->yOrigin = header->zOrigin = 0;
586  }
587  }
588 
589  header->nsymbt = 0;
590  header->nlabl = 10; // or zero?
591  //strncpy(header->labels, p->label.c_str(), 799);
592 
593  offset = MRCSIZE + header->nsymbt;
594  size_t datasize, datasize_n;
595  datasize_n = Xdim*Ydim*Zdim;
596  datasize = datasize_n * gettypesize(wDType);
597 
598  //#define DEBUG
599 #ifdef DEBUG
600 
601  printf("DEBUG rwMRC: Offset = %ld, Datasize_n = %ld\n", offset, datasize_n);
602 #endif
603 
604  size_t imgStart = 0;
605 
606  if (Ndim > 1 || filename.contains(":mrcs")) // If format is forced through ":" flag suffix, then ignore the stack behavior in header
607  isStack = true;
608 
609  bool isVolStk = isStack && Zdim > 1;
610  size_t nDimHeader = Ndim;
611 
612  if (isStack)
613  {
614  imgStart = IMG_INDEX(select_img);
615 
616  if( mode == WRITE_APPEND )
617  {
618  imgStart = replaceNsize;
619  nDimHeader = replaceNsize + Ndim;
620  }
621  else if( mode == WRITE_REPLACE && select_img + Ndim - 1 > replaceNsize)
622  {
623  nDimHeader = select_img + Ndim - 1;
624  }
625  // else if (Ndim > replaceNsize)
626  // nDimHeader = Ndim;
627 
628 
629  if (isVolStk)
630  {
631  header->ispg = 401;
632  header->mz = Zdim;
633  header->nz = Zdim * nDimHeader;
634  }
635  else
636  {
637  header->ispg = 0;
638  header->nz = nDimHeader;
639  }
640  }
641  else // To set in the header that the file is a volume not a stack
642  header->ispg = (Zdim>1)? 1:0;
643 
644  //locking
645  FileLock flock;
646  flock.lock(fimg);
647 
648  // Write header when needed
649  if(!isStack || replaceNsize < nDimHeader)
650  {
651  if ( swapWrite )
652  swapPage((char *) header, MRCSIZE - 800, DT_Float);
653  fwrite( header, MRCSIZE, 1, fimg );
654  }
655  freeMemory(header, sizeof(MRChead) );
656 
657  // Jump to the selected imgStart position
658  fseek( fimg,offset + (datasize)*imgStart, SEEK_SET);
659 
660  size_t imgEnd = (isStack)? Ndim : 1;
661 
662  if (checkMmapT(wDType) && !mmapOnWrite && dataMode >= DATA) {
663  writeData(fimg, 0, wDType, datasize_n * imgEnd, castMode);
664  } else {
665  for ( size_t i = 0; i < imgEnd; i++ )
666  {
667  // If to also write the image data or jump its size
668  if (dataMode >= DATA)
669  {
670  if (mmapOnWrite && Ndim == 1) // Can map one image at a time only
671  {
672  mappedOffset = ftell(fimg);
673  mappedSize = mappedOffset + datasize;
674  fseek(fimg, datasize-1, SEEK_CUR);
675  fputc(0, fimg);
676  }
677  else
678  writeData(fimg, i*datasize_n, wDType, datasize_n, castMode);
679  }
680  else
681  fseek(fimg, datasize, SEEK_CUR);
682  }
683  }
684 
685 
686 
687  // Unlock the file
688  flock.unlock();
689 
690  if (mmapOnWrite)
691  mmapFile();
692 
693  return(0);
694 }
float yOrigin
Definition: rwMRC.cpp:81
int machst
Definition: rwMRC.cpp:84
Index out of bounds.
Definition: xmipp_error.h:132
int32_t my
Definition: rwMRC.cpp:103
tsne coefficients in 2D
void min(Image< double > &op1, const Image< double > &op2)
#define SWAPTRIG
sampling rate in A/pixel (double)
#define SET_MAIN_HEADER_VALUE(field, label)
int readMRC(size_t select_img, bool isStack=false)
sampling rate in A/pixel (double)
#define MRCSIZE
Definition: rwMRC.cpp:44
sampling rate in A/pixel (double)
bool IsLittleEndian(void)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
float alpha
Definition: rwMRC.cpp:68
int32_t nsymbt
Definition: rwMRC.cpp:120
int nzStart
Definition: rwMRC.cpp:61
int32_t mz
Definition: rwMRC.cpp:104
int32_t mx
Definition: rwMRC.cpp:102
Maximum value (double)
float alpha
Definition: rwMRC.cpp:110
DataType datatypeRAW(String strDT)
Shift for the image in the X axis (double)
float amax
Definition: rwMRC.cpp:75
char machst[4]
Definition: rwMRC.cpp:126
float amin
Definition: rwMRC.cpp:116
float gamma
Definition: rwMRC.cpp:112
void abs(Image< double > &op)
if read from file original image datatype, this is an struct defined in image
float zOrigin
Definition: rwMRC.cpp:124
float rms
Definition: rwMRC.cpp:85
void unlock()
Unlock.
int32_t mapc
Definition: rwMRC.cpp:113
#define SET_HEADER_ORIGIN(field, label1, label2)
float beta
Definition: rwMRC.cpp:111
auxiliary label to be used as an index (long)
float amin
Definition: rwMRC.cpp:74
float yOrigin
Definition: rwMRC.cpp:123
int nyStart
Definition: rwMRC.cpp:60
#define i
float amean
Definition: rwMRC.cpp:76
float zOrigin
Definition: rwMRC.cpp:82
int writeMRC(size_t select_img, bool isStack=false, int mode=WRITE_OVERWRITE, const String &bitDepth="", CastWriteMode castMode=CW_CAST)
Definition: rwMRC.cpp:369
int my
Definition: rwMRC.cpp:63
Minimum value (double)
int32_t nz
Definition: rwMRC.cpp:97
int32_t ny
Definition: rwMRC.cpp:96
#define SET_HEADER_CELL_DIM(field, label1, dimSize)
int32_t nxStart
Definition: rwMRC.cpp:99
float c
Definition: rwMRC.cpp:109
int ispg
Definition: rwMRC.cpp:77
int freeMemory(void *ptr, size_t memsize)
int readMRC(size_t select_img, bool isStack=false)
Definition: rwMRC.cpp:352
int nsymbt
Definition: rwMRC.cpp:78
int mz
Definition: rwMRC.cpp:64
Origin for the image in the Y axis (double)
const size_t tiff_map_min_size
int32_t mapr
Definition: rwMRC.cpp:114
int32_t nx
Definition: rwMRC.cpp:95
int maps
Definition: rwMRC.cpp:73
float b
Definition: rwMRC.cpp:66
int mx
Definition: rwMRC.cpp:62
int nz
Definition: rwMRC.cpp:57
int nlabl
Definition: rwMRC.cpp:86
int32_t ispg
Definition: rwMRC.cpp:119
#define sampling
float c
Definition: rwMRC.cpp:67
float b
Definition: rwMRC.cpp:108
char map[4]
Definition: rwMRC.cpp:83
float a
Definition: rwMRC.cpp:65
char * askMemory(size_t memsize)
char labels[10][80]
Definition: rwMRC.cpp:87
float extra[25]
Definition: rwMRC.cpp:79
float beta
Definition: rwMRC.cpp:69
static MDRowVec emptyHeaderVec()
DataType
int32_t maps
Definition: rwMRC.cpp:115
char map[4]
Definition: rwMRC.cpp:125
float gamma
Definition: rwMRC.cpp:70
int32_t nlabl
Definition: rwMRC.cpp:128
int ny
Definition: rwMRC.cpp:56
int32_t nzStart
Definition: rwMRC.cpp:101
int32_t nyStart
Definition: rwMRC.cpp:100
int nx
Definition: rwMRC.cpp:55
float amax
Definition: rwMRC.cpp:117
void lock(int fileno=0)
Lock file.
int mapc
Definition: rwMRC.cpp:71
float xOrigin
Definition: rwMRC.cpp:122
int mode
Definition: rwMRC.cpp:58
#define SET_HEADER_SHIFT(field, label)
int mapr
Definition: rwMRC.cpp:72
int32_t mode
Definition: rwMRC.cpp:98
std::string String
Definition: xmipp_strings.h:34
float xOrigin
Definition: rwMRC.cpp:80
#define ALL_IMAGES
String formatString(const char *format,...)
Shift for the image in the Z axis (double)
#define IMG_INDEX(select_img)
fprintf(glob_prnt.io, "\)
Origin for the image in the Z axis (double)
average value (double)
int nxStart
Definition: rwMRC.cpp:59
CastWriteMode
Shift for the image in the Y axis (double)
Incorrect type received.
Definition: xmipp_error.h:190
float a
Definition: rwMRC.cpp:107
float amean
Definition: rwMRC.cpp:118
float arms
Definition: rwMRC.cpp:127
size_t gettypesize(DataType type)
Returns memory size of datatype.