19#include "HistogramDef.hh"
20#include "HistogramDefSet.hh"
21#include "RBDSException.hh"
22#include "SpectraParticles.hh"
30HistogramDefSet::HistogramDefSet(
const std::string& branchNameIn,
32 const std::set<ParticleSpec>& particlesSpecs,
33 const std::string& particleSpecificationIn,
34 const std::string& definitionLineIn):
35 branchName(branchNameIn),
36 dynamicallyStoreIons(false),
37 dynamicallyStoreParticles(particlesSpecs.empty()),
40 definitionLine(definitionLineIn),
41 samplerType(samplertype::plane)
43 if (!baseDefinitionIn)
44 {
throw std::invalid_argument(
"invalid histogram definition");}
46 baseDefinition = baseDefinitionIn->
Clone();
48 if (!particlesSpecs.empty())
50 for (
const auto& particleSpec : particlesSpecs)
53 std::string thisHistName =
"Spectra_" + h->histName +
"_";
54 if (particleSpec.first > 0)
55 {thisHistName +=
"+";}
56 thisHistName += std::to_string(particleSpec.first);
57 h->histName = thisHistName;
59 switch (particleSpec.second)
61 case RBDS::SpectraParticles::primary:
62 {suffix =
"_Primary";
break;}
63 case RBDS::SpectraParticles::secondary:
64 {suffix =
"_Secondary";
break;}
68 h->histName += suffix;
69 h->selection = AddPDGFilterToSelection(particleSpec, h->selection, branchName);
70 definitions[particleSpec] = h;
71 definitionsV.push_back(h);
76 std::string spec = particleSpecificationIn;
77 std::transform(spec.begin(), spec.end(), spec.begin(), ::tolower);
78 spec = RemoveSubString(spec,
"{");
79 spec = RemoveSubString(spec,
"}");
81 if (spec.find(
"all") != std::string::npos || spec.find(
"ions") != std::string::npos)
82 {dynamicallyStoreIons =
true;}
83 if (spec.find(
"all") != std::string::npos || spec.find(
"particles") != std::string::npos)
84 {dynamicallyStoreParticles =
true;}
86 std::map<std::string, writewhat> keys = {{
"all", writewhat::all},
87 {
"particles", writewhat::particles},
88 {
"ions", writewhat::ions}};
90 auto search = keys.find(spec);
91 if (search != keys.end())
92 {what = search->second;}
95 std::regex topNR(
"top(\\d+)(?:particles|ions)*");
97 if (std::regex_search(spec, match, topNR))
100 {topN = std::stoi(match[1]);}
103 if (spec.find(
"particles") != std::string::npos)
104 {what = writewhat::topNParticles;}
105 else if (spec.find(
"ions") != std::string::npos)
106 {what = writewhat::topNIons;}
108 {what = writewhat::topN;}
111 {
throw RBDSException(
"Invalid particle specifier \"" + particleSpecificationIn +
"\"");}
116HistogramDefSet::~HistogramDefSet()
118 delete baseDefinition;
119 for (
auto kv : definitions)
124 const std::string& wordToRemove)
const
126 std::string result = stringIn;
127 while (result.find(wordToRemove) != std::string::npos)
129 size_t pos = result.find(wordToRemove);
130 result.erase(pos, wordToRemove.size());
135void HistogramDefSet::ReplaceStringInVariable(
const std::string& match,
136 const std::string& replacement)
140 {def->ReplaceStringInVariable(match, replacement);}
145 out <<
"Spectra: " << s.baseDefinition->histName;
149 for (
const auto* d : s.definitionsV)
154std::string HistogramDefSet::AddPDGFilterToSelection(
const ParticleSpec& particleSpec,
155 const std::string& selection,
156 const std::string& branchName)
158 long long int pdgID = particleSpec.first;
163 RBDS::SpectraParticles flag = particleSpec.second;
164 std::string flagFilter;
167 case RBDS::SpectraParticles::primary:
168 {flagFilter =
"&&" + branchName +
".parentID==0";
break;}
169 case RBDS::SpectraParticles::secondary:
170 {flagFilter =
"&&" + branchName +
".parentID>0";
break;}
174 std::string filter = branchName+
".partID=="+std::to_string(pdgID) + flagFilter;
185 std::regex boolOperator(
"&&|[<>!=]=|[<>]|\\|\\|");
187 if (std::regex_search(selection, match, boolOperator))
189 std::string afterBool = match.suffix();
190 std::size_t bracketPos = afterBool.find(
')');
192 if (bracketPos == std::string::npos)
193 {result +=
"&&" + filter;}
195 {result.insert(match.position()+ match.length() + bracketPos,
"&&"+filter);}
197 else if (selection.empty() || selection ==
"1")
200 {result = selection +
"*("+filter+
")";}
Specification for a set of histograms.
std::vector< HistogramDef * > definitionsV
Vector version for easy iteration.
std::string RemoveSubString(const std::string &stringIn, const std::string &wordToRemove) const
Remove a substring from a string.
std::string definitionLine
Original definition line purely for print out.
Common specification for a histogram.
void ReplaceStringInVariable(const std::string &match, const std::string &replacement)
Little utility function.
virtual HistogramDef * Clone() const =0
Copy this instance. Virtual to be overridden in derived classes.
General exception with possible name of object and message.