16#include <TDirectory.h>
19#include <TGridResult.h>
22#include <TObjString.h>
24#include <fmt/format.h>
26#if __has_include(<TJAlienFile.h>)
27#include <TJAlienFile.h>
35 TFile* file = external ? external : TFile::Open(
name.c_str());
36 if (!file || file->IsZombie()) {
37 if (file && !external) {
42 auto filesystem = std::make_shared<TFileFileSystem>(file, 50 * 1024 * 1024, factory, external ==
nullptr);
46RootAODInputFile::RootAODInputFile(TFile* file, std::shared_ptr<TFileFileSystem> filesystem)
47 : mFile(file), mFilesystem(
std::move(filesystem))
58 std::vector<Key>
keys;
59 for (
auto* obj : *mFile->GetListOfKeys()) {
60 auto*
key = (TKey*)obj;
61 keys.push_back({
key->GetName(),
key->GetClassName()});
68 std::vector<std::string> names;
69 auto* d = (TDirectory*)mFile->GetObjectChecked(dir.c_str(), TClass::GetClass(
"TDirectory"));
73 for (
auto*
key : *d->GetListOfKeys()) {
74 names.emplace_back(
key->GetName());
79std::map<std::string, std::string> RootAODInputFile::readStringMap(
char const*
key)
81 std::map<std::string, std::string>
result;
82 std::unique_ptr<TMap> map{(TMap*)mFile->Get(
key)};
86 map->SetOwnerKeyValue(
true,
true);
87 std::unique_ptr<TIterator> it{map->MakeIterator()};
88 while (
auto*
key = it->Next()) {
89 auto*
value = (TObjString*)map->GetValue(
key);
100#if __has_include(<TJAlienFile.h>)
101 if (
auto* alienFile =
dynamic_cast<TJAlienFile*
>(mFile)) {
102 return fmt::format(
",se={},open_time={:.1f}", alienFile->GetSE(), alienFile->GetElapsed());
110 TUrl
url(lfn.c_str());
111 if (
url.GetAnchor() &&
url.GetAnchor()[0] !=
'\0') {
115 TGrid::Connect(
"alien://");
121 std::unique_ptr<TGridResult>
result(gGrid->Command(fmt::format(
"access read {}",
url.GetFile()).c_str()));
125 std::vector<GridReplica> replicas;
126 for (
auto*
object : *
result) {
127 auto* map =
dynamic_cast<TMap*
>(
object);
131 auto value = [map](
char const*
key) -> std::string {
132 auto*
v = map->GetValue(
key);
133 return v ?
v->GetName() :
"";
135 auto pfn =
value(
"url");
136 auto envelope =
value(
"envelope");
137 if (pfn.empty() || envelope.empty() || pfn.find(
'#') != std::string::npos) {
140 replicas.push_back({pfn +
"?&authz=" + envelope,
value(
"se")});
147 if (!
filename.starts_with(
"alien://")) {
150 auto start = std::chrono::steady_clock::now();
152 if (replicas.empty()) {
157 std::vector<o2::aod::native::Replica> list;
158 for (
auto const& replica : replicas) {
159 list.push_back({replica.url, replica.se});
164 auto se =
source->replicaLabel();
166 file->setGridInfo(se, std::chrono::duration<double>(std::chrono::steady_clock::now() -
start).
count());
std::vector< std::string > keys
static std::unique_ptr< ByteSource > openReplicas(std::vector< Replica > replicas, const Options &, std::function< void(std::string const &)> log={})
GLuint const GLchar * name
GLsizei GLsizei GLchar * source
GLsizei const GLfloat * value
GLuint GLsizei const GLchar * message
Defining ITS Vertex explicitly as messageable.
std::shared_ptr< AODInputFile > openNativeAOD(std::string const &filename, RootObjectReadingFactory &factory, o2::aod::native::Options const &options)
std::vector< GridReplica > gridReplicas(std::string const &lfn)
Failure of the underlying transport.