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"
36#include <arrow/dataset/file_base.h>
37#include <arrow/dataset/dataset.h>
49using namespace rapidjson;
64struct RootReadErrorWatch {
73 SetErrorHandler(mPrevious);
75 RootReadErrorWatch(RootReadErrorWatch
const&) =
delete;
76 RootReadErrorWatch& operator=(RootReadErrorWatch
const&) =
delete;
78 [[nodiscard]]
bool failed()
const {
return sErrors > 0; }
80 static void handler(
int level, Bool_t abort,
char const*
location,
char const*
msg)
90 static inline thread_local int sErrors = 0;
91 static inline ErrorHandlerFunc_t sPrevious =
nullptr;
96 : mAlienSupport(alienSupport),
100 std::vector<char const*> capabilitiesSpecs = {
101 "O2Framework:RNTupleObjectReadingCapability",
102 "O2Framework:TTreeObjectReadingCapability",
107 capabilitiesSpecs.insert(capabilitiesSpecs.begin(),
"O2FrameworkAnalysisNativeAODSupport:NativeAODObjectReadingCapability");
110 std::vector<LoadablePlugin> plugins;
111 for (
auto spec : capabilitiesSpecs) {
113 for (
auto& extra : morePlugins) {
114 plugins.push_back(extra);
118 PluginManager::loadFromPlugin<RootObjectReadingCapability, RootObjectReadingCapabilityPlugin>(plugins, mFactory.
capabilities);
123 LOGP(info,
"DataInputDescriptor");
124 LOGP(info,
" Table name : {}",
tablename);
125 LOGP(info,
" Tree name : {}",
treename);
128 LOGP(info,
" Input files : {}", mfilenames.size());
129 for (
auto& fn : mfilenames) {
130 LOGP(info,
" {} {}", fn.fileName, fn.numberOfTimeFrames);
137 return (minputfilesFile.empty() && minputfilesFilePtr) ? (std::string)*minputfilesFilePtr : minputfilesFile;
142 return (mFilenameRegex.empty() && mFilenameRegexPtr) ? (std::string)*mFilenameRegexPtr : mFilenameRegex;
153 if (fn.
fileName.rfind(
"file://", 0) == 0) {
155 }
else if (!mAlienSupport && fn.
fileName.rfind(
"alien://", 0) == 0 && !gGrid) {
156 LOGP(
debug,
"AliEn file requested. Enabling support.");
157 TGrid::Connect(
"alien://");
158 mAlienSupport =
true;
162 mfilenames.emplace_back(fn);
178 if (wantedParentLevel == -1 && !
origin.starts_with(
"AOD")) {
184 if (mCurrentFile->name() ==
filename) {
190 TFile* externalFile =
nullptr;
198 auto backend = externalFile ? std::string(
"root") : mContext.
readerBackend;
199 if (backend !=
"root") {
202 }
catch (std::exception
const&
e) {
203 if (backend ==
"native") {
206 LOGP(info,
"Reading \"{}\" with ROOT, the native reader cannot: {}",
filename,
e.what());
208 mContext.
monitoring->send(o2::monitoring::Metric{
filename,
"aod-native-fallback"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
218 mCurrentFilesystem = mCurrentFile->filesystem();
222 mParentFileMap = mCurrentFile->parentFiles();
225 if (
pos == std::string::npos) {
226 throw std::runtime_error(fmt::format(
"Invalid syntax in aod-parent-base-path-replacement: \"{}\"", mContext.
parentFileReplacement.c_str()));
231 for (
auto& [df, parent] : mParentFileMap) {
233 for (
size_t at = 0; !from.empty() && (at = parent.find(from, at)) != std::string::npos; at += to.size()) {
234 parent.replace(at, from.size(), to);
240 if (mfilenames[
counter].numberOfTimeFrames <= 0) {
241 const std::regex TFRegex = std::regex(
"/?DF_([0-9]+)(|-.*)$");
247 std::unordered_set<size_t> seen;
248 for (
auto&
key : mCurrentFile->topLevelKeys()) {
249 std::smatch matchResult;
250 std::string
const& keyName =
key.name;
251 bool match = std::regex_match(keyName, matchResult, TFRegex);
253 auto folderNumber = std::stoul(matchResult[1].
str());
254 if (seen.find(folderNumber) == seen.end()) {
255 seen.insert(folderNumber);
256 mfilenames[
counter].listOfTimeFrameNumbers.emplace_back(folderNumber);
261 if (!mParentFileMap.empty()) {
263 auto parentOf = [
this](
long df) -> std::string
const& {
264 static const std::string none;
266 return it == mParentFileMap.end() ? none : it->second;
268 std::ranges::sort(mfilenames[
counter].listOfTimeFrameNumbers,
269 [&parentOf](
long const& l1,
long const& l2) ->
bool {
270 return parentOf(l1) < parentOf(l2);
273 std::sort(mfilenames[
counter].listOfTimeFrameNumbers.begin(), mfilenames[
counter].listOfTimeFrameNumbers.end());
276 mfilenames[
counter].alreadyRead.resize(mfilenames[
counter].alreadyRead.size() + mfilenames[
counter].listOfTimeFrameNumbers.size(),
false);
277 mfilenames[
counter].numberOfTimeFrames = mfilenames[
counter].listOfTimeFrameNumbers.size();
279 std::vector<std::string> readOrder;
280 for (
auto number : mfilenames[
counter].listOfTimeFrameNumbers) {
281 readOrder.push_back(fmt::format(
"DF_{}", number));
283 mCurrentFile->setReadOrder(readOrder);
286 mCurrentFileStartedAt = uv_hrtime();
301 if (mfilenames[
counter].numberOfTimeFrames > 0 && numTF >= mfilenames[
counter].numberOfTimeFrames) {
305 return (mfilenames[
counter].listOfTimeFrameNumbers)[numTF];
311 return {
nullptr, -1};
313 if (numTF < 0 || numTF >= mfilenames[
counter].numberOfTimeFrames) {
314 return {
nullptr, -1};
316 recordTimeFrameRead(
counter, numTF);
317 auto folderName = fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]);
319 if (parentFile ==
nullptr) {
320 return {
nullptr, -1};
322 return {parentFile, parentFile->findDFNumber(0, folderName)};
328 if ((wantedParentLevel != -1) && (mLevel < wantedParentLevel)) {
330 if (parentFile ==
nullptr || parentNumTF == -1) {
333 return parentFile->getFileFolder(0, parentNumTF, wantedParentLevel, wantedOrigin);
342 if ((mfilenames[
counter].numberOfTimeFrames > 0) && (numTF >= mfilenames[
counter].numberOfTimeFrames)) {
346 recordTimeFrameRead(
counter, numTF);
347 mfilenames[
counter].alreadyRead[numTF] =
true;
349 return {fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]), mCurrentFilesystem};
352void DataInputDescriptor::recordTimeFrameRead(
int counter,
int numTF)
354 auto read = std::pair{
counter, numTF};
355 if (std::find(mTimeFrameReads.begin(), mTimeFrameReads.end(), read) == mTimeFrameReads.end()) {
356 mTimeFrameReads.push_back(read);
362 mTimeFrameReads.clear();
363 mTimeFrameActive =
true;
365 mParentFile->beginTimeFrame();
371 mTimeFrameActive =
false;
373 for (
auto [
file, df] : mTimeFrameReads) {
374 mfilenames[
file].alreadyRead[df] =
false;
375 ++mfilenames[
file].invalidReadSkipped;
378 mTimeFrameReads.clear();
380 mParentFile->finishTimeFrame(skipped);
382 for (
auto& parent : mRetainedParents) {
383 parent->finishTimeFrame(skipped);
384 parent->closeInputFile();
386 mRetainedParents.clear();
387 for (
auto& [
counter, info] : mPendingFileStatistics) {
388 reportFileStatistics(
counter, std::move(info));
390 mPendingFileStatistics.clear();
393void DataInputDescriptor::releaseParentFile()
398 if (mTimeFrameActive) {
400 mRetainedParents.push_back(std::move(mParentFile));
402 mParentFile->closeInputFile();
409 if (mParentFileMap.empty()) {
414 auto folderName = fmt::format(
"DF_{}", mfilenames[
counter].listOfTimeFrameNumbers[numTF]);
415 auto parentEntry = mParentFileMap.find(folderName);
417 if (parentEntry == mParentFileMap.end()) {
420 auto const& parentFileName = parentEntry->second;
424 if (parentFileName == mParentFile->mCurrentFile->name()) {
432 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(),
433 mCurrentFile->name()));
436 LOGP(info, "Opening parent file {} for DF {}", parentFileName, folderName.c_str());
437 mParentFile = std::make_shared<DataInputDescriptor>(mAlienSupport, mLevel + 1, mContext);
439 mParentFile->fillInputfiles();
441 mParentFile->setFile(0, wantedParentLevel, wantedOrigin);
442 if (mTimeFrameActive) {
443 mParentFile->beginTimeFrame();
454 return mfilenames.at(
counter).numberOfTimeFrames;
459 auto& list = mfilenames.at(
counter).alreadyRead;
460 return std::count(list.begin(), list.end(),
true);
465 std::string monitoringInfo(fmt::format(
"lfn={},size={}", mCurrentFile->name(), mCurrentFile->size()));
466 monitoringInfo += mCurrentFile->monitoringDetails();
468 mContext.
monitoring->send(o2::monitoring::Metric{monitoringInfo,
"aod-file-open-info"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
470 LOGP(info,
"Opening file: {}", monitoringInfo);
475 int64_t wait_time = (int64_t)uv_hrtime() - (int64_t)mCurrentFileStartedAt - (int64_t)mIOTime;
479 std::string monitoringInfo(fmt::format(
"lfn={},size={},total_df={},read_bytes={},read_calls={},io_time={:.1f},wait_time={:.1f},level={}", mCurrentFile->name(),
480 mCurrentFile->size(),
getTimeFramesInFile(mCurrentFileID), mCurrentFile->bytesRead(), mCurrentFile->readCalls(),
481 ((
float)mIOTime / 1e9), ((
float)wait_time / 1e9), mLevel));
482 monitoringInfo += mCurrentFile->monitoringDetails();
483 if (mTimeFrameActive) {
485 mPendingFileStatistics.emplace_back(mCurrentFileID, std::move(monitoringInfo));
487 reportFileStatistics(mCurrentFileID, std::move(monitoringInfo));
491void DataInputDescriptor::reportFileStatistics(
int counter, std::string monitoringInfo)
495 mContext.
monitoring->send(o2::monitoring::Metric{monitoringInfo,
"aod-file-read-info"}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::DPL));
497 LOGP(info,
"Read info: {}", monitoringInfo);
505 mParentFileMap.clear();
508 mCurrentFilesystem.reset();
509 mCurrentFile.reset();
521 if (!fileName.empty()) {
524 std::ifstream filelist(fileName);
525 if (!filelist.is_open()) {
526 throw std::runtime_error(fmt::format(R
"(Couldn't open file "{}")", fileName));
528 while (std::getline(filelist, fileName)) {
530 fileName.erase(std::remove_if(fileName.begin(), fileName.end(), ::isspace), fileName.end());
542 if (!mdefaultFilenamesPtr.empty()) {
543 for (
auto& fileNameHolder : mdefaultFilenamesPtr) {
557 auto dfList = mfilenames[
file].listOfTimeFrameNumbers;
558 auto it = std::find_if(dfList.begin(), dfList.end(), [dfName](
size_t i) { return fmt::format(
"DF_{}", i) == dfName; });
559 if (it == dfList.end()) {
562 return it - dfList.begin();
577 void (*dump_)(
const char*);
578 if (
void* sym = dlsym(
nullptr,
"igprof_dump_now")) {
579 dump_ = __extension__(
void (*)(
const char*)) sym;
581 std::string
filename = fmt::format(
"reader-memory-dump-{}.gz", uv_hrtime());
603 std::string wantedOrigin = dh.
dataOrigin.
as<std::string>();
608 if (wantedLevel != -1 && mLevel < wantedLevel) {
614 if (parentFile ==
nullptr) {
617 if (parentNumTF == -1) {
621 return parentFile->readTree(outputs, dh, 0, parentNumTF,
treename, totalSizeCompressed, totalSizeUncompressed);
625 if (!
folder.filesystem()) {
630 auto rootFS = std::dynamic_pointer_cast<VirtualRootFileSystemBase>(
folder.filesystem());
634 throw std::runtime_error(fmt::format(R
"(Not a ROOT file filesystem!)"));
637 std::shared_ptr<arrow::dataset::FileFormat>
format;
640 auto fullpath = arrow::dataset::FileSource{
folder.path() +
"/" +
treename,
folder.filesystem()};
643 auto objectPath = capability.lfn2objectPath(fullpath.path());
645 bool readFailed =
false;
647 RootReadErrorWatch watch;
648 handle = capability.getHandle(rootFS, objectPath);
649 readFailed = watch.failed();
658 format = capability.factory().format();
659 creator = capability.factory().deferredOutputStreamer;
665 if (capability.accountBytes) {
666 capability.accountBytes(
handle, totalSizeCompressed, totalSizeUncompressed);
676 LOGP(
debug,
"Could not find tree {}. Trying in parent file.", fullpath.path());
678 if (parentFile ==
nullptr) {
679 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(), mCurrentFile->name()));
681 int parentNumTF = parentFile->findDFNumber(0,
folder.path());
682 if (parentNumTF == -1) {
686 return parentFile->readTree(outputs, dh, 0, parentNumTF,
treename, totalSizeCompressed, totalSizeUncompressed);
689 auto schemaOpt =
format->Inspect(fullpath);
690 if (!schemaOpt.ok()) {
694 std::vector<std::shared_ptr<arrow::Field>>
fields;
695 for (
auto& original : (*schemaOpt)->fields()) {
696 if (original->name().ends_with(
"_size")) {
699 fields.push_back(original);
727 auto filename = mCurrentFile ? mCurrentFile->name() : mfilenames.at(
counter).fileName;
728 auto const& dfs = mfilenames.at(
counter).listOfTimeFrameNumbers;
729 auto df = numTF >= 0 &&
static_cast<size_t>(numTF) < dfs.size() ? fmt::format(
"DF_{}", dfs[numTF]) :
fmt::
format(
"timeframe index {}", numTF);
730 std::throw_with_nested(
AODReadError(
e.getKind(), fmt::format(
"Reading tree {} in {} from file \"{}\" at parent level {}", treename, df,
filename, mLevel)));
736 if (inputFiles.size() == 1 && !inputFiles[0].empty() && inputFiles[0][0] ==
'@') {
739 for (
auto inputFile : inputFiles) {
749 mdefaultInputFiles.clear();
750 mdefaultDataInputDescriptor =
nullptr;
752 mdataInputDescriptors.clear();
757 mdataInputDescriptors.clear();
758 mdefaultInputFiles.clear();
759 mFilenameRegex = std::string(
"");
764 if (mdefaultDataInputDescriptor) {
765 mdefaultDataInputDescriptor.reset();
767 mdefaultDataInputDescriptor = std::make_shared<DataInputDescriptor>(mAlienSupport, 0, mContext);
769 mdefaultDataInputDescriptor->setInputfilesFile(minputfilesFile);
770 mdefaultDataInputDescriptor->setFilenamesRegex(mFilenameRegex);
771 mdefaultDataInputDescriptor->setDefaultInputfiles(mdefaultInputFiles);
772 mdefaultDataInputDescriptor->tablename =
"any";
773 mdefaultDataInputDescriptor->treename =
"any";
774 mdefaultDataInputDescriptor->fillInputfiles();
776 mAlienSupport &= mdefaultDataInputDescriptor->isAlienSupportOn();
782 FILE*
f = fopen(fnjson.c_str(),
"r");
784 LOGP(
error,
"Could not open JSON file \"{}\"!", fnjson);
789 char readBuffer[65536];
790 FileReadStream inputStream(
f, readBuffer,
sizeof(readBuffer));
794 jsonDoc.ParseStream(inputStream);
795 auto status = readJsonDocument(&jsonDoc);
803bool DataInputDirector::readJsonDocument(Document* jsonDoc)
806 std::string fileName(
"");
807 const char* itemName;
810 if (jsonDoc->HasParseError()) {
811 LOGP(
error,
"Check the JSON document! There is a problem with the format!");
816 itemName =
"InputDirector";
817 const Value& didirItem = (*jsonDoc)[itemName];
818 if (!didirItem.IsObject()) {
819 LOGP(info,
"No \"{}\" object found in the JSON document!", itemName);
824 itemName =
"debugmode";
825 if (didirItem.HasMember(itemName)) {
826 if (didirItem[itemName].IsBool()) {
827 mDebugMode = (didirItem[itemName].GetBool());
829 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a boolean!", itemName);
839 PrettyWriter<StringBuffer> writer(
buffer);
840 didirItem.Accept(writer);
841 LOGP(info,
"InputDirector object: {}", std::string(
buffer.GetString()));
844 itemName =
"fileregex";
845 if (didirItem.HasMember(itemName)) {
846 if (didirItem[itemName].IsString()) {
849 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
854 itemName =
"resfiles";
855 if (didirItem.HasMember(itemName)) {
856 if (didirItem[itemName].IsString()) {
857 fileName = didirItem[itemName].GetString();
858 if (fileName.size() && fileName[0] ==
'@') {
859 fileName.erase(0, 1);
865 }
else if (didirItem[itemName].IsArray()) {
867 auto fns = didirItem[itemName].GetArray();
868 for (
auto& fn : fns) {
872 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string or an array!", itemName);
877 itemName =
"InputDescriptors";
878 if (didirItem.HasMember(itemName)) {
879 if (!didirItem[itemName].IsArray()) {
880 LOGP(
error,
"Check the JSON document! Item \"{}\" must be an array!", itemName);
885 for (
auto& didescItem : didirItem[itemName].GetArray()) {
886 if (!didescItem.IsObject()) {
887 LOGP(
error,
"Check the JSON document! \"{}\" must be objects!", itemName);
891 auto didesc = DataInputDescriptor(mAlienSupport, 0, mContext);
892 didesc.setDefaultInputfiles(mdefaultInputFiles);
895 if (didescItem.HasMember(itemName)) {
896 if (didescItem[itemName].IsString()) {
897 didesc.tablename = didescItem[itemName].GetString();
900 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
904 LOGP(
error,
"Check the JSON document! Item \"{}\" is missing!", itemName);
908 itemName =
"treename";
909 if (didescItem.HasMember(itemName)) {
910 if (didescItem[itemName].IsString()) {
911 didesc.treename = didescItem[itemName].GetString();
913 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
918 didesc.treename =
m[2];
921 itemName =
"fileregex";
922 if (didescItem.HasMember(itemName)) {
923 if (didescItem[itemName].IsString()) {
924 if (didesc.getNumberInputfiles() == 0) {
925 didesc.setFilenamesRegex(didescItem[itemName].GetString());
928 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string!", itemName);
932 if (didesc.getNumberInputfiles() == 0) {
933 didesc.setFilenamesRegex(mFilenameRegexPtr);
937 itemName =
"resfiles";
938 if (didescItem.HasMember(itemName)) {
939 if (didescItem[itemName].IsString()) {
940 fileName = didescItem[itemName].GetString();
941 if (fileName.size() && fileName[0] ==
'@') {
942 didesc.setInputfilesFile(fileName.erase(0, 1));
944 if (didesc.getFilenamesRegexString().empty() ||
945 std::regex_match(fileName, didesc.getFilenamesRegex())) {
949 }
else if (didescItem[itemName].IsArray()) {
950 auto fns = didescItem[itemName].GetArray();
951 for (
auto& fn : fns) {
952 if (didesc.getFilenamesRegexString().empty() ||
953 std::regex_match(fn.GetString(), didesc.getFilenamesRegex())) {
958 LOGP(
error,
"Check the JSON document! Item \"{}\" must be a string or an array!", itemName);
962 didesc.setInputfilesFile(minputfilesFilePtr);
966 if (didesc.fillInputfiles() > 0) {
967 mdataInputDescriptors.emplace_back(didesc);
970 LOGP(info,
"This DataInputDescriptor is ignored because its file list is empty!");
972 mAlienSupport &= didesc.isAlienSupportOn();
998 for (
auto& didesc : mdataInputDescriptors) {
999 if (didesc.matcher->match(dh, context)) {
1012 didesc = mdefaultDataInputDescriptor.get();
1017 return didesc->getFileFolder(
counter, numTF, wantedLevel,
origin);
1022 mdefaultDataInputDescriptor->beginTimeFrame();
1023 for (
auto& descriptor : mdataInputDescriptors) {
1024 descriptor.beginTimeFrame();
1030 mdefaultDataInputDescriptor->finishTimeFrame(skipped);
1031 for (
auto& descriptor : mdataInputDescriptors) {
1032 descriptor.finishTimeFrame(skipped);
1041 didesc = mdefaultDataInputDescriptor.get();
1044 return didesc->getTimeFramesInFile(
counter);
1052 didesc = mdefaultDataInputDescriptor.get();
1057 return didesc->getTimeFrameNumber(
counter, numTF, wantedLevel,
origin);
1062 std::string treename;
1067 treename = didesc->treename;
1072 didesc = mdefaultDataInputDescriptor.get();
1077 auto result = didesc->readTree(outputs, dh,
counter, numTF, treename, totalSizeCompressed, totalSizeUncompressed);
1084 mdefaultDataInputDescriptor->closeInputFile();
1085 for (
auto& didesc : mdataInputDescriptors) {
1086 didesc.closeInputFile();
1090bool DataInputDirector::isValid()
1093 int numberFiles = mdefaultDataInputDescriptor->getNumberInputfiles();
1094 for (
auto& didesc : mdataInputDescriptors) {
1095 status &= didesc.getNumberInputfiles() == numberFiles;
1103 bool status = mdefaultDataInputDescriptor->getNumberInputfiles() <=
counter;
1104 for (
auto& didesc : mdataInputDescriptors) {
1105 status &= (didesc.getNumberInputfiles() <=
counter);
1113 LOGP(info,
"DataInputDirector");
1114 LOGP(info,
" Default input files file : {}", minputfilesFile);
1115 LOGP(info,
" Default file name regex : {}", mFilenameRegex);
1116 LOGP(info,
" Default file names : {}", mdefaultInputFiles.size());
1117 for (
auto const& fn : mdefaultInputFiles) {
1118 LOGP(info,
" {} {}", fn.fileName, fn.numberOfTimeFrames);
1120 LOGP(info,
" Default DataInputDescriptor:");
1121 mdefaultDataInputDescriptor->printOut();
1123 for (
auto const& didesc : mdataInputDescriptors) {
header::DataOrigin origin
o2::monitoring::tags::Value Value
std::vector< std::shared_ptr< arrow::Field > > fields
configStandalone Light OpenGL display display_light Apply smoothing to points Enable Z buffer Highlight links Highlight seeds Highlight sector tracks Highlight final tracks Show individual Show related Highlight grid Show only individual collision Color clusters belonging to track objects Set line Enable drawing TPC data Enable drawing TOF data Enable drawing magnetic field Set field line step count Invert colors configStandalone Heavy OpenGL display display_heavy Show tracks with ITS contribution Show tracks with TOF contribution Enable propagation of loopers Show clusters at nominal x of pad row for early transformed data Split CE tracks when they cross the central Mark clusters Mark adjacent clusters Hide rejected tracks Apply filter on tracks to be displayed Separate increase X h configStandalone Camera window renderer OpenGL display display_camera Orient the camera such that the y axis is always upwards Full Screen MultiSample Anti Downsampling Anti Enable Vertical Sync Target frame or if the backend cannot limit to the refresh Use OpenGL indirect draws to reduce number of draw calls Display h configStandalone Vulkan display display_vulkan Have uniform buffers in host accessible device memory h configStandalone Internal display display_internal Number of updates the Qt GUI may send ahead of the last one the display has before it waits for the display Opacity of the console background Number of console lines the history is shortened to this when it reaches twice the size Time in seconds an info message fades out after setInfoTime h OpenGL display display Font size Do not use Freetype for font Renderer for event Frontend to use for event ROOT macros used as track filter Console script file
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char Directory with events to Events directory is and not inside events Show standalone event Run event generator maximum time bin of continuous for triggered for automatic continuous for automatic continuous triggered uint64_t
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char e
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc Replace constant variables static by constexpr expressions Compile RTC in deterministic with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define Use RTC to optimize GPU code h configStandalone Processing proc_rtctech Use a file lock to serialize access to the cache folder Print launch bounds used for RTC code as debugging for exit after Allow RTC with slave GPUReconstruction instances with optConstexpr and optSpecialcode Maximum number of RTC cache files per backend in the cache folder
char error[CURL_ERROR_SIZE]
#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)
std::shared_ptr< arrow::Schema > datasetSchema(std::shared_ptr< arrow::Schema > const &physical)
The physical schema without the *_size fields, as DataInputDirector derives it.
std::shared_ptr< arrow::Schema > physicalSchema(TreeInfo const &tree)
Defining ITS Vertex explicitly as messageable.
std::shared_ptr< AODInputFile > openNativeAOD(std::string const &filename, RootObjectReadingFactory &factory, o2::aod::native::Options const &options)
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
o2::aod::native::Options nativeOptions
int levelForOrigin(std::string_view origin) const
std::string readerBackend
static std::vector< LoadablePlugin > parsePluginSpecString(char const *str)
Parse a comma separated list of <library>:<plugin-name> plugin declarations.
std::vector< RootObjectReadingCapability > capabilities
uint64_t const void const *restrict const msg