19#include "BDSOutputROOTEventBeam.hh"
20#include "BDSOutputROOTEventHistograms.hh"
21#include "BDSOutputROOTEventLoss.hh"
22#include "BDSOutputROOTEventTrajectory.hh"
25#include "EventAnalysis.hh"
26#include "HistogramMeanFromFile.hh"
27#include "PerEntryHistogramSet.hh"
28#include "PerEntryHistogramSetPlane.hh"
29#include "PerEntryHistogramSetC.hh"
30#include "PerEntryHistogramSetS.hh"
31#include "RBDSException.hh"
32#include "SamplerAnalysis.hh"
36#include "TDirectory.h"
48 Analysis(
"Event.", nullptr,
"EventHistogramsMerged"),
52 processSamplers(false),
53 emittanceOnTheFly(false),
61 bool perEntryAnalysis,
62 bool processSamplersIn,
65 double printModuloFraction,
66 bool emittanceOnTheFlyIn,
67 long int eventStartIn,
69 const std::string& primaryParticleName):
70 Analysis(
"Event.", chainIn,
"EventHistogramsMerged", perEntryAnalysis, debugIn),
74 processSamplers(processSamplersIn),
75 emittanceOnTheFly(emittanceOnTheFlyIn),
76 eventStart(eventStartIn),
78 nEventsToProcess(eventEndIn - eventStartIn)
96 for (
const auto& sampler :
event->Samplers)
108 if (!primaryParticleName.empty())
113 {
throw RBDSException(
"No samplers and no particle name - unable to calculate optics without mass of particle");}
121 std::cout <<
"Analysis on \"" << treeName <<
"\" beginning" << std::endl;
126 TH1::AddDirectory(kTRUE);
127 TH2::AddDirectory(kTRUE);
128 TH3::AddDirectory(kTRUE);
129 BDSBH4DBase::AddDirectory(kTRUE);
131 PreparePerEntryHistogramSets();
136 std::cout <<
"Analysis on \"" << treeName <<
"\" complete" << std::endl;
146EventAnalysis::~EventAnalysis() noexcept
159 {std::cout << __METHOD_NAME__ <<
"Entries: " << chain->GetEntries() <<
" " << std::endl;}
167 <<
") in file(s) -> curtailing to # of entries!" << std::endl;
170 bool firstLoop =
true;
174 {CheckSpectraBranches();}
177 Int_t bytesLoaded = chain->GetEntry(i);
179 {std::cout << __METHOD_NAME__ << i <<
": " << bytesLoaded <<
" bytes loaded" << std::endl;}
183 std::cout <<
"\rEvent #" << std::setw(8) << i <<
" of " <<
entries;
187 {std::cout << std::endl;}
198 AccumulatePerEntryHistogramSets(i);
204 std::cout << __METHOD_NAME__ <<
"Vector lengths" << std::endl;
205 std::cout << __METHOD_NAME__ <<
"primaries=" <<
event->Primary->n << std::endl;
206 std::cout << __METHOD_NAME__ <<
"eloss=" <<
event->Eloss->n << std::endl;
207 std::cout << __METHOD_NAME__ <<
"nprimary=" <<
event->PrimaryFirstHit->n << std::endl;
208 std::cout << __METHOD_NAME__ <<
"nlast=" <<
event->PrimaryLastHit->n << std::endl;
209 std::cout << __METHOD_NAME__ <<
"ntunnel=" <<
event->TunnelHit->n << std::endl;
210 std::cout << __METHOD_NAME__ <<
"ntrajectory=" <<
event->Trajectory->n << std::endl;
218 std::cout <<
"\rSampler analysis complete " << std::endl;
221void EventAnalysis::CheckSpectraBranches()
230 TerminatePerEntryHistogramSets();
235 std::vector<double> emittance = {0,0,0,0};
248 auto setDefinitions =
Config::Instance()->EventHistogramSetDefinitionsSimple();
249 for (
auto definition : setDefinitions)
259 std::string peSetsDirName =
"PerEntryHistogramSets";
260 std::string siSetsDirName =
"SimpleHistogramSets";
261 std::string cleanedName = treeName;
262 TDirectory* treeDir = outputFile->GetDirectory(cleanedName.c_str());
263 TDirectory* peSetsDir = treeDir->mkdir(peSetsDirName.c_str());
264 TDirectory* siSetsDir = treeDir->mkdir(siSetsDirName.c_str());
269 {s->Write(peSetsDir);}
276 for (
auto h : set.second)
291 std::vector<double> xOpticsPoint;
292 std::vector<double> yOpticsPoint;
293 std::vector<double> lOpticsPoint;
294 xOpticsPoint.resize(25);
295 yOpticsPoint.resize(25);
296 lOpticsPoint.resize(25);
299 TTree* opticsTree =
new TTree(
"Optics",
"Optics");
300 opticsTree->Branch(
"Emitt_x", &(xOpticsPoint[0]),
"Emitt_x/D");
301 opticsTree->Branch(
"Emitt_y", &(yOpticsPoint[0]),
"Emitt_y/D");
302 opticsTree->Branch(
"Alpha_x", &(xOpticsPoint[1]),
"Alpha_x/D");
303 opticsTree->Branch(
"Alpha_y", &(yOpticsPoint[1]),
"Alpha_y/D");
304 opticsTree->Branch(
"Beta_x", &(xOpticsPoint[2]),
"Beta_x/D");
305 opticsTree->Branch(
"Beta_y", &(yOpticsPoint[2]),
"Beta_y/D");
306 opticsTree->Branch(
"Gamma_x", &(xOpticsPoint[3]),
"Gamma_x/D");
307 opticsTree->Branch(
"Gamma_y", &(yOpticsPoint[3]),
"Gamma_y/D");
308 opticsTree->Branch(
"Disp_x", &(xOpticsPoint[4]),
"Disp_x/D");
309 opticsTree->Branch(
"Disp_y", &(yOpticsPoint[4]),
"Disp_y/D");
310 opticsTree->Branch(
"Disp_xp", &(xOpticsPoint[5]),
"Disp_xp/D");
311 opticsTree->Branch(
"Disp_yp", &(yOpticsPoint[5]),
"Disp_yp/D");
312 opticsTree->Branch(
"Mean_x", &(xOpticsPoint[6]),
"Mean_x/D");
313 opticsTree->Branch(
"Mean_y", &(yOpticsPoint[6]),
"Mean_y/D");
314 opticsTree->Branch(
"Mean_xp", &(xOpticsPoint[7]),
"Mean_xp/D");
315 opticsTree->Branch(
"Mean_yp", &(yOpticsPoint[7]),
"Mean_yp/D");
316 opticsTree->Branch(
"Sigma_x", &(xOpticsPoint[8]),
"Sigma_x/D");
317 opticsTree->Branch(
"Sigma_y", &(yOpticsPoint[8]),
"Sigma_y/D");
318 opticsTree->Branch(
"Sigma_xp",&(xOpticsPoint[9]),
"Sigma_xp/D");
319 opticsTree->Branch(
"Sigma_yp",&(yOpticsPoint[9]),
"Sigma_yp/D");
320 opticsTree->Branch(
"S" ,&(xOpticsPoint[10]),
"S/D");
321 opticsTree->Branch(
"Npart" ,&(xOpticsPoint[11]),
"Npart/D");
323 opticsTree->Branch(
"Sigma_Emitt_x", &(xOpticsPoint[12]),
"Sigma_Emitt_x/D");
324 opticsTree->Branch(
"Sigma_Emitt_y", &(yOpticsPoint[12]),
"Sigma_Emitt_y/D");
325 opticsTree->Branch(
"Sigma_Alpha_x", &(xOpticsPoint[13]),
"Sigma_Alpha_x/D");
326 opticsTree->Branch(
"Sigma_Alpha_y", &(yOpticsPoint[13]),
"Sigma_Alpha_y/D");
327 opticsTree->Branch(
"Sigma_Beta_x", &(xOpticsPoint[14]),
"Sigma_Beta_x/D");
328 opticsTree->Branch(
"Sigma_Beta_y", &(yOpticsPoint[14]),
"Sigma_Beta_y/D");
329 opticsTree->Branch(
"Sigma_Gamma_x", &(xOpticsPoint[15]),
"Sigma_Gamma_x/D");
330 opticsTree->Branch(
"Sigma_Gamma_y", &(yOpticsPoint[15]),
"Sigma_Gamma_y/D");
331 opticsTree->Branch(
"Sigma_Disp_x", &(xOpticsPoint[16]),
"Sigma_Disp_x/D");
332 opticsTree->Branch(
"Sigma_Disp_y", &(yOpticsPoint[16]),
"Sigma_Disp_y/D");
333 opticsTree->Branch(
"Sigma_Disp_xp", &(xOpticsPoint[17]),
"Sigma_Disp_xp/D");
334 opticsTree->Branch(
"Sigma_Disp_yp", &(yOpticsPoint[17]),
"Sigma_Disp_yp/D");
335 opticsTree->Branch(
"Sigma_Mean_x", &(xOpticsPoint[18]),
"Sigma_Mean_x/D");
336 opticsTree->Branch(
"Sigma_Mean_y", &(yOpticsPoint[18]),
"Sigma_Mean_y/D");
337 opticsTree->Branch(
"Sigma_Mean_xp", &(xOpticsPoint[19]),
"Sigma_Mean_xp/D");
338 opticsTree->Branch(
"Sigma_Mean_yp", &(yOpticsPoint[19]),
"Sigma_Mean_yp/D");
339 opticsTree->Branch(
"Sigma_Sigma_x", &(xOpticsPoint[20]),
"Sigma_Sigma_x/D");
340 opticsTree->Branch(
"Sigma_Sigma_y", &(yOpticsPoint[20]),
"Sigma_Sigma_y/D");
341 opticsTree->Branch(
"Sigma_Sigma_xp",&(xOpticsPoint[21]),
"Sigma_Sigma_xp/D");
342 opticsTree->Branch(
"Sigma_Sigma_yp",&(yOpticsPoint[21]),
"Sigma_Sigma_yp/D");
344 opticsTree->Branch(
"Mean_E", &(lOpticsPoint[6]),
"Mean_E/D");
345 opticsTree->Branch(
"Mean_t", &(lOpticsPoint[7]),
"Mean_t/D");
346 opticsTree->Branch(
"Sigma_E", &(lOpticsPoint[8]),
"Sigma_E/D");
347 opticsTree->Branch(
"Sigma_t", &(lOpticsPoint[9]),
"Sigma_t/D");
348 opticsTree->Branch(
"Sigma_Mean_E", &(lOpticsPoint[18]),
"Sigma_Mean_E/D");
349 opticsTree->Branch(
"Sigma_Mean_t", &(lOpticsPoint[19]),
"Sigma_Mean_t/D");
350 opticsTree->Branch(
"Sigma_Sigma_E", &(lOpticsPoint[20]),
"Sigma_Sigma_E/D");
351 opticsTree->Branch(
"Sigma_Sigma_t", &(lOpticsPoint[21]),
"Sigma_Sigma_t/D");
353 opticsTree->Branch(
"xyCorrelationCoefficent", &(xOpticsPoint[24]),
"xyCorrelationCoefficent/D");
357 xOpticsPoint = entry[0];
358 yOpticsPoint = entry[1];
359 lOpticsPoint = entry[2];
370 {s->Process(firstTime);}
383void EventAnalysis::PreparePerEntryHistogramSets()
388 auto setDefinitions = c->EventHistogramSetDefinitionsPerEntry();
389 for (
const auto& def : setDefinitions)
396 TChain* chainIn)
const
402 switch (definitionIn->samplerType)
404 case HistogramDefSet::samplertype::plane:
406 case HistogramDefSet::samplertype::cylindrical:
408 case HistogramDefSet::samplertype::spherical:
416void EventAnalysis::AccumulatePerEntryHistogramSets(
long int entryNumber)
419 {peSet->AccumulateCurrentEntry(entryNumber);}
422void EventAnalysis::TerminatePerEntryHistogramSets()
425 {peSet->Terminate();}
430 std::vector<TH1*> outputHistograms;
Base class for any TTree analysis.
virtual void SimpleHistograms()
Process histogram definitions from configuration instance.
void PreparePerEntryHistograms()
Create structures necessary for per entry histograms.
long int entries
Number of entries in the chain.
bool debug
Whether debug print out is used or not.
HistogramMeanFromFile * histoSum
Merge of per event stored histograms.
void AccumulatePerEntryHistograms(long int entryNumber)
Accumulate means and variances for per entry histograms.
virtual void Write(TFile *outputFile)
Write rebdsim histograms.
virtual void UserProcess()
Virtual function for user to overload and use. Does nothing by default.
bool perEntry
Whether to analyse each entry in the tree in a for loop or not.
void FillHistogram(HistogramDef *definition, std::vector< TH1 * > *outputHistograms=nullptr)
Create an individual histogram based on a definition.
static Config * Instance(const std::string &fileName="", const std::string &inputFilePath="", const std::string &outputFileName="", const std::string &defaultOutputFileSuffix="_ana")
Singleton accessor.
std::vector< PerEntryHistogramSet * > perEntryHistogramSets
Cache of all per entry histogram sets.
void FillHistogram(HistogramDefSet *definition)
Fill a set of simple histograms across all events.
void Initialise()
Initialise each sampler analysis object in samplerAnalysis.
bool printOut
Whether to print out at all per-event.
Event * event
Event object that data loaded from the file will be loaded into.
bool processSamplers
Whether to process samplers.
long int eventEnd
Event index to end analysis at.
virtual void Process()
Operate on each entry in the event tree.
virtual void SimpleHistograms()
Process histogram definitions from configuration instance.
int printModulo
Cache of print modulo fraction.
PerEntryHistogramSet * ConstructPerEntryHistogramSet(const HistogramDefSet *definitionIn, Event *eventIn, TChain *chainIn) const
std::vector< std::vector< std::vector< double > > > opticalFunctions
Optical functions from all samplers.
void ProcessSamplers(bool firstTime=false)
Process each sampler analysis object.
std::vector< SamplerAnalysis * > samplerAnalyses
Holder for sampler analysis objects.
std::map< HistogramDefSet *, std::vector< TH1 * > > simpleSetHistogramOutputs
Map of simple histograms created per histogram set for writing out.
virtual void Write(TFile *outputFileName)
Write analysis including optical functions to an output file.
long int nEventsToProcess
Difference between start and stop.
virtual void Terminate()
Terminate each individual sampler analysis and append optical functions.
bool emittanceOnTheFly
Whether to calculate emittance fresh at each sampler.
long int eventStart
Event index to start analysis from.
void SetPrintModuloFraction(double fraction)
Set how often to print out information about the event.
BDSOutputROOTEventSampler< double > * GetPrimaries()
Accessor.
BDSOutputROOTEventHistograms * Histos
Local variable ROOT data is mapped to.
bool UsePrimaries() const
Whether there is primary data in the output file.
Specification for a set of histograms.
std::vector< HistogramDef * > definitionsV
Vector version for easy iteration.
Accumulator to merge pre-made per-entry histograms.
void Accumulate(BDSOutputROOTEventHistograms *hNew)
Histogram over a set of integers not number line.
Histogram over a set of integers not number line.
Histogram over a set of integers not number line.
Histogram over a set of integers not number line.
General exception with possible name of object and message.
Analysis routines for an individual sampler.
static void UpdateMass(SamplerAnalysis *s)
Set primary particle mass for optical functions from sampler data.