Xmipp  v3.23.11-Nereus
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
MetaDataVec Class Reference

#include <metadata_vec.h>

Inheritance diagram for MetaDataVec:
Inheritance graph
[legend]
Collaboration diagram for MetaDataVec:
Collaboration graph
[legend]

Classes

struct  MDVecIdIterator
 
struct  MDVecRowIterator
 

Public Member Functions

void readPlain (const FileName &inFile, const String &labelsString, const String &separator=" ")
 
void addPlain (const FileName &inFile, const String &labelsString, const String &separator=" ")
 
double getColumnMax (MDLabel column)
 
double getColumnMin (MDLabel column)
 
void replace (const MDLabel label, const String &oldStr, const String &newStr)
 
void randomize (const MetaData &MDin)
 
void removeDuplicates (MetaData &MDin, MDLabel label=MDL_UNDEFINED)
 
void sort (const MetaDataVec &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)
 
void sort (MetaDataVec &MDin, const String &sortLabel, bool asc=true, int limit=-1, int offset=0)
 
void split (size_t n, std::vector< MetaDataVec > &results, const MDLabel sortLabel=MDL_OBJID) const
 
void selectRandomSubset (const MetaData &mdIn, size_t numberOfObjects, const MDLabel sortLabel=MDL_OBJID) override
 
void selectPart (const MetaData &mdIn, size_t startPosition, size_t numberOfObjects, const MDLabel sortLabel=MDL_OBJID) override
 
void makeAbsPath (const MDLabel label=MDL_IMAGE)
 
void fillConstant (MDLabel label, const String &value) override
 
void fillRandom (MDLabel label, const String &mode, double op1, double op2, double op3=0.) override
 
void fillLinear (MDLabel label, double initial, double step) override
 
void copyColumn (MDLabel labelDest, MDLabel labelSrc) override
 
void copyColumnTo (MetaData &md, MDLabel labelDest, MDLabel labelSrc) override
 
void renameColumn (MDLabel oldLabel, MDLabel newLabel) override
 
void renameColumn (const std::vector< MDLabel > &oldLabel, const std::vector< MDLabel > &newLabel) override
 
bool operator== (const MetaDataVec &op) const
 
Constructors
 MetaDataVec ()
 
 MetaDataVec (const std::vector< MDLabel > &labelsVector)
 
 MetaDataVec (const FileName &fileName, const std::vector< MDLabel > &desiredLabels)
 
 MetaDataVec (const FileName &fileName)
 
 MetaDataVec (const MetaData &md)
 
 MetaDataVec (const MetaDataVec &md)=default
 
virtual ~MetaDataVec ()
 
void clear () override
 
Getters and setters
std::vector< MDLabelgetActiveLabels () const override
 
void writeXML (const FileName fn, const FileName blockname, WriteModeMetaData mode) const override
 
void writeText (const FileName fn, const std::vector< MDLabel > *desiredLabels) const override
 
MetaData Manipulation
size_t addRow (const MDRow &row) override
 
void addRows (const std::vector< MDRowVec > &rows)
 
int getMaxStringLength (const MDLabel thisLabel) const override
 
bool setValueCol (const MDObject &mdValueIn) override
 
template<class T >
bool setValueCol (const MDLabel label, const T &valueIn)
 
bool setValue (const MDObject &mdValueIn, size_t id)
 
template<class T >
bool setValue (const MDLabel label, const T &valueIn, size_t id)
 
bool getValue (MDObject &mdValueOut, size_t id) const override
 
MDObjectgetValue (MDLabel, size_t id)
 
const MDObjectgetValue (MDLabel, size_t id) const
 
template<class T >
bool getValue (const MDLabel label, T &valueOut, size_t id) const
 
template<class T >
getValue (const MDLabel label, size_t id)
 
template<class T >
const T getValue (const MDLabel label, size_t id) const
 
std::unique_ptr< MDRowgetRow (size_t id) override
 
std::unique_ptr< const MDRowgetRow (size_t id) const override
 
MDRowVec getRowVec (size_t id)
 
const MDRowVec getRowVec (size_t id) const
 
void getRow (MDRowVec &row, size_t id)
 
bool getRowValues (size_t id, std::vector< MDObject > &values) const override
 
size_t getRowId (size_t i) const
 
void getColumnValues (const MDLabel label, std::vector< MDObject > &valuesOut) const override
 
void setColumnValues (const std::vector< MDObject > &valuesIn) override
 
template<class T >
void setColumnValues (const MDLabel label, const std::vector< T > &valuesIn)
 
bool setRow (const MDRow &row, size_t id)
 
template<class T >
std::vector< T > getColumnValues (const MDLabel label) const
 
template<class T >
void getColumnValues (const MDLabel label, std::vector< T > &valuesOut) const
 
bool isEmpty () const override
 
size_t size () const override
 
bool containsLabel (const MDLabel label) const override
 
size_t firstRowId () const override
 
size_t firstObject (const MDQuery &) const override
 
size_t lastRowId () const override
 
bool addLabel (const MDLabel label, int pos=-1) override
 
bool removeLabel (const MDLabel label) override
 
size_t addObject () override
 
void importObject (const MetaData &md, const size_t id, bool doClear=true) override
 
void importObjects (const MetaData &md, const std::vector< size_t > &objectsToAdd, bool doClear=true) override
 
void importObjects (const MetaData &md, const MDQuery &query, bool doClear=true) override
 
bool removeObject (size_t id) override
 
void removeObjects (const std::vector< size_t > &toRemove) override
 
int removeObjects () override
 
int removeObjects (const MDQuery &) override
 
Search operations
void findObjects (std::vector< size_t > &objectsOut, const MDQuery &query) const override
 
void findObjects (std::vector< size_t > &objectsOut, int limit=-1) const override
 
size_t countObjects (const MDQuery &) const override
 
bool containsObject (size_t objectId) const override
 
bool containsObject (const MDQuery &) const override
 
bool containsObject (size_t objectId)
 
I/O functions
void _writeRows (std::ostream &os) const override
 
