Belle II Software  release-05-02-19
FileMetaData.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010-2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Thomas Kuhr, Martin Ritter *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <boost/python/class.hpp>
12 #include <boost/python/copy_const_reference.hpp>
13 
14 #include <framework/dataobjects/FileMetaData.h>
15 #include <framework/utilities/HTML.h>
16 #include <framework/utilities/KeyValuePrinter.h>
17 
18 #include <boost/algorithm/string.hpp>
19 
20 #include <nlohmann/json.hpp>
21 
22 #include <iostream>
23 
24 using namespace std;
25 using namespace Belle2;
26 using namespace boost::python;
27 
28 FileMetaData::FileMetaData() :
29  m_lfn(""), m_nEvents(0), m_experimentLow(0), m_runLow(0), m_eventLow(0),
30  m_experimentHigh(0), m_runHigh(0), m_eventHigh(0), m_date(""), m_site(""), m_user(""), m_release(""),
31  m_steering(""), m_isMC(true), m_mcEvents(0)
32 {
33 }
34 
35 bool FileMetaData::containsEvent(int experiment, int run, unsigned int event) const
36 {
37  if (experiment < m_experimentLow) return false;
38  if (experiment == m_experimentLow) {
39  if (run < m_runLow) return false;
40  if ((run == m_runLow) && (event < m_eventLow)) return false;
41  }
42  if (experiment > m_experimentHigh) return false;
43  if (experiment == m_experimentHigh) {
44  if (run > m_runHigh) return false;
45  if ((run == m_runHigh) && (event > m_eventHigh)) return false;
46  }
47  return true;
48 }
49 
51 {
52  //Note: these can only be used with update_file_metadata(), PyROOT is the more common interface
53  class_<FileMetaData>("FileMetaData")
54  .def("get_lfn", &FileMetaData::getLfn, return_value_policy<copy_const_reference>())
55  .def("get_nevents", &FileMetaData::getNEvents)
56  .def("get_experiment_low", &FileMetaData::getExperimentLow)
57  .def("get_run_low", &FileMetaData::getRunLow)
58  .def("get_event_low", &FileMetaData::getEventLow)
59  .def("get_experiment_high", &FileMetaData::getExperimentHigh)
60  .def("get_run_high", &FileMetaData::getRunHigh)
61  .def("get_event_high", &FileMetaData::getEventHigh)
62  .def("get_n_parents", &FileMetaData::getNParents)
63  .def("get_parent", &FileMetaData::getParent, return_value_policy<copy_const_reference>())
64  .def("get_date", &FileMetaData::getDate, return_value_policy<copy_const_reference>())
65  .def("get_site", &FileMetaData::getSite, return_value_policy<copy_const_reference>())
66  .def("get_user", &FileMetaData::getUser, return_value_policy<copy_const_reference>())
67  .def("get_random_seed", &FileMetaData::getRandomSeed, return_value_policy<copy_const_reference>())
68  .def("get_release", &FileMetaData::getRelease, return_value_policy<copy_const_reference>())
69  .def("get_steering", &FileMetaData::getSteering, return_value_policy<copy_const_reference>())
70  .def("is_mc", &FileMetaData::isMC)
71  .def("get_mc_events", &FileMetaData::getMcEvents)
72  .def("get_global_tag", &FileMetaData::getDatabaseGlobalTag, return_value_policy<copy_const_reference>())
73  .def("get_data_description", &FileMetaData::getDataDescription, return_value_policy<copy_const_reference>())
74  .def("set_lfn", &FileMetaData::setLfn);
75 }
76 
77 
78 void FileMetaData::Print(Option_t* option) const
79 {
80  if (option && (option == std::string("steering"))) {
81  cout << m_steering << endl;
82  return;
83  } else if (option && (option == std::string("json"))) {
84  cout << getJsonStr() << endl;
85  return;
86  }
87  const bool all = (option && option == std::string("all"));
88  KeyValuePrinter printer(false);
89  printer.put("LFN", m_lfn);
90  printer.put("nEvents", m_nEvents);
91  printer.put("range", std::to_string(m_experimentLow) + "/" + std::to_string(m_runLow) + "/" + std::to_string(m_eventLow)
92  + " - " + std::to_string(m_experimentHigh) + "/" + std::to_string(m_runHigh) + "/" + std::to_string(m_eventHigh));
93  printer.put("parents", m_parentLfns);
94  if (all) {
95  printer.put("date", m_date);
96  printer.put("site", m_site);
97  printer.put("user", m_user);
98  printer.put("randomSeed", m_randomSeed);
99  printer.put("release", m_release);
100  printer.put("isMC", m_isMC);
101  printer.put("mcEvents", m_mcEvents);
102  printer.put("globalTag", m_databaseGlobalTag);
103  printer.put("dataDescription", m_dataDescription);
104  }
105  std::cout << "=== FileMetaData ===\n";
106  std::cout << printer.string();
107 }
108 
109 bool FileMetaData::read(std::istream& input, std::string& physicalFileName)
110 {
111  physicalFileName = "";
112  if (input.eof()) return false;
113 
114  std::string line;
115  std::getline(input, line);
116  boost::algorithm::trim(line);
117  if (line.compare("<File>") != 0) return false;
118 
119  while (!input.eof()) {
120  std::getline(input, line);
121  boost::algorithm::trim(line);
122  if (line.compare("</File>") == 0) return true;
123 
124  int pos = line.find('>') + 1;
125  std::string tag = line.substr(0, pos);
126  std::string value = line.substr(pos, line.rfind('<') - pos);
127  if (tag.compare("<LFN>") == 0) {
128  m_lfn = HTML::unescape(value);
129  } else if (tag.compare("<PFN>") == 0) {
130  physicalFileName = HTML::unescape(value);
131  } else if (tag.compare("<ExperimentLow>") == 0) {
132  m_experimentLow = stoi(value);
133  } else if (tag.compare("<RunLow>") == 0) {
134  m_runLow = stoi(value);
135  } else if (tag.compare("<EventLow>") == 0) {
136  m_eventLow = stoi(value);
137  } else if (tag.compare("<ExperimentHigh>") == 0) {
138  m_experimentHigh = stoi(value);
139  } else if (tag.compare("<RunHigh>") == 0) {
140  m_runHigh = stoi(value);
141  } else if (tag.compare("<EventHigh>") == 0) {
142  m_eventHigh = stoi(value);
143  } else if (tag.compare("<Parents>") == 0) {
144  pos = value.find(',');
145  while (pos > 0) {
146  m_parentLfns.push_back(HTML::unescape(value.substr(0, pos)));
147  value.erase(0, pos + 1);
148  pos = value.find(',');
149  }
150  m_parentLfns.push_back(HTML::unescape(value));
151  }
152  }
153 
154  return false;
155 }
156 
157 bool FileMetaData::write(std::ostream& output, const std::string& physicalFileName) const
158 {
159  output << " <File>\n";
160  output << " <LFN>" << HTML::escape(m_lfn) << "</LFN>\n";
161  if (!physicalFileName.empty()) {
162  output << " <PFN>" << HTML::escape(physicalFileName) << "</PFN>\n";
163  }
164  output << " <ExperimentLow>" << m_experimentLow << "</ExperimentLow>\n";
165  output << " <RunLow>" << m_runLow << "</RunLow>\n";
166  output << " <EventLow>" << m_eventLow << "</EventLow>\n";
167  output << " <ExperimentHigh>" << m_experimentHigh << "</ExperimentHigh>\n";
168  output << " <RunHigh>" << m_runHigh << "</RunHigh>\n";
169  output << " <EventHigh>" << m_eventHigh << "</EventHigh>\n";
170  if (!m_parentLfns.empty()) {
171  output << " <Parents>" << HTML::escape(m_parentLfns[0]);
172  for (unsigned int parent = 1; parent < m_parentLfns.size(); parent++) {
173  output << "," << HTML::escape(m_parentLfns[parent]);
174  }
175  output << "</Parents>\n";
176  }
177  output << " </File>\n";
178 
179  return true;
180 }
181 
182 std::string FileMetaData::getJsonStr() const
183 {
184  nlohmann::json metadata = {
185  {"LFN", m_lfn},
186  {"nEvents", m_nEvents},
187  {"experimentLow", m_experimentLow},
188  {"runLow", m_runLow},
189  {"eventLow", m_eventLow},
190  {"experimentHigh", m_experimentHigh},
191  {"runHigh", m_runHigh},
192  {"eventHigh", m_eventHigh},
193  {"parents", m_parentLfns},
194  {"date", m_date},
195  {"site", m_site},
196  {"user", m_user},
197  {"randomSeed", m_randomSeed},
198  {"release", m_release},
199  {"isMC", m_isMC},
200  {"mcEvents", m_mcEvents},
201  {"globalTag", m_databaseGlobalTag},
202  {"dataDescription", m_dataDescription},
203  {"steering", m_steering}
204  };
205  return metadata.dump(2);
206 }
Belle2::FileMetaData::m_randomSeed
std::string m_randomSeed
The random seed used when producing the file.
Definition: FileMetaData.h:276
Belle2::FileMetaData::m_runLow
int m_runLow
Lowest run number.
Definition: FileMetaData.h:258
Belle2::KeyValuePrinter
create human-readable or JSON output for key value pairs.
Definition: KeyValuePrinter.h:56
Belle2::FileMetaData::m_experimentLow
int m_experimentLow
Lowest experiment number.
Definition: FileMetaData.h:256
Belle2::FileMetaData::write
bool write(std::ostream &output, const std::string &physicalFileName) const
Write file meta data in xml format to the output stream.
Definition: FileMetaData.cc:157
Belle2::FileMetaData::m_eventLow
unsigned int m_eventLow
Lowest event number in lowest run.
Definition: FileMetaData.h:260
Belle2::FileMetaData::getSite
const std::string & getSite() const
Site where the file was created getter.
Definition: FileMetaData.h:105
Belle2::FileMetaData::getMcEvents
unsigned int getMcEvents() const
Number of generated events getter.
Definition: FileMetaData.h:129
Belle2::FileMetaData::isMC
bool isMC() const
Is it generated data?.
Definition: FileMetaData.h:125
Belle2::FileMetaData::m_mcEvents
unsigned int m_mcEvents
Number of generated events, 0 for real data.
Definition: FileMetaData.h:284
Belle2::FileMetaData::read
bool read(std::istream &input, std::string &physicalFileName)
Read file meta data in xml format from the input stream.
Definition: FileMetaData.cc:109
Belle2::KeyValuePrinter::put
void put(const std::string &key, const T &value)
Add one key-value pair.
Definition: KeyValuePrinter.h:79
Belle2::FileMetaData::getDatabaseGlobalTag
const std::string & getDatabaseGlobalTag() const
Get the database global tag used when creating this file.
Definition: FileMetaData.h:136
Belle2::FileMetaData::getExperimentLow
int getExperimentLow() const
Lowest experiment number getter.
Definition: FileMetaData.h:55
Belle2::FileMetaData::m_runHigh
int m_runHigh
Highest run number.
Definition: FileMetaData.h:264
Belle2::FileMetaData::containsEvent
bool containsEvent(int experiment, int run, unsigned int event) const
Check whether the given event is in the covered range of events.
Definition: FileMetaData.cc:35
Belle2::FileMetaData::getJsonStr
std::string getJsonStr() const
Get a json representation.
Definition: FileMetaData.cc:182
Belle2::FileMetaData::getRandomSeed
const std::string & getRandomSeed() const
Random seed getter.
Definition: FileMetaData.h:113
Belle2::FileMetaData::m_steering
std::string m_steering
The steering file content.
Definition: FileMetaData.h:280
Belle2::FileMetaData::getEventHigh
unsigned int getEventHigh() const
Highest event number in highest run getter.
Definition: FileMetaData.h:75
Belle2::FileMetaData::getParent
const std::string & getParent(int iParent) const
Get LFN of parent file.
Definition: FileMetaData.h:98
Belle2::FileMetaData::m_dataDescription
std::map< std::string, std::string > m_dataDescription
key-value store to describe the data.
Definition: FileMetaData.h:288
Belle2::FileMetaData::m_databaseGlobalTag
std::string m_databaseGlobalTag
Global tag in the database used for production of this file.
Definition: FileMetaData.h:286
Belle2::FileMetaData::getRunHigh
int getRunHigh() const
Highest run number getter.
Definition: FileMetaData.h:71
Belle2::KeyValuePrinter::string
std::string string() const
Return completed string.
Definition: KeyValuePrinter.h:71
Belle2::FileMetaData::getExperimentHigh
int getExperimentHigh() const
Highest experiment number getter.
Definition: FileMetaData.h:67
Belle2::FileMetaData::setLfn
void setLfn(const std::string &lfn)
Setter for LFN.
Definition: FileMetaData.h:145
Belle2::FileMetaData::getRunLow
int getRunLow() const
Lowest run number getter.
Definition: FileMetaData.h:59
Belle2::FileMetaData::getNEvents
unsigned int getNEvents() const
Number of events getter.
Definition: FileMetaData.h:51
Belle2::FileMetaData::m_nEvents
unsigned int m_nEvents
Number of events.
Definition: FileMetaData.h:254
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::FileMetaData::m_date
std::string m_date
File creation date and time (UTC).
Definition: FileMetaData.h:270
Belle2::FileMetaData::getEventLow
unsigned int getEventLow() const
Lowest event number in lowest run getter.
Definition: FileMetaData.h:63
Belle2::FileMetaData::getDataDescription
const std::map< std::string, std::string > & getDataDescription() const
get data description.
Definition: FileMetaData.h:139
Belle2::FileMetaData::getNParents
int getNParents() const
Get number of parent files.
Definition: FileMetaData.h:91
Belle2::HTML::escape
std::string escape(const std::string &str)
Convert &, <, > etc.
Definition: HTML.cc:153
Belle2::FileMetaData::m_lfn
std::string m_lfn
Logical file name.
Definition: FileMetaData.h:252
Belle2::FileMetaData::Print
virtual void Print(Option_t *option="") const override
Print the content of the meta data object.
Definition: FileMetaData.cc:78
Belle2::FileMetaData::m_experimentHigh
int m_experimentHigh
Highest experiment number.
Definition: FileMetaData.h:262
Belle2::FileMetaData::m_eventHigh
unsigned int m_eventHigh
Highest event number in highest run.
Definition: FileMetaData.h:266
Belle2::FileMetaData::m_parentLfns
std::vector< std::string > m_parentLfns
LFNs of parent files.
Definition: FileMetaData.h:268
Belle2::FileMetaData::getDate
const std::string & getDate() const
File creation date and time getter (UTC)
Definition: FileMetaData.h:101
Belle2::FileMetaData::m_site
std::string m_site
Site where the file was created.
Definition: FileMetaData.h:272
Belle2::FileMetaData::m_release
std::string m_release
Software release version.
Definition: FileMetaData.h:278
Belle2::FileMetaData::m_isMC
bool m_isMC
Is it generated or real data?.
Definition: FileMetaData.h:282
Belle2::HTML::unescape
std::string unescape(const std::string &str)
inverse of escape()
Definition: HTML.cc:163
Belle2::FileMetaData::getSteering
const std::string & getSteering() const
Steering file content getter.
Definition: FileMetaData.h:121
Belle2::FileMetaData::exposePythonAPI
static void exposePythonAPI()
Exposes methods of the FileMetaData class to Python.
Definition: FileMetaData.cc:50
Belle2::FileMetaData::getRelease
const std::string & getRelease() const
Software release version getter.
Definition: FileMetaData.h:117
Belle2::FileMetaData::getLfn
const std::string & getLfn() const
Logical file name getter.
Definition: FileMetaData.h:47
Belle2::FileMetaData::m_user
std::string m_user
User who created the file.
Definition: FileMetaData.h:274
Belle2::FileMetaData::getUser
const std::string & getUser() const
User who created the file getter.
Definition: FileMetaData.h:109