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

Classes

struct  DM4head
 
struct  DM4dataHead
 

Functions

DataType datatypeDM4 (int nType)
 
void FREADTagValueDM4 (double *fieldValue, int numberType, int n, FILE *fimg, bool swap)
 
double readTagDM4 (FILE *fimg, DM4head *header, int parentId, int &nodeId, bool isLE, bool swap)
 
int parentDM4 (MetaData &MD, int nodeId, int depth=1)
 
size_t gotoTagDM4 (MetaData &MD, int &nodeId, const std::string &tagsList)
 
void printDM4node (const MetaData &MD, size_t id)
 
void printDM4 (const MetaData &MD)
 
int readDM4 (size_t img_select, bool isStack=false)
 
int writeDM4 (size_t img_select, bool isStack=false, int mode=WRITE_OVERWRITE)
 
int ImageBase::readDM4 (size_t img_select, bool isStack=false)
 
int ImageBase::writeDM4 (size_t img_select, bool isStack=false, int mode=WRITE_OVERWRITE)
 

Detailed Description

Function Documentation

◆ datatypeDM4()

DataType datatypeDM4 ( int  nType)

DM4 Determine DM4 datatype

Definition at line 71 of file rwDM4.cpp.

72 {
73  DataType datatype;
74 
75  switch(nType)
76  {
77  case 2: // (02h = 2 i2* signed (short)
78  datatype = DT_Short;
79  break;
80  case 3: // 03h = 3 i4* signed (long)
81  datatype = DT_Int;
82  break;
83  case 4: // 04h = 4 i2* unsigned (ushort) or unicode string
84  datatype = DT_UShort;
85  break;
86  case 5: // 05h = 5 i4* unsigned (ulong)
87  datatype = DT_UInt;
88  break;
89  case 6: // 06h = 6 f4* (float)
90  datatype = DT_Float;
91  break;
92  case 7: // 07h = 7 f8* (double)
93  datatype = DT_Double;
94  break;
95  case 8: // 08h = 8 i1 (boolean)
96  datatype = DT_Bool;
97  break;
98  case 9: // 0ah = 10 i1
99  datatype = DT_SChar;
100  break;
101  case 10: // 0ah = 10 i1
102  datatype = DT_SChar;
103  break;
104  case 11: // 0ah = 10 i1
105  datatype = DT_ULong;
106  break;
107  case 12: // 0ah = 10 i1
108  datatype = DT_Long;
109  break;
110  default:
111  datatype = DT_Unknown;
112  break;
113  }
114  return datatype;
115 }
DataType

◆ FREADTagValueDM4()

void FREADTagValueDM4 ( double *  fieldValue,
int  numberType,
int  n,
FILE *  fimg,
bool  swap 
)

DM4 Low level reader

Definition at line 120 of file rwDM4.cpp.

121 {
122  DataType datatype = datatypeDM4(numberType);
123  size_t datatypesize=gettypesize(datatype);
124 
125  xmippFREAD(fieldValue, datatypesize, n, fimg, swap);
126 
127  switch(numberType)
128  {
129  case 2: // (02h = 2 i2* signed (short)
130  {
131  short* sValue = (short*) fieldValue;
132  *fieldValue = (double) *sValue;
133  break;
134  }
135  case 3: // 03h = 3 i4* signed (long)
136  {
137  int* iValue = (int*) fieldValue;
138  *fieldValue = (double) *iValue;
139  break;
140  }
141  case 4: // 04h = 4 i2* unsigned (ushort) or unicode string
142  {
143  unsigned short* usValue = (unsigned short*) fieldValue;
144  *fieldValue = (double) *usValue;
145  break;
146  }
147  case 5: // 05h = 5 i4* unsigned (ulong)
148  {
149  unsigned int* uiValue = (unsigned int*) fieldValue;
150  *fieldValue = (double) *uiValue;
151  break;
152  }
153  case 6: // 06h = 6 f4* (float)
154  {
155  float* fValue = (float*) fieldValue;
156  *fieldValue = (double) *fValue;
157  break;
158  }
159  case 7: // 07h = 7 f8* (double)
160  {
161  // double* caca = (double*) fieldValue;
162  break;
163  }
164  case 8: // 08h = 8 i1 (boolean)
165  {
166  bool* bValue = (bool*) fieldValue;
167  *fieldValue = (double) *bValue;
168  break;
169  }
170  case 9: // 0ah = 10 i1
171  case 10: // 0ah = 10 i1
172  {
173  char* cValue = (char*) fieldValue;
174  *fieldValue = (double) *cValue;
175  break;
176  }
177  case 11: // 0ah = 10 i1
178  {
179  unsigned long* cValue = (unsigned long*) fieldValue;
180  *fieldValue = (double) *cValue;
181  break;
182  }
183  case 12: // 0ah = 10 i1
184  {
185  long* cValue = (long*) fieldValue;
186  *fieldValue = (double) *cValue;
187  break;
188  }
189  default:
190  {
191  break;
192  }
193  }
194 }
DataType
size_t xmippFREAD(void *dest, size_t size, size_t nitems, FILE *&fp, bool reverse)
DataType datatypeDM4(int nType)
Definition: rwDM4.cpp:71
int * n
size_t gettypesize(DataType type)
Returns memory size of datatype.

