18#include "HistogramDef.hh"
19#include "HistogramDefSet.hh"
20#include "RBDSException.hh"
21#include "SpectraParticles.hh"
29HistogramDefSet::HistogramDefSet(
const std::string& branchNameIn,
31 const std::set<ParticleSpec>& particlesSpecs,
32 const std::string& particleSpecificationIn,
33 const std::string& definitionLineIn):
34 branchName(branchNameIn),
35 dynamicallyStoreIons(false),
36 dynamicallyStoreParticles(particlesSpecs.empty()),
39 definitionLine(definitionLineIn),
40 samplerType(samplertype::plane)
42 if (!baseDefinitionIn)
43 {
throw std::invalid_argument(
"invalid histogram definition");}
45 baseDefinition = baseDefinitionIn->
Clone();
47 if (!particlesSpecs.empty())
49 for (
const auto& particleSpec : particlesSpecs)
52 std::string thisHistName =
"Spectra_" + h->histName +
"_";
53 if (particleSpec.first > 0)
54 {thisHistName +=
"+";}
55 thisHistName += std::to_string(particleSpec.first);
56 h->histName = thisHistName;
58 switch (particleSpec.second)
60 case RBDS::SpectraParticles::primary:
61 {suffix =
"_Primary";
break;}
62 case RBDS::SpectraParticles::secondary:
63 {suffix =
"_Secondary";
break;}
67 h->histName += suffix;
68 h->selection = AddPDGFilterToSelection(particleSpec, h->selection, branchName);
69 definitions[particleSpec] = h;
70 definitionsV.push_back(h);
75 std::string spec = particleSpecificationIn;
76 std::transform(spec.begin(), spec.end(), spec.begin(), ::tolower);
77 spec = RemoveSubString(spec,
"{");
78 spec = RemoveSubString(spec,
"}");
80 if (spec.find(
"all") != std::string::npos || spec.find(
"ions") != std::string::npos)
81 {dynamicallyStoreIons =
true;}
82 if (spec.find(
"all") != std::string::npos || spec.find(
"particles") != std::string::npos)
83 {dynamicallyStoreParticles =
true;}
85 std::map<std::string, writewhat> keys = {{
"all", writewhat::all},
86 {
"particles", writewhat::particles},
87 {
"ions", writewhat::ions}};
89 auto search = keys.find(spec);
90 if (search != keys.end())
91 {what = search->second;}
94 std::regex topNR(
"top(\\d+)(?:particles|ions)*");
96 if (std::regex_search(spec, match, topNR))
99 {topN = std::stoi(match[1]);}
102 if (spec.find(
"particles") != std::string::npos)
103 {what = writewhat::topNParticles;}
104 else if (spec.find(
"ions") != std::string::npos)
105 {what = writewhat::topNIons;}
107 {what = writewhat::topN;}
110 {
throw RBDSException(
"Invalid particle specifier \"" + particleSpecificationIn +
"\"");}
115HistogramDefSet::~HistogramDefSet()
117 delete baseDefinition;
118 for (
auto kv : definitions)
123 const std::string& wordToRemove)
const
125 std::string result = stringIn;
126 while (result.find(wordToRemove) != std::string::npos)
128 size_t pos = result.find(wordToRemove);
129 result.erase(pos, wordToRemove.size());
134void HistogramDefSet::ReplaceStringInVariable(
const std::string& match,
135 const std::string& replacement)
139 {def->ReplaceStringInVariable(match, replacement);}
144 out <<
"Spectra: " << s.baseDefinition->histName;
148 for (
const auto* d : s.definitionsV)
153std::string HistogramDefSet::AddPDGFilterToSelection(
const ParticleSpec& particleSpec,
154 const std::string& selection,
155 const std::string& branchName)
157 long long int pdgID = particleSpec.first;
162 RBDS::SpectraParticles flag = particleSpec.second;
163 std::string flagFilter;
166 case RBDS::SpectraParticles::primary:
167 {flagFilter =
"&&" + branchName +
".parentID==0";
break;}
168 case RBDS::SpectraParticles::secondary:
169 {flagFilter =
"&&" + branchName +
".parentID>0";
break;}
173 std::string filter = branchName+
".partID=="+std::to_string(pdgID) + flagFilter;
184 std::regex boolOperator(
"&&|[<>!=]=|[<>]|\\|\\|");
186 if (std::regex_search(selection, match, boolOperator))
188 std::string afterBool = match.suffix();
189 std::size_t bracketPos = afterBool.find(
')');
191 if (bracketPos == std::string::npos)
192 {result +=
"&&" + filter;}
194 {result.insert(match.position()+ match.length() + bracketPos,
"&&"+filter);}
196 else if (selection.empty() || selection ==
"1")
199 {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.