15 #include "boost/filesystem.hpp"
16 #include "boost/regex.hpp"
35 for (
unsigned int iHandler = 0; iHandler < _filesHandlers.size(); iHandler++) {
36 delete _filesHandlers[iHandler];
38 for (
unsigned int iReader = 0; iReader < _readers.size(); iReader++) {
39 delete _readers[iReader];
46 static const std::string routineName(
"GGSTRootReader::Open");
49 if (filesHandler == NULL)
52 handler = filesHandler;
53 if (find(_filesHandlers.begin(), _filesHandlers.end(), handler) == _filesHandlers.end())
54 _filesHandlers.push_back(handler);
57 if (fileName.find(
'?') != std::string::npos || fileName.find(
'*') != std::string::npos) {
61 std::string regExpFiles(fileName);
63 std::string::size_type pos = 0;
64 while ((pos = regExpFiles.find(
'.', pos)) != std::string::npos) {
65 regExpFiles.replace(pos, 1,
"\\.");
70 while ((pos = regExpFiles.find(
'*', pos)) != std::string::npos) {
71 regExpFiles.replace(pos, 1,
".*");
75 std::replace(regExpFiles.begin(), regExpFiles.end(),
'?',
'.');
78 std::string basePathName(fileName);
80 size_t posOfLastSlash = basePathName.find_last_of(
'/');
81 if (posOfLastSlash != std::string::npos)
82 basePathName.erase(posOfLastSlash);
84 basePathName = boost::filesystem::current_path().string();
86 boost::filesystem::path basePath(basePathName);
87 boost::filesystem::absolute(basePath);
89 boost::filesystem::directory_iterator endItr;
90 boost::filesystem::directory_iterator dirIter(basePath);
91 if (dirIter == endItr) {
92 if (filesHandler == NULL)
97 for (; dirIter != endItr; ++dirIter) {
99 if (!is_regular_file(dirIter->status()))
103 if (!boost::regex_match(dirIter->path().string(), what, boost::regex(regExpFiles)))
106 if (dirIter->path().string().substr(dirIter->path().string().size() - 5) !=
".root")
109 handler->_AddFile(dirIter->path().string(), force);
112 COUT(WARNING) << fileName <<
": no file found." <<
ENDL;
116 handler->_SortFiles();
119 else if (fileName.substr(fileName.size() - 4) ==
".txt") {
121 if (boost::filesystem::exists(fileName)) {
122 std::ifstream file(fileName.data(), std::ios::in);
123 std::string currFile;
124 while (file.good()) {
125 getline(file, currFile);
126 if (boost::filesystem::exists(currFile) && currFile.substr(currFile.size() - 5) ==
".root")
127 handler->_AddFile(currFile, force);
131 if (filesHandler == NULL)
136 else if (fileName.substr(fileName.size() - 5) ==
".root") {
138 if (boost::filesystem::exists(fileName))
139 handler->_AddFile(fileName, force);
141 if (filesHandler == NULL)
147 if (filesHandler == NULL)
152 if (find(_filesHandlers.begin(), _filesHandlers.end(), handler) == _filesHandlers.end())
153 _filesHandlers.push_back(handler);
160 TChain* GGSTRootReader::_FindChain(
const TString &treeName,
GGSTFilesHandler* filesHandler) {
163 for (
unsigned int iChain = 0; iChain < filesHandler->_chains.size(); iChain++) {
164 if (filesHandler->_chains[iChain]->GetName() == treeName) {
165 return filesHandler->_chains[iChain];
170 return _CreateChain(treeName, filesHandler);
176 TChain *GGSTRootReader::_CreateChain(
const TString &treeName,
GGSTFilesHandler* filesHandler) {
178 static const std::string routineName(
"GGSTRootReader::_CreateChain");
179 std::vector<TChain*> chains(1);
180 chains[0] =
new TChain(treeName);
181 unsigned int iFile = 0;
184 while (iFile < filesHandler->_files.size()) {
185 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
186 TTree *tree =
dynamic_cast<TTree*
>(file->Get(treeName));
188 chains[0]->Add(filesHandler->_files[iFile].data(), 0);
189 chains[0]->SetTitle(tree->GetTitle());
197 if (iFile == filesHandler->_files.size()) {
204 for (iFile += 1; iFile < filesHandler->_files.size(); iFile++) {
205 TFile *file = TFile::Open(filesHandler->_files[iFile].data());
206 if (!(file->IsZombie())) {
207 TTree *tree =
dynamic_cast<TTree*
>(file->Get(treeName));
210 bool chainNotFound =
true;
211 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
212 if (_CheckBranches(chains[iChain], tree)) {
214 chains[iChain]->Add(filesHandler->_files[iFile].data(), 0);
215 chainNotFound =
false;
222 chains.push_back(
new TChain(treeName));
223 chains.back()->SetTitle(tree->GetTitle());
224 chains.back()->Add(filesHandler->_files[iFile].data(), 0);
232 for (
unsigned int iChain = 1; iChain < chains.size(); iChain++) {
233 if (chains[iChain]->
GetEntries() != chains[0]->GetEntries()) {
234 COUT(ERROR) <<
"Mismatch in number of elements:" <<
ENDL;
235 CCOUT(ERROR) <<
" Chain 0: " << chains[0]->GetEntries() <<
" entries" <<
ENDL;
236 CCOUT(ERROR) <<
" Title: \"" << chains[0]->GetTitle() <<
"\"" <<
ENDL;
237 CCOUT(ERROR) <<
" Chain " << iChain <<
": " << chains[iChain]->GetEntries() <<
" entries" <<
ENDL;
238 CCOUT(ERROR) <<
" Title \": " << chains[iChain]->GetTitle() <<
"\"" <<
ENDL;
239 for (
unsigned int iChain1 = 0; iChain1 < chains.size(); iChain1++) {
240 delete chains[iChain1];
245 chains[0]->AddFriend(chains[iChain]);
250 for (
unsigned int iChain = 0; iChain < chains.size(); iChain++) {
251 filesHandler->_chains.push_back(chains[iChain]);
260 bool GGSTRootReader::_CheckBranches(TTree *tree1, TTree *tree2) {
262 TObjArray *branchesInTree1 = tree1->GetListOfBranches();
264 TObjArray *branchesInTree2 = tree2->GetListOfBranches();
266 if (branchesInTree1->GetEntries() == branchesInTree2->GetEntries()) {
267 for (
int iBranch = 0; iBranch < branchesInTree1->GetEntries(); iBranch++) {
268 if (strcmp(((TBranch*) (branchesInTree1->At(iBranch)))->GetName(),
269 ((TBranch*) (branchesInTree2->At(iBranch)))->GetName())) {
282 Long64_t GGSTRootReader::_GetEntriesBlind() {
284 if (_filesHandlers.size() == 0)
287 if (_filesHandlers[0]->_files.size() == 0)
290 TFile *file = TFile::Open(_filesHandlers[0]->_files[0].data());
291 TString treeName(
"");
292 TList *keysList = file->GetListOfKeys();
293 for (
int iKey = 0; iKey < keysList->GetEntries(); iKey++) {
294 TString keyName(keysList->At(iKey)->GetName());
295 TTree *key =
dynamic_cast<TTree*
>(file->Get(keyName));
297 treeName = ((TTree*) key)->GetName();
306 TChain *chain = _CreateChain(treeName, _filesHandlers[0]);
307 Long64_t nEntries = 0;
309 nEntries = chain->GetEntries();
319 for (
unsigned int i = 0; i < _readers.size(); i++) {
320 _readers[i]->reader->GetEntry(entry);
328 static const std::string routineName(
"GGSTRootReader::GetEntries");
330 if (_readers.size() > 0)
331 return _readers[0]->chain->GetEntries();
333 COUT(WARNING) <<
"GetEntries may return a wrong number of entries when called before GetReader." <<
ENDL;
334 return _GetEntriesBlind();
342 if (filesHandler == NULL) {
343 if (_filesHandlers.size() > 0)
344 filesHandler = _filesHandlers[0];
349 return &(filesHandler->_simInfo);
356 if (filesHandler == NULL) {
357 if (_filesHandlers.size() > 0)
358 filesHandler = _filesHandlers[0];
363 return &(filesHandler->_geoParams);
const GGSTGeoParams * GetGeoParams(const GGSTFilesHandler *filesHandler=NULL)
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 GGSTSimInfo * GetSimInfo(const GGSTFilesHandler *filesHandler=NULL)
Returns the simulation informations.
#define CCOUT(level)
Smart log utility which prints no header at the beginning of the line.
GGSTFilesHandler * Open(const std::string &fileName, GGSTFilesHandler *filesHandler=NULL, bool force=false)
Open ROOT files.
Class for storing the geometry parameters on Root output file.
GGSTRootReader()
Constructor.
unsigned int GetNFiles()
The number of files handled by this object.
A class to store simulation informations.