◆ gotoTagDM4()

size_t gotoTagDM4 ( MetaData MD,
int &  nodeId,
const std::string &  tagsList 
)

DM4 Go to tag

Definition at line 393 of file rwDM4.cpp.

394 {
395  std::string tag;
396  std::vector<std::string> vTags;
397  splitString(tagsList,",",vTags, false);
398  size_t id=0;
399 
400  MDValueEQ queryParentId(MDL_DM3_PARENTID,-1), queryTagname(MDL_DM3_TAGNAME,tag);
401  MDMultiQuery queries;
402 
403  queries.addAndQuery(queryParentId);
404  queries.addAndQuery(queryTagname);
405 
406  for (size_t n = 0; n < vTags.size(); n++)
407  {
408  tag = vTags[n];
409 
410  queryParentId.setValue(nodeId);
411  queryTagname.setValue(tag);
412  id = MD.firstObject(queries);
413  if (id != BAD_OBJID)
414  {
415  MD.getValue(MDL_DM3_NODEID, nodeId, id);
416  }
417  }
418  return id;
419 }
void addAndQuery(MDQuery &query)
virtual size_t firstObject(const MDQuery &) const =0
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
int splitString(const String &input, const String &delimiter, StringVector &results, bool includeEmpties)
int * n
#define BAD_OBJID
Definition: metadata_base.h:55

◆ parentDM4()

int parentDM4 ( MetaData MD,
int  nodeId,
int  depth = 1 
)

DM4 Get DM4 parent

Definition at line 378 of file rwDM4.cpp.

379 {
380  for (int n = 0; n < depth; n++)
381  {
383 
384  if (nodeId == 0)
385  break;
386  }
387  return nodeId;
388 }
virtual size_t firstObject(const MDQuery &) const =0
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
int * n

◆ printDM4()

void printDM4 ( const MetaData MD)

DM4 Print DM4 header

Definition at line 453 of file rwDM4.cpp.

454 {
455  std::vector<size_t> vObjs;
456  spaceDM4 = 0;
457  MD.findObjects(vObjs,MDValueEQ(MDL_DM3_PARENTID, 0));
458 
459  for (size_t i = 0; i < vObjs.size(); i++)
460  printDM4node(MD, vObjs[i]);
461 }
#define i
int spaceDM4
Definition: rwDM4.cpp:421
virtual void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const =0
void printDM4node(const MetaData &MD, size_t id)
Definition: rwDM4.cpp:425

◆ printDM4node()

void printDM4node ( const MetaData MD,
size_t  id 
)

DM4 Print DM4 node

Definition at line 425 of file rwDM4.cpp.

