15 #include "boost/filesystem.hpp"
16 #include "boost/regex.hpp"
28 for (
unsigned int iHandler = 0; iHandler < _filesHandlers.size(); iHandler++) {
29 delete _filesHandlers[iHandler];
31 for (
unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
32 delete _readers[iReader];
37 static const std::string routineName(
"GGSTRootReader::Open");
40 if (filesHandler ==
nullptr)
43 handler = filesHandler;
44 if (find(_filesHandlers.begin(), _filesHandlers.end(), handler) == _filesHandlers.end())
45 _filesHandlers.push_back(handler);
48 if (fileName.find(
'?') != std::string::npos || fileName.find(
'*') != std::string::npos) {
52 std::string regExpFiles(fileName);
54 std::string::size_type pos = 0;
55 while ((pos = regExpFiles.find(
'.', pos)) != std::string::npos) {
56 regExpFiles.replace(pos, 1,
"\\.");
61 while ((pos = regExpFiles.find(
'*', pos)) != std::string::npos) {
62 regExpFiles.replace(pos, 1,
".*");
66 std::replace(regExpFiles.begin(), regExpFiles.end(),
'?',
'.');
69 std::string basePathName(fileName);
71 size_t posOfLastSlash = basePathName.find_last_of(
'/');
72 if (posOfLastSlash != std::string::npos)
73 basePathName.erase(posOfLastSlash);
75 basePathName = boost::filesystem::current_path().string();
77 boost::filesystem::path basePath(basePathName);
78 boost::filesystem::absolute(basePath);
80 boost::filesystem::directory_iterator endItr;
81 boost::filesystem::directory_iterator dirIter(basePath);
82 if (dirIter == endItr) {
83 if (filesHandler ==
nullptr)
88 for (; dirIter != endItr; ++dirIter) {
90 if (!is_regular_file(dirIter->status()))
94 if (!boost::regex_match(dirIter->path().string(), what, boost::regex(regExpFiles)))
97 if (dirIter->path().string().substr(dirIter->path().string().size() - 5) !=
".root")
100 handler->_AddFile(dirIter->path().string(), force);
103 COUT(WARNING) << fileName <<
": no file found." <<
ENDL;
107 handler->_SortFiles();
109 }
else if (fileName.substr(fileName.size() - 4) ==
".txt") {
111 if (boost::filesystem::exists(fileName)) {
112 std::ifstream file(fileName.data(), std::ios::in);
113 std::string currFile;
114 while (file.good()) {
115 getline(file, currFile);
116 if (boost::filesystem::exists(currFile) && currFile.substr(currFile.size() - 5) ==
".root")
117 handler->_AddFile(currFile, force);
120 if (filesHandler ==
nullptr)
124 }
else if (fileName.substr(fileName.size() - 5) ==
".root") {
126 if (boost::filesystem::exists(fileName))
127 handler->_AddFile(fileName, force);
129 if (filesHandler ==
nullptr)
134 if (filesHandler ==
nullptr)
139 if (find(_filesHandlers.begin(), _filesHandlers.end(), handler) == _filesHandlers.end())
140 _filesHandlers.push_back(handler);
144 TChain *GGSTRootReader::_FindChain(
const TString &treeName,
GGSTFilesHandler *filesHandler) {
147 for (
unsigned int iChain = 0; iChain < filesHandler->_chains.size(); iChain++) {
148 if (filesHandler->_chains[iChain]->GetName() == treeName) {
149 return filesHandler->_chains[iChain];
154 return _CreateChain(treeName, filesHandler);
157 TChain *GGSTRootReader::_CreateChain(
const TString &treeName,
GGSTFilesHandler *filesHandler) {
159 static const std::string routineName(
"GGSTRootReader::_CreateChain");
160 std::vector<TChain *> chains(1);
161 chains[0] =
new TChain(treeName);
162 unsigned int iFile = 0;
165 while (iFile < filesHandler->_files.size()) {
166 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
167 TTree *tree =
dynamic_cast<TTree *
>(file->Get(treeName));
169 chains[0]->Add(filesHandler->_files[iFile].data(), 0);
170 chains[0]->SetTitle(tree->GetTitle());
178 if (iFile == filesHandler->_files.size()) {
185 for (iFile += 1; iFile < filesHandler->_files.size(); iFile++) {
186 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
187 if (!(file->IsZombie())) {
188 TTree *tree =
dynamic_cast<TTree *
>(file->Get(treeName));
191 bool chainNotFound =
true;
192 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
193 if (_CheckBranches(chains[iChain], tree)) {
195 chains[iChain]->Add(filesHandler->_files[iFile].data(), 0);
196 chainNotFound =
false;
203 chains.push_back(
new TChain(treeName));
204 chains.back()->SetTitle(tree->GetTitle());
205 chains.back()->Add(filesHandler->_files[iFile].data(), 0);
213 for (
unsigned int iChain = 1; iChain < chains.size(); iChain++) {
214 if (chains[iChain]->
GetEntries() != chains[0]->GetEntries()) {
215 COUT(ERROR) <<
"Mismatch in number of elements:" <<
ENDL;
216 CCOUT(ERROR) <<
" Chain 0: " << chains[0]->GetEntries() <<
" entries" <<
ENDL;
217 CCOUT(ERROR) <<
" Title: \"" << chains[0]->GetTitle() <<
"\"" <<
ENDL;
218 CCOUT(ERROR) <<
" Chain " << iChain <<
": " << chains[iChain]->GetEntries() <<
" entries" <<
ENDL;
219 CCOUT(ERROR) <<
" Title \": " << chains[iChain]->GetTitle() <<
"\"" <<
ENDL;
220 for (
unsigned int iChain1 = 0; iChain1 < chains.size(); iChain1++) {
221 delete chains[iChain1];
225 chains[0]->AddFriend(chains[iChain]);
230 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
231 filesHandler->_chains.push_back(chains[iChain]);
237 bool GGSTRootReader::_CheckBranches(TTree *tree1, TTree *tree2) {
239 TObjArray *branchesInTree1 = tree1->GetListOfBranches();
241 TObjArray *branchesInTree2 = tree2->GetListOfBranches();
243 if (branchesInTree1->GetEntries() == branchesInTree2->GetEntries()) {
244 for (
int iBranch = 0; iBranch < branchesInTree1->GetEntries(); iBranch++) {
245 if (strcmp(((TBranch *)(branchesInTree1->At(iBranch)))->GetName(),
246 ((TBranch *)(branchesInTree2->At(iBranch)))->GetName())) {
256 Long64_t GGSTRootReader::_GetEntriesBlind() {
258 if (_filesHandlers.size() == 0)
261 if (_filesHandlers[0]->_files.size() == 0)
264 TFile *file = TFile::Open(_filesHandlers[0]->_files[0].data());
265 TString treeName(
"");
266 TList *keysList = file->GetListOfKeys();
267 for (
int iKey = 0; iKey < keysList->GetEntries(); iKey++) {
268 TString keyName(keysList->At(iKey)->GetName());
269 TTree *key =
dynamic_cast<TTree *
>(file->Get(keyName));
270 if (key !=
nullptr) {
271 treeName = ((TTree *)key)->GetName();
280 TChain *chain = _CreateChain(treeName, _filesHandlers[0]);
281 Long64_t nEntries = 0;
283 nEntries = chain->GetEntries();
291 for (
unsigned int i = 0; i < _readers.size(); i++) {
292 _readers[i]->reader->GetEntry(entry);
298 static const std::string routineName(
"GGSTRootReader::GetEntries");
300 if (_readers.size() > 0)
301 return _readers[0]->chain->GetEntries();
303 COUT(WARNING) <<
"GetEntries may return a wrong number of entries when called before GetReader." <<
ENDL;
304 return _GetEntriesBlind();
310 if (filesHandler ==
nullptr) {
311 if (_filesHandlers.size() > 0)
312 filesHandler = _filesHandlers[0];
317 return &(filesHandler->_simInfo);
322 if (filesHandler ==
nullptr) {
323 if (_filesHandlers.size() > 0)
324 filesHandler = _filesHandlers[0];
329 return &(filesHandler->_geoParams);
334 if (filesHandler ==
nullptr) {
335 if (_filesHandlers.size() > 0)
336 filesHandler = _filesHandlers[0];
341 return &(filesHandler->_genParams);
345 if (filesHandler ==
nullptr) {
346 if (_filesHandlers.size() > 0)
347 filesHandler = _filesHandlers[0];
352 return filesHandler->_geoManager;
const GGSTGeoParams * GetGeoParams(const GGSTFilesHandler *filesHandler=nullptr)
Returns the geometry parameters.
~GGSTRootReader()
Destructor.
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
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.
#define CCOUT(level)
Smart log utility which prints no header at the beginning of the line.
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.
const TGeoManager * GetROOTGeometry(const GGSTFilesHandler *filesHandler=nullptr)
Returns the simulation geometry in TGeo format.
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.