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 branchName(branchNameIn),
35 dynamicallyStoreIons(false),
36 dynamicallyStoreParticles(particlesSpecs.empty()),
40 if (!baseDefinitionIn)
41 {
throw std::invalid_argument(
"invalid histogram definition");}
43 baseDefinition = baseDefinitionIn->
Clone();
45 if (!particlesSpecs.empty())
47 for (
const auto& particleSpec : particlesSpecs)
50 h->histName =
"Spectra_" + h->histName +
"_" + std::to_string(particleSpec.first);
52 switch (particleSpec.second)
54 case RBDS::SpectraParticles::primary:
55 {suffix =
"_Primary";
break;}
56 case RBDS::SpectraParticles::secondary:
57 {suffix =
"_Secondary";
break;}
61 h->histName += suffix;
62 h->selection = AddPDGFilterToSelection(particleSpec, h->selection, branchName);
63 definitions[particleSpec] = h;
64 definitionsV.push_back(h);
69 std::string spec = particleSpecificationIn;
70 std::transform(spec.begin(), spec.end(), spec.begin(), ::tolower);
71 spec = RemoveSubString(spec,
"{");
72 spec = RemoveSubString(spec,
"}");
74 if (spec.find(
"all") != std::string::npos || spec.find(
"ions") != std::string::npos)
75 {dynamicallyStoreIons =
true;}
76 if (spec.find(
"all") != std::string::npos || spec.find(
"particles") != std::string::npos)
77 {dynamicallyStoreParticles =
true;}
79 std::map<std::string, writewhat> keys = {{
"all", writewhat::all},
80 {
"particles", writewhat::particles},
81 {
"ions", writewhat::ions}};
83 auto search = keys.find(spec);
84 if (search != keys.end())
85 {what = search->second;}
88 std::regex topNR(
"top(\\d+)(?:particles|ions)*");
90 if (std::regex_search(spec, match, topNR))
93 {topN = std::stoi(match[1]);}
96 if (spec.find(
"particles") != std::string::npos)
97 {what = writewhat::topNParticles;}
98 else if (spec.find(
"ions") != std::string::npos)
99 {what = writewhat::topNIons;}
101 {what = writewhat::topN;}
104 {
throw RBDSException(
"Invalid particle specifier \"" + particleSpecificationIn +
"\"");}
109HistogramDefSet::~HistogramDefSet()
111 delete baseDefinition;
112 for (
auto kv : definitions)
117 const std::string& wordToRemove)
const
119 std::string result = stringIn;
120 while (result.find(wordToRemove) != std::string::npos)
122 size_t pos = result.find(wordToRemove);
123 result.erase(pos, wordToRemove.size());
128std::string HistogramDefSet::AddPDGFilterToSelection(
const ParticleSpec& particleSpec,
129 const std::string& selection,
130 const std::string& branchName)
132 long long int pdgID = particleSpec.first;
133 RBDS::SpectraParticles flag = particleSpec.second;
134 std::string flagFilter;
137 case RBDS::SpectraParticles::primary:
138 {flagFilter =
"&&" + branchName +
".parentID==0";
break;}
139 case RBDS::SpectraParticles::secondary:
140 {flagFilter =
"&&" + branchName +
".parentID>0";
break;}
144 std::string filter = branchName+
".partID=="+std::to_string(pdgID) + flagFilter;
147 std::regex boolOperator(
"&&|[<>!=]=|[<>]|\\|\\|");
149 if (std::regex_search(selection, match, boolOperator))
151 std::string afterBool = match.suffix();
152 std::size_t bracketPos = afterBool.find(
")");
154 result.insert(match.position() + match.length() + bracketPos,
"&&"+filter);
156 else if (selection.empty())
159 {result = selection +
"*("+filter+
")";}
std::string RemoveSubString(const std::string &stringIn, const std::string &wordToRemove) const
Remove a substring from a string.
Common specification for a histogram.
virtual HistogramDef * Clone() const
Copy this instance. Virtual to be overridden in derived classes.
General exception with possible name of object and message.