Xmipp  v3.23.11-Nereus
rerunable_program.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: David Strelak (davidstrelak@gmail.com)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #pragma once
27 
28 #include "metadata_db.h"
29 #include "metadata_vec.h"
30 #include "xmipp_filename.h"
31 
38 class Rerunable {
39 protected:
43  Rerunable(const FileName &fn) : fnDone(fn) {}
44 
49  virtual void createWorkFiles(bool resume, MetaData *md) {
50  if (nullptr == md) {
52  "Null pointer passed. "
53  "If you can reproduce this, please contact developers.");
54  }
55  if (resume && fnDone.exists()) {
56  MetaDataDb done(fnDone);
57  auto *toDo = dynamic_cast<MetaDataDb *>(md);
58  if (nullptr == toDo) {
59  MetaDataDb tmp(*md);
60  tmp.subtraction(done, MDL_IMAGE);
61  *md = tmp;
62  } else {
63  toDo->subtraction(done, MDL_IMAGE);
64  }
65  } else // if not exists create metadata only with headers
66  {
67  MetaDataVec mdDone;
68  for (const auto &l : this->getLabelsForEmpty()) {
69  mdDone.addLabel(l);
70  }
71  mdDone.write(fnDone);
72  }
73  }
74 
78  virtual std::vector<MDLabel> getLabelsForEmpty() = 0;
79 
80  const FileName &getFileName() const { return this->fnDone; }
81 
82  void setFileName(const FileName &fn) { fnDone = fn; }
83 
84 private:
85  FileName fnDone;
86 };
void subtraction(const MetaDataDb &mdIn, const MDLabel label)
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
void write(const FileName &outFile, WriteModeMetaData mode=MD_OVERWRITE) const
void setFileName(const FileName &fn)
const FileName & getFileName() const
virtual void createWorkFiles(bool resume, MetaData *md)
MetaData error.
Definition: xmipp_error.h:154
bool exists() const
bool addLabel(const MDLabel label, int pos=-1) override
Rerunable(const FileName &fn)
virtual std::vector< MDLabel > getLabelsForEmpty()=0
Name of an image (std::string)