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 std::string thisHistName =
"Spectra_" + h->histName +
"_";
51 if (particleSpec.first > 0)
52 {thisHistName +=
"+";}
53 thisHistName += std::to_string(particleSpec.first);
54 h->histName = thisHistName;
56 switch (particleSpec.second)
58 case RBDS::SpectraParticles::primary:
59 {suffix =
"_Primary";
break;}
60 case RBDS::SpectraParticles::secondary:
61 {suffix =
"_Secondary";
break;}
65 h->histName += suffix;
66 h->selection = AddPDGFilterToSelection(particleSpec, h->selection, branchName);
67 definitions[particleSpec] = h;
68 definitionsV.push_back(h);
73 std::string spec = particleSpecificationIn;
74 std::transform(spec.begin(), spec.end(), spec.begin(), ::tolower);
75 spec = RemoveSubString(spec,
"{");
76 spec = RemoveSubString(spec,
"}");
78 if (spec.find(
"all") != std::string::npos || spec.find(
"ions") != std::string::npos)
79 {dynamicallyStoreIons =
true;}
80 if (spec.find(
"all") != std::string::npos || spec.find(
"particles") != std::string::npos)
81 {dynamicallyStoreParticles =
true;}
83 std::map<std::string, writewhat> keys = {{
"all", writewhat::all},
84 {
"particles", writewhat::particles},
85 {
"ions", writewhat::ions}};
87 auto search = keys.find(spec);
88 if (search != keys.end())
89 {what = search->second;}
92 std::regex topNR(
"top(\\d+)(?:particles|ions)*");
94 if (std::regex_search(spec, match, topNR))
97 {topN = std::stoi(match[1]);}
100 if (spec.find(
"particles") != std::string::npos)
101 {what = writewhat::topNParticles;}
102 else if (spec.find(
"ions") != std::string::npos)
103 {what = writewhat::topNIons;}
105 {what = writewhat::topN;}
108 {
throw RBDSException(
"Invalid particle specifier \"" + particleSpecificationIn +
"\"");}
113HistogramDefSet::~HistogramDefSet()
115 delete baseDefinition;
116 for (
auto kv : definitions)
121 const std::string& wordToRemove)
const
123 std::string result = stringIn;
124 while (result.find(wordToRemove) != std::string::npos)
126 size_t pos = result.find(wordToRemove);
127 result.erase(pos, wordToRemove.size());
134 out <<
"Spectra: " << s.baseDefinition->histName <<
"\n";
140std::string HistogramDefSet::AddPDGFilterToSelection(
const ParticleSpec& particleSpec,
141 const std::string& selection,
142 const std::string& branchName)
144 long long int pdgID = particleSpec.first;
149 RBDS::SpectraParticles flag = particleSpec.second;
150 std::string flagFilter;
153 case RBDS::SpectraParticles::primary:
154 {flagFilter =
"&&" + branchName +
".parentID==0";
break;}
155 case RBDS::SpectraParticles::secondary:
156 {flagFilter =
"&&" + branchName +
".parentID>0";
break;}
160 std::string filter = branchName+
".partID=="+std::to_string(pdgID) + flagFilter;
171 std::regex boolOperator(
"&&|[<>!=]=|[<>]|\\|\\|");
173 if (std::regex_search(selection, match, boolOperator))
175 std::string afterBool = match.suffix();
176 std::size_t bracketPos = afterBool.find(
')');
178 if (bracketPos == std::string::npos)
179 {result +=
"&&" + filter;}
181 {result.insert(match.position()+ match.length() + bracketPos,
"&&"+filter);}
183 else if (selection.empty() || selection ==
"1")
186 {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.
Common specification for a histogram.
virtual HistogramDef * Clone() const =0
Copy this instance. Virtual to be overridden in derived classes.
General exception with possible name of object and message.