Xmipp  v3.23.11-Nereus
Functions
Collaboration diagram for INF File format:

Functions

int readINF (size_t img_select, bool isStack=false)
 
int writeINF (size_t img_select, bool isStack=false, int mode=WRITE_OVERWRITE, String bitDepth="", CastWriteMode castMode=CW_CAST)
 
int ImageBase::readINF (size_t img_select, bool isStack=false)
 
int ImageBase::writeINF (size_t img_select, bool isStack=false, int mode=WRITE_OVERWRITE, String bitDepth="", CastWriteMode castMode=CW_CAST)
 

Detailed Description

Function Documentation

◆ readINF() [1/2]

int readINF ( size_t  img_select,
bool  isStack = false 
)

INF Reader

◆ readINF() [2/2]

int ImageBase::readINF ( size_t  select_img,
bool  isStack = false 
)
protected

INF Reader

Definition at line 39 of file rwINF.cpp.

40 {
41 #undef DEBUG
42  //#define DEBUG
43 #ifdef DEBUG
44  printf("DEBUG readINF: Reading INF file\n");
45 #endif
46 
47  int _xDim,_yDim,_zDim, __depth;
48  size_t _nDim;
49  bool __is_signed;
50 
51  _xDim = textToInteger(getParameter(fhed, "Xdim"));
52  _yDim = textToInteger(getParameter(fhed, "Ydim"));
53  __depth = textToInteger(getParameter(fhed, "bitspersample"));
54  if (checkParameter(fhed, "offset"))
55  offset = textToInteger(getParameter(fhed, "offset"));
56  else
57  offset = 0;
58  if (checkParameter(fhed, "is_signed"))
59  __is_signed = (getParameter(fhed, "is_signed") == "true" ||
60  getParameter(fhed, "is_signed") == "TRUE");
61  else
62  __is_signed = false;
63  if (checkParameter(fhed, "endianess") &&
64  (getParameter(fhed, "endianess") == "big" || getParameter(fhed, "endianess") == "BIG"))
65  swap = true;
66  else
67  swap = false;
68 
69  if (IsBigEndian())
70  swap = !swap;
71 
72  _zDim = 1;
73  _nDim = 1;
74 
76  switch ( __depth )
77  {
78  case 8:
79  if (__is_signed)
80  datatype = DT_SChar;
81  else
82  datatype = DT_UChar;
83  break;
84  case 16:
85  if (__is_signed)
86  datatype = DT_Short;
87  else
88  datatype = DT_UShort;
89  break;
90  case 32:
91  datatype = DT_Float;
92  break;
93  default:
94  REPORT_ERROR(ERR_TYPE_INCORRECT, "rwINF::read: depth is not 8, 16 nor 32");
95  }
96 
99  MDMainHeader.setValue(MDL_DATATYPE,(int)datatype);
100 
101  // Map the parameters
102  setDimensions(_xDim, _yDim, _zDim, _nDim);
103 
104  size_t imgStart = IMG_INDEX(select_img);
105  size_t imgEnd = (select_img != ALL_IMAGES) ? imgStart + 1 : _nDim;
106 
107  if (dataMode == HEADER || (dataMode == _HEADER_ALL && _nDim > 1)) // Stop reading if not necessary
108  return 0;
109 
110  MD.clear();
111  for (size_t i = 0; i < imgEnd-imgStart; i++)
112  MD.push_back(std::unique_ptr<MDRowVec>(new MDRowVec(MDL::emptyHeaderVec())));
113 
114  //#define DEBUG
115 #ifdef DEBUG
116 
117  MDMainHeader.write(std::cerr);
118  MD.write(std::cerr);
119 #endif
120 
121  if( dataMode < DATA )
122  return 0;
123 
124  size_t pad = 0;
125  readData(fimg, select_img, datatype, pad);
126  return(0);
127 }
bool checkParameter(int argc, const char **argv, const char *param)
Definition: args.cpp:97
sampling rate in A/pixel (double)
sampling rate in A/pixel (double)
DataMode dataMode
bool IsBigEndian(void)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
virtual void readData(FILE *fimg, size_t select_img, DataType datatype, size_t pad)=0
void setValue(const MDObject &object) override
std::vector< std::unique_ptr< MDRow > > MD
if read from file original image datatype, this is an struct defined in image
#define i
const char * getParameter(int argc, const char **argv, const char *param, const char *option)
Definition: args.cpp:30
virtual void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)=0
static MDRowVec emptyHeaderVec()
DataType
MDRowVec MDMainHeader
DataType datatype() const
#define ALL_IMAGES
int textToInteger(const char *str)
#define IMG_INDEX(select_img)
Incorrect type received.
Definition: xmipp_error.h:190

