20#include "FileMapper.hh"
24#include "TDirectory.h"
28#include "BDSOutputROOTEventHeader.hh"
37DataDummyClass::DataDummyClass()
40DataDummyClass::~DataDummyClass()
43TFile* DataDummyClass::CreateEmptyRebdsimFile(
const std::string& fileName,
44 unsigned long long int nOriginalEventsIn)
49TFile* DataDummyClass::CreateEmptyBdskimFile(
const std::string& originalFileName,
50 const std::string& newOutputFileName)
55std::map<std::string, TDirectory*> DataDummyClass::CreateDirectories(TFile* outputFile,
62 unsigned long long int nOriginalEventsIn)
64 TFile* outputFile =
new TFile(fileName.c_str(),
"RECREATE");
72 TTree* headerTree =
new TTree(
"Header",
"REBDSIM Header");
73 headerTree->Branch(
"Header.",
"BDSOutputROOTEventHeader", headerOut);
75 headerTree->Write(
"", TObject::kOverwrite);
77 std::vector<std::string> expectedTrees = {
"Beam.",
82 for (
const auto& treeName : expectedTrees)
89 const std::string& newOutputFileName)
91 TFile* original =
new TFile(originalFileName.c_str(),
"READ");
94 std::cerr << originalFileName <<
" is not a BDSIM output file" << std::endl;
102 const std::string& newOutputFileName)
104 TTree* headerTree =
dynamic_cast<TTree*
>(originalFile->Get(
"Header"));
106 {std::cerr <<
"Error with header" << std::endl;
return nullptr;}
108 auto headerLocal =
new Header();
109 headerLocal->SetBranchAddress(headerTree);
110 Long64_t nEntriesHeader = headerTree->GetEntries();
111 headerTree->GetEntry(nEntriesHeader - 1);
116 TFile* output =
new TFile(newOutputFileName.c_str(),
"RECREATE");
117 if (output->IsZombie())
118 {std::cerr <<
"Couldn't open output file " << newOutputFileName << std::endl;
return nullptr;}
120 TTree* outputHeaderTree =
new TTree(
"Header",
"BDSIM Header");
121 outputHeaderTree->Branch(
"Header.",
"BDSOutputROOTEventHeader", headerOut);
122 outputHeaderTree->Fill();
125 std::vector<std::string> treeNames = {
"ParticleData",
"Beam",
"Options",
"Model",
"Run"};
126 for (
const auto& tn : treeNames)
128 TTree* original =
dynamic_cast<TTree*
>(originalFile->Get(tn.c_str()));
131 std::cerr <<
"Failed to load Tree named " << tn << std::endl;
136 auto clone = original->CloneTree();
144 std::string treeName)
147 std::string cleanedName = treeName.erase(treeName.size() - 1);
148 std::string perEntryDirName =
"PerEntryHistograms";
149 std::string simpleDirName =
"SimpleHistograms";
150 std::string mergedDirName =
"MergedHistograms";
155 TDirectory* rebdsimDir = outputFile->GetDirectory(cleanedName.c_str());
157 {rebdsimDir = outputFile->mkdir(cleanedName.c_str());}
160 TDirectory* perEntryDir = rebdsimDir->GetDirectory(perEntryDirName.c_str());
162 {rebdsimDir->mkdir(perEntryDirName.c_str());}
164 TDirectory* simpleDir = rebdsimDir->GetDirectory(simpleDirName.c_str());
166 {rebdsimDir->mkdir(simpleDirName.c_str());}
168 TDirectory* mergedDir = rebdsimDir->GetDirectory(mergedDirName.c_str());
170 {rebdsimDir->mkdir(mergedDirName.c_str());}
172 std::map<std::string, TDirectory*> result = {{cleanedName, rebdsimDir},
173 {perEntryDirName, perEntryDir},
174 {simpleDirName, simpleDir},
175 {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)