426 {
427  std::string tag;
428  MD.getValue(MDL_DM3_TAGNAME, tag, id);
429 
430  int nodeId;
431  MD.getValue(MDL_DM3_NODEID, nodeId, id);
432 
433  for (int i = 0; i < spaceDM4; i++)
434  std::cout << " ";
435 
436  std::cout << tag << std::endl;
437 
438  std::vector<size_t> vObjs;
439  MD.findObjects(vObjs, MDValueEQ(MDL_DM3_PARENTID, nodeId));
440 
441  spaceDM4 += 3;
442 
443  for (size_t i = 0; i < vObjs.size(); i++)
444  printDM4node(MD, vObjs[i]);
445 
446  spaceDM4 -= 3;
447 
448 }
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
#define i
int spaceDM4
Definition: rwDM4.cpp:421
virtual void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const =0
void printDM4node(const MetaData &MD, size_t id)
Definition: rwDM4.cpp:425

◆ readDM4() [1/2]

int readDM4 ( size_t  img_select,
bool  isStack = false 
)

DM4 Reader

◆ readDM4() [2/2]

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

DM4 Reader

Definition at line 466 of file rwDM4.cpp.

467 {
468 #undef DEBUG
469  //#define DEBUG
470 #ifdef DEBUG
471  printf("DEBUG readDM4: Reading DM4 file\n");
472 #endif
473 
474  DM4head * header = new DM4head;
475  int dummy;
476 
477  // Check Machine endianness
478  bool isLE = IsLittleEndian();
479 
480  xmippFREAD(&header->fileVersion, sizeof(int), 1, fimg, isLE);
481  xmippFREAD(&dummy, sizeof(long), 1, fimg, isLE);
482  xmippFREAD(&header->byteOrder, sizeof(int), 1, fimg, isLE);
483 
484  // Set Endianess
485  swap = (isLE^header->byteOrder);
486 
487  if ( header->fileVersion!=4 )
488  REPORT_ERROR(ERR_IO_NOREAD, "readDM4: Input file is not Digital Micrograph 3 format.");
489 
490  xmippFREAD(&header->sorted, sizeof(char), 1, fimg, false);
491  xmippFREAD(&header->open, sizeof(char), 1, fimg, false);
492  xmippFREAD(&header->nTags, sizeof(long), 1, fimg, isLE);
493 
494  header->tags.addLabel(MDL_DM3_NODEID);
495  header->tags.addLabel(MDL_DM3_PARENTID);
496  header->tags.addLabel(MDL_DM3_IDTAG);
497  header->tags.addLabel(MDL_DM3_TAGNAME);
498  header->tags.addLabel(MDL_DM3_TAGCLASS);
499  header->tags.addLabel(MDL_DM3_SIZE);
501  header->tags.addLabel(MDL_DM3_VALUE);
502 
503  int nodeID = 0, parentID = 0;
504 
505  for (int n=1;n<=header->nTags;n++)
506  readTagDM4(fimg, header, parentID, nodeID, isLE, swap);
507 
508 //#define DEBUG
509 #ifdef DEBUG
510 
511  header->tags.write("images.txt");
512  printDM4(header->tags);
513 #endif
514 
515 
516  //std::vector<size_t> vIm;
517  //header->tags.findObjects(vIm, );
518 
519  header->nIm = 0;
520  std::vector<DM4dataHead> dataHeaders;
521  DM4dataHead dhRef;
522 
523  std::vector<double> vValue;
524  int iValue;
525 
526  //Initialize query for later use
527  MDValueEQ queryNodeId(MDL_DM3_NODEID, -1);
528 
529  std::vector<size_t> objIdsDataType;
530  header->tags.findObjects(objIdsDataType, MDValueEQ(MDL_DM3_TAGNAME,(String)"DataType"));
531 
532  for (size_t objId : objIdsDataType)
533  // Read all the image headers
534  //for (int n = 0; n < vIm.size(); n++)
535  {
536  //header->tags.goToObject(vIm[n]);
537  header->tags.getValue(MDL_DM3_VALUE, vValue, objId);
538 
539  if (vValue[0] != 23) //avoid thumb images
540  {
541  dataHeaders.push_back(dhRef);
542 
543  parentID = parentDM4(header->tags, objId, 2);
544 
545  size_t id;
546  nodeID = parentID;
547  id = gotoTagDM4(header->tags, nodeID, "ImageData,Data");
548  header->tags.getValue(MDL_DM3_NUMBER_TYPE, iValue, id);
549  dataHeaders[header->nIm].dataType = (short int) iValue;
550 
551  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
552  dataHeaders[header->nIm].headerSize = (size_t) vValue[0];
553 
554  nodeID = parentID;
555  id = gotoTagDM4(header->tags, nodeID, "ImageData,Dimensions");
556 
557  int nDims;
558  header->tags.getValue(MDL_DM3_SIZE, nDims, id);
559 
560  nodeID++;
561  queryNodeId.setValue(nodeID);
562  id = header->tags.firstObject(queryNodeId);
563  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
564  dataHeaders[header->nIm].imageWidth = (int) vValue[0];
565 
566  nodeID++;
567  queryNodeId.setValue(nodeID);
568  id = header->tags.firstObject(queryNodeId);
569  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
570  dataHeaders[header->nIm].imageHeight = (int) vValue[0];
571 
572  if (nDims ==3 )
573  {
574  nodeID++;
575  queryNodeId.setValue(nodeID);
576  id = header->tags.firstObject(queryNodeId);
577  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
578  dataHeaders[header->nIm].imageDepth = (int) vValue[0];
579  } else
580  dataHeaders[header->nIm].imageDepth = 1;
581 
582  nodeID++;
583  queryNodeId.setValue(nodeID);
584  id = header->tags.firstObject(queryNodeId);
585  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
586  dataHeaders[header->nIm].dataTypeSize = (short int) vValue[0];
587 
588  nodeID = parentID;
589  id = gotoTagDM4(header->tags, nodeID, "ImageTags,Acquisition,Frame,CCD,Pixel Size (um)");
590  // header->tags.nextObject();
591  if (id != BAD_OBJID)
592  {
593  header->tags.getValue(MDL_DM3_VALUE, vValue, id);
594  dataHeaders[header->nIm].pixelHeight = vValue[0]*1e4;
595  dataHeaders[header->nIm].pixelWidth = vValue[1]*1e4;
596  }
597 
598  //TODO: Do I have to include FLIP?!?!? which? vertical or horizontal?
599  header->nIm++;
600  }
601 
602  }
603 
604  if (dataHeaders.size() == 0)
605  REPORT_ERROR(ERR_IMG_NOREAD,formatString("readDM4: Image information not found in file %s",filename.c_str()));
606 
607  int _xDim,_yDim, _zDim;
608  size_t _nDim;
609  _xDim = dataHeaders[0].imageWidth;
610  _yDim = dataHeaders[0].imageHeight;
611  _zDim = 1;
612  _nDim = dataHeaders[0].imageDepth;
613  //_nDim = header->nIm;
614 
615  // Map the parameters
616  if (select_img > _nDim)
617  REPORT_ERROR(ERR_INDEX_OUTOFBOUNDS, formatString("readDM4: Image number %lu exceeds stack size %lu", select_img, _nDim));
618  else if (select_img == ALL_IMAGES)
619  {
620 // // Check images dimensions. Need to be the same
621 // for (size_t i = 1; i < _nDim ; i++)
622 // {
623 // if (dataHeaders[0].imageHeight != dataHeaders[i].imageHeight || \
624 // dataHeaders[0].imageWidth != dataHeaders[i].imageWidth || \
625 // dataHeaders[0].dataType != dataHeaders[i].dataType)
626 // REPORT_ERROR(ERR_IMG_NOREAD, "readDM4: images in DM4 file with different \
627 // dimensions and data types are not currently supported. Try to read them individually.");
628 // }
629 // //FIXME: Code is not totally implemented to load automatically multiple images if they have same size.
630 // //if (_nDim > 1)
631 // // REPORT_ERROR(ERR_IO_NOREAD, "readDM4: Reading multiple \
632 // images at once in DM4 file are not currently supported. Try to read them individually.");
633  }
634  else
635  _nDim = 1;
636 
637  setDimensions(_xDim, _yDim, _zDim, _nDim);
638 
639  size_t imgStart = IMG_INDEX(select_img);
640  size_t imgEnd = (select_img != ALL_IMAGES) ? imgStart + 1 : _nDim;
641 
642  DataType datatype = datatypeDM4(dataHeaders[0].dataType);
643 
644  MDMainHeader.setValue(MDL_SAMPLINGRATE_X,(double)dataHeaders[0].pixelWidth);
645  MDMainHeader.setValue(MDL_SAMPLINGRATE_Y,(double)dataHeaders[0].pixelHeight);
646  MDMainHeader.setValue(MDL_DATATYPE,(int)datatype);
647 
648  if (dataMode == HEADER) // Stop reading if not necessary
649  {
650  delete header;
651  return 0;
652  }
653 
654  MD.clear();
655  for (size_t i = 0; i < imgEnd-imgStart; i++)
656  MD.push_back(std::unique_ptr<MDRowVec>(new MDRowVec(MDL::emptyHeaderVec())));
657  offset = dataHeaders[0].headerSize;
658  delete header;
659 
660  if( dataMode < DATA )
661  return 0;
662 
663 #undef DEBUG
664 #ifdef DEBUG
665 
666  MDMainHeader.write(std::cerr);
667  MD.write(std::cerr);
668 #endif
669 
670  size_t pad = 0;
671  readData(fimg, select_img, datatype, pad);
672 
673  return(0);
674 }
Index out of bounds.
Definition: xmipp_error.h:132
sampling rate in A/pixel (double)
sampling rate in A/pixel (double)
DataMode dataMode
bool IsLittleEndian(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
size_t firstObject(const MDQuery &) const override
if read from file original image datatype, this is an struct defined in image
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
Cannot read image from file.
Definition: xmipp_error.h:128
int fileVersion
Definition: rwDM4.cpp:38
#define i
int parentDM4(MetaData &MD, int nodeId, int depth=1)
Definition: rwDM4.cpp:378
char open
Definition: rwDM4.cpp:42
int nIm
Definition: rwDM4.cpp:45
void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const override
virtual void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)=0
Couldn&#39;t read from file.
Definition: xmipp_error.h:139
static MDRowVec emptyHeaderVec()
DataType
double dummy
char sorted
Definition: rwDM4.cpp:41
int nTags
Definition: rwDM4.cpp:43
double readTagDM4(FILE *fimg, DM4head *header, int parentId, int &nodeId, bool isLE, bool swap)
Definition: rwDM4.cpp:199
size_t xmippFREAD(void *dest, size_t size, size_t nitems, FILE *&fp, bool reverse)
bool getValue(MDObject &mdValueOut, size_t id) const override
bool addLabel(const MDLabel label, int pos=-1) override
MDRowVec MDMainHeader
int byteOrder
Definition: rwDM4.cpp:40
void printDM4(const MetaData &MD)
Definition: rwDM4.cpp:453
DataType datatype() const
std::string String
Definition: xmipp_strings.h:34
#define ALL_IMAGES
String formatString(const char *format,...)
#define IMG_INDEX(select_img)
size_t gotoTagDM4(MetaData &MD, int &nodeId, const std::string &tagsList)
Definition: rwDM4.cpp:393
DataType datatypeDM4(int nType)
Definition: rwDM4.cpp:71
FileName filename
int * n
MetaDataVec tags
Definition: rwDM4.cpp:44
#define BAD_OBJID
Definition: metadata_base.h:55

