GetSignal.cc
Go to the documentation of this file.
1 // OFFLINE
2 #include <fwk/CentralConfig.h>
3 #include <utl/Branch.h>
4 #include <utl/AugerUnits.h>
5 #include <det/Detector.h>
6 
7 // LOCAL
10 #include <src/GetSignal.h>
11 #include <src/Functions.h>
12 #include <src/PowerConfig.h>
13 
14 
15 #include <utl/PhysicalFunctions.h>
16 
17 using namespace std;
18 
19 
20 namespace un2 {
21 
22 
23  vector<double>
24  GetSignal(string model,
25  double lgE,
26  double zenith,
27  double r,
28  double psi,
29  double height,
30  double Xmax,
31  double Rmu,
32  string detector,
33  int month,
34  bool realAtmosphere,
35  bool useThreshold) // this flag enables the threshold function needed for muonic components
36  {
37  const UniversalityConfig& config = PowerConfig::GetInstance();
38  fwk::CentralConfig& cc = *fwk::CentralConfig::GetInstance(/*config.GetBootstrap()*/);
39 
40  const utl::Branch topBSig = cc.GetTopBranch("SignalModel").GetChild(model);
41  const utl::Branch topBAtm = cc.GetTopBranch("AtmosphereParameters");
42 
43  // "un2" is the parameterised malargue atmosphere,
44  // bariloche is equivalent to the CORSIKA atmosphere
45  const string atmVersion = (realAtmosphere) ? "un2" : "bariloche";
46 
47  const map<unsigned int, string>& monthsDict = config.GetMonthsMapReverse();
48 
49  const double Xvert =
50  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("Xvert").Get<double>();
51  const double hs =
52  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs").Get<double>();
53  const double hs2 =
54  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs2").Get<double>();
55 
56  const double DX = AnalyticDX(r, psi, zenith, Xmax, Xvert, hs, hs2, height);
57  //cout << "DX " << DX << endl;
58 
59  // get reference signal
60  // tot em mu emmu emhd
61  vector<double> Signal = { 0., 0., 0., 0., 0. };
62 
63  for (const auto& comp : config.GetReducedComponents()) {
64 
65 
66  // gamma
67  double gamma = 0;
68 
69  {
70  const vector<double> a_pars =
71  topBSig.GetChild(detector).GetChild(comp).GetChild("gamma").Get<vector<double>>();
72 
73  for (unsigned int p = 0; p < a_pars.size(); ++p)
74  gamma += pow(r, p) * a_pars[p];
75  }
76 
77 
78  double Sref;
79  {
80  const double n =
81  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("n").Get<double>();
82  const double rG =
83  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("rG").Get<double>();
84  const double s =
85  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("s").Get<double>();
86 
87  Sref = NKG(r, n, rG, s);
88 
89  }
90 
91  if (useThreshold) {
92  const double cThrsh =
93  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("cThrsh").Get<double>();
94  const double fThrsh =
95  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("fThrsh").Get<double>();
96  const double bg =
97  topBSig.GetChild(detector).GetChild(comp).GetChild("Sref").GetChild("bg").Get<double>();
98 
99  Sref = ActivationFunctionBackground(Sref, fThrsh, cThrsh, bg);
100 
101  }
102 
103  // DeltaXmax
104  double DeltaXmax = 0;
105  {
106  // only the constant and linear terms (a0, a1) are used, however this could be in need
107  // for extension at some point
108  const vector<double> a_pars =
109  topBSig.GetChild(detector).GetChild(comp).GetChild("DeltaXmax").Get<vector<double>>();
110 
111  for (unsigned int p = 0; p < a_pars.size(); ++p)
112  DeltaXmax += pow(r, p) * a_pars[p]; // TODO: horner
113  }
114 
115  // DeltaX0
116  double DeltaX0 = 0;
117  {
118  const vector<double> a_pars =
119  topBSig.GetChild(detector).GetChild(comp).GetChild("DeltaX0").Get<vector<double>>();
120 
121  for (unsigned int p = 0; p < a_pars.size(); ++p)
122  DeltaX0 += pow(r, p) * a_pars[p];
123  }
124 
125 
126  // DeltaXref
127  // this is fixed, might be updated later!
128  double DeltaXref;
129  {
130  const vector<double> a_pars =
131  topBSig.GetChild(detector).GetChild(comp).GetChild("DeltaXref").Get<vector<double>>();
132  // must be constant!
133  DeltaXref = a_pars[0];
134  }
135 
136  // lambda0
137  double lambda0 = 0;
138  {
139  // only the constant and linear terms (a0, a1) are used, however this could be in need
140  // for extension at some point
141  const vector<double> a_pars =
142  topBSig.GetChild(detector).GetChild(comp).GetChild("lambda0").Get<vector<double>>();
143 
144  for (unsigned int p = 0; p < a_pars.size(); ++p)
145  lambda0 += pow(r, p) * a_pars[p];
146  }
147 
148  // lambda1
149  double lambda1 = 0;
150  {
151  // only the constant and linear terms (a0, a1) are used, however this could be in need
152  // for extension at some point
153  const vector<double> a_pars =
154  topBSig.GetChild(detector).GetChild(comp).GetChild("lambda1").Get<vector<double>>();
155 
156  for (unsigned int p = 0; p < a_pars.size(); ++p)
157  lambda1 += pow(r, p) * a_pars[p];
158  }
159 
160  // final signal prediction for each component
161  double Spred =
162  ModifiedGH(DX, Sref, lgE, gamma, DeltaX0, DeltaXmax, DeltaXref, lambda0, 0/*lambda1*/, 0);
163 
164  const map<string, float> psiconsts = {{"em", 0.01}, {"mu", 0.05}, {"emmu", 0.05}, {"emhd", 0.02}};
165  const double aziCorrection = exp(psiconsts.at(comp) * r/1000 * (DX-DeltaX0)/lambda0 * cos(psi) * sin(zenith));
166 
167  Spred *= aziCorrection;
168 
169  double hadrComponentFactor = 1.;
170  if (detector=="SSD")
171  hadrComponentFactor = 1.1;
172  if (detector=="WCD")
173  hadrComponentFactor = 1.;
174 
175 
176  // the dependency of Rmu is implemented HERE:
177  if (comp == "em") {
178  Signal[0] += Spred;
179  Signal[1] = Spred;
180  } else if (comp == "mu") {
181  Signal[0] += Rmu * Spred;
182  Signal[2] = Rmu * Spred;
183  } else if (comp == "emmu") {
184  Signal[0] += Rmu * Spred;
185  Signal[3] = Rmu * Spred;
186  } else if (comp == "emhd") {
187  if ((1 + hadrComponentFactor*(Rmu - 1)) > 0) {
188  Signal[0] += (1 + hadrComponentFactor*(Rmu -1)) * Spred;
189  Signal[4] = (1 + hadrComponentFactor*(Rmu -1)) * Spred;
190  } else {
191  Signal[0] += 0; // jut for completeness, adding "zero" if 1.2*Rmu is smaller than 0.2
192  Signal[4] += 0;
193  }
194  }
195  }
196 
197  return Signal;
198  }
199 
200 
201  vector<vector<double>>
202  GetTimeQuantile(double zenith,
203  double r,
204  double psi,
205  double height,
206  double Xmax,
207  string detector,
208  string quantile,
209  int month,
210  bool realAtmosphere)
211  // returns station start time !!! RELATIVE TO PLANE SHOWER FRONT !!! dependent on DX/Xmax
212  {
213  const UniversalityConfig& config = PowerConfig::GetInstance();
214  fwk::CentralConfig& cc = *fwk::CentralConfig::GetInstance(/*config.GetBootstrap()*/);
215 
216  const utl::Branch topBTimeModel = cc.GetTopBranch("TimeQuantileModel");
217  const utl::Branch topBAtm = cc.GetTopBranch("AtmosphereParameters");
218 
219  const string atmVersion = (realAtmosphere) ? "un2" : "bariloche";
220 
221  const map<unsigned int, string>& monthsDict = config.GetMonthsMapReverse();
222  const double Xvert =
223  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("Xvert").Get<double>();
224  const double hs =
225  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs").Get<double>();
226  const double hs2 =
227  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs2").Get<double>();
228 
229  const double DX = AnalyticDX(r, psi, zenith, Xmax, Xvert, hs, hs2, height);
230 
231  vector<vector<double>> vals = {};
232 
233  for (auto& comp : config.GetComponents()) {
234 
235  // c ddx t0 sigma
236  const vector<string> tags = { "c", "ddx", "t0", "sigma" }; // k
237  vector<double> function_parameters = { 0., 0., 0., 0. }; // k
238 
239  for (unsigned short int k = 0; k < function_parameters.size(); ++k) {
240 
241  const vector<string> a_pars = { "a0", "a1", "a2", "a3", "a4" }; // i
242  vector<double> a_vals = { 0, 0, 0, 0, 0 }; // i
243 
244  for (short unsigned int i = 0; i < a_pars.size(); ++i) {
245 
246  vector<double> aa_pars; // j
247  try {
248  topBTimeModel.GetChild(comp).GetChild(detector).GetChild(quantile).GetChild(tags[k]).GetChild(a_pars[i]).GetData(aa_pars);
249  } catch (utl::XMLParseException& /*e*/) {
250  ERROR(boost::format("SPECIFIED TIME QUANTILE NOT VALID: %s\nUSING t00 instead!") % quantile);
251  topBTimeModel.GetChild(detector).GetChild("t00").GetChild(tags[k]).GetChild(a_pars[i]).GetData(aa_pars);
252  }
253 
254  for (short unsigned int j = 0; j < aa_pars.size(); ++j) {
255  // ai = aa0 + aa1 sin(theta) + aa2 sin^2(theta)
256  a_vals[i] += aa_pars[j] * pow(sin(zenith), j); // TODO: horner
257  }
258 
259  // c = a0 + a1 r + a2 r^2 + a3 r^3 + a4 r^4
260  function_parameters[k] += a_vals[i] * pow(r, i);
261 
262  }
263 
264  }
265 
266  const double c = function_parameters[0];
267  const double ddx = function_parameters[1];
268  const double t0 = function_parameters[2];
269 
270  const double sigma = function_parameters[3];
271  const double t = SignalStartTimePlaneFront(r, psi, zenith, DX + ddx, Xvert, hs, hs2) / c + t0;
272 
273  vals.push_back({ t, sigma });
274 
275  }
276 
277  return vals;
278  }
279 
280 
281  vector<vector<double>>
282  GetTraceParameters(double zenith,
283  double r,
284  double psi,
285  double height,
286  double Xmax,
287  string detector,
288  int month,
289  bool realAtmosphere,
290  double planeFrontTimeResidual, // if parsed, quantile model is used!
291  double nsBin)
292  {
293  const UniversalityConfig& config = PowerConfig::GetInstance();
294  fwk::CentralConfig& cc = *fwk::CentralConfig::GetInstance(/*config.GetBootstrap()*/);
295 
296  vector<vector<double>> traceParameters = {};
297 
298  const vector<vector<double>> t40RelToPF = \
299  GetTimeQuantile(zenith, r, psi, height, Xmax, detector, "t40", month, realAtmosphere);
300 
301  vector<vector<double>> signalTraces(5);
302  vector<vector<double>> signalCDFs(5);
303  vector<vector<double>> traceMoments(5);
304 
305  const utl::Branch topBTraceModel = cc.GetTopBranch("TimeTraceModel");
306  const utl::Branch topBAtm = cc.GetTopBranch("AtmosphereParameters");
307 
308  const string atmVersion = (realAtmosphere) ? "un2" : "bariloche";
309  const map<unsigned int, string>& monthsDict = config.GetMonthsMapReverse();
310  double Xvert;
311  double hs;
312  double hs2;
313  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("Xvert").GetData(Xvert);
314  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs").GetData(hs);
315  topBAtm.GetChild(atmVersion).GetChild(monthsDict.at(month)).GetChild("hs2").GetData(hs2);
316 
317  const double DX = AnalyticDX(r, psi, zenith, Xmax, Xvert, hs, hs2, height);
318 
319  unsigned int componentNumber = 0;
320 
321  for (const auto& comp : config.GetComponents()) {
322 
323  vector<double> componentTrace;
324  vector<double> componentCDF;
325  vector<double> componentMoments;
326 
327  map<string, map<string, double>> readout = { {"exp", {{"a", 0}, {"b", 0}} },
328  {"std", {{"a", 0}, {"b", 0}} } };
329 
330  for (const auto& moment : {"exp", "std"}) {
331 
332  for (const auto& linPar : {"a", "b"}) {
333 
334  vector<double> ai_vals = {0, 0, 0, 0, 0};
335  const vector<string> ai = {"a0", "a1", "a2", "a3", "a4"};
336 
337  for (unsigned int i=0; i < ai.size(); ++i) {
338 
339  vector<double> aii_vals;
340  topBTraceModel.GetChild(detector).GetChild(comp).GetChild(moment).GetChild(linPar).GetChild(ai[i]).GetData(aii_vals);
341 
342  for (unsigned int j=0; j < aii_vals.size(); ++j) {
343 
344  ai_vals[i] += aii_vals[j] * pow(sin(zenith), j);
345 
346  }
347 
348  }
349 
350  for (unsigned int j=0; j < ai_vals.size(); ++j) {
351 
352  readout[moment][linPar] += ai_vals[j] * pow(r, j);
353 
354  }
355 
356  }
357 
358  }
359 
360  const double ExpA = readout["exp"]["a"];
361  const double ExpB = readout["exp"]["b"];
362  const double StdA = readout["std"]["a"];
363  const double StdB = readout["std"]["b"];
364 
365  // 100ns is kind of a natural limit for these two quantities
366  const double traceExpectationValue = (ExpA * DX + ExpB < 100) ? 100 : ExpA * DX + ExpB;
367  const double traceStandardDeviation = (StdA * DX + StdB < 100) ? 100 : StdA * DX + StdB;
368 
369  traceMoments[componentNumber] = {traceExpectationValue, traceStandardDeviation};
370 
371  componentMoments = {traceExpectationValue, traceStandardDeviation};
372 
373  const double t40 = t40RelToPF[componentNumber][0] + planeFrontTimeResidual;
374 
375  const double sigmaLogNormalPar = LogNormalSigmaFromExpAndStd(traceExpectationValue, traceStandardDeviation, nsBin);
376  const double muLogNormalParFromt40 = LogNormalMuFromTimeQuantileAndSigma(t40, 0.4, sigmaLogNormalPar, nsBin);
377 
378  // sometimes the planeFrontTimeResidual is far off the numerically allowed value, then we have to use
379  // mu from the direct parameterization. this usually occurs only for distant stations
380  const double muLogNormalPar = (-10 == planeFrontTimeResidual || muLogNormalParFromt40 != muLogNormalParFromt40) ?
381  LogNormalMuFromExpAndStd(traceExpectationValue, traceStandardDeviation, nsBin) :
382  muLogNormalParFromt40;
383 
384  traceParameters.push_back({muLogNormalPar, sigmaLogNormalPar});
385 
386  }
387 
388  return traceParameters;
389 
390  }
391 
392  vector<double>
393  GetIntegratedTotalSignal(vector<double> t,
394  string model,
395  double lgE,
396  double zenith,
397  double r,
398  double psi,
399  double height,
400  double Xmax,
401  double Rmu,
402  string detector,
403  int month,
404  bool realAtmosphere,
405  bool useThreshold,
406  double planeFrontTimeResidual,
407  double nsBin,
408  string returnValue,
409  int component,
410  double normalized)
411  {
412 
413  vector<double> Sig = {};
414  vector<double> SigUncertainty = {};
415 
416  const double totalSignal = GetSignal(model, lgE, zenith, r, psi, height, Xmax, Rmu, detector, month, realAtmosphere, useThreshold)[component];
417  const double norm = (normalized != 0) ? totalSignal/normalized : 1.;
418  const vector<double> traceParameters = GetTraceParameters(zenith, r, psi, height, Xmax, detector, month, realAtmosphere, planeFrontTimeResidual, nsBin)[component];
419  const double mu = traceParameters[0];
420  const double sigma = traceParameters[1];
421 
422  for (unsigned int i = 0; i < t.size(); ++i) {
423 
424  Sig.push_back(LogNormalCDF(t[i]/nsBin, mu, sigma) * totalSignal / norm);
425 
426  }
427 
428  if (returnValue == "cdf" || returnValue == "integrated" || returnValue == "CDF" || returnValue == "total")
429  return Sig;
430 
431  const double timeUncertaintyRaw = GetTimeQuantile(zenith, r, psi, height, Xmax, detector, "t40", month, realAtmosphere)[component][1];
432  const double timeUncertainty = (timeUncertaintyRaw > 10) ? 10 : timeUncertaintyRaw; // dear darko, please trust me, dont change this number
433 
434  const double baseline = 1; // and some extra just to be sure
435 
436  for (unsigned int i = 0; i < t.size(); ++i) {
437 
438  // maybe replace with inline-option?
439  double stdSigRaw = 0.;
440  if (detector == "WCD") {
441 
443  //stdSigRaw = utl::wcd::SignalUncertainty(stdWCDmodel, cos(zenith), Sig[i]);
444  stdSigRaw = LogNormalCDF(t[i]/nsBin, mu, sigma)*utl::wcd::SignalUncertainty(stdWCDmodel, cos(zenith), totalSignal);
445 
446  } else if (detector == "SSD") {
447 
449  //stdSigRaw = utl::ssd::SignalUncertainty(stdSSDmodel, cos(zenith), Sig[i]);
450  stdSigRaw = LogNormalCDF(t[i]/nsBin, mu, sigma)*utl::ssd::SignalUncertainty(stdSSDmodel, cos(zenith), totalSignal);
451 
452  }
453 
454  const double stdSig = (normalized != 0) ? 1. : stdSigRaw; // if trace normalization is applied, no total signal estiamte should be used
455 
456  SigUncertainty.push_back(sqrt(utl::Sqr(LogNormalPDF(t[i]/nsBin, mu, sigma) * timeUncertainty * totalSignal /* Sig[i]*/) + utl::Sqr(stdSig) + utl::Sqr(baseline)) / norm);
457 
458  }
459 
460  if (returnValue == "std" || returnValue == "unc" || returnValue == "STD" || returnValue == "error") {
461 
462  return SigUncertainty;
463 
464  } else {
465 
466  ERROR("GetIntegratedTotalSignal reached end of function without defined return value!");
467  ERROR("Define returnValue! Was set to:");
468  ERROR(returnValue);
469  return {0};
470 
471  }
472 
473  }
474 
475  vector<double>
476  GetIntegratedTotalSignalSum(vector<double> t,
477  string model,
478  double lgE,
479  double zenith,
480  double r,
481  double psi,
482  double height,
483  double Xmax,
484  double Rmu,
485  string detector,
486  int month,
487  bool realAtmosphere,
488  bool useThreshold,
489  double planeFrontTimeResidual,
490  double nsBin,
491  double normalized
492  )
493 
494  {
495  // other than GetIntegratedTotalSignal, this calculated the integrated signals as the
496  // sum of the components. This function hast other usecases than GetIntegratedSignal!
497 
498  vector<double> sumCompSignals;
499  vector<vector<double>> compSignals;
500  for (unsigned short int i=1; i<5; ++i /*the four components*/) {
501 
502  compSignals.push_back(GetIntegratedTotalSignal(t, model, lgE, zenith, r, psi, height, Xmax, Rmu,
503  detector, month, realAtmosphere, useThreshold, planeFrontTimeResidual, nsBin, "cdf", i /*comp*/));
504 
505  }
506 
507  for (unsigned int i=0; i<t.size(); ++i) {
508 
509  double binSum = 0;
510 
511  for (unsigned int c=0; c < compSignals.size(); ++c) {
512 
513  binSum += compSignals[c][i];
514 
515  }
516 
517  sumCompSignals.push_back(binSum);
518 
519  }
520 
521  if (normalized != 0) {
522 
523  for (unsigned int i=0; i<sumCompSignals.size(); ++i) {
524 
525  sumCompSignals[i] = sumCompSignals[i] * normalized / sumCompSignals[sumCompSignals.size()-1];
526 
527  }
528 
529  }
530 
531  return sumCompSignals;
532 
533  }
534 
535 }
constexpr T Sqr(const T &x)
void GetTimeQuantile(const float *const trace, const float sum, const int nT, const float timeUnit, const float f, float &tQ, float &tQ_err)
double SignalStartTimePlaneFront(const double r, const double psi, const double theta, const double DX, const double Xvert, const double hs, const double hs2, const double height)
Definition: Functions.cc:177
double ActivationFunctionBackground(const double f, const double fThrsh, const double cThrsh, const double bg)
Definition: Functions.cc:82
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
double pow(const double x, const unsigned int i)
Exception for errors encountered when parsing XML.
virtual const std::vector< std::string > & GetComponents() const =0
T Get() const
Definition: Branch.h:271
double ModifiedGH(const double deltaX, const double sRef, const double lgE, const double gamma, const double deltaX0, const double deltaXMax, const double deltaXRef, const double lambda0, const double lambda1, const double lambda2)
Definition: Functions.cc:45
Class representing a document branch.
Definition: Branch.h:107
constexpr double s
Definition: AugerUnits.h:163
double LogNormalMuFromExpAndStd(const double exp_val, const double std, const double ns_bin)
Definition: Functions.cc:251
double LogNormalSigmaFromExpAndStd(const double exp_val, const double std, const double ns_bin)
Definition: Functions.cc:259
vector< double > GetSignal(string model, double lgE, double zenith, double r, double psi, double height, double Xmax, double Rmu, string detector, int month, bool realAtmosphere, bool useThreshold)
Definition: GetSignal.cc:24
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
virtual const std::vector< std::string > & GetReducedComponents() const =0
vector< vector< double > > GetTraceParameters(double zenith, double r, double psi, double height, double Xmax, string detector, int month, bool realAtmosphere, double planeFrontTimeResidual, double nsBin)
Definition: GetSignal.cc:282
double AnalyticDX(const double r, const double psi, const double theta, const double Xmax, const double Xvert, const double hs, const double hs2, const double height)
Definition: Functions.cc:355
double SignalUncertainty(const ESignalVarianceModel model, const double cosTheta, const double signal)
double norm(utl::Vector x)
static CentralConfig * GetInstance()
Use this the first time you get an instance of central configuration.
double LogNormalMuFromTimeQuantileAndSigma(const double timeQuantile, const double quantile, const double sigma, const double ns_bin)
Definition: Functions.cc:274
vector< double > GetIntegratedTotalSignalSum(vector< double > t, string model, double lgE, double zenith, double r, double psi, double height, double Xmax, double Rmu, string detector, int month, bool realAtmosphere, bool useThreshold, double planeFrontTimeResidual, double nsBin, double normalized)
Definition: GetSignal.cc:476
Main configuration utility.
Definition: CentralConfig.h:51
vector< double > GetIntegratedTotalSignal(vector< double > t, string model, double lgE, double zenith, double r, double psi, double height, double Xmax, double Rmu, string detector, int month, bool realAtmosphere, bool useThreshold, double planeFrontTimeResidual, double nsBin, string returnValue, int component, double normalized)
Definition: GetSignal.cc:393
double SignalUncertainty(const ESignalVarianceModel model, const double cosTheta, const double signal)
double LogNormalPDF(const double x, const double mu, const double sigma)
Definition: Functions.cc:226
double LogNormalCDF(const double x, const double mu, const double sigma)
Definition: Functions.cc:235
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
double NKG(const double r, const double n, const double rG, const double s)
Definition: Functions.cc:68
virtual const std::map< unsigned int, std::string > & GetMonthsMapReverse() const =0
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)

, generated on Tue Sep 26 2023.