Xmipp  v3.23.11-Nereus
rwSPIDER.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 <cmath>
27 #include "xmipp_image_base.h"
28 #include "xmipp_memory.h"
29 #include "metadata_static.h"
30 #include "multidim_array_base.h"
31 
32 
33 /*
34  Based on rwSPIDER.h
35  Header file for reading and writing SPIDER files
36  Format: 3D image file format for the SPIDER package
37  Author: Bernard Heymann
38  Created: 19990410 Modified: 20010928
39 */
40 
41 
42 #define SPIDERSIZE 1024 // Minimum size of the SPIDER header (variable)
43 
49 struct SPIDERhead
50 { // file header for SPIDER data
51  float nslice; // 0 slices in volume (image = 1)
52  float nrow; // 1 rows per slice
53  float irec; // 2 # records in file (unused)
54  float nhistrec; // 3 (obsolete)
55  float iform; // 4 file type specifier
56  float imami; // 5 max/min flag (=1 if calculated)
57  float fmax; // 6 maximum
58  float fmin; // 7 minimum
59  float av; // 8 average
60  float sig; // 9 standard deviation (=-1 if not calculated)
61  float ihist; // 10 (obsolete)
62  float nsam; // 11 pixels per row
63  float labrec; // 12 # records in header
64  float iangle; // 13 flag: tilt angles filled
65  float phi; // 14 tilt angles
66  float theta; // 15
67  float gamma; // 16 (=psi)
68  float xoff; // 17 translation
69  float yoff; // 18
70  float zoff; // 19
71  float scale; // 20 scaling
72  float labbyt; // 21 # bytes in header
73  float lenbyt; // 22 record length in bytes (row length)
74  float istack; // 23 indicates stack of images
75  float inuse; // 24 indicates this image in stack is used (not used)
76  float maxim; // 25 max image in stack used
77  float imgnum; // 26 number of current image
78  float unused[2]; // 27-28 (unused)
79  float kangle; // 29 flag: additional angles set
80  float phi1; // 30 additional angles
81  float theta1; // 31
82  float psi1; // 32
83  float phi2; // 33
84  float theta2; // 34
85  float psi2; // 35
86 
87  double fGeo_matrix[3][3]; // x9 = 72 bytes: Geometric info
88  float fAngle1; // angle info
89 
90  float fr1;
91  float fr2; // lift up cosine mask parameters
92 
94  float RTflag; // 1=RT, 2=FFT(RT)
95  float Astart;
96  float Aend;
97  float Ainc;
98  float Rsigma; // 4*7 = 28 bytes
99  float Tstart;
100  float Tend;
101  float Tinc; // 4*3 = 12, 12+28 = 40B
102 
104  float weight; // For Maximum-Likelihood refinement
105  float flip; // 0=no flipping operation (false), 1=flipping (true)
106 
107  char fNada2[576]; // empty 700-76-40=624-40-8= 576 bytes
108 
109  char cdat[12]; // 211-213 creation date
110  char ctim[8]; // 214-215 creation time
111  char ctit[160]; // 216-255 title
112 } ;
113 
114 /************************************************************************
115 @Function: readSPIDER
116 @Description:
117  Reading a SPIDER image file format.
118 @Algorithm:
119  A 3D multi-image format used in electron microscopy.
120  Header size: 1024 bytes (not same as data offset!).
121  Data offset: sizeof(float)*x_size*ceil(1024/x_size)
122  File format extensions: .spi
123  Byte order determination: File type and third dimension values
124  must be less than 256*256.
125  Data type: only float.
126  Transform type: Hermitian
127  The x-dimension contains the x-size
128  of the full transform
129  A multi-image file has a global header followed by a header and data
130  for each sub-image.
131 @Arguments:
132  Bimage* p the image structure.
133  size_t select_img image selection in multi-image file (-1 = all images).
134 @Returns:
135  int error code (<0 means failure).
136 **************************************************************************/
140 #include "metadata_label.h"
141 #include <errno.h>
142 #include <memory>
143 
144 int ImageBase::readSPIDER(size_t start_img, size_t batch_size) {
145 #undef DEBUG
146  //#define DEBUG
147 #ifdef DEBUG
148  printf("DEBUG readSPIDER: Reading Spider file, start_img = %lu, batch_size = %lu\n", start_img, batch_size);
149 #endif
150 #undef DEBUG
151 
152  // SPIDERhead* header = new SPIDERhead;
153  std::unique_ptr<SPIDERhead> header( new SPIDERhead() );
154  if ( fread( header.get(), SPIDERSIZE, 1, fimg ) != 1 )
155  REPORT_ERROR(ERR_IO_NOREAD, formatString("rwSPIDER: cannot read Spider main header from file %s"
156  ". Error message: %s", filename.c_str() ,strerror(errno)));
157 
158  // Determine byte order and swap bytes if from different-endian machine
159  if ( (swap = (( fabs(header->nslice) > SWAPTRIG ) || ( fabs(header->iform) > 1000 ) ||
160  ( fabs(header->nslice) < 1 ))) )
161  swapPage((char *) header.get(), SPIDERSIZE - 180, DT_Float);
162 
163  if(header->labbyt != header->labrec*header->lenbyt)
164  REPORT_ERROR(ERR_IO_NOTFILE,formatString("Invalid Spider file: %s", filename.c_str()));
165 
166  offset = (size_t) header->labbyt;
167  DataType datatype = DT_Float;
168 
169  MDMainHeader.setValue(MDL_MIN,(double)header->fmin);
170  MDMainHeader.setValue(MDL_MAX,(double)header->fmax);
171  MDMainHeader.setValue(MDL_AVG,(double)header->av);
172  MDMainHeader.setValue(MDL_STDDEV,(double)header->sig);
173  MDMainHeader.setValue(MDL_SAMPLINGRATE_X,(double)header->scale);
174  MDMainHeader.setValue(MDL_SAMPLINGRATE_Y,(double)header->scale);
175  MDMainHeader.setValue(MDL_SAMPLINGRATE_Z,(double)header->scale);
176  MDMainHeader.setValue(MDL_DATATYPE,(int)datatype);
177 
178  bool isStack = ( header->istack > 0 );
179  int _xDim,_yDim,_zDim;
180  size_t _nDim, _nDimSet;
181  _xDim = (int) header->nsam;
182  _yDim = (int) header->nrow;
183  _zDim = (int) header->nslice;
184  _nDim = (isStack)? (size_t)(header->maxim) : 1;
185 
186  if (_xDim < 1 || _yDim < 1 || _zDim < 1 || _nDim < 1)
187  REPORT_ERROR(ERR_IO_NOTFILE,formatString("Invalid Spider file: %s", filename.c_str()));
188 
189  replaceNsize = _nDim;
190 
191  /************
192  * BELLOW HERE DO NOT USE HEADER BUT LOCAL VARIABLES
193  */
194 
195  // Map the parameters, REad the whole object (-1) or a slide
196  // Only handle stacks of images not of volumes
197 
198  if(!isStack) {
199  _nDimSet = 1;
200  }
201  else if (batch_size == ALL_IMAGES) {
202  _nDimSet = _nDim - start_img + 1;
203  } else {
204  _nDimSet = std::min( start_img + batch_size - 1, _nDim ) - start_img + 1;
205  }
206 
207  setDimensions(_xDim, _yDim, _zDim, _nDimSet);
208 
209  //image is in stack? and set right initial and final image
210  const size_t header_size = offset;
211 
212  if ( isStack)
213  {
214  if ( start_img > _nDim )
215  REPORT_ERROR(ERR_INDEX_OUTOFBOUNDS, formatString("readSpider (%s): Image number %lu exceeds stack size %lu" ,filename.c_str(),start_img, _nDim));
216  offset += offset;
217  }
218 
219  if (dataMode == HEADER || (dataMode == _HEADER_ALL && _nDimSet > 1)) // Stop reading if not necessary
220  {
221  return 0;
222  }
223 
224  const size_t datasize_n = _xDim*_yDim*_zDim;
225  const size_t image_size = header_size + datasize_n*sizeof(float);
226  const size_t pad = (size_t) header->labbyt;
227  const size_t imgStart = IMG_INDEX(start_img);
228  const size_t imgEnd = start_img + _nDimSet - 1;
229  // printf( "start_img = %lu, batch_size = %lu, _nDim = %lu, _nDimSet = %lu, imgEnd = %lu\n", start_img, batch_size, _nDim, _nDimSet, imgEnd );
230  size_t img_seek = header_size + imgStart * image_size;
231 
232  MD.clear();
233  for (size_t i = 0; i < imgEnd-imgStart; i++)
234  MD.push_back(std::unique_ptr<MDRowVec>(new MDRowVec(MDL::emptyHeaderVec())));
235  double daux;
236 
237  //std::cerr << formatString("DEBUG_JM: header_size: %10lu, datasize_n: %10lu, image_size: %10lu, imgStart: %10lu, img_seek: %10lu",
238  // header_size, datasize_n, image_size, imgStart, img_seek) <<std::endl;
239 
240  for (size_t n = 0, i = imgStart; i < imgEnd; ++i, ++n, img_seek += image_size )
241  {
242  if (fseek( fimg, img_seek, SEEK_SET ) != 0)//fseek return 0 on success
243  REPORT_ERROR(ERR_IO, formatString("rwSPIDER: error seeking %lu for read image %lu", img_seek, i));
244 
245  // std::cerr << formatString("DEBUG_JM: rwSPIDER: seeking %lu for read image %lu", img_seek, i) <<std::endl;
246 
247  if(isStack)
248  {
249  if ( fread( header.get(), SPIDERSIZE, 1, fimg ) != 1 )
250  REPORT_ERROR(ERR_IO_NOREAD, formatString("rwSPIDER: cannot read Spider image %lu header", i));
251  if ( swap )
252  swapPage((char *) header.get(), SPIDERSIZE - 180, DT_Float);
253  }
254  if (dataMode == _HEADER_ALL || dataMode == _DATA_ALL)
255  {
256  daux = (double)header->xoff;
257  MD[n]->setValue(MDL_SHIFT_X, daux);
258  daux = (double)header->yoff;
259  MD[n]->setValue(MDL_SHIFT_Y, daux);
260  daux = (double)header->zoff;
261  MD[n]->setValue(MDL_SHIFT_Z, daux);
262  daux = (double)header->phi;
263  MD[n]->setValue(MDL_ANGLE_ROT, daux);
264  daux = (double)header->theta;
265  MD[n]->setValue(MDL_ANGLE_TILT, daux);
266  daux = (double)header->gamma;
267  MD[n]->setValue(MDL_ANGLE_PSI, daux);
268  daux = (double)header->weight;
269  MD[n]->setValue(MDL_WEIGHT, daux);
270  bool baux = (header->flip == 1);
271  MD[n]->setValue(MDL_FLIP, baux);
272  daux = (double) header->scale;
273  if (daux==0.)
274  daux=1.0;
275  MD[n]->setValue(MDL_SCALE, daux);
276  }
277  }
278 
279  if (dataMode < DATA) // Don't read data if not necessary but read the header
280  return 0;
281 
282 #ifdef DEBUG
283  std::cerr<<"DEBUG readSPIDER: header_size = "<<header_size<<" image_size = "<<image_size<<std::endl;
284  std::cerr<<"DEBUG readSPIDER: select_img= "<<select_img<<" n= "<<Ndim<<" pad = "<<pad<<std::endl;
285 #endif
286  //offset should point to the begin of the data
287  readData(fimg, start_img, datatype, pad );
288 
289  return 0;
290 }
291 
292 int ImageBase::readSPIDER(size_t select_img)
293 {
294 #undef DEBUG
295  // #define DEBUG
296 #ifdef DEBUG
297  printf("DEBUG readSPIDER: Reading Spider file\n");
298 #endif
299 #undef DEBUG
300 
301  if ( select_img == ALL_IMAGES ) {
302  return readSPIDER( 1, ALL_IMAGES );
303  }
304  return readSPIDER(select_img, 1);
305 
306 }
307 /************************************************************************
308 @Function: writeSPIDER
309 @Description:
310  Writing a SPIDER image file format.
311 @Algorithm:
312  A 3D image format used in electron microscopy.
313 @Arguments:
314 @Returns:
315  int error code (<0 means failure).
316 **************************************************************************/
320 int ImageBase::writeSPIDER(size_t select_img, bool isStack, int mode)
321 {
322 #undef DEBUG
323  //#define DEBUG
324 #ifdef DEBUG
325  printf("DEBUG writeSPIDER: Writing Spider file\n");
326  printf("DEBUG writeSPIDER: File %s\n", filename.c_str());
327 #endif
328 #undef DEBUG
329 
330  // Check datatype compatibility
331  DataType wDType = (isComplexT()) ? DT_CFloat : DT_Float;
332 
333  if (mmapOnWrite)
334  {
335  MDMainHeader.setValue(MDL_DATATYPE,(int) wDType);
336  if (!checkMmapT(wDType))
337  {
338  if (dataMode < DATA) // This means ImageGeneric wants to know which DataType must use in mapFile2Write
339  return 0;
340  else //Mapping is an extra. When not available, go on and do not report an error.
341  {
342  /* In this case we cannot map the file because required and feasible datatypes are
343  * not compatible. Then we denote to MapFile2Write the same incoming datatype to
344  * keep using this Image object as usual, without mapping on write.
345  */
346  mmapOnWrite = false;
347  dataMode = DATA;
348  MDMainHeader.setValue(MDL_DATATYPE,(int) myT());
349 
350  // In case Image size great then, at least, map the multidimarray
351  if (mdaBase->nzyxdim*gettypesize(wDType) > tiff_map_min_size)
352  mdaBase->setMmap(true);
353 
354  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
355  //if memory already allocated use it (no resize allowed)
356  mdaBase->coreAllocateReuse();
357 
358  return 0;
359  }
360  }
361  else
362  dataMode = DATA;
363  }
364 
365  size_t Xdim, Ydim, Zdim, Ndim;
366  getDimensions(Xdim, Ydim, Zdim, Ndim);
367 
368  size_t datasize, datasize_n;
369  datasize_n = (size_t)Xdim*Ydim*Zdim;
370  datasize = datasize_n * gettypesize(wDType);
371 
372  // Filling the main header
373  float lenbyt = gettypesize(wDType)*Xdim; // Record length (in bytes)
374  float labrec = floor(SPIDERSIZE/lenbyt); // # header records
375  if ( fmod(SPIDERSIZE,lenbyt) != 0 )
376  labrec++;
377  float labbyt = labrec*lenbyt; // Size of header in bytes
378  offset = (size_t) labbyt;
379 
380  SPIDERhead* header = (SPIDERhead *) askMemory((int)labbyt*sizeof(char));
381 
382  // Map the parameters
383  header->lenbyt = lenbyt; // Record length (in bytes)
384  header->labrec = labrec; // # header records
385  header->labbyt = labbyt; // Size of header in bytes
386 
387  header->irec = labrec + floor((datasize_n*gettypesize(wDType))/lenbyt + 0.999999); // Total # records
388  header->nsam = Xdim;
389  header->nrow = Ydim;
390  header->nslice = Zdim;
391 
392  // If a transform, then the physical storage in x is only half+1
393  if ( transform == Hermitian )
394  {
395  size_t xstore = (size_t)(Xdim * 0.5 + 1);
396  header->nsam = 2*xstore;
397  }
398 
399  // #define DEBUG
400 #ifdef DEBUG
401  printf("DEBUG writeSPIDER: Size: %g %g %g %d %g\n",
402  header->nsam,
403  header->nrow,
404  header->nslice,
405  Ndim,
406  header->maxim);
407 #endif
408 #undef DEBUG
409 
410  if ( Zdim < 2 )
411  {
412  // 2D image or 2D Fourier transform
413  header->iform = ( transform == NoTransform ) ? 1 : -12 + (int)header->nsam%2;
414  }
415  else
416  {
417  // 3D volume or 3D Fourier transform
418  header->iform = ( transform == NoTransform )? 3 : -22 + (int)header->nsam%2;
419  }
420  double aux;
421  bool baux;
422  header->imami = 0;//never trust max/min
423 
424 
425  if (!MDMainHeader.empty())
426  {
427 #define SET_MAIN_HEADER_VALUE(field, label, aux) MDMainHeader.getValueOrDefault(label, aux, 0.); header->field = (float)aux
432  }
433 
434 
435  if (Ndim == 1 && mode != WRITE_APPEND && !isStack && !MD.empty())
436  {
437  if ((dataMode == _HEADER_ALL || dataMode == _DATA_ALL))
438  {
439 #define SET_HEADER_VALUE(field, label, aux) MD[0]->getValueOrDefault((label), (aux), 0.); header->field = (float)(aux)
449  }
450  else
451  {
452  header->xoff = header->yoff = header->zoff =\
453  header->phi = header->theta = header->gamma = header->weight = 0.;
454  header->scale = 1.;
455  }
456  }
457 
458  //else end
459  // Set time and date
460  /*
461  time_t timer;
462  time ( &timer );
463  tm* t = localtime(&timer);
464  while ( t->tm_year > 100 )
465  t->tm_year -= 100;
466  sprintf(header->ctim, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec);
467  sprintf(header->cdat, "%02d-%02d-%02d", t->tm_mday, t->tm_mon, t->tm_year);
468  */
469 
470 #ifdef DEBUG
471 
472  printf("DEBUG writeSPIDER: Date and time: %s %s\n", header->cdat, header->ctim);
473  printf("DEBUG writeSPIDER: Text label: %s\n", header->ctit);
474  printf("DEBUG writeSPIDER: Header size: %g\n", header->labbyt);
475  printf("DEBUG writeSPIDER: Header records and record length: %g %g\n", header->labrec, header->lenbyt);
476  printf("DEBUG writeSPIDER: Data size: %ld\n", datasize);
477  printf("DEBUG writeSPIDER: Data offset: %ld\n", offset);
478  printf("DEBUG writeSPIDER: File %s\n", filename.c_str());
479 #endif
480 
481 
482  // Only write mainheader when new file or number of images in stack changed
483  bool writeMainHeaderReplace = false;
484  header->maxim = replaceNsize;
485  size_t imgStart = (mode == WRITE_APPEND)? replaceNsize : IMG_INDEX(select_img);
486  size_t newNsize = imgStart + Ndim;
487 
488  if (Ndim > 1 || mode == WRITE_APPEND || isStack)
489  {
490  header->istack = 2;
491  header->inuse = 1;
492 
493  if( mode == WRITE_APPEND )
494  {
495  writeMainHeaderReplace = true;
496  header->maxim += Ndim;
497  }
498  else if(newNsize > replaceNsize)
499  {
500  writeMainHeaderReplace = true;
501  header->maxim = newNsize;
502  }
503  }
504  else
505  {
506  header->istack = 0;
507  header->inuse = 0;
508  header->maxim = 1;
509  writeMainHeaderReplace=true;
510  }
511 
512  //locking the file
513  FileLock flock;
514  flock.lock(fimg);
515 
516  // Write main header
517  if( mode == WRITE_OVERWRITE ||
518  mode == WRITE_APPEND ||
519  writeMainHeaderReplace ||
520  newNsize > replaceNsize) //header must change
521  {
522  if ( swapWrite )
523  swapPage((char *) header, SPIDERSIZE - 180, DT_Float);
524  fwrite( header, offset, 1, fimg );
525  }
526 
527  // write single image if not stack
528  if ( Ndim == 1 && !isStack)
529  {
530  if (dataMode >= DATA) // Image is not written if only is modifying the header
531  {
532  if (mmapOnWrite)
533  {
534  mappedOffset = ftell(fimg);
535  mappedSize = mappedOffset + datasize;
536  fseek(fimg, datasize-1, SEEK_CUR);
537  fputc(0, fimg);
538  }
539  else
540  writeData(fimg, 0, wDType, datasize_n, CW_CAST);
541  }
542  }
543  else // Jump to the selected imgStart position
544  {
545  fseek( fimg,offset + (offset+datasize)*imgStart, SEEK_SET);
546 
547  //for ( size_t i=0; i<Ndim; i++ )
548  auto it = MD.begin();
549 
550  for (size_t i = 0; i < Ndim; ++it, ++i)
551  {
552  // Write the individual image header
553  if ( it != MD.end() && (dataMode == _HEADER_ALL || dataMode == _DATA_ALL))
554  {
564  }
565  else
566  {
567  header->xoff = header->yoff = header->zoff =\
568  header->phi = header->theta = header->gamma = header->weight = 0.;
569  header->scale = 1.;
570  }
571  //do not need to unlock because we are in the overwrite case
572  if ( swapWrite )
573  swapPage((char *) header, SPIDERSIZE - 180, DT_Float);
574  fwrite( header, offset, 1, fimg );
575  if (dataMode >= DATA)
576  {
577  if (mmapOnWrite && Ndim == 1) // Can map one image at a time only
578  {
579  mappedOffset = ftell(fimg);
580  mappedSize = mappedOffset + datasize;
581  fseek(fimg, datasize-1, SEEK_CUR);
582  fputc(0, fimg);
583  }
584  else
585  writeData(fimg, i*datasize_n, wDType, datasize_n, CW_CAST);
586  }
587  else
588  fseek(fimg, datasize, SEEK_CUR);
589  }
590  }
591  //I guess I do not need to unlock since we are going to close the file
592  flock.unlock();
593 
594  if (mmapOnWrite)
595  mmapFile();
596 
597  freeMemory(header, (int)labbyt*sizeof(char));
598 
599  return(0);
600 }
Index out of bounds.
Definition: xmipp_error.h:132
float maxim
Definition: rwSPIDER.cpp:76
float phi2
Definition: rwSPIDER.cpp:83
float imami
Definition: rwSPIDER.cpp:56
tsne coefficients in 2D
Rotation angle of an image (double,degrees)
void min(Image< double > &op1, const Image< double > &op2)
#define SET_HEADER_VALUE(field, label, aux)
float Astart
Definition: rwSPIDER.cpp:95
#define SWAPTRIG
sampling rate in A/pixel (double)
float lenbyt
Definition: rwSPIDER.cpp:73
float yoff
Definition: rwSPIDER.cpp:69
sampling rate in A/pixel (double)
__host__ __device__ float2 floor(const float2 v)
sampling rate in A/pixel (double)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
float labrec
Definition: rwSPIDER.cpp:63
double fGeo_matrix[3][3]
Definition: rwSPIDER.cpp:87
float psi1
Definition: rwSPIDER.cpp:82
float xoff
Definition: rwSPIDER.cpp:68
float labbyt
Definition: rwSPIDER.cpp:72
float ihist
Definition: rwSPIDER.cpp:61
float fAngle1
Definition: rwSPIDER.cpp:88
Maximum value (double)
int readSPIDER(size_t select_img)
Tilting angle of an image (double,degrees)
Shift for the image in the X axis (double)
int readSPIDER(size_t select_img)
Definition: rwSPIDER.cpp:292
float scale
Definition: rwSPIDER.cpp:71
Special label to be used when gathering MDs in MpiMetadataPrograms.
float iangle
Definition: rwSPIDER.cpp:64
float psi2
Definition: rwSPIDER.cpp:85
float fmin
Definition: rwSPIDER.cpp:58
if read from file original image datatype, this is an struct defined in image
float RTflag
Definition: rwSPIDER.cpp:94
void unlock()
Unlock.
Input/Output general error.
Definition: xmipp_error.h:134
char ctim[8]
Definition: rwSPIDER.cpp:110
float Tinc
Definition: rwSPIDER.cpp:101
char fNada2[576]
Definition: rwSPIDER.cpp:107
float fr1
Definition: rwSPIDER.cpp:90
float istack
Definition: rwSPIDER.cpp:74
#define i
float nslice
Definition: rwSPIDER.cpp:51
float Tstart
Definition: rwSPIDER.cpp:99
Minimum value (double)
float nhistrec
Definition: rwSPIDER.cpp:54
float phi
Definition: rwSPIDER.cpp:65
It is not a file.
Definition: xmipp_error.h:141
float phi1
Definition: rwSPIDER.cpp:80
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
int freeMemory(void *ptr, size_t memsize)
float weight
Definition: rwSPIDER.cpp:104
const size_t tiff_map_min_size
float imgnum
Definition: rwSPIDER.cpp:77
Flip the image? (bool)
float nrow
Definition: rwSPIDER.cpp:52
float zoff
Definition: rwSPIDER.cpp:70
float iform
Definition: rwSPIDER.cpp:55
char * askMemory(size_t memsize)
Couldn&#39;t read from file.
Definition: xmipp_error.h:139
static MDRowVec emptyHeaderVec()
DataType
float fmax
Definition: rwSPIDER.cpp:57
scaling factor for an image or volume (double)
float flip
Definition: rwSPIDER.cpp:105
float kangle
Definition: rwSPIDER.cpp:79
void mode
int writeSPIDER(size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE)
Definition: rwSPIDER.cpp:320
#define SET_MAIN_HEADER_VALUE(field, label, aux)
float sig
Definition: rwSPIDER.cpp:60
float theta2
Definition: rwSPIDER.cpp:84
#define SPIDERSIZE
Definition: rwSPIDER.cpp:42
float av
Definition: rwSPIDER.cpp:59
float fr2
Definition: rwSPIDER.cpp:91
float Tend
Definition: rwSPIDER.cpp:100
void lock(int fileno=0)
Lock file.
float theta
Definition: rwSPIDER.cpp:66
float Rsigma
Definition: rwSPIDER.cpp:98
char ctit[160]
Definition: rwSPIDER.cpp:111
#define ALL_IMAGES
float Aend
Definition: rwSPIDER.cpp:96
String formatString(const char *format,...)
float inuse
Definition: rwSPIDER.cpp:75
float nsam
Definition: rwSPIDER.cpp:62
Shift for the image in the Z axis (double)
char cdat[12]
Definition: rwSPIDER.cpp:109
float theta1
Definition: rwSPIDER.cpp:81
#define IMG_INDEX(select_img)
average value (double)
float unused[2]
Definition: rwSPIDER.cpp:78
Shift for the image in the Y axis (double)
float irec
Definition: rwSPIDER.cpp:53
int * n
float gamma
Definition: rwSPIDER.cpp:67
float Ainc
Definition: rwSPIDER.cpp:97
< Score 4 for volumes
size_t gettypesize(DataType type)
Returns memory size of datatype.