@@ -24,11 +24,48 @@ namespace framework
2424{
2525using namespace rapidjson ;
2626
27+ FileNameHolder* makeFileNameHolder (std::string fileName)
28+ {
29+ auto fileNameHolder = new FileNameHolder ();
30+ fileNameHolder->fileName = fileName;
31+
32+ TFile file = TFile (fileName.c_str (), " R" );
33+ if (!file.IsOpen ()) {
34+ LOGP (ERROR , " \" {}\" can not be opened." , fileName);
35+ return fileNameHolder;
36+ }
37+
38+ // find TimeFrame folders
39+ std::regex TFRegex = std::regex (" TF_[0-9]+" );
40+ TList* keyList = file.GetListOfKeys ();
41+ for (auto key : *keyList) {
42+ if (std::regex_match (((TObjString*)key)->GetString ().Data (), TFRegex)) {
43+ fileNameHolder->listOfTimeFrameKeys .emplace_back (std::string (((TObjString*)key)->GetString ().Data ()));
44+ }
45+ }
46+ fileNameHolder->numberOfTimeFrames = fileNameHolder->listOfTimeFrameKeys .size ();
47+
48+ return fileNameHolder;
49+ }
50+
2751DataInputDescriptor::DataInputDescriptor (bool alienSupport)
2852{
2953 mAlienSupport = alienSupport;
3054}
3155
56+ void DataInputDescriptor::printOut ()
57+ {
58+ LOGP (INFO , " DataInputDescriptor" );
59+ LOGP (INFO , " Table name : {}" , tablename);
60+ LOGP (INFO , " Tree name : {}" , treename);
61+ LOGP (INFO , " Input files file : {}" , getInputfilesFilename ());
62+ LOGP (INFO , " File name regex : {}" , getFilenamesRegexString ());
63+ LOGP (INFO , " Input files : {}" , mfilenames.size ());
64+ for (auto fn : mfilenames)
65+ LOGP (INFO , " {} {}" , fn->fileName , fn->numberOfTimeFrames );
66+ LOGP (INFO , " Total number of TF: {}" , getNumberTimeFrames ());
67+ }
68+
3269std::string DataInputDescriptor::getInputfilesFilename ()
3370{
3471 return (minputfilesFile.empty () && minputfilesFilePtr) ? (std::string)*minputfilesFilePtr : minputfilesFile;
@@ -44,35 +81,52 @@ std::regex DataInputDescriptor::getFilenamesRegex()
4481 return std::regex (getFilenamesRegexString ());
4582}
4683
47- void DataInputDescriptor::addFilename (std::string fn)
84+ void DataInputDescriptor::addFileNameHolder (FileNameHolder* fn)
4885{
49- if (!mAlienSupport && fn.rfind (" alien://" , 0 ) == 0 ) {
86+ if (!mAlienSupport && fn-> fileName .rfind (" alien://" , 0 ) == 0 ) {
5087 LOG (debug) << " AliEn file requested. Enabling support." ;
5188 TGrid::Connect (" alien://" );
5289 mAlienSupport = true ;
5390 }
91+
92+ mtotalNumberTimeFrames += fn->numberOfTimeFrames ;
5493 mfilenames.emplace_back (fn);
5594}
5695
57- TFile* DataInputDescriptor::getInputFile (int counter)
96+ std::tuple< TFile*, std::string> DataInputDescriptor::getFileFolder (int counter)
5897{
59- if (counter < getNumberInputfiles ()) {
98+ std::string filename (" " );
99+ std::string directoryName (" " );
100+
101+ int cnt = mfilenames[0 ]->numberOfTimeFrames ;
102+ if (counter >= 0 && counter < getNumberTimeFrames ()) {
103+ for (int ii = 0 ; ii < getNumberInputfiles (); ii++) {
104+ if (counter < cnt) {
105+ filename = mfilenames[ii]->fileName ;
106+ cnt -= mfilenames[ii]->numberOfTimeFrames ;
107+ directoryName = (mfilenames[ii]->listOfTimeFrameKeys )[counter - cnt];
108+ break ;
109+ } else {
110+ cnt += mfilenames[ii + 1 ]->numberOfTimeFrames ;
111+ }
112+ }
113+
60114 if (mcurrentFile) {
61- if (mcurrentFile->GetName () != mfilenames[counter] ) {
115+ if (mcurrentFile->GetName () != filename ) {
62116 closeInputFile ();
63- mcurrentFile = TFile::Open (mfilenames[counter] .c_str ());
117+ mcurrentFile = TFile::Open (filename .c_str ());
64118 }
65119 } else {
66- mcurrentFile = TFile::Open (mfilenames[counter] .c_str ());
120+ mcurrentFile = TFile::Open (filename .c_str ());
67121 }
68122 if (!mcurrentFile) {
69- throw std::runtime_error (fmt::format (" Couldn't open file \" {}\" !" , mfilenames[counter] ));
123+ throw std::runtime_error (fmt::format (" Couldn't open file \" {}\" !" , filename ));
70124 }
71125 } else {
72126 closeInputFile ();
73127 }
74128
75- return mcurrentFile;
129+ return std::make_tuple ( mcurrentFile, directoryName) ;
76130}
77131
78132void DataInputDescriptor::closeInputFile ()
@@ -98,7 +152,7 @@ int DataInputDescriptor::fillInputfiles()
98152 while (std::getline (filelist, fileName)) {
99153 if (getFilenamesRegexString ().empty () ||
100154 std::regex_match (fileName, getFilenamesRegex ())) {
101- addFilename ( fileName);
155+ addFileNameHolder ( makeFileNameHolder ( fileName) );
102156 }
103157 }
104158 } catch (...) {
@@ -108,10 +162,10 @@ int DataInputDescriptor::fillInputfiles()
108162 } else {
109163 // 3. getFilenamesRegex() @ mdefaultFilenamesPtr
110164 if (mdefaultFilenamesPtr) {
111- for (auto fileName : *mdefaultFilenamesPtr) {
165+ for (auto fileNameHolder : *mdefaultFilenamesPtr) {
112166 if (getFilenamesRegexString ().empty () ||
113- std::regex_match (fileName, getFilenamesRegex ())) {
114- addFilename (fileName );
167+ std::regex_match (fileNameHolder-> fileName , getFilenamesRegex ())) {
168+ addFileNameHolder (fileNameHolder );
115169 }
116170 }
117171 }
@@ -120,29 +174,6 @@ int DataInputDescriptor::fillInputfiles()
120174 return getNumberInputfiles ();
121175}
122176
123- std::string DataInputDescriptor::getInputFilename (int counter)
124- {
125- std::string filename (" " );
126- if (counter >= 0 && counter < getNumberInputfiles ()) {
127- filename = mfilenames[counter];
128- }
129-
130- return filename;
131- }
132-
133- void DataInputDescriptor::printOut ()
134- {
135- LOGP (INFO , " DataInputDescriptor" );
136- LOGP (INFO , " Table name : {}" , tablename);
137- LOGP (INFO , " Tree name : {}" , treename);
138- LOGP (INFO , " Input files file : {}" , getInputfilesFilename ());
139- LOGP (INFO , " File name regex : {}" , getFilenamesRegexString ());
140- LOGP (INFO , " Input files : {}" , mfilenames.size ());
141- for (auto fn : mfilenames) {
142- LOGP (INFO , " {}" , fn);
143- }
144- }
145-
146177DataInputDirector::DataInputDirector ()
147178{
148179 createDefaultDataInputDescriptor ();
@@ -154,7 +185,7 @@ DataInputDirector::DataInputDirector(std::string inputFile)
154185 inputFile.erase (0 , 1 );
155186 setInputfilesFile (inputFile);
156187 } else {
157- mdefaultInputFiles.emplace_back (inputFile);
188+ mdefaultInputFiles.emplace_back (makeFileNameHolder ( inputFile) );
158189 }
159190
160191 createDefaultDataInputDescriptor ();
@@ -163,7 +194,7 @@ DataInputDirector::DataInputDirector(std::string inputFile)
163194DataInputDirector::DataInputDirector (std::vector<std::string> inputFiles)
164195{
165196 for (auto inputFile : inputFiles) {
166- mdefaultInputFiles.emplace_back (inputFile);
197+ mdefaultInputFiles.emplace_back (makeFileNameHolder ( inputFile) );
167198 }
168199
169200 createDefaultDataInputDescriptor ();
@@ -278,13 +309,13 @@ bool DataInputDirector::readJsonDocument(Document* jsonDoc)
278309 setInputfilesFile (fileName);
279310 } else {
280311 setInputfilesFile (" " );
281- mdefaultInputFiles.emplace_back (fileName);
312+ mdefaultInputFiles.emplace_back (makeFileNameHolder ( fileName) );
282313 }
283314 } else if (didirItem[itemName].IsArray ()) {
284315 setInputfilesFile (" " );
285316 auto fns = didirItem[itemName].GetArray ();
286317 for (auto & fn : fns) {
287- mdefaultInputFiles.emplace_back (fn.GetString ());
318+ mdefaultInputFiles.emplace_back (makeFileNameHolder ( fn.GetString () ));
288319 }
289320 } else {
290321 LOGP (ERROR , " Check the JSON document! Item \" {}\" must be a string or an array!" , itemName);
@@ -361,15 +392,15 @@ bool DataInputDirector::readJsonDocument(Document* jsonDoc)
361392 } else {
362393 if (didesc->getFilenamesRegexString ().empty () ||
363394 std::regex_match (fileName, didesc->getFilenamesRegex ())) {
364- didesc->addFilename ( fileName);
395+ didesc->addFileNameHolder ( makeFileNameHolder ( fileName) );
365396 }
366397 }
367398 } else if (didescItem[itemName].IsArray ()) {
368399 auto fns = didescItem[itemName].GetArray ();
369400 for (auto & fn : fns) {
370401 if (didesc->getFilenamesRegexString ().empty () ||
371402 std::regex_match (fn.GetString (), didesc->getFilenamesRegex ())) {
372- didesc->addFilename ( fn.GetString ());
403+ didesc->addFileNameHolder ( makeFileNameHolder ( fn.GetString () ));
373404 }
374405 }
375406 } else {
@@ -434,8 +465,9 @@ std::unique_ptr<TTreeReader> DataInputDirector::getTreeReader(header::DataHeader
434465 didesc = mdefaultDataInputDescriptor;
435466 }
436467
437- auto file = didesc->getInputFile (counter);
468+ auto [ file, directory] = didesc->getFileFolder (counter);
438469 if (file) {
470+ treename = directory + " /" + treename;
439471 reader = std::make_unique<TTreeReader>(treename.c_str (), file);
440472 if (!reader) {
441473 throw std::runtime_error (fmt::format (R"( Couldn't create TTreeReader for tree "{}" in file "{}")" , treename, file->GetName ()));
@@ -445,16 +477,16 @@ std::unique_ptr<TTreeReader> DataInputDirector::getTreeReader(header::DataHeader
445477 return reader;
446478}
447479
448- std::string DataInputDirector::getInputFilename (header::DataHeader dh, int counter)
480+ std::tuple<TFile*, std:: string> DataInputDirector::getFileFolder (header::DataHeader dh, int counter)
449481{
450482 auto didesc = getDataInputDescriptor (dh);
451483 // if NOT match then use defaultDataInputDescriptor
452484 if (!didesc) {
453485 didesc = mdefaultDataInputDescriptor;
454486 }
455- auto filename = didesc->getInputFilename (counter);
487+ auto [file, directory] = didesc->getFileFolder (counter);
456488
457- return filename ;
489+ return std::make_tuple (file, directory) ;
458490}
459491
460492TTree* DataInputDirector::getDataTree (header::DataHeader dh, int counter)
@@ -474,8 +506,9 @@ TTree* DataInputDirector::getDataTree(header::DataHeader dh, int counter)
474506 treename = aod::datamodel::getTreeName (dh);
475507 }
476508
477- auto file = didesc->getInputFile (counter);
509+ auto [ file, directory] = didesc->getFileFolder (counter);
478510 if (file) {
511+ treename = directory + " /" + treename;
479512 tree = (TTree*)file->Get (treename.c_str ());
480513 if (!tree) {
481514 throw std::runtime_error (fmt::format (R"( Couldn't get TTree "{}" from "{}")" , treename, file->GetName ()));
@@ -506,9 +539,9 @@ bool DataInputDirector::isValid()
506539
507540bool DataInputDirector::atEnd (int counter)
508541{
509- bool status = mdefaultDataInputDescriptor->getNumberInputfiles () <= counter;
542+ bool status = mdefaultDataInputDescriptor->getNumberTimeFrames () <= counter;
510543 for (auto didesc : mdataInputDescriptors) {
511- status &= (didesc->getNumberInputfiles () <= counter);
544+ status &= (didesc->getNumberTimeFrames () <= counter);
512545 }
513546
514547 return status;
@@ -520,9 +553,8 @@ void DataInputDirector::printOut()
520553 LOGP (INFO , " Default input files file : {}" , minputfilesFile);
521554 LOGP (INFO , " Default file name regex : {}" , mFilenameRegex );
522555 LOGP (INFO , " Default file names : {}" , mdefaultInputFiles.size ());
523- for (auto const & fn : mdefaultInputFiles) {
524- LOGP (INFO , " {}" , fn);
525- }
556+ for (auto const & fn : mdefaultInputFiles)
557+ LOGP (INFO , " {} {}" , fn->fileName , fn->numberOfTimeFrames );
526558 LOGP (INFO , " Default DataInputDescriptor:" );
527559 mdefaultDataInputDescriptor->printOut ();
528560 LOGP (INFO , " DataInputDescriptors : {}" , getNumberInputDescriptors ());
0 commit comments