19#include "FileMapper.hh"
21#include "HistogramAccumulator.hh"
22#include "HistogramAccumulatorMerge.hh"
23#include "HistogramAccumulatorSum.hh"
25#include "BDSOutputROOTEventHeader.hh"
27#include "TDirectory.h"
45 std::string& fileType,
53 TTree* headerTree =
dynamic_cast<TTree*
>(file->Get(
"Header"));
58 headerTree->GetEntry(0);
59 fileType = headerLocal->
header->fileType;
76 bool success =
GetFileType(file, fileType, dataVersion);
80 return fileType ==
"BDSIM";
86 TFile* f =
new TFile(filePath.c_str());
104 return fileType ==
"REBDSIM";
109 TFile* f =
new TFile(filePath.c_str());
119 if (file->IsZombie())
122 std::string fileType;
129 std::size_t found = fileType.find(
"REBDSIM");
130 return found != std::string::npos;
135 TFile* f =
new TFile(filePath.c_str());
144 return (
int)h->GetDimension();
148 const std::string& fileName)
150 std::cout <<
"No histogram \"" << histName <<
"\" in file " << fileName << std::endl;
158 TDirectory* rootDir =
static_cast<TDirectory*
>(file);
160 std::string rootDirName =
"";
161 MapDirectory(rootDir, output, rootDirName);
166 const std::string& dirPath)
170 TDirectory* originalDir = TDirectory::CurrentDirectory();
174 std::cout <<
"Original directory: " << originalDir->GetName() << std::endl;
175 std::cout <<
"Directory: " << dir->GetName() << std::endl;
182 TList* dirk = dir->GetListOfKeys();
183 for (
int i = 0; i < dirk->GetEntries(); ++i)
185 TObject* keyObject = dirk->At(i);
186 TObject* dirObject = dir->Get(keyObject->GetName());
188 std::string objectName = std::string(keyObject->GetName());
189 std::string className = std::string(dirObject->ClassName());
191 if (className ==
"TDirectory" || className ==
"TDirectoryFile")
193 TDirectory* subDir =
dynamic_cast<TDirectory*
>(dirObject);
196 MapDirectory(subDir, output, dirPath +
"/" + objectName);
198 else if (dirObject->InheritsFrom(
"TH1") || dirObject->InheritsFrom(
"BDSBH4DBase"))
200 TH1* h =
dynamic_cast<TH1*
>(dirObject);
204 bool BDSBH4Dtype =
false;
206 if (dirObject->InheritsFrom(
"BDSBH4DBase"))
217 std::string histPath = dirPath +
"/";
219 std::string histName = std::string(h->GetName());
220 std::string histTitle = std::string(h->GetTitle());
221 TDirectory* outDir = output->GetDirectory(histPath.c_str());
223 {output->mkdir(histPath.c_str());}
225 outDir = output->GetDirectory(histPath.c_str());
226 output->cd(histPath.c_str());
233 case RBDS::MergeType::meanmerge:
238 case RBDS::MergeType::sum:
243 case RBDS::MergeType::none:
250 std::cout <<
"Found histogram> " << histPath << histName << std::endl;
260 if (parentDir ==
"PerEntryHistograms")
261 {
return RBDS::MergeType::meanmerge;}
262 else if (parentDir ==
"PerEntryHistogramSets")
263 {
return RBDS::MergeType::meanmerge;}
264 else if (parentDir ==
"MergedHistograms")
265 {
return RBDS::MergeType::meanmerge;}
266 else if (parentDir ==
"SimpleHistograms")
267 {
return RBDS::MergeType::sum;}
268 else if (parentDir ==
"SimpleHistogramSets")
269 {
return RBDS::MergeType::sum;}
271 {
return RBDS::MergeType::none;}
Class to combine histograms of mean with error on mean.
Class to accumulate and merge histograms in different ways.
HistogramMap()=delete
No need for default constructor.
std::vector< RBDS::HistogramPath > histograms
Storage of all objects.
void MapDirectory(TDirectory *dir, TFile *output, const std::string &parentDir)
bool IsBDSIMOutputFile(TFile *file, int *dataVersion=nullptr)
bool IsREBDSIMOutputFile(TFile *file)
bool GetFileType(TFile *file, std::string &fileType, int *dataVersion=nullptr)
MergeType DetermineMergeType(const std::string &parentDir)
Determine merge type from parent directory name.
bool IsREBDSIMOrCombineOutputFile(TFile *file)
int DetermineDimensionality(TH1 *h)
Determine the number of dimensions of a histogram by dynamically casting.
MergeType
Types of merging.
void WarningMissingHistogram(const std::string &histName, const std::string &fileName)
Common print out method.
Basic structure for accumulating histogram from rebdsim output files.