◆ writeINF() [1/2]

int writeINF ( size_t  img_select,
bool  isStack = false,
int  mode = WRITE_OVERWRITE,
String  bitDepth = "",
CastWriteMode  castMode = CW_CAST 
)

INF Writer

◆ writeINF() [2/2]

int ImageBase::writeINF ( size_t  select_img,
bool  isStack = false,
int  mode = WRITE_OVERWRITE,
String  bitDepth = "",
CastWriteMode  castMode = CW_CAST 
)
protected

INF Writer

Definition at line 132 of file rwINF.cpp.

133 {
134  //#define DEBUG
135 #ifdef DEBUG
136  printf("DEBUG writeINF: Writing INF file\n");
137  printf("DEBUG writeINF: File %s\n", filename.c_str());
138 #endif
139 #undef DEBUG
140 
141  size_t Xdim, Ydim, Zdim, Ndim;
142  getDimensions(Xdim, Ydim, Zdim, Ndim);
143 
144  int _depth;
145  bool _is_signed = false;
146 
147  // Volumes and stacks are not supported
148  if (Zdim > 1 || Ndim > 1)
149  REPORT_ERROR(ERR_INDEX_OUTOFBOUNDS, "rwINF::write does not support neither volumes nor stacks.");
150 
151  if (mode == WRITE_APPEND)
152  REPORT_ERROR(ERR_ARG_INCORRECT, "rwINF::write only can overwrite or replace image files,"
153  "not append.");
154 
155  DataType wDType,myTypeID = myT();
156 
157  if (bitDepth != "")
158  {
159  myTypeID = (bitDepth == "default") ? DT_Float : datatypeRAW(bitDepth);
160  }
161 
162  switch(myTypeID)
163  {
164  case DT_Double:
165  case DT_UInt:
166  case DT_Int:
167  if (bitDepth != "")
168  REPORT_ERROR(ERR_TYPE_INCORRECT,"ERROR: incorrect RAW bits depth value.");
169  case DT_Float:
170  wDType = DT_Float;
171  break;
172  case DT_UShort:
173  wDType = DT_UShort;
174  _is_signed = false;
175  break;
176  case DT_Short:
177  wDType = DT_Short;
178  _is_signed = true;
179  break;
180  case DT_UChar:
181  wDType = DT_UChar;
182  _is_signed = false;
183  break;
184  case DT_SChar:
185  wDType = DT_SChar;
186  _is_signed = true;
187  break;
188  default:
189  wDType = DT_Unknown;
190  (void)wDType; // to suppress dead assignment warning
191  REPORT_ERROR(ERR_TYPE_INCORRECT,(std::string)"ERROR: Unsupported data type by RAW format.");
192  }
193 
194  if (mmapOnWrite)
195  {
196  MDMainHeader.setValue(MDL_DATATYPE,(int) wDType);
197  if (!checkMmapT(wDType))
198  {
199  if (dataMode < DATA && castMode == CW_CAST) // This means ImageGeneric wants to know which DataType must use in mapFile2Write
200  return 0;
201  else //Mapping is an extra. When not available, go on and do not report an error.
202  {
203  /* In this case we cannot map the file because required and feasible datatypes are
204  * not compatible. Then we denote to MapFile2Write the same incoming datatype to
205  * keep using this Image object as usual, without mapping on write.
206  */
207  mmapOnWrite = false;
208  dataMode = DATA;
209  MDMainHeader.setValue(MDL_DATATYPE,(int) myTypeID);
210 
211  // In case Image size great then, at least, map the multidimarray
212  if (mdaBase->nzyxdim*gettypesize(myTypeID) > tiff_map_min_size)
213  mdaBase->setMmap(true);
214 
215  // Allocate memory for image data (Assume xdim, ydim, zdim and ndim are already set
216  //if memory already allocated use it (no resize allowed)
218 
219  return 0;
220  }
221  }
222  else
223  dataMode = DATA;
224  }
225 
226  _depth = gettypesize(wDType);
227 
228  //locking
229 
230  // Lock Header file
231  FileLock flock;
232  flock.lock(fhed);
233 
234  /* Write INF file ==================================*/
235  fprintf(fhed,"# Bits per sample\n");
236  fprintf(fhed,"bitspersample= %d\n",_depth*8);
237  fprintf(fhed,"# Samples per pixel\n");
238  fprintf(fhed,"samplesperpixel= 1\n");
239  fprintf(fhed,"# Image width\n");
240  fprintf(fhed,"Xdim= %d\n", (int)Xdim);
241  fprintf(fhed,"# Image length\n");
242  fprintf(fhed,"Ydim= %d\n",(int)Ydim);
243  fprintf(fhed,"# offset in bytes (zero by default)\n");
244  fprintf(fhed,"offset= 0\n");
245  fprintf(fhed,"# Is a signed or Unsigned int (by default true)\n");
246  if (_is_signed)
247  fprintf(fhed,"is_signed= true\n");
248  else
249  fprintf(fhed,"is_signed= false\n");
250  fprintf(fhed,"# Byte order\n");
251  if ( swapWrite^IsBigEndian() )
252  fprintf(fhed,"endianess= big\n");
253  else
254  fprintf(fhed,"endianess= little\n");
255 
256  //Unlock Header file
257  flock.unlock();
258 
259  /* Write Image file ==================================*/
260  size_t datasize_n, datasize;
261  datasize_n = Xdim*Ydim*Zdim;
262  datasize = datasize_n * gettypesize(wDType);
263 
264  // Lock Image file
265  flock.lock(fimg);
266 
267  if (mmapOnWrite)
268  {
269  mappedOffset = 0;
270  mappedSize = mappedOffset + datasize;
271  fseek(fimg, datasize-1, SEEK_SET);
272  fputc(0, fimg);
273  mmapFile();
274  }
275  else
276  writeData(fimg, 0, wDType, datasize_n, castMode);
277 
278  // Unlock Image file
279  flock.unlock();
280 
281  return(0);
282 }
Index out of bounds.
Definition: xmipp_error.h:132
DataMode dataMode
bool IsBigEndian(void)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
size_t mappedOffset
virtual void coreAllocateReuse()=0
void setValue(const MDObject &object) override
ArrayDim getDimensions()
if read from file original image datatype, this is an struct defined in image
void unlock()
Unlock.
const size_t tiff_map_min_size
Incorrect argument received.
Definition: xmipp_error.h:113
void setMmap(bool mmap)
virtual bool checkMmapT(DataType datatype)=0
virtual void mmapFile()=0
DataType
void mode
MDRowVec MDMainHeader
size_t mappedSize
void lock(int fileno=0)
Lock file.
virtual void writeData(FILE *fimg, size_t offset, DataType wDType, size_t datasize_n, CastWriteMode castMode=CW_CAST)=0
fprintf(glob_prnt.io, "\)
FileName filename
virtual DataType myT() const =0
Incorrect type received.
Definition: xmipp_error.h:190
MultidimArrayBase * mdaBase
DataType datatypeRAW(String strDT)
Definition: rwRAW.cpp:31
size_t gettypesize(DataType type)
Returns memory size of datatype.