21#include "Monitoring/Tags.h"
22#include "Monitoring/Metric.h"
23#include "Monitoring/Monitoring.h"
25#include "rapidjson/document.h"
26#include "rapidjson/prettywriter.h"
27#include "rapidjson/filereadstream.h"
30#include "TObjString.h"
34#include <arrow/dataset/file_base.h>
35#include <arrow/dataset/dataset.h>
40#if __has_include(<TJAlienFile.h>)
41#include <TJAlienFile.h>
51using namespace rapidjson;
62 : mAlienSupport(alienSupport),
66 std::vector<char const*> capabilitiesSpecs = {
67 "O2Framework:RNTupleObjectReadingCapability",
68 "O2Framework:TTreeObjectReadingCapability",
71 std::vector<LoadablePlugin> plugins;
72 for (
auto spec : capabilitiesSpecs) {
74 for (
auto& extra : morePlugins) {
75 plugins.push_back(extra);
79 PluginManager::loadFromPlugin<RootObjectReadingCapability, RootObjectReadingCapabilityPlugin>(plugins, mFactory.
capabilities);
84 LOGP(info,
"DataInputDescriptor");
85 LOGP(info,
" Table name : {}",
tablename);
86 LOGP(info,
" Tree name : {}",
treename);
89 LOGP(info,
" Input files : {}", mfilenames.size());
90 for (
auto& fn : mfilenames) {
91 LOGP(info,
" {} {}", fn.fileName, fn.numberOfTimeFrames);
98 return (minputfilesFile.empty() && minputfilesFilePtr) ? (std::string)*minputfilesFilePtr : minputfilesFile;
103 return (mFilenameRegex.empty() && mFilenameRegexPtr) ? (std::string)*mFilenameRegexPtr : mFilenameRegex;
114 if (fn.
fileName.rfind(
"file://", 0) == 0) {
116 }
else if (!mAlienSupport && fn.
fileName.rfind(
"alien://", 0) == 0 && !gGrid) {
117 LOGP(
debug,
"AliEn file requested. Enabling support.");
118 TGrid::Connect(
"alien://");
119 mAlienSupport =
true;
123 mfilenames.emplace_back(fn);
139 if (wantedParentLevel == -1 && !
origin.starts_with(
"AOD")) {
144 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
146 if (rootFS->GetFile()->GetName() ==
filename) {
152 TFile* tfile =
nullptr;
153 bool externalFile =
false;
161 if (tfile ==
nullptr) {
162 tfile = TFile::Open(
filename.c_str());
164 if (!tfile || tfile->IsZombie()) {
165 if (tfile && !externalFile) {
168 throw std::runtime_error(fmt::format(
"Couldn't open file \"{}\"!",
filename));
170 mCurrentFilesystem = std::make_shared<TFileFileSystem>(tfile, 50 * 1024 * 1024, mFactory, !externalFile);
171 rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
175 mParentFileMap = (TMap*)rootFS->GetFile()->Get(
"parentFiles");
178 if (
pos == std::string::npos) {
179 throw std::runtime_error(fmt::format(
"Invalid syntax in aod-parent-base-path-replacement: \"{}\"", mContext.
parentFileReplacement.c_str()));
184 auto it = mParentFileMap->MakeIterator();
185 while (
auto obj = it->Next()) {
186 auto objString = (TObjString*)mParentFileMap->GetValue(obj);
187 objString->String().ReplaceAll(from.c_str(), to.c_str());
193 if (mfilenames[
counter].numberOfTimeFrames <= 0) {
194 const std::regex TFRegex = std::regex(
"/?DF_([0-9]+)(|-.*)$");
195 TList* keyList = rootFS->GetFile()->GetListOfKeys();
196 std::vector<std::string> finalList;
202 std::unordered_set<size_t> seen;
203 for (
auto key : *keyList) {
204 std::smatch matchResult;
205 std::string keyName = ((TObjString*)
key)->GetString().Data();
206 bool match = std::regex_match(keyName, matchResult, TFRegex);
208 auto folderNumber = std::stoul(matchResult[1].
str());
209 if (seen.find(folderNumber) == seen.end()) {
210 seen.insert(folderNumber);
211 mfilenames[
counter].listOfTimeFrameNumbers.emplace_back(folderNumber);
216 if (mParentFileMap !=
nullptr) {
218 std::ranges::sort(mfilenames[
counter].listOfTimeFrameNumbers,
219 [
this](
long const& l1,
long const& l2) ->
bool {
220 auto p1 = (TObjString*)this->mParentFileMap->GetValue((
"DF_" +
std::to_string(l1)).c_str());
221 auto p2 = (TObjString*)this->mParentFileMap->GetValue((
"DF_" +
std::to_string(l2)).c_str());
222 return p1->GetString().CompareTo(
p2->GetString()) < 0;
225 std::sort(mfilenames[
counter].listOfTimeFrameNumbers.begin(), mfilenames[
counter].listOfTimeFrameNumbers.end());
228 mfilenames[
counter].alreadyRead.resize(mfilenames[
counter].alreadyRead.size() + mfilenames[
counter].listOfTimeFrameNumbers.size(),
false);
229 mfilenames[
counter].numberOfTimeFrames = mfilenames[
counter].listOfTimeFrameNumbers.size();
233 mCurrentFileStartedAt = uv_hrtime();
248 if (mfilenames[
counter].numberOfTimeFrames > 0 && numTF >= mfilenames[
counter].numberOfTimeFrames) {
252 return (mfilenames[
counter].listOfTimeFrameNumbers)[numTF];
258 return {
nullptr, -1};
260 if (numTF < 0 || numTF >= mfilenames[
counter].numberOfTimeFrames) {
261 return {
nullptr, -1};
263 recordTimeFrameRead(
counter, numTF);
264 auto folderName = fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]);
266 if (parentFile ==
nullptr) {
267 return {
nullptr, -1};
269 return {parentFile, parentFile->findDFNumber(0, folderName)};
275 if ((wantedParentLevel != -1) && (mLevel < wantedParentLevel)) {
277 if (parentFile ==
nullptr || parentNumTF == -1) {
280 return parentFile->getFileFolder(0, parentNumTF, wantedParentLevel, wantedOrigin);
289 if ((mfilenames[
counter].numberOfTimeFrames > 0) && (numTF >= mfilenames[
counter].numberOfTimeFrames)) {
293 recordTimeFrameRead(
counter, numTF);
294 mfilenames[
counter].alreadyRead[numTF] =
true;
296 return {fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]), mCurrentFilesystem};
299void DataInputDescriptor::recordTimeFrameRead(
int counter,
int numTF)
301 auto read = std::pair{
counter, numTF};
302 if (std::find(mTimeFrameReads.begin(), mTimeFrameReads.end(), read) == mTimeFrameReads.end()) {
303 mTimeFrameReads.push_back(read);
309 mTimeFrameReads.clear();
310 mTimeFrameActive =
true;
312 mParentFile->beginTimeFrame();
318 mTimeFrameActive =
false;
320 for (
auto [file, df] : mTimeFrameReads) {
321 mfilenames[file].alreadyRead[df] =
false;
322 ++mfilenames[file].invalidReadSkipped;
325 mTimeFrameReads.clear();
327 mParentFile->finishTimeFrame(skipped);
329 for (
auto& parent : mRetainedParents) {
330 parent->finishTimeFrame(skipped);
331 parent->closeInputFile();
333 mRetainedParents.clear();
334 for (
auto& [
counter, info] : mPendingFileStatistics) {
335 reportFileStatistics(
counter, std::move(info));
337 mPendingFileStatistics.clear();
340void DataInputDescriptor::releaseParentFile()
345 if (mTimeFrameActive) {
347 mRetainedParents.push_back(std::move(mParentFile));
349 mParentFile->closeInputFile();
356 if (!mParentFileMap) {
361 auto folderName = fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]);
362 auto parentFileName = (TObjString*)mParentFileMap->GetValue(folderName.c_str());
364 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
365 if (!parentFileName) {
366 throw InvalidAODReadError(fmt::format(R
"(parent file map exists but does not contain the current DF "{}" in file "{}")", folderName.c_str(), rootFS->GetFile()->GetName()));
371 auto parentRootFS = std::dynamic_pointer_cast<TFileFileSystem>(mParentFile->mCurrentFilesystem);
372 if (parentFileName->GetString().CompareTo(parentRootFS->GetFile()->GetName()) == 0) {
380 throw std::runtime_error(fmt::format(R
"(while looking for tree "{}", the parent file was requested but we are already at level {} of maximal allowed level {} for DF "{}" in file "{}")", treename.c_str(), mLevel, mContext.allowedParentLevel, folderName.c_str(),
381 rootFS->GetFile()->GetName()));
384 LOGP(info, "Opening parent file {} for DF {}", parentFileName->GetString().Data(), folderName.c_str());
385 mParentFile = std::make_shared<DataInputDescriptor>(mAlienSupport, mLevel + 1, mContext);
386 mParentFile->mdefaultFilenamesPtr.emplace_back(
makeFileNameHolder(parentFileName->GetString().Data()));
387 mParentFile->fillInputfiles();
389 mParentFile->setFile(0, wantedParentLevel, wantedOrigin);
390 if (mTimeFrameActive) {
391 mParentFile->beginTimeFrame();
395 std::throw_with_nested(
InvalidAODReadError(fmt::format(
"Unable to open parent file \"{}\" for {}", parentFileName->GetString().Data(), folderName)));
402 return mfilenames.at(
counter).numberOfTimeFrames;
407 auto& list = mfilenames.at(
counter).alreadyRead;
408 return std::count(list.begin(), list.end(),
true);
413 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
414 auto f =
dynamic_cast<TFile*
>(rootFS->GetFile());
415 std::string monitoringInfo(fmt::format(
"lfn={},size={}",
f->GetName(),
f->GetSize()));
416#if __has_include(<TJAlienFile.h>)
417 auto alienFile =
dynamic_cast<TJAlienFile*
>(
f);
419 monitoringInfo += fmt::format(
",se={},open_time={:.1f}", alienFile->GetSE(), alienFile->GetElapsed());
423 mContext.
monitoring->send(o2::monitoring::Metric{monitoringInfo,
"aod-file-open-info"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
425 LOGP(info,
"Opening file: {}", monitoringInfo);
430 int64_t wait_time = (int64_t)uv_hrtime() - (int64_t)mCurrentFileStartedAt - (int64_t)mIOTime;
434 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
435 auto f =
dynamic_cast<TFile*
>(rootFS->GetFile());
436 std::string monitoringInfo(fmt::format(
"lfn={},size={},total_df={},read_bytes={},read_calls={},io_time={:.1f},wait_time={:.1f},level={}",
f->GetName(),
438 ((
float)mIOTime / 1e9), ((
float)wait_time / 1e9), mLevel));
439#if __has_include(<TJAlienFile.h>)
440 auto alienFile =
dynamic_cast<TJAlienFile*
>(
f);
442 monitoringInfo += fmt::format(
",se={},open_time={:.1f}", alienFile->GetSE(), alienFile->GetElapsed());
445 if (mTimeFrameActive) {
447 mPendingFileStatistics.emplace_back(mCurrentFileID, std::move(monitoringInfo));
449 reportFileStatistics(mCurrentFileID, std::move(monitoringInfo));
453void DataInputDescriptor::reportFileStatistics(
int counter, std::string monitoringInfo)
457 mContext.
monitoring->send(o2::monitoring::Metric{monitoringInfo,
"aod-file-read-info"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
459 LOGP(info,
"Read info: {}", monitoringInfo);
464 if (mCurrentFilesystem.get()) {
467 delete mParentFileMap;
468 mParentFileMap =
nullptr;
471 mCurrentFilesystem.reset();
483 if (!fileName.empty()) {
486 std::ifstream filelist(fileName);
487 if (!filelist.is_open()) {
488 throw std::runtime_error(fmt::format(R
"(Couldn't open file "{}")", fileName));
490 while (std::getline(filelist, fileName)) {
492 fileName.erase(std::remove_if(fileName.begin(), fileName.end(), ::isspace), fileName.end());
504 if (!mdefaultFilenamesPtr.empty()) {
505 for (
auto& fileNameHolder : mdefaultFilenamesPtr) {
519 auto dfList = mfilenames[file].listOfTimeFrameNumbers;
520 auto it = std::find_if(dfList.begin(), dfList.end(), [dfName](
size_t i) { return fmt::format(
"DF_{}", i) == dfName; });
521 if (it == dfList.end()) {
524 return it - dfList.begin();
539 void (*dump_)(
const char*);
540 if (
void* sym = dlsym(
nullptr,
"igprof_dump_now")) {
541 dump_ = __extension__(
void (*)(
const char*)) sym;
543 std::string
filename = fmt::format(
"reader-memory-dump-{}.gz", uv_hrtime());
565 std::string wantedOrigin = dh.
dataOrigin.
as<std::string>();
570 if (wantedLevel != -1 && mLevel < wantedLevel) {
576 if (parentFile ==
nullptr) {
577 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
578 throw InvalidAODReadError(fmt::format(R
"(No parent file found for "{}" while looking for level {} in "{}")", treename, wantedLevel, rootFS->GetFile()->GetName()));
580 if (parentNumTF == -1) {
581 auto parentRootFS = std::dynamic_pointer_cast<TFileFileSystem>(parentFile->mCurrentFilesystem);
582 throw InvalidAODReadError(fmt::format(R
"(DF not found in parent file "{}")", parentRootFS->GetFile()->GetName()));
585 return parentFile->readTree(outputs, dh, 0, parentNumTF,
treename, totalSizeCompressed, totalSizeUncompressed);
589 if (!folder.filesystem()) {
594 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(folder.filesystem());
598 throw std::runtime_error(fmt::format(R
"(Not a TFile filesystem!)"));
601 std::shared_ptr<arrow::dataset::FileFormat>
format;
604 auto fullpath = arrow::dataset::FileSource{folder.path() +
"/" +
treename, folder.filesystem()};
607 auto objectPath = capability.lfn2objectPath(fullpath.path());
608 void* handle = capability.getHandle(rootFS, objectPath);
610 format = capability.factory().format();
611 creator = capability.factory().deferredOutputStreamer;
617 if (capability.accountBytes) {
618 capability.accountBytes(handle, totalSizeCompressed, totalSizeUncompressed);
628 LOGP(
debug,
"Could not find tree {}. Trying in parent file.", fullpath.path());
630 if (parentFile ==
nullptr) {
631 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
632 throw std::runtime_error(fmt::format(R
"(Couldn't get TTree "{}" from "{}". Please check https://aliceo2group.github.io/analysis-framework/docs/troubleshooting/#tree-not-found for more information.)", fullpath.path(), rootFS->GetFile()->GetName()));
634 int parentNumTF = parentFile->findDFNumber(0, folder.path());
635 if (parentNumTF == -1) {
636 auto parentRootFS = std::dynamic_pointer_cast<TFileFileSystem>(parentFile->mCurrentFilesystem);
637 throw InvalidAODReadError(fmt::format(R
"(DF {} listed in parent file map but not found in the corresponding file "{}")", folder.path(), parentRootFS->GetFile()->GetName()));
640 return parentFile->readTree(outputs, dh, 0, parentNumTF,
treename, totalSizeCompressed, totalSizeUncompressed);
643 auto schemaOpt =
format->Inspect(fullpath);
644 if (!schemaOpt.ok()) {
647 auto physicalSchema = schemaOpt;
648 std::vector<std::shared_ptr<arrow::Field>>
fields;
649 for (
auto& original : (*schemaOpt)->fields()) {
650 if (original->name().ends_with(
"_size")) {
653 fields.push_back(original);
655 auto datasetSchema = std::make_shared<arrow::Schema>(
fields);
657 auto fragment =
format->MakeFragment(fullpath, {}, *physicalSchema);
671 f2b->fill(datasetSchema,
format);
681 auto rootFS = std::dynamic_pointer_cast<TFileFileSystem>(mCurrentFilesystem);
682 auto filename = rootFS ? std::string(rootFS->GetFile()->GetName()) : mfilenames.at(
counter).fileName;
683 auto const& dfs = mfilenames.at(
counter).listOfTimeFrameNumbers;
684 auto df = numTF >= 0 &&
static_cast<size_t>(numTF) < dfs.size() ? fmt::format(
"DF_{}", dfs[numTF]) :
fmt::
format(
"timeframe index {}", numTF);
685 std::throw_with_nested(
InvalidAODReadError(fmt::format(
"Reading tree {} in {} from file \"{}\" at parent level {}", treename, df,
filename, mLevel)));
691 if (inputFiles.size() == 1 && !inputFiles[0].empty() && inputFiles[0][0] ==
'@') {
694 for (
auto inputFile : inputFiles) {
704 mdefaultInputFiles.clear();
705 mdefaultDataInputDescriptor =
nullptr;
707 mdataInputDescriptors.clear();
712 mdataInputDescriptors.clear();
713 mdefaultInputFiles.clear();
714 mFilenameRegex = std::string(
"");
719 if (mdefaultDataInputDescriptor) {
720 mdefaultDataInputDescriptor.reset();
722 mdefaultDataInputDescriptor = std::make_shared<DataInputDescriptor>(mAlienSupport, 0, mContext);
724 mdefaultDataInputDescriptor->setInputfilesFile(minputfilesFile);
725 mdefaultDataInputDescriptor->setFilenamesRegex(mFilenameRegex);
726 mdefaultDataInputDescriptor->setDefaultInputfiles(mdefaultInputFiles);
727 mdefaultDataInputDescriptor->tablename =
"any";
728 mdefaultDataInputDescriptor->treename =
"any";
729 mdefaultDataInputDescriptor->fillInputfiles();
731 mAlienSupport &= mdefaultDataInputDescriptor->isAlienSupportOn();
737 FILE*
f = fopen(fnjson.c_str(),
"r");
739 LOGP(error,
"Could not open JSON file \"{}\"!", fnjson);
744 char readBuffer[65536];
745 FileReadStream inputStream(
f, readBuffer,
sizeof(readBuffer));
749 jsonDoc.ParseStream(inputStream);
750 auto status = readJsonDocument(&jsonDoc);
758bool DataInputDirector::readJsonDocument(Document* jsonDoc)
761 std::string fileName(
"");
762 const char* itemName;
765 if (jsonDoc->HasParseError()) {
766 LOGP(error,
"Check the JSON document! There is a problem with the format!");
771 itemName =
"InputDirector";
772 const Value& didirItem = (*jsonDoc)[itemName];
773 if (!didirItem.IsObject()) {
774 LOGP(info,
"No \"{}\" object found in the JSON document!", itemName);
779 itemName =
"debugmode";
780 if (didirItem.HasMember(itemName)) {
781 if (didirItem[itemName].IsBool()) {
782 mDebugMode = (didirItem[itemName].GetBool());
784 LOGP(error,
"Check the JSON document! Item \"{}\" must be a boolean!", itemName);
794 PrettyWriter<StringBuffer> writer(
buffer);
795 didirItem.Accept(writer);
796 LOGP(info,
"InputDirector object: {}", std::string(
buffer.GetString()));
799 itemName =
"fileregex";
800 if (didirItem.HasMember(itemName)) {
801 if (didirItem[itemName].IsString()) {
804 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
809 itemName =
"resfiles";
810 if (didirItem.HasMember(itemName)) {
811 if (didirItem[itemName].IsString()) {
812 fileName = didirItem[itemName].GetString();
813 if (fileName.size() && fileName[0] ==
'@') {
814 fileName.erase(0, 1);
820 }
else if (didirItem[itemName].IsArray()) {
822 auto fns = didirItem[itemName].GetArray();
823 for (
auto& fn : fns) {
827 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string or an array!", itemName);
832 itemName =
"InputDescriptors";
833 if (didirItem.HasMember(itemName)) {
834 if (!didirItem[itemName].IsArray()) {
835 LOGP(error,
"Check the JSON document! Item \"{}\" must be an array!", itemName);
840 for (
auto& didescItem : didirItem[itemName].GetArray()) {
841 if (!didescItem.IsObject()) {
842 LOGP(error,
"Check the JSON document! \"{}\" must be objects!", itemName);
846 auto didesc = DataInputDescriptor(mAlienSupport, 0, mContext);
847 didesc.setDefaultInputfiles(mdefaultInputFiles);
850 if (didescItem.HasMember(itemName)) {
851 if (didescItem[itemName].IsString()) {
852 didesc.tablename = didescItem[itemName].GetString();
855 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
859 LOGP(error,
"Check the JSON document! Item \"{}\" is missing!", itemName);
863 itemName =
"treename";
864 if (didescItem.HasMember(itemName)) {
865 if (didescItem[itemName].IsString()) {
866 didesc.treename = didescItem[itemName].GetString();
868 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
873 didesc.treename =
m[2];
876 itemName =
"fileregex";
877 if (didescItem.HasMember(itemName)) {
878 if (didescItem[itemName].IsString()) {
879 if (didesc.getNumberInputfiles() == 0) {
880 didesc.setFilenamesRegex(didescItem[itemName].GetString());
883 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
887 if (didesc.getNumberInputfiles() == 0) {
888 didesc.setFilenamesRegex(mFilenameRegexPtr);
892 itemName =
"resfiles";
893 if (didescItem.HasMember(itemName)) {
894 if (didescItem[itemName].IsString()) {
895 fileName = didescItem[itemName].GetString();
896 if (fileName.size() && fileName[0] ==
'@') {
897 didesc.setInputfilesFile(fileName.erase(0, 1));
899 if (didesc.getFilenamesRegexString().empty() ||
900 std::regex_match(fileName, didesc.getFilenamesRegex())) {
904 }
else if (didescItem[itemName].IsArray()) {
905 auto fns = didescItem[itemName].GetArray();
906 for (
auto& fn : fns) {
907 if (didesc.getFilenamesRegexString().empty() ||
908 std::regex_match(fn.GetString(), didesc.getFilenamesRegex())) {
913 LOGP(error,
"Check the JSON document! Item \"{}\" must be a string or an array!", itemName);
917 didesc.setInputfilesFile(minputfilesFilePtr);
921 if (didesc.fillInputfiles() > 0) {
922 mdataInputDescriptors.emplace_back(didesc);
925 LOGP(info,
"This DataInputDescriptor is ignored because its file list is empty!");
927 mAlienSupport &= didesc.isAlienSupportOn();
953 for (
auto& didesc : mdataInputDescriptors) {
954 if (didesc.matcher->match(dh, context)) {
967 didesc = mdefaultDataInputDescriptor.get();
972 return didesc->getFileFolder(
counter, numTF, wantedLevel,
origin);
977 mdefaultDataInputDescriptor->beginTimeFrame();
978 for (
auto& descriptor : mdataInputDescriptors) {
979 descriptor.beginTimeFrame();
985 mdefaultDataInputDescriptor->finishTimeFrame(skipped);
986 for (
auto& descriptor : mdataInputDescriptors) {
987 descriptor.finishTimeFrame(skipped);
996 didesc = mdefaultDataInputDescriptor.get();
999 return didesc->getTimeFramesInFile(
counter);
1007 didesc = mdefaultDataInputDescriptor.get();
1012 return didesc->getTimeFrameNumber(
counter, numTF, wantedLevel,
origin);
1017 std::string treename;
1022 treename = didesc->treename;
1027 didesc = mdefaultDataInputDescriptor.get();
1032 auto result = didesc->readTree(outputs, dh,
counter, numTF, treename, totalSizeCompressed, totalSizeUncompressed);
1039 mdefaultDataInputDescriptor->closeInputFile();
1040 for (
auto& didesc : mdataInputDescriptors) {
1041 didesc.closeInputFile();
1045bool DataInputDirector::isValid()
1048 int numberFiles = mdefaultDataInputDescriptor->getNumberInputfiles();
1049 for (
auto& didesc : mdataInputDescriptors) {
1050 status &= didesc.getNumberInputfiles() == numberFiles;
1058 bool status = mdefaultDataInputDescriptor->getNumberInputfiles() <=
counter;
1059 for (
auto& didesc : mdataInputDescriptors) {
1060 status &= (didesc.getNumberInputfiles() <=
counter);
1068 LOGP(info,
"DataInputDirector");
1069 LOGP(info,
" Default input files file : {}", minputfilesFile);
1070 LOGP(info,
" Default file name regex : {}", mFilenameRegex);
1071 LOGP(info,
" Default file names : {}", mdefaultInputFiles.size());
1072 for (
auto const& fn : mdefaultInputFiles) {
1073 LOGP(info,
" {} {}", fn.fileName, fn.numberOfTimeFrames);
1075 LOGP(info,
" Default DataInputDescriptor:");
1076 mdefaultDataInputDescriptor->printOut();
1078 for (
auto const& didesc : mdataInputDescriptors) {
header::DataOrigin origin
o2::monitoring::tags::Value Value
std::vector< std::shared_ptr< arrow::Field > > fields
constexpr int p1()
constexpr to accelerate the coordinates changing
#define O2_DECLARE_DYNAMIC_LOG(name)
#define O2_SIGNPOST_ACTION(log, callback)
decltype(auto) make(const Output &spec, Args... args)
std::function< std::shared_ptr< arrow::io::OutputStream >(std::shared_ptr< arrow::dataset::FileFragment >, const std::shared_ptr< arrow::ResizableBuffer > &buffer)> StreamerCreator
void setLabel(const char *label)
bool match(const std::vector< std::string > &queries, const char *pattern)
GLuint const GLchar * name
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLint GLint GLsizei GLint GLenum format
std::string getTreeName(header::DataHeader dh, bool wasAOD)
Defining ITS Vertex explicitly as messageable.
FileNameHolder makeFileNameHolder(std::string fileName)
std::string to_string(gsl::span< T, Size > span)
CalculateDelta(uint64_t &target)
static std::unique_ptr< data_matcher::DataDescriptorMatcher > buildNode(std::string const &nodeString)
static std::vector< std::string > getTokens(std::string const &nodeString)
std::string parentFileReplacement
o2::monitoring::Monitoring * monitoring
std::vector< std::pair< std::string, TFile * > > openFiles
int levelForOrigin(std::string_view origin) const
static std::vector< LoadablePlugin > parsePluginSpecString(char const *str)
Parse a comma separated list of <library>:<plugin-name> plugin declarations.
std::vector< RootObjectReadingCapability > capabilities