19#include "FileMapper.hh"
23#include "TDirectory.h"
27#include "BDSOutputROOTEventHeader.hh"
36DataDummyClass::DataDummyClass()
39DataDummyClass::~DataDummyClass()
42TFile* DataDummyClass::CreateEmptyRebdsimFile(
const std::string& fileName,
43 unsigned long long int nOriginalEventsIn)
48TFile* DataDummyClass::CreateEmptyBdskimFile(
const std::string& originalFileName,
49 const std::string& newOutputFileName)
54std::map<std::string, TDirectory*> DataDummyClass::CreateDirectories(TFile* outputFile,
61 unsigned long long int nOriginalEventsIn)
63 TFile* outputFile =
new TFile(fileName.c_str(),
"RECREATE");
71 TTree* headerTree =
new TTree(
"Header",
"REBDSIM Header");
72 headerTree->Branch(
"Header.",
"BDSOutputROOTEventHeader", headerOut);
74 headerTree->Write(
"", TObject::kOverwrite);
76 std::vector<std::string> expectedTrees = {
"Beam.",
81 for (
const auto& treeName : expectedTrees)
88 const std::string& newOutputFileName)
90 TFile* original =
new TFile(originalFileName.c_str(),
"READ");
93 std::cerr << originalFileName <<
" is not a BDSIM output file" << std::endl;
101 const std::string& newOutputFileName)
103 TTree* headerTree =
dynamic_cast<TTree*
>(originalFile->Get(
"Header"));
105 {std::cerr <<
"Error with header" << std::endl;
return nullptr;}
107 auto headerLocal =
new Header();
108 headerLocal->SetBranchAddress(headerTree);
109 Long64_t nEntriesHeader = headerTree->GetEntries();
110 headerTree->GetEntry(nEntriesHeader - 1);
115 TFile* output =
new TFile(newOutputFileName.c_str(),
"RECREATE");
116 if (output->IsZombie())
117 {std::cerr <<
"Couldn't open output file " << newOutputFileName << std::endl;
return nullptr;}
119 TTree* outputHeaderTree =
new TTree(
"Header",
"BDSIM Header");
120 outputHeaderTree->Branch(
"Header.",
"BDSOutputROOTEventHeader", headerOut);
121 outputHeaderTree->Fill();
124 std::vector<std::string> treeNames = {
"ParticleData",
"Beam",
"Options",
"Model",
"Run"};
125 for (
const auto& tn : treeNames)
127 TTree* original =
dynamic_cast<TTree*
>(originalFile->Get(tn.c_str()));
130 std::cerr <<
"Failed to load Tree named " << tn << std::endl;
135 auto clone = original->CloneTree();
143 std::string treeName)
146 std::string cleanedName = treeName.erase(treeName.size() - 1);
147 std::string perEntryDirName =
"PerEntryHistograms";
148 std::string simpleDirName =
"SimpleHistograms";
149 std::string mergedDirName =
"MergedHistograms";
154 TDirectory* rebdsimDir = outputFile->GetDirectory(cleanedName.c_str());
156 {rebdsimDir = outputFile->mkdir(cleanedName.c_str());}
159 TDirectory* perEntryDir = rebdsimDir->GetDirectory(perEntryDirName.c_str());
161 {rebdsimDir->mkdir(perEntryDirName.c_str());}
163 TDirectory* simpleDir = rebdsimDir->GetDirectory(simpleDirName.c_str());
165 {rebdsimDir->mkdir(simpleDirName.c_str());}
167 TDirectory* mergedDir = rebdsimDir->GetDirectory(mergedDirName.c_str());
169 {rebdsimDir->mkdir(mergedDirName.c_str());}
171 std::map<std::string, TDirectory*> result = {{cleanedName, rebdsimDir},
172 {perEntryDirName, perEntryDir},
173 {simpleDirName, simpleDir},
174 {mergedDirName, mergedDir}};
A dummy class as ROOT won't seem to import namespaced functions in CLING for python.
TFile * CreateEmptyRebdsimFile(const std::string &fileName, unsigned long long int nOriginalEventsIn=1)
Create a new TFile and add a header to it. The header object is filled and written.
bool IsBDSIMOutputFile(TFile *file, int *dataVersion=nullptr)
TFile * CreateEmptyBdskimFile(const std::string &originalFileName, const std::string &newOutputFileName)
Create a new TFile and add a header to it. The header object if filled and written.
std::map< std::string, TDirectory * > CreateDirectories(TFile *outputFile, std::string treeName)