void write (const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
 
void write (std::ostream &os, const String &blockName="", WriteModeMetaData mode=MD_OVERWRITE) const
 
void readXML (const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, const String &blockRegExp=DEFAULT_BLOCK_NAME, bool decomposeStack=true)
 
void read (const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override
 
Iterators
iterator begin () override
 
iterator end () override
 
const_iterator begin () const override
 
const_iterator end () const override
 
id_iterator id_begin () override
 
id_iterator id_end () override
 
id_const_iterator id_begin () const override
 
id_const_iterator id_end () const override
 

Protected Member Functions

void init (const std::vector< MDLabel > &labelsVector)
 
void _clear (bool onlyData=false)
 
std::vector< MDObjectgetObjectsForActiveLabels () const
 
int _labelIndex (MDLabel label) const
 
const MDObject_getObject (size_t i, MDLabel label) const
 
MDObject_getObject (size_t i, MDLabel label)
 
const MDObject_getObject (const MetaDataVecRow &, MDLabel) const
 
MDObject_getObject (MetaDataVecRow &, MDLabel) const
 
int _rowIndex (size_t id) const
 
size_t _rowIndexSafe (size_t id) const
 
void _setRow (const MDRow &row, size_t index)
 
bool _match (const MetaDataVecRow &, const MDQuery &) const
 
size_t getRowId (const MetaDataVecRow &) const
 
void _expand (MetaDataVecRow &, const MDLabel)
 
void _expand (MetaDataVecRow &, size_t labeli)
 
void _parseObjects (std::istream &is, std::vector< MDObject *> &columnValues, const std::vector< MDLabel > *desiredLabels, bool firstTime) override
 
void _recalc_id_to_index ()
 
bool _contains (const std::vector< MetaDataVecRow > &, const MetaDataVecRow &) const
 
bool _rowsEq (const MetaDataVecRow &a, const MetaDataVecRow &b) const
 

Protected Attributes

std::vector< MetaDataVecRow_rows
 
std::array< int, MDL_LAST_LABEL_label_to_col
 
std::vector< MDLabel_col_to_label
 
size_t _no_columns = 0
 
std::unordered_map< size_t, size_t > _id_to_index
 
size_t _next_id = 1
 

Additional Inherited Members

Detailed Description

Fast in-memory storage of metadata in std::vector. MetaDataVec implements MetaData API (see metadata_base.h).

Notes

  1. It's fast to iterate either over rows or over ids.

Definition at line 46 of file metadata_vec.h.

Constructor & Destructor Documentation

◆ MetaDataVec() [1/6]

MetaDataVec::MetaDataVec ( )

Empty Constructor.

The MetaData is created with no data stored on it. You can fill in it programmatically or by a later reading from a MetaData file or old Xmipp formatted type. if labels vectors is passed this labels are created on metadata

Definition at line 42 of file metadata_vec.cpp.

42  {
43  init({});
44 }
void init(const std::vector< MDLabel > &labelsVector)

◆ MetaDataVec() [2/6]

MetaDataVec::MetaDataVec ( const std::vector< MDLabel > &  labelsVector)

Definition at line 46 of file metadata_vec.cpp.

46  {
47  init(labelsVector);
48 }
void init(const std::vector< MDLabel > &labelsVector)

◆ MetaDataVec() [3/6]

MetaDataVec::MetaDataVec ( const FileName fileName,
const std::vector< MDLabel > &  desiredLabels 
)

From File Constructor.

The MetaData is created and data is read from provided FileName. Optionally, a vector of labels can be provided to read just those required labels

Definition at line 50 of file metadata_vec.cpp.

50  {
51  init(desiredLabels);
52  read(fileName);
53 }
void init(const std::vector< MDLabel > &labelsVector)
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override

◆ MetaDataVec() [4/6]

MetaDataVec::MetaDataVec ( const FileName fileName)

Definition at line 55 of file metadata_vec.cpp.

55  {
56  init({});
57  read(fileName);
58 }
void init(const std::vector< MDLabel > &labelsVector)
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override

◆ MetaDataVec() [5/6]

MetaDataVec::MetaDataVec ( const MetaData md)

Copy constructor

Created a new metadata by copying all data from an existing MetaData object.

Definition at line 60 of file metadata_vec.cpp.

60  {
61  init({});
63 }
void init(const std::vector< MDLabel > &labelsVector)
MetaData & operator=(const MetaData &md)

◆ MetaDataVec() [6/6]

MetaDataVec::MetaDataVec ( const MetaDataVec md)
default

◆ ~MetaDataVec()

virtual MetaDataVec::~MetaDataVec ( )
inlinevirtual

Definition at line 121 of file metadata_vec.h.

121 {}

Member Function Documentation

◆ _clear()

void MetaDataVec::_clear ( bool  onlyData = false)
protected

clear data and table structure

◆ _contains()

bool MetaDataVec::_contains ( const std::vector< MetaDataVecRow > &  rows,
const MetaDataVecRow row 
) const
protected

Definition at line 765 of file metadata_vec.cpp.

765  {
766  for (const auto& _row : rows)
767  if (this->_rowsEq(row, _row))
768  return true;
769  return false;
770 }
bool _rowsEq(const MetaDataVecRow &a, const MetaDataVecRow &b) const

◆ _expand() [1/2]

void MetaDataVec::_expand ( MetaDataVecRow row,
const MDLabel  label 
)
protected

Definition at line 870 of file metadata_vec.cpp.

870  {
871  int labeli = this->_labelIndex(label);
872  if (labeli < 0)
873  this->addLabel(label);
874  this->_expand(row, this->_labelIndex(label));
875 }
void _expand(MetaDataVecRow &, const MDLabel)
bool addLabel(const MDLabel label, int pos=-1) override
int _labelIndex(MDLabel label) const

◆ _expand() [2/2]

void MetaDataVec::_expand ( MetaDataVecRow row,
size_t  labeli 
)
protected

Definition at line 877 of file metadata_vec.cpp.

877  {
878  // In assert: all labels to labeli (including) must be present in
879  // this->_col_to_label.
880 
881  if (labeli < row.size())
882  return; // space for label already present
883 
884  for (size_t i = row.size(); i <= labeli; i++)
885  row.emplace_back(MDObject(this->_col_to_label.at(i)));
886 }
#define i
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ _getObject() [1/4]

const MDObject & MetaDataVec::_getObject ( size_t  i,
MDLabel  label 
) const
protected

Definition at line 85 of file metadata_vec.cpp.

85  {
86  return this->_getObject(this->_rows.at(i), label);
87 }
#define i
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
const MDObject & _getObject(size_t i, MDLabel label) const

◆ _getObject() [2/4]

MDObject & MetaDataVec::_getObject ( size_t  i,
MDLabel  label 
)
protected

Definition at line 89 of file metadata_vec.cpp.

89  {
90  return this->_getObject(this->_rows.at(i), label);
91 }
#define i
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
const MDObject & _getObject(size_t i, MDLabel label) const

◆ _getObject() [3/4]

const MDObject & MetaDataVec::_getObject ( const MetaDataVecRow row,
MDLabel  label 
) const
protected

Definition at line 93 of file metadata_vec.cpp.

93  {
94  int labelIndex = this->_labelIndex(label);
95  if ((labelIndex < 0) || (static_cast<size_t>(labelIndex) >= row.size()))
96  throw ColumnDoesNotExist(label, getFilename());
97  return row.at(labelIndex);
98 }
int _labelIndex(MDLabel label) const
virtual FileName getFilename() const

◆ _getObject() [4/4]

MDObject & MetaDataVec::_getObject ( MetaDataVecRow row,
MDLabel  label 
) const
protected

Definition at line 100 of file metadata_vec.cpp.

100  {
101  int labelIndex = this->_labelIndex(label);
102  if (labelIndex < 0)
103  throw ColumnDoesNotExist(label, getFilename());
104  return row.at(labelIndex);
105 }
int _labelIndex(MDLabel label) const
virtual FileName getFilename() const

◆ _labelIndex()

int MetaDataVec::_labelIndex ( MDLabel  label) const
protected

Definition at line 81 of file metadata_vec.cpp.

81  {
82  return this->_label_to_col[label];
83 }
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49

◆ _match()

bool MetaDataVec::_match ( const MetaDataVecRow row,
const MDQuery query 
) const
protected

Definition at line 516 of file metadata_vec.cpp.

516  {
517  if (dynamic_cast<const MDMultiQuery*>(&query) != nullptr) {
518  // Process MDMultiQuery
519  const MDMultiQuery& mq = dynamic_cast<const MDMultiQuery&>(query);
520  if (mq.operations.size() == 0)
521  return true; // emptuy query matches always
522  String operation = mq.operations[0];
523  for (const auto& op : mq.operations)
524  assert(op == operation); // support only all same operations
525  for (const auto& q : mq.queries) {
526  if ((operation == "AND") && (!this->_match(row, *q)))
527  return false;
528  else if ((operation == "OR") && (this->_match(row, *q)))
529  return true;
530  }
531  return (operation == "AND"); // false for "OR", true for "AND"
532  }
533 
534  if (dynamic_cast<const MDValueRelational*>(&query) == nullptr)
535  throw NotImplemented("_match for this type of query not implemented");
536  // MDValueRange, MDExpression, MDMultiQuery not implemented yet
537  // MDExpression will probably never be supported as it is raw SQL expression
538 
539  const MDValueRelational& rel = dynamic_cast<const MDValueRelational&>(query);
540 
541  if (rel.value == nullptr)
542  return false;
543 
544  size_t labeli = this->_labelIndex(rel.value->label);
545  if (labeli >= row.size())
546  return false;
547 
548  const MDObject& mdObj = row[labeli];
549 
550  if (rel.op == RelationalOp::EQ)
551  return *(rel.value) == mdObj;
552  if (rel.op == RelationalOp::NE)
553  return *(rel.value) != mdObj;
554  if (rel.op == RelationalOp::GT) // FIXME: check if < & > are not swapped
555  return *(rel.value) < mdObj;
556  if (rel.op == RelationalOp::GE)
557  return *(rel.value) <= mdObj;
558  if (rel.op == RelationalOp::LT)
559  return *(rel.value) > mdObj;
560  if (rel.op == RelationalOp::LE)
561  return *(rel.value) >= mdObj;
562 
563  throw std::logic_error("MetaDataVec::_match: unknown operator");
564 }
std::vector< String > operations
bool _match(const MetaDataVecRow &, const MDQuery &) const
Not equal.
Less than.
MDLabel label
Equal.
Greater equal.
Greater than.
int _labelIndex(MDLabel label) const
std::string String
Definition: xmipp_strings.h:34
Less equal.
std::vector< const MDQuery * > queries

◆ _parseObjects()

void MetaDataVec::_parseObjects ( std::istream &  is,
std::vector< MDObject *> &  columnValues,
const std::vector< MDLabel > *  desiredLabels,
bool  firstTime 
)
overrideprotectedvirtual

Implements MetaData.

Definition at line 669 of file metadata_vec.cpp.

670  {
671  for (size_t i = 0; i < columnValues.size(); i++) {
672  columnValues[i]->fromStream(is);
673 
674  if (is.fail()) {
675  String errorMsg = formatString("MetaData: Error parsing column '%s' value.",
676  MDL::label2Str(columnValues[i]->label).c_str());
677  columnValues[i]->failed = true;
678  std::cerr << "WARNING: " << errorMsg << std::endl;
679  //REPORT_ERROR(ERR_MD_BADLABEL, (String)"read: Error parsing data column, expecting " + MDL::label2Str(object.label));
680  } else if (firstTime) {
681  // Check if current column label exists.
682  if (columnValues[i]->label != MDL_UNDEFINED) {
683  // If there are no desired labels then add all.
684  bool reallyAdd=false;
685  if (desiredLabels == NULL) {
686  reallyAdd = true;
687  } else {
688  // Check if current column belongs to desired labels.
689  for (size_t j = 0; j < desiredLabels->size(); ++j) {
690  if ((*desiredLabels)[j] == columnValues[i]->label) {
691  reallyAdd = true;
692  break;
693  }
694  }
695  }
696 
697  // Add label if not exists.
698  if (reallyAdd)
699  this->addLabel(columnValues[i]->label);
700  }
701  }
702  }
703 
704  // Insert elements in DB.
705  MDRowVec newRow;
706  for (size_t i = 0; i < columnValues.size(); i++)
707  if (columnValues[i] != nullptr)
708  newRow.setValue(*columnValues[i]);
709  this->addRow(newRow);
710 }
void setValue(const MDObject &object) override
#define i
size_t addRow(const MDRow &row) override
#define j
bool addLabel(const MDLabel label, int pos=-1) override
std::string String
Definition: xmipp_strings.h:34
String formatString(const char *format,...)
static String label2Str(const MDLabel &label)

◆ _recalc_id_to_index()

void MetaDataVec::_recalc_id_to_index ( )
protected

Definition at line 749 of file metadata_vec.cpp.

749  {
750  this->_id_to_index.clear();
751  for (size_t i = 0; i < this->_rows.size(); i++)
752  this->_id_to_index[this->getRowId(i)] = i;
753 }
#define i
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t getRowId(const MetaDataVecRow &) const

◆ _rowIndex()

int MetaDataVec::_rowIndex ( size_t  id) const
protected

Definition at line 107 of file metadata_vec.cpp.

107  {
108  if (this->_id_to_index.find(id) == this->_id_to_index.end())
109  return -1;
110  return this->_id_to_index.at(id);
111 }
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52

◆ _rowIndexSafe()

size_t MetaDataVec::_rowIndexSafe ( size_t  id) const
protected

Definition at line 113 of file metadata_vec.cpp.

113  {
114  int i = this->_rowIndex(id);
115  if (i == -1)
116  throw ObjectDoesNotExist(id, getFilename());
117  return i;
118 }
int _rowIndex(size_t id) const
#define i
virtual FileName getFilename() const

◆ _rowsEq()

bool MetaDataVec::_rowsEq ( const MetaDataVecRow a,
const MetaDataVecRow b 
) const
protected

Definition at line 772 of file metadata_vec.cpp.

772  {
773  for (size_t label = 0; label < MDL_LAST_LABEL; label++) {
774  if ((label == MDL_COMMENT) || (label == MDL_OBJID))
775  continue;
776 
777  int labeli = this->_labelIndex(static_cast<MDLabel>(label));
778  if (labeli > -1) { // label is active
779  if ((static_cast<size_t>(labeli) < a.size()) !=
780  (static_cast<size_t>(labeli) < b.size()))
781  return false; // item present in one row, but not other
782  if (static_cast<size_t>(labeli) >= a.size())
783  continue; // label not present in both rows
784  if (!a[labeli].eq(b[labeli], this->precision()))
785  return false; // MDObjects are diffrent
786  }
787  }
788  return true;
789 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
doublereal * b
void eq(Image< double > &op1, const Image< double > &op2)
Be careful with integer images for relational operations...due to double comparisons.
double precision() const
int _labelIndex(MDLabel label) const
doublereal * a
Serve to make annotations on the metadata row.

◆ _setRow()

void MetaDataVec::_setRow ( const MDRow row,
size_t  index 
)
protected

Definition at line 180 of file metadata_vec.cpp.

180  {
181  if (dynamic_cast<const MDRowVec*>(&row) != nullptr) {
182  // No not change same row
183  const MDRowVec& mdRowVec = dynamic_cast<const MDRowVec&>(row);
184  if ((mdRowVec._in_metadata) && (mdRowVec._rowi == index) && (mdRowVec._row == &this->_rows[index]))
185  return;
186  }
187 
188  size_t newRowSize = 0;
189  for (size_t labeli = 0; labeli < MDL_LAST_LABEL; ++labeli) {
190  MDLabel label = static_cast<MDLabel>(labeli);
191  if (row.containsLabel(label)) {
192  if (!this->containsLabel(label))
193  newRowSize = this->size();
194  else if (this->_label_to_col[label]+1 > newRowSize)
195  newRowSize = this->_label_to_col[label]+1;
196  }
197  }
198 
199  for (size_t column = 0; (column < this->_col_to_label.size()) && (column < newRowSize); ++column)
200  if ((this->_col_to_label[column] != MDL_OBJID) && (!row.containsLabel(this->_col_to_label[column])))
201  throw ColumnDoesNotExist("New row does not contain required MetaData column: "+
202  MDL::label2Str(this->_col_to_label[column])+"!");
203 
204  for (size_t labeli = 0; labeli < MDL_LAST_LABEL; ++labeli) {
205  MDLabel label = static_cast<MDLabel>(labeli);
206  if (row.containsLabel(label) && !this->containsLabel(label))
207  this->addLabel(label);
208  }
209 
210  MetaDataVecRow& editRow = this->_rows[index];
211  editRow.clear();
212 
213  for (size_t coli = 0; coli < this->_no_columns; coli++)
214  editRow.push_back({this->_col_to_label[coli]});
215 
216  for (size_t labeli = 0; labeli < MDL_LAST_LABEL; ++labeli) {
217  MDLabel label = static_cast<MDLabel>(labeli);
218  if (row.containsLabel(label)) {
219  size_t ourCol = _label_to_col[label];
220  row.getValue(editRow[ourCol]);
221  }
222  }
223 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
size_t _no_columns
Definition: metadata_vec.h:51
size_t size() const override
T & getValue(MDLabel label)
viol index
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool addLabel(const MDLabel label, int pos=-1) override
virtual bool containsLabel(MDLabel label) const =0
static String label2Str(const MDLabel &label)
bool containsLabel(const MDLabel label) const override
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50
MDLabel

◆ _writeRows()

void MetaDataVec::_writeRows ( std::ostream &  os) const
overridevirtual

Write rows data to disk.

Implements MetaData.

Definition at line 612 of file metadata_vec.cpp.

612  {
613  for (const MetaDataVecRow& row : this->_rows) {
614  for (size_t i = 0; i < MDL_LAST_LABEL; i++) {
615  const MDLabel label = static_cast<MDLabel>(i);
616  if ((label != MDL_STAR_COMMENT) && (label != MDL_OBJID) && (this->_label_to_col[i] > -1)) {
617  os.width(1);
618  if (this->_labelIndex(label) < static_cast<int>(row.size()))
619  this->_getObject(row, label).toStream(os, true);
620  else
621  throw ColumnDoesNotExist(label, getFilename());
622  os << " ";
623  }
624  }
625  os << '\n';
626  }
627 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
const MDObject & _getObject(size_t i, MDLabel label) const
int _labelIndex(MDLabel label) const
void toStream(std::ostream &os, bool withFormat=false, bool isSql=false, bool escape=true) const
MDLabel
virtual FileName getFilename() const
A comment for this object /*** NOTE THIS IS A SPECIAL CASE AND SO IS TREATED ***/.

◆ addLabel()

bool MetaDataVec::addLabel ( const MDLabel  label,
int  pos = -1 
)
overridevirtual

Add a new label to the metadata. By default the label is added at the end, if the position is specified and is between 0 and n-1 the new label is inserted at that position.

Implements MetaData.

Definition at line 401 of file metadata_vec.cpp.

401  {
402  if (pos != -1)
403  throw NotImplemented("addLabel to -1 not implemented");
404  if (this->_label_to_col[label] != -1)
405  return true;
406 
407  this->_no_columns++;
408  size_t column = this->_no_columns-1;
409  this->_label_to_col[label] = column;
410  this->_col_to_label.emplace_back(label);
411  return true;
412 }
size_t _no_columns
Definition: metadata_vec.h:51
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ addObject()

size_t MetaDataVec::addObject ( )
overridevirtual

Adds a new, empty object to the objects map. If objectId == -1 the new ID will be that for the last object inserted + 1, else the given objectId is used. If there is already an object whose objectId == input objectId, just removes it and creates an empty one

Implements MetaData.

Definition at line 435 of file metadata_vec.cpp.

435  {
436  MDRowVec row;
437  row.setValue(MDObject(MDL_OBJID, this->_next_id));
438  return this->addRow(row);
439 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
void setValue(const MDObject &object) override
size_t addRow(const MDRow &row) override
size_t _next_id
Definition: metadata_vec.h:53

◆ addPlain()

void MetaDataVec::addPlain ( const FileName inFile,
const String labelsString,
const String separator = " " 
)

Same as readPlain, but instead of cleanning data, the readed values will be added. If there are common columns in metadata and the plain text, the lattest will be setted

Definition at line 721 of file metadata_vec.cpp.

721  {
722  // TODO
723  throw NotImplemented("addPlain not implemented");
724 }

◆ addRow()

size_t MetaDataVec::addRow ( const MDRow row)
overridevirtual

Implements MetaData.

Definition at line 225 of file metadata_vec.cpp.

225  {
226  /* Id:
227  * When ‹row› does not contain MDL_OBJID column, it is created from ‹this->_nextId›
228  * When ‹row› contains id which is NOT present in Metadata, id is kept.
229  * When ‹row› contains id which IS present in Metadata, id is changed from ‹this->_nextId›.
230  * When ‹this->_nextId› is present in MetaData, assert fails. This should not happen.
231  */
232 
233  MetaDataVecRow newRow;
234  _rows.emplace_back(newRow);
235  this->_setRow(row, _rows.size()-1);
236 
237  if ((!row.containsLabel(MDL_OBJID)) || (row.getValue<size_t>(MDL_OBJID) == BAD_OBJID)) {
238  MetaDataVecRow& _row = this->_rows[_rows.size()-1];
239  if (!this->containsLabel(MDL_OBJID))
240  this->addLabel(MDL_OBJID);
241  this->_expand(_row, MDL_OBJID);
242  _row[this->_labelIndex(MDL_OBJID)] = MDObject(MDL_OBJID, this->_next_id);
243  }
244 
245  size_t rowId = getRowId(_rows.size()-1);
246 
247  if (this->_id_to_index.find(rowId) != this->_id_to_index.end()) {
248  MetaDataVecRow& _row = this->_rows[_rows.size()-1];
249  _row[this->_labelIndex(MDL_OBJID)] = MDObject(MDL_OBJID, this->_next_id);
250  rowId = this->_next_id;
251  }
252 
253  assert(this->_id_to_index.find(rowId) == this->_id_to_index.end());
254 
255  if (rowId >= this->_next_id)
256  this->_next_id = rowId+1;
257  this->_id_to_index[rowId] = _rows.size()-1;
258  return rowId;
259 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52
T & getValue(MDLabel label)
size_t _next_id
Definition: metadata_vec.h:53
void _expand(MetaDataVecRow &, const MDLabel)
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t getRowId(const MetaDataVecRow &) const
bool addLabel(const MDLabel label, int pos=-1) override
void _setRow(const MDRow &row, size_t index)
virtual bool containsLabel(MDLabel label) const =0
int _labelIndex(MDLabel label) const
bool containsLabel(const MDLabel label) const override
#define BAD_OBJID
Definition: metadata_base.h:55

◆ addRows()

void MetaDataVec::addRows ( const std::vector< MDRowVec > &  rows)

Definition at line 261 of file metadata_vec.cpp.

261  {
262  for (const auto row : rows)
263  this->addRow(row);
264 }
size_t addRow(const MDRow &row) override

◆ begin() [1/2]

iterator MetaDataVec::begin ( )
inlineoverridevirtual

Implements MetaData.

Definition at line 501 of file metadata_vec.h.

501  {
502  return {memoryUtils::make_unique<MDVecRowIterator<false>>(*this, 0)};
503  }

◆ begin() [2/2]

const_iterator MetaDataVec::begin ( ) const
inlineoverridevirtual

Implements MetaData.

Definition at line 508 of file metadata_vec.h.

508  {
509  return {memoryUtils::make_unique<MDVecRowIterator<true>>(*this, 0)};
510  }

◆ clear()

void MetaDataVec::clear ( )
overridevirtual

Clear all data

Reimplemented from MetaData.

Definition at line 170 of file metadata_vec.cpp.

170  {
171  MetaData::clear();
172  this->_rows.clear();
173  std::fill(this->_label_to_col.begin(), this->_label_to_col.end(), -1);
174  this->_col_to_label.clear();
175  this->_id_to_index.clear();
176  this->_no_columns = 0;
177  this->_next_id = 1;
178 }
virtual void clear()
size_t _no_columns
Definition: metadata_vec.h:51
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52
size_t _next_id
Definition: metadata_vec.h:53
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ containsLabel()

bool MetaDataVec::containsLabel ( const MDLabel  label) const
overridevirtual

Check whether a label is contained in metadata.

Implements MetaData.

Definition at line 397 of file metadata_vec.cpp.

397  {
398  return this->_labelIndex(label) > -1;
399 }
int _labelIndex(MDLabel label) const

◆ containsObject() [1/3]

bool MetaDataVec::containsObject ( size_t  objectId) const
overridevirtual

Implements MetaData.

Definition at line 596 of file metadata_vec.cpp.

596  {
597  return this->_rowIndex(objectId) > -1;
598 }
int _rowIndex(size_t id) const

◆ containsObject() [2/3]

bool MetaDataVec::containsObject ( const MDQuery query) const
overridevirtual

Implements MetaData.

Definition at line 600 of file metadata_vec.cpp.

600  {
601  for (const MetaDataVecRow& row : this->_rows)
602  if (this->_match(row, query))
603  return true;
604  return false;
605 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
bool _match(const MetaDataVecRow &, const MDQuery &) const
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ containsObject() [3/3]

bool MetaDataVec::containsObject ( size_t  objectId)

Find if the object with this id is present in the metadata

Definition at line 607 of file metadata_vec.cpp.

607  {
608  return this->_id_to_index.find(objectId) != this->_id_to_index.end();
609 }
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52

◆ copyColumn()

void MetaDataVec::copyColumn ( MDLabel  labelDest,
MDLabel  labelSrc 
)
overridevirtual

Copy all values from one column to another. Source column should exist

Implements MetaData.

Definition at line 888 of file metadata_vec.cpp.

888  {
889  int labelsrci = this->_labelIndex(labelSrc);
890  int labeldesti = this->_labelIndex(labelDest);
891  if (labelsrci < 0)
892  return;
893  if (labeldesti < 0)
894  this->addLabel(labelDest);
895  labeldesti = this->_labelIndex(labelDest);
896 
897  for (MetaDataVecRow& row : this->_rows) {
898  if (static_cast<size_t>(labeldesti) >= row.size())
899  this->_expand(row, labeldesti);
900 
901  if (static_cast<size_t>(labelsrci) < row.size()) {
902  row[labeldesti] = row[labelsrci];
903  row[labeldesti].label = labelDest;
904  }
905  // else row[labeldesti] is empty MDObject (from previous if)
906  }
907 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
void _expand(MetaDataVecRow &, const MDLabel)
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool addLabel(const MDLabel label, int pos=-1) override
int _labelIndex(MDLabel label) const

◆ copyColumnTo()

void MetaDataVec::copyColumnTo ( MetaData md,
MDLabel  labelDest,
MDLabel  labelSrc 
)
overridevirtual

Same as previous, but copy to another metadata

Implements MetaData.

Definition at line 909 of file metadata_vec.cpp.

909  {
910  // TODO
911  throw NotImplemented("copyColumnTo not implemented");
912 }

◆ countObjects()

size_t MetaDataVec::countObjects ( const MDQuery query) const
overridevirtual

Implements MetaData.

Definition at line 588 of file metadata_vec.cpp.

588  {
589  size_t count = 0;
590  for (const MetaDataVecRow& row : this->_rows)
591  if (this->_match(row, query))
592  count++;
593  return count;
594 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
bool _match(const MetaDataVecRow &, const MDQuery &) const
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ end() [1/2]

iterator MetaDataVec::end ( )
inlineoverridevirtual

Implements MetaData.

Definition at line 504 of file metadata_vec.h.

504  {
505  return {memoryUtils::make_unique<MDVecRowIterator<false>>(*this, this->size())};
506  }
size_t size() const override

◆ end() [2/2]

const_iterator MetaDataVec::end ( ) const
inlineoverridevirtual

Implements MetaData.

Definition at line 511 of file metadata_vec.h.

511  {
512  return {memoryUtils::make_unique<MDVecRowIterator<true>>(*this, this->size())};
513  }
size_t size() const override

◆ fillConstant()

void MetaDataVec::fillConstant ( MDLabel  label,
const String value 
)
overridevirtual

Fill column with constant value

Implements MetaData.

Definition at line 849 of file metadata_vec.cpp.

849  {
850  // FIXME: move to MetaData and use common MDGenerator?
851  MDConstGenerator generator(value);
852  generator.label = label;
853  generator.fill(*this);
854 }

◆ fillLinear()

void MetaDataVec::fillLinear ( MDLabel  label,
double  initial,
double  step 
)
overridevirtual

Fill lineal, starting at some value and with some step

Implements MetaData.

Definition at line 863 of file metadata_vec.cpp.

863  {
864  // FIXME: move to MetaData and use common MDGenerator?
865  MDLinealGenerator generator(initial, step);
866  generator.label = label;
867  generator.fill(*this);
868 }

◆ fillRandom()

void MetaDataVec::fillRandom ( MDLabel  label,
const String mode,
double  op1,
double  op2,
double  op3 = 0. 
)
overridevirtual

Fill column with random value mode should be: uniform, gaussian or student op1, op2 and op2 are interpreted for each mode: uniform: op1 and op2 are the limits of the interval gaussian: op1 and op2 are mean and std student: same as gaussian and use op3

Implements MetaData.

Definition at line 856 of file metadata_vec.cpp.

856  {
857  // FIXME: move to MetaData and use common MDGenerator?
858  MDRandGenerator generator(op1, op2, mode, op3);
859  generator.label = label;
860  generator.fill(*this);
861 }
void mode

◆ findObjects() [1/2]

void MetaDataVec::findObjects ( std::vector< size_t > &  objectsOut,
const MDQuery query 
) const
overridevirtual

Find all objects that match a query. if called without query, all objects are returned if limit is provided only return a maximun of 'limit'

Implements MetaData.

Definition at line 574 of file metadata_vec.cpp.

574  {
575  // FIXME: should first be first in _rows order or ids order?
576  objectsOut.clear();
577  for (const MetaDataVecRow& row : this->_rows)
578  if (this->_match(row, query))
579  objectsOut.emplace_back(this->getRowId(row));
580 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
bool _match(const MetaDataVecRow &, const MDQuery &) const
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t getRowId(const MetaDataVecRow &) const

◆ findObjects() [2/2]

void MetaDataVec::findObjects ( std::vector< size_t > &  objectsOut,
int  limit = -1 
) const
overridevirtual

Implements MetaData.

Definition at line 582 of file metadata_vec.cpp.

582  {
583  objectsOut.clear();
584  for (size_t i = 0; i < std::min<size_t>(limit, this->size()); i++)
585  objectsOut.emplace_back(this->getRowId(this->_rows[i]));
586 }
size_t size() const override
#define i

◆ firstObject()

size_t MetaDataVec::firstObject ( const MDQuery query) const
overridevirtual

Implements MetaData.

Definition at line 566 of file metadata_vec.cpp.

566  {
567  // FIXME: should first be first in _rows order or ids order?
568  for (const MetaDataVecRow& row : this->_rows)
569  if (this->_match(row, query))
570  return this->getRowId(row);
571  return BAD_OBJID;
572 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
bool _match(const MetaDataVecRow &, const MDQuery &) const
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t getRowId(const MetaDataVecRow &) const
#define BAD_OBJID
Definition: metadata_base.h:55

◆ firstRowId()

size_t MetaDataVec::firstRowId ( ) const
overridevirtual

Return the object id of the first element in metadata.

Implements MetaData.

Definition at line 508 of file metadata_vec.cpp.

508  {
509  return this->getRowId(0);
510 }
size_t getRowId(const MetaDataVecRow &) const

◆ getActiveLabels()

std::vector< MDLabel > MetaDataVec::getActiveLabels ( ) const
overridevirtual

Get safe access to active labels.

Implements MetaData.

Definition at line 969 of file metadata_vec.cpp.

969  {
970  std::vector<MDLabel> out;
971  for (size_t i = MDL_GATHER_ID; i < MDL_LAST_LABEL; i++) // ignore MDL_FIRST_LABEL = MDL_OBJID
972  if (this->_label_to_col[i] > -1)
973  out.emplace_back(static_cast<MDLabel>(i));
974  return out;
975 }
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49

◆ getColumnMax()

double MetaDataVec::getColumnMax ( MDLabel  column)

Returns Max and Min values from a column in metadata These functions can only be used for labels of type double

Definition at line 726 of file metadata_vec.cpp.

726  {
727  // TODO
728  throw NotImplemented("getColumnMax not implemented");
729 }

◆ getColumnMin()

double MetaDataVec::getColumnMin ( MDLabel  column)

Definition at line 731 of file metadata_vec.cpp.

731  {
732  // TODO
733  throw NotImplemented("getColumnMin not implemented");
734 }

◆ getColumnValues() [1/3]

void MetaDataVec::getColumnValues ( const MDLabel  label,
std::vector< MDObject > &  valuesOut 
) const
overridevirtual

Get all values of a column as a vector.

Implements MetaData.

Definition at line 362 of file metadata_vec.cpp.

362  {
363  valuesOut.clear();
364  int labelIndex = this->_labelIndex(label);
365  if (labelIndex < 0)
366  throw ColumnDoesNotExist(label, getFilename());
367  for (const auto& vecRow : this->_rows)
368  valuesOut.emplace_back(vecRow.at(labelIndex));
369 }
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
int _labelIndex(MDLabel label) const
virtual FileName getFilename() const

◆ getColumnValues() [2/3]

template<class T >
std::vector<T> MetaDataVec::getColumnValues ( const MDLabel  label) const
inline

Definition at line 217 of file metadata_vec.h.

217  {
218  return MetaData::getColumnValues<T>(label);
219  }

◆ getColumnValues() [3/3]

template<class T >
void MetaDataVec::getColumnValues ( const MDLabel  label,
std::vector< T > &  valuesOut 
) const
inline

Definition at line 222 of file metadata_vec.h.

222  {
223  return MetaData::getColumnValues(label, valuesOut);
224  }
std::vector< T > getColumnValues(const MDLabel label) const

◆ getMaxStringLength()

int MetaDataVec::getMaxStringLength ( const MDLabel  thisLabel) const
overridevirtual

Get maximum string length of column values.

Implements MetaData.

Definition at line 266 of file metadata_vec.cpp.

266  {
267  return 255;
268 }

◆ getObjectsForActiveLabels()

std::vector<MDObject> MetaDataVec::getObjectsForActiveLabels ( ) const
protected

Get a vector of (empty) objects for each active label

◆ getRow() [1/3]

std::unique_ptr< MDRow > MetaDataVec::getRow ( size_t  id)
overridevirtual

Implements MetaData.

Definition at line 310 of file metadata_vec.cpp.

310  {
311  int i = this->_rowIndex(id);
312  if (i < 0)
313  return nullptr;
314  return memoryUtils::make_unique<MDRowVec>(
315  this->_rows[i], i, this->_label_to_col, this->_col_to_label, this->_no_columns
316  );
317 }
size_t _no_columns
Definition: metadata_vec.h:51
int _rowIndex(size_t id) const
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ getRow() [2/3]

std::unique_ptr< const MDRow > MetaDataVec::getRow ( size_t  id) const
overridevirtual

Implements MetaData.

Definition at line 319 of file metadata_vec.cpp.

319  {
320  int i = this->_rowIndex(id);
321  if (i < 0)
322  return nullptr;
323  return memoryUtils::make_unique<MDRowVec>(
324  this->_rows[i], i, this->_label_to_col, this->_col_to_label, this->_no_columns
325  );
326 }
size_t _no_columns
Definition: metadata_vec.h:51
int _rowIndex(size_t id) const
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ getRow() [3/3]

void MetaDataVec::getRow ( MDRowVec row,
size_t  id 
)

Definition at line 338 of file metadata_vec.cpp.

338  {
339  size_t i = this->_rowIndexSafe(id);
340  row = MDRowVec(this->_rows[i], i, this->_label_to_col, this->_col_to_label, this->_no_columns);
341 }
size_t _no_columns
Definition: metadata_vec.h:51
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t _rowIndexSafe(size_t id) const
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ getRowId() [1/2]

size_t MetaDataVec::getRowId ( const MetaDataVecRow row) const
protected

Definition at line 355 of file metadata_vec.cpp.

355  {
356  int labelIndex = _labelIndex(MDL_OBJID);
357  if (labelIndex < 0)
359  return row.at(labelIndex).getValue2(size_t());
360 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
int _labelIndex(MDLabel label) const
virtual FileName getFilename() const

◆ getRowId() [2/2]

size_t MetaDataVec::getRowId ( size_t  i) const

Definition at line 351 of file metadata_vec.cpp.

351  {
352  return this->_getObject(i, MDL_OBJID).getValue2(size_t());
353 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
const int & getValue2(int) const
#define i
const MDObject & _getObject(size_t i, MDLabel label) const

◆ getRowValues()

bool MetaDataVec::getRowValues ( size_t  id,
std::vector< MDObject > &  values 
) const
overridevirtual

Implements MetaData.

Definition at line 343 of file metadata_vec.cpp.

343  {
344  int i = this->_rowIndex(id);
345  if (i < 0)
346  return false;
347  values = this->_rows[i];
348  return true;
349 }
int _rowIndex(size_t id) const
#define i
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ getRowVec() [1/2]

MDRowVec MetaDataVec::getRowVec ( size_t  id)

Definition at line 328 of file metadata_vec.cpp.

328  {
329  size_t i = this->_rowIndexSafe(id);
330  return MDRowVec(this->_rows[i], i, this->_label_to_col, this->_col_to_label, this->_no_columns);
331 }
size_t _no_columns
Definition: metadata_vec.h:51
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t _rowIndexSafe(size_t id) const
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ getRowVec() [2/2]

const MDRowVec MetaDataVec::getRowVec ( size_t  id) const

Definition at line 333 of file metadata_vec.cpp.

333  {
334  size_t i = this->_rowIndexSafe(id);
335  return MDRowVec(this->_rows[i], i, this->_label_to_col, this->_col_to_label, this->_no_columns);
336 }
size_t _no_columns
Definition: metadata_vec.h:51
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
size_t _rowIndexSafe(size_t id) const
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ getValue() [1/6]

bool MetaDataVec::getValue ( MDObject mdValueOut,
size_t  id 
) const
overridevirtual

Implements MetaData.

Definition at line 293 of file metadata_vec.cpp.

293  {
294  try {
295  mdValueOut = this->_getObject(this->_rowIndexSafe(id), mdValueOut.label);
296  } catch (const ColumnDoesNotExist&) {
297  return false;
298  }
299  return true;
300 }
MDLabel label
const MDObject & _getObject(size_t i, MDLabel label) const
size_t _rowIndexSafe(size_t id) const

◆ getValue() [2/6]

MDObject & MetaDataVec::getValue ( MDLabel  label,
size_t  id 
)

Definition at line 302 of file metadata_vec.cpp.

302  {
303  return this->_getObject(this->_rowIndexSafe(id), label);
304 }
const MDObject & _getObject(size_t i, MDLabel label) const
size_t _rowIndexSafe(size_t id) const

◆ getValue() [3/6]

const MDObject & MetaDataVec::getValue ( MDLabel  label,
size_t  id 
) const

Definition at line 306 of file metadata_vec.cpp.

306  {
307  return this->_getObject(this->_rowIndexSafe(id), label);
308 }
const MDObject & _getObject(size_t i, MDLabel label) const
size_t _rowIndexSafe(size_t id) const

◆ getValue() [4/6]

template<class T >
bool MetaDataVec::getValue ( const MDLabel  label,
T &  valueOut,
size_t  id 
) const
inline

Definition at line 182 of file metadata_vec.h.

182  {
183  return MetaData::getValue(label, valueOut, id);
184  }
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0

◆ getValue() [5/6]

template<class T >
T MetaDataVec::getValue ( const MDLabel  label,
size_t  id 
)
inline

Definition at line 187 of file metadata_vec.h.

187  {
188  return this->getValue(label, id).getValue2(T());
189  }
bool getValue(MDObject &mdValueOut, size_t id) const override

◆ getValue() [6/6]

template<class T >
const T MetaDataVec::getValue ( const MDLabel  label,
size_t  id 
) const
inline

Definition at line 192 of file metadata_vec.h.

192  {
193  return this->getValue(label, id).getValue2(T());
194  }
bool getValue(MDObject &mdValueOut, size_t id) const override

◆ id_begin() [1/2]

id_iterator MetaDataVec::id_begin ( )
inlineoverridevirtual

Implements MetaData.

Definition at line 542 of file metadata_vec.h.

542  {
543  return {memoryUtils::make_unique<MDVecIdIterator<false>>(*this, 0)};
544  }

◆ id_begin() [2/2]

id_const_iterator MetaDataVec::id_begin ( ) const
inlineoverridevirtual

Implements MetaData.

Definition at line 550 of file metadata_vec.h.

550  {
551  return {memoryUtils::make_unique<MDVecIdIterator<true>>(*this, 0)};
552  }

◆ id_end() [1/2]

id_iterator MetaDataVec::id_end ( )
inlineoverridevirtual

Implements MetaData.

Definition at line 546 of file metadata_vec.h.

546  {
547  return {memoryUtils::make_unique<MDVecIdIterator<false>>(*this, this->size())};
548  }
size_t size() const override

◆ id_end() [2/2]

id_const_iterator MetaDataVec::id_end ( ) const
inlineoverridevirtual

Implements MetaData.

Definition at line 554 of file metadata_vec.h.

554  {
555  return {memoryUtils::make_unique<MDVecIdIterator<true>>(*this, this->size())};
556  }
size_t size() const override

◆ importObject()

void MetaDataVec::importObject ( const MetaData md,
const size_t  id,
bool  doClear = true 
)
overridevirtual

Import objects from another metadata.

//Import object 1000 from metadata B into metadata A
A.importObject(B, 1000);
//Import all objects with rotational angle greater that 60
A.importObjects(B, MDValuesGT(MDL_ANGLE_ROT, 60));
//Import all objects
A.importObjects(B);

Implements MetaData.

Definition at line 441 of file metadata_vec.cpp.

441  {
442  if (doClear) {
443  this->clear();
444  this->copyInfo(md);
445  }
446 
447  std::unique_ptr<const MDRow> row = md.getRow(id);
448  if (row == nullptr)
449  return;
450 
451  MDRowVec newRow;
452  for (const MDObject* obj : *row)
453  if (obj->label != MDL_OBJID)
454  newRow.setValue(*obj);
455  this->addRow(newRow);
456 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
void setValue(const MDObject &object) override
size_t addRow(const MDRow &row) override
void clear() override
void copyInfo(const MetaData &md)
virtual std::unique_ptr< MDRow > getRow(size_t id)=0
void(* obj)()

◆ importObjects() [1/2]

void MetaDataVec::importObjects ( const MetaData md,
const std::vector< size_t > &  objectsToAdd,
bool  doClear = true 
)
overridevirtual

Implements MetaData.

Definition at line 458 of file metadata_vec.cpp.

458  {
459  if (doClear) {
460  this->clear();
461  this->copyInfo(md);
462  }
463 
464  for (size_t objId : objectsToAdd)
465  this->importObject(md, objId, false);
466 }
void clear() override
void copyInfo(const MetaData &md)
void importObject(const MetaData &md, const size_t id, bool doClear=true) override

◆ importObjects() [2/2]

void MetaDataVec::importObjects ( const MetaData md,
const MDQuery query,
bool  doClear = true 
)
overridevirtual

Implements MetaData.

Definition at line 468 of file metadata_vec.cpp.

468  {
469  // FIXME: move this to MetaData?
470  std::vector<size_t> ids;
471  md.findObjects(ids, query);
472  this->importObjects(md, ids, doClear);
473 }
virtual IdIteratorProxy< false > ids()
void importObjects(const MetaData &md, const std::vector< size_t > &objectsToAdd, bool doClear=true) override
virtual void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const =0

◆ init()

void MetaDataVec::init ( const std::vector< MDLabel > &  labelsVector)
protected

Init, do some initializations tasks, used in constructors

Definition at line 66 of file metadata_vec.cpp.

66  {
67  this->clear();
69  _col_to_label.push_back(MDL_OBJID);
70  size_t col = 1;
71  for (const auto label : labelsVector) {
72  if (label != MDL_OBJID) {
73  _label_to_col[label] = col;
74  _col_to_label.push_back(label);
75  col++;
76  }
77  }
78  _no_columns = col;
79 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
size_t _no_columns
Definition: metadata_vec.h:51
void clear() override
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50

◆ isEmpty()

bool MetaDataVec::isEmpty ( ) const
overridevirtual

Check whether the metadata is empty.

Reimplemented from MetaData.

Definition at line 389 of file metadata_vec.cpp.

389  {
390  return this->_rows.empty();
391 }
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ lastRowId()

size_t MetaDataVec::lastRowId ( ) const
overridevirtual

Goto last metadata object.

Implements MetaData.

Definition at line 512 of file metadata_vec.cpp.

512  {
513  return this->getRowId(this->size()-1);
514 }
size_t size() const override
size_t getRowId(const MetaDataVecRow &) const

◆ makeAbsPath()

void MetaDataVec::makeAbsPath ( const MDLabel  label = MDL_IMAGE)

Makes filenames with absolute paths

◆ operator==()

bool MetaDataVec::operator== ( const MetaDataVec op) const

Definition at line 937 of file metadata_vec.cpp.

937  {
938  // This comparison ignores order of labels and row ids, everything else must be same.
939 
940  if (this->_rows.size() != op._rows.size())
941  return false;
942 
943  for (size_t labeli = 0; labeli < MDL_LAST_LABEL; labeli++)
944  if ((this->_label_to_col[labeli] > -1) != (op._label_to_col[labeli] > -1))
945  return false;
946 
947  for (size_t i = 0; i < this->_rows.size(); i++) {
948  for (size_t labeli = 0; labeli < MDL_LAST_LABEL; labeli++) {
949  if ((labeli == MDL_COMMENT) || (labeli == MDL_OBJID))
950  continue;
951 
952  int thisLabelColI = this->_label_to_col[labeli];
953  int opLabelColI = op._label_to_col[labeli];
954  if (thisLabelColI > -1) {
955  if ((static_cast<size_t>(thisLabelColI) < this->_rows[i].size()) !=
956  (static_cast<size_t>(opLabelColI) < op._rows[i].size()))
957  return false; // item present in one row, but not other
958  if (static_cast<size_t>(thisLabelColI) >= this->_rows[i].size())
959  continue; // label not present in both rows
960  if (!this->_rows[i][thisLabelColI].eq(op._rows[i][opLabelColI], this->precision()))
961  return false; // MDObjects are diffrent
962  }
963  }
964  }
965 
966  return true; // all rows same → ok
967 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
void eq(Image< double > &op1, const Image< double > &op2)
Be careful with integer images for relational operations...due to double comparisons.
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
Serve to make annotations on the metadata row.

◆ randomize()

void MetaDataVec::randomize ( const MetaData MDin)

Randomize a metadata. MDin is input and the "randomized" result will be in the "calling" Metadata.

Definition at line 741 of file metadata_vec.cpp.

741  {
742  *this = MDin;
743  std::random_device rd;
744  auto g = std::mt19937(rd());
745  std::shuffle(this->_rows.begin(), this->_rows.end(), g);
746  this->_recalc_id_to_index();
747 }
doublereal * g
void _recalc_id_to_index()
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ read()

void MetaDataVec::read ( const FileName inFile,
const std::vector< MDLabel > *  desiredLabels = nullptr,
bool  decomposeStack = true 
)
overridevirtual

Read data from file. Guess the blockname from the filename

inFilename="first@md1.doc" -> filename = md1.doc, blockname = first

Implements MetaData.

Definition at line 120 of file metadata_vec.cpp.

120  {
121  String blockName;
122  FileName inFile;
123 
124  blockName = filename.getBlockName();
125  inFile = filename.removeBlockName();
126  String extFile = filename.getExtension();
127  blockName = escapeForRegularExpressions(blockName);
128 
129  this->clear();
130  this->setColumnFormat(true);
131 
132  if (extFile == "xml")
133  this->readXML(_inFile, desiredLabels, blockName, decomposeStack);
134  else if (extFile == "sqlite")
135  throw NotImplemented("Reading from .sqlite file into MetaDataVec not implemented!");
136  else
137  this->readStar(filename, desiredLabels, blockName, decomposeStack);
138 }
String getBlockName() const
void readXML(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, const String &blockRegExp=DEFAULT_BLOCK_NAME, bool decomposeStack=true)
FileName _inFile
String getExtension() const
void clear() override
virtual void setColumnFormat(bool column)
String escapeForRegularExpressions(const String &str)
FileName removeBlockName() const
std::string String
Definition: xmipp_strings.h:34
virtual void readStar(const FileName &filename, const std::vector< MDLabel > *desiredLabels, const String &blockRegExp, bool decomposeStack)

◆ readPlain()

void MetaDataVec::readPlain ( const FileName inFile,
const String labelsString,
const String separator = " " 
)

Try to read a metadata from plain text with some columns. Labels for each columns should be provided in an string separated by spaces. Return false if couldn't read

Definition at line 716 of file metadata_vec.cpp.

716  {
717  // TODO
718  throw NotImplemented("readPlain not implemented");
719 }

◆ readXML()

void MetaDataVec::readXML ( const FileName inFile,
const std::vector< MDLabel > *  desiredLabels = nullptr,
const String blockRegExp = DEFAULT_BLOCK_NAME,
bool  decomposeStack = true 
)

Read metadata from xml file

Definition at line 712 of file metadata_vec.cpp.

712  {
713  REPORT_ERROR(ERR_NOT_IMPLEMENTED, "readXML not implemented yet");
714 }
Case or algorithm not implemented yet.
Definition: xmipp_error.h:177
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211

◆ removeDuplicates()

void MetaDataVec::removeDuplicates ( MetaData MDin,
MDLabel  label = MDL_UNDEFINED 
)

Remove duplicate entries for attribute in label

Definition at line 755 of file metadata_vec.cpp.

755  {
756  *this = MDin; // FIXME: maybe join?
757  std::vector<MetaDataVecRow> new_rows;
758  for (const auto& row : this->_rows) {
759  if (!this->_contains(new_rows, row))
760  new_rows.emplace_back(row);
761  }
762  this->_rows = new_rows;
763 }
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool _contains(const std::vector< MetaDataVecRow > &, const MetaDataVecRow &) const

◆ removeLabel()

bool MetaDataVec::removeLabel ( const MDLabel  label)
overridevirtual

Remove a label from the metadata. The data is still in the table. If you want to remove the data, make a copy of the MetaData.

Implements MetaData.

Definition at line 414 of file metadata_vec.cpp.

414  {
415  if (this->_label_to_col[label] == -1)
416  return false;
417  int column = this->_label_to_col[label];
418 
419  for (auto& vecRow : this->_rows)
420  if (static_cast<int>(vecRow.size()) > column)
421  vecRow.erase(vecRow.begin()+column); // this is expensive
422 
423  // FIXME: test this properly
424  this->_label_to_col[label] = -1;
425  for (size_t i = 0; i < MDL_LAST_LABEL; i++) {
426  if (this->_label_to_col[i] > column) {
427  this->_label_to_col[i]--;
428  this->_col_to_label[this->_label_to_col[i]] = MDLabel(i);
429  }
430  }
431  this->_no_columns--;
432  return true;
433 }
size_t _no_columns
Definition: metadata_vec.h:51
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50
MDLabel

◆ removeObject()

bool MetaDataVec::removeObject ( size_t  id)
overridevirtual

Remove the object with this id. Returns true if the object was removed or false if the object did not exist

Implements MetaData.

Definition at line 475 of file metadata_vec.cpp.

475  {
476  int i = this->_rowIndex(id);
477  if (i < 0)
478  return false;
479 
480  this->_id_to_index.erase(id);
481  this->_rows.erase(this->_rows.begin()+i);
482 
483  for (size_t j = i; j < this->_rows.size(); j++)
484  this->_id_to_index[this->getRowId(j)]--;
485 
486  return true;
487 }
int _rowIndex(size_t id) const
#define i
std::unordered_map< size_t, size_t > _id_to_index
Definition: metadata_vec.h:52
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
#define j
size_t getRowId(const MetaDataVecRow &) const

◆ removeObjects() [1/3]

void MetaDataVec::removeObjects ( const std::vector< size_t > &  toRemove)
overridevirtual

Removes the collection of objects of given vector id's NOTE: The iterator will point to the first object after any of these operations

Implements MetaData.

Definition at line 489 of file metadata_vec.cpp.

489  {
490  for (size_t id : toRemove)
491  this->removeObject(id);
492 }
bool removeObject(size_t id) override

◆ removeObjects() [2/3]

int MetaDataVec::removeObjects ( )
overridevirtual

Removes objects from metadata. return the number of deleted rows if not query, all objectes are removed Queries can be used in the same way as in the importObjects function

Implements MetaData.

Definition at line 494 of file metadata_vec.cpp.

494  {
495  size_t count = this->size();
496  this->clear();
497  return count;
498 }
size_t size() const override
void clear() override

◆ removeObjects() [3/3]

int MetaDataVec::removeObjects ( const MDQuery )
overridevirtual

Removes objects from metadata. return the number of deleted rows if not query, all objectes are removed Queries can be used in the same way as in the importObjects function

Implements MetaData.

Definition at line 500 of file metadata_vec.cpp.

500  {
501  // FIXME: move this to MetaData?
502  std::vector<size_t> ids;
503  this->findObjects(ids, query);
504  this->removeObjects(ids);
505  return true;
506 }
virtual IdIteratorProxy< false > ids()
void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const override
int removeObjects() override

◆ renameColumn() [1/2]

void MetaDataVec::renameColumn ( MDLabel  oldLabel,
MDLabel  newLabel 
)
overridevirtual

Rename column.

Implements MetaData.

Definition at line 914 of file metadata_vec.cpp.

914  {
915  assert(!this->containsLabel(newLabel));
916  int labeloldi = this->_labelIndex(oldLabel);
917  if (labeloldi < 0)
918  throw ColumnDoesNotExist(oldLabel, getFilename());
919 
920  this->_label_to_col[newLabel] = labeloldi;
921  this->_label_to_col[oldLabel] = -1;
922  this->_col_to_label[labeloldi] = newLabel;
923 
924  for (auto& row : this->_rows) {
925  if (labeloldi < static_cast<int>(row.size()))
926  row[labeloldi].label = newLabel;
927  }
928 }
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
int _labelIndex(MDLabel label) const
bool containsLabel(const MDLabel label) const override
std::vector< MDLabel > _col_to_label
Definition: metadata_vec.h:50
virtual FileName getFilename() const

◆ renameColumn() [2/2]

void MetaDataVec::renameColumn ( const std::vector< MDLabel > &  oldLabel,
const std::vector< MDLabel > &  newLabel 
)
overridevirtual

Rename several columns. This is an expensive operations so if several columns need to be changed do it using this function instead one by one

Implements MetaData.

Definition at line 930 of file metadata_vec.cpp.

931  {
932  // TODO
933  throw NotImplemented("renameColumn not implemented");
934 }

◆ replace()

void MetaDataVec::replace ( const MDLabel  label,
const String oldStr,
const String newStr 
)

Replace an string in some column(label). The type of the column should be string. This function is a shortcut of the more genereal function operate

Definition at line 736 of file metadata_vec.cpp.

736  {
737  // TODO
738  throw NotImplemented("replace not implemented");
739 }

◆ selectPart()

void MetaDataVec::selectPart ( const MetaData mdIn,
size_t  startPosition,
size_t  numberOfObjects,
const MDLabel  sortLabel = MDL_OBJID 
)
overridevirtual

Select some part from Metadata. Select elements from input Metadata at some starting position if the numberOfObjects is -1, all objects will be returned from startPosition to the end.

Implements MetaData.

Definition at line 841 of file metadata_vec.cpp.

842  {
843  this->sort(mdIn, sortLabel, true, numberOfObjects, startPosition);
844 }
void sort(const MetaDataVec &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)

◆ selectRandomSubset()

void MetaDataVec::selectRandomSubset ( const MetaData mdIn,
size_t  numberOfObjects,
const MDLabel  sortLabel = MDL_OBJID 
)
overridevirtual

Select random subset

Implements MetaData.

Definition at line 836 of file metadata_vec.cpp.

836  {
837  // TODO
838  throw NotImplemented("selectRandomSubset not implemented");
839 }

◆ setColumnValues() [1/2]

void MetaDataVec::setColumnValues ( const std::vector< MDObject > &  valuesIn)
overridevirtual

Implements MetaData.

Definition at line 371 of file metadata_vec.cpp.

371  {
372  for (size_t i = 0; i < std::min(valuesIn.size(), this->_rows.size()); i++) {
373  int labelIndex = this->_labelIndex(valuesIn[i].label);
374  if (labelIndex < 0)
375  this->addLabel(valuesIn[i].label);
376  labelIndex = this->_labelIndex(valuesIn[i].label);
377  if (labelIndex < 0)
378  throw ColumnDoesNotExist(valuesIn[i].label, getFilename());
379  this->_expand(this->_rows[i], valuesIn[i].label);
380  this->_rows[i][labelIndex] = valuesIn[i];
381  }
382 }
void min(Image< double > &op1, const Image< double > &op2)
#define i
void _expand(MetaDataVecRow &, const MDLabel)
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool addLabel(const MDLabel label, int pos=-1) override
int _labelIndex(MDLabel label) const
virtual FileName getFilename() const

◆ setColumnValues() [2/2]

template<class T >
void MetaDataVec::setColumnValues ( const MDLabel  label,
const std::vector< T > &  valuesIn 
)
inline

Definition at line 210 of file metadata_vec.h.

210  {
211  return MetaData::setColumnValues(label, valuesIn);
212  }
void setColumnValues(const MDLabel label, const std::vector< T > &valuesIn)

◆ setRow()

bool MetaDataVec::setRow ( const MDRow row,
size_t  id 
)

Definition at line 384 of file metadata_vec.cpp.

384  {
385  this->_setRow(row, this->_rowIndexSafe(id));
386  return true;
387 }
void _setRow(const MDRow &row, size_t index)
size_t _rowIndexSafe(size_t id) const

◆ setValue() [1/2]

bool MetaDataVec::setValue ( const MDObject mdValueIn,
size_t  id 
)
virtual

This functions are using MDObject for set real values there is an explicit function signature foreach type supported in Metadata. This is done for some type checking of Metadata labels and values

Implements MetaData.

Definition at line 282 of file metadata_vec.cpp.

282  {
283  if (!this->containsLabel(mdValueIn.label))
284  this->addLabel(mdValueIn.label);
285 
286  MetaDataVecRow& row = this->_rows[this->_rowIndexSafe(id)];
287  this->_expand(row, mdValueIn.label);
288 
289  row[this->_labelIndex(mdValueIn.label)] = mdValueIn;
290  return true;
291 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
MDLabel label
void _expand(MetaDataVecRow &, const MDLabel)
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool addLabel(const MDLabel label, int pos=-1) override
int _labelIndex(MDLabel label) const
bool containsLabel(const MDLabel label) const override
size_t _rowIndexSafe(size_t id) const

◆ setValue() [2/2]

template<class T >
bool MetaDataVec::setValue ( const MDLabel  label,
const T &  valueIn,
size_t  id 
)
inline

Definition at line 173 of file metadata_vec.h.

173  {
174  return MetaData::setValue(label, valueIn, id);
175  }
bool setValue(const MDLabel label, const T &valueIn, size_t id)

◆ setValueCol() [1/2]

bool MetaDataVec::setValueCol ( const MDObject mdValueIn)
overridevirtual

Set the value of all objects in an specified column (both value and column are specified in mdValueIn)

Implements MetaData.

Definition at line 270 of file metadata_vec.cpp.

270  {
271  const auto &label = mdValueIn.label;
272  int labelIndex = this->_labelIndex(label);
273  if (labelIndex < 0) {
274  this->addLabel(label);
275  labelIndex = this->_labelIndex(label);
276  for (auto &r : _rows) _expand(r, labelIndex);
277  }
278  for (auto &r : _rows) r[labelIndex] = mdValueIn;
279  return true;
280 }
MDLabel label
void _expand(MetaDataVecRow &, const MDLabel)
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
bool addLabel(const MDLabel label, int pos=-1) override
int _labelIndex(MDLabel label) const

◆ setValueCol() [2/2]

template<class T >
bool MetaDataVec::setValueCol ( const MDLabel  label,
const T &  valueIn 
)
inline

Definition at line 160 of file metadata_vec.h.

160  {
161  return MetaData::setValueCol(label, valueIn);
162  }
virtual bool setValueCol(const MDObject &mdValueIn)=0

◆ size()

size_t MetaDataVec::size ( void  ) const
overridevirtual

Number of objects contained in the metadata.

Implements MetaData.

Definition at line 393 of file metadata_vec.cpp.

393  {
394  return this->_rows.size();
395 }
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48

◆ sort() [1/2]

void MetaDataVec::sort ( const MetaDataVec MDin,
const MDLabel  sortLabel,
bool  asc = true,
int  limit = -1,
int  offset = 0 
)

Definition at line 791 of file metadata_vec.cpp.

791  {
792  *this = MDin;
793 
794  int label_index = this->_labelIndex(sortLabel);
795  if (label_index > -1) {
796  std::sort(this->_rows.begin(), this->_rows.end(),
797  [label_index, asc](const MetaDataVecRow &a, const MetaDataVecRow &b) {
798  if (asc)
799  return a[label_index] < b[label_index];
800  return a[label_index] > b[label_index];
801  }
802  );
803 
804  this->_rows.erase(this->_rows.begin(), this->_rows.begin()+offset);
805  if ((limit > 0) && (limit < this->_rows.size()))
806  this->_rows.erase(this->_rows.begin()+limit, this->_rows.end());
807 
808  this->_recalc_id_to_index();
809 
810  }
811 }
std::vector< MDObject > MetaDataVecRow
Definition: metadata_vec.h:37
doublereal * b
void _recalc_id_to_index()
void sort(struct DCEL_T *dcel)
Definition: sorting.cpp:18
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
int _labelIndex(MDLabel label) const
doublereal * a

◆ sort() [2/2]

void MetaDataVec::sort ( MetaDataVec MDin,
const String sortLabel,
bool  asc = true,
int  limit = -1,
int  offset = 0 
)

Definition at line 813 of file metadata_vec.cpp.

813  {
814  // TODO
815  throw NotImplemented("sort not implemented");
816 }

◆ split()

void MetaDataVec::split ( size_t  n,
std::vector< MetaDataVec > &  results,
const MDLabel  sortLabel = MDL_OBJID 
) const

Split Metadata in several Metadatas. The Metadata will be divided in 'n' almost equally parts and the result will be a vector of Metadatas. The "calling" Metadata will no be modified.

// Divide the images metadata in 10 metadatas.
std::vector<MetaData> imagesGroups;
imageMD.split(10, imagesGroups);

Definition at line 818 of file metadata_vec.cpp.

818  {
819  if (parts > this->size())
820  REPORT_ERROR(ERR_MD, "MetaDataDb::split: Couldn't split a metadata in more parts than its size");
821 
822  MetaDataVec sorted;
823  sorted.sort(*this, sortLabel);
824 
825  results.clear();
826  results.resize(parts);
827  for (size_t i = 0; i < parts; i++) {
828  MetaDataVec &md = results[i];
829  size_t firsti, lasti;
830  divide_equally(sorted.size(), parts, i, firsti, lasti);
831  for (size_t j = firsti; j <= lasti; j++)
832  md.addRow(sorted.getRowVec(sorted.getRowId(j)));
833  }
834 }
void sort(const MetaDataVec &MDin, const MDLabel sortLabel, bool asc=true, int limit=-1, int offset=0)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
size_t divide_equally(size_t N, size_t size, size_t rank, size_t &first, size_t &last)
size_t size() const override
#define i
size_t addRow(const MDRow &row) override
MetaData error.
Definition: xmipp_error.h:154
#define j
size_t getRowId(const MetaDataVecRow &) const
MDRowVec getRowVec(size_t id)

◆ write() [1/2]

void MetaDataVec::write ( const FileName outFile,
WriteModeMetaData  mode = MD_OVERWRITE 
) const
virtual

Write metadata to disk. Guess blockname from filename

outFilename="first@md1.doc" -> filename = md1.doc, blockname = first

Implements MetaData.

Definition at line 140 of file metadata_vec.cpp.

140  {
141  String blockName;
142  FileName extFile;
143  FileName _outFile;
144 
145  blockName = outFile.getBlockName();
146  if (blockName.empty())
147  blockName = DEFAULT_BLOCK_NAME;
148  _outFile = outFile.removeBlockName();
149  extFile = outFile.getExtension();
150 
151  if (extFile == "xml") {
152  writeXML(_outFile, blockName, mode);
153  } else if (extFile == "sqlite") {
154  throw NotImplemented("Writing to .sqlite file from MetaDataVec not implemented!");
155  } else {
156  writeStar(_outFile, blockName, mode);
157  }
158 }
String getBlockName() const
virtual void writeStar(const FileName &outFile, const String &blockName, WriteModeMetaData mode) const
String getExtension() const
void mode
FileName removeBlockName() const
std::string String
Definition: xmipp_strings.h:34
void writeXML(const FileName fn, const FileName blockname, WriteModeMetaData mode) const override
#define DEFAULT_BLOCK_NAME
Definition: metadata_base.h:60

◆ write() [2/2]

void MetaDataVec::write ( std::ostream &  os,
const String blockName = "",
WriteModeMetaData  mode = MD_OVERWRITE 
) const
virtual

Write metadata to out stream

Implements MetaData.

Definition at line 629 of file metadata_vec.cpp.

629  {
630  if (mode==MD_OVERWRITE)
631  os << FileNameVersion << " * "// << (isColumnFormat ? "column" : "row")
632  << '\n' // write which type of format (column or row) and the path;
633  << WordWrap(this->_comment, line_max); // write md comment in the 2nd comment line of header
634 
635  // write data block
636  String _szBlockName("data_");
637  _szBlockName += blockName;
638 
639  if (this->isColumnFormat()) {
640  // write md columns in 3rd comment line of the header
641  os << _szBlockName << '\n';
642  os << "loop_" << '\n';
643  for (size_t i = 0; i < MDL_LAST_LABEL; i++)
644  if ((i != MDL_STAR_COMMENT) && (i != MDL_OBJID) && (this->_label_to_col[i] > -1))
645  os << " _" << MDL::label2Str(static_cast<MDLabel>(i)) << '\n';
646  _writeRows(os);
647 
648  //Put the activeObject to the first, if exists
649  } else { // row format
650  os << _szBlockName << '\n';
651 
652  // Print single object
653  assert(this->_rows.size() == 1);
654 
655  for (size_t i = 0; i < MDL_LAST_LABEL; i++) {
656  const MDLabel label = static_cast<MDLabel>(i);
657  if ((label != MDL_STAR_COMMENT) && (label != MDL_OBJID) && (this->_label_to_col[i] > -1)) {
658  os << " _" << MDL::label2Str(label) << " ";
659  if (this->_labelIndex(label) < static_cast<int>(this->_rows[0].size()))
660  this->_getObject(this->_rows[0], label).toStream(os);
661  else
662  throw ColumnDoesNotExist(label, getFilename());
663  os << '\n';
664  }
665  }
666  }
667 }
object id (int), NOTE: This label is special and shouldn&#39;t be used
virtual bool isColumnFormat() const
String WordWrap(const String &inputString, size_t lineLength)
String FileNameVersion
String _comment
size_t size() const override
#define i
std::array< int, MDL_LAST_LABEL > _label_to_col
Definition: metadata_vec.h:49
void _writeRows(std::ostream &os) const override
void mode
std::vector< MetaDataVecRow > _rows
Definition: metadata_vec.h:48
const MDObject & _getObject(size_t i, MDLabel label) const
int _labelIndex(MDLabel label) const
std::string String
Definition: xmipp_strings.h:34
#define line_max
comment is wraped in char_max length lines
void toStream(std::ostream &os, bool withFormat=false, bool isSql=false, bool escape=true) const
static String label2Str(const MDLabel &label)
MDLabel
virtual FileName getFilename() const
A comment for this object /*** NOTE THIS IS A SPECIAL CASE AND SO IS TREATED ***/.

◆ writeText()

void MetaDataVec::writeText ( const FileName  fn,
const std::vector< MDLabel > *  desiredLabels 
) const
overridevirtual

Write metadata in text file as plain data without header.

Implements MetaData.

Definition at line 165 of file metadata_vec.cpp.

165  {
166  // FIXME: implement
167  throw NotImplemented("writeText not immplemented");
168 }

◆ writeXML()

void MetaDataVec::writeXML ( const FileName  fn,
const FileName  blockname,
WriteModeMetaData  mode 
) const
overridevirtual

Export medatada to xml file.

Implements MetaData.

Definition at line 160 of file metadata_vec.cpp.

160  {
161  // FIXME: implement
162  throw NotImplemented("writeXML not implemented");
163 }

Member Data Documentation

◆ _col_to_label

std::vector<MDLabel> MetaDataVec::_col_to_label
protected

Definition at line 50 of file metadata_vec.h.

◆ _id_to_index

std::unordered_map<size_t, size_t> MetaDataVec::_id_to_index
protected

Definition at line 52 of file metadata_vec.h.

◆ _label_to_col

std::array<int, MDL_LAST_LABEL> MetaDataVec::_label_to_col
protected

Definition at line 49 of file metadata_vec.h.

◆ _next_id

size_t MetaDataVec::_next_id = 1
protected

Definition at line 53 of file metadata_vec.h.

◆ _no_columns

size_t MetaDataVec::_no_columns = 0
protected

Definition at line 51 of file metadata_vec.h.

◆ _rows

std::vector<MetaDataVecRow> MetaDataVec::_rows
protected

Definition at line 48 of file metadata_vec.h.


The documentation for this class was generated from the following files: