Project
Loading...
Searching...
No Matches
DataInputDirector.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#ifndef O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
12#define O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
13
14#include "TFile.h"
15
19
20#include <arrow/filesystem/filesystem.h>
21#include <arrow/dataset/dataset.h>
22
23#include <regex>
24#include <stdexcept>
25#include <vector>
26#include "rapidjson/fwd.h"
27
29{
30class Monitoring;
31}
32
33namespace o2::framework
34{
35
36class InvalidAODReadError : public std::runtime_error
37{
38 public:
39 using std::runtime_error::runtime_error;
40};
41
43 std::string fileName;
45 std::vector<uint64_t> listOfTimeFrameNumbers;
46 std::vector<bool> alreadyRead;
47 uint64_t invalidReadSkipped = 0;
48};
49
50FileNameHolder makeFileNameHolder(std::string fileName);
51
53 o2::monitoring::Monitoring* monitoring = nullptr;
55 std::string parentFileReplacement = "";
56 std::vector<std::pair<std::string, int>> parentLevelToOrigin = {};
57 // Optional registry of pre-opened TFiles (keyed by name) used to bypass
58 // TFile::Open for testing with in-memory TMemFile instances.
59 std::vector<std::pair<std::string, TFile*>> openFiles = {};
60
61 int levelForOrigin(std::string_view origin) const
62 {
63 for (auto& [o, level] : parentLevelToOrigin) {
64 if (o == origin) {
65 return level;
66 }
67 }
68 return -1;
69 }
70};
71
73{
77
78 public:
79 std::string tablename = "";
80 std::string treename = "";
81 std::shared_ptr<data_matcher::DataDescriptorMatcher> matcher;
82
83 DataInputDescriptor(bool alienSupport, int level, DataInputDirectorContext& context);
85
86 void printOut() const;
87
88 // setters
89 void setInputfilesFile(std::string dffn) { minputfilesFile = dffn; }
90 void setInputfilesFile(std::string* dffnptr) { minputfilesFilePtr = dffnptr; }
91 void setFilenamesRegex(std::string fn) { mFilenameRegex = fn; }
92 void setFilenamesRegex(std::string* fnptr) { mFilenameRegexPtr = fnptr; }
93
94 void setDefaultInputfiles(std::vector<FileNameHolder> difnptr) { mdefaultFilenamesPtr = difnptr; }
95
97 int fillInputfiles();
98 bool setFile(int counter, int wantedParentLevel, std::string_view wantedOrigin);
99
100 // getters
101 std::string getInputfilesFilename() const;
102 std::string getFilenamesRegexString() const;
103 std::regex getFilenamesRegex();
104 int getNumberInputfiles() { return mfilenames.size(); }
105 int getNumberTimeFrames() const { return mtotalNumberTimeFrames; }
106 int findDFNumber(int file, std::string dfName);
107
108 uint64_t getTimeFrameNumber(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
109 arrow::dataset::FileSource getFileFolder(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
110 uint64_t markTimeFrameSkipped(int numTF);
111 // Open the current file to populate the parent map, then return the parent descriptor and
112 // the TF index within it that corresponds to numTF at this level. Returns {nullptr, -1} on failure.
113 std::pair<std::shared_ptr<DataInputDescriptor>, int> navigateToLevel(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
114 std::shared_ptr<DataInputDescriptor> getParentFile(int counter, int numTF, std::string treename, int wantedParentLevel, std::string_view wantedOrigin);
117
118 bool readTree(DataAllocator& outputs, header::DataHeader dh, int counter, int numTF, std::string treename, size_t& totalSizeCompressed, size_t& totalSizeUncompressed);
119
120 void printFileOpening();
121 void printFileStatistics();
122 void closeInputFile();
123 bool isAlienSupportOn() { return mAlienSupport; }
124
125 private:
127 std::string minputfilesFile;
128 std::string* minputfilesFilePtr = nullptr;
129 std::string mFilenameRegex;
130 std::string* mFilenameRegexPtr = nullptr;
131 std::vector<FileNameHolder> mfilenames;
132 std::vector<FileNameHolder> mdefaultFilenamesPtr;
133 std::shared_ptr<arrow::fs::FileSystem> mCurrentFilesystem;
134 int mCurrentFileID = -1;
135 bool mAlienSupport = false;
136
137 DataInputDirectorContext& mContext;
138 TMap* mParentFileMap = nullptr;
139 std::shared_ptr<DataInputDescriptor> mParentFile = nullptr;
140 int mLevel = 0; // level of parent files
141
142 int mtotalNumberTimeFrames = 0;
143
144 uint64_t mIOTime = 0;
145 uint64_t mCurrentFileStartedAt = 0;
146};
147
149{
153
154 public:
155 DataInputDirector(std::vector<std::string> inputFiles, DataInputDirectorContext&& context);
157
158 void reset();
159 void printOut();
160 bool atEnd(int counter);
161
162 // setters
163 void setInputfilesFile(std::string iffn) { minputfilesFile = iffn; }
164 void setFilenamesRegex(std::string dfn) { mFilenameRegex = dfn; }
165 bool readJson(std::string const& fnjson);
166 void closeInputFiles();
167
168 // getters
170 int getNumberInputDescriptors() { return mdataInputDescriptors.size(); }
172
173 bool readTree(DataAllocator& outputs, header::DataHeader dh, int counter, int numTF, size_t& totalSizeCompressed, size_t& totalSizeUncompressed, bool wasAOD);
174 uint64_t getTimeFrameNumber(header::DataHeader dh, int counter, int numTF);
175 arrow::dataset::FileSource getFileFolder(header::DataHeader dh, int counter, int numTF);
176 void markTimeFrameSkipped(header::DataHeader dh, int numTF);
178
181
183
184 private:
186 std::string minputfilesFile;
187 std::string* const minputfilesFilePtr = &minputfilesFile;
188 std::string mFilenameRegex;
189 std::string* const mFilenameRegexPtr = &mFilenameRegex;
190 std::shared_ptr<DataInputDescriptor> mdefaultDataInputDescriptor = nullptr;
191 std::vector<FileNameHolder> mdefaultInputFiles;
192 std::vector<DataInputDescriptor> mdataInputDescriptors;
193
194 bool mDebugMode = false;
195 bool mAlienSupport = false;
196
197 bool readJsonDocument(rapidjson::Document* doc);
198 bool isValid();
199};
200
201} // namespace o2::framework
202
203#endif // O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
header::DataOrigin origin
o2::monitoring::Monitoring Monitoring
uint64_t getTimeFrameNumber(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
std::shared_ptr< DataInputDescriptor > getParentFile(int counter, int numTF, std::string treename, int wantedParentLevel, std::string_view wantedOrigin)
bool readTree(DataAllocator &outputs, header::DataHeader dh, int counter, int numTF, std::string treename, size_t &totalSizeCompressed, size_t &totalSizeUncompressed)
arrow::dataset::FileSource getFileFolder(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
void setDefaultInputfiles(std::vector< FileNameHolder > difnptr)
std::shared_ptr< data_matcher::DataDescriptorMatcher > matcher
void setInputfilesFile(std::string dffn)
void setInputfilesFile(std::string *dffnptr)
void setFilenamesRegex(std::string *fnptr)
void addFileNameHolder(FileNameHolder fn)
bool setFile(int counter, int wantedParentLevel, std::string_view wantedOrigin)
int findDFNumber(int file, std::string dfName)
DataInputDescriptor(DataInputDescriptor const &)=default
std::pair< std::shared_ptr< DataInputDescriptor >, int > navigateToLevel(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
DataInputDescriptor * getDataInputDescriptor(header::DataHeader dh)
arrow::dataset::FileSource getFileFolder(header::DataHeader dh, int counter, int numTF)
void setInputfilesFile(std::string iffn)
int getTimeFramesInFile(header::DataHeader dh, int counter)
uint64_t getTimeFrameNumber(header::DataHeader dh, int counter, int numTF)
void markTimeFrameSkipped(header::DataHeader dh, int numTF)
int getLevelForOrigin(header::DataOrigin origin) const
void setFilenamesRegex(std::string dfn)
bool readJson(std::string const &fnjson)
bool readTree(DataAllocator &outputs, header::DataHeader dh, int counter, int numTF, size_t &totalSizeCompressed, size_t &totalSizeUncompressed, bool wasAOD)
GLint level
Definition glcorearb.h:275
GLuint counter
Definition glcorearb.h:3987
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
FileNameHolder makeFileNameHolder(std::string fileName)
o2::monitoring::Monitoring * monitoring
std::vector< std::pair< std::string, int > > parentLevelToOrigin
std::vector< std::pair< std::string, TFile * > > openFiles
int levelForOrigin(std::string_view origin) const
std::vector< uint64_t > listOfTimeFrameNumbers
the main header struct
Definition DataHeader.h:620