NuOscillator
Loading...
Searching...
No Matches
OscillatorConstants.h
Go to the documentation of this file.
1#ifndef __OSCILLATOR_CONSTANTS__
2#define __OSCILLATOR_CONSTANTS__
3
4#define DUMMYVAL -999
5
6#include <math.h>
7
8#include "yaml-cpp/yaml.h"
9
10#include "TFile.h"
11#include "TH1.h"
12
13#if UseDoubles==1
14using FLOAT_T = double;
15#else
16using FLOAT_T = float;
17#endif
18
19#include <string>
20#include <iostream>
21#include <vector>
22
66
72inline std::vector<std::string> ReturnKnownConfigs() {
73 std::vector<std::string> ConfigNames;
74
75#if UseCUDAProb3 == 1
76 ConfigNames.push_back("./NuOscillatorConfigs/Binned_CUDAProb3.yaml");
77#endif
78
79#if UseCUDAProb3Linear == 1
80 ConfigNames.push_back("./NuOscillatorConfigs/Binned_CUDAProb3Linear.yaml");
81#endif
82
83#if UseProbGPULinear == 1
84 ConfigNames.push_back("./NuOscillatorConfigs/Binned_ProbGPULinear.yaml");
85#endif
86
87#if UseProb3ppLinear == 1
88 ConfigNames.push_back("./NuOscillatorConfigs/Binned_Prob3ppLinear.yaml");
89#endif
90
91#if UseNuFASTLinear == 1
92 ConfigNames.push_back("./NuOscillatorConfigs/Binned_NuFASTLinear.yaml");
93#endif
94
95#if UseNuFASTEarth == 1
96 ConfigNames.push_back("./NuOscillatorConfigs/Binned_NuFASTEarth.yaml");
97#endif
98
99#if UseNuSQUIDSLinear == 1
100 ConfigNames.push_back("./NuOscillatorConfigs/Binned_NuSQUIDSLinear.yaml");
101#endif
102
103#if UseOscProb == 1
104 ConfigNames.push_back("./NuOscillatorConfigs/Binned_OscProb.yaml");
105#endif
106
107#if UseGLoBESLinear == 1
108 ConfigNames.push_back("./NuOscillatorConfigs/Binned_GLoBESLinear.yaml");
109#endif
110
111#if UseCHICLinear == 1
112 ConfigNames.push_back("./NuOscillatorConfigs/Binned_CHICLinear.yaml");
113#endif
114
115 if(ConfigNames.empty()){
116 std::cerr << "I haven't added single config, this could mean you added new engine but forgot about me" << std::endl;
117 throw std::runtime_error("No known configs");
118 }
119 return ConfigNames;
120}
121
127inline int NeutrinoFlavour_StrToInt(const std::string& NuFlav) {
128 if (NuFlav == "Electron" || NuFlav == "electron") {
130 } else if (NuFlav == "Muon" || NuFlav == "muon") {
131 return NuOscillator::kMuon;
132 } else if (NuFlav == "Tau" || NuFlav == "tau") {
133 return NuOscillator::kTau;
134 } else if (NuFlav == "Sterile1" || NuFlav == "sterile1") {
136 } else if (NuFlav == "Sterile2" || NuFlav == "sterile2") {
138 } else if (NuFlav == "Sterile3" || NuFlav == "sterile3") {
140 } else {
141 std::cerr << "Could not convert input string:" << NuFlav << " to known enum value in NeutrinoFlavours" << std::endl;
142 throw std::runtime_error("Invalid setup");
143 }
144
145 return -1;
146}
147
155inline std::string NeutrinoFlavour_IntToStr(const int NuFlav) {
156 switch (NuFlav) {
158 return "Electron";
160 return "Muon";
162 return "Tau";
164 return "Sterile1";
166 return "Sterile2";
168 return "Sterile3";
169 default:
170 std::cerr << "Recieved unknown NeutrinoFlavour:" << NuFlav << " which is inconsistent with those in enum 'NeutrinoFlavours'" << std::endl;
171 throw std::runtime_error("Invalid setup");
172 }
173 return "";
174}
175
183inline int Verbosity_StrToInt(const std::string& Verbosity) {
184 if (Verbosity == "NONE") {
185 return NuOscillator::NONE;
186 } else if (Verbosity == "INFO") {
187 return NuOscillator::INFO;
188 } else if (Verbosity == "VERBOSE") {
190 } else {
191 std::cerr << "Invalid verbosity provided:" << Verbosity << std::endl;
192 throw std::runtime_error("Invalid setup");
193 }
194
195 return -1;
196}
197
205inline NuOscillator::OscillationChannel ReturnOscillationChannel(const std::string& InputString) {
206 std::string GeneratedFlavour = "";
207 std::string DetectedFlavour = "";
208
209 size_t Delimiter = InputString.find(":");
210 if (Delimiter != std::string::npos) {
211 GeneratedFlavour = InputString.substr(0,Delimiter);
212 DetectedFlavour = InputString.substr(Delimiter+1,InputString.size());
213 } else {
214 std::cerr << "Expected a string formatted as: 'GeneratedNeutrinoFlavour:DetectedNeutrinoFlavour'" << std::endl;
215 std::cerr << "Received:" << InputString << std::endl;
216 }
217
218 NuOscillator::OscillationChannel OscChannel = {NeutrinoFlavour_StrToInt(GeneratedFlavour),NeutrinoFlavour_StrToInt(DetectedFlavour)};
219 return OscChannel;
220}
221
230inline std::vector<FLOAT_T> logspace(FLOAT_T Emin, FLOAT_T Emax, int nDiv) {
231 if (nDiv==0) {
232 std::cerr << "Requested log spacing distribution with 0 divisions" << std::endl;
233 throw std::runtime_error("Invalid setup");
234 }
235
236 std::vector<FLOAT_T> logpoints(nDiv+1, 0.0);
237 logpoints[0]=Emin;
238
239 if (Emin == 0.) {
240 Emin = 0.01;
241 }
242
243 FLOAT_T Emin_log,Emax_log;
244 Emin_log = log10(Emin);
245 Emax_log = log10(Emax);
246
247 FLOAT_T step_log = (Emax_log - Emin_log)/FLOAT_T(nDiv);
248
249 FLOAT_T EE = Emin_log+step_log;
250
251 for (int i=1; i<nDiv; i++) {
252 logpoints[i] = pow(10.,EE);
253 EE += step_log;
254 }
255
256 logpoints[nDiv]=Emax;
257
258 return logpoints;
259}
260
269inline std::vector<FLOAT_T> linspace(FLOAT_T Emin, FLOAT_T Emax, int nDiv) {
270 if (nDiv==0) {
271 std::cerr << "Requested linear spacing distribution with 0 divisions" << std::endl;
272 throw std::runtime_error("Invalid setup");
273 }
274
275 std::vector<FLOAT_T> linpoints(nDiv+1, 0.0);
276
277 FLOAT_T step_lin = (Emax - Emin)/FLOAT_T(nDiv);
278
279 FLOAT_T EE = Emin;
280
281 for (int i=0; i<nDiv; i++) {
282 if (fabs(EE)<1e-6) {EE = 0.;}
283
284 linpoints[i] = EE;
285 EE += step_lin;
286 }
287
288 linpoints[nDiv] = Emax;
289
290 return linpoints;
291}
292
301inline std::vector<FLOAT_T> ReadBinEdgesFromFile(const std::string& TFileName, const std::string& HistogramName,
302 const int Verbose=NuOscillator::Verbosity::NONE) {
303 std::vector<FLOAT_T> BinEdges;
304
305 TFile* File = new TFile(TFileName.c_str());
306 if (!File || File->IsZombie()) {
307 std::cerr << "Could not find file:" << TFileName << std::endl;
308 throw std::runtime_error("Invalid input file.");
309 }
310
311 TH1* Histogram = (TH1*)File->Get(HistogramName.c_str());
312 if (!Histogram) {
313 std::cerr << "Could not find Histogram:" << HistogramName << " in File:" << TFileName << std::endl;
314 throw std::runtime_error("Invalid input file.");
315 }
316
317 BinEdges.resize(Histogram->GetNbinsX()+1);
318 for (int iBin=0;iBin<=Histogram->GetNbinsX();iBin++) {
319 BinEdges[iBin] = Histogram->GetBinLowEdge(iBin+1);
320 }
321
322 File->Close();
323 delete File;
324
325 if (Verbose >= NuOscillator::INFO) {
326 std::cout << "Bin edges successfully read from File:" << TFileName << " , Histogram:" << HistogramName << " :=" << std::endl;
327 for (size_t i=0;i<BinEdges.size();i++) {
328 std::cout << BinEdges[i] << ", ";
329 }
330 std::cout << std::endl;
331 }
332
333 return BinEdges;
334}
335
342inline std::vector<FLOAT_T> ReturnBinCentersFromBinEdges(const std::vector<FLOAT_T>& BinEdges) {
343 int nBins = BinEdges.size()-1;
344 std::vector<FLOAT_T> BinCenters = std::vector<FLOAT_T>(nBins);
345
346 for (int iBin=0;iBin<nBins;iBin++) {
347 BinCenters[iBin] = (BinEdges[iBin]+BinEdges[iBin+1])/2.0;
348 }
349
350 return BinCenters;
351}
352
353inline std::unordered_map<std::string, FLOAT_T> ReturnOscParamsFromConfig(YAML::Node Config) {
354 if (!Config["General"]["OscillationParameters"]) {
355 std::cerr << "General::OscillationParameters node is not defined in the Config!" << std::endl;
356 throw;
357 }
358
359 std::unordered_map<std::string, FLOAT_T> OscillationParameters;
360 for (auto Pair : Config["General"]["OscillationParameters"]) {
361 OscillationParameters[Pair.first.as<std::string>()] = Pair.second.as<FLOAT_T>();
362 }
363 return OscillationParameters;
364}
365
366#endif
int NeutrinoFlavour_StrToInt(const std::string &NuFlav)
Convert a neutrino flavour string to integer.
Definition OscillatorConstants.h:127
std::vector< FLOAT_T > linspace(FLOAT_T Emin, FLOAT_T Emax, int nDiv)
Generate vector of linearly spaced points.
Definition OscillatorConstants.h:269
std::vector< FLOAT_T > ReturnBinCentersFromBinEdges(const std::vector< FLOAT_T > &BinEdges)
Return the bin centers given the bin edges of a template histogram.
Definition OscillatorConstants.h:342
NuOscillator::OscillationChannel ReturnOscillationChannel(const std::string &InputString)
Take an input string formatted as 'GeneratedNeutrinoFlavour:DetectedNeutrinoFlavour' and return an Nu...
Definition OscillatorConstants.h:205
std::string NeutrinoFlavour_IntToStr(const int NuFlav)
Convert a neutrino flavour integer to string.
Definition OscillatorConstants.h:155
std::vector< FLOAT_T > logspace(FLOAT_T Emin, FLOAT_T Emax, int nDiv)
Generate vector of logarithmically spaced points.
Definition OscillatorConstants.h:230
std::vector< FLOAT_T > ReadBinEdgesFromFile(const std::string &TFileName, const std::string &HistogramName, const int Verbose=NuOscillator::Verbosity::NONE)
Read bin edges from input template histogram.
Definition OscillatorConstants.h:301
std::vector< std::string > ReturnKnownConfigs()
Return vector of all config names for each oscillation engine which has been enabled.
Definition OscillatorConstants.h:72
std::unordered_map< std::string, FLOAT_T > ReturnOscParamsFromConfig(YAML::Node Config)
Definition OscillatorConstants.h:353
float FLOAT_T
Definition OscillatorConstants.h:16
int Verbosity_StrToInt(const std::string &Verbosity)
Return the Verbosity enum value correpsonding to a particular string.
Definition OscillatorConstants.h:183
Definition OscillatorConstants.h:28
Verbosity
Different verbosity levels for console output.
Definition OscillatorConstants.h:32
@ NONE
Definition OscillatorConstants.h:32
@ INFO
Definition OscillatorConstants.h:32
@ VERBOSE
Definition OscillatorConstants.h:32
@ kNuFlavour_Generated
Definition OscillatorConstants.h:44
@ kNuFlavour_Detected
Definition OscillatorConstants.h:44
@ nNuFlavours
Definition OscillatorConstants.h:44
NeutrinoFlavours
Different neutrino flavours currently supported within the analysis.
Definition OscillatorConstants.h:39
@ kSterile2
Definition OscillatorConstants.h:39
@ kMuon
Definition OscillatorConstants.h:39
@ kSterile3
Definition OscillatorConstants.h:39
@ kElectron
Definition OscillatorConstants.h:39
@ kSterile1
Definition OscillatorConstants.h:39
@ kTau
Definition OscillatorConstants.h:39
@ nNeutrinoFlavours
Definition OscillatorConstants.h:39
Structure which defines the oscillation channel generated and detected neutrino flavours.
Definition OscillatorConstants.h:49
int DetectedFlavour
Definition OscillatorConstants.h:51
int GeneratedFlavour
Definition OscillatorConstants.h:50
Structure to contain all information about the neutrino type, oscillation channel,...
Definition OscillatorConstants.h:57
int NuType
Definition OscillatorConstants.h:58
OscillationChannel OscChan
Definition OscillatorConstants.h:59
FLOAT_T CosineZ
Definition OscillatorConstants.h:61
FLOAT_T Probability
Definition OscillatorConstants.h:62
FLOAT_T Energy
Definition OscillatorConstants.h:60