26 for (
unsigned int iHandler = 0; iHandler < _filesHandlers.size(); iHandler++) {
27 delete _filesHandlers[iHandler];
29 for (
unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
30 delete _readers[iReader];
35 static const std::string routineName(
"GGSTRootReader::Open");
38 if (filesHandler ==
nullptr)
41 handler = filesHandler;
44 if (fileName.find(
'?') != std::string::npos || fileName.find(
'*') != std::string::npos) {
48 std::string regExpFiles(fileName);
50 std::string::size_type pos = 0;
51 while ((pos = regExpFiles.find(
'.', pos)) != std::string::npos) {
52 regExpFiles.replace(pos, 1,
"\\.");
57 while ((pos = regExpFiles.find(
'*', pos)) != std::string::npos) {
58 regExpFiles.replace(pos, 1,
".*");
62 std::replace(regExpFiles.begin(), regExpFiles.end(),
'?',
'.');
65 std::string basePathName(fileName);
67 size_t posOfLastSlash = basePathName.find_last_of(
'/');
68 if (posOfLastSlash != std::string::npos)
69 basePathName.erase(posOfLastSlash);
71 basePathName = std::filesystem::current_path().string();
73 std::filesystem::path basePath(std::filesystem::absolute(basePathName));
75 std::filesystem::directory_iterator endItr;
76 std::filesystem::directory_iterator dirIter(basePath);
77 if (dirIter == endItr) {
78 if (filesHandler ==
nullptr) {
84 for (; dirIter != endItr; ++dirIter) {
86 if (!std::filesystem::is_regular_file(dirIter->status()))
90 auto pathStr = dirIter->path().string();
91 if (!std::regex_match(pathStr, what, std::regex(regExpFiles)))
94 if (pathStr.substr(pathStr.size() - 5) !=
".root")
97 handler->_AddFile(pathStr, force);
100 GGSCOUT(WARNING) << fileName <<
": no file found." <<
GGSENDL;
104 handler->_SortFiles();
106 }
else if (fileName.substr(fileName.size() - 4) ==
".txt") {
108 if (std::filesystem::exists(fileName)) {
109 std::ifstream file(fileName.data(), std::ios::in);
110 std::string currFile;
111 while (file.good()) {
112 getline(file, currFile);
113 if (std::filesystem::exists(currFile) && currFile.substr(currFile.size() - 5) ==
".root")
114 handler->_AddFile(currFile, force);
117 if (filesHandler ==
nullptr) {
122 }
else if (fileName.substr(fileName.size() - 5) ==
".root") {
124 if (!handler->_AddFile(fileName, force)) {
125 if (filesHandler ==
nullptr) {
131 if (filesHandler ==
nullptr) {
137 if (find(_filesHandlers.begin(), _filesHandlers.end(), handler) == _filesHandlers.end())
138 _filesHandlers.push_back(handler);
142 TChain *GGSTRootReader::_FindChain(
const TString &treeName,
GGSTFilesHandler *filesHandler) {
145 for (
unsigned int iChain = 0; iChain < filesHandler->_chains.size(); iChain++) {
146 if (filesHandler->_chains[iChain]->GetName() == treeName) {
147 return filesHandler->_chains[iChain];
152 return _CreateChain(treeName, filesHandler);
155 TChain *GGSTRootReader::_CreateChain(
const TString &treeName,
GGSTFilesHandler *filesHandler) {
157 static const std::string routineName(
"GGSTRootReader::_CreateChain");
158 std::vector<TChain *> chains(1);
159 chains[0] =
new TChain(treeName);
160 unsigned int iFile = 0;
163 while (iFile < filesHandler->_files.size()) {
164 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
165 TTree *tree =
dynamic_cast<TTree *
>(file->Get(treeName));
167 chains[0]->Add(filesHandler->_files[iFile].data(), 0);
168 chains[0]->SetTitle(tree->GetTitle());
176 if (iFile == filesHandler->_files.size()) {
183 for (iFile += 1; iFile < filesHandler->_files.size(); iFile++) {
184 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
185 if (!(file->IsZombie())) {
186 TTree *tree =
dynamic_cast<TTree *
>(file->Get(treeName));
189 bool chainNotFound =
true;
190 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
191 if (_CheckBranches(chains[iChain], tree)) {
193 chains[iChain]->Add(filesHandler->_files[iFile].data(), 0);
194 chainNotFound =
false;
201 chains.push_back(
new TChain(treeName));
202 chains.back()->SetTitle(tree->GetTitle());
203 chains.back()->Add(filesHandler->_files[iFile].data(), 0);
211 for (
unsigned int iChain = 1; iChain < chains.size(); iChain++) {
212 if (chains[iChain]->
GetEntries() != chains[0]->GetEntries()) {
213 GGSCOUT(ERROR) <<
"Mismatch in number of elements:" <<
GGSENDL;
214 GGSCCOUT(ERROR) <<
" Chain 0: " << chains[0]->GetEntries() <<
" entries" <<
GGSENDL;
215 GGSCCOUT(ERROR) <<
" Title: \"" << chains[0]->GetTitle() <<
"\"" <<
GGSENDL;
216 GGSCCOUT(ERROR) <<
" Chain " << iChain <<
": " << chains[iChain]->GetEntries() <<
" entries" <<
GGSENDL;
217 GGSCCOUT(ERROR) <<
" Title \": " << chains[iChain]->GetTitle() <<
"\"" <<
GGSENDL;
218 for (
unsigned int iChain1 = 0; iChain1 < chains.size(); iChain1++) {
219 delete chains[iChain1];
223 chains[0]->AddFriend(chains[iChain]);
228 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
229 filesHandler->_chains.push_back(chains[iChain]);
235 bool GGSTRootReader::_CheckBranches(TTree *tree1, TTree *tree2) {
237 TObjArray *branchesInTree1 = tree1->GetListOfBranches();
239 TObjArray *branchesInTree2 = tree2->GetListOfBranches();
241 if (branchesInTree1->GetEntries() == branchesInTree2->GetEntries()) {
242 for (
int iBranch = 0; iBranch < branchesInTree1->GetEntries(); iBranch++) {
243 if (strcmp(((TBranch *)(branchesInTree1->At(iBranch)))->GetName(),
244 ((TBranch *)(branchesInTree2->At(iBranch)))->GetName())) {
254 Long64_t GGSTRootReader::_GetEntriesBlind() {
256 if (_filesHandlers.size() == 0)
259 if (_filesHandlers[0]->_files.size() == 0)
262 TFile *file = TFile::Open(_filesHandlers[0]->_files[0].data());
263 TString treeName(
"");
264 TList *keysList = file->GetListOfKeys();
265 for (
int iKey = 0; iKey < keysList->GetEntries(); iKey++) {
266 TString keyName(keysList->At(iKey)->GetName());
267 TTree *key =
dynamic_cast<TTree *
>(file->Get(keyName));
268 if (key !=
nullptr) {
269 treeName = ((TTree *)key)->GetName();
278 TChain *chain = _CreateChain(treeName, _filesHandlers[0]);
279 Long64_t nEntries = 0;
281 nEntries = chain->GetEntries();
289 for (
unsigned int i = 0; i < _readers.size(); i++) {
290 _readers[i]->reader->GetEntry(entry);
296 static const std::string routineName(
"GGSTRootReader::GetEntries");
298 if (_readers.size() > 0)
299 return _readers[0]->chain->GetEntries();
301 GGSCOUT(WARNING) <<
"GetEntries may return a wrong number of entries when called before GetReader." <<
GGSENDL;
302 return _GetEntriesBlind();
308 if (filesHandler ==
nullptr) {
309 if (_filesHandlers.size() > 0)
310 filesHandler = _filesHandlers[0];
315 return &(filesHandler->_simInfo);
320 if (filesHandler ==
nullptr) {
321 if (_filesHandlers.size() > 0)
322 filesHandler = _filesHandlers[0];
327 return &(filesHandler->_geoParams);
332 if (filesHandler ==
nullptr) {
333 if (_filesHandlers.size() > 0)
334 filesHandler = _filesHandlers[0];
339 return &(filesHandler->_genParams);
343 if (filesHandler ==
nullptr) {
344 if (_filesHandlers.size() > 0)
345 filesHandler = _filesHandlers[0];
349 if (!(filesHandler->_geoManager)) {
350 if (filesHandler->_chains.size() != 0) {
351 auto readEntry = filesHandler->_chains[0]->GetReadEntry();
352 filesHandler->_chains[0]->GetEntry(0);
353 if (GGSSmartLog::verboseLevel < GGSSmartLog::DEBUG) {
354 GGSSmartLog::MuteOutput();
356 filesHandler->_geoManager = (TGeoManager *)(filesHandler->_chains[0]->GetCurrentFile()->Get(
"GGSGeometry"));
357 GGSSmartLog::UnmuteOutput();
358 filesHandler->_chains[0]->GetEntry(readEntry);
359 }
else if (filesHandler->_files.size() != 0) {
360 TFile *tGeoFile = TFile::Open(filesHandler->_files[0].c_str());
361 filesHandler->_geoManager = (TGeoManager *)(tGeoFile->Get(
"GGSGeometry"));
367 return filesHandler->_geoManager;
371 if (filesHandler ==
nullptr) {
372 if (_filesHandlers.size() > 0)
373 filesHandler = _filesHandlers[0];
377 if (filesHandler->_geoManager) {
381 TKey *geoKey =
nullptr;
382 if (filesHandler->_chains.size() != 0) {
383 auto readEntry = filesHandler->_chains[0]->GetReadEntry();
384 filesHandler->_chains[0]->GetEntry(0);
385 if (GGSSmartLog::verboseLevel < GGSSmartLog::DEBUG) {
386 GGSSmartLog::MuteOutput();
388 geoKey = (filesHandler->_chains[0]->GetCurrentFile()->GetKey(
"GGSGeometry"));
389 GGSSmartLog::UnmuteOutput();
390 filesHandler->_chains[0]->GetEntry(readEntry);
391 }
else if (filesHandler->_files.size() != 0) {
392 TFile *tGeoFile = TFile::Open(filesHandler->_files[0].c_str());
393 geoKey = tGeoFile->GetKey(
"GGSGeometry");
#define GGSCCOUT(level)
Smart log utility which prints no header at the beginning of the line.
bool HasROOTGeometry(GGSTFilesHandler *filesHandler=nullptr)
Checks if the data files contains the detector geometry in TGeo format.
const GGSTGeoParams * GetGeoParams(const GGSTFilesHandler *filesHandler=nullptr)
Returns the geometry parameters.
~GGSTRootReader()
Destructor.
Long64_t GetEntries()
The total number of events.
void GetEntry(Long64_t entry)
Reads an event.
Class to handle group of Root files.
const GGSTParameters * GetGenParams(const GGSTFilesHandler *filesHandler=nullptr)
Returns the generator parameters.
const TGeoManager * GetROOTGeometry(GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation geometry in TGeo format.
Class for storing the geometry parameters on Root output file.
const GGSTSimInfo * GetSimInfo(const GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation informations.
GGSTFilesHandler * Open(const std::string &fileName, GGSTFilesHandler *filesHandler=nullptr, bool force=false)
Open ROOT files.
GGSTRootReader()
Constructor.
unsigned int GetNFiles()
The number of files handled by this object.
A class to store simulation informations.
Class for writing parameters into the output Root file.