◆ readTagDM4()

double readTagDM4 ( FILE *  fimg,
DM4head header,
int  parentId,
int &  nodeId,
bool  isLE,
bool  swap 
)

DM4 Tag reader

Definition at line 199 of file rwDM4.cpp.

200 {
201  /* Header Tag ============================================================== */
202  unsigned char cdTag;
203  unsigned short int ltName;
204 
205  xmippFREAD(&cdTag,sizeof (unsigned char),1,fimg,false); // Identification tag: 20 = tag dir, 21 = tag
206  xmippFREAD(&ltName,sizeof(unsigned short int), 1,fimg,isLE); // Length of the tag name
207  int idTag = int(cdTag);
208 
209  std::string stagName;
210 
211  if (ltName > 0)
212  {
213  char * tagName = new char[ltName+1];
214  xmippFREAD(tagName,1,ltName,fimg,false); // Tag name
215  tagName[ltName] = '\0';
216  stagName = tagName;
217  delete [] tagName;
218  }
219 
220  /*total bytes in tag/tag directory including all sub-directories
221  * (new for DM4). Actually, we don't use it*/
222  fseek(fimg, 8, SEEK_CUR);
223 
224  size_t id = header->tags.addObject();
225 
226  nodeId++;
227  header->tags.setValue(MDL_DM3_NODEID, nodeId, id);
228  header->tags.setValue(MDL_DM3_PARENTID, parentId, id);
229  header->tags.setValue(MDL_DM3_IDTAG, idTag, id);
230  header->tags.setValue(MDL_DM3_TAGNAME, stagName, id);
231 
232  /* Reading tags ===================================================================*/
233  if (idTag == 20) // Tag directory
234  {
235  unsigned char dummy;
236  int nTags;
237  xmippFREAD(&dummy,sizeof(unsigned char),1,fimg,false); // 1 = sorted (normally = 1)
238  xmippFREAD(&dummy,sizeof(unsigned char),1,fimg,false); // 0 = closed, 1 = open (normally = 0)
239 
240  xmippFREAD(&nTags,sizeof(long),1,fimg,isLE); // number of tags in tag directory
241 
242 
243  header->tags.setValue(MDL_DM3_TAGCLASS,(std::string) "Dir", id);
244  header->tags.setValue(MDL_DM3_SIZE, nTags, id);
245 
246  parentId = nodeId;
247  for (int n=1;n<=nTags;n++) // Rest of directories
248  {
249  readTagDM4(fimg, header, parentId, nodeId, isLE, swap);
250  }
251  return 0;
252  }
253  else if (idTag == 21) // Tag
254  {
255  unsigned int nnum;
256  char buf[4]; // to read %%%% symbols
257 
258  xmippFREAD(&buf,1,4,fimg,false); // To read %%%% symbols
259  xmippFREAD(&nnum,sizeof(long),1,fimg,isLE); // Size of info array
260 
261  size_t * info;
262  info = new size_t[nnum];
263  xmippFREAD(info,sizeof(long),nnum,fimg,isLE); // Reading of Info
264 
265  /* Tag classification =======================================*/
266 
267  if (nnum == 1) // Single entry tag
268  {
269  header->tags.setValue(MDL_DM3_TAGCLASS,(std::string) "Single", id);
270 
271  double tagValue = 0;
272 
273  FREADTagValueDM4(&tagValue,info[0],1,fimg,swap);
274 
275  std::vector<double> vtagValue(1);
276  vtagValue.assign(1,tagValue);
277 
278  header->tags.setValue(MDL_DM3_NUMBER_TYPE, (int) info[0], id);
279  header->tags.setValue(MDL_DM3_VALUE, vtagValue, id);
280  delete []info;
281  return tagValue;
282  }
283  else if(nnum == 3 && info[0]==20) // Tag array
284  {
285  /*nnum = 3
286  info(0) = 20
287  info(1) = number type for all values
288  info(2) = info(nnum) = size of array*/
289 
290  header->tags.setValue(MDL_DM3_TAGCLASS,(std::string) "Array", id);
291 
292  header->tags.setValue(MDL_DM3_NUMBER_TYPE, (int)info[1], id);
293  header->tags.setValue(MDL_DM3_SIZE, (int) info[nnum-1], id);
294  std::vector<double> vtagValue(1);
295  vtagValue.assign(1,(double) ftell(fimg));
296 
297  header->tags.setValue(MDL_DM3_VALUE, vtagValue, id);
298 
299  // Jump the array values
300  int k;
301  if(info[1] == 2 || info[1] == 4)
302  k = 2;
303  else if(info[1] == 3 || info[1] == 5 || info[1] == 6)
304  k = 4;
305  else if(info[1] == 10 )
306  k = 1;
307  else
308  REPORT_ERROR(ERR_ARG_INCORRECT,formatString("unsupported value info[1]=%d, read at %d",info[1],ftell(fimg)));
309 
310  fseek( fimg, ftell(fimg)+(info[nnum-1])*k , SEEK_SET );
311  delete []info;
312  return 0;
313  }
314  else if (info[0]==20 && info[1] == 15) // Tag Group array
315  {
316  /*nnum = size of array
317  info(0) = 20 (array)
318  info(1) = 15 (group)
319  info(2) = 0 (always 0)
320  info(3) = number of values in group
321  info(2*i+3) = number type for value i
322  info(nnum) = size of info array*/
323 
324  header->tags.setValue(MDL_DM3_TAGCLASS, (std::string) "GroupArray", id);
325  header->tags.setValue(MDL_DM3_SIZE, (int)info[3], id);
326  int nBytes=0, k;
327  double fieldValue;
328  for (int n=1;n<=info[3];n++)
329  {
330  fieldValue=0;
331  FREADTagValueDM4(&fieldValue,info[3+2*n],1,fimg,swap);
332 
333  if(info[3+2*n] == 2 || info[3+2*n] == 4)
334  k = 2;
335  else if(info[3+2*n] == 3 || info[3+2*n] == 5)
336  k = 4;
337  else if(info[3+2*n] == 10 )
338  k = 1;
339  nBytes+=k;
340  }
341 
342  // Jump the array values
343  fseek( fimg, ftell(fimg)+(info[nnum-1]-1)*nBytes , SEEK_SET );
344  delete []info;
345  return 0;
346  }
347  else if (info[0] == 15) // Tag Group (struct)
348  {
349  /* info[1] = length group name (always =0)
350  info[2] = number of entries in group */
351  /*nnum = size of info array
352  info(1) = 0fh
353  info(3) = number of values in group
354  info(2*i+3) = number type for value i
355  Other info entries are always zero*/
356 
357  header->tags.setValue(MDL_DM3_TAGCLASS, (std::string) "Group", id);
358  header->tags.setValue(MDL_DM3_SIZE,(int) info[2], id);
359  std::vector<double> vtagValue((int)info[2]);
360  for (int n=1;n<=info[2];n++)
361  {
362  double fieldValue=0;
363  FREADTagValueDM4(&fieldValue,info[2+2*n],1,fimg,swap);
364  vtagValue.assign(n,fieldValue);
365  }
366  header->tags.setValue(MDL_DM3_VALUE, vtagValue, id);
367  delete []info;
368  return 0;
369  }
370  delete []info;
371  }
372  return 0;
373 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
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
bool setValue(const MDObject &mdValueIn, size_t id)
size_t addObject() override
Incorrect argument received.
Definition: xmipp_error.h:113
double dummy
double readTagDM4(FILE *fimg, DM4head *header, int parentId, int &nodeId, bool isLE, bool swap)
Definition: rwDM4.cpp:199
size_t xmippFREAD(void *dest, size_t size, size_t nitems, FILE *&fp, bool reverse)
String formatString(const char *format,...)
void FREADTagValueDM4(double *fieldValue, int numberType, int n, FILE *fimg, bool swap)
Definition: rwDM4.cpp:120
int * n
MetaDataVec tags
Definition: rwDM4.cpp:44

◆ writeDM4() [1/2]

int writeDM4 ( size_t  img_select,
bool  isStack = false,
int  mode = WRITE_OVERWRITE 
)

DM4 Writer

◆ writeDM4() [2/2]

int ImageBase::writeDM4 ( size_t  img_select,
bool  isStack = false,
int  mode = WRITE_OVERWRITE 
)
protected

DM4 Writer

Definition at line 676 of file rwDM4.cpp.

677 {
678  REPORT_ERROR(ERR_IO_NOWRITE, "ERROR: writeDM4 is not implemented.");
679 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
Couldn&#39;t write to file.
Definition: xmipp_